Modbus消息帧
在兩种传输模式(ASCII或RTU)中,传输设备将Modbus消息转换為具有起点和终点的帧,從而允许接收设备從消息的开头开始工作,读取地址分配信息,判断选择了哪个设备(广播模式传输到所有设备),并判断信息何時完成。还可以检测某些消息,并将错误设置為返回结果。
3.1ASCII帧
使用ASCII模式,消息以冒号(:)字符(ASCII代码3ah)开头,以回车换行符(ASCII代码0dh,0ah)结尾。
可以在其他字段中使用的传输字符是十陆進制09,A。。F.网络上的设备不断检测“:”字符。当收到冒号時,每个设备对下壹个域(地址域)進行解码,以确定是否将其發送给自身。
消息中發送字符之间的最大時间间隔不应超過1秒,否则接收设备将考虑传输错误。典型的消息框如下所示:
3.2RTU框架
使用RTU模式時,消息發送应以至少3.5个字符的暂停间隔开始。在网络波特率下最容易实现多字符時间。传输的第壹个域是设备地址。可以使用的传输字符是十陆進制09,A。。F.网络设备持续检测网络总线,包括暂停间隔。当接收到第壹个域(地址域)時,每个设备進行解码以确定是否将其發送到自己的域。在最后传输的字符之后,至少3.5个字符的暂停标志着消息的结束。在此暂停后,可以启動壹条新消息。
整个消息帧必须作為连续流输入。如果帧完成前的暂停時间超過1.5个字符,接收设备将刷新未完成的消息,并假定下壹个字节是新消息的地址字段。类似地,如果壹个新消息從少于3.5个字符的前壹个消息开始,则接收设备将认為它是先前消息的延续。这将导致错误,因為最后壹个CRC字段中的值不正确。典型的消息帧如下所示:
3.3地址域
消息帧的地址字段包含兩个字符(ASCII)或8位(RTU)。可能的從属地址為0247(十進制)。单个设备的地址范围為1247。主设备通過将要联系的從设备的地址放入消息中的地址字段來对從设备進行门控。当從设备發送响应消息時,它将其地址放入响应地址字段,以便主设备知道哪个设备响应了。
地址0用作广播地址,以便所有從属设备都能识别它。当Modbus协议用于更高级别的网络時,可能不允许广播或以其他方式代替广播。
3.4如何处理功能域
消息框中的功能代码字段包含兩个字符(ASCII)或8位(RTU)。可能的代码范围為十進制1255。当然,有些代码适用于所有控制器,有些代码适用于某些控制器,有些代码保留供将來使用。
当從主设备向從设备發送消息時,功能代码字段将告诉從设备要执行的行為。例如,要读取输入开关状态,请读取壹组寄存器的数据内容,读取從设备的诊断状态,并允许传输、记录和验证從设备中的程序。
当從设备响应時,它使用功能代码字段指示是正常响应(無错误)还是發生错误(称為异议响应)。对于正常响应,從设备仅响应相应的功能代码。作為对异议的响应,设备返回壹个与普通代码等效的代码,但最重要的位置是逻辑1。
例如,如果從主设备發送到從设备的消息需要读取壹组保持寄存器,则将生成以下功能代码:011(十陆進制03h)
对于正常响应,從设备仅响应相同的功能代码。作為对异议的响应,它返回:10011(十陆進制83h)
除了由于异议错误而修改功能代码外,從设备还在响应消息的数据字段中输入壹个唯壹的代码,该代码可以告诉主设备發生了什么错误。
在主设备应用程序收到对异议的响应后,典型的過程是重新發送消息,或者诊断發送到從设备的消息并将其报告给操作员。
3.5数据字段
数据字段由兩组十陆進制数字组成,范围為00FF。根据网络传输模式,这可以由壹对ASCII字符或壹个RTU字符组成。
從主设备發送到從设备的消息数据字段包含附加信息:必须使用從设备执行功能代码定义的操作。例如,这包括不连续的寄存器地址、要处理的项目数和字段中的实际数据字节数。
例如,如果主设备需要從设备读取壹组保持寄存器(功能代码03),则数据字段指定起始寄存器和要读取的寄存器数量。如果主设备写入壹组從设备寄存器(功能代码10十陆進制),则数据字段指示要写入的起始寄存器、要写入的寄存器数、数据字段的数据字节数以及要写入寄存器的数据。
如果没有發生错误,则從设备返回的数据字段包含请求的数据。如果發生错误,此字段包含反对代码,主设备应用程序可使用该代码确定下壹个操作。
在某些消息中,数据字段可能不存在(長度為0)。例如,主设备要求從设备响应通信事件记录(功能代码0bhex),而從设备不需要任何附加信息。
3.6错误检测域
标准MODBUS网络有兩种错误检测方法。错误检测字段的内容取决于所选的检测方法。
ASCII码
当选择ASCII模式作為字符帧時,错误检测字段包含兩个ASCII字符。这是使用LRC(纵向冗余检测)方法從消息内容计算得出的,不包括起始冒号和回车换行符。LRC字符追加到回车换行符之后。
远程终端
当选择RTU模式作為字符帧時,错误检测字段包含16位值(由兩个8位字符实现)。错误检测域的内容通過消息内容的循环详细性检测获得。CRC字段附加在消息的末尾。当添加時,低字节首先后跟高字节。因此,CRC的高位字节是發送消息的最后壹个字节。
3.7字符的连续传输
通過标准MODBUS系列网络传输消息時,每个字符或字节按如下方式發送
4、错误检测方法
标准MODBUS串行网络使用兩种错误检测方法。奇偶校验可用于每个字符,帧检测(LRC或CRC)应用于整个消息。它们在消息發送之前由主设备生成,從设备在接收過程中检测每个字符和整个消息帧。
用户应為主设备配置预定义的超時時间间隔,该時间间隔应足够長,以便任何從设备都能正常响应。如果從设备检测到传输错误,则不會接收消息,也不會响应主设备。这样,超時事件将触發主机來处理错误。發送到不存在的從属设备的地址也會生成超時。
4.1平价
用户可以将控制器配置為奇数或偶数检查,或不检查。这将决定如何设置每个字符中的奇偶校验位。
如果指定奇偶校验,则“1”的位数将计入每个字符的位数(ASCII模式下為7个数据位,RTU模式下為8个数据位)。例如,RTU字符帧包含以下8个数据位:1100101
“1”的整数是4。如果使用奇偶校验,帧的奇偶校验位将為0,因此整个“1”的数字仍然是4。如果使用奇偶校验,帧的奇偶校验位将為1,因此“1”的数目為5。
如果未指定奇偶校验位,则传输期间将没有奇偶校验位,并且不會执行验证检测。它不是额外的停止位,而是填充到要传输的字符帧中。
4.2LRC检测
使用ASCII模式,消息包括基于LRC方法的错误检测域。LRC域检测消息域中的内容,但起始冒号和结束回车行号除外。
LRC字段是壹个包含8位贰進制值的字节。LRC值由發送设备计算并放入消息帧中。接收设备在接收消息的過程中计算LRC,并将其与接收消息中LRC域中的值進行比较。如果兩个值不相等,则存在错误。
LRC方法是连续累积消息中的8位字节并丢弃進位。
4.3CRC检测
使用RTU模式,消息包括基于CRC方法的错误检测域。CRC域检测整个消息的内容。
CRC字段為兩个字节,包含壹个16位贰進制值。它由传输设备计算并添加到消息中。接收设备重新计算接收到的消息的CRC,并将其与接收到的CRC域中的值進行比较。如果兩个值不同,则存在错误。
CRC首先放入壹个值均為“1”的16位寄存器,然后调用对消息中8位字节的当前寄存器中的值的处理。每个字符中只有8位数据对CRC有效,起始位、停止位和奇偶校验位無效。
在CRC生成過程中,每个8位字符与寄存器内容或(或)独立关联,结果移到最低有效位,最高有效位用0填充。提取并检测LSB。如果LSB為1,则寄存器為独立且预设值或更低。如果LSB為0,则不會执行该操作。整个過程应重复8次。最后壹位(第8位)完成后,下壹个8位字节与寄存器的当前值独立关联。最终寄存器中的值是消息中所有字节执行后的CRC值。
当CRC被添加到消息中時,首先添加低字节,然后添加高字节。
5、ModbusRTU通信协议和编程
Modbus通信协议分為RTU协议和ASCII协议。目前,各种仪表采用ModbusRTU通信协议,如ch2000智能功率监测器、ch2000m功率参数采集模块、巡检仪、数显表、光柱数显表等。ModbusRTU协议简要介绍如下:
5.1通信协议
5.1.1通信传输方式
通信传输分為独立信息头和传输的编码数据。以下通信传输模式定义也与ModbusRTU通信协议兼容:
Modbus协议简介(图10)
初始结构=≥4字节的時间
地址代码=1字节
功能代码=1字节
数据区=n字节
错误检查=16位CRC代码
末端结构=≥4字节的時间
地址代码:
地址码是通過通信传输的第壹个字节。此字节表示具有用户设置的地址代码的從机将接收主机發送的信息。每个從机都有壹个唯壹的地址码,响应环回從它自己的地址码开始。主机發送的地址码表示要發送的從机地址,從机發送的地址码表示返回的從机地址。
功能代码:
通信传输的第贰个字节。Modbus通信协议将功能编号定义為1至127。作為主请求發送,并通過功能代码告知從机要执行的操作;作為從机响应,從机發送的功能代码与主机發送的功能代码相同,表示從机已响应主机進行操作。如果從机發送的功能代码的最高位為1(例如,功能代码為127),则表示從机不响应操作或發送错误。
数据区:
根据不同的功能代码,数据区域是不同的。数据区可以是实际值、设定值、主机發送到從机的地址或從机發送到主机的地址。
CRC码:
双字节错误检测代码。
5.1.2通信协议
当向仪器發送通信命令時,符合相应地址代码的设备接收通信命令,删除地址代码,读取信息,如果没有错误,则执行相应任务;然后将执行结果返回给發送方。返回的信息包括地址代码、操作的功能代码、操作后结果的数据和错误检查代码。如果出现错误,则不發送任何消息。