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; namespace OrpaonEMS.App.Services { public class KEMeterService { //创建日志记录对象 Logger Logger = NLog.LogManager.GetCurrentClassLogger(); public KEMeterService() { //MeterMdDrive = MdDrive; MeterMdDrive?.Close(); MeterMdDrive = new ModbusRtu(); MeterMdDrive.AddressStartWithZero = true;// MeterMdDrive.IsStringReverse = false; MeterMdDrive.DataFormat = HslCommunication.Core.DataFormat.ABCD; try { MeterMdDrive.SerialPortInni(sp => { sp.PortName = "COM8"; //sp.PortName = "COM10"; sp.BaudRate = 9600; sp.DataBits = 8; sp.StopBits = System.IO.Ports.StopBits.One; sp.Parity = System.IO.Ports.Parity.Even; }); var result = MeterMdDrive.Open(); if (!result.IsSuccess) { MessageBox.Show("总负载仪表连接失败"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } ScanDeviceThread = new Thread(new ThreadStart(ScanDeviceThreadMethod)); ScanDeviceThread.Start(); } /// /// Meter 电表通信连接状态 /// public bool MeterLinkState { get; set; } = true; /// /// 扫描线程使能 /// public bool ThreadEnable { get; set; } = true; /// /// Modbus 从站的站号 /// private ushort MdStation { get; set; } = 83; private void ScanDeviceThreadMethod() { while (ThreadEnable) { //DiagnosticsTime.Reset(); //DiagnosticsTime.Start(); GetRtPwMeter(); //DiagnosticsTime.Stop(); //ScanRtTimeinfo = $"电表:{DiagnosticsTime.Elapsed.TotalMilliseconds.ToString()}"; } } /// /// 关闭驱动连接 /// public void CloseDrive() { MeterMdDrive.Close(); } /// /// 基础的Index /// private int BaseIndex1 { get; set; } /// /// 获取电表的数据 /// public void GetRtPwMeter() { try { OperateResultBytes1 = MeterMdDrive.Read($"s={MdStation};x=3;30", 10); if (OperateResultBytes1.IsSuccess) { Psum = MeterMdDrive.ByteTransform.TransSingle(OperateResultBytes1.Content, 0) * 0.4;//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}"); //通信正常 MeterLinkState = true; LinkFaultCount = 0; } else { LinkFaultCount = LinkFaultCount + 1; if (LinkFaultCount > 5) { //通信正常 MeterLinkState = false; } } } catch (Exception ex) { Logger.Info($"时间:{DateTime.Now.ToString()}-【ExitPeakValley】-{ex.Message}"); } } /// /// 连接失败 /// public int LinkFaultCount { 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; } /// /// 扫描设备线程数据 /// public Thread ScanDeviceThread { set; get; } /// /// 时间诊断 /// 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; } /// /// 总有功功率 /// 总实时负载 /// 总市电的电表 /// 维持为0是目标 /// 单位Kw /// public double Psum { get; set; } /// /// 总无功功率 /// public double Qsum { get; set; } /// /// 功率因数 /// public double cosQ { get; set; } ///// ///// 频率 ///// //public double F { get; set; } ///// ///// 输入总有功电度 ///// //public UInt32 TotalPWh { get; set; } ///// ///// 输入总无功电度 ///// //public UInt32 TotalQWh { get; set; } ///// ///// 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; } } }