冒着摸鱼被抓的风险写博客,转载请保留本文地址
模拟工具
模拟工具选用
模拟前准备
- 下载Configure Virtual Serial Port Driver,该工具用于创建一对虚拟窗口,代表一根RS232线,博主虚拟了COM1和COM2
- 关于COM1和COM2, 任何一头用于ModbusSlave,另一头是串口模拟工具,将用于模拟,Up主将Slave监听于COM1
模拟工具选用 Modbus Slave
模拟工具用法
- 点击Connection
- 连接方式选择串口,串口协议自己定义,当前默认
Modbus Slave 如何设置寄存器数量
- 点击SetUp, 点击Slave Denifinition
- 弹出画面可以修改设备站点号 1,Function选择03,Holding Register,寄存器地址自定义,博主将修改
成0-30,并可以选择默认寄存器显示行数,现在10行点击OK
Modbus Slave 修改数据显示
- 可以选择列,也可以选择单元格, 右键Format,点击Signed(有符号10进制),UnSigned(无符号10进制),Hex(16进制),Binary(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校验符说明,
- 用于校验命令完整性,网上由生成CRC的C#代码,和页面工具,先已下图命令说明
01 01 48 00 00 10 2A 66中01 01 48 00 00是指令,2A 66是CRC校验码
- 可以在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