Modbus RTU 协议 模拟 测试

冒着摸鱼被抓的风险写博客,转载请保留本文地址



模拟工具

模拟工具选用

模拟前准备

  1. 下载Configure Virtual Serial Port Driver,该工具用于创建一对虚拟窗口,代表一根RS232线,博主虚拟了COM1和COM2
  2. 关于COM1和COM2, 任何一头用于ModbusSlave,另一头是串口模拟工具,将用于模拟,Up主将Slave监听于COM1

模拟工具选用 Modbus Slave

模拟工具用法

  1. 点击Connection
  2. 连接方式选择串口,串口协议自己定义,当前默认

Modbus Slave 如何设置寄存器数量

  1. 点击SetUp, 点击Slave Denifinition
  2. 弹出画面可以修改设备站点号 1,Function选择03,Holding Register,寄存器地址自定义,博主将修改
    成0-30,并可以选择默认寄存器显示行数,现在10行点击OK

Modbus Slave 修改数据显示

  1. 可以选择列,也可以选择单元格, 右键Format,点击Signed(有符号10进制),UnSigned(无符号10进制),Hex(16进制),Binary(2进制)
  2. Alias 可填入列名, 点击单元格键入数字会弹出修改框

Modbus Slave 如何查看发送指令与回复指令

点击Display,点击Communication

命令发送工具

命令发送工具选用通用串口工具,目前用的是串口工具调试助手,虚拟COM队是COM1<->COM2,COM1用于Slave,那串口工具调试只能用于COM2

指令如何发送,如下将发送指令01 01 48 00 00 10 2A 66,记得勾选16进制发送,16进制显示

Modbus RTU命令的CRC校验符说明,

  1. 用于校验命令完整性,网上由生成CRC的C#代码,和页面工具,先已下图命令说明
    01 01 48 00 00 10 2A 66中01 01 48 00 00是指令,2A 66是CRC校验码
  2. 可以在http://www.ip33.com/crc.html中获取CRC校验码,记得选择CRC-16/Modbus,而且生成的CRC是颠倒的,66 2A

测试已知命令

1. 01 功能码:读取线圈状态

读取线圈状态,读取一组逻辑线圈的当前状态(ON/OFF)。


测试结果,好像与实际说明不匹配,推测我没找到线圈模拟或者是Slave没有模拟线圈

RX:01 01 48 00 00 10 2A 66
TX:01 81 01 81 90 

参考




异常响应(81 01)

功能码 1个字节 0x81
异常码 1个字节 01,02,03,04

2. 02 功能码:读取输入状态

读取输入状态,读取一组开关输入的当前状态(ON/OFF),对应人机界面上地址类型IX,只读类型


测试结果,返回结果好像与实际说明不匹配,Slave没有开关?

RX:01 02 00 10 00 10 78 03
TX:01 82 01 81 60 

参考






异常响应(82 01)

功能码 1个字节 0x82
异常码 1个字节 01,02,03,04

3. 03 功能码:读取保持寄存器

读取保持寄存器,在一个或多个保持寄存器中取得当前二进制,对应人机界面上地址类型4X


特地到Slave中键入寄存器值

输出结果,与图片中符合

RX:01 03 00 00 00 04 44 09
TX:01 03 08 00 04 00 05 00 01 00 02 CC 16 

参考





异常响应(83 01)

功能码 1个字节 0x83
异常码 1个字节 01,02,03,04

4. 04 功能码:读取输入寄存器

读取输人寄存器,在一个或多个输入寄存器中取得当前二进制值,对应人机界面上地址类型3X,只读类型。


暂时不修改上图的4512

输出结果,好像不符合

RX:01 04 00 00 00 04 F1 C9
TX:01 84 01 82 C0 

参考

异常响应(84 01)

功能码 1个字节 0x84
异常码 1个字节 01,02,03,04

5. 05 功能码:强制(写)单线圈

强制(与)单线圈,强制(与)一个逻辑线圈的通断状态(ON/OFF),对应人机界面上地址类型OX。


输出结果,好像不符合

RX:01 05 48 00 FF 00 9B 9A
TX:01 85 01 83 50 
RX:01 05 48 00 00 00 DA 6A
TX:01 85 01 83 50

参考





异常响应(85 01)

功能码 1个字节 0x85
异常码 1个字节 01,02,03,04

6. 06 功能码,预置(写)单寄存器

预置(写)单寄存器,把具体二进制值写入一个保持寄存器,对应人机界面上地址类型4X.


与返回的符合

RX:01 06 00 00 00 08 88 0C
TX:01 06 00 00 00 08 88 0C 

