From 8fc2b8fe9d700911a36902670701a1bc486e8c2b Mon Sep 17 00:00:00 2001 From: atef Date: Fri, 30 Jun 2023 10:30:18 +0200 Subject: [PATCH] Create Individual Battery --- csharp/App/SaliMax/src/Program.cs | 70 ++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index 0f35bac07..010d2a447 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -36,20 +36,23 @@ internal static class Program private static readonly Byte[] BatteryNodes = { 2, 3, 4, 5, 6 }; private const String BatteryTty = "/dev/ttyUSB0"; +#if DEBUG + private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001); + private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002); + private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003); + private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("localhost", 5004); + private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005); + private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006); + private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007); +#else private static readonly TcpChannel RelaysChannel = new TcpChannel("10.0.1.1", 502); // "192.168.1.242"; private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("10.0.2.1", 502); // "192.168.1.2"; private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("10.0.3.1", 502); // "192.168.1.3"; private static readonly TcpChannel GridMeterChannel = new TcpChannel("10.0.4.1", 502); // "192.168.1.241"; private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("10.0.4.2", 502); // "192.168.1.241"; private static readonly TcpChannel AmptChannel = new TcpChannel("10.0.5.1", 502); // "192.168.1.249"; - - //private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001); - //private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002); - //private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003); - //private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("localhost", 5004); - //private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005); - //private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006); - //private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007); + private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007); +#endif private static readonly S3Config S3Config = new S3Config @@ -165,7 +168,6 @@ internal static class Program Console.WriteLine("press ctrl-C to stop"); - while (true) { sd_notify(0, "WATCHDOG=1"); @@ -180,16 +182,7 @@ internal static class Program if (record.Relays is not null) record.Relays.ToCsv().WriteLine(); - - - var emuMeterRegisters = record.GridMeter; - if (emuMeterRegisters is not null) - { - emuMeterRegisters.Ac.Power.Active.WriteLine("Grid Active"); - //emuMeterRegisters.Ac.Power.Reactive.WriteLine("Grid Reactive"); - } - - + record.ControlConstants(); record.ControlSystemState(); @@ -272,12 +265,25 @@ internal static class Program var flowDcBusToDcDc = Flow.Horizontal(dcdcPower); var flowDcDcToBattery = Flow.Horizontal(dcBatteryPower); - var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid"); - var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter"); - var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC"); - var batteryBox = TextBlock.AlignLeft(batteryVoltage.ToDisplayString(), batterySoc.ToDisplayString(), batteryCurrent.ToDisplayString(), batteryTemp.ToDisplayString()).TitleBox("Battery"); + var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid"); + var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter"); + var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC"); + var batteryAvgBox = TextBlock.AlignLeft(batteryVoltage.ToDisplayString(), + batterySoc.ToDisplayString(), + batteryCurrent.ToDisplayString(), + batteryTemp.ToDisplayString()) + .TitleBox("Battery"); + + //////////////////// Batteries ///////////////////////// + IReadOnlyList batteryBoxes = s.Battery + .Devices + .Select(CreateIndividualBattery) + .ToArray(s.Battery.Devices.Count); + + var individualBatteries = TextBlock.AlignLeft(batteryBoxes); + var totalBoxes = TextBlock.CenterVertical(gridBox, gridBusFlow, @@ -291,11 +297,25 @@ internal static class Program flowDcBusToDcDc, dcDcBox, flowDcDcToBattery, - batteryBox); - + batteryAvgBox, + individualBatteries); totalBoxes.WriteLine(); } + private static TextBlock CreateIndividualBattery(Battery48TlRecord battery, Int32 i) + { + var content = TextBlock.AlignLeft(battery.Dc.Voltage.ToDisplayString(), + battery.Soc.ToDisplayString(), + battery.Dc.Current.ToDisplayString(), + battery.Temperatures.Heating); + + var box = content.TitleBox($"Battery {i + 1}"); + + var flow = Flow.Horizontal(battery.Dc.Power); + + return TextBlock.CenterVertical(flow, box); + } + private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox) { return ColumnBox(pvTitle, busTitle, loadTitle, dataBox, 0);