Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Взаимодействие ADAM5510-M с Fastwel Universal OPC

 Ответить Ответить
Автор
Сообщение
gradient Смотреть выпадающим
Новичок
Новичок


Присоединился: 22 Май 2011
Online Status: Offline
Публикации: 3
Свойства публикации Свойства публикации   Ответить, цитируя автора - gradient Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Взаимодействие ADAM5510-M с Fastwel Universal OPC
    Опубликовано: 22 Май 2011 18:24

Здравствуйте. Имеется ADAM-5510M, с его слотах модули 5050 и 5017 (подробнее в таблице). Соединение с ПК происходит по COM порту.  Нужно на ПК с помощью программы Fastwel Universal OPC управлять каналами модулей и отслеживать их состояние.


Назначение

Активный уровень или диапазон

Имя и тип переменной

Тип контакта

Модуль

Слот

Клавиша «»

При нажатии – «0», в исх. состоянии – «1»

Enter

(boolean)

Вход

15

5050

№ 3

Клавиша «0»

При нажатии – «0», в исх. состоянии – «1»

Zero

(boolean)

Вход

14

Клавиша «1»

При нажатии – «0», в исх. состоянии – «1»

One

(boolean)

Вход

13

Клавиша «2»

При нажатии – «0», в исх. состоянии – «1»

Two

(boolean)

Вход

12

Клавиша «3»

При нажатии – «0», в исх. состоянии – «1»

Three

(boolean)

Вход

11

Клавиша «4»

При нажатии – «0», в исх. состоянии – «1»

Four

(boolean)

Вход

10

Клавиша «5»

При нажатии – «0», в исх. состоянии – «1»

Five

(boolean)

Вход

9

Клавиша «6»

При нажатии – «0», в исх. состоянии – «1»

Six

(boolean)

Вход

8

Клавиша «7»

При нажатии – «0», в исх. состоянии – «1»

Seven

(boolean)

Вход

7

Клавиша «8»

При нажатии – «0», в исх. состоянии – «1»

Eight

(boolean)

Вход

6

Клавиша «9»

При нажатии – «0», в исх. состоянии – «1»

Nine

(boolean)

Вход

5

Сегмент «e»

Горит – «0», потушен – «1», в исх. сост. – «0»

E

(boolean)

Выход

4

Сегмент «d»

Горит – «0», потушен – «1», в исх. сост. – «0»

D

(boolean)

Выход

3

Сегмент «c»

Горит – «0», потушен – «1», в исх. сост. – «0»

C

(boolean)

Выход

2

Сегмент «b»

Горит – «0», потушен – «1», в исх. сост. – «0»

B

(boolean)

Выход

1

Сегмент «a»

Горит – «0», потушен – «1», в исх. сост. – «0»

A

(boolean)

Выход

0

Слот №2 – модуль ввода-вывода не подключен

Фотодиод

1.3 В – открыт, 3.75 В - закрыт

Svet

float

Вход

2

5017

№ 1

Датчик t°C

10 °C – 98 мВ, 100 °C – 105 мВ (линеен)

Temp

float

Вход

1

Тензодатчик

0 – 0.6 мВ,  3 кг – 3 мВ (линеен)

Massa

float

Вход

0

Управл. 8 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire8

(boolean)

Выход

15

5050

№ 0

Управл. 7 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire7

(boolean)

Выход

14

Управл. 6 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire6

(boolean)

Выход

13

Управл. 5 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire5

(boolean)

Выход

12

Управл. 4 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire4

(boolean)

Выход

11

Управл. 3 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire3

(boolean)

Выход

10

Сегмент «h»

Горит – «0», потушен – «1», в исх. сост. – «0»

H

(boolean)

Выход

9

Нагреватель

ВКЛ. – «1», ВЫКЛ. – «0», в исх. сост. – «0»

Hot

(boolean)

Выход

8

Вентилятор

ВКЛ. – «1», ВЫКЛ. – «0», в исх. сост. – «0»

Cool

(boolean)

Выход

7

Насос

ВКЛ. – «1», ВЫКЛ. – «0», в исх. сост. – «0»

Pump

(boolean)

Выход

6

Клапан «Грубо»

ОТКР. – «1», ЗАКР. – «0», в исх. сост. – «0»

Klap1

(boolean)

Выход

5

Клапан «Точно»

ОТКР. – «1», ЗАКР. – «0», в исх. сост. – «0»

Klap2

(boolean)

Выход

4

Сегмент «f»

Горит – «0», потушен – «1», в исх. сост. – «0»

F

(boolean)

Выход

3

Сегмент «g»

Горит – «0», потушен – «1», в исх. сост. – «0»

G

(boolean)

Выход

2

Управл. 2 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire2

(boolean)

Выход

1

Управл. 1 инд.

