using HslCommunication.ModBus; using HslCommunication; using NLog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using Prism.Mvvm; namespace OrpaonEMS.App.Services { /// /// 客户提供的仪表 /// Demo时是工厂的总负载 /// public class AcrelMeterDataService : BindableBase { private readonly ILogService Logger; public AcrelMeterDataService(ILogService logService, ConfigDataService configDataService) { //MeterMdDrive = MdDrive; this.Logger = logService; ConfigDataService = configDataService; MeterMdDrive?.Close(); MeterMdDrive = new ModbusRtu(); MeterMdDrive.AddressStartWithZero = true;//华为光伏逆变器从0开始的 MeterMdDrive.IsStringReverse = false; MeterMdDrive.DataFormat = HslCommunication.Core.DataFormat.ABCD; try { if (ConfigDataService.IsDemo) { MdStation = 4; MeterMdDrive.SerialPortInni(sp => { sp.PortName = "COM11"; //sp.PortName = "COM10"; sp.BaudRate = 19200; sp.DataBits = 8; sp.StopBits = System.IO.Ports.StopBits.One; sp.Parity = System.IO.Ports.Parity.None; }); } else { MeterMdDrive.SerialPortInni(sp => { sp.PortName = "COM1"; //sp.PortName = "COM10"; sp.BaudRate = 9600; sp.DataBits = 8; sp.StopBits = System.IO.Ports.StopBits.One; sp.Parity = System.IO.Ports.Parity.None; }); } var result = MeterMdDrive.Open(); if (!result.IsSuccess) { MessageBox.Show("AcrelMeter仪表连接失败"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } ScanDeviceStart(); } /// /// Meter 电表通信连接状态 /// public bool MeterLinkState { get; set; } = true; /// /// 扫描线程使能 /// public bool ThreadEnable { get; set; } = true; /// /// Modbus 从站的站号 /// private ushort MdStation { get; set; } = 1; /// /// 扫描线程 /// private void ScanDeviceStart() { ScanDeviceTask = Task.Run(async () => { while (ThreadEnable) { await Task.Delay(100); //DiagnosticsTime.Reset(); //DiagnosticsTime.Start(); try { //2048地址块 OperateResultBytes1 = MeterMdDrive.Read($"s={MdStation};x=3;2048", 52); if (OperateResultBytes1.IsSuccess) { Psum = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 52);//BaseIndex1 + 0x81A Qsum = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 68);//BaseIndex1 + 0x822 Ua = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 0);//BaseIndex1 + 0x800 Ub = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 4);//BaseIndex1 + 0x802 Uc = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 8);//BaseIndex1 + 0x804 Ia = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 24);//BaseIndex1 + 0x80C Ib = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 28);//BaseIndex1 + 0x80E Ic = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 32);//BaseIndex1 + 0x810 cosQ = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 100);//BaseIndex1 + 0x832 //Console.WriteLine($"datetime:{DateTime.Now.ToString()} 3.1--{Psum}"); } //1501地址块 OperateResultBytes2 = MeterMdDrive.Read($"s={MdStation};x=3;1501", 10); if (OperateResultBytes2.IsSuccess) { ThdVolA = MeterMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 0);//BaseIndex1 + 0x5DD ThdVolB = MeterMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 2);//BaseIndex1 + 0x5DE ThdVolC = MeterMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 4);//BaseIndex1 + 0x5DF ThdCurA = MeterMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 6);//BaseIndex1 + 0x5E0 ThdCurB = MeterMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 8);//BaseIndex1 + 0x5E1 ThdCurC = MeterMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 10);//BaseIndex1 + 0x5E2 //F = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes2.Content, 28);// //Console.WriteLine($"datetime:{DateTime.Now.ToString()} 电表 3.2--负载功率: {Psum}"); //通信正常 MeterLinkState = true; } else { //通信正常 //MeterLinkState = false; } //58130地址块 OperateResultBytes3 = MeterMdDrive.Read($"s={MdStation};x=3;58130", 130); if (OperateResultBytes3.IsSuccess) { TipInPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 128);//BaseIndex1 + 0xE314 PeakInPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 136);//BaseIndex1 + 0xE316 FlatInPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 144);//BaseIndex1 + 0xE318 VellayInPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 152);//BaseIndex1 + 0xE31A TipOutPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 200);//BaseIndex1 + 0xE326 PeakOutPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 208);//BaseIndex1 + 0xE328 FlatOutPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 216);//BaseIndex1 + 0xE32A VellayOutPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 224);//BaseIndex1 + 0xE32C TotalInPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 120);//BaseIndex1 + 0xE312 TotalOutPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 192);//BaseIndex1 + 0xE324 TotalPWh = MeterMdDrive.ByteTransform.TransUInt32(OperateResultBytes3.Content, 48);//BaseIndex1 + 0xE324 } } catch (Exception ex) { Logger.Info($"时间:{DateTime.Now.ToString()}-【ExitPeakValley】-{ex.Message}"); } //DiagnosticsTime.Stop(); //ScanRtTimeinfo = $"电表:{DiagnosticsTime.Elapsed.TotalMilliseconds.ToString()}"; } }); } /// /// 关闭驱动连接 /// public void CloseDrive() { MeterMdDrive.Close(); } /// /// 基础的Index /// private int BaseIndex1 { get; set; } /// /// 实际扫描时间 /// public string ScanRtTimeinfo { get; set; } /// /// 读取的字节数据集合 /// public OperateResult OperateResultBytes1 { get; set; } /// /// 读取的字节数据集合 /// public OperateResult OperateResultBytes2 { get; set; } /// /// 读取的字节数据集合 /// public OperateResult OperateResultBytes3 { get; set; } /// /// 仪表数据驱动 /// public ModbusRtu MeterMdDrive { set; get; } /// /// ScanDevice扫描Task /// static Task ScanDeviceTask { get; set; } /// /// 时间诊断 /// System.Diagnostics.Stopwatch DiagnosticsTime = new System.Diagnostics.Stopwatch(); /// /// A相电压 /// public double Ua { get; set; } /// /// B相电压 /// public double Ub { get; set; } /// /// C相电压 /// public double Uc { get; set; } /// /// A相电流 /// public double Ia { get; set; } /// /// B相电流 /// public double Ib { get; set; } /// /// C相电流 /// public double Ic { get; set; } private double _Psum; /// /// 总有功功率 /// 总实时负载 /// 总市电的电表 /// 维持为0是目标 /// public double Psum { get { return _Psum; } set { _Psum = value; RaisePropertyChanged(); } } /// /// 总无功功率 /// public double Qsum { get; set; } /// /// 功率因数 /// public double cosQ { get; set; } /// /// 频率 /// public double F { get; set; } private UInt32 _TotalInPWh; /// /// 输入总有功电度 /// public UInt32 TotalInPWh { get { return _TotalInPWh; } set { _TotalInPWh = value; RaisePropertyChanged(); } } private UInt32 _TotalOutPWh; /// /// 输出总有功电度 /// public UInt32 TotalOutPWh { get { return _TotalOutPWh; } set { _TotalOutPWh = value; RaisePropertyChanged(); } } private UInt32 _TotalPWh; /// /// 总有功总电能 /// public UInt32 TotalPWh { get { return _TotalPWh; } set { _TotalPWh = value; RaisePropertyChanged(); } } /// /// A相电压总畸变 /// public ushort ThdVolA { get; set; } /// /// B相电压总畸变 /// public ushort ThdVolB { get; set; } /// /// C相电压总畸变 /// public ushort ThdVolC { get; set; } /// /// A相电流总畸变 /// public ushort ThdCurA { get; set; } /// /// B相电流总畸变 /// public ushort ThdCurB { get; set; } /// /// C相电流总畸变 /// public ushort ThdCurC { get; set; } /// /// 尖时段输入有功电度 /// public UInt32 TipInPWh { get; set; } /// /// 峰时段输入有功电度 /// public UInt32 PeakInPWh { get; set; } /// /// 平时段输入有功电度 /// public UInt32 FlatInPWh { get; set; } /// /// 谷时段输入有功电度 /// public UInt32 VellayInPWh { get; set; } /// /// 尖时段输出有功电度 /// public UInt32 TipOutPWh { get; set; } /// /// 峰时段输出有功电度 /// public UInt32 PeakOutPWh { get; set; } /// /// 平时段输出有功电度 /// public UInt32 FlatOutPWh { get; set; } /// /// 谷时段输出有功电度 /// public UInt32 VellayOutPWh { get; set; } public ConfigDataService ConfigDataService { get; } } }