= _rMaxErrorLevel), xRelease:= stAnalogIOConfig.xUsed AND xReleaseErrors AND xReleaseLimitErrors AND (NOT _xEWConfigError), xAcknowledge:= xConfirmAlarms, timOnDelay:= stAnalogEWConfig.stDelays.timErrorHighOn, timOffDelay:= stAnalogEWConfig.stDelays.timErrorHighOff, xInUnitTestMode:= xInUnitTestMode); _xErrorHigh := _fbAlarmErrorHigh.Triggered; // Latch error IF _xErrorHigh THEN _xError := TRUE; END_IF // =========================== // Error low alarm handling // =========================== _fbAlarmErrorLow( xActive:= (_rScaledValue <= _rMinErrorLevel), xRelease:= stAnalogIOConfig.xUsed AND xReleaseErrors AND xReleaseLimitErrors AND (NOT _xEWConfigError), xAcknowledge:= xConfirmAlarms, timOnDelay:= stAnalogEWConfig.stDelays.timErrorLowOn, timOffDelay:= stAnalogEWConfig.stDelays.timErrorLowOff, xInUnitTestMode:= xInUnitTestMode); _xErrorLow := _fbAlarmErrorLow.Triggered; // Latch error IF _xErrorLow THEN _xError := TRUE; END_IF // =========================== // Warning high alarm handling // =========================== _fbAlarmWarningHigh( xActive:= (_rScaledValue >= _rMaxWarningLevel), xRelease:= stAnalogIOConfig.xUsed AND xReleaseErrors AND xReleaseLimitErrors AND (NOT _xEWConfigError), xAcknowledge:= xConfirmAlarms, timOnDelay:= stAnalogEWConfig.stDelays.timWarningHighOn, timOffDelay:= stAnalogEWConfig.stDelays.timWarningHighOff, xInUnitTestMode:= xInUnitTestMode); _xWarningHigh := _fbAlarmWarningHigh.Triggered; // =========================== // Warning low alarm handling // =========================== _fbAlarmWarningLow( xActive:= (_rScaledValue <= _rMinWarningLevel), xRelease:= stAnalogIOConfig.xUsed AND xReleaseErrors AND xReleaseLimitErrors AND (NOT _xEWConfigError), xAcknowledge:= xConfirmAlarms, timOnDelay:= stAnalogEWConfig.stDelays.timWarningLowOn, timOffDelay:= stAnalogEWConfig.stDelays.timWarningLowOff, xInUnitTestMode:= xInUnitTestMode); _xWarningLow := _fbAlarmWarningLow.Triggered; // ============ // Warning flag // ============ _xWarning := _xWarningLow OR _xWarningHigh; // ================ // Reset error flag // ================ _xAlarmsActive := _fbAlarmConfigError.Active OR _fbAlarmUnderrange.Active OR _fbAlarmOverload.Active OR _fbAlarmCardError.Active OR _fbAlarmErrorHigh.Active OR _fbAlarmErrorLow.Active; _xInputErrorsActive := _fbAlarmUnderrange.Triggered OR _fbAlarmOverload.Triggered OR _fbAlarmCardError.Triggered; IF xConfirmAlarms AND _xError AND (NOT _xAlarmsActive) AND (NOT _xInputErrorsActive) AND (NOT _xConfigError) THEN _xError := FALSE; END_IF // ==================== // Handle HMI interface // ==================== HandleHMIOutput(); // Copy internal signals to outputs xWarningLow := _xWarningLow; xWarningHigh := _xWarningHigh; xWarning := _xWarning; xErrorLow := _xErrorLow; xErrorHigh := _xErrorHigh; xError := _xError; rScaledValue := _rScaledValue;]]> 0.0 THEN _rConversionFactor := _rNum/_rDenom; _rBaseOffset := stAnalogIOConfig.rPVMin - (_rConversionFactor * INT_TO_REAL(stAnalogIOConfig.iAIMin)); _iAIMax := stAnalogIOConfig.iAIMax; _iAIMin := stAnalogIOConfig.iAIMin; _xConfigError := FALSE; ELSE // Division by zero happened // Or denom was negative // Set scaling to zero _rConversionFactor := 0.0; _rBaseOffset := 0.0; _iAIMax := 0; _iAIMin := 0; _xConfigError := TRUE; END_IF]]> = stAnalogEWConfig.stLevels.rErrorMax THEN _xEWConfigError := TRUE; END_IF IF stAnalogEWConfig.stLevels.rWarningMin >= stAnalogEWConfig.stLevels.rWarningMax THEN _xEWConfigError := TRUE; END_IF // Only write error and warning levels when there was no config error IF (NOT _xEWConfigError) THEN // Recreate alarm messages with the newly set limits // if values have been changed {analysis -54} IF (_rMinErrorLevel <> stAnalogEWConfig.stLevels.rErrorMin) OR (_rMinWarningLevel <> stAnalogEWConfig.stLevels.rWarningMin) OR (_rMaxWarningLevel <> stAnalogEWConfig.stLevels.rWarningMax) OR (_rMaxErrorLevel <> stAnalogEWConfig.stLevels.rErrorMax) THEN {analysis +54} CreateAlarmLimitsMSG(); END_IF // Set new values _rMinErrorLevel := stAnalogEWConfig.stLevels.rErrorMin; _rMinWarningLevel := stAnalogEWConfig.stLevels.rWarningMin; _rMaxWarningLevel := stAnalogEWConfig.stLevels.rWarningMax; _rMaxErrorLevel := stAnalogEWConfig.stLevels.rErrorMax; END_IF ]]> '' THEN _sTempUnit := CONCAT(' ', stAnalogIOConfig.sUnit); ELSE _sTempUnit := ''; END_IF // Create message parameter strings _sTempErrorMin := CONCAT(REAL_TO_STRING(stAnalogEWConfig.stLevels.rErrorMin), _sTempUnit); _sTempWarningMin := CONCAT(REAL_TO_STRING(stAnalogEWConfig.stLevels.rWarningMin), _sTempUnit); _sTempWarningMax := CONCAT(REAL_TO_STRING(stAnalogEWConfig.stLevels.rWarningMax), _sTempUnit); _sTempErrorMax := CONCAT(REAL_TO_STRING(stAnalogEWConfig.stLevels.rErrorMax), _sTempUnit); {analysis -46} // Inser message parameters _fbAlarmErrorLow.Arguments.Clear().AddString(_sName).AddString(_sTempErrorMin); _fbAlarmWarningLow.Arguments.Clear().AddString(_sName).AddString(_sTempWarningMin); _fbAlarmWarningHigh.Arguments.Clear().AddString(_sName).AddString(_sTempWarningMax); _fbAlarmErrorHigh.Arguments.Clear().AddString(_sName).AddString(_sTempErrorMax); {analysis +46}]]>