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,624 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.13">
<POU Name="GENERAL_MAIN_FB" Id="{b5148723-afa6-43ad-b3aa-b206f2e9a813}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK GENERAL_MAIN_FB EXTENDS Station_GENERAL_MAIN_FB IMPLEMENTS I_STATION_CMD_CALL
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
i,j : UDINT;
RobotJob : REFERENCE TO sScheduler;
CassetteNumber : INT;
TargetStation : UDINT;
NextProcess : INT;
RobotStatus : REFERENCE TO sStationStatus;
bInitialization : BOOL;
bFirstCall : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Method Name="CheckMachineForCoolDown" Id="{c7a2b26a-bc4c-459a-ac82-81f159ae8d89}">
<Declaration><![CDATA[METHOD CheckMachineForCoolDown : BOOL
VAR_INPUT
END_VAR
VAR
i : INT;
END_VAR
VAR_INST
Ready : BOOL;
Timer : TON;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[Ready := FALSE;
FOR i := FirstStation TO LastStation DO
IF StationsStatus[i].Ist.Busy THEN
Ready := TRUE;
END_IF
IF StationsStatus[i].Ist.Service THEN
Ready := TRUE;
END_IF
END_FOR
Timer(IN := NOT Ready, PT := T#10M);
bCoolDown := Timer.Q;]]></ST>
</Implementation>
</Method>
<Method Name="FB_Init" Id="{0fee2ebc-13f3-4dc2-9c22-e1eb5f8daca1}">
<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
VAR
i : INT;
Count : INT;
TempString : STRING;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[StationsStatus[GeneralStation].StationType := TypeGeneral;
StationsStatus[GeneralStation].StationCMDCall := GENERAL_MAIN;
StationsStatus[GeneralStation].StationCMDCall.Initialization(GeneralStation);]]></ST>
</Implementation>
</Method>
<Method Name="FirstCall" Id="{6041a1c1-a08f-43ec-abfe-0c44478731a1}">
<Declaration><![CDATA[METHOD FirstCall : BOOL
VAR_INPUT
END_VAR
VAR
TempString : STRING;
i, count : INT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[PaddleMode := ePaddleMode.UpperPaddle;
FOR i := FirstCassette TO LastCassette DO
StationsStatus[i].StationType := TypeCassette;
END_FOR
StationsStatus[AlignerStation].StationType := TypeAligner;
StationsStatus[CodeReaderStation].StationType := TypeCodeReader;
FOR i := FirstSpinner TO LastSpinner DO
StationsStatus[i].StationType := TypeCleaner;
END_FOR
FOR i := FirstHotplate TO LastHotplate DO
StationsStatus[i].StationType := TypeHotplate;
END_FOR
FOR i := FirstCoolplate TO LastCoolplate DO
StationsStatus[i].StationType := TypeCoolplate;
END_FOR
StationsStatus[FirstHV].StationType := TypeHVHot;
StationsStatus[LastHV].StationType := TypeHVCold;
FOR i := FirstLelaxStation TO LastRelaxStation DO
StationsStatus[i].StationType := TypeRelax;
END_FOR
StationsStatus[MediaStation].StationType := TypeMedia;
StationsStatus[RobotStation].StationType := TypeRobot;
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
ELSE
CONTINUE;
TypeCassette:
StationsStatus[i].StationCMDCall := CASSETTE_MAIN[i];
TypeAligner:
StationsStatus[i].StationCMDCall := ALIGNER_MAIN;
TypeCodeReader:
StationsStatus[i].StationCMDCall := CodeReader_MAIN;
TypeCleaner:
StationsStatus[i].StationCMDCall := SPINNER_MAIN[i];
TypeHotplate, TypeCoolplate:
StationsStatus[i].StationCMDCall := HOTPLATE_MAIN[i];
TypeHVHot, TypeHVCold:
StationsStatus[i].StationCMDCall := HV_MAIN[i];
TypeMedia:
StationsStatus[i].StationCMDCall := MEDIA_MAIN;
TypeRobot:
StationsStatus[i].StationCMDCall := ROBOT_MAIN;
TypeRelax:
StationsStatus[i].StationCMDCall := RETRY_MAIN[i];
END_CASE
StationsStatus[i].StationCMDCall.Initialization(i);
Count := StationAlternative[StationsStatus[i].StationType].Count +1;
StationAlternative[StationsStatus[i].StationType].List[Count] := i;
StationAlternative[StationsStatus[i].StationType].ListName[Count] := StationsStatus[i].StationName;
StationAlternative[StationsStatus[i].StationType].Count := Count;
END_FOR
GetRecipeTypeList();
bFirstCall := TRUE;
SlowTaskEnable := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="INIT" Id="{7cd33883-92b8-4ace-91bb-779b0d425e30}">
<Declaration><![CDATA[METHOD INIT : BOOL
VAR_INST
i,j : INT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[(*CASE Step OF
0:
IF NOT MEDIA_MAIN.IO.bInCDAOk THEN
iStationStatus.Error := TRUE;
iStationStatus.StepRetry := 0;
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eCDA,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
RETURN;
END_IF
(* IF NOT MEDIA_MAIN.IO.bInVacOk THEN
iStationStatus.Error := TRUE;
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eVacuum,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
RETURN;
END_IF*)
Step := 10;
10:
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
CMD[RobotStation] := InitCMD;
step := step +1;
END_IF
11:
IF StationsStatus[RobotStation].Ist.InitDone THEN
step := 20;
END_IF
20:
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
noStationType, TypeRobot, TypeGeneral:
;
ELSE
IF StationsStatus[i].Ist.Busy THEN
RETURN;
END_IF
END_CASE
END_FOR
step := step +1;
21:
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
noStationType, TypeRobot, TypeGeneral:
;
ELSE
IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN
CMD[i] := InitCMD;
END_IF
END_CASE
END_FOR
step := step +1;
22:
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
noStationType, TypeRobot, TypeGeneral, TypeMedia:
;
ELSE
IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN
RETURN;
END_IF
END_CASE
END_FOR
step := 30;
30:
step := 100;
100:
INIT := TRUE;
Step := 0;
END_CASE*)
CASE _Step OF
0:
IF NOT MEDIA_MAIN.IO.bInCDAOk THEN
iStationStatus.Error := TRUE;
iStationStatus.StepRetry := 0;
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eCDA,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
RETURN;
END_IF
(*IF NOT MEDIA_MAIN.IO.bInVacOk THEN
iStationStatus.Error := TRUE;
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eVacuum,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE);
RETURN;
END_IF*)
_Step := 10;
10:
IF NOT StationsStatus[RobotStation].Ist.Busy THEN
CMD[RobotStation] := InitCMD;
_Step := _Step +1;
END_IF
11:
IF StationsStatus[RobotStation].Ist.InitDone THEN
_Step := 20;
END_IF
20:
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
noStationType, TypeRobot, TypeGeneral:
;
ELSE
IF OperationMode[i] = DisableMode THEN
CONTINUE;
END_IF
StationsStatus[i].Soll.Stop := TRUE;
END_CASE
END_FOR
_Step := _Step +1;
21:
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
noStationType, TypeRobot, TypeGeneral:
;
ELSE
IF OperationMode[i] = DisableMode THEN
CONTINUE;
END_IF
IF StationsStatus[i].Soll.Stop OR StationsStatus[i].Ist.Busy THEN
RETURN;
END_IF
END_CASE
END_FOR
_Step := _Step +1;
22:
DelayTimer(IN := TRUE, PT := T#1S);
IF DelayTimer.Q THEN
DelayTimer(IN := FALSE);
_Step := _Step +1;
END_IF
23:
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
noStationType, TypeRobot, TypeGeneral:
;
ELSE
IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN
CMD[i] := InitCMD;
END_IF
END_CASE
END_FOR
_Step := _Step +1;
24:
FOR i:= FirstStation TO LastStation DO
CASE StationsStatus[i].StationType OF
noStationType, TypeRobot, TypeGeneral, TypeMedia:
;
ELSE
IF CMD[i] = InitCMD THEN
RETURN;
END_IF
END_CASE
END_FOR
_Step := 30;
30:
_Step := 100;
100:
bInitialization := FALSE;
INIT := TRUE;
_Step := 0;
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="Initialization" Id="{e51989ad-3094-4485-bbc7-87361ec6fa7f}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_VisuName := 'SYSTEM';
_NoConfigFile := TRUE;
InitializationExt(iStation);
RobotStatus REF=StationsStatus[RobotStation];
iStationStatus.StationName := 'System';
iStationStatus.ErrorList := 'SystemErrorList';
RobotJob REF= Scheduler[RobotStation];
iMediaArray[eMainMedienNamen.Pause].ServiceName[0] := 'Pause';
iMediaArray[eMainMedienNamen.Pause].ServiceName[1] := 'Pause';
iMediaArray[eMainMedienNamen.Pause].bReferenceControl REF= bPause;
iMediaArray[eMainMedienNamen.Pause].InputAvailable := TRUE;
iMediaArray[eMainMedienNamen.Empty].ServiceName[0] := 'Empty';
iMediaArray[eMainMedienNamen.Empty].ServiceName[1] := 'Empty';
iMediaArray[eMainMedienNamen.Empty].bReferenceControl REF= bEmpty;
iMediaArray[eMainMedienNamen.Empty].InputAvailable := TRUE;
iMediaArray[eMainMedienNamen.Initialization].ServiceName[0] := 'Initialization';
iMediaArray[eMainMedienNamen.Initialization].ServiceName[1] := 'Initialization';
iMediaArray[eMainMedienNamen.Initialization].bReferenceControl REF= bInitialization;
iMediaArray[eMainMedienNamen.Initialization].InputAvailable := TRUE;
iMediaArray[eMainMedienNamen.Initialization].NoErrorInput := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="MAIN" Id="{4e8331ba-95d4-46bc-9181-64b3616fc779}">
<Declaration><![CDATA[METHOD MAIN : BOOL
VAR_INST
i : INT;
Step : INT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF NOT bFirstCall THEN
FirstCall();
END_IF
KeyenceCamera();
CheckMachineForCoolDown();
nCounter := nCounter +1;
IF bResetCounter THEN
nCounter := 0;
END_IF
FOR i := FirstCassette TO LastCassette DO
IF CMD[i] = StartCMD THEN
iCMD := StartCMD;
EXIT;
END_IF
END_FOR
IF bInitialization AND NOT iStationStatus.Ist.Busy THEN
iCMD := InitCMD;
END_IF
iMediaArray[eMainMedienNamen.Initialization].Input := iStationStatus.Ist.InitDone;
iMediaArray[eMainMedienNamen.Initialization].Invisible := NOT InAktorspannung;
iMediaArray[eMainMedienNamen.Pause].Invisible := iCMD <> StartCMD;
iMediaArray[eMainMedienNamen.Empty].Invisible := iCMD <> StartCMD;
WaferInSystem := FALSE;
FOR i := FirstSpinner TO RobotStation DO
IF StationsStatus[i].WaferInfo[0].Number > 0 THEN
WaferInSystem := TRUE;
END_IF
END_FOR
IF StationsStatus[RobotStation].WaferInfo[1].Number > 0 THEN
WaferInSystem := TRUE;
END_IF
CASE PaddleMode OF
ePaddleMode.All:
TimeBetweenProcesses := 10;
ePaddleMode.LowerPaddle, ePaddleMode.UpperPaddle:
TimeBetweenProcesses := 20;
END_CASE
SubstrateOnRetry := FALSE;
FOR i := FirstLelaxStation TO LastRelaxStation DO
IF StationsStatus[i].WaferInfo[0].Number > 0 THEN
SubstrateOnRetry := TRUE;
END_IF
END_FOR
]]></ST>
</Implementation>
</Method>
<Method Name="Start" Id="{1bb288b1-fbde-4125-a70c-cc4741de9337}">
<Declaration><![CDATA[METHOD Start : BOOL
VAR_INPUT
END_VAR
VAR_INST
i,j : INT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF NOT Safety_PRG.MediaOk THEN
bEmpty := TRUE;
END_IF
CASE _Step OF
0:
IF bPause THEN
RETURN;
END_IF
IF RobotJob.NumberOfjob > 0 THEN
_Step := 10;
ELSE
FOR i := FirstCassette TO LastCassette DO
IF StationsStatus[i].Ist.Busy THEN
RETURN;
END_IF
END_FOR
_Step := 90;
END_IF
10:
IF bPause THEN
RETURN;
END_IF
IF RobotJob.NumberOfjob = 0 OR ChuckChangeBusy THEN
_Step := 0;
RETURN;
END_IF
IF StationsStatus[RobotStation].Ist.Busy THEN
_Step := 0;
RETURN;
END_IF
FOR i := 0 TO MIN(20, RobotJob.NumberOfjob) DO
IF IsTargetReady(RobotJob.Job[i]) THEN
CassetteNumber := RobotJob.Job[i].CassetteNumber;
ROBOT_MAIN.TargetSlot := RobotJob.Job[i].WaferNumber;
CASE CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].WaferStatus OF
WaferForProccess:
IF SubstrateOnRetry THEN
CONTINUE;
END_IF
END_CASE
_Step := 20;
RETURN;
END_IF
END_FOR
20:
CASE CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].WaferStatus OF
WaferForProccess:
ROBOT_MAIN.TargetStation := CassetteNumber;
//ROBOT_MAIN.Size := CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].Size;
_Step := _Step +1;
ELSE
FOR i := FirstStation TO LastStation DO
IF StationsStatus[i].WaferInfo[0].CassetteNumber = CassetteNumber AND StationsStatus[i].WaferInfo[0].Number = ROBOT_MAIN.TargetSlot THEN
ROBOT_MAIN.TargetStation := i;
_Step := _Step +1;
RETURN;
END_IF
END_FOR
END_CASE
21:
IF NOT RobotStatus.Ist.Busy THEN
CASE PaddleMode OF
ePaddleMode.All, ePaddleMode.UpperPaddle:
ROBOT_MAIN.TargetPuddle := 0;
ePaddleMode.LowerPaddle:
ROBOT_MAIN.TargetPuddle := 1;
END_CASE
CMD[RobotStation] := GetCMD;
_Step := _Step +1;
END_IF
22:
IF RobotStatus.Ist.Busy THEN
_Step := _Step +1;
END_IF
23:
IF NOT RobotStatus.Ist.Busy THEN
IF RobotStatus.WaferInfo[0].Number > 0 OR RobotStatus.WaferInfo[1].Number > 0 THEN
_Step := 30;
ELSE
_Step := 0;
END_IF
END_IF
30:
IF StationsStatus[RobotStation].WaferInfo[0].Number > 0 THEN
NextProcess := StationsStatus[RobotStation].WaferInfo[0].FlowStepNumber +1;
ELSIF StationsStatus[RobotStation].WaferInfo[1].Number > 0 THEN
NextProcess := StationsStatus[RobotStation].WaferInfo[1].FlowStepNumber +1;
ELSE
RETURN;
END_IF
IF CASSETTE_PROCESS[CassetteNumber][ROBOT_MAIN.TargetSlot][NextProcess].TargetStation = 0 THEN
ROBOT_MAIN.TargetStation := CassetteNumber;
ELSE
ROBOT_MAIN.TargetStation := CASSETTE_PROCESS[CassetteNumber][ROBOT_MAIN.TargetSlot][NextProcess].TargetStation;
END_IF
IF StationsStatus[ROBOT_MAIN.TargetStation].WaferInfo[0].Number = 0 THEN
_Step := 50;
ELSE
_Step := 40;
END_IF
40:
IF RobotStatus.Ist.Busy THEN
RETURN;
END_IF
CMD[RobotStation] := ChangeCMD;
_Step := _Step +1;
41:
IF RobotStatus.Ist.Busy THEN
RETURN;
END_IF
IF RobotStatus.WaferInfo[0].Number > 0 THEN
CassetteNumber := RobotStatus.WaferInfo[0].CassetteNumber;
ROBOT_MAIN.TargetSlot := RobotStatus.WaferInfo[0].Number;
ELSIF RobotStatus.WaferInfo[1].Number > 0 THEN
CassetteNumber := RobotStatus.WaferInfo[1].CassetteNumber;
ROBOT_MAIN.TargetSlot := RobotStatus.WaferInfo[1].Number;
ELSE
_Step := 0;
RETURN;
END_IF
_Step := _Step +1;
42:
_Step := 30;
50:
IF StationsStatus[RobotStation].WaferInfo[0].Number > 0 AND StationsStatus[RobotStation].WaferInfo[1].Number = 0 THEN
ROBOT_MAIN.TargetPuddle := 0;
ELSIF StationsStatus[RobotStation].WaferInfo[1].Number > 0 AND StationsStatus[RobotStation].WaferInfo[0].Number = 0 THEN
ROBOT_MAIN.TargetPuddle := 1;
ELSE
RETURN;
END_IF
IF RobotStatus.Ist.Busy THEN
RETURN;
END_IF
CASE StationsStatus[ROBOT_MAIN.TargetStation].StationType OF
TypeCassette:
IF StationsStatus[ROBOT_MAIN.TargetStation].Ist.CloseIn OR CMD[ROBOT_MAIN.TargetStation] = StartCMD THEN
CMD[RobotStation] := PutCMD;
_Step := _Step +1;
END_IF
ELSE
CMD[RobotStation] := PutCMD;
_Step := _Step +1;
END_CASE
51:
IF RobotStatus.Ist.Busy THEN
_Step := _Step +1;
END_IF
52:
IF RobotStatus.Ist.Busy THEN
RETURN;
END_IF
IF StationsStatus[ROBOT_MAIN.TargetStation].OnlyMoveToStation THEN
_Step := 30;
ELSE
_Step := 10;
END_IF
90:
ROBOT_MAIN.RobotControl.bOut_EndOfCycle := TRUE;
IF ROBOT_MAIN.RobotControl.bIn_PGNO_REG THEN
ROBOT_MAIN.RobotControl.bOut_EndOfCycle := FALSE;
_Step := 100;
END_IF
100:
bEmpty := FALSE;
Start := TRUE;
_Step := 0;
END_CASE
]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>