Modbus通信协议

发布于:2024-08-15 ⋅ 阅读:(43) ⋅ 点赞:(0)

通信模式分类

1、并行通信(数据各位同时传送)

一般快速设备之间采用并行通信,譬如CPU与存储设备、存储器与存储器、主机与打印机等都采用并行通讯。并行通讯,有多少位数据就必须有多少根数据线,如下图是11 位数据就有11根数据线。优点:传输速度快
缺点:占用引脚资源多
在这里插入图片描述

2、串行通信(数据一位一位顺序依次传送)

串行通信最少可以只需一根通信线,只发或只收。因而大大节省了系统资源,降低了系统成本。由于只用一根数据线,所以是以降低传送速度来换取资源的,它常用在传送距离远,速度要求不高的场合。优点:通信线路简单,占用引脚资源少,成本低。缺点:传输速度慢

在这里插入图片描述

1、异步串行通信(最常采用的通信方式)

具有固定的通信格式,数据以相同的帧格式传送,每一帧由起始位、数据位、奇偶校验位和停止位组成。

起始位:通信线路上没有数据传输的时候处于高电平(逻辑“1“)状态,当发送设备发送一个字符数据时,先发送一个低电平(逻辑“0“)信号,告诉接收端”开始发送数据了“,这个低电平就是一个起始位,接收端收到这个信息就准备接收信息。
数据位:可以是5 位、6 位、7 位、或8 位。数据传送时,低位在前。
奇偶校验位:用于数据传输过程的检错
奇校验:保证数据位和校验位“1”的个数为奇数
偶校验:保证数据位和校验位“1”的个数为偶数
无校验:没有校验位,此时校验位用一个停止位补充,即有两个停止位
停止位:停止位可以是1位、也可以是1.5 位或2 位。接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一字符作好准备。若停止位后不是紧接着传送下一个字符,则让线路保持为“1”。“1”表示通信线路处于空闲等待状态。存在空闲位是异步通信的特性之一。
在这里插入图片描述

2、同步串行通信

通信双方共用一个时钟,这是同步通信区分于异步通信的最显著的特点,为了保证接收正确无误,发送方除了传送数据外,还要传送同步时钟。
同步传输是以数据块为传输单位,在数据块传送时,为提高通信速度,去掉了起始位和停止位。数据开始传送前用同步字符来指示(常约定1~2 个),并由时钟来实现发送端和接收端的同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到一块数据传送完毕。
数据块与数据块之间的时间间隔是固定的,且不允许有空位,当线路空闲或不发信息时,发送同步字符。
同步传输中,发送方发出数据后等接收方发回响应以后才发下一个数据包。
在这里插入图片描述

一、什么是Modbus?

Modbus是一个Bus,即总线协议。目前被工业电子领域广泛应用。它具备以下三个优点:
1、公开发表并且无版权要求
2、易于部署和维护
3、对供应商来说,修改移动本地的比特或字节没有很多限制

二、Modbus有什么用?

所有协议都是用来通信的,Modbus也不例外。协议的制定就是让两个人根据这个协议看懂传来的一组数据。比如我给你一个1,要是没有协议,就只知道这是1,而有了协议,你就知道了这是在问我是不是小王?当然,也可以表示其他意思,具体什么意思就看你协议怎么制定!

三、Modbus都包括什么?

Modbus大致分为以下几种:Modbus-RTU、Modbus-ASCII、Modbus-TCP
以上三种协议,一个设备只会有一种协议。一般来说大部分的设备都是Modbus-RTU协议的。

四、Modbus的通讯过程

Modbus是主从方式通信,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。
比如说: 一个总线上有一个主机,多个从机,主机查询其中一个从机,首先你必须得这些从机分配地址(这样才能知道哪个从机,而且每个地址必须唯一),分配好地址后,主机要查询,然后数据下发,从机得到主机发送的数据,然后对应地址的从机回复,主机得到从机数据,这样就是一个主机到从机的通信过程。就像打电话一样,你得知道对方的电话(这就是唯一地址),然后你打电话过去,相当于主机查找从机,然后对方接通电话,给你回复(返回数据),正常是这样的。如果这时候,对方正在打电话,你应该听到的是"sorry,you…"这一串英文,说明对方忙,但是Modbus总线不能判断对方是否忙,也没有对应的仲裁机制。但是,可以用软件的办法进行适当的处理数据!

五、Modbus的各种协议

设备必须要有RTU协议!这是Modbus协议上规定的,且默认模式必须是RTU,ASCII作为选项。(也就是说,一般的设备只有RTU这个协议,ASCII一般很少)。

Modbus-RTU协议

帧结构

帧结构 = 地址 + 功能码+ 数据 + 校验

地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)。
功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。
数据:根据功能码不同,有不同结构,在下面的实例中有说明。
校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。
Modbus-RTU协议一般用的最多功能码就是03和06,大部分都是用modbus来查询传感器上的信息用03查询功能码,如果需要修改传感器寄存器的值就用06修改功能码。
例如:现在我是主机,我要查询从机地址为01的数据。我需要发送以下数据:
下面展示查询功能码0x03:

主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E

从上面的内容中可以看出,主机发送的数据大致是 地址+功能码+数据+校验;
发送数据解析
在这里插入图片描述

