modbus测试工具

有时候,modbus读数程序写好了,需要测试一下,这个时候突然会感觉好麻烦哦,工业环境不可能搬我们办公室的,到现场去测试,去不方便,环境不允许经常测试来测试去。于是乎,自己写了一个模拟modbus程序。

#region modbus 数据
        /// <summary>
        /// 
        /// 00 00 00 00 00 06 01 03 00 00 00 05
        /// </summary>
        /// <param name="rData"></param>
        /// <returns>00 00 00 00 00 0d  01  03  0A 14 00  14 00  14 00  14 00  14 00</returns>
        public static byte[] GetData(byte[] rData, DataTable dt)
        {
            //请求设备数
            int len = 256 * Convert.ToInt32(rData[10]) + Convert.ToInt32(rData[11]);
            if (len > 255)
            {
                return GetErrorData();
            }

            //请求开始地址
            int address = 256 * Convert.ToInt32(rData[8]) + Convert.ToInt32(rData[9]);
            short id = Convert.ToInt16(rData[6]);

            List<byte> sendData = new List<byte>(255);
            //标示符号
            sendData.Add(rData[0]);
            sendData.Add(rData[1]);

            //sendData.Add(rData[1]);//标示符号
            //地址域
            sendData.AddRange(new Byte[] { 0x00, 0x00 }); //TCP协议
            //长度 两个字节
            byte[] b1 = ValueHelper.Instance.GetBytes(Convert.ToInt16(2 * len +3));
            sendData.AddRange(b1); //返回字节数组@总长度
            sendData.Add(Convert.ToByte(id));//域号 设备ID

            //功能码 
            sendData.Add((byte)3);  //功能码 3-读
            //byte[] b2 = ValueHelper.Instance.GetBytes(Convert.ToInt16(2 * len));
            //一个字节
            sendData.Add(Convert.ToByte(2 * len)); //返回数据字节长度
            //sendData.AddRange(t);

            SetData(sendData,id,address, len, dt);

            byte[] datas = sendData.ToArray();

            return datas;
        }

        private static void SetData(List<byte> sendData,short id,int address, int len,DataTable dt)
        {
            string AlarmType = ConfigHelper.GetConfigFileName("AlarmType");
            int d = 0x1400;
            bool _Odd = IsOdd();

            for (int i = 0; i < len; i++)
            {
                d = 0x1400;
                int add = address + i;
                
                if (AlarmType == "1")
                {
                    d = _Odd ? 0x0c10 : 0x1400;
                }
                else
                {
                    string filter = string.Concat("id='", id, "' and address='", add, "'");
                    if (dt != null && dt.Rows.Count > 0 && dt.Select(filter).Length > 0)
                    {
                        DataRow dr = dt.Select(filter)[0];
                        d = (Convert.ToString(dr["flag"]) == "报警") ? 0x0c10 : 0x3400; //3088

                        string tempId = string.Concat(id, "-", add);
                        if (AlarmId != tempId)
                        {
                            AlarmId = tempId;
                            Blank.Log.LogHelper.WriteLog(string.Concat(id, "-", add, "  ", d));
                        }
                    }
                }

                byte[] temp = ValueHelper.Instance.GetBytes(Convert.ToInt16(d));

                sendData.AddRange(temp);
            }
        }

        private static bool IsOdd()
        {
            int i = DateTime.Now.Second;
            return Convert.ToBoolean(i & 1);
        } 
        #endregion

   ServiceTest.exe 执行程序,打开的端口号就是modbus 默认端口号502。

    绿色软件,无需安装,编写语言 C# 

   发送那个设备号的数据过来,发送什么数据过去

   右边表格里面的数据是报警数据,报警规则就是换成二进制16位,第13位是1就是报警。

上一篇:关于Java 如何采用 metadata-extractor 读取数码相机 Exif 数据信息的代码


下一篇:python之网络编程