Initial
This commit is contained in:
514
PLC/1 Cassette/TrayFeeder/TrayFeeder_FB.TcPOU
Normal file
514
PLC/1 Cassette/TrayFeeder/TrayFeeder_FB.TcPOU
Normal file
@@ -0,0 +1,514 @@
|
||||
<?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>
|
||||
Reference in New Issue
Block a user