restliche hinzugefügt

This commit is contained in:
2026-06-23 10:21:32 +02:00
parent f384644167
commit 216f930e9a
1170 changed files with 583567 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,116 @@
FUNCTION "FC_Jam" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_OUTPUT
stOutCarrierStatsStandard : "CarrierStatisticsStandard";
stOutCarrierStatsAdv : "CarrierStatisticsAMR";
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.nDestMPS1 := 0;
#stOutCarrierStatsAdv.nDestMPS2 := 0;
#stOutCarrierStatsAdv.nDestMPS3 := 0;
#stOutCarrierStatsAdv.nDestRecirce := 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;
//Statistik - Jam leer
#stOutCarrierStatsStandard.nEmptyCarrier := 0;
#stOutCarrierStatsStandard.nLoadedCarrier := 0;
#stOutCarrierStatsStandard.nDummyCarrier := 0;
#stOutCarrierStatsAdv.nDestMPS1 := 0;
#stOutCarrierStatsAdv.nDestMPS2 := 0;
#stOutCarrierStatsAdv.nDestMPS3 := 0;
#stOutCarrierStatsAdv.nDestRecirce := 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 = "cDestMps1" THEN
#stOutCarrierStatsAdv.nDestMPS1 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestMps2" THEN
#stOutCarrierStatsAdv.nDestMPS2 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestMps3" THEN
#stOutCarrierStatsAdv.nDestMPS3 += 1;
END_IF;
IF #arInOutJamCarrier[#nIdx].bStatus.%X0 AND #arInOutJamCarrier[#nIdx].nDestination = "cDestRecirc" THEN
#stOutCarrierStatsAdv.nDestRecirce += 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 : USInt;
nIdx2 : USInt;
nArrayMax : USInt;
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
#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
@@ -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,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