Код: Выделить всё
FUNCTION_BLOCK GateValve
VAR_INPUT
//--------------------------------------------------------------------
bPermit :BOOL; (*Разрешение*)
bInterlock :BOOL; (*Блокировка*)
bProtect :BOOL; (*Защита*)
//--------------------------------------------------------------------
bManualControl :BOOL; (*Ручное управление*)
bRemoteControl :BOOL; (*Дистанционное управление*)
//--------------------------------------------------------------------
bValveOpenIN :BOOL; (*Задвижка открыта*)
bValveCloseIN :BOOL; (*Задвижка закрыта*)
bValveFailureIN :BOOL; (*Задвижка авария*)
//--------------------------------------------------------------------
bMonitor :BOOL; (*Активация мониторинга запуска/останова*)
tMonTimeOpen :TIME; (*Время мониторинга запуска*)
tMonTimeClose :TIME; (*Время мониторинга останова*)
bFbkOpen :BOOL; (*Cтатус запуска*)
bFbkClose :BOOL; (*Cтатус останова*)
END_VAR
VAR_OUTPUT
//--------------------------------------------------------------------
bError :BOOL; (*Неисправность общая*)
bErrorFbkOpen :BOOL; (*Неисправность запуска*)
bErrorFbkClose :BOOL; (*Неисправность останова*)
//--------------------------------------------------------------------
bValveOpenOUT :BOOL; (*Открыть задвижку*)
bValveCloseOUT :BOOL; (*Закрыть задвижку*)
bValveStopOUT :BOOL; (*Остановка*)
//--------------------------------------------------------------------
TON_MonRun_ET :TIME; (*Отсчет таймера мон-га запуска*)
TON_MonStop_ET :TIME; (*Отсчет таймера мон-га останова*)
END_VAR
VAR
//--------------------------------------------------------------------
TON_MonitorRun :TON; (*Таймер мониторинга запуска*)
TON_MonitorStop :TON; (*Таймер мониторинга останова*)
END_VAR
//------------------------------------------------------------------------------------------------------------------
IF bRemoteControl AND NOT bManualControl AND NOT bValveFailureIN THEN
bRemoteControl := TRUE;
bManualControl := FALSE;
ELSIF NOT bInterlock AND NOT bProtect AND NOT bPermit AND bValveFailureIN THEN
bRemoteControl := FALSE;
bManualControl := TRUE;
END_IF
//------------------------------------------------------------------------------------------------------------------
IF bPermit AND NOT bInterlock AND NOT bProtect AND bValveCloseIN AND NOT bValveFailureIN AND NOT bValveOpenIN THEN
bValveOpenOUT := TRUE;
bValveCloseOUT := FALSE;
END_IF
IF bPermit AND NOT bInterlock AND NOT bProtect AND NOT bValveCloseIN AND NOT bValveFailureIN AND bValveOpenIN THEN
bValveOpenOUT := FALSE;
bValveCloseOUT := TRUE;
END_IF
//------------------------------------------------------------------------------------------------------------------
TON_MonitorRun ( IN := bValveOpenIN AND bMonitor AND NOT bFbkOpen,
PT := tMonTimeOpen,
Q => bErrorFbkOpen,
ET => TON_MonRun_ET);
TON_MonitorStop ( IN := bValveCloseIN AND bMonitor AND NOT bFbkClose,
PT := tMonTimeClose,
Q => bErrorFbkClose,
ET => TON_MonStop_ET);
// Эти переменные в глобальных переменных GVL_Data
//====================================================================== Управление задвижкой Эз-1 =======================
bCmdOpen_XV1 :BOOL; (*Команда открыть*)
bCmdClose_XV1 :BOOL; (*Команда закрыть*)
bError_XV1 :BOOL; (*Неисправность общая*)
bErrorFbkRun_XV1 :BOOL; (*Неисправность запуска*)
bErrorFbkStop_XV1 :BOOL; (*Неисправность останова*)
// Gate_Valve
PROGRAM Gate_Valve
VAR
// --------------------------------------------------------------ВХОДНЫE ДИСКРЕТНЫЕ СИГНАЛЫ-------------------------------------------------------
//===================================================================================== Задвижка Эз-1 ==============
bPSI_A12_XV1MU :BOOL; (*XV1-MU Положение переключателя задвижки Эз1 - местное управление*)
bPSI_A12_XV1DU :BOOL; (*XV1-DU Положение переключателя задвижки Эз1 - дистанционное управление*)
bPSI_A12_XV11 :BOOL; (*XV1-1 Задвижка Эз1 - открыта*)
bPSI_A12_XV12 :BOOL; (*XV1-2 Задвижка Эз1 - закрыта*)
bPSI_A12_XV1Er :BOOL; (*XV1-Er Задвижка Эз1 - авария*)
bPSI_A31_Ez1Op :BOOL; (*Ez1-Op Задвижку Эз1 открыть*)
bPSI_A31_Ez1Cl :BOOL; (*Ez1-Cl Задвижку Эз1 закрыть*)
GateValve_XV1 :GateValve;
TON_MonRun_ET_XV1 :TIME; (*Отсчет таймера мон-га запуска*)
TON_MonStop_ET_XV1 :TIME; (*Отсчет таймера мон-га остан*)
END_VAR
GateValve_XV1( // INPUT FB----------------------------------------------------------------------------
bPermit := TRUE, (*Разрешение*)
bInterlock := FALSE, (*Блокировка*)
bProtect := bPSI_A12_XV1Er, (*Защита*)
bValveOpenIN := GVL_Data.bCmdOpen_XV1, (*Команда на открытие*)
bValveCloseIN := GVL_Data.bCmdClose_XV1, (*Команда на закрытие*)
bMonitor := TRUE, (*Активация мониторинга запуска/останова*)
tMonTimeOpen := T#15S, (*Время мониторинга запуска*)
tMonTimeClose := T#15S, (*Время мониторинга останова*)
bFbkOpen := bPSI_A12_XV11, (*Cтатус запуска*)
bFbkClose := NOT(bPSI_A12_XV11), (*Cтатус останова*)
// OUTPUT FB---------------------------------------------------------------------------
bError => GVL_Data.bError_XV1, (*Неисправность общая*)
bErrorFbkOpen => GVL_Data.bErrorFbkRun_XV1, (*Неисправность запуска*)
bErrorFbkClose => GVL_Data.bErrorFbkStop_XV1, (*Неисправность останова*)
bValveOpenOUT => bPSI_A31_Ez1Op, (*Открыть*)
bValveCloseOUT => bPSI_A31_Ez1Cl, (*Закрыть*)
TON_MonRun_ET => TON_MonRun_ET_XV1, (*Отсчет таймера мон-га запуска*)
TON_MonStop_ET => TON_MonStop_ET_XV1); (*Отсчет таймера мон-га останова*)