舰船综合导航模拟器1553B总线控制器软件开发
2012-07-04王程峥李文魁宋卫红黎海雪
王程峥 李文魁 宋卫红 黎海雪
(1. 海军工程大学电气与信息工程学院,武汉 430033;2. 92823部队三中队,三亚 572021;3. 92853部队,辽宁 兴城 125106)
0 引言
舰船综合导航系统作为导航系统的核心,对来自各种导航传感器的导航信息进行处理,并向操舵系统、指控系统等外部用户发送。为满足岸基条件下某型舰船操舵系统维修调试的需要,开发了舰船综合导航模拟器,用于模拟舰船操纵运动时综合导航系统输出的舰艇航向、航速、纵横倾等导航信息,并通过1553B总线向操舵系统发送。1553B采用一种串行、异步和半双工式总线结构[1],具有高可靠性、高实时性、高效率、抗干扰能力强等特点。
本文就 Windows环境下如何使用 C++Builder编译平台实现 1553B总线控制器通信的方法进行了研究,同时在综合导航系统模拟器设计中进行了成功应用。
1 1553B总线控制器软件设计方法
1553B总线由传输介质、总线控制器(BC)、远程终端(RT)和总线监视(BM)器等四部分组成。BC的作用是组织信息传输,完成数据字的收/发、字/消息的处理[2]。针对总线上远程终端的数量和通信复杂程度,BC发送消息的设计方法主要有两种[3]:
(1)简单方式。基本思想为RT回复消息的控制权完全在 BC。实现方法为:对周期消息采用固定周期来定时传输,对事件消息采用命令插入的方式。当BC要求RT 返回数据时,BC可向RT的子地址下达命令字,并通过采用查询方式来获取数据。该方法编程简单,适用于总线结构单一、通信数据量较少的情况,对多个 RT总线,通信实时性相对下降。
(2)矢量字方式。基本思想是将回复消息的主动权交还给RT。实现方法为:RT接收BC命令完成相应动作,将数据字写到相应子地址缓存中,然后按照协议构造矢量字,把矢量字发送到RT 的0/31 号子地址BUF中。BC在发送完一次性消息后,可向0/31子地址发命令字从而读出其中存放的矢量字,根据协议解析矢量字得到相应的子地址,并向该子地址发送命令从而得到 RT数据。该方法适合多RT的复杂通信,编程灵活,通讯数据量小。
2 综合导航信号模拟器BC设计
2.1 系统组成
如图1所示,综合导航模拟器接收操舵系统输出的当前舵角,按照舰艇运动模型,实时计算出舰船运动参数。并采用2个1553B通道无应答地定周期连续向操舵系统发送舰船的航向、航速、纵倾、横倾等导航参数。
2.2 硬件及板卡驱动函数
硬件平台采用研华工控机。1553B通信卡采用北京神州飞航开发的基于 PCI接口的AEC1553-PCI- SBC31RT-S2型1553B通信卡。该1553B卡采用 FPGA设计,可分时工作在 BC、RT、BM模式下,双冗余通道数据发送和接收,支持大容量的数据存储。
图1 舰艇综合导航模拟器的原理框图
该1553B板卡提供了丰富的驱动函数,其中与BC通信相关的函数约有20多个,常用BC函数[4]见表 1。
表1 常用BC通信函数列表
随卡附带的驱动函数库文件为基于 Visual C++的coff格式的M1553CSC.lib。若采用其它软件进行开发,则需要对库函数进行格式转换。如采用C++Builder,需用coff2omf命令转换为omf格式的库文件。相应命令为:coff2omf M1553CSC.lib M1553CSCB.lib。
2.3 软件设计
在 Windows XP操作系统下,我们采用C++Builder开发软件进行综合导航信号模拟器总线控制器软件设计。C++ Builder是由Borland公司推出的一款快速开发Win32应用程序的可视化开发工具,利用它可以实现高性能的执行效率和出色的底层控制。
对综合导航模拟器,总线结构较为简单,因此采用简单方式进行 BC设计。程序流程如图 2所示。主要程序代码说明如下:
图2 BC通信软件流程图
(1)板卡初始化
M1553_Open(&hCard, CardId);
打开板卡。hCard为板卡句柄,CardId为板卡编号,按板卡所在插槽离CPU的距离由近到远依次编号0、1…、7。这里取为0、1。
M1553_WorkMode(hCard, ModeSel);
设置工作模式。工作模式 ModeSel可取为0(BC)、1(RT)、2(BM),这里取 0。
M1553_AddTimeTag(hCard,true);
开启时间标签。用于观察消息周期和间隔。分辨率 1 μs。
M1553_SetIntMaskReg(hCard,&IntMask);
设置中断屏蔽寄存器。由于实时性要求较高,采用单消息触发一次中断,将中断屏蔽寄存器结构体 IntMask中的 BC_MsgOver(BC消息结束中断使能位)和BC_STOP (BC消息出错停止中断使能位)使能。
(2)数据加载
SMsg.MsgBlock.Datablk[0]=StrToFloat(Form 1->Edit1->Text);
将待发送数据字存放在BC消息描述结构体成员Datablk[32]中。
BC_WriteDataBlock(hCard,MsgId,WordCnt,SMsg.MsgBlock.Datablk);
修改运行中的BC发送的数据字,MsgId为消息 ID号,WordCnt为写入数据字个数(取值0~32)。
由于实时性要求较高,而C++Builder自带计时器的定时精度最高只能达到55ms[5],故采用Microsoft Win32 API 提供的一项多媒体定时器服务来实现数据定时加载[6],定时精度最高能达到1 ms[7]。程序需包含定时器函数头文件"mmsystem.h",实现方法如下:
①设定定时器分辨率
建立最小定时器分辨率。uPeriod为最小分辨率,由设定的最小分辨率与计算机的硬件配置决定。
使定时器定时精度回到系统的默认值。
② 设置定时事件
uDelay 为事件周期,这里与BC发送消息的周期一致;uResolution 为延时分辨率;LpTimeProc 指向一个自定义的回调函数,该函数用来设置定时事件,调用时应指定对应的事件标识符,并提供用户数据,在中断时间内被访问;DwUser 存放用户提供的回调数据;FuEvent 为事件类型,TIME_ONESHOT为一次性事件,TIME_PERIODIC为周期性事件。
调用任务完成后取消定时器回调事件,及时出让珍贵的CPU 资源。
(3)消息配置与发送
SMsg.CtlWord.ChanSel=1;//消息发送时的通道选择 0:Channel B 1:Channel A
BC_WriteMsg(hCard, MsgId, &SMsg); //消息发送
BC_AddEndOfListFlag(hCard, MsgId+1); //添加消息链表结束符
(4)消息读取
数据的读取显示采用C++Builder自带的计时器Timer定时触发。
2.4 系统调试
硬件方面,传输距离小于30 cm时,采用短截线实现总线和终端设备的直接耦合;否则,采用变压器耦合[8,9],连接时需要注意耦合器的位置。在总线两端匹配电阻,消除信号反射。调试过程中若发现问题应首先判定是否为硬件问题,发送已知数据,将板卡输出脚接示波器上观察电平,若正确则基本排除硬件问题。需要注意的是1553B总线上的消息是调制成双极性码的曼彻斯特码[10]。
图3 舰艇综合导航模拟器BC运行界面图
软件方面,采用随卡附带的应用程序作为RT接收数据。调试时应遵循先易后难原则。先尝试简单通信模式,如 BC发送一个数据字测试 RT能否正确接收,RT返回的状态字是否正常等,成功后再尝试较复杂的通信模式。软件运行界面如图3所示。
3 总结
本文讨论了1553B总线控制器软件设计的方法,根据舰船综合导航模拟器的实际需求,详细介绍了 Windows环境下基于 C++Builder如何实现数据发送的具体方法及系统调试中的注意事项。试验表明该系统运行可靠,达到了预定要求。
[1]杨武志, 李敏勇. 基于舰船 1553B总线系统监控测试软件的设计[J].舰船电子工程, 2009, 29(1):190-192.
[2]李志刚. 1553B总线测试系统的设计与实现[D]. 西安西北工业大学, 2005.
[3]丁明亮, 魏志刚. 1553B总线远程终端仿真软件设计[J]. 计量与测试技术, 2008, 35(1): 43-47.
[4]AEC1553-PCI-SBC31RT/S2 用户手册[Z]. 北京: 北京神州飞航科技有限责任公司, 2011.
[5]Mark Nelson. 串行通信开发指南[M]. 北京: 中国水利水电出版社, 2001: 43.
[6]Microsoft 公司. MICROSOFT WIN32 程序员参考大全(一)[M]. 北京: 电子科技出版社, 1994: 90-95.
[7]李文魁, 陈永冰, 周永余等. 多任务实时系统提高实时性的方法及其在导航综合信号源系统中的应用[J]. 中国惯性技术学报, 2003, 11(4): 11-15
[8]GJB 289A-1997, 数字式时分制指令/响应型多路传输数据总线[s]. 中国军用标准, 1997.
[9]MIL-STD-1553,飞机内部时分制指令/响应式多路传输数据总线[s]. 美国军用标准, 1978.
[10]武鹏, 毕君懿. 1553B总线中曼彻斯特编码器的设计[J]. 现代电子技术, 2011, 34(4): 61-64.