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,12 @@
LibraryType:
Guid: f8c50fdf-18cb-49d8-bf63-620c65163568
Comment:
de-DE: Dieser Baustein generiert einen Blinktakt mit variabler Zeit.
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Dieser Baustein generiert einen Blinktakt mit variabler Zeit.
Freigegeben für Inbetriebnahme (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FB_Blinker.scl
Hash: 7BD6hj5VYn+rKNDdupCZ7URQVKvXdDd/Ugg8DHpghIY=
LibraryMetaFileHash: E7qOimsmciFEInzFA+XMEIrhTgTKp9xNTj8qMkDXBz0=
LibraryVersion:
Guid: fa6b40b5-8048-40b8-9a10-460377c0a038
+80
View File
@@ -0,0 +1,80 @@
FUNCTION_BLOCK "FB_Blinker"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
tInPeriodicTime : Time := T#500ms; // Eingestellte Zeit, entspricht 1/2*Clock
xInActivate : Bool; // true = Dauerblinken, false = Zeit pausieren
END_VAR
VAR_OUTPUT
xOutput : Bool; // eingestellte Zeit true, eingestellte Zeit false usw.
xOutFlag : Bool; // Flanke von xOutput
END_VAR
VAR
rTrigSignal {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
xSync : Bool;
timerTON {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
END_VAR
VAR RETAIN
timerTONR {InstructionName := 'TONR_TIME'; LibVersion := '1.0'} : TONR_TIME;
END_VAR
VAR
tTONTime : Time; // Verarbeitete Zeit
END_VAR
VAR RETAIN
xTONStart : Bool; // IN-Signal für Timer
xSignal : Bool; // Merker für Ausgangszustand
END_VAR
VAR_TEMP
xReset : Bool; // Bit um im Takt den Timer zu reseten
END_VAR
BEGIN
#xSignal := #xOutput;
REGION Cycle
IF #tInPeriodicTime = T#0s THEN
#tTONTime := T#500ms;//Defaultwert
ELSE
#tTONTime := #tInPeriodicTime;//Zeit durch Eingabe
END_IF;
IF #timerTONR.Q THEN //wenn Timer abgelaufen.....
IF #xSignal THEN //aktueller Zustand wird gewechselt
#xSignal := 0;
ELSE //aktueller Zustand wird gewechselt
#xSignal := 1;
END_IF;
#xTONStart := 0; //...dann nimm Eingangssignal weg...
#xReset := TRUE; //...und rücksetze Timer
ELSE
#xTONStart := 1;
END_IF;
IF #xSync (*OR (#TimerTONTime <> #TimerTON.PT) *) THEN
#xSync := 0;
#xTONStart := 0;
#xSignal := 0;
END_IF;
END_REGION
#rTrigSignal(CLK:=#xSignal);
REGION Outputs
#xOutput := #xSignal;
#xOutFlag := #rTrigSignal.Q;
END_REGION
REGION Timer
// #TimerTON(IN := #xTimerTONStart,
// PT := #TimerTONTime);
#timerTONR(IN:=NOT #xReset AND #xTONStart AND #xInActivate,
R:=#xReset,
PT:=#tTONTime);
END_REGION
END_FUNCTION_BLOCK
@@ -0,0 +1,12 @@
LibraryType:
Guid: 13212dbb-fcc6-4125-b5ed-06ae06c3e32a
Comment:
de-DE: Letzte Zykluszeit ermitteln ("First Scan" muss aktiviert sein)
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Letzte Zykluszeit ermitteln ("First Scan" muss aktiviert sein)
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FB_CycleTime.scl
Hash: 2Z6NJMSKGY05RyA+gla5h62TX6LIB5u3QhWELu+SPK4=
LibraryMetaFileHash: SFLc5/VUD4IaggRRMBqedlgDMtDuKtPjaRskpHX46E8=
LibraryVersion:
Guid: 25d2e38e-f4fc-4204-8d07-336d2fe1fa8c
@@ -0,0 +1,34 @@
FUNCTION_BLOCK "FB_CycleTime"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_OUTPUT
CycleTime : DInt;
END_VAR
VAR
TimeOld : DInt;
TimeNew : DInt;
END_VAR
BEGIN
//letzte Zykluszeit ermitteln
IF "FirstScan" THEN
//first Cycle
//no Cycletime
#TimeNew := TIME_TCK();
#CycleTime := 0;
#TimeOld := TIME_TCK();
ELSE
#TimeNew := TIME_TCK();
IF #TimeNew < #TimeOld THEN
//Systemzeit übergelaufen
#CycleTime := 2147483647 - #TimeOld + #TimeNew;
ELSE
#CycleTime := #TimeNew - #TimeOld;
END_IF;
#TimeOld := #TimeNew;
END_IF;
END_FUNCTION_BLOCK
@@ -0,0 +1,14 @@
LibraryType:
Guid: bc5be256-7a5d-4ae4-aac8-c04ee556905a
Comment:
de-DE: |-
Liest lokale Systemzeit und gibt als String aus
Format: '21-05-12'
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Liest lokale Systemzeit und gibt als String aus
Format: '21-05-12'
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FC_DateAsString.scl
Hash: sxW9MGlJNzQwHlUucUIrXWLqFFj9XVJTFDBvIpZg2Qs=
LibraryMetaFileHash: 6Yo0WP5KqjVpHhTLfUTFC+re32KTNH1ye9pj7xdoYqc=
LibraryVersion:
Guid: 34059056-04c6-4b56-b5a2-abd5a842540e
@@ -0,0 +1,38 @@
FUNCTION "FC_DateAsString" : String
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_TEMP
tInt : Int;
tDTL {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
sTmp : String[5];
END_VAR
BEGIN
// Format: '21-05-12'
#tInt := RD_LOC_T(#tDTL);
#sTmp := UINT_TO_STRING(#tDTL.YEAR);
#FC_DateAsString[1] := #sTmp[4];
#FC_DateAsString[2] := #sTmp[5];
#FC_DateAsString[3] := '-';
#sTmp := USINT_TO_STRING(#tDTL.MONTH);
IF #tDTL.MONTH <= 9 THEN
#FC_DateAsString[4] := '0';
#FC_DateAsString[5] := #sTmp[2];
ELSE
#FC_DateAsString[4] := #sTmp[2];
#FC_DateAsString[5] := #sTmp[3];
END_IF;
#FC_DateAsString[6] := '-';
#sTmp := USINT_TO_STRING(#tDTL.DAY);
IF #tDTL.DAY <= 9 THEN
#FC_DateAsString[7] := '0';
#FC_DateAsString[8] := #sTmp[2];
ELSE
#FC_DateAsString[7] := #sTmp[2];
#FC_DateAsString[8] := #sTmp[3];
END_IF;
END_FUNCTION
@@ -0,0 +1,6 @@
LibraryType:
Guid: 75fdb852-33f8-4860-bfe0-74c853d48987
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FC_RemoveStringPart.scl
Hash: M/GpwHJPz23hLSM9fCEJmNAQWH5VNKnkCvRvibwFVuI=
LibraryMetaFileHash: YxePwWkwi+6JBpfN1P+bJ2t85wqoDQfUarH23N+mI1o=
LibraryVersion:
Guid: c0a01750-6a1f-47ba-b034-8732c973f038
@@ -0,0 +1,27 @@
FUNCTION "FC_RemoveStringPart" : String
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
sSource : String;
sRemove : String;
END_VAR
VAR_TEMP
nLen : Int;
nPos : Int;
END_VAR
BEGIN
#nLen := LEN(#sRemove);
#nPos := FIND(IN1:=#sSource, IN2:=#sRemove);
IF #nPos > 0 THEN
#FC_RemoveStringPart := DELETE(IN := #sSource,
L := #nLen,
P := #nPos);
ELSE
#FC_RemoveStringPart := #sSource;
END_IF;
END_FUNCTION
@@ -0,0 +1,10 @@
LibraryType:
Guid: 934482b5-e58d-48b7-95c0-95843c18790d
Comment:
de-DE: Liest Systemzeit und gibt Uhrzeit als String aus
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Liest Systemzeit und gibt Uhrzeit als String aus
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FC_TimeAsString.scl
Hash: 3WJUl9RFht2vorDlH8QAIOs7AhSUh8JVzkcdrRKQwZo=
LibraryMetaFileHash: rKdgHvTDa65A90nGw/BUqSQ1XoRp0ZITlOxvdtrZTnQ=
LibraryVersion:
Guid: 4a99e138-618d-44bb-915f-75873870e021
@@ -0,0 +1,83 @@
FUNCTION "FC_TimeAsString" : String
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_TEMP
tInt : DInt;
tDTL {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
sTmp : String[10];
END_VAR
BEGIN
#tInt := RD_LOC_T(#tDTL);
#sTmp := UINT_TO_STRING(#tDTL.HOUR);
IF #tDTL.HOUR < 10 THEN
#FC_TimeAsString[1] := '0';
#FC_TimeAsString[2] := #sTmp[2];
ELSE
#FC_TimeAsString[1] := #sTmp[2];
#FC_TimeAsString[2] := #sTmp[3];
END_IF;
#FC_TimeAsString[3] := ':';
#sTmp := USINT_TO_STRING(#tDTL.MINUTE);
IF #tDTL.MINUTE < 10 THEN
#FC_TimeAsString[4] := '0';
#FC_TimeAsString[5] := #sTmp[2];
ELSE
#FC_TimeAsString[4] := #sTmp[2];
#FC_TimeAsString[5] := #sTmp[3];
END_IF;
#FC_TimeAsString[6] := ':';
#sTmp := USINT_TO_STRING(#tDTL.SECOND);
IF #tDTL.SECOND < 10 THEN
#FC_TimeAsString[7] := '0';
#FC_TimeAsString[8] := #sTmp[2];
ELSE
#FC_TimeAsString[7] := #sTmp[2];
#FC_TimeAsString[8] := #sTmp[3];
END_IF;
#FC_TimeAsString[9] := ',';
#sTmp := UDINT_TO_STRING(#tDTL.NANOSECOND);
IF #tDTL.NANOSECOND < 1000000 THEN
#FC_TimeAsString[10] := '0';
#FC_TimeAsString[11] := '0';
#FC_TimeAsString[12] := '0';
ELSIF #tDTL.NANOSECOND < 10000000 THEN
#FC_TimeAsString[10] := '0';
#FC_TimeAsString[11] := '0';
#FC_TimeAsString[12] := #sTmp[2];
ELSIF #tDTL.NANOSECOND < 100000000 THEN
#FC_TimeAsString[10] := '0';
#FC_TimeAsString[11] := #sTmp[2];
#FC_TimeAsString[12] := #sTmp[3];
ELSE
#FC_TimeAsString[10] := #sTmp[2];
#FC_TimeAsString[11] := #sTmp[3];
#FC_TimeAsString[12] := #sTmp[4];
END_IF;
END_FUNCTION
@@ -0,0 +1,11 @@
LibraryType:
Guid: 909777d2-e8ca-420e-b3b9-f6ae53af035b
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Funktioniert zusammen mit LGF_FIFO
Ein Element zu einem FIFO Buffer hinzufügen
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FC_FIFO_Append.scl
Hash: T7Pj2Z8cyXap1q9uur4i3m1xqyz5pPRz/2hkOB/5RlQ=
LibraryMetaFileHash: NABXVWmEloQAw/4Sn10m6TubIWUxHKkGYjsFdv1x47I=
LibraryVersion:
Guid: b605d468-bdd6-47e4-b7f5-c931cf8b16ae
DependsOn:
- TypeName: LGF_FIFO
VersionNumber: 4.0.0
@@ -0,0 +1,38 @@
FUNCTION "FC_FIFO_Append" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
DataIn : Variant; // Der Wert der eingereiht werden soll
InitialItem : Variant; // Initialwert für Elemente im FIFO
MaxNo : UInt; // Maximale Anzahl an Elementen im FIFO-Buffer
END_VAR
VAR_OUTPUT
Success : Bool; // Einreihen erfolgreich
END_VAR
VAR_IN_OUT
fifoBuffer : "LGF_FIFO";
buffer : Variant; // Der FIFO-Buffer
END_VAR
VAR_TEMP
DataOut : Bool; // Platzhalter
END_VAR
BEGIN
#fifoBuffer(enqueue:= TRUE,
dequeue := FALSE,
initialItem:= #InitialItem,
itemIn:= #DataIn,
maxElementCount := #MaxNo,
buffer:= #buffer,
itemOut:=#DataOut);
IF #fifoBuffer.enqueueDone THEN
#Success := TRUE;
END_IF;
END_FUNCTION
@@ -0,0 +1,8 @@
LibraryType:
Guid: b6f005ff-2e28-4973-a770-caf1f845319a
LibraryVersion:
VersionNumber: 2.0.2
Author: e.yueksel
IsDefault: true
Comment:
de-DE: "Funktioniert mit Baustein LGF_FIFO\r\nDas aktuelle Element aus einem FIFO Buffer herausholen\r\nFreigegeben für IBN (EY, 22.04.2025) "
@@ -0,0 +1,11 @@
DocumentHash:
- FileName: FC_FIFO_GetFirst.scl
Hash: mJ29Kj+4BQYei3JO8PAOd0BmtSJ4E3eBFI9vfBpNeys=
LibraryMetaFileHash: IvtmcsHWKWxUkbuSinagzaRgz2Pd4cWgwdCq1p4ZLVs=
LibraryVersion:
Guid: 5f307c66-66a2-4362-98ee-51660aada83e
DependsOn:
- TypeName: LGF_FIFO
VersionNumber: 4.0.0
- TypeName: UDT_TelegramData_Send
VersionNumber: 0.0.7
@@ -0,0 +1,38 @@
FUNCTION "FC_FIFO_GetFirst" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xInInitialItem : Variant; // Initialwert für Elemente im FIFO
nInMaxNo : UInt; // Maximale Anzahl an Elementen im FIFO-Buffer
END_VAR
VAR_OUTPUT
xOutSuccess : Bool; // Einreihen erfolgreich
xOutData : Variant;
END_VAR
VAR_IN_OUT
fifoBuffer : "LGF_FIFO";
buffer : Variant; // Der FIFO-Buffer
END_VAR
VAR_TEMP
xInData : "UDT_TelegramData_Send"; // Platzhalter
END_VAR
BEGIN
#fifoBuffer(enqueue:= FALSE,
dequeue := TRUE,
initialItem:= #xInInitialItem,
itemIn:= #xInData,
maxElementCount := #nInMaxNo,
buffer:= #buffer,
itemOut:=#xOutData);
IF #fifoBuffer.dequeueDone THEN
#xOutSuccess := TRUE;
END_IF;
END_FUNCTION
@@ -0,0 +1,6 @@
LibraryType:
Guid: 0f749c18-e0f3-4bcc-957e-a77803394a52
LibraryVersion:
VersionNumber: 0.0.2
Author: e.yueksel
IsDefault: true
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FC_FIFO_GetFirst_Test.scl
Hash: 6+VnqYpzQbXy+UJkXPRSzMiXh3gVIEuHAnvTtWoM/EE=
LibraryMetaFileHash: m20Dmlf+lR6z9vRxLkOCaBr5vzDmdclwD9awOuJumrs=
LibraryVersion:
Guid: 880f12fd-0740-47ac-a348-dc57dfcfb243
DependsOn:
- TypeName: LGF_FIFO
VersionNumber: 4.0.0
@@ -0,0 +1,38 @@
FUNCTION "FC_FIFO_GetFirst_Test" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xInInitialItem : Variant; // Initialwert für Elemente im FIFO
nInMaxNo : UInt; // Maximale Anzahl an Elementen im FIFO-Buffer
END_VAR
VAR_OUTPUT
xOutSuccess : Bool; // Einreihen erfolgreich
xOutData : Variant;
END_VAR
VAR_IN_OUT
fifoBuffer : "LGF_FIFO";
buffer : Variant; // Der FIFO-Buffer
END_VAR
VAR_TEMP
xInData : USInt; // Platzhalter
END_VAR
BEGIN
#fifoBuffer(enqueue:= FALSE,
dequeue := TRUE,
initialItem:= #xInInitialItem,
itemIn:= #xInData,
maxElementCount := #nInMaxNo,
buffer:= #buffer,
itemOut:=#xOutData);
IF #fifoBuffer.dequeueDone THEN
#xOutSuccess := TRUE;
END_IF;
END_FUNCTION
@@ -0,0 +1,8 @@
LibraryType:
Guid: 165134c6-89ff-4736-8f52-770c0346080b
LibraryVersion:
VersionNumber: 4.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: "Das ist eine modifizierte Version des LGF_FIFO aus der Siemens-Library. \r\nÄnderungen:\r\n- Schnittstelle: \r\n - InOut: itemIn und itemOut, statt item.\r\n - isFull hinzugefügt\r\n - maxElementCount hinzugefügt\r\n - enqueueDone und dequeueDone hinzugefügt\r\n\r\nCode angepasst\r\n\r\n3.0.3 + 3.0.5 \r\n- Flankenmerker für enqueue und dequeue wird manuell zurückgesetzt\r\n\r\n4.0.0: Freigabe IBN (EY, 22.04.2025) "
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: LGF_FIFO.scl
Hash: BIfbhj29jufO1l1arCSCphOQSLppKO8CJWeKftAqSGc=
LibraryMetaFileHash: YbN2PYZ8AkYvSAAoX7IlQQcHgXBeUPYkgUs0xiYeHLY=
LibraryVersion:
Guid: bae66bce-23a3-475d-93bf-65bd96466183
@@ -0,0 +1,389 @@
FUNCTION_BLOCK "LGF_FIFO"
TITLE = LGF_FIFO
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : Siemens_Industry_Support
FAMILY : LGF
NAME : LGF_FIFO
//FIFO (First-In First-Out / Queue / Ringspeicher)
//Diese Funktion speichert eingehende Daten und gibt die ältesten noch nicht abgearbeiteten Daten aus.
//
VAR_INPUT
enqueue : Bool := false; // Element einreihen in den Puffer (Enqueue)
dequeue : Bool := false; // Element aus dem Puffer löschen und an `item` zurückgeben (Dequeue)
reset : Bool; // Puffer initialisieren (Index und Zähler zurücksetzen)
clear : Bool; // Puffer leeren und mit Anfangswert `initialItem` initialisieren (Index und Zähler zurücksetzen).
initialItem : Variant; // Wert mit dem das Array des Puffer initialisiert wird (meistens: `0` / default wert)
maxElementCount : UInt; // Maximale Anzahl an Elementen im FIFO
END_VAR
VAR_OUTPUT
error { ExternalWritable := 'False'} : Bool; // FALSE: Kein Fehler TRUE: Während der Ausführung des FB ist ein Fehler aufgetreten
status { ExternalWritable := 'False'} : Word; // 16#0000-16#7FFF: Status des FB 16#8000-16#FFFF: Fehleridentifikation (siehe folgende Tabelle)
subFunctionStatus { ExternalWritable := 'False'} : Word; // Status oder Rückgabewert von aufgerufenen FB's / FC's und Systemfunktionen
END_VAR
VAR_OUTPUT RETAIN
elementCount { ExternalWritable := 'False'} : USInt := 0; // Anzahl der Elemente im Puffer
isEmpty { ExternalWritable := 'False'} : Bool := TRUE; // TRUE: Puffer ist leer
isFull : Bool;
END_VAR
VAR_OUTPUT
oldestElement : Int;
enqueueDone : Bool;
dequeueDone : Bool;
END_VAR
VAR_IN_OUT
itemIn : Variant; // Eintrag der aus dem Puffer zurückgegeben wird oder in den Puffer geschrieben werden soll
buffer : Variant; // Das ARRAY welches als Puffer genutzt wird. (Array of … )
itemOut : Variant;
END_VAR
VAR RETAIN
statEdgesMem { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Flanken speicher zum speichern des vorherigen Zustands und Flankendetektion
enqueue { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // enqueue Flanke
dequeue { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // dequeue Flanke
clear { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // clearing Flanke
END_STRUCT;
statFirstItemIndex { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := -1; // Index des ältesten Eintrags im Puffer
statNextEmptyItemIndex { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 0; // Index für den nächsten freien Platz im Puffer
statElementCount { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der Elemente im Puffer
END_VAR
VAR_TEMP
tempEdges : Struct // Flanken speicher zum speichern der Flanken
enqueue : Bool; // enqueue Flanke
dequeue : Bool; // dequeue Flanke
clear : Bool; // clearing Flanke
END_STRUCT;
tempInternalError : Int; // Fehler Information für interne Funktionsaufrufe und Rückgabewerte
tempNewFirstItemIndex : Int; // Variable Index
tempNewNextEmptyItemIndex : Int; // Variable Index
tempBufferSize : UDInt; // Anzahl der Elemente im Puffer Array / Puffer Größe
tempCounter : Int; // Zählvariable für die Iteration durch den Puffer
END_VAR
VAR CONSTANT
BUFFER_IS_EMPTY : Int := -1; // Puffer ist leer
NO_INTERNAL_ERROR : Int := 0; // Kein interner Fehler
BUFFER_INITIALIZED : Int := -1; // Puffer initialisieren
EMPTY_INITIALIZED : Int := 0; // Leeres Element Index = 0
INDEX_BEGINNING : Int := 0; // Startwert für die Indizierung des Arrays
COUNT_ELEMENTS : UDInt := 1; // Anzahl der zu kopierenden Elemente = 1
INCREMENT : Int := 1; // Inkrement Wert EINS
BUFFER_SIZE_CORRECTION : UDInt := 1; // Puffer Größen Korrekturfaktor (0-basierte Zählung)
COUNTER_LOWER_LIMIT : Int := 0; // Zähler untere Grenze
ZERO_ELEMENTS : DInt := 0; // Keine Elemente vorhanden
STATUS_NO_ERROR : Word := 16#0000; // Status: Abarbeitung ohne Fehler beendet
STATUS_NO_CURRENT_JOBS : Word := 16#7000; // Status: Keine aktuellen Aufträge, Initial State
ERR_BUFFER_EMPTY : Word := 16#8001; // Fehler: Der Puffer ist leer
ERR_BUFFER_FULL : Word := 16#8002; // Fehler: Der Puffer ist voll
ERR_NO_ARRAY : Word := 16#8200; // Fehler: Am Eingang `buffer` liegt kein Array an.
ERR_WRONG_TYPE_ITEM : Word := 16#8201; // Fehler: Der Datentyp des InOut-Parameters `item` entspricht nicht dem Datentyp der Array-Elemente von dem Eingang `buffer`.
ERR_WRONG_TYPE_INITIAL_ITEM : Word := 16#8202; // Fehler: Der Datentyp des Eingangs `initialItem` entspricht nicht dem Datentyp des InOut-Parameters `item`.
ERR_INDEX_IN_ARRAY_LIMITS_1 : Word := 16#8601; // Fehler: Die Variable `statNextEmptyItemIndex` liegt ausserhalb der Array Grenzen
ERR_INDEX_IN_ARRAY_LIMITS_2 : Word := 16#8602; // Fehler: Die Variable `statFirstItemIndex` liegt ausserhalb der Array Grenzen
ERR_CLEAR_BUFFER : Word := 16#8610; // Fehler: Während des Ablöschen des Puffer in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus`
ERR_RETURN_FIRST_ENTRY : Word := 16#8611; // Fehler: Während der Rückgabe des ersten Elements aus dem Puffer in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus`
ERR_REPLACE_ITEM_BY_INIT_VALUE : Word := 16#8612; // Fehler: Während des Überschreibens des Elements mit dem Initialwort in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus
ERR_WRITE_ENTRY : Word := 16#8613; // Fehler: Während des Schreibens eines Elements in den Puffer in Funktion `MOVE_BLK_VARIANT` - weitere Infos in `subFunctionStatus`
END_VAR
BEGIN
REGION Block info header
//===============================================================================
// SIEMENS AG / (c)Copyright 2019
//-------------------------------------------------------------------------------
// Title: LGF_FIFO
// Comment/Function: FIFO (First In First Out)
// Queue / ring buffer memory
// Library/Family: LGF (Library General Functions)
// Author: Siemens Digital Industry Support
// Tested with: CPU 1515F-2 PN FW:V2.6
// Engineering: TIA Portal V15.1 Update 2
// Restrictions: ENO disabled - error handling done with error and status
// Requirements: PLC (S7-1200 / S7-1500)
//-------------------------------------------------------------------------------
// Change log table:
// Version | Date | Expert in charge | Changes applied
//----------|------------|------------------------|------------------------------
// 01.00.00 19.08.2015 Siemens Industry Online Support
// First released version
// 01.00.01 16.11.2015 Siemens Industry Online Support
// Bug fix resetBuffer
// 01.00.02 02.01.2017 Siemens Industry Online Support
// Upgrade: TIA Portal V14 Update 1
// 01.00.03 17.08.2018 Siemens Industry Online Support
// Upgrade: TIA V15 Update 2
// 01.00.04 23.11.2018 Siemens Industry Online Support
// Upgrade: TIA V15.1
// 02.00.00 29.01.2019 Siemens Industry Online Support
// Output "done" removed (not necessary, because block works synchronous)
// 03.00.00 22.10.2019 Simatic Systems Support
// Code refactoring, comments added
// Interface change (enqueue, dequeue etc.)
// Set version to V3.0.0, harmonize the version of the whole library
// 03.00.01 15.02.2021 Simatic Systems Support
// Insert documentation
//=============================================================================
END_REGION Block info header
REGION DESCRIPTION
(/*
Hinweis
: In `subFunctionStatus` wird der Status von aufgerufenen Anweisungen ausgegeben. Der Ausgangswert in `status` gibt in diesem Fall an, welche Anweisung den Fehler verursacht hat. Holen Sie sich in diesem Fall die Informationen aus der TIA Portal Online Hilfe zu den jeweiligen Anweisungen.
---
Hinweis
: Die Warteschlange (Queue) in der Informatik beruht ebenfalls auf dem FIFO-Prinzip.
---
Mit dem Eingang `enqueue` wird ein neues Element vom InOut-Parameter `item` an der nächsten freien Stelle im Puffer gespeichert. Der Ausgang `elementCount` wird um eins inkrementiert.
Mit dem Eingang `dequeue` ausgegeben und dieses Feld im Puffer durch den Wert am Parameter `initialItem` ersetzt. Der Ausgang `elementCount` wird um eins dekrementiert.
Mit dem Eingang `reset` wird der Puffer initialisiert, Index und Zähler werden zurückgesetzt. Der Ausgang `elementCount` wird auf null und der Ausgang `isEmpty` wird auf TRUE gesetzt.
Mit dem Eingang `clear` wird der Puffer geleert und mit Anfangswert `initialItem` initialisiert. Index und Zähler werden zurückgesetzt. Der Ausgang `elementCount` wird auf null, der Ausgang `isEmpty` auf TRUE gesetzt.
*/)
END_REGION DESCRIPTION
REGION Block execution control
#enqueueDone := FALSE;
#dequeueDone := FALSE;
// collect edges
#tempEdges.dequeue := #dequeue AND NOT #statEdgesMem.dequeue;
#tempEdges.clear := #clear AND NOT #statEdgesMem.clear;
// store values for edge detection
IF NOT #dequeue THEN
#tempEdges.enqueue := #enqueue AND NOT #statEdgesMem.enqueue;
#statEdgesMem.enqueue := #enqueue;
END_IF;
#statEdgesMem.dequeue := #dequeue;
#statEdgesMem.clear := #clear;
// This program code section is only executed if no trigger input is active
IF NOT (#enqueue OR #dequeue OR #reset OR #clear) THEN
// If an error occurred during program execution,
// the status "No Current Job" is used 16#7000 afterwarts when the triggers are reseted
#error := false;
#status := #STATUS_NO_CURRENT_JOBS;
#subFunctionStatus := #STATUS_NO_ERROR;
// the program processing OF the FB is terminated
RETURN;
END_IF;
END_REGION
REGION Validation of inputs
// check whether the ring #buffer is an ARRAY.
// IF so, the number OF the ARRAY elements is read out.
// IF it is NOT an ARRAY, the program execution is terminated at this point
IF IS_ARRAY(#buffer) THEN
#tempBufferSize := CountOfElements(#buffer);
ELSE
#error := true;
#status := #ERR_NO_ARRAY;
#subFunctionStatus := #STATUS_NO_ERROR;
RETURN;
END_IF;
// check whether the data type OF the ARRAY elements matches
// the data type OF the entry (#item). IF the data types DO NOT match,
// the program execution is terminated at this point
IF (TypeOf(#itemIn) <> TypeOfElements(#buffer)) THEN
#error := true;
#status := #ERR_WRONG_TYPE_ITEM;
#subFunctionStatus := #STATUS_NO_ERROR;
RETURN;
END_IF;
// check whether the initial value OF the ring #buffer
// matches the entry (tag #item). IF the data types DO NOT match,
// the program execution is terminated at this point
IF (TypeOf(#itemIn) <> TypeOf(#initialItem)) THEN
#error := true;
#status := #ERR_WRONG_TYPE_INITIAL_ITEM;
#subFunctionStatus := #STATUS_NO_ERROR;
RETURN;
END_IF;
// check whether the variable indices are within the ARRAY limits.
// IF they are NOT, the program execution is terminated at this point
IF (#statNextEmptyItemIndex >= #tempBufferSize) THEN
#error := true;
#status := #ERR_INDEX_IN_ARRAY_LIMITS_1;
#subFunctionStatus := #STATUS_NO_ERROR;
RETURN;
ELSIF (#statFirstItemIndex >= #tempBufferSize) THEN
#error := true;
#status := #ERR_INDEX_IN_ARRAY_LIMITS_2;
#subFunctionStatus := #STATUS_NO_ERROR;
RETURN;
END_IF;
// If resetBuffer is "TRUE", the buffer counters are reset
IF #reset THEN
#statFirstItemIndex := #BUFFER_INITIALIZED;
#statNextEmptyItemIndex := #EMPTY_INITIALIZED;
#statElementCount := #EMPTY_INITIALIZED;
#elementCount := INT_TO_USINT(#EMPTY_INITIALIZED);
#isEmpty := true;
RETURN;
END_IF;
// If clearBuffer has rising edge, the buffer is initialized by initial values
IF #tempEdges.clear THEN
FOR #tempCounter := #COUNTER_LOWER_LIMIT TO UDINT_TO_INT(#tempBufferSize - #BUFFER_SIZE_CORRECTION) DO
#tempInternalError := MOVE_BLK_VARIANT(SRC := #initialItem,
COUNT := #COUNT_ELEMENTS,
SRC_INDEX := #INDEX_BEGINNING,
DEST_INDEX := #tempCounter,
DEST => #buffer);
END_FOR;
// checks whether a local error has occurred.
IF (#tempInternalError <> #NO_INTERNAL_ERROR) THEN
#error := true;
#status := #ERR_CLEAR_BUFFER;
#subFunctionStatus := INT_TO_WORD(#tempInternalError);
END_IF;
// reset counters
#statFirstItemIndex := #BUFFER_INITIALIZED;
#statNextEmptyItemIndex := #EMPTY_INITIALIZED;
#statElementCount := #EMPTY_INITIALIZED;
#elementCount := INT_TO_USINT(#EMPTY_INITIALIZED);
#isEmpty := true;
RETURN;
END_IF;
END_REGION
REGION FIFO algorithm
IF #tempEdges.dequeue THEN
REGION dequeue
// check whether the ring #buffer is empty
// IF this is the CASE, program execution is terminated at this point
IF (#statFirstItemIndex = #BUFFER_IS_EMPTY) THEN
#error := true;
#status := #ERR_BUFFER_EMPTY;
#subFunctionStatus := #STATUS_NO_ERROR;
RETURN;
END_IF;
// return the first entry of the ring buffer
#tempInternalError := MOVE_BLK_VARIANT(SRC := #buffer,
COUNT := #COUNT_ELEMENTS,
SRC_INDEX := #statFirstItemIndex,
DEST_INDEX := #INDEX_BEGINNING,
DEST => #itemOut);
// check whether a local error has occurred
IF (#tempInternalError <> #NO_INTERNAL_ERROR) THEN
#error := true;
#status := #ERR_RETURN_FIRST_ENTRY;
#subFunctionStatus := INT_TO_WORD(#tempInternalError);
RETURN;
END_IF;
// check whether the ring #buffer contains ARRAY elements
// IF it does, the first entry is passed further on and the index is incremented BY 1
#tempInternalError := MOVE_BLK_VARIANT(SRC := #initialItem,
COUNT := #COUNT_ELEMENTS,
SRC_INDEX := #INDEX_BEGINNING,
DEST_INDEX := #statFirstItemIndex,
DEST => #buffer);
// check whether a local error has occurred
IF (#tempInternalError <> #NO_INTERNAL_ERROR) THEN
#error := true;
#status := #ERR_REPLACE_ITEM_BY_INIT_VALUE;
#subFunctionStatus := INT_TO_WORD(#tempInternalError);
RETURN;
END_IF;
// calculate the new index of the first entry
#tempNewFirstItemIndex := #statFirstItemIndex + #INCREMENT;
#tempNewFirstItemIndex := #tempNewFirstItemIndex MOD UDINT_TO_INT(#tempBufferSize);
// check whether the ring buffer is empty
IF (#statNextEmptyItemIndex = #tempNewFirstItemIndex) THEN
// If the ring buffer is empty, the index is set to 0
#statFirstItemIndex := #BUFFER_INITIALIZED;
#statNextEmptyItemIndex := #EMPTY_INITIALIZED;
ELSE
// The index of the first entry is changed
#statFirstItemIndex := #tempNewFirstItemIndex;
END_IF;
// Evaluation of the number of elements in the stack
#statElementCount -= #INCREMENT;
#dequeueDone := TRUE; // !!!!!!!!!!!
#statEdgesMem.dequeue := FALSE;
END_REGION dequeue
ELSIF #tempEdges.enqueue THEN
REGION enqueue
// check whether the ring #buffer is full
// IF this is the CASE, program execution is terminated at this point
IF (#statNextEmptyItemIndex = #statFirstItemIndex) THEN
#error := true;
#status := #ERR_BUFFER_FULL;
#subFunctionStatus := #STATUS_NO_ERROR;
RETURN;
END_IF;
// write the entry to the ring buffer
#tempInternalError := MOVE_BLK_VARIANT(SRC := #itemIn,
COUNT := #COUNT_ELEMENTS,
SRC_INDEX := #INDEX_BEGINNING,
DEST_INDEX := #statNextEmptyItemIndex,
DEST => #buffer);
// check whether a local error has occurred
IF (#tempInternalError <> #NO_INTERNAL_ERROR) THEN
#error := true;
#status := #ERR_WRITE_ENTRY;
#subFunctionStatus := INT_TO_WORD(#tempInternalError);
RETURN;
END_IF;
// increment the index by 1 and calculates the new empty entry index
#tempNewNextEmptyItemIndex := (#statNextEmptyItemIndex + #INCREMENT) MOD UDINT_TO_INT(#tempBufferSize);
#statNextEmptyItemIndex := #tempNewNextEmptyItemIndex;
// check which index the "#firstItemIndex" tag has
// IF the number = -1, the ring buffer is initialized
// AND the entry is written TO the ring #buffer
// Therefore, "0" must be assigned TO the tag
IF (#statFirstItemIndex = #BUFFER_INITIALIZED) THEN
#statFirstItemIndex := #INDEX_BEGINNING;
END_IF;
// Evaluation of the number of elements in the stack
#statElementCount += #INCREMENT;
#enqueueDone := TRUE;
#statEdgesMem.enqueue := FALSE;
END_REGION enqueue
END_IF;
END_REGION
REGION Writing to outputs
#oldestElement := #statFirstItemIndex; // HINZUGEFÜGT!!!
#elementCount := DINT_TO_USINT(#statElementCount);
#isEmpty := #statElementCount <= #ZERO_ELEMENTS;
#isFull := #statElementCount >= #maxElementCount;
#error := false;
#status := #STATUS_NO_ERROR;
#subFunctionStatus := #STATUS_NO_ERROR;
// no error handling by ENO needed
ENO := TRUE;
END_REGION
END_FUNCTION_BLOCK
@@ -0,0 +1,10 @@
LibraryType:
Guid: 6c4bda0f-d233-468b-bd07-c2cb4b4a20ba
Comment:
de-DE: Betriebsstundenzähler
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Runtime monitoring
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FB_RTM.scl
Hash: ymZJIjIGGyLS2y0mLBHHE3+IcE1xLGWueL/FYcOvYDQ=
LibraryMetaFileHash: 31HNXsPryxvRfGOs/6Ktg3CxEscSNN46DFHpoT9qcWw=
LibraryVersion:
Guid: 752adfe9-6576-4cf0-831e-d62dd93f5f27
DependsOn:
- TypeName: UDT_RTM
VersionNumber: 2.0.0
@@ -0,0 +1,105 @@
FUNCTION_BLOCK "FB_RTM"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xEnable : Bool;
xClock : Bool;
END_VAR
VAR_IN_OUT
stRTM : "UDT_RTM";
END_VAR
BEGIN
REGION Betriebsstundenzähler / RTM
IF #xEnable THEN
REGION Total-Counter
#stRTM.stTotalCounter.nSecond := #stRTM.stTotalCounter.nSecond + BOOL_TO_INT(#xClock);
#stRTM.stTotalCounter.nMinute := #stRTM.stTotalCounter.nMinute + BOOL_TO_INT(#stRTM.stTotalCounter.nSecond >= 60);
#stRTM.stTotalCounter.nHour := #stRTM.stTotalCounter.nHour + BOOL_TO_DINT(#stRTM.stTotalCounter.nMinute >= 60);
#stRTM.stTotalCounter.nSecond := #stRTM.stTotalCounter.nSecond MOD 60;
#stRTM.stTotalCounter.nMinute := #stRTM.stTotalCounter.nMinute MOD 60;
END_REGION
REGION Charge-Counter
#stRTM.stChargeCounter.nSecond := #stRTM.stChargeCounter.nSecond + BOOL_TO_INT(#xClock);
#stRTM.stChargeCounter.nMinute := #stRTM.stChargeCounter.nMinute + BOOL_TO_INT(#stRTM.stChargeCounter.nSecond >= 60);
#stRTM.stChargeCounter.nHour := #stRTM.stChargeCounter.nHour + BOOL_TO_DINT(#stRTM.stChargeCounter.nMinute >= 60);
#stRTM.stChargeCounter.nSecond := #stRTM.stChargeCounter.nSecond MOD 60;
#stRTM.stChargeCounter.nMinute := #stRTM.stChargeCounter.nMinute MOD 60;
END_REGION
REGION Maintenance-Counter
#stRTM.stMaintenance.nSecond := #stRTM.stMaintenance.nSecond + BOOL_TO_INT(#xClock);
#stRTM.stMaintenance.nMinute := #stRTM.stMaintenance.nMinute + BOOL_TO_INT(#stRTM.stMaintenance.nSecond >= 60);
#stRTM.stMaintenance.nHour := #stRTM.stMaintenance.nHour - BOOL_TO_INT(#stRTM.stMaintenance.nMinute >= 60);
#stRTM.stMaintenance.nSecond := #stRTM.stMaintenance.nSecond MOD 60;
#stRTM.stMaintenance.nMinute := #stRTM.stMaintenance.nMinute MOD 60;
END_REGION
REGION Zero
IF #stRTM.stMaintenance.nHour < 0 THEN
#stRTM.stMaintenance.nHour := 0;
#stRTM.stMaintenance.nMinute := 0;
#stRTM.stMaintenance.nSecond := 0;
END_IF;
END_REGION
END_IF;
END_REGION
REGION Reset
REGION Reset Charge Counter
IF #stRTM.stFlags.xResetCharge THEN
#stRTM.stChargeCounter.nHour := 0;
#stRTM.stChargeCounter.nMinute := 0;
#stRTM.stChargeCounter.nSecond := 0;
#stRTM.stFlags.xResetCharge := FALSE;
END_IF;
END_REGION
REGION Reset Maintenance Counter
IF #stRTM.stFlags.xResetMaintenance THEN
#stRTM.stMaintenance.nHour := #stRTM.stMaintenance.nIntervall;
#stRTM.stMaintenance.nMinute := 0;
#stRTM.stMaintenance.nSecond := 0;
#stRTM.stFlags.xResetMaintenance := FALSE;
END_IF;
END_REGION
END_REGION
REGION Limit values
#stRTM.stMaintenance.nWarning := MIN(IN1:= #stRTM.stMaintenance.nWarning, IN2:= #stRTM.stMaintenance.nIntervall);
IF #stRTM.stMaintenance.nHour > #stRTM.stMaintenance.nIntervall THEN
#stRTM.stMaintenance.nHour := #stRTM.stMaintenance.nIntervall;
#stRTM.stMaintenance.nMinute := 0;
#stRTM.stMaintenance.nSecond := 0;
END_IF;
END_REGION
REGION Status
#stRTM.stFlags.xMaintenance := #stRTM.stMaintenance.nHour <= 0 AND #stRTM.stMaintenance.nIntervall > 0;
#stRTM.stFlags.xWarning := #stRTM.stMaintenance.nHour <= #stRTM.stMaintenance.nWarning AND #stRTM.stMaintenance.nWarning > 0;
#stRTM.stFlags.xWarning := #stRTM.stFlags.xWarning AND NOT #stRTM.stFlags.xMaintenance;
#stRTM.stFlags.nState := SEL(G := #stRTM.stFlags.xWarning, IN0 := 0, IN1 := 1);
#stRTM.stFlags.nState := SEL(G := #stRTM.stFlags.xMaintenance, IN0 := #stRTM.stFlags.nState, IN1 := 2);
END_REGION
END_FUNCTION_BLOCK
@@ -0,0 +1,8 @@
LibraryType:
Guid: 5b22b7a0-2178-4944-a91a-0554edd65f42
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Run time monitoring
@@ -0,0 +1,13 @@
DocumentHash:
- FileName: UDT_RTM.xml
Hash: Jz8w0u3bv3kyg1JteRl6e66LDncsx//c2I0x6quNxDk=
LibraryMetaFileHash: 3tJC4RrE/dALu5EIsH0uLUvJsp2VhfR3OeMesRTRsJI=
LibraryVersion:
Guid: 3af2b460-c36e-47b7-a1f9-870396d05bd7
DependsOn:
- TypeName: UDT_RTM_Time
VersionNumber: 2.0.0
- TypeName: UDT_RTM_Maintenance
VersionNumber: 2.0.0
- TypeName: UDT_RTM_Flags
VersionNumber: 2.0.0
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="stTotalCounter" Datatype="&quot;UDT_RTM_Time&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
<Member Name="stChargeCounter" Datatype="&quot;UDT_RTM_Time&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
<Member Name="stMaintenance" Datatype="&quot;UDT_RTM_Maintenance&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
<Member Name="stFlags" Datatype="&quot;UDT_RTM_Flags&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_RTM</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,8 @@
LibraryType:
Guid: 57d3de27-8412-4acc-a5a8-e11b5f7b8b97
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Run time monitoring
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_RTM_Flags.xml
Hash: piMwP5JQiY++cWDND3c02GQsWnhEi9BMUlUbOiOmB3Q=
LibraryMetaFileHash: DL67+az3ZAISL96WmoV/d2neoW+fAIBmMGAmXK1Adlk=
LibraryVersion:
Guid: 06ef58da-e439-4df1-8ef3-6e8edf74d554
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="xResetCharge" Datatype="Bool" />
<Member Name="xResetMaintenance" Datatype="Bool" />
<Member Name="xWarning" Datatype="Bool" />
<Member Name="xMaintenance" Datatype="Bool" />
<Member Name="nState" Datatype="Int" />
</Section>
</Sections></Interface>
<Name>UDT_RTM_Flags</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,8 @@
LibraryType:
Guid: 7ae2232d-8d12-4e5a-8096-4e1154c44e75
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Run time monitoring
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_RTM_Maintenance.xml
Hash: KXV53rFL0ONooLjl08qJ73DjMpOsI9S8luaWGgluJG4=
LibraryMetaFileHash: 0l0zZpMtg/sKV4XRWqLlL+bHKf6Gr4YBebFrG2+GZSQ=
LibraryVersion:
Guid: 3f388807-4b41-4a6d-8f8a-c60ab16ba84f
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="nHour" Datatype="Int" />
<Member Name="nMinute" Datatype="Int" />
<Member Name="nSecond" Datatype="Int" />
<Member Name="nIntervall" Datatype="Int" />
<Member Name="nWarning" Datatype="Int" />
</Section>
</Sections></Interface>
<Name>UDT_RTM_Maintenance</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,8 @@
LibraryType:
Guid: ee61d29b-02c2-4515-9554-eb11b12ed45f
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Run time monitoring
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_RTM_Time.xml
Hash: xrTn+38zmregXA1kyMDhBDG+Cv8N4H+pzpG58WuOv4A=
LibraryMetaFileHash: baZKaT+d3x+N8QxCkx2ofQMcTRH4wa5UFiPci6wPnYo=
LibraryVersion:
Guid: 0b2dcfae-8c5e-4ffb-aa55-beecd9f70432
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="nHour" Datatype="DInt" />
<Member Name="nMinute" Datatype="Int" />
<Member Name="nSecond" Datatype="Int" />
</Section>
</Sections></Interface>
<Name>UDT_RTM_Time</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,10 @@
LibraryType:
Guid: f40dd329-3f8e-45dd-898b-24da6076f332
Comment:
de-DE: 'Hauptzustandmaschine '
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: stInOutControlUnitCabinet.xRestart wird jetzt benutzt
@@ -0,0 +1,11 @@
DocumentHash:
- FileName: FB_StateMain.scl
Hash: Nmmlczx8daiTq972/VPJUQ66oPeA5dceWjGNpRZf/6s=
LibraryMetaFileHash: 26KqGD4lRmtnuQv7YFrKjngcYTZuuY6+furs2L/j9lI=
LibraryVersion:
Guid: 78bc094a-ba36-410e-bb5c-9dc8345824b9
DependsOn:
- TypeName: UDT_MainState
VersionNumber: 2.0.0
- TypeName: UDT_HMI_StateMachine
VersionNumber: 2.0.0
@@ -0,0 +1,237 @@
FUNCTION_BLOCK "FB_StateMain"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xInBtnMachineOn : Bool; // Anlage Ein
xInBtnMachineNotOff : Bool; // Anlage Aus
xInBtnLightTest : Bool; // Lampentest
xInBtnTrigMot : Bool; // Trig Mot
xInBtnQuitError : Bool; // Start nach Störung
xInAllReadyToStart : Bool; // Alles bereit
xInAllInExecute : Bool; // Alle Antriebe in Run
xInAllStarted : Bool; // Starten erfolgreich beendet
xInSafetyActive : Bool; // Safety aktiv
xInAllInSafeState : Bool; // Alles im sicheren Status
stSettings : Struct // Einstellungen
tCancelStarting : Time := t#10s;
xEnableStartUpWarning : Bool;
xPressMachineOnAllTime : Bool;
tStartUpTime : Time := T#3s;
END_STRUCT;
END_VAR
VAR_IN_OUT
stInOutControlUnitCabinet : "UDT_MainState"; // Schnittstelle MainState
stInOutHMI : "UDT_HMI_StateMachine"; // NUR FÜR HMI
END_VAR
VAR
nState : Int := -10; // Schritt
sStateText : String; // Schritttext
tOnStartUpTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Anlaufverzögerung
nConveyorStartUpCounter : Int; // Counter Förderer
xQuitErrorFlag : Bool; // Start nach Störung Flag
stControl : Struct // Start,Stop,Quit
xStart : Bool;
xStop : Bool;
xQuitt : Bool;
END_STRUCT;
END_VAR
VAR_TEMP
nCounter : Int;
nNoStartingAct : Int;
END_VAR
BEGIN
REGION MainStateMachine
CASE #nState OF
"E_DeviceState.eUndefined":
REGION Undefined
#sStateText := 'StartUp';
#nState := "E_DeviceState.eStopped";
END_REGION ;
"E_DeviceState.eStopped":
REGION Stopped
#sStateText := 'Stopped';
IF #xInAllReadyToStart AND NOT #stInOutControlUnitCabinet.xStopMachine THEN
#nState := "E_DeviceState.eIdle";
END_IF;
#stInOutControlUnitCabinet.xStopMachine := FALSE;
END_REGION ;
"E_DeviceState.eIdle":
REGION IDLE
#sStateText := 'Idle';
IF NOT #xInAllReadyToStart OR #stInOutControlUnitCabinet.xStopMachine THEN
#nState := "E_DeviceState.eStopped";
ELSIF (#xInBtnMachineOn OR #stInOutHMI.xStart OR #stControl.xStart)AND (((#xInBtnMachineNotOff AND NOT #stControl.xStop AND NOT #stInOutHMI.xStop) AND NOT #stControl.xStop AND NOT #stInOutHMI.xStop) AND NOT #stControl.xStop AND NOT #stInOutHMI.xStop) THEN
#nState := "E_DeviceState.eStarting";
#stControl.xStart := FALSE;
END_IF;
END_REGION ;
"E_DeviceState.eStarting":
REGION Starting
#sStateText := 'Start UP Warning Time';
IF NOT #xInAllReadyToStart OR #stInOutControlUnitCabinet.xStopMachine THEN
#nState := "E_DeviceState.eStopped";
ELSIF #xInAllStarted AND
(NOT #stSettings.xEnableStartUpWarning OR
(#stSettings.xEnableStartUpWarning AND #tOnStartUpTimer.Q)) THEN
#nState := 120;
ELSIF (NOT #xInBtnMachineOn AND #stSettings.xPressMachineOnAllTime)
OR NOT #xInBtnMachineNotOff OR
#tOnStartUpTimer.ET > #stSettings.tCancelStarting
THEN
#nState := "E_DeviceState.eStopping";
END_IF;
END_REGION ;
120:
REGION Waiting for All in Excecute
#sStateText := 'Waiting for All in Execute';
IF #xInAllInExecute THEN
#nState := "E_DeviceState.eExecute";
#nConveyorStartUpCounter := 0;
ELSIF NOT ((#xInBtnMachineNotOff AND NOT #stControl.xStop AND NOT #stInOutHMI.xStop) AND NOT #stControl.xStop AND NOT #stInOutHMI.xStop) OR #stInOutControlUnitCabinet.xStopMachine THEN
#nState := "E_DeviceState.eStopping";
END_IF;
END_REGION
"E_DeviceState.eExecute":
REGION Execute
#sStateText := 'Execute';
IF NOT #xInSafetyActive THEN
#nState := "E_DeviceState.eHolding";
#nConveyorStartUpCounter := 0;
ELSIF NOT (#xInBtnMachineNotOff AND NOT #stControl.xStop AND NOT #stInOutHMI.xStop) OR #stInOutControlUnitCabinet.xStopMachine THEN
#nState := "E_DeviceState.eStopping";
ELSIF FALSE THEN
#nState := "E_DeviceState.eSuspending";
END_IF;
IF #nConveyorStartUpCounter < 6000 THEN
#nConveyorStartUpCounter := #nConveyorStartUpCounter + 1;
ELSIF #xInBtnTrigMot THEN
#nConveyorStartUpCounter := 0;
END_IF;
END_REGION ;
"E_DeviceState.eHolding":
#sStateText := 'HOLDING: When the machine is in the EXECUTE state the Hold command can be used to start HOLDING logic which brings the machine to a controlled stop or to a state which represents HELD for the particular machine mode. ';
#nState := "E_DeviceState.eHeld";
"E_DeviceState.eHeld":
REGION Held
#sStateText := 'HELD: The HELD state would typically be used by the operator to hold the temporarily hold the machines operation whilst material blockages are cleared, or to stop throughput whilst a downstream problem is resolved.';
IF (NOT (#xInBtnMachineNotOff AND NOT #stInOutHMI.xStop)) OR #stInOutControlUnitCabinet.xStopMachine THEN
#nState := "E_DeviceState.eStopping";
ELSIF #xInSafetyActive THEN
#nState := "E_DeviceState.eUnholding";
END_IF;
END_REGION ;
"E_DeviceState.eUnholding":
REGION Unholding
#sStateText := 'Un-Holding: The UNHOLDING state is typically a response to an operator command to resume EXECUTE state. UNHOLDING prepares the machine to re-enter the EXECUTE state.';
IF NOT #stSettings.xEnableStartUpWarning OR
(#stSettings.xEnableStartUpWarning AND #tOnStartUpTimer.Q) THEN
#nState := "E_DeviceState.eExecute";
END_IF;
END_REGION
"E_DeviceState.eSuspending":
#sStateText := 'SUSPENDING: This state is a result of a command change from the EXECUTE state. This state is typically required prior to the SUSPENDED wait state, and prepares the machine (ie stops glue cycles, stops carton feeds, etc) prior to the SUSPEND state.';
#nState := "E_DeviceState.eSuspended";
"E_DeviceState.eSuspended":
REGION Suspended
#sStateText := 'SUSPENDED: The machine may be running at the relevant setpoint speed, there is no product being produced. This state can be reached as a result of a machine status, and differs from HELD in that HELD is typically a result of an operator request.';
IF NOT (#xInBtnMachineNotOff AND NOT #stControl.xStop AND NOT #stInOutHMI.xStop) OR #stInOutControlUnitCabinet.xStopMachine THEN
#nState := "E_DeviceState.eStopping";
ELSIF TRUE THEN
#nState := "E_DeviceState.eUnsuspending";
END_IF;
END_REGION ;
"E_DeviceState.eUnsuspending":
#sStateText := 'UN-SUSPENDING: This state is a result of a request from SUSPENDED state to go back to the EXECUTE state. This actions of this state may include: ramping up speeds, turning on vaccums, the re-engagement of clutches.';
(*IF NOT #xInSafetyOk THEN
#nState := "E_DeviceState.eHolding";
ELSE *)
#nState := "E_DeviceState.eExecute";
(* END_IF; *)
"E_DeviceState.eStopping":
REGION Stopping
#sStateText := 'Stopping';
#nState := 5010;
END_REGION
5010:
#sStateText := 'Waiting for Safe State';
IF #xInAllInSafeState THEN
#nState := "E_DeviceState.eStopped";
END_IF;
END_CASE;
END_REGION
//
REGION Global stop conditions
IF (#nState > "E_DeviceState.eIdle") AND
(#nState < "E_DeviceState.eStopping") AND
NOT #xInAllReadyToStart THEN
#nState := "E_DeviceState.eStopped";
END_IF;
END_REGION
REGION Timer
#tOnStartUpTimer(IN := (#nState = "E_DeviceState.eStarting" OR #nState = "E_DeviceState.eUnholding"),
PT := #stSettings.tStartUpTime);
END_REGION
REGION Outputs
#stInOutControlUnitCabinet.xStartUpWarning := (#nState = "E_DeviceState.eStarting" OR (#nState = "E_DeviceState.eUnholding" AND #stSettings.xEnableStartUpWarning)) AND #stSettings.xEnableStartUpWarning AND "Clock_1Hz";
#stInOutControlUnitCabinet.xStarting := (#nState = "E_DeviceState.eStarting") OR (#nState = "E_DeviceState.eUnholding");// AND #stSettings.xEnableStartUpWarning;
#stInOutControlUnitCabinet.xRunning := #nState > "E_DeviceState.eStarting" AND #nState <= "E_DeviceState.eUnholding";
#stInOutControlUnitCabinet.xMachineOnLed := (#nState > "E_DeviceState.eStarting" AND
#nState < "E_DeviceState.eUnholding")
OR
#nState = "E_DeviceState.eStarting" AND "Clock_2.5Hz"
OR
#nState = "E_DeviceState.eUnholding" AND "Clock_2.5Hz";
#stInOutControlUnitCabinet.xQuitError := (NOT #xQuitErrorFlag AND #xInBtnQuitError) OR #stControl.xQuitt OR #stInOutHMI.xQuit;
#stInOutControlUnitCabinet.xSafetyRequest := #nState >= "E_DeviceState.eStarting" AND #nState <= "E_DeviceState.eAborting";
#stInOutControlUnitCabinet.xSafetyActive := #xInSafetyActive;
IF (NOT #xQuitErrorFlag AND #xInBtnQuitError) THEN
#stInOutControlUnitCabinet.xError := 0;
END_IF;
#xQuitErrorFlag := #xInBtnQuitError;
#stInOutControlUnitCabinet.xRestart := #nConveyorStartUpCounter < 6000 AND #nState = "E_DeviceState.eExecute";
END_REGION
REGION Flags
#xQuitErrorFlag := #xInBtnQuitError OR #stInOutHMI.xQuit;
END_REGION
REGION HMI
#stInOutHMI.nStateStatus := #nState; // Für Anzeige
END_REGION
END_FUNCTION_BLOCK
@@ -0,0 +1,10 @@
LibraryType:
Guid: 748bae8a-b781-46d7-addf-30d61d2eba87
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
HMI Schnittstelle für MainStateMachine
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_HMI_StateMachine.xml
Hash: YqTb5Kyt7R2GxFrle2a0EDCZZaopcl49Qy34HgCTLgE=
LibraryMetaFileHash: DCa7PFui0vP0Ap3+CzccEnRwXeGVD/9IVuSPN1Z7DKQ=
LibraryVersion:
Guid: 56ad7890-8af6-435b-bc6e-eb1b1452b2de
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="nStateStatus" Datatype="Int">
<Comment>
<MultiLanguageText Lang="de-DE">State Status</MultiLanguageText>
</Comment>
</Member>
<Member Name="xStart" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Ein</MultiLanguageText>
</Comment>
</Member>
<Member Name="xStop" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Aus</MultiLanguageText>
</Comment>
</Member>
<Member Name="xQuit" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Quittieren</MultiLanguageText>
</Comment>
</Member>
<Member Name="xEStop" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Abort / Not-Aus</MultiLanguageText>
</Comment>
</Member>
<Member Name="xRestart" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Restart</MultiLanguageText>
</Comment>
</Member>
<Member Name="xRevRequest" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Rev Request</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_HMI_StateMachine</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,12 @@
LibraryType:
Guid: 3d2d0bd3-d380-4083-96cb-8a59f491213f
Comment:
de-DE: Schnittstelle für FB_StateMain
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Schnittstelle für FB_StateMain
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_MainState.xml
Hash: +MrFmzTr+4YI2f0qRODlk2+DIDgf/h5wtjQbdU+trFE=
LibraryMetaFileHash: akSVw7JbvF/2cLiH1d4UkN55a7NTHXG6blUM71UKumM=
LibraryVersion:
Guid: 10820fae-c055-4680-9e88-3660705a6587
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="xRunning" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Anlage Automatikbetrieb</MultiLanguageText>
</Comment>
</Member>
<Member Name="xQuitError" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Start nach Störung</MultiLanguageText>
</Comment>
</Member>
<Member Name="xError" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Any Error active</MultiLanguageText>
</Comment>
</Member>
<Member Name="xStarting" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Maschine startet</MultiLanguageText>
</Comment>
</Member>
<Member Name="xRestart" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Neustart</MultiLanguageText>
</Comment>
</Member>
<Member Name="xMachineOnLed" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">LED Anlage Ein</MultiLanguageText>
</Comment>
</Member>
<Member Name="xStopMachine" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Maschine wird durch dieses Bit angehalten</MultiLanguageText>
</Comment>
</Member>
<Member Name="xStartUpWarning" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Anfahrwarnung</MultiLanguageText>
</Comment>
</Member>
<Member Name="xSafetyRequest" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Anfrage, dass die Safety aktiviert wird</MultiLanguageText>
</Comment>
</Member>
<Member Name="xSafetyActive" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Safety ist aktiviert</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_MainState</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,20 @@
LibraryType:
Guid: fc79a2eb-31dd-4847-9624-eb660ce10f25
Comment:
de-DE: |-
Manager für Schrittketten
- Schrittketten ein-ausschalten
- Schritttimer integriert (Dauer eines aktiven Schritts)
- Schritthistorie
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Manager für Schrittketten
- Schrittketten ein-ausschalten
- Schritttimer integriert (Dauer eines aktiven Schritts)
- Schritthistorie
Freigegeben für IBN (22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FB_StateManager.scl
Hash: bcEUtDKqV8LMMdpaYVhVCfjBuKlBilNyJprtURyTJZc=
LibraryMetaFileHash: 2PYH+EJhUOAQSvx/5tKDPTmfq3RYznpIYVnZ2XbSK1M=
LibraryVersion:
Guid: cb3fd588-4989-4a4a-a2a6-5529192cbc90
@@ -0,0 +1,164 @@
FUNCTION_BLOCK "FB_StateManager"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
stInSettings : Struct
nStartState : Int := 100; // State auf den als erstes gesprungen wird wenn xFunctoinEnable = TRUE
nStartStateTestMode : Int;
xRestartAtStartState : Bool; // TRUE: Wird der Baustein wieder aktiviert wird der State der unter "Settings.nStartState" angegeben ist angesprungen. False: Alter State wird wieder angesprungen
xActUnivTOn : Bool;
END_STRUCT;
xInFunctionEnabled : Bool; // nState springt auf 0 wenn FALSE, und zurück zum Ursprung bei TRUE
xInReset : Bool;
xInRunUnivTOn : Bool;
xInTimerReset : Bool;
xInTestMode : Bool;
END_VAR
VAR_OUTPUT
nOutStateLast : Int;
xOutStepchange : Bool; // einen Zyklus True bei Schrittwechel. Kommt nicht beim Wechel in State = 0 aus State = 0
tOutTimeInStep : Time; // Zeit wie lange schon im Schritt, wird bei Stepchange zurückgesetzt
tOutUnivTonR : Time; // Gibt eine hochzählende Zeit aus die z.B. in Schrittketten verwendet werden kann
END_VAR
VAR_IN_OUT
nInOutState : Int;
END_VAR
VAR RETAIN
nStateBeforeError : Int := 100;
nStateLast : Int := 100;
arHistory : Array[0..50] of Int;
END_VAR
VAR
arHistoryAdv : Array[0..#cSizeHistoryAdv] of Struct
nStepNum : Int;
tTimeStamp {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
END_STRUCT;
END_VAR
VAR RETAIN
nPosHistory : USInt;
tOnrTimeInStep {InstructionName := 'TONR_TIME'; LibVersion := '1.0'} : TONR_TIME;
tOnrUnivTimer {InstructionName := 'TONR_TIME'; LibVersion := '1.0'} : TONR_TIME;
tOnUnivTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
xStepchange : Bool;
END_VAR
VAR
R_TRIG_TestMode {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
F_TRIG_TestMode {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG;
R_TRIG_FunctionEn {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
END_VAR
VAR_TEMP
t_Status : Int;
END_VAR
VAR CONSTANT
cSizeHistory : USInt := 50;
cSizeHistoryAdv : UInt := 200;
END_VAR
BEGIN
// #R_TRIG_TestMode(CLK := #xInTestMode);
// #F_TRIG_TestMode(CLK:=#xInTestMode);
//#R_TRIG_FunctionEn(CLK := #xInFunctionEnabled);
REGION Reset
IF #xInReset (* OR "FirstScan" *) (* OR #R_TRIG_TestMode.Q OR #F_TRIG_TestMode.Q *) THEN //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#nInOutState := 0;
#nStateLast := #stInSettings.nStartState;
#nStateBeforeError := #stInSettings.nStartState;
END_IF;
END_REGION
REGION Stephistory schreiben
IF #nInOutState <> #nStateLast AND
#nInOutState <> 0000 THEN
#arHistory[#nPosHistory] := #nInOutState;
IF #nPosHistory >= #cSizeHistory THEN
#arHistory[0] := 9999;
#nPosHistory := 0;
ELSE
#arHistory[#nPosHistory + 1] := 9999;
#nPosHistory += 1;
END_IF;
END_IF;
END_REGION
REGION Stephistory mit Zeitstempel
// IF
// #nInOutState <> #nStateLast
// THEN
// #t_Status := MOVE_BLK_VARIANT(SRC := #"arHistoryAdv",
// COUNT := #cSizeHistoryAdv,
// SRC_INDEX := 0,
// DEST_INDEX := 1,
// DEST => #"arHistoryAdv");
// #t_Status := RD_LOC_T(#"arHistoryAdv"[0].tTimeStamp); //Zeitstempel
// #"arHistoryAdv"[0].nStepNum := #nInOutState;
// #nStateLast := #nInOutState;
// END_IF;
END_REGION
REGION Ein- und Ausschalten
//Bei Ein - Auschalten in Schritt 0 und zurück wechseln
IF NOT #xInFunctionEnabled
AND #nInOutState <> 0000 THEN
#nStateBeforeError := #nInOutState;
#nInOutState := 0000;
ELSIF #xInFunctionEnabled AND
#nInOutState = 0000 THEN
IF #stInSettings.xRestartAtStartState THEN
#nInOutState := #stInSettings.nStartState;
ELSE
#nInOutState := #nStateBeforeError;
END_IF;
END_IF;
END_REGION
REGION Stepchange
IF #nInOutState <> #nStateLast THEN
IF #nInOutState <> 0000 THEN
#nStateLast := #nInOutState;
IF #nStateLast <> 0000 THEN
#xStepchange := TRUE;
END_IF;
END_IF;
ELSE
#xStepchange := FALSE;
END_IF;
END_REGION
REGION Timer
#tOnrTimeInStep(IN := #nInOutState <> 0000,
PT := T#+24d_20h_31m_23s, //Max Zeit für "Time"
R := #xStepchange OR #xInReset);
IF #stInSettings.xActUnivTOn THEN
#tOnrUnivTimer(IN := #xInRunUnivTOn,
PT := T#+24d_20h_31m_23s); //Max Zeit für "Time"
IF #xInReset OR #xInTimerReset THEN
RESET_TIMER(#tOnrUnivTimer);
END_IF;
END_IF;
END_REGION
REGION Ausgänge schreiben
#xOutStepchange := #xStepchange;
#tOutTimeInStep := #tOnrTimeInStep.ET;
#nOutStateLast := #nStateLast;
IF #stInSettings.xActUnivTOn THEN
#tOutUnivTonR := #tOnrUnivTimer.ET;
ELSE
#tOutUnivTonR := T#0S;
END_IF;
END_REGION
END_FUNCTION_BLOCK