Minor bugfixes and future addons

This commit is contained in:
Matthias Heisig
2025-04-06 10:21:01 +02:00
parent 84e0e174a1
commit 2221f6bab3
22 changed files with 795 additions and 509 deletions

View File

@@ -10,7 +10,7 @@ VAR_INPUT
stHMIInterface : REFERENCE TO ST_UNIT_HMI_INTERFACE;
// Components shortage workaround
xVoltageSensorIs1500V : BOOL;
// xVoltageSensorIs1500V : BOOL;
// Start unit
xEnable : BOOL;
@@ -50,7 +50,7 @@ VAR_INPUT
END_VAR
VAR_OUTPUT
// Unit state
eUnitState : E_COMPONENT_STATUS := E_COMPONENT_STATUS.OFF;
//eUnitState : E_COMPONENT_STATUS := E_COMPONENT_STATUS.OFF;
// Unit ready
xReady : BOOL;
@@ -70,9 +70,6 @@ VAR_OUTPUT
// Warning active
xWarning : BOOL;
// Warning confirmation still pending
_xWarningConfirmPending : BOOL;
// Current Unit voltage
rCurrentVoltage : REAL;
@@ -219,6 +216,9 @@ VAR
// Filtered pressure sensor posolyt tank inlet data for HMI
_rFilteredPressNegolytTank : REAL;
// Pumps ready
_xPumpsReady : BOOL;
// Indicate if it ise the first cycle
xFirstCycle : BOOL := TRUE;
END_VAR
@@ -442,6 +442,7 @@ IF NOT stHMIInterface.stNS21.stInterlock.xSafetyINTLKOk THEN
xSafetyIntlksOk := FALSE;
END_IF
_xPumpsReady := stHMIInterface.stNS21.stInterlock.xProcessINTLKOk AND stHMIInterface.stNS21.stInterlock.xSafetyINTLKOk AND stHMIInterface.stNS11.stInterlock.xProcessINTLKOk AND stHMIInterface.stNS11.stInterlock.xSafetyINTLKOk;
// ===============================
// Pressure sensor posolyt segment inlet
@@ -602,29 +603,16 @@ END_IF
// ===============================
// Voltage segment
// ===============================
IF xVoltageSensorIs1500V THEN
_fbVoltageSegment(
stScalingConfig:= GVL_CONFIG.stConfigVoltageSegment1500,
stEWConfig:= GVL_CONFIG.stUnitConfig.stEWLVoltageSegment,
stEWDelayConfig:= GVL_CONFIG.stUnitConfig.stEWDVoltageSegment,
xReleaseErrors:= xReleaseErrors,
xReleaseLimitErrors:= xReleaseLimitErrors AND _xEnableVoltageLimitChecks,
xReleaseHardwareErrors:= xReleaseErrors,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> stHMIInterface.stE31,
rScaledValue => rCurrentVoltage);
ELSE
_fbVoltageSegment(
stScalingConfig:= GVL_CONFIG.stUnitConfig.stConfigVoltageSegment,
stEWConfig:= GVL_CONFIG.stUnitConfig.stEWLVoltageSegment,
stEWDelayConfig:= GVL_CONFIG.stUnitConfig.stEWDVoltageSegment,
xReleaseErrors:= xReleaseErrors,
xReleaseLimitErrors:= xReleaseLimitErrors AND _xEnableVoltageLimitChecks,
xReleaseHardwareErrors:= xReleaseErrors,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> stHMIInterface.stE31,
rScaledValue => rCurrentVoltage);
END_IF
_fbVoltageSegment(
stScalingConfig:= GVL_CONFIG.stUnitConfig.stConfigVoltageSegment,
stEWConfig:= GVL_CONFIG.stUnitConfig.stEWLVoltageSegment,
stEWDelayConfig:= GVL_CONFIG.stUnitConfig.stEWDVoltageSegment,
xReleaseErrors:= xReleaseErrors,
xReleaseLimitErrors:= xReleaseLimitErrors AND _xEnableVoltageLimitChecks,
xReleaseHardwareErrors:= xReleaseErrors,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> stHMIInterface.stE31,
rScaledValue => rCurrentVoltage);
// Set error active if fb has error
IF _fbVoltageSegment.xError THEN
@@ -637,6 +625,14 @@ IF _fbVoltageSegment.xWarning THEN
END_IF
// ===============================
// Check for EStop
// ===============================
IF (NOT xEmergencyStopOk) THEN
_xErrorActive := TRUE;
END_IF
// ===============================
// Write Voltage to HMI
// ===============================
@@ -696,6 +692,8 @@ _rShutdownDischargeVoltageThreshold := GVL_CONFIG.rMinimumUnitVoltage + GVL_CONF
// ===============================
// Run state machine for startup
// and shutdown
// NEEDS TO BE CALLED AFTER ALL COMPONENTS BECAUSE OF RESET AND ALARM ACKNOWLEDGEMENT!!!
// (e.g. restart pumps after estop if segment voltage is still to high)
// ===============================
StateMachine();
@@ -783,7 +781,7 @@ CASE _iState OF
_xReleaseManualMode := FALSE;
_timUnitStartupWaitTime := GVL_CONFIG.timUnitStartupTime;
_iState := 10;
eUnitState := E_COMPONENT_STATUS.STARTING;
stHMIInterface.eStatus := E_COMPONENT_STATUS.STARTING;
END_IF
// Start in balancing mode
@@ -793,6 +791,10 @@ CASE _iState OF
_timUnitStartupWaitTime := GVL_CONFIG.timUnitBalancingStartupTime;
_iState := 10;
END_IF
IF _xErrorActive THEN
_iState := 1000;
END_IF
10: // Open all valves
_fbPosolytValveTankOutlet.ReqAutomaticOpen();
@@ -809,7 +811,7 @@ CASE _iState OF
// If enable signal is lost
IF ((NOT xEnable) AND (NOT xStartBalancing)) THEN
eUnitState := E_COMPONENT_STATUS.SHUTDOWN;
stHMIInterface.eStatus := E_COMPONENT_STATUS.SHUTDOWN;
_iState := 40;
END_IF
@@ -818,6 +820,10 @@ CASE _iState OF
_xReleaseManualMode := TRUE;
_iState := 1000;
END_IF
IF (NOT xEnable) THEN
_iState := 51;
END_IF
20: // Start pumps
_fbPosolytPumpInlet.ReqAutomaticStart();
@@ -835,7 +841,7 @@ CASE _iState OF
// If enable signal is lost, goto shutdown
IF ((NOT xEnable) AND (NOT xStartBalancing)) THEN
eUnitState := E_COMPONENT_STATUS.SHUTDOWN;
stHMIInterface.eStatus := E_COMPONENT_STATUS.SHUTDOWN;
_iState := 40; // 40
END_IF
@@ -859,7 +865,7 @@ CASE _iState OF
// If enable signal is lost, goto shutdown
IF (NOT xEnable) AND (NOT xStartBalancing) THEN
eUnitState := E_COMPONENT_STATUS.SHUTDOWN;
stHMIInterface.eStatus := E_COMPONENT_STATUS.SHUTDOWN;
_iState := 40;
END_IF
@@ -882,7 +888,7 @@ CASE _iState OF
// Continue on normal startup path
IF xEnable THEN
eUnitState := E_COMPONENT_STATUS.ON;
stHMIInterface.eStatus := E_COMPONENT_STATUS.ON;
_iState := 35;
END_IF
@@ -904,7 +910,7 @@ CASE _iState OF
_rSetpointPosolytPumpInlet := GVL_CONFIG.rPumpPosolytOnPower;
IF (NOT xEnable) THEN
eUnitState := E_COMPONENT_STATUS.SHUTDOWN;
stHMIInterface.eStatus := E_COMPONENT_STATUS.SHUTDOWN;
_iState := 40;
END_IF
@@ -961,6 +967,10 @@ CASE _iState OF
_iState := 0;
END_IF
IF _xErrorActive THEN
_iState := 1000;
END_IF
51: // Discharge without inverter
_rSetpointNegolytPumpInlet := GVL_CONFIG.rPumpNegolytDisChrgPower;
_rSetpointPosolytPumpInlet := GVL_CONFIG.rPumpPosolytDisChrgPower;
@@ -978,6 +988,10 @@ CASE _iState OF
_iState := 0;
END_IF
IF _xErrorActive THEN
_iState := 1000;
END_IF
60: // Disable pumps
_fbPosolytPumpInlet.ReqAutomaticStop();
_fbNegolytPumpInlet.ReqAutomaticStop();
@@ -988,14 +1002,14 @@ CASE _iState OF
xOff := TRUE;
_xReleaseManualMode := TRUE;
IF NOT _xErrorActive THEN
eUnitState := E_COMPONENT_STATUS.OFF;
stHMIInterface.eStatus := E_COMPONENT_STATUS.OFF;
_iState := 0;
END_IF
END_IF
// Check for restart condition
IF xEnable AND (NOT _xErrorActive) THEN
eUnitState := E_COMPONENT_STATUS.OFF;
stHMIInterface.eStatus := E_COMPONENT_STATUS.OFF;
_iState := 0;
END_IF
@@ -1059,6 +1073,9 @@ CASE _iState OF
_rSetpointNegolytPumpInlet := GVL_CONFIG.rPumpNegolytDisChrgPower;
_rSetpointPosolytPumpInlet := GVL_CONFIG.rPumpPosolytDisChrgPower;
_fbNegolytPumpInlet.ReqAutomaticStart();
_fbPosolytPumpInlet.ReqAutomaticStart();
_xEnableVoltageLimitChecks := FALSE;
xShutdownDischargeAllowed := FALSE;
xInShutdownDischargeMode := FALSE;
@@ -1082,9 +1099,12 @@ CASE _iState OF
_iState := 0;
END_IF
IF _xErrorActive THEN
_iState := 1000;
END_IF
1000: // Error shutdown
eUnitState := E_COMPONENT_STATUS.ERROR;
stHMIInterface.eStatus := E_COMPONENT_STATUS.ERROR;
_fbNegolytValveTankOutlet.ReqAutomaticClose();
_fbPosolytValveTankOutlet.ReqAutomaticClose();
_fbPosolytPumpInlet.ReqAutomaticStop();
@@ -1100,10 +1120,22 @@ CASE _iState OF
1001: // Alarm active
// Only allow reset when enable is deactivated to avoid an
// automatic restart of the unit
IF (NOT _xErrorActive) AND (NOT xEnable) AND (NOT xStartBalancing) AND xConfirmAlarms THEN
IF (NOT _xErrorActive) AND (NOT xEnable) AND (NOT xStartBalancing) AND _xPumpsReady AND xConfirmAlarms THEN
xError := FALSE;
_iState := 51;
IF (_fbVoltageSegment.rScaledValue >= GVL_CONFIG.rPumpshutoffThreshold) THEN
_iState := 1002;
ELSE
_iState := 0;
END_IF
END_IF
1002:
_rSetpointNegolytPumpInlet := GVL_CONFIG.rPumpNegolytDisChrgPower;
_rSetpointPosolytPumpInlet := GVL_CONFIG.rPumpPosolytDisChrgPower;
_fbNegolytPumpInlet.ReqAutomaticStart();
_fbPosolytPumpInlet.ReqAutomaticStart();
_iState := 51;
END_CASE]]></ST>
</Implementation>
</Action>