Files
infineon_legacy_plc/PLC/4 HV/POUs/HV_IO_FB.TcPOU
2026-01-08 11:08:17 +01:00

175 lines
5.4 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="HV_IO_FB" Id="{147a9e62-dc3f-4b6b-8708-0efd1b986735}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK HV_IO_FB EXTENDS Station_GENERAL_IO_FB
VAR_INPUT
Config : REFERENCE TO sHVConfig;
bOutOverpressureN2 AT %Q* : BOOL;
bOutExhaust AT %Q* : BOOL;
bOutValve AT %Q* : BOOL;
PressureController : ITV2050_FB;
END_VAR
VAR
Shutter : PneumaticCylinder_FB;
Chamber : PneumaticCylinder_FB;
ChuckVacuum : PneumaticCylinder_FB;
END_VAR
VAR_OUTPUT
bInOverTemp AT %I* : BOOL;
bInPressureCylinderOk AT %I* : BOOL;
bInShutterSafety AT %I* : BOOL;
InChamberPressure AT %I* : INT;
rInChamberPressure : LREAL;
bInChamberPressureOk : BOOL;
bInChamberNoPressure : BOOL;
bInRobotFree AT %I* : BOOL;
bInRobotNotFree AT %I* : BOOL;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[MediaCheck();
IF NOT bInShutterSafety THEN
Shutter.Up(TRUE);
END_IF
//
IF NOT Shutter.bInUp OR NOT Chamber.bInUp OR NOT bInRobotFree OR bInRobotNotFree THEN
iStationStatus.Ist.PrepIn := FALSE;
iStationStatus.Ist.PrepOut := FALSE;
END_IF
Shutter();
Chamber();
ChuckVacuum();
iMediaArray[eHVMedienNamen.ChamberClose].Disable := NOT bInPressureCylinderOk OR NOT Shutter.bInDown;
iMediaArray[eHVMedienNamen.ChamberOpen].Disable := NOT bInPressureCylinderOk OR NOT Shutter.bInDown;
IF NOT bInPressureCylinderOk THEN
Chamber.bOutUp := FALSE;
Chamber.bOutDown := FALSE;
END_IF
IF NOT Shutter.bInDown THEN
Chamber.bOutDown := FALSE;
END_IF
iMediaArray[eHVMedienNamen.Valve].Input := bInPressureCylinderOk;
rInChamberPressure := InChamberPressure;
rInChamberPressure := rInChamberPressure / 16#7FFF;
rInChamberPressure := rInChamberPressure * 10;
CASE iStationStatus.StationType OF
TypeHVHot:
rInChamberPressure := rInChamberPressure -1;
END_CASE
bInChamberPressureOk := ABS(rInChamberPressure - PressureController.rOutTargetPressure) < 0.1;
bInChamberNoPressure := rInChamberPressure < 0.02;
iMediaArray[eHVMedienNamen.OverpressureN2].Input := bInChamberPressureOk;
iMediaArray[eHVMedienNamen.Exhaust].Input := bInChamberNoPressure;
IF NOT Chamber.bInDown THEN
bOutOverpressureN2 := FALSE;
END_IF
//
//Vacuum
ChuckVacuum.bInDown := NOT ChuckVacuum.bInUp;
//iMediaArray[eHVMedienNamen.VacuumOn].Input := bInVacuumOk;
//iMediaArray[eHVMedienNamen.VacuumOff].Input := NOT bInVacuumOk;
//
PressureController();]]></ST>
</Implementation>
<Method Name="Initialization" Id="{ee221bc4-5d24-4a1e-9c73-9b3abc1ca4c2}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
END_VAR
VAR
ShutterUpServiceName : ARRAY[0..NumberOfLanguages] OF T_MaxString := ['Open$NShutter', 'Shutter$NOffen'];
ShutterDownServiceName : ARRAY[0..NumberOfLanguages] OF T_MaxString := ['Close$NShutter', 'Shutter$NSchließen'];
ChamberUpServiceName : ARRAY[0..NumberOfLanguages] OF T_MaxString := ['Open$NChamber', 'Kammer$NOffen'];
ChamberDownServiceName : ARRAY[0..NumberOfLanguages] OF T_MaxString := ['Close$NChamber', 'Kammer$NSchließen'];
ChuckVacuumOnServiceName : ARRAY[0..NumberOfLanguages] OF T_MaxString := ['Auflagevakuum$NEin', 'Auflagevakuum$NEin'];
ChuckVacuumOffServiceName : ARRAY[0..NumberOfLanguages] OF T_MaxString := ['Auflagevakuum$NAus', 'Auflagevakuum$NAus'];
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[InitializationExt(iStation);
Shutter.Initialization(
iStation,
eHVMedienNamen.ShutterOpen,
eHVMedienNamen.ShutterClose,
HV_ErrorNr.eTimeoutShutterOpen,
ShutterUpServiceName,
ShutterDownServiceName
);
Shutter.TimeOut := T#10S;
Chamber.Initialization(
iStation,
eHVMedienNamen.ChamberOpen,
eHVMedienNamen.ChamberClose,
HV_ErrorNr.eTimeoutChamberOpen,
ChamberUpServiceName,
ChamberDownServiceName
);
Chamber.TimeOut := T#10S;
ChuckVacuum.Initialization(
iStation,
eHVMedienNamen.VacuumOn,
eHVMedienNamen.VacuumOff,
HV_ErrorNr.eNoWafer,
Peripherie_GVL.ServiceNameChuckVacuumOn,
Peripherie_GVL.ServiceNameChuckVacuumOff
);
ChuckVacuum.TimeOut := T#10S;
iMediaArray[eHVMedienNamen.OverpressureN2].ServiceName[0] := 'Überdruck$NN2';
iMediaArray[eHVMedienNamen.OverpressureN2].bReferenceControl REF= bOutOverpressureN2;
iMediaArray[eHVMedienNamen.OverpressureN2].bReferenceResetControl REF= bOutExhaust;
iMediaArray[eHVMedienNamen.OverpressureN2].InputAvailable := TRUE;
iMediaArray[eHVMedienNamen.Exhaust].ServiceName[0] := 'Exhaust';
iMediaArray[eHVMedienNamen.Exhaust].bReferenceControl REF= bOutExhaust;
iMediaArray[eHVMedienNamen.Exhaust].bReferenceResetControl REF= bOutOverpressureN2;
iMediaArray[eHVMedienNamen.Exhaust].InputAvailable := TRUE;
iMediaArray[eHVMedienNamen.Valve].ServiceName[0] := 'Ventil';
iMediaArray[eHVMedienNamen.Valve].bReferenceControl REF= bOutValve;
iMediaArray[eHVMedienNamen.Valve].InputAvailable := TRUE;]]></ST>
</Implementation>
</Method>
<Action Name="MediaCheck" Id="{a9750f69-cba0-4bdb-9a48-68a3453c159e}">
<Implementation>
<ST><![CDATA[CASE iStationStatus.StationType OF
TypeHVHot:
AlarmSend(iStation, HV_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>