Почему-то не меняется время опроса ставлю 500мс и 1000мс, всё равно опрос идёт с частотой 100мс (на глаз).
Второе, что не понял, для чего в опросе модулей используются шаги (step). Ведь всё равно опрос прописан так, что команды опроса следуют друг за другом...
Пробую опросить модуль RL_I (это реле с двумя дискретными входами), в котором используются команды Modbus 05(управление реле), 02(опрос входов), 01(состояние реле). Прописал в опросе шаг1 - 05, шаг2 - 01, шаг3 - 02. В результате работает только Шаг1, остальные игнорятся почему-то.
Может для корректной работы необходимо данный модуль разделить на три? И в каждом использовать нужную функцию по отдельности...
Попробовал опросить каждой функцией отдельно. По отдельности работают. Причём настройки портов и опроса не меняю (500мс) - 02 функция опрашиватся 500мс, а 01 и 05 - 100мс.
Вобщем пока не понимаю как опросить один и тот же модуль разными Modbus функциями. Разделить на три модуля не получается т.к. адрес один и тот же - диспетчер не пропускает...
Последний раз редактировалось Sergeba; 07.12.2019 в 12:35.
Должен меняться. Вы точно меняете PollingTime, а не ValidPollingTime, например?
Как правило опрос в модулях организован следующим образом (для модулей ввода):
1. На 1-м шаге вызываем соответствующую функцию опроса. Когда она завершила работу (Complete=true) анализируем результат и либо повторяем шаг 1 или идем на следующий.
2. На 2-м шаге, если нужно опрашиваем другие регистры этого же модуля, если нужно другой функцией. Когда функция завершила работу (Complete = true) анализируем результат и либо повторяем шаг или идем на следующий.
...
N. На заключительном шаге выполняем различные сервисные функции. В частности: статистика, сообщаем диспетчеру, что опрос завершен.
Да, но судя по коду (в примерах), насколько я понял, эти шаги исполняются один за другим, за одну итерацию - если это так, то смысла в Step не вижу. Это же не оператор Case. Следуя примеру, я так и сделал для описания своего модуля (реле с управлением), использовал Step. В результате модуль опрашивался реже и реже, .пока вообще перестал опрашиваться, причём опрос происходил только по первой описываемой функции, вторая и третья по очереди (были разнесены на разные Step) не опрашивались Read у них висел всё время в False. После чего я описал модуль оператором Case, параметр для оператора передавал из основной программы - так опрос пошёл по всем трём функциям, только пришлось подобрать тайминги выполнения каждой из них, поскольку, к примеру, срабатывание реле не происходило, если обращение функции происходило меньше 1 сек.
Хотя... смысл в Step понятен, но тогда получается, что ещё нужно описать задержки между опросами разных функций. Т.к. мой модуль отказывается опрашиваться...Причём, в моём случае эти задержки различны по времени.
Последний раз редактировалось Sergeba; 09.12.2019 в 09:55.
Что значит за одну итерацию?
Мы переходим на следующий Step, только, когда получили ответ, что опрос закончен, т.е. Complete = true.
Если ваш модуль неповоротливый и не может сразу после обработки одного запроса, тут же отвечать на другой, тогда сделайте "пустой" шаг, на котором просто ждите определенное время (100, 200 мс).
А вот параметр для case передавать из основной программы - это идеологически неверно! Модуль сам решает, как опрашивать свои регистры! Зачем еще что-то писать в основной программе!???
Тогда стоит попробовать чтение и запсись делать при разных вызовах. У меня работает прекрасно. Частотники со скоростью 9600 опрашиаваются каждые 25мс (общий опрос получается 50мс), работает чётко.
*эксперименты со сменой скорости порта на лету закончились неудачей. Но это не беда. Ведь мы имеем два порта, один можно для быстрых а другой для медленных устройств, типа частотников. С ними мало данных нужно, так что и так успеют опроситься.