modbus 协议基础知识

Modbus的内容是什么

协议种类
Modbus-RTU+Modbus-ASCII
Modbus-TCP
Modbus-Plus
通讯过程:
Modbus是主从方式通信,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信

Modbus-RTU+Modbus-ASCII

协议是基于异步串行通信上,一般的介质有:RS-232,RS485,RS-422上,这也是工业上使用的最多的;

对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。
Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。
RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

Modbus-RTU协议

  1. 帧结构
    帧结构 = 地址 + 功能吗 + 数据 + 校验

地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)

功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能.

数据: 根据功能码不同,有不同结构,在后续的实例中有说明;

校验: 为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了;

实战

查询 0x03
功能描述:
现在我是主机,我要查询从机地址为1的数据.

  1. 主机发送: 01 03 00 00 00 01 84 0A
  2. 从机回复: 01 03 02 12 34 B5 33
  1. /*发送数据解析*/
  2. 01-地址
  3. 03-功能码,代表查询功能,其他功能后面再说
  4. 00 00-代表查询的起始寄存器地址.说明从0x0000开始查询.
  5. (这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据;)
  6. 00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值;
  7. 84 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到84前面为止;
  8. (这里新手可能不懂,这个校验就是保证数据传输过程没有错误的一种手段,不同的协议这种校验公式不一样,
  9. 只需了解这个就足够了,具体怎么求的,可以直接在输出数据得到结果,地址如下:
  10. http://www.ip33.com/crc.html)
  11. /*回复解析*/
  12. 01-地址
  13. 03-功能码
  14. 02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;
  15. 12 34-寄存器的值是12 34,结合发送的数据看出,01这个寄存器的值为12 34
  16. B5 33-循环冗余校验

修改 0x06功能码

  1. 主机发送: 01 06 00 00 00 01 48 0A
  2. 从机回复: 01 06 00 00 00 01 48 0A
  1. *发送数据解析*/
  2. 01-主机要查的地址
  3. 06-功能码,代表修改单个寄存器功能,修改有些不同,有修改一个寄存器和修改多个寄存器;
  4. 00 00-代表修改的起始寄存器地址.说明从0x0000开始.
  5. 00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
  6. 48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;
  7. /*回复解析*/
  8. 01-从机返回的地址,说明这就是主机查的从机
  9. 06-功能码,代表修改单个寄存器功能;
  10. 00 00-代表修改的起始寄存器地址.说明是0x0000.
  11. 00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
  12. 48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;

修改-0x10功能码

  1. 主机发送: 01 10 00 00 00 01 02 11 22 2A 19
  2. 从机回复: 01 10 00 00 00 01 01 C9
  1. *发送数据解析*/
  2. 01-主机要查的地址
  3. 10-功能码,代表修改多个寄存器功能;
  4. 00 00-代表修改的起始寄存器地址.说明从0x0000开始.
  5. 00 01-代表修改的寄存器数量,这里开始于0x06的修改不同;
  6. 02 -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;
  7. 11 22-表示修改的值,结合上面,就是从第0000寄存器开始修改一个寄存器值为11 22,就是把0000寄存器改为11 22;
  8. 2A 19-循环冗余校验,是modbus的校验公式,从首个字节开始到22前面为止;
  9. /*回复解析*/
  10. 01-从机返回的地址,说明这就是主机查的从机
  11. 10-功能码
  12. 00 00-代表修改的起始寄存器地址.说明是0x0000.
  13. 00 01-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机,你修改了哪几个寄存器就足够了;
  14. 01 C9-循环冗余校验;
  1. 主机发送: 01 10 00 00 00 02 04 11 22 33 44 42 5A
  2. 从机回复: 01 10 00 00 00 02 41 C8

modbus RTU协议只需要看懂功能码0x03,0x06,0x10这三个基本的就已经足够了;分别回想下其数据域部分:
0x03-主机需要发送起始地址+寄存器数量,从机回复总字节数+数据;
0x06-主机发送起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机返回起始地址+数据内容
0x10-主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量

Modbus-ACSII协议

概述
一般只需要了解RTU协议,因为前面有说过,必须要有RTU协议的,所以只需要了解了RTU协议,就可以读出设备信息了,至于ACSII协议,做个大概了解

1.帧形式
对于RTU协议,比如RTU发送一个字节:0x12;
ASCII协议则需要发送2个字节:一个字节代表1,一个代表2,即31和32,才能代表0x12.
所以,acsii协议的效率比较低。

从上面的图中,看出:
1)比RTU多了起始段 :, 多个结束符CR,LF
2)地址和功能都变成了2个字节;
3)数据部分更加繁琐,但是更符合人们的查看;

