《Modbus协议的常用基本定义》
东风汽车有限公司计量测试中心王德宪
摘 要:本文作者通过学习Modbus协议,搜集有关Modbus文献并结合实际应用体会,在克服Modbus协议译文繁杂难懂和剔除有关错误的基础上,用准确、精炼的语言详细讲解了Modbus协议的常用基本定义。
关键词:Modbus协议;RTU;LRC;CRC
1. Modbus 协议简介
Modbus 协议是一种应用于电子控制器的通用通信规约。是由MODICON公司最先倡导并于1979年开发的,后来逐渐发展成为国际通用的通信标准。在我国,GB/Z 19582《基于Modbus协议的工业自动化网络规范》于2004年9月发布,该指导性技术文件发布后得到了国内自动化产品生产厂家、自动化系统集成商和广大用户的高度关注和重视,并极大地推动了基于Modbus协议的产品的开发和应用。2006年4月,Modbus-IDA国际组织在中国正式授权建立了唯一的MODBUS(中国)产品一致性测试实验室(MCTL),为Modbus技术在中国的全面开发和应用提供了硬件平台支持。
按照全国工业过程测量和控制标准化技术委员会关于建立现场总线标准体系的有关要求,有关部门于2007年11月完成了GB/Z19582《基于Modbus协议的工业自动化网络规范》标准的修订工作,将作为国家推荐标准上报国家标准化管理委员会,2008年3月国家标准化管理委员会正式批准为GB/T 19582-2008。
Modbus协议规定每个控制器必须有自己的设备地址。当一个控制器在Modbus网络上接收到一条消息时,首先要识别是否发给自己。如果是并且需要回应,控制器将生成反馈消息并依据Modbus协议发出。
不论是何种控制器经过何种网络进行通信,Modbus协议定义了一个控制器能够识别的消息域的框架结构和内容的公共格式。它描述了一个控制器请求访问其它设备的过程,以及如何回应来自其它设备的请求。还规定了如何侦测和记录错误。
遵循Modbus协议,不同厂家生产的控制设备可以连接在同一个工业网络。在这个网络上,主机设备可以方便地对各种控制设备进行集中监控,各控制设备之间也可以直接相互通信。
2. Modbus的两种传输模式
Modbus的两种传输模式分别是ASCII(美国标准信息交换代码)和RTU(远程终端装置)。用户要实现Modbus网络通信,必须选中一种传输模式并配置串口通信参数(波特率、校验方式等)。在同一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
当消息在标准的Modbus系列网络传输时,每个字符或字节以如下方式发送(从左到右):最低有效位...最高有效位。
2.1 ASCII模式
使用ASCII字符帧时,位的发送序列是:
有奇偶校验:
启始位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 奇偶位 | 停止位 |
无奇偶校验:
启始位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 停止位 | 停止位 |
ASCII模式编码说明:
. 消息中的每个字节都是一个ASCII字符,由两位十六进制字符组成:0...9,A...F
. 每发送一个字节包含:
1个起始位、7个数据位(最小的有效位先发送)、1个奇偶校验位(无校验则无)、1个(有校验时)或2个停止位(无校验时)
. 错误检测采用LRC(纵向冗长检测)
当控制器设为在Modbus网络上以ASCII模式通信时,在消息中的每个字节(8Bit)都作为一个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
ASCII模式的消息帧结构:
冒号符 | 地址码 | 功能代码 | 数据数量 | 数据1 | ... | 数据n | LRC高字节 | LRC低字节 | 回车符 | 换行符 |
2.2 RTU模式
使用RTU字符帧时,位的发送序列是:
有奇偶校验:
启始位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 奇偶位 | 停止位 |
无奇偶校验:
启始位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 停止位 | 停止位 |
RTU模式编码说明:
. 消息中的每个字节都是由两个十六进制字符组成:0...9,A...F
. 每发送一个字节包含:
1个起始位、8个数据位(最小的有效位先发送)、1个奇偶校验位(无校验则无)、1个(有校验时)或2个停止位(无校验时)
. 错误检测采用CRC(循环冗长检测)
当控制器设为在Modbus网络上以RTU模式通信时,在消息中的每个字节(8Bit)包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。
RTU模式的消息帧结构:
地址 | 功能代码 | 数据数量 | 数据1 | ... | 数据n | CRC低字节 | CRC高字节 |
3. Modbus的消息帧结构
在ASCII或RTU两种传输模式中,传输设备将Modbus消息转换为有起点和终点的帧,这就可以使接收设备在消息起始处同步接收数据,读取地址信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已传送完毕。有些消息也能侦测到错误并且能返回结果。
3.1 ASCII帧
使用ASCII模式,每帧消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。
其它域可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个从设备都解码下个域(地址域)来判断是否是发给自己的。
消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 | LRC校验 | 结束符 |
1个字符 | 2个字符 | 2个字符 | n个字符 | 2个字符 | 2个字符 |
3.2 RTU帧
使用RTU模式,每帧消息发送至少要有3.5个字节时间的间隔停顿。不论在何种网络波特率下,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测网络总线,当第一个域(地址域)接收到时,每个从设备都进行解码以判断是否发给自己。在最后一个传输字节之后,应至少停顿3.5个字节时间以表示消息结束。一个新的消息可在此停顿后再开始。
整个消息帧必须作为一个连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样,如果一个新消息在小于3.5个字节时间内接着前个消息开始,接收的设备将认为它是前一消息的延续,这将导致一个错误,因为在最后的CRC域的值不可能是正确的。典型的消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 | CRC校验 | 结束符 |
T1-T2-T3-T4 | 8Bit | 8Bit | n个8Bit | 16Bit | T1-T2-T3-T4 |
3.3 地址域
消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。允许的从设备地址范围是十进制的0~247。主设备将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出的回应。
地址0用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络时,广播可能被禁止或以其它方式代替。
3.4 功能域
消息帧中的功能码域包含了两个字符(ASCII)或8Bits(RTU)。可能的代码范围是十进制的1~255。有些功能码适用于所有控制器,有些仅适应用于某种控制器,还有些暂且保留以备后用,参见表1表2。
(注:本文在发出时,微博服务器系统提示说字符超出1万字,不能通过。俺一脑袋浆糊,明明没有1万字嘛。抱歉啦,分成两部分发表)