Implemented fixes and improvements during comissioning

- New Balancing mode
- HMI Interface for Inverterdata implemented
- Adjusted GVL_CONFIG values
- Read inverter data even when inverter is off
- Added OPC UA settings to inverter data hmi interface
- Added multisettings to safety project for strings
This commit is contained in:
Matthias Heisig
2024-05-06 11:05:33 +02:00
parent b95033a155
commit 327f324be8
58 changed files with 24795 additions and 3667 deletions

View File

@@ -13,10 +13,10 @@ VAR_GLOBAL PERSISTENT
(
rTargetMin := 0.0,
rTargetMax := 100.0,
timRampUpTime := T#5S,
timRampDownTime := T#5S,
stAnalogInputConfig := (iAIMax := 32767, iAIMin := 0, rPVMax := 100, rPVMin := 0, sUnit := '%'),
stAnalogOutputConfig := (iAIMax := 32767, iAIMin := 0, rPVMax := 100, rPVMin := 0),
timRampUpTime := T#10S,
timRampDownTime := T#10S,
stAnalogInputConfig := (iAIMax := 108, iAIMin := 0, rPVMax := 100, rPVMin := 0, sUnit := '%'),
stAnalogOutputConfig := (iAIMax := 29490, iAIMin := 0, rPVMax := 100, rPVMin := 4.807),
xHasAnalogFeedback := TRUE,
xHasMCBFeedback := TRUE,
xHasRepairSwitchFeedback := FALSE
@@ -29,8 +29,8 @@ VAR_GLOBAL PERSISTENT
rTargetMax := 100.0,
timRampUpTime := T#5S,
timRampDownTime := T#5S,
stAnalogInputConfig := (iAIMax := 32767, iAIMin := 0, rPVMax := 100, rPVMin := 0, sUnit := '%'),
stAnalogOutputConfig := (iAIMax := 32767, iAIMin := 0, rPVMax := 100, rPVMin := 0),
stAnalogInputConfig := (iAIMax := 108, iAIMin := 0, rPVMax := 100, rPVMin := 0, sUnit := '%'),
stAnalogOutputConfig := (iAIMax := 29490, iAIMin := 0, rPVMax := 100, rPVMin := 4.807),
xHasAnalogFeedback := TRUE,
xHasMCBFeedback := TRUE,
xHasRepairSwitchFeedback := FALSE
@@ -44,103 +44,103 @@ VAR_GLOBAL PERSISTENT
// Pressure posolyt segment inlet
stConfigPosolytPressureSegmentInlet := (iAIMax := 32767, iAIMin := 0, rPVMax := 2000, rPVMin := 0, sUnit := 'mbar'),
stEWLPosolytPressureSegmentInlet := (rErrorMin := 170, rWarningMin := 200, rWarningMax := 600, rErrorMax := 700),
stEWLPosolytPressureSegmentInlet := (rErrorMin := 200, rWarningMin := 250, rWarningMax := 550, rErrorMax := 600),
stEWDPosolytPressureSegmentInlet :=
(
timHardwareSignalLevelOn := T#0S,
timHardwareSignalLevelOff := T#5S,
timErrorLowOn := T#2S,
timErrorLowOn := T#1S,
timErrorLowOff := T#5S,
timWarningLowOn := T#2S,
timWarningLowOn := T#1S,
timWarningLowOff := T#5S,
timWarningHighOn := T#2S,
timWarningHighOn := T#1S,
timWarningHighOff := T#5S,
timErrorHighOn := T#2S,
timErrorHighOn := T#1S,
timErrorHighOff := T#5S
),
// Pressure negolyt segment inlet
stConfigNegolytPressureSegmentInlet := (iAIMax := 32767, iAIMin := 0, rPVMax := 2000, rPVMin := 0, sUnit := 'mbar'),
stEWLNegolytPressureSegmentInlet := (rErrorMin := 170, rWarningMin := 200, rWarningMax := 600, rErrorMax := 700),
stEWLNegolytPressureSegmentInlet := (rErrorMin := 200, rWarningMin := 250, rWarningMax := 550, rErrorMax := 600),
stEWDNegolytPressureSegmentInlet :=
(
timHardwareSignalLevelOn := T#0S,
timHardwareSignalLevelOff := T#5S,
timErrorLowOn := T#2S,
timErrorLowOn := T#1S,
timErrorLowOff := T#5S,
timWarningLowOn := T#2S,
timWarningLowOn := T#1S,
timWarningLowOff := T#5S,
timWarningHighOn := T#2S,
timWarningHighOn := T#1S,
timWarningHighOff := T#5S,
timErrorHighOn := T#2S,
timErrorHighOn := T#1S,
timErrorHighOff := T#5S
),
// Pressure posolyt tank inlet
stConfigPosolytPressureTankInlet := (iAIMax := 32767, iAIMin := 0, rPVMax := 2000, rPVMin := 0, sUnit := 'mbar'),
stEWLPosolytPressureTankInlet := (rErrorMin := -100, rWarningMin := -50, rWarningMax := 100, rErrorMax := 120),
stEWLPosolytPressureTankInlet := (rErrorMin := -20, rWarningMin := -10, rWarningMax := 15, rErrorMax := 25),
stEWDPosolytPressureTankInlet :=
(
timHardwareSignalLevelOn := T#0S,
timHardwareSignalLevelOff := T#5S,
timErrorLowOn := T#2S,
timErrorLowOn := T#1S,
timErrorLowOff := T#5S,
timWarningLowOn := T#2S,
timWarningLowOn := T#1S,
timWarningLowOff := T#5S,
timWarningHighOn := T#2S,
timWarningHighOn := T#1S,
timWarningHighOff := T#5S,
timErrorHighOn := T#2S,
timErrorHighOn := T#1S,
timErrorHighOff := T#5S
),
// Pressure negolyt tank inlet
stConfigNegolytPressureTankInlet := (iAIMax := 32767, iAIMin := 0, rPVMax := 2000, rPVMin := 0, sUnit := 'mbar'),
stEWLNegolytPressureTankInlet := (rErrorMin := -100, rWarningMin := -50, rWarningMax := 100, rErrorMax := 120),
stEWLNegolytPressureTankInlet := (rErrorMin := -20, rWarningMin := -10, rWarningMax := 15, rErrorMax := 25),
stEWDNegolytPressureTankInlet :=
(
timHardwareSignalLevelOn := T#0S,
timHardwareSignalLevelOff := T#5S,
timErrorLowOn := T#2S,
timErrorLowOn := T#1S,
timErrorLowOff := T#5S,
timWarningLowOn := T#2S,
timWarningLowOn := T#1S,
timWarningLowOff := T#5S,
timWarningHighOn := T#2S,
timWarningHighOn := T#1S,
timWarningHighOff := T#5S,
timErrorHighOn := T#2S,
timErrorHighOn := T#1S,
timErrorHighOff := T#5S
),
// Temperature sensor posolyt tank inlet
stConfigPosolytTempTankInlet := (iAIMax := 32767, iAIMin := -32768, rPVMax := 3276.7, rPVMin := -3276.8, sUnit := '°C'),
stEWLPosolytTempTankInlet := (rErrorMin := -10, rWarningMin := -5, rWarningMax := 50, rErrorMax := 60),
stEWLPosolytTempTankInlet := (rErrorMin := 10, rWarningMin := 15, rWarningMax := 50, rErrorMax := 60),
stEWDPosolytTempTankInlet :=
(
timHardwareSignalLevelOn := T#0S,
timHardwareSignalLevelOff := T#5S,
timErrorLowOn := T#2S,
timErrorLowOn := T#1S,
timErrorLowOff := T#5S,
timWarningLowOn := T#2S,
timWarningLowOn := T#1S,
timWarningLowOff := T#5S,
timWarningHighOn := T#2S,
timWarningHighOn := T#1S,
timWarningHighOff := T#5S,
timErrorHighOn := T#2S,
timErrorHighOn := T#1S,
timErrorHighOff := T#5S
),
// Temperature sensor negolyt tank inlet
stConfigNegolytTempTankInlet := (iAIMax := 32767, iAIMin := -32768, rPVMax := 3276.7, rPVMin := -3276.8, sUnit := '°C'),
stEWLNegolytTempTankInlet := (rErrorMin := -10, rWarningMin := -5, rWarningMax := 50, rErrorMax := 60),
stEWLNegolytTempTankInlet := (rErrorMin := 15, rWarningMin := 15, rWarningMax := 50, rErrorMax := 60),
stEWDNegolytTempTankInlet :=
(
timHardwareSignalLevelOn := T#0S,
timHardwareSignalLevelOff := T#5S,
timErrorLowOn := T#2S,
timErrorLowOn := T#1S,
timErrorLowOff := T#5S,
timWarningLowOn := T#2S,
timWarningLowOn := T#1S,
timWarningLowOff := T#5S,
timWarningHighOn := T#2S,
timWarningHighOn := T#1S,
timWarningHighOff := T#5S,
timErrorHighOn := T#2S,
timErrorHighOn := T#1S,
timErrorHighOff := T#5S
),
@@ -149,24 +149,31 @@ VAR_GLOBAL PERSISTENT
// Index 0x80n0:02 "Presentation" = Signed(0) -> Resolution 1/10°C
// Index 0x80n0:19 "RTD Element" = PT100(0)
stConfigVoltageSegment := (iAIMax := 32767, iAIMin := 0, rPVMax := 150, rPVMin := 0, sUnit := 'V'),
stEWLVoltageSegment := (rErrorMin := 50, rWarningMin := 55, rWarningMax := 75, rErrorMax := 79),
stEWLVoltageSegment := (rErrorMin := 50, rWarningMin := 55, rWarningMax := 77, rErrorMax := 80),
stEWDVoltageSegment :=
(
timHardwareSignalLevelOn := T#0S,
timHardwareSignalLevelOff := T#5S,
timErrorLowOn := T#2S,
timErrorLowOn := T#1S,
timErrorLowOff := T#5S,
timWarningLowOn := T#2S,
timWarningLowOn := T#1S,
timWarningLowOff := T#5S,
timWarningHighOn := T#2S,
timWarningHighOn := T#1S,
timWarningHighOff := T#5S,
timErrorHighOn := T#2S,
timErrorHighOn := T#1S,
timErrorHighOff := T#5S
),
rMaxDeltaPSegmentInlet := 100.0
rMaxDeltaPSegmentInlet := 50.0
);
// ===========================
// SCS Current measurement settings
// ===========================
stConfigSCSCurrent : ST_ANALOG_IO_CONFIG := (iAIMax := 32767, iAIMin := 0, rPVMax := 200, rPVMin := 0, sUnit := 'A');
stEWLSCSCurrent : ST_ANALOG_EW_LEVELS;
stEWDSCSCurrent : ST_ANALOG_EW_DELAYS;
// ===========================
// Part shortage workaround
// ===========================
@@ -197,6 +204,33 @@ VAR_GLOBAL PERSISTENT
xUnit4Is1500V := TRUE
)
);
stString2VoltageConfig : ST_STRING_VOLT_CONFIG :=
(
stModule1VoltConfig :=
(
xUnit1Is1500V := FALSE,
xUnit2Is1500V := TRUE,
xUnit3Is1500V := TRUE,
xUnit4Is1500V := TRUE
),
stModule2VoltConfig :=
(
xUnit1Is1500V := FALSE,
xUnit2Is1500V := TRUE,
xUnit3Is1500V := TRUE,
xUnit4Is1500V := TRUE
),
stModule3VoltConfig :=
(
xUnit1Is1500V := FALSE,
xUnit2Is1500V := TRUE,
xUnit3Is1500V := TRUE,
xUnit4Is1500V := TRUE
)
);
// ===========================
@@ -204,8 +238,8 @@ VAR_GLOBAL PERSISTENT
// ===========================
// Pump on power (%)
rPumpPosolytOnPower : REAL := 70.0;
rPumpNegolytOnPower : REAL := 70.0;
rPumpPosolytOnPower : REAL := 65.0;
rPumpNegolytOnPower : REAL := 65.0;
// Pump discharge segment without inverter power (%)
rPumpPosolytDisChrgPower : REAL := 35.0;
@@ -215,18 +249,18 @@ VAR_GLOBAL PERSISTENT
rPumpshutoffThreshold : REAL := 15.0;
// Minimum unit voltage required for inverter startup (Volt)
rMinimumUnitVoltage : REAL := 50.0;
rMinimumUnitVoltage : REAL := 55.0;
// Delta value to minimum unit voltage for shutdown discharge (Volt)
rDeltaUnitVoltageShutdownDischarge : REAL := 5.0;
// Maximum absolute voltage difference
// between units in the same module
rMaxAbsDiffVoltageUnitsOnModule : REAL := 5.0;
rMaxAbsDiffVoltageUnitsOnModule : REAL := 10.0;
// Maximum absolute voltage difference
// between Modules (Volt)
rMaxAbsDiffVoltageModulesInString : REAL := 10.0;
rMaxAbsDiffVoltageModulesInString : REAL := 20.0;
// Minimum absolute power command to enable battery (Watt)
diMinimumAbsPowerForEnable : DINT := 100;
@@ -239,26 +273,34 @@ VAR_GLOBAL PERSISTENT
// 60.000 W -> 5.000 W per Unit
diMaxStringDischargePower : DINT := 60_000;
// Inverter ip address
sInverterIp : STRING := '192.168.42.10';
// Inverter ip address for string 1
sInverterIpString1 : STRING := '192.168.42.10';
// Inverter ip address for string 2
sInverterIpString2 : STRING := '192.168.42.20';
// Absolute shutdown discharge power (Watt)
// 12.000 W -> 1.000 W per unit
rAbsShutdownDischargePower : REAL := 12_000;
rAbsShutdownDischargePower : REAL := 6_500;
// Allow inverter fast shutdown discharge
xShutdownDischargeWithInverter : BOOL := FALSE;
// String fully charged voltage (Volt)
// 960 V -> 80 V per Unit
rStringFullyChargedVoltage : REAL := 960.0;
rStringFullyChargedVoltage : REAL := 950.0;
// String empty voltage (Volt) (585V is needed for the inverter to start up -> 50V per Segment)
// 600 V -> 50 V per Unit
rStringEmptyVoltage : REAL := 600.0;
// String empty voltage (Volt) (617V is needed for the inverter to start up -> 51.4V per Segment)
rStringEmptyVoltage : REAL := 630.0;
// Unit wait startup time
timUnitStartupTime : TIME := T#5S;
timUnitStartupTime : TIME := T#1M;
// Unit balancing wait startup time
timUnitBalancingStartupTime : TIME := T#3M;
// Dummy to deactivate functions
xDummy : BOOL := FALSE;
END_VAR]]></Declaration>
</GVL>