Вход

Просмотр полной версии : Получить состояние Modbus-модулей в программе



aaaSashaMGGU
27.11.2024, 14:36
Добрый день!
Как получить состояние модуля прямо в программе:
80367
Там, где 1 - получить "False"
Там, где 2 - получить "True"

Хочу на мнемосхеме выводить квадратик с надписью "Связь в норме" зелёным цветом или "Связь потеряна" красным

Я пробовал уже кучу способов, все перечислять не буду. Скажу только, что они все работают непостоянно...
Просто интересно, как это делают нормальные люди :)

Спасибо!

Евгений Кислов
27.11.2024, 14:44
Добрый день!
Как получить состояние модуля прямо в программе:
80367
Там, где 1 - получить "False"
Там, где 2 - получить "True"

Хочу на мнемосхеме выводить квадратик с надписью "Связь в норме" зелёным цветом или "Связь потеряна" красным

Я пробовал уже кучу способов, все перечислять не буду. Скажу только, что они все работают непостоянно...
Просто интересно, как это делают нормальные люди :)

Спасибо!

Добрый день.
См. п. 4.6:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf

aaaSashaMGGU
27.11.2024, 14:50
Добрый день.
См. п. 4.6:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf

Изучил вдоль и поперёк. Всё не то
При реально отключенном модуле его состояние постоянно прыгает: Ошибка прыгает true-false, byModbusError прыгает UNDEFINED - RESPONSE_TIMEOUT
В итоге, приходится начинать свистопляску с таймерами на то, на это
Как на практике это сделать максимально удобно - понять не могу

Евгений Кислов
27.11.2024, 14:56
При реально отключенном модуле его состояние постоянно прыгает: Ошибка прыгает true-false, byModbusError прыгает UNDEFINED - RESPONSE_TIMEOUT

...что совершенно логично: контроллер же не знает, что "модуль реально отключен" и продолжает отправлять запросы, детектируя отсутствие ответа (RESPONSE_TIMEOUT). UNDEFINED - это состояние драйвера между запросами.


Как на практике это сделать максимально удобно - понять не могу

Для этого надо сформулировать ваши критерии наличия и отсутствия связи и критерий "максимального удобства".

Cs-Cs
27.11.2024, 15:10
aaaSashaMGGU
При реально отключенном модуле его состояние постоянно прыгает: Ошибка прыгает true-false, byModbusError прыгает UNDEFINED - RESPONSE_TIMEOUT ВОТ (Читать заголовок 6): https://cs-cs.net/technologii-testirovaniya-i-otladky-shhgitov-s-svtomatikoy-na-plk#6__modbus___ai__io

Sergey361
27.11.2024, 15:17
Timer_TON(IN := NOT(N001.xDone), PT := T#30S, Q => xAlarmConnect_N001);

aaaSashaMGGU
27.11.2024, 21:50
Timer_TON(IN := NOT(N001.xDone), PT := T#30S, Q => xAlarmConnect_N001);

Всё это очевидно и так, я и сам это понимаю
Проблемы начинаются тогда, когда модбасовская задача стоит отдельно. А задача, которая основная - пытается забирать состояния модулей
В этом случае (я писал выше) Ошибка прыгает true-false, byModbusError прыгает UNDEFINED - RESPONSE_TIMEOUT для отключенного модуля, а для подключенного модуля Ошибка НЕ прыгает, но byModbusError прыгает UNDEFINED - RESPONSE_SUCCESS
И, казалось бы, чёрт с ним, пусть скачут, таймер всё отфильтрует. Но нет. Всё это работает периодически нестабильно, показывая отвал модуля с таймером вплоть до 10 секунд. Да, знаю, что бред, но это так
Но при этом зелёненький кружок в дереве проекта всегда горит зелёным и ни разу не моргает. Вот я хотел спросить, как забрать вот прям именно его, а не изобретать весосипед из таймеров, задач с разными временами циклов и приоритетов и пр.
Вдруг кто-то уже знает ответ...

aaaSashaMGGU
27.11.2024, 21:55
aaaSashaMGGU ВОТ (Читать заголовок 6): https://cs-cs.net/technologii-testirovaniya-i-otladky-shhgitov-s-svtomatikoy-na-plk#6__modbus___ai__io

Спасибо
Уже некоторое время назад сам дошёл до двух таймеров TON - TOF и отдельного ФБ для всего этого
Просто ещё не допинал до конца времена - решил спросить, вдруг есть более адекватный способ для определения отвала: например, забрать один какой-нибудь флаг и всё
Но, видимо, не один я вспоткнулся обо всё это

Cs-Cs
27.11.2024, 21:55
Неа! Я не нашёл способа, и как раз сделал так, как написал в статье.
По любому придётся делать так, как делал я. И в разных задачах - да.

capzap
28.11.2024, 09:57
выводить квадратик с надписью "Связь в норме" зелёным цветом или "Связь потеряна" красным
разве условие Modbus_TCP_Slave.ComState <> 16#2 не удовлетворяет требованию о потере связи?

Задумкин Сергей
28.11.2024, 10:29
Я так делаю


_fbModbusError_RS(SET := refModbusSlave.xError, RESET1 := refModbusSlave.xDone);
_fbModbusErrorDelay(IN := _fbModbusError_RS.Q1, PT := T#5S);

IF _fbModbusErrorDelay.Q THEN
xPing := FALSE;
ELSE
xPing := TRUE;
END_IF

aaaSashaMGGU
28.11.2024, 10:54
разве условие Modbus_TCP_Slave.ComState <> 16#2 не удовлетворяет требованию о потере связи?

TCP-шные модули, к слову, работают в этом плане стабильно
Проблема с модулями по RS-485. С ними все проблемы

capzap
28.11.2024, 11:06
TCP-шные модули, к слову, работают в этом плане стабильно
Проблема с модулями по RS-485. С ними все проблемы
ну в проекте треугольник же не пропадает. У меня нет последовательных устройств, проверить не начем, по аналогии с ТСР есть параметр getdeviсestate.eError, возможно его надо сравнивать на равенство нулю