ILSLib hinzugefügt

This commit is contained in:
2026-06-29 16:29:41 +02:00
parent 14a1c5172d
commit cd281dc8b2
249 changed files with 26501 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
LibraryType:
Guid: 72f65cd0-2f82-4e9a-944e-763573262fcb
Comment:
de-DE: 'CHNAGED: optimierung sk'
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: 'CHNAGED: optimierung sk'
+6
View File
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FC_Ean8_CheckDigit.scl
Hash: R/NEMYYVcohoRaYvvfR00dVoXqRCxkaB2vrCapFAIKY=
LibraryMetaFileHash: kiYGeRw8WAjgxWPKrD0RU/pUGvFpQtxA5i+4VFRWOPU=
LibraryVersion:
Guid: 86087764-f9fa-4e00-99b4-fd1f0d046c81
+40
View File
@@ -0,0 +1,40 @@
FUNCTION "FC_Ean8_CheckDigit" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
sInDigits : String; // Barcode String (muss 7-stellig sein)
END_VAR
VAR_OUTPUT
sOutBarcode : String; // 8-stelliges Resultat als String
nOutBarcode : DInt; // 8-stelliges Resultat als DINT
END_VAR
VAR_TEMP
sBarcode : String; // Resultat als String
nLengthString : Int; // Ermittelte Länge des Eingangsstrings
nSum : Int; // Zwischensumme der berechneten Prüfziffer
nCheckDigit : Int; // berechnete Prüfziffer
END_VAR
BEGIN
(*
Prüft ob String siebenstellig ist.
Falls nein, dann RETURN.
Falls ja, dann errechne die Prüfziffer nach EAN8 und gebe Barcode als DINT sowie String aus.
*)
#nLengthString := LEN(#sInDigits);
IF #nLengthString <> 7 THEN
RETURN;
END_IF;
#nSum := STRING_TO_INT(#sInDigits[7]) * 3 + STRING_TO_INT(#sInDigits[6]) + STRING_TO_INT(#sInDigits[5]) * 3 + STRING_TO_INT(#sInDigits[4]) + STRING_TO_INT(#sInDigits[3]) * 3 + STRING_TO_INT(#sInDigits[2]) + STRING_TO_INT(#sInDigits[1]) * 3 ;
#nCheckDigit := 10 - (#nSum MOD 10);
IF #nCheckDigit = 10 THEN
#nCheckDigit := 0;
END_IF;
#sOutBarcode := #sBarcode := CONCAT(IN1 := #sInDigits, IN2 := DELETE(IN:=INT_TO_STRING(#nCheckDigit), L:=1, P:=1));
#nOutBarcode := STRING_TO_DINT(#sBarcode);
END_FUNCTION
+10
View File
@@ -0,0 +1,10 @@
LibraryType:
Guid: 487f8a43-4b39-46f6-a1db-76a1b3e0f176
Comment:
de-DE: Initial
LibraryVersion:
VersionNumber: 2.0.1
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Änderung bei FC_TSHR_Shift
+15
View File
@@ -0,0 +1,15 @@
DocumentHash:
- FileName: FC_Route.scl
Hash: hIPhdrG77606oePl5SdGa7CHfrpBJY76vgPixX8iMW0=
LibraryMetaFileHash: pJYnAbURN79vKAyF0lpkfpnLgEHsh+6NHtKXtFDTF8c=
LibraryVersion:
Guid: a5ef1d68-80ec-445d-a745-78efb8a2a107
DependsOn:
- TypeName: stEventBookingInfo
VersionNumber: 2.0.0
- TypeName: stCarrier
VersionNumber: 2.0.0
- TypeName: FC_TSHR_AddAtEnd
VersionNumber: 2.0.0
- TypeName: FC_TSHR_Shift
VersionNumber: 2.0.1
+140
View File
@@ -0,0 +1,140 @@
FUNCTION "FC_Route" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xInSingle : Bool; // true = einzelner Carrier wird losgeschickt, false = Array
xInSeparate : Bool; // Carrier und Ladung trennen
xInSepEdge : Bool; // Flanke vom Separator
xInSensor : Bool; // Sensor Eingang falls dieser verwendet wird
xInDelay : Bool; // true = Car werden auf den Weg geschickt bis Sensor kommt
stInCarrier : "stCarrier"; // Einzelner Carrier für den Eingang
END_VAR
VAR_OUTPUT
stOutBookingInfo : "stEventBookingInfo"; // Infos für Logging
END_VAR
VAR_IN_OUT
arJamEntr : Array[*] of "stCarrier"; // Jam am Eingang (Platzhalter verwenden falls kein Jam vorhanden)
arOnTheWay : Array[*] of "stCarrier"; // Carrier die für die Travel-Time unterwegs sind
arJamExit : Array[*] of "stCarrier"; // Jam am Ausgang (Platzhalter verwenden falls kein Jam vorhanden)
END_VAR
VAR_TEMP
stCarrier : "stCarrier"; // Merker vom Eingang
stLoadOnly : "stCarrier"; // Nur Ladung am Ende
stCarrierOnly : "stCarrier";
nCounter1 : DInt; // Temp für TSHR
nCounter2 : DInt; // Temp für TSHR
xResult1 : Bool; // Temp für TSHR
xResult2 : Bool; // Temp für TSHR
END_VAR
BEGIN
REGION Abfrage ob Singlecarrier oder Array
IF #xInSingle THEN
#stCarrier := #stInCarrier; //falls kein Array vorhanden, wird hier ein einzlener Carrier verwendet
ELSE
#stCarrier := #arJamEntr[1]; //erster Carrier des Eingangs-Staubereichs
END_IF;
END_REGION
REGION Weiterbuchen
IF NOT #xInDelay THEN //Shift zum Ziel-Bereich sofort
IF #xInSepEdge AND NOT #xInSeparate THEN
REGION Carrier normal weiterschieben
"FC_TSHR_AddAtEnd"(stInTrolley := #stCarrier,
nOutCounter => #nCounter1,
xOutResult => #xResult1,
arTSHR := #arJamExit);
"FC_TSHR_Shift"(xInShiftBack := TRUE,
arTSHR := #arJamEntr);
REGION Event Log
// Info rausgeben an Log-Baustein
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
// #stOutBookingInfo.sJobNo := DELETE(IN := DINT_TO_STRING(#stCarrier.stLoadData.nJobNo), L := 1, P := 1);
// #stOutBookingInfo.sProductNo := DELETE(IN := DINT_TO_STRING(#stCarrier.stLoadData.nProductNo), L := 1, P := 1);
END_REGION
END_REGION
ELSIF #xInSepEdge AND #xInSeparate THEN
REGION Carrier/Ladung getrennt weiterschieben
#stCarrierOnly := #stCarrier;
#stCarrierOnly.bStatus.%X1 := FALSE;
#stLoadOnly := #stCarrier;
REGION Carrier
"FC_TSHR_AddAtEnd"(stInTrolley := #stCarrierOnly,
nOutCounter => #nCounter1,
xOutResult => #xResult1,
arTSHR := #arJamExit);
END_REGION
REGION Ladung
"FC_TSHR_AddAtEnd"(stInTrolley := #stLoadOnly,
nOutCounter => #nCounter1,
xOutResult => #xResult1,
arTSHR := #arOnTheWay);
END_REGION
"FC_TSHR_Shift"(xInShiftBack := TRUE,
arTSHR := #arJamEntr);
REGION Event Log
// Info rausgeben an Log-Baustein
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
END_REGION
END_REGION
END_IF;
ELSE //Shift zum Ziel-Bereich über Verzögerung
IF #xInSepEdge THEN
REGION Carrier auf den Weg schieben
"FC_TSHR_AddAtEnd"(stInTrolley := #stCarrier,
nOutCounter => #nCounter1,
xOutResult => #xResult1,
arTSHR := #arOnTheWay);
"FC_TSHR_Shift"(xInShiftBack := TRUE,
arTSHR := #arJamEntr);
END_REGION
REGION Event Log
// Info rausgeben an Log-Baustein
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
END_REGION
END_IF;
IF #xInSensor THEN
REGION Carrier unterwegs wird durch Sensor quittiert
"FC_TSHR_AddAtEnd"(stInTrolley := #arOnTheWay[1],
nOutCounter => #nCounter2,
xOutResult => #xResult2,
arTSHR := #arJamExit);
"FC_TSHR_Shift"(xInShiftBack := TRUE,
arTSHR := #arOnTheWay);
END_REGION
REGION Event Log
// Info rausgeben an Log-Baustein
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
END_REGION
END_IF;
END_IF;
END_REGION
END_FUNCTION
@@ -0,0 +1,8 @@
LibraryType:
Guid: 6caf52bc-45ea-42bb-8864-ebe669724132
LibraryVersion:
VersionNumber: 2.0.0
Author: t.molina
IsDefault: true
Comment:
de-DE: 'CHANGED: übersetzt'
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FC_SHR_CheckStationPin.scl
Hash: nkMI480Ra4JgkPn02PCjzTtghlbgHDHdwzY/qUbRsZI=
LibraryMetaFileHash: yE1mYrZG1jiaC+YKm95dBPJV/BUzcSI0edoqzGeOMfk=
LibraryVersion:
Guid: be754d41-5565-4ed2-98d8-6257307063cd
DependsOn:
- TypeName: stConveyorStations
VersionNumber: 2.0.3
+62
View File
@@ -0,0 +1,62 @@
FUNCTION "FC_SHR_CheckStationPin" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInStation : Int;
xInTargetStation : Bool;
nInConvStations : Int; // neu hinzugefügt, statt Konstante
nInStationsMax : Int; // neu hinzugefügt, statt Konstante
END_VAR
VAR_OUTPUT
xOutStationHi : Bool;
xOutStationNHi : Bool;
xOutStationHiBefore : Bool;
nOutBarcode : DInt;
sOutBarcode : String;
END_VAR
VAR_IN_OUT
stInOutConveyorStations : "stConveyorStations";
END_VAR
VAR_TEMP
nCounter : Int;
xStationHi : Bool;
END_VAR
BEGIN
// *************************************************************
// Prüft ob Hanger aus dem Online-Register Station erreicht hat
// *************************************************************
IF #stInOutConveyorStations.stData.nTrolleysOnline = 0 OR
(#nInStation > #nInStationsMax) THEN
RETURN;
END_IF;
FOR #nCounter := 1 TO #nInConvStations DO
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.bStatus.%X0 AND // Teil vorhanden
((#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nTarget = #nInStation) OR NOT #xInTargetStation) AND // Zielstation GLEICH der eigenen Station
(#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct >= #stInOutConveyorStations.arStationsPos[#nInStation].nPosIncr) THEN
#xStationHi := 1; //sagt Abwurf abbiegen
IF #xStationHi THEN
#nOutBarcode := #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.nBarcode;
END_IF;
EXIT;
ELSIF
#stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.bStatus.%X0 AND // Teil vorhanden
((#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nTarget > #nInStation) OR NOT #xInTargetStation) AND // Zielstation GRÖßER der eigenen Station
(#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct >= #stInOutConveyorStations.arStationsPos[#nInStation].nPosIncr) AND
(#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct < #stInOutConveyorStations.arStationsPos[#nInStation].nPosIncr + 150) THEN
#xOutStationNHi := 1; //sagt Abwurf geradeaus
EXIT;
END_IF;
END_FOR;
#xOutStationHi := #xStationHi;
END_FUNCTION
+8
View File
@@ -0,0 +1,8 @@
LibraryType:
Guid: ae3ad50b-36d6-449e-8326-46d4e3b3c847
LibraryVersion:
VersionNumber: 2.0.0
Author: t.molina
IsDefault: true
Comment:
de-DE: 'CHANGED: übersetzt'
+13
View File
@@ -0,0 +1,13 @@
DocumentHash:
- FileName: FC_SHR_CyclePin.scl
Hash: 5Kwg7lZUM2fqIhMBTpVACHs/GGTG39fxI16w+9mc5+4=
LibraryMetaFileHash: Zw+wjPFKzwXmUUpWTY7dgAvnGJBXef9gOjg0TjIrv68=
LibraryVersion:
Guid: 5abe1ca8-d687-4973-82d3-c99f7603ddad
DependsOn:
- TypeName: stCarrierPin
VersionNumber: 2.0.0
- TypeName: FC_TSHR_AddAtEnd
VersionNumber: 2.0.0
- TypeName: stConveyorStations
VersionNumber: 2.0.3
+58
View File
@@ -0,0 +1,58 @@
FUNCTION "FC_SHR_CyclePin" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInPosDiff : DInt; // zykl. Differenz der Inkremente
nInPosPitchPart : DInt;
nInConvStations : Int; // neu hinzugefügt, statt Konstante
nInStationsMax : Int; // neu hinzugefügt, statt Konstante
END_VAR
VAR_IN_OUT
stInOutConveyorStations : "stConveyorStations";
END_VAR
VAR_TEMP
nCounter : Int;
stEmptyTrolley : "stCarrierPin";
nLastStationPos : DInt;
Temp_1 : DInt;
Temp_2 : Bool;
END_VAR
BEGIN
// ****************************************
// Zyklischer Aufruf für Online-Register
// ****************************************
// IF #stConveyorStations.nTrolleysOnline = 0 THEN
// ;//RETURN;
// END_IF;
#stInOutConveyorStations.stData.nPosActPart := #nInPosPitchPart;
IF #nInPosDiff > 0 THEN
// Trolleys aus Stationen entfernen / Anzahl der Trolleys ermitteln
#stInOutConveyorStations.stData.nTrolleysOnline := 0;
FOR #nCounter := 1 TO #nInConvStations DO
// Wenn Trolley über letzte Station hinaus, dann löschen
IF (#stInOutConveyorStations.stData.nStations > 0) AND (#stInOutConveyorStations.stData.nStations <= #nInStationsMax) THEN
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct > #stInOutConveyorStations.arStationsPos[#stInOutConveyorStations.stData.nStations].nPosIncr THEN
"FC_TSHR_AddAtEnd"(stInTrolley := #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier,
nOutCounter => #Temp_1,
xOutResult => #Temp_2,
arTSHR := "DB_HyperJam".stHyperJam.arCarrier); //TODO Zugriff über inout Schnittstelle...
#stInOutConveyorStations.arTrolleysOnline[#nCounter] := #stEmptyTrolley;
END_IF;
END_IF;
// Ansonsten online bleiben
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.bStatus.%X0 THEN
#stInOutConveyorStations.stData.nTrolleysOnline += 1;
#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct += #nInPosDiff;
END_IF;
END_FOR;
END_IF;
END_FUNCTION
@@ -0,0 +1,8 @@
LibraryType:
Guid: c15aaa61-01ed-4442-82db-06b58abeebb9
LibraryVersion:
VersionNumber: 2.0.3
Author: e.yueksel
IsDefault: true
Comment:
de-DE: aktualisiert wegen unterlagerter Änderung
@@ -0,0 +1,15 @@
DocumentHash:
- FileName: FC_SHR_ExtractedHangerPin.scl
Hash: XyeHlDaPDHU4l/mIlfqMRb1ThUJh7fOEVbU6xxXAuso=
LibraryMetaFileHash: WzpdUNPAj9I5FTy+OuK14GfR78f5T0kQJt9dQatgSsQ=
LibraryVersion:
Guid: 94bbd898-ab59-4c22-a0ee-320804d0387a
DependsOn:
- TypeName: stConveyorStations
VersionNumber: 2.0.3
- TypeName: stCarrierPin
VersionNumber: 2.0.0
- TypeName: stCarrier
VersionNumber: 2.0.0
- TypeName: FC_TSHR_AddAtEnd
VersionNumber: 2.0.0
+63
View File
@@ -0,0 +1,63 @@
FUNCTION "FC_SHR_ExtractedHangerPin" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xInUnloadingDone : Bool; // trigger zum Offline Setzen des Trolleys
nInBarcode : DInt; // Arrayposition in arTrolleysOnline
xInBypass : Bool;
END_VAR
VAR_IN_OUT
stInOutConveyorStations : "stConveyorStations";
arInOutCarrier : Array[*] of "stCarrier";
END_VAR
VAR_TEMP
nCounter : Int; // Arraynummer bzw. Haken / Trolley
nTrolleyPosition : Int;
stEmptyTrolley : "stCarrierPin";
tempTrolley : "stCarrier";
TempCounter : DInt;
TempResult : Bool;
END_VAR
BEGIN
// ****************************************
// Setzt im Online-Register den Hanger im Abwurf auf Not Online
// ****************************************
// Passenden Eintrag finden
IF #xInUnloadingDone THEN
FOR #nCounter := 1 TO ("cHooksSorterMaxPin") DO
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.nBarcode = #nInBarcode THEN
EXIT;
END_IF;
END_FOR;
// Wenn Eintrag gefunden, dann eintragen.
IF #nCounter < "cHooksSorterMaxPin" THEN
// #arOutTrolleyShiftRegister.arTrolley[1] := #arInOutTrolleysOnline[#nCounter].stTrolleyLoad;
IF NOT #xInBypass THEN //Wenn der Carrier am Block vorbeifährt (Bypass) NICHT buchen *****NEU*****
#tempTrolley := #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier;
"FC_TSHR_AddAtEnd"(stInTrolley := #tempTrolley,
nOutCounter => #TempCounter,
xOutResult => #TempResult,
arTSHR := #arInOutCarrier);
END_IF;
IF NOT #TempResult
AND NOT #xInBypass //***NEU***
THEN
RETURN;
ELSE
// Leeren des Hangers am Abwurf
#stInOutConveyorStations.stData.nTrolleysOnline -= 1;
// Alles im Online-Register eins weiter schieben
FOR #nCounter := #nCounter TO ("cHooksSorterMaxPin" - 1) DO // Weiterkopieren um eine Position
#stInOutConveyorStations.arTrolleysOnline[#nCounter] := #stInOutConveyorStations.arTrolleysOnline[#nCounter + 1];
END_FOR;
#stInOutConveyorStations.arTrolleysOnline["cHooksSorterMaxPin"] := #stEmptyTrolley;
END_IF;
END_IF;
END_IF;
END_FUNCTION
+8
View File
@@ -0,0 +1,8 @@
LibraryType:
Guid: fbb06663-2a05-4c23-84a0-4d267ee6e385
LibraryVersion:
VersionNumber: 2.0.1
Author: e.yueksel
IsDefault: true
Comment:
de-DE: 'CHANGED: übersetzt'
+11
View File
@@ -0,0 +1,11 @@
DocumentHash:
- FileName: FC_SHR_HangerAddPin.scl
Hash: SCQ7PgamkaxUa5QWVzGXY8NpJp3tKxxHpFGN8B/C5QE=
LibraryMetaFileHash: p7/L2jLnZLmPRtZL/Yb3rkBbLHJMxvNbFxE1zg7hips=
LibraryVersion:
Guid: 6640f592-83b1-4a46-8526-d2f636c28047
DependsOn:
- TypeName: stCarrierPin
VersionNumber: 2.0.0
- TypeName: stConveyorStations
VersionNumber: 2.0.3
+73
View File
@@ -0,0 +1,73 @@
FUNCTION "FC_SHR_HangerAddPin" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
stInCarrier : "stCarrierPin";
nInPos : DInt; // Aktuelle Position auf der Kette
nInTarget : USInt; // Ziel-Station f. Trolley bei My Theresa = 1
nInConvStations : Int; // neu hinzugefügt, statt Konstante
nInStationsMax : Int; // neu hinzugefügt, statt Konstante
END_VAR
VAR_IN_OUT
stInOutConveyorStations : "stConveyorStations";
END_VAR
VAR_TEMP
nCounter : Int; // Arraynummer bzw. Haken / Trolley
END_VAR
BEGIN
// ****************************************
// Setzt im Online-Register einen neuen Hanger (am Anfang)
// ****************************************
IF #stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nPosAct = #stInOutConveyorStations.arStationsPos[#nInPos].nPosIncr THEN // Wenn bereits ein Bügel eingetragen ist auf der Position
RETURN;
END_IF;
// Alles im Online-Register eins weiter schieben
FOR #nCounter := (#nInConvStations - 1) TO 1 BY -1 DO // Weiterkopieren um eine Position
#stInOutConveyorStations.arTrolleysOnline[#nCounter + 1] := #stInOutConveyorStations.arTrolleysOnline[#nCounter];
END_FOR;
// Startwerte setzen
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X0 := TRUE;
IF #nInTarget >= 1 AND #nInTarget <= #nInStationsMax THEN
#stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nTarget := #nInTarget;
#stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nTargetPos := #stInOutConveyorStations.arStationsPos[#nInTarget].nPosIncr;
END_IF;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nBarcode := #stInCarrier.stCarrier.nBarcode;
#stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nPosAct := #stInOutConveyorStations.arStationsPos[#nInPos].nPosIncr;
#stInOutConveyorStations.stData.nTrolleysOnline += 1;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X1 := #stInCarrier.stCarrier.bStatus.%X1;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X2 := #stInCarrier.stCarrier.bStatus.%X2;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X3 := #stInCarrier.stCarrier.bStatus.%X3;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X4 := #stInCarrier.stCarrier.bStatus.%X4;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X5 := #stInCarrier.stCarrier.bStatus.%X5;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X6 := #stInCarrier.stCarrier.bStatus.%X6;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X7 := #stInCarrier.stCarrier.bStatus.%X7;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X8 := #stInCarrier.stCarrier.bStatus.%X8;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X9 := #stInCarrier.stCarrier.bStatus.%X9;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X10 := #stInCarrier.stCarrier.bStatus.%X10;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X11 := #stInCarrier.stCarrier.bStatus.%X11;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X12 := #stInCarrier.stCarrier.bStatus.%X12;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X13 := #stInCarrier.stCarrier.bStatus.%X13;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X14 := #stInCarrier.stCarrier.bStatus.%X14;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X15 := #stInCarrier.stCarrier.bStatus.%X15;
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nDestination := #stInCarrier.stCarrier.nDestination; // EMBI 11.06.2025
// Dummy-Barcode für Hanger vergeben. Negative Werte sind Dummys
#stInOutConveyorStations.stData.nBarcodeNew -= 1;
IF #stInOutConveyorStations.stData.nBarcodeNew < -2000000 THEN // Wenn Zähler Kleiner als 2 Mio dann von vorne anfangen.
#stInOutConveyorStations.stData.nBarcodeNew := -1;
END_IF;
IF #stInCarrier.stCarrier.nBarcode > 0 THEN
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nBarcode := #stInCarrier.stCarrier.nBarcode;
ELSE
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nBarcode := #stInOutConveyorStations.stData.nBarcodeNew;
END_IF;
END_FUNCTION
@@ -0,0 +1,8 @@
LibraryType:
Guid: bb985cb7-f19e-4e7f-9500-9a5edcac2865
LibraryVersion:
VersionNumber: 2.0.3
Author: e.yueksel
IsDefault: true
Comment:
de-DE: aktualisiert wegen unterlagerter Änderung
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FC_SHR_TargetSet_ReRoutePin.scl
Hash: ofWTIcPOm/FlhfAHwD4CbfS3KmLT28gEa6SpVKGs5CA=
LibraryMetaFileHash: Zf2O+aidtu7ZZtbXq9pKYPNR0zxwwhzUGeT7vASQI2U=
LibraryVersion:
Guid: 10277776-2258-4ebc-81af-1e451bc796cc
DependsOn:
- TypeName: stConveyorStations
VersionNumber: 2.0.3
@@ -0,0 +1,48 @@
FUNCTION "FC_SHR_TargetSet_ReRoutePin" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInBarcodeNo : DInt; // Barcode
nInTarget : USInt; // Ziel-Station f. Trolley bei My Theresa = 1
END_VAR
VAR_OUTPUT
xOutSuccess : Bool;
END_VAR
VAR_IN_OUT
stInOutConveyorStations : "stConveyorStations";
END_VAR
VAR_TEMP
nCounter : Int; // Arraynummer bzw. Haken / Trolley
END_VAR
BEGIN
// // ****************************************
// // Ändert Ziel für Barcode in Online-Register Station
// // ****************************************
IF #stInOutConveyorStations.stData.nTrolleysOnline = 0 THEN
RETURN;
END_IF;
// Passenden Eintrag finden
FOR #nCounter := 1 TO ("cHooksSorterMaxPin") DO
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.nBarcode = #nInBarcodeNo THEN
EXIT;
END_IF;
END_FOR;
// Wenn Eintrag gefunden, dann eintragen.
IF #nCounter < "cHooksSorterMaxPin" THEN
#stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.nDestination := #nInTarget;
// #stConveyorStations.arTrolleysOnline[#nCounter].stCarrData.xReRouteOverflow := TRUE; // brauchen wir bei ILS nicht (?), war speziell für Pin/Klinke
IF (#nInTarget > 0) AND (#nInTarget <= #stInOutConveyorStations.stData.nStations) THEN
#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nTargetPos := #stInOutConveyorStations.arStationsPos[#nInTarget].nPosIncr;
#xOutSuccess := 1;
END_IF;
ELSE
#xOutSuccess := 0;
END_IF;
END_FUNCTION
+10
View File
@@ -0,0 +1,10 @@
LibraryType:
Guid: 7fd3f712-0c70-464a-a178-3c0e9f56e7fd
Comment:
de-DE: Initial
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: stCarrier angepasst
+9
View File
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FC_TSHR_AddAtEnd.scl
Hash: lG/2SIkHPbNSGJwje2b2x+eGlM+zHxwJUz5jxsyDO0g=
LibraryMetaFileHash: fqf5hTjb9wPmlqRGgCD6Y+CnbAvNz0VlWqHeBP5JZvg=
LibraryVersion:
Guid: 42d9ac8f-436d-47fd-ad7b-f96d7f788df8
DependsOn:
- TypeName: stCarrier
VersionNumber: 2.0.0
+53
View File
@@ -0,0 +1,53 @@
FUNCTION "FC_TSHR_AddAtEnd" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
stInTrolley : "stCarrier";
END_VAR
VAR_OUTPUT
nOutCounter : DInt;
xOutResult : Bool; // 1 = Successfully; 0 = Error
END_VAR
VAR_IN_OUT
arTSHR : Array[*] of "stCarrier";
END_VAR
VAR_TEMP
nCounter : DInt;
xMatch : Bool;
nArrayMax : DInt;
END_VAR
BEGIN
#nArrayMax := UPPER_BOUND(ARR := #arTSHR, DIM := 1);
IF #arTSHR[#nArrayMax].bStatus.%X0 = TRUE THEN
RETURN;
END_IF;
FOR #nCounter := #nArrayMax - 1 TO 1 BY -1 DO
IF #arTSHR[#nCounter].bStatus.%X0 = TRUE THEN
#xMatch := 1;
EXIT;
END_IF;
END_FOR;
IF #nCounter = 0 THEN
#xMatch := TRUE;
END_IF;
IF #xMatch
THEN
#arTSHR[#nCounter + 1].nDestination := #stInTrolley.nDestination;
#arTSHR[#nCounter + 1].nBarcode := #stInTrolley.nBarcode;
#arTSHR[#nCounter + 1].bStatus := #stInTrolley.bStatus;
END_IF;
#xOutResult := #xMatch;
#nOutCounter := #nCounter;
END_FUNCTION
+10
View File
@@ -0,0 +1,10 @@
LibraryType:
Guid: d80e8fca-e961-4f74-921c-a6b0d72f1eac
Comment:
de-DE: Initial
LibraryVersion:
VersionNumber: 2.0.1
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Letzte Position mit Carrier ohne Daten überschreiben komplett
+9
View File
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FC_TSHR_Shift.scl
Hash: 6AT5T7zTUDZWCJy0vQWjq9UZRCdYr1H0qVENFUzxOWM=
LibraryMetaFileHash: 7MKfTAQoPA7tnamjvhMFhTKhCDCMvY/xv+qtUkv2AH0=
LibraryVersion:
Guid: f6d0468d-7b77-4edd-9872-9c45f88f2433
DependsOn:
- TypeName: stCarrier
VersionNumber: 2.0.0
+50
View File
@@ -0,0 +1,50 @@
FUNCTION "FC_TSHR_Shift" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xInShiftBack : Bool;
END_VAR
VAR_IN_OUT
arTSHR : Array[*] of "stCarrier";
END_VAR
VAR_TEMP
tStatus : Int;
tStatusSim : Int;
tSrcIdx : DInt;
tDestIdx : DInt;
nArrayMax : DInt;
stEmptyCarrier : "stCarrier"; // Carrier mit leeren Daten
END_VAR
VAR CONSTANT
Constant_1 {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
END_VAR
BEGIN
#nArrayMax := UPPER_BOUND(ARR := #arTSHR, DIM := 1); // get array size
IF #xInShiftBack THEN // move backward
#tSrcIdx := 1;
#tDestIdx := 0;
ELSE // move forward
#tSrcIdx := 0;
#tDestIdx := 1;
END_IF;
#tStatus := MOVE_BLK_VARIANT(SRC := #arTSHR,
COUNT := DINT_TO_UDINT(#nArrayMax-1),
SRC_INDEX := #tSrcIdx,
DEST_INDEX := #tDestIdx,
DEST => #arTSHR);
#arTSHR[#nArrayMax] := #stEmptyCarrier;
END_FUNCTION
+6
View File
@@ -0,0 +1,6 @@
LibraryType:
Guid: 718b592c-b3f7-485a-b5db-163a6b763ce8
LibraryVersion:
VersionNumber: 2.0.9
Author: e.yueksel
IsDefault: true
+17
View File
@@ -0,0 +1,17 @@
DocumentHash:
- FileName: FC_TargetDecision.scl
Hash: kNd8G5z+HN1o9RuzkJtOXGe4eo2Buvf1y+1NaGO5ZZE=
LibraryMetaFileHash: FVB62exlMNV1jliCiCLS1KKSmFd70HRrQS7AAuiMRdE=
LibraryVersion:
Guid: d131374a-a6c5-4f85-90ef-e79fbf6a693d
DependsOn:
- TypeName: stStorageLine
VersionNumber: 2.0.0
- TypeName: UDT_Sensor
VersionNumber: 2.0.0
- TypeName: stConveyorStations
VersionNumber: 2.0.3
- TypeName: stCarrier
VersionNumber: 2.0.0
- TypeName: stJamData
VersionNumber: 2.0.0
+227
View File
@@ -0,0 +1,227 @@
FUNCTION "FC_TargetDecision" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
arInStorageLineCalc : Array[1.."cNoLines"] of Int;
arInStorage : Array[*] of "stStorageLine";
arInSenStore : Array[*] of "UDT_Sensor";
nInDestGeneral : Int;
nInNoOfLines : Int;
nInStorageThreshold : Int;
nInMode : USInt; // 1 = abwechselnd; 2 = gleichmäßig füllen; 3 = nacheinander auffüllen
END_VAR
VAR_OUTPUT
xOutBypass : Bool;
END_VAR
VAR_IN_OUT
nInOutTarget : USInt;
xInOutFree : Bool;
stInOutConveyorStations : "stConveyorStations";
stInOutCarrier : "stCarrier";
stInOutJamBypass : "stJamData";
END_VAR
VAR_TEMP
nIdx : Int; // Schleifenindex
nIdx2 : Int;
nIdxMem : Int; // gemerkter Wert vom Schleifenindex
nTarget : Int;
nTargetMaxOnTheWay : Int;
nSum : Int; // Summe der Lagerbestände
nAverage : Int; // Durchschnitt der Lagerfüllstände
nThrTop : Int; // Obere Schwelle für Durchschnitt
nThrLow : Int; // Untere Schwelle für Durchschnitt
nNoOfSameTarget1 : Int;
END_VAR
BEGIN
(*
Funktion weist ab AddHanger-Sensor das Ziel des aktuellen Carriers zu, prüft aber vorher ob Ziel frei ist. Falls nicht, wird nächstes freies Ziel gesucht.
Falls alles voll ist, wird Stop-Befehl für Band ausgegeben
*)
//Beispiel für Materialnummer Stand IBN:
//95001412-95001419 -> Sitz
//95001420-9500142x -> Lehne
//#nInProductNr DInt
//************TEST FÜR DURCHSCHNITT**************
// FOR #nIdx := 1 TO "cNoLines" DO //Summe der Lagerlinien-Füllstände merken
// #nSum += #arInStorage[#nIdx].stData.Status.nCount;
// END_FOR;
// IF #nSum > 0 AND #nSum <= ("cNoLines" * "cNoPositions") THEN
// //Durchschnitt berechnen sowie obere/untere Schwelle, aber nur wenn Durchschnitt oberhalb eines festgelegten Wertes liegt
// #nAverage := #nSum / "cNoLines";
// #nThrTop := #nAverage * "cAverageThrTop";
// #nThrLow := #nAverage * "cAverageThrLow";
// END_IF;
// "cAverageMin"...
REGION Normierung für diesen FC
IF #nInOutTarget < 11 OR #nInOutTarget > #nInNoOfLines + 10 THEN // > nInNoLines hinzugefügt, für unterschiedlich große Lager-TRO
#nTarget := 1; //Wenn Ziel außerhalb des gültigen Bereichs, fange mit 1 an
ELSE
#nTarget := #nInOutTarget - 10; //nTarget benutzt Zahlen 1-21 statt von außen ab 11 beginnend zur einfacheren Handhabung
END_IF;
END_REGION
CASE #nInMode OF
1:
REGION ABWECHSELND - Ziele prüfen falls aktuelles belegt
IF #arInSenStore[#nTarget].xJam OR #arInStorage[#nTarget].stData.Status.nCount >= #nInStorageThreshold OR #arInStorageLineCalc[#nTarget] >= #nInStorageThreshold THEN //Wenn Ziel voll, dann....
REGION Ziel korrigieren
IF #nTarget = #nInNoOfLines THEN //Wenn Ziel die letzte Linie ist, suche von 1. bis vorletzte Linie
REGION Suche von 1. bis vorletzte
FOR #nIdx := 1 TO (#nInNoOfLines - 1) DO
IF NOT #arInSenStore[#nIdx].xJam AND #arInStorage[#nIdx].stData.Status.nCount < #nInStorageThreshold AND #arInStorageLineCalc[#nIdx] < #nInStorageThreshold THEN
#nInOutTarget := INT_TO_USINT(#nIdx + 10); //nächstes freies Ziel. Fertig
RETURN;
END_IF;
END_FOR;
END_REGION
#xInOutFree := FALSE; //nichts freies gefunden -> Band stoppen
RETURN;
ELSE
REGION Suche bis zum Schluss...
FOR #nIdx := (#nTarget + 1) TO #nInNoOfLines DO //Suche AB der aktuellen Linie...
IF NOT #arInSenStore[#nIdx].xJam AND #arInStorage[#nIdx].stData.Status.nCount < #nInStorageThreshold AND #arInStorageLineCalc[#nIdx] < #nInStorageThreshold THEN
#nInOutTarget := INT_TO_USINT(#nIdx + 10); //nächstes freies Ziel. Fertig
RETURN;
END_IF;
END_FOR;
END_REGION
REGION ...und ggf. von 1. bis zum aktuellen
FOR #nIdx := 1 TO (#nTarget - 1) DO //...falls nichst gefunden, suche BIS zur aktuellen Linie
IF NOT #arInSenStore[#nIdx].xJam AND #arInStorage[#nIdx].stData.Status.nCount < #nInStorageThreshold AND #arInStorageLineCalc[#nIdx] < #nInStorageThreshold THEN
#nInOutTarget := INT_TO_USINT(#nIdx + 10); //nächstes freies Ziel. Fertig
RETURN;
END_IF;
END_FOR;
END_REGION
#xInOutFree := FALSE; //nichts freies gefunden -> Band stoppen
RETURN;
END_IF;
END_REGION
ELSE
REGION Ziel i.O.
#nInOutTarget := INT_TO_USINT(#nTarget + 10); //keine Korrektur nötig und übernehme Ziel einfach
END_REGION
END_IF;
END_REGION
2:
REGION GLEICHMÄßIG BEFÜLLEN - Ziele prüfen
FOR #nIdx := 1 TO #nInNoOfLines DO
IF #nIdx = 1 THEN
IF NOT #arInSenStore[#nIdx].xJam AND #arInStorage[#nIdx].stData.Status.nCount < #nInStorageThreshold THEN
#nIdxMem := #nIdx; //Wenn beim 1. Schleifendurchlauf in L1 Platz ist, merke die 1
END_IF;
ELSIF #nIdx > 1 THEN
// ab den folgenden Schleifendurchläufen, merke die Linie, welche weniger drin hat als die zuvor gemerkte (falls Platz ist)
IF NOT #arInSenStore[#nIdx].xJam AND #arInStorage[#nIdx].stData.Status.nCount < #nInStorageThreshold AND
#arInStorage[#nIdx].stData.Status.nCount < #arInStorage[#nIdxMem].stData.Status.nCount THEN
#nIdxMem := #nIdx;
END_IF;
END_IF;
END_FOR;
// nach der Schleife: Wenn nichts gemerkt wurde, heißt es dass alle Linien voll sind -> Band stoppen
IF #nIdxMem = 0 THEN
#xInOutFree := FALSE; //nichts freies gefunden -> Band stoppen
ELSE
#nInOutTarget := INT_TO_USINT(#nIdxMem + 10); //nächstes freies Ziel. Fertig
END_IF;
END_REGION
3:
REGION JEDE LINIE NACHEINANDER BEFÜLLEN - Ziele prüfen
//PRÜFEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
REGION Richtungswechsel ermitteln TO DO ÜBERARBEITEN
(* IF #stInOutConveyorStations.stData.nTrolleysOnline > 0 THEN //wenn etwas unterwegs ist, ermittle ob der aktuelle Carrier ein kleineres Ziel hat als diese
FOR #nIdx2 := 1 TO #stInOutConveyorStations.stData.nTrolleysOnline DO
IF #nIdx2 = 1 THEN
#nTargetMaxOnTheWay := #stInOutConveyorStations.arTrolleysOnline[#nIdx2].stPinValues.nTarget;
ELSE
IF #stInOutConveyorStations.arTrolleysOnline[#nIdx2].stPinValues.nTarget > #nTargetMaxOnTheWay THEN
#nTargetMaxOnTheWay := #stInOutConveyorStations.arTrolleysOnline[#nIdx2].stPinValues.nTarget;
END_IF;
END_IF;
END_FOR;
IF (#stInOutCarrier.nDestination - #nInDestGeneral) > (#nTargetMaxOnTheWay - 10) THEN //Wenn aktueller Carrier ein höheres Ziel hat als die unterwegs, mach nichts
#xInOutFree := FALSE;
RETURN;
END_IF;
END_IF; *)
//Bearbeitung kann weiter gehen weil aktueller Carrier niedrigeres Ziel hat oder nichts
END_REGION
(*
Für Änderung dass man abwartet dass CarrierOnline leer ist vor Richtungswechsel:
-nicht TargetMaxOnTheWay ermitteln mit Schleife sondern einfach Ziel des ersten OnTheWay abfragen
-NoOfSameTarget muss nicht mit Schleife ermittelt werden sondern einfach von TrolleysOnline der nCount abgefragt werden
-.....
*)
REGION Linie ermitteln bzw. prüfen
//IF #stInOutCarrier.nDestination = 0 OR (#stInOutCarrier.nDestination >= #nInDestGeneral AND (#stInOutCarrier.nDestination <= #nInDestGeneral + #nInNoOfLines) AND NOT #stInOutCarrier.bStatus.%X5) THEN
IF #stInOutCarrier.nDestination = 0 OR (#stInOutCarrier.nDestination = #nInDestGeneral) THEN
(*normal Ziel ermitteln für neue Carrier*)
FOR #nIdx := 1 TO #nInNoOfLines DO
IF #stInOutConveyorStations.stData.nTrolleysOnline > 0 THEN //zähle gleiche Ziele zusammen erst wenn überhaupt etwas unterwegs ist
FOR #nIdx2 := 1 TO #stInOutConveyorStations.stData.nTrolleysOnline DO
IF #stInOutConveyorStations.arTrolleysOnline[#nIdx2].stPinValues.nTarget = #nIdx + 10 THEN
#nNoOfSameTarget1 += 1; //addiere die gleichen vergebenen Ziele auf dem Pinband
END_IF;
END_FOR;
END_IF;
IF NOT #arInStorage[#nIdx].stData.Status.bByte.%X2 AND // Einfahrt gesperrt (HMI-Schnittstelle, manueller Eingriff)
NOT #arInSenStore[#nIdx].xJam AND //Phys. Stau
NOT #arInStorage[#nIdx].stData.Status.bByte.%X5 AND //reservierte Linie nicht anfahren
(#arInStorage[#nIdx].stData.Status.nCount + #nNoOfSameTarget1) < #nInStorageThreshold THEN
#nInOutTarget := INT_TO_USINT(#nIdx + 10); //nächstes freies Ziel. Fertig
#xInOutFree := TRUE;
RETURN;
END_IF;
#nNoOfSameTarget1 := 0; // Nullen
IF #nIdx = #nInNoOfLines THEN
#xInOutFree := FALSE; //nichts freies gefunden -> Band stoppen
END_IF;
END_FOR;
// ELSIF #stInOutCarrier.nDestination > #nInDestGeneral AND #stInOutCarrier.nDestination <= #nInDestGeneral + 21 THEN //zwischen 21101 und 21121
// ELSIF (#stInOutCarrier.nDestination >= #nInDestGeneral AND #stInOutCarrier.nDestination <= #nInDestGeneral + #nInNoOfLines AND #stInOutCarrier.bStatus.%X5) THEN
ELSIF ((#stInOutCarrier.nDestination > #nInDestGeneral) AND (#stInOutCarrier.nDestination <= (#nInDestGeneral + #nInNoOfLines))) THEN
(*hat schon Ziel in diesem Block, daher prüfen ob diese Linie frei*)
IF #stInOutConveyorStations.stData.nTrolleysOnline > 0 THEN //zähle gleiche Ziele zusammen erst wenn überhaupt etwas unterwegs ist
FOR #nIdx2 := 1 TO #stInOutConveyorStations.stData.nTrolleysOnline DO
IF #stInOutConveyorStations.arTrolleysOnline[#nIdx2].stPinValues.nTarget = (#stInOutCarrier.nDestination - #nInDestGeneral) + 10 THEN
#nNoOfSameTarget1 += 1; //addiere die gleichen vergebenen Ziele auf dem Pinband
END_IF;
END_FOR;
END_IF;
IF NOT #arInSenStore[#stInOutCarrier.nDestination - #nInDestGeneral].xJam AND //phys. Stau
NOT #arInStorage[#stInOutCarrier.nDestination - #nInDestGeneral].stData.Status.bByte.%X2 AND //Einfahrt gesperrt (HMI, manuell)
(#arInStorage[#stInOutCarrier.nDestination - #nInDestGeneral].stData.Status.nCount + #nNoOfSameTarget1) < #nInStorageThreshold THEN
#nInOutTarget := INT_TO_USINT((#stInOutCarrier.nDestination - #nInDestGeneral) + 10); //nächstes freies Ziel. Fertig
#xInOutFree := TRUE;
RETURN;
END_IF;
#xInOutFree := FALSE; //nichts freies gefunden -> Band stoppen
ELSE
(*Bypass*)
#nInOutTarget := INT_TO_USINT(#nInNoOfLines + 10 + 1);
#xOutBypass := TRUE;
IF NOT (#stInOutJamBypass.Status.nCount >= #stInOutJamBypass.Config.nCapacitySet) THEN
#xInOutFree := TRUE;
END_IF;
END_IF;
END_REGION
END_REGION
ELSE
#xInOutFree := FALSE; //falsche Eingabe -> Band stoppen
END_CASE;
END_FUNCTION
+10
View File
@@ -0,0 +1,10 @@
LibraryType:
Guid: 080fec55-3e2f-4dd7-a4ef-294c5113ff9e
Comment:
de-DE: initial
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: initial
+6
View File
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FC_Uint2TroString.scl
Hash: Gs1y9qS42iVf5AZEmG/pjCxOA+B8NRA14qLGfUhrcQA=
LibraryMetaFileHash: dsNZNzo5UmuqP9VU8rCmYwxrpDVyLoCN/2yQH46KEOE=
LibraryVersion:
Guid: 87ef5917-e524-4be6-9c25-711f27819aa2
+53
View File
@@ -0,0 +1,53 @@
FUNCTION "FC_Uint2TroString" : String
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInNumber : UInt;
END_VAR
VAR_TEMP
sTmp : String[5];
END_VAR
BEGIN
// Funktion wandelt Uint zu einem Tro-String. Aus 123 wird 12.3, aus 0 wird 0.0 aus 12345 wird 1234.5
// Autor: Christian Forkl
// Getestet: Ja
// 03.08.2021
#sTmp := RIGHT(IN := UINT_TO_STRING(#nInNumber), L := (LEN(UINT_TO_STRING(#nInNumber)) - 1));
#FC_Uint2TroString := '';
IF #nInNumber > 9999 THEN
#FC_Uint2TroString[1] := #sTmp[1];
#FC_Uint2TroString[2] := #sTmp[2];
#FC_Uint2TroString[3] := #sTmp[3];
#FC_Uint2TroString[4] := #sTmp[4];
#FC_Uint2TroString[5] := '.';
#FC_Uint2TroString[6] := #sTmp[5];
ELSIF #nInNumber > 999 THEN
#FC_Uint2TroString[1] := #sTmp[1];
#FC_Uint2TroString[2] := #sTmp[2];
#FC_Uint2TroString[3] := #sTmp[3];
#FC_Uint2TroString[4] := '.';
#FC_Uint2TroString[5] := #sTmp[4];
ELSIF #nInNumber > 99 THEN
#FC_Uint2TroString[1] := #sTmp[1];
#FC_Uint2TroString[2] := #sTmp[2];
#FC_Uint2TroString[3] := '.';
#FC_Uint2TroString[4] := #sTmp[3];
ELSIF #nInNumber > 9 THEN
#FC_Uint2TroString[1] := #sTmp[1];
#FC_Uint2TroString[2] := '.';
#FC_Uint2TroString[3] := #sTmp[2];
ELSIF #nInNumber > 0 THEN
#FC_Uint2TroString[1] := '0';
#FC_Uint2TroString[2] := '.';
#FC_Uint2TroString[3] := #sTmp[1];
ELSE
#FC_Uint2TroString := '0.0';
END_IF;
END_FUNCTION
+10
View File
@@ -0,0 +1,10 @@
LibraryType:
Guid: 170b53d4-41f2-4a63-95d5-f1d211def922
Comment:
de-DE: initial
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: initial
+6
View File
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FC_usint2String.scl
Hash: sccEToQ7qZ2iK+oOSrv6Rq5UMC5OehwiiZAV6HbYSQA=
LibraryMetaFileHash: xVWgpoJxAToKwiCXx005TzLRsm4th9GS44N6XJthX8U=
LibraryVersion:
Guid: f6da1f27-73cc-44c0-b509-a32a5cc418eb
+25
View File
@@ -0,0 +1,25 @@
FUNCTION "FC_usint2String" : String
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInNumber : USInt;
END_VAR
VAR_TEMP
sTmp : String;
END_VAR
BEGIN
// Funktion wandelt Int zu String. Im Gegensatz zu "Int_To_String" wird das "+" entfernt. Bei negativen Zahlen bleibt das "-" erhalten.
// Autor: Christian Forkl
// 28.07.2021
#sTmp := USINT_TO_STRING(#nInNumber);
IF #nInNumber >= 0 THEN
#FC_usint2String := RIGHT(IN := #sTmp, L := (LEN(#sTmp) - 1));
ELSE
#FC_usint2String := #sTmp;
END_IF;
END_FUNCTION