
Сообщение от
Cs-Cs
Я в эмуляции тыркал OpenPart/ClosePart между собой. Собственно от подачи этих команд и наворочена защита (FBшка может управлять шторами, рольставнями, кранами воды).
На CodeSys, повторюсь, работает прям отлично. А тут чего-то подтупливает (или я где-то сделал ошибку, которая в CodeSys прокатывает).
У тебя CODE как-то красиво комментарии расцветил, а у меня только чёрно-белым всё показывал (
По-ходу надо перенести управление Power:
Код:
tmPwOffDelay(I:= (UseDelayITL AND UseDelayDIR AND RelayDir AND RelayPower), T:= UDINT_TO_TIME(TimeDelayDIR / 2));
(* Тут обрабатываем задержу сигнала Power, если сигнал "Направление" (RelayDir физически) равен TRUE
Привязка к физическому RelayDir нужна из-за того что у нас может быть включен режим инверсии DIR, и поэтому
при команде закрытия реле Dir может быть TRUE.
Основной алгортим следующий: при активном DIR включается таймер задержки (если эта настройка включена),
а реальный сигнал Power выдаётся сразу (если настройка выключена) или после таймера задержки. *)
(* Чтобы выдать сигнал Питания, надо учесть следующие условия:
а) Это просто операция закрытия: выдаётся без задержек
б) Это операция открытия без DIRDelay: выдаётся сразу
в) Это операция открытия с DIRDelay: выдаётся после выдержки
Значение для пунктов "б" и "в" выбирается при помощи SEL. *)
RelayPower := bRlyClose OR (bRlyOpen AND SEL_B((UseDelayDIR = TRUE), RelayDir, tmPwDelay.Q));
//Формируем физический сигнал DIR таким, каким он должен быть с учётом выдержки
RelayDir := (tmPwOffDelay.Q AND (NOT RelayPower)) OR (SEL_B(UseReverseDIR, bRlyOpen, bRlyClose));
//Теперь обрабатываем таймер задержки Power (он работает всегда, так как настройку могут изменить на лету,
//и таймер должен подхватить выдержку на лету)
tmPwDelay(I:= RelayDir, T:= UDINT_TO_TIME(TimeDelayDIR)); //Реле питания работает, если есть хоть одна команда
Я ничего не красил - просто прямо из OL скопировал