3、系统架构设计:分层架构、模块划分、冗余设计(双通道/三余度)、通信总线选型(ARINC 429/664)

好,咱们进入第三章。系统架构设计,说白了就是给EEC画骨架。这一步要是走偏了,后面所有代码、测试、认证全得跟着遭殃。我见过太多项目,上来就写代码,写到一半发现架构撑不住,推倒重来——那滋味,真不好受。

3.1 分层架构:把复杂问题拆成三块

EEC的软件架构,我个人习惯分成三层。为什么是三层?你想想看,飞机发动机的控制逻辑、硬件驱动、安全监控,这三件事的性质完全不同,硬揉在一起,后期维护就是噩梦。

  • 应用层:负责核心控制算法。比如燃油计量、转速调节、推力管理。这一层只关心“要做什么”,不关心“怎么做”。
  • 中间层:也叫抽象层。负责把硬件细节藏起来。比如读取传感器数值、输出执行器指令。我在这层做过一个“硬件抽象接口”,换传感器型号时,应用层代码一行都不用改。
  • 底层:直接跟硬件打交道。包括CPU寄存器操作、中断处理、看门狗喂狗。这一层代码量最少,但最容易出bug。

关键原则:上层不能直接调用下层函数。必须通过中间层接口。我曾经在一个项目里发现有人为了省事,在应用层直接操作GPIO寄存器——嗯,后来那个模块在高温测试时随机死机,查了三天才找到原因。

3.2 模块划分:高内聚、低耦合

模块怎么切?我有个笨办法:先画数据流图。看哪些数据经常一起出现,哪些功能必须同时运行。然后按功能域切分。

典型的EEC模块划分如下:

模块名称 功能描述 关键接口
传感器管理模块 采集转速、温度、压力等信号 提供滤波后的工程值
控制律计算模块 执行PID、前馈、限幅等算法 输入传感器值,输出执行器目标
执行器驱动模块 控制燃油阀、放气活门等 接收目标值,反馈实际位置
故障诊断模块 监控各通道健康状态 输出故障代码和降级指令
通信管理模块 处理ARINC 429/664数据收发 提供收发缓冲区和协议解析

我的经验:每个模块的代码量控制在2000行以内。超过这个数,说明模块职责太杂,该拆了。我曾经维护过一个5000行的“万能模块”,里面既有控制算法又有通信协议——改一个bug能引出三个新bug。

3.3 冗余设计:双通道与三余度

EEC是安全关键系统,冗余设计是必须的。说白了,就是“别把所有鸡蛋放在一个篮子里”。

3.4.1 双通道架构

最常见的方案。两个完全相同的通道(A通道和B通道),同时运行。正常情况下,A通道输出控制信号,B通道热备份。如果A通道自检发现故障,立即切换给B通道。

这里有个坑:切换时间。我遇到过切换时间超过50ms的情况,发动机喘振了。后来我们规定:切换必须在20ms内完成,且切换过程中输出不能跳变。

3.4.2 三余度架构

更高安全等级的系统会用三余度。三个通道同时运行,输出采用“三取二”表决。也就是说,只要有两个通道结果一致,就采用那个结果。

注意:三余度不是简单的“三个通道复制三份”。每个通道的传感器、电源、时钟都必须独立。我曾经见过一个设计,三个通道共用同一个5V电源——结果电源一坏,三个通道全挂,三余度变成了零余度。

三余度的好处是:单个通道故障不影响系统运行,甚至两个通道故障(只要不是同一类故障)还能降级运行。代价是成本翻倍、体积重量增加、同步逻辑复杂。

3.4 通信总线选型:ARINC 429 vs ARINC 664

通信总线选型,说白了就是选“怎么把数据传出去”。EEC内部和外部设备之间,需要可靠、实时、确定性的通信。

3.5.1 ARINC 429

老牌总线,上世纪70年代的标准。特点是简单、可靠、慢。单根线速率只有12.5kbps或100kbps。我最早做EEC时用的就是429,那时候觉得够用了。

优点:

  • 硬件实现简单,一个UART加几个电平转换芯片就行
  • 电气隔离容易做,光耦一加就搞定
  • 协议成熟,文档满天飞

缺点:

  • 速率低,传输32位数据要花几毫秒
  • 点对点通信,一个发送端只能接最多20个接收端
  • 没有错误重传机制,丢了就丢了

3.5.2 ARINC 664(AFDX)

这是新一代航空以太网。速率100Mbps起步,支持全双工、交换式网络。说白了,就是把以太网搬到飞机上,但加了确定性传输保证。

优点:

  • 带宽大,可以传输高清视频、海量数据
  • 支持虚拟链路,逻辑上隔离不同数据流
  • 有冗余管理,双网冗余自动切换

缺点:

  • 硬件复杂,需要专用交换机和终端芯片
  • 协议栈庞大,软件实现难度高
  • 认证成本高,需要做大量符合性测试
对比项 ARINC 429 ARINC 664
速率 12.5/100 kbps 100 Mbps
拓扑 点对点 交换式星型
冗余 双线冗余 双网冗余
确定性 天生确定 需配置虚拟链路
成本
适用场景 传统EEC、简单传感器 新一代航电、大数据量传输

选型建议:如果项目是升级老机型,且数据量不大,继续用429没问题,省钱省事。如果是全新设计,且需要传输大量数据(比如发动机健康管理数据),果断上664。我最近一个项目就是混合使用——控制数据走429,监控数据走664,各取所长。

3.5 避坑指南

最后,分享几个我踩过的坑:

  • 冗余通道不同步:两个通道的时钟源必须独立,否则一个晶振失效,两个通道同时漂移。我曾经吃过这个亏,后来每个通道都配了独立的温补晶振。
  • 通信总线负载过高:429总线利用率超过80%时,延迟会急剧增加。我建议留50%余量。664虽然带宽大,但虚拟链路配置不当也会丢帧。
  • 模块接口定义模糊:模块之间用全局变量传数据?千万别。必须用明确的接口函数,参数类型、范围、单位都要写清楚。我见过一个项目,两个模块对“温度”的理解差了100度——一个用摄氏度,一个用华氏度。

嗯,架构设计这部分就讲到这里。下一章咱们聊详细设计,包括状态机设计、时序分析、以及如何把架构落地成具体的代码结构。到时候见。