diff --git a/csharp/App/GrowattCommunication/Program.cs b/csharp/App/GrowattCommunication/Program.cs index c5713eab1..6ef2e9a30 100644 --- a/csharp/App/GrowattCommunication/Program.cs +++ b/csharp/App/GrowattCommunication/Program.cs @@ -109,27 +109,26 @@ public static class Program // the order matter of the next three lines var statusrecord = ReadStatus(); - // SendSalimaxStateAlarm(GetSodiHomeStateAlarm(statusrecord),statusrecord); + SendSalimaxStateAlarm(GetSodiHomeStateAlarm(statusrecord),statusrecord); await DataLogging(statusrecord, timestamp); // save a csv file locally await SaveModbusTcpFile(statusrecord); // save the json file for modbuscTCP - statusrecord.AcDcGrowatt.RemotePowerControl.WriteLine(" = RemotePowerControl"); + /* statusrecord.AcDcGrowatt.RemotePowerControl.WriteLine(" = RemotePowerControl"); statusrecord.AcDcGrowatt.EnableCommand.WriteLine(" = EnableCommand"); - statusrecord.AcDcGrowatt.ControlPermession.WriteLine(" ControlPermession"); + statusrecord.AcDcGrowatt.ControlPermession.WriteLine(" ControlPermession");*/ statusrecord.AcDcGrowatt.GridMeterPower.WriteLine(" GridMeterPower"); statusrecord.AcDcGrowatt.InverterActivePower.WriteLine(" InverterActivePower"); - statusrecord.AcDcGrowatt.BatteryPower1.WriteLine(" BatteryPower1"); // 30408 this the duration statusrecord.AcDcGrowatt.PhaseACurrent.WriteLine(" PhaseACurrent "); //30409 we set power here statusrecord.AcDcGrowatt.GridAbLineVoltage.WriteLine(" GridAbLineVoltage "); //30409 we set power here - statusrecord.AcDcGrowatt.RemotePowerControlChargeDuration.WriteLine(" = RemotePowerControlChargeDuration"); + // statusrecord.AcDcGrowatt.RemotePowerControlChargeDuration.WriteLine(" = RemotePowerControlChargeDuration"); statusrecord.AcDcGrowatt.Batteries[0].Soc.WriteLine(" SOC"); statusrecord.AcDcGrowatt.Batteries[0].Power.WriteLine(" Battery Power"); statusrecord.AcDcGrowatt.Batteries[0].Current.WriteLine(" Battery Current"); statusrecord.AcDcGrowatt.Batteries[0].Voltage.WriteLine(" Battery Voltage"); - statusrecord.AcDcGrowatt.BatteryMaxChargePower.WriteLine(" BatteryMaxChargePower "); //30409 we set power here - statusrecord.AcDcGrowatt.BatteryMaxDischargePower.WriteLine(" BatteryMaxDischargePower "); //30409 we set power here + /* statusrecord.AcDcGrowatt.BatteryMaxChargePower.WriteLine(" BatteryMaxChargePower "); //30409 we set power here + statusrecord.AcDcGrowatt.BatteryMaxDischargePower.WriteLine(" BatteryMaxDischargePower "); //30409 we set power here*/ statusrecord.AcDcGrowatt.SystemOperatingMode.WriteLine(" = SystemOperatingMode"); statusrecord.AcDcGrowatt.BatteryOperatingMode.WriteLine(" = BatteryOperatingMode"); @@ -143,9 +142,7 @@ public static class Program var stopTime = DateTime.Now; Console.WriteLine(stopTime.ToString("HH:mm:ss.fff")); Console.WriteLine("***************************** Finish Battery Data *********************************************"); - statusrecord.AcDcGrowatt.ChargeCutoffSoc = 100; - statusrecord.AcDcGrowatt.DischargeCutoffSoc = 20; - + EssModeControl(statusrecord,EssMode.LoadPriority); statusrecord.ApplyDefaultSettings(); @@ -185,7 +182,7 @@ public static class Program switch (mode) { case EssMode.Off: - return "no mode"; + return "no mode";/* case EssMode.GridPriority: statusrecord.AcDcGrowatt.RemotePowerControl = true; statusrecord.AcDcGrowatt.RemotePowerControlChargeDuration = 0; // 30408 this the duration @@ -204,7 +201,7 @@ public static class Program return "Battery priority mode active"; case EssMode.LoadPriority: statusrecord.AcDcGrowatt.RemotePowerControl = false; - return "Load priority mode active"; + return "Load priority mode active";*/ default: throw new ArgumentOutOfRangeException(nameof(mode), mode, null); } @@ -305,15 +302,17 @@ public static class Program { if (st is null) return; - + /* + st.AcDcGrowatt.BatteryMaxChargeCurrent = st.Config.MaximumChargingCurrent; + st.AcDcGrowatt.BatteryMaxdischargeCurrent = st.Config.MaximumDischargingCurrent; st.AcDcGrowatt.EmsCommunicationFailureTime = 20; // 20 sec st.AcDcGrowatt.EnableEmsCommunicationFailureTime = false; - st.AcDcGrowatt.EnableCommand = false; - st.AcDcGrowatt.ControlPermession = false; + st.AcDcGrowatt.EnableCommand = true; + st.AcDcGrowatt.ControlPermession = true; st.AcDcGrowatt.BatteryChargeCutoffVoltage = 100; //st.Config.BatteryChargeCutoffVoltage; st.AcDcGrowatt.BatteryDischargeCutoffVoltage = 20; //st.Config.BatteryDischargeCutoffVoltage; - st.AcDcGrowatt.BatteryMaxChargeCurrent = 150; //st.Config.BatteryChargeCutoffVoltage; - st.AcDcGrowatt.BatteryMaxdischargeCurrent = 150; //st.Config.BatteryChargeCutoffVoltage; + st.AcDcGrowatt.BatteryMaxChargeCurrent = 200; //st.Config.BatteryChargeCutoffVoltage; + st.AcDcGrowatt.BatteryMaxdischargeCurrent = 200; //st.Config.BatteryChargeCutoffVoltage;*/ } @@ -355,17 +354,20 @@ public static class Program private static async Task SaveModbusTcpFile(StatusRecord status) { var modbusData = new Dictionary(); + var protcolNumber = 2.0; + var pv1Power = status.AcDcGrowatt.Pv1Current * status.AcDcGrowatt.Pv1Voltage; + var pv2Power = status.AcDcGrowatt.Pv2Current * status.AcDcGrowatt.Pv2Voltage; - Console.WriteLine(new DateTimeOffset(status.AcDcGrowatt.SystemDateTime).ToUnixTimeSeconds() + " This Growatt time"); // SYSTEM DATA - var result1 = ConvertToModbusRegisters((status.AcDcGrowatt.VppProtocolVerNumber * 10), "UInt16", 30001); - var result2 = ConvertToModbusRegisters(status.AcDcGrowatt.SystemDateTime.ToUnixTime(), "UInt32", 30002); - var result3 = ConvertToModbusRegisters(status.AcDcGrowatt.SystemOperatingMode, "Int16", 30004); + var result1 = ConvertToModbusRegisters((protcolNumber * 10), "UInt16", 30000); // this to be updated to modbusTCP version + // var result2 = ConvertToModbusRegisters(status.AcDcGrowatt.SystemDateTime.ToUnixTime(), "UInt32", 30001); + var result3 = ConvertToModbusRegisters(status.AcDcGrowatt.SystemOperatingMode, "UInt16", 30003); + var result17 = ConvertToModbusRegisters(status.AcDcGrowatt.OperatingPriority, "UInt16", 30004); - // BATTERY SUMMARY (assuming single battery [0]) + // BATTERY SUMMARY (assuming single battery [0]) // this to be improved var battery = status.AcDcGrowatt.BatteriesRecords!.Batteries[0]; - var result4 = ConvertToModbusRegisters((status.AcDcGrowatt.BatteriesRecords!.Batteries.Count ), "UInt16", 31000); + var result4 = ConvertToModbusRegisters((status.AcDcGrowatt.BatteriesRecords!.Batteries.Count ), "UInt16", 30099); var result5 = ConvertToModbusRegisters((battery.Power.Value * 10), "Int32", 31001); var result6 = ConvertToModbusRegisters((battery.DailyChargeEnergy.Value * 10), "UInt32", 31003); var result7 = ConvertToModbusRegisters((battery.AccumulatedChargeEnergy.Value * 10), "UInt32", 31005); @@ -377,15 +379,17 @@ public static class Program var result12 = ConvertToModbusRegisters((battery.Voltage.Value * 10), "Int16", 31015); var result13 = ConvertToModbusRegisters((battery.Current.Value * 10), "Int32", 31016); var result14 = ConvertToModbusRegisters((battery.Soc.Value * 100), "UInt16", 31018); - var result15 = ConvertToModbusRegisters((status.AcDcGrowatt.BatteriesRecords!.AverageSoh * 100), "UInt16", 31019); + var result15 = ConvertToModbusRegisters((status.AcDcGrowatt.BatteriesRecords!.AverageSoh * 100), "UInt16", 31020); var result16 = ConvertToModbusRegisters((battery.BatteryAmbientTemperature.Value * 100), "UInt16", 31021); + var result18 = ConvertToModbusRegisters(((pv1Power + pv2Power) * 10), "UInt32", 31999); + var result19 = ConvertToModbusRegisters((status.AcDcGrowatt.GridMeterPower.Value * 10), "Int32", 32999); // Merge all results into one dictionary var allResults = new[] { - result1, result2, result3, result4, result5, result6, result7, result8, - result9, result10, result11, result12, result13, result14, result15, result16 + result1,/* result2, */result3, result17, result4, result5, result6, result7, result8, + result9, result10, result11, result12, result13, result14, result15, result16, result18, result19 }; foreach (var result in allResults) @@ -397,7 +401,7 @@ public static class Program } // Write to JSON var json = JsonSerializer.Serialize(modbusData, new JsonSerializerOptions { WriteIndented = true }); - await File.WriteAllTextAsync("/home/inesco/ModbusTCP/modbus_tcp_data.json", json); + await File.WriteAllTextAsync("/home/inesco/SodiStoreHome/ModbusTCP/modbus_tcp_data.json", json); //Console.WriteLine("JSON file written successfully."); //Console.WriteLine(json); @@ -578,7 +582,7 @@ public static class Program } private static void Heartbit() - { + { /* var s3Bucket = Config.Load().S3?.Bucket; var tryParse = int.TryParse(s3Bucket?.Split("-")[0], out var installationId); @@ -593,7 +597,7 @@ public static class Program }; if (s3Bucket != null) RabbitMqManager.InformMiddleware(returnedStatus); - } + }*/ } private static async Task SaveToLocalCompressedFallback(Byte[] compressedData, String fileNameWithoutExtension) diff --git a/csharp/App/SaliMax/tunnelstoSalimaxX.sh b/csharp/App/SaliMax/tunnelstoSalimaxX.sh index 03b256195..5432b0b38 100755 --- a/csharp/App/SaliMax/tunnelstoSalimaxX.sh +++ b/csharp/App/SaliMax/tunnelstoSalimaxX.sh @@ -27,6 +27,7 @@ tunnel "Trumpf DCDC (http) " 10.0.3.1 80 8002 tunnel "Ext Emu Meter (http) " 10.0.4.1 80 8003 tunnel "Int Emu Meter (http) " 10.0.4.2 80 8004 tunnel "AMPT (http) " 10.0.5.1 8080 8005 +tunnel "AMPT (http) " 10.0.5.2 8080 8006 tunnel "Trumpf Inverter (modbus)" 10.0.2.1 502 5001 tunnel "Trumpf DCDC (modbus) " 10.0.3.1 502 5002 diff --git a/csharp/App/SodiStoreMax/src/Program.cs b/csharp/App/SodiStoreMax/src/Program.cs index 1f215cdab..c9b3f55b5 100644 --- a/csharp/App/SodiStoreMax/src/Program.cs +++ b/csharp/App/SodiStoreMax/src/Program.cs @@ -58,7 +58,7 @@ internal static class Program // - private const String SwVersionNumber =" V1.33.120625 beta"; + private const String SwVersionNumber =" V1.34.210825 beta"; private static Boolean _curtailFlag = false; private const String VpnServerIp = "10.2.0.11"; private static Boolean _subscribedToQueue = false; @@ -492,7 +492,7 @@ internal static class Program maxBatteryDischargingCurrentLivebyDcDc = 0; } - // This random value 5 is applied when the current is limited to 0. This will create an oscillation between discharging and charging + // This random value 5 is applied when the current is limited to 0. The 0 limitations will create an oscillation between discharging and charging if (maxBatteryChargingCurrentLiveByDcDc == 0) { maxBatteryChargingCurrentLiveByDcDc = 5 / dcCount; diff --git a/csharp/App/SodiStoreMax/tunnelstoSalimaxX.sh b/csharp/App/SodiStoreMax/tunnelstoSalimaxX.sh index 03b256195..84760f562 100755 --- a/csharp/App/SodiStoreMax/tunnelstoSalimaxX.sh +++ b/csharp/App/SodiStoreMax/tunnelstoSalimaxX.sh @@ -14,7 +14,7 @@ tunnel() { until nc -vz 127.0.0.1 $lPort 2> /dev/null do echo -n . - sleep 0.3 + sleep 0.5 done echo "ok" @@ -28,14 +28,6 @@ tunnel "Ext Emu Meter (http) " 10.0.4.1 80 8003 tunnel "Int Emu Meter (http) " 10.0.4.2 80 8004 tunnel "AMPT (http) " 10.0.5.1 8080 8005 -tunnel "Trumpf Inverter (modbus)" 10.0.2.1 502 5001 -tunnel "Trumpf DCDC (modbus) " 10.0.3.1 502 5002 -tunnel "Ext Emu Meter (modbus) " 10.0.4.1 502 5003 -tunnel "Int Emu Meter " 10.0.4.2 502 5004 -tunnel "AMPT (modbus) " 10.0.5.1 502 5005 -tunnel "Adam " 10.0.1.1 502 5006 #for AMAX is 10.0.1.3 -tunnel "Batteries " 127.0.0.1 6855 5007 - echo echo "press any key to close the tunnels ..." read -r -n 1 -s diff --git a/csharp/Lib/Devices/AMPT/CommunicationUnitRegisters.cs b/csharp/Lib/Devices/AMPT/CommunicationUnitRegisters.cs index 5f9edcd41..b2c8a03a5 100644 --- a/csharp/Lib/Devices/AMPT/CommunicationUnitRegisters.cs +++ b/csharp/Lib/Devices/AMPT/CommunicationUnitRegisters.cs @@ -10,9 +10,9 @@ namespace InnovEnergy.Lib.Devices.AMPT; [OneBasedAddressing] public record CommunicationUnitRegisters { - [HoldingRegister(73)] public Int16 CurrentScaleFactor { get; private set; } - [HoldingRegister(74)] public Int16 VoltageScaleFactor { get; private set; } - [HoldingRegister(76)] public Int16 EnergyScaleFactor { get; private set; } + [HoldingRegister(73, writable: true)] public Int16 CurrentScaleFactor { get; private set; } + [HoldingRegister(74, writable: true)] public Int16 VoltageScaleFactor { get; private set; } + [HoldingRegister(76, writable: true)] public Int16 EnergyScaleFactor { get; private set; } - [HoldingRegister(78)] public UInt16 NumberOfStringOptimizers { get; private set; } + [HoldingRegister(78, writable: true)] public UInt16 NumberOfStringOptimizers { get; private set; } } \ No newline at end of file diff --git a/csharp/Lib/Devices/AMPT/StringOptimizerRegisters.cs b/csharp/Lib/Devices/AMPT/StringOptimizerRegisters.cs index 079957896..a350983fc 100644 --- a/csharp/Lib/Devices/AMPT/StringOptimizerRegisters.cs +++ b/csharp/Lib/Devices/AMPT/StringOptimizerRegisters.cs @@ -11,16 +11,16 @@ namespace InnovEnergy.Lib.Devices.AMPT; [OneBasedAddressing][BigEndian] public record StringOptimizerRegisters { - [HoldingRegister(88) ] public UInt32 Timestamp { get; private set; } + [HoldingRegister(88, writable: true) ] public UInt32 Timestamp { get; private set; } - [HoldingRegister (90, Scale = .001)] public Double Current { get; private set; } - [HoldingRegister(91, Scale = .001)] public Double Voltage { get; private set; } + [HoldingRegister (90, writable: true, Scale = .001)] public Double Current { get; private set; } + [HoldingRegister(91, writable: true, Scale = .001)] public Double Voltage { get; private set; } - [HoldingRegister(93, Scale = .001)] public Double String1Voltage { get; private set; } - [HoldingRegister(95, Scale = .001)] public Double String2Voltage { get; private set; } + [HoldingRegister(93, writable: true, Scale = .001)] public Double String1Voltage { get; private set; } + [HoldingRegister(95, writable: true, Scale = .001)] public Double String2Voltage { get; private set; } - [HoldingRegister(97, Scale = .001)] public Double ProductionToday { get; private set; } //scale 0.001 because we want a Kwh instead of Wh + [HoldingRegister(97, writable: true, Scale = .001)] public Double ProductionToday { get; private set; } //scale 0.001 because we want a Kwh instead of Wh - [HoldingRegister(99, Scale = .001)] public Double String1Current { get; private set; } - [HoldingRegister(100, Scale = .001)] public Double String2Current { get; private set; } + [HoldingRegister(99, writable: true, Scale = .001)] public Double String1Current { get; private set; } + [HoldingRegister(100, writable: true, Scale = .001)] public Double String2Current { get; private set; } } \ No newline at end of file diff --git a/csharp/Lib/Devices/Adam6360D/Adam6360DRegisters.cs b/csharp/Lib/Devices/Adam6360D/Adam6360DRegisters.cs index 56e08386f..fa8dc5968 100644 --- a/csharp/Lib/Devices/Adam6360D/Adam6360DRegisters.cs +++ b/csharp/Lib/Devices/Adam6360D/Adam6360DRegisters.cs @@ -46,24 +46,22 @@ public class Adam6360DRegisters [Coil(93)] public Boolean Do4Pulse { get; set; } [Coil(94)] public Boolean Do5Pulse { get; set; } - [HoldingRegister(121)] public UInt16 PulseOut0LowTime { get; set; } - [HoldingRegister(122)] public UInt16 PulseOut1LowTime { get; set; } - [HoldingRegister(123)] public UInt16 PulseOut2LowTime { get; set; } - [HoldingRegister(124)] public UInt16 PulseOut3LowTime { get; set; } - [HoldingRegister(125)] public UInt16 PulseOut4LowTime { get; set; } - [HoldingRegister(126)] public UInt16 PulseOut5LowTime { get; set; } - - [HoldingRegister(127)] public UInt16 PulseOut0HighTime { get; set; } - [HoldingRegister(128)] public UInt16 PulseOut1HighTime { get; set; } - [HoldingRegister(129)] public UInt16 PulseOut2HighTime { get; set; } - [HoldingRegister(130)] public UInt16 PulseOut3HighTime { get; set; } - [HoldingRegister(131)] public UInt16 PulseOut4HighTime { get; set; } - [HoldingRegister(132)] public UInt16 PulseOut5HighTime { get; set; } - - [HoldingRegister(145)] public UInt16 DigitalOutput0Mode { get; set; } - [HoldingRegister(146)] public UInt16 DigitalOutput1Mode { get; set; } - [HoldingRegister(147)] public UInt16 DigitalOutput2Mode { get; set; } - [HoldingRegister(148)] public UInt16 DigitalOutput3Mode { get; set; } - [HoldingRegister(149)] public UInt16 DigitalOutput4Mode { get; set; } - [HoldingRegister(150)] public UInt16 DigitalOutput5Mode { get; set; } + [HoldingRegister(121, writable: true)] public UInt16 PulseOut0LowTime { get; set; } + [HoldingRegister(122, writable: true)] public UInt16 PulseOut1LowTime { get; set; } + [HoldingRegister(123, writable: true)] public UInt16 PulseOut2LowTime { get; set; } + [HoldingRegister(124, writable: true)] public UInt16 PulseOut3LowTime { get; set; } + [HoldingRegister(125, writable: true)] public UInt16 PulseOut4LowTime { get; set; } + [HoldingRegister(126, writable: true)] public UInt16 PulseOut5LowTime { get; set; } + [HoldingRegister(127, writable: true)] public UInt16 PulseOut0HighTime { get; set; } + [HoldingRegister(128, writable: true)] public UInt16 PulseOut1HighTime { get; set; } + [HoldingRegister(129, writable: true)] public UInt16 PulseOut2HighTime { get; set; } + [HoldingRegister(130, writable: true)] public UInt16 PulseOut3HighTime { get; set; } + [HoldingRegister(131, writable: true)] public UInt16 PulseOut4HighTime { get; set; } + [HoldingRegister(132, writable: true)] public UInt16 PulseOut5HighTime { get; set; } + [HoldingRegister(145, writable: true)] public UInt16 DigitalOutput0Mode { get; set; } + [HoldingRegister(146, writable: true)] public UInt16 DigitalOutput1Mode { get; set; } + [HoldingRegister(147, writable: true)] public UInt16 DigitalOutput2Mode { get; set; } + [HoldingRegister(148, writable: true)] public UInt16 DigitalOutput3Mode { get; set; } + [HoldingRegister(149, writable: true)] public UInt16 DigitalOutput4Mode { get; set; } + [HoldingRegister(150, writable: true)] public UInt16 DigitalOutput5Mode { get; set; } } \ No newline at end of file diff --git a/csharp/Lib/Devices/Doepke/DoepkeRegisters.cs b/csharp/Lib/Devices/Doepke/DoepkeRegisters.cs index a9f0cedca..ffa277913 100644 --- a/csharp/Lib/Devices/Doepke/DoepkeRegisters.cs +++ b/csharp/Lib/Devices/Doepke/DoepkeRegisters.cs @@ -16,28 +16,28 @@ public class DoepkeRegisters [InputRegister(9)] public UInt16 CurrentStatusAlarmsA { get; private set; } // See bit coding* (0 = OK, 1 = Alarm) [InputRegister(10)] public UInt16 CurrentStatusAlarmsB { get; private set; } // See bit coding* (0 = OK, 1 = Alarm) - [HoldingRegister(15)] public UInt16 FirmwareVersion { get; set; } // x0.01 => Example: 123 = Version 1.23 - [HoldingRegister(16)] public UInt16 AlarmThresholdA1 { get; set; } // absolute value - [HoldingRegister(17)] public UInt16 AlarmThresholdA2 { get; set; } // absolute value - [HoldingRegister(18)] public UInt16 AlarmThresholdA3 { get; set; } // absolute value - [HoldingRegister(19)] public UInt16 AlarmThresholdA4 { get; set; } // absolute value - [HoldingRegister(20)] public UInt16 AlarmThresholdA5 { get; set; } // absolute value - [HoldingRegister(21)] public UInt16 AlarmThresholdA6 { get; set; } // absolute value - [HoldingRegister(22)] public UInt16 AlarmThresholdA7 { get; set; } // absolute value - [HoldingRegister(23)] public UInt16 AlarmThresholdA8 { get; set; } // absolute value - [HoldingRegister(24)] public UInt16 ActivationOfAlarmsA { get; set; } // See bit coding* (0=Inactive, 1=Active) - [HoldingRegister(25)] public UInt16 AlarmThresholdB1 { get; set; } // absolute value - [HoldingRegister(26)] public UInt16 AlarmThresholdB2 { get; set; } // absolute value - [HoldingRegister(27)] public UInt16 AlarmThresholdB3 { get; set; } // absolute value - [HoldingRegister(28)] public UInt16 AlarmThresholdB4 { get; set; } // absolute value - [HoldingRegister(29)] public UInt16 AlarmThresholdB5 { get; set; } // absolute value - [HoldingRegister(30)] public UInt16 AlarmThresholdB6 { get; set; } // absolute value - [HoldingRegister(31)] public UInt16 AlarmThresholdB7 { get; set; } // absolute value - [HoldingRegister(32)] public UInt16 AlarmThresholdB8 { get; set; } // absolute value - [HoldingRegister(33)] public UInt16 ActivationOfAlarmsB { get; set; } // See bit coding* (0=Inactive, 1=Active) - [HoldingRegister(34)] public UInt16 AlarmDelay { get; set; } // 0 = No delay, 1= 500ms, 2= 1000ms, - [HoldingRegister(35)] public UInt16 SaveCurrentSettings { get; set; } // 0 = Successful, 1= Save, 2= Error - [HoldingRegister(36)] public UInt16 DeviceTest { get; set; } // 0 = Successful, 1= Test active, 2= Error + [HoldingRegister(15, writable: true)] public UInt16 FirmwareVersion { get; set; } // x0.01 => Example: 123 = Version 1.23 + [HoldingRegister(16, writable: true)] public UInt16 AlarmThresholdA1 { get; set; } // absolute value + [HoldingRegister(17, writable: true)] public UInt16 AlarmThresholdA2 { get; set; } // absolute value + [HoldingRegister(18, writable: true)] public UInt16 AlarmThresholdA3 { get; set; } // absolute value + [HoldingRegister(19, writable: true)] public UInt16 AlarmThresholdA4 { get; set; } // absolute value + [HoldingRegister(20, writable: true)] public UInt16 AlarmThresholdA5 { get; set; } // absolute value + [HoldingRegister(21, writable: true)] public UInt16 AlarmThresholdA6 { get; set; } // absolute value + [HoldingRegister(22, writable: true)] public UInt16 AlarmThresholdA7 { get; set; } // absolute value + [HoldingRegister(23, writable: true)] public UInt16 AlarmThresholdA8 { get; set; } // absolute value + [HoldingRegister(24, writable: true)] public UInt16 ActivationOfAlarmsA { get; set; } // See bit coding* (0=Inactive, 1=Active) + [HoldingRegister(25, writable: true)] public UInt16 AlarmThresholdB1 { get; set; } // absolute value + [HoldingRegister(26, writable: true)] public UInt16 AlarmThresholdB2 { get; set; } // absolute value + [HoldingRegister(27, writable: true)] public UInt16 AlarmThresholdB3 { get; set; } // absolute value + [HoldingRegister(28, writable: true)] public UInt16 AlarmThresholdB4 { get; set; } // absolute value + [HoldingRegister(29, writable: true)] public UInt16 AlarmThresholdB5 { get; set; } // absolute value + [HoldingRegister(30, writable: true)] public UInt16 AlarmThresholdB6 { get; set; } // absolute value + [HoldingRegister(31, writable: true)] public UInt16 AlarmThresholdB7 { get; set; } // absolute value + [HoldingRegister(32, writable: true)] public UInt16 AlarmThresholdB8 { get; set; } // absolute value + [HoldingRegister(33, writable: true)] public UInt16 ActivationOfAlarmsB { get; set; } // See bit coding* (0=Inactive, 1=Active) + [HoldingRegister(34, writable: true)] public UInt16 AlarmDelay { get; set; } // 0 = No delay, 1= 500ms, 2= 1000ms, + [HoldingRegister(35, writable: true)] public UInt16 SaveCurrentSettings { get; set; } // 0 = Successful, 1= Save, 2= Error + [HoldingRegister(36, writable: true)] public UInt16 DeviceTest { get; set; } // 0 = Successful, 1= Test active, 2= Error //*Bit coding alarm status/activation diff --git a/csharp/Lib/Devices/EmuMeter/EmuMeterRegisters.cs b/csharp/Lib/Devices/EmuMeter/EmuMeterRegisters.cs index aefde0c02..a2d4cfdf1 100644 --- a/csharp/Lib/Devices/EmuMeter/EmuMeterRegisters.cs +++ b/csharp/Lib/Devices/EmuMeter/EmuMeterRegisters.cs @@ -14,32 +14,28 @@ using Float32 = Single; public class EmuMeterRegisters : IAc3Meter { - [HoldingRegister(6004)] private UInt64 _ActivePowerImportT1; - [HoldingRegister(6024)] private UInt64 _ActivePowerExportT1; - [HoldingRegister(6008)] private UInt64 _ActivePowerImportT2; - [HoldingRegister(6028)] private UInt64 _ActivePowerExportT2; - [HoldingRegister(8002)] private UInt32 _ActivePowerImportT3; - [HoldingRegister(8012)] private UInt32 _ActivePowerExportT3; - [HoldingRegister(8000)] private UInt32 _ActivePowerImportT4; - [HoldingRegister(8010)] private UInt32 _ActivePowerExportT4; + [HoldingRegister(6004, writable: true)] private UInt64 _ActivePowerImportT1; + [HoldingRegister(6024, writable: true)] private UInt64 _ActivePowerExportT1; + [HoldingRegister(6008, writable: true)] private UInt64 _ActivePowerImportT2; + [HoldingRegister(6028, writable: true)] private UInt64 _ActivePowerExportT2; + [HoldingRegister(8002, writable: true)] private UInt32 _ActivePowerImportT3; + [HoldingRegister(8012, writable: true)] private UInt32 _ActivePowerExportT3; + [HoldingRegister(8000, writable: true)] private UInt32 _ActivePowerImportT4; + [HoldingRegister(8010, writable: true)] private UInt32 _ActivePowerExportT4; + [HoldingRegister(9002, writable: true)] private Float32 _ActivePowerL1; + [HoldingRegister(9004, writable: true)] private Float32 _ActivePowerL2; + [HoldingRegister(9006, writable: true)] private Float32 _ActivePowerL3; + [HoldingRegister(9012, writable: true)] private Float32 _ReactivePowerL1; + [HoldingRegister(9014, writable: true)] private Float32 _ReactivePowerL2; + [HoldingRegister(9016, writable: true)] private Float32 _ReactivePowerL3; + [HoldingRegister(9102, writable: true)] private Float32 _CurrentL1; + [HoldingRegister(9104, writable: true)] private Float32 _CurrentL2; + [HoldingRegister(9106, writable: true)] private Float32 _CurrentL3; + [HoldingRegister(9200, writable: true)] private Float32 _VoltageL1N; + [HoldingRegister(9202, writable: true)] private Float32 _VoltageL2N; + [HoldingRegister(9204, writable: true)] private Float32 _VoltageL3N; - [HoldingRegister(9002)] private Float32 _ActivePowerL1; - [HoldingRegister(9004)] private Float32 _ActivePowerL2; - [HoldingRegister(9006)] private Float32 _ActivePowerL3; - - [HoldingRegister(9012)] private Float32 _ReactivePowerL1; - [HoldingRegister(9014)] private Float32 _ReactivePowerL2; - [HoldingRegister(9016)] private Float32 _ReactivePowerL3; - - [HoldingRegister(9102)] private Float32 _CurrentL1; - [HoldingRegister(9104)] private Float32 _CurrentL2; - [HoldingRegister(9106)] private Float32 _CurrentL3; - - [HoldingRegister(9200)] private Float32 _VoltageL1N; - [HoldingRegister(9202)] private Float32 _VoltageL2N; - [HoldingRegister(9204)] private Float32 _VoltageL3N; - - [HoldingRegister(9310)] private Float32 _Frequency; + [HoldingRegister(9310, writable: true)] private Float32 _Frequency; public Ac3Bus Ac => new Ac3Bus { diff --git a/csharp/Lib/Devices/Trumpf/SystemControl/SystemControlRegisters.Modbus.cs b/csharp/Lib/Devices/Trumpf/SystemControl/SystemControlRegisters.Modbus.cs index 5afaa7e4a..1eeee0e5f 100644 --- a/csharp/Lib/Devices/Trumpf/SystemControl/SystemControlRegisters.Modbus.cs +++ b/csharp/Lib/Devices/Trumpf/SystemControl/SystemControlRegisters.Modbus.cs @@ -29,15 +29,12 @@ public partial record SystemControlRegisters [HoldingRegister(4007)] public UInt16 TargetSlave { get; set; } //[Coil(4011)] - [HoldingRegister(4011)] public Boolean UseSlaveIdForAddressing { get; set; } - [HoldingRegister(4006)] public ReferenceFrame ReferenceFrame { get; set; } - - [HoldingRegister(4008)] public SlaveErrorHandling SlaveErrorHandling { get; set; } - [HoldingRegister(4012)] public SubSlaveErrorHandling SubSlaveErrorHandling { get; set; } - - - [HoldingRegister(4182)] public PowerSetPointActivation PowerSetPointActivation { get; set; } - [HoldingRegister(4183)] public PowerSetPointTrigger PowerSetPointTrigger { get; set; } + [HoldingRegister(4011, writable: true)] public Boolean UseSlaveIdForAddressing { get; set; } + [HoldingRegister(4006, writable: true)] public ReferenceFrame ReferenceFrame { get; set; } + [HoldingRegister(4008, writable: true)] public SlaveErrorHandling SlaveErrorHandling { get; set; } + [HoldingRegister(4012, writable: true)] public SubSlaveErrorHandling SubSlaveErrorHandling { get; set; } + [HoldingRegister(4182, writable: true)] public PowerSetPointActivation PowerSetPointActivation { get; set; } + [HoldingRegister(4183, writable: true)] public PowerSetPointTrigger PowerSetPointTrigger { get; set; } [InputRegister(5000)] public DeviceState DeviceState { get; private set; } [InputRegister(5001)] public UInt16 NumberOfConnectedSlaves { get; private set; } diff --git a/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcRecord.Modbus.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcRecord.Modbus.cs index 0ba905c35..65548ec39 100644 --- a/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcRecord.Modbus.cs +++ b/csharp/Lib/Devices/Trumpf/TruConvertAc/AcDcRecord.Modbus.cs @@ -11,41 +11,32 @@ namespace InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; public partial class AcDcRecord { - [HoldingRegister(4000)] internal Boolean PowerStageEnable; - [HoldingRegister(4001)] internal PhaseControl PhaseControl; - [HoldingRegister(4002)] internal Boolean ResetAlarmsAndWarnings; - - [HoldingRegister(4005)] internal DcPrechargeConfig DcPrechargeConfig; - - [HoldingRegister(4009)] internal GridType GridType; - [HoldingRegister(4200)] internal Double PowerSetpointL1; // VA - [HoldingRegister(4201)] internal Double PowerSetpointL2; // VA - [HoldingRegister(4202)] internal Double PowerSetpointL3; // VA - - [HoldingRegister(4206)] internal Double CosPhiSetpointL1; - [HoldingRegister(4207)] internal Double CosPhiSetpointL2; - [HoldingRegister(4208)] internal Double CosPhiSetpointL3; - - [HoldingRegister(4219)] internal Double SinPhiSetpointL1; - [HoldingRegister(4220)] internal Double SinPhiSetpointL2; - [HoldingRegister(4221)] internal Double SinPhiSetpointL3; - - [HoldingRegister(4213)] internal ReactivePowerKind ReactivePowerKindL1; - [HoldingRegister(4214)] internal ReactivePowerKind ReactivePowerKindL2; - [HoldingRegister(4215)] internal ReactivePowerKind ReactivePowerKindL3; - - [HoldingRegister(4222, Scale = .01)] internal Double IslandModeFrequencyOffset; - [HoldingRegister(4223)] internal Double IslandModeVoltageAdjustmentFactor; - - [HoldingRegister(4229)] internal GridMode GridMode; - - [HoldingRegister(4230)] internal Double DcLinkReferenceVoltage380400VGrid; - [HoldingRegister(4231)] internal Double DcLinkMinVoltage380400VGrid; - [HoldingRegister(4232)] internal Double DcLinkMaxVoltage380400VGrid; - - [HoldingRegister(4233)] internal Double DcLinkReferenceVoltage480VGrid; - [HoldingRegister(4234)] internal Double DcLinkMinVoltage480VGrid; - [HoldingRegister(4235)] internal Double DcLinkMaxVoltage480VGrid; + [HoldingRegister(4000, writable: true)] internal Boolean PowerStageEnable; + [HoldingRegister(4001, writable: true)] internal PhaseControl PhaseControl; + [HoldingRegister(4002, writable: true)] internal Boolean ResetAlarmsAndWarnings; + [HoldingRegister(4005, writable: true)] internal DcPrechargeConfig DcPrechargeConfig; + [HoldingRegister(4009, writable: true)] internal GridType GridType; + [HoldingRegister(4200, writable: true)] internal Double PowerSetpointL1; // VA + [HoldingRegister(4201, writable: true)] internal Double PowerSetpointL2; // VA + [HoldingRegister(4202, writable: true)] internal Double PowerSetpointL3; // VA + [HoldingRegister(4206, writable: true)] internal Double CosPhiSetpointL1; + [HoldingRegister(4207, writable: true)] internal Double CosPhiSetpointL2; + [HoldingRegister(4208, writable: true)] internal Double CosPhiSetpointL3; + [HoldingRegister(4219, writable: true)] internal Double SinPhiSetpointL1; + [HoldingRegister(4220, writable: true)] internal Double SinPhiSetpointL2; + [HoldingRegister(4221, writable: true)] internal Double SinPhiSetpointL3; + [HoldingRegister(4213, writable: true)] internal ReactivePowerKind ReactivePowerKindL1; + [HoldingRegister(4214, writable: true)] internal ReactivePowerKind ReactivePowerKindL2; + [HoldingRegister(4215, writable: true)] internal ReactivePowerKind ReactivePowerKindL3; + [HoldingRegister(4222, writable: true, Scale = .01)] internal Double IslandModeFrequencyOffset; + [HoldingRegister(4223, writable: true)] internal Double IslandModeVoltageAdjustmentFactor; + [HoldingRegister(4229, writable: true)] internal GridMode GridMode; + [HoldingRegister(4230, writable: true)] internal Double DcLinkReferenceVoltage380400VGrid; + [HoldingRegister(4231, writable: true)] internal Double DcLinkMinVoltage380400VGrid; + [HoldingRegister(4232, writable: true)] internal Double DcLinkMaxVoltage380400VGrid; + [HoldingRegister(4233, writable: true)] internal Double DcLinkReferenceVoltage480VGrid; + [HoldingRegister(4234, writable: true)] internal Double DcLinkMinVoltage480VGrid; + [HoldingRegister(4235, writable: true)] internal Double DcLinkMaxVoltage480VGrid; [InputRegister(5023)] internal readonly GridType ActiveGridType; diff --git a/csharp/Lib/Devices/Trumpf/TruConvertAc/Doc/Ergänzung Grid-Codes A67-0146-00.BKde-001-04.pdf b/csharp/Lib/Devices/Trumpf/TruConvertAc/Doc/Ergänzung Grid-Codes A67-0146-00.BKde-001-04.pdf new file mode 100644 index 000000000..8cccea680 Binary files /dev/null and b/csharp/Lib/Devices/Trumpf/TruConvertAc/Doc/Ergänzung Grid-Codes A67-0146-00.BKde-001-04.pdf differ diff --git a/csharp/Lib/Devices/Trumpf/TruConvertDc/DcDcRecord.Modbus.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/DcDcRecord.Modbus.cs index 59525b119..f0d1a7747 100644 --- a/csharp/Lib/Devices/Trumpf/TruConvertDc/DcDcRecord.Modbus.cs +++ b/csharp/Lib/Devices/Trumpf/TruConvertDc/DcDcRecord.Modbus.cs @@ -13,34 +13,25 @@ public partial class DcDcRecord { //[Coil(4000)] [HoldingRegister(4000)] internal Boolean PowerStageEnable ; - //[Coil(4002)] - [HoldingRegister(4002)] internal Boolean ResetAlarmsAndWarnings ; - - [HoldingRegister(4100, Scale = .01)] internal Double MaxBatteryVoltage ; - [HoldingRegister(4101, Scale = .01)] internal Double MinBatteryVoltage ; - - [HoldingRegister(4106, Scale = .1)] internal Double MaxBatteryChargingCurrent ; - [HoldingRegister(4109, Scale = .1)] internal Double MaxBatteryDischargingCurrent ; - - [HoldingRegister(4112, Scale = .1)] internal Double VccEndPointVoltage ; - [HoldingRegister(4115)] internal Double VccEndPointCurrent ; - [HoldingRegister(4118)] internal Double VccStartPointCurrent ; - - [HoldingRegister(4121)] internal Double MaxDcPower ; - - [HoldingRegister(4124, Scale = .1)] internal Double MaxVoltageAlarm ; - [HoldingRegister(4127, Scale = .1)] internal Double MinVoltageAlarm ; - - [HoldingRegister(4500)] internal Double DcDcCurrentSetpoint ; - [HoldingRegister(4501, Scale = .01)] internal Double MaxCurrentChangePerMs ; - - [HoldingRegister(4504)] internal DcControlMode DcControlMode ; - - [HoldingRegister(4505, Scale = .1)] internal Double DroopControlReferenceVoltage ; - [HoldingRegister(4506, Scale = .1)] internal Double DroopControlUpperVoltage ; - [HoldingRegister(4507, Scale = .1)] internal Double DroopControlLowerVoltage ; - [HoldingRegister(4508, Scale = .1)] internal Double DroopControlVoltageDeadband ; + [HoldingRegister(4002, writable: true)] internal Boolean ResetAlarmsAndWarnings ; + [HoldingRegister(4100, writable: true, Scale = .01)] internal Double MaxBatteryVoltage ; + [HoldingRegister(4101, writable: true, Scale = .01)] internal Double MinBatteryVoltage ; + [HoldingRegister(4106, writable: true, Scale = .1)] internal Double MaxBatteryChargingCurrent ; + [HoldingRegister(4109, writable: true, Scale = .1)] internal Double MaxBatteryDischargingCurrent ; + [HoldingRegister(4112, writable: true, Scale = .1)] internal Double VccEndPointVoltage ; + [HoldingRegister(4115, writable: true)] internal Double VccEndPointCurrent ; + [HoldingRegister(4118, writable: true)] internal Double VccStartPointCurrent ; + [HoldingRegister(4121, writable: true)] internal Double MaxDcPower ; + [HoldingRegister(4124, writable: true, Scale = .1)] internal Double MaxVoltageAlarm ; + [HoldingRegister(4127, writable: true, Scale = .1)] internal Double MinVoltageAlarm ; + [HoldingRegister(4500, writable: true)] internal Double DcDcCurrentSetpoint ; + [HoldingRegister(4501, writable: true, Scale = .01)] internal Double MaxCurrentChangePerMs ; + [HoldingRegister(4504, writable: true)] internal DcControlMode DcControlMode ; + [HoldingRegister(4505, writable: true, Scale = .1)] internal Double DroopControlReferenceVoltage ; + [HoldingRegister(4506, writable: true, Scale = .1)] internal Double DroopControlUpperVoltage ; + [HoldingRegister(4507, writable: true, Scale = .1)] internal Double DroopControlLowerVoltage ; + [HoldingRegister(4508, writable: true, Scale = .1)] internal Double DroopControlVoltageDeadband ; [InputRegister(5100, Scale = .1)] internal Double BatteryVoltage ; [InputRegister(5110)] internal Double BatteryCurrent ; diff --git a/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Api.cs b/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Api.cs index 637332914..7eccc2f0e 100644 --- a/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Api.cs +++ b/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Api.cs @@ -56,7 +56,7 @@ public partial class WITGrowatRecord public DcPower Pv1InpuPower => _Pv1InpuPower; // ********************************** Holding Registers (Control) ************************************************************* - + /* // public UInt16 DeviceModel => _DeviceModel; public UInt32 RatedPower { @@ -103,14 +103,13 @@ public partial class WITGrowatRecord return new DateTime(systemTime1, _SystemTime2, _SystemTime3, _SystemTime4, _SystemTime5, _SystemTime6); } - } -/* - public Boolean EnableSyn + + /* public Boolean EnableSyn { get => _EnableSyn ; set => _EnableSyn = value; }*/ - + /* public Percent ActivePowerPercentDerating { get => _ActivePowerPercentDerating; @@ -223,19 +222,19 @@ public partial class WITGrowatRecord set => _BatteryDischargeCutoffVoltage = value; } - public UInt16 BatteryMaxChargeCurrent + public Double BatteryMaxChargeCurrent { get => _BatteryMaxChargeCurrent; - set => _BatteryMaxChargeCurrent = value; + set => _BatteryMaxChargeCurrent = (UInt16)value; } - public UInt16 BatteryMaxdischargeCurrent + public Double BatteryMaxdischargeCurrent { get => _BatteryMaxdischargeCurrent; - set => _BatteryMaxdischargeCurrent = value; + set => _BatteryMaxdischargeCurrent = (UInt16) value; } - + */ public IReadOnlyList Batteries => new List diff --git a/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Modbus.cs b/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Modbus.cs index d565928c5..9fd685ab6 100644 --- a/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Modbus.cs +++ b/csharp/Lib/Devices/WITGrowatt4-15K/WITGrowatRecord.Modbus.cs @@ -129,7 +129,7 @@ public partial class WITGrowatRecord /****************************** Holding registers ****************************/ // [HoldingRegister(30000)] private UInt16 _DeviceModel; - [HoldingRegister(30016, Scale = 0.1)] private UInt32 _RatedPower; + /* [HoldingRegister(30016, Scale = 0.1)] private UInt32 _RatedPower; [HoldingRegister(30018, Scale = 0.1)] private UInt32 _MaxActivePower; [HoldingRegister(30028, Scale = 0.1)] private UInt32 _PvInputMaxPower; [HoldingRegister(30030)] private UInt16 _BatteryType; @@ -176,5 +176,5 @@ public partial class WITGrowatRecord [HoldingRegister(30496, writable: true, Scale = 0.1)] private UInt16 _BatteryChargeCutoffVoltage; // [HoldingRegister(30497, writable: true, Scale = 0.1)] private UInt16 _BatteryDischargeCutoffVoltage; // [HoldingRegister(30498, writable: true, Scale = 0.1)] private UInt16 _BatteryMaxChargeCurrent; // - [HoldingRegister(30499, writable: true, Scale = 0.1)] private UInt16 _BatteryMaxdischargeCurrent; // + [HoldingRegister(30499, writable: true, Scale = 0.1)] private UInt16 _BatteryMaxdischargeCurrent; //*/ } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs b/csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs index bca2ae786..7cf505f02 100644 --- a/csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs +++ b/csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs @@ -37,11 +37,11 @@ public class ModbusDevice<[DynamicallyAccessedMembers(All)] R> where R : notnull public R Read(R record) { - Console.WriteLine($"Reading { _Batches.Count } Modbus batches."); + // Console.WriteLine($"Reading { _Batches.Count } Modbus batches."); foreach (var batch in _Batches) { batch.Read(record); - Thread.Sleep(50); // this added mainly for Growatt reading + //Thread.Sleep(50); // this added mainly for Growatt reading } return record; } diff --git a/csharp/global.json b/csharp/global.json index 7cd6a1f4f..9e5e1fd1d 100644 --- a/csharp/global.json +++ b/csharp/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "7.0.0", + "version": "6.0.0", "rollForward": "latestMajor", "allowPrerelease": true }