刘春光,张亚宁
(92124 部队,辽宁 大连 116023)
在海上进行目标飞行试验时,需要对海上航区内的船舶、漂浮物等进行实时监控,以确保目标飞行器锁定预定目标靶。目标飞行器锁定了非靶目标时需要指挥所安全控制人员及时进行干预,将目标飞行器在空中引爆,以此确保非靶目标的安全。目前,海上监视系统可以将扫海雷达、AIS 等舰船信息报告给指挥所并在指挥所安全控制监视软件上实时显示。但当海上监视系统发生通信链路故障时,就需要通过人工方式向指挥所实时汇报目标靶信息,此时通过人工方式向安全控制监视软件添加目标靶信息就显得尤为重要。
舰船信息一般包含船名、经度、纬度、操作类别等4 项内容。本文软件设计流程为:首先通过通信设备获取舰船的位置、速度等信息,然后将舰船信息的格式转换为安全控制软件支持的格式,最后将此信息发送到安全控制软件进行显示。程序信号流程如图1所示。
图1 程序信号流程
为了实现人工添加目标靶信息的功能,需要完成人机交互界面设计、转换船舶信息数据格式、向安全控制监视软件发送数据包等环节。
本文基于MFC 平台,采取对话框模式设计程序界面,程序界面如图2所示。此程序界面中包含有船名、经度、纬度、发送地址等信息,同时设置了3 个按键“清空”“删除目标”“增加目标”,用户可通过按键实现相应的功能。此界面中,共有“靶船”“经度”“纬度”等标签控件11 项,船名、经纬度数值信息输入控件9 项,此外还有“清空”“删除目标”“增加目标”等按键控件3 项。
图2 程序界面图
界面设计完成之后,就需要从界面中获取人工添加的船名、经纬度等参数信息。以获取船名和经度信息为例,具体实现代码为:
GetDlgItemText(IDC_targetname,targetname,10);//获取船名
m_jd_degree =GetDlgItemInt(IDC_jd_degree);//获取经度度信息
m_jd_minute =GetDlgItemInt(IDC_jd_minute);//获取经度分信息
m_jd_second =GetDlgItemInt(IDC_jd_second);//获取经度秒信息
在此功能实现上,通过调用相应的MFC 函数实现程序界面参数的读取工作,将船名按照字符数组保存,将经纬度信息的度、分、秒按照整型保存。
所获取的程序界面参数信息并不能直接被安全控制监视软件识别出来,需要统一成安全控制监视软件所支持的格式后才能被其识别。安全控制监视软件所支持的数据格式为:
#pragma pack(1)// 网络包中无边界对齐填充
struct TarInf {
char Action;// ‘A’=新增,’D’=删除
char key[5];// 船名
double X;// 经度
double Y;// 纬度
};
#pragma pack(pop)
在此数据格式中,采取网络包中无边界对齐填充的方式构建数据,其中Action 表明此数据包的功能,字符A 表示新增目标,字符D 表示删除目标;船名key 采取字符数组的方式保存;经度和纬度统一成双浮点型变量。与本文程序界面参数格式相比,船名均为字符数组,不需要转换,但经纬度信息需要由原来的“度—分—秒”形式转换成“浮点型”单一变量。经纬度信息转换的实现代码为:
m_jd_degree_all=m_jd_degree+m_jd_minute/60+m_jd_second/60/60;
m_wd_degree_all=m_wd_degree+m_wd_minute/60+m_wd_second/60/60;
通过此环节,将程序界面中所输入经度和纬度的度分秒信息转换成统一格式的位置信息,为下一步的数据打包发送提供了数据基础,方便了后续的数据发送。
为了实现最终的数据发送,还需要按照发送数据TarInf结构进行数据打包,将相关的船舶信息封装在相应的数据包中。为了实现此功能,本文定义了TarInf 结构变量tarinf,并通过赋值的方式实现数据打包,具体分为目标增加、目标删除。
2.4.1 增加目标靶信息
TarInf tarinf;//定义目标靶信息数据包
for(int i=0;i<=4;i++){tarinf.key[i]=targetname[i];}// 目标靶名
tarinf.X=m_jd_degree_all;//经度
tarinf.Y=m_wd_degree_all;//纬度
tarinf.Action =’A’;//增加目标
在此环节中,首先定义了TarInf 格式的数据tarinf,然后依次对tarinf 的各个变量进行赋值。首先对目标靶名进行赋值,然后对经度信息和纬度信息进行赋值,最后按下“增加目标”按键将tarinf 变量的Action 值赋为字符“A”,最终实现“添加目标”的任务。
2.4.2 删除目标靶信息
TarInf tarinf;//定义目标靶信息数据包
for(int i=0;i<=4;i++){tarinf.key[i]=targetname[i];}// 目标靶名
tarinf.X=m_jd_degree_all;//经度
tarinf.Y=m_wd_degree_all;//纬度
tarinf.Action =’D’;//删除目标
在此环节中,与“增加目标”功能实现相似,首先对目标靶名进行赋值,然后对经度信息和纬度信息进行赋值,最后按下“删除目标”按键将tarinf 变量的Action 值赋为字符“D”,最终实现“删除目标”的任务。
2.4.3 清空界面功能
为便于操作人员输入不同的目标靶信息,为此程序设置了“清空”功能,当按下“清空”按键时系统会将“船名”“经度”“纬度”“发送IP”“发送PORT”等信息清空,方便操管人员在此输入信息。此功能的实现比较简单,在此不再赘述。
封装完数据包后,需要将数据包发送到指定的地址,发送地址IP 和端口信息的获取方式与船舶信息的获取方式相同,IP 地址使用字符数组IP 保存,端口号使用整型变量PORT 保存。获取发送地址信息后,调用“Winsock2.h”库中的sendto 函数实现数据发送功能,具体实现代码为:
SOCKADDR_IN addr;//构建发送地址结构
addr.sin_family=AF_INET;//发送模式采取UDP
addr.sin_addr.S_un.S_addr=inet_addr(IP);//发送地址
addr.sin_port=htons(PORT);//发送端口号
sendto(m_socket,(char *)lp_tarinf,sizeof(tarinf),0,(SOCKA DDR*)&addr,sizeof(SOCKADDR));//数据发送
此环节是发送封装好的数据最终实现目标显示,在此环节中首先定义SOCKADDR_IN 结构的数据addr,然后对addr 的各个成员变量进行赋值,由于本文程序基于UDP 协议,addr 的sin_family 成员变量赋值为AF_INET,这样可以实现UDP 信息的发送,程序根据程序界面的“发送IP”和“发送PORT”信息,分别将其赋值给addr 的sin_addr 和sin_port 两个成员变量,最后调用sendto 函数最终实现数据的发送。
通过以上5 个步骤完成了程序的界面设计、界面参数获取、参数格式转换、数据打包、数据发送等功能。
最后,针对本文设计的人工添加目标靶信息软件进行了机房实验,实验中设置船名为“G201”,经度为121 度50分42 秒,纬度为38 度43 分13 秒,目标地址为组播地址“232.168.5.112”,目标端口为5150,然后点击“增加目标”按键实现新增目标功能,实验界面如图3所示。
图3 人工报靶软件参数设置
在安全控制监视软件中效果如图4所示,在辽宁南部海域出现了新增目标“G201”,通过坐标读取工具得到目标的经度为121.845169 度、纬度为38.720315 度,由计算结果可知此值与实验中设置的经纬度一致。通过真实环境下的实验验证可以看出,本文设计的软件实现了人工手动“添加目标”信息的功能,同时本文还验证了“删除目标”“清空”等功能,可以在无法自动接收目标靶信息的情况下实现手动添加目标信息的功能,且经过目标位置的比对验证了本文设计软件的精确性。
图4 安全控制监视软件显示情况
本文基于在海上目标飞行试验中某些特殊情况下需要人工报靶的情况,利用MFC 平台从信号流程规划、界面设计、功能实现等方面详细论述了人工添加目标靶信息软件的设计流程,最后通过机房实验验证了本文设计软件的可行性,对于弥补海面监视系统通信链路故障时无法自动获取目标靶信息这一缺陷具有一定的现实意义。