Finished first implementation of modbus error registers

This commit is contained in:
Matthias Heisig
2025-04-14 19:38:17 +02:00
parent 4a00a4c414
commit f79cf27c0c
19 changed files with 998 additions and 531 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.8">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="FB_Unit" Id="{e9bb815b-eb46-4920-800d-910484e58b22}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Unit
VAR_INPUT
@@ -48,6 +48,13 @@ VAR_INPUT
// Inverter enabled status
xInverterEnabled : BOOL;
END_VAR
VAR_IN_OUT
// Modbus warning register
stModbusWarnings : U_UNIT_WARNING_REGISTER;
// Modbus error register
stModbusErrors : U_UNIT_ERROR_REGISTER;
END_VAR
VAR_OUTPUT
// Unit state
//eUnitState : E_COMPONENT_STATUS := E_COMPONENT_STATUS.OFF;
@@ -315,9 +322,11 @@ _fbPosolytValveTankOutlet(
// Set error active if fb has error
IF _fbPosolytValveTankOutlet.xError THEN
stModbusErrors.stBitmap.bValvePos := 1;
_xErrorActive := TRUE;
END_IF
// Set safety interlock flag if fb has safety interlocks active
IF NOT stHMIInterface.stNS12.stInterlock.xSafetyINTLKOk THEN
xSafetyIntlksOk := FALSE;
@@ -346,6 +355,7 @@ _fbNegolytValveTankOutlet(
// Set error active if fb has error
IF _fbNegolytValveTankOutlet.xError THEN
stModbusErrors.stBitmap.bValveNeg := 1;
_xErrorActive := TRUE;
END_IF
@@ -385,6 +395,7 @@ _fbPosolytPumpInlet(
// Set error active if fb has error
IF _fbPosolytPumpInlet.xError THEN
stModbusErrors.stBitmap.bPumpPos := 1;
_xErrorActive := TRUE;
END_IF
@@ -429,6 +440,7 @@ _fbNegolytPumpInlet(
// Set error active if fb has error
IF _fbNegolytPumpInlet.xError THEN
stModbusErrors.stBitmap.bPumpNeg := 1;
_xErrorActive := TRUE;
END_IF
@@ -460,7 +472,27 @@ _fbPressurePosolytSegmentInlet(
// Filter pressure sensor data for HMI
_rFilteredPressPosolytInlet := _rFilteredPressPosolytInlet * 0.9 + stHMIInterface.stP11.rValue * 0.1;
stHMIInterface.stP11.rValue := _rFilteredPressPosolytInlet;
// Set modbus error register bits
IF _fbPressurePosolytSegmentInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPInPosLow := 1;
END_IF
IF _fbPressurePosolytSegmentInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPInPosHigh := 1;
END_IF
IF _fbPressurePosolytSegmentInlet.xError THEN
stModbusErrors.stBitmap.bPInPosError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressurePosolytSegmentInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPInPosLow := 1;
END_IF
IF _fbPressurePosolytSegmentInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPInPosHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressurePosolytSegmentInlet.xError THEN
_xErrorActive := TRUE;
@@ -488,6 +520,25 @@ _fbPressureNegolytSegmentInlet(
// Filter pressure sensor data for HMI
_rFilteredPressNegolytInlet := _rFilteredPressNegolytInlet * 0.9 + stHMIInterface.stP21.rValue * 0.1;
stHMIInterface.stP21.rValue := _rFilteredPressNegolytInlet;
// Set modbus error register bits
IF _fbPressureNegolytSegmentInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPInNegLow := 1;
END_IF
IF _fbPressureNegolytSegmentInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPInNegHigh := 1;
END_IF
IF _fbPressureNegolytSegmentInlet.xError THEN
stModbusErrors.stBitmap.bPInNegError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressureNegolytSegmentInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPInNegLow := 1;
END_IF
IF _fbPressureNegolytSegmentInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPInNegHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressureNegolytSegmentInlet.xError THEN
@@ -516,6 +567,25 @@ _fbPressurePosolytTankInlet(
// Filter pressure sensor data for HMI
_rFilteredPressPosolytTank := _rFilteredPressPosolytTank * 0.9 + stHMIInterface.stP12.rValue * 0.1;
stHMIInterface.stP12.rValue := _rFilteredPressPosolytTank;
// Set modbus error register bits
IF _fbPressurePosolytTankInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPTankPosLow := 1;
END_IF
IF _fbPressurePosolytTankInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPTankPosHigh := 1;
END_IF
IF _fbPressurePosolytTankInlet.xError THEN
stModbusErrors.stBitmap.bPTankPosError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressurePosolytTankInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPTankPosLow := 1;
END_IF
IF _fbPressurePosolytTankInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPTankPosHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressurePosolytTankInlet.xError THEN
@@ -544,6 +614,25 @@ _fbPressureNegolytTankInlet(
// Filter pressure sensor data for HMI
_rFilteredPressNegolytTank := _rFilteredPressNegolytTank * 0.9 + stHMIInterface.stP22.rValue * 0.1;
stHMIInterface.stP22.rValue := _rFilteredPressNegolytTank;
// Set modbus error register bits
IF _fbPressureNegolytTankInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPTankNegLow := 1;
END_IF
IF _fbPressureNegolytTankInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPTankNegHigh := 1;
END_IF
IF _fbPressureNegolytTankInlet.xError THEN
stModbusErrors.stBitmap.bPTankNegError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressureNegolytTankInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPTankNegLow := 1;
END_IF
IF _fbPressureNegolytTankInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPTankNegHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressureNegolytTankInlet.xError THEN
@@ -569,6 +658,25 @@ _fbTempSensorPosolyt(
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> stHMIInterface.stT11);
// Set modbus error register bits
IF _fbTempSensorPosolyt.xErrorLow THEN
stModbusErrors.stBitmap.bTPosLow := 1;
END_IF
IF _fbTempSensorPosolyt.xErrorHigh THEN
stModbusErrors.stBitmap.bTPosHigh := 1;
END_IF
IF _fbTempSensorPosolyt.xError THEN
stModbusErrors.stBitmap.bTPosError := 1;
END_IF
// Set modbus warning register bits
IF _fbTempSensorPosolyt.xWarningLow THEN
stModbusWarnings.stBitmap.bTPosLow := 1;
END_IF
IF _fbTempSensorPosolyt.xWarningHigh THEN
stModbusWarnings.stBitmap.bTPosHigh := 1;
END_IF
IF _fbTempSensorPosolyt.xError THEN
_xErrorActive := TRUE;
END_IF
@@ -591,6 +699,25 @@ _fbTempSensorNegolyt(
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> stHMIInterface.stT21);
// Set modbus error register bits
IF _fbTempSensorNegolyt.xErrorLow THEN
stModbusErrors.stBitmap.bTNegLow := 1;
END_IF
IF _fbTempSensorNegolyt.xErrorHigh THEN
stModbusErrors.stBitmap.bTNegHigh := 1;
END_IF
IF _fbTempSensorNegolyt.xError THEN
stModbusErrors.stBitmap.bTNegError := 1;
END_IF
// Set modbus warning register bits
IF _fbTempSensorNegolyt.xWarningLow THEN
stModbusWarnings.stBitmap.bTNegLow := 1;
END_IF
IF _fbTempSensorNegolyt.xWarningHigh THEN
stModbusWarnings.stBitmap.bTNegHigh := 1;
END_IF
IF _fbTempSensorNegolyt.xError THEN
_xErrorActive := TRUE;
END_IF
@@ -614,6 +741,25 @@ _fbVoltageSegment(
stHMIInterface=> stHMIInterface.stE31,
rScaledValue => rCurrentVoltage);
// Set modbus error register bits
IF _fbVoltageSegment.xErrorLow THEN
stModbusErrors.stBitmap.bVLow := 1;
END_IF
IF _fbVoltageSegment.xErrorHigh THEN
stModbusErrors.stBitmap.bVHigh := 1;
END_IF
IF _fbVoltageSegment.xError THEN
stModbusErrors.stBitmap.bVError := 1;
END_IF
// Set modbus warning register bits
IF _fbVoltageSegment.xWarningLow THEN
stModbusWarnings.stBitmap.bVLow := 1;
END_IF
IF _fbVoltageSegment.xWarningHigh THEN
stModbusWarnings.stBitmap.bVHigh := 1;
END_IF
// Set error active if fb has error
IF _fbVoltageSegment.xError THEN
_xErrorActive := TRUE;
@@ -704,6 +850,18 @@ StateMachine();
xError := _xErrorActive;
xWarning := _xWarningActive;
IF (NOT xSafetyIntlksOk) THEN
stModbusErrors.stBitmap.bSafetyIntlk := 1;
END_IF
// ===============================
// Reset modbus error register with alarm confirmation
// ===============================
IF xConfirmAlarms THEN
stModbusErrors.dwRegister := 0;
stModbusWarnings.dwRegister := 0;
END_IF
// ===============================
// Handle general error message