Single strings can now be activated or deactivated
This commit is contained in:
@@ -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
|
||||||
// ===========================
|
// ===========================
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user