BaseSystemLib hinzugefügt
This commit is contained in:
@@ -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
|
||||
@@ -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=""UDT_RTM_Time"">
|
||||
<AttributeList>
|
||||
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
|
||||
</AttributeList>
|
||||
</Member>
|
||||
<Member Name="stChargeCounter" Datatype=""UDT_RTM_Time"">
|
||||
<AttributeList>
|
||||
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
|
||||
</AttributeList>
|
||||
</Member>
|
||||
<Member Name="stMaintenance" Datatype=""UDT_RTM_Maintenance"">
|
||||
<AttributeList>
|
||||
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
|
||||
</AttributeList>
|
||||
</Member>
|
||||
<Member Name="stFlags" Datatype=""UDT_RTM_Flags"">
|
||||
<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
|
||||
|
||||
Reference in New Issue
Block a user