public ModbusRTUResponseBody RequestModbusRTUData(ModbusRTURequestBody request) { ModbusRTUResponseBody response = new ModbusRTUResponseBody(); 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"); ModbusRtuTcpServerHost tcpServerHost = HostContainer.GetModbusRtuTcpServerHostByServerID(request.ServerID); if (tcpServerHost == null) { response.ErrorMessage = string.Format("数据采集服务未启动或未成功连接数据源"); response.Status = "0"; return(response); } byte devAddr; if (!byte.TryParse(request.DeviceAddr, out devAddr)) { response.ErrorMessage = string.Format("设备地址[{0}]无效", request.DeviceAddr); response.Status = "0"; return(response); } byte funcCode; if (!byte.TryParse(request.FunctionCode, out funcCode)) { response.ErrorMessage = string.Format("功能代码[{0}]无效", request.FunctionCode); response.Status = "0"; return(response); } 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; response.DataContent = tcpServerHost.RequestModbusRTUData(devAddr, funcCode, startAddr, regCount, out respCRC); response.DataLength = (regCount * 2).ToString(); response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); response.ResponseCRC = respCRC; response.Status = "1"; } catch (Exception ex) { response.DataContent = null; response.DataLength = "0"; response.ErrorMessage = ex.Message; response.Status = "0"; response.ResponseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } return(response); }
private void StartModbusRtuTcpServers() { //启动ModbusRTUTCP服务Socket try { string serversConfig = System.Configuration.ConfigurationManager.AppSettings["modbusrtutcp"]; 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(); //{SN:001,IP:172.16.1.2,PORT:6008} //{"SN":"001","IP":"172.16.1.2","PORT":"6008"} //DataServerConfig dsCfg = jss.Deserialize<DataServerConfig>("{'SN':'001','IP':'172.16.1.2','PORT':'6008'}"); 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 RTU 数据采集服务器标识符[{0}]无效", serverCfg.ServerID)); continue; } IPAddress ip; if (!IPAddress.TryParse(serverCfg.IP, out ip)) { ServiceLog.Warn(string.Format("Modbus RTU 数据采集服务器IP地址[{0}]无效", serverCfg.IP)); continue; } ushort port; if (!ushort.TryParse(serverCfg.Port, out port)) { ServiceLog.Warn(string.Format("Modbus RTU 数据采集服务器端口[{0}]无效", serverCfg.Port)); continue; } try { ModbusRtuTcpServerHost tcpSvrHost = new ModbusRtuTcpServerHost(serverCfg.ServerID, ip, port, waitTime, retryTimes); Thread thread = new Thread(new ThreadStart(tcpSvrHost.Run)); thread.IsBackground = true; thread.Start(); } catch (Exception ex) { ServiceLog.Error(string.Format("启动 Modbus RTU 数据采集服务[{0} {1}:{2}]线程时发生错误:{3}", serverCfg.ServerID, serverCfg.IP, serverCfg.Port, ex.Message)); } } } catch (Exception ex) { ServiceLog.Warn(string.Format("获取 Modbus RTU 数据采集服务配置时发生错误:{0}", ex.Message)); } }