Modbus协议采用主从式通信,日常使用较多的是Modbus RTU和Modbus TCP/IP两种。
比较常用的Modbus通信调试软件有ModScan32和ModSim32。
ModScan32主要用来模拟主设备,它可以发送指令到从设备(使用Modbus协议的智能仪表等设备终端),从机响应之后,就可以在界面上返回相应寄存器的数据。
ModSim32用来模拟从设备,它可以模拟采用Modbus协议的智能终端。
在和组态软件交互的过程中,咱们的板子或者软件一般作为从设备,为了了解Modbus协议的具体交互过程,我们今天来使用ModScan32软件和串口助手来调试一下Modbus协议。
实现目标
素材获取
本文相关软件及Modbus协议手册的获取方式在微信交流群内发布。
测试前提
创建一对虚拟串口供调试使用。
我们这里选择COM4和COM5,使用这一对虚拟串口可以实现,COM4发送的数据可以转发至COM5中,反过来,COM5发送的数据可以转发到COM4中,通过这两个COM口可以实现数据的交互。
ModScan32软件使用教程
ModScan32是一个运行在Windows下,作为在RTU或者ASCII传输模式下的Modbus协议主设备的应用程序。
把一个或多个Modbus从站设备通过串口,调制解调器或者网络连接到电脑上,就可以使用ModScan 读取和修改数据点。
打开软件
双击ModScan32.exe打开软件。
软件界面介绍
窗口右上角有两个计数:
Number of Polls: 表示ModScan32软件发送的数据包个数;
Valid Slave Responses: 表示从设备返回的应答个数。
如果这两个计数都在增加,表明数据通讯正常。
连接串口
首先要对安装Modbus设备的串口通信参数进行配置,连接参数,串口选择串口通信的串口,这里选择上面一对虚拟串口中的COM4。
点击协议选择按钮,在弹出对话框中设置Modbus传输模式,我们选择RTU进行测试。
通信参数设置
通信参数包括:起始地址(Address)、Device Id、寄存器长度(Length)及读取的功能代码。
其中MODBUS Point Type(Modbus数据模型)包括以下四种:
根据硬件说明书选择具体的Modbus数据模型。
连接
点击菜单“连接设置”中的“连接”,弹出的界面中配置好通讯参数之后,点击“确定”,建立连接。
使用串口助手调试
查询
主机ModScan32软件发送读从机线圈寄存器当前状态的指令,从机(串口助手模拟从机)收到的数据为:01 01 00 00 00 64 3D E1
此数据包为读取线圈寄存器的指令,具体含义为:
值
从机地址
0x01
功能码
0x01
寻址地址
0x0000
寄存器数量
0x0064
CRC校验码
0x3DE1
应答
正常主机发送一个数据包,我们要在一定时间内,发送一个固定格式的数据包作为应答,否则会提示超时“MODBUS Message TIME-OUT”或者接收的应答格式不正确“Received Invalid Response to MODBUS Query”或者提示校验错误“Checksum Error in Response Message”等提示。
正确的应答包如下:
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。
主机ModScan32软件收到应答之后,寄存器地址0x0004位置的值被修改为0x01,并且Valid Slave Responses计数+1。
将数据的第一个字节0x08用二进制表示为0b0000 1000,正好第四位为1,跟我们应答返回的内容一致。
同理,如果从机返回数据包:01 01 0D FF 00 00 00 00 00 00 00 00 00 00 00 00 E6 53 ,代表寄存器00001~00008的线圈状态都为ON:
主机设置线圈通断状态
请求
修改地址0001的值为0x01的串口数据为:01 05 00 00 FF 00 8C 3A
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到1公众号。
5G切片是新商业模式的关键推动者,也是增强5G潜力的关键概念。通信服务提供商可...
逛个动物园要指纹打卡,连回家进小区也要刷脸验明正身会议期间,记者在浙江代表...
近年来,因高空抛物、坠物造成的伤害事件屡上报端。水瓶、西瓜皮、易拉罐,甚至...
iOS 11~iOS 14.3的越狱工具发布了un0ver6.0.0版本 支持iOS11-iOS 14.3系统设备进...
整个欧洲向智能建筑迈进的步伐正在加快。随着各行各业的组织在客户和员工体验方...
3月15日消息 一年一度的央视财经 3.15 晚会正在进行中,从前言来看主要曝光问题...
5G网络建设加快,超前布局6G 截止目前,我国累计建成的5G基站数量超过71.8万座,...
1.终有那么一个人,可以随时改变着你的心情。 2.有的东西你再喜欢也不会属於你...
人脸解锁扫脸支付随着人脸识别技术的不断发展,如今借助一个小小的摄像头就能让...
1.总有一天,我们会过上我一翻身就可以偷亲你的日子。 2.即使一贫如洗,我会是...