using HslCommunication; using HslCommunication.ModBus; using Monitor.LogService; using System; using System.Collections.Generic; using System.Threading; namespace Module.HMeter.ModBusTcp { public class HumiMeterModbusTool { #region 定义锁 private object lockObj = new object(); //线程同步锁 #endregion 定义锁 #region 字段属性 /// /// 服务端连接IP /// private string _ipaddr = "172.0.30.100"; /// /// 服务端连接IP /// public string F_IpAddr { get { return _ipaddr; } set { lock (lockObj) { _ipaddr = value; } } } /// /// 服务端连接端口 /// private int _port = 502; /// /// 服务端连接端口 /// public int F_Port { get { return _port; } set { lock (lockObj) { _port = value; } } } /// /// 从站号 /// private byte _site = 0x01; /// /// 从站号 /// public byte F_Site { get { return _site; } set { lock (lockObj) { _site = value; } } } /// /// 通讯是否已连接 /// private bool _net_connected = false; /// /// 通讯是否已连接 /// public bool F_NetConnected { get { return _net_connected; } set { lock (lockObj) { _net_connected = value; } } } /// /// ModbusTcp客户端 /// private ModbusTcpNet _client; /// /// ModbusTcp客户端 /// public ModbusTcpNet F_ElecClient { get { return _client; } set { lock (lockObj) { _client = value; } } } /// /// 设备编号 /// private string _eqm_code = "001"; /// /// 设备编号 /// public string F_EqmCode { get { return _eqm_code; } set { lock (lockObj) { _eqm_code = value; } } } /// /// 设备名称 /// private string _eqm_name = "温湿度仪表"; /// /// 设备名称 /// public string F_EqmName { get { return _eqm_name; } set { lock (lockObj) { _eqm_name = value; } } } /// /// 决定去读取参数 /// private bool _is_read = true; /// /// 决定去读取参数 /// public bool F_IsRead { get { return _is_read; } set { lock (lockObj) { _is_read = value; } } } /// /// 故障码 /// private int _fault_code = 0; /// /// 故障码 /// public int F_FaultCode { get { return _fault_code; } set { lock (lockObj) { _fault_code = value; } } } /// /// 故障报警列表 /// private List _fault_alaram_no_list = new List(); /// /// 故障报警列表 /// public List F_FaultAlarmNoList { get { return _fault_alaram_no_list; } set { lock (lockObj) { _fault_alaram_no_list = value; } } } /// /// 温湿度常用参数结果 /// private MHumiParamResult _humi_param_result = new MHumiParamResult(); /// /// 温湿度常用参数结果 /// public MHumiParamResult F_HumiParamResult { get { return _humi_param_result; } set { lock (lockObj) { _humi_param_result = value; } } } #endregion 字段属性 #region 类结构体 public HumiMeterModbusTool() { if (_client == null) { _client = new ModbusTcpNet(_ipaddr, _port); } } /// /// 温湿度仪表类结构体 /// /// 服务端连接IP /// 服务端连接端口 public HumiMeterModbusTool(string ipAddr, int port) { _ipaddr = ipAddr; _port = port; if (_client == null) { _client = new ModbusTcpNet(_ipaddr, _port); } } /// /// 温湿度仪表类结构体 /// /// 服务端连接IP /// 服务端连接端口 /// 从站号 public HumiMeterModbusTool(string ipAddr, int port, byte site) { _ipaddr = ipAddr; _port = port; _site = site; if (_client == null) { _client = new ModbusTcpNet(_ipaddr, _port); } } /// /// 温湿度仪表类结构体 /// /// 服务端连接IP /// 服务端连接端口 /// 从站号 /// 设备编号 public HumiMeterModbusTool(string ipAddr, int port, byte site, string devNO) { _ipaddr = ipAddr; _port = port; _site = site; _eqm_code = devNO; if (_client == null) { _client = new ModbusTcpNet(_ipaddr, _port); } } /// /// 温湿度仪表类结构体 /// /// 服务端连接IP /// 服务端连接端口 /// 从站号 /// 设备编号 /// 设备名称 public HumiMeterModbusTool(string ipaddr, int port, byte site, string devno, string devname) { _ipaddr = ipaddr; _port = port; _site = site; _eqm_code = devno; _eqm_name = devname; if (_client == null) { _client = new ModbusTcpNet(_ipaddr, _port); } } #endregion 类结构体 #region 设备连接 /// /// ModbusTcp连接 /// 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"); } } /// /// ModbusTcp连接断开 /// 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 参数读写 /// /// 开始读参数值线程 /// private void StartReadParamValueThread() { Thread readParamValueThread = new Thread(ReadParamValueFunc); readParamValueThread.IsBackground = true; readParamValueThread.Start(); } /// /// 读取参数值方法 /// private void ReadParamValueFunc() { while (_is_read) { if (_net_connected) { OperateResult readResult = _client.Read("x=3;0",8); if (readResult.IsSuccess) { byte[] byteResult = readResult.Content; UInt16 tempVal = _client.ByteTransform.TransUInt16(byteResult, 0); UInt16 humiVal = _client.ByteTransform.TransUInt16(byteResult, 2); MHumiParamResult paramRlt = new MHumiParamResult() { F_TempValue = (float)tempVal/10, F_HumiValue = (float)humiVal/10 }; //new HumiMeterValueToRedis().StoredHumiParamValue(_eqm_code, paramRlt); _humi_param_result = paramRlt; } } Thread.Sleep(2000); } } #endregion 参数读写 } }