第3章 ARINC 429协议基础

各位同学,今天我们来聊聊ARINC 429。这个协议啊,可以说是航电系统里最经典的串行数据总线之一。我入行那会儿,第一个接触的就是它。说实话,刚开始觉得它挺简单的,不就是一根线传数据嘛。但真正做项目才发现,里面的门道还真不少。

3.1 ARINC 429总线简介

ARINC 429,全称是"Aeronautical Radio, Incorporated 429"。它诞生于上世纪70年代,但直到今天,波音737、空客A320这些主流机型上还在大量使用。你想想看,一个协议能活50年,这本身就说明了很多问题。

它的核心特点,我总结为三点:

  • 单向传输:数据只能从一个发送器流向多个接收器。不能双向通信,这点和ARINC 629不一样。
  • 差分信号:用两根线(A和B)传输,抗干扰能力强。我在一次电磁兼容测试中深有体会,差分信号确实比单端信号稳得多。
  • 低速但可靠:标准速率是12.5kbps或100kbps。别嫌慢,在飞行控制这种对可靠性要求极高的场景,慢反而是优势。

关键点:ARINC 429总线上,同一时刻只能有一个发送器。所有接收器都在"听",但谁都不能"说"。这就是所谓的"广播式"通信。

我曾经遇到过一个问题:某型飞机的惯导数据偶尔会跳变。排查了半天,最后发现是总线上有两个设备同时尝试发送数据。嗯,这就是典型的违反ARINC 429规范的操作。

3.2 数据字格式

ARINC 429的数据字是32位的。每次传输,就是这32个比特在线上跑。我习惯把它拆成四个部分来看:

位序号 名称 长度 说明
1-8 Label 8位 标识数据类型
9-10 SDI 2位 源/目的标识
11-29 Data 19位 实际数据
30-31 SSM 2位 符号/状态矩阵
32 Parity 1位 奇偶校验

你看,32位分得清清楚楚。我刚开始学的时候,总记不住位的顺序。后来有个老工程师教我一招:从Label开始,按"LSD-SSD"来记。Label、SDI、SSM、Data?不对,是Label、SDI、Data、SSM、Parity。嗯,多写几遍就记住了。

3.3 Label(标签)

Label是8位,但传输时是反序的。什么意思呢?比如你要发送Label 123(八进制),它在线上跑的顺序是321。我第一次解码时就被这个坑过——读出来的数据完全不对。

说白了,Label就是数据的"身份证"。它告诉接收器:我后面跟着的是什么数据。比如:

  • Label 203(八进制):气压高度
  • Label 206(八进制):无线电高度
  • Label 310(八进制):地速

我的习惯:在解析FDR数据时,我会先把Label转成八进制,然后对照ARINC 429规范查表。这样最不容易出错。

3.4 SDI(源/目的标识)

SDI只有2位,但作用不小。它用来区分:

  • 同一数据来自哪个源(比如左发和右发的转速)
  • 或者数据要发给哪个接收器

举个例子:飞机上有两台大气数据计算机(ADC)。它们都发送气压高度,Label都是203。怎么区分?靠SDI。SDI=01表示ADC1,SDI=10表示ADC2。

我曾经在调试时发现,某个参数总是跳变。查了半天,原来是SDI设错了,导致两个ADC的数据混在了一起。嗯,这种低级错误,犯过一次就再也不会犯了。

3.5 Data(数据域)

Data域有19位。但具体怎么用,取决于数据类型:

  • BNR(二进制编码):直接表示数值,比如高度、速度
  • BCD(二进制编码的十进制):每位表示一个十进制数字,比如经纬度
  • 离散数据:每个位代表一个开关状态

我建议你记住一点:Data域的最高位(第29位)通常是符号位。0表示正,1表示负。这在解析负值数据时特别重要。

注意:不同设备对Data域的编码方式可能不同。比如同样是高度,有的用BNR,有的用BCD。解析前一定要先确认编码方式,否则数据全是错的。

3.6 SSM(符号/状态矩阵)

SSM是2位,但它传递的信息非常关键:

SSM值 BNR数据含义 BCD数据含义
00 故障/无效 故障/无效
01 正常(正) 正常(正)
10 正常(负) 正常(负)
11 测试/备用 测试/备用

说白了,SSM就是数据的"健康状态"。如果SSM=00,那Data域里的数据就不能用。我在做FDR数据分析时,第一件事就是检查SSM。如果SSM不对,后面的分析全是白费功夫。

3.7 奇偶校验位

第32位是奇偶校验位。ARINC 429用的是奇校验。什么意思呢?就是前面31位里1的个数加上校验位,总共有奇数个1。

举个例子:

假设前31位中1的个数是偶数(比如8个)
那么校验位就要设为1,让总数变成9(奇数)

如果前31位中1的个数是奇数(比如9个)
那么校验位就要设为0,总数保持9(奇数)

我写了个简单的Python函数来算校验位:

def calc_parity(data_31bits):
    """计算ARINC 429的奇校验位"""
    ones_count = bin(data_31bits).count('1')
    # 如果1的个数是偶数,校验位为1;否则为0
    return 1 if ones_count % 2 == 0 else 0

避坑指南:我曾经遇到过一批数据,校验位总是算不对。后来发现,是数据采集卡把位序搞反了。ARINC 429的位传输顺序是从LSB到MSB,但有些采集卡是按MSB到LSB存的。嗯,这个坑踩过一次就记住了。

3.8 实际解码示例

好了,理论说完了。我们来看一个实际的解码例子。假设从FDR里读到了一个32位数据字:

原始数据(十六进制):0x5A3C1F82

转成二进制:
0101 1010 0011 1100 0001 1111 1000 0010

按位分解:
- Label(位1-8):1000 0010 → 反序后是 0100 0001 → 八进制 101
- SDI(位9-10):11 → 二进制 11
- Data(位11-29):0101 1010 0011 1100 000 → 具体数值看编码方式
- SSM(位30-31):00 → 故障/无效
- Parity(位32):0 → 需要验证

你看,Label是101(八进制),查表可知这是"气压高度"数据。但SSM=00,说明这个数据是无效的。嗯,这就是为什么我说要先看SSM。

最后,验证一下奇偶校验:前31位中1的个数是15(奇数),校验位是0,总数为15(奇数)。校验通过。

我的建议:在实际项目中,不要手动去算这些位。写个解析函数,自动完成Label反序、位分解、校验验证。我一般会用Python的位运算来做,效率高,也不容易出错。

好了,ARINC 429的基础就讲到这里。下一章我们会深入讨论BNR和BCD两种编码方式的具体实现。到时候我会带大家写一个完整的解码器,把FDR里的原始数据变成可读的工程值。