Naming Sinexcel inverter to recordinverter

This commit is contained in:
atef 2025-11-12 15:59:12 +01:00
parent b122177e61
commit 231069768e
1 changed files with 72 additions and 55 deletions

View File

@ -31,7 +31,7 @@ namespace InnovEnergy.App.SinexcelCommunication;
[SuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic access otherwise can break functionality when trimming application code")]
internal static class Program
{
private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(4);
private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(5);
private const UInt16 NbrOfFileToConcatenate = 15; // add this to config file
private static UInt16 _fileCounter = 0;
private static Channel _sinexcelChannel;
@ -54,7 +54,7 @@ internal static class Program
public static async Task Main(String[] args)
{
_sinexcelChannel = new SerialPortChannel(Port, BaudRate, Parity, DataBits, StopBits);
InitializeCommunicationToMiddleware();
while (true)
{
try
@ -85,7 +85,7 @@ internal static class Program
return new StatusRecord
{
SinexcelRecord = sinexcelRecord,
InverterRecord = sinexcelRecord,
Config = config // load from disk every iteration, so config can be changed while running
};
}
@ -111,61 +111,22 @@ internal static class Program
var startTime = DateTime.Now;
Console.WriteLine("***************************** Reading Battery Data *********************************************");
Console.WriteLine(startTime.ToString("HH:mm:ss.fff"));
Console.WriteLine(startTime.ToString("HH:mm:ss.fff ")+ "Start Reading");
// the order matter of the next three lines
var statusrecord = ReadStatus();
if (statusrecord == null)
return null;
statusrecord.SinexcelRecord.GridAPhaseVoltage.WriteLine(" = Grid A PhaseVoltage");
statusrecord.SinexcelRecord.GridBPhaseVoltage.WriteLine(" = Grid B PhaseVoltage");
statusrecord.SinexcelRecord.GridCPhaseVoltage.WriteLine(" = Grid C PhaseVoltage");
SendSalimaxStateAlarm(GetSodiHomeStateAlarm(statusrecord),statusrecord);
statusrecord.SinexcelRecord.GridAPhaseCurrent.WriteLine(" = Grid A PhaseCurrent");
statusrecord.SinexcelRecord.GridBPhaseCurrent.WriteLine(" = Grid B PhaseCurrent");
statusrecord.SinexcelRecord.GridCPhaseCurrent.WriteLine(" = Grid C PhaseCurrent");
statusrecord.SinexcelRecord.GridAPhaseActivePower.WriteLine(" = A Grid Active Power");
statusrecord.SinexcelRecord.GridBPhaseActivePower.WriteLine(" = B Grid Active Power");
statusrecord.SinexcelRecord.GridCPhaseActivePower.WriteLine(" = C Grid Active Power");
statusrecord.SinexcelRecord.GridVoltageFrequency.WriteLine(" = Frequency");
statusrecord.SinexcelRecord.ElectricMeterCPhaseActivePower.WriteLine(" Meter Phase C Power");
statusrecord.SinexcelRecord.ElectricMeterBPhaseActivePower.WriteLine(" Meter Phase B Power");
statusrecord.SinexcelRecord.ElectricMeterAPhaseActivePower.WriteLine(" Meter Phase A Power");
statusrecord.SinexcelRecord.ElectricMeterAPhaseCurrent.WriteLine(" Meter Phase C Current ");
statusrecord.SinexcelRecord.ElectricMeterBPhaseCurrent.WriteLine(" Meter Phase B Current ");
statusrecord.SinexcelRecord.ElectricMeterBPhaseCurrent.WriteLine(" Meter Phase A Current ");
statusrecord.SinexcelRecord.WorkingMode.WriteLine(" workingmode");
statusrecord.SinexcelRecord.BatteryVoltage.WriteLine(" BatteryVoltage");
statusrecord.SinexcelRecord.BatteryVoltage1.WriteLine(" BatteryVoltage1");
statusrecord.SinexcelRecord.BatteryVoltage2.WriteLine(" BatteryVoltage2");
statusrecord.SinexcelRecord.BatteryPower1.WriteLine(" BatteryPower1");
statusrecord.SinexcelRecord.BatteryPower2.WriteLine(" BatteryPower2");
statusrecord.SinexcelRecord.TotalBatteryPower.WriteLine(" TotalBatteryPower");
statusrecord.SinexcelRecord.EnableBattery1.WriteLine(" EnableBattery1");
statusrecord.SinexcelRecord.EnableBattery2.WriteLine(" EnableBattery2");
statusrecord.SinexcelRecord.MaxChargingCurrentBattery1.WriteLine(" MaxChargingCurrentBattery1");
statusrecord.SinexcelRecord.MaxChargingCurrentBattery2.WriteLine(" MaxChargingCurrentBattery2");
statusrecord.SinexcelRecord.MaxDischargingCurrentBattery1.WriteLine(" MaxChargingCurrentBattery1");
statusrecord.SinexcelRecord.MaxDischargingCurrentBattery2.WriteLine(" MaxChargingCurrentBattery2");
//EssModeControl(statusrecord);
// statusrecord.ApplyDefaultSettings();
Console.WriteLine( " ************************************ We are writing ************************************");
var startWritingTime = DateTime.Now;
Console.WriteLine(startWritingTime.ToString("HH:mm:ss.fff ") +"start Writing");
statusrecord?.Config.Save(); // save the config file
//sinexcelDevice.Write(statusrecord?.SinexcelRecord);
//if (statusrecord?.InverterRecord != null) sinexcelDevice.Write(statusrecord.InverterRecord);
var stopTime = DateTime.Now;
Console.WriteLine(stopTime.ToString("HH:mm:ss.fff"));
Console.WriteLine(stopTime.ToString("HH:mm:ss.fff ")+ "run iteration time finish");
return statusrecord;
}
catch (Exception e)
@ -178,6 +139,61 @@ internal static class Program
}
}
private static StatusMessage GetSodiHomeStateAlarm(StatusRecord? record)
{
var s3Bucket = Config.Load().S3?.Bucket;
var alarmList = new List<AlarmOrWarning>();
var warningList = new List<AlarmOrWarning>();
/*
if (record.SinexcelRecord.WorkingMode == GrowattSystemStatus.Fault)
{
if (record.AcDcGrowatt.FaultMainCode != 0)
{
alarmList.Add(new AlarmOrWarning
{
Date = DateTime.Now.ToString("yyyy-MM-dd"),
Time = DateTime.Now.ToString("HH:mm:ss"),
CreatedBy = "Growatt Inverter",
Description = record.AcDcGrowatt.WarningMainCode.ToString(), // to add the sub code
});
}
if (record.AcDcGrowatt.WarningMainCode != 0)
{
warningList.Add(new AlarmOrWarning
{
Date = DateTime.Now.ToString("yyyy-MM-dd"),
Time = DateTime.Now.ToString("HH:mm:ss"),
CreatedBy = "Growatt inverter",
Description = record.AcDcGrowatt.FaultMainCode.ToString(), //to add the sub code
});
}
}*/
_sodiohomeAlarmState = warningList.Any()
? SodistoreAlarmState.Orange
: SodistoreAlarmState.Green; // this will be replaced by LedState
_sodiohomeAlarmState = alarmList.Any()
? SodistoreAlarmState.Red
: _sodiohomeAlarmState; // this will be replaced by LedState
var installationId = GetInstallationId(s3Bucket ?? string.Empty);
var returnedStatus = new StatusMessage
{
InstallationId = installationId,
Product = 2,
Status = _sodiohomeAlarmState,
Type = MessageType.AlarmOrWarning,
Alarms = alarmList,
Warnings = warningList
};
return returnedStatus;
}
private static Int32 GetInstallationId(String s3Bucket)
{
var part = s3Bucket.Split('-').FirstOrDefault();
@ -220,11 +236,10 @@ internal static class Program
if (status == null) return;
status.Config.MinSoc = config.MinimumSoC;
status.Config.GridSetPoint = config.GridSetPoint * 1000; // converted from kW to W
//status.Config.MaximumChargingCurrent = config.MaximumChargingCurrent;
//status.Config.MaximumDischargingCurrent = config.MaximumDischargingCurrent;
//status.Config.OperatingPriority = config.OperatingPriority;
//status.Config.BatteriesCount = config.BatteriesCount;
status.Config.MaximumChargingCurrent = config.MaximumChargingCurrent;
status.Config.MaximumDischargingCurrent = config.MaximumDischargingCurrent;
status.Config.OperatingPriority = config.OperatingPriority;
status.Config.BatteriesCount = config.BatteriesCount;
}
private static async Task<Boolean> SaveModbusTcpFile(StatusRecord status)
@ -233,7 +248,7 @@ internal static class Program
// SYSTEM DATA
var result1 = ConvertToModbusRegisters((status.Config.MinSoc * 10), "UInt16", 30001); // this to be updated to modbusTCP version
var result2 = ConvertToModbusRegisters(status.SinexcelRecord.GridAPhaseVoltage, "UInt32", 30002);
var result2 = ConvertToModbusRegisters(status.InverterRecord.GridAPhaseVoltage, "UInt32", 30002);
// Merge all results into one dictionary
var allResults = new[]
@ -254,6 +269,8 @@ internal static class Program
//Console.WriteLine("JSON file written successfully.");
//Console.WriteLine(json);
var stopTime = DateTime.Now;
Console.WriteLine(stopTime.ToString("HH:mm:ss.fff" )+ " Finish the loop");
return true;
}