李晓光
齐鲁石化信息网络中心
摘要:简要介绍了HART协议,对HART协议的构成进行了分析,对HART消息的具体构成单元进行了说明。给除了编程具体事例。
关键词:HART;消息结构;长结构;短结构
1引言
1986年,由Rosemount提出HART(HighwayAddressableRemoteTransducer,可寻址远程传感器数据通路)通信协议,它是在4-20mADC模拟信号上叠加FSK(FrequencyShiftKeying,频率调制键控)数字信号,既可用作4-20mADC模拟仪表,也可以用做数字通信仪表。1993年,成立了HART通信基金会HCF(HARTCommunicationFoundation),约有70多个公司加盟,如Siemens、Yokogawa、E+H、Fisher、Rosemount等。虽然现在看来随着各种总线协议的成熟,HART协议以沦为一种过渡性的协议,但国内还是用着很多的支持HART协议的智能仪表。在相当长一段时间内,HART协议的产品仍会占据一定的市场。目前许多企业仅仅作为人工操作仪表来用,这决定了国内对HART协议应用的水平还不高,各组态软件厂商对HART协议的支持还很有限,不能直接在组台软件中直接支持HART协议的设备。
2HART协议简介
HART协议规定了传输的物理形式、消息结构、数据格式和一系列操作命令,是一种主从协议。当通讯模式为“问答式”的时候,一个现场设备只做出被要求的应答。HART协议允许系统中存在2个主机(比如说,一个用于系统控制,另一个用于HART通信的手操仪),如果不需要模拟信号,多点系统中的一对电缆线上最多可以连接15个从设备。
当地址为0时,则处于4~20mA的DC与数字通信兼容状态;当地址为1~15时,则处于全数字通信状态,通信模式为“问答式”或“突发式”。
2.1帧格式
图1HART协议信息结构形式
如图1所示,一条消息包括源地址、目的地址和一个校验位。每一个应答消息中包括场设备状态,他用于确保持续通讯的顺畅进行。数据位可有可无,视具体情况而定。一般每秒种可以传输2~3条消息。
HART5.0以前版本的设备一般采用“短结构”,单一的现场设备如果只利用4~20mA电流信号进行测量时,从设备的地址都是0;否则,对于多设备而言,从设备的地址是从1~15,这种短结构的地址采用“随选”的方法,随机分配1~15中的一个。HART5.0版本推出了“长结构”,这种格式的从设备地址具有独一无二性,如同每个网卡中物理地址一样,全世界范围内都没有重复,一般占5个地址字节中的38位。这38位地址信息包含了生产厂家的代码、设备型号码和设备识别码。这种格式减少了误传输和误接收的可能性。现在大多数主机设备既能支持长结构又兼容短结构,当从机的应答信号中没有“惟一”标识码时,HART5.0及其以上的版本提供的0号命令,就可以用于短帧中的设备地址识别。也就是说,主机将根据应答信号中是否具有“惟一”标识码来决定结构格式为“长”还是“短”。
我们从图1中可以简单地看出一般消息帧的组成,其中:
(1)PREAMBLE导言字节,一般是5~20个FF十六进制字节。他实际上是同步信号,各通讯设备可以据此略做调整,保证信息的同步。在开始通讯的时候,使用的是20个FF导言,从机应答0信号时将告之主机他“希望”接收几个字节的导言,另外主机也可以用59号命令告诉从机应答时应用几位导言。
(2)START起始字节,他将告之使用的结构为“长”还是“短”、消息源、是否是“突发”模式消息。主机到从机为短结构时,起始位为02,长帧时为82。从机到主机的短结构值为06,长结构值为86。而为“突发”模式的短结构值为01,长结构为81。一般设备进行通讯接收到2个FF字节后,就将侦听起始位。
(3)ADDR地址字节,他包含了主机地址和从机地址,如前所述,短结构中占1字节,长结构中占5字节。无论长结构还是短结构,因为HART协议中允许2个主机存在,所以我们用首字节的最高位来进行区分,值为1表示第一主机地址,第二主机用0表示。“突发”模式是特例,0,1值将交替出现,也就是说,在该模式下,赋予2个主机的机会均等。次高位为1表示为“突发”模式,短结构用首字节的0~4位表示值为0~15的从机地址,第5,6位赋0;而长结构用后6位表示从机的生产厂商的代码,第2个字节表示从机设备型号代码,后3~5个字节表示从机的设备序列号,构成“惟一”标志码。如图3和图4所示。
另外,长结构的低38位如果都是0的话表示的是广播地址,即消息发送给所有的设备。
(4)COM命令字节,他的范围为253个,用HEX的0~FD表示。31,127,254,255为预留值。
(5)BCNT数据总长度,他的值表示的是BCNT下一个字节到最后(不包括校验字节)的字节数。接收设备用他可以鉴别出校验字节,也可以知道消息的结束。因为规定数据最多为25字节,所以他的值是从0~27。
(6)STATUS状态字节,他也叫做“响应码”,顾名思义,他只存在于从机响应主机消息的时候,用2字节表示。他将报告通讯中的错误、接收命令的状态(如:设备忙、无法识别命令等)和从机的操作状态。
如果我们在通讯过程中发现了错误,首字节的最高位(第7位)将置1,其余的7位将汇报出错误的细节,而第2个字节全为0。否则,当首字节的最高位为0时,表示通讯正常,其余的7位表示命令响应情况,第2个字节表示场设备状态的信息。
UART发现的通讯错误一般有:奇偶校验、溢出和结构错误等。命令响应码可以有128个,表示错误和警告,他们可以是单一的意义,也可以有多种意义,我们通过特殊命令进行定义、规定。场设备状态信息用来表示故障和非正常操作模式。
(7)DATA数据字节,首先我想说明的是并非所有的命令和响应都包含数据字节,他最多不超过25字节(随着通讯速度的提高,正在要求放宽这一标准)。数据的形式可以是无符号的整数(可以是8,16,24,32b),浮点数(用IEEE754单精浮点格式)或ASCII字符串,还有预先制定的单位数据列表。具体的数据个数根据不同的命令而定。
(8)CHK奇偶校验,方式是纵向奇偶校验,从起始字节开始到奇偶校验前一个字节为止。另外,每一个字节都有1位的校验位,这两者的结合可以检测出3位的突发错误。
通常情况下,在“应答模式”下1s可以2次通讯,在“突发模式”下,每秒钟可以传送3条消息。
2.2常用重要命令介绍
(1)0号和11号命令用于识别现场设备。我们知道无论采用长结构还是短结构都可以标识现场设备,应答0号命令的信息中就包含了对不同设备的标识;然后,主机建立不同的标志,为随后的长结构命令做准备。在HART4.0版本及以前,传输类型码分为2字节:一个是生产厂商代码,另一个是设备类型代码。而两个字节还可以节略。到了HART5.0版本就必须使用充扩的代码表示设备信息,还用ID号代替了最终流水线号。
一个主机通常以0号命令开始通讯,赋予随选地址0,然后扫描1~15地址,看谁期待操作,显然由于HART5.0版本后的设备,主机可以使用11号命令,再带一个全0的广播地址,外加命令中的标志作为数据,等待着具有相同标志的从机响应,而应答的11号命令等同于0号命令。
(2)2和3号命令用于读取不同形式中的测量变量。命令2和3中有以mA为单位的电流值,电流值只有在设定输出范围内才可以作为主参量PV,而在其他时候,像复用模式、输出量可变、饱和或设备错误都不能如此使用。尽管PV和其他动态变量不受设定输出范围的限制,但是却必须受限于传感设备。
3MSComm控件简介
MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。MicrosoftCommunicationsControl(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
MSComm控件的常用属性
MSComm控件有很多重要的属性,但首先必须熟悉几个属性。
CommPort设置并返回通讯端口号。
Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen设置并返回通讯端口的状态。也可以打开和关闭端口。
Input从接收缓冲区返回和删除字符。
Output向传输缓冲区写一个字符串。
4编程
在胜利炼油厂鲁皖管道齐鲁首站的数采系统中,使用了3台Rosemount2700智能变送器,使用Delphi,利用MsComm控件,采用HART协议实现了数据的采集。
4.1程序流程图
4.2发送命令、接受数据部分代码如下
var
senddata:array[1..10]ofchar;
reData:arrayofVariant;
sendstr:string;
restr:string;
i:longint;
begin
mscomm1.CommPort:=1;//指定端口
mscomm1.Settings:='9600,N,8,1';//其它参数
mscomm1.InBufferSize:=1024;//接收缓冲区
mscomm1.OutBufferSize:=1024;//发送缓冲区
mscomm1.InputMode:=comInputModeBinary;//接收模式
mscomm1.InputLen:=0;//一次读取所有数据
mscomm1.SThreshold:=0;//一次发送所有数据
mscomm1.InBufferCount:=0;//清空读取缓冲区
mscomm1.OutBufferCount:=0;//清空发送缓冲区
mscomm1.PortOpen:=true;//打开端口
MSComm1.RThreshold:=16;//设置接收多少字节开产生oncomm事件
senddata[1]:=chr($06);//要发送的数据
senddata[2]:=chr($03);
senddata[3]:=chr($00);
senddata[4]:=chr($03);
senddata[5]:=chr($10);
sendstr:='';
fori:=1to5do
sendstr:=sendstr+senddata[i];
mscomm1.output:=sendstr;//发送数据
i:=0;
bzw:=false;
repeat
sleep(10);
Application.ProcessMessages;
i:=i+1;
Ifi>30000Then
begin
showmessage('发送超时!');
break;
end;
Untilbzw=true;
redata:=mscomm1.Input;接收数据
restr:='';
fori:=0tovararrayhighbound(redata,1)do
restr:=restr+inttohex(redata[i],2)+'';
mscomm1.PortOpen:=false;
flatmemo1.Text:=restr;
end;
5结论
本文完整地分析、实现了支持HART协议的流量计的数据采集,对今后对该类设备的数据采集具有借鉴意义。
参考文献:
[1]RosemoutInc.HARTsmartcommunicationprotocol,therosemountSmartFamily.Productdatasheet[S].PDS2695.