stValveConfig.xOpenWhenInterlocksActive) THEN _xManualOpen := stValveConfig.xOpenWhenInterlocksActive; END_IF END_IF // Handle open close feedback _xIsOpen := (stValveConfig.xHasOpenFeedback AND xOpenFeedback AND (NOT xCloseFeedback)) OR ((NOT stValveConfig.xHasOpenFeedback) AND _xOpenValve); _xIsClosed := (stValveConfig.xHasClosedFeedback AND xCloseFeedback AND (NOT xOpenFeedback)) OR ((NOT stValveConfig.xHasClosedFeedback) AND (NOT _xOpenValve)); // =========================== // Valve did not open in time // =========================== _fbAlarmDidNotOpen( xActive:= _xOpenValve AND (NOT _xIsOpen), xRelease:= xReleaseErrors, xAcknowledge:= xConfirmAlarms, timOnDelay:= stValveConfig.timTimeoutOpen, timOffDelay:= T#0S, xInUnitTestMode:= xInUnitTestMode); // Latch error signal IF _fbAlarmDidNotOpen.Triggered THEN _xError := TRUE; END_IF // =========================== // Valve did not close in time // =========================== _fbAlarmDidNotClose( xActive:= (NOT _xOpenValve) AND (NOT _xIsClosed), xRelease:= xReleaseErrors, xAcknowledge:= xConfirmAlarms, timOnDelay:= stValveConfig.timTimeoutClose, timOffDelay:= T#0S, xInUnitTestMode:= xInUnitTestMode); // Latch error signal IF _fbAlarmDidNotClose.Triggered THEN _xError := TRUE; END_IF // ================ // Reset error flag // ================ _xAlarmsActive := _fbAlarmDidNotOpen.Active OR _fbAlarmDidNotClose.Active; _xInputErrorsActive := _fbAlarmDidNotOpen.Triggered OR _fbAlarmDidNotClose.Triggered; IF xConfirmAlarms AND _xError AND (NOT _xAlarmsActive) AND (NOT _xInputErrorsActive) THEN _xError := FALSE; END_IF // ================================ // Copy internal signals to outputs // ================================ xOpenValve := _xOpenValve; xCloseValve := (NOT _xOpenValve); xError := _xError; // ================== // Handle HMI outputs // ================== HandleHMIOutput();]]> 0 THEN _xProcessINTLKOk := FALSE; END_IF // Check safety interlocks // Safety interlocks will not automatically reset // They need to be reset via the xConfirmAlarms input IF ((wSafetyINTLK AND wSafetyINTLKUsed) XOR wSafetyINTLKUsed) > 0 THEN _xSafetyINTLKOk := FALSE; END_IF]]>