01-地址,也就是你传感器的地址
03-功功能码,03代表查询功能,查询传感器的数据
00 00-代表查询的起始寄存器地址.说明从0x0000开始查询。这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据
00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值
84 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到84前面为止;

回复数据解析
在这里插入图片描述

01-地址,也就是你传感器的地址
03-功功能码,03代表查询功能,查询传感器的数据。这里要注意的是注意发给从机的功能码是啥,从机就要回复同样的功能码,如果不一样说明这一帧数据有错误
02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;
19 98-寄存器的值是19 98,结合发送的数据看出,01这个寄存器的值为19 98
B2 7E-循环冗余校验

基本流程可以总结为:
发送:从机的地址+我要干嘛的功能码+我要查的寄存器的地址+我要查的寄存器地址的个数+校验码
回复:从机的地址+主机发我的功能码+要发送给主机数据的字节数+数据+校验码

Modbus-ACSII协议

帧形式

对于RTU协议,比如RTU发送一个字节:0x12;ASCII协议则需要发送2个字节:一个字节代表ASCII码1,一个代表ASCII码2,即0x31和0x32,才能代表0x12。所以,ASCII协议的效率比较低。但是ASCII更符合串口打印查看,因为串口发送的数据一般都是文本模式(ASCII)。
比如用RTU方式,也叫16进制方式,要发0x03数据,RTU方式就发送00000011。用ASCII发送0x03,就要发送0的ASCII码0x30和3的ASCII码0x33,对应到2进制也就是发送00110000和00110011。很显然RTU方式只需要发送8位就可以了(加上起始位和停止位就是10位数据)。那么ASCII码方式发送就需要两个8位(每个8位分别加上起始位和停止位就是20位数据)。也就是说ASCII码发送数据量是RTU方式的2倍,所以ASCII码效率更低。

ASCII码效率更低,数据发送量大为啥还采用这种方式呢?
因为假如你要发送数据0x03,采用RTU方式(16进制发送),计算机中端设备接收到0x03后是不可以显示的,就是不能把0x03打印出来。因为可见字符的ASCII码是从32—126,不是这个范围以外的显示屏上都看不到,会出现乱码,如果是串口助手的话就会显示□□□□。如果采用ASCII方式(文本模式发送),就不会出现不可显示和乱码的情况,因为文本模式发送0x03,就是发送ASCII码0和ASCII码3,也就是0x30和0x33,是可以正常显示在计算机中端的。所以现在知道为什么还要使用ASCII效率比较低的方式发送了吧,只是为了方便调试显示而已。
在这里插入图片描述
从上面的图中,看出ACSII协议:
1)比RTU多了起始段:,多个结束符CR,LF
2)地址和功能都变成了2个字节;
3)数据部分更加繁琐,但是更符合人们的查看;

由于Modbus-RTU和Modbus-ACSII都是基于232和485链路的,所以其通讯模式半双工,一般是主机和从机的模式。其差别就是其字节的格式不同,一个是16进制的数据,一个是ASCII数据。ASCII多了帧头和帧尾,也就是说可以有用这个头尾判断一帧字节来判断是否结束;而RTU没有帧头和帧尾,所以协议里明确两帧之间要大于3.5个字节时间间隔,作为一帧结束的判断依据。对于RS485来说,总线上一般允许最大32个设备。

MODBUS TCP/IP通信协议
串行链路上一个主站多个从站的模式演变为多个客户机和多个服务器的模式,IANA(Internet Assigned NumbersAuthority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,ModbusTCP/IP服务器端通常该端口作为接收报文的端口, 这是目前在仪表与自动化行业中唯一分配到的端口号。

在这里插入图片描述
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的 MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。在TCP/IP上使用一种专用报文头来识别Modbus应用数据单元ADU,即MBAP报文头。
在这里插入图片描述
用MBAP报文头中的单个字节单元标识符取代MODBUS串行链路上通常使用的MODBUS从站地址域。这个单元标识符用于设备的通信,这些设备使用单个 IP 地址支持多个独立MODBUS 终端单元,例如:网桥、路由器和网关。
用接收者可以验证完成报文的方式设计所有 MODBUS 请求和响应。对于 MODBUS PDU有固定长度的功能码来说,仅功能码就足够了。对于在请求或响应中携带一个可变数据的功能码来说,数据域包括字节数。
当在 TCP 上携带MODBUS时,即使将报文分成多个信息包来传输,办事在 MBAP 报文头上携带附加长度信息,以便接收者能识别报文边界。显式和隐式长度规则的存在以及
CRC-32 差错校验码的使用(在以太网上)将对请求或响应报文产生极小的未检出干扰。
MBAP报文头格式(长7字节):
在这里插入图片描述

事务元处理标识符:用于事务处理配对。在响应中,MODBUS 服务器复制请求的事务处理标识符。协议标识符:用于系统内的多路复用。通过值 0 识别 MODBUS 协议。
长度:长度域是下一个域的字节数,包括单元标识符和数据域。
单元标识符:为了系统内路由,使用这个域。专门用于通过以太网 TCP-IP 网络和 MODBUS 串 行链路之间的网关对 MODBUS 或 MODBUS+串行链路从站的通信。MODBUS 客户机在请求中设置 这个域,在响应中服务器必须利用相同的值返回这个域。
帧格式:

协议数据单元前加MBAP报文头,没有了校验码,其他数据格式相同.
请求帧格式:
在这里插入图片描述
正常应答帧格式:
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到