一文看懂Modbus通信协议(上)


目录

前言

1. 基于RS-485的Modbus通信协议

1.1 一主多从模式

2. Modbus的数据结构

2.1 Modbus-RTU协议

2.1.1 Modbus-RTU协议的基本格式(主机查找从机)

2.1.2 Modbus-RTU从机回应数据基本格式(从机回应主机)

2.2 Modbus-ASCLL协议

2.2.1 Modbus-ASCLL协议的基本格式(主机查找从机)


前言

Modbus是Schneider Electric公司于1979年开发的一种常用于工业领域的串行通信协议,根据上一节的介绍我们可以了解到Modbus类属软件层通信协议,因此明确软件层通信协议的功能至关重要,既然它是一种行业通用的一种标准通信格式,那么它的功能要满足以下三点要求:

(1)主机寻址从机并向从机发送数据;

(2)主机寻址从机获取从机数据;

(3)从机如何向主机发送数据。

总结一下软件层通信特点:主机和从机上电时均处于接收状态;主机向从机发送寻址帧后迅速恢复为接收状态,目的是等待所寻址的从机按照指定格式做出数据回应。

1. 基于RS-485Modbus通信协议

1.1 一主多从模式

Modbus规定其工作方式为一主多从模式,即一个系统中有且只有一个主机,每个从机有且只有一个地址,地址范围为(0~247),其中的地址0赋给主机称为广播地址,当主机向0号地址发送数据时,主机则像广播一样把该数据发送给所有从机,但由于多个从机接收到主机发送的数据时,无法通过一根总线做出回应同时还会造成数据冲突,因此当主机向0号地址发送数据时从机不予以回应。当主机发送除地址0之外的从机地址时,对应从机接收到主机的寻址帧后便返回一组数据,该回应数据通过RS-485总线进行传递,因为其他从机数据线也接在RS-485总线上,在被寻址从机做出反馈时,其他从机也能同时接收到被寻址从机发给主机的反馈数据,为防止其他从机接收到被寻址从机发出的反馈数据而产生误动作,应在被寻址从机的反馈数据内加入被寻址从机的数据地址,这样其他从机虽然收到了被寻址从机返回给主机的数据,但该返回数据的数据地址与自己不符,从而其他从机不做出响应。因此总结一下设置地址的目的:

(1)方便主机对指定从机的通信;

(2)使被寻址从机对主机做出数据反馈时,其他从机不能误接收。

2. Modbus的数据结构

Modbus的数据结构也就是主机寻址帧的格式,Modbus有两种传输方式:一种是Modbus-RTU协议、一种是Modbus-ASCLL协议。

2.1 Modbus-RTU协议

Modbus-RTU协议也称为16进制方式,例如要发送0x05,则为0000 0101,只需要发送8位即可(效率高)。采用RS-485通信则需要加上起始位和终止位共10位。

2.1.1 Modbus-RTU协议的基本格式(主机查找从机)

从机地址+-功能码(MODBUS共有128种功能指令)+数据1、数据2、…、数据n。并将上述数据格式进行CRC16数据较验,该校验就是将上述数据按照CRC16方式进行运算,计算后得到一个16位的二进制数,这个16位的二进制数反映了上述数据组的一种规则特征。并在上述数据后组后面将该16位二进制数填入末尾我们称之为校验码。

【问题一】从机如何确定主机是否发送完一组数据帧?即帧的结束标志。应当注意,当上电时主从设备都处于接收状态,如果主机向指定一个从机按照上述数据格式发送数据,但从机在接收数据时不会判断何时结束数据的接收,Modbus中并未规定主机发送的数据串何时终止以及从机如何去判断主机发送完毕一组数据串,即Modbus-RTU协议没有明确的结束标志。

【解决方法】通过计算主机向从机发送数据后的停止时间作为本次发送数据的结束标志,当本次数据完成后的停止时间超过了3.5个字符时间则认为本次发送结束,同时从机停止接收数据。(从机以接收数据停止时间达到3.5个字节以上,就认为主机的寻址帧完成,并使从机进行数据处理)

【问题二】3.5个字符时间如何计算?

【解决方法】举例:假设选择波特率为9600bit/s,表示数据传输速度为每秒传输9600位。可以得到每一位的数据传输时间位1000000us/9600=104us(微秒),也就是主机每发一位数据(发一个0或1)用时104 us(微秒),串口协议数据格式如下。

主机每发送一个字节需要10位,故发送一个字节用时T=10*104us(微秒)= 1040us(微秒)。因此3.5个字节用时T=3.5*1040 us(微秒)=3645 us(微秒)约4ms(毫秒)。

因此当主机数据停止发送时间超过4ms(毫秒),从机即停止接收数据并对所接收的数据进行分析处理。当主机数据停止发送时间在4ms(毫秒)以内又重新发送新的数据帧,则从机抛弃前一次接收的数据帧并对最新的数据帧进行接收储存。

2.1.2 Modbus-RTU从机回应数据基本格式(从机回应主机)

(1)从机回应主机数据帧的格式与主机查找从机数据帧格式基本一致;

(2)正常回应时功能码与主机发的功能码一致(1-127)。如果是异常回应,功能码要在收到的功能码基础上加128。例如从机受到的功能码为0x03,则从机反馈给主机的功能码有两种情况0x03或0x03+128,第一种是正常返回,第二种则是超出了功能码范围表示从机数据有异常。

要想实现Modbus的从机通信数据帧协议首先应当满足以下两点:在硬件上应当具备串口或RS-485接口;同时硬件上应具备毫秒级定时器。

2.2 Modbus-ASCLL协议

Modbus-ASCLL协议如果要发送0x05,则通过拆分0x05为:‘0’和‘5’并将‘0’和‘5’转换为ASCLL码‘0x30’和‘0x35’,再转化成‘0011 0000’和‘0011 0101’进行发送,则需要发送16位(效率低),但优势是可以通过显示器对总线上数据进行ASCLL码显示,便于人机交互和串口调试。

2.2.1 Modbus-ASCLL协议的基本格式(主机查找从机)

每一帧的开始总是以‘:’的ASCLL码(0x3A)作为起始依据+地址位(与Modbus-RTU协议不同的是RTU协议下的地址位的0x02表示0000 00010,而ASCLL协议则需要将0x02拆分成‘0’和‘2’的ASCLL码方能表示地址位0000 00010)+功能码(Modbus共有128种功能指令)+数据1、数据2、…、数据n。紧接其后的是LRC校验码,该校验码取值在(0~255之间)= ~[(地址位+功能码+数据1+数据2+…+数据n)%256]+1;注(~表示取反、%表示取余)即为校验码。校验码结束后还有ASCLL码的换行键13以及回车键10。

参考网址:

ASCLL码查询网址推荐

NI公司对于Modbus的介绍

往期博客:

通信的硬件层协议和软件层协议

RS-232、RS-485、RS-422通信接口标准介绍