Горит – «1», потушен – «0», в исх. сост. – «0»

Fire1

(boolean)

Выход

0


Хочу узнать мнение о написанном программном коде - какие есть в нем ошибки. Не путаю ли я понятия мастер и слэйв. Правильные ли я выбрал функции для опроса модулей (Set5050 и Get5050  и др.) или я ошибся и нужно было бы использовать ADAMRTU_ForceMultiCoils и ей подобные?

Буду признателен за любой совет. Спасибо.



#include <stdio.h>

#include <dos.h>

#include <time.h>

#include <conio.h>

#include "5510drv.h"

#include "RTU.h"

 

#define sizeofShareMem       100

int count;

unsigned int LocalDIO(void);

 

void main()

{

            unsigned int Share_Mem[sizeofShareMem];

            unsigned int tmpcnt, tmpcnt1;

 

            if(Modbus_COM_Init(COM2, Slave, (unsigned long)9600, NO_PARITY, DATA8, STOP1)!=0)

            {

                        printf("error\n");

                        return;

            }

            printf("init success!!\n");

           

            if(!ADAMRTU_ModServer_Create(1, (unsigned char *)Share_Mem, sizeof(Share_Mem)))

            {

                        printf("err code is %d\n", Error_Code());

                        return;

            }

 

            printf("server started..\n");

 

            while(1)

            {

                        disable();

                        Share_Mem[0] = LocalDIO();          

                        enable();

 

                        for(tmpcnt=0; tmpcnt<50000; tmpcnt++)    

                        {for(tmpcnt1=0; tmpcnt1<8; tmpcnt1++){}}

                         }

}

unsigned int LocalDIO(void)    

{

unsigned Bdata1, Bdata2;

char dov1, dov2;

int aiv[8]; /*массив значений аналогового напряжения*/

int value, i;

 

Init501718(1);

dov1=0;

Set5050(&dov1, 0, 0, AWord);        //slot 0, все дискретные выходы (0-15) выставляем в «0»

if(AiUpdate(1, &ch)==0)

{

for (int j=0; j<8; j++)

{

    Get501718(1, j, &(aiv[value]));        //slot 1

}

}

 

Get5050(3, 8, AByte, &Bdata1);        //slot 3, читаем данные каналов 8-15

Get5050(3, 5, ABit, &Bdata2);         //5 канал

Get5050(3, 6, ABit, &Bdata2);         //6 канал

Get5050(3, 7, ABit, &Bdata2);         //7 канал

 

dov2=0;

for (i=0; i<5; i++)

{

    Set5050(&dov2, 3, i, ABit);        //slot 3, все дискретные выходы (0-4) выставляем в «0»

}

Release_All();

return (unsigned int)~div;

}


Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 29 Май 2011 18:32
Я что-то не понял, причем здесь Universal OPC, если вы пытаетесь сделать связь по Modbus?
Инженер-системотехник
+7 (916) 477 3925
Наверх
gradient Смотреть выпадающим
Новичок
Новичок


Присоединился: 22 Май 2011
Online Status: Offline
Публикации: 3
Свойства публикации Свойства публикации   Ответить, цитируя автора - gradient Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Май 2011 19:00

прошу прощения, конечно же не Universal OPC, а Modbus OPC Server for RTU.

ADAMRTU_ModServer_Create(1, (unsigned char *)Share_Mem, sizeof(Share_Mem));
printf("Server started\n");
dov1=0;
Set5050(&dov1, 0, 0, AWord); //slot 0, все выходы (0-15) в "0"
dov1=1;
Set5050(&dov1, 0, 2, ABit); //slot 0, выходы 2, 3, 9 (сегменты G, F, H) в "1" = потушены
Set5050(&dov1, 0, 3, ABit);
Set5050(&dov1, 0, 9, ABit);
while(1)
{
disable();
Share_Mem[0] = get50_0;//правильно ли я понимаю, что этими командами я записываю в память значения выходных сигналов модуля?
Share_Mem[1] = get50_1;//Если так, то в Modbus OPC Server'е я должен создать 8 тегов Output Coil
Share_Mem[2] = get50_2;//И там будут видны значения дискретных выходов?
Share_Mem[3] = get50_3;//как же тогда понять то, что дискретные выходы имеют адреса начиная с 00001... а командой
Share_Mem[4] = get50_4;//Share_Mem[0]=.. мы записываем информацию по адресу 40001?
Share_Mem[5] = get50_5;
Share_Mem[6] = get50_6;
Share_Mem[7] = get50_7;
enable();
}
Release_All();
return 0;

где 

unsigned int get50_0(void)
{
unsigned int Bdata1;
Get5050(0, 0, ABit, &Bdata1);//считываем данные из 0-ого канала в слоте 0
return Bdata1;

Аналогично   get50_1 для канала 1. 

Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz