北岛夜话
原创工业智能控制领域(PLC、单片机/嵌入式、机器人、通信、机器视觉)的技术及经验分享。
文章397 浏览3301978

我是Modbus-RTU协议,我有两个兄弟

我是Modbus RTU协议,我来自Modbus大家庭。早在1971年,Modicon公司首次推出了Modbus协议,我和我大哥——Modbus ASCII 都诞生在这里。后来施耐德电气(Schneider Electric)收购了Modicon公司,并在1997年推出了Modbus TCP协议,这就是我的三弟。2004年,中国国家标准委员会正式把Modbus作为了国家标准,开启了我们为中国工业通信做贡献的新篇章。

cover.jpg我们三兄弟在工业通信中应用广泛,我和我大哥(Modbus ASCII)主要活跃在串行通信领域,而我三弟(Modbus TCP)则擅长以太网通信。你可以看看下面这张图:

modbus_layout.jpg

在串行链路中,我们(Modbus)使用一种简单的主从协议(客户机/服务器协议)进行通信。客户机作为主站,向服务器发送请求;服务器(从站)接到请求后,对请求进行分析并作出应答。我和小伙伴的通信帧被称为应用数据单元(Application Data Unit,ADU),它包括通信地址段、功能代码段、数据段和校验段,如下图:

ADU.png

其中,功能代码段和数据段组合称为协议数据单元(Protocol Data Unit,PDU)。功能代码段占用一个字节,取值范围为1~255,其中128~255为保留值,用于异常消息应答报文。1~127为功能代码编号,其中65~72和100~110为用户自定义编码,具体请看下面这张图片:

modbus_function_code_1.png

通用功能编码(Public function code)是已经公布的功能代码,有确定的功能,用户不能修改。比如:0x01表示读取线圈,0x02表示读取离散量的输入等等。下图是一些常用的功能代码的描述:

modbus_function_code.png

早期在RS485串行通信中规定ADU的最大长度为256个字节,其中:通信地址占用1个字节,校验段占用2个字节,所以协议数据单元(PDU)的最大长度为256-1-2=253 字节。而我三弟(Modbus TCP)因为要增加一个7个字节的MBAP(MODBUS Application Protocol)的报文头,所以他的ADU的长度=253+7=260 字节。

下面这张图是我(Modbus -RTU)的通信数据单元(ADU)的结构:

modbus_rtu.png

我可以使用不同功能代码来完成不同的功能,比如下面表格左边的请求(request)指令使用0x05功能来使线圈173变为ON状态:

modbus_set_coil.png

该PDU指令中,第一个字节表示功能号“05”表示对单独线圈进行写操作(write single coil);第二个字节表示线圈地址的高字节位,第三个字节表示线圈地址的低字节位(线圈的编号从0开始)。本例程中,第173号线圈的序号为172(0x00AC);第四个字节表示输出值得高字节位,第五个字节表示输出值的低字节位。对于单独线圈操作,0xFF00表示置位(ON),0x0000表示复位(OFF);不同的功能代码,其参数的字节的定义不同,使用时要参考下手册哦。

由于我(Modbus RTU)的报文格式没有定义帧的起始与结束字符,因此对于帧识别有时间上的要求:帧与帧之间的时间间隔要大于3.5个字符的时间;而帧内部的字符之间的间隔不能大于1.5个字符的时间,如下图:

frame_rtu.jpg

我大哥(Modbus - ASCII)的帧的起始和停止有明确的字符定义;而我三弟(Modbus TCP)在传输过程中要增加一个报文头—MBAP,以后有时间我再给你们介绍;

好了,有空去官网看看吧,可以下载PDF版本:


已经过安全软件检测无毒,请您放心下载。

取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论

牛年到,祝福到!

祝愿大家在新的一年里,身体健康,工作顺利,财运滚滚,牛年大吉!

×