PDA

Просмотр полной версии : ПЛК 63 modbus RTU



Alex12345
28.03.2014, 10:48
Здравствуйте.
Имеется плк 63. Нужно настроить его работу в сети modbus rtu как slave или master.
Можно ли это сделать каким либо образом настроить через конфигурацию?
Скачивал библиотеку modbus.lib и примеры к ней.
При запуске примеров появляется ошибка - время выполнения цикла очень большое.
Это происходит из-за строчек

IF enabl = FALSE THEN
enabl := TRUE;
END_IF

Так же не могу разобраться с переменными для настройки com порта

Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=9600; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
Что такое номер Com порта, и почему все остальные значения равны нулю? особенно размер буфера..

на всякий случай, вложу файл с примером проги..

kgsh82
30.03.2014, 19:24
Для работы ПЛК63 в качестве ведомого библиотека не нужна. Достаточно правильно объявить необходимые переменные и настроить порт в конфигурации. Гоу ту руководство по программированию для ПЛК63.

Роланд
30.03.2014, 22:14
не знаю в чем дело, но не выходит читать параметры по RS232 из конфигурации ПЛК63 в качестве ведомого! Вы это точно делали?

Alex12345
31.03.2014, 09:47
ни в настройках по программированию, ни в руководстве по эксплуатации нигде не написано modbus RTU или ASCII.
надстроил порт в конфигурации и несколько переменных... связи пока нету

Alex12345
31.03.2014, 10:04
RTU или ASCII он, оказывается, сам определяет...

"Значение адреса прибора зависит от установленного пара-
метра «Длина адреса» (см. ниже) – при 8-битной адресации значение пара-
метра «Адрес прибора» может принимать значение от 1 до 255, а при 11-
битной адресации – от 1 до 2047. Для протокола Modbus данный параметр не
действует."
И как установить адрес для протокола modbus ?

kgsh82
31.03.2014, 14:35
RTU или ASCII он, оказывается, сам определяет...

"Значение адреса прибора зависит от установленного пара-
метра «Длина адреса» (см. ниже) – при 8-битной адресации значение пара-
метра «Адрес прибора» может принимать значение от 1 до 255, а при 11-
битной адресации – от 1 до 2047. Для протокола Modbus данный параметр не
действует."
И как установить адрес для протокола modbus ?

Длина адреса - 8, сам адрес - по ссылке г. Валенка.

Алексей Дмитриев
02.04.2014, 23:21
Про библиотеку тут уже терто-перетерто много раз! Ищите на форуме, даже примеров куча.

nebel
17.04.2017, 14:10
Здравствуйте! Имеется в наличии ПЛК63 и модуль МВ110-8АС. Соединены по Modbus_RTU. Чтение параметров проходит, а вот запись нет.
Возможно ошибка в том что запись и чтение организовал через разные массивы.
В тексте программы:параметр (WORD) пытаюсь записать и читаю два параметра(Real и WORD( который пытаюсь записать)). Чтение происходит, а вот изменения нет.


PROGRAM modbus_read_and_write

VAR_INPUT

END_VAR

VAR_OUTPUT

END_VAR

VAR
RD_REGS:MB_RD_INP_REGS;
send_modbus: MB_WR_REGS;
RD_REGS1:MB_RD_INP_REGS;

Buffer: ARRAY[0..255] OF BYTE;
RD_Buffer: ARRAY[0..255] OF BYTE;

COM_SERVICE1: COM_SERVICE;
cmpl : BOOL;
port_opened: BYTE := 0;
Settings:COMSETTINGS;
enabl : BOOL;
err : INT;
TimeOut: TIME:=T#50ms;
ptr_D :POINTER TO BYTE;
ptr_f2 :POINTER TO BYTE;
DataSize :WORD;
WORK_IDENT :BYTE;
INP_WORD :WORD;
f1:WORD:=2;
TEMP:REAL;
out1 :REAL;
com_num :BYTE;


END_VAR


IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=9600;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );


IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
IF port_opened=2 THEN

CASE WORK_IDENT OF
0:

RD_REGS(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=32 ,
FirstAddr:=288 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=RD_Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );


