Modbus协议在质量流量计组态软件中的应用
1 引言
Modbus协议由Modicon公司在1978年发明,是全球第一个真正用于工业现场的总线协议,Modbus具有开放,简单的重要特性,用户可以免费、放心地使用Modbus协议,不用交纳许可证费,也不会侵犯知识产权。Modbus帧格式简单、紧凑,用户使用容易,厂商开发便利。随着仪表和通信技术的发展,Modbus协议正向网络化发展,目前其于ModbusTCP/IP的通信正在工业以太网领域得到用户青睐。Modbus由于得到众多仪表厂家的支持,在PLC、智能仪表上的成功应用,使其成为工业自动化领域的事实标准。近年来,各仪表厂家纷纷采用该标准,生产支持Modbus协议的产品,如横河,艾默生,E+H,ABB等,尤其艾默生公司生产的流量仪表除保留HART协议外还向用户提供了基于Modbus协议的RS485通信接口,以支持远程通信。我厂是石油化工企业,现场使用的大多是流量式仪表-质量流量计,其中支持Modbus协议占大多数,在生产实践中,我们根据有关技术文献,利用高级语言开发了非常实用的流量计组态软件,具备Modbus的基本功能,可完成标零,校准,修改流量系数,故障诊断等功能,还支持网络和数据存储,为仪表的调校和维护提供了快捷方便的工具。 2 Modbus协议
Modbus协议在控制系统和设备之间采用类似短语的格式进行通信,所有发送的信息包均具有相同的格式。Modbus采用主从工作方式:主设备(Host)为智能终端或上位机,从设备(Slave)为多台遵守Modbus协议的智能仪表或变送器。每台设备可由用户设定地址以实现访问操作,地址范围为0-247,其中0为广播地址,所有从设备都可识别但不响应。Modbus要访问设备中的参数需要用户确定其参数的位置(地址),即读取、写入数据,需要明确该数据存放在哪个寄存器上。Modbus手册向用户提供了设备中每个参数的具体位置,用户通过命令可以进行读、写有关“位”信息和“字节”信息。 Modbus协议建立的主设备查询格式:设备(或广播)地址、功能代码、所有要发送的数据、错误校验码。从设备回应消息也由Modbus协议构成,包括地址、功能代码、返回的数据和一错误检测域。如果在消息接收过程中发生错误,或从设备不能执行其命令,从设备将发回一错误消息。
如图1为主-从设备查询响应循环。
标准的Modbus协议使用两种模式进行通信:ASCII和RTU,这两种模式在报文结构、功能代码上相同,仅错误校验方法不同。
2.1 ASCII模式
当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信时,在消息中的每8Bit字节都作为两个ASCII字符发送,在ASCII模式下,消息均以“:”
(十六进制3A)开始,以回车换行(十六进制0D和0A)结束。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误,ASCII模式通信要比RTU模式占用更多的空间,但编程、解码方便,ASCII消息帧格式如下:
字节格式:
1)采用十六进制,ASCII字符0…9,A…F。
2)消息中的每个ASCII字符都是由一个十六进制字符组成。
3)字节中位的组成:1个起始位,7个数据位,1个奇偶校验位(无校验则无),1个停止位(有校验时)或2个停止位(无校验时)。
4)错误校验域,采用LRC校验(所有字节进行异或运算形成纵向冗余校验) 2.2 RTU(RemoteTerminalUnit)模式
当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信时,信息是以8位二进制方式传送的,这种方式的最大好处是
在同等传输速率下,可以比ASCII模式传送较多的信息,该模式在智能仪表、PLC、DCS上普遍采用。 字节格式:
1)采用8位二进制,十六进制数0…9,A…F表示。 2)消息中的每个8位域都是一个两个十六进制字符组成。
3)字节中位的组成:1个起始位,8个数据位,1个奇偶校验位(无校验则无),1个停止位(有校验时)或2个停止位(无校验时)。 4)错误校验域,采用CRC(循环冗余校验) 3 协议帧格式
Modbus消息格式由地址、功能码、数据段、校验码等四部分组成,数据段内容根据主-从之间的关系可包括寄存器起始地址、寄存器数量、字节数、数据位等。主设备向从设备发送的请求称为主-从帧,由多个信息组成:从设备必须执行的功能代码,连续的或不连续的寄存器地址,要处理项的数目,域中实际数据等。
例如,如果主设备需从设备中读取一组保持寄存器的值(功能代码03),数据域需指定起始寄存器以及要读取的寄存器数量。如果主设备向从设备的一组寄存器写入信息(功能代码10十六进制),数据域则指明要写的起始寄存器地址以及要写的寄存器数量,数据域的字节数和要写入寄存器的数据等。下表是主设备查询从设备的消息格式:
从设备得到请求后向主设备发送的响应格式:
其中“数据长度”就是“返回数据”域的字节个数,也就是请求消息中的“寄存器数量”乘以2的值。 3.1 地址
帧首的Address地址为智能仪表的轮询地址,范围为0-247,一般RS485接口仅支持0-32。这个字节表明仅拥有该地址的从设备返回信息,其他设备不应答,每个设备都要有惟一的地址,返回的信息均以各设备的地址码开始。 3.2 功能码
信息帧的功能码可用两个字节表示,范围为1-255,功能码表示主机要求设备执行的操作种类,如03表示读保持寄存器数据,05表示修改某个线圈位,16表示修改设备地址等,此外,设备响应主机时,还用功能码指示设备的工作状态,用以表示响应是否正常,若出现错误,功能码最高位被置为1。表1是部分常见功能码的含义。 3.3 数据域
数据域是请求和响应的主要内容,主机向设备请求读取寄存器内容时,数据域包括寄存器的起始地址以及读取的寄存器个数。寄存器是设备存放数据的地方,一个寄存器可存储2字节二进制数据或两个ASCII字符,寄存器地址为16位,按高位在前低位在后排列,有关寄存器地址可查阅仪表通信手册。设备回送响应的数据域包括数据长度、实际采集的数据,另外,当设备出现异常时,数据域存放的则是错误代码,根据错误代码软件可进行报警处理。 3.4 寄存器地址
寄存器地址通常用5位十进制数表示,如20247,30120等,由于Modbus所有信息地址均是以0为起始位置的,第一个寄存器的地址就是0,故其余地址均要减去1,例如:保持寄存器40001的地址就是0000,其中4是表示要对保持寄存器进行操作,20108的寄存器地址就是108-1=107,转成十六进制就是006B。表2是常见地址的操作类型。
3.5 校验码
为避免误码保证通信的可靠性,标准的MODBUS协议有两种数据校验方法:LRC(纵向冗余校验)和CRC(循环冗余校验)。LRC用于ASCII模式的传输校验,校验范围是从地址到校验码之前的数据,连续异或后得出校验码。CRC用于RTU模式的传输校验,采用的是通信领域常用的CRC-16校验法,CRC长度为2字节,其中低位在前,高位在后,以下给出在VB下CRC校验码的生成例子:
在函数的调用参数中:data为要进行校验的数据序列(自地址到校验码之前的数据),crc1为低位,crc2为高位。
PublicSubMake_CRC(data()AsByte,ByValnAsInteger,crc1AsByte,crc2AsByte)
相关推荐: