Update alll project with Writable flag.

This commit is contained in:
atef 2025-09-01 10:27:12 +02:00
parent 9691e3aa80
commit b424643213
17 changed files with 174 additions and 205 deletions

View File

@ -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<String, UInt16>();
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)

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -10,9 +10,9 @@ namespace InnovEnergy.Lib.Devices.AMPT;
[OneBasedAddressing]
public record CommunicationUnitRegisters
{
[HoldingRegister<Int16>(73)] public Int16 CurrentScaleFactor { get; private set; }
[HoldingRegister<Int16>(74)] public Int16 VoltageScaleFactor { get; private set; }
[HoldingRegister<Int16>(76)] public Int16 EnergyScaleFactor { get; private set; }
[HoldingRegister<Int16>(73, writable: true)] public Int16 CurrentScaleFactor { get; private set; }
[HoldingRegister<Int16>(74, writable: true)] public Int16 VoltageScaleFactor { get; private set; }
[HoldingRegister<Int16>(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; }
}

View File

@ -11,16 +11,16 @@ namespace InnovEnergy.Lib.Devices.AMPT;
[OneBasedAddressing][BigEndian]
public record StringOptimizerRegisters
{
[HoldingRegister<UInt32>(88) ] public UInt32 Timestamp { get; private set; }
[HoldingRegister<UInt32>(88, writable: true) ] public UInt32 Timestamp { get; private set; }
[HoldingRegister<Int16> (90, Scale = .001)] public Double Current { get; private set; }
[HoldingRegister<UInt32>(91, Scale = .001)] public Double Voltage { get; private set; }
[HoldingRegister<Int16> (90, writable: true, Scale = .001)] public Double Current { get; private set; }
[HoldingRegister<UInt32>(91, writable: true, Scale = .001)] public Double Voltage { get; private set; }
[HoldingRegister<UInt32>(93, Scale = .001)] public Double String1Voltage { get; private set; }
[HoldingRegister<UInt32>(95, Scale = .001)] public Double String2Voltage { get; private set; }
[HoldingRegister<UInt32>(93, writable: true, Scale = .001)] public Double String1Voltage { get; private set; }
[HoldingRegister<UInt32>(95, writable: true, Scale = .001)] public Double String2Voltage { get; private set; }
[HoldingRegister<UInt32>(97, Scale = .001)] public Double ProductionToday { get; private set; } //scale 0.001 because we want a Kwh instead of Wh
[HoldingRegister<UInt32>(97, writable: true, Scale = .001)] public Double ProductionToday { get; private set; } //scale 0.001 because we want a Kwh instead of Wh
[HoldingRegister<Int16>(99, Scale = .001)] public Double String1Current { get; private set; }
[HoldingRegister<Int16>(100, Scale = .001)] public Double String2Current { get; private set; }
[HoldingRegister<Int16>(99, writable: true, Scale = .001)] public Double String1Current { get; private set; }
[HoldingRegister<Int16>(100, writable: true, Scale = .001)] public Double String2Current { get; private set; }
}

View File

@ -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; }
}

View File

@ -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

View File

@ -14,32 +14,28 @@ using Float32 = Single;
public class EmuMeterRegisters : IAc3Meter
{
[HoldingRegister<UInt64>(6004)] private UInt64 _ActivePowerImportT1;
[HoldingRegister<UInt64>(6024)] private UInt64 _ActivePowerExportT1;
[HoldingRegister<UInt64>(6008)] private UInt64 _ActivePowerImportT2;
[HoldingRegister<UInt64>(6028)] private UInt64 _ActivePowerExportT2;
[HoldingRegister<UInt32>(8002)] private UInt32 _ActivePowerImportT3;
[HoldingRegister<UInt32>(8012)] private UInt32 _ActivePowerExportT3;
[HoldingRegister<UInt32>(8000)] private UInt32 _ActivePowerImportT4;
[HoldingRegister<UInt32>(8010)] private UInt32 _ActivePowerExportT4;
[HoldingRegister<UInt64>(6004, writable: true)] private UInt64 _ActivePowerImportT1;
[HoldingRegister<UInt64>(6024, writable: true)] private UInt64 _ActivePowerExportT1;
[HoldingRegister<UInt64>(6008, writable: true)] private UInt64 _ActivePowerImportT2;
[HoldingRegister<UInt64>(6028, writable: true)] private UInt64 _ActivePowerExportT2;
[HoldingRegister<UInt32>(8002, writable: true)] private UInt32 _ActivePowerImportT3;
[HoldingRegister<UInt32>(8012, writable: true)] private UInt32 _ActivePowerExportT3;
[HoldingRegister<UInt32>(8000, writable: true)] private UInt32 _ActivePowerImportT4;
[HoldingRegister<UInt32>(8010, writable: true)] private UInt32 _ActivePowerExportT4;
[HoldingRegister<Float32>(9002, writable: true)] private Float32 _ActivePowerL1;
[HoldingRegister<Float32>(9004, writable: true)] private Float32 _ActivePowerL2;
[HoldingRegister<Float32>(9006, writable: true)] private Float32 _ActivePowerL3;
[HoldingRegister<Float32>(9012, writable: true)] private Float32 _ReactivePowerL1;
[HoldingRegister<Float32>(9014, writable: true)] private Float32 _ReactivePowerL2;
[HoldingRegister<Float32>(9016, writable: true)] private Float32 _ReactivePowerL3;
[HoldingRegister<Float32>(9102, writable: true)] private Float32 _CurrentL1;
[HoldingRegister<Float32>(9104, writable: true)] private Float32 _CurrentL2;
[HoldingRegister<Float32>(9106, writable: true)] private Float32 _CurrentL3;
[HoldingRegister<Float32>(9200, writable: true)] private Float32 _VoltageL1N;
[HoldingRegister<Float32>(9202, writable: true)] private Float32 _VoltageL2N;
[HoldingRegister<Float32>(9204, writable: true)] private Float32 _VoltageL3N;
[HoldingRegister<Float32>(9002)] private Float32 _ActivePowerL1;
[HoldingRegister<Float32>(9004)] private Float32 _ActivePowerL2;
[HoldingRegister<Float32>(9006)] private Float32 _ActivePowerL3;
[HoldingRegister<Float32>(9012)] private Float32 _ReactivePowerL1;
[HoldingRegister<Float32>(9014)] private Float32 _ReactivePowerL2;
[HoldingRegister<Float32>(9016)] private Float32 _ReactivePowerL3;
[HoldingRegister<Float32>(9102)] private Float32 _CurrentL1;
[HoldingRegister<Float32>(9104)] private Float32 _CurrentL2;
[HoldingRegister<Float32>(9106)] private Float32 _CurrentL3;
[HoldingRegister<Float32>(9200)] private Float32 _VoltageL1N;
[HoldingRegister<Float32>(9202)] private Float32 _VoltageL2N;
[HoldingRegister<Float32>(9204)] private Float32 _VoltageL3N;
[HoldingRegister<Float32>(9310)] private Float32 _Frequency;
[HoldingRegister<Float32>(9310, writable: true)] private Float32 _Frequency;
public Ac3Bus Ac => new Ac3Bus
{

View File

@ -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; }

View File

@ -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<Int16>(4206)] internal Double CosPhiSetpointL1;
[HoldingRegister<Int16>(4207)] internal Double CosPhiSetpointL2;
[HoldingRegister<Int16>(4208)] internal Double CosPhiSetpointL3;
[HoldingRegister<Int16>(4219)] internal Double SinPhiSetpointL1;
[HoldingRegister<Int16>(4220)] internal Double SinPhiSetpointL2;
[HoldingRegister<Int16>(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<Int16>(4206, writable: true)] internal Double CosPhiSetpointL1;
[HoldingRegister<Int16>(4207, writable: true)] internal Double CosPhiSetpointL2;
[HoldingRegister<Int16>(4208, writable: true)] internal Double CosPhiSetpointL3;
[HoldingRegister<Int16>(4219, writable: true)] internal Double SinPhiSetpointL1;
[HoldingRegister<Int16>(4220, writable: true)] internal Double SinPhiSetpointL2;
[HoldingRegister<Int16>(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;

View File

@ -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<Int16>(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<Int16>(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<Int16>(5110)] internal Double BatteryCurrent ;

View File

@ -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<BatteryRecord> Batteries => new List<BatteryRecord>

View File

@ -129,7 +129,7 @@ public partial class WITGrowatRecord
/****************************** Holding registers ****************************/
// [HoldingRegister(30000)] private UInt16 _DeviceModel;
[HoldingRegister<UInt32>(30016, Scale = 0.1)] private UInt32 _RatedPower;
/* [HoldingRegister<UInt32>(30016, Scale = 0.1)] private UInt32 _RatedPower;
[HoldingRegister<UInt32>(30018, Scale = 0.1)] private UInt32 _MaxActivePower;
[HoldingRegister<UInt32>(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; //*/
}

View File

@ -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;
}

View File

@ -1,6 +1,6 @@
{
"sdk": {
"version": "7.0.0",
"version": "6.0.0",
"rollForward": "latestMajor",
"allowPrerelease": true
}