split CalculateEnergyFlow into 3 functions
This commit is contained in:
parent
5bcb46f841
commit
cc2ab03d01
|
@ -106,52 +106,12 @@ internal static class Program
|
|||
var pvOnDc = amptDevice.Read();
|
||||
var battery = batteryDevices.Read();
|
||||
|
||||
// ┌────┐ ┌────┐
|
||||
// │ Pv │ │ Pv │ ┌────┐
|
||||
// └────┘ └────┘ │ Pv │
|
||||
// V V └────┘
|
||||
// V V V
|
||||
// (b) 0 W (e) 0 W V
|
||||
// V V (i) 13.2 kW ┌────────────┐
|
||||
// V V V │ Battery │
|
||||
// ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌─────────┐ V ├────────────┤
|
||||
// │ Grid │ │ Grid Bus │ │ Island Bus │ │ AC/DC │ ┌────────┐ ┌───────┐ │ 52.3 V │
|
||||
// ├─────────┤ -10.3 kW ├──────────┤ -11.7 kW ├────────────┤ -11.7 kW ├─────────┤ -11.7 kW │ Dc Bus │ 1008 W │ DC/DC │ 1008 W │ 99.1 % │
|
||||
// │ -3205 W │<<<<<<<<<<│ 244 V │<<<<<<<<<<│ 244 V │<<<<<<<<<<│ -6646 W │<<<<<<<<<<├────────┤>>>>>>>>>>├───────┤>>>>>>>>>>│ 490 mA │
|
||||
// │ -3507 W │ (a) │ 244 V │ (d) │ 244 V │ (g) │ -5071 W │ (h) │ 776 V │ (k) │ 56 V │ (l) │ 250 °C │
|
||||
// │ -3605 W │ K1 │ 246 V │ K2 │ 246 V │ K3 └─────────┘ └────────┘ └───────┘ │ 445 A │
|
||||
// └─────────┘ └──────────┘ └────────────┘ V │ 0 Warnings │
|
||||
// V V V │ 0 Alarms │
|
||||
// V V (j) 0 W └────────────┘
|
||||
// (c) 1400 W (f) 0 W V
|
||||
// V V V
|
||||
// V V ┌──────┐
|
||||
// ┌──────┐ ┌──────┐ │ Load │
|
||||
// │ Load │ │ Load │ └──────┘
|
||||
// └──────┘ └──────┘
|
||||
var pvOnAcGrid = new AcPowerDevice { Power = 0 }; // TODO
|
||||
var pvOnAcIsland = new AcPowerDevice { Power = 0 }; // TODO
|
||||
|
||||
|
||||
// AC side
|
||||
// a + b - c - d = 0 [eq1]
|
||||
// d + e - f - g = 0 [eq2]
|
||||
//
|
||||
// c & d are not measured!
|
||||
//
|
||||
// d = f + g - e [eq2]
|
||||
// c = a + b - d [eq1]
|
||||
//
|
||||
// DC side
|
||||
// h + i - j - k = 0 [eq3]
|
||||
//
|
||||
// g = h assuming no losses in ACDC
|
||||
// k = l assuming no losses in DCDC
|
||||
// j = h + i - k [eq3]
|
||||
|
||||
|
||||
var pvOnAcGrid = new AcPowerDevice { Power = 0 };
|
||||
var pvOnAcIsland = new AcPowerDevice { Power = 0 };
|
||||
|
||||
var flow = Topology.CalculateEnergyFlow(gridMeter, pvOnAcGrid, pvOnAcIsland, loadOnAcIsland, acDc, pvOnDc, dcDc);
|
||||
var gridBusToIslandBus = Topology.CalculateGridBusToIslandBusPower(pvOnAcIsland, loadOnAcIsland, acDc);
|
||||
var gridBusLoad = Topology.CalculateGridBusLoad(gridMeter, pvOnAcGrid, gridBusToIslandBus);
|
||||
var dcLoad = Topology.CalculateDcLoad(acDc, pvOnDc, dcDc);
|
||||
|
||||
return new StatusRecord
|
||||
{
|
||||
|
@ -165,10 +125,10 @@ internal static class Program
|
|||
PvOnAcIsland = pvOnAcIsland,
|
||||
PvOnDc = pvOnDc,
|
||||
|
||||
AcGridToAcIsland = flow.acGridToAcIsland,
|
||||
LoadOnAcGrid = flow.loadOnAcGrid,
|
||||
AcGridToAcIsland = gridBusToIslandBus,
|
||||
LoadOnAcGrid = gridBusLoad,
|
||||
LoadOnAcIsland = loadOnAcIsland,
|
||||
LoadOnDc = flow.dcPowerDevice,
|
||||
LoadOnDc = dcLoad,
|
||||
|
||||
StateMachine = StateMachine.Default,
|
||||
EssControl = EssControl.Default,
|
||||
|
|
|
@ -10,7 +10,6 @@ using InnovEnergy.Lib.Units;
|
|||
using InnovEnergy.Lib.Units.Power;
|
||||
using InnovEnergy.Lib.Utils;
|
||||
using Ac3Bus = InnovEnergy.Lib.Units.Composite.Ac3Bus;
|
||||
using AcPower = InnovEnergy.Lib.Units.Composite.AcPower;
|
||||
|
||||
namespace InnovEnergy.App.SaliMax;
|
||||
|
||||
|
@ -39,11 +38,10 @@ namespace InnovEnergy.App.SaliMax;
|
|||
// └──────┘ └──────┘
|
||||
|
||||
|
||||
public static class Topology
|
||||
{
|
||||
|
||||
public static TextBlock CreateTopologyTextBlock(this StatusRecord status)
|
||||
{
|
||||
// Calculated values: c,d & h
|
||||
// ==========================
|
||||
//
|
||||
//
|
||||
// AC side
|
||||
// a + b - c - d = 0 [eq1]
|
||||
// d + e - f - g = 0 [eq2]
|
||||
|
@ -60,6 +58,12 @@ public static class Topology
|
|||
// k = l assuming no losses in DCDC
|
||||
// j = h + i - k [eq3]
|
||||
|
||||
|
||||
public static class Topology
|
||||
{
|
||||
|
||||
public static TextBlock CreateTopologyTextBlock(this StatusRecord status)
|
||||
{
|
||||
var a = status.GridMeter?.Ac.Power.Active;
|
||||
var b = status.PvOnAcGrid?.Power.Active;
|
||||
var e = status.PvOnAcIsland?.Power.Active;
|
||||
|
@ -93,9 +97,6 @@ public static class Topology
|
|||
dcDc,
|
||||
batteries
|
||||
);
|
||||
|
||||
|
||||
// 730 V
|
||||
}
|
||||
|
||||
private static TextBlock CreateGridColumn(this StatusRecord status, ActivePower? a)
|
||||
|
@ -464,57 +465,82 @@ public static class Topology
|
|||
: Flow.Horizontal(power);
|
||||
}
|
||||
|
||||
public static (AcPowerDevice? acGridToAcIsland, AcPowerDevice? loadOnAcGrid, DcPowerDevice? dcPowerDevice)
|
||||
|
||||
CalculateEnergyFlow(EmuMeterRegisters? gridMeter,
|
||||
AcPowerDevice pvOnAcGrid,
|
||||
AcPowerDevice pvOnAcIsland,
|
||||
EmuMeterRegisters? loadOnAcIsland,
|
||||
AcDcDevicesRecord acDc,
|
||||
AmptStatus? pvOnDc,
|
||||
DcDcDevicesRecord dcDc)
|
||||
public static AcPowerDevice? CalculateGridBusLoad(EmuMeterRegisters? gridMeter, AcPowerDevice? pvOnAcGrid, AcPowerDevice? gridBusToIslandBusPower)
|
||||
{
|
||||
var gridPower = gridMeter?.Ac.Power.Active;
|
||||
var islandLoadPower = loadOnAcIsland?.Ac.Power.Active;
|
||||
var inverterAcPower = acDc.Ac.Power.Active;
|
||||
var inverterDcPower = acDc.Dc.Power;
|
||||
var a = gridMeter ?.Ac.Power;
|
||||
var b = pvOnAcGrid ?.Power;
|
||||
var d = gridBusToIslandBusPower?.Power;
|
||||
|
||||
var a = gridPower;
|
||||
var b = pvOnAcGrid.Power.Active;
|
||||
var e = pvOnAcIsland.Power.Active;
|
||||
var f = islandLoadPower;
|
||||
var g = inverterAcPower;
|
||||
var h = inverterDcPower;
|
||||
if (a is null || b is null || d is null)
|
||||
return null;
|
||||
|
||||
var c = a + b - d; // [eq1]
|
||||
|
||||
return new AcPowerDevice { Power = c };
|
||||
}
|
||||
|
||||
public static AcPowerDevice? CalculateGridBusToIslandBusPower(AcPowerDevice? pvOnAcIsland, EmuMeterRegisters? loadOnAcIsland, AcDcDevicesRecord? acDc)
|
||||
{
|
||||
var e = pvOnAcIsland ?.Power;
|
||||
var f = loadOnAcIsland?.Ac.Power;
|
||||
var g = acDc ?.Ac.Power;
|
||||
|
||||
if (e is null || f is null || g is null)
|
||||
return null;
|
||||
|
||||
var d = f + g - e; // [eq2]
|
||||
|
||||
return new AcPowerDevice { Power = d };
|
||||
}
|
||||
|
||||
public static DcPowerDevice? CalculateDcLoad(AcDcDevicesRecord? acDc, AmptStatus? pvOnDc, DcDcDevicesRecord? dcDc)
|
||||
{
|
||||
var h = acDc?.Dc.Power;
|
||||
var i = pvOnDc?.Dc.Power;
|
||||
var k = dcDc.Dc.Link.Power;
|
||||
var l = k;
|
||||
var j = Sum(h, i, -k);
|
||||
var d = Sum(f, g, -e);
|
||||
var c = Sum(a, b, -d);
|
||||
var k = dcDc?.Dc.Link.Power;
|
||||
|
||||
|
||||
var acGridToAcIsland = d is null ? null : new AcPowerDevice { Power = AcPower.FromActiveReactive(d, 0) };
|
||||
var loadOnAcGrid = c is null ? null : new AcPowerDevice { Power = AcPower.FromActiveReactive(c, 0) };
|
||||
var dcPowerDevice = j is null ? null : new DcPowerDevice { Power = j };
|
||||
|
||||
|
||||
return (acGridToAcIsland, loadOnAcGrid, dcPowerDevice);
|
||||
}
|
||||
|
||||
private static ActivePower? Sum(ActivePower? e, ActivePower? f, ActivePower? g)
|
||||
{
|
||||
if (e is null || f is null || g is null)
|
||||
if (h is null || i is null || k is null)
|
||||
return null;
|
||||
|
||||
return f + g + e;
|
||||
var j = h + i - k; // [eq3]
|
||||
|
||||
return new DcPowerDevice { Power = j};
|
||||
}
|
||||
|
||||
private static DcPower? Sum(DcPower? e, DcPower? f, DcPower? g)
|
||||
{
|
||||
if (e is null || f is null || g is null)
|
||||
return null;
|
||||
// public static (AcPowerDevice? acGridToAcIsland, AcPowerDevice? loadOnAcGrid, DcPowerDevice? dcPowerDevice)
|
||||
//
|
||||
// CalculateEnergyFlow(EmuMeterRegisters? gridMeter,
|
||||
// AcPowerDevice pvOnAcGrid,
|
||||
// AcPowerDevice pvOnAcIsland,
|
||||
// EmuMeterRegisters? loadOnAcIsland,
|
||||
// AcDcDevicesRecord acDc,
|
||||
// AmptStatus? pvOnDc,
|
||||
// DcDcDevicesRecord dcDc)
|
||||
// {
|
||||
// var gridPower = gridMeter?.Ac.Power.Active;
|
||||
// var islandLoadPower = loadOnAcIsland?.Ac.Power.Active;
|
||||
// var inverterAcPower = acDc.Ac.Power.Active;
|
||||
// var inverterDcPower = acDc.Dc.Power;
|
||||
//
|
||||
// var a = gridPower;
|
||||
// var b = pvOnAcGrid.Power.Active;
|
||||
// var e = pvOnAcIsland.Power.Active;
|
||||
// var f = islandLoadPower;
|
||||
// var g = inverterAcPower;
|
||||
// var h = inverterDcPower;
|
||||
// var i = pvOnDc?.Dc.Power;
|
||||
// var k = dcDc.Dc.Link.Power;
|
||||
// var j = Sum(h, i, -k);
|
||||
// var d = Sum(f, g, -e);
|
||||
// var c = Sum(a, b, -d);
|
||||
//
|
||||
// var acGridToAcIsland = d is null ? null : new AcPowerDevice { Power = d.Value };
|
||||
// var loadOnAcGrid = c is null ? null : new AcPowerDevice { Power = c.Value };
|
||||
// var dcPowerDevice = j is null ? null : new DcPowerDevice { Power = j };
|
||||
//
|
||||
// return (acGridToAcIsland, loadOnAcGrid, dcPowerDevice);
|
||||
// }
|
||||
|
||||
return f + g + e;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue