624 lines
16 KiB
XML
624 lines
16 KiB
XML
<?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> |