Modbus协议在质量流量计组态软件中的应用
摘 要:该文根据质量流量计的应用实际,介绍了智能仪表上普遍采用的Modbus通信原理,分析了请求、响应的消息格式,介绍了地址,功能码,寄存器地址,数据位和校验码的组成,并给出了软件开发中常用的CRC校验程序和十六进制浮点数转换程序。
关键字:Modbus 通信 协议 RTU 流量计 校验码
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)
'计算CRC校验码
DimcrcAsLong
DimiAsInteger
DimjAsInteger
DimcarryAsInteger
crc=&HFFFF‘初始化
Fori=0Ton–1‘n为要生成CRC校验码的数据字节数,即传来的数组长度
crc=crcXordata(i)
Forj=1To8‘处理每个字节的每一位
crc=crcAnd&H2FFFF
IfcrcAnd&H1Then
carry=1
Else
carry=0
EndIf
crc=Int(crc/2)
Ifcarry<>0Then
crc=crcXor&HA001
EndIf
Nextj
Nexti
crc=crcAnd&H4FFFF
crc=crcAnd&H2FFFF
crc1=crcAnd&HFF‘取得CRC码低位
crc2=(crcAnd&HFF00)/256‘取得CRC码高位
EndSub
4 常见读写操作
4.1 读保持寄存器
实时采集和监控主要涉及读寄存器操作,如要采集流量计的瞬时流量,经查询艾默生质量流量计通信手册,得仪表中瞬时量的寄存器地址为20247-20248,共占用两个寄存器。地址的第一个数字2代表需使用功能码3进行读操作,将寄存器的地址减去1,即20247-20248要改为20246-20247,在请求消息中寄存器实际首地址用246(十六进制F6)表示,本例设仪表站地址为1,则发送的请求帧为:
将上面8个16进制数,发到仪表上,就可从串口收到下列数据(可用“串口精灵”工具软件进行试验):
返回的数据EB8542FB为4字节IEEE754格式浮点数,其结构为:1位符号位,8位指数位,23位尾数位,对此需进行规格化处理,得到仪表值为125.96。将4字节十六进制浮点数化为十进制数的子程序代码如下:
‘dat()数组中存放4字节待转化的十六进制数,函数返回十进制数。如将上面返回的数据进行转换,需赋值:dat(0)=&HEB,dat(1)=&H85,dat(2)=&H42,dat(3)=&HFB。
PrivateFunctionIEEE2float(dat()AsByte)Assingle
DimaAsSingle
DimbAsSingle
a=(dat(1)+dat(0)*256+(dat(3)And127)*65536)/8388608+1
b=((dat(2)And&H7F)*256+(dat(3)And&H80))/128-127
Ifa=1.25Andb=128Thenieee2float=0
Ifa<>1.25Andb<>128Then
IEEE2float=a*(2^b)
EndIf
Ifdat(2)And128Then
IEEE2float=-IEEE2float‘符号位为1则为负数
EndIf
EndFunction
4.2 写保持寄存器
在实际工作中除读寄存器外,有时还需改动仪表参数,进行写寄存器操作。如要将从设备的轮询地址(PollAddress)改为4,4为整数占用两个字节,需用一个寄存器,经查其寄存器的起始地址为40047,4表示对保持寄存器操作,写操作的功能号为16,寄存器地址减去1为46(十六进制2E),则向从设备发送如下命令,则可完成将从设备的地址改成4的操作,其发送消息格式如下:
4.3 程序设计
在软件开发过程中,考虑到现有组态软件大多支持VB脚本程序,采用了VisualBasic6。0程序设计语言,其中通信模块利用Mscomm32。ocx控件实现,由于支持的属性和方法较多,编程方便,被用户普遍采用。主程序主要由串口初始化,设置波特率,发送请求,等待响应,处理串口数据等模块组成。在编程中需注意因ModbusRTU是基于二进制的,发送和返回消息中都包含了大于127的编码,故需设置Mscomm的属性为二进制,即在程序中设置:MSComm1。InputMode=comInputModeBinary。
5 结束语
企业ERP、MES的实施,对过程控制层仪表的通信提出了更高的要求,其目的是可连续7×24小时、实时性的采集现场数据,了解工艺状况,跟踪产品质量。与此同时,对仪表的监控、维护和管理将更加严格,本文讨论的流量计组态软件的使用可减轻仪表技术人员的劳动强度,方便操作和生产,对其他基于Modbus通信协议的设备也有重要参考价值。
参考文献:
[1] 阳宪惠。现场总线技术及其应用[M]。北京:清华大学出版社,2008。
[2] 李长林。VisualBasic串口通信技术与典型实例[M]。北京:清华大学出版社,2006。
[3] 龚建伟,能光明。VisualC++/TruboC串口通信编程实践[M]。北京:电子工业出版社,2004。
- 上一篇:基于MODBUS_RTU协议的HK-CMF质量流量计通信软件 2015/12/31
- 下一篇:HK-CMF质量流量计在液氯充装上的应用 2015/12/29