Files
infineon_legacy_plc/PLC/1 Cassette/TrayFeeder/TrayFeeder_FB.TcPOU
2026-01-08 11:08:17 +01:00

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>