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,388 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="HOTPLATE_MAIN_FB" Id="{c78ec278-b64d-47fd-8edf-a8957521762d}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK HOTPLATE_MAIN_FB EXTENDS Station_GENERAL_MAIN_FB IMPLEMENTS I_STATION_CMD_CALL
VAR
LastWaferSize : INT;
Recipe : sHotplateRecipe;
RecipeLoad : sHotplateRecipe;
RecipeRead : sHotplateRecipe;
ITempController : I_TempController;
Config : sHotplateConfig;
ConfigOld : sHotplateConfig;
IO : HOTPLATE_IO_FB;
END_VAR
VAR CONSTANT
StepRecipeStart : INT := 10;
StepEnd : INT := 30;
END_VAR
VAR PERSISTENT
// RecipeStandby : sHotplateRecipe;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Folder Name="Start" Id="{4247ae12-9fcc-487a-9107-b49d8dda3a45}" />
<Method Name="CheckFlow" Id="{6e64097a-8642-404f-b16f-da3d4219c0e1}">
<Declaration><![CDATA[METHOD CheckFlow : BOOL
VAR_INPUT
Step : REFERENCE TO INT;
END_VAR
VAR
i : USINT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[CASE Step OF
0:
IF CheckRecipe() THEN
Step := 10;
END_IF
10:
ITempController.Enable := TRUE;
ITempController.TargetTemperature := RecipeRead.TEMPERATURE;
ITempController.Tolerance := RecipeRead.TOL;
Step := Step +1;
11:
IF ITempController.TemperatureInRange() THEN
Step := 20;
ELSE
Step := 110;
END_IF
20:
Step := 100;
100:
iStationStatus.Ist.ReadyForFlow := TRUE;
iStationStatus.Soll.CheckFlow := FALSE;
Step := 0;
110:
iStationStatus.Ist.ReadyForFlow := FALSE;
iStationStatus.Soll.CheckFlow := FALSE;
Step := 0;
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="CloseInOut" Id="{39f7b1c5-23cb-433f-b4a7-a51dba02cb4d}">
<Declaration><![CDATA[METHOD CloseInOut : BOOL
VAR
PutFinished : INT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _Step OF
0:
CASE iCMD OF
CloseInCMD:
IF iStationStatus.Ist.Service THEN
_Step := 50;
ELSE
_Step := 20;
END_IF
CloseOutCMD:
_Step := 50;
END_CASE
20:
IF LoadAutoRecipe() THEN
_Step := 30;
END_IF
30:
IF ITempController.TuneDone THEN
ITempController.TargetTemperature := Recipe.TEMPERATURE;
ITempController.Tolerance := Recipe.TOL;
ITempController.Enable := TRUE;
_Step := _Step +1;
ELSE
AlarmSend(iStation:=iStation,MsgId := HOTPLATE_ErrorNr.eNotTuned,TRUE, eReportType.Error, sAvailableResponse.Ok, FALSE);
iStationStatus.Soll.Stop := TRUE;
END_IF
31:
IF ITempController.TemperatureInRange(IO.rInCurrentTemperature) THEN
_Step := 50;
ELSE
iStationStatus.Error := TRUE;
iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := HOTPLATE_ErrorNr.wTempOutOfRange,TRUE, eReportType.Warning, sAvailableResponse.AbortRetryIgnore, FALSE);
iStationStatus.StepRetry := 0;
iStationStatus.StepIgnore := 50;
END_IF
50:
_Step := 0;
CloseInOut := TRUE;
END_CASE
]]></ST>
</Implementation>
</Method>
<Method Name="FB_Init" Id="{b968b8f2-f4f9-458c-8813-95ad7cbb84a1}">
<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[_DataLogger := TRUE;
_VisuName := 'HOTPLATE';
_SchedulerManagement := TRUE;
_PersistentProductCheck := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="INIT" Id="{4952b82a-4af8-498c-b722-b63bbc5d8fac}">
<Declaration><![CDATA[METHOD INIT : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _Step OF
0:
IF ITempController.TuneDone AND iStation = iStationStatus.StationType THEN
ITempController.Enable := TRUE;
ITempController.TargetTemperature := Config.StandbyTemperature;
ITempController.Tolerance := 1;
END_IF
_Step := 100;
100:
iStationStatus.WaferInfo[0].Number := 0;
INIT := TRUE;
_Step := 0;
END_CASE
]]></ST>
</Implementation>
</Method>
<Method Name="Initialization" Id="{b32867f8-293a-4086-b86a-990b6cf2530c}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
END_VAR
VAR
Index : INT;
IndexString : STRING;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[
InitializationExt(iStation);
IO.Initialization(iStation);
iStationStatus.NoScan := TRUE;
iStationStatus.RecipeOnlyHeader := TRUE;
iStationStatus.NoProductCheck := TRUE;
_PersistentProductCheck := TRUE;
CASE StationsStatus[iStation].StationType OF
TypeHotplate:
iStationStatus.StandbyAvailable := TRUE;
iStationStatus.StationName := CONCAT('HP ', StationIndex);
RecipeStationName[iStation] := 'Hotplate';
TypeCoolplate:
iStationStatus.StationName := CONCAT('CP ', StationIndex);
RecipeStationName[iStation] := 'Coolplate';
END_CASE
iStationStatus.ErrorList := 'HOTPLATE_ErrorNr';
CASE StationsStatus[iStation].StationType OF
TypeHotplate:
ConfigManagement.Initialization(ADR(Config), ADR(ConfigOld), SIZEOF(Config), 'sHotplateConfig', CONCAT('HP', StationIndex));
TypeCoolplate:
ConfigManagement.Initialization(ADR(Config), ADR(ConfigOld), SIZEOF(Config), 'sHotplateConfig', CONCAT('CP', StationIndex));
END_CASE
ConfigPlausibility REF= Config.ConfigPlausibility;
RecipeManagement.Initialization(
iStation,
ADR(RecipeLoad),
ADR(HOTPLATE_RECIPE_EDITE),
ADR(HOTPLATE_RECIPE_EMPTY),
ADR(RecipeRead),
ADR(Recipe),
SIZEOF(sHotplateRecipe),
'sHotplateRecipe',
0
);
CASE iStationStatus.StationType OF
TypeHotplate:
ITempController := HOTPLATE_TempRegler;
IF iStation = iStationStatus.StationType THEN
HOTPLATE_TempRegler.Config REF= Config.Temperature;
HOTPLATE_TempRegler.rInTuneTargetTemperature := 100;
HOTPLATE_TempRegler.tTaskCycleTime := T#2MS;
HOTPLATE_TempRegler.rInMinTemperature := 20;
HOTPLATE_TempRegler.rInMaxTemperature := 200;
END_IF
TypeCoolplate:
CP_Chiller.ErrorIndex_SystemError := HOTPLATE_ErrorNr.eSMCChillerHasError;
ITempController := CP_Chiller;
IF iStation = iStationStatus.StationType THEN
CP_Chiller.rInOffset REF= Config.ChillerOffset;
CP_Chiller.rInMinTemperature := 15;
CP_Chiller.rInMaxTemperature := 25;
CP_Chiller.Initialization(iStation);
END_IF
END_CASE
CASE iStationStatus.StationType OF
TypeHotplate:
DataLogger.format := '%0.1f;$N';
DataLogger.Data[1].Name := 'Temperature(°C)';
DataLogger.Data[1].Value REF= HOTPLATE_TempRegler.rOutCurrentTemperature;
DataLogger.Data[1].Tolerence := 0.1;
TypeCoolplate:
DataLogger.format := '%0.1f;$N';
DataLogger.Data[1].Name := 'Temperature(°C)';
DataLogger.Data[1].Value REF= CP_Chiller.rOutCurrentTemperature;
DataLogger.Data[1].Tolerence := 0.1;
END_CASE
]]></ST>
</Implementation>
</Method>
<Method Name="MAIN" Id="{f78004a7-fcc3-472f-b8ab-8046ac0b7dbc}">
<Declaration><![CDATA[METHOD MAIN : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF iStation = iStationStatus.StationType THEN
ITempController.MAIN();
END_IF
HOTPLATE_TemperatureTrend[iStation](
Current := ITempController.CurrentTemperature,
Target := ITempController.TargetTemperature
);
IO();]]></ST>
</Implementation>
</Method>
<Method Name="MEDIA" Id="{7d4623df-11d4-48d9-97c1-d30644acbda3}">
<Declaration><![CDATA[METHOD MEDIA : BOOL
VAR_INPUT
TargetMedia : UDINT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="PrepInOut" Id="{971aa2e3-c7e0-4fc2-b1f4-2d84b7964afa}">
<Declaration><![CDATA[METHOD PrepInOut : BOOL]]></Declaration>
<Implementation>
<ST><![CDATA[PrepInOut := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="RCPAddStep" Id="{b7c1a6d2-7f1e-4b5f-baea-66c9c04d1a99}">
<Declaration><![CDATA[METHOD RCPAddStep : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="RCPStepRemove" Id="{12dc1bbd-d248-4ed7-8d80-c7c9393f5657}">
<Declaration><![CDATA[METHOD RCPStepRemove : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="Rezeptendebedingungen" Id="{635772dd-4211-483b-9ee7-724b850e54e7}" FolderPath="Start\">
<Declaration><![CDATA[METHOD Rezeptendebedingungen : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[CurrentStep :=CurrentStep +1;
IF CurrentStep > Recipe.STEP_COUNT THEN (*Rezeptende*)
Step := Step +1;
ELSE
Step := StepRecipeStart;
END_IF
]]></ST>
</Implementation>
</Method>
<Method Name="Standby" Id="{9755c23b-2bd8-4df2-aaf7-28f7bcabe18d}">
<Declaration><![CDATA[METHOD Standby : BOOL
VAR_INPUT
bStart : BOOL;
Step : REFERENCE TO INT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[CASE Step OF
0:
StandbyTimer(IN := bStart, PT := UDINT_TO_TIME(StandbyDelay[iStation]*1000));
IF StandbyTimer.Q THEN
StandbyTimer(IN := FALSE);
Step := 10;
END_IF
10:
// ITempController.TargetTemperature := RecipeStandby.TEMPERATURE;
ITempController.Enable := TRUE;
Step := 0;
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="Start" Id="{e3c6a83a-c923-40da-b9fb-1bd1106a7265}">
<Declaration><![CDATA[METHOD Start : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _Step OF
0:
_Step := StepRecipeStart;
StepRecipeStart:
IF StepEndCondition() THEN
_Step := 100;
END_IF
100:
_Step := 0;
Start := TRUE;
END_CASE
]]></ST>
</Implementation>
</Method>
<Method Name="StepEndCondition" Id="{b30d2d50-6cad-421e-b323-ed892cd3437e}" FolderPath="Start\">
<Declaration><![CDATA[METHOD StepEndCondition : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[StepTimer(IN := TRUE, PT := LREAL_TO_TIME(Recipe.StepTime*1000));
IF StepTimer.Q THEN
StepEndCondition := TRUE;
StepTimer(IN := FALSE);
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="ToVisu" Id="{eb1703d7-45ab-4508-99e9-1bdfc8585af7}">
<Declaration><![CDATA[METHOD ToVisu : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[VisuHotplateAutoRecipe REF= Recipe;
VisuHPTrend REF= HOTPLATE_TemperatureTrend[iStation];
VisuHotplateConfig REF= HOTPLATE_MAIN[iStationStatus.StationType].Config;
CASE iStationStatus.StationType OF
TypeHotplate:
VisuIITempController := HOTPLATE_TempRegler;
TypeCoolplate:
VisuIITempController := CP_Chiller;
END_CASE
]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.11">
<POU Name="HOTPLATE_IO_FB" Id="{d6c2e60e-7c3f-4ac6-8faa-8ca468e62db4}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK HOTPLATE_IO_FB EXTENDS Station_GENERAL_IO_FB
VAR_INPUT
// bOutN2 : BOOL;
// bOutVacuum : BOOL;
// bOutVacOut : BOOL;
// bOutShutter : BOOL;
END_VAR
VAR_OUTPUT
// bInVacuum : BOOL;
// bInShutterOpen : BOOL;
bInReferenceSensor : BOOL;
bInOverTemp AT %I* : BOOL;
// CANStatus AT %I* : USINT;
rInCurrentTemperature : LREAL;
InCurrentTemperature AT %I* : INT;
END_VAR
VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[//MediaCheck();
(*
IF bInReferenceSensor THEN
iStationStatus.Ist.PrepIn := FALSE;
iStationStatus.Ist.PrepOut := FALSE;
END_IF
*)
CASE iStationStatus.StationType OF
TypeHotplate:
rInCurrentTemperature := HOTPLATE_TempRegler.rOutCurrentTemperature;
TypeCoolplate:
rInCurrentTemperature := InCurrentTemperature;
rInCurrentTemperature := rInCurrentTemperature/10;
END_CASE]]></ST>
</Implementation>
<Method Name="Initialization" Id="{5ae12870-9b1c-4b8f-b9d4-34f9d7c40b29}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[InitializationExt(iStation);]]></ST>
</Implementation>
</Method>
<Action Name="MediaCheck" Id="{4b47197f-6cb4-4618-90a2-57a8f30babe6}">
<Implementation>
<ST><![CDATA[CASE iStationStatus.StationType OF
TypeHotplate:
AlarmSend(iStation, HOTPLATE_ErrorNr.eOverTemp, FALSE, eReportType.Warning, sAvailableResponse.Ok, NOT bInOverTemp);
END_CASE
DelayTimer(IN := TRUE AND InAktorspannung, PT := T#5S);
IF NOT DelayTimer.Q THEN
RETURN;
END_IF]]></ST>
</Implementation>
</Action>
</POU>
</TcPlcObject>