参考





异常响应(86 01):

功能码 1个字节 0x86
异常码 1个字节 01,02,03,04

7. 07 OF功能码:强制(写)多线圈

强制〔写)多线,强制(写)一串连续逻辑线圈的通断状态(ON/OFF),对应人机界面上地址类型0X



与返回不符合

RX:01 0F 48 00 00 09 02 FF 01 AD 48
TX:01 8F 01 85 F0 
RX:01 0F 48 00 00 09 02 00 00 2D 78
TX:01 8F 01 85 F0 

参考





异常响应(8F 01)

功能码 1个字节 0x8F
异常码 1个字节 01,02,03,04

08. 10功能码:预置(写)多寄存器

预置(写)多寄存器,把具体二进制值与入一串连续的保持寄存器,对应人机界面地址类型4X


与返回符合

RX:01 10 00 00 00 03 06 00 0A 00 0B 00 0C 0F 46
TX:01 10 00 00 00 03 80 08 

参考





异常响应(90 01):

功能码 1个字节 0x90
异常码 1个字节 01,02,03,04

错误代码表

代码 名称 含义
01 非法功能 对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作,可能是因为功能码仅适用于新设备而被选单元中不可实现同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:它是未配置的,且要求返回寄存器值。
02 非法数据地址 对于服务器(或从站)来说,询问中接收的数据地址是不可允许的地址,特别是参考号和传输长度的组合是无效的。对于带有100个寄存器的控制器来说,偏移量96和长度4的请求会成功,而偏移量96和长度5的请求将产生异常码02。
03 非法数据值 对于服务器(或从站)来说,询问中包括的值是不可允许的值。该值指示了组合请求剩余结构中的故障。例如:隐含长度是不正确的。modbus协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。
04 从站设备故障 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。
05 确认 与编程命令一起使用,服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长持续时间进行这些操作,返回这个响应防止在客户机(或主站)中发生超时错误,客户机(或主机)可以继续发送轮询程序完成报文来确认是否完成处理。
06 从属设备忙 与编程命令一起使用,服务器(或从站)正在处理长持续时间的程序命令,当服务器(或从站)空闲时,客户机(或主站)应该稍后重新传输报文。
07 存储奇偶性差错 与功能码20和21以及参考类型6一起使用,指示扩展文件区不能通过一致性校验。服务器(或从站)设备读取记录文件,但在存储器中发现一个奇偶校验错误。客户机(或主机)可重新发送请求,但可以在服务器(或从站)设备上要求服务。
0A 不可用网关路径 与网关一起使用,指示网关不能为处理请求分配输入端口值输出端口的内部通信路径,通常意味着网关是错误配置的或过载的。
0B 网关目标设备响应失败 与网关一起使用,指示没有从目标设备中获得响应,通常意味着设备未在网络中。

测试结果

功能码 名称 示例指令 返回 结果
01 读取线圈状态 01 01 48 00 00 10 2A 66 01 81 01 81 90 NG
02 读取输入状态 01 02 00 10 00 10 78 03 01 82 01 81 60 NG
03 读取保持寄存器 01 03 00 00 00 04 44 09 01 03 08 00 04 00 05 00 01 00 02 CC 16 OK
04 读取输入寄存器 01 04 00 00 00 04 F1 C9 01 84 01 82 C0 NG
05 强制(写)单线圈 01 05 48 00 FF 00 9B 9A 01 85 01 83 50 NG
05 强制(写)单线圈 01 05 48 00 00 00 DA 6A 01 85 01 83 50 NG
06 预置(写)单寄存器 01 06 00 00 00 08 88 0C 01 06 00 00 00 08 88 0C OK
OF 强制(写)多线圈 01 0F 48 00 00 09 02 FF 01 AD 48 01 8F 01 85 F0 NG
OF 强制(写)多线圈 01 0F 48 00 00 09 02 00 00 2D 78 01 8F 01 85 F0 NG
10 预置(写)多寄存器 01 10 00 00 00 03 06 00 0A 00 0B 00 0C 0F 46 01 10 00 00 00 03 80 08 OK

引用链接

https://blog.csdn.net/weixin_44907956/article/details/100630317?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-4.control&spm=1001.2101.3001.4242
https://blog.csdn.net/ouyangxin95/article/details/78174071
https://blog.csdn.net/weixin_46304253/article/details/107960184

没有标记转载的情况下,如果有更好的优化麻烦电邮1808937496@qq.com或者留言答复,Thank You
原文地址:https://www.cnblogs.com/wandia/p/15243120.html