public ModbusTCPResponseBody WriteModbusTCPData(ModbusTCPWriteDataBody writeInfo) { ModbusTCPResponseBody response = new ModbusTCPResponseBody(); response.ServerID = writeInfo.ServerID; response.DeviceAddr = writeInfo.DeviceAddr; response.ErrorMessage = string.Empty; response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); response.DataContent = string.Empty; ModbusTcpClientHost mbTcpClientHost = HostContainer.GetModbusTcpClientHostByServerID(writeInfo.ServerID); if (mbTcpClientHost == null) { response.ErrorMessage = string.Format("数据采集服务未启动或未成功连接至Modbus TCP数据服务器"); response.Status = "0"; return(response); } response.DeviceAddr = mbTcpClientHost.DevAddr.ToString(); try { mbTcpClientHost.WriteModbusTCPData(writeInfo.WriteData); response.Status = "1"; } catch (CustomException cex) { response.DataContent = null; response.DataLength = "0"; response.ErrorMessage = cex.Message; response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); response.Status = ((int)cex.ExceptionCode).ToString(); } catch (Exception ex) { response.DataContent = null; response.DataLength = "0"; response.ErrorMessage = ex.Message; response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); response.Status = "0"; } return(response); }
public ModbusTCPResponseBody RequestModbusTCPData(ModbusTCPRequestBody request) { ModbusTCPResponseBody response = new ModbusTCPResponseBody(); response.ServerID = request.ServerID; response.DeviceAddr = request.DeviceAddr; response.FunctionCode = request.FunctionCode; response.ErrorMessage = string.Empty; response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); ModbusTcpClientHost mbTcpClientHost = HostContainer.GetModbusTcpClientHostByServerID(request.ServerID); if (mbTcpClientHost == null) { response.ErrorMessage = string.Format("数据采集服务未启动或未成功连接至Modbus TCP数据服务器"); response.Status = "3"; return(response); } response.DeviceAddr = mbTcpClientHost.DevAddr.ToString(); string returnFormat = "string"; if (request.ReturnFormat != null && request.ReturnFormat.ToLower().Trim() == "json") { returnFormat = "json"; } byte functCode; if (!byte.TryParse(request.FunctionCode, out functCode)) { response.ErrorMessage = string.Format("功能代码[{0}]无效", request.FunctionCode); response.Status = "2"; return(response); } List <ModbusTCPRequestAddress> addrs = new List <ModbusTCPRequestAddress>(); if (request.RequestAddrs != null) { try { JavaScriptSerializer jss = new JavaScriptSerializer(); //ModbusTCPRequestAddress addr = (ModbusTCPRequestAddress)jss.Deserialize(request.RequestAddrs, typeof(ModbusTCPRequestAddress)); //addrs.Add(addr); addrs = jss.Deserialize <List <ModbusTCPRequestAddress> >(request.RequestAddrs); } catch (Exception) { } /* * for (int i = 0; i < request.RequestAddrs.Length; i++) * { * ModbusTCPRequestAddress addr = new ModbusTCPRequestAddress(); * addr.StartAddr = request.RequestAddrs[i].StartAddr; * addr.RegCount = request.RequestAddrs[i].RegCount; * addrs.Add(addr); * } */ } else { ModbusTCPRequestAddress addr = new ModbusTCPRequestAddress(); addr.StartAddr = request.StartAddr; addr.RegCount = request.RegCount; addrs.Add(addr); /* * ushort startAddr; * if (!ushort.TryParse(request.StartAddr, out startAddr)) * { * response.ErrorMessage = string.Format("起始地址[{0}]无效", request.StartAddr); * response.Status = "0"; * return response; * } * * ushort regCount; * if (!ushort.TryParse(request.RegCount, out regCount)) * { * response.ErrorMessage = string.Format("读取地址数量[{0}]无效", request.RegCount); * response.Status = "0"; * return response; * } */ } try { //string respCRC = string.Empty; string dataContent = string.Empty; string tempDataContent = string.Empty; int dataLen = 0; int tempDataLen = 0; foreach (ModbusTCPRequestAddress addr in addrs) { switch (functCode) { case 1: tempDataContent = mbTcpClientHost.RequestModbusTcpCoilStatus(addr.StartAddr, addr.RegCount, returnFormat); tempDataLen = addr.RegCount * 2; break; case 3: tempDataContent = mbTcpClientHost.RequestModbusTcpData(addr.StartAddr, addr.RegCount, returnFormat); tempDataLen = addr.RegCount * 2; break; default: break; } if (dataContent == string.Empty) { dataContent = tempDataContent; } else { dataContent = dataContent + "," + tempDataContent; } dataLen = dataLen + tempDataLen; } response.DataContent = dataContent; response.DataLength = dataLen.ToString(); response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); response.Status = "1"; } catch (CustomException cex) { response.DataContent = null; response.DataLength = "0"; response.ErrorMessage = cex.Message; response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); response.Status = ((int)cex.ExceptionCode).ToString(); } catch (Exception ex) { response.DataContent = null; response.DataLength = "0"; response.ErrorMessage = ex.Message; response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); response.Status = "0"; } return(response); }
private void StartModbusTcpClients() { try { string serversConfig = System.Configuration.ConfigurationManager.AppSettings["modbustcp"]; if (serversConfig.Trim() == string.Empty) { return; } string sWaitTime = System.Configuration.ConfigurationManager.AppSettings["interval"]; uint waitTime; if (!uint.TryParse(sWaitTime, out waitTime)) { waitTime = 500; } string sRetryTimes = System.Configuration.ConfigurationManager.AppSettings["retrytimes"]; int retryTimes; if (!int.TryParse(sRetryTimes, out retryTimes) || retryTimes < 0) { retryTimes = 3; } JavaScriptSerializer jss = new JavaScriptSerializer(); List <DataServerConfig> serverCfgList = jss.Deserialize <List <DataServerConfig> >(serversConfig); foreach (DataServerConfig serverCfg in serverCfgList) { Thread.Sleep(1000); if (serverCfg.ServerID.Trim() == string.Empty) { ServiceLog.Warn(string.Format("Modbus TCP 服务器标识符[{0}]无效", serverCfg.ServerID)); continue; } IPAddress ip; if (!IPAddress.TryParse(serverCfg.IP, out ip)) { IPAddress[] ips = Dns.GetHostAddresses(serverCfg.IP); if (ips.Length == 0) { ServiceLog.Warn(string.Format("Modbus TCP 服务器IP地址[{0}]无效", serverCfg.IP)); continue; } else { foreach (IPAddress tempip in ips) { if (!tempip.IsIPv6LinkLocal && !tempip.IsIPv6Multicast && !tempip.IsIPv6SiteLocal) { ip = tempip; break; } } if (ip == null) { ServiceLog.Warn(string.Format("Modbus TCP 服务器IP地址[{0}]无效", serverCfg.IP)); continue; } } //ServiceLog.LogServiceMessage(string.Format("Modbus TCP 服务器IP地址[{0}]无效", serverCfg.IP)); //continue; } ushort port; if (!ushort.TryParse(serverCfg.Port, out port)) { ServiceLog.Warn(string.Format("Modbus TCP 服务器端口[{0}]无效", serverCfg.Port)); continue; } byte devAddr; if (!byte.TryParse(serverCfg.DevAddr, out devAddr)) { devAddr = 1; } try { ModbusTcpClientHost mbTcpClientHost = new ModbusTcpClientHost(serverCfg.ServerID, ip, port, devAddr, waitTime, retryTimes); Thread thread = new Thread(new ThreadStart(mbTcpClientHost.Run)); thread.IsBackground = true; thread.Start(); } catch (Exception ex) { ServiceLog.Error(string.Format("启动 Modbus TCP 数据采集服务[{0} {1}:{2}]线程时发生错误:{3}", serverCfg.ServerID, serverCfg.IP, serverCfg.Port, ex.Message)); } } } catch (Exception ex) { ServiceLog.Warn(string.Format("获取 Modbus TCP 数据采集服务配置时发生错误:{0}", ex.Message)); } }