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