You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

559 lines
16 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using HslCommunication;
using HslCommunication.ModBus;
using Monitor.LogService;
using Monitor.Models;
using System;
using System.Collections.Generic;
using System.Threading;
namespace Module.EMeter.ModbusTcp
{
/// <summary>
/// 电表527中使用ModbusTcp协议读取信息
/// </summary>
public class EMeterModbus527Tool
{
#region 定义锁
private object lockObj = new object(); //线程同步锁
#endregion 定义锁
#region 字段属性
/// <summary>
/// 服务端连接IP
/// </summary>
private string _ipaddr = "172.0.30.100";
/// <summary>
/// 服务端连接IP
/// </summary>
public string F_IpAddr
{
get
{
return _ipaddr;
}
set
{
lock (lockObj)
{
_ipaddr = value;
}
}
}
/// <summary>
/// 服务端连接端口
/// </summary>
private int _port = 502;
/// <summary>
/// 服务端连接端口
/// </summary>
public int F_Port
{
get
{
return _port;
}
set
{
lock (lockObj)
{
_port = value;
}
}
}
/// <summary>
/// 从站号
/// </summary>
private byte _site = 0x01;
/// <summary>
/// 从站号
/// </summary>
public byte F_Site
{
get
{
return _site;
}
set
{
lock (lockObj)
{
_site = value;
}
}
}
/// <summary>
/// 通讯是否已连接
/// </summary>
private bool _net_connected = false;
/// <summary>
/// 通讯是否已连接
/// </summary>
public bool F_NetConnected
{
get
{
return _net_connected;
}
set
{
lock (lockObj)
{
_net_connected = value;
}
}
}
/// <summary>
/// ModbusTcp客户端
/// </summary>
private ModbusTcpNet _client;
/// <summary>
/// ModbusTcp客户端
/// </summary>
public ModbusTcpNet F_ElecClient
{
get
{
return _client;
}
set
{
lock (lockObj)
{
_client = value;
}
}
}
/// <summary>
/// 设备编号
/// </summary>
private string _eqm_code = "001";
/// <summary>
/// 设备编号
/// </summary>
public string F_EqmCode
{
get
{
return _eqm_code;
}
set
{
lock (lockObj)
{
_eqm_code = value;
}
}
}
/// <summary>
/// 设备名称
/// </summary>
private string _eqm_name = "水冷电表";
/// <summary>
/// 设备名称
/// </summary>
public string F_EqmName
{
get
{
return _eqm_name;
}
set
{
lock (lockObj)
{
_eqm_name = value;
}
}
}
/// <summary>
/// 决定去读取参数
/// </summary>
private bool _is_read = true;
/// <summary>
/// 决定去读取参数
/// </summary>
public bool F_IsRead
{
get
{
return _is_read;
}
set
{
lock (lockObj)
{
_is_read = value;
}
}
}
/// <summary>
/// 故障码
/// </summary>
private int _fault_code = 0;
/// <summary>
/// 故障码
/// </summary>
public int F_FaultCode
{
get
{
return _fault_code;
}
set
{
lock (lockObj)
{
_fault_code = value;
}
}
}
/// <summary>
/// 故障报警列表
/// </summary>
private List<int> _fault_alaram_no_list = new List<int>();
/// <summary>
/// 故障报警列表
/// </summary>
public List<int> F_FaultAlarmNoList
{
get
{
return _fault_alaram_no_list;
}
set
{
lock (lockObj)
{
_fault_alaram_no_list = value;
}
}
}
/// <summary>
/// 总有功功率[0031H]
/// </summary>
private UInt16 _total_active_power = 0;
/// <summary>
/// 总有功功率[0031H]
/// </summary>
public UInt16 F_TotalActivePower
{
get
{
return _total_active_power;
}
set
{
lock (lockObj)
{
_total_active_power = value;
}
}
}
/// <summary>
/// 吸收有功电能二次侧
/// </summary>
private float _show_energy;
/// <summary>
/// 吸收有功电能二次侧 003FH0040H(吸收有功电能)
/// </summary>
public float F_ShowEnergy
{
get
{
return _show_energy;
}
set
{
lock (lockObj)
{
_show_energy = value;
}
}
}
/// <summary>
/// 总有功电能二次侧[0052H0053H]
/// </summary>
private float _total_active_energy;
/// <summary>
/// 总有功电能二次侧[0052H0053H]
/// </summary>
public float F_TotalActiveEnergy
{
get
{
return _total_active_energy;
}
set
{
lock (lockObj)
{
_total_active_energy = value;
}
}
}
/// <summary>
/// 电表常用参数结果
/// </summary>
private MEMeterParamResult _emeter_param_result = new MEMeterParamResult();
/// <summary>
/// 电表常用参数结果
/// </summary>
public MEMeterParamResult F_EMeterParamResult
{
get
{
return _emeter_param_result;
}
set
{
lock (lockObj)
{
_emeter_param_result = value;
}
}
}
#endregion 字段属性
#region 类结构体
public EMeterModbus527Tool()
{
if (!HslCommunication.Authorization.SetAuthorizationCode("975a841d-7346-489a-80eb-3b68c8b17df1"))
{
}
if (_client == null)
{
_client = new ModbusTcpNet(_ipaddr, _port);
}
}
/// <summary>
/// 电表类结构体
/// </summary>
/// <param name="ipaddr">服务端连接IP</param>
/// <param name="port">服务端连接端口</param>
public EMeterModbus527Tool(string ipAddr, int port)
{
if (!HslCommunication.Authorization.SetAuthorizationCode("975a841d-7346-489a-80eb-3b68c8b17df1"))
{
}
_ipaddr = ipAddr;
_port = port;
if (_client == null)
{
_client = new ModbusTcpNet(_ipaddr, _port);
}
}
/// <summary>
/// 电表类结构体
/// </summary>
/// <param name="ipaddr">服务端连接IP</param>
/// <param name="port">服务端连接端口</param>
/// <param name="site">从站号</param>
public EMeterModbus527Tool(string ipAddr, int port, byte site)
{
if (!HslCommunication.Authorization.SetAuthorizationCode("975a841d-7346-489a-80eb-3b68c8b17df1"))
{
}
_ipaddr = ipAddr;
_port = port;
_site = site;
if (_client == null)
{
_client = new ModbusTcpNet(_ipaddr, _port);
}
}
/// <summary>
/// 电表类结构体
/// </summary>
/// <param name="ipaddr">服务端连接IP</param>
/// <param name="port">服务端连接端口</param>
/// <param name="site">从站号</param>
/// <param name="devno">设备编号</param>
public EMeterModbus527Tool(string ipAddr, int port, byte site, string devNO)
{
if (!HslCommunication.Authorization.SetAuthorizationCode("975a841d-7346-489a-80eb-3b68c8b17df1"))
{
}
_ipaddr = ipAddr;
_port = port;
_site=site;
_eqm_code = devNO;
if (_client == null)
{
_client = new ModbusTcpNet(_ipaddr, _port, _site);
}
}
/// <summary>
/// 电表类结构体
/// </summary>
/// <param name="ipaddr">服务端连接IP</param>
/// <param name="port">服务端连接端口</param>
/// <param name="site">从站号</param>
/// <param name="devno">设备编号</param>
/// <param name="devname">设备名称</param>
public EMeterModbus527Tool(string ipaddr, int port, byte site, string devno, string devname)
{
if (!HslCommunication.Authorization.SetAuthorizationCode("975a841d-7346-489a-80eb-3b68c8b17df1"))
{
}
_ipaddr = ipaddr;
_port = port;
_site= site;
_eqm_code = devno;
_eqm_name = devname;
if (_client == null)
{
_client = new ModbusTcpNet(_ipaddr, _port);
}
}
#endregion 类结构体
#region 设备连接
/// <summary>
/// ModbusTcp连接
/// </summary>
public void Connect()
{
try
{
if (_client == null)
{
_client = new ModbusTcpNet(_ipaddr, _port, _site);
}
if (_client != null)
{
_client = new ModbusTcpNet(_ipaddr, _port, _site);
OperateResult OptRet = _client.ConnectServer();
if (OptRet.IsSuccess)
{
_net_connected = true;
StartReadParamValueThread();
}
else
{
_net_connected = false;
}
}
}
catch (Exception ex)
{
Log.LogInstance.WriteLog("连接失败" + ex.ToString(), LogType.Run, "电表Log");
}
}
/// <summary>
/// ModbusTcp连接断开
/// </summary>
public void DisConnect()
{
try
{
OperateResult OptRet = _client.ConnectClose();
if (OptRet.IsSuccess)
{
_net_connected = false;
}
}
catch (Exception ex)
{
Log.LogInstance.WriteLog("断开连接失败" + ex.ToString(), LogType.Run, "电表Log");
}
}
#endregion 设备连接
#region 参数读写
/// <summary>
/// 开始读参数值线程
/// </summary>
private void StartReadParamValueThread()
{
Thread readParamValueThread = new Thread(ReadParamValueFunc);
readParamValueThread.IsBackground = true;
readParamValueThread.Start();
}
/// <summary>
/// 读取参数值方法
/// </summary>
private void ReadParamValueFunc()
{
while (_is_read)
{
// var operateResult = _client.Read("x=3;0", 65);
// if (_net_connected && operateResult.IsSuccess)
// {
// var PT = _client.ByteTransform.TransInt16(operateResult.Content, 6);
// var CT = _client.ByteTransform.TransInt16(operateResult.Content, 8);
// //_total_active_power = _client.ByteTransform.TransUInt16(_client.Read("x=3;45", 150).Content, 4);
// //_total_active_energy = _client.ByteTransform.TransSingle(_client.Read("x=3;45", 150).Content, 56) / 1000f;
// var transInt16 = (new decimal(_client.ByteTransform.TransUInt16(operateResult.Content, 126))*65536+_client.ByteTransform.TransUInt16(operateResult.Content, 128)/ new decimal(1000f))*new decimal(PT) *new decimal(CT);
// _show_energy = (float)transInt16;
// MEMeterParamResult paramRlt = new MEMeterParamResult()
// {
// F_EqmCode = _eqm_code,
// F_ShowEnergy=_show_energy,
// F_TotalActivePower = _total_active_power,
// F_TotalActiveEnergy = Convert.ToUInt32(_total_active_energy)
// };
// _emeter_param_result = paramRlt;
// new ElecMeterValToRedis().StoredMeterParamResult(_eqm_code, paramRlt);
// }
var operateResult1 = _client.Read("x=3;0", 10);
var operateResult2 = _client.Read("x=3;63", 10);
if (_net_connected && operateResult1.IsSuccess && operateResult2.IsSuccess)
{
var PT = _client.ByteTransform.TransInt16(operateResult1.Content, 6);
var CT = _client.ByteTransform.TransInt16(operateResult1.Content, 8);
//_total_active_power = _client.ByteTransform.TransUInt16(_client.Read("x=3;45", 150).Content, 4);
//_total_active_energy = _client.ByteTransform.TransSingle(_client.Read("x=3;45", 150).Content, 56) / 1000f;
var transInt16 = (new decimal(_client.ByteTransform.TransUInt16(operateResult2.Content, 0))*65536+_client.ByteTransform.TransUInt16(operateResult2.Content, 2)/ new decimal(1000f))*new decimal(PT) *new decimal(CT);
_show_energy = (float)transInt16;
MEMeterParamResult paramRlt = new MEMeterParamResult()
{
F_EqmCode = _eqm_code,
F_ShowEnergy=_show_energy,
F_TotalActivePower = _total_active_power,
F_TotalActiveEnergy = Convert.ToUInt32(_total_active_energy)
};
_emeter_param_result = paramRlt;
new ElecMeterValToRedis().StoredMeterParamResult(_eqm_code, paramRlt);
}
Thread.Sleep(2000);
}
}
#endregion 参数读写
}
}