1 前 言
近年来,试验机软件联网的需求在不断地增加。为了确保监督及检测工作的公正性、科学性和权威性,按照建设部“九五”规划中关于“基本实现一、二级试验室和法定检测机构的计算机联网,做到数据采集自动化”的要求,一些检测部门、建工部门根据国家或本地区的政策要求,在原有单台试验机软件的基础上升级建设网络化计算机管理信息系统,完善计算机系统的管理辅助功能,基本实现检测数据的自动采集、检测试验和质量安全监督工作的计算机化、网络化管理的目标。这种网络化计算机信息管理系统,一般是由专业的第三方软件公司在试验机厂家单机版试验软件的基础上研发完成的,而一般试验机厂家很难有精力再投入大量人员去研发网络化计算机信息管理系统。目前,与我公司试验机软件联网最多的是广州粤建三和软件有限公司。
试验机软件联网的方式,主要有以下两种“无缝连接”方式:数据库方式和动态链接库方式。大多数公司采用的是数据库方式,这种联网方式需要第三方软件公司与试验机厂家软件人员进行配合、协商,按照约定进行数据的传输。只要约定内容有一方发生了改动,另一方也必须对软件进行相应的更改,对双方来说都存在很大的约束性,既费时又费力,而且造成程序的不兼容,一个用户一个不同的软件版本,不利于软件的维护、升级。而动态链接库方式,就解决了上述问题。在保证试验机控制系统安全性的前提下,将数据采集、处理、标定参数等内容封装在带窗体的动态链接库中,仅提供基本函数的调用就可获取当前的试验力、变形、位移等值。
2 两种联网方式的对比
数据库方式的联网如图1所示。第三方软件公司开发的网络化计算机信息管理系统与试验机软件的联网通过中间数据库接口来完成,这个中间数据库接口的内容是双方约定好的,试验机采集软件将试验结束后的结果数据存入数据库接口后,计算机信息管理系统再去接口库中取需要的数据;必要时,计算机信息管理系统也会存入某些信息到数据库接口中,为试验机软件提供某些指令信息,便于完成其它任务。
从图1中不难看出,用户需求发生改变时,中间数据库接口就有可能发生改变,只要该接口的约定发生了变化,试验机厂家和第三方软件公司就得修改软件,再次进行调试,其工作量是很大的。三和软件公司为北京市某些单位的联网过程,也充分说明了这一点。

另外,数据库接口约定的通用性较差,容易造成一个用户一套软件,为软件的维护和升级带来一定的麻烦和困难。
动态链接库方式的联网如图2所示。试验机厂家将数据采集、处理、标定参数等信息封装在带窗体的动态链接库中,将该动态链接库提供给第三方软件公司,由第三方软件公司开发基于控制器的采集软件和信息管理系统。这样,联网工作完全交给第三方软件公司去做,去掉了繁琐的约定,增加了管理系统的灵活性,便于调试、维护和升级。目前这种联网方式已经在“上海建设工程检测行业协会”中实行,在上海某些单位取得了不错的效果。

