dritte Steuerung hinzugefügt
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user