串行通信 - Modbus协议

Modbus协议采用的是主-从通信模式。
Modbus协议主要有Modbus RTU、Modbus ASCII和Modbus TCP三种。前两者均支持RS-485总线协议。其中RTU采用二进制数据表达形式、数据结构紧凑,通信效率高,应用广泛。


Modbus的三种传输模式
ASCII模式:数据中每8bit的字节作为一个ASCII码发送。字符发送的时间间隔可达到1s,不产生错误。
RTU模式:以RTU(远程终端单元)模式通信,每8bit的字节都包含两个4bit的十六进制字符。传输数据比ASCII模式更多。
TCP模式:用于通过以太网或互联网来连接和传输 数据,由于互联网遵循的是TCP/IP模式。
Modbus模式未必是串行通信所用,也可以是TCP/IP通信。


ASCII模式与RTU模式的区别
ASCII模式数据位数为7位,RTU模式为8位。
ASCII模式采用LRC(纵向冗余校验)的错误校验方法,RTU使用CRC(循环冗余校验)方法。
ASCII模式发送字符的间隔可以达到1s,以适用不同速率的设备,RTU模式必须以连续数据流形式传输。

ASCII模式每个字节的位:1位起始位,7位数据位,最低有效位先发送;1位奇偶校验位,1位停止位;
RTU模式:1位起始位,8位数据位,最低有效位先发送;1位奇偶校验位,1位停止位;


常用的通信模式(9600,N,8,1)是一个字节的传输协议;
Modbus协议是如何用串口一次连续传输多个字节的协议,它规定了一次发送多少个字节,以及字节顺序如何排列。
Modbus协议定义了校验码、数据序列等,即定义了特定数据交换的必要内容。通信时,主机的信号寻址到一台特定地址的终端设备,然后终端设备发出的应答信号以相反的方向传输给主机。


主-从技术
主设备(Master)能初始化传输,从机(Slave)根据主设备查询提供的数据做出相应的回应。
Modbus协议建立的主控制器查询的格式是:设备地址码,功能码,要发送的数据,错误检测域。
从机回应协议包含要行动的域,要返回的值和错误检测域。
传输设备将Modbus消息转为有起点和终点的帧,使接收的设备在消息起始处开始工作,读地址分配信息,判断哪个设备被选中,判断何时消息被完成,侦测到部分消息的错误并且返回


查询-回应周期
查询:查询消息中功能码告知被选中的从机将要执行的功能,数据段包含从设备要执行功能的所有附加消息。
回应:数据段包含了从设备收集的数据,比如寄存器值或状态。如果有错误发生,功能码用于指出回应消息是错误都,同时数据段包含了描述此错误信息的代码。


ASCII消息帧与RTU消息帧
ASCII模式消息以冒号":"开始,以回车、换行符结束。总线上设备的不断检测冒号,当接收到冒号后,从机设备解码判断消息对象是否为自己。

RTU模式下消息的发送至少要以3.5个字符时间的停顿间隔开始,传输的第一个域为设备地址,在最后一个传输字符之后,一个至少3.5字符时间的停顿标定了消息的结束。
整个消息帧必须作为连续流传输,在完成之前如有1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定停顿时间后收到的字节是一个新消息的地址域。
若两消息帧的停顿时间小于3.5个字符时间,则认为后一段消息是前一段消息的延续。
在这里插入图片描述

功能域
包含8位bit,部分功能适用于所有控制器,有些则应用于某种控制器,比如读取输入段的状态、读取寄存器的内容等等。
从机回应时,使用功能码来指示是否正常,或错误,出现错误时返回功能码的低位置1.从设备还可以将独特的代码放到回应消息的数据域中,告诉主机具体出现了什么类型的错误。

举例 主机发送功能域位03H,从机异议回应为83H.

数据域
数据域由2个十六进制数集合而成,包含从设备需要执行的行为的具体参数。如果主设备准备写一组从设备的寄存器,数据域则指明了要写的起始寄存器以及要写的寄存器数量,字节数,要写数据。

数据域可以是不存在的,例如从机回应通信应答。

错误检测域

==ASCII-LRC纵向冗余检测:==将每个字节的所有位相加得出一个校验和,并在传输结束后将校验和发送给接收方进行验证。

LRC校验可以检测传输过程中出现的单比特差错和某些双比特差错,但并不能检测出所有错误,因为多个错误可能会互相抵消。此外,LRC校验也无法纠正错误,只能检测错误是否存在。

==RTU-CRC循环冗余检测:==通过在数据传输前计算出一个校验码,并将其添加到数据末尾,来保证数据传输的准确性。这个校验码可以被接收方用来检测是否存在数据损坏或传输错误。


Modbus 以帧的方式传输,每帧有确定的起始位和结束位,使接收设备在信息的起始位开始读地址,并确定要寻址的设备,以及信息传输的结束时间。RTU 模式中,信息开始至少需要有 3.5 个字符的停顿时间,依据使用的波特率,很容易计算停顿时间。

各个域允许发送的字符均为十六进制。Modbus 网络上的设备连续监测网络上的信息,包括停顿时间。当接收第一个地址数据时,每台设备立即对它解码,以决定是不是自己的地址。发送完最后一个字符后,也有一个至少 3.5 个字符的停顿时间,然后才能发送一个新的信息。整个信息必须连续发送。如果在发送信息帧期间,出现大于 1.5 个字符的停顿时间,则接收设备刷新不完整的信息,并进行下一个地址数据接收。主设备把从设备的地址放入信息帧的设备地址域,并向从设备寻址。从设备响应时,把自己的地址放入响应信息的设备地址域,让主设备识别已做出响应的从设备地址。地址 0用于广播地址,所有从设备均能识别。

接在设备地址后面的就是功能码,接在功能码的后面是数据域。数据域有 2个十六进制的数据,数据范围为 00FF(十六进制)。主设备向从设备发送的数据中包含了从机执行主设备功能码中规定的请求动作,如逻辑线圈地址、处理对象的数目,以及实际的数据字节数等。

接在数据域后面的是校验域(CRC 校验)。CRC 校验有 2个字节,包含一个 16 位的值(2个8 位字节),它由发送设备计算后加入消息中。接收设备重新计算收到消息的 CRC 值,并与接收到的 CRC 值进行比较,如果两值不同,则有误。


TCP和RTU协议非常相似,只要在RTU协议的开始加上五个“00”和1个“06”,然后把RTU协议的最后两个字节的校验码去掉,通过TCP\IP网络发送出来即可。

TCP是面向可靠连接的,不存在所谓的地址码


HART下回学

猜你喜欢

转载自blog.csdn.net/Wangwenshuaicsdn/article/details/129944091