Думал, что надо и там и там.
Убрал из дерева. Оставил только вызов ФБ из кода.
Сделал. Пока работает. Будем набирать статистику и смотреть, не завис ли обмен снова.
Думал, что надо и там и там.
Убрал из дерева. Оставил только вызов ФБ из кода.
Сделал. Пока работает. Будем набирать статистику и смотреть, не завис ли обмен снова.
Подскажите, а есть ли готовые или общепринятые способы распознавания восстановления связи с ПЧВ01[МО1]?
Сделал вариант, который работает с помощью отслеживания текущего входного напряжения на ПЧВ.
При разнице с предыдущим сохраненным значением выше определенного значения считать что связь восстановилась
В данном случае для себе взял значение 150 (трех фаз у меня пока нет).
Цель - ПЛК при включении частотника должен писать в него (частотник) значение по умолчанию.
Но этот способ кажется корявым, что скажете?Код:IF (currentVoltage - savedVoltage) > 150 THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
//можно попробовать использовать xError или другие варианты, типа OwenDriver.hasError
//но xInitDone хоть и интуитивно не так понятен, но стабильно TRUE если есть связь и FALSE,
//если нет
IF NOT PChV1_M01.xInitDone THEN
currentVoltage := 0;
END_IF
savedVoltage := currentVoltage
До этого пытался соорудить что-то, сделав счетчик Модбас передач с помощью xDone, сохраняя и сравнивая предыдущее значение с текущим.
Пытаясь потом поймать момент восстановления, когда значения счетчиков сравнялись и xDone снова в True.
Стабильно рабочего варианта не вышло, ибо измененное текущее значение периодически перетиралось дефолтным.
Код://Работает при включении-выключении ПЧВ, но также счетчики периодически сравниваются при стабильно включенном ПЧВ
IF (pchvModbusCountSaved = pchvModbusCount) AND PChV1_M01.xDone THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
//каждые 300 (например) циклов, сохраняем значение счетчика
IF cycleCount MOD 300 = 0 THEN
pchvModbusCountSaved := pchvModbusCount;
END_IF
IF PChV1_M01.xDone THEN
pchvModbusCount := pchvModbusCount + 1;
END_IF
edvard_munch А можно пояснить подробности:
* Как ПЧВ опрашивается? Через шаблон или через Modbus Slave Device?
* ПЛК же Master, верно?
* Связь по Modbus TCP или Modbus RS-485?
* Почему не годится стандартный способ с .xError?
На всякий случай оставлю ссылку на свою статью с обработкой ошибок и связи: https://cs-cs.net/technologii-testir...odbus___ai__io
В ней надо почитать заголовок 6. Там есть описание того, как можно при помощи включенной диагностики и .xError получать ошибки опроса устройства с защитой от случайно возникающих ошибок.
Да! Это оно! Единственное неудобство в том, что на момент ошибки xError становится TRUE, а при следующей попытке опроса сбрасывается на FALSE.
Я у себя в статье как раз это описал (ради этого стоит почитать) и показал, как сделал систему выдержки на паре таймеров.
Её суть такая, образно: "Одна ошибочка появилась - значит, глюк. О, а если пошли несколько ошибок подряд - то это точно отвал связи".
Все, разобрался. Набросал быстренько пока такой код. Работает. Спасибо!
Код:pchvModbusErrorsComing: TOF;
pchvModbusConnectionError: TON;
modbusErrorTimeout: TIME:= T#1000MS;
modbusErrorSeriesTimeout: TIME:= T#3000MS;
fTrigPchvRestarted: F_TRIG;
pchvModbusErrorsComing(IN:= PChV1_M01.xError, PT:= modbusErrorTimeout);
pchvModbusConnectionError(IN:= pchvModbusErrorsComing.Q, PT:= modbusErrorSeriesTimeout);
fTrigPchvRestarted(CLK:= pchvModbusConnectionError.Q);
IF fTrigPchvRestarted.Q THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
О, класс! Наконец-то кто-то внимательно прочитал ту мою статью, ахаха (спасибо, мне приятно что в дело пошло)!
Отлично! В будущем это можно, как у меня, запихать в функциональный блок, и для разных устройств создавать его экземпляры!
PS. А не надо потом триггер записи в ПЧВ сбрасывать? Да, сам ПЛК запишет его по фронту, но а в коде не надо?
Можно его, например, обрабатывать через таймер TP и на время 500 ms поставить.