357 lines
8.3 KiB
XML
357 lines
8.3 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;
|
|
xReleaseManualMode : BOOL;
|
|
xReleaseAlarms : BOOL;
|
|
xConfirmAlarms : BOOL;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
xDoorOpen : BOOL;
|
|
xChuckClampOpen : BOOL;
|
|
xVacuumEnabled : BOOL;
|
|
END_VAR
|
|
VAR_IN_OUT
|
|
stHMIInterface : ST_HMI_Etcher;
|
|
END_VAR
|
|
VAR
|
|
_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;
|
|
|
|
xDisableVacuum AT %Q* : BOOL;
|
|
|
|
_fbValveEnableFilmetch : FB_Valve('');
|
|
|
|
_stValveConfig : ST_ValveConfig;
|
|
|
|
|
|
// Internals
|
|
_xOpenChuckClamp : BOOL;
|
|
_xEjectChuck : BOOL;
|
|
|
|
// Debug
|
|
_iState : INT;
|
|
_xEnableSpinner : BOOL;
|
|
_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,
|
|
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;
|
|
|
|
_fbUnlockLeft(
|
|
xAutomaticOpen:= _xOpenChuckClamp,
|
|
xReleaseErrors:= xReleaseAlarms,
|
|
stValveConfig:= _stValveUnlockLeftCfg,
|
|
xReleaseManualMode:= xReleaseManualMode,
|
|
xConfirmAlarms:= xConfirmAlarms,
|
|
stHMIInterface:= stHMIInterface.stChuckUnlockLeft);
|
|
|
|
_fbUnlockRight(
|
|
xAutomaticOpen:= _xOpenChuckClamp,
|
|
xReleaseErrors:= xReleaseAlarms,
|
|
stValveConfig:= _stValveUnlockRightCfg,
|
|
xReleaseManualMode:= xReleaseManualMode,
|
|
xConfirmAlarms:= xConfirmAlarms,
|
|
stHMIInterface:= stHMIInterface.stChuckUnlockRight);
|
|
|
|
_fbEjectFront(
|
|
xAutomaticOpen:= _xEjectChuck,
|
|
xReleaseErrors:= xReleaseAlarms,
|
|
stValveConfig:= _stValveClampingFrontCfg,
|
|
xReleaseManualMode:= xReleaseManualMode,
|
|
xConfirmAlarms:= xConfirmAlarms,
|
|
stHMIInterface:= stHMIInterface.stChuckEjectFront);
|
|
|
|
_fbEjectBack(
|
|
xAutomaticOpen:= _xEjectChuck,
|
|
xReleaseErrors:= xReleaseAlarms,
|
|
stValveConfig:= _stValveEjectBackCfg,
|
|
xReleaseManualMode:= xReleaseManualMode,
|
|
xConfirmAlarms:= xConfirmAlarms,
|
|
stHMIInterface:= stHMIInterface.stChuckEjectBack);
|
|
|
|
_xAllCompRetracted := _fbUnlockLeft.IsClosed AND _fbUnlockRight.IsClosed AND _fbEjectFront.IsClosed AND _fbEjectBack.IsClosed;
|
|
|
|
_fbSpinner(
|
|
xEnable:= _xEnableSpinner,
|
|
xEnablePositive:= _xEnableSpinner AND _xAllCompRetracted,
|
|
xEnableNegative:= _xEnableSpinner AND _xAllCompRetracted,
|
|
rOverride:= 100.0,
|
|
lrVelocity:= _lrSpinnerVelo,
|
|
xConfirmAlarms:= xConfirmAlarms);
|
|
|
|
xDisableVacuum := (NOT xEnableVacuum);
|
|
|
|
_fbRobot(stPackMLHMIInterface := stHMIInterface.stMecaCmds);
|
|
|
|
_fbValveEnableFilmetch(
|
|
xReleaseErrors:= xReleaseAlarms,
|
|
stValveConfig:= _stValveConfig,
|
|
xReleaseManualMode:= xReleaseManualMode,
|
|
xConfirmAlarms := xConfirmAlarms,
|
|
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:
|
|
_xEnableSpinner := TRUE;
|
|
IF _fbSpinner.xEnabled THEN
|
|
_iState := 6;
|
|
END_IF
|
|
|
|
// Start moving to zero position
|
|
6:
|
|
_fbSpinner.M_MoveModulo(lrTargetPos := 0.0, eMoveDirection := BC.MC_Direction.MC_Shortest_Way);
|
|
_iState := 11;
|
|
|
|
// Move to zero position
|
|
11:
|
|
IF _fbSpinner.xDone THEN
|
|
_iState := 12;
|
|
END_IF
|
|
|
|
IF _fbSpinner.xError THEN
|
|
_iState := 900;
|
|
END_IF
|
|
|
|
// Disable axis
|
|
12:
|
|
_xEnableSpinner := FALSE;
|
|
IF (NOT _fbSpinner.xEnabled) THEN
|
|
_iState := 13;
|
|
END_IF
|
|
|
|
// Release clamping
|
|
13:
|
|
_xOpenChuckClamp := TRUE;
|
|
|
|
IF _fbUnlockLeft.IsOpen AND _fbUnlockRight.IsOpen THEN
|
|
_iState := 14;
|
|
END_IF
|
|
|
|
IF _fbUnlockLeft.xError OR _fbUnlockRight.xError THEN
|
|
_iState := 900;
|
|
END_IF
|
|
|
|
// Eject the cuck
|
|
14:
|
|
_xEjectChuck := TRUE;
|
|
|
|
IF _fbEjectFront.IsOpen AND _fbEjectBack.IsOpen THEN
|
|
_iState := 15;
|
|
END_IF
|
|
|
|
IF _fbEjectFront.xError OR _fbEjectBack.xError THEN
|
|
_iState := 900;
|
|
END_IF
|
|
|
|
// Retract ejectors
|
|
15:
|
|
_xEjectChuck := FALSE;
|
|
|
|
IF _fbEjectFront.IsClosed AND _fbEjectBack.IsClosed THEN
|
|
_iState := 16;
|
|
END_IF
|
|
|
|
IF _fbEjectFront.xError OR _fbEjectBack.xError THEN
|
|
_iState := 900;
|
|
END_IF
|
|
|
|
// Wait for Chuck to be remove
|
|
16:
|
|
IF _xChuckRemoved THEN
|
|
_xChuckRemoved := FALSE;
|
|
_iState := 17;
|
|
END_IF
|
|
|
|
// Retract release pins
|
|
17:
|
|
_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;]]></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> |