Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Такого количества не было, но, я думаю, правильно будет использовать отдельный 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; 19.09.2016 в 00:01.
проверять нужно чтением лога запросов/ответов, а не домыслами
Интересно, как Вы будете определять изменение входов в модулях
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Последний раз редактировалось KSergey; 19.09.2016 в 08:32.
A_gricaj, я не могу понять, Вы вроде бы даете в одном из своих сообщений ссылку на тему "Универсальный диспетчер Modbus", но после этого спрашиваете, как организовать опрос. В указанной теме очень подробно описан один из способов.
Сможете ли Вы быстро опросить 54 модуля вопрос сложный. У меня в существующих проектах до 19 модулей при этом цикл опроса от 30 мс до 1500 мс (т.е. часть модулей опрашивается с периодом 30 мс, другие с периодом 1500 мс). 54, конечно, поболее, но я думаю, что в 1 секунду уложитесь, если разведете по разным портам, а запись будете осуществлять по изменению. Тут главная проблема в том, что некоторые модули долго отвечают. Так, например, модуль МУ110-16Р на скорости 57600 для установки своих 16 выходов требует порядка 15 мс, в то время как теоретически обмен одним регистром должен занимать примерно 2-3 мс.
Поэтому главная загвоздка в том, как быстро отвечают модули МДВВ. От этого и будет зависеть время полного цикла опроса.
Последний раз редактировалось Спорягин Кирилл; 19.09.2016 в 09:47.
Обратите внимание, еще на вот эту таблицу. Из нее хорошо, видно, что есть некоторая задержка в том, как отвечают модули. Это видно по разнице между опросами 4, 16, 32 и 48 байт. Так на скорости 115200 опрос 16 байт занимает 8 мс, а 32 байт - 10 мс. Из чего можно сказать, что опрос 16 байт на скорости 115200 примерно 2 мс (сходится с теоретическим расчетом). Но вот первые 16 байт он почему-то опрашивает аж 8 мс. В этом времени главная составляющая - это задержка от слейва - т.е. время, которое тот думает перед отправкой ответа.