modbus 协议基础知识 您所在的位置:网站首页 00000是什么颜色 modbus 协议基础知识

modbus 协议基础知识

2024-07-13 15:38| 来源: 网络整理| 查看: 265

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协议 帧结构帧结构 = 地址 + 功能吗 + 数据 + 校验

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

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

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

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

实战

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

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

修改 0x06功能码

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

修改-0x10功能码

主机发送: 01 10 00 00 00 01 02 11 22 2A 19从机回复: 01 10 00 00 00 01 01 C9 *发送数据解析*/01-主机要查的地址10-功能码,代表修改多个寄存器功能;00 00-代表修改的起始寄存器地址.说明从0x0000开始.00 01-代表修改的寄存器数量,这里开始于0x06的修改不同;02 -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;11 22-表示修改的值,结合上面,就是从第0000寄存器开始修改一个寄存器值为11 22,就是把0000寄存器改为11 22;2A 19-循环冗余校验,是modbus的校验公式,从首个字节开始到22前面为止;/*回复解析*/01-从机返回的地址,说明这就是主机查的从机10-功能码00 00-代表修改的起始寄存器地址.说明是0x0000.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

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-099991区输入线圈只读10001-199993区输入寄存器只读30001-399994区保持寄存器可读可写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数据格式



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有