using HslCommunication; using HslCommunication.ModBus; using OrpaonEMS.Core.Model; using Prism.Mvvm; 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 SolarEnergyService : BindableBase { /// /// 光伏板驱动 /// public ModbusRtu SolarMdDrive { set; get; } /// /// ScanTask扫描Task /// static Task ScanTask { get; set; } /// /// 扫描线程使能 /// public bool ThreadEnable { get; set; } = true; /// /// 读取的字节数据集合 /// public OperateResult OperateResultBytes1 { get; set; } /// /// 读取的字节数据集合 /// public OperateResult OperateResultBytes2 { get; set; } /// /// Modbus 从站的站号 /// private ushort MdStation { get; set; } = 1; public ILogService LogService { get; } public ConfigDataService ConfigDataService { get; } /// /// 实例化函数 /// public SolarEnergyService(ILogService logService, ConfigDataService configDataService) { LogService = logService; ConfigDataService = configDataService; SolarMdDrive?.Close(); SolarMdDrive = new ModbusRtu(); SolarMdDrive.AddressStartWithZero = true;//华为光伏逆变器从0开始的 SolarMdDrive.IsStringReverse = false; SolarMdDrive.DataFormat = HslCommunication.Core.DataFormat.ABCD; try { if (ConfigDataService.IsDemo) { SolarMdDrive.SerialPortInni(sp => { sp.PortName = "COM10"; //sp.PortName = "COM10"; sp.BaudRate = 19200; sp.DataBits = 8; sp.StopBits = System.IO.Ports.StopBits.One; sp.Parity = System.IO.Ports.Parity.None; }); } else { SolarMdDrive.SerialPortInni(sp => { sp.PortName = "COM10"; //sp.PortName = "COM10"; sp.BaudRate = 19200; sp.DataBits = 8; sp.StopBits = System.IO.Ports.StopBits.One; sp.Parity = System.IO.Ports.Parity.None; }); } SolarMdDrive.Open(); } catch (Exception ex) { MessageBox.Show(ex.Message); } //启动 ScanDeviceStart(); } private void ScanDeviceStart() { ScanTask = Task.Run(async () => { while (ThreadEnable) { try { await Task.Delay(200); OperateResultBytes1 = SolarMdDrive.Read($"s={MdStation};x=3;30070", 100); if (OperateResultBytes1.IsSuccess) { MaxActivePw = SolarMdDrive.ByteTransform.TransUInt32(OperateResultBytes1.Content, 150) / 1000.0; MaxApparentPw = SolarMdDrive.ByteTransform.TransUInt32(OperateResultBytes1.Content, 154) / 1000.0; MaxReactivePw = SolarMdDrive.ByteTransform.TransUInt32(OperateResultBytes1.Content, 158) / 1000.0; //Console.WriteLine($"datetime:{DateTime.Now.ToString()} Solar-1.1 最大有功:{MaxActivePw}"); } OperateResultBytes2 = SolarMdDrive.Read($"s={MdStation};x=3;32000", 120); if (OperateResultBytes2.IsSuccess) { ACVolAB = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 132); ACVolBC = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 134); ACVolCA = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 136); ACVolA = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 138); ACVolB = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 140); ACVolC = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 142); ACCurA = SolarMdDrive.ByteTransform.TransInt32(OperateResultBytes2.Content, 144) / 1000.0; ACCurB = SolarMdDrive.ByteTransform.TransInt32(OperateResultBytes2.Content, 146) / 1000.0; ACCurC = SolarMdDrive.ByteTransform.TransInt32(OperateResultBytes2.Content, 148) / 1000.0; ActivePw = SolarMdDrive.ByteTransform.TransInt32(OperateResultBytes2.Content, 160) / 1000.0; Power = ActivePw; ReactivePw = SolarMdDrive.ByteTransform.TransInt32(OperateResultBytes2.Content, 164) / 1000.0; PwFactor = SolarMdDrive.ByteTransform.TransInt16(OperateResultBytes2.Content, 168) / 1000.0; Efficiency = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 172) / 100.0; ErrCode = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 180); AccPw = SolarMdDrive.ByteTransform.TransUInt32(OperateResultBytes2.Content, 212) / 100.0; AccDayPw = SolarMdDrive.ByteTransform.TransUInt32(OperateResultBytes2.Content, 228) / 100.0; PwHz = SolarMdDrive.ByteTransform.TransUInt16(OperateResultBytes2.Content, 170) / 100.0;//32085 //Console.WriteLine($"datetime:{DateTime.Now.ToString()} Solar-1.2 --有功:{ActivePw}"); } } catch (Exception ex) { //var dd = 1; } } }); } #region 光伏参数 private double _Power; /// /// 光伏板的总共功率 /// 发电功率 /// public double Power { get { return _Power; } set { _Power = value; RaisePropertyChanged(); } } /// /// 运行状态 /// public bool State { get; set; } /// /// 最大有功 /// public double MaxActivePw { get; set; } /// /// 最大视在功率 /// public double MaxApparentPw { get; set; } /// /// 最大无功功率 /// public double MaxReactivePw { get; set; } /// /// 交流电压 AB相 /// public double ACVolAB { get; set; } /// /// 交流电压 BC相 /// public double ACVolBC { get; set; } /// /// 交流电压 CA相 /// public double ACVolCA { get; set; } /// /// 交流电压 A相 /// public double ACVolA { get; set; } /// /// 交流电压 B相 /// public double ACVolB { get; set; } /// /// 交流电压 C相 /// public double ACVolC { get; set; } /// /// 交流电流 A相 /// public double ACCurA { get; set; } /// /// 交流电流 B相 /// public double ACCurB { get; set; } /// /// 交流电流 C相 /// public double ACCurC { get; set; } /// /// 有功功率 /// public double ActivePw { get; set; } /// /// 无功功率 /// public double ReactivePw { get; set; } /// /// 功率因数 /// public double PwFactor { get; set; } /// /// 电网频率 地址32085 /// public double PwHz { get; set; } /// /// 效率 /// public double Efficiency { get; set; } /// /// 故障码 /// public int ErrCode { get; set; } /// /// 累计发电量 /// public double AccPw { get; set; } /// /// 当日发电量 /// public double AccDayPw { get; set; } #endregion } }