ILSLib hinzugefügt
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: d73846b1-6cd6-414c-ac23-6600e2c98ae1
|
||||
Comment:
|
||||
de-DE: initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.8
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Änderung im unterlagerten Baustein
|
||||
@@ -0,0 +1,23 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_STRO_Sep.scl
|
||||
Hash: ClpGJAP0rCePPppOePfUPWKhtBF5jadrRtG4uqH1LqQ=
|
||||
LibraryMetaFileHash: bMOFh4gjS1nJGgij/mqFtWyO0w1x3qlbe7js1JoclZA=
|
||||
LibraryVersion:
|
||||
Guid: 456c4cee-f3c8-4642-aa97-cf33a9152512
|
||||
DependsOn:
|
||||
- TypeName: UDT_HMI_Separator
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: IntfSeparator
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,644 @@
|
||||
FUNCTION_BLOCK "FB_ILS_STRO_Sep"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInConveyorRun : Bool; // Antrieb läuft
|
||||
stInTrolley : "UDT_Sensor"; // Separator In-Sensor
|
||||
xInReceiveReady : Bool; // Freigabe
|
||||
xInErrQuit : Bool; // Fehler quittieren
|
||||
xInReset : Bool; // Baustein rücksetzen
|
||||
xInPinSort : Bool := false; // Sep für das Einsortieren am Pinband
|
||||
stInSettings : "SettingsSeparator";
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
stOutMainTro : "IntfSeparator"; // Interface für MainTro
|
||||
xOutConveyorRequest : Bool;
|
||||
xOutTrolleyRequest : Bool;
|
||||
xOutTrolleyInSep : Bool;
|
||||
xOutTrolleyReleasedEdge : Bool; // Flanke bei neuen Trolley am Ausgang
|
||||
xOutStopper : Bool;
|
||||
wOutErrorWord : Word;
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutMainState : "UDT_MainState";
|
||||
stInOutHMI : "UDT_HMI_Separator"; // HMI Schnittstelle
|
||||
stInOutCarrDataInJam : Array[*] of "stCarrier";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbStateManager : "FB_StateManager";
|
||||
stCarrierDummy { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "stCarrier";
|
||||
tOnHandling {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tOnTrailing {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tOnMonitoring {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
CountCarr {InstructionName := 'CTU_UDINT'; LibVersion := '1.0'} : CTU_UDINT;
|
||||
END_VAR
|
||||
VAR
|
||||
rTrigCount {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
nArrayMax : Int;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
nState : Int;
|
||||
END_VAR
|
||||
VAR
|
||||
nLastStep { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
|
||||
arStepHistory : Array[0..10] of Struct
|
||||
StepNum : Int;
|
||||
TimeStamp {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
|
||||
END_STRUCT;
|
||||
fbMonitoringCarrStuck : "FB_Monitoring"; // Carrier verlässt Separator nicht
|
||||
fbMonitoringCarrMismatch : "FB_Monitoring"; // Separator Sensorik unplausibel (z.B. Part-Sensor ohne In-Sensor)
|
||||
wErrorWord : Word;
|
||||
stSimuSeparator : Struct
|
||||
nState : Int;
|
||||
xSensor : Bool;
|
||||
END_STRUCT;
|
||||
stSimuSensor : "UDT_Sensor";
|
||||
xCorrectionDone : Bool; // Einmal probieren
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
t_Status : Int;
|
||||
t_Handling : Bool;
|
||||
t_Trailing : Bool;
|
||||
t_Monitoring : Bool;
|
||||
tmpActUnivTon : Bool;
|
||||
nCount : UDInt;
|
||||
tmpCarrierEmpty : "stCarrier";
|
||||
tTrolley : "UDT_Sensor";
|
||||
END_VAR
|
||||
|
||||
VAR CONSTANT
|
||||
c000_StepInit : Int := 0; // Init
|
||||
c100_StepWaitForTrolley : Int := 100; // Warte auf Trolley
|
||||
c110_StepWaitForRelease : Int := 110; // Warte auf Freigabe
|
||||
c120_StepOpen : Int := 120; // Separator öffnen
|
||||
c130_StepWaitForLeave : Int := 130; // Warte auf Trolley verlassen
|
||||
c140_StepClose1 : Int := 140; // Separator schliessen
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
// Prinzip: Unabhängig von Single Carrier oder Minitrolley -> Einzelachse am Separator takten
|
||||
// Separator übernimmt nur die simple Funktion eines Separator-Moduls (In-Sensor, Stopper Auf, Stopper Zu)
|
||||
// Alle anderen Überprüfungen (z.B. Zappler, Scanner) werden vom MainTro übernommen
|
||||
|
||||
#nArrayMax := DINT_TO_INT(UPPER_BOUND(ARR := #stInOutCarrDataInJam, DIM := 1));
|
||||
|
||||
REGION Info
|
||||
(*Errors
|
||||
#wOutErrorWord.%X0 Step failure
|
||||
#wOutErrorWord.%X1 Carrier stuck
|
||||
#wOutErrorWord.%X2 Carrier mismatch
|
||||
#wOutErrorWord.%X3 Carrier not arriving
|
||||
#wOutErrorWord.%X4 Motor not running
|
||||
#wOutErrorWord.%X5 res5
|
||||
#wOutErrorWord.%X6 res6
|
||||
#wOutErrorWord.%X7 res7
|
||||
#wOutErrorWord.%X8 res8
|
||||
#wOutErrorWord.%X9 res9
|
||||
#wOutErrorWord.%X10 res10
|
||||
#wOutErrorWord.%X11 res11
|
||||
#wOutErrorWord.%X12 res12
|
||||
#wOutErrorWord.%X13 res13
|
||||
#wOutErrorWord.%X14 res14
|
||||
#wOutErrorWord.%X15 Modul reset
|
||||
*)
|
||||
END_REGION
|
||||
|
||||
REGION MT Separator Simu
|
||||
//Simuliert Ablauf für Minitrolley (Sensorverhalten mit Timern nachgebildet)
|
||||
IF #stInSettings.stSimu.xActive THEN
|
||||
IF NOT #stInOutCarrDataInJam[1].bStatus.%X0 THEN
|
||||
#stSimuSeparator.nState := 100;
|
||||
END_IF;
|
||||
|
||||
CASE #stSimuSeparator.nState OF
|
||||
100: //INIT / STANDBY
|
||||
#stSimuSeparator.xSensor := FALSE;
|
||||
IF #stInOutCarrDataInJam[1].bStatus.%X0
|
||||
// AND #stInOutCarrDataInJam[1].nSimuPos = #stInSettings.stSimu.stJamConfig.nMaxPos
|
||||
AND (#stOutMainTro.nStatus = "SepState_WaitForBt" OR #stOutMainTro.nStatus = "SepState_WaitForReq")
|
||||
THEN
|
||||
#stSimuSeparator.nState := 200;
|
||||
END_IF;
|
||||
200: // First MT
|
||||
#stSimuSeparator.xSensor := TRUE;
|
||||
IF #stOutMainTro.nStatus = "SepState_Open" THEN
|
||||
#tmpActUnivTon := TRUE;
|
||||
IF #fbStateManager.tOutUnivTonR > #stInSettings.stSimu.tSenTime THEN
|
||||
#stSimuSeparator.xSensor := FALSE;
|
||||
#stSimuSeparator.nState := 300;
|
||||
END_IF;
|
||||
END_IF;
|
||||
300:
|
||||
IF #stOutMainTro.nStatus = "SepState_WaitForSecondLeg" THEN
|
||||
#stSimuSeparator.nState := 400;
|
||||
END_IF;
|
||||
400:
|
||||
#stSimuSeparator.xSensor := TRUE;
|
||||
IF #stOutMainTro.nStatus = "SepState_OpenSecond" THEN
|
||||
#tmpActUnivTon := TRUE;
|
||||
IF #fbStateManager.tOutUnivTonR > #stInSettings.stSimu.tSenTime THEN
|
||||
#stSimuSeparator.xSensor := FALSE;
|
||||
#stSimuSeparator.nState := 100;
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_CASE;
|
||||
|
||||
END_IF;
|
||||
REGION Sensor Simu
|
||||
// #fbSimuSensorInput(sInName := #stInTrolley.sName,
|
||||
// xInSensor := #stSimuSeparator.xSensor,
|
||||
// stInOutSensor := #stSimuSensor,
|
||||
// stInOutHMI:= #stInOutHMI.
|
||||
// stInOutControlUnitCabinet:=#stInOutMainState);
|
||||
END_REGION
|
||||
|
||||
REGION State Manager Simu
|
||||
(* #fbStateManager.stInSettings.nStartState := 0;
|
||||
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
|
||||
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
|
||||
#fbStateManager(xInFunctionEnabled := TRUE,
|
||||
xInRunUnivTOn := #tmpActUnivTon,
|
||||
nInOutState := #stSimuSeparator.#nState); *)
|
||||
END_REGION
|
||||
END_REGION
|
||||
|
||||
REGION Sensor Simu
|
||||
IF #stInSettings.stSimu.xActive THEN
|
||||
#tTrolley := #stSimuSensor;
|
||||
ELSE
|
||||
#tTrolley := #stInTrolley;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION ErrorQuitt
|
||||
IF #xInErrQuit THEN
|
||||
#wErrorWord := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Reset
|
||||
IF #xInReset THEN
|
||||
#nState := 000; // Setz alles auf 0
|
||||
#wErrorWord.%X15 := true; // warning, modul reset
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
|
||||
REGION Step sequence
|
||||
CASE #nState OF
|
||||
#c000_StepInit:
|
||||
REGION Step 000 - init
|
||||
//akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Init";
|
||||
//Outputs
|
||||
#xOutStopper := FALSE; //Separator zu
|
||||
#xOutTrolleyReleasedEdge := FALSE; //Datenübergabe rücksetzen
|
||||
#xOutConveyorRequest := FALSE; // Förderer Anforderung rücksetzen
|
||||
#xOutTrolleyRequest := FALSE; // Trolley Anforderung rücksetzen
|
||||
#xOutTrolleyInSep := FALSE; // Trolley im Separator rücksetzen
|
||||
|
||||
// SCHRITT 0 NICHT ENTFERNEN!
|
||||
// STATE MANAGER MACHT DEN SCHRITTWECHSEL!
|
||||
|
||||
END_REGION
|
||||
#c100_StepWaitForTrolley:
|
||||
REGION Step 100 - wait for trolley
|
||||
//akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForBt"; // TODO
|
||||
|
||||
#xOutStopper := FALSE; // Separator zu
|
||||
#xOutTrolleyReleasedEdge := FALSE; // Datenübergabe rücksetzen
|
||||
#xOutConveyorRequest := FALSE; // Förderer Anforderung rücksetzen
|
||||
#xOutTrolleyRequest := TRUE; // Trolley Anforderung
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
|
||||
IF #tTrolley.xDirectSensor THEN // Trolley im Separator
|
||||
#nState := #c110_StepWaitForRelease; // Schrittwechsel
|
||||
END_IF;
|
||||
END_REGION
|
||||
#c110_StepWaitForRelease:
|
||||
REGION Step 110 - wait release request
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForReq";
|
||||
// Outputs
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#xOutTrolleyRequest := FALSE;
|
||||
#xOutTrolleyInSep := (#xInPinSort AND #tTrolley.xDirectSensor) OR (NOT #xInPinSort AND #tTrolley.xDbncdSensor);
|
||||
#xOutConveyorRequest := #xInReceiveReady AND NOT #stInOutHMI.stControl.xLockSeparator; //Bedingung von Außen erfüllt -> Conv anfordern
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
//Transition
|
||||
|
||||
IF #xInConveyorRun AND #xInReceiveReady AND #tTrolley.xDbncdSensor AND NOT #stInOutHMI.stControl.xLockSeparator THEN
|
||||
#nState := #c120_StepOpen;
|
||||
ELSIF NOT #tTrolley.xDirectSensor THEN
|
||||
#nState := #c100_StepWaitForTrolley;
|
||||
END_IF;
|
||||
|
||||
(* //Transition
|
||||
//Separator Pinband
|
||||
IF #xInPinSort AND #xInConveyorRun AND NOT #xInScanDone AND #fbStateManager.tOutTimeInStep > T#80ms AND
|
||||
#tTrolley.xDirectSensor THEN
|
||||
#nState := #cStepOpen1;
|
||||
// ELSIF #xInPinSort AND #xInConveyorRun AND #xInScanWrongLeg AND
|
||||
// #tTrolley.xDirectSensor THEN
|
||||
// #nState := #cStepOpen2Correction";
|
||||
//Normal
|
||||
ELSIF (#xInConveyorRun AND
|
||||
((#xInPluggedScan AND #xInScanDone) OR NOT #xInPluggedScan) AND
|
||||
((#xInPluggedZappl AND #xInZappl) OR NOT #xInPluggedZappl) AND
|
||||
#xInReceiveReady AND
|
||||
|
||||
((#tTrolley.xDbncdSensor AND NOT #xInPluggedScan) OR
|
||||
(#tTrolley.xDirectSensor AND #xInPluggedScan)) AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen1;
|
||||
//Fehlerhafte Lesung erkannt
|
||||
ELSIF (#xInConveyorRun AND
|
||||
#xInPluggedScan AND #xInScanWrongLeg AND
|
||||
#xInReceiveReady AND
|
||||
#tTrolley.xDirectSensor AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen2Correction;
|
||||
// ??????????????????????????????? Kein Receive?!
|
||||
(* ELSIF (NOT #xInPluggedScan AND
|
||||
NOT #xInPluggedZappl AND
|
||||
#tTrolley.xDbncdSensor AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen1; *)
|
||||
// Trolley nicht mehr da
|
||||
ELSIF NOT #tTrolley.xDirectSensor THEN
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF; *)
|
||||
END_REGION
|
||||
|
||||
#c120_StepOpen:
|
||||
REGION Step 120 - separator open
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Open";
|
||||
|
||||
//Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
|
||||
//Überwachung
|
||||
#t_Monitoring := #xInConveyorRun;
|
||||
IF #tOnMonitoring.Q THEN
|
||||
#wOutErrorWord.%X1 := TRUE; // err trolley stuck
|
||||
END_IF;
|
||||
|
||||
// Transition
|
||||
IF NOT #tTrolley.xDbncdSensor THEN
|
||||
#nState := #c130_StepWaitForLeave;
|
||||
ELSIF #tOnMonitoring.Q AND #stInSettings.xStuckCorrection AND NOT #xCorrectionDone THEN
|
||||
#nState := 121;
|
||||
END_IF;
|
||||
|
||||
(* //Transition
|
||||
//Korrektur
|
||||
IF #xInPinSort AND #xInScanWrongLeg THEN
|
||||
#nState := #cStepOpen2Correction;
|
||||
//Mit Scanner
|
||||
ELSIF #xInPluggedScan AND NOT #tTrolley.xDirectSensor THEN
|
||||
(* #xInConveyorRun AND *) // motor on?
|
||||
#xOutStopper := FALSE;
|
||||
#nState := #cStepWaitForRelease2;
|
||||
#xOutFirstLegReleasedEdge := TRUE;
|
||||
// Ohne Scanner
|
||||
ELSIF NOT #xInPluggedScan AND
|
||||
NOT #tTrolley.xDbncdSensor // trolley running out?
|
||||
THEN
|
||||
#nState := #cStepWaitForLeave1;
|
||||
END_IF; *)
|
||||
END_REGION
|
||||
|
||||
121:
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Open";
|
||||
|
||||
//Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := FALSE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
|
||||
#xCorrectionDone := TRUE;
|
||||
|
||||
IF #fbStateManager.tOutTimeInStep > t#500ms THEN
|
||||
#nState := #c120_StepOpen;
|
||||
END_IF;
|
||||
#c130_StepWaitForLeave:
|
||||
REGION Step 130 - wait trolley exit
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForLeaveFirst";
|
||||
|
||||
//Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#t_Trailing := #xInConveyorRun AND NOT #tTrolley.xDirectSensor; // Zeit neu aufziehen wenn Sensor frei wird
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
// Transition
|
||||
IF #tOnTrailing.Q THEN
|
||||
#nState := #c140_StepClose1;
|
||||
#xOutTrolleyReleasedEdge := TRUE;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#c140_StepClose1:
|
||||
REGION Step 140 - separator close
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Finish";
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
//Outputs
|
||||
#xOutTrolleyReleasedEdge := FALSE; // Datenübergabe
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#t_Handling := #xInConveyorRun;
|
||||
|
||||
//Transition
|
||||
#nState := #c100_StepWaitForTrolley;
|
||||
|
||||
END_REGION
|
||||
(* #cStepWaitForTrolley2:
|
||||
REGION Step 200 - wait for trolley second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForSecondLeg";
|
||||
|
||||
//Outputs
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#xOutTrolleyReleasedEdge := FALSE; // Datenübergabe
|
||||
#xOutFirstLegReleasedEdge := FALSE;
|
||||
#xOutConveyorRequest := FALSE; //
|
||||
#xOutTrolleyRequest := TRUE;
|
||||
#xOutTrolleyScanRdy := FALSE;
|
||||
|
||||
// Transition
|
||||
// MT 2.Bein kommt nicht..
|
||||
IF #fbStateManager.tOutTimeInStep > T#3s AND #xInConveyorRun AND
|
||||
NOT #xInPluggedScan THEN
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF;
|
||||
|
||||
//Normal
|
||||
IF
|
||||
#tTrolley.xDirectSensor // Trolley im Separator
|
||||
THEN
|
||||
#nState := #cStepWaitForRelease2;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepWaitForRelease2:
|
||||
REGION Step 210 - wait release request second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForReqSecond";
|
||||
|
||||
//Outputs
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#xOutTrolleyRequest := FALSE;
|
||||
#xOutTrolleyInSep := (#xInPinSort AND #tTrolley.xDirectSensor) OR (NOT #xInPinSort AND #tTrolley.xDbncdSensor);
|
||||
#xOutConveyorRequest := #xInReceiveReady AND NOT #stInOutHMI.stControl.xLockSeparator; //Bedingung von Außen erfüllt -> Conv anfordern
|
||||
#xOutTrolleyScanRdy := #xInPluggedScan (* AND #xInScanDone *);
|
||||
|
||||
//Transition
|
||||
|
||||
// IF (#xInConveyorRun AND
|
||||
// ((#xInPinSort AND #xInScanWrongLeg) OR (#xInPinSort AND #xInScanDone)) AND
|
||||
// ((#xInPluggedZappl AND #xInZappl) OR NOT #xInPluggedZappl) AND
|
||||
// #xInReceiveReady AND
|
||||
|
||||
// ((#tTrolley.xDbncdSensor AND NOT #xInPluggedScan) OR
|
||||
// (#tTrolley.xDirectSensor AND #xInPluggedScan)) AND //Freigabe
|
||||
|
||||
// NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
// OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
// THEN
|
||||
// #nState := #cStepOpen2Correction;
|
||||
IF (#xInConveyorRun AND
|
||||
((#xInPluggedScan (* AND #xInScanDone *)) OR NOT #xInPluggedScan) AND
|
||||
((#xInPluggedZappl AND #xInZappl) OR NOT #xInPluggedZappl) AND
|
||||
#xInReceiveReady AND
|
||||
|
||||
((#tTrolley.xDbncdSensor AND NOT #xInPluggedScan) OR
|
||||
(#tTrolley.xDirectSensor AND #xInPluggedScan)) AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen2;
|
||||
ELSIF NOT #tTrolley.xDirectSensor THEN
|
||||
#nState := #cStepWaitForTrolley2;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepOpen2:
|
||||
REGION Step 220 - separator open second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_OpenSecond";
|
||||
|
||||
// Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
#xOutTrolleyScanRdy := FALSE;
|
||||
|
||||
#t_Monitoring := #xInConveyorRun;
|
||||
IF #tOnMonitoring.Q THEN
|
||||
#wErrorWord.%X1 := TRUE; // err trolley stuck
|
||||
END_IF;
|
||||
|
||||
// Transition
|
||||
// Mit Scanner
|
||||
IF #xInPluggedScan AND NOT #tTrolley.xDirectSensor THEN
|
||||
#xOutStopper := FALSE;
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
#xOutTrolleyReleasedEdge := TRUE; // Datenübergabe
|
||||
// Ohne Scanner
|
||||
ELSIF NOT #xInPluggedScan AND
|
||||
(* #xInConveyorRun AND *) // monor on?
|
||||
NOT #tTrolley.xDbncdSensor // trolley running out?
|
||||
THEN
|
||||
#nState := #cStepWaitForLeave2;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepOpen2Correction:
|
||||
REGION Step 225 - separator open second without Data
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_OpenSecondCorrection";
|
||||
|
||||
// Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
#xOutTrolleyScanRdy := FALSE;
|
||||
|
||||
#t_Monitoring := #xInConveyorRun;
|
||||
IF #tOnMonitoring.Q THEN
|
||||
#wErrorWord.%X1 := TRUE; // err trolley stuck
|
||||
END_IF;
|
||||
|
||||
// Transition
|
||||
IF #xInPluggedScan AND NOT #tTrolley.xDirectSensor THEN
|
||||
#xOutStopper := FALSE;
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepWaitForLeave2:
|
||||
REGION Step 230 - wait trolley exit second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForLeaveSecond";
|
||||
|
||||
// Output
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#t_Trailing := TRUE(* #xInConveyorRun *);
|
||||
|
||||
// Transition
|
||||
IF #tOnTrailing.Q THEN //....ansonsten schließe normal nach Trailing-Zeit
|
||||
#nState := #cStepClose2;
|
||||
#xOutTrolleyReleasedEdge := TRUE; // Datenübergabe
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
#cStepClose2:
|
||||
REGION Step 240 - separator close second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Finish";
|
||||
|
||||
// Outputs
|
||||
#xOutTrolleyReleasedEdge := FALSE;
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#t_Handling := TRUE;(* #xInConveyorRun *)
|
||||
|
||||
// Transition
|
||||
//WENN HIER BEARBEITUNGSZEIT EINGEFÜGT WIRD MUSS DER COUNTER UNTEN MIT FLANKE VERSORGT WERDEN
|
||||
IF
|
||||
#tOnHandling.Q
|
||||
THEN
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF;
|
||||
END_REGION *)
|
||||
ELSE
|
||||
#wErrorWord.%X0 := true; // stepp error
|
||||
END_CASE;
|
||||
|
||||
REGION State Manager
|
||||
#fbStateManager.stInSettings.nStartState := #c100_StepWaitForTrolley;
|
||||
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
|
||||
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
|
||||
#fbStateManager(xInFunctionEnabled := TRUE,
|
||||
xInRunUnivTOn := #tmpActUnivTon,
|
||||
nInOutState := #nState);
|
||||
END_REGION
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Counter
|
||||
// #CountCarr(CU:=#nState = 040 AND NOT #xOutStopper,
|
||||
// PV:=1,
|
||||
// CV=>#nCount);
|
||||
END_REGION
|
||||
|
||||
REGION Monitoring
|
||||
REGION Carrier stuck
|
||||
#fbMonitoringCarrStuck.stSettings.nErrorType := 1;
|
||||
#fbMonitoringCarrStuck.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringCarrStuck.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringCarrStuck(sInFctnName := #stInOutHMI.stConfig.sName,
|
||||
sInPrefix := 'Ausfahren Carrier',
|
||||
sInSuffix := #stInOutHMI.stConfig.sName,
|
||||
wInTextListId_Function := 200,
|
||||
wInTextListId_Message := 201,
|
||||
InOutMachineState := #stInOutMainState,
|
||||
xInQuitError := #xInErrQuit OR #stInOutMainState.xQuitError,
|
||||
xInSignal := NOT #tOnMonitoring.Q,
|
||||
sInAlarmMessage := 'Carrier verlaesst Separator nicht');
|
||||
END_REGION
|
||||
|
||||
REGION Carrier Mismatch
|
||||
#fbMonitoringCarrMismatch.stSettings.nErrorType := 1;
|
||||
#fbMonitoringCarrMismatch.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringCarrMismatch.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringCarrMismatch(sInFctnName := #stInOutHMI.stConfig.sName,
|
||||
sInPrefix := 'Carrier Mismatch',
|
||||
InOutMachineState := #stInOutMainState,
|
||||
xInQuitError := #xInErrQuit OR #stInOutMainState.xQuitError,
|
||||
xInSignal := TRUE, //NOT #wOutErrorWord.%X2,
|
||||
sInAlarmMessage := 'Carrier im Separator ist falsch');
|
||||
END_REGION
|
||||
END_REGION
|
||||
|
||||
REGION Timer
|
||||
|
||||
#tOnHandling(IN := #t_Handling,
|
||||
PT := #stInSettings.tHandlingTime);
|
||||
|
||||
#tOnTrailing(IN := #t_Trailing,
|
||||
PT := #stInSettings.tTrailingTime);
|
||||
|
||||
#tOnMonitoring(IN := #t_Monitoring,
|
||||
PT := t#4999ms,
|
||||
Q => #wErrorWord.%X1);
|
||||
END_REGION
|
||||
|
||||
REGION HMI
|
||||
|
||||
#stInOutHMI.InSensor := #tTrolley;
|
||||
|
||||
REGION Status
|
||||
#stInOutHMI.stStatus.nState := #nState;
|
||||
#stInOutHMI.stStatus.xSepStatus := #xOutStopper;
|
||||
|
||||
IF #wErrorWord > 0 THEN // Keine Fehler
|
||||
#stInOutHMI.stStatus.bStatus := 2; // ERROR
|
||||
ELSIF #stInOutHMI.stControl.xLockSeparator OR #stInOutHMI.stControl.xReleaseOverride THEN
|
||||
#stInOutHMI.stStatus.bStatus := 3; // HMI Control aktiv
|
||||
ELSE
|
||||
CASE #nState OF
|
||||
0:
|
||||
#stInOutHMI.stStatus.bStatus := 0; // NOT_AVAILABLE
|
||||
1, 10, 20, 30, 40, 101, 110, 120, 130, 140:
|
||||
#stInOutHMI.stStatus.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutHMI.stStatus.bStatus := 0; // NOT AVAILABLE
|
||||
END_CASE;
|
||||
END_IF;
|
||||
|
||||
#stInOutHMI.stStatus.xBtInSeparator := #tTrolley.xDbncdSensor;
|
||||
#stInOutHMI.stStatus.xError := #wErrorWord > 0;
|
||||
#stInOutHMI.stStatus.Errors.xBtNotLeaving := #wErrorWord.%X1;
|
||||
// #stInOutHMI.stStatus.nCounterBt := #nCount;
|
||||
#stInOutHMI.stStatus.xSepIsLocked := #stInOutHMI.stControl.xLockSeparator;
|
||||
END_REGION
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION MainTRO
|
||||
|
||||
#stOutMainTro.xJamAtEntry := "cTodoFalse";
|
||||
#stOutMainTro.xBtPresent := #tTrolley.xDbncdSensor;
|
||||
#stOutMainTro.xCarouselInRun := #xInConveyorRun;
|
||||
// #stOutMainTro.nCounterBt := 0; TODO
|
||||
|
||||
END_REGION
|
||||
|
||||
|
||||
REGION Outputs
|
||||
#wOutErrorWord := #wErrorWord;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 2b644f30-a3a6-4abb-8b59-ef341fedf9f8
|
||||
Comment:
|
||||
de-DE: initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.3
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Änderung im unterlagerten Baustein
|
||||
@@ -0,0 +1,27 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_STRO_Switch.scl
|
||||
Hash: 9P7RKDDJCB4ecgwkOerVkPhsWbM1ghmNTGB0JOHqz9Y=
|
||||
LibraryMetaFileHash: tW3IwZXtEUOhYe6m3WeSsBHU1VQgvUFATsU5LGcHoMI=
|
||||
LibraryVersion:
|
||||
Guid: 91175451-8c0e-4789-b302-fd2c134e9d15
|
||||
DependsOn:
|
||||
- TypeName: IntfSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: S2MSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_SetAlarmAndLog
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: SettingsSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_UnloadingStation
|
||||
VersionNumber: 0.0.6
|
||||
- TypeName: FC_Uint2TroString
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_usint2String
|
||||
VersionNumber: 2.0.0
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: fdb28b91-85cc-4257-9a7f-4ee21454e413
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.18
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Monitoring, Aufräumen, Kommentieren
|
||||
@@ -0,0 +1,23 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_STRO_Vario.scl
|
||||
Hash: Ll36gRlWS0phSkYkE0m2ct+2Cyo/U78RVe/T2hhXEmE=
|
||||
LibraryMetaFileHash: 5hsMvUxuDSEOmiTQZdE8Ql+qyqi2hW6MyrV+d0jxvZ4=
|
||||
LibraryVersion:
|
||||
Guid: 6dc92fd5-41a8-4cf5-b077-be95aec75ae1
|
||||
DependsOn:
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Vario
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsVario
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: FB_SupervisionRasterSensor
|
||||
VersionNumber: 2.0.2
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,483 @@
|
||||
FUNCTION_BLOCK "FB_ILS_STRO_Vario"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
stInSettings : "SettingsVario"; // Einstellungen Vario
|
||||
xInReleaseEdge : Bool; // Flanke Carrier rausgelassen
|
||||
stInSenConvFingerInPos : "UDT_Sensor"; // Mitnehmerfinger in Position (FingerInPos)
|
||||
stInSenJam : "UDT_Sensor"; // Stausensor nach Vario (Jam)
|
||||
stInSenLastPos : "UDT_Sensor"; // Letzte Position erreicht (Full)
|
||||
stInSenCarrInPos : "UDT_Sensor"; // Carrier in Position (CarrInPos)
|
||||
xInRelease : Bool := false; // Freigabe zum Entleeren
|
||||
xInRequest : Bool; // Anfrage an Vario
|
||||
xInMotorProtection : Bool := false; // Motorschutz
|
||||
xInErrorQuit : Bool; // Fehler quittieren Überwachung Finger
|
||||
xInAutomatic : Bool; // Automatik
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutMotor : Bool := false; // Antrieb raumgängiger Förderer
|
||||
xOutConveyorReady : Bool := false; // Vario bereit
|
||||
xOutConveyorReleaseReq : Bool := false;
|
||||
wOutErrorWord : Word; // Fehler rausgeben
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
arInOutJamFinger : Array[*] of "stCarrier"; // Daten Staubereich auf Vario
|
||||
stInOutHMI : "UDT_Vario"; // HMI Schnittstelle
|
||||
stInOutControlUnitCabinet : "UDT_MainState"; // Main State Schnittstelle
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbStateManager : "FB_StateManager"; // Schrittkette Manager
|
||||
fbFingerControl : "FB_SupervisionRasterSensor"; // Überwachung Finger
|
||||
sStateText : String := ''; // Schritt Text (zum Beobachten)
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
nState : Int := 0; // Schritt
|
||||
nStateLast : Int := 0; // vorheriger Schritt (für State Manager)
|
||||
xRunMotor : Bool := false; // Motor Start
|
||||
xConveyorReady : Bool := false; // Förderer ist bereit
|
||||
tOnAllBtOut {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer: Vario Entleerungsfahrt
|
||||
counterCarrier {InstructionName := 'CTU_INT'; LibVersion := '1.0'} : CTU_INT; // Zum Eintakten von Carriern
|
||||
nCounterCatch : Int := 0; // Zum Eintakten von Carriern
|
||||
END_VAR
|
||||
VAR
|
||||
xErrorBtNotReaching : Bool := false; // NIU
|
||||
tOn_ErrorConv {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // NIU
|
||||
tOn_WaitForStop {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Für Testmodus
|
||||
tOnJamCarrierInPos {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Prüfung: Vario dreht, aber Carrier in Position ist an
|
||||
xSensorError : Bool; // Fehler Carrier in Position Sensor
|
||||
fbMonitoringFinger : "FB_Monitoring"; // Monitoring Finger Überwachung
|
||||
fbMonitoringMotorProtection : "FB_Monitoring"; // Motorschutzüberwachung
|
||||
fbMonitoringCarrierInPos : "FB_Monitoring"; // Überwachung Sensor "CarrInPos"
|
||||
xClearDone : Bool; // Prüffahrt um Finger leer zu fahren abgeschlossen
|
||||
"////////" : Bool; // NIU
|
||||
xTestMode : Bool; // Testmodus aktivieren
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
tmpActUnivTon : Bool; // Siehe State Manager
|
||||
nArrayMaxFinger : DInt; // Array größe
|
||||
END_VAR
|
||||
|
||||
VAR CONSTANT
|
||||
c0000_StepOff : Int := 0; // Aus
|
||||
c0100_StepUndefined : Int := 100; // Undefiniert
|
||||
c0200_StepReceive : Int := 200; // Förderer wartet auf Arbeit / Bereit aufzunehmen
|
||||
c1200_StepWaitTime : Int := 1200; // Förderer wartet vor Fahrt
|
||||
c2000_StepJog : Int := 2000; // Förderer eine Position weiter fahren (Jog Fw)
|
||||
c2200_StepNormalStop : Int := 2200; // Normal anhalten
|
||||
c2250_StepQuickStop : Int := 2250; // Sofort anhalten
|
||||
c2500_StepCheckVario : Int := 2500; // Prüfen ob wirklich leer (NIU)
|
||||
c3000_StepEmptying : Int := 3000; // Förderer entleeren
|
||||
c5000_StepEnding : Int := 5000; // Förderer Ablauf beenden (Positionierung)
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Arraygrößen
|
||||
#nArrayMaxFinger := UPPER_BOUND(ARR := #arInOutJamFinger, DIM := 1);
|
||||
END_REGION
|
||||
|
||||
REGION State Machine
|
||||
// Off
|
||||
// Idle (keine Daten und Prüffahrt abgeschlossen)
|
||||
// Anforderung MTRO / Separator
|
||||
// -> Entleeren
|
||||
// Entleeren (Fahre bis Stau oder keine Daten)
|
||||
// 1. Anforderung MTRO / Separator
|
||||
// -> Entleeren Pausieren
|
||||
// 2. Keine Daten mehr
|
||||
// -> Idle
|
||||
// Entleeren Pausieren
|
||||
//
|
||||
|
||||
CASE #nState OF
|
||||
#c0000_StepOff:
|
||||
REGION 0000: Off
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'OFF';
|
||||
|
||||
// Statics
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c0100_StepUndefined:
|
||||
REGION 0100: Undefined
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'UNDEFINED';
|
||||
|
||||
// Statics
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
#nState := #c0200_StepReceive;
|
||||
END_REGION
|
||||
|
||||
#c0200_StepReceive:
|
||||
REGION 0200: Receive
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'RECEIVE';
|
||||
|
||||
// Statics
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := #xInMotorProtection;
|
||||
|
||||
// Transition
|
||||
//
|
||||
IF #xTestMode OR #stInOutHMI.stControl.xTestMode THEN
|
||||
#xConveyorReady := FALSE;
|
||||
#nState := #c2000_StepJog;
|
||||
ELSE
|
||||
|
||||
IF (#xConveyorReady AND #counterCarrier.QU) OR ((* #arInOutJamFinger[1].bStatus.%X0 AND *)NOT #xInRequest AND NOT #xClearDone AND #fbStateManager.tOutTimeInStep > T#5000ms) THEN
|
||||
#nState := #c1200_StepWaitTime;
|
||||
|
||||
// ELSIF (#arInOutJamFinger[1].stCarrData.xOnline AND NOT #xClearDone AND NOT #xInRequest AND #fbStateManager.tOutTimeInStep > T#5000ms) AND
|
||||
// (NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms) THEN
|
||||
// #nState := #c2500_StepCheckVario;
|
||||
// ELSIF #arInOutJamFinger[1].stCarrData.xOnline AND NOT #xInRequest AND #fbStateManager.tOutTimeInStep > T#5000ms THEN
|
||||
// #nState := #c3000_StepEmptying;
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c1200_StepWaitTime:
|
||||
REGION 1200: Wait
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'WAIT FOR TIMER';
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF #fbStateManager.tOutTimeInStep > #stInSettings.tWaitForJog (* AND NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms *) THEN
|
||||
IF #xInRequest THEN
|
||||
#xClearDone := FALSE;
|
||||
#nState := #c2000_StepJog;
|
||||
ELSIF NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#2s THEN
|
||||
#nState := #c3000_StepEmptying;
|
||||
(* ELSE
|
||||
#nState := #c3000_StepEmptying; *)
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
|
||||
#c2000_StepJog:
|
||||
REGION 2000: Jog
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'JOG';
|
||||
|
||||
// Statics
|
||||
#xRunMotor := TRUE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF #xTestMode OR #stInOutHMI.stControl.xTestMode THEN
|
||||
IF #stInSenConvFingerInPos.xDirectEdgePos THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
END_IF;
|
||||
ELSE
|
||||
IF ((* #fbStateManager.tOutTimeInStep > T#1000ms OR *)#fbFingerControl.xOutErrorRasterSensor) OR (NOT #stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenLastPos.xDirectSensor)
|
||||
OR (#stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay AND #stInSenLastPos.xDirectSensor)
|
||||
THEN
|
||||
#nState := #c2250_StepQuickStop;
|
||||
ELSIF (#stInSenJam.xDirectEdgePos AND NOT #stInSettings.xJamSenDelayActive)
|
||||
OR (#stInSettings.xJamSenDelayActive AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay)
|
||||
THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
ELSIF #stInSenConvFingerInPos.xDirectEdgePos THEN //////EMBI TEST
|
||||
#nState := #c0200_StepReceive;
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c2200_StepNormalStop: //normal anhalten
|
||||
REGION 2200: Normal Stop
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'NORMAL STOP';
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF #xTestMode OR #stInOutHMI.stControl.xTestMode THEN
|
||||
|
||||
IF #tOn_WaitForStop.Q THEN
|
||||
#nState := #c0200_StepReceive;
|
||||
END_IF;
|
||||
|
||||
ELSE
|
||||
|
||||
IF (NOT #stInSenLastPos.xDirectSensor AND #stInSenLastPos.tDirectChangeLast > T#2s AND #stInSenJam.xDbncdSensor) OR
|
||||
(NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms) THEN
|
||||
#nState := #c5000_StepEnding;
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c2250_StepQuickStop:
|
||||
REGION 2250: Quick Stop
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'QUICK STOP';
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF ((NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms) OR
|
||||
(NOT #stInSenLastPos.xDirectSensor AND #stInSenLastPos.tDirectChangeLast > T#3000ms)) AND
|
||||
NOT #fbFingerControl.xOutErrorRasterSensor
|
||||
THEN
|
||||
#nState := #c1200_StepWaitTime;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
#c3000_StepEmptying:
|
||||
REGION 3000: Emptying
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'EMPTYING CONVEYOR';
|
||||
|
||||
// Statics
|
||||
|
||||
#xRunMotor := TRUE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
/////////////////////
|
||||
|
||||
IF (NOT #stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenLastPos.xDirectSensor)
|
||||
OR (#stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay AND #stInSenLastPos.xDirectSensor)
|
||||
THEN
|
||||
#nState := #c2250_StepQuickStop;
|
||||
ELSIF (#stInSenJam.xDirectEdgePos AND NOT #stInSettings.xJamSenDelayActive)
|
||||
OR (#stInSettings.xJamSenDelayActive AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay)
|
||||
THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
ELSIF #xInRequest THEN
|
||||
#xClearDone := FALSE;
|
||||
#nState := #c5000_StepEnding;
|
||||
ELSIF #tOnAllBtOut.Q THEN
|
||||
#xClearDone := TRUE;
|
||||
#nState := #c5000_StepEnding;
|
||||
// ELSIF #tOnAllBtOut.Q THEN // Freigabe zum Entleeren ist wieder/noch da und Carousel-Motor läuft
|
||||
// // Wenn nach einer gewissen Zeit nichts mehr kommt --> Alle Bt draußen --> Kette leer
|
||||
// #nState := #c5000_StepEnding; // Weiter
|
||||
END_IF;
|
||||
///////////////////
|
||||
|
||||
END_REGION
|
||||
|
||||
#c5000_StepEnding:
|
||||
REGION 5000: Ending Step
|
||||
|
||||
(*Dieser Schritt wird nur nach dem Entleeren angesprungen
|
||||
damit sich die Kette zum Schluss noch richtig positioniert*)
|
||||
|
||||
//Aktueller Zustand
|
||||
#sStateText := 'STOPPING CONVEYOR';
|
||||
|
||||
//Statics
|
||||
#xRunMotor := TRUE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
// Transition
|
||||
IF ((* #fbStateManager.tOutTimeInStep > T#1000ms OR *)#fbFingerControl.xOutErrorRasterSensor) OR (NOT #stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenLastPos.xDirectSensor)
|
||||
OR (#stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay AND #stInSenLastPos.xDirectSensor)
|
||||
THEN
|
||||
#xClearDone := FALSE;
|
||||
#nState := #c2250_StepQuickStop;
|
||||
ELSIF #stInSenConvFingerInPos.xDirectEdgePos (*or #fbStateManager.tOutTimeInStep > T#800ms OR *) (* #stInSenLastPos.xDirectEdgePos *)(* #stInSenConvFingerInPos.xDirectSensor *)THEN
|
||||
#nState := #c0200_StepReceive;
|
||||
ELSIF (#stInSenJam.xDirectEdgePos AND NOT #stInSettings.xJamSenDelayActive)
|
||||
// OR (#stInSettings.xJamSenDelayActive AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay)
|
||||
THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
END_CASE;
|
||||
END_REGION
|
||||
|
||||
REGION Timer
|
||||
//Entleerungsfahrt Dauer
|
||||
#tOnAllBtOut(IN := #nState = #c3000_StepEmptying,
|
||||
PT := #stInSettings.tConvEmpty);
|
||||
|
||||
//Wird für Testmodus verwendet, Start Stopp Intervall
|
||||
#tOn_WaitForStop(IN := #nState = #c2200_StepNormalStop,
|
||||
PT := #stInSettings.tWaitForStop);
|
||||
END_REGION
|
||||
|
||||
REGION Carrier zählen
|
||||
#counterCarrier(CU := #xInReleaseEdge,
|
||||
R := #nState > #c0200_StepReceive,
|
||||
PV := #stInSettings.nCountCarrier,
|
||||
CV => #nCounterCatch);
|
||||
END_REGION
|
||||
|
||||
REGION Überwachung Finger
|
||||
|
||||
#fbFingerControl.stInSettings.xInEnableSupervision := TRUE;
|
||||
#fbFingerControl.stInSettings.tInDelayMotorRun := #stInSettings.tRasterDelayMotorRun;
|
||||
#fbFingerControl.stInSettings.tInRasterHigh := #stInSettings.tRasterHigh;
|
||||
#fbFingerControl.stInSettings.tInRasterLow := #stInSettings.tRasterLow;
|
||||
#fbFingerControl.stInSettings.sInConveyorName := #stInOutHMI.stConveyor.sConveyorName;
|
||||
#fbFingerControl(stInSenRaster := #stInSenConvFingerInPos,
|
||||
xInErrorQuit := #xInErrorQuit,
|
||||
xInMotorRun := #xRunMotor);
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Überwachung Carrier in Pos Sensor
|
||||
#tOnJamCarrierInPos(IN := #xRunMotor,
|
||||
PT := t#3600s);
|
||||
|
||||
IF #tOnJamCarrierInPos.ET > T#1s AND #stInSenCarrInPos.xDirectSensor AND #stInSenCarrInPos.tDirectChangeLast > t#3s THEN
|
||||
#xSensorError := TRUE;
|
||||
END_IF;
|
||||
|
||||
IF #xSensorError AND #xInErrorQuit THEN
|
||||
#xSensorError := FALSE;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION StateManager
|
||||
|
||||
#fbStateManager.stInSettings.nStartState := #c0200_StepReceive;
|
||||
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
|
||||
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
|
||||
#fbStateManager(xInFunctionEnabled := ((#xInAutomatic AND #stInOutControlUnitCabinet.xRunning) OR #stInOutHMI.stConveyor.xSemiAuto) AND NOT #stInOutHMI.stConveyor.xDisableConveyor AND NOT #fbFingerControl.xOutErrorRasterSensor AND NOT #xSensorError,
|
||||
xInRunUnivTOn := #tmpActUnivTon,
|
||||
nOutStateLast => #nStateLast,
|
||||
nInOutState := #nState);
|
||||
END_REGION
|
||||
|
||||
REGION Ausgänge
|
||||
|
||||
// Das ist der Motor vom Förderer
|
||||
#xOutMotor := #xRunMotor OR #stInOutHMI.stConveyor.xManual; // Förderer-Motor angefordert und kein Bereichshalt
|
||||
#xOutConveyorReady := #xConveyorReady; //Förderer bereit (aus SK) und kein Bereichshalt Förderer
|
||||
|
||||
//????????????????????????????
|
||||
#xOutConveyorReleaseReq := #nState = #c3000_StepEmptying OR #nState = #c1200_StepWaitTime;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Visu
|
||||
|
||||
#stInOutHMI.stConveyor.nType := 7; // Vario
|
||||
|
||||
#stInOutHMI.stConveyor.nState := #nState;
|
||||
#stInOutHMI.stConveyor.sStateText := #sStateText;
|
||||
|
||||
#stInOutHMI.FingerSensor := #stInSenConvFingerInPos;
|
||||
#stInOutHMI.JamSensor := #stInSenJam;
|
||||
#stInOutHMI.LastPosSensor := #stInSenLastPos;
|
||||
|
||||
REGION Status
|
||||
IF #xInMotorProtection THEN
|
||||
IF #fbStateManager.xInFunctionEnabled THEN
|
||||
CASE #nState OF
|
||||
#c0000_StepOff, #c0100_StepUndefined:
|
||||
#stInOutHMI.stConveyor.bStatus := 0; // NOT_AVAILABLE
|
||||
#c0200_StepReceive, #c1200_StepWaitTime, #c2000_StepJog, #c2250_StepQuickStop, #c2200_StepNormalStop, #c3000_StepEmptying, #c5000_StepEnding:
|
||||
#stInOutHMI.stConveyor.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutHMI.stConveyor.bStatus := 0; // NOT_AVAILABLE
|
||||
END_CASE;
|
||||
ELSE
|
||||
#stInOutHMI.stConveyor.bStatus := 0; // NOT_AVAILABLE
|
||||
END_IF;
|
||||
ELSE
|
||||
#stInOutHMI.stConveyor.bStatus := 2; // ERROR
|
||||
END_IF;
|
||||
END_REGION
|
||||
REGION Modes
|
||||
// Int16 Bit-codiert
|
||||
#stInOutHMI.stConveyor.nMode.%X0 := (#nState = #c0000_StepOff) OR (#nState = #c0100_StepUndefined) OR (#nState = #c0200_StepReceive) OR (#nState = #c1200_StepWaitTime) OR (#nState = #c2200_StepNormalStop) OR (#nState = #c2250_StepQuickStop); // The device is turned off
|
||||
#stInOutHMI.stConveyor.nMode.%X1 := (#nState = #c2000_StepJog) OR (#nState = #c3000_StepEmptying) OR (#nState = #c5000_StepEnding);
|
||||
#stInOutHMI.stConveyor.nMode.%X2 := #stInOutHMI.stConveyor.xDisableConveyor OR #stInOutHMI.stConveyor.xManual OR #stInOutHMI.stConveyor.xSemiAuto OR #xTestMode OR #stInOutHMI.stControl.xTestMode (* OR #xViSuManualMode OR #xViSuSemiAutoMode *); // The device is being manually operated
|
||||
#stInOutHMI.stConveyor.nMode.%X3 := FALSE;//(#nState = #STOPPED); //The device only is on when the device is needed (like standby)
|
||||
#stInOutHMI.stConveyor.nMode.%X10 := FALSE; // Overflow Error is set for this device
|
||||
END_REGION
|
||||
#stInOutHMI.stConveyor.xIsInAutomatic := #stInOutControlUnitCabinet.xRunning;
|
||||
#stInOutHMI.stConveyor.xEnergySaveReq := FALSE;
|
||||
#stInOutHMI.stConveyor.xPowerContactor := #xOutMotor;
|
||||
#stInOutHMI.stConveyor.xPluggedChainBreak := FALSE;
|
||||
#stInOutHMI.stConveyor.xStatusChainBreak := TRUE;
|
||||
#stInOutHMI.stConveyor.xStatusMotorProtect := #xInMotorProtection;
|
||||
#stInOutHMI.stConveyor.xConveyorFull1 := FALSE;
|
||||
#stInOutHMI.stConveyor.xConveyorFull2 := FALSE;
|
||||
#stInOutHMI.stConveyor.xReady2Receive := TRUE;
|
||||
#stInOutHMI.stConveyor.xNextConveyorReady := TRUE;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Monitoring
|
||||
REGION Fingerüberwachung
|
||||
#fbMonitoringFinger.stSettings.nErrorType := 1;
|
||||
#fbMonitoringFinger.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringFinger.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringFinger.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringFinger(wInTextListId_Function := 300,
|
||||
sInPrefix := #stInOutHMI.stConveyor.sConveyorName,
|
||||
wInTextListId_Message := 301,
|
||||
sInSuffix := #stInOutHMI.FingerSensor.sName,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInErrorQuit,
|
||||
xInSignal := NOT #fbFingerControl.xOutErrorRasterSensor,
|
||||
InOutMachineState := #stInOutControlUnitCabinet);
|
||||
END_REGION
|
||||
|
||||
REGION Motorschutz
|
||||
#fbMonitoringMotorProtection.stSettings.nErrorType := 1;
|
||||
#fbMonitoringMotorProtection.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringMotorProtection(wInTextListId_Function := 300,
|
||||
sInPrefix := #stInOutHMI.stConveyor.sConveyorName,
|
||||
wInTextListId_Message := 401,
|
||||
sInSuffix := #stInOutHMI.stConveyor.sContactor,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInErrorQuit,
|
||||
xInSignal := #xInMotorProtection,
|
||||
InOutMachineState := #stInOutControlUnitCabinet);
|
||||
END_REGION
|
||||
|
||||
REGION Carrier in Pos
|
||||
#fbMonitoringCarrierInPos.stSettings.nErrorType := 1;
|
||||
#fbMonitoringCarrierInPos.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringCarrierInPos.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringCarrierInPos.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringCarrierInPos(wInTextListId_Function := 300,
|
||||
sInPrefix := #stInOutHMI.stConveyor.sConveyorName,
|
||||
wInTextListId_Message := 302,
|
||||
sInSuffix := #stInSenCarrInPos.sName,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInErrorQuit,
|
||||
xInSignal := NOT #xSensorError,
|
||||
InOutMachineState := #stInOutControlUnitCabinet);
|
||||
|
||||
END_REGION
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Error
|
||||
#wOutErrorWord.%X0 := #stInOutHMI.stConveyor.bStatus = 2; //Error
|
||||
#wOutErrorWord.%X1 := #fbFingerControl.xOutErrorRasterSensor; //Fingerfehler
|
||||
#wOutErrorWord.%X2 := NOT #xInMotorProtection; //Motorschutzfehler
|
||||
#wOutErrorWord.%X3 := #xSensorError;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: 3d0c7919-902b-47bd-98b6-b1baea1057d3
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.6
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Monitoring Update
|
||||
@@ -0,0 +1,23 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_StationUnloadPin.scl
|
||||
Hash: q/+gqEyu6e6ldC6QMMo2TZadq/PGbT9IxQG0y2nMnxk=
|
||||
LibraryMetaFileHash: rFn/h2cLTyXm8U7IjoyzTHVC63letxreqp9J4QWH9oY=
|
||||
LibraryVersion:
|
||||
Guid: 3af372a4-e06c-4b34-9436-a82db4db70d2
|
||||
DependsOn:
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stConveyorStations
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: UDT_UnloadingStation
|
||||
VersionNumber: 0.0.6
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_SHR_ExtractedHangerPin
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: FC_SHR_TargetSet_ReRoutePin
|
||||
VersionNumber: 2.0.3
|
||||
@@ -0,0 +1,296 @@
|
||||
FUNCTION_BLOCK "FB_StationUnloadPin"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInStartUnloading : Bool;
|
||||
xInStopUnloading : Bool;
|
||||
xInNextHanger : Bool;
|
||||
xInBefore : Bool;
|
||||
stInPartAfterSwitch : "UDT_Sensor";
|
||||
nInBarcode : DInt;
|
||||
sInBarcode : String;
|
||||
xInReRouteAllowed : Bool := TRUE;
|
||||
xInUnloadingCheckSensor : Bool;
|
||||
xInMonitorUnloading : Bool;
|
||||
xInQuitLocal : Bool;
|
||||
xInBypass : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutUnloadingDone : Bool;
|
||||
nOutBarcode : DInt;
|
||||
sOutBarcode : String;
|
||||
xOutSwitch : Bool;
|
||||
xOutLineOverloaded : Bool;
|
||||
xOutLineOverloadAhead : Bool;
|
||||
wOutErrorWord : Word;
|
||||
xOutLineOverloadedHigh : Bool;
|
||||
xOutLineOverloadedLow : Bool;
|
||||
xOutUnloadingFail : Bool;
|
||||
xOutUnloadingError : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutControlUnitCabinet : "UDT_MainState";
|
||||
stInOutConveyorStations : "stConveyorStations";
|
||||
arInOutCarrier : Array[*] of "stCarrier";
|
||||
nNoReadCounter : UDInt;
|
||||
stInOutHMI : "UDT_HMI_UnloadingStation";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
nState : Int := -10;
|
||||
TOnLineFullTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tOnUnloadingCheck {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
CountSwitch {InstructionName := 'CTU_UDINT'; LibVersion := '1.0'} : CTU_UDINT;
|
||||
nCount : UDInt;
|
||||
END_VAR
|
||||
VAR
|
||||
rTrigSwitch {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
rTrigUnload {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
tUnloadingCheckTime : Time := T#5s;
|
||||
xUnloadingCheck : Bool;
|
||||
tLineFullTime : Time := T#3s;
|
||||
tOnStateTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
xStateTimer : Bool;
|
||||
tStateTimer : Time;
|
||||
xFlgTrolleySensor : Bool;
|
||||
xFlgStartUnloading : Bool;
|
||||
fbMonitoringLineOverload : "FB_Monitoring";
|
||||
fbMonitoringUnloadError : "FB_Monitoring";
|
||||
xEdgeStoreLineOverload : Bool;
|
||||
stHangerStatus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
||||
xOnline { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
nTarget { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
|
||||
xDoubleHangerOkay { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xTargetDoubleHanger { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xNoRead { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xPartMissing { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xTargetSetByMFS { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReportedToMFS { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReRouteOverflow { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReRouteBalancing { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReRouteUnavailable { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
END_STRUCT;
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
t_status : Bool;
|
||||
tmpSuccess : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION xOutLineOverloaded Stau
|
||||
IF #TOnLineFullTimer.Q THEN
|
||||
//OR
|
||||
//#tOnUnloadingCheck.Q THEN
|
||||
#xFlgTrolleySensor := TRUE;
|
||||
#xOutLineOverloaded := 1;
|
||||
ELSE
|
||||
#xFlgTrolleySensor := FALSE;
|
||||
#xOutLineOverloaded := 0;
|
||||
END_IF;
|
||||
|
||||
// Detect change of Line Overload
|
||||
#xOutLineOverloadedHigh := #TOnLineFullTimer.Q AND NOT #xEdgeStoreLineOverload;
|
||||
|
||||
#xOutLineOverloadedLow := NOT #TOnLineFullTimer.Q AND #xEdgeStoreLineOverload;
|
||||
|
||||
#xEdgeStoreLineOverload := #TOnLineFullTimer.Q;
|
||||
|
||||
END_REGION
|
||||
|
||||
IF #xInStartUnloading AND #xFlgTrolleySensor AND #xInReRouteAllowed THEN
|
||||
#xOutUnloadingFail := TRUE;
|
||||
#nOutBarcode := #nInBarcode;
|
||||
#sOutBarcode := #sInBarcode;
|
||||
"FC_SHR_TargetSet_ReRoutePin"(nInBarcodeNo := #nInBarcode,
|
||||
nInTarget := INT_TO_USINT(#stInOutConveyorStations.stData.nStations),
|
||||
xOutSuccess => #tmpSuccess,
|
||||
stInOutConveyorStations := #stInOutConveyorStations);
|
||||
ELSE
|
||||
#xOutUnloadingFail := FALSE;
|
||||
END_IF;
|
||||
|
||||
#rTrigUnload(CLK:=#xInStartUnloading);
|
||||
|
||||
REGION Schrittkette
|
||||
CASE #nState OF
|
||||
-10: // Init
|
||||
#xOutSwitch := 0;
|
||||
#xStateTimer := 0;
|
||||
#xOutUnloadingDone := 0;
|
||||
#nState := 0;
|
||||
|
||||
0: // Standby
|
||||
#xOutUnloadingDone := 0;
|
||||
|
||||
// IF #tOnStateTimer.Q (* #xFlgTrolleySensor *)THEN // Wenn Weiche voll //VON MYTHERESA -> STÖRT HIER, TEST
|
||||
// #xUnloadingCheck := FALSE; // nicht möglich, da Flankenauswertung, bei dauerbelegtem Sensor sinnfrei
|
||||
// #xOutSwitch := 0; // Switch schliessen
|
||||
// END_IF;
|
||||
|
||||
IF #rTrigUnload.Q (* AND NOT #tOnStateTimer.Q *)THEN //VON MYTHERESA -> STÖRT HIER, TEST
|
||||
#xOutSwitch := 1;
|
||||
#nOutBarcode := #nInBarcode;
|
||||
#sOutBarcode := #sInBarcode;
|
||||
IF #xInMonitorUnloading THEN
|
||||
#xUnloadingCheck := 1;
|
||||
END_IF;
|
||||
"FC_SHR_ExtractedHangerPin"(xInUnloadingDone := TRUE,
|
||||
nInBarcode := #nOutBarcode,
|
||||
xInBypass:= #xInBypass,
|
||||
stInOutConveyorStations := #stInOutConveyorStations,
|
||||
arInOutCarrier:= #arInOutCarrier);
|
||||
#xOutUnloadingDone := 1;
|
||||
ELSIF #xInStopUnloading THEN
|
||||
#xOutSwitch := 0;
|
||||
END_IF;
|
||||
|
||||
1100: // Warten bis fertig mit Switch offen lassen
|
||||
#xOutSwitch := 1;
|
||||
IF NOT #xInStartUnloading THEN
|
||||
#nState := 1110; // Switch offen lassen
|
||||
END_IF;
|
||||
|
||||
1110: // Switch offen lassen
|
||||
#xOutSwitch := 1;
|
||||
#xOutUnloadingDone := 1;
|
||||
#nState := 0;
|
||||
1200: // Warten bis fertig mit Switch offen lassen
|
||||
#xOutSwitch := 1;
|
||||
IF NOT #xInStartUnloading THEN
|
||||
"FC_SHR_ExtractedHangerPin"(xInUnloadingDone := NOT #xInStartUnloading,
|
||||
nInBarcode := #nOutBarcode,
|
||||
xInBypass:=#xInBypass,
|
||||
stInOutConveyorStations := #stInOutConveyorStations,
|
||||
arInOutCarrier:= #arInOutCarrier);
|
||||
#nState := 1210; // Switch offen lassen
|
||||
END_IF;
|
||||
1210: // Switch schließen
|
||||
#xOutSwitch := 0;
|
||||
#xOutUnloadingDone := 1;
|
||||
#nState := 0;
|
||||
1300: //Switch vorher öffnen
|
||||
#xOutSwitch := 1;
|
||||
#nState := 0;
|
||||
END_CASE;
|
||||
END_REGION
|
||||
REGION Counter
|
||||
#rTrigSwitch(CLK := #xOutSwitch);
|
||||
#CountSwitch(CU := #rTrigSwitch.Q,
|
||||
PV := 1,
|
||||
CV => #nCount);
|
||||
END_REGION ;
|
||||
REGION Timer
|
||||
#tOnStateTimer(IN := #xFlgTrolleySensor,//xStateTimer,
|
||||
PT := T#800ms);//#tStateTimer);
|
||||
|
||||
#TOnLineFullTimer(IN := #stInPartAfterSwitch.xDbncdSensor,
|
||||
PT := #tLineFullTime);
|
||||
|
||||
IF #xInUnloadingCheckSensor AND // Sensor nach Weiche
|
||||
#xUnloadingCheck AND // Monitoring aktiviert
|
||||
NOT #tOnUnloadingCheck.Q // Monitoring nicht bereits ausgeschlagen
|
||||
THEN
|
||||
#xUnloadingCheck := FALSE;
|
||||
END_IF;
|
||||
|
||||
IF #tOnUnloadingCheck.Q AND // Monitoring ausgeschlagen?
|
||||
(#stInOutControlUnitCabinet.xQuitError OR #xInQuitLocal) // dann am Schaltschrank zu quittieren
|
||||
THEN
|
||||
#xUnloadingCheck := FALSE; // Monitoring Ende
|
||||
END_IF;
|
||||
|
||||
// Timer bis Teil am Sensor vorbei muss
|
||||
#tOnUnloadingCheck(IN := #xUnloadingCheck AND #stInOutControlUnitCabinet.xRunning,
|
||||
PT := #tUnloadingCheckTime);
|
||||
|
||||
#xOutUnloadingError := #tOnUnloadingCheck.Q;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Flanken
|
||||
|
||||
#xFlgStartUnloading := #xInStartUnloading;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Monitoring
|
||||
|
||||
#fbMonitoringLineOverload.stSettings.nErrorType := 1;
|
||||
#fbMonitoringLineOverload.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringLineOverload.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringLineOverload(sInFctnName := #stInOutHMI.sName,
|
||||
wInTextListId_Function := 500,
|
||||
wInTextListId_Message := 500,
|
||||
sInSuffix := #stInPartAfterSwitch.sName,
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInQuitLocal,
|
||||
xInSignal := NOT #TOnLineFullTimer.Q,
|
||||
sInAlarmMessage := 'Die Linie ist voll');
|
||||
|
||||
#fbMonitoringUnloadError.stSettings.nErrorType := 1;
|
||||
#fbMonitoringUnloadError.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringUnloadError.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringUnloadError(sInFctnName := #stInOutHMI.sName,
|
||||
wInTextListId_Function := 500,
|
||||
wInTextListId_Message := 501,
|
||||
sInSuffix := #stInPartAfterSwitch.sName,
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInQuitLocal,
|
||||
xInSignal := NOT #xOutUnloadingError,
|
||||
sInAlarmMessage := 'Laufzeitfehler bei Weiche/Abwurf');
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Visu
|
||||
REGION Status
|
||||
IF NOT #xOutUnloadingError AND (NOT #wOutErrorWord > 0) THEN
|
||||
IF #stInOutHMI.xEnableControl THEN
|
||||
#stInOutHMI.bStatus := 3;
|
||||
ELSE
|
||||
CASE #nState OF
|
||||
-10:
|
||||
#stInOutHMI.bStatus := 0; // NOT_AVAILABLE
|
||||
0, 1100, 1110, 1200, 1210, 1300:
|
||||
#stInOutHMI.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutHMI.bStatus := 0; // NOT AVAILABLE
|
||||
END_CASE;
|
||||
END_IF;
|
||||
ELSE // Fehler
|
||||
#stInOutHMI.bStatus := 2; // ERROR
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Modes
|
||||
// Int16 Bit-codiert
|
||||
#stInOutHMI.nMode.%X0 := (#nState = -10); // The device is turned off
|
||||
#stInOutHMI.nMode.%X1 := (#nState = 0) OR (#nState = 1100) OR (#nState = 1110) OR (#nState = 1200) OR (#nState = 1210) OR (#nState = 1300); // The device is turned on
|
||||
#stInOutHMI.nMode.%X2 := #stInOutHMI.xEnableControl; //Hand
|
||||
#stInOutHMI.nMode.%X3 := FALSE; //NIU
|
||||
#stInOutHMI.nMode.%X10 := #xOutUnloadingError; // Timeout Error
|
||||
END_REGION
|
||||
|
||||
// Idee: Schrittkette setzt im Normalfall den Switch.
|
||||
// Wenn EnableControl TRUE ist, dann wird der Ausgang hier einfach überschrieben mit dem HMI-Wert
|
||||
REGION Handbetrieb
|
||||
IF #stInOutHMI.xEnableControl THEN
|
||||
#xOutSwitch := #stInOutHMI.xSetSwitch;
|
||||
ELSE
|
||||
#stInOutHMI.xSetSwitch := #xOutSwitch;
|
||||
END_IF;
|
||||
|
||||
#stInOutHMI.xInHome := NOT #xOutSwitch;
|
||||
#stInOutHMI.xInWork := #xOutSwitch;
|
||||
|
||||
END_REGION
|
||||
|
||||
#stInOutHMI.xLineFull := #TOnLineFullTimer.Q;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
Reference in New Issue
Block a user