添加项目文件。
This commit is contained in:
290
OrpaonEMS.App/Services/SolarEnergyService.cs
Normal file
290
OrpaonEMS.App/Services/SolarEnergyService.cs
Normal file
@@ -0,0 +1,290 @@
|
||||
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
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user