Implemented stuff to get ready for jet measurement

This commit is contained in:
2026-03-12 00:37:23 +01:00
parent 19be407e08
commit f7bb4f2920
17 changed files with 954 additions and 165 deletions

View File

@@ -59,8 +59,11 @@ IF _rtStopRobotFromSafety.Q THEN
_stRobotCmd.xCmdChangeRequest := TRUE;
END_IF
// Unit feedbacks for the robot
_stUnitFeedbacks.xDoorEtcher1Open := _fbEtcher1.xDoorOpen;
_stUnitFeedbacks.xDoorEtcher2Open := _fbEtcher2.xDoorOpen;
_stUnitFeedbacks.xDoorHVTestHotOpen := _fbHVTesterHot.xDoorOpen AND _fbHVTesterHot.xTestChamberOpen;
_stUnitFeedbacks.xDoorHVTestColdOpen := _fbHVTesterCold.xDoorOpen AND _fbHVTesterCold.xTestChamberOpen;
_fbRobot(
stCommand:= _stRobotCmd,

View File

@@ -77,11 +77,26 @@ VAR
// =========
_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>
@@ -104,7 +119,7 @@ ELSE
END_IF
// Todo bessere implementierung finden
_xOpenChuckClamp := xOpenChuckClamp OR stHMIInterface.stChuckUnlockCmd.xRequest;
//_xOpenChuckClamp := xOpenChuckClamp OR stHMIInterface.stChuckUnlockCmd.xRequest;
_fbUnlockLeft(
xAutomaticOpen:= _xOpenChuckClamp,
@@ -123,7 +138,7 @@ _fbUnlockRight(
stHMIInterface:= stHMIInterface.stChuckUnlockRight);
_fbEjectFront(
xAutomaticOpen:= _tpEjectChuck.Q,
xAutomaticOpen:= _xEjectChuck,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveClampingFrontCfg,
xReleaseManualMode:= xReleaseManualMode,
@@ -131,20 +146,143 @@ _fbEjectFront(
stHMIInterface:= stHMIInterface.stChuckEjectFront);
_fbEjectBack(
xAutomaticOpen:= _tpEjectChuck.Q,
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;
@@ -167,7 +305,52 @@ END_VAR
_stSMConfig.xCompletingDisabled := TRUE;
_stSMConfig.xCompletedDisabled := TRUE;
_stSMConfig.xAbortingDisabled := TRUE;]]></ST>
_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>

View File

@@ -33,6 +33,9 @@ STRUCT
// Chuck eject command
stChuckEjectCmd : ST_HMI_CONTROL_BUTTON;
// Filmetch valve
stValveFilmetch : ST_HMI_VALVE_DATA;
END_STRUCT
END_TYPE
]]></Declaration>

View File

@@ -11,6 +11,9 @@ STRUCT
// Test chamber open close valve
stTestChamberValve : ST_HMI_VALVE_DATA;
// Safety valve
stReleaseChamberValve : ST_HMI_VALVE_DATA;
// Optional temperature setpoint
stTempSP : ST_HMI_ANALOG_VALUE;
END_STRUCT

View File

