This commit is contained in:
2026-01-08 11:08:17 +01:00
commit fe882dc444
311 changed files with 511562 additions and 0 deletions

View File

@@ -0,0 +1,368 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.13">
<POU Name="KeyenceCamera_FB" Id="{e04efa2a-35e2-41b0-8dcf-22b085953a3c}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK KeyenceCamera_FB EXTENDS Peripherie_FB
VAR_INPUT
Trigger AT %Q* : BOOL;
Result_Ack AT %Q* : BOOL;
Go_to_Run AT %Q* : BOOL;
Go_to_Setting AT %Q* : BOOL;
rOutProgramNumber AT %Q* : UDINT;
bOutProgramLoadExecute AT %Q* : BOOL;
END_VAR
VAR_OUTPUT
CameraInputData : ARRAY [0..288] OF BYTE;
ResultData128 AT %I* : ARRAY [0..127] OF BYTE;
ResultData32 AT %I* : ARRAY [1..5] OF ARRAY [0..31] OF BYTE;
ToolJudge AT %I* : ARRAY[0..3] OF BYTE;
ToolJudgeArray AT %I* : ARRAY[0..3] OF ARRAY[0..7] OF BOOL;
Trigger_Ready AT %I* : BOOL;
Trigger_Ack AT %I* : BOOL;
Run_Status AT %I* : BOOL;
Result_Ready AT %I* : BOOL;
rInProgramNumber AT %I* : UDINT;
bOutProgramLoadComplete AT %I* : BOOL;
bOutBusy : BOOL;
END_VAR
VAR
i : LWORD;
END_VAR
VAR CONSTANT
SizeDetectionDataSize : USINT := 15;
MappingDataSize : SINT := 79;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[MEMMOVE(ADR(CameraInputData), ADR(ResultData128), SIZEOF(ResultData128));
FOR i := 1 TO 5 DO
MEMMOVE(ADR(CameraInputData)+128+(i-1)*32, ADR(ResultData32[i]), SIZEOF(ResultData32[i]));
END_FOR]]></ST>
</Implementation>
<Method Name="DMC" Id="{823d2044-934c-4f9a-bd4c-2fe6af4ff611}">
<Declaration><![CDATA[METHOD DMC : BOOL
VAR_INPUT
Size : USINT;
Data : REFERENCE TO T_MaxString;
END_VAR
VAR_INST
Step : INT;
Counter : INT;
ManualData : T_MaxString;
END_VAR
VAR CONSTANT
cProgram : UDINT := 400;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[CASE Step OF
0:
IF bOutBusy THEN
RETURN;
END_IF
bOutBusy := TRUE;
Step := 10;
Counter := 0;
10:
IF RunProgram(cProgram+Size) THEN
Step := 20;
END_IF
20:
CASE CameraInputData[28] OF
0:
Counter := Counter +1;
IF Counter > 3 THEN
DMC := TRUE;
Step := 0;
bOutBusy := FALSE;
//Step := 110;
ELSE
Step := 10;
END_IF
1:
Step := 30;
END_CASE
30:
Data := '';
MEMMOVE(ADR(Data), ADR(CameraInputData[30]), CameraInputData[29]);
DMC := TRUE;
Step := 0;
bOutBusy := FALSE;
40:
Data := ManualData;
DMC := TRUE;
bOutBusy := FALSE;
Step := 0;
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="GetCurrentCameraPosition" Id="{7a36b66a-c0d0-4d66-a705-d59bc7557dd3}">
<Declaration><![CDATA[METHOD GetCurrentCameraPosition : ARRAY[0..MaxNumberOfSubstratesPerTray-1] OF ARRAY[0..1] OF UINT;
VAR_INPUT
END_VAR
VAR
i : INT;
DummyData : ARRAY[0..1] OF BYTE;
END_VAR
VAR_INST
Data : ARRAY[0..MaxNumberOfSubstratesPerTray*4-1] OF BYTE;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[MEMMOVE(ADR(Data), ADR(CameraInputData[29]), SIZEOF(Data));
FOR i := 0 TO MaxNumberOfSubstratesPerTray-1 DO
DummyData[0] := Data[(i)*4+1];
DummyData[1] := Data[(i)*4];
MEMMOVE(ADR(GetCurrentCameraPosition[i][0]), ADR(DummyData), SIZEOF(DummyData));
DummyData[0] := Data[(i)*4+3];
DummyData[1] := Data[(i)*4+2];
MEMMOVE(ADR(GetCurrentCameraPosition[i][1]), ADR(DummyData), SIZEOF(DummyData));
END_FOR]]></ST>
</Implementation>
</Method>
<Method Name="Mapping" Id="{e769376f-5b47-48bb-b89d-28e7c6e5ce78}">
<Declaration><![CDATA[METHOD Mapping : BOOL
VAR_INPUT
Size : USINT;
Out : REFERENCE TO ARRAY[1..MaxNumberOfSubstratesPerTray] OF BYTE;
END_VAR
VAR_INST
Step : INT;
Data : ARRAY[0..MaxNumberOfSubstratesPerTray*4-1] OF BYTE;
NumberOfSubstrateDetected : SINT;
MappingArrayPosition : ARRAY[1..MaxNumberOfSubstratesPerTray] OF ARRAY[0..1] OF UINT;
MaxNumberOfWafer : INT;
_Size : USINT;
END_VAR
VAR
i,j : INT;
DummyData : ARRAY[0..1] OF BYTE;
X, Y : DINT;
END_VAR
VAR CONSTANT
cProgram : UDINT := 100;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[CASE Step OF
0:
_Size := Size;
IF bOutBusy THEN
RETURN;
END_IF
bOutBusy := TRUE;
Step := 20;
20:
IF _Size > 0 THEN
IF RunProgram(cProgram+_Size) THEN
Step := 30;
END_IF
END_IF
30:
FOR i := 1 TO MaxNumberOfSubstratesPerTray DO
Out[i] := 0;
END_FOR
NumberOfSubstrateDetected := BYTE_TO_SINT(CameraInputData[28]);
MaxNumberOfWafer := ROBOT_MAIN.Config.SubstrateInformation[_Size].MaxNumber;
IF NumberOfSubstrateDetected = MaxNumberOfWafer THEN
FOR i := 1 TO NumberOfSubstrateDetected DO
Out[i] := 1;
END_FOR
Step := 100;
ELSIF NumberOfSubstrateDetected > 0 THEN
Step := 40;
ELSE
Step := 100;
END_IF
40:
MappingArrayPosition := GetCurrentCameraPosition();
MaxNumberOfWafer := ROBOT_MAIN.Config.SubstrateInformation[_Size].MaxNumber;
i := 1;
Step := 50;
50:
IF i > MaxNumberOfWafer THEN
Step := 100;
ELSE
Step := 60;
END_IF
60:
FOR j := 1 TO NumberOfSubstrateDetected DO
X := UINT_TO_DINT(CASSETTE_MAIN[FirstCassette].Config.TeachPosition[_Size].Position[i].Camera[0]) - UINT_TO_DINT(MappingArrayPosition[j][0]);
Y := UINT_TO_DINT(CASSETTE_MAIN[FirstCassette].Config.TeachPosition[_Size].Position[i].Camera[1]) - UINT_TO_DINT(MappingArrayPosition[j][1]);
IF ABS(X) < 50 AND ABS(Y) < 50 THEN
Out[i] := 1;
EXIT;
END_IF
END_FOR
i := i +1;
Step := 50;
100:
Mapping := TRUE;
Step := 0;
bOutBusy := FALSE;
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="RunProgram" Id="{cd0e6869-d425-4e3a-8113-1920b8b06cec}">
<Declaration><![CDATA[METHOD RunProgram : BOOL
VAR_INPUT
In : UDINT;
END_VAR
VAR_INST
Step : INT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[CASE Step OF
0:
Go_to_Run := TRUE;
IF Run_Status THEN
Go_to_Run := FALSE;
Step := 10;
END_IF
10:
rOutProgramNumber := In;
IF rInProgramNumber = rOutProgramNumber THEN
Step := 20;
ELSE
Step := Step +1;
END_IF
11:
bOutProgramLoadExecute := TRUE;
IF bOutProgramLoadComplete THEN
bOutProgramLoadExecute := FALSE;
Step := 10;
END_IF
20:
IF Trigger_Ready THEN
Trigger := TRUE;
Step := Step +1;
END_IF
21:
IF Trigger_Ack THEN
Trigger := FALSE;
Step := Step +1;
END_IF
22:
IF Result_Ready THEN
Result_Ack := TRUE;
Step := Step +1;
END_IF
23:
IF NOT Result_Ready THEN
Result_Ack := FALSE;
Step := 30;
END_IF
30:
RunProgram := TRUE;
Step := 0;
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="SizeDetection" Id="{ef8e9d1a-4440-4fe2-97d1-cebcaf436cc6}">
<Declaration><![CDATA[METHOD SizeDetection : BOOL
VAR CONSTANT
cProgram : UDINT := 1;
END_VAR
VAR_INPUT
Stop : BOOL := FALSE;
END_VAR
VAR_OUTPUT
Out : USINT;
END_VAR
VAR_INST
Step : INT;
Data : ARRAY[0..SizeDetectionDataSize] OF BYTE;
Found : BOOL;
Counter : INT;
SizeFound : USINT;
END_VAR
VAR
i : USINT;
j : SINT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF Stop THEN
Step := 0;
RETURN;
END_IF
CASE Step OF
0:
IF bOutBusy THEN
RETURN;
END_IF
bOutBusy := TRUE;
Step := 10;
SizeFound := 0;
Found := FALSE;
Counter := 0;
10:
IF Counter < 3 THEN
Step := 20;
ELSE
Step := 110;
END_IF
20:
IF RunProgram(cProgram) THEN
Step := 30;
END_IF
30:
MEMMOVE(ADR(Data), ADR(CameraInputData[28]), SIZEOF(Data));
FOR i := 0 TO SizeDetectionDataSize DO
FOR j := 0 TO 7 DO
IF GETBIT32(Data[i], j) AND NOT Found THEN
SizeFound := i * 8 + SINT_TO_USINT(j) + 1;
Found := TRUE;
ELSIF GETBIT32(Data[i], j) AND Found THEN
SizeFound := 0;
Counter := Counter +1;
Step := 10;
RETURN;
END_IF
END_FOR
END_FOR
IF Found THEN
Step := 40;
ELSE
Counter := Counter +1;
Step := 10;
END_IF
40:
Out := SizeFound;
SizeDetection := TRUE;
Step := 0;
bOutBusy := FALSE;
110:
SizeDetection := TRUE;
Out := 0;
Step := 0;
bOutBusy := FALSE;
END_CASE]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>