예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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));
            }
        }