Single strings can now be activated or deactivated

This commit is contained in:
Matthias Heisig
2025-04-28 17:14:17 +02:00
parent 7b810b19d2
commit 70090f08d9
2 changed files with 36 additions and 16 deletions

View File

@@ -10,6 +10,8 @@ VAR_GLOBAL CONSTANT
uiNumberOfUnits : UINT := uiNumberOfStrings * 12; uiNumberOfUnits : UINT := uiNumberOfStrings * 12;
END_VAR END_VAR
VAR_GLOBAL PERSISTENT VAR_GLOBAL PERSISTENT
axStringEnabled : ARRAY [0..uiNumberOfStrings-1] OF BOOL;
// =========================== // ===========================
// Unit hardware config // Unit hardware config
// =========================== // ===========================

View File

@@ -156,6 +156,9 @@ VAR
_fbPowerMeterPower : FB_PowerMeter; _fbPowerMeterPower : FB_PowerMeter;
_fbPowerMeter24V : FB_PowerMeter; _fbPowerMeter24V : FB_PowerMeter;
// Number of activated strings (from configuration)
_uiNumberOfActiveStrings : UINT;
_xGetPowerMeterData : BOOL; _xGetPowerMeterData : BOOL;
END_VAR END_VAR
]]></Declaration> ]]></Declaration>
@@ -306,7 +309,7 @@ _tonStartupDelay(IN := TRUE);
// Call string 1 // Call string 1
_afbStrings[0]( _afbStrings[0](
xEnable := _xEnableString, xEnable := _xEnableString AND GVL_CONFIG.axStringEnabled[0],
uiStringNumber := 0, uiStringNumber := 0,
xErrorShutdown := _xErrorShutdown, xErrorShutdown := _xErrorShutdown,
xStartBalancing := _xStartBalancing, xStartBalancing := _xStartBalancing,
@@ -335,7 +338,7 @@ GVL_MODBUS.stBMSErrorReg.wBMSWarningActive.stBitmap.bSafetyIntlkString1 := (NOT
// Call string 2 // Call string 2
_afbStrings[1]( _afbStrings[1](
xEnable := _xEnableString, xEnable := _xEnableString AND GVL_CONFIG.axStringEnabled[1],
uiStringNumber := 1, uiStringNumber := 1,
xErrorShutdown := _xErrorShutdown, xErrorShutdown := _xErrorShutdown,
xStartBalancing := _xStartBalancing, xStartBalancing := _xStartBalancing,
@@ -380,8 +383,18 @@ _rMinCurrentInverterDCVoltage := 10_000;
_rHighestSegmentVoltage := 0.0; _rHighestSegmentVoltage := 0.0;
_rSmallestSegmentVoltage := 1_000.0; _rSmallestSegmentVoltage := 1_000.0;
_xStringsInAutoMode := TRUE; _xStringsInAutoMode := TRUE;
_uiNumberOfActiveStrings := 0;
_rStringsSumVoltage := 0;
FOR _ui := 0 TO (GVL_CONFIG.uiNumberOfStrings-1) DO FOR _ui := 0 TO (GVL_CONFIG.uiNumberOfStrings-1) DO
// Ignore deactivated strings
IF (NOT GVL_CONFIG.axStringEnabled[_ui]) THEN
CONTINUE;
END_IF
// Count number of active strings
_uiNumberOfActiveStrings := _uiNumberOfActiveStrings + 1;
// Check ready state // Check ready state
IF (NOT _afbStrings[_ui].xReady) THEN IF (NOT _afbStrings[_ui].xReady) THEN
_xStringsReady := FALSE; _xStringsReady := FALSE;
@@ -437,6 +450,9 @@ FOR _ui := 0 TO (GVL_CONFIG.uiNumberOfStrings-1) DO
_rHighestSegmentVoltage := _afbStrings[_ui].rHighestSegmentVoltage; _rHighestSegmentVoltage := _afbStrings[_ui].rHighestSegmentVoltage;
END_IF END_IF
// Calculate sum voltage
_rStringsSumVoltage := _rStringsSumVoltage + _afbStrings[_ui].rCurrentVoltage;
// Get auto mode status // Get auto mode status
IF NOT _afbStrings[_ui].xAllModulesInAutoMode THEN IF NOT _afbStrings[_ui].xAllModulesInAutoMode THEN
_xStringsInAutoMode := FALSE; _xStringsInAutoMode := FALSE;
@@ -446,7 +462,7 @@ END_FOR
// =============================== // ===============================
// Calculate sum power for string balancing // Calculate sum power for string balancing
// =============================== // ===============================
_rStringsSumVoltage := _afbStrings[0].rCurrentVoltage + _afbStrings[1].rCurrentVoltage; // _rStringsSumVoltage := _afbStrings[0].rCurrentVoltage + _afbStrings[1].rCurrentVoltage;
// =============================== // ===============================
@@ -928,20 +944,22 @@ _fbPowerMeter24V();]]></ST>
END_CASE END_CASE
// Calculate string power balancing // Calculate string power balancing
IF _rStringsSumVoltage <> 0 AND (GVL_CONFIG.uiNumberOfStrings <> 0) THEN IF _rStringsSumVoltage <> 0 AND (_uiNumberOfActiveStrings <> 0) THEN
FOR _ui := 0 TO (GVL_CONFIG.uiNumberOfStrings-1) DO FOR _ui := 0 TO (GVL_CONFIG.uiNumberOfStrings-1) DO
// Calculate delta u to middle voltage IF GVL_CONFIG.axStringEnabled[_ui] THEN
_rDeltaUm := (_afbStrings[_ui].rCurrentVoltage * GVL_CONFIG.uiNumberOfStrings - _rStringsSumVoltage) / _rStringsSumVoltage; // Calculate delta u to middle voltage
_rDeltaUm := (_afbStrings[_ui].rCurrentVoltage * _uiNumberOfActiveStrings - _rStringsSumVoltage) / _rStringsSumVoltage;
// Discharging
IF _rPowerInverter > 0 THEN // Discharging
_arPowerString[_ui] := (_rPowerInverter / GVL_CONFIG.uiNumberOfStrings) * ( 1 + (_rDeltaUm * GVL_CONFIG.rBalancingFactor)); IF _rPowerInverter > 0 THEN
// Charging _arPowerString[_ui] := (_rPowerInverter / _uiNumberOfActiveStrings) * ( 1 + (_rDeltaUm * GVL_CONFIG.rBalancingFactor));
ELSIF _rPowerInverter < 0 THEN // Charging
_arPowerString[_ui] := (_rPowerInverter / GVL_CONFIG.uiNumberOfStrings) * ( 1 - (_rDeltaUm * GVL_CONFIG.rBalancingFactor)); ELSIF _rPowerInverter < 0 THEN
// Nothing _arPowerString[_ui] := (_rPowerInverter / _uiNumberOfActiveStrings) * ( 1 - (_rDeltaUm * GVL_CONFIG.rBalancingFactor));
ELSE // Nothing
_arPowerString[_ui] := 0.0; ELSE
_arPowerString[_ui] := 0.0;
END_IF
END_IF END_IF
END_FOR END_FOR
ELSE ELSE