1.简介
HART(Highway Addressable Remote Transducer可寻址远程传感器高速通道)协议,主要用于工业自动化领域的通信协议,专为发送和接收数字信息而设计,同时也支持模拟信号(如4-20 mA信号)的传输。这种设计使得HART设备能够同时传输模拟信号和数字数据,从而提供了更加灵活和强大的通信能力。
标准的HART传输是叠加在4-20mA信号上的FSK(移动键控)信号,替代方案是C8PSK(同调8路相移键控)信号,代替方案提高了HART的数字传输速率。此外还有一些基于RS-485、IP、TDMA的HART通讯方式,在此不再赘述。
本文仅讨论HART FSK。
2.报文格式
2.1 HART字节
因为HART协议有自己独特的物理层通讯方式,所以其在数据链路层上的传输采用一个被称为HART字节组的传输方式,每次传输会发送一个11位的HART字节,多个HART字节中的数据部分组合成一个有效的HART数据帧。(这个过程可以不准备的类比成一长串数据通过多个TCP/IP数据包发送的过程)
HART字节的格式如下:
用途 | 开始位 | HART字节 | 奇校验位 | 停止位 |
---|---|---|---|---|
长度 | 1bit | 8bit | 1bit | 1bit |
描述 | 固定为0,表示开始 | HART数据,从LSB(最低有效位)开始,以MSB(最高有效位)结束。 | 用于校验数据 | 固定为1,表示结束 |
2.2HART报文格式
结构如下:
用途 | 长度 | 描述 |
---|---|---|
前导码 | 5-20字节 | 5-20个0xFF,用于传输的开始, |
起始字节 | 1字节 | 用来标识数据包的起始位置 |
地址 | 1或5字节 | 包含了主机地址和从机地址,短帧中占1字节,长帧中占5字节 |
扩展 | 0-3字节 | 用于潜在的扩展,长度由其实字节指示 |
命令 | 1字节 | 表示这条数据的作用 |
字节计数 | 1字节 | 状态和数据部分的大小,单位:字节 |
状态 | 2字节 | 只存在于从机响应主机的消息,报告错误和状态 |
数据 | 0-253字节 | 不是所有的命令都有数据字节,用于存放数据 |
校验和 | 1字节 | 纵向奇偶校验,用于检测错误 |
2.2.1 前导码
前导码出现在每条消息的开头。前导码由一系列相同的字节组成,通常是连续的"FF"字节(在二进制中为11111111)。前导码的主要作用包括几个方面:
-
同步:前导码为接收设备提供了同步信号,帮助接收设备确定数据帧的开始位置。通过识别这一系列重复的模式,接收端的解码器可以与发送端的数据流同步,从而正确地解读后续传来的信息(比如起始位、地址、命令、数据等)。
-
清除线路:连续的前导码有助于清除通信线路上的任何噪声或干扰,确保数据传输的清晰度和准确性。这种"清道"的作用对于在现场环境中运行的工业设备尤其重要,因为这些环境往往充满电磁干扰。
-
接收器准备:前导码还给接收设备足够的时间来准备接收即将到来的数据。在HART通信中,接收设备(如处理器或控制器)需要调整其接收机制以准确解码即将到来的信息。前导码的存在为这种调整提供了缓冲时间。
2.2.2 起始字节
结构:
用途 | 地址类型 | 扩展字节数 | 物理层类型 | 帧类型 |
---|---|---|---|---|
长度 | 1bit | 2bit | 2bit | 3bit |
描述 | 0:轮询 - 字节地址(短帧) 1:唯一 - 字节地址(长帧) | 通常为00 | 00:异步(例如,FSK) 11:同步(例如,C8PSK | 001:突发帧响应 010:主机到现场设备 110:现场设备到主机 |
2.2.3 地址
地址部分,1字节为短帧,5字节为长帧。
短帧:
用途 | 主机序 | 突发模式 | 空 | 设备地址 |
---|---|---|---|---|
长度 | 1bit | 1bit | 2bit | 4bit |
描述 | 1:第一主机 0:第二主机 | 1:是 0:否 | 始终为00 |
长帧:
用途 | 主机序 | 突发模式 | 扩展的设备类型 | 设备ID |
---|---|---|---|---|
长度 | 1bit | 1bit | 14bit | 24bit |
描述 | 1:第一主机 0:第二主机 | 1:是 0:否 |
2.2.4 扩展
扩展部分主要为未来预留,它主要规划了以下方面的作用:
- 设备识别和分类:扩展字段允许对连接到系统的设备进行更详细的识别和分类。通过这些字段,系统可以识别设备的类型、制造商和其他相关信息。这对于系统配置和故障排除非常有用。
- 增强的设备信息:一些扩展字段用于存储有关设备性能、功能和配置选项的额外信息。这使得操作者可以更准确地控制设备,同时优化系统的整体性能。
- 改进的诊断能力:扩展字段可以包含有关设备状态和健康的详细信息,使得对设备进行远程监控和诊断成为可能。这有助于提前发现问题,减少系统停机时间。
- 更高的数据传输效率:通过利用扩展字段传输数据,HART协议能够在保持向后兼容的同时,提供更高的数据传输效率和更大的数据容量。
- 支持新技术和功能:随着过程控制技术的发展,新的监测和控制需求不断出现。扩展字段为支持这些新技术和功能提供了可能,确保了HART协议的长期适用性和灵活性。
2.2.5 命令
命令分为三种类别:通用、常用实践(也译作常见做法)、设备特定(专用命令),通用命令即所有采用HART协议的设备都要遵循的,常用实践为常见设备都要遵循的,特备特定为针对某些厂家或型号的设备才有的命令。
机翻自HART通信基金会官网
命令编号 | 命令描述 | 类型 |
---|---|---|
0 | 读取设备ID | 通用 |
1 | 读取主要变量 | 通用 |
2 | 读取回路电流和量程百分比 | 通用 |
3 | 读取动态变量和回路电流 | 通用 |
6 | 写入轮询地址 | 通用 |
7 | 读取回路配置 | 通用 |
8 | 读取动态变量分类 | 通用 |
9 | 带状态读取设备变量 | 通用 |
11 | 读取与标签关联的唯一标识符 | 通用 |
12 | 读取信息 | 通用 |
13 | 读取标签、描述符、日期 | 通用 |
14 | 读取主要变量传感器信息 | 通用 |
15 | 读取设备信息 | 通用 |
16 | 读取最终组装号 | 通用 |
17 | 写信息 | 通用 |
18 | 写标签、描述符、日期 | 通用 |
19 | 写最终组装号 | 通用 |
20 | 读取长标签 | 通用 |
21 | 读取与长标签关联的唯一标识符 | 通用 |
22 | 写长标签 | 通用 |
38 | 重置配置更改标志 | 通用 |
48 | 读取额外的设备状态 | 通用 |
33 | 读取设备变量 | 常用实践 |
34 | 写主要变量阻尼值 | 常用实践 |
35 | 写主要变量量程值使用命令35写入的数据将更新菜单中的4mA和20mA设置 | 常用实践 |
36 | 设置主要变量上限量程值 | 常用实践 |
37 | 设置主要变量下限量程值 | 常用实践 |
40 | 进入/退出固定电流模式 | 常用实践 |
41 | 执行自检 | 常用实践 |
44 | 写主要变量单位 | 常用实践 |
45 | 调整回路电流零点 | 常用实践 |
46 | 调整回路电流增益 | 常用实践 |
47 | 写主要变量传递函数 | 常用实践 |
54 | 读取设备变量信息 | 常用实践 |
59 | 写响应前导符数量 | 常用实践 |
71 | 锁定设备 | 常用实践 |
76 | 读取设备锁定状态 | 常用实践 |
140 | 写入场统计信息 覆盖设备记录的最大值和最小值 | 设备特定 |
141 | 读取场统计信息 从设备读取当前的最大值和最小值 | 设备特定 |
144 | 写开关1配置 写入开关1模式、设定点、死区、锁存设置、延迟设置 | 设备特定 |
145 | 读开关1配置 读取开关1模式、设定点、死区、锁存设置、延迟设置 | 设备特定 |
221 | 启用/禁用写保护,修改密码 允许启用/禁用写保护模式并允许编辑设备密码 | 设备特定 |
222 | 读、写保护状态 读取设备的写保护状态 | 设备特定 |
223 | 写入跳闸计数器 向与开关1和开关2关联的跳闸计数器写入一个0 – 9999之间的无符号16位整数 | 设备特定 |
224 | 切换 1和2 读取与开关1和开关2关联的跳闸计数器的值,该数值为一个0 – 9999之间的无符号16位整数 | 设备特定 |
225 | 手动重置 重置一个或多个处于锁存状态的开关 | 设备特定 |
226 | 读取开关锁存状态 读取一个或多个开关的锁存状态 | 设备特定 |
244 | 写开关2配置 写入开关2模式、设定点、死区、锁存设置、延迟设置 | 设备特定 |
245 | 读开关2配置 读取开关2模式、设定点、死区、锁存设置、延迟设置 | 设备特定 |
246 | 写堵塞端口设置 | 设备特定 |
247 | 读堵塞端口设置 | 设备特定 |
248 | 写偏移和量程 | 设备特定 |
249 | 读偏移和量程 | 设备特定 |
2.2.6 状态
状态分1个字节的响应码和1个字节的设备状态码。
2.2.6.1 响应码
正常通讯时,最高bit为0,响应码为:
响应码 | 含义 |
---|---|
0x00 | 执行成功 |
0x02 | 错误的命令 |
0x03 | 设置参数太大 |
0x04 | 设置参数太少 |
0x05 | 接收的数据太少 |
0x06 | 专用命令错 |
0x07 | 处于写保护模式 |
0x08 | 1、更新失败2、设置为接近值3、延时响应 |
0x09 | 1、低限范围值太大2、不正确的电流模式 |
0x0a | 1、低限范围值太小2、无效的就地锁定 |
0x0b | 1、上限范围值太大2、多从机模式3、无效设备变量代码4、调整超范围5、不能就地锁定 |
0x0c | 1、上限范围值太小2、无效单位代码3、无效的模式选择4、无效的插槽号 |
0x0d | 1、上、下限范围值超标2、计算错误3、无效的命令号 |
0x0e | 1、量程太小2、设置的下限值引起上限值改变而超出传感器极限 |
0x0f | 无效的模拟通道号 |
0x10 | 访问受限 |
0x11 | 无效的设备变量索引 |
0x12 | 无效的单位代码 |
0x13 | 设备变量的应用不合理 |
0x14 | 无效的扩展命令号 |
0x1c | 不支持的单位代码 |
0x20 | 忙 |
0x21 | 延迟响应开始 |
0x22 | 延迟响应进行中 |
0x40 | 命令不能执行 |
通讯故障时,最高位bit为1,响应码为:
响应码 | 含义 |
---|---|
0xc0 | 接收字节字节奇校验出错 |
0xa0 | 接收缓冲区数据覆盖错 |
0x90 | 没有接收到停止位出错 |
0x88 | 校验字节出错 |
0x82 | 接收缓冲区溢出 |
具体含义受不同命令影响,想见基金会资料。
2.2.6.2 设备状态码
状态码 | 含义 |
---|---|
0x80 | 设备故障 |
0x40 | 配置参数改变 |
0x20 | 设备冷启动 |
0x08 | 环路电流固定模式 |
0x04 | 环路电流饱和 |
0x02 | 设备变量(没有映射到主变量)超限 |
0x01 | 主变量超出极限 |
2.2.7 数据
数据部分格式取决于命令的不同,均由不同的命令定义。