王洪星,孙 刚,徐 智
(中国直升机设计研究所,江西 景德镇 333001)
现代飞行器由于控制模型复杂,在试飞调参时往往需要多次进行参数调整。为定量评估飞行参数效果,需要在试飞过程中将各项飞行数据进行存储,在飞行后进行分析并为控制律参数调整提供依据。另外,飞行过程中出现故障时,依靠记录的故障信息可以快捷地对故障点定位。为节省存储资源,数据存储的格式往往为二进制形式,需要在飞行后对记录数据进行重新解码还原。由于常用的飞参设备需要记录各系统的大量飞行数据,数据记录周期往往设置得较长,以节约存储空间,因而导致在长航时飞行时很难对某特定系统的数据进行详细记录。对此,在试验试飞阶段通常还需专门留出数据记录器。另外,出于调参排故等需要,各系统需记录的数据种类也会经常变化,因此需要一种高适应性的解码软件对存储的二进制数据进行解码。基于此方面考虑,本文提出并实现了一种基于MFC框架,用于对飞行数据解码的Windows应用软件,在存储数据种类发生变化时,无需重新编译生成软件,只需对相关协议配置文件进行更改即可,可以快速适配新的存储格式。
数据记录器如图1所示,采用了ARM+FPGA的处理器架构,其中FPGA作为429总线接口。在数据存储过程中,FPGA接收并缓存外部输入的高速429数据;当数据有效后,向ARM发出中断信号,通知ARM读取缓存数据,并将数据顺序存储在Flash中;Flash格式化为FAT32文件系统,因此应用软件可以通过文件的形式对存储数据进行读写操作。同时,ARM向FPGA发送控制信号,用于对总线数据读取进行逻辑控制。在数据读出过程中,首先将记录器引出的USB接口连接上位机电脑;ARM接收到接入信号后,通过内部数据总线将Flash中存储的数据以二进制文件格式读出,并通过USB接口向PC发送;此时在PC中可以通过文件访问的形式对存储文件进行操作。
图1 数据记录器硬件组成
总线数据由飞行记录软件发送。记录软件贮存在飞行计算机中,按照固定周期运行,并由操作系统负责周期任务调度。记录软件负责传感器数据的采集,并将中间数据向数据记录器发送。程序流程如图2所示。考虑到发送的数据量较大,为避免阻塞任务,在每个任务运行周期内,将待发送的一帧飞行数据包分成四拍发出。在机型上进行实测时,80 ms的数据记录周期,每周期记录的429字为113个,则每小时需要记录的飞行数据约为39 MB。
图2 数据发送流程
在记录器上电后,ARM首先向FPGA发送初始化指令,并调用文件系统API在Flash中创建新文件。在接收到429数据后,ARM从FPGA的数据缓冲区中读取数据,并向文件中写入,如图3所示。
图3 数据存储流程
为保证软件的通用性,解码软件使用了配置文件对不同的存储协议进行适配。配置文件的主要格式如表1所示:第1列为429字的各数据位的信号定义;第2列说明了对各数据位定义的说明,例如正负号的定义、单位等;第3列表示该429字在一帧数据包中的位置;第4列表示该数据位在429字中的起始位置;第5列表示该数据位所占据的位长度;第6列代表了数据的存储类型,在本软件中,以数字3代表该数据为离散量,在解析时只需按位解析即可,无需考虑LSB换算,数字2代表该数据为无符号值,数字1代表该数据为有符号值,在解析时应考虑数据正负;第7、8列分别为该数据的LSB值、数据字的429标号;第9列为数据在输出中的列位置,用于在数据解析后,在输出文件中按照一定顺序对解析出的数据信息重新调整,以便于解读。
表1 配置文件格式示例
按照此格式,在数据的存储协议发生变化时,无需再重新修改解码程序,只需要按照新协议修改配置文件,即可对新协议进行正确解析。
2.2.1 编程框架
解码软件采用基于MFC的程序框架编写。MFC即微软基础类库,是微软公司于1992推出的通用C++开发库。库中大量封装了可重用的Windows API,包括Windows的内建控件和组件等,支持消息循环、运行时类信息机制、动态创建机制等特性,是一种 Application Framework,包含多个程序框架模板,减少应用程序开发人员的工作量。发展到今天,MFC已成为一个稳定和广泛覆盖的C++类库。
考虑到解码软件需要的界面控件数量较少,因此采用了基于对话框的架构进行代码编写,所使用到的类架构如图4所示。
图4 使用到的架构类
其中,CMyApp为应用程序类,负责应用程序的初始化;CMainDlg为对话框类,负责解码主界面的刷新、消息响应等工作;CDialogLogIn用于管理软件登录界面并读取配置文件。
2.2.2 界面设计
解码软件主要设计了登录界面与解析界面两个对话框,登录界面如图5所示。在该界面中,用户需输入正确的用户名与登录密码后方可进入解析界面。任意输入错误,将进行错误提示,如图6所示。
数据解析界面为解码功能的主界面,如图7所示。通过点击“解码”按键,弹出文件选择对话框,选择需要解析的二进制文件。当“控件刷新”为选中时,将解析结果在下方列表框中即时显示,并在当前进度中显示解析进度。同时,解析出的故障信息与PBIT自检信息同样在控件中显示。为方便不同界面切换,使用Tab控件来对当前显示的数据主页面进行管理。
图7 解码软件主界面
2.2.3 软件流程
软件登录界面中,添加“登录”按键的消息响应函数CDialogLogIn::OnBnClickedOk(),在响应函数中,首先校验用户名与密码是否正确。在正确输入后,显示解码软件的主界面。主界面由CMainDlg类管理,在对话框初始化函数CMainDlg:: OnInitDialog()中读取应用程序路径中存在的有效配置文件,并将读取结果存放于类成员m_pConfigStruct中。
在协议配置文件成功读取后,CMainDlg将各协议字配置项名称作为列标,插入到列表控件中,显示顺序由配置文件中的列位置决定。
进入解码主界面,在“解码”按键的单击事件响应函数中,调用系统文件打开对话框,选择并读入待解析的二进制文件,开始解析飞行数据。解析流程如图8所示。
图8 数据解析流程
首先根据标号寻找每帧数据中第一个429字位置;此后每读取到一个429字时,应首先对其标号与配置文件中的标号进行对比。配置文件中的各429字的行顺序应与接收顺序相一致,当接收顺序不同时,认为该次数据包接收错误,不再解析本包中的其余字,并在故障字解析文件中进行说明,同时寻找下一包有效数据。
根据429字中数据位类型的不同,将有符号数、无符号数以及离散量进行分类解析。
在数据解析过程中,考虑到本软件采用了单线程的工作方式,在数据量较大时,往往不能及时响应系统消息,会出现界面无法响应用户操作的情况,因此加入了消息循环结构,::SendMessage用于将消息发送到消息所标识的窗口,直到窗口完成指定的窗口过程后再返回。这样就避免了在解码过程中,当发生窗口事件时无法响应消息的情况:
if(PeekMessage(&msg,(HWND)NULL,0,0,PM_REMOVE))
{ …
::SendMessage(msg.hwnd,msg.message,msg.wParam,msg.lParam);
…
}
解析完成后,创建输出文件夹。文件夹按照飞行时间与架次重命名,并将生成文本格式的数据解析文件、格式说明文件、故障信息、PBIT结果文件依次存放。
2.2.4 软件验证
在机型上进行记录器功能验证,如图9所示,飞行过程共计约2小时。
图9 试飞数据解析结果
通过解析数据能够基本还原飞行过程中的各系统状态与内部运行信息,数据记录准确,解析结果(图10)与实际飞行情况一致。
图10 离散量解析结果
本文提出了一种通用的429数据解码软件设计方法,用于对数据记录器存储的数据进行解码,即将二进制总线数据解析还原为实际物理量。一方面用于在试验试飞时,对各系统的参数调试提供参考,同时保证飞行数据的完整性,能够高效地还原飞行过程中各飞行系统工作状态;也可以用于对飞行过程中的故障快速定位,为地面维护人员排故工作提供数据支持。最后对软件的正确性进行了充分验证。
飞机实际飞行试验表明,软件易于使用,飞行数据解码准确,通用性较好,能够方便地将该解码软件移植到不同的机型中。本文为429总线数据译码提供了一套通用的方法,证明了该软件的实用意义,为今后的试验试飞提供了有力保障。