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

@@ -6,7 +6,7 @@ VAR_INPUT
sInverterIPAddr : STRING;
xEnable : BOOL;
rPower : REAL;
rReactivePower : REAL := 0.0;
//rReactivePower : REAL := 0.0;
xReset : BOOL;
rMaxBattPower : REAL := 40_000; // 24kW
END_VAR
@@ -34,7 +34,7 @@ VAR
_fbWriteRegister : FB_MBWriteRegs;
// Timer for checking if the inverter started in a reasonable amount of time
_tonInverterStartup : TON;
//_tonInverterStartup : TON;
// converter max power scaling factor
_iWMaxSF : INT;
@@ -52,17 +52,17 @@ VAR
_iVarPctSF : INT;
// Reread set power limit
_iWMaxLimPctRead : INT;
_rWMaxLimPctReadScaled : REAL;
//_iWMaxLimPctRead : INT;
//_rWMaxLimPctReadScaled : REAL;
// Scaling factor for power limiting
_iWMaxLimPctSF : INT;
// Unscaled maximum power from type label
_iWRTGSF : INT;
//_iWRTGSF : INT;
// Scaling for maximum power from type label
_rWRTGScaling : REAL;
//_rWRTGScaling : REAL;
// Current state of the inverters internal statemachine
_uiInverterState : UINT;
@@ -121,6 +121,9 @@ VAR
_sName : STRING;
_uiSetPowerLimitErrorCounter : UINT;
_uiLastSetPowerLimitErrorCounter : UINT;
END_VAR
VAR CONSTANT
// Inverter statemachine status register
@@ -157,11 +160,11 @@ VAR CONSTANT
// Maximum inverter output power from type label
// Size 1, uint16 (Range = 0 .. 65534, Not implemented = 0xFFFF)
W_RTG_REGISTER : WORD := 40125;
//W_RTG_REGISTER : WORD := 40125;
// Maximum inverter output power from type label scaling factor
// Size 1, sunssf (int16) (Range = -10 .. 10, Not implemented 0x8000)
W_RTG_SF_REGISTER : WORD := 40126;
//W_RTG_SF_REGISTER : WORD := 40126;
// Start of register with the current dc values
// Size 4
@@ -229,9 +232,6 @@ CASE _iState OF
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
END_IF
1: // Read inverter status
_fbReadRegister(
sIPAddr:= sInverterIPAddr,
@@ -631,18 +631,30 @@ CASE _iState OF
_iState := 50;
_rOldPower := rPower;
_uiMaxLimEn := 1;
_uiLastSetPowerLimitErrorCounter := _uiSetPowerLimitErrorCounter;
_uiSetPowerLimitErrorCounter := 0;
// Calculate reactive power setting
//_iMaxPowerVar := LREAL_TO_INT((rReactivePower*100)/(_iMaxPowerVar * EXPT(10,_iVarPctSF)));
ELSE
xError := TRUE;
// Goto error state
_iState := 1000;
_uiSetPowerLimitErrorCounter := _uiSetPowerLimitErrorCounter + 1;
IF _uiSetPowerLimitErrorCounter > 5 THEN
// Goto error state
_iState := 1000;
ELSE
_iState := 41;
END_IF
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
41: // Retry send power limit delay
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
IF _tonPollingTimer.Q THEN
_tonPollingTimer(IN := FALSE);
_iState := 40;
END_IF
41: // Set max reactive power in percent
42: // Set max reactive power in percent
_iErrorInState := _iState;
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
@@ -672,7 +684,7 @@ CASE _iState OF
END_IF
42: // Enable reactive power percent limiting
43: // Enable reactive power percent limiting
_iErrorInState := _iState;
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
@@ -799,7 +811,7 @@ CASE _iState OF
_iState := 70;
ELSIF (ABS(rPower - _rOldPower) > 0.1) THEN
//_tonPollingTimer(IN := FALSE);
// If power has ben changed, goto set power limit mode
// If power has been changed, goto set power limit mode
_iState := 40;
// Calculate power to write to register
_iWMaxLimPct := LREAL_TO_INT((rPower*100)/(_rWMax * EXPT(10,_iWMaxLimPctSF)));
@@ -833,7 +845,7 @@ CASE _iState OF
// Check if reading mudbus register is done
IF NOT _fbReadRegister.bBusy THEN
// If there was no error and the converter has no error continue
IF NOT _fbReadRegister.bError AND (_uiInverterState <> 7) THEN
IF (NOT _fbReadRegister.bError) AND (_uiInverterState <> 7) THEN
_iState := 80;
IF (_uiInverterState = 4) OR (_uiInverterState = 5) THEN
xActive := TRUE;
@@ -842,6 +854,7 @@ CASE _iState OF
END_IF
ELSE
xError := TRUE;
xActive := FALSE;
_uiPCSSetOperation := 3;
// Read error register
_iState := 200;