归纳

由于Modbus-RTU和modbus-ACSII都是基于232和485链路的,所以其通讯模式半双工,一般是主机和从机的模式。其差别就是其字节的格式不同,一个是16进制的数据,一个是acsii数据。
Ascii多了帧头和帧尾,也就是说可以有用这个头尾判断一帧字节来判断是否结束;而RTU没有帧头和帧尾,所以协议里明确两帧之间要大于3.5个字节时间间隔(与波特率有关),作为一帧结束的判断依据。

在串口通信中,1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下),因此1个字符包括11个位,那么3.5个字符就是38.5个位,波特率表示的含义是每秒传输的二进制位的个位,因此如果是9600波特率,3.5个字符周期=1000/9600*38.5=4.01ms。

对于RS485来说,总线上一般允许最大32个设备。

Modbus-TCP
以太网作为介质进行传输,

Modbus-PLUS
高速令牌传递网络

Modbus协议规定

区号名称读写范围
0区输出线圈可读可写00001-09999
1区输入线圈只读10001-19999
3区输入寄存器只读30001-39999
4区保持寄存器可读可写40001-49999
功能码功能说明
01H读取输出线圈
02H读取输入线圈
03H读取保持寄存器
04H读取输入寄存器
05H预置单线圈
06H预置单寄存器
0FH预置多线圈
10H预置多寄存器

功能码说明
Modbus协议处理的所有数据按照存储数据的类型可分为位寄存器(1bit)和16位寄存器(16bit)。因此功能码可分为位操作和字操作两类。位操作的最小单位是bit,字操作的最小单位是两个字节。

寄存器功能码说明

寄存器种类说明

参考文档:
Modbus协议解析--小白一看就懂的协议_panda@Code的博客-CSDN博客_modbus协议详解
ModbusRTU协议数据格式_qq_37164321的博客-CSDN博客_modbusrtu通讯协议格式
标准Modbus通讯协议格式_竹影IT程序的博客-CSDN博客_modbus数据格式

  • 3
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Modbus RTU是一种在RS485通信协议上运行的串行通信协议。它被广泛用于工业自动化领域,用于在设备之间传输数据。 在使用Modbus RTU协议进行通信时,你需要考虑以下几个方面: 1. 硬件连接:RS485是一种常用的串行通信接口,它允许多个设备共享同一条总线。你需要正确地连接RS485总线,并设置合适的终端电阻。 2. 通信参数:Modbus RTU使用串行通信进行数据传输。你需要设置正确的波特率、数据位、停止位和校验方式等通信参数。 3. Modbus RTU协议格式:Modbus RTU协议使用二进制格式进行数据帧的传输。每个数据帧包含从站地址、功能码、数据域和错误检验等字段。 4. 数据读写:通过发送特定的命令帧,你可以从从设备读取数据或向从设备写入数据。读取数据时,你需要指定寄存器地址和读取长度。写入数据时,你需要指定寄存器地址和写入数据的值。 在实际编程中,你可以使用各种编程语言来实现Modbus RTU通信。一些常见的编程语言,如Python、C、C++和Java,都有相应的Modbus库或模块可供使用。你可以根据自己的需求选择合适的编程语言和库来开发你的程序。 需要注意的是,实现Modbus RTU通信涉及到硬件和软件的综合知识,需要对串行通信、Modbus协议和相关编程语言有一定的了解。如果你是初学者,建议先学习相关基础知识,并通过阅读文档和示例代码来深入理解和实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值