Modbus通讯协议
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。 Modbus比其他通信协议使用的更广泛的主要原因有:
1、公开发表并且无版权要求
2、易于部署和维护
3、对供应商来说,修改移动本地的比特或字节没有很多限制
1、 帧结构
帧结构 = 地址 + 功能码 + 数据 + 校验
| 地址码 | 功能码 | 数据 | CRC校验 |
|---|---|---|---|
| 1byte | 1byte | n byte | 2byte |
地址码: 地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。地址码为0时,为广播地址,所有从机均能识别,从站不做应答。
功能码: 通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。例如:功能码:00000003(03H),如果从机正常执行,则返回相同功能功能码,如果异常则返回10000003(83H)。
数据区: 数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。
校验: 为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了;
常用命令码
| 命令码 | 功能 |
|---|---|
| 03H | 寄存器读取 |
| 06H | 单个寄存器写入 |
| 10H | 多个寄存器写入 |
2、实例分析
a、寄存器数据读取
主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 12 34 B5 33
数据解析如下
/*发送数据解析*/
/*发送数据解析*/
01-地址
03-功能码,代表查询功能
00 00-代表查询的起始寄存器地址
(这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据;)
00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值;
84 0A-循环冗余校验
/*回复解析*/
01-地址
03-功能码
02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;
12 34-寄存器的值是12 34,结合发送的数据看出,01这个寄存器的值为12 34
B5 33-循环冗余校验
b、单个寄存器数据写入
主机发送: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A
数据解析如下
*发送数据解析*/
01-主机要查的地址
06-功能码,代表修改单个寄存器功能
00 00-代表修改的起始寄存器地址
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-循环冗余校验
/*回复解析*/
01-从机返回的地址,说明这就是主机查的从机
06-功能码,代表修改单个寄存器功能;
00 00-代表修改的起始寄存器地址
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-循环冗余校验
c、多个寄存器数据写入
主机发送: 01 10 00 00 00 01 02 11 22 2A 19
从机回复: 01 10 00 00 00 01 01 C9
数据解析如下
*发送数据解析*/
01-主机要查的地址
10-功能码,代表修改多个寄存器功能;
00 00-代表修改的起始寄存器地址
00 01-代表修改的寄存器数量
02 -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;
11 22-表示修改的值,结合上面,就是从第0000寄存器开始修改一个寄存器值为11 22,就是把0000寄存器改为11 22;
2A 19-循环冗余校验
/*回复解析*/
01-从机返回的地址,说明这就是主机查的从机
10-功能码
00 00-代表修改的起始寄存器地址
00 01-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机,你修改了哪几个寄存器就足够了;
01 C9-循环冗余校验;
主机发送: 01 10 00 00 00 02 04 11 22 33 44 42 5A
从机回复: 01 10 00 00 00 02 41 C8
数据解析如下
*发送数据解析*/
01-主机要查的地址
10-功能码,代表修改多个寄存器功能;
00 00-代表修改的起始寄存器地址
00 02-代表修改的寄存器数量
04 -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;
11 22 33 44-表示修改的值

最低0.47元/天 解锁文章
761

被折叠的 条评论
为什么被折叠?



