从发车塔架边上的测控间回到办公室,手里攥着的还是那张写满异常数据的打印纸。做运载火箭测控系统集成这行,我见过太多因为设备间互不兼容导致的“现场翻车”。一台示波器、两个采集板卡、三路继电器开关矩阵,各自用着不同的命令协议和数据帧格式,上位机软件写起来像拼积木——每换一次硬件,就得把软件推倒重来一次。后来我们在某模拟项目X里全面引入ATML标准,用一套统一的描述语言把整个测控链路的数据格式、设备能力、测试流程全部规范化,效果非常明显。本文就把这次“基于ATML标准的运载火箭测控系统构建方案”从头到尾拆一遍,从标准理解、架构设计到具体搭建细节、踩坑记录,尽量写成能直接拿去复用的实操笔记。
适合谁看:刚接手航天ATS(自动测试系统)项目的新人、正在做测控软件架构选型的技术负责人、以及想知道“ATML到底怎么落地而不是停留在PPT上”的工程师。我会把那些标准文档里不会写清楚的经验一并倒出来。
1. 需求拆解:运载火箭测控系统为什么必须标准化
1.1 传统测控系统的“三座大山”
运载火箭测控系统要测的对象很杂,箭上供电、推进剂贮箱压力、伺服机构响应、时序指令、遥测参数采集……这些任务背后对应的是不同厂家的仪器设备。第一座大山就是接口私有化:早期设备厂商很喜欢自定义命令格式,同一个“设置电压”的操作,A家设备写VOLT 5.0,B家设备偏要:SOUR:VOLT 5,更麻烦的是二进制协议,调试时还得拿协议手册逐字节对。第二座大山是测试程序不可移植,一套写好的测试流程绑定死了具体仪器型号,项目换一台等效设备,脚本就要改一大半,更别提换整个测试站。第三座大山是数据格式混乱,测试结果可能是文本、Excel、私有数据库,不同分系统之间想比对历史数据,需要先写一摞转换脚本。
这三座大山导致一个项目里往往有一半时间在“写驱动、转格式、修兼容”,真正花在测控逻辑本身上的精力很少。而ATML标准解决的就是这个问题:把测试需求、仪器能力、UUT(被测单元)特性、适配器连接关系、测试结果分别规范成一套XML Schema,设备之间不直接对话,而是通过标准描述文件交换信息。
1.2 ATML标准家族速览
ATML(Automated Test Markup Language,自动测试标记语言)不是单独一个标准,而是一族标准,核心是IEEE 1671及其子项。我在实际搭建时主要用到:
| 标准编号 | 描述对象 | 数据交换文件 |
|---|---|---|
| IEEE 1671.1 | 测试描述 | TestDescription.xml |
| IEEE 1671.2 | 仪器描述 | InstrumentDescription.xml |
| IEEE 1671.3 | 被测单元描述 | UUTDescription.xml |
| IEEE 1671.4 | 测试配置描述 | TestConfiguration.xml |
| IEEE 1671.5 | 测试适配器描述 | TestAdapterDescription.xml |
| IEEE 1671.6 | 测试站描述 | TestStationDescription.xml |
| IEEE 1636.1 | 测试结果与数据追溯 | TestResults.xml |
这套家族关系很有意思,它把测试系统拆成几个“组件身份”,各自拿一份XML文件描述自己的能力和当前状态。测试程序调用仪器时,不直接面对某个厂商指令,而是先查仪器描述文件,确认“这台设备能提供5V直流源”,再由框架层把标准请求翻译成具体设备命令。运载火箭测控中经常出现的“电源加电-采集电压-判断阈值-切换继电器”这类流程,在这个模型下变成了“需求描述-资源匹配-命令翻译-结果反馈”的标准动作。
1.3 是不是所有测控系统都需要ATML
说实话,ATML不是万金油。如果你只是给单台设备配个小采集软件,几个通道、几十个参数,花大力气做一套标准化描述文件反而增加工作量。但运载火箭测控系统这种场景——设备种类多、测点数量大、任务可靠性要求高、技术状态还会在不同发次间变化——标准化带来的收益会盖过前期成本。我的选型判断标准很简单:设备数量超过30台、测试步骤超过100条、系统要长期维护并复用于多个型号任务,就可考虑ATML。尤其是火箭测控里的“不加电检查”和“准备加电测试”这种分阶段复杂流程,每个阶段都有不同设备介入,用标准模型最容易把流程理清楚。
2. 系统整体架构设计与信息流规划
2.1 经典四层架构:从UUT到应用层的边界划分
我们最终采用的架构分为四层:
- 被测层(UUT):火箭上各类电气设备、传感器、执行机构,以及箭地接口。
- 适配层(TUA,Test Unit Adapter):定制电缆、适配盒、信号调理模块、继电器转接矩阵,负责把箭上的各种接口信号转成统一的标准测量端口。
- 测试资源层:机柜里的可编程电源、万用表、示波器、动态信号采集器、开关矩阵等仪器,以及对应的仪器控制器。
- 管理应用层:测试主控软件、数据管理软件、任务调度服务。
这个分层的关键在于把“接口物理转换”和“逻辑测试”彻底分开。适配层只做物理信号的汇接和调理,不承担测试逻辑;测试资源层只负责执行命令和回传数据;管理应用层通过ATML描述文件知道每个适配通道该接哪个仪器端口。这样某个分系统要升级仪器,比如把一台老旧数字表换成新表,只需要修改仪器描述文件和测试配置,测试程序的主体逻辑基本不动。
2.2 信息模型:XML描述文件如何串成一条完整链路
工程上把ATML落在系统里,本质是建立一套“六个描述+一个结果”的信息模型。我习惯把这些文件关系画成一条数据链:测试需求文件(TestRequirement)引用UUT描述文件,UUT描述文件里的某个测试项关联TestDescription(测试说明),TestDescription通过测试配置引用InstrumentDescription(仪器能力)和AdapterDescription(通道映射),最终执行结果回写到TestResults文件。
听起来抽象,换到运载火箭测控场景就好理解了。比如有一个“一级发动机氧加注前贮箱压力测量”需求,UUT描述里定义了贮箱压力传感器输出0-5V模拟信号,接在适配器第3通道;测试描述里写明要在指定时刻采集电压并量化为压力值;仪器描述里注明采用某台24位数据采集器,量程±10V,采样率10kS/s;适配器描述则声明第3通道对应采集卡第1端口。主控软件拿到这些文件后,自动匹配可用资源、生成命令序列、执行采集,并把数据连同需求编号、设备序列号一并存入测试结果文件。整个过程不需要在测试程序里硬编码物理通道。
2.3 从“指令脚本”到“数据驱动”的架构转变
传统测控软件里最常见的结构是:
def test_channel3(): instr.write(":CONF:VOLT DC") instr.write(":READ?") value = instr.read() ...这种“面条式脚本”最大的问题是逻辑和资源绑定。换设备、换通道,函数体就必然要改。ATML思路改造后,测试框架变成了解释器式的:
test_item = load_atml("ATML_TestDescription_003.xml") uut = load_atml("ATML_UUT_001.xml") station = load_station_config() # 解析InstrumentDescription + AdapterDescription resource = resource_manager.allocate(test_item.signal, station) resource.apply_stimulus(test_item.stimulus, uut.channel) measured = resource.measure(test_item.measurement, uut.channel) compare(measured, test_item.limit)架构变革背后的“为什么要数据驱动”逻辑很直接:测控系统要支持的设备越多、测试项越复杂,变化点就越集中到“数据和配置”。把这些变化抽到XML文件里,代码副本量显著减少,测试逻辑改动时也不容易误伤到设备驱动层。
3. 核心模块搭建与关键实操步骤
3.1 三步完成UUT描述模型搭建
第一步是理被测信号清单。把火箭上需要测量的电气点全部列出来,逐个写明信号类型、电平范围、阻抗特性、是否需要隔离供电。这一步建议和箭上总体设计人员坐在一起过,千万不要只依赖老项目的Excel表——我记得某次就漏了一路箭上伺服机构供电电流信号,资料里没写,最后还是现场加测才知道。
第二步是把信号分类映射到标准类型。ATML很多时候会结合IEEE 1641信号标准来定义信号,比如DC_Signal、AC_Signal、Pulse等。像推进剂液位传感器输出4-20mA电流信号,建模时可以抽象成“DC_Signal+Current”外加工程单位转换;某路LVDT位移传感器输出比率电压,则应抽象成带载波激励的测量信号,不能简单当直流电压处理。
第三步是生成UUT描述XML。建议用可视化工具编辑而不是手写Xml,否则极易出现元素顺序错误。字段上重点关注TestRequirements、TestItems、Signals和InterfacePorts四个组。我在项目里为每个箭上设备做了单独的UUT文件,几十个文件统一由版本库管理,换技术状态时只改对应文件。
3.2 仪器描述与资源管理器的实现要点
仪器描述文件要写清两部分内容:能力(capabilities)和细节(capabilities parameters)。能力部分描述设备能输出的信号类型和测量范围;细节部分包括接口协议、命令模板、物理端口数量、采样率、精度指标。
资源管理器是软件层的核心,我建议实现成“申请-占用-释放”的锁机制。当某个测试项需要一台直流源输出28V并同时用采集卡测电压时,资源管理器要检查仪器描述里的约束条件——同一台源是否已被某个并行流程占用、是否需要用到适配器的某个继电器通道——再决定是否允许同时执行。运载火箭测控里很多任务是可以并行准备,比如加注泵启动检查与贮箱压力监测需要在同一时间窗内分别占用多台仪器,如果没有资源锁,就可能出现两路指令同时控制一台设备导致状态混乱的问题。
仪器描述文件还会带“命令模板”,把标准信号请求映射到设备的SCPI指令。这块我建议单独写一个“命令生成器”模块,不要塞进驱动层。驱动层只负责收发和超时处理,命令生成器负责把标准请求渲染成具体指令行。否则驱动层一旦依赖设备细节,换设备时还是要改驱动。
3.3 适配器与开关路由的工程化描述
运载火箭测控把几十路箭上信号汇接起来,最实用的硬件是继电器开关矩阵和信号调理盒。ATML的TestAdapterDescription文件把适配器当成一个节点,内部包含通道定义、信号路径、阻抗和损耗参数。典型的XML片段:
<AdapterChannel id="CH3" type="AnalogInput"> <MappedDevice>DAQ_Ch1</MappedDevice> <SignalConditioner>VoltageDivider 2:1</SignalConditioner> </AdapterChannel>这里工程上的坑比想象中多。适配器描述里的“映射”一定要和实物链路一致,比如某通道先经过电阻分压再到采集卡,就要在SignalConditioner节点里写明分压比例,否则软件层面按原始电压算出来的压力和真实贮箱压力差了整整一倍。连接器线序方向也容易错,适配器两端引脚定义分别对应箭上接口与仪器接口,描述文件里可能要写AdapterSidePin和InstrumentSidePin两个属性,而不是简单写一个笼统的“pin 3”。
开关矩阵的路由也是描述难点。一个继电器矩阵存在多种开关路径,比如输入通道A可以从开关1-3路径到达输出口,也可以从开关2-1路径到达。我会在AdapterDescription里用SwitchRoute列出所有允许的路径,每个路径附带最大载流值和接触电阻上限。这样资源分配时,如果某路信号的大电流超过了默认路径的载流能力,自动切换到更粗的开关路径,有效避免继电器触点烧蚀。
3.4 数据采集同步与时钟对齐策略
运载火箭的动态测量中特别关注多参数同时性,比如发动机试车时要同步采集推力、压力、振动加速度。ATML本身不规定同步机制,但它描述的测试配置里可以携带同步信息。项目里的做法是:所有采集设备通过GPS/IRIG-B码对时,采样时钟由统一时码源驱动,保证各通道采集多个时间戳是对齐的;同时描述文件里给每个测点标注采样率、采集窗口、触发电平,这样设备开始采集后,所有通道在相同时间基准下工作。
这里必须提醒一点:不要盲目提高采样率,采样数据量大,系统存储和实时解析压力都会上来。实际配置时需要根据信号带宽和被测量变化速率决定。比如火箭贮箱压力是缓变信号,50Hz采样就够;而某型伺服机构瞬态响应则需要2kHz以上。把采样率写在描述文件里,并由调度软件根据测量类型分类下发,往往比统一设高频更合理。
4. 信号建模与测试结果的互操作设计
4.1 基于IEEE 1641标准做信号级建模
说到ATML离不了IEEE 1641。ATML各描述文件里的Signal部分大量采用1641的信号模型做基础定义。简单理解,1641把“一个信号”拆成“信号函数+信号参数+信号行为”,比如脉冲信号可以用Pulse函数,参数包括幅度、上升沿时间、占空比;再加等价时间行为,比如连续、单次。
这种抽象让测试程序从“操作仪器”变成“定义信号”。例如给箭上某个电磁阀供电:传统脚本是“开电,等0.2s,关电”,而1641描述是:
<Signal name="PowerPulse"> <Function name="Pulse"> <Parameter name="Amplitude" value="28V"/> <Parameter name="Width" value="0.2s"/> </Function> </Signal>实际执行阶段由运行库解析这个描述,自动匹配可用的直流源,生成对应的SOP指令序列。好处在于换了一种仪器,只要描述不变,执行逻辑就不变。对于推进剂加注时需要进行连续压力扫描的场景,等效建模成带“周期性”行为的信号,配合数据采集卡能很自然地描述“每100ms采集一次,持续20分钟”的需求。
4.2 测试结果的统一封装与可追溯性
ATML相关标准在实际项目中不强制统一测试结果格式,但IEEE 1636.1给出了测试结果数据模型,我会重点用它来保证“闭环管理”。每一条测试结果都要携带:测试项编号、UUT编号、设备序列号、测试时间戳、执行环境信息、定量的合格判断和原始数据路径。
运载火箭的各项测试通常按“参数合格判据”区分,有用的不只是结果文件里的一个Pass/Fail标记,更关键的是判断用到的原始数据、设定阈值、所用仪器的校准有效期。把这些信息封装进 TestResults.xml,追溯就变得很直接。比如某发火箭测试后出现隐匿的电信号异常,可以直接定位到当时采集动态数据的设备编号,再核对校准记录,判断是否为测试设备零漂造成误判。
我踩过的坑是没有把“原始数据文件”路径放进TestResults(只写了分析结果),后来需要复核数据时,在存储服务器里翻箱倒柜,才在某个隐藏目录找到原始记录。之后强制要求框架把原始文件连同结果一并归档,存在同一个项目编号目录下。
4.3 多分系统对接时的接口兼容
运载火箭地面测控不是单机系统,它要和发射控制系统、加注系统、遥测系统互通。每个分系统都有自己的内部数据格式。我在做某次系统集成时要和加注系统交换推进剂密度参数,对方系统不理解ATML标准,就直接定位XML节点取值然后转成对方要求的浮点数组。这种对接建议不要硬改对方系统,而是做一个“接口适配服务”,用XPath把标准ATML数据抽出来,转成对方文档定义的格式。
如果双方都支持标准接口,那兼容性问题就好处理得多。但现实是很多老系统只有文本协议,接口适配服务依然必不可少。维护一个中心数据字典,把各分系统的参数定义映射到标准单位,能显著减少对接时的字段歧义。
5. 常见问题排查与工程避坑经验
5.1 高频异常速查表
用哪个系统都逃不过我们日常和异常做斗争。以下是整理的高频异常与排查思路:
| 异常现象 | 可能的根因 | 排查项与解决办法 |
|---|---|---|
| 适配器通道数据全为零或满量程 | 接线与AdapterDescription映射不符 | 对比线序表,检查信号调理模块的增益设置,确认继电器路径闭合 |
| 测试程序正常但仪器没响应 | InstrumentDescription里命令模板错误 | 看设备返回日志,核对命令头和分隔符,SCPI里冒号和空格错位是常事 |
| 并行测试时设备状态被打乱 | 资源分配锁未作用到同一设备 | 全站资源统一由ResourceManager申请,禁止测试程序直连设备端口 |
| 同步信号漂移,多通道时间不一致 | 时码源中断或采样时钟配置不一致 | 检查IRIG-B码输入状态,重启时确保所有设备重复同步,不要部分设备沿用旧时钟 |
| 测试结果无法入库 | TestResults.xml中枚举值超出模式定义范围 | 参照Schema定义修正字符串,尤其注意枚举型的错误拼写 |
| 某路测量数据出现周期性尖峰 | 继电器机械抖动或共地噪声干扰 | 在AdapterDescription里增加滤波标志,做软件均值处理或硬件RC滤波 |
5.2 落地推进建议:从零开始的渐进式迁移路径
不建议一次性把所有设备全部ATML化。我实践下来最顺的路径分三步:
第一步,选择一个小范围试点,比如只对液体贮箱压力测量链路做整套描述。把UUT、仪器、适配器、测试描述文件全部写全,跑通主控软件。这个阶段能让你把数据结构、团队协作方式都摸熟,代价也小。
第二步,把资源管理器做成全站的“统一门面”。即使很多老设备暂时没有标准描述,也通过一个“适配包装”把它们纳入资源清单。测试程序只和资源管理器对话,不直接访问设备。后面逐步为老设备补充描述文件,改造时程序侧变化非常小。
第三步,全面铺开测试结果归档和追溯。把已有测试任务的结果统一转成ATML TestResults结构,建立历史数据库。这一步一开始会让人感觉工作量大,但做完后,跨任务数据比对、设备趋势分析都变得特别顺手。
5.3 工具链与团队协作心得体会
ATML落地最大的障碍不在技术,在团队习惯。测试工程师习惯了直接操作仪器面板,让他转为先建模再测试,思维要变一下。我给新人的建议是:不要一开始就扎进XML格式,先把“这路信号从哪里来,到哪里去,用什么设备量,允许偏差多少”写清楚。等脑子里有了链路概念,再去填Schema就顺了。
理论工具可以用通用的XML编辑器加校验器,但别只用代码编辑器,容易漏结构错误。项目后期,我甚至写了一套脚本来做Schema校验和一致性检查,专门扫描述文件里引用对方ID是否存在的错误。这种自动化检查极大减少了联调阶段低级错误。
最后说一个习惯:每次改动仪器或适配器硬件后,必须同步修改描述文件,并且通过一个“描述版本审批”流程。我曾经遇到一次仪器自校准后量程参数变了,描述文件没改,导致后面三天测出来的数据都是错的。从那以后,我把描述文件视作“系统的一部分”,和代码一样纳入版本管理,任何变更都必须配套评审记录。
结尾:一点个人经验
如果你的系统还在“脚本满天飞、设备各说各话”的状态,ATML改造不是一蹴而就的,过程会很繁琐,尤其是把存量设备逐台补描述、把历史测试数据重新归档,都是体力活。但等到全链路跑通一次完整的火箭测控流程,看到同一个测试需求在不同设备、不同测试站之间顺利平移,再回头看这些工作,基本都值回票价了。
额外分享一个选型细节:采购测试设备时,尽量优先选择官方公开提供描述文件或能导出的型号,这类设备接入ATML体系的成本会明显低一些。如果只能拿到私有协议,宁可安排单独做驱动封装,也不要图省事绕过资源管理器直接读写,否则后面维护会特别痛苦。