历史沿革
modbus是由modicon公司(现在的施耐德电气)于1979年为可编程逻辑控制器PLC通信而发表的一种应用层串行通信协议。
协议特点与设计理由
由于modbus设计之初并不是在以太网传输,因此为了能同时在通信链路中让多个设备可以通信而又不发生冲突,整个协议设计出来就具备这样的特点:
1、主从结构。一个链路中只能有一个主站,其他全部是从站。
2、主站与从站之间是一问一答的形式,主站没有发数据,从站不能主动向链路中响应数据。要理解这个可以参考以太网,以太网由于每个站点都有一个独立网口连接路由器或交换机的网口,又有
交换机的底层分包能力,所以同时发送数据是不会有问题的,而modbus是基于rs485总线,所有设备手拉手连接,同时时刻总线上只能允许一个站点占用。
3、从站必须编号,且编号唯一。可以理解为类似以太网的IP地址。
4、整个通讯过程看起来像广播机制,一个主站拿着喇叭在喊,所有人都能听到,但是只有被叫到名字的从站才回应。
数据帧结构
接下来,我们了解一下modbus的数据帧结构。
一个完整的modbus数据帧,包含四个部分:
站号(通讯的站点标识)、功能码(本次通讯的动作是什么)、数据(传递了哪些数据)、校验(错误校验)
协议种类
为了适应多个场景,modbus主要有三个实现方式:Modbus RTU、Modbus ASCII、Modbus TCP
下面,我们来分别了解一下这三个协议的各自数据包的结构吧!
1、Modbus RTU:二进制传输,传输效率高,使用CRC校验。
它的帧结构:一个字节的地址+一个字节的功能码+数据+CRC校验。
一个完整的modbus RTU数据帧类似这样: 01 03 10 00 00 01 80 CA
其中, 01 为从站地址,03为功能码,10为十进制的2,表示传输的数据为两个字节。后面的两个 00 00 表示这两个字节的寄存器里的数据。 80 CA表示CRC校验码。
2、Modbus ASCII:文本传输,每个字节用两个ASCII字符表示,使用LRC校验。
帧结构:起始符(冒号)+地址+功能码+数据+LRC校验+结束符(换行、回车)。
它在modbus rtu的基础上,将CRC校验转换为了LRC校验,并将原始数据帧里每个字节的数据全部转成其对应的ascii字符,然后传输头部增加了冒号,尾部增加了回车与换行符。
一个完整的modbus ASCII数据帧形如:3A 30 31 30 33 31 30 31 38 30 30 30 31 44 33 0D 0A
其中3A就是冒号的ASCII码,30对应的是0的ASCII码,31对应的是1的ASCII码,后面的4 33 0D 0A分别对应回车与换行符的ASCII码。
其对应的modbus RTU为:01 03 10 18 00 01 D6。
相比于modbus rtu,modbus ASCII数据帧的约为前者的两倍。
3、 Modbus TCP:以太网上传输,使用标准TCP/IP,通常不需要校验,应答更快捷。
帧结构:MBAP + MODBUS报文。
其中,MBAP为7个字节长度,包含传输标识、协议标识、长度、单元标识。 整个帧结构看起来就是原始的modbus RTU 之前加上了7个字节的包头。
传输介质
他们的传输介质是怎样的? 实践中,modbus RTU与modbusASCII 主要通过RS485串行总线实现设备间互联,而modbus TCP则使用网线实现数据传输。
这里所说的通过网线传输,中间其实需要增加一个转换设备,需要先从串口将modbus rtu数据帧读出后再投入以太网协议栈。
无论是采用哪种介质传输,其底层都需要关注波特率、数据位、停止位、校验位这些参数,且各设备间的这些参数都需要一致。
关于modbus的功能码就不多介绍,需要用到时候大家可以查一下手册即可。这里简单帮大家回忆几个常用的功能码,比如01表示读线圈状态,02表示读离散输入,03读保持寄存器,04读输入寄存器等。
总结时间
总结时间:modbus是一个主从架构的运行与串行总线上的用于设备控制的应用层协议,它支持多种电气接口、简单易用且标准开放,广泛应用在物联网的设备控制、数据采集等场景中。小伙伴们还不快学起来!