zweiter Baustein hinzugefügt

This commit is contained in:
2026-06-22 17:15:46 +02:00
parent c85c525c25
commit 6a6d981178
485 changed files with 339121 additions and 0 deletions
@@ -0,0 +1,25 @@
FUNCTION "FC_Int2String" : String
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInNumber : Int;
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 := INT_TO_STRING(#nInNumber);
IF #nInNumber >= 0 THEN
#FC_Int2String := RIGHT(IN := #sTmp, L := (LEN(#sTmp) - 1));
ELSE
#FC_Int2String := #sTmp;
END_IF;
END_FUNCTION
@@ -0,0 +1,203 @@
FUNCTION "FC_Jam" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_OUTPUT
stOutCarrierStatsStandard : "CarrierStatisticsStandard";
stOutCarrierStatsAdv : "CarrierStatisticsStorage";
END_VAR
VAR_IN_OUT
arInOutJamCarrier : Array[*] of "stCarrier";
stInOutData : "stJamData";
END_VAR
VAR_TEMP
nIdx : Int;
nArrayMax : Int;
END_VAR
VAR CONSTANT
cForecast : USInt := 110;
cRetrieveSeqSeat : USInt := 1;
cRetrieveSeqRest : USInt := 2;
cRetrieveExpress : USInt := 3;
cDummy : USInt := 1;
END_VAR
BEGIN
//Prüft Einstellwert
IF (#stInOutData.Config.nCapacitySet > #stInOutData.Config.nCapacityMax) OR (#stInOutData.Config.nCapacitySet <= 0) THEN
#stInOutData.Config.nCapacitySet := #stInOutData.Config.nCapacityMax;
END_IF;
//Init
#stOutCarrierStatsStandard.nEmptyCarrier := 0;
#stOutCarrierStatsStandard.nLoadedCarrier := 0;
#stOutCarrierStatsStandard.nDummyCarrier := 0;
#stOutCarrierStatsAdv.nDest111 := 0;
#stOutCarrierStatsAdv.nDest112 := 0;
#stOutCarrierStatsAdv.nDest113 := 0;
#stOutCarrierStatsAdv.nDest114 := 0;
#stOutCarrierStatsAdv.nDest121 := 0;
#stOutCarrierStatsAdv.nDest122 := 0;
#stOutCarrierStatsAdv.nDest123 := 0;
#stOutCarrierStatsAdv.nDest124 := 0;
#stOutCarrierStatsAdv.nDest131 := 0;
#stOutCarrierStatsAdv.nDest132 := 0;
#stOutCarrierStatsAdv.nDest133 := 0;
#stOutCarrierStatsAdv.nDest134 := 0;
//Ermittelt den Status/Füllstand des Staubereichs
#nArrayMax := DINT_TO_INT(UPPER_BOUND(ARR := #arInOutJamCarrier, DIM := 1));
IF NOT #arInOutJamCarrier[1].bStatus.%X0 THEN //Wenn 1. Teil leer, dann muss Schleife nicht ausgeführt werden
#stInOutData.Status.nCount := 0;
#stInOutData.Status.bByte.%X0 := TRUE;
//Jam ist leer
#stOutCarrierStatsStandard.nEmptyCarrier := 0;
#stOutCarrierStatsStandard.nLoadedCarrier := 0;
#stOutCarrierStatsStandard.nDummyCarrier := 0;
#stOutCarrierStatsAdv.nDest111 := 0;
#stOutCarrierStatsAdv.nDest112 := 0;
#stOutCarrierStatsAdv.nDest113 := 0;
#stOutCarrierStatsAdv.nDest114 := 0;
#stOutCarrierStatsAdv.nDest121 := 0;
#stOutCarrierStatsAdv.nDest122 := 0;
#stOutCarrierStatsAdv.nDest123 := 0;
#stOutCarrierStatsAdv.nDest124 := 0;
#stOutCarrierStatsAdv.nDest131 := 0;
#stOutCarrierStatsAdv.nDest132 := 0;
#stOutCarrierStatsAdv.nDest133 := 0;
#stOutCarrierStatsAdv.nDest134 := 0;
#stOutCarrierStatsAdv.nDestAMRLoaded := 0;
#stOutCarrierStatsAdv.nDestF2HLoaded := 0;
#stOutCarrierStatsAdv.nDestF2HEmpty := 0;
#stOutCarrierStatsAdv.nDestInboundEmpty := 0;
#stOutCarrierStatsAdv.nDest11x := 0;
#stOutCarrierStatsAdv.nDest12x := 0;
#stOutCarrierStatsAdv.nDest13x := 0;
//****Für Statistics muss dies auskommentiert werden
// ELSIF #arInOutJamCarrier[#nArrayMax].xOnline THEN //Wenn letztes Teil belegt, dann muss Schleife nicht ausgeführt werden
// #stInOutData.Status.nCount := #nArrayMax;
// #stInOutData.Status.xEmpty := FALSE;
//*****
ELSE
FOR #nIdx := 1 TO #nArrayMax DO
//Statistics - nur wenn etwas vorhanden, ansonsten nicht machen
IF #arInOutJamCarrier[#nIdx].nBarcode <> 0 THEN
//Statistics Standard
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND NOT #arInOutJamCarrier[#nIdx].bStatus.%X1 AND #arInOutJamCarrier[#nIdx].nBarcode <> #cDummy THEN
#stOutCarrierStatsStandard.nEmptyCarrier += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].bStatus.%X1 AND #arInOutJamCarrier[#nIdx].nBarcode <> #cDummy THEN
#stOutCarrierStatsStandard.nLoadedCarrier += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nBarcode = #cDummy THEN
#stOutCarrierStatsStandard.nDummyCarrier += 1;
END_IF;
// Statistics Advanced (Bereichsbezogen)
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest11100" THEN
#stOutCarrierStatsAdv.nDest111 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest11200" THEN
#stOutCarrierStatsAdv.nDest112 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest11300" THEN
#stOutCarrierStatsAdv.nDest113 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest11400" THEN
#stOutCarrierStatsAdv.nDest114 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest12100" THEN
#stOutCarrierStatsAdv.nDest121 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest12200" THEN
#stOutCarrierStatsAdv.nDest122 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest12300" THEN
#stOutCarrierStatsAdv.nDest123 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest12400" THEN
#stOutCarrierStatsAdv.nDest124 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest13100" THEN
#stOutCarrierStatsAdv.nDest131 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest13200" THEN
#stOutCarrierStatsAdv.nDest132 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest13300" THEN
#stOutCarrierStatsAdv.nDest133 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDest13400" THEN
#stOutCarrierStatsAdv.nDest134 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestAMRLoaded" THEN
#stOutCarrierStatsAdv.nDestAMRLoaded += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestF2HLoaded" THEN
#stOutCarrierStatsAdv.nDestF2HLoaded += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestF2HEmpty" THEN
#stOutCarrierStatsAdv.nDestF2HEmpty += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestInboundEmpty" THEN
#stOutCarrierStatsAdv.nDestInboundEmpty += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestLvl1B1" THEN
#stOutCarrierStatsAdv.nDest11x += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestLvl1B2" THEN
#stOutCarrierStatsAdv.nDest12x += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestLvl1B3" THEN
#stOutCarrierStatsAdv.nDest13x += 1;
END_IF;
END_IF;
IF #arInOutJamCarrier[#nIdx].nBarcode = 0 THEN //Zählt nicht die Teile sondern merkt sich die Positionen wo ein Teil vorhanden ist (minus 1)
#stInOutData.Status.nCount := INT_TO_UINT(#nIdx - 1);
#stInOutData.Status.bByte.%X0 := FALSE;
EXIT;
//****Für Statistics würde dies benötigt werden
ELSIF #nIdx = #nArrayMax THEN
#stInOutData.Status.nCount := INT_TO_UINT(#nArrayMax);
#stInOutData.Status.bByte.%X0 := FALSE;
EXIT;
//******
END_IF;
END_FOR;
END_IF;
END_FUNCTION
@@ -0,0 +1,137 @@
FUNCTION "FC_StorageLines" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInDest : Int; // allgemeine Destination für diese Section
END_VAR
VAR_OUTPUT
nOutStorageLevel : Int; // Gesamt-Füllstand
stOutCarrStats : "CarrierStatisticsStore";
END_VAR
VAR_IN_OUT
arInOutStorage : Array[*] of "stStorageLine";
END_VAR
VAR_TEMP
nIdx1 : Int;
nIdx2 : Int;
nArrayMax : Int;
nDestMin : Int; // Ziele kleiner gehören raus
nDestMax : Int; // Ziele größer gehören raus
END_VAR
VAR CONSTANT
cDummy : USInt := 1;
END_VAR
BEGIN
//Durchsucht die Lagerlinien um den Status/Füllstand zu ermitteln und gibt dabei Statistikwerte aus
#stOutCarrStats.nEmptyCarrier := 0;
#stOutCarrStats.nDummy := 0;
#stOutCarrStats.stRdyToLeave.nCount := 0;
REGION Arraygrenze ermitteln
#nArrayMax := DINT_TO_USINT(UPPER_BOUND(ARR := #arInOutStorage, DIM := 1)); // get array size
#nDestMin := #nInDest;
#nDestMax := #nInDest + #nArrayMax;
END_REGION
REGION Lager durchsuchen
FOR #nIdx1 := 1 TO #nArrayMax DO
//Prüft Einstellwert
IF (#arInOutStorage[#nIdx1].stData.Config.nCapacitySet > #arInOutStorage[#nIdx1].stData.Config.nCapacityMax) OR (#arInOutStorage[#nIdx1].stData.Config.nCapacitySet < 0) THEN //"kleiner gleich" zu "kleiner" gemacht, Embi
#arInOutStorage[#nIdx1].stData.Config.nCapacitySet := #arInOutStorage[#nIdx1].stData.Config.nCapacityMax;
END_IF;
FOR #nIdx2 := 1 TO "cNoPositions" DO
IF #nIdx2 = "cNoPositions" THEN
REGION Linienende erreicht
IF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode <> 0 THEN //Zählt nicht die Teile sondern merkt sich die Positionen wo ein Teil vorhanden ist
#arInOutStorage[#nIdx1].stData.Status.nCount := #nIdx2;
#arInOutStorage[#nIdx1].stData.Status.bByte.%X0 := FALSE;
REGION Werte für Statistik ermitteln
IF NOT #arInOutStorage[#nIdx1].arCarrier[#nIdx2].bStatus.%X1 AND #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode <> #cDummy THEN
#stOutCarrStats.nEmptyCarrier += 1;
END_IF;
IF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode = #cDummy THEN
#stOutCarrStats.nDummy += 1;
END_IF;
IF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nDestination < #nDestMin OR #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nDestination > #nDestMax THEN
#stOutCarrStats.stRdyToLeave.nCount += 1;
#stOutCarrStats.stRdyToLeave.nLine := #nIdx1;
#stOutCarrStats.stRdyToLeave.nPos := #nIdx2;
END_IF;
END_REGION
EXIT;
ELSIF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode = 0 THEN //Verlässt Schleife nach letztem gefundenen Teil um nicht die Schleife für leere Plätze auszuführen
REGION Leer
#arInOutStorage[#nIdx1].stData.Status.nCount := 0;
#arInOutStorage[#nIdx1].stData.Status.bByte.%X0 := TRUE;
EXIT;
END_REGION
END_IF;
END_REGION
ELSIF #nIdx2 < "cNoPositions" THEN
IF (#arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode <> 0 AND #arInOutStorage[#nIdx1].arCarrier[#nIdx2 + 1].nBarcode = 0) THEN //Zählt nicht die Teile sondern merkt sich die Positionen wo ein Teil vorhanden ist
REGION Letzter Carrier erreicht
#arInOutStorage[#nIdx1].stData.Status.nCount := #nIdx2;
#arInOutStorage[#nIdx1].stData.Status.bByte.%X0 := FALSE;
REGION Werte für Statistik ermitteln
IF NOT #arInOutStorage[#nIdx1].arCarrier[#nIdx2].bStatus.%X1 AND #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode <> #cDummy THEN
#stOutCarrStats.nEmptyCarrier += 1;
END_IF;
IF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode = #cDummy THEN
#stOutCarrStats.nDummy += 1;
END_IF;
IF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nDestination < #nDestMin OR #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nDestination > #nDestMax THEN
#stOutCarrStats.stRdyToLeave.nCount += 1;
#stOutCarrStats.stRdyToLeave.nLine := #nIdx1;
#stOutCarrStats.stRdyToLeave.nPos := #nIdx2;
END_IF;
END_REGION
EXIT;
END_REGION
ELSIF (#arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode = 0) THEN //Verlässt Schleife nach letztem gefundenen Teil um nicht die Schleife für leere Plätze auszuführen
REGION Leer
#arInOutStorage[#nIdx1].stData.Status.nCount := 0;
#arInOutStorage[#nIdx1].stData.Status.bByte.%X0 := TRUE;
EXIT;
END_REGION
END_IF;
ELSE
REGION Suchlauf
REGION Werte für Statistik ermitteln
IF NOT #arInOutStorage[#nIdx1].arCarrier[#nIdx2].bStatus.%X1 AND #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode <> #cDummy THEN
#stOutCarrStats.nEmptyCarrier += 1;
END_IF;
IF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nBarcode = #cDummy THEN
#stOutCarrStats.nDummy += 1;
END_IF;
IF #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nDestination < #nDestMin OR #arInOutStorage[#nIdx1].arCarrier[#nIdx2].nDestination > #nDestMax THEN
#stOutCarrStats.stRdyToLeave.nCount += 1;
#stOutCarrStats.stRdyToLeave.nLine := #nIdx1;
#stOutCarrStats.stRdyToLeave.nPos := #nIdx2;
END_IF;
END_REGION
END_REGION
END_IF;
END_FOR;
END_FOR;
END_REGION
REGION Gesamtfüllstand
//Zählt die einzelnen Füllstände zusammen
#nIdx2 := 0;
FOR #nIdx1 := 1 TO #nArrayMax DO
#nIdx2 := #nIdx2 + #arInOutStorage[#nIdx1].stData.Status.nCount
;
END_FOR;
#nOutStorageLevel := #nIdx2;
END_REGION
END_FUNCTION