IF cmpl AND err=0 THEN
ptr_D:=ADR(TEMP);
ptr_D^:=RD_Buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=RD_Buffer[2];
ptr_D:=ptr_D+1;
ptr_D^:=RD_Buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=RD_Buffer[0];
END_IF
IF cmpl THEN WORK_IDENT:=1;END_IF

1:

RD_REGS1(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=32 ,
FirstAddr:=0 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=RD_Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );


IF cmpl AND err=0 THEN
out1:=BYTE_TO_WORD(RD_Buffer[1]) OR SHL(BYTE_TO_WORD(RD_Buffer[0]),8);
END_IF
IF cmpl THEN WORK_IDENT:=2;END_IF

2:

IF cmpl AND err=0 THEN

Buffer[3] := DWORD_TO_BYTE(f1);
Buffer[2] := DWORD_TO_BYTE( SHR(f1,8));
Buffer[1] := DWORD_TO_BYTE( SHR(f1,16));
Buffer[0] := DWORD_TO_BYTE( SHR(f1,24));

END_IF

send_modbus(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=32 ,
FirstAddr:=0 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err,
RegCnt=>DataSize);

WORK_IDENT:=0;

END_CASE
END_IF


IF enabl = FALSE THEN
enabl := TRUE;
END_IF

IF err <> 0 THEN
enabl := FALSE;
END_IF

melky
17.04.2017, 23:22
ПЛК63/73 не поддерживает групповые запросы по объявленным адресам переменных, используйте служебную копию переменных, она поддерживает групповые запросы.

Добейтесь чтения одной переменной для начала.

ох блин какая старинная тема...

nebel
18.04.2017, 08:23
Первый раз программирую ПЛК73. Не смог найти "служебная копия переменных". Расскажите пожалуйста про неё или где можно прочитать?

nebel
18.04.2017, 09:08
В "Прогр. 63/73. РП. Приложение Б. Таб Б.1. Столбец 3." есть Список EnumP и только одна таблица. http://www.owen.ru/uploads/rp_plk63.73.pdf

nebel
18.04.2017, 09:28
Не совсем понимаю как мне это поможет в чтении\записи переменных по rs485 на МВ110. Как я понимаю это адресация modbus самого ПЛК.

nebel
18.04.2017, 10:54
ПЛК73 общается по модбас RTU с МВ110-8АС. Параметры считывает, но не записывает. В этом проблема.

nebel
18.04.2017, 11:07
В 9 посте я спросил:

Здравствуйте! Имеется в наличии ПЛК63 и модуль МВ110-8АС. Соединены по Modbus_RTU. Чтение параметров проходит, а вот запись нет.
Возможно ошибка в том что запись и чтение организовал через разные массивы.
В тексте программы:параметр (WORD) пытаюсь записать и читаю два параметра(Real и WORD( который пытаюсь записать)). Чтение происходит, а вот изменения нет.

Мне в 10 посте ответили:

ПЛК63/73 не поддерживает групповые запросы по объявленным адресам переменных, используйте служебную копию переменных, она поддерживает групповые запросы.

Добейтесь чтения одной переменной для начала.

ох блин какая старинная тема...

Далее в 11 посте я спросил:


Первый раз программирую ПЛК73. Не смог найти "служебная копия переменных". Расскажите пожалуйста про неё или где можно прочитать?

На что мне ответили:


Прогр. 63/73. РП. Приложение Б. Таб Б.1. Столбец 3.

Вот к этому и пришли

nebel
18.04.2017, 15:40
Что Вы хотите записать в один 0-й регистр пихая в буфер зачем-то 4 байта с непонятными значениями ? С типами разберитесь. И с флажком enabl - тоже.

В 0-й регистр хочу записать значение 2. И его же прочитать после записи. 4 байта взято из примера. Подскажите тогда как правильно мне сделать.

ASo
18.04.2017, 16:24
1. Формируете буфер.
2. Вызываете ФБ с enable=true
3. После этого в цикле вызываете этот же ФБ с неизменным буфером и enable=false до появления Complete=true.
4. Узнаете код ошибки и результат в буфере.
5. Только после этого можно вызывать этот или иной ФБ МОДБАС с enable=false!