From 546192cbab991e61a552504ee16db05ab12cb125 Mon Sep 17 00:00:00 2001 From: atef Date: Tue, 31 Dec 2024 16:24:03 +0100 Subject: [PATCH] Update program C for LED debug --- csharp/App/SaliMax/src/Program.cs | 142 ++++++++++++++++++++++++++---- 1 file changed, 124 insertions(+), 18 deletions(-) diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index aab98787c..7691b2ce2 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -28,6 +28,7 @@ using InnovEnergy.Lib.Protocols.Modbus.Channels; using InnovEnergy.Lib.Units; using InnovEnergy.Lib.Utils; using InnovEnergy.App.SaliMax.DataTypes; +using InnovEnergy.Lib.Utils.Net; using static System.Int32; using static InnovEnergy.App.SaliMax.AggregationService.Aggregator; using static InnovEnergy.App.SaliMax.MiddlewareClasses.MiddlewareAgent; @@ -52,6 +53,7 @@ internal static class Program private static readonly Channel PvOnAcGrid; private static readonly Channel PvOnAcIsland; private static readonly Channel RelaysChannel; + private static readonly Channel RelaysTsChannel; private static readonly Channel BatteriesChannel; private static Boolean _curtailFlag = false; @@ -72,6 +74,7 @@ internal static class Program ? new NullChannel() : new TcpChannel(device); + TruConvertAcChannel = CreateChannel(d.TruConvertAcIp); TruConvertDcChannel = CreateChannel(d.TruConvertDcIp); GridMeterChannel = CreateChannel(d.GridMeterIp); @@ -80,6 +83,7 @@ internal static class Program PvOnAcGrid = CreateChannel(d.PvOnAcGrid); PvOnAcIsland = CreateChannel(d.PvOnAcIsland); RelaysChannel = CreateChannel(d.RelaysIp); + RelaysTsChannel = CreateChannel(d.TsRelaysIp); BatteriesChannel = CreateChannel(d.BatteryIp); BatteryNodes = config @@ -126,19 +130,21 @@ internal static class Program .Select(n => new Battery48TlDevice(BatteriesChannel, n)) .ToList(); - var batteryDevices = new Battery48TlDevices(battery48TlDevices); - var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel); - var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel); - var gridMeterDevice = new EmuMeterDevice(GridMeterChannel); - var acIslandLoadMeter = new EmuMeterDevice(IslandBusLoadChannel); - var pvOnDcDevice = new AmptDevices(PvOnDc); - var pvOnAcGridDevice = new AmptDevices(PvOnAcGrid); - var pvOnAcIslandDevice = new AmptDevices(PvOnAcIsland); + var batteryDevices = new Battery48TlDevices(battery48TlDevices); + var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel); + var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel); + var gridMeterDevice = new EmuMeterDevice(GridMeterChannel); + var acIslandLoadMeter = new EmuMeterDevice(IslandBusLoadChannel); + var pvOnDcDevice = new AmptDevices(PvOnDc); + var pvOnAcGridDevice = new AmptDevices(PvOnAcGrid); + var pvOnAcIslandDevice = new AmptDevices(PvOnAcIsland); + var saliMaxTsRelaysDevice = new RelaysDeviceAdam6060(RelaysTsChannel); + #if Amax - var saliMaxRelaysDevice = new RelaysDeviceAmax(RelaysChannel); + var saliMaxRelaysDevice = new RelaysDeviceAmax(RelaysChannel); #else - var saliMaxRelaysDevice = new RelaysDevice(RelaysChannel); + var saliMaxRelaysDevice = new RelaysDeviceAdam6360(RelaysChannel); #endif @@ -149,6 +155,7 @@ internal static class Program var acDc = acDcDevices.Read(); var dcDc = dcDcDevices.Read(); var relays = saliMaxRelaysDevice.Read(); + var tsRelays = saliMaxTsRelaysDevice.Read(); var loadOnAcIsland = acIslandLoadMeter.Read(); var gridMeter = gridMeterDevice.Read(); var pvOnDc = pvOnDcDevice.Read(); @@ -169,14 +176,20 @@ internal static class Program var acDcToDcLink = devices.LoadOnDc.DeviceState == DeviceState.Disabled ? Topology.CalculateAcDcToDcLink(pvOnDc, dcDc, acDc) - : new DcPowerDevice{ Power = acDc.Dc.Power}; + : new DcPowerDevice{ Power = acDc.Dc.Power}; + +#if Amax + var combinedRelays = relays; +#else + var combinedRelays = new CombinedAdamRelaysRecord(tsRelays, relays); +#endif return new StatusRecord { AcDc = acDc, DcDc = dcDc, Battery = battery, - Relays = relays, + Relays = combinedRelays, GridMeter = gridMeter, PvOnAcGrid = pvOnAcGrid, PvOnAcIsland = pvOnAcIsland, @@ -196,11 +209,19 @@ internal static class Program void WriteControl(StatusRecord r) { if (r.Relays is not null) + { #if Amax saliMaxRelaysDevice.Write((RelaysRecordAmax)r.Relays); #else - ((RelaysDevice)saliMaxRelaysDevice).Write((RelaysRecord)r.Relays); + + if (r.Relays is CombinedAdamRelaysRecord adamRelays) + { + saliMaxRelaysDevice.Write(adamRelays.GetAdam6360DRecord() ?? throw new InvalidOperationException()); + saliMaxTsRelaysDevice.Write(adamRelays.GetAdam6060Record() ?? throw new InvalidOperationException()); + } #endif + } + acDcDevices.Write(r.AcDc); dcDcDevices.Write(r.DcDc); } @@ -223,10 +244,36 @@ internal static class Program Watchdog.NotifyAlive(); var record = ReadStatus(); - - var currentSalimaxState = GetSalimaxStateAlarm(record); + /* + if (record.Relays != null) + { + record.Relays.Do0StartPulse = true; - SendSalimaxStateAlarm(currentSalimaxState, record); + record.Relays.PulseOut0HighTime = 20000; + record.Relays.PulseOut0LowTime = 20000; + record.Relays.DigitalOutput0Mode = 2; + + record.Relays.LedGreen = false; + + record.Relays.Do0StartPulse.WriteLine(" = start pulse 0"); + + record.Relays.PulseOut0HighTime.WriteLine(" = PulseOut0HighTime"); + + record.Relays.PulseOut0LowTime.WriteLine(" = PulseOut0LowTime"); + + record.Relays.DigitalOutput0Mode.WriteLine(" = DigitalOutput0Mode"); + + record.Relays.LedGreen.WriteLine(" = LedGreen"); + + record.Relays.LedRed.WriteLine(" = LedRed"); + + } + else + { + " Relays are null".WriteLine(); + }*/ + + SendSalimaxStateAlarm(GetSalimaxStateAlarm(record), record); // to improve record.ControlConstants(); record.ControlSystemState(); @@ -241,7 +288,9 @@ internal static class Program record.DcDc.SystemControl.ApplyDcDcDefaultSettings(); DistributePower(record, essControl); - + + record.PerformLed(); + WriteControl(record); $"{DateTime.Now.Round(UpdateInterval).ToUnixTime()} : {record.StateMachine.State}: {record.StateMachine.Message}".WriteLine(); @@ -304,6 +353,7 @@ internal static class Program } } + // This preparing a message to send to salimax monitor private static StatusMessage GetSalimaxStateAlarm(StatusRecord record) { var alarmCondition = record.DetectAlarmStates(); // this need to be emailed to support or customer @@ -532,9 +582,11 @@ internal static class Program r.AcDc.ResetAlarms(); } - // This will be used for provider throttling, this example is only for either 100% or 0 % + // This will be used for provider throttling, this example is only for either 100% or 0 % private static void ControlPvPower(this StatusRecord r, UInt16 exportLimit = 0, UInt16 pvInstalledPower = 20) { + // Maybe add a condition to do this only if we are in optimised Self consumption, this is not true + if (r.GridMeter?.Ac.Power.Active == null) { Console.WriteLine(" No reading from Grid meter"); @@ -644,6 +696,60 @@ internal static class Program }); } + private static void PerformLed(this StatusRecord record) + { + if (record.StateMachine.State == 23) + { + switch (record.EssControl.Mode) + { + case EssMode.CalibrationCharge: + record.Relays?.PerformSlowFlashingGreenLed(); + break; + case EssMode.OptimizeSelfConsumption when !_curtailFlag: + record.Relays?.PerformSolidGreenLed(); + break; + case EssMode.Off: + break; + case EssMode.OffGrid: + break; + case EssMode.HeatBatteries: + break; + case EssMode.ReachMinSoc: + break; + case EssMode.NoGridMeter: + break; + default: + { + if (_curtailFlag) + { + record.Relays?.PerformFastFlashingGreenLed(); + } + + break; + } + } + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc > 50) + { + record.Relays?.PerformSolidOrangeLed(); + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc < 50 && record.Battery.Soc > 20) + { + record.Relays?.PerformSlowFlashingOrangeLed(); + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc < 20) + { + record.Relays?.PerformFastFlashingOrangeLed(); + } + + var criticalAlarm = record.DetectAlarmStates(); + + if (criticalAlarm is not null) + { + record.Relays?.PerformSolidRedLed(); + } + } + private static Double IncreaseInverterUpperLimit(Double upperLimit, Double stepSize) { return upperLimit + stepSize;