目录:
一、报文交互举例
二、ModBus-RTU报文模型
三、ModBus-RTU常用功能码
四、寄存器起始数据地址
五、ModBus-RTU报文
六、VSPD9.0调试ModBus
1、使用环境
2、项目说明
3、Modbus Poll和Modbus Slave软件介绍
4、软件使用
5、目标连接
6、通讯开始
7、安装包获取
8、注意事项
9、解决COM端口被占用
主站发送报文 | 地址 | 功能码 | 寄存器起始地址 | 读取数据长度 | CRC校验码 | |||
| 01 | 03 | 01 | 00 | 00 | 02 | C5 | F7 |
说明 | 设备地址 | 设备的规约或点表查看(遥信、遥测、遥控) | 从设备的:0x0100H 寄存器读取遥信状态,可以在规约或寄存器点表中查看。 | 读取:0x0100H、0x0101H 两个寄存器数据,一共读取32个遥信位置。 | 可通过串口软件自动计算出 |
主站接受报文 | 地址 | 功能码 | 数据长度 | 寄存器1状态0100H | 寄存器2状态0101H | CRC校验码 | |||
| 01 | 03 | 04 | 03 | 43 | 00 | 00 | 0B | A3 |
说明 | 设备地址 | 设备的规约或点表查看 | 表示收到4个数据 | 高位状态 | 低位状态 | 高位 | 低位 | 设备自动计算出 |
二、ModBus-RTU报文模型
功能码与数据分类
设备地址 | 功能代码 | 数据格式 | CRC校验L | CRC校验H |
8bit | 8bit | N*8bit | 8bit | 8bit |
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。
主机对从机写数据操作
如果单片机接收到一个报文那么就对报文进行解析执行相应的处理
0x01 | 06 | 00 01 | 00 17 | 98 04 |
从机地址 | 功能号 | 数据地址 | 数据 | CRC校验 |
主机对从机读数据操作
0x01 | 03 | 00 01 | 00 01 | D5 CA |
从机地址 | 功能号 | 数据地址 | 读取数据个数 | CRC校验 |
单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:
从机对主机返回内容
0x01 | 03 | 02 | 00 17 | F8 4A |
从机地址 | 功能号 | 数据字节个数 | 两个字节数据 | CRC校验 |
这样MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。
三、ModBus-RTU常用功能码
数据类型 | 读功能码 | 写功能码 | 对象类型 |
离散量输入 | 02 | 单个位 | |
线圈状态 | 01 | 05,15 | 单个位 |
输入寄存器 | 04 | 16位字 | |
保持寄存器 | 03 | 06,16 | 16位字 |
四、寄存器起始数据地址
数据类型 | 参数地址,寄存器编号 |
离散量输入 | 00001~0FFFF |
线圈状态 | 10001~1FFFF |
输入寄存器 | 30001~3FFFF |
保持寄存器 | 40001~4FFFF |
五、ModBus-RTU报文
Modbus协议中寄存器地址从1开始,而实际存储中地址从0开始。假如要读取寄存器编号为40005(4为块编号,5为modbus中寄存器地址)的寄存器的数据,则应把00 04放入报文的地址域。寄存器定义,又名码表或者信息点表,应由厂家提供的。CD 是随便写的,没任何意义。
寄存器编号 | 属性 | 定义 | 系数 | 备注 |
40001 | RO | A相电压 |
| 从40048中读取电压系数 |
40002 | RO | B相电压 |
|
如要读A相电压,则应将0x00 0x00放入寄存器起始地址域中。
报文实例
1)读40005、40006两个寄存器,假设从机地址为1
下行报文:01 03 00 04 00 02 85 CA
从机地址 | 功能码 | 寄存器起始地址 | 读取寄存器个数 | CRC校验 |
01 | 03 | 00 04 | 00 02 | 85 CA |
上行报文:01 03 04 00 00 00 00 21 33
从机地址 | 功能码 | 返回字节个数 | 寄存器40005数据 | 寄存器40006数据 | CRC校验 |
01 | 03 | 04 | 00 00 | 00 00 | 21 33 |
---------------------------
2)向40005寄存器中写入0x12,0x34,假设从机地址为1
下行报文:01 06 00 04 00 01 12 34 4A B0
从机地址 | 功能码 | 寄存器起始地址 | 读取寄存器个数 | 要写入的数据 | CRC校验 |
01 | 06 | 00 04 | 00 01 | 12 34 | 4A B0 |
上行报文:01 06 00 04 00 01 12 34 4A B0
从机地址 | 功能码 | 寄存器起始地址 | 读取寄存器个数 | 写入的数据 | CRC校验 |
01 | 06 | 00 04 | 00 01 | 12 34 | 4A B0 |
较详细的参考代码移步:Modbus通信C代码。
六、VSPD9.0调试ModBus
1、使用环境
Win7/Win10 32/64位系统 ,Virtual Serial Port Driver 9.0 虚拟com端口工具,推荐使用Modscan32,下文有述。
2、项目说明
最近项目开发使用到了Modbus协议,由于刚接触这个协议,在使用第三方工具进行调试的时候使用到了Modbus poll和Modbus slave工具,以下是简单的使用记录,希望以后对需要者有所帮助。
3、Modbus Poll和Modbus Slave软件介绍
它是一款实用的Modbus开发和调试工具,可以非常方便的进行Modbus调试,是非常有用的Modbus主机/从机模拟程序。我使用前安装了VSPD9.0虚拟com端口,因为有的电脑没有com端口工具或需要两台电脑联机调试。有了这个工具后就可以在一个电脑上虚拟出两个com端口,在一台电脑上进行调试。
下面是VSPD9.0工具虚拟界面:
一次可以添加两个端口,我添加了com1和com2两个端口。在电脑设备管理器->端口中查看是否新加了两个端口:
4、软件使用
接下来打开已经安装的Modbus poll和Modbus slave软件,分别按“F8”或者点击Setup->Read/Write(主机)/Slave(从机) Definition配置主从端的相关配置,如图:
以上配置的是10个寄存器从机设备ID为1但只读取前4个寄存器的数据,可根据自己的需要设置。
5、目标连接
接下来按分别按“F3”或者点击“Connection”进行连接,注意修改连接界面的端口,主从机分别选择我们虚拟出来的com1和com2端口,因为只用到了RTU模式,所以其他选项如波特率9600、比特位8、校验位1等可以保持不变,然后点击确定进行连接,未连接成功窗口第二行会给出提示信息。
6、通讯开始
主机端显示:TX=11,Err=0,ID=1,F=03,SR=1000ms。意思是,发送11次命令,错误次数0,从机ID,功能号03,轮询间隔1000ms。
使用工具栏的”Communication Traffic”按钮,可以显示出当前发送命令和接受的数据,如下图:
7、安装包获取
Modbus slave、Modbus poll和Virtual Serial Port Driver 9.0 虚拟端口工具安装包获取:Modbus协议的调试工具。
8、注意事项
使用完记得一定要删除,不然就算关闭了VSPD,虚拟串口也会一直存在,正常使用电脑倒是没什么影响。但是你要是插上外部设备,想用外部设备向里面通信,就会没有响应。我找了半天原因,以为我电脑出问题了,最后发现是虚拟接口没断开,相当于两个接口连了一条直连线,对外不响应。
Modscan32用来模拟主设备操作更为简单。它可以发送指令到从机设备(使用Modbus协议的终端设备)中,从机响应之后,就可以在界面上返回相应寄存器的数据。使用方法移步:Modscan32软件的使用。
9、解决COM端口被占用
有关内容移步:通信-RS232、RS485、RS422串口(接口)之2、解决COM串口被占用。
首先要有一个具体目标,那些所有你认为必须前置的知识,都可以在完成目标的过程中学到。觉得不错,动动发财的小手点个赞哦!