简介:ARINC 704-7于1999年发布,是面向航空电子工程领域的重要技术标准,专门规定惯性参考系统(IRS)的设计、性能指标、测试方法及安装要求,适合飞机制造商、航空公司、维修机构及航空电子工程师作为实现惯性导航系统的权威参考。压缩包仅含1个PDF文件,大小786KB,内容为AEEC编制并经ARINC采纳的标准全文,并在文末以金色纸张列出历代版本补充与改进说明,便于追踪704-1至704-7的演进脉络。该文档能够帮助读者准确把握IRS自主导航原理、陀螺仪与加速度计构成等关键概念,同时理解CNS/ATM背景下机载设备的互操作性与符合性要求,从而减少潜在航行误差,提升飞行安全。目前已有206人学习下载,适合从事航空电子系统设计、适航验证及相关标准研究的技术人员深入研读。
1. ARINC 704 这份规格书是惯导接口问题反复出现时值得回头翻的底稿
看到 "ARINC 704-7-1999.pdf" 这个文件名,内行先读出三层意思:这是航空电子标准 ARINC 704 的第七版修订本,1999 年发布,内容围绕民航惯导(IRS / Inertial Reference System)的设备特性与对外接口。机队里姿态、航向、纬度、经度、地速、垂直速度这些导航源数据,相当一部分就是从符合 704 的惯导系统出来的。做航电地面测试台、数据记录器或者机务排故软件的人,经常被一个问题卡住:"IRS 输出的数据到底是什么格式?" 与其在网上搜零散笔记,不如直接翻开这份 PDF。它不会直接告诉你如何写代码,但会把字格式、标签、分辨率和方向约定讲清楚,适合所有需要把惯导数据解析成工程量的工程师。
2. 读懂 ARINC 704-7 的文档结构:从系统组成、性能包线到输出标签表
2.1 两层引用关系:输出内容在 704,字结构在 429
习惯于只读一份 PDF 的工程师,第一次翻 ARINC 704 容易懵:里面频繁提到 ARINC 429、ARINC 705、ARINC 706,还夹着环境试验条款。这里的关键是理解 704 的定位:它规定的是惯性基准系统这个"设备"的外特性,也就是系统由哪些单元组成、提供哪些数据、数据的标签与分辨率是什么、故障怎么上报;而数据在总线上怎么编码成 32 位字,那是 ARINC 429 的事。换句话说,704 告诉你"输出什么",429 告诉你"怎么传输"。做 704 相关开发,案头至少要有两份标准:一份是本 PDF,一份是 ARINC 429 的字格式定义。解析代码里对位号、SSM、奇偶校验的假设,全部来自后者。
2.2 IRS、AHRS、ADC 的职责划分:先确认要找的是不是 704
定义边界时最容易混的是三个词:IRS、AHRS、ADC。IRS 输出完整的导航解:姿态、航向、角速率、加速度、经纬度、地速、垂直速度;AHRS 只有姿态、航向和角速率,不计算位置;ADC 处理的是气压类数据。下表是这三类设备在标准层面的对照。
| 设备类型 | 对应标准 | 核心输出 | 常见安装对象 |
|---|---|---|---|
| IRS 惯性基准系统 | ARINC 704 | 姿态、航向、位置、速度、角速率、加速度 | 民航客机/货机主惯导 |
| AHRS 姿态航向系统 | ARINC 705 | 姿态、航向、角速率 | 通用航空、支线飞机 |
| ADC 大气数据计算机 | ARINC 706 | 气压高度、空速、马赫数、静温 | 与 IRS 联动提供全静压数据 |
实际机队里更多见的是 ADIRS(大气数据加惯导参考系统)这类组合设备,它把 706 的 ADC 功能和 704 的 IRS 功能做进同一个安装单元,对外输出的标签体系仍然沿两套标准的逻辑走。选型时先拿这个表对照需求:如果只要姿态显示,705 就够;只要有位置和速度参与导航解算,必须按 704 的产品去查标签。
2.3 性能包线:对准时间、精度等级和更新率
704 对系统的要求不只是"能用",还有明确的性能包线。惯导开机场合下需要对准,常见模式有正常工作(对准时间较长,数分钟量级)、存储航向对准(利用上次掉电航向缩短对准时间)和快速对准(约 10 秒量级,精度折减)。精度指标通常按位置误差的增长速率(海里/小时,CEP)来表述,成熟产品在 0.8 到 2 NM/h 这个区间;姿态精度在零点几度到零点零几度之间,航向精度随纬度升高而变差。更新率上,姿态角和角速率类输出普遍是 20 Hz 或 50 Hz,位置经纬度是 1 Hz,垂直速度多为 1 Hz 或 5 Hz。
写解析程序时,更新率直接决定两件事:接收缓存要多深、以及总线负载占多少。用下面这段代码可以估算一路 32 位字以不同速率输出时占用的 429 总线负载。
# 以 100 kbit/s 高速 429 总线为例,估算单标签的负载占比 rate = 50 # 标签更新率,由 704 输出表查得 word_bits = 32 # 一个 429 字固定 32 位 bus_speed = 100_000 # 高速 429 为 100 kbit/s load = rate * word_bits / bus_speed print(f"{rate} Hz 标签占 100k 总线的 {load*100:.2f}%") # 输出:50 Hz 标签占 100k 总线的 1.60%把姿态、角速率、加速度等十几个 50 Hz 标签全部加起来,负载会很快逼近总线上限;这也是为什么 704 体系里位置和速度这类低频数据常被安排到单独的低速总线或者轮询发送。看到文档里速率字段时,顺手算一次总线占用量,能提前暴露地面台设计中的带宽问题。
2.4 输出标签表:一篇 PDF 里信息密度最高的一页
ARINC 704 的核心可执行内容,是它的输出数据标签表:每个输出参数对应一个八进制 Label,标注字类型(BNR 或 BCD)、分辨率(LSB 权重)、量程、更新率、SDI 规则和 SSM 定义。以下列出民航惯导里最常被抓包验证的一组标签,均按常见商用实现整理,具体数值以手头版本标签表为准。
| 输出参数 | 八进制 Label | 字型 | 常见更新率 |
|---|---|---|---|
| 俯仰角 | 310 | BNR | 50 Hz |
| 横滚角 | 311 | BNR | 50 Hz |
| 航向 | 312 | BNR | 50 Hz |
| 俯仰角速率 | 320 | BNR | 50 Hz |
| 横滚角速率 | 321 | BNR | 50 Hz |
| 偏航角速率 | 322 | BNR | 50 Hz |
| 纵向加速度 | 324 | BNR | 50 Hz |
| 横向加速度 | 325 | BNR | 50 Hz |
| 法向加速度 | 326 | BNR | 50 Hz |
| 纬度粗值 | 350 | BNR | 1 Hz |
| 经度粗值 | 351 | BNR | 1 Hz |
| 纬度细值 | 360 | BNR | 1 Hz |
| 经度细值 | 361 | BNR | 1 Hz |
速度字在 33x 区段,但不同厂商对"沿航向、垂直航向、垂直方向"的定义不一致,甚至同一厂商不同机型都有差异;解析程序里速度字的方向常量必须来自原厂标签表,而不是照抄 310 到 326 的模板。位置粗值/细值的设计也需要留意:粗值覆盖全世界且精度低,细值精度高但量程有限,惯导解算时通常按"细值为主、粗值做完整性校验"来用。下一步就是把这些字段定义落成代码。
3. 解析 ARINC 704 输出:把 429 的 BNR 字还原成姿态与位置
3.1 32 位字结构:先对齐位序再写移位逻辑
写解码器之前,先把 ARINC 429 的字位约定说清楚。一个 429 字共 32 位,按传输顺序编号:位 1 到 8 是标签,位 9 到 10 是 SDI(源/目的标识),位 11 到 29 是数据区,位 30 到 31 是 SSM(符号/状态矩阵),位 32 是奇偶校验位。对 BNR(二进制)数据,位 29 是符号位,位 11 到 28 是幅值。当抓包工具把串行位组装成 32 位整数时,传输位 1 落在整数最低位,位 32 落在整数最高位。
| 传输位号 | 整数移位 | 含义 |
|---|---|---|
| 1-8 | 位 0-7 | Label,八进制 |
| 9-10 | 位 8-9 | SDI |
| 11-28 | 位 10-27 | BNR 幅值 |
| 29 | 位 28 | BNR 符号位 |
| 30-31 | 位 29-30 | SSM |
| 32 | 位 31 | 奇校验位 |
这个对应关系不先确认,解析结果会整体错位。常见错误是把 32 位整数按大端读取再直接移位,结果标签变成字节交换后的值。地面台的 429 采集卡一般会给出"每字 4 字节,先收到低字节",在代码里用小端方式组装即可。
3.2 BNR 解码的最小 Python 实现
以下函数覆盖一次字的完整拆解,返回标签、SDI、原始数据和 SSM。这里默认 BNR 为符号幅值编码:符号位为 1 表示负值。
def decode_bnr(word: int) -> dict: label = word & 0xFF # 位 1-8:八进制标签直接取整数低 8 位 sdi = (word >> 8) & 0x03 # 位 9-10:源/目的标识 mag = (word >> 10) & 0x3FFFF # 位 11-28:18 位幅值 sign = (word >> 28) & 0x01 # 位 29:BNR 符号位 ssm = (word >> 29) & 0x03 # 位 30-31:符号/状态矩阵 parity = (word >> 31) & 0x01 # 位 32:奇校验位 raw = -mag if sign else mag return {"label": label, "sdi": sdi, "raw": raw, "ssm": ssm, "parity": parity}代码用掩码而不是直接右移,避免 Python 对高位补零带来的歧义。0x3FFFF是 18 位全 1,正好对应位 11 到 28 的幅值区;符号位是位 29,所以右移 28 位再取最低位。拿到raw之后要乘上该标签的 LSB 权重才得到工程量,例如俯仰角标签把 raw 乘以 0.001373 得到角度;LSB 值必须从 704 标签表取,不能跨机型复用。
提示:SSM 不是摆设。BNR 的 SSM 常见编码为 11 正常、10 功能测试、01 无计算数据、00 故障警告。SSM 不为 11 时,即便 raw 数值看起来合理,也应丢弃而不是送进控制或显示链路。
3.3 带标签定义的解析主循环
把标签表的结构化结果直接用作配置,解码循环就非常短。下面示例用一个字典维护典型 IRS 标签的元数据,然后对一段采集到的 429 字流做批量解析:
LABELS = { 0o310: ("PITCH", 0.001373291), # 俯仰角,LSB 单位度 0o311: ("ROLL", 0.001373291), 0o312: ("HDG", 0.005493164), 0o350: ("LAT_C", 180 / 2**23), # 纬度粗值,示例权重 0o351: ("LON_C", 180 / 2**23), } def parse_stream(words, lsb_map): rows = [] for w in words: d = decode_bnr(w) meta = lsb_map.get(d["label"]) if meta is None or d["ssm"] != 0b11: continue name, lsb = meta rows.append((name, d["sdi"], d["raw"] * lsb)) return rows # 读取 4 字节小端整数序列,常见于 429 采集卡导出文件 with open("iruins.dat", "rb") as f: data = f.read() raw_words = [int.from_bytes(data[i:i+4], "little") for i in range(0, len(data), 4)] for name, sdi, val in parse_stream(raw_words, LABELS): print(f"{name:6s} SDI={sdi} value={val:.6f}")LABELS字典的 key 用八进制字面量,和 704 标签表里的写法一致,方便人工核对。过滤逻辑放在ssm != 0b11,这一步能挡掉 BIT 自检期间输出和故障帧。字节组装用小端,与大多数 429 卡的数据格式一致;如果采集卡给的是按字对齐的大端字节流,把"little"改成"big"即可。
3.4 验证解码结果的三个检查点
写完解码器不能直接进联调,先做三件事。第一,奇偶校验:对整个 32 位字统计 1 的个数,奇数个才算通过,失败率超过万分之一说明采集链路或字节顺序有问题。第二,SSM 分布:正常巡航阶段大部分帧应当是 SSM=11,若大量出现 01 或 00,要去查设备是否处于未对准状态。第三,数值边界:俯仰在 -90 到 90 度内,横滚 -180 到 180 度,如果解码结果出现稳定超界,往往是 LSB 权重或符号位处理反了。这三个检查点都通过,再去对真实姿态基准,比如停机状态下对比驾驶舱显示。
4. ARINC 704 与相邻标准的分工:705/706 边界和 429 联调里绕不开的坑
4.1 选型边界:只输出姿态选 705,要位置速度就认 704
在实际项目里,标准边界不是文档问题,是成本问题。ARINC 705(AHRS)设备的价格和维护成本明显低于 704 体系,如果产品只需要提供姿态和航向给显示系统,选 705 就够了;一旦导航解算、飞行管理、自动飞行需要位置和速度,就必须有 704 能力的 IRS。ADC(ARINC 706)单独管理气压高度与空速,它和 IRS 的组合构成现代飞机的大气数据/惯性基准核心。下表把这些标准的输出域对齐,方便在项目立项阶段直接对照。
| 输出能力 | 704 IRS | 705 AHRS | 706 ADC |
|---|---|---|---|
| 姿态/航向 | 提供 | 提供 | 不提供 |
| 角速率/加速度 | 提供 | 提供 | 不提供 |
| 经纬度位置 | 提供 | 不提供 | 不提供 |
| 地速/垂直速度 | 提供 | 部分提供 | 不提供 |
| 气压高度/空速 | 不提供 | 不提供 | 提供 |
这个对照也解释了为什么 704 的标签表里会出现大量 33x 速度字和 35x/36x 位置字,而 705 的标签表里没有。接手一个地面软件项目时,先问清楚目标设备支持哪份标准,能避免在错误的标签集合上浪费一整天。
4.2 联调中真正高频的四个坑
第一是 SDI 标签复用。同型号飞机装左/右两套惯导,同一 Label 会从两个源同时出现在总线上,靠 SDI 区分。地面台如果忽略 SDI 直接取数,会在左右数据源切换时产生跳变,错误往往只在转弯时序中复现。
第二是 BNR 符号位处理。部分厂家对垂直速度、横向加速度的负方向定义为向下/向右,符号位为 1 表示负。解析时如果只取幅值而丢符号,高度变化率会出现方向性错误。符号位和方向约定一定要回到原厂文档核对,而不是默认"正数向上"。
第三是 BIT 自检数据混入。设备上电自检和周期性 BIT 期间会输出 SSM=10 或 00 的帧,这些帧里的数据区可能是测试码型,直接参与解析会污染统计结果。处理办法就是在解码入口统一按 SSM 过滤,不能到应用层再判断。
第四是更新率假设。同一个 324 标签,不同厂商可能 50 Hz 也可能 20 Hz。联调时先抓 10 秒数据数一遍帧数,用真实帧计数替代文档假设,是最快的验证方式。下面这段代码把帧计数和 429 奇偶校验合在一起:
from collections import Counter def analyze_stream(words): parity_fail = 0 labels = Counter() ssm = Counter() for w in words: ones = bin(w).count("1") if ones % 2 != 1: # 429 要求全字奇校验 parity_fail += 1 continue labels[w & 0xFF] += 1 ssm[(w >> 29) & 0x03] += 1 total = len(words) print(f"total={total} parity_fail={parity_fail}") for label, cnt in sorted(labels.items()): print(f"Label {label:03o} 帧数={cnt} " f"占比={cnt/(total if total else 1)*100:.1f}%") return labels, ssmbin(w).count("1") % 2是校验 429 奇偶位数最简单的方法;这里统计的是整个整数,包括标签位,和 429 对全字的校验定义一致。看到某个标签的帧占比和预期更新率对不上时,优先检查是不是采集卡丢帧或位序反了。
4.3 出现野值先怀疑 SSM,不要急着改 LSB
联调现场最常见的误判,是看到数值跳变就怀疑分辨率或量程配错,反复改 LSB 权重。实际上大量跳变来自 SSM 处于非 normal 状态,或者设备处于快速对准过程中输出"无计算数据"的中间帧。正确排查顺序是:先统计 SSM 分布,再看奇偶校验失败率,最后看数值连续性。这样能把链路问题和设备状态问题分开,避免在错误的方向上调参数。
5. 拿到 ARINC 704-7-1999.pdf 先做这三步:抽标签表、清扫描页、建字典
读这份 PDF 不需要从头翻到尾,文本版可以直接按版面抽取再定位关键词,扫描版先找页再 OCR。
pdftotext -layout "ARINC 704-7-1999.pdf" 704.txt grep -n -E "Label|310|350|SSM" 704.txt | head -60-layout保留表格的列对齐,抽出来之后按"Label"和几个常见标签号定位,能直接跳到输出数据章节。扫描版没有文本层,用下面的方式只 OCR 前 20 页,命中标签表页后再整页识别:
from pdf2image import convert_from_path import pytesseract pages = convert_from_path("ARINC 704-7-1999.pdf", dpi=300) for i, img in enumerate(pages[:20], 1): txt = pytesseract.image_to_string(img, lang="eng") if "Label" in txt and "310" in txt: print(f"疑似标签表页: {i}")识别出标签表后,优先提取每个标签的 LSB 和量程两个字段:LSB 决定最小可表示量,量程决定溢出边界,两者一起才能验证解出来的数是否可信。最后把标签表整理成 3.3 节那种字典,key 用八进制 Label,value 存名称、字型、LSB、SSM 正常值,再拿一份实测的机上数据跑一遍,姿态平滑、位置连续且与驾驶舱显示一致,这份 704 就算真正消化了。
本文还有配套的精品资源,点击获取