概要:
在用户自定义开发过程中,常常会遇到需要调用外部 DLL/LIB 程序文件的需求,这些文件可能是用户自己编写的,也可能是其它供应商提供的。TSMaster 支持调用外部二进制程序库,但必须通过一定的方法进行封装。本节内容以调用 NI 公司的 TDMS 文件记录程序为例,演示封装 DLL 库的方法,而 LIB 库的使用与 DLL 类似,用户可以在 visual studio工程中执行类似操作实现。
一、获取外部程序库
NI 公司的 TDMS 库可以通过此链接下载,对于外部库的使用,请注意以下限制:
1. 在下载外部程序库的过程中,请注意发布程序库的使用协议,同星公司仅提供外部程序库的使用环境,不为违反外部库使用协议的行为负责;
2. 外部库被 TSMaster 载入后,即成为了主程序的一部分,如果外部库发生了崩溃/内存溢出等行为,会导致 TSMaster 程序不稳定或崩溃,此时需要重新打开软件并卸载有问题的外部库;
3. TSMaster 仅支持 32bit-msvc 版本的外部库,请使用合适版本的 DLL/LIB 文件,否则会导致编译过程出错。
(在附件的“tdms_example\TDM C DLL”目录下,可以找到解压后的 TDMS 外部库相关文件。)
二、准备外部库调用模板
该模板可以从 TSMaster 程序中拷贝,通过 帮助->api 例程-> Mini Program SDK 目录下名为 VC++的工程,将该工程复制到其它用户自定义的位置备用即可。
在附件“tdms_example\tdms_sdk”可以看到为 TDMS 功能准备的工程。
三、编辑模板并生成DLL
无论外部库是 DLL 还是 LIB,或者两者均有,都可以在模板工程中被调用。需要注意的是,为了能够使得 TSMaster 能够正常识别,用户在准备模板工程过程中,除了实现自己的逻辑外,还需要提供函数的注释,参数说明等信息。具体方法可以打开默认模板文件,在全局搜索 fun1 关键字,该函数为一个示例函数,它出现的地方,也就是用户需要添加自定义内容的地方。
如上图所示,可以看到在 MPLibCode.cpp 文件中,实现了 fun1 函数的声明和实现,在 MPLibCodeExtern.cpp 文 件 中 , 向 dll 管 理 模 板 注 册 了 函 数 fun1 的 存 在 , 在 TSMasterBaseSource.cpp 文件中,向 dll 管理模板注册了 fun1 函数的相关参数信息。
在集成 TDMS 功能过程中,首先需要将编译过程需要的 h 文件和 lib 文件拷贝到工程目录下,并在工程链接器中将 LIB 文件作为输入。对于外部函数,例如 TDMS 库自带的DDC_CreateFile 函数,在模板中使用一个新的函数进行封装,将其命名为 tdms_CreateFile。尽管 LIB 文件的函数可以直接导出,但通常建议新建一个函数对它进行封装,一是可以统一函数的名称,便于用户区分,而是所有 API 的函数返回值必须为 int 类型,如果原生外部库不是该返回类型,则必须通过传递指针等方式获取返回值,此时必须通过封装的形式使用。
TDMS 其它的函数封装过程请参考示例工程,请务必注意封装函数代码和函数注册代码需要匹配,才能正确工作。基于该模板,在 Debug/Release-x86 模式下,可以生成所需的“tdms_sdk.dll”。
四、在TSMaster中调用模板DLL
为了在 TSMaster 中调用“tdms_sdk.dll”,可以将该 dll 直接拖入,或者通过仿真->小程序库->加载的方式载入,如下图所示,直接加载会失败,这是由于模板 dll 依赖了 TDMS运行时 DLL 文件,依赖文件在“tdms_example\TDM C DLL\dev\bin\32-bit”目录下,由 NI公司提供,将所有文件拷贝到 TSMaster 工程\Plugins\Dependencies 目录下(这个目录需要手动创建,默认 TSMaster 不会创建),再载入模板 dll,即可正确载入。
打开示例工程“tdms_example\tdms_example”,在测试系统的第一条用例,为 TDMS文件生成测试代码。用户也可以新建小程序来调用,两者在操作上没有区别,都需先在属性窗口中,勾选所需外部库,然后在脚本程序中调用所需函数。如下图所示,脚本运行后会在 D 盘根目录下创建一个示例 TDMS 文件。
直接运行该脚本,可以发现程序能够运行但并未按需创建 TDMS 文件,通过运行记录文件查看错误消息,可以看到提示未能打开存储设备。这个问题是 TDMS 库所特有的,因为它的依赖文件中,除了 dll 外,还包含一个名为 DataModels 的文件夹,TSMaster 在使用“tdms_example\Plugins\Dependencies”目录下的依赖文件时,不会对文件夹进行关联,因此需要手动把该文件夹复制到 TSMaster 安装程序目录,例如“C:\ProgramFiles(x86)\TOSUN\TSMaster\bin”。有些外部库只有 dll 依赖,则不需要手动复制操作。
解决依赖的文件夹后,即可正确生成 TDMS 文件。用户可以参考以上过程,实现自己的逻辑。整个过程需要对 visual stuido 环境具备一定了解,如有不清楚的地方,请参考示例工程。
五、在TSMaster中调试模板DLL
在使用模板 dll 过程中,不可避免存在调试过程。用户可以修改模板 visual stuido 中项目属性->常规->输出目录,将 dll 的目录输出到调试使用的工程中“MPLibrary”目录下。例如将“tdms_example”示例中 dll 生成到“tdms_example\tdms_example\MPLibrary”下,然后先运行 TSMaster 工程,再启动 visual stuido 调试功能。调试过程与小程序调试方法一致,可以参考小程序的调试过程。