Files
YuPu-OrpaonEMS/OrpaonEMS.App/Services/SolarEnergyService.cs
2025-02-28 22:23:13 +08:00

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