using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; using InnovEnergy.Lib.StatusApi.DeviceTypes; using InnovEnergy.Lib.Units.Composite; using static System.Math; #pragma warning disable CS0649 namespace InnovEnergy.Lib.Devices.IEM3kGridMeter; using Float32 = Single; [AddressOffset(-2)] // why? public class Iem3KGridMeterRegisters : IAc3Meter { private const Float32 ZeroBecauseReactivePowerNotSupported = 0; // TODO [HoldingRegister(3054)] private Float32 _ActivePowerL1; [HoldingRegister(3056)] private Float32 _ActivePowerL2; [HoldingRegister(3058)] private Float32 _ActivePowerL3; [HoldingRegister(3000)] private Float32 _CurrentL1; [HoldingRegister(3002)] private Float32 _CurrentL2; [HoldingRegister(3004)] private Float32 _CurrentL3; [HoldingRegister(3028)] private Float32 _VoltageL1N; [HoldingRegister(3030)] private Float32 _VoltageL2N; [HoldingRegister(3032)] private Float32 _VoltageL3N; [HoldingRegister(3110)] private Float32 _Frequency; //[HoldingRegister(9012)] private Float32 _ReactivePowerL1; //[HoldingRegister(9014)] private Float32 _ReactivePowerL2; //[HoldingRegister(9016)] private Float32 _ReactivePowerL3; //[HoldingRegister(9012)] private Float32 _ReactivePowerL1; //[HoldingRegister(9014)] private Float32 _ReactivePowerL2; //[HoldingRegister(9016)] private Float32 _ReactivePowerL3; //[HoldingRegister(9022)] private Float32 _ApparentPowerL1; //[HoldingRegister(9024)] private Float32 _ApparentPowerL2; //[HoldingRegister(9026)] private Float32 _ApparentPowerL3; public Ac3Bus Ac => new Ac3Bus { L1 = new () { Current = Abs(_CurrentL1), Voltage = Abs(_VoltageL1N), Phi = Atan2(ZeroBecauseReactivePowerNotSupported, _ActivePowerL1) }, L2 = new () { Current = Abs(_CurrentL2), Voltage = Abs(_VoltageL2N), Phi = Atan2(ZeroBecauseReactivePowerNotSupported, _ActivePowerL2) }, L3 = new () { Current = Abs(_CurrentL3), Voltage = Abs(_VoltageL3N), Phi = Atan2(ZeroBecauseReactivePowerNotSupported, _ActivePowerL3) }, Frequency = _Frequency }; }