291 lines
9.3 KiB
C#
291 lines
9.3 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 光伏服务数据
|
|
/// </summary>
|
|
public class SolarEnergyService : BindableBase
|
|
{
|
|
/// <summary>
|
|
/// 光伏板驱动
|
|
/// </summary>
|
|
public ModbusRtu SolarMdDrive { set; get; }
|
|
|
|
/// <summary>
|
|
/// ScanTask扫描Task
|
|
/// </summary>
|
|
static Task ScanTask { get; set; }
|
|
|
|
/// <summary>
|
|
/// 扫描线程使能
|
|
/// </summary>
|
|
public bool ThreadEnable { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// 读取的字节数据集合
|
|
/// </summary>
|
|
public OperateResult<byte[]> OperateResultBytes1 { get; set; }
|
|
|
|
/// <summary>
|
|
/// 读取的字节数据集合
|
|
/// </summary>
|
|
public OperateResult<byte[]> OperateResultBytes2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Modbus 从站的站号
|
|
/// </summary>
|
|
private ushort MdStation { get; set; } = 1;
|
|
public ILogService LogService { get; }
|
|
public ConfigDataService ConfigDataService { get; }
|
|
|
|
/// <summary>
|
|
/// 实例化函数
|
|
/// </summary>
|
|
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;
|
|
/// <summary>
|
|
/// 光伏板的总共功率
|
|
/// 发电功率
|
|
/// </summary>
|
|
public double Power
|
|
{
|
|
get { return _Power; }
|
|
set { _Power = value; RaisePropertyChanged(); }
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 运行状态
|
|
/// </summary>
|
|
public bool State { get; set; }
|
|
|
|
/// <summary>
|
|
/// 最大有功
|
|
/// </summary>
|
|
public double MaxActivePw { get; set; }
|
|
|
|
/// <summary>
|
|
/// 最大视在功率
|
|
/// </summary>
|
|
public double MaxApparentPw { get; set; }
|
|
|
|
/// <summary>
|
|
/// 最大无功功率
|
|
/// </summary>
|
|
public double MaxReactivePw { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交流电压 AB相
|
|
/// </summary>
|
|
public double ACVolAB { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交流电压 BC相
|
|
/// </summary>
|
|
public double ACVolBC { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交流电压 CA相
|
|
/// </summary>
|
|
public double ACVolCA { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// 交流电压 A相
|
|
/// </summary>
|
|
public double ACVolA { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交流电压 B相
|
|
/// </summary>
|
|
public double ACVolB { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交流电压 C相
|
|
/// </summary>
|
|
public double ACVolC { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// 交流电流 A相
|
|
/// </summary>
|
|
public double ACCurA { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交流电流 B相
|
|
/// </summary>
|
|
public double ACCurB { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交流电流 C相
|
|
/// </summary>
|
|
public double ACCurC { get; set; }
|
|
|
|
/// <summary>
|
|
/// 有功功率
|
|
/// </summary>
|
|
public double ActivePw { get; set; }
|
|
|
|
/// <summary>
|
|
/// 无功功率
|
|
/// </summary>
|
|
public double ReactivePw { get; set; }
|
|
|
|
/// <summary>
|
|
/// 功率因数
|
|
/// </summary>
|
|
public double PwFactor { get; set; }
|
|
|
|
/// <summary>
|
|
/// 电网频率 地址32085
|
|
/// </summary>
|
|
public double PwHz { get; set; }
|
|
|
|
/// <summary>
|
|
/// 效率
|
|
/// </summary>
|
|
public double Efficiency { get; set; }
|
|
|
|
/// <summary>
|
|
/// 故障码
|
|
/// </summary>
|
|
public int ErrCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// 累计发电量
|
|
/// </summary>
|
|
public double AccPw { get; set; }
|
|
|
|
/// <summary>
|
|
/// 当日发电量
|
|
/// </summary>
|
|
public double AccDayPw { get; set; }
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|