摘要:云图监视数据是空管自动化系统处理的重要数据之一,通过对一次云图数据引起空管系统整体失效的原因与机理进行分析,包含分析步骤、分析方法,得出最终结论为气象云图数据量过大造成内存溢出,从而引发了一次系统性故障。通过原因的分析与研究,为今后空管自动化系统处理气象云图数据的鲁棒性提出了一种处理方法。
关键词:气象数据;空管自动化;SDD进程;系统失效
引言
2017年6月22日17时58分22秒,某地莱斯Numan2000自动化系统所有席位的SDD进程同时异常退出,管制单位使用二所AirNet自动化系统进行空中指挥。随后,通过在监控上重启莱斯自动化系统各个席位上的SDD进程[1],所有席位功能于18时01分恢复正常。
1 事发时的管制运行状态
事发当时,某地空管单位的塔台、进近、区调正在使用莱斯自动化系统进行空中指挥[2] [3]。系统异常后,管制使用二所自动化系统指挥。事发期间,塔台2架飞机地面等待,区域3架飞机特殊移交,外区域3架飞机等待,进近7架飞机保持高度。
2 故障排查过程
故障发生后,故障原因进行排查:首先,检查分析CETC_SDD进程终止时生成的变量文件core.CETC_SDD;然后,检查当日飞行计划、系统接收的报文等日志文件;最后,检查系统引接的12部雷达数据。通过以上检查,最终确定了导致此次故障的原因是莱斯自动化系统处理大量气象云图数据的软件BUG,具体过程如下。
.png)
A.分析core.CETC_SDD日志文件,定位出导致CETC_SDD进程异常退出的诱因位置为代码文件SDD_FDD_fpl.c,该代码对应了莱斯系统进程单显示功能。莱斯公司工程师通过逐个检查该代码有关的300多个变量,发现莱斯自动化SSTP窗口中的进程单刷新控件结构体HainJcdShell.frame(内存地址为0xcb56100)对应的变量值错误,如图1所示。
B.因系统席位突然同时发生异常,分析应该是系统接收了外部异常消息导致。为了确认异常消息来源,对系统故障当天的8000余条报文和2100条飞行计划进行逐条检查,未发现异常。
C.进一步检查故障时12部雷达传送的雷达数据日志,发现在当日9时雷达云图数据记录文件cloud2017062209.log内容较多。其中记录的第11路雷达(GSL)的气象通道云图数据达到了3129帧,包含云图点数据50104个,远远超过了其它的云图数据,怀疑故障与此有关。
D.通过检查云图数据处理的相关代码,确定系统储存云图点数据的极限为32768(有符号短整型数据)个,超过该数值会导致内存溢出。
.png)
E.为确认内存溢出与此故障的关联,逐帧检查云图点数据。当检查第2082个云图帧的云图点数据时,云图点数据到达云图点数组下标的上限32767,再增加一个云图点数据即超出32767,转换为有符号短整型数据-32768,云图点数组下标变为负值,云图点数组的赋值语句开始修改内存中云图点数组起始地址前面地址对应的内存,软件内存开始出现故障,如图2所示。
F.依此类推,后面的云图点数组赋值时,都是在依次修改云图点数组起始地址前面的内存,总计继续修改了17336(50104减去32768)处内存地址。当修改第16254(32768减去16514)次内存时,修改到内存0xcb56100,与莱斯自动化SSTP窗口中的进程单功能的刷新控件结构体HainJcdShell.frame的内存地址一致,导致该控件的变量值异常,如图3所示。
.png)
G.莱斯自动化系统系统采用Solaris操作系统和C语言编译,程序在编译阶段全局变量的内存地址已指定在全局静态存储区的对应位置。即相同编译条件下相同代码的CETC_SDD软件在相同的操作系统下,软件全局变量的内存地址是完全一样的。
H.根据C语言编译时的内存分配规则,当云图点数据个数到达49022(16254加上32768)时,云图点数组在赋值时一定会修改莱斯自动化SSTP窗口中的进程单功能刷新控件结构体HainJcdShell.frame的内存。
I.解析处理完云图消息后,CETC_SDD软件继续根据接收的总联消息处理相关事件。若处理的事件所在内存地址和前面云图处理时异常修改的内存地址重复,就会出现内存访问无效。此次内存访问无效是莱斯自动化SSTP窗口中的进程单功能的刷新控件结构体HainJcdShell.frame的内存地址与云图点数据的内存地址重复导致的。
J.当该内存损坏后,系统根据航迹消息刷新进程单显示时,访问该变量内存无效,导致CETC_SDD进程退出。
3 云图数据处理的原理介绍
(1)云图数据传输协议
A.GSL雷达所用的云图数据协议为ASTERIX CAT008协议;
B.该协议规定,云图数据以SOP帧为更新周期的开始,以EOP帧为更新周期的结束,在SOP帧和EOP帧之间,以多个无规律排列的数据帧表示云图数据,每个数据帧包含多个云图点数据;
C.根据对数据分析,每1个的SOP帧和EOP帧之间的数据帧传输时间和云图点数据量有关,通常为1分钟到2分钟。
(2)莱斯自动化系统综合云图数据显示规则
A.CETC_RAD进程只有收到SOP帧或者内存中云图点数据储存超过3分钟,才会清空内存中的云图点数据;
B.CETC_RAD进程固定每4秒将当时刻内存中的云图点数据发送给CETC_SDD,CETC_SDD进程将收到的云图点数据写入内存并转化成内部坐标进行显示。
.png)
C.在图4中,由于SOP帧的开始和数据帧的长度不同,t1时刻CETC_SDD收到的综合云图点数据不同。一个可以收到SOP1帧的大部分内容,一个只可以看到SOP2的部分内容;
D.CETC_RAD并不是在固定的绝对时刻定时进行融合处理,而是从程序启动开始计时,每过4秒则就处理一次,因此每次进行云图融合处理并发送给CETC_SDD的时刻与接收到云图数据帧的时刻的前后关系是随机的。
4 云图数据的分析与研究
基于以上情况,出现此类故障需满足三个条件,第一是一个周期内的云图数据点大于32768个点;第二,当云图点的数据大于32768时,SOP帧的收到时间必须晚于综合云图显示的时刻(t1时刻);第三,云图点溢出时修改的内存地址和系统关键变量的内存地址重复。前两个条件都是非常小的概率,第三个条件是引起CETC_SDD故障的直接原因。
A.云图点数据量分析
.png)
根据雷达日志记录的近1个月GSL雷达的云图点数据,出现较大数据帧的情况非常少见,除了6月21日和故障当天的10时至11时之间还出现了两次大数据帧的情况(2600和3275)外,其他时间数据帧最大值也只有1585,其它的都在500帧至800帧之间,如图5所示。
分析故障时刻云图数据帧的正文内容,未发现有明显的重复数据和错误数据,只是在该时刻云图的个数和总点数确实比较多。
B.其它两次大数据帧的情况分析
第一次出现大数据帧是在6月21日22时,出现的数据帧达到了2603帧,但涉及的云图数据点不到30000个,对系统内存没有影响,不会导致进程故障。
在故障当日的10点19分,出现了另一次数据帧为3275帧的情况,同时云图数据点数达到了52910。莱斯公司工程师根据RQS记录的数据推测,云图数据点数是在4秒内就完成了从低于CETC_SDD极限到高于CETC_SDD极限的变化过程,并接收到了下次更新的SOP。由于存储的云图被SOP帧清空了一次,因此前一次综合云图处理发给CETC_SDD的综合云图总点数低于CETC_SDD的极限,后一次发送的综合云图的总点数同样低于CETC_SDD极限。
因现场运行版本的CETC_RAD中并没有详细记录关于云图数据处理的日志,当时内部处理的确切情况已无法被确认,且每次进行云图融合处理并发送给CETC_SDD的时刻与接收到云图数据的时刻的前后关系并不能确定。因此,推测该次云图点数据并未修改到系统的关键内存。
5 云图数据处理日志的分析
(1)GSL单路云图接收处理日志
20170627101145 >>>>>>>> EOP MESSAGE=255 picturenumber=3129 vectornumber=8383 ----------
20170627101209 >>>>>>>> EOP MESSAGE=255 picturenumber=-1 vectornumber=8410 ----------
20170627101209 >>>>>>>> SOP MESSAGE=254 f=6 ----------
(2)综合云图处理日志
20170627101145> SEND:dotnum=50104 i=3129 from rad[GSL]
20170627101147> begin send mulrad> picture Num=3129
20170627101147> SEND:mulrad> total dotnum=50104 picture=3129
系统收到EOP后发送了GSL单路的云图。此后直到20170627101209,系统未收到SOP,GSL单路云图数据未变化,共计50104个点。
20170627101147时,系统开始定时云图处理,并发送此时的系统云图,共计50104个点。
(3)GSL 单路云图接收处理日志
20170627101502 >>>>>>>> EOP MESSAGE=255 picturenumber=3276 vectornumber=8884 ----------
20170627101502 >>>>>>>> SOP MESSAGE=254 f=6 ----------
20170627101551 >>>>>>>> SOP MESSAGE=254 f=6 ----------
20170627101615 >>>>>>>> SOP MESSAGE=254 f=6 ----------
(4)综合云图处理日志
20170627101502> SEND:dotnum=52910 i=3276 from rad[GSL]
20170627101503> begin send mulrad> picture Num=3276
20170627101503> SEND:mulrad> total dotnum=144 picture=3276
20170627101502收到EOP,发送GSL单路云图,共计52910个点。同一秒收到SOP后立即开始更新GSL单路云图。
20170627101503时,系统开始定时云图处理,此时参与计算的GSL单路云图已经与20170627101502发送单路时的数据不同。融合处理后,当时系统云图共144个点。
6 结论
经过以上内容的分析与研究,得出结论:建议厂家升级CETC_SDD软件,修改云图点数据类型,由有符号短整型改为无符号短整型。并且修改SDD软件处理云图的设计,对云图数据超过门限值则做丢弃处理、完善保护机制,增加异常处理流程。
参考文献
[1] 民航某地空管分局通信保障室综合运行手册——莱斯自动化分册.2015年11月
[2] 莱斯空管自动化系统管制员席操作手册.2013年5月
[3] 莱斯空管自动化使用手册手册.2013年5月
作者简介:王洪(1972-),男,贵阳人;毕业院校:贵州大学,职称:主任工程师,就职单位:民航贵州空管分局技术保障部,研究方向:空管自动化的研究与维护。