MODBUS通信协议
MODBUS是MODICON公司与1979年开发的一种通讯协议,是一种工业现场总线协议标准。1996年施耐德公司推出了基于以太网TCP/IP的MODBUS协议MODBUS-TCP。MODBUS协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型,协议本身并没有定义物理层,只是定义了控制器能够认识和使用的消息结构,而不管他们是经过何种网络进行通信的。标准的MODBUS协议物理层接口有RS232、RS422、RS485和以太网口。采用M/S(主/从)方式通信。2004年MODBUS成为我国国家标准。
MODBUS比其他通信协议使用的更广泛的主要原因有:
公开发表并且无著作权要求
易于部署和维护
对供应商来说,修改移动本地的比特或字节没有很多限制
MODBUS通信协议的弱点和限制:
指令明码传输,没有保护机制
符合规范就可运行,没有认证机制
针对未定义参考位置输入指令值,可能造成接收端传输异常进而瘫痪接收端设备
对于大型二进制对象数据支持不好
由于Modbus是一个主/从协议,没有办法要求设备“报告异常”(以太网TCP/IP除外),因此主节点必须循环的询问每个节点设备,并查找数据中的变化
Modbus在一个数据链路上只能处理247个地址(以太网TCP/IP除外)
在微处理器与外设设备的串口通信中,常用的是MODBUS-ASCII和MODBUS -RTU。在MODBUS-ASCII中,每两个字符占8个字节,使用纵向逻辑冗余校验(LRC)方式。使用MODBUS-ASCII传输方式的数据发送间隔长(最高可以达到1秒)以保证错误率低, 微处理器性能占用小,但错误率低随之而来的是传输速度慢,这使得通信的实时性差。MODBUS-ASCII通信数据帧格式如表所示。

在MODBUS-RTU中,每8个字节是两个4个字节字符的组合,使用循环逻辑冗余校验(CRC)方式,每个数据帧必须以连续的数据流传输,因此通信速率高。MODBUS-RTU通信数据帧格式如表所示。

其中数据区域的长度可以在0-252字节中自己定义。功能代码和数据区域被称为简单协议数据单元(PDU),设备地址、功能代码、数据区域和CRC校验码被称作应用数据单元(ADU)。
在RTU通信下,数据帧的设备地址占用1个字节,外设设备地址范围为0至247。数据帧中,功能代码位宽为1个字节,功能代码范围为1至255。在程序设计时,根据功能需要使用不同的功能代码,MODBUS协议预留了功能码,实现主/从设备通信的自定义。
在微处理器与外设设备通信过程中,两报文帧之间需预留足够的时间,否则设微处理器与外设之间将无法区分这段报文是一条完整的报文还是两条报文,从而使CRC校验出现错误。

参考文献:
[1]谭阔,王劲松,朱亚军,等.基于MODBUS协议的TMS320F2812与触摸屏通信的实现[J].电气应用,2015,34(S1):296-299.
[2]维基百科-Modbus:https://zh.wikipedia.org/wiki/Modbus
[3]华为云-Modbus和Modbus/TCP协议:https://www.huaweicloud.com/articles/9b33bc884a55cf3e62c6d9bb73f5fea3.html