Просмотр полной версии : ПЛК 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 порта, и почему все остальные значения равны нулю? особенно размер буфера..
на всякий случай, вложу файл с примером проги..
Для работы ПЛК63 в качестве ведомого библиотека не нужна. Достаточно правильно объявить необходимые переменные и настроить порт в конфигурации. Гоу ту руководство по программированию для ПЛК63.
не знаю в чем дело, но не выходит читать параметры по 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 ?
RTU или ASCII он, оказывается, сам определяет...
"Значение адреса прибора зависит от установленного пара-
метра «Длина адреса» (см. ниже) – при 8-битной адресации значение пара-
метра «Адрес прибора» может принимать значение от 1 до 255, а при 11-
битной адресации – от 1 до 2047. Для протокола Modbus данный параметр не
действует."
И как установить адрес для протокола modbus ?
Длина адреса - 8, сам адрес - по ссылке г. Валенка.
Алексей Дмитриев
02.04.2014, 23:21
Про библиотеку тут уже терто-перетерто много раз! Ищите на форуме, даже примеров куча.
Здравствуйте! Имеется в наличии ПЛК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
ПЛК63/73 не поддерживает групповые запросы по объявленным адресам переменных, используйте служебную копию переменных, она поддерживает групповые запросы.
Добейтесь чтения одной переменной для начала.
ох блин какая старинная тема...
Первый раз программирую ПЛК73. Не смог найти "служебная копия переменных". Расскажите пожалуйста про неё или где можно прочитать?
В "Прогр. 63/73. РП. Приложение Б. Таб Б.1. Столбец 3." есть Список EnumP и только одна таблица. http://www.owen.ru/uploads/rp_plk63.73.pdf
Не совсем понимаю как мне это поможет в чтении\записи переменных по rs485 на МВ110. Как я понимаю это адресация modbus самого ПЛК.
ПЛК73 общается по модбас RTU с МВ110-8АС. Параметры считывает, но не записывает. В этом проблема.
В 9 посте я спросил:
Здравствуйте! Имеется в наличии ПЛК63 и модуль МВ110-8АС. Соединены по Modbus_RTU. Чтение параметров проходит, а вот запись нет.
Возможно ошибка в том что запись и чтение организовал через разные массивы.
В тексте программы:параметр (WORD) пытаюсь записать и читаю два параметра(Real и WORD( который пытаюсь записать)). Чтение происходит, а вот изменения нет.
Мне в 10 посте ответили:
ПЛК63/73 не поддерживает групповые запросы по объявленным адресам переменных, используйте служебную копию переменных, она поддерживает групповые запросы.
Добейтесь чтения одной переменной для начала.
ох блин какая старинная тема...
Далее в 11 посте я спросил:
Первый раз программирую ПЛК73. Не смог найти "служебная копия переменных". Расскажите пожалуйста про неё или где можно прочитать?
На что мне ответили:
Прогр. 63/73. РП. Приложение Б. Таб Б.1. Столбец 3.
Вот к этому и пришли
Что Вы хотите записать в один 0-й регистр пихая в буфер зачем-то 4 байта с непонятными значениями ? С типами разберитесь. И с флажком enabl - тоже.
В 0-й регистр хочу записать значение 2. И его же прочитать после записи. 4 байта взято из примера. Подскажите тогда как правильно мне сделать.
1. Формируете буфер.
2. Вызываете ФБ с enable=true
3. После этого в цикле вызываете этот же ФБ с неизменным буфером и enable=false до появления Complete=true.
4. Узнаете код ошибки и результат в буфере.
5. Только после этого можно вызывать этот или иной ФБ МОДБАС с enable=false!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot