Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk
Подскажите, а есть ли готовые или общепринятые способы распознавания восстановления связи с ПЧВ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 получать ошибки опроса устройства с защитой от случайно возникающих ошибок.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net
Да! Это оно! Единственное неудобство в том, что на момент ошибки xError становится TRUE, а при следующей попытке опроса сбрасывается на FALSE.
Я у себя в статье как раз это описал (ради этого стоит почитать) и показал, как сделал систему выдержки на паре таймеров.
Её суть такая, образно: "Одна ошибочка появилась - значит, глюк. О, а если пошли несколько ошибок подряд - то это точно отвал связи".
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net
Все, разобрался. Набросал быстренько пока такой код. Работает. Спасибо!
Код: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 поставить.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net