Очень странно, в смысле, Вы сами придумали неправильную логигу и другим жалуетесь на это?
Впрочем не надо расстраиваться, этот вопрос много раз обсуждался, в смысле, надо было просто взять готовое типа такого:
Вложение 85414
Вид для печати
Очень странно, в смысле, Вы сами придумали неправильную логигу и другим жалуетесь на это?
Впрочем не надо расстраиваться, этот вопрос много раз обсуждался, в смысле, надо было просто взять готовое типа такого:
Вложение 85414
Если всё же прочитать мой вопрос - предложенное решение там уже реализовано в Slave.
А вот в Master контроль выполняется по переменной, привязанной к аппаратному контролю. И это единственный способ определить отсутствие связи с готовыми устройствами типа ПЧВ, ТРМ. Поэтому применить для контроля связи с другим ПР тоже считаю корректным.
Проблема состоит в том, что в Master с контролем по аппаратной привязке сработала ошибка при 15 секундах задержки, а при контроле через heartbeat в Slave - не сработала даже с 4 секундами.
Оба ПР205 куплены одновременно, аппаратно идентичны.
В ПР производителем реализован аппаратный контроль соединения по Modbus только со стороны Master, со стороны Slave нужно реализовывать программно.
У меня система из двух ПР205, соединённых по Modbus RTU RS-485. Одно из ПР является Master, другое - Slave.
Контроль связи организован в них по разному: в Master - аппаратно, в Slave - программно (именно так - из Master приходят секунды и длительное отсутствие изменения является признаком ошибки).
При помощи TON и SR-триггера эти обрывы связи фиксируются после небольшой выдержки.
Для Master выдержка составляет 15 секунд, для Slave - 4 секунды.
Скрины привязки к аппаратной части Master и фрагменты получения признака отсутствия соединения привёл выше. Не показал только фиксацию ошибки на TON и триггере.
Вчера сработала защита по отсутствию связи. Оператор сбросил сигнализацию только на Master, а на Slave ошибки зафиксировано не было.
Это меня беспокоит.
Также, использую аппаратную переменную для определения обрыва связи с ПЧВ. Привязал индикатор на экране ПР205 к аппаратному сигналу - наблюдаю постоянное мигание индикатора, т.е. аппаратура постоянно диагностирует обрыв и восстановление соединения.
Возможности получить от ПЧВ переменную с секундами для программной диагностики связи - не имею технической возможности. И, получается, могу использовать только аппаратную переменную.
Меня интересует, как правильно интерпретировать аппаратную переменную, почему диагностирован обрыв соединения при задержке 15 секунд (а программная диагностика и при 4 секундах не заметила).
При отсутствии изменений переменной Heartbeat на выходе XOR будет целочисленный 0, а при изменении - на один такт будет что-то отличное от 0, после преобразования результата в BOOL соответственно получу 0 и 1, а дальше - небольшая фильтрация результата на TON с задержкой в 1-2 секунды.Цитата:
А почему вы думаете, что конструкция в виде целочисленного XOR должна выдать требуемый результат?
Может у вас сильные помехи, например от ПЧ, на одно из ПР они действуют сильнее, может оно ближе к источнику помех или сетевой фильтр хуже работает, мне так кажется!
И зачем так усложнять очень простую функцию, она становится неочевидной(трудно разобраться как она работает), Валенок как-то называл подобный код, типа индусский код, точно уже не припомню, зачем что-то выдумывать(время тратить не жалко) когда есть простое и очевидное решение, это мне непонятно!
Тем, что вы не вникаете в то, что я пишу.
Именно то решение, что Вы предлагаете - уже применено! Именно с его помощью в Slave и диагностируется обрыв.
А в Master я диагностирую по переменной с привязкой к аппаратной части - в окне настройки Master. И вот эта переменная ведёт себя не так, как я представляю.
Да, я могу и из Slave (ПР205) отправлять в Master секунды (heartbeat) и там диагностировать так же, как и в Slave, но другие slave-устройства (ПЧВ, ТРМ) останутся без диагностики.
Я не против бороться с помехами, но для начала хочу понять, что исправить в моём "индусском" коде.
Помехами будут заниматься другие люди и их работа - их личная боль.
Всё что вам надо, любая переменная из слейва, которая меняется постоянно типа Float, и используете её вместо секунд в том же виде с таймером. Вложение 85418
Как только изменение остановится (оборвётся связь), не будет сигнала сравнения.
На скрине, умножение на 1000, чтобы реагировало даже на изменение тысячных