何波玲,张志春,隋菱歌
(1.长春金融高等专科学校;2.空军航空大学军事仿真技术研究所)
在数据采集、设备控制、系统仿真等工程实践中,硬件设备与应用软件之间的接口问题尚未规范化,对大型工程而言,由此产生的硬件驱动程序开发和应用程序开发之间的关联依赖、相似任务的重复开发、软硬件集成时的接口处理等问题,都对工程开发效率产生影响.针对此问题,该文对硬件接口的规范化问题进行了研究,定义了一个简洁规范的硬件控制量的标识方法和访问方法,并设计实现一个符合该规范的可重用的支持分布式处理的工程化软件中间件(即硬件访问服务系统).解决了如下问题:
(1)规范的简洁性:硬件控制量的标识方法和访问方法必需简单、优雅,便于硬件驱动开发人员和应用软件开发人员使用.
(2)系统的实时性:因为大部分工程对硬件的控制都有实时性要求,因此,系统必须满足该类工程的需求.
(3)系统的通用性和可重用性:系统应具有通用性,即不依赖于具体硬件控制技术且当硬件控制量增减或值域发生变化时,无需对源码进行修改或重编译,实现软件的可重用性.
(4)支持工程的分布式处理,且配置简单灵活:分布式处理是现代工程的最重要处理方式之一,大型工程对硬件的控制常常分布式的,因此,该项目必须是分布处理和多节点部署的,而且只需进行简单的配置就可应用于不同的工程项目.
(5)支持工程的无缝集成:利用该规范,硬件驱动开发人员和应用软件开发人员可独立、并行地硬件驱动和应用软件的开发,并在工程集成阶段实现无缝对接,降低集成成本.
(6)支持主流传输协议和方式:目前,分布式处理系统节点间的通信主要采用以太网(UDP)、反射内存(RFM)网和DLL共享等三种主要数据传输方式,系统同支持这些传输协议和方式.
(7)支持对硬件检测和维护:在目标系统交付使用后,必须定期对硬件运行状态进行检测和维护,系统应该最大程度地满足硬件检测维护系统的开发要求,使硬件检测维护系统的开发简单化.
系统以动态链接库DLL[1]的形式向用户(即程序)提供硬件访问服务接口(即编程接口),通过该接口,硬件进行驱动或采样的程序可按如下标识访问每个硬件量.
面板上的每个硬件量(模拟输出量AO,模拟输入量 AI,开关输出量 DO,开关入量 DI[2-3])以二维方式进行标识.硬件量编号规则如下(见图1).
图1 硬件量标识
AO(面板编号,控制量编号 )[:范围];AI(面板编号,控制量编号 )[:范围];DO(面板编号,控制量编号)[:取值列表];DI(面板编号,控制量编号 )[:取值列表].
系统提供的服务接口简洁明了、易于使用.以下是驱动端用户和用户端用户使用进行硬件量访问的示例.
(1)驱动端使用示例
(2)用户端使用示例
系统支持驱动端和用户端的多节点配置(图2).动态连接库具有通用性,即不依赖于具体硬件控制技术且当硬件控制量增减或值域发生变化时,无需对动态链接库进行修改或重编译.对不同的应用,只需根据具体的硬件控制量和节点配置要求,准备好控制量外部定义文件(4.1)、信息港配置文件(4.2)和网络传输配置文件(4.3)即可.
UDP传输信息港[4]配置在外部配置文件Config.net中描述,其格式如下:
[0]0号信息港= <IP0,PORT0>
[1]1号信息港= <IP1,PORT1>
…
[n]n号信息港= <IPn,PORTn>
图2 系统部署图
传输配置在外部配置文件DrvConfigEx.txt(驱动端)和UsrConfigEx.txt(用户端)中描述.驱动端外部配置文件和用户端外部配置文件具有相同的格式:
硬件量外部定义配置用来描述系统中实际的硬件控制量,它和硬件标识图(见图1)中的控制量标识一一相对应,可在绘制控制量标识图时同时产生.以下给出文件的格式(其中,DO、DI的状态数缺省为2).
以下仅介绍有助于描述系统的主要数据结构.
5.1.1 AO-AI数据结构(1)一维存储区
用来存储驱动端和用户端模拟量的当前值.
在驱动端和用户端各设置独立的一维存储区,是为了解决驱动端和用户端在使用DLL共享数据传输方式下所引起的正常进程和检测、维护进程的数据传输冲突问题.
数据结构在DLL中以共享节[1]的方式存储,以支持DLL共享数据传输及控制量的多进程共享.
数据结构关系由动态连接库启动时读取外部定义文件RegAOs.txt和RegAIs.txt而建立.5.1.2 DO-DI数据结构
(1)一维存储区
unsigned char hwioDrvDO[MAXDOTOTAL],hwioDrvDI[MAXDITOTAL];
unsigned char hwioUsrDO[MAXDOTOTAL],hwioUsrDI[MAXDITOTAL];
(2)中间检索数据
short hwioIdxToDO[MAXPANEL][MAXDO],hwioIdxToDI[MAXPANEL][MAXDI];
unsigned char g_nStatusOfDO[MAXDOTOTAL],g_nStatusOfDI[MAXDITOTAL];
(3)数据结构关系
对驱动端,DO(i,j)=hwioDrvDO[hwioIdxTo-DO[i][j]];DI(i,j)=hwioDrvDI[hwioIdxToDI[i][j]];
对用户端,DO(i,j)=hwioUsrDO[hwioIdxTo-DO[i][j]];DI(i,j)=hwioUsrDI[hwioIdxToDI[i][j]];
g_nStatusOfDO[idx]:序号为idx的DO状态数;g_nStatusOfDI[idx]:序号为 idx的 DI状态数.
数据结构关系由动态连接库启动时读取外部定义文件RegDOs.txt和RegDIs.txt而建立.5.1.3 数据传输区
(1)驱动端发送及用户端接收缓冲区
(2)用户端发送及驱动端接收缓冲区
●usrtype为用户类型:NORMALUSR(普通用户)或SUPERUSR(超级用户).
●drvmode指定驱动模式:NORMAL或MAINTAIN,用来表示所传输的控制量是用于普通控制、还是维护控制.
●驱动端DLL根据Usrtype和drvmode确定自己的状态:
NORMAL= <NORMALUSR,任意 >;DETECTING= <SUPERUSR,NORMAL>;MAINTAINING= <SUPERUSR,MAINTAIN >.
●AI[i]、DI[i]、AO[i]、DO[i]为实际控制量,由外部定义文件(见4.3)确定;每个AI、AO以float传输,每个DI、DO以bit位传输;bit位全1(含float)表示无效数值,接收端据此对多数据源进行整合.
5.2.1 初始化服务接口算法
驱动端初始化服务接口hwioDrvInit()和用户端初始化服务接口hwioUsrInit(int Usrtype)的功能是读取网络配置文件到内存并进行UDP网络初始化.它们的算法极为相似,限于篇幅,下面仅给出hwioUsrInit(int Usrtype)的简略算法步骤:
5.2.3 用户端控制量更新服务接口算法
5.2.4 硬件量宏定义
定义了一种规范的硬件控制量的标识方法和访问方法,并以动态链接库DLL的形式实现了该方法.系统用动态链接库DLL提供此类应用的不变的公共部分,用外部配置文件定义与具体的应用相关的变化部分,以此实现系统的适应性.系统接口简洁,易于配置,通用性和重用性高,避免了软硬件通信协议的重复开发;系统支持以太网(UDP)、反射内存(RFM)网和DLL共享三种常用的数据传输方式,并实现了传输方式对用户的透明性;系统支持对硬件控制的在线检测和在线维护;系统规范了硬件控制量的标识和访问方法,有利于硬件驱动程序和相关应用软件的并行开发和无缝集成,可大大提高系统开发效率.
[1] [美]CharlesPetzold.Windows程序设计(第5版·英文版)[M].北京:人民邮电出版社,2009.
[2] 张志春,徐坤,李小奇,吕岩.基于多串口的单片机群控系统管理调度技术[J].北京:计算机工程与设计,2007.2,28(3):625-632.
[3] 王行仁.飞行实时仿真系统及技术[M].北京:北京航空航天出版社,2000.
[4] 张志春,何波玲,雷相波.一种通用网络通信系统的设计与实现[J].武汉:海军工程大学学报,2007.2,19(1):53-60.
[5] 顾颖彦.反射内存网实时通信技术的研究[J].上海:计算机工程,2002(07):143-144.