一种采用动态链接库进行仿真系统硬件控制隔离的方法
技术领域
本发明涉及仿真硬件控制技术领域,特别是涉及一种可应用于仿真系统的对具体硬件控制进行隔离的方法。
背景技术
在飞行模拟器仿真、电站仿真等包括人在回路的仿真系统中,会涉及到人对设备的操纵、设备对仿真结果的反映,对设备硬件的采集、驱动、通信传输一直是实现此类仿真系统的一个重要方面。此类仿真系统,必然涉及两类程序:硬件程序和仿真程序。硬件程序是实现对设备硬件进行采样、驱动的程序;仿真程序是使用硬件程序的采样值、生成硬件程序所需的设备硬件驱动值、通常完成特定仿真任务的程序。从目前公开的方法看,在设备硬件的访问、通信传输方面还没有一个规范的方法可以依据。发明《一种仿真系统硬件控制量访问传输的方法》(公开号:104267609A)公开了一个较规范的方法,该方法以访问传输系统的实现方法为核心,把通用代码和差异代码分离,使与设备硬件的访问、通信传输相关的软件产品达到了较高的可重用性。但该方法的分离工作并不彻底,硬件计算机的硬件程序仍然是通用代码和差异代码的混合体,这里通用代码包括控制量的监控、自测试等功能,差异部分则是与具体硬件技术相关的部分;二者的混合不仅使通用部分无法重用,也使得差异代码的独立开发、特别是硬件设备改造外包带来极大的不便。此外,硬件设备由于老化或长期使用损耗,通常会出现指示不准确的问题,因此需要进行维护调整,使其指示精度满足系统指标要求。通常的做法是通过修改软件来调整指示精度,这实际上并没有从根本上解决这一问题。
发明内容
本发明的目的是公开一种采用动态链接库进行仿真系统硬件控制隔离的方法;将与具体的硬件控制技术相关的硬件控制软件部分实现为动态链接库,从而实现与硬件控制通用代码的隔离,一方面使通用代码可以重用,另一个更重要的方面是使动态链接库具有非常简洁的导出接口,可以使硬件开发人员摆脱琐碎的集成协议、规约带来的负担而集中于硬件本身技术的开发,这非常有利于硬件控制的独立开发、特别是工程外包。此外,硬件设备由于老化或长期使用损耗,通常会出现指示不准确的问题,本发明也将解决这一硬件设备交付后的维护问题。
本发明所述的一种采用动态链接库进行仿真系统硬件控制隔离的方法,其技术解决方案:包括硬件设备(110),一台或多台硬件计算机(121),一台或多台仿真计算机(122);所述硬件设备(110)与硬件计算机(121)相联,所述硬件计算机(121)和仿真计算机(122)通过以太网络(180)相联;所述的硬件计算机(121)中运行硬件程序(131);所述的仿真计算机(122)中运行仿真程序(132);硬件计算机(121)和仿真计算机(122)中还包括硬件访问传输系统(14A,14B,以下称访问传输系统)、硬件配置文件(15A,15B)和传输配置文件(16A,16B);所述硬件程序(131)是直接或间接对硬件设备(110)进行采样获取采样值和/或根据驱动值对硬件设备(110)进行驱动的程序;所述仿真程序(132)是使用硬件程序(131)产生的采样值和/或产生对硬件设备(110)进行驱动的驱动值、通常完成特定仿真任务的程序;所述采样值和/或驱动值称为硬件控制量,以下也称控制量;所述硬件控制量被划分为连续输入量、连续输出量、离散输入量、离散输出量四种类别;所述连续输入量是值域属于实数、由硬件设备输入到系统的控制量;所述连续输出量是值域属于实数、由系统输出到硬件设备的控制量;所述离散输入量是值域属于有限整数、由硬件设备输入到系统的控制量;所述离散输出量是值域属于有限整数、由系统输出到硬件设备的控制量;所述连续输入量和连续输出量统称为连续量;所述离散输入量和离散输出量统称为离散量;所述连续输入量和离散输入量统称为输入量;所述连续输出量和离散输出量统称为输出量;所述控制量标识符采用二维标注法(也称二维标识符),具体形式为:ri (i, j)表示连续输入量,ro (i, j)表示连续输出量,si (i, j) 表示离散输入量,so (i, j) 表示离散输出量,其中i(大于或等于0)为面板号, j(大于或等于0)为局部于面板i上的控制量号;硬件程序(131)和仿真程序(132)通过访问传输系统(14A,14B)进行硬件控制量的访问和传输;所述硬件配置文件(15A,15B)列出控制量的二维标识符,作为所述访问传输系统(14A,14B)确定硬件控制量的依据;所述传输配置文件(16A,16B)定义硬件控制量的接收和发送路由,作为所述访问传输系统(14A,14B)确定硬件控制量接收和发送的依据;其特征在于, 所述硬件程序(131)被划分成通用的上位控制程序(171)及存储在硬盘上的精度表集合(170),以及与具体硬件控制技术相关的下位控制动态链接库(Dynamic Link Liberary)(172)(以下称下位动态库);所述上位控制程序(171)是可独立运行的可执行程序,为所述下位动态库(172)提供硬件控制所需要的微妙级定时时钟、连续输入量设置函数、连续输出量获取函数、离散输入量设置函数、离散输出量获取函数;所述下位动态库(172)导出三个接口函数:初始化接口Init,退出接口Exit,硬件控制接口Update;所述精度表文件集(170)是存储在硬盘目录LookupTables下的一系列文本文件,每个文本文件称为精度表文件,每个精度表文件包括n行文本(n大于或等于0),每行称为插值行,由一个(x_val, y_val)值对构成, 其中x_val, y_val表示为浮点数形式;一个精度表文件的所有插值行的x_val值构成x列,所有插值行的y_val值构成y列;对每个连续输入量ri(i,j),其精度表文件名为ri(i,j).tab; 对每个连续输入量ri(i,j),其精度表文件名为ri(i,j).tab; 上位控制程序(171)启动后,所有的精度表文件被读入内存,称为精度表;对连续输入量ri(i,j)的精度表, 给定一个y列的值y_val, 采用线性插值方法可获得对应x列的值, 该插值过程和/或插值结果记为interp_ri(i,j, y_val);对连续输出量ro(i,j)的精度表, 给定一个x列的值x_val, 按线性插值可获得对应y列的值, 该插值过程和/或插值结果记为interp_ro(i,j, x_val);若精度表为空(即行数为0的插值表),规定interp_ri(i,j, y_val)返回y_val, interp_ro(i,j, x_val)返回x_val;
所述上位控制程序(171)和所述下位动态库(172)协作完成对硬件控制量的采用和驱动,具体协作控制过程如下:
步骤1,上位控制程序(171)加载访问传输系统(14A);访问传输系统(14A)执行如下操作:
步骤1.1, 对硬件配置文件(15A,15B)进行语法、语义分析,在内存创建完全反映其信息的数据结构及其它派生数据结构;
步骤1.2,对传输配置文件(16A,16B)进行语法、语义分析,在内存创建完全反映其信息的的数据结构;
步骤1.3,访问传输系统(14A,14B)在一个独立线程下循环执行自动更新模块(205),完成上位控制程序(171)传输数据(17A,17B)的网络收发操作,并为上位控制程序(171)提供访问硬件控制量的访问接口(211);
步骤2,上位控制程序(171)执行加载精度表文件集(170)操作,把硬盘上所有精度表文件的内容读入到内存;
步骤3,上位控制程序(171)加载下位动态库(172),然后查找下位动态库(172)导出的三个接口函数:初始化接口Init,退出接口Exit,硬件控制接口Update;
步骤4,上位控制程序(171)调用下位动态库(172)的初始化接口Init,完成对硬件的初始化操作;初始化操作依据硬件控制的具体技术确定;
步骤5,如果上位控制程序(171)结束运行,则上位控制程序(171)调用下位动态库(172)退出接口Exit,完成对硬件控制相关的退出操作;退出操作依据硬件控制的具体技术确定;否则执行步骤6至步骤7;
步骤6,上位控制程序(171)调用下位动态库(172)的硬件控制接口Update,传输给Update五个参数:
参数一:ticks,所述微妙级定时时钟的当前时钟值, 单位微妙;
参数二:get_ro,指向所述连续输出量获取函数的指针;
参数三:get_so,指向所述离散输出量获取函数的指针;
参数四:set_ri,指向所述连续输入量设置函数的指针:
参数五:set_ si,指向所述离散输入量设置函数的指针;
步骤7,下位动态库(172)执行Update操作,具体操作包括:
步骤7.1,根据参数ticks获取当前时钟值(单位微妙),用于硬件控制定时;
步骤7.2a, 调用get_ro(i,j)获取返回值y;
步骤7.2b,根据y值对连续输出量ro(i,j)进行驱动; 具体驱动方法依据硬件控制的具体技术确定;
步骤7.3a, 调用get_so(i,j)获取返回值y;
步骤7.3b,根据y值对离散输出量so(i,j)进行驱动; 具体驱动方法依据硬件控制的具体技术确定;
步骤7.4a,对连续输入量ri(i,j)进行采样,取得采样值y_val; 具体采样方法依据硬件控制的具体技术确定;
步骤7.4b, 调用set_ri(i,j,y_val)设置对应的硬件控制量;
步骤7.5a,对离散输入量si(i,j)进行采样,取得采样值y_val; 具体采样方法依据硬件控制的具体技术确定;
步骤7.5b, 调用set_si(i,j,y_val)设置对应的硬件控制量。
所述上位控制程序(171)提供硬件控制量监控功能,具体实现方法如下:
步骤1,调用访问接口(211)获取连续输出量ro(i,j)的值x,在用户界面上显示x;
步骤2,调用访问接口(211)获取离散输出量so(i,j)的值x,在用户界面上显示x;
步骤3,调用访问接口(211)获取连续输入量ri(i,j)的值x,在用户界面上显示x;
步骤4,调用访问接口(211)获取离散输入量si(i,j)的值x,在用户界面上显示x。
所述上位控制程序(171)提供硬件自测试功能,具体实现方法如下:
步骤1,在用户界面上输入x,调用访问接口(211)置连续输出量ro(i,j)的值为x,实现对连续输出量ro(i,j)的测试;
步骤2,在用户界面上输入x,调用访问接口(211)置离散输出量so(i,j)的值为x,实现对离散输出量so(i,j)的测试;
步骤3,调用访问接口(211)获取连续输入量ri(i,j)的值x,在用户界面上显示x,实现对连续输入量ri(i,j)的测试;
步骤4, 上位控制程序(171)调用访问接口(211)获取离散输入量si(i,j)的值x,在用户界面上显示x,实现对离散输入量si(i,j)的测试。
所述上位控制程序(171)提供精度表文件构造功能,具体实现方法如下:
构造精度表文件ro(i,j).tab:
步骤1,清空连续输出量ro(i,j)的精度表;
步骤2, 置当前行n为0;
步骤3, 构造当前行n:
步骤3.1,在用户界面上输入x列的值x_val;
步骤3.2,在用户界面上调整y列的值到y_val,驱动连续输出量ro(i,j)指向指示值x_val;
步骤3.3,点击行确认按钮,n值增加1,将(x_val, y_val)值对作为第n行插值行存入内存;
步骤4,若插值表所有行构造完毕,则点击保存插值表按钮,把内存中的所有插值行(总共n行)存入精度表文件ro(i,j).tab,结束精度表文件构造;否则转步骤3。
构造精度表文件ri(i,j).tab:
步骤1,清空连续输入量ri(i,j)的精度表;
步骤2, 置精度表文件的当前行n为0;
步骤3, 构造当前行n:
步骤3.1,在用户界面上输入x列的值x_val;
步骤3.2,操作连续输入量ri(i,j)到与x列的值x_val对应的位置;
步骤3.3,调用访问接口(211)获取连续输入量ri(i,j)的值作为y列的值y_val;
步骤3.4,点击行确认按钮,n值增加1,将(x_val, y_val)值对作为第n行插值行存入内存;
步骤4,若插值表所有行构造完毕,则点击保存插值表按钮,把内存中的所有插值表(总共n行)存入精度表文件ri(i,j).tab,结束精度表文件构造;否则转步骤3。
本发明的积极效果在于:一、本发明将硬件控制软件的通用代码与差异代码相分离,通用代码实现为上位控制程序(171),差异代码实现为下位动态库(172),上位控制程序(171)可以不加修改地重用于不同的硬件控制系统,避免了硬件控制监控、测试、通信等方面的软件重复开发;下位动态库(172)实现与具体硬件控制技术相关的操作,需要针对不同的硬件控制系统进行有针对性的开发,将其封装为动态库,使上位控制程序(171)及下位动态库(172)成为高内聚、低耦合的代码。 二、下位动态库(172)只需要实现三个简单的导出接口函数(Init,Exit,Update),而且上位控制程序(171)对这三个导出接口函数的实现约束条件都是显而易见的、简洁明确的、极度宽松的;此外,上位控制程序(171)还为下位动态库(172)提供了微妙级高精度定时时钟,并通过Update传输给下位动态库(172),足以满足几乎所有仿真系统硬件控制对时钟的要求。这些,使下位动态库(172)的开发只涉及硬件控制技术自身,硬件开发人员极易接受,这非常有利于硬件控制的独立开发、特别是工程外包。三、硬件设备由于老化或长期使用损耗,通常会出现指示不准确的问题,因此需要进行维护调整,使其指示精度满足系统指标要求。通常的做法是通过修改软件来调整指示精度,这实际上并没有从根本上解决这一问题。本发明通过引入精度表集合(170)技术,使得可以通过修改精度表文件而不是修改软件来达到调整指示精度的目标,而且上位控制程序(171)提供了精度表文件构造或修改的软件工具,很好地解决了设备交付后指示精度的工程维护问题。四、上位控制程序(171)提供了硬件控制量监控工具及自测试工具,有助于硬件开发期间的调试及设备交付后的工程维护。
附图说明
图1是本发明的系统示意图;
图2是访问传输系统的示意图;
图3是根据硬件配置文件(15)形成的内存主要数据结构图;
图4是根据传输配置文件(16)形成的内存主要数据结构图;
图5是初始化模块(201)的程序流程图;
图6是自动更新模块(205)的程序流程图;
图7是接收更新模块(207)的程序流程图;
图8是发送更新模块(306)的程序流程图。
具体实施方式
下面结合附图和实施方式对本发明作进一步说明。
实施例1
本发明一种采用动态链接库进行仿真系统硬件控制隔离的方法,如图1所示,包括硬件设备(110),一台或多台硬件计算机(121),一台或多台仿真计算机(122);硬件计算机(121)和仿真计算机(122)统称为主机;所述硬件设备(110)与硬件计算机(121)相联,所述硬件计算机(121)和仿真计算机(122)通过以太网络(180)相联;所述的硬件计算机(121)中运行硬件程序(131);所述的仿真计算机(122)中运行仿真程序(132);所述硬件程序(131)是直接或间接对硬件设备(110)进行采样获取采样值和/或根据驱动值对硬件设备(110)进行驱动的程序;所述仿真程序(132)是使用硬件程序(131)产生的采样值和/或产生对硬件设备(110)进行驱动的驱动值、通常完成特定仿真任务的程序;所述采样值和/或根据驱动值称为硬件控制量,以下也称控制量;所述硬件控制量被划分为连续输入量、连续输出量、离散输入量、离散输出量四种类别;所述连续输入量是值域属于实数、由硬件设备输入到系统的控制量;所述连续输出量是值域属于实数、由系统输出到硬件设备的控制量;所述离散输入量是值域属于有限整数、由硬件设备输入到系统的控制量;所述离散输出量是值域属于有限整数、由系统输出到硬件设备的控制量;所述连续输入量和连续输出量统称为连续量;所述离散输入量和离散输出量统称为离散量;所述连续输入量和离散输入量统称为输入量;所述连续输出量和离散输出量统称为输出量;
硬件计算机(121)和仿真计算机(122)中还包括硬件访问传输系统(14A,14B,以下称访问传输系统)、硬件配置文件(15A,15B)和传输配置文件(16A,16B);
硬件程序(131)和仿真程序(132)通过访问传输系统(14A,14B)进行硬件控制量的访问和传输;硬件程序(131)和仿真程序(132)称为访问传输系统(14A,14B)的客户程序;所述访问是指设置硬件控制量的值、获取硬件控制量的值,还可包括获取硬件控制量的数量;所述传输是指将硬件控制量的值从一个客户程序传输到另一个客户程序;
所述硬件配置文件(15A,15B)用于定义硬件控制量标识符,还可包括值域范围;所述控制量标识符用于唯一地确定控制量,必须为仿真系统内的每个控制量都定义一个标识符;
在本发明的一个最佳实施例中,所述控制量标识符(也称二维标识符)采用二维标注法,具体形式如下:
ri (面板号, 面板局部控制量号):连续输入量;
ro (面板号, 面板局部控制量号):连续输出量;
si (面板号, 面板局部控制量号):离散输入量;
so (面板号, 面板局部控制量号):离散输出量;
在二维标注法的编程接口实现上,可以采用紧缩二维索引(412,422,432,442)来提高二维标注法的存储效率和访问时间效率。
在本发明的一个较佳实施例中,所述硬件配置文件(15A,15B)的语法如下:
m_seq
k_seq
m_seq: m| m m_seq
k_seq: k| k k_seq
m:<ri (i, j):real_type>|<ri(i, j)> |
<ro (i, j):real_type>|<ro(i, j)>
k:<si (i, j):max_state>|<si(i, j)>|
<so (i, j):max_state>|<so(i, j)>
i:非负整数
j:非负整数
real_type:double|float
max_state:非负整数
所述传输配置文件(16A,16B)用于定义硬件控制量的接收配置、发送配置及其它与传输相关的信息;所述发送配置用于定义发送路由;所述接收配置、发送配置使用IP地址、端口或其它可确定IP地址、端口的数据表达进行定义;
在本发明的一个较佳实施例中,所述传输配置文件(16A,16B)的语法如下:
<update:period>
<recv>r_seq</recv>
<send:ri >s_seq</send:ri >
<send:si >s_seq</send:si >
<send:ro >s_seq</send:ro >
<send:so >s_seq</send:so >
<send:ri,si>s_seq</send:ri,si>
<send:ro,so>s_seq</send:ro,so>
period:-1|ms
ms: 非0整数
r_seq: r| r r_seq
s_seq: s| s s_seq
r:< local_ip,local_port>
s:< local_ip,local_port><remote_ip,remote_port>
local_ip: ip
remote _ip: ip
local_port: port
remote _port: port
ip:0.0.0.0至255.255.255.255
port:0至65536
每个客户程序(131,132)对应一个访问传输系统(14A,14B)、一个硬件配置文件(15A,15B)、一个传输配置文件(16A,16B);所有客户程序(131,132)的访问传输系统(14A,14B)是完全相同的;所有客户程序(131,132)的硬件配置文件(15A,15B)的语法格式和有效内容是完全一致的;所有客户程序(131,132)的传输配置文件(16A,16B)的语法格式是完全一致的,有效内容通常是不一致的;
每台主机运行一个或多个客户程序;
如图2所示,所述访问传输系统(14)以外部配置文件(15,16)为输入,包括初始化模块(201)、硬件配置解析模块(202)、传输配置解析模块(203)、控制量存储区创建模块(204)、自动更新模块(205)、发送更新模块(206)、接收更新模块(207)、数据包生成模块(208)、数据包解析模块(209)、控制量访问模块(210);
所述访问传输系统(14)还包括进行访问接口(211)、初始化接口(210)、传输接口(212)和获取控制量个数的枚举接口(213);
在本发明的一个最佳实施例中,C++语言形式的接口实现为:
(1)初始化接口(210): 由初始化模块(201)实现
a)void rsio_init();
(2)枚举接口(213):由控制量访问模块(210)实现
a)int ri_cnt ();返回连续输入量数量;
b)int ro_cnt ();返回连续输出量数量;
c)int si_cnt ();返回离散输入量数量;
d)int so_cnt ();返回离散输出量数量;
e)int k_ri (int i,int j);返回连续输入量ri(i,j)的全局控制量号,即ri _idx(412)[i][j] (见图2);
其中,i为面板号,j为面板局部硬件控制量号,以下i,j的含义同;
f)int k_ro (int i,int j);返回连续输出量ro(i,j)的全局控制量号,即ro _idx(432)[i][j] (见图2);
g)int k_si (int i,int j);返回离散输入量si(i,j)的全局控制量号,即si _idx(422)[i][j] (见图2);
h)int k_so (int i,int j);返回离散输出量so(i,j)的全局控制量号,即so _idx(442)[i][j] (见图2);
(3)访问接口(211):由控制量访问模块(210)实现
a)double& ri(int k);返回第k个连续输入量的引用;
其中,k为全局控制量号,全局控制量号为按照控制量标识符面板号优先、面板号和面板局部控制量号从小到到大的顺序依次排列为从0开始的连续递增的整数,以下k的含义同;
全局控制量号主要是支持硬件控制量循环遍历,通常用于控制量初始化赋值;在源程序中利用循环语句对控制量进行遍历设置初始化值0的C++语句示例为:
int n=ri_cnt(); //取连续输入控制量总数
while(n--) ri(n)=0;//每个连续输入控制量置0
b)double& ro(int k);返回访问第k个连续输出量的引用;
c)unsigned char& si(int k); 返回访问第k个离散输入量的引用;
d)unsigned char& so(int k); 返回访问第k个离散输出量的引用;
e)double& ri(int i, int j); 返回ri(k_ri(i,j));
f)double& ro(int i, int j); 返回ro(k_ro(i,j));
g)unsigned char& si(int i, int j);返回si(k_si(i,j));
h)unsigned char& so(int i, int j); 返回so(k_so(i,j));
(4)传输接口(212)
a)void s_update();由发送更新模块(206)实现为硬件控制量发送操作;
b)void r_update();由接收更新模块(207)实现为硬件控制量接收操作。
根据本发明的一个最佳实施例,访问传输系统(14)的访问接口(211)在源程序中可用做左值。
根据本发明的一个最佳实施例,所述离散量的状态由基于0的连续整数表示,并可通过访问传输系统(14)的访问接口(211)取得这些值;
比如,一个开关si(1,2)有三档,则依次表示为:
一档0,二档1,三档2。当开关si(1,2)处于二档时,在源程序中有语句:
x= si(1,2);
则x的值为2。显然,这种方法比使用bit位表示开关档位更方便易用。
所述初始化模块(201)执行如下步骤:
S601,调用硬件配置解析模块(202)解析硬件配置文件(15)以创建控制量配置内存映射(400);
S602,调用传输配置解析模块(203)解析传输配置文件(16)以创建传输配置内存映射(500);
S603,调用控制量存储区创建模块(204)创建控制量存储区(411,421,431,441);
S604,若发送周期(580)>0,则为自动更新,发送周期(580)为自动更新周期,此时,创建线程,该线程循环调用自动更新模块(205)以实现数据传输自动更新。
所述控制量存储区创建模块(204)执行如下步骤:
S1,根据连续输入量数量(410,430,420,440)及其值域范围(413、433、423、443)申请控制量存储区(411,431,421,441);
S2,置控制量存储区(411,431,421,441)无效;
所述自动更新模块(205)的执行如下步骤:
S701,调用接收更新模块(207)接收控制量;
S702,S703,每隔发送周期(580),调用一次发送更新模块(206)发送控制量。
所述发送更新模块(206)的执行如下步骤:
S901,调用数据包生成模块(208)将控制量存储区(411,421,431, 441)压缩至连续压缩区buf的对应区段buf1,buf2,buf3, buf4;
S902,对发送配置(520), 发送区段buf1;对发送配置(530), 发送区段buf2;对发送配置(540), 发送区段buf1, buf2;对发送配置(550), 发送区段buf3;对发送配置(560), 发送区段buf4;对发送配置(570), 发送区段buf3, buf4;
所述接收更新模块(207)的执行如下步骤:
S801,对接收配置(510)的每一个配置项执行S802,S803, S804;
S802),接收传输数据包(17B,17D);
S803,S804,若接收成功,则调用数据包解析模块(209)将传输数据包(17B,17D)解析至控制量存储区(411,421,431,441)。
所述传输数据包(17A,17B,17C,17D)由连续的数据块构成,以字节0xff标志所有数据块结束;数据块的类型和格式如下:
(1)连续量数据块
1个字节:块类型, 解释为unsigned char,
取值为1,连续输入量数据块,取值为2,连续输出量数据块;
N个字节:连续存储如下数据片段:
2个字节: 本数据片段第一个有效控制量序号idx1,解释为short,当idx1≥0时有效,当idx1<0时表示数据块结束;
2个字节: 本数据片段最后一个有效控制量序号idx2 (≥idx1), 解释为short;
M个字节: 连续存储序号从idx1至idx2的控制量,每个控制量的类型根据硬件配置文件(301)中定义的类型确定为doule或float;
(2)离散量数据块
1个字节:块类型, 解释为unsigned char,
取值为3, 离散输入量数据块,
取值为4, 离散输出量数据块;
N个字节:全部离散量,每个控制量的bit位连续存储,所需位数根据硬件配置文件(15A,15B)中定义的状态数确定,控制量的bit位全1表示无效控制量。
所述数据包生成模块(208)按照上述传输数据包(17A,17B,17C,17D)格式的定义,对连续量,只将控制量存储区(421,441)中的有效控制量存入传输数据包(17A,17B,17C,17D),控制量的大小由值域范围(413, 433)确定;对离散量,将控制量存储区(421,441)中的所有控制量压缩至传输数据包,依据值域范围(413, 433)按连续bit位存储。
所述数据包解析模块(209)上述传输数据包(17A,17B,17C,17D)格式的定义,对传输数据包(17A,17B,17C,17D)进行解析,丢弃无效的控制量,以有效控制量对控制量存储区(411,421,431, 441)进行更新。
访问传输系统(14)具有通用性,可不做任何修改地应用于任何仿真系统,通过配置新的硬件配置文件(15)、传输配置文件(16)就可完成新的仿真系统的控制量的访问和传输。
访问传输系统(14)可实现为静态库、动态库或组件;
所述硬件程序(131)被划分成通用的上位控制程序(171)及存储在硬盘上的精度表集合(170),以及与具体硬件控制技术相关的动态链接库(Dynamic Link Liberary)(172)(以下称下位动态库);
所述上位控制程序(171)是可独立运行的可执行程序,为所述下位动态库(172)提供硬件控制所需要的微妙级定时时钟、连续输出量获取函数、离散输出量获取函数、连续输入量设置函数、离散输入量设置函数;
所述精度表文件集(170)是存储在硬盘目录LookupTables下的一系列文本文件,每个文本文件称为精度表文件,每个精度表文件包括n行文本(n大于或等于0),每行称为插值行,由一个(x_val, y_val)值对构成, 其中x_val, y_val表示为浮点数形式;一个精度表文件的所有插值行的x_val值构成x列,所有插值行的y_val值构成y列;对每个连续输入量ri(i,j),其精度表文件名为ri(i,j).tab; 对每个连续输入量ri(i,j),其精度表文件名为ri(i,j).tab;
上位控制程序(171)启动后,所有的精度表文件被读入内存,每个精度表文件的行在内存中连续存放,该内存称为精度表,该内存的首地址称为精度表地址;
所有连续输入量的精度表地址在以tables_ri地址开始的内存中连续存放,对应精度表文件名为ri(i,j).tab的精度表地址为tables_ri[k_ri(i,j)];
对连续输入量ri(i,j)的精度表, 给定一个y列的值y_val, 采用线性插值方法可获得对应x列的值, 该插值过程和/或插值结果记为interp_ri(i,j, y_val);
interp_ri(i,j, y_val)的插值过程是:
步骤1,调用访问传输系统(14A)的枚举接口(213)获得k值:
k= k_ri(i,j);
步骤2,获取精度表地址为tables_ri[k]的精度表table;
步骤3,若精度表table为空,返回y_val, 插值过程结束;
步骤4, y_val小于或等于精度表table首行y列的值,返回首行x列的值, 插值过程结束;
步骤5, y_val大于或等于精度表table尾行y列的值,返回尾行x列的值, 插值过程结束;
步骤6, 查找精度表table的行L, 使y_val的大于或等于L行y列的值且小于或等于(L+1)行y列的值,返回按如下格式计算的值, 插值过程结束:
返回值= L行x列的值 +((L+1)行x列的值- L行x列的值) * (y_val -L行y列的值)/ ((L+1)行y列的值- L行y列的值) ;
所有连续输出量的精度表地址在以tables_ro地址开始的内存中连续存放,对应精度表文件名为ro(i,j).tab的精度表地址为tables_ro[k_ro(i,j)];
对连续输出量ro(i,j)的精度表, 给定一个x列的值x_val, 采用线性插值方法可获得对应y列的值, 该插值过程和/或插值结果记为interp_ro(i,j, x_val);
interp_ro(i,j, x_val)的插值过程是:
步骤1,调用访问传输系统(14A)的枚举接口(213)获得k值:
k= k_ro(i,j);
步骤2,获取精度表地址为tables_ro[k]的精度表table;
步骤3,若精度表table为空,返回x_val, 插值过程结束;
步骤4, x_val小于或等于精度表table首行x列的值,返回首行y列的值, 插值过程结束;
步骤5, x_val大于或等于精度表table尾行x列的值,返回尾行y列的值, 插值过程结束;
步骤6, 查找精度表table的行L, 使x_val的大于或等于L行x列的值且小于或等于(L+1)行x列的值,返回按如下格式计算的值, 插值过程结束:
返回值= L行y列的值 + ((L+1)行y列的值- L行y列的值) * (x_val -L行x列的值)/ ((L+1)行x列的值- L行x列的值) ;
所述微妙级定时时钟采用Windows编程接口QueryPerformanceCounter和QueryPerformanceFrequency实现;
所述连续输出量获取函数定义为:
double upper_ro(int i, int j);
其执行过程是,调用访问接口(211)获取连续输出量ro(i,j)的值x_val, 在连续输出量ro(i,j)的精度表上执行线性插值操作interp_ro(i,j,x_val),返回插值结果;
所述离散输出量获取函数定义为:
unsigned char upper_so(int i, int j);
其执行过程是,调用访问接口(211)获取离散输出量so(i,j)的值即为y;
所述连续输入量设置函数定义为:
void upper_ri(int i, int j,double value);
其执行过程是, 在连续输入量ri(i,j)的精度表上执行线性插值操作interp_ri(i,j,y_val)得到插值结果x;调用访问接口(211)设置连续输入量ri(i,j)的值为x;
所述离散输入量设置函数定义为:
void upper_si(int i, int j,unsigned char value);
其执行过程是,调用访问接口(211)设置离散输入量si(i,j)的值为y_val;
所述下位动态库(172)导出三个接口函数:初始化接口Init,退出接口Exit,硬件控制接口Update;
所述上位控制程序(171)和所述下位动态库(172)协作完成对硬件控制量的采用和驱动,具体协作控制过程如下:
步骤1,上位控制程序(171)加载访问传输系统(14A);访问传输系统(14A)执行如下操作:
步骤1.1, 对硬件配置文件(15A,15B)进行语法、语义分析,在内存创建完全反映其信息的数据结构及其它派生数据结构;
步骤1.2,对传输配置文件(16A,16B)进行语法、语义分析,在内存创建完全反映其信息的的数据结构;
步骤1.3,访问传输系统(14A,14B)在一个独立线程下循环执行自动更新模块(205),完成上位控制程序(171)传输数据(17A,17B)的网络收发操作,并为上位控制程序(171)提供访问硬件控制量的访问接口(211);
步骤2,上位控制程序(171)执行加载精度表文件集(170)操作,把硬盘上所有精度表文件的内容读入到内存;
步骤3,上位控制程序(171)加载下位动态库(172),然后查找下位动态库(172)导出的三个接口函数:初始化接口Init,退出接口Exit,硬件控制接口Update;
步骤4,上位控制程序(171)调用下位动态库(172)的初始化接口Init,完成对硬件的初始化操作;Init执行的初始化操作依据硬件控制的具体技术确定;
步骤5,如果上位控制程序(171)结束运行,则上位控制程序(171)调用下位动态库(172)退出接口Exit,完成对硬件控制相关的退出操作;Exit执行的退出操作依据硬件控制的具体技术确定;否则执行步骤6至步骤7;
步骤6,上位控制程序(171)调用下位动态库(172)的硬件控制接口Update,传输给Update五个参数:
参数一:ticks,所述微妙级定时时钟的当前时钟值, 单位微妙;
参数二:get_ro,指向所述连续输出量获取函数的指针;
参数三:get_so,指向所述离散输出量获取函数的指针;
参数四:set_ri,指向所述连续输入量设置函数的指针:
参数五:set_ si,指向所述离散输入量设置函数的指针;
步骤7,下位动态库(172)执行Update操作,具体操作包括:
步骤7.1,根据参数ticks获取当前时钟值(单位微妙),用于硬件控制定时;
步骤7.2a, 调用get_ro(i,j)获取返回值y;
步骤7.2b,根据y值对连续输出量ro(i,j)进行驱动; 具体驱动方法依据硬件控制的具体技术确定;
步骤7.3a, 调用get_so(i,j)获取返回值y;
步骤7.3b,根据y值对离散输出量so(i,j)进行驱动; 具体驱动方法依据硬件控制的具体技术确定;
步骤7.4a,对连续输入量ri(i,j)进行采样,取得采样值y_val; 具体采样方法依据硬件控制的具体技术确定;
步骤7.4b, 调用set_ri(i,j,y_val);
步骤7.5a,对离散输入量si(i,j)进行采样,取得采样值y_val; 具体采样方法依据硬件控制的具体技术确定;
步骤7.5b, 调用set_si(i,j,y_val);
仿真程序(132)对硬件控制量的访问和传输过程如下:
步骤1,访问传输系统(14B)执行接收操作,所述接收操作即调用接收更新模块(207);
步骤2,仿真程序(132)通过访问接口(211)取得采样值;访问接口(211)的调用形式为:
采样值=ri(i,j);采样值=si(i,j);
步骤3,仿真程序(132)完成仿真任务,产生输出量的驱动值,通过访问接口(211)把驱动值传输给访问传输系统(14B);访问接口(211)的调用形式为:
ro(i,j)=驱动值;so(i,j)=驱动值;
步骤4,访问传输系统(14B)执行发送操作,所述发送操作即调用发送更新模块(206);
所述上位控制程序(171)提供硬件控制量监控功能,具体实现方法如下:
步骤1,调用访问接口(211)获取连续输出量ro(i,j)的值x,在用户界面上显示x;
步骤2,调用访问接口(211)获取离散输出量so(i,j)的值x,在用户界面上显示x;
步骤3,调用访问接口(211)获取连续输入量ri(i,j)的值x,在用户界面上显示x;
步骤4,调用访问接口(211)获取离散输入量si(i,j)的值x,在用户界面上显示x。
所述上位控制程序(171)提供硬件自测试功能,具体实现方法如下:
步骤1,在用户界面上输入x,调用访问接口(211)置连续输出量ro(i,j)的值为x,实现对连续输出量ro(i,j)的测试;
步骤2,在用户界面上输入x,调用访问接口(211)置离散输出量so(i,j)的值为x,实现对离散输出量so(i,j)的测试;
步骤3,调用访问接口(211)获取连续输入量ri(i,j)的值x,在用户界面上显示x,实现对连续输入量ri(i,j)的测试;
步骤4, 上位控制程序(171)调用访问接口(211)获取离散输入量si(i,j)的值x,在用户界面上显示x,实现对离散输入量si(i,j)的测试。
所述上位控制程序(171)提供精度表文件构造功能,具体实现方法如下:
构造精度表文件ro(i,j).tab:
步骤1,清空连续输出量ro(i,j)的精度表;
步骤2, 置当前行n为0;
步骤3, 构造当前行n:
步骤3.1,在用户界面上输入x列的值x_val;
步骤3.2,在用户界面上调整y列的值到y_val,驱动连续输出量ro(i,j)指向指示值x_val;
步骤3.3,点击行确认按钮,n值增加1,将(x_val, y_val)值对作为第n行插值行存入内存;
步骤4,若插值表所有行构造完毕,则点击保存插值表按钮,把内存中的所有插值行(总共n行)存入精度表文件ro(i,j).tab,结束精度表文件构造;否则转步骤3。
构造精度表文件ri(i,j).tab:
步骤1,清空连续输入量ri(i,j)的精度表;
步骤2, 置精度表文件的当前行n为0;
步骤3, 构造当前行n:
步骤3.1,在用户界面上输入x列的值x_val;
步骤3.2,操作连续输入量ri(i,j)到与x列的值x_val对应的位置;
步骤3.3,调用访问接口(211)获取连续输入量ri(i,j)的值作为y列的值y_val;
步骤3.4,点击行确认按钮,n值增加1,将(x_val, y_val)值对作为第n行插值行存入内存;
步骤4,若插值表所有行构造完毕,则点击保存插值表按钮,把内存中的所有插值表(总共n行)存入精度表文件ri(i,j).tab,结束精度表文件构造;否则转步骤3。