另外,通过“窗体封装”技术保证了试验机控制系统的安全性。一些试验机厂家虽然也采用了动态链接库技术,但并不是对窗体进行封装,很难保证控制系统的安全性。
通过以上两种联网方式的对比以及目前在用户处实施的效果来看,封装窗体的动态链接库方式应该是更佳的联网方式。
3 封装窗体的动态链接库的实现
既然“无缝连接”中的数据连接方式存在前述弊端,而动态链接库方式能解决上述问题,下面就详细介绍一下后者。
C++Builder开发的动态链接库能被大多数开发语言(如:VC++、Delphi等)直接调用。本文所讲述的动态链接库就是由C++Builder 6.0开发的。
启动C++Builder 6.0,新建一个DLL工程,并保存好工程文件TestDll.bpr,生成一个DLL的程序框架。
在工程中新建一个窗体,名称为PACkedForm。在C++Builder菜单“View/Project Manager”中将DLL中的资源文件.res和.cpp文件Remove掉。
在工程中新建一个Header File文件,保存名称为TestDll.h。这是一个声明了函数原型的头文件。
最后设置菜单“Project/Options…”中选项:Packages标签和Linker标签。至此,一个最基本的封装窗体的动态链接库工程便完成了[1]。
运行菜单“Project/Builder TestDll”即可生成TestDll.dll和TestDll.lib文件,而TestDll.dll文件正是第三方软件公司所必需的动态链接库文件。
封装窗体的动态链接库工程建立好以后,将与企业控制器密切相关的代码封装到窗体中,这样既能保证控制系统的安全性,又能与第三方软件公司合作完成用户需要的联网功能。
函数原型的头文件TestDll.h需要被包含到联网软件所要应用的cpp文件中。主要部分代码如下:
#ifdef __cplusplus
extern "C" {
#endif
//获取试验力值
extern "C" __declspec(dllexport) float _std-
call GetForce();
//获取位移值
extern "C" __declspec(dllexport) float _std-call GetDisplacement();
//获取变形值
extern "C" __declspec(dllexport) float _std-call GetDeformation();
//其它函数(略)
//…………………………………………………
#ifdef __cplusplus
}
#endif
内部函数的声明、调用及其它参数的定义、试验机软件参数文件的读取等均在被封装窗体中实现。部分代码如下:
//获取试验力值
extern "C" __declspec(dllexport) float _std-call GetForce()
{
//……
}
//-------------------
//获取位移值
extern "C" __declspec(dllexport) float _std-call GetDisplacement()
{
//……
}-------------------
//
//获取变形值
extern "C" __declspec(dllexport) float _std-call GetDeformation()
{
//……
}
//-------------------
//其它函数(略)
//…………………………………………………
//-------------------
4 封装窗体的动态链接库的调用
前述内容已经实现了封装窗体的动态链接库的创建,下面介绍如何调用该动态链接库(以C++Builder 6.0为例)。
将试验机软件标定参数文件、TestDll. lib、TestDll.dll、TestDll.h等相关文件拷贝到软件所在目录下;选择菜单“Project/Add to Project…”,将TestDll.lib添加到工程中;将TestDll.h包含到所要应用的cpp文件中。软件发布时将TestDll.dll与应用程序等一起发布即可。
主要部分代码如下:
//-------------------
//采集数据
void __fastcall TForm1::Timer1Timer(TOb-ject *Sender)
{
RealLoad = GetForce();
RealDefor = GetDeformation();
RealStroke = GetDisplacement()
}
//-------------------
//实时显示试验力、变形、位移值
void __fastcall TForm1::Timer2Timer(TOb-ject *Sender)
{
Panel_Force->Caption = FloatToStrF(Re-alLoad,ffFixed,7,2);
Panel _ Deformation - > Caption = Float-ToStrF(RealDefor,ffFixed,7,3);
Panel_ Displacement - > Caption = Float-ToStrF(RealStroke,ffFixed,7,3);
}
//-------------------
//其它代码(略)
//…………………………………………………
//-------------------
5 结束语
根据目前网络化计算机信息管理系统的发展趋势及试验机软件数据库方式联网存在的问题,笔者建议使用带封装窗体的动态链接库方式作为“无缝连接”的最佳方案。采用该方案,试验机厂家只需提供相应的动态链接库文件、相应的包含函数原型的头文件等必须的几个文件及单机版软件即可,联网工作由第三方软件公司去做。这样既便于软件的维护、升级,又增加了程序的灵活性,去掉了繁琐的约定,大大减少了工作量,不必为寻找共同的约定而费尽周折,也不用因一方软件约定的内容发生了改变而去做更多的工作,同时也保证了程序的兼容性。
参考文献
[1] 王小华. C++Builder编程技巧、经验与实例[M].北京:人民邮电出版社,2004.




