Hart 协议
2014-07-17 12:30
309 查看
由于现阶段在一仪表公司,仪表的需求,接触到Hart。竟发现这一国外的工业标准,在国内的资料少得可怜。PS:起码想在网上搜到所有资料是相当困难的。以下就近些时间来收集到的一些资料作适当整理,贴出来。一是记录,二是给需要的人。
第一天拿到Hart模块时,看起来就像是24L01无线模块似的小东西,对其毫无概念,细细品读 Hart简介 <提取码 63b8>,好吧,现如今的分享略显的难了一些。工作中多用同步盘,个人先用的360网盘,还算顺手,资料多在于此,就不换了。 回到正题,先是大概了解下Hart是什么东西,HART(Highway Addressable Remote Transducer),可寻址远程传感器高速通道的开放通信协议,Hart协议比较大的特点在于支持模拟信号和数字信号同时传递。
接下来便是深入Hart协议。其实看协议的时候简直就是一头雾水,跟本不知道是什么东西,先是看了Hart的通信格式,<这里确实花了不少时间>,先后几次回过头来看,都有收获,下面是我整合得比较完整一版:
首先定义字节的概念,在HART中,发送一个字节需要11位二进制数据,第一位起始位,第二到九位共八位是要发送的数据,第十位是校验位<奇校验>,第十一位是停止位。如下图所示:
PREAMBLE START ADDR COM BCNT STATUS DATA PARITY
序文 定界符 地址 命令号 数据长度 响应码 数据字节 奇偶校验
以上便是一个完整的Hart通信数据帧格式,其中Status(通信状态)只有在从机对主机通信时才会加入的。
PREAMBLE 前导字符,作为通信同步的需要,是5到20个字节的0XFF,通常采用5个字节;
START 起始字节符,将告之使用的结构为“长”还是“短”,消息源是否是“突发”模式消息。主机到从机为短结构时,起始位为 0X02,长帧时为 0X82。从机到主机的短结构值为 0X06,长结构值为0X86。而为“突发”模式的短结构值为 0X01,长结构为 0X81。一般设备进行通讯接收到 2 个0XFF 字节后,就将侦听起始位。
ADDR 地址字符,包含了主机地址和从机地址,短结构中占 1 字节,长结构中占 5 字节。无论长结构还是短结构,因为 HART 协议中允许 2 个主机存在,所以我们用首字节的最高位来进行区分,值为 1 表示第一主机地址,第二主机用 0 表示,“突发”模式是特例,0,1 值将交替出现,也就是说,在该模式下,赋予 2 个主机的机会均等。次高位为 1 表示为“突发”模式,短结构用首字节的 0~4 位表示值为 0~15 的从机地址,第 5,6 位赋 0;而长结构用后 6 位表示从机的生产厂商的代码,第 2 个字节表示从机设备型号代码,后 3~5 个字节表示从机的设备序列号,构成"唯一"标志码。
MA <1> BM <2> <3~8> <9~16> <17~40>
主机地址 突发模式 厂商代码 仪表类型代码 仪表序列号
另外,长结构的低 38 位如果都是 0 的话表示的是广播地址,即消息发送给所有的设备。
COM 命令字节,范围为 253 个,用 HEX 的 0~FD 表示。31,127,254,255 为预留值。PS:一开始对此处提到的命令很困惑,就在心里发问,每个命令都什么含义?所有的厂家都支持么?终于,在一篇名为HCF_SPEC 99官方文档中找到
那么剩下的去找对应文档就好了。此处依然放出 HART协议文档 <提取码 00d9>。这个过程中更加明确官方文档的重要性!要强迫自己看英文原版的文档,这样才更会有收获!
BCNT 数据总长度,它的值表示的是 BCNT 下一个字节到最后(不包括校验字节)的字节数,其实说了这么多,无非是因为从机回传的数据中多了一个状态码,明确也是要算在数据长度的。接收设备用他可以鉴别出校验字节,也可以知道消息的结束。因为规定数据最多为 25 字节,所以它的值是从 0~27。
STATUS 状态字节,也叫做“响应码”,顾名思义,只存在于从机响应主机消息的时候,用 2 字节表示。他将报告通讯中的错误、接收命令的状态(如:设备忙、无法识别命令等)和从机的操作状态。 如果我们在通讯过程中发现了错误,首字节的最高位(第 7 位)将置 1,其余的 7 位将汇报出错误的细节,而第 2 个字节全为 0。否则,当首字节的最高位为 0 时,表示通讯正常,其余的 7 位表示命令响应情况,第 2 个字节表示场设备状态的信息。UART 发现的通讯错误一般有:奇偶校验、溢出和结构错误等。命令响应码可以有 128 个,表示错误和警告,他们可以是单一的意义,也可以有多种意义,我们通过特殊命令进行定义、规定。现场设备状态信息用来表示故障和非正常操作模式。此处依然是一个专门的文档来叙述 HCF_SPEC_307 。
DATA 数据字节,首先需说明的是并非所有的命令和响应都包含数据字节,它最多不超过 25 字节(随着通讯速度的提高,正在要求放宽这一标准)。数据的形式可以是无符号的整数(可以是8,16,24,32 b),浮点数(用 IEEE754 单精浮点格式)或 ASCII 字符串,还有预先制定的单位数据列表。具体的数据个数根据不同的命令而定!此处查阅官方文档 HCF_SPEC_183<数据格式表> 此中数据量相当大 HCF_SPEC 99 HCF_SPEC 127 HCF_SPEC-151;
CHK 奇偶校验,方式是纵向奇偶校验,从起始字节开始到奇偶校验前一个字节为止。另外,每一个字节都有 1 位的校验位,为奇校验,这两者的结合可以检测出 3 位的突发错误。
好了,通信格式说得差不多,开始一些实战。
例:
主机到从机
FF FF FF FF FF 82 A6 06 BC 61 4E 01 00 B0
上面是主机到从机发送的一条消息。前 5 个字节值都为 FF,显然他是前导字节。接着的 82 起始字节,表示主机到从机发出的长结构的消息。
后 5 个字节 “A6,06,BC,61,4E”是地址字节化为二进制表示如下:
A6 06 BC 61 4E
1010 0110 0000 0110 1011 1100 0110 0001 0100 1110
可见首字节 A6 的最高位为 1 表示主机,次高位为 0 表示非突发模式,后面的 38 位二进制数表示设备的惟一标号:“100110”是生产厂家代码,值为 38,是 Rosemount 公司的代码;后一字节 06 是设备型号代码,06 代表的型号是3051C;后面的 3 个字节是设备识别号,本例中的值为 12345678;再接下来的 01 是命令字节,表示 1 号命令,该命令的返回内容可在文档资料中找到 HCF_SPEC 127,即读取 PV 值,后面的 00 是表示数据的长度;本例中无数据,值为 0;最后是校验字节 B0;
从机到主机
FF FF FF FF FF 86 A6 06 BC 61 4E 01 07 00 00 06 40 B0 00 00 45
上面表示的是从机到主机的一条消息。本例大部分与上例相似,不同的是数据字节不再为 0,其中的 06 表示单位 PSI;后面的 4 个字节是用浮点数表示的值 为 5.5。并且由于本例是由从机到主机的应答消息,所以存在着状态位,即本例中的“00 00”,表示“OK”。
突发模式
上面是突发模式发出的一条消息。第 1 个字节 81 表示突发的长结构模式,与前例中相似的地方不再介绍。注意到状态字节“00 60”后的字节“41 3F A0 00”,他表示的是当前的电流值,是IEEE754格式的浮点数,计算后是 11.9766;后面的 27 表示单位 mA,像后面的 39 表示“%”一样。数据字节中的"42 47 60 00","BF 06 60 00","41 95 00 00”分别表示"SV","TV","FV"表示方法与 PV 相同。经过解释后的消息可以表示为:“LBTXS/RdAllPv/026/0060/11.9766/mA/11.9766/%/49.8438/psi/-0.524902/%/18.625”。 所有的数据格式在文档资料Common Tables HCF_SPEC 183中。附命令3——属于通用命令,可在HCF_SPEC_127中查找
IEEE754
看文档HCF_SPEC_099中的描述似乎相当复杂,其实呢也简单的,不过就是浮点数的另一记录方法罢了,此处如看不懂可自行查阅,资料甚多,在此不多缀述。
第一天拿到Hart模块时,看起来就像是24L01无线模块似的小东西,对其毫无概念,细细品读 Hart简介 <提取码 63b8>,好吧,现如今的分享略显的难了一些。工作中多用同步盘,个人先用的360网盘,还算顺手,资料多在于此,就不换了。 回到正题,先是大概了解下Hart是什么东西,HART(Highway Addressable Remote Transducer),可寻址远程传感器高速通道的开放通信协议,Hart协议比较大的特点在于支持模拟信号和数字信号同时传递。
接下来便是深入Hart协议。其实看协议的时候简直就是一头雾水,跟本不知道是什么东西,先是看了Hart的通信格式,<这里确实花了不少时间>,先后几次回过头来看,都有收获,下面是我整合得比较完整一版:
首先定义字节的概念,在HART中,发送一个字节需要11位二进制数据,第一位起始位,第二到九位共八位是要发送的数据,第十位是校验位<奇校验>,第十一位是停止位。如下图所示:
PREAMBLE START ADDR COM BCNT STATUS DATA PARITY
序文 定界符 地址 命令号 数据长度 响应码 数据字节 奇偶校验
以上便是一个完整的Hart通信数据帧格式,其中Status(通信状态)只有在从机对主机通信时才会加入的。
PREAMBLE 前导字符,作为通信同步的需要,是5到20个字节的0XFF,通常采用5个字节;
START 起始字节符,将告之使用的结构为“长”还是“短”,消息源是否是“突发”模式消息。主机到从机为短结构时,起始位为 0X02,长帧时为 0X82。从机到主机的短结构值为 0X06,长结构值为0X86。而为“突发”模式的短结构值为 0X01,长结构为 0X81。一般设备进行通讯接收到 2 个0XFF 字节后,就将侦听起始位。
ADDR 地址字符,包含了主机地址和从机地址,短结构中占 1 字节,长结构中占 5 字节。无论长结构还是短结构,因为 HART 协议中允许 2 个主机存在,所以我们用首字节的最高位来进行区分,值为 1 表示第一主机地址,第二主机用 0 表示,“突发”模式是特例,0,1 值将交替出现,也就是说,在该模式下,赋予 2 个主机的机会均等。次高位为 1 表示为“突发”模式,短结构用首字节的 0~4 位表示值为 0~15 的从机地址,第 5,6 位赋 0;而长结构用后 6 位表示从机的生产厂商的代码,第 2 个字节表示从机设备型号代码,后 3~5 个字节表示从机的设备序列号,构成"唯一"标志码。
MA <1> BM <2> <3~8> <9~16> <17~40>
主机地址 突发模式 厂商代码 仪表类型代码 仪表序列号
另外,长结构的低 38 位如果都是 0 的话表示的是广播地址,即消息发送给所有的设备。
COM 命令字节,范围为 253 个,用 HEX 的 0~FD 表示。31,127,254,255 为预留值。PS:一开始对此处提到的命令很困惑,就在心里发问,每个命令都什么含义?所有的厂家都支持么?终于,在一篇名为HCF_SPEC 99官方文档中找到
那么剩下的去找对应文档就好了。此处依然放出 HART协议文档 <提取码 00d9>。这个过程中更加明确官方文档的重要性!要强迫自己看英文原版的文档,这样才更会有收获!
BCNT 数据总长度,它的值表示的是 BCNT 下一个字节到最后(不包括校验字节)的字节数,其实说了这么多,无非是因为从机回传的数据中多了一个状态码,明确也是要算在数据长度的。接收设备用他可以鉴别出校验字节,也可以知道消息的结束。因为规定数据最多为 25 字节,所以它的值是从 0~27。
STATUS 状态字节,也叫做“响应码”,顾名思义,只存在于从机响应主机消息的时候,用 2 字节表示。他将报告通讯中的错误、接收命令的状态(如:设备忙、无法识别命令等)和从机的操作状态。 如果我们在通讯过程中发现了错误,首字节的最高位(第 7 位)将置 1,其余的 7 位将汇报出错误的细节,而第 2 个字节全为 0。否则,当首字节的最高位为 0 时,表示通讯正常,其余的 7 位表示命令响应情况,第 2 个字节表示场设备状态的信息。UART 发现的通讯错误一般有:奇偶校验、溢出和结构错误等。命令响应码可以有 128 个,表示错误和警告,他们可以是单一的意义,也可以有多种意义,我们通过特殊命令进行定义、规定。现场设备状态信息用来表示故障和非正常操作模式。此处依然是一个专门的文档来叙述 HCF_SPEC_307 。
DATA 数据字节,首先需说明的是并非所有的命令和响应都包含数据字节,它最多不超过 25 字节(随着通讯速度的提高,正在要求放宽这一标准)。数据的形式可以是无符号的整数(可以是8,16,24,32 b),浮点数(用 IEEE754 单精浮点格式)或 ASCII 字符串,还有预先制定的单位数据列表。具体的数据个数根据不同的命令而定!此处查阅官方文档 HCF_SPEC_183<数据格式表> 此中数据量相当大 HCF_SPEC 99 HCF_SPEC 127 HCF_SPEC-151;
CHK 奇偶校验,方式是纵向奇偶校验,从起始字节开始到奇偶校验前一个字节为止。另外,每一个字节都有 1 位的校验位,为奇校验,这两者的结合可以检测出 3 位的突发错误。
好了,通信格式说得差不多,开始一些实战。
例:
主机到从机
FF FF FF FF FF 82 A6 06 BC 61 4E 01 00 B0
上面是主机到从机发送的一条消息。前 5 个字节值都为 FF,显然他是前导字节。接着的 82 起始字节,表示主机到从机发出的长结构的消息。
后 5 个字节 “A6,06,BC,61,4E”是地址字节化为二进制表示如下:
A6 06 BC 61 4E
1010 0110 0000 0110 1011 1100 0110 0001 0100 1110
可见首字节 A6 的最高位为 1 表示主机,次高位为 0 表示非突发模式,后面的 38 位二进制数表示设备的惟一标号:“100110”是生产厂家代码,值为 38,是 Rosemount 公司的代码;后一字节 06 是设备型号代码,06 代表的型号是3051C;后面的 3 个字节是设备识别号,本例中的值为 12345678;再接下来的 01 是命令字节,表示 1 号命令,该命令的返回内容可在文档资料中找到 HCF_SPEC 127,即读取 PV 值,后面的 00 是表示数据的长度;本例中无数据,值为 0;最后是校验字节 B0;
从机到主机
FF FF FF FF FF 86 A6 06 BC 61 4E 01 07 00 00 06 40 B0 00 00 45
上面表示的是从机到主机的一条消息。本例大部分与上例相似,不同的是数据字节不再为 0,其中的 06 表示单位 PSI;后面的 4 个字节是用浮点数表示的值 为 5.5。并且由于本例是由从机到主机的应答消息,所以存在着状态位,即本例中的“00 00”,表示“OK”。
突发模式
FF | 81 | 53 | 03 | 1A | 00 | 41 | 27 | 41 | 39 | 42 | 06 | BF | 39 | 41 | D4 |
FF | 03 | 60 | 3F | 3F | 47 | 06 | 95 | ||||||||
FF | 04 | A0 | A0 | 60 | 60 | 00 | |||||||||
FF | E6 | 00 | 00 | 00 | 00 | 00 | |||||||||
FF | D7 |
IEEE754
看文档HCF_SPEC_099中的描述似乎相当复杂,其实呢也简单的,不过就是浮点数的另一记录方法罢了,此处如看不懂可自行查阅,资料甚多,在此不多缀述。
相关文章推荐
- HART通讯协议及应用
- 协议与实现的关系,仅对XMPP
- RTP协议格式 备忘
- 协议与委托(Protocol and Delegate)实例解析
- linux pci 协议一
- iOS Objective-C之-1:协议Protocol
- GPUImage API文档之GPUImageInput协议
- 【Android】远程文件管理传输协议解析
- Swift中协议的简单介绍
- BitTorrent 协议规范1.0版
- HTTP协议演示_基于 HTTP 的 Web Forms 编程2-5
- HTTP协议详解
- PPP协议体系的实现
- udp协议
- bt协议详解 基础篇(下)
- Http协议
- IOT 物联网11中通信协议
- 在.net中使用Udp协议创建简单的聊天程序
- 通过HTTP代理连接到目的的协议
- 邮箱系统原理——POP3协议和IMAP协议