514 lines
12 KiB
XML
514 lines
12 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.13">
|
|
<POU Name="TrayFeeder_FB" Id="{c4598a14-3f38-4791-b276-94ad8d96874e}" SpecialFunc="None">
|
|
<Declaration><![CDATA[FUNCTION_BLOCK TrayFeeder_FB EXTENDS Peripherie_FB
|
|
VAR_INPUT
|
|
bInNextSlot : BOOL;
|
|
rInTargetSlot : USINT;
|
|
|
|
AllWafer : REFERENCE TO ARRAY[0..MaxNumberOfWafer]OF sWaferSignal;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
TrayNumber : BYTE;
|
|
EOT : BOOL;
|
|
END_VAR
|
|
VAR
|
|
Com : TCPClient_FB;
|
|
ReceiveArray : ARRAY [0..100] OF T_MaxString;
|
|
ReceiveMessage : T_MaxString;
|
|
|
|
|
|
ComTimeDelay : TON;
|
|
FindPosition : INT;
|
|
|
|
CMD_LOGGER : CMD_LOGGER_FB;
|
|
|
|
_Size : USINT;
|
|
END_VAR
|
|
|
|
VAR CONSTANT
|
|
tEnableTimeOut : TIME := T#3S;
|
|
step_abort : INT := 110;
|
|
NewLine : STRING := '$R$N';
|
|
END_VAR]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
|
|
Init();
|
|
GetTray();
|
|
// IndexNext();
|
|
EndOfLot();
|
|
SCAN();
|
|
END_IF
|
|
|
|
Com();
|
|
ErrorHandling();
|
|
CMD_LOGGER();
|
|
|
|
ComTimeDelay(IN := InAktorspannung, PT := T#3S);
|
|
AlarmSend(iStation, Cassette_ErrorNr.eTrayNoCom, FALSE, eReportType.Warning, sAvailableResponse.NoResponse, Com.bOutConnected OR NOT ComTimeDelay.Q);
|
|
|
|
|
|
FindPosition := Find(Com.ReceiveMessage, NewLine);
|
|
IF FindPosition > 0 THEN
|
|
ReceiveMessage := Left(Com.ReceiveMessage, FindPosition+1);
|
|
Com.ReceiveMessage := DELETE(Com.ReceiveMessage, FindPosition+1,1);
|
|
JMP Lable1;
|
|
END_IF
|
|
|
|
Lable1:
|
|
IF FIND(ReceiveMessage, CONCAT(ReceiveArray[0], NewLine)) =0 AND ReceiveMessage <> '' THEN
|
|
MEMMOVE(ADR(ReceiveArray[1]), ADR(ReceiveArray[0]), SIZEOF(ReceiveArray)- SIZEOF(ReceiveArray[0]));
|
|
ReceiveArray[0] := ReceiveMessage;
|
|
END_IF
|
|
|
|
|
|
FindPosition := find(ReceiveArray[0], NewLine);
|
|
IF FindPosition > 0 AND ReceiveArray[0] <> NewLine THEN
|
|
ReceiveArray[0] := LEFT(ReceiveArray[0], FindPosition-1);
|
|
END_IF
|
|
|
|
IF bInInit THEN
|
|
IF Init() THEN
|
|
bInInit := FALSE;
|
|
END_IF
|
|
END_IF
|
|
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayNextSlot].Disable := NOT iStationStatus.Ist.InitDone OR rInTargetSlot = 0;
|
|
IF bInNextSlot THEN
|
|
IF GetTray(rInTargetSlot) THEN
|
|
bInNextSlot := FALSE;
|
|
END_IF
|
|
END_IF
|
|
]]></ST>
|
|
</Implementation>
|
|
<Method Name="EndOfLot" Id="{78817bce-5252-4fac-aff3-48994c677093}">
|
|
<Declaration><![CDATA[METHOD EndOfLot : BOOL
|
|
VAR_INPUT
|
|
END_VAR
|
|
VAR_INST
|
|
Step : INT;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
|
|
Step := 0;
|
|
RETURN;
|
|
END_IF
|
|
|
|
(*CASE iStation OF
|
|
10:
|
|
TrayNumber := 0;
|
|
EndOfLot := TRUE;
|
|
Step := 0;
|
|
RETURN;
|
|
END_CASE*)
|
|
|
|
IF Error THEN
|
|
RETURN;
|
|
END_IF
|
|
|
|
|
|
CASE Step OF
|
|
0:
|
|
TrayNumber := 0;
|
|
Com.SendMessage := 'e$R';
|
|
Step := Step +1;
|
|
1:
|
|
IF find(ReceiveMessage,'Error')> 0 THEN
|
|
error_index := AlarmSend(iStation,MsgId := Cassette_ErrorNr.eGetError,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
|
Step := 20;
|
|
Error := TRUE;
|
|
ELSIF ReceiveMessage = 'AtBottom$R$N' THEN
|
|
EndOfLot := TRUE;
|
|
Step := 0;
|
|
END_IF
|
|
20:
|
|
Com.SendMessage := 'r$R';
|
|
Step := Step +1;
|
|
21:
|
|
IF ReceiveMessage = 'Reset$R$N' THEN //Feeder Ok
|
|
Step := Step +1;
|
|
END_IF
|
|
|
|
22:
|
|
IF ReceiveMessage = 'Ready$R$N' THEN //Feeder Ok
|
|
Step := 0;
|
|
END_IF
|
|
END_CASE]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="GetTray" Id="{1b3bfcbd-547c-4348-add2-962aca2bf70b}">
|
|
<Declaration><![CDATA[METHOD GetTray : BOOL
|
|
VAR_INPUT
|
|
SlotNr : USINT := 0;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
bOutError : BOOL;
|
|
END_VAR
|
|
|
|
VAR_INST
|
|
Step : INT;
|
|
MAP : ARRAY [1..MaxNumberOfSubstratesPerTray] OF BYTE;
|
|
MaxNumberOfSlots : SINT;
|
|
i : INT;
|
|
END_VAR]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
|
|
bInNextSlot := FALSE;
|
|
Step := 0;
|
|
RETURN;
|
|
END_IF
|
|
|
|
|
|
(*CASE iStation OF
|
|
10:
|
|
IF Step < 10 THEN
|
|
Step := 10;
|
|
TrayNumber := 1;
|
|
END_IF
|
|
END_CASE*)
|
|
|
|
IF Error THEN
|
|
RETURN;
|
|
END_IF
|
|
|
|
|
|
CASE Step OF
|
|
0:
|
|
CASE SlotNr OF
|
|
0:
|
|
Com.SendMessage := 'f$R';
|
|
ELSE
|
|
fbFormatString(
|
|
sFormat := 'f%d$R',
|
|
arg1 := F_USINT(SlotNr),
|
|
sOut => Com.SendMessage
|
|
);
|
|
END_CASE
|
|
TrayNumber := 0;
|
|
Step := Step +1;
|
|
1:
|
|
IF ReceiveMessage = 'Index Fast$R$N' THEN
|
|
Step := Step +1;
|
|
END_IF
|
|
2:
|
|
IF ReceiveMessage = 'Ready$R$N' THEN
|
|
Step := Step +1;
|
|
ELSIF find(ReceiveMessage,'Error')> 0 THEN
|
|
error_index := AlarmSend(iStation,MsgId := Cassette_ErrorNr.eGetError,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
|
Step := 20;
|
|
Error := TRUE;
|
|
ELSIF ReceiveMessage = 'AtBottom$R$N' THEN
|
|
EOT := TRUE;
|
|
TrayNumber := 0;
|
|
Step := 0;
|
|
bOutError := TRUE;
|
|
GetTray := TRUE;
|
|
END_IF
|
|
3:
|
|
Com.SendMessage := 't$R';
|
|
Step := Step +1;
|
|
4:
|
|
IF find(ReceiveMessage , 'Ready ')> 0 THEN
|
|
TrayNumber := STRING_TO_BYTE(MID(ReceiveMessage, 2, 7));
|
|
IF TrayNumber <> SlotNr AND SlotNr = 0 THEN
|
|
Step := 20;
|
|
ELSE
|
|
Step := 10;
|
|
END_IF
|
|
END_IF
|
|
10:
|
|
IF SCAN(TrayNumber) THEN
|
|
Step := 100;
|
|
END_IF
|
|
20:
|
|
Com.SendMessage := 'r$R';
|
|
Step := Step +1;
|
|
21:
|
|
IF ReceiveMessage = 'Reset$R$N' THEN //Feeder Ok
|
|
Step := Step +1;
|
|
END_IF
|
|
|
|
22:
|
|
IF ReceiveMessage = 'Ready$R$N' THEN //Feeder Ok
|
|
Step := 0;
|
|
END_IF
|
|
100:
|
|
GetTray := TRUE;
|
|
Step := 0;
|
|
END_CASE]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="IndexNext" Id="{917b69f2-35a5-4226-a03d-eaf6c67cc259}">
|
|
<Declaration><![CDATA[METHOD IndexNext : BOOL
|
|
VAR_INPUT
|
|
SlotNr : USINT := 0;
|
|
END_VAR
|
|
VAR_INST
|
|
Step : INT;
|
|
|
|
Size : USINT;
|
|
|
|
MAP : ARRAY [1..MaxNumberOfWafer] OF BYTE;
|
|
|
|
MaxNumberOfSlots : SINT;
|
|
|
|
i : INT;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
|
|
bInNextSlot := FALSE;
|
|
Step := 0;
|
|
RETURN;
|
|
END_IF
|
|
|
|
CASE Step OF
|
|
0:
|
|
CASE SlotNr OF
|
|
0:
|
|
Com.SendMessage := 'f$R';
|
|
ELSE
|
|
fbFormatString(
|
|
sFormat := 'f%d$R',
|
|
arg1 := F_USINT(SlotNr),
|
|
sOut => Com.SendMessage
|
|
);
|
|
END_CASE
|
|
TrayNumber := 0;
|
|
Step := Step +1;
|
|
1:
|
|
IF ReceiveMessage = 'Index Fast$R$N' THEN
|
|
Step := Step +1;
|
|
END_IF
|
|
2:
|
|
IF ReceiveMessage = 'Ready$R$N' THEN
|
|
Step := Step +1;
|
|
END_IF
|
|
|
|
IF ReceiveMessage = 'AtBottom$R$N' THEN
|
|
EOT := TRUE;
|
|
TrayNumber := 0;
|
|
Step := 0;
|
|
END_IF
|
|
3:
|
|
Com.SendMessage := 't$R';
|
|
Step := Step +1;
|
|
4:
|
|
IF find(ReceiveMessage , 'Ready ')> 0 THEN
|
|
TrayNumber := STRING_TO_BYTE(MID(ReceiveMessage, 2, 7));
|
|
Step := 10;
|
|
END_IF
|
|
10:
|
|
CASE iStation OF
|
|
10:
|
|
IF KeyenceCamera.SizeDetection(Out=>Size) THEN
|
|
Step := 20;
|
|
END_IF
|
|
ELSE
|
|
Step := 100;
|
|
END_CASE
|
|
20:
|
|
MaxNumberOfSlots := ROBOT_MAIN.Config.ConfigKUKA.StationsTrayScan[iStation][Size].MaxNumber;
|
|
IF KeyenceCamera.Mapping(Size := Size, MaxNumberOfSlots := MaxNumberOfSlots, Out := MAP) THEN
|
|
Step := 30;
|
|
END_IF
|
|
30:
|
|
// FOR i := 1 TO MaxNumberOfSlots DO
|
|
FOR i := 1 TO MaxNumberOfSlots DO
|
|
CASE MAP[i] OF
|
|
0:
|
|
CASSETTE_MAIN[iStation].Signal.Wafer[i+(TrayNumber-1)*100].WaferStatus := noWafer;
|
|
1:
|
|
CASSETTE_MAIN[iStation].Signal.Wafer[i+(TrayNumber-1)*100].WaferStatus := WaferForProccess;
|
|
CASSETTE_MAIN[iStation].Signal.Wafer[i+(TrayNumber-1)*100].Size := Size;
|
|
ELSE
|
|
CASSETTE_MAIN[iStation].Signal.Wafer[i+(TrayNumber-1)*100].WaferStatus := WaferDefect;
|
|
END_CASE
|
|
END_FOR
|
|
// END_FOR
|
|
Step := 100;
|
|
100:
|
|
IndexNext := TRUE;
|
|
Step := 0;
|
|
END_CASE]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="Init" Id="{5c61d018-8396-4e36-bc22-559db2a85c23}">
|
|
<Declaration><![CDATA[METHOD Init : BOOL
|
|
VAR_INPUT
|
|
END_VAR
|
|
VAR_INST
|
|
Step : INT;
|
|
END_VAR]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
|
|
bInInit := FALSE;
|
|
Step := 0;
|
|
RETURN;
|
|
END_IF
|
|
|
|
(*CASE iStation OF
|
|
FirstCassette:
|
|
Step := 100;
|
|
END_CASE*)
|
|
|
|
IF Error THEN
|
|
RETURN;
|
|
END_IF
|
|
|
|
CASE Step OF
|
|
0:
|
|
bOutInitDone := FALSE;
|
|
Com.SendMessage := 'r$R';
|
|
Step := Step +1;
|
|
1:
|
|
IF ReceiveMessage = 'Reset$R$N' THEN //Feeder Ok
|
|
Step := 10;
|
|
END_IF
|
|
10:
|
|
IF find(ReceiveMessage, 'Error') > 0 THEN
|
|
error_index := AlarmSend(iStation,MsgId := Cassette_ErrorNr.eInitError,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
|
Step := 0;
|
|
Error := TRUE;
|
|
END_IF
|
|
|
|
|
|
IF ReceiveMessage = 'Ok$R$N' THEN //Feeder Ok
|
|
DelayTimer(IN := FALSE);
|
|
Step := 20;
|
|
RETURN;
|
|
END_IF
|
|
|
|
IF ReceiveMessage = 'Door open$R$N' THEN
|
|
DelayTimer(IN := FALSE);
|
|
Error := TRUE;
|
|
error_index := AlarmSend(iStation:=iStation,MsgId := Cassette_ErrorNr.eDoorIsOpened,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
|
|
Step := 0;
|
|
RETURN;
|
|
END_IF
|
|
|
|
DelayTimer(IN := TRUE, PT := T#3S);
|
|
IF DelayTimer.Q THEN
|
|
DelayTimer(IN := FALSE);
|
|
Com.SendMessage := '?$R';;
|
|
END_IF
|
|
20:
|
|
DelayTimer(IN := FALSE);
|
|
IF EndOfLot() THEN
|
|
Step := 100;
|
|
END_IF
|
|
100:
|
|
bOutInitDone := TRUE;
|
|
bInInit := FALSE;
|
|
Init := TRUE;
|
|
Step := 0;
|
|
END_CASE]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="Initialization" Id="{1a52974d-9b9d-4f6a-9471-528fee3f36aa}">
|
|
<Declaration><![CDATA[METHOD Initialization : BOOL
|
|
VAR_INPUT
|
|
iStation : INT;
|
|
IPAdress : T_IPv4Addr;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[PeripherieInitialization(iStation);
|
|
|
|
Com.IPAdress := IPAdress;
|
|
Com.Port := 5000;
|
|
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayInit].ServiceName[0] := 'Tray Feeder$NInitialization';
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayInit].ServiceName[1] := 'Tray Feeder$NInitialisierung';
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayInit].bReferenceControl REF= bInInit;
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayInit].InputAvailable := TRUE;
|
|
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayNextSlot].ServiceName[0] := 'Tray Feeder$NNext Slot';
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayNextSlot].ServiceName[1] := 'Tray Feeder$NNächster Slot';
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayNextSlot].bReferenceControl REF= bInNextSlot;
|
|
MediaArray[iStation][eCassetteMedienNamen.TrayNextSlot].InputAvailable := TRUE;
|
|
|
|
CMD_LOGGER.LogPath := CONCAT('D:\Obducat\LOG_CMD\', iStationStatus.StationName);
|
|
CMD_LOGGER.LogPath := CONCAT(CMD_LOGGER.LogPath, '\');
|
|
CMD_LOGGER.LogString REF= ReceiveArray[0];
|
|
]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="SCAN" Id="{5c614fc8-adf9-4537-b41a-2096fd053a28}">
|
|
<Declaration><![CDATA[METHOD SCAN : BOOL
|
|
VAR_INPUT
|
|
TrayNumber : INT := 0;
|
|
END_VAR
|
|
VAR_INST
|
|
Step : INT;
|
|
MAP : ARRAY [1..MaxNumberOfSubstratesPerTray] OF BYTE;
|
|
i : INT;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
|
|
Step := 0;
|
|
RETURN;
|
|
END_IF
|
|
|
|
CASE Step OF
|
|
0:
|
|
FOR i := 1 TO MaxNumberOfSubstratesPerTray DO
|
|
AllWafer[TrayNumber*100+i].WaferStatus := noWafer;
|
|
END_FOR
|
|
|
|
CASE iStation OF
|
|
10:
|
|
IF KeyenceCamera.SizeDetection(Out=>_Size) THEN
|
|
Step := 20;
|
|
END_IF
|
|
ELSE
|
|
Step := 100;
|
|
END_CASE
|
|
20:
|
|
IF _Size > 0 THEN
|
|
LastSizeFound := _Size;
|
|
iStationStatus.WaferInfo[0].Size := _Size;
|
|
IF KeyenceCamera.Mapping(Size := _Size, Out := MAP) THEN
|
|
Step := 30;
|
|
END_IF
|
|
ELSE
|
|
Step := 100;
|
|
END_IF
|
|
30:
|
|
FOR i := 1 TO MaxNumberOfSubstratesPerTray DO
|
|
CASE MAP[i] OF
|
|
0:
|
|
AllWafer[i+TrayNumber*100].WaferStatus := noWafer;
|
|
1:
|
|
AllWafer[i+TrayNumber*100].WaferStatus := WaferForProccess;
|
|
AllWafer[i+TrayNumber*100].Size := _Size;
|
|
ELSE
|
|
AllWafer[i+TrayNumber*100].WaferStatus := WaferDefect;
|
|
END_CASE
|
|
END_FOR
|
|
Step := 0;
|
|
SCAN := TRUE;
|
|
100:
|
|
FOR i := 1 TO MaxNumberOfSubstratesPerTray DO
|
|
AllWafer[i+TrayNumber*100].WaferStatus := noWafer;
|
|
END_FOR
|
|
Step := 0;
|
|
SCAN := TRUE;
|
|
END_CASE]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Property Name="SubstrateGripperSize" Id="{f9a39544-3d12-4d88-a1ae-aa538a38c6ef}">
|
|
<Declaration><![CDATA[PROPERTY SubstrateGripperSize : USINT]]></Declaration>
|
|
<Get Name="Get" Id="{6a1aa3aa-3dba-47e3-b5ba-41dff6a68890}">
|
|
<Declaration><![CDATA[VAR
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[SubstrateGripperSize := ROBOT_MAIN.GetGripperSize(_Size);]]></ST>
|
|
</Implementation>
|
|
</Get>
|
|
</Property>
|
|
</POU>
|
|
</TcPlcObject> |