Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
            }
        }