ILSLib hinzugefügt
This commit is contained in:
@@ -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'
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_Ean8_CheckDigit.scl
|
||||
Hash: R/NEMYYVcohoRaYvvfR00dVoXqRCxkaB2vrCapFAIKY=
|
||||
LibraryMetaFileHash: kiYGeRw8WAjgxWPKrD0RU/pUGvFpQtxA5i+4VFRWOPU=
|
||||
LibraryVersion:
|
||||
Guid: 86087764-f9fa-4e00-99b4-fd1f0d046c81
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
LibraryType:
|
||||
Guid: 718b592c-b3f7-485a-b5db-163a6b763ce8
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.9
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_Uint2TroString.scl
|
||||
Hash: Gs1y9qS42iVf5AZEmG/pjCxOA+B8NRA14qLGfUhrcQA=
|
||||
LibraryMetaFileHash: dsNZNzo5UmuqP9VU8rCmYwxrpDVyLoCN/2yQH46KEOE=
|
||||
LibraryVersion:
|
||||
Guid: 87ef5917-e524-4be6-9c25-711f27819aa2
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_usint2String.scl
|
||||
Hash: sccEToQ7qZ2iK+oOSrv6Rq5UMC5OehwiiZAV6HbYSQA=
|
||||
LibraryMetaFileHash: xVWgpoJxAToKwiCXx005TzLRsm4th9GS44N6XJthX8U=
|
||||
LibraryVersion:
|
||||
Guid: f6da1f27-73cc-44c0-b509-a32a5cc418eb
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user