регистр это всегда слово, а не байт, в доках написано с какого по какой разряд используются входа/выхода,остается только к слову добавить точку и цифру номера разряда, чтоб прочитать/записать були
Вид для печати
Такого количества не было, но, я думаю, правильно будет использовать отдельный PRG, в которой один раз открывать порт, а внутри этой программы уже использовать ФБ обращения к приборам. На входе ФБ можно выставить номер прибора и команду Enable, на выходе - результат обработки и Complete. По приходу Complete от предыдущего блока, включать Enable последующего. Записывать выходы можно по изменению, для экономии трафика. Как-то так.
Ну вроде работает и чтение и запись - два модуля на столе.
А как избавится от вот этого:
Вложение 26437
Причем эта ошибка (меняет постоянно свое значение с 0 на 255 и обратно) не мешает - выхода включаются.
Мой код
Код:IF port_opened=0
THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
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 master1 OF
0:
ModbusAdrDi11(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=11 ,
FirstAddr:=51 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer,
Complete=>cmpl ,
Exception=>ErrorDI11 ,
ByteCnt=>DataSize );
IF cmpl
THEN
IF ErrorDI11=0
THEN
DIWordAdr11:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
END_IF
master1:=1;
END_IF
1:
ModbusAdrDi11(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=12 ,
FirstAddr:=51 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>ErrorDI12 ,
ByteCnt=>DataSize );
IF cmpl
THEN
IF ErrorDI11=0
THEN
DIWordAdr12:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
END_IF
master1:=2;
END_IF
2: (*çàïèñü*)
Buffer[0]:=0;
Buffer[1]:=DOByteAdr11;
ModbusAdrDO11(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 11,
FirstAddr:= 50,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> cmpl,
Exception=> ErrorDO11,
RegCnt=> DataSize);
IF cmpl
THEN
master1:=3;
END_IF
3:
Buffer[0]:=0;
Buffer[1]:=DOByteAdr12;
ModbusAdrDO12(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 12,
FirstAddr:= 50,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> cmpl,
Exception=> ErrorDO12,
RegCnt=> DataSize);
(*åñëè óñòàíîâëåí ïðèçíàê çàâåðøåíèÿ îïåðàöèè, òî *)
IF cmpl
THEN
master1:=0;
END_IF
END_CASE
IF enabl = FALSE THEN enabl := TRUE;
END_IF
END_IF
DOByteAdr11.7:=DIWordAdr11.0;
Где хотябы почитать про эту ошибку подскажите пожалуйста???
Новое PRG, точно поможет? где-то читал что не поможет....
Только, что сделал FB котором: открытие порта, далее чтение из 21 модуля, потом запись в 21 модуль. Тайм-аут 10мс. Но ФИЗИЧЕСКИ подключены к порту только два модуля. И залил код "DO:=DI" ну если есть вход сразу включается выход. Так вот задержка между включением светодиода на входе до включения реле на выходе примерно 1 сек.
Думаю, что если сейчас 19 модулей работают по тайм-ауту, а это 19 модулей*2 кол. обращений*10=380 мс плюс там еще какие то задержки. Если все это уберется, то может все будет и нормально - завтра буду на объекте - попробую....
А по изменению это идея, достаточно перед записью сравнить старое значение байта с новым и если они равны тогда перейти на следующий шаг CASE, так?
проверять нужно чтением лога запросов/ответов, а не домыслами
Интересно, как Вы будете определять изменение входов в модулях
A_gricaj, я не могу понять, Вы вроде бы даете в одном из своих сообщений ссылку на тему "Универсальный диспетчер Modbus", но после этого спрашиваете, как организовать опрос. В указанной теме очень подробно описан один из способов.
Сможете ли Вы быстро опросить 54 модуля вопрос сложный. У меня в существующих проектах до 19 модулей при этом цикл опроса от 30 мс до 1500 мс (т.е. часть модулей опрашивается с периодом 30 мс, другие с периодом 1500 мс). 54, конечно, поболее, но я думаю, что в 1 секунду уложитесь, если разведете по разным портам, а запись будете осуществлять по изменению. Тут главная проблема в том, что некоторые модули долго отвечают. Так, например, модуль МУ110-16Р на скорости 57600 для установки своих 16 выходов требует порядка 15 мс, в то время как теоретически обмен одним регистром должен занимать примерно 2-3 мс.
Поэтому главная загвоздка в том, как быстро отвечают модули МДВВ. От этого и будет зависеть время полного цикла опроса.
Обратите внимание, еще на вот эту таблицу. Из нее хорошо, видно, что есть некоторая задержка в том, как отвечают модули. Это видно по разнице между опросами 4, 16, 32 и 48 байт. Так на скорости 115200 опрос 16 байт занимает 8 мс, а 32 байт - 10 мс. Из чего можно сказать, что опрос 16 байт на скорости 115200 примерно 2 мс (сходится с теоретическим расчетом). Но вот первые 16 байт он почему-то опрашивает аж 8 мс. В этом времени главная составляющая - это задержка от слейва - т.е. время, которое тот думает перед отправкой ответа.