【温湿度监控】Modbus协议分析——TCP/RTU

《Modbus协议分析——TCP/RTU》(转载)

两种传输方式

控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。

所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。

1、ASCII模式

当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit
字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生
错误。
代码系统
· 十六进制,ASCII字符0...9,A...F 
· 消息中的每个ASCII字符都是一个十六进制字符组成
每个字节的位
· 1个起始位
· 7个数据位,最小的有效位先发送
· 1个奇偶校验位,无校验则无
· 1个停止位(有校验时),2个Bit(无校验时)
错误检测域
· LRC(纵向冗长检测) 

2、RTU模式

当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两
个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的
数据。
代码系统
· 8位二进制,十六进制数0...9,A...F 
· 消息中的每个8位域都是一个两个十六进制字符组成
每个字节的位
· 1个起始位
· 8个数据位,最小的有效位先发送
· 1个奇偶校验位,无校验则无
· 1个停止位(有校验时),2个Bit(无校验时)
错误检测域
· CRC(循环冗长检测) 

Modbus消息帧(重点)

两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。
1、ASCII帧
使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。其它域可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:


2、RTU帧
使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:




Modbus RTU协议格式:

请求和响应带有六个字节的前缀,如下:
      byte 0:     设备地址
      byte 1:     功能码
      byte 2:     寄存器地址
      byte 3:     寄存器地址
      byte 4:     数据长度
      byte 5:     数据长度
      byte 6:     CRC校验
      byte 7:     CRC校验




举例:Modbus-RTU读取温湿度仪表


小海注解:在实际温度值当中xxxx(看成整体内含两个字节:如\x0150-->336(十进制))转换为16进制,然后除以10就是正常的温度值了

                   同理,湿度值也是如此。

Modbus TCP协议格式:

TCP和RTU协议非常类似,只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可 

 MBAP Header长度共7个字节,分别为Transaction identifier(事务标识符),Protocol identifier(协议标识符),Length(长度),
 Unitidentifier(单元标识符)组成,具体如下表所示:

请求和响应带有六个字节的前缀,如下:
      byte 0:     事务处理标识符 –由服务器复制 –通常为 0
      byte 1:     事务处理标识符 –由服务器复制 –通常为 0
      byte 2:     协议标识符= 0
      byte 3:     协议标识符= 0
      byte 4:     长度字段 (上半部分字节) = 0 (所有的消息长度小于256)
      byte 5:     长度字段  (下半部分字节)   = 后面字节的数量
      byte 6:     单元标识符 (原“从站地址”)
      byte 7:     MODBUS 功能代码
      byte 8 on:   所需的数据

地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
功能码:主机发送的功能码告诉从机执行什么任务。下表列出的功能码都有具体的含义及操作。

数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。

各种情况下的协议格式如下:





举例:Modbus-TCP读取温湿度仪表(注:通讯涉及的均为 6 16  进制)

湿度: 等于(实际值 *100 ),单位为百分号。
温度:等于(实际值 *100 + 27315 )。
温度举例: :
假如 软件 读取到温度 值 为6 : 75 C1 (16  进制) ) – 转换为 30145 ( 十进制) )
实际温度用 T T  表示 :T = (30145  – 27315)/100 = 28.3 ( ( ℃) )
寄存器内容定义:
只读对象: 
0x0000: 当前湿度值,
0x0001: 当前温度值,
读取温湿度数据举例 ( 读取1 号仪表的温湿度值 ,03  命令) :
起始地址 读取个数
请求: 00 00 00 00 00 06 01 03 00 00 00 02
响应: 00 00 00 00 00 07 01 03 04 18 3E 77 51

协议解析:
请求:
00 00 00 00 固定码
00 06 数据长度

01 设备地址
03 功能码
00 00 起始寄存器地址
00 02 读取寄存器个数
响应:
00 00 00 00 固定码
00 07 数据长度
01 设备地址
03 功能码
04 返回寄存器数据长度
18 3E 湿度(实际湿度 = 6206/100 = 62.06%)
77 51 温度(实际温度 = (30545 -27315)/100 = 31.30℃)


说明:

实际上Modbus协议包括ASCII、RTU、TCP。
标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式。 
Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验.
ModbusTCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。


MODBUS TCP和MODBUS RTU的差别不是很大。

二者相同的地方是应用数据单元是一致的。

差别是MODBUS TCP是传输在TCP/IP网络上的,多了一个报文头,少了CRC校验,采用TCP的502端口

RTU多了设备地址和CRC校验


原文地址:http://blog.csdn.net/yangbingzhou/article/details/39504015


实际项目应用:


机房温室湿度监控数据采集


参考文献

【1】朱小襄. ModBus通信协议及编程[J]. 信息化研究, 2005, 31(7):42-44.


猜你喜欢

转载自blog.csdn.net/xiaohaijiejie/article/details/71763737