Files
infineon_legacy_plc/PLC/7 CodeReader/CodeReader_MAIN_FB.TcPOU
2026-01-08 11:08:17 +01:00

163 lines
4.6 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.13">
<POU Name="CodeReader_MAIN_FB" Id="{ebc21b2c-3341-4cce-92b4-b610f9a91412}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK CodeReader_MAIN_FB EXTENDS Station_GENERAL_MAIN_FB IMPLEMENTS I_STATION_CMD_CALL
VAR_INPUT
bManualInput : BOOL;
ManualInput_LotID : T_MaxString;
ManualInput_SlotID : T_MaxString;
END_VAR
VAR_OUTPUT
Data : T_MaxString;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Method Name="CloseInOut" Id="{98e834d3-3fd9-47dc-9bba-c6f0ac9c1607}">
<Declaration><![CDATA[METHOD CloseInOut : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[Data := '';
CloseInOut := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="FB_Init" Id="{35b2e7ea-9b17-4288-a1e2-8ad0a9ea6ba7}">
<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]]></Declaration>
<Implementation>
<ST><![CDATA[_VisuName := 'CODE';
_NoConfigFile := TRUE;
_SchedulerManagement := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="Initialization" Id="{ffa54c1b-5765-43b2-8c91-574c9be93f5e}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[
InitializationExt(iStation);
iStationStatus.NoScan := TRUE;
iStationStatus.OnlyMoveToStation := TRUE;
iStationStatus.NoRecipe := TRUE;
iStationStatus.StationName := 'Code Reader';
RecipeStationName[iStation] := 'Code Reader';
iStationStatus.ErrorList := 'CODE_ErrorNr';]]></ST>
</Implementation>
</Method>
<Method Name="MAIN" Id="{f434c5f4-d993-4d4a-8406-28b10f61f92c}">
<Declaration><![CDATA[METHOD MAIN : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="Start" Id="{ff149edf-77e8-4f32-aa05-c132608a9600}">
<Declaration><![CDATA[METHOD Start : BOOL
VAR
fbFormat : FB_FormatString;
END_VAR
VAR_INST
Path : STRING;
CreateDir : FB_CreateDir;
Pos : INT;
Size : INT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _Step OF
0:
IF KeyenceCamera.DMC(iStationStatus.WaferInfo[0].Size ,Data := Data) THEN
IF LEN(Data) > 0 THEN
_Step := 10;
ELSE
ManualInput_LotID := '';
ManualInput_SlotID := '';
_Step := 15;
END_IF
END_IF
10:
Size := LEN(Data);
IF iStationStatus.Ist.Service OR Size = 0 THEN
_Step := 100;
ELSE
_Step := 20;
END_IF
15:
bManualInput := TRUE;
_Step := _Step +1;
16:
IF NOT bManualInput THEN
iStationStatus.WaferInfo[0].LotID := ManualInput_LotID;
iStationStatus.WaferInfo[0].SlotID := ManualInput_SlotID;
_Step := 21;
END_IF
20:
CASE CMD[FirstStation] OF
StartCMD:
;
ELSE
_Step := 100;
RETURN;
END_CASE
Pos := FIND(Data, '/');
IF Pos > 0 THEN
iStationStatus.WaferInfo[0].LotID := LEFT(Data, Pos - 1);
iStationStatus.WaferInfo[0].SlotID := DELETE(Data, Pos, 1);
_Step := _Step +1;;
ELSE
iStationStatus.WaferInfo[0].SlotID := Data;
_Step := 30;
END_IF
21:
Path := CONCAT(LOG_MAIN_PATH, iStationStatus.WaferInfo[0].LotStartTime);
Path := CONCAT(Path, '\');
Path := CONCAT(Path, iStationStatus.WaferInfo[0].LotID);
CreateDir(sPathName := Path, bExecute := TRUE);
_Step := _Step +1;
22:
IF CreateDir.bError OR NOT CreateDir.bBusy THEN
_Step := 30;
END_IF
CreateDir(bExecute := FALSE);
30:
Path := CONCAT(LOG_MAIN_PATH, iStationStatus.WaferInfo[0].LotStartTime);
Path := CONCAT(Path, '\');
Path := CONCAT(Path, iStationStatus.WaferInfo[0].LotID);
Path := CONCAT(Path, '\');
Path := CONCAT(Path, iStationStatus.WaferInfo[0].SlotID);
CreateDir(sPathName := Path, bExecute := TRUE);
_Step := _Step +1;
31:
IF CreateDir.bError THEN
_Step := 200;
ELSIF NOT CreateDir.bBusy THEN
_Step := 100;
END_IF
CreateDir(bExecute := FALSE);
100:
Start := TRUE;
_Step := 0;
END_CASE
]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>