У меня для 5 агрегатов в Owen Logic так получилось
В OwenLogic нет возможности передать время, поэтому в ФБ передаётся целое число с последующим преобразованием в тип time, из-за выбора единиц измерения входной переменной в секундах, домножаю на 1000.
bEnable - это для назначения всех выходов в выключенное состояние - например, при аварийном останове или на период инициализации после подачи питания.
Код:FUNCTION_BLOCK NotAllAtOnce5_ VAR_INPUT bEnable: BOOL; bRequest1: BOOL; bRequest2: BOOL; bRequest3: BOOL; bRequest4: BOOL; bRequest5: BOOL; nDelay_s: UDINT; END_VAR VAR_OUTPUT bStart1: BOOL; bStart2: BOOL; bStart3: BOOL; bStart4: BOOL; bStart5: BOOL; END_VAR VAR tDelay: TIME; bStartPrevious1: BOOL; bStartPrevious2: BOOL; bStartPrevious3: BOOL; bStartPrevious4: BOOL; bStartPrevious5: BOOL; tpPause: SYS.TP; bSwitchEn: BOOL; // разрешение изменить состояние END_VAR // преобразование типа и пересчёт значения в [с] tDelay := UDINT_TO_TIME(nDelay_s * 1000); // ограничение минимального значения IF tDelay < T#1s THEN tDelay := T#1s; END_IF // присвоение таймеру для уменьшения параметров в следующих вызовах tpPause(T := tDelay); IF bEnable THEN // обработка для агрегата 1 bSwitchEn := NOT(tpPause.Q) AND (bRequest1 <> bStart1); IF bSwitchEn THEN bStart1 := bRequest1; END_IF tpPause(I := bSwitchEn); // обновление значения выхода таймера для следующего обработчика // обработка для агрегата 2 bSwitchEn := NOT(tpPause.Q) AND (bRequest2 <> bStart2); IF bSwitchEn THEN bStart2 := bRequest2; END_IF tpPause(I := bSwitchEn); // обновление значения выхода таймера для следующего обработчика // обработка для агрегата 3 bSwitchEn := NOT(tpPause.Q) AND (bRequest3 <> bStart3); IF bSwitchEn THEN bStart3 := bRequest3; END_IF tpPause(I := bSwitchEn); // обновление значения выхода таймера для следующего обработчика // обработка для агрегата 4 bSwitchEn := NOT(tpPause.Q) AND (bRequest4 <> bStart4); IF bSwitchEn THEN bStart4 := bRequest4; END_IF tpPause(I := bSwitchEn); // обновление значения выхода таймера для следующего обработчика // обработка для агрегата 5 bSwitchEn := NOT(tpPause.Q) AND (bRequest5 <> bStart5); IF bSwitchEn THEN bStart5 := bRequest5; END_IF tpPause(I := bSwitchEn); // обновление значения выхода таймера для следующего обработчика ELSE // отсчёт от момента выключения, для паузы при быстром переключении bEnable tpPause(I := bStart1 OR bStart2 OR bStart3 OR bStart4 OR bStart5); // выключить все агрегаты bStart1 := FALSE; bStart2 := FALSE; bStart3 := FALSE; bStart4 := FALSE; bStart5 := FALSE; END_IF bStartPrevious1 := bStart1; bStartPrevious2 := bStart2; bStartPrevious3 := bStart3; bStartPrevious4 := bStart4; bStartPrevious5 := bStart5; END_FUNCTION_BLOCK




Ответить с цитированием