Initial
This commit is contained in:
624
PLC/0 General/POUs/GENERAL_MAIN_FB.TcPOU
Normal file
624
PLC/0 General/POUs/GENERAL_MAIN_FB.TcPOU
Normal file
@@ -0,0 +1,624 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.13">
|
||||
<POU Name="GENERAL_MAIN_FB" Id="{b5148723-afa6-43ad-b3aa-b206f2e9a813}" SpecialFunc="None">
|
||||
<Declaration><![CDATA[FUNCTION_BLOCK GENERAL_MAIN_FB EXTENDS Station_GENERAL_MAIN_FB IMPLEMENTS I_STATION_CMD_CALL
|
||||
VAR_INPUT
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
END_VAR
|
||||
VAR
|
||||
i,j : UDINT;
|
||||
|
||||
RobotJob : REFERENCE TO sScheduler;
|
||||
CassetteNumber : INT;
|
||||
|
||||
TargetStation : UDINT;
|
||||
NextProcess : INT;
|
||||
|
||||
RobotStatus : REFERENCE TO sStationStatus;
|
||||
|
||||
bInitialization : BOOL;
|
||||
bFirstCall : BOOL;
|
||||
END_VAR
|
||||
]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[]]></ST>
|
||||
</Implementation>
|
||||
<Method Name="CheckMachineForCoolDown" Id="{c7a2b26a-bc4c-459a-ac82-81f159ae8d89}">
|
||||
<Declaration><![CDATA[METHOD CheckMachineForCoolDown : BOOL
|
||||
VAR_INPUT
|
||||
END_VAR
|
||||
VAR
|
||||
i : INT;
|
||||
END_VAR
|
||||
VAR_INST
|
||||
Ready : BOOL;
|
||||
|
||||
Timer : TON;
|
||||
END_VAR]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[Ready := FALSE;
|
||||
FOR i := FirstStation TO LastStation DO
|
||||
IF StationsStatus[i].Ist.Busy THEN
|
||||
Ready := TRUE;
|
||||
END_IF
|
||||
|
||||
IF StationsStatus[i].Ist.Service THEN
|
||||
Ready := TRUE;
|
||||
END_IF
|
||||
END_FOR
|
||||
|
||||
Timer(IN := NOT Ready, PT := T#10M);
|
||||
|
||||
bCoolDown := Timer.Q;]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
<Method Name="FB_Init" Id="{0fee2ebc-13f3-4dc2-9c22-e1eb5f8daca1}">
|
||||
<Declaration><![CDATA[//FB_Init is always available implicitly and it is used primarily for initialization.
|
||||
//The return value is not evaluated. For a specific influence, you can also declare the
|
||||
//methods explicitly and provide additional code there with the standard initialization
|
||||
//code. You can evaluate the return value.
|
||||
METHOD FB_Init: BOOL
|
||||
VAR_INPUT
|
||||
bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
|
||||
bInCopyCode: BOOL; // TRUE: the instance will be copied to the copy code afterward (online change)
|
||||
END_VAR
|
||||
VAR
|
||||
i : INT;
|
||||
Count : INT;
|
||||
TempString : STRING;
|
||||
END_VAR]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[StationsStatus[GeneralStation].StationType := TypeGeneral;
|
||||
StationsStatus[GeneralStation].StationCMDCall := GENERAL_MAIN;
|
||||
StationsStatus[GeneralStation].StationCMDCall.Initialization(GeneralStation);]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
<Method Name="FirstCall" Id="{6041a1c1-a08f-43ec-abfe-0c44478731a1}">
|
||||
<Declaration><![CDATA[METHOD FirstCall : BOOL
|
||||
VAR_INPUT
|
||||
END_VAR
|
||||
VAR
|
||||
TempString : STRING;
|
||||
i, count : INT;
|
||||
END_VAR]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[PaddleMode := ePaddleMode.UpperPaddle;
|
||||
|
||||
FOR i := FirstCassette TO LastCassette DO
|
||||
StationsStatus[i].StationType := TypeCassette;
|
||||
END_FOR
|
||||
|
||||
StationsStatus[AlignerStation].StationType := TypeAligner;
|
||||
StationsStatus[CodeReaderStation].StationType := TypeCodeReader;
|
||||
|
||||
FOR i := FirstSpinner TO LastSpinner DO
|
||||
StationsStatus[i].StationType := TypeCleaner;
|
||||
END_FOR
|
||||
|
||||
FOR i := FirstHotplate TO LastHotplate DO
|
||||
StationsStatus[i].StationType := TypeHotplate;
|
||||
END_FOR
|
||||
|
||||
FOR i := FirstCoolplate TO LastCoolplate DO
|
||||
StationsStatus[i].StationType := TypeCoolplate;
|
||||
END_FOR
|
||||
|
||||
StationsStatus[FirstHV].StationType := TypeHVHot;
|
||||
|
||||
StationsStatus[LastHV].StationType := TypeHVCold;
|
||||
|
||||
FOR i := FirstLelaxStation TO LastRelaxStation DO
|
||||
StationsStatus[i].StationType := TypeRelax;
|
||||
END_FOR
|
||||
|
||||
|
||||
StationsStatus[MediaStation].StationType := TypeMedia;
|
||||
StationsStatus[RobotStation].StationType := TypeRobot;
|
||||
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
ELSE
|
||||
CONTINUE;
|
||||
TypeCassette:
|
||||
StationsStatus[i].StationCMDCall := CASSETTE_MAIN[i];
|
||||
TypeAligner:
|
||||
StationsStatus[i].StationCMDCall := ALIGNER_MAIN;
|
||||
TypeCodeReader:
|
||||
StationsStatus[i].StationCMDCall := CodeReader_MAIN;
|
||||
TypeCleaner:
|
||||
StationsStatus[i].StationCMDCall := SPINNER_MAIN[i];
|
||||
TypeHotplate, TypeCoolplate:
|
||||
StationsStatus[i].StationCMDCall := HOTPLATE_MAIN[i];
|
||||
TypeHVHot, TypeHVCold:
|
||||
StationsStatus[i].StationCMDCall := HV_MAIN[i];
|
||||
TypeMedia:
|
||||
StationsStatus[i].StationCMDCall := MEDIA_MAIN;
|
||||
TypeRobot:
|
||||
StationsStatus[i].StationCMDCall := ROBOT_MAIN;
|
||||
TypeRelax:
|
||||
StationsStatus[i].StationCMDCall := RETRY_MAIN[i];
|
||||
END_CASE
|
||||
|
||||
StationsStatus[i].StationCMDCall.Initialization(i);
|
||||
|
||||
Count := StationAlternative[StationsStatus[i].StationType].Count +1;
|
||||
StationAlternative[StationsStatus[i].StationType].List[Count] := i;
|
||||
StationAlternative[StationsStatus[i].StationType].ListName[Count] := StationsStatus[i].StationName;
|
||||
StationAlternative[StationsStatus[i].StationType].Count := Count;
|
||||
END_FOR
|
||||
|
||||
GetRecipeTypeList();
|
||||
|
||||
bFirstCall := TRUE;
|
||||
|
||||
SlowTaskEnable := TRUE;]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
<Method Name="INIT" Id="{7cd33883-92b8-4ace-91bb-779b0d425e30}">
|
||||
<Declaration><![CDATA[METHOD INIT : BOOL
|
||||
VAR_INST
|
||||
i,j : INT;
|
||||
END_VAR]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[(*CASE Step OF
|
||||
0:
|
||||
IF NOT MEDIA_MAIN.IO.bInCDAOk THEN
|
||||
iStationStatus.Error := TRUE;
|
||||
iStationStatus.StepRetry := 0;
|
||||
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eCDA,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
(* IF NOT MEDIA_MAIN.IO.bInVacOk THEN
|
||||
iStationStatus.Error := TRUE;
|
||||
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eVacuum,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
||||
RETURN;
|
||||
END_IF*)
|
||||
|
||||
Step := 10;
|
||||
10:
|
||||
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
|
||||
CMD[RobotStation] := InitCMD;
|
||||
step := step +1;
|
||||
END_IF
|
||||
11:
|
||||
IF StationsStatus[RobotStation].Ist.InitDone THEN
|
||||
step := 20;
|
||||
END_IF
|
||||
20:
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
noStationType, TypeRobot, TypeGeneral:
|
||||
;
|
||||
ELSE
|
||||
IF StationsStatus[i].Ist.Busy THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
END_CASE
|
||||
END_FOR
|
||||
step := step +1;
|
||||
21:
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
noStationType, TypeRobot, TypeGeneral:
|
||||
;
|
||||
ELSE
|
||||
IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN
|
||||
CMD[i] := InitCMD;
|
||||
END_IF
|
||||
END_CASE
|
||||
END_FOR
|
||||
step := step +1;
|
||||
22:
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
noStationType, TypeRobot, TypeGeneral, TypeMedia:
|
||||
;
|
||||
ELSE
|
||||
IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
END_CASE
|
||||
END_FOR
|
||||
step := 30;
|
||||
30:
|
||||
step := 100;
|
||||
100:
|
||||
INIT := TRUE;
|
||||
Step := 0;
|
||||
END_CASE*)
|
||||
|
||||
CASE _Step OF
|
||||
0:
|
||||
IF NOT MEDIA_MAIN.IO.bInCDAOk THEN
|
||||
iStationStatus.Error := TRUE;
|
||||
iStationStatus.StepRetry := 0;
|
||||
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eCDA,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
(*IF NOT MEDIA_MAIN.IO.bInVacOk THEN
|
||||
iStationStatus.Error := TRUE;
|
||||
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eVacuum,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
||||
RETURN;
|
||||
END_IF*)
|
||||
|
||||
_Step := 10;
|
||||
10:
|
||||
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
|
||||
CMD[RobotStation] := InitCMD;
|
||||
_Step := _Step +1;
|
||||
END_IF
|
||||
11:
|
||||
IF StationsStatus[RobotStation].Ist.InitDone THEN
|
||||
_Step := 20;
|
||||
END_IF
|
||||
20:
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
noStationType, TypeRobot, TypeGeneral:
|
||||
;
|
||||
ELSE
|
||||
IF OperationMode[i] = DisableMode THEN
|
||||
CONTINUE;
|
||||
END_IF
|
||||
StationsStatus[i].Soll.Stop := TRUE;
|
||||
END_CASE
|
||||
END_FOR
|
||||
_Step := _Step +1;
|
||||
21:
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
noStationType, TypeRobot, TypeGeneral:
|
||||
;
|
||||
ELSE
|
||||
IF OperationMode[i] = DisableMode THEN
|
||||
CONTINUE;
|
||||
END_IF
|
||||
IF StationsStatus[i].Soll.Stop OR StationsStatus[i].Ist.Busy THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
END_CASE
|
||||
END_FOR
|
||||
_Step := _Step +1;
|
||||
22:
|
||||
DelayTimer(IN := TRUE, PT := T#1S);
|
||||
IF DelayTimer.Q THEN
|
||||
DelayTimer(IN := FALSE);
|
||||
_Step := _Step +1;
|
||||
END_IF
|
||||
23:
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
noStationType, TypeRobot, TypeGeneral:
|
||||
;
|
||||
ELSE
|
||||
IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN
|
||||
CMD[i] := InitCMD;
|
||||
END_IF
|
||||
END_CASE
|
||||
END_FOR
|
||||
_Step := _Step +1;
|
||||
24:
|
||||
FOR i:= FirstStation TO LastStation DO
|
||||
CASE StationsStatus[i].StationType OF
|
||||
noStationType, TypeRobot, TypeGeneral, TypeMedia:
|
||||
;
|
||||
ELSE
|
||||
IF CMD[i] = InitCMD THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
END_CASE
|
||||
END_FOR
|
||||
_Step := 30;
|
||||
30:
|
||||
_Step := 100;
|
||||
100:
|
||||
bInitialization := FALSE;
|
||||
INIT := TRUE;
|
||||
_Step := 0;
|
||||
END_CASE]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
<Method Name="Initialization" Id="{e51989ad-3094-4485-bbc7-87361ec6fa7f}">
|
||||
<Declaration><![CDATA[METHOD Initialization : BOOL
|
||||
VAR_INPUT
|
||||
iStation : INT;
|
||||
END_VAR
|
||||
]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[_VisuName := 'SYSTEM';
|
||||
_NoConfigFile := TRUE;
|
||||
InitializationExt(iStation);
|
||||
|
||||
RobotStatus REF=StationsStatus[RobotStation];
|
||||
|
||||
iStationStatus.StationName := 'System';
|
||||
iStationStatus.ErrorList := 'SystemErrorList';
|
||||
|
||||
RobotJob REF= Scheduler[RobotStation];
|
||||
|
||||
iMediaArray[eMainMedienNamen.Pause].ServiceName[0] := 'Pause';
|
||||
iMediaArray[eMainMedienNamen.Pause].ServiceName[1] := 'Pause';
|
||||
iMediaArray[eMainMedienNamen.Pause].bReferenceControl REF= bPause;
|
||||
iMediaArray[eMainMedienNamen.Pause].InputAvailable := TRUE;
|
||||
|
||||
iMediaArray[eMainMedienNamen.Empty].ServiceName[0] := 'Empty';
|
||||
iMediaArray[eMainMedienNamen.Empty].ServiceName[1] := 'Empty';
|
||||
iMediaArray[eMainMedienNamen.Empty].bReferenceControl REF= bEmpty;
|
||||
iMediaArray[eMainMedienNamen.Empty].InputAvailable := TRUE;
|
||||
|
||||
iMediaArray[eMainMedienNamen.Initialization].ServiceName[0] := 'Initialization';
|
||||
iMediaArray[eMainMedienNamen.Initialization].ServiceName[1] := 'Initialization';
|
||||
iMediaArray[eMainMedienNamen.Initialization].bReferenceControl REF= bInitialization;
|
||||
iMediaArray[eMainMedienNamen.Initialization].InputAvailable := TRUE;
|
||||
iMediaArray[eMainMedienNamen.Initialization].NoErrorInput := TRUE;]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
<Method Name="MAIN" Id="{4e8331ba-95d4-46bc-9181-64b3616fc779}">
|
||||
<Declaration><![CDATA[METHOD MAIN : BOOL
|
||||
VAR_INST
|
||||
i : INT;
|
||||
|
||||
Step : INT;
|
||||
END_VAR]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[IF NOT bFirstCall THEN
|
||||
FirstCall();
|
||||
END_IF
|
||||
|
||||
KeyenceCamera();
|
||||
|
||||
CheckMachineForCoolDown();
|
||||
|
||||
|
||||
nCounter := nCounter +1;
|
||||
IF bResetCounter THEN
|
||||
nCounter := 0;
|
||||
END_IF
|
||||
|
||||
FOR i := FirstCassette TO LastCassette DO
|
||||
IF CMD[i] = StartCMD THEN
|
||||
iCMD := StartCMD;
|
||||
EXIT;
|
||||
END_IF
|
||||
END_FOR
|
||||
|
||||
IF bInitialization AND NOT iStationStatus.Ist.Busy THEN
|
||||
iCMD := InitCMD;
|
||||
END_IF
|
||||
iMediaArray[eMainMedienNamen.Initialization].Input := iStationStatus.Ist.InitDone;
|
||||
iMediaArray[eMainMedienNamen.Initialization].Invisible := NOT InAktorspannung;
|
||||
|
||||
iMediaArray[eMainMedienNamen.Pause].Invisible := iCMD <> StartCMD;
|
||||
iMediaArray[eMainMedienNamen.Empty].Invisible := iCMD <> StartCMD;
|
||||
|
||||
|
||||
|
||||
WaferInSystem := FALSE;
|
||||
FOR i := FirstSpinner TO RobotStation DO
|
||||
IF StationsStatus[i].WaferInfo[0].Number > 0 THEN
|
||||
WaferInSystem := TRUE;
|
||||
END_IF
|
||||
END_FOR
|
||||
|
||||
IF StationsStatus[RobotStation].WaferInfo[1].Number > 0 THEN
|
||||
WaferInSystem := TRUE;
|
||||
END_IF
|
||||
|
||||
CASE PaddleMode OF
|
||||
ePaddleMode.All:
|
||||
TimeBetweenProcesses := 10;
|
||||
ePaddleMode.LowerPaddle, ePaddleMode.UpperPaddle:
|
||||
TimeBetweenProcesses := 20;
|
||||
END_CASE
|
||||
|
||||
SubstrateOnRetry := FALSE;
|
||||
FOR i := FirstLelaxStation TO LastRelaxStation DO
|
||||
IF StationsStatus[i].WaferInfo[0].Number > 0 THEN
|
||||
SubstrateOnRetry := TRUE;
|
||||
END_IF
|
||||
END_FOR
|
||||
|
||||
|
||||
|
||||
|
||||
]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
<Method Name="Start" Id="{1bb288b1-fbde-4125-a70c-cc4741de9337}">
|
||||
<Declaration><![CDATA[METHOD Start : BOOL
|
||||
VAR_INPUT
|
||||
END_VAR
|
||||
VAR_INST
|
||||
i,j : INT;
|
||||
END_VAR]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[IF NOT Safety_PRG.MediaOk THEN
|
||||
bEmpty := TRUE;
|
||||
END_IF
|
||||
|
||||
CASE _Step OF
|
||||
0:
|
||||
IF bPause THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
IF RobotJob.NumberOfjob > 0 THEN
|
||||
_Step := 10;
|
||||
ELSE
|
||||
FOR i := FirstCassette TO LastCassette DO
|
||||
IF StationsStatus[i].Ist.Busy THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
END_FOR
|
||||
_Step := 90;
|
||||
END_IF
|
||||
10:
|
||||
IF bPause THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
IF RobotJob.NumberOfjob = 0 OR ChuckChangeBusy THEN
|
||||
_Step := 0;
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
IF StationsStatus[RobotStation].Ist.Busy THEN
|
||||
_Step := 0;
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
FOR i := 0 TO MIN(20, RobotJob.NumberOfjob) DO
|
||||
IF IsTargetReady(RobotJob.Job[i]) THEN
|
||||
|
||||
CassetteNumber := RobotJob.Job[i].CassetteNumber;
|
||||
ROBOT_MAIN.TargetSlot := RobotJob.Job[i].WaferNumber;
|
||||
CASE CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].WaferStatus OF
|
||||
WaferForProccess:
|
||||
IF SubstrateOnRetry THEN
|
||||
CONTINUE;
|
||||
END_IF
|
||||
END_CASE
|
||||
_Step := 20;
|
||||
RETURN;
|
||||
END_IF
|
||||
END_FOR
|
||||
20:
|
||||
CASE CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].WaferStatus OF
|
||||
WaferForProccess:
|
||||
ROBOT_MAIN.TargetStation := CassetteNumber;
|
||||
//ROBOT_MAIN.Size := CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].Size;
|
||||
_Step := _Step +1;
|
||||
ELSE
|
||||
FOR i := FirstStation TO LastStation DO
|
||||
IF StationsStatus[i].WaferInfo[0].CassetteNumber = CassetteNumber AND StationsStatus[i].WaferInfo[0].Number = ROBOT_MAIN.TargetSlot THEN
|
||||
ROBOT_MAIN.TargetStation := i;
|
||||
_Step := _Step +1;
|
||||
RETURN;
|
||||
END_IF
|
||||
END_FOR
|
||||
END_CASE
|
||||
21:
|
||||
IF NOT RobotStatus.Ist.Busy THEN
|
||||
CASE PaddleMode OF
|
||||
ePaddleMode.All, ePaddleMode.UpperPaddle:
|
||||
ROBOT_MAIN.TargetPuddle := 0;
|
||||
ePaddleMode.LowerPaddle:
|
||||
ROBOT_MAIN.TargetPuddle := 1;
|
||||
END_CASE
|
||||
CMD[RobotStation] := GetCMD;
|
||||
_Step := _Step +1;
|
||||
END_IF
|
||||
22:
|
||||
IF RobotStatus.Ist.Busy THEN
|
||||
_Step := _Step +1;
|
||||
END_IF
|
||||
23:
|
||||
IF NOT RobotStatus.Ist.Busy THEN
|
||||
IF RobotStatus.WaferInfo[0].Number > 0 OR RobotStatus.WaferInfo[1].Number > 0 THEN
|
||||
_Step := 30;
|
||||
ELSE
|
||||
_Step := 0;
|
||||
END_IF
|
||||
END_IF
|
||||
30:
|
||||
IF StationsStatus[RobotStation].WaferInfo[0].Number > 0 THEN
|
||||
NextProcess := StationsStatus[RobotStation].WaferInfo[0].FlowStepNumber +1;
|
||||
ELSIF StationsStatus[RobotStation].WaferInfo[1].Number > 0 THEN
|
||||
NextProcess := StationsStatus[RobotStation].WaferInfo[1].FlowStepNumber +1;
|
||||
ELSE
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
IF CASSETTE_PROCESS[CassetteNumber][ROBOT_MAIN.TargetSlot][NextProcess].TargetStation = 0 THEN
|
||||
ROBOT_MAIN.TargetStation := CassetteNumber;
|
||||
ELSE
|
||||
ROBOT_MAIN.TargetStation := CASSETTE_PROCESS[CassetteNumber][ROBOT_MAIN.TargetSlot][NextProcess].TargetStation;
|
||||
END_IF
|
||||
IF StationsStatus[ROBOT_MAIN.TargetStation].WaferInfo[0].Number = 0 THEN
|
||||
_Step := 50;
|
||||
ELSE
|
||||
_Step := 40;
|
||||
END_IF
|
||||
40:
|
||||
IF RobotStatus.Ist.Busy THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
CMD[RobotStation] := ChangeCMD;
|
||||
_Step := _Step +1;
|
||||
41:
|
||||
IF RobotStatus.Ist.Busy THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
IF RobotStatus.WaferInfo[0].Number > 0 THEN
|
||||
CassetteNumber := RobotStatus.WaferInfo[0].CassetteNumber;
|
||||
ROBOT_MAIN.TargetSlot := RobotStatus.WaferInfo[0].Number;
|
||||
ELSIF RobotStatus.WaferInfo[1].Number > 0 THEN
|
||||
CassetteNumber := RobotStatus.WaferInfo[1].CassetteNumber;
|
||||
ROBOT_MAIN.TargetSlot := RobotStatus.WaferInfo[1].Number;
|
||||
ELSE
|
||||
_Step := 0;
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
_Step := _Step +1;
|
||||
42:
|
||||
_Step := 30;
|
||||
50:
|
||||
IF StationsStatus[RobotStation].WaferInfo[0].Number > 0 AND StationsStatus[RobotStation].WaferInfo[1].Number = 0 THEN
|
||||
ROBOT_MAIN.TargetPuddle := 0;
|
||||
ELSIF StationsStatus[RobotStation].WaferInfo[1].Number > 0 AND StationsStatus[RobotStation].WaferInfo[0].Number = 0 THEN
|
||||
ROBOT_MAIN.TargetPuddle := 1;
|
||||
ELSE
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
IF RobotStatus.Ist.Busy THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
CASE StationsStatus[ROBOT_MAIN.TargetStation].StationType OF
|
||||
TypeCassette:
|
||||
IF StationsStatus[ROBOT_MAIN.TargetStation].Ist.CloseIn OR CMD[ROBOT_MAIN.TargetStation] = StartCMD THEN
|
||||
CMD[RobotStation] := PutCMD;
|
||||
_Step := _Step +1;
|
||||
END_IF
|
||||
ELSE
|
||||
CMD[RobotStation] := PutCMD;
|
||||
_Step := _Step +1;
|
||||
END_CASE
|
||||
51:
|
||||
IF RobotStatus.Ist.Busy THEN
|
||||
_Step := _Step +1;
|
||||
END_IF
|
||||
52:
|
||||
IF RobotStatus.Ist.Busy THEN
|
||||
RETURN;
|
||||
END_IF
|
||||
|
||||
IF StationsStatus[ROBOT_MAIN.TargetStation].OnlyMoveToStation THEN
|
||||
_Step := 30;
|
||||
ELSE
|
||||
_Step := 10;
|
||||
END_IF
|
||||
90:
|
||||
ROBOT_MAIN.RobotControl.bOut_EndOfCycle := TRUE;
|
||||
IF ROBOT_MAIN.RobotControl.bIn_PGNO_REG THEN
|
||||
ROBOT_MAIN.RobotControl.bOut_EndOfCycle := FALSE;
|
||||
_Step := 100;
|
||||
END_IF
|
||||
100:
|
||||
bEmpty := FALSE;
|
||||
Start := TRUE;
|
||||
_Step := 0;
|
||||
END_CASE
|
||||
|
||||
|
||||
]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
</POU>
|
||||
</TcPlcObject>
|
||||
Reference in New Issue
Block a user