BaseSystemLib hinzugefügt

This commit is contained in:
2026-06-29 16:28:48 +02:00
parent a51a0c6fd1
commit 14a1c5172d
168 changed files with 6797 additions and 0 deletions
@@ -0,0 +1,227 @@
FUNCTION_BLOCK "FB_SetAlarmAndLog"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
stSettings : Struct // Grundsätzliche einstellungen des Bausteins
sFctnName : String[20]; // Name der Funktion die den Fehler wirft
nNoMaxErrors : UInt := 32; // Maximale Anzahl an Fehlern. Werden über "xPlcReOrg" zugewiesen.
nType : Int := 0; // 0: IntError | 1: Error | 2: Warning | 3: Information | 4: Debug
END_STRUCT;
xInAlarm : Bool; // An: Fehler liegt an. | Aus: Kein Fehler liegt an
nInAlarmPriority : USInt := 1; // Priorität des Fehlers: 1 = Höchste Prio. | 30 = Niedrigste Prio.
nInAlarmNumber : UInt; // Fehlernummer von 0 bis (stSettings.nNoMaxErrors - 1)
sInPrefix : String[20]; // Text vor der Fehlermeldung
sInAlarmMessage : String[20]; // Text der Fehlermeldung
sInSuffix : String[20]; // Text nach der Fehlermeldung
wInTextListId_Message : Word;
wInTextListId_Function : Word;
wInTextListId_Prefix : Word;
wInTextListId_Suffix : Word;
wInTextListId_Separator : Word;
END_VAR
VAR_OUTPUT
xOutRdy : Bool; // Zeigt an, ob ein neuer Fehler geschrieben werden darf
END_VAR
VAR_IN_OUT
stInOutControlUnitCabinet : "UDT_MainState";
END_VAR
VAR RETAIN
nAlarmNoOffset : UInt;
END_VAR
VAR
wStatus : Word;
xAlarmFlag : Bool;
sErrorString : String;
xSetProgramAlarm : Bool;
fbProgram_Alarm {InstructionName := 'Program_Alarm'; LibVersion := '1.0'} : Program_Alarm;
xRetryProgramAlarm : Bool;
END_VAR
VAR_TEMP
xTemp : Bool;
tStringParts : Struct
sType : String;
sNumber : String;
sFunctionName : String;
END_STRUCT;
tString : String;
tSetDataLog : Bool;
tRunProgramAlarm : Bool;
tRenewString : Bool;
tDataLogBuffer : "DataLogBuffer";
tRisingAlarm : Bool; // Kommende Meldung
tFallingAlarm : Bool; // Gehende Meldung
END_VAR
BEGIN
(*
Der Baustein gibt über den Befehl "Program_Alarm" fehler am HMI aus. Achtung, nur jeweils ein Fehler pro Monitoring-Baustein gleichzeitig.
Aufbau Fehlermeldung:
Fehler 123: Heber 2, Step 230 - Heber nicht am Sensor erkannt BG6061
"sTypeAndNumber: " "sFunctionName" "sInPrefix" "sInErrorMessage" "xInSuffix"
nType&(nErrorNumber+Offset)
*)
(* Fragen:
Todo:
- Priority-Level
*)
REGION Alarmnummer abfragen
(* IF "DB_AlarmGlobal".xAlarmReOrg THEN
#nAlarmNoOffset := "FC_GetAlarmNo_1"(#stSettings.nNoMaxErrors);
// #xPlcReOrg := FALSE; // wird wegen "Funktionsname holen" nicht benötigt
ELSIF
#nAlarmNoOffset = 0 THEN
"DB_AlarmGlobal".xAlarmReOrgNextStep := TRUE;
END_IF;
*)
#nAlarmNoOffset := "FC_GetAlarmNo"(#stSettings.nNoMaxErrors);
END_REGION
REGION Kommende und gehende Meldung erfassen
#tRisingAlarm := #xInAlarm AND NOT #xAlarmFlag;
#tFallingAlarm := NOT #xInAlarm AND #xAlarmFlag;
END_REGION
REGION Alarm und Datalog aktivieren
IF #nAlarmNoOffset > 0 THEN
// Error
CASE #stSettings.nType OF
0..1: // (0)Intern Error and (1)Error
IF #tRisingAlarm OR #xRetryProgramAlarm THEN
#tRunProgramAlarm := TRUE;
#xSetProgramAlarm := TRUE;
#tRenewString := TRUE;
#tSetDataLog := TRUE;
#xRetryProgramAlarm := FALSE;
ELSIF #tFallingAlarm OR #xRetryProgramAlarm THEN
#tRunProgramAlarm := TRUE;
#xSetProgramAlarm := FALSE;
#tRenewString := FALSE;
#tSetDataLog := FALSE;
#xRetryProgramAlarm := FALSE;
END_IF;
// #tRunProgramAlarm := (#xInAlarm <> #xAlarmFlag);//OR #stMachineState.xQuitError; //!!!!
// #tSetDataLog := #xInAlarm AND NOT #xAlarmFlag;
// #tRenewString := #xInAlarm <> #xAlarmFlag;
// #xSetProgramAlarm := #xInAlarm;
2..4: // Warning, Information, Debug
IF #xInAlarm AND NOT #xAlarmFlag THEN
#tRunProgramAlarm := TRUE;
#xSetProgramAlarm := TRUE;
#tRenewString := TRUE;
#tSetDataLog := TRUE;
ELSIF NOT #xInAlarm AND #xAlarmFlag THEN
#tRunProgramAlarm := TRUE;
#xSetProgramAlarm := FALSE;
#tRenewString := FALSE;
#tSetDataLog := FALSE;
ELSIF #stInOutControlUnitCabinet.xQuitError THEN
#tRunProgramAlarm := TRUE;
#xSetProgramAlarm := FALSE;
#tRenewString := FALSE;
#tSetDataLog := FALSE;
END_IF;
END_CASE;
END_IF;
END_REGION
REGION Fehler zu String zusammenfügen
IF #tRenewString THEN
REGION Type And Number
CASE #stSettings.nType OF
0:
#tStringParts.sType := 'Int.Fehler';
1:
#tStringParts.sType := 'Fehler';
2:
#tStringParts.sType := 'Warnung';
3:
#tStringParts.sType := 'Info';
4:
#tStringParts.sType := 'Debug';
ELSE:
#tStringParts.sType := 'WrongNType';
END_CASE;
#tStringParts.sNumber := UINT_TO_STRING(#nAlarmNoOffset + #nInAlarmNumber);
#tStringParts.sNumber[1] := ' '; // Vorzeichen entfernen
END_REGION
REGION Function Name
#tStringParts.sFunctionName := CONCAT(IN1 := ' in ', IN2 := #stSettings.sFctnName);
END_REGION
REGION Zusammenfügen
#tString := CONCAT(IN1 := #tStringParts.sType ,IN2 := #tStringParts.sNumber, IN3 := #tStringParts.sFunctionName, IN4 := ' | ', IN5 := #sInPrefix);
IF #sInPrefix <> '' THEN
#tString := CONCAT(IN1 := #tString, IN2 := ' | ');
END_IF;
#tString := CONCAT(IN1 := #tString, IN2 := #sInAlarmMessage);
IF #sInAlarmMessage <> '' THEN
#tString := CONCAT(IN1 := #tString, IN2 := ' | ');
END_IF;
#sErrorString := CONCAT(IN1 := #tString, IN2 := #sInSuffix);
END_REGION
REGION Nummer überprüfen
IF #nInAlarmNumber > #stSettings.nNoMaxErrors - 1 OR
#nInAlarmNumber < 0 THEN
#sErrorString := CONCAT(IN1 := 'Falsche Fehlernummer in Baustein: ', IN2 := #stSettings.sFctnName);
END_IF;
END_REGION
END_IF;
END_REGION
REGION ProgramAlarm Setzen
IF #tRunProgramAlarm THEN
#fbProgram_Alarm(SIG := #xSetProgramAlarm,
Status => #wStatus,
Error => #xTemp,
SD_1 := #wInTextListId_Message,
SD_2 := #sInPrefix,
SD_3 := #sInSuffix,
SD_4 := #wInTextListId_Function,
SD_5 := #wInTextListId_Separator);
END_IF;
END_REGION
REGION Datalog schreiben
// Es ist nur 1 Datalog pro Zyklus möglich. Deshalb werden Fehler in einen Fehlerbuffer (FIFO) geschrieben und abgearbeitet.
// Datalogs werden nur geschrieben wenn die Priorität hoch genug ist.
IF #tSetDataLog AND #nInAlarmPriority <= 0 THEN
#tDataLogBuffer."Time" := "FC_TimeAsString"();
#tDataLogBuffer.AlarmNr := UINT_TO_INT(#nAlarmNoOffset + #nInAlarmNumber);
#tDataLogBuffer.AlarmType := #tStringParts.sType;
#tDataLogBuffer.Error := CONCAT(IN1 := #sInPrefix, IN2 := ' ', IN3 := #sInAlarmMessage, IN4 := ' ', IN5 := #sInSuffix);
#tDataLogBuffer.Function := #stSettings.sFctnName;
// #xTemp := "FC_WriteDatalogToDB"(#tDataLogBuffer);
END_IF;
END_REGION
REGION Ausgänge setzen
#xOutRdy := NOT #xInAlarm AND NOT #xAlarmFlag AND #nAlarmNoOffset > 0;
END_REGION
REGION Flanken
#xAlarmFlag := #xInAlarm;
END_REGION
REGION Fehler in ProgramAlarm Bearbeitung
IF #xTemp AND ((#wStatus = 16#80C1) OR (#wStatus = 16#80C2) OR (#wStatus = 16#80C3) OR (#wStatus = 16#80C4)) THEN
#xRetryProgramAlarm := TRUE;
END_IF;
END_REGION
END_FUNCTION_BLOCK