@@ -4,23 +4,90 @@
<Declaration><![CDATA[FUNCTION_BLOCK FB_HVTester EXTENDS FB_PackMLGeneric
VAR_INPUT
xOpenChambers : BOOL;
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xDoorOpen : BOOL;
xTestChamberOpen : BOOL;
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_HVTester;
END_VAR
VAR
stDoorValve : FB_Valve('');
stTestChamberValve : FB_Valve('');
stReleaseChamberMovement : FB_Valve('');
_fbDoorValve : FB_Valve('Door');
_stDoorValveConfig : ST_ValveConfig;
_fbTestChamberValve : FB_Valve('Chamber');
_stTestChamberValveConfig : ST_ValveConfig;
_fbReleaseChamberMovement : FB_Valve('Release Chamber');
_stReleaseValveConfig : ST_ValveConfig;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[
<ST><![CDATA[_fbDoorValve(
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stDoorValveConfig,
xReleaseManualMode:= TRUE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stDoorValve);
_fbTestChamberValve(
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stTestChamberValveConfig,
xReleaseManualMode:= TRUE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stTestChamberValve);
_fbReleaseChamberMovement(
xAutomaticOpen := TRUE,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stReleaseValveConfig,
xReleaseManualMode:= TRUE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stReleaseChamberValve);
// Call base sm
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);]]></ST>
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);
// Copy to output
xDoorOpen := _fbDoorValve.IsOpen;
xTestChamberOpen := _fbTestChamberValve.IsOpen;]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{2ed378bb-debf-402c-b944-0cc5602f1aec}">
<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[// Door valve config
_stDoorValveConfig.xHasOpenFeedback := TRUE;
_stDoorValveConfig.xHasClosedFeedback := TRUE;
_stDoorValveConfig.timTimeoutOpen := T#10S;
_stDoorValveConfig.timTimeoutClose := T#10S;
// Test chamber valve config
_stTestChamberValveConfig.xHasOpenFeedback := TRUE;
_stTestChamberValveConfig.xHasClosedFeedback := TRUE;
_stTestChamberValveConfig.timTimeoutOpen := T#10S;
_stTestChamberValveConfig.timTimeoutClose := T#10S;
_stTestChamberValveConfig.xNormallyOpen := TRUE;
// Release valve config
_stReleaseValveConfig.xHasOpenFeedback := FALSE;
_stReleaseValveConfig.xHasClosedFeedback := FALSE;
_stReleaseValveConfig.timTimeoutOpen := T#0S;
_stReleaseValveConfig.timTimeoutClose := T#0S;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="E_LeviPumpState" Id="{bcd971a7-4a89-44e9-a91b-53458e7d6d43}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'strict'}
{attribute 'to_string'}
TYPE E_LeviPumpState :
(
OFF := 1,
SPEED_CTRL := 2,
FLOW_CTRL := 3,
SAFE_SPEED_CTRL := 7,
SAFE_FLOW_CTRL := 8,
HYDR_IDENT := 32
)WORD;
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -29,6 +29,9 @@ STRUCT
// (9) Filmetch
stTankFilmetch : ST_HMI_Tank;
// Valve filmetch
stValveFilmetch : ST_HMI_VALVE_DATA;
END_STRUCT
END_TYPE
]]></Declaration>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_LeviPumpStatus" Id="{a7d91135-e782-4458-9cdc-855a45a5eb97}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_LeviPumpStatus :
STRUCT
eState : E_LeviPumpState;
wActSpeed : WORD;
wActFlow : WORD;
wSpeedSP : WORD;
wFlowSP : WORD;
wActPumpError : WORD;
wActFlowError : WORD;
wActPumpWarning : WORD;
wActFlowWarning : WORD;
wActPumpMsg : WORD;
wActFlowMsg : WORD;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,216 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_LeviPump" Id="{5bcbb8cf-d053-4b79-9a6f-fd1b82880719}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_LeviPump
VAR_INPUT
byAddr : BYTE;
xEnable : BOOL;
rSpeedSP : REAL;
END_VAR
VAR_OUTPUT
rSpeedPV : REAL;
END_VAR
VAR_IN_OUT
fbModbusMaster : FB_ModbusMaster;
END_VAR
VAR
_iState : INT;
_stMBReq : ST_Modbus_Req;
_stPollReq : ST_Modbus_Req;
_rSpeedSPOld : REAL := 0.0;
_wStateReq : WORD;
_wSpeedSP : WORD;
_xDebug : WORD := 2000;
_wFlowSP : WORD;
_wFlowSPOld : WORD;
_xMBReqDone : BOOL;
_xMBReqError : BOOL;
// Polling data
_tonPollTimer : TON;
_timPollingTime : TIME := T#500MS;
_stPumpStatus : ST_LeviPumpStatus;
_xMBPollDone : BOOL := TRUE;
_xMBPollError : BOOL;
_xTest : BOOL;
END_VAR
VAR CONSTANT
REG_STATE_REQ : WORD := 16#4000;
REG_SPEED_SP : WORD := 16#4001;
REG_FLOW_SP : WORD := 16#4002;
REG_STATUS : WORD := 16#4000;
REG_STATUS_SIZE : WORD := 11;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Polling of pump state
_tonPollTimer(IN := TRUE, PT := _timPollingTime);
// IF _tonPollTimer.Q AND (_xMBPollDone) THEN
IF _tonPollTimer.Q AND _xTest THEN
_tonPollTimer(IN := FALSE);
M_GetPumpStatus();
END_IF
CASE _iState OF
// Idle
0:
IF xEnable THEN
// Enable pump in speed ctrl
M_SendStateChangeReq(wState := E_LeviPumpState.SPEED_CTRL);
_iState := 10;
END_IF
// Wait for command to be done
10:
IF _xMBReqDone THEN
_iState := 20;
END_IF
IF _xMBReqError THEN
_iState := 900;
END_IF
// Enabled
20:
// Disable pump if requested
IF (NOT xEnable) THEN
M_SendStateChangeReq(wState := E_LeviPumpState.OFF);
_iState := 40;
END_IF
// Send new speed setpoint cmd when changed
IF rSpeedSP <> _rSpeedSPOld THEN
_rSpeedSPOld := rSpeedSP;
M_SendSpeedSP(wSpeed := REAL_TO_WORD(rSpeedSP));
_iState := 30;
END_IF
IF _wFlowSP <> _wFlowSPOld THEN
M_SendFlowSP(wFlow := _xDebug);
_wFlowSPOld := _wFlowSP;
_iState := 30;
END_IF
// Wait for new command to be done
30:
IF _xMBReqDone THEN
_iState := 20;
END_IF
IF _xMBReqError THEN
_iState := 900;
END_IF
// Wait for disable command to be done
40:
IF _xMBReqDone THEN
_iState := 0;
END_IF
IF _xMBReqError THEN
_iState := 900;
END_IF
END_CASE]]></ST>
</Implementation>
<Method Name="M_GetPumpStatus" Id="{c29d3781-24af-49d0-ae91-bc8bbcd19d13}">
<Declaration><![CDATA[METHOD PRIVATE M_GetPumpStatus
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Send pump state change request
_stPollReq.bySlaveAddr := byAddr;
_stPollReq.eCmd := E_Modbus_Cmd.READ_INPUTS;
_stPollReq.wStartAddr := REG_STATUS;
_stPollReq.pvData := ADR(_stPumpStatus);
_stPollReq.wDataSize := SIZEOF(_stPumpStatus);
_stPollReq.wQuantity := 8;
_stPollReq.pxDone := ADR(_xMBPollDone);
_stPollReq.pxError := ADR(_xMBPollError);
// Put request into queue
fbModbusMaster.M_Enqueue(stReq := _stPollReq);]]></ST>
</Implementation>
</Method>
<Method Name="M_SendFlowSP" Id="{db46ab38-50c8-48c4-b96a-5a58f673f453}">
<Declaration><![CDATA[METHOD M_SendFlowSP
VAR_INPUT
wFlow : WORD;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Copy requested speed into internal buffer
_wFlowSP := wFlow;
// Send pump state change request
_stMBReq.bySlaveAddr := byAddr;
_stMBReq.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
_stMBReq.wStartAddr := REG_FLOW_SP;
_stMBReq.pvData := ADR(_wFlowSP);
_stMBReq.wDataSize := SIZEOF(_wFlowSP);
_stMBReq.wQuantity := 1;
_stMBReq.pxDone := ADR(_xMBReqDone);
_stMBReq.pxError := ADR(_xMBReqError);
// Put request into queue
fbModbusMaster.M_Enqueue(stReq := _stMBReq);]]></ST>
</Implementation>
</Method>
<Method Name="M_SendSpeedSP" Id="{a9bf2f20-217d-46ed-911b-cac69c35be30}">
<Declaration><![CDATA[METHOD PRIVATE M_SendSpeedSP
VAR_INPUT
wSpeed : WORD;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Copy requested speed into internal buffer
_wSpeedSP := wSpeed;
// Send pump state change request
_stMBReq.bySlaveAddr := byAddr;
_stMBReq.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
_stMBReq.wStartAddr := REG_SPEED_SP;
_stMBReq.pvData := ADR(_wSpeedSP);
_stMBReq.wDataSize := SIZEOF(_wSpeedSP);
_stMBReq.wQuantity := 1;
_stMBReq.pxDone := ADR(_xMBReqDone);
_stMBReq.pxError := ADR(_xMBReqError);
// Put request into queue
fbModbusMaster.M_Enqueue(stReq := _stMBReq);]]></ST>
</Implementation>
</Method>
<Method Name="M_SendStateChangeReq" Id="{74415361-bb7e-4c06-b3ba-110b75c5772b}">
<Declaration><![CDATA[METHOD PRIVATE M_SendStateChangeReq
VAR_INPUT
wState : WORD;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Copy requested state into internal buffer
_wStateReq := wState;
// Send pump state change request
_stMBReq.bySlaveAddr := byAddr;
_stMBReq.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
_stMBReq.wStartAddr := REG_STATE_REQ;
_stMBReq.pvData := ADR(_wStateReq);
_stMBReq.wDataSize := SIZEOF(_wStateReq);
_stMBReq.wQuantity := 1;
_stMBReq.pxDone := ADR(_xMBReqDone);
_stMBReq.pxError := ADR(_xMBReqError);
// Put request into queue
fbModbusMaster.M_Enqueue(stReq := _stMBReq);]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -42,7 +42,19 @@ VAR
// Flowsensors
//_fbFlowSensors16 : FB_Levi_LFC6IO
// Filmetch valve, NC -> Recirculating back into tank
_fbValveFilmetchOut : FB_Valve('');
// General valve config for valves with no feedback
_stValveConfig : ST_ValveConfig;
// Modbus master for Pumps
_fbMBMaster : FB_ModbusMaster;
_fbLeviPump9 : FB_LeviPump;
_xEnablePump : BOOL;
_xTest : BOOL;
END_VAR
]]></Declaration>
<Implementation>
@@ -98,7 +110,41 @@ _fbTankFilmetch(
xReleaseErrors:= xReleaseErrors,
xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stTankFilmetch);]]></ST>
stHMIInterface:= stHMIInterface.stTankFilmetch);
// Valves
_fbValveFilmetchOut(
xReleaseErrors:= xReleaseErrors,
stValveConfig:= _stValveConfig,
xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stValveFilmetch);
_fbMBMaster();
_fbLeviPump9(
byAddr:= 9,
xEnable:= _xEnablePump,
rSpeedSP:= 2000,
fbModbusMaster:= _fbMBMaster);
]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{860f10c9-69ca-4ad7-9edc-00af754d0af0}">
<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[_stValveConfig.xHasOpenFeedback := FALSE;
_stValveConfig.xHasClosedFeedback := FALSE;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -3,6 +3,7 @@
<POU Name="FB_Tank" Id="{d029e65c-5c27-470b-8bee-fea9f0455669}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Tank
VAR_INPUT
xOpenPumpValve : BOOL;
xReleaseErrors : BOOL;
xReleaseManualMode : BOOL;
xConfirmAlarms : BOOL;
@@ -74,6 +75,7 @@ _fbDrainValve(
stHMIInterface:= stHMIInterface.stDrainValve);
_fbPumpValve(
xAutomaticOpen := xOpenPumpValve,
xReleaseErrors:= xReleaseErrors,
stValveConfig:= _stValveConfig,
xReleaseManualMode:= xReleaseManualMode,
@@ -119,8 +121,7 @@ M_HandleHMIOutput();
// Copy to output buffer
xOverfull := (NOT i_xOverfull);
xFull := i_xFull;
xEmpty := (NOT i_xEmpty);
]]></ST>
xEmpty := (NOT i_xEmpty);]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{9c6d1842-9c2e-4437-b40f-941f77668ffe}">
<Declaration><![CDATA[//FB_Init is always available implicitly and it is used primarily for initialization.

View File

@@ -28,10 +28,21 @@ VAR
// Rerun flag for faster state machine
_xSMCycleDone : BOOL := TRUE;
_xMasterWasBusy : BOOL;
_xTest : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Main state machine
<ST><![CDATA[//_fbMaster();
IF _xTest THEN
_xTest := FALSE;
_fbMaster.ReadInputRegs(Execute := FALSE);
END_IF
// Main state machine
REPEAT
// Safety reset
_xSMCycleDone := TRUE;
@@ -51,13 +62,6 @@ REPEAT
1:
// Get next request from queue if there is one
IF M_Dequeue() THEN
// Set fb data
_fbMaster.UnitID := _stCurrReq.bySlaveAddr;
_fbMaster.MBAddr := _stCurrReq.wStartAddr;
_fbMaster.Quantity := _stCurrReq.wQuantity;
_fbMaster.cbLength := _stCurrReq.wDataSize;
_fbMaster.pMemoryAddr := _stCurrReq.pvData;
// Rerun statemachine this cycle
_xSMCycleDone := FALSE;
_iState := 10;
@@ -68,13 +72,34 @@ REPEAT
// Call modbus master corresponding function
CASE _stCurrReq.eCmd OF
E_Modbus_Cmd.READ_HOLDING:
_fbMaster.ReadRegs();
_fbMaster.ReadRegs(
UnitID := _stCurrReq.bySlaveAddr,
Quantity := _stCurrReq.wQuantity,
MBAddr := _stCurrReq.wStartAddr,
cbLength := _stCurrReq.wDataSize,
pMemoryAddr := _stCurrReq.pvData,
Execute := TRUE,
Timeout := T#1S);
E_Modbus_Cmd.READ_INPUTS:
_fbMaster.ReadInputRegs();
_fbMaster.ReadInputRegs(
UnitID := _stCurrReq.bySlaveAddr,
Quantity := _stCurrReq.wQuantity,
MBAddr := _stCurrReq.wStartAddr,
cbLength := _stCurrReq.wDataSize,
pMemoryAddr := _stCurrReq.pvData,
Execute := TRUE,
Timeout := T#1S);
E_Modbus_Cmd.WRITE_HOLDING:
_fbMaster.WriteRegs();
_fbMaster.WriteRegs(
UnitID := _stCurrReq.bySlaveAddr,
Quantity := _stCurrReq.wQuantity,
MBAddr := _stCurrReq.wStartAddr,
cbLength := _stCurrReq.wDataSize,
pMemoryAddr := _stCurrReq.pvData,
Execute := TRUE,
Timeout := T#1S);
// Reject unknown commands
ELSE
@@ -82,8 +107,15 @@ REPEAT
_iState := 0;
END_CASE
IF _fbMaster.BUSY THEN
_xMasterWasBusy := TRUE;
END_IF
// Wait for fb to be done
IF (NOT _fbMaster.BUSY) THEN
_fbMaster.ReadRegs(Execute := FALSE);
_fbMaster.ReadInputRegs(Execute := FALSE);
_fbMaster.WriteRegs(Execute := FALSE);
_stCurrReq.pxDone^ := TRUE;
// Rerun statemachine this cycle
_xSMCycleDone := FALSE;
@@ -91,6 +123,9 @@ REPEAT
END_IF
IF _fbMaster.Error THEN
_fbMaster.ReadRegs(Execute := FALSE);
_fbMaster.ReadInputRegs(Execute := FALSE);
_fbMaster.WriteRegs(Execute := FALSE);
_stCurrReq.pxError^ := TRUE;
// Rerun statemachine this cycle
_xSMCycleDone := FALSE;
@@ -137,7 +172,7 @@ _iNextTail := (_iTail + 1) MOD GVL_ModbusMaster.QUEUE_SIZE;
IF _iNextTail = _iHead THEN
M_Enqueue := FALSE;
ELSE
_astReqQueue[_iNextTail] := stReq;
_astReqQueue[_iTail] := stReq;
_iTail := _iNextTail;
M_Enqueue := TRUE;
END_IF

View File

@@ -182,12 +182,18 @@
<Compile Include="01_Stationen\Kuka_Robot\ST_KukaRobot_UnitFeedbacks.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\DUTs\E_LeviPumpState.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\DUTs\ST_HMI_MediaCabinet.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\DUTs\ST_HMI_Tank.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\DUTs\ST_LeviPumpStatus.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\DUTs\ST_Levi_ChData.TcDUT">
<SubType>Code</SubType>
</Compile>
@@ -197,6 +203,9 @@
<Compile Include="01_Stationen\MediaStation\FB_Levi_LFC6IO.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\POUs\FB_LeviPump.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\POUs\FB_MediaCabinet.TcPOU">
<SubType>Code</SubType>
</Compile>
@@ -516,8 +525,8 @@
<ProjectExtensions>
<PlcProjectOptions>
<XmlArchive>
<Data>
<o xml:space="preserve" t="OptionKey">
<Data>
<o xml:space="preserve" t="OptionKey">
<v n="Name">"&lt;ProjectRoot&gt;"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v>
@@ -662,14 +671,14 @@
</d>
<d n="Values" t="Hashtable" />
</o>
</Data>
<TypeList>
<Type n="Boolean">System.Boolean</Type>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type>
</TypeList>
</XmlArchive>
</Data>
<TypeList>
<Type n="Boolean">System.Boolean</Type>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type>
</TypeList>
</XmlArchive>
</PlcProjectOptions>
</ProjectExtensions>
</Project>

File diff suppressed because one or more lines are too long