Files
infineon_plc/PLC/01_Stationen/Etcher/FB_Etcher.TcPOU
2026-03-19 19:40:01 +01:00

418 lines
9.5 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_Etcher" Id="{e75b6d70-36db-4c78-b78d-a594609441d1}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Etcher EXTENDS FB_PackMLGeneric
VAR_INPUT
xOpenDoor : BOOL;
xEnableVacuum : BOOL;
xOpenChuckClamp : BOOL;
xEjectChuck : BOOL;
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xDoorOpen : BOOL;
xChuckClampOpen : BOOL;
xVacuumEnabled : BOOL;
END_VAR
VAR_IN_OUT
stIO : ST_Etcher_IO;
stHMIInterface : ST_HMI_Etcher;
END_VAR
VAR
_fbValveVacuum : FB_Valve('Vacuum');
_stValveVacuumConfig : ST_ValveConfig;
_fbValveDoor : FB_Valve('Door');
_stValveDoorCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_fbUnlockLeft : FB_Valve('Clamping left');
_stValveUnlockLeftCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_fbUnlockRight : FB_Valve('Clamping right');
_stValveUnlockRightCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_fbEjectFront : FB_Valve('Clamping front');
_stValveClampingFrontCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_fbEjectBack : FB_Valve('Clamping back');
_stValveEjectBackCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_rtEjectChuckCmd : R_TRIG;
_tpEjectChuck : TP;
// =======
// Sensors
// =======
xVacuumOk AT %I* : BOOL;
// Spinner vibration sensor
xVibrationSensor AT %I* : BOOL;
// =========
// Actuators
// =========
_fbRobot : FB_Mecademics;
_fbSpinner : FB_AxisPTP;
_fbValveEnableFilmetch : FB_Valve('');
_stValveConfig : ST_ValveConfig;
// Internals
_xOpenChuckClamp : BOOL;
_xEjectChuck : BOOL;
// Debug
_iState : INT;
_lrSpinnerVelo : LREAL := 36.0;
_xAllCompRetracted : BOOL;
_xChuckRemoved : BOOL;
_xReleaseChuck : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Main door
_fbValveDoor(
xAutomaticOpen:= xOpenDoor,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveDoorCfg,
xReleaseManualMode:= _xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stIO := stIO.stValveDoor,
stHMIInterface:= stHMIInterface.stDoorValve);
// Chuck
_rtEjectChuckCmd(CLK := xEjectChuck);
IF _rtEjectChuckCmd.Q THEN
_tpEjectChuck(IN := TRUE, PT := T#500MS);
ELSE
_tpEjectChuck(IN := FALSE);
END_IF
// Todo bessere implementierung finden
//_xOpenChuckClamp := xOpenChuckClamp OR stHMIInterface.stChuckUnlockCmd.xRequest;
_fbValveVacuum(
xAutomaticOpen := xEnableVacuum,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveVacuumConfig,
xReleaseManualMode:= _xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stIO := stIO.stValveVacuum,
stHMIInterface:= stHMIInterface.stVacuumValve);
_fbUnlockLeft(
xAutomaticOpen:= _xOpenChuckClamp,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveUnlockLeftCfg,
xReleaseManualMode:= _xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stIO := stIO.stValveUnlockLeft,
stHMIInterface:= stHMIInterface.stChuckUnlockLeft);
_fbUnlockRight(
xAutomaticOpen:= _xOpenChuckClamp,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveUnlockRightCfg,
xReleaseManualMode:= _xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stIO := stIO.stValveUnlockRight,
stHMIInterface:= stHMIInterface.stChuckUnlockRight);
_fbEjectFront(
xAutomaticOpen:= _xEjectChuck,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveClampingFrontCfg,
xReleaseManualMode:= _xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stIO := stIO.stValveEjectFront,
stHMIInterface:= stHMIInterface.stChuckEjectFront);
_fbEjectBack(
xAutomaticOpen:= _xEjectChuck,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveEjectBackCfg,
xReleaseManualMode:= _xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stIO := stIO.stValveEjectBack,
stHMIInterface:= stHMIInterface.stChuckEjectBack);
_xAllCompRetracted := _fbUnlockLeft.IsClosed AND _fbUnlockRight.IsClosed AND _fbEjectFront.IsClosed AND _fbEjectBack.IsClosed;
_fbSpinner(
xEnablePositive:= _xAllCompRetracted,
xEnableNegative:= _xAllCompRetracted,
rOverride:= 100.0,
lrVelocity:= _lrSpinnerVelo,
xConfirmAlarms:= xConfirmAlarms,
stIO := stIO.stAxisSpinner);
_fbRobot(stPackMLHMIInterface := stHMIInterface.stMecaCmds);
_fbValveEnableFilmetch(
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveConfig,
xReleaseManualMode:= _xReleaseManualMode,
xConfirmAlarms := xConfirmAlarms,
stIO := stIO.stValveFilmetch,
stHMIInterface:= stHMIInterface.stValveFilmetch);
// Call base sm
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);
// Einbaulage Baumer
// 35 deg
// =====
// Debug
// =====
CASE _iState OF
// Idle
0:
IF _xReleaseChuck THEN
_xReleaseChuck := FALSE;
_iState := 5;
END_IF
// Enable spinner
5:
CASE _fbSpinner.M_Enable() OF
E_CmdResult.ACCEPTED:
_iState := 6;
E_CmdResult.BUSY:
;
E_CmdResult.REJECTED,
E_CmdResult.ERROR:
_iState := 900;
END_CASE
// Wait for spinner to be enabled
6:
IF _fbSpinner.xDone THEN
_iState := 7;
END_IF
IF _fbSpinner.xError THEN
_iState := 900;
END_IF
// Start moving to zero position
7:
CASE _fbSpinner.M_MoveModulo(lrTargetPos := 0.0, eMoveDirection := BC.MC_Direction.MC_Shortest_Way) OF
E_CmdResult.ACCEPTED:
_iState := 11;
E_CmdResult.BUSY:
;
E_CmdResult.REJECTED,
E_CmdResult.ERROR:
_iState := 900;
END_CASE
// Move to zero position
11:
IF _fbSpinner.xDone THEN
_iState := 12;
END_IF
IF _fbSpinner.xError THEN
_iState := 900;
END_IF
// Disable axis
12:
CASE _fbSpinner.M_Disable() OF
E_CmdResult.ACCEPTED:
_iState := 13;
E_CmdResult.BUSY:
;
E_CmdResult.REJECTED,
E_CmdResult.ERROR:
_iState := 900;
END_CASE
// Wait for spinner to be disabled
13:
IF _fbSpinner.xDone THEN
_iState := 14;
END_IF
IF _fbSpinner.xError THEN
_iState := 900;
END_IF
// Release clamping
14:
_xOpenChuckClamp := TRUE;
IF _fbUnlockLeft.IsOpen AND _fbUnlockRight.IsOpen THEN
_iState := 15;
END_IF
IF _fbUnlockLeft.xError OR _fbUnlockRight.xError THEN
_iState := 900;
END_IF
// Eject the cuck
15:
_xEjectChuck := TRUE;
IF _fbEjectFront.IsOpen AND _fbEjectBack.IsOpen THEN
_iState := 16;
END_IF
IF _fbEjectFront.xError OR _fbEjectBack.xError THEN
_iState := 900;
END_IF
// Retract ejectors
16:
_xEjectChuck := FALSE;
IF _fbEjectFront.IsClosed AND _fbEjectBack.IsClosed THEN
_iState := 17;
END_IF
IF _fbEjectFront.xError OR _fbEjectBack.xError THEN
_iState := 900;
END_IF
// Wait for Chuck to be remove
17:
IF _xChuckRemoved THEN
_xChuckRemoved := FALSE;
_iState := 18;
END_IF
// Retract release pins
18:
_xOpenChuckClamp := FALSE;
IF _fbUnlockLeft.IsClosed AND _fbUnlockRight.IsClosed THEN
_iState := 0;
END_IF
IF _fbUnlockLeft.xError OR _fbUnlockRight.xError THEN
_iState := 900;
END_IF
// Error state
900:
IF xConfirmAlarms THEN
_iState := 0;
END_IF
END_CASE
// Copy internal signals to output
xDoorOpen := _fbValveDoor.IsOpen;
xChuckClampOpen := _fbUnlockLeft.IsOpen AND _fbUnlockRight.IsOpen;
xVacuumEnabled := xVacuumOk;]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{afcda70c-3e52-4a32-9ca9-670a6b854f24}">
<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[_stSMConfig.xStoppingDisabled := TRUE;
_stSMConfig.xCompletingDisabled := TRUE;
_stSMConfig.xCompletedDisabled := TRUE;
_stSMConfig.xAbortingDisabled := TRUE;
// Valve config
_stValveConfig.xHasOpenFeedback := FALSE;
_stValveConfig.xHasClosedFeedback := FALSE;
// Vacuum valve config
_stValveVacuumConfig.xHasOpenFeedback := FALSE;
_stValveVacuumConfig.xHasClosedFeedback := FALSE;
_stValveVacuumConfig.xNormallyOpen := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="M_JetMeasurement" Id="{5ffd6d61-d32b-40d9-aa63-25591d7cd8df}">
<Declaration><![CDATA[METHOD PRIVATE M_JetMeasurement
VAR_INPUT
xExecute : BOOL;
END_VAR
VAR_OUTPUT
xDone : BOOL;
xError : BOOL;
END_VAR
VAR_INST
_iState : INT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _iState OF
// Idle
0:
IF xExecute THEN
xDone := FALSE;
xError := FALSE;
_iState := 10;
END_IF
// Check if robot is in safe position
// Enable equipment and move robot to measurement position
// Wait for equipment and robot to be ready
// Enable nozzle
// Check measurement and calculate offset
// Move Robot to new position
// Check measurement again
// Move to safe position
END_CASE]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>