Added Kaco inverter implementation

- Added Kaco inverter implementation
- Small refactoring
- Added release inverter power signal for simultaneous start of the
  inverters
This commit is contained in:
Matthias Heisig
2025-08-11 23:26:40 +09:00
parent 6f97c1aa6b
commit 9c6e28b83d
20 changed files with 1426 additions and 1665 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="MAIN" Id="{bbd7302c-91ce-4697-9f4b-743f57ca5819}" SpecialFunc="None">
<Declaration><![CDATA[PROGRAM MAIN
VAR
@@ -9,6 +9,7 @@ VAR
_xReleaseLimitsErrors : BOOL := TRUE;
_xConfirmAlarms : BOOL;
_xEnableString : BOOL;
_xReleaseInverterPower : BOOL;
_xStartBalancing : BOOL;
_xCanChangeMode : BOOL := TRUE;
@@ -362,6 +363,7 @@ END_IF
// Call string 1
_afbStrings[0](
xEnable := _xEnableString AND GVL_CONFIG.axStringEnabled[0],
xReleaseInverterPower := _xReleaseInverterPower,
uiStringNumber := 0,
eOperationMode := _eStringOpMode,
xErrorShutdown := _xErrorShutdown,
@@ -414,6 +416,7 @@ GVL_MODBUS.stBMSErrorReg.wBMSWarningActive.stBitmap.bTCabinetSCSString1High := _
// Call string 2
_afbStrings[1](
xEnable := _xEnableString AND GVL_CONFIG.axStringEnabled[1],
xReleaseInverterPower := _xReleaseInverterPower,
uiStringNumber := 1,
eOperationMode := _eStringOpMode,
xErrorShutdown := _xErrorShutdown,
@@ -923,6 +926,7 @@ _fbPowerMeter24V();]]></ST>
// Wait for power command
IF (ABS(_rAutoPowerRequest) > DINT_TO_REAL(GVL_CONFIG.diMinimumAbsPowerForEnable)) AND (NOT _xStringsErrorActive) AND _xStringsAllInAutomaticMode AND (NOT _xEMSHeartbeatNotOK) THEN
_iState := 5;
_xReleaseInverterPower := FALSE;
_xCanChangeMode := FALSE;
_xErrorShutdown := FALSE;
END_IF
@@ -974,6 +978,7 @@ _fbPowerMeter24V();]]></ST>
30: // String and inverter enabled
// Set inverter power to modbus requested power
_rPowerInverter := _rAutoPowerRequest;
_xReleaseInverterPower := TRUE;
// Check if the battery should still be active
IF (_rAutoPowerRequest = 0.0) THEN
@@ -1077,7 +1082,8 @@ _fbPowerMeter24V();]]></ST>
END_IF
// Check for errors
IF _xStringsErrorActive OR _xEMSHeartbeatNotOK THEN
IF _xStringsErrorActive OR _xEMSHeartbeatNotOK THEN
_xReleaseInverterPower := FALSE;
_xEnableString := FALSE;
_xErrorShutdown := TRUE;
_tonBeginShutdown(In := FALSE);
@@ -1092,6 +1098,7 @@ _fbPowerMeter24V();]]></ST>
IF GVL_CONFIG.xShutdownDischargeWithInverter THEN
_iState := 40;
ELSE
_xReleaseInverterPower := FALSE;
_rPowerInverter := 0.0;
_xEnableString := FALSE;
GVL_SCADA.stAutomaticModeHMI.diSetpointAutomatic := 0;
@@ -1112,6 +1119,7 @@ _fbPowerMeter24V();]]></ST>
IF _xStringsShutdownDischargeAllowed OR _xEMSHeartbeatNotOK THEN
_rPowerInverter := GVL_CONFIG.rAbsShutdownDischargePower;
ELSE
_xReleaseInverterPower := FALSE;
_xGetPowerMeterData := TRUE;
GVL_MODBUS.stModbusEMSComm.stModbusReg10.uiActiveParallelMembers := 0;
_rPowerInverter := 0.0;
@@ -1155,6 +1163,7 @@ _fbPowerMeter24V();]]></ST>
1000: // Error state
GVL_MODBUS.stModbusEMSComm.stModbusReg10.uiActiveParallelMembers := 0;
_xReleaseInverterPower := FALSE;
_xEnableString := FALSE;
_rPowerInverter := 0.0;
GVL_MODBUS.stModbusEMSComm.stModbusReg11.eBatteryStatus := E_BATTERY_STATUS.ERROR;
@@ -1210,6 +1219,7 @@ END_IF
<ST><![CDATA[CASE _iStateBalancing OF
0: // Test
IF GVL_SCADA.stAutomaticModeHMI.stStartAutoButton.xRequest THEN
_xReleaseInverterPower := FALSE;
_iStateBalancing := 5;
END_IF
@@ -1256,7 +1266,8 @@ END_CASE]]></ST>
</Action>
<Action Name="SM_MANUAL" Id="{ddef276e-9f4f-4258-b863-d254dd94b701}">
<Implementation>
<ST><![CDATA[_xCanChangeMode := TRUE;]]></ST>
<ST><![CDATA[_xCanChangeMode := TRUE;
_xReleaseInverterPower := FALSE;]]></ST>
</Implementation>
</Action>
<Action Name="SM_PRECHARGE" Id="{b84aedc8-0039-40a2-8abe-a166eca7bebc}">
@@ -1282,6 +1293,7 @@ CASE _iStatePrecharge OF
IF _xStartPrecharge AND _xStringsAllInAutomaticMode THEN
_xEnableString := TRUE;
_iStatePrecharge := 10;
_xReleaseInverterPower := FALSE;
_rPowerInverter := 0.0;
_xCanChangeMode := FALSE;
END_IF
@@ -1362,7 +1374,7 @@ IF GVL_SCADA.stAutomaticModeHMI.stStartAutoButton.xRequest THEN
END_IF
END_IF
// Sto pif stop button pressed
// Stop if stop button pressed
IF GVL_SCADA.stAutomaticModeHMI.stStopAutoButton.xRequest THEN
_xStartSafetyCheck := FALSE;
END_IF
@@ -1374,6 +1386,7 @@ CASE _iStateSafetyCheck OF
// Wait for start command
IF _xStartSafetyCheck AND _xStringsAllInAutomaticMode THEN
_xEnableString := TRUE;
_xReleaseInverterPower := FALSE;
_iStateSafetyCheck := 10;
_rPowerInverter := 0.0;
_xCanChangeMode := FALSE;