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
}
}