电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
干货 | Modbus协议调试分享
分 享
扫描二维码分享
干货 | Modbus协议调试分享
modbus
RTU
TCP/IP
嵌入式从0到1
关注
发布时间: 2021-03-19
丨
阅读: 3109
Modbus协议采用主从式通信,日常使用较多的是Modbus RTU和Modbus TCP/IP两种。 比较常用的Modbus通信调试软件有ModScan32和ModSim32。 ModScan32主要用来模拟主设备,它可以发送指令到从设备(使用Modbus协议的智能仪表等设备终端),从机响应之后,就可以在界面上返回相应寄存器的数据。 ModSim32用来模拟从设备,它可以模拟采用Modbus协议的智能终端。 在和组态软件交互的过程中,咱们的板子或者软件一般作为从设备,为了了解Modbus协议的具体交互过程,我们今天来使用ModScan32软件和串口助手来调试一下Modbus协议。 ## 实现目标 * 熟悉ModScan32软件的使用 * 串口助手模拟从设备与ModScan32软件进行数据交互 ## 素材获取 本文相关软件及Modbus协议手册的获取方式在微信交流群内发布。 ## 测试前提 创建一对虚拟串口供调试使用。 ![](https://img-blog.csdnimg.cn/20210310151742602.png) 我们这里选择COM4和COM5,使用这一对虚拟串口可以实现,COM4发送的数据可以转发至COM5中,反过来,COM5发送的数据可以转发到COM4中,通过这两个COM口可以实现数据的交互。 ## ModScan32软件使用教程 ModScan32是一个运行在Windows下,作为在RTU或者ASCII传输模式下的Modbus协议主设备的应用程序。 把一个或多个Modbus从站设备通过串口,调制解调器或者网络连接到电脑上,就可以使用ModScan 读取和修改数据点。 ### 打开软件 双击**ModScan32.exe**打开软件。 ### 软件界面介绍 ![](https://img-blog.csdnimg.cn/20210310155658980.png) 窗口右上角有两个计数: **Number of Polls:** 表示ModScan32软件发送的数据包个数; **Valid Slave Responses:** 表示从设备返回的应答个数。 如果这两个计数都在增加,表明数据通讯正常。 ### 连接串口 首先要对安装Modbus设备的串口通信参数进行配置,连接参数,串口选择串口通信的串口,这里选择上面一对虚拟串口中的COM4。 ![](https://img-blog.csdnimg.cn/2021031015591353.png) 点击**协议选择**按钮,在弹出对话框中设置Modbus传输模式,我们选择**RTU**进行测试。 ### 通信参数设置 通信参数包括:起始地址(Address)、Device Id、寄存器长度(Length)及读取的功能代码。 ![](https://img-blog.csdnimg.cn/20210310151836808.png) 其中MODBUS Point Type(Modbus数据模型)包括以下四种: ![](https://img-blog.csdnimg.cn/20210310151848161.png) * **01:COIL STATUS**:读写开关量类型(DO),位操作,可用于设定端口输出状态,或者读取该位的输出状态,常用于电磁阀输出、MOSFET输出、LED显示等; * **02:INPUT STATUS**:读开关量类型(DI),位操作,通过外部设定改变输入状态,可读但是不可写,常用于拨码开关、接近开关等; * **03:HOLDING REGISTER**:保持寄存器,读写WORD类型,字操作,输出参数或者保持参数,控制器运行时被设定的某些参数,可读可写,常用于模拟量输出设定值、PID运行参数、变量阀输出大小、传感器报警上下限等; * **04:INPUT REGISTER**:输入寄存器,读WORD类型,字操作,输入参数,控制器运行时从外部设备获得的参数,可读但是不可写,常用于模拟量输入。 根据硬件说明书选择具体的Modbus数据模型。 ### 连接 点击菜单“**连接设置**”中的“**连接**”,弹出的界面中配置好通讯参数之后,点击“**确定**”,建立连接。 ![](https://img-blog.csdnimg.cn/20210310152342395.png) ### 使用串口助手调试 #### 查询 主机ModScan32软件发送读从机线圈寄存器当前状态的指令,从机(串口助手模拟从机)收到的数据为:**01 01 00 00 00 64 3D E1** 此数据包为读取线圈寄存器的指令,具体含义为: | | 值 | | --- | --- | | 从机地址 | 0x01 | | 功能码 | 0x01 | | 寻址地址 | 0x0000 | | 寄存器数量 | 0x0064 | | CRC校验码 | 0x3DE1 | ![](https://img-blog.csdnimg.cn/20210310151932683.png) #### 应答 正常主机发送一个数据包,我们要在一定时间内,发送一个固定格式的数据包作为应答,否则会提示超时“**MODBUS Message TIME-OUT**”或者接收的应答格式不正确“**Received Invalid Response to MODBUS Query**”或者提示校验错误“**Checksum Error in Response Message**”等提示。 ![](https://img-blog.csdnimg.cn/20210310151941167.png) 正确的应答包如下: **01 01 0D 08 00 00 00 00 00 00 00 00 00 00 00 00 AD E5** | | 值 | | --- | --- | | 从机地址 | 0x01 | | 功能码 | 0x01 | | 返回字节数 | 0x0D | | 数据1 | 0x08 | | 数据2 | 0x00 | | ... | ... | | CRC校验码 | 0xADE5 | 返回字节数N=读取寄存器数量/8,如果余数不为0,则N=N+1。 此实例中读取寄存器的数量为0x64,即100,100/8=12余4,所以N=12+1,即0x0D 。 返回数据的每一位对应线圈状态,1-ON,0-OFF。 每一字节的数据的最低位代表最低地址的线圈状态,如果不够8位,字节高位填充为0。 ![](https://img-blog.csdnimg.cn/2021031015195835.png) 主机ModScan32软件收到应答之后,寄存器地址0x0004位置的值被修改为0x01,并且**Valid Slave Responses**计数+1。 ![](https://img-blog.csdnimg.cn/20210310152011405.png) 将数据的第一个字节**0x08**用二进制表示为0b0000 **1**000,正好第四位为1,跟我们应答返回的内容一致。 同理,如果从机返回数据包:**01 01 0D FF 00 00 00 00 00 00 00 00 00 00 00 00 E6 53** ,代表寄存器00001~00008的线圈状态都为ON: ![](https://img-blog.csdnimg.cn/20210310152112213.png) ## 主机设置线圈通断状态 #### 请求 ![](https://img-blog.csdnimg.cn/20210310152123138.png) 修改地址0001的值为0x01的串口数据为:**01 05 00 00 FF 00 8C 3A** ![](https://img-blog.csdnimg.cn/2021031015213460.png) **MODBUS部分功能码** | 功能码 | 含义 | 寄存器地址 | 位操作/字操作 | 操作数量 | | :---: | :---: | :---: | :---: | :---: | | 01 | 读线圈状态 | 00001-09999 | 位操作 | 单个或多个 | | 02 | 读离散输入状态 | 10001-19999 | 位操作 | 单个或多个 | | 03 | 读保持寄存器 | 40001-49999 | 字操作 | 单个或多个 | | 04 | 读输入寄存器 | 30001-39999 | 字操作 | 单个或多个 | | 05 | 写单个线圈 | 00001-09999 | 位操作 | 单个 | | 06 | 写单个保持寄存器 | 40001-49999 | 字操作 | 单个 | | 15 | 写多个线圈 | 00001-09999 | 位操作 | 多个 | | 16 | 写多个保持寄存器 | 40001-49999 | 字操作 | 多个 | 功能码可以分为位操作和字操作两类。位操作的最小单位为bit,字操作的最小单位为WORD(两个字节)。 由上表可知,主机修改某个寄存器的值的功能码为:**0x05**,即写单个线圈,写单个线圈的数据包的结构为: | | 值 | | --- | --- | | 从机地址 | 0x01 | | 功能码 | 0x05 | | 输出地址 | 0x0000 | | 输出值 | 0xFF00 | | CRC校验码 | 0x8C3A | **注意**:设置某个线圈值为ON的话,该值为0xFF00,设置线圈值为OFF的话,该值为0x0000。 #### 应答 响应跟请求是一样的数据包:**01 05 00 00 FF 00 8C 3A** | | 值 | | --- | --- | | 从机地址 | 0x01 | | 功能码 | 0x05 | | 输出地址 | 0x0000 | | 输出值 | 0xFF00 | | CRC校验码 | 0x8C3A | ## 总结 其实直接使用ModSim32软件作为从机,ModScan32软件作为主机,二者进行数据通讯,这样调试起来最便利了。 不过我们做这个演示的目的是了解ModScan32软件的工作过程,如果使用ModSim32软件,看不明白工作过程。 使用串口助手的话,对于整个工作的过程比较清晰,也方便我们下一步自己编写Modbus从机软件。 ## 欢迎关注 专注于嵌入式知识分享,让你学习路上不迷路,更多技术干货,请关注【嵌入式从0到1】。 ##### 声明:此软件仅供学习使用,请支持正版。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式从0到1
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交