162 lines
4.3 KiB
XML
162 lines
4.3 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.11">
|
|
<POU Name="CLEANOUT" Id="{ce0061ae-e812-4a19-b385-951266a3cfdc}" SpecialFunc="None">
|
|
<Declaration><![CDATA[PROGRAM CLEANOUT
|
|
VAR_INPUT
|
|
Scan : BOOL;
|
|
CleanOut : BOOL;
|
|
TargetStation : INT;
|
|
TargetCassette : INT;
|
|
TargetSlot : INT;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
TargetStations : ARRAY[0..12] OF STRING;
|
|
TargetStationsN : ARRAY[0..12] OF INT;
|
|
TargetCassettes : ARRAY[0..3] OF STRING;
|
|
|
|
{IF defined (SO1635)}
|
|
TargetCassettesMaxIndex : INT := 3;
|
|
{END_IF}
|
|
{IF defined (SO1636)}
|
|
TargetCassettesMaxIndex : INT := 1;
|
|
{END_IF}
|
|
TargetCassettesMaxIndex : INT := 1;
|
|
|
|
TargetSlots : ARRAY[0..MaxNumberOfWafer-1] OF STRING;
|
|
NumberOfTargetStation : INT;
|
|
|
|
|
|
ScanInvisible : BOOL;
|
|
SlotInvisible : BOOL;
|
|
CleanoutInvisible : BOOL;
|
|
CassetteInvisible : BOOL;
|
|
END_VAR
|
|
VAR
|
|
i : INT;
|
|
Step : INT;
|
|
|
|
iTargetStation : INT;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[NumberOfTargetStation := 0;
|
|
CleanOutNeeded := FALSE;
|
|
ScanInvisible := FALSE;
|
|
SlotInvisible := FALSE;
|
|
CleanoutInvisible := FALSE;
|
|
CassetteInvisible := FALSE;
|
|
FOR i:= FirstStation TO LastStation DO
|
|
CASE StationsStatus[i].StationType OF
|
|
noStationType, TypeGeneral, TypeMedia:
|
|
;
|
|
TypeCassette:
|
|
TargetCassettes[i-FirstCassette] := StationsStatus[i].StationName;
|
|
IF StationsStatus[i].Ist.Busy THEN
|
|
ScanInvisible := TRUE;
|
|
SlotInvisible := TRUE;
|
|
END_IF
|
|
ELSE
|
|
IF StationsStatus[i].OnlyMoveToStation THEN
|
|
CONTINUE;
|
|
END_IF
|
|
|
|
IF StationsStatus[i].WaferInfo[0].Number = 100 THEN
|
|
TargetStations[NumberOfTargetStation] := StationsStatus[i].StationName;
|
|
TargetStationsN[NumberOfTargetStation] := i;
|
|
CleanOutNeeded := TRUE;
|
|
NumberOfTargetStation := NumberOfTargetStation +1;
|
|
END_IF
|
|
|
|
IF StationsStatus[i].StationType = TypeRobot THEN
|
|
IF StationsStatus[i].WaferInfo[0].Number = 100 THEN
|
|
TargetStations[NumberOfTargetStation] := StationsStatus[i].StationName;
|
|
TargetStationsN[NumberOfTargetStation] := i;
|
|
CleanOutNeeded := TRUE;
|
|
NumberOfTargetStation := NumberOfTargetStation +1;
|
|
END_IF
|
|
|
|
IF StationsStatus[i].Ist.Busy THEN
|
|
ScanInvisible := TRUE;
|
|
SlotInvisible := TRUE;
|
|
END_IF
|
|
END_IF
|
|
END_CASE
|
|
END_FOR
|
|
IF NOT CASSETTE_MAIN[TargetCassette + FirstCassette].IO.CarrierAvailable THEN
|
|
ScanInvisible := TRUE;
|
|
END_IF
|
|
|
|
|
|
IF StationsStatus[RobotStation].WaferInfo[0].Number <> 0 THEN
|
|
ScanInvisible := TRUE;
|
|
END_IF
|
|
IF TargetStationsN[TargetStation] = RobotStation THEN
|
|
CassetteInvisible := TRUE;
|
|
END_IF
|
|
|
|
IF StationsStatus[FirstCassette + TargetCassette].Ist.CloseIn THEN
|
|
FOR i := 0 TO MaxNumberOfWafer - 1 DO
|
|
IF CASSETTE_MAIN[FirstCassette + TargetCassette].Signal.Wafer[i+1].WaferStatus = noWafer THEN
|
|
TargetSlots[i] := INT_TO_STRING(i+1);
|
|
ELSE
|
|
TargetSlots[i] := CONCAT(INT_TO_STRING(i+1), ' (Not Available)');
|
|
END_IF
|
|
END_FOR
|
|
ELSE
|
|
SlotInvisible := TRUE;
|
|
END_IF
|
|
|
|
|
|
IF FIND(TargetSlots[TargetSlot], '(Not Available)') > 0 THEN
|
|
CleanoutInvisible := TRUE;
|
|
END_IF
|
|
|
|
IF SlotInvisible THEN
|
|
CleanoutInvisible := TRUE;
|
|
END_IF
|
|
|
|
|
|
CASE Step OF
|
|
0:
|
|
IF CleanOut THEN
|
|
Step := 10;
|
|
END_IF
|
|
10:
|
|
iTargetStation := TargetStationsN[TargetStation];
|
|
IF NOT StationsStatus[iTargetStation].Ist.Busy AND NOT StationsStatus[RobotStation].Ist.Busy THEN
|
|
ROBOT_MAIN.TargetStation := iTargetStation;
|
|
CMD[RobotStation] := GetCMD;
|
|
Step := Step +1;
|
|
END_IF
|
|
11:
|
|
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
|
|
Step := 30;
|
|
END_IF
|
|
20:
|
|
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
|
|
ROBOT_MAIN.TargetStation := TypeAligner;
|
|
CMD[RobotStation] := PutCMD;
|
|
Step := Step +1;
|
|
END_IF
|
|
21:
|
|
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
|
|
Step := 30;
|
|
END_IF
|
|
30:
|
|
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
|
|
ROBOT_MAIN.TargetStation := TypeCassette + TargetCassette;
|
|
ROBOT_MAIN.TargetSlot := TargetSlot +1;
|
|
CASSETTE_MAIN[ROBOT_MAIN.TargetStation].Signal.Wafer[ROBOT_MAIN.TargetSlot].Defect := TRUE;
|
|
CMD[RobotStation] := PutCMD;
|
|
Step := Step +1;
|
|
END_IF
|
|
31:
|
|
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
|
|
CleanOut := FALSE;
|
|
Step := 0;
|
|
END_IF
|
|
END_CASE
|
|
]]></ST>
|
|
</Implementation>
|
|
</POU>
|
|
</TcPlcObject> |