PDA

Просмотр полной версии : ПЛК 323. Опрос по Modbus регистров ТРМ 202



rescom
17.03.2014, 21:11
Добрый день уважаемые разработчики.
С CodeSys начал работать недавно, поэтому заранее прошу прощения, если сделанные мною ошибки, являются "детскими". Все обновления CodeSys и библиотеки последних версий установлены. Есть ПЛК 323 и ТРМ 202. Соединены ПЛК RS-485 "P1 (он же com2, если всё правильно)" и RS-485 на ТРМ 202. Протокол ModBus адрес ТРМ - 2, MB_RTU (хотя можно и MB_ASCII, главное чтобы заработало) .
Задача хоть на ST, хоть на CFC, получать хотя-бы один параметр (адрес к примеру 5) по функции 0x03 из ТРМ.
Бьюсь уже 4 дня, но так ничего и не получилось. Привожу здесь ST и CFC, которыми пытался заполучить заветный параметр, может кто направит на путь истинный и поможет сдвинуться с мёртвой точки. Заранее благодарю!

Пррограмма с библиотекой ModBus (OWEN) на ST:

pResult1: DWORD;
PortNum: ModBus.COM_Ports:=2;
port_opened: BYTE := 0;
Settings: ModBus.SysCom.COM_Settings; (*настройки последовательного порта *)
SettingsEx: ModBus.SysCom.COM_SettingsEx;
get1_modbus: ModBus.MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
enabl: BOOL;
TimeOut: TIME := T#150MS;(*таймаут*)
Buffer: ARRAY [0..255] OF BYTE;
cmpl: BOOL;
err: INT;
DataSize: WORD;
x:WORD; (*считанное значение*)
END_VAR



IF port_opened=0 THEN
Settings.sPort:=PortNum ; (*номер COM-порта*)
Settings.ulBaudrate:=115200; (*скорость*)
Settings.byParity:=0;
Settings.ulTimeout:=0;
Settings.byStopBits:=2;
Settings.ulBufferSize:=0;
SettingsEx.byByteSize:=8;
SettingsEx.bBinary:=TRUE;
PortHandle:=ModBus.SysComOpen2( ADR(Settings),ADR(SettingsEx),ADR(pResult1) );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF pResult1=0 THEN
port_opened:=2;
END_IF
END_IF
(* Читаем Modbus *)
IF port_opened=2 THEN (*Удачно проинициализировали*)
get1_modbus(
Enable:=enabl , (* разрешение работы блока *)
Mode:=1 , (*режим передачи*)
DevAddr:=2 , (*адрес*)
FirstAddr:=5 , (*номер регистра*)
Quantity:=1, (*количество регистров*)
ComHandle:=PortHandle ,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
END_IF
END_IF
END_IF



Программа с библиотекой ModulsOwenLib на CFC:


http://www.owen.ru/forum/images/attach/png.gif

kgsh82
18.03.2014, 20:02
port_opened=2 - это условие выполняется?

Черевач Александр
19.03.2014, 13:13
Добрый день.

Нумерация Com-портов в ПЛК323 следующая (https://www.dropbox.com/s/ableiic38jvobu6/%D0%9D%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D 1%8F%20%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2.png)

DeMax
19.03.2014, 13:35
В мануале написано (таблица 6.2), что стоповых бита должно быть 2, а в программе на CFC 1.
Обмен-то с ТРМ идет? Ошибки обмена есть? rdata объявлен как указатель на байт, а к какой области памяти он привязан?
Попробуй объявить переменную rdata типа WORD, подать ее на вход алгоблока ADR, а выход с алгоблока ADR подать на вход VarAdr.
Результат будет находиться в rdata. И что-то мне подсказывает, что чтение должно выполняться по фронту на входе Enabl алгоблока uniread. Вроде бы надо поставить алгоблок BLINK для "передергивания" входа Enabl?

rescom
19.03.2014, 14:50
Вот это уже что-то для сдвига с мёртвой точки. А то везде, где я читал P1 (первый RS-485) был COM2. А он оказался COM4...
Стоповый бит пробовал и 1 и 2. Разницы нет. COM порт открывается, условие port_opened=2 выполнятся, но дальше никак.
Сегодня ещё пришёл ответ от техподдержки:
_________________________________________________
Если Вы используете первый порт физический RS485 , то его номер в программе 4. как я понял на форуме , Вы выставили 2й. попробуйте.
Вот ещё пример опроса с СПК трм212 - http://www.owen.ru/forum/attachment.php?attachmentid=10170&d=1379509212
http://www.youtube.com/watch?v=tkXzTxf1HmE мой видео пример проекта.
__________________________________________________

Сегодня продолжу работу на основе новых данных и примеров. О результате обязательно отпишусь.

Всем спасибо за отклик.

rescom
21.03.2014, 19:07
В общем, завести всё удалось, только методом, описанном в этом видео.
http://www.youtube.com/watch?v=tkXzTxf1HmE

Теперь будем учиться писать, полученные данные в файл на SD карту и с периодичностью отсылать результат центральному диспетчеру через GPRS канал. ;)

Всем спасибо!