REGION Plausibility Check
// Plausibilität Daten
IF #Place.OperationMode.AutomaticMode AND NOT #PlaceData.MOrder.DataPresent AND #Place.Signals.PlaceOccupied AND NOT #Place.Signals.MoveActive AND NOT #Place.Signals.MoveOnEngineAxis1Active AND NOT #Place.Signals.MoveOnEngineAxis3Active AND NOT #Place.Config.IgnoreGeneralPlausibility AND NOT "General".Simulation THEN
#StartDataPlausibilityTime := TRUE;
ELSE
#StartDataPlausibilityTime := FALSE;
END_IF;
#IEC_Timer_DataPlausibility(IN := #StartDataPlausibilityTime,
PT := #Place.Config.TimeGeneralPlausibility,
Q => #TimerDataPlausibilityError);
IF #Place.Signals.Acknowledge THEN
#DataPlausibilityError := FALSE;
END_IF;
IF #TimerDataPlausibilityError THEN
#DataPlausibilityError := TRUE;
#Place.Signals.Disturbed := TRUE;
END_IF;
REGION Program Alarm Data Plausibility
// Sammelstörung setzen
IF #DataPlausibilityError THEN
"General".TempAlarmActive := TRUE;
END_IF;
// Trigger für Alarm bilden
#signalProgramAlarm := #DataPlausibilityError OR "General".SetAllErrorMessages;
// prüfen ob Alarm ausgelöst oder quittiert werden soll
IF #signalProgramAlarm AND NOT #LastSignalProgramAlarm[1] AND NOT #TriggerAlarm[1] THEN
#TriggerAlarm[1] := TRUE;
#TimestampProgramAlarm[1] := "General".DateAndTimeUTC;
ELSIF NOT #signalProgramAlarm AND #LastSignalProgramAlarm[1] AND NOT #ResetAlarm[1] THEN
#ResetAlarm[1] := TRUE;
#TimestampProgramAlarm[1] := "General".DateAndTimeUTC;
END_IF;
// Alarm auslösen oder quittieren
IF #TriggerAlarm[1] AND "General".MessageCounter < "MESSAGES_PER_CYCLE" THEN
#Program_Alarm_DataPlausibilityError(SIG := TRUE,
TIMESTAMP := #TimestampProgramAlarm[1],
SD_1 := #Place.Config.Name);
#GetAlarmStateAfterTrigger[1] := TRUE;
"General".MessageCounter := "General".MessageCounter + 1;
ELSIF #ResetAlarm[1] AND "General".MessageCounter < "MESSAGES_PER_CYCLE" THEN
#Program_Alarm_DataPlausibilityError(SIG := FALSE,
TIMESTAMP := #TimestampProgramAlarm[1],
SD_1 := #Place.Config.Name);
#GetAlarmStateAfterReset[1] := TRUE;
"General".MessageCounter := "General".MessageCounter + 1;
END_IF;
// Status Program Alarm nach dem Auslösen prüfen
IF #GetAlarmStateAfterTrigger[1] THEN
Get_AlarmState(Alarm := #Program_Alarm_DataPlausibilityError,
AlarmState => #alarmState,
Error => #errorGetAlarmState,
STATUS => #errorStatus);
IF #TriggerAlarm[1] AND #alarmState = 16#87 THEN
#TriggerAlarm[1] := FALSE;
#GetAlarmStateAfterTrigger[1] := FALSE;
IF NOT #signalProgramAlarm THEN
#ResetAlarm[1] := TRUE;
END_IF;
END_IF;
END_IF;
// Status Program Alarm nach dem Rücksetzen prüfen
IF #GetAlarmStateAfterReset[1] THEN
Get_AlarmState(Alarm := #Program_Alarm_DataPlausibilityError,
AlarmState => #alarmState,
Error => #errorGetAlarmState,
STATUS => #errorStatus);
IF #ResetAlarm[1] AND #alarmState = 16#86 THEN
#ResetAlarm[1] := FALSE;
#GetAlarmStateAfterReset[1] := FALSE;
IF #signalProgramAlarm THEN
#TriggerAlarm[1] := TRUE;
END_IF;
END_IF;
END_IF;
// Trigger Signal für Flankenauswertung speichern
#LastSignalProgramAlarm[1] := #signalProgramAlarm;
END_REGION