函数指针操作
LibraryLoad
- 位置
sys_function_pointer.aclib
- 功能说明
加载动态库。使用此功能前,需确保要加载的动态库存在,建议将动态库放置在Runtime根目录,Windows下Runtime路径为“\AnyControl\runtime\”。
- 参数说明
输入参数 | 数据类型 | 描述 | 常量 |
---|---|---|---|
fileName | STRING(255) | 动态库路径(相对路径或绝对路径均可。例如:'C:\AnyControl\runtime\TestLib.dll' 或 ./TestLib.dll' ,相对路径是指Runtime的根目录。) | × |
输出参数 | 数据类型 | 描述 | 常量 |
---|---|---|---|
LibraryLoad | POINTER TO BYTE | 返回句柄 | × |
- 示例
例如在linux系统下,用户的一个动态库,其位置为:/sd/userfunction.so,则加载方式如下:
CFC示例
ST示例
LD示例
IL示例
LibraryGetFunctionPointer
- 位置
sys_function_pointer.aclib
- 功能说明
获取动态库某个函数的地址,假设其中一个函数名为“ADD_function”。
- 参数说明
输入参数 | 数据类型 | 描述 | 常量 |
---|---|---|---|
handle | POINTER TO BYTE | 动态库句柄 | × |
functionName | STRING(255) | 函数名 | × |
输出参数 | 数据类型 | 描述 | 常量 |
---|---|---|---|
LibraryGetFunctionPointer | POINTER TO BYTE | 返回的函数地址 | × |
- 示例
例如在动态库/sd/userfunction.so获取里面ADD_function的地址:(需先在工程中组态ADD_function函数,且返回值和内部变量名和类型需与动态库中完全一致)
CFC示例
ST示例
LD示例
IL示例
LibraryUnload
- 位置
sys_function_pointer.aclib
- 功能说明
卸载动态库。
- 参数说明
输入参数 | 数据类型 | 描述 | 常量 |
---|---|---|---|
handle | DWORD | 动态库句柄 | × |
输出参数 | 数据类型 | 描述 | 常量 |
---|---|---|---|
LibraryUnload | DINT | 返回的卸载结果 | × |
- 示例
CFC示例
ST示例
LD示例
IL示例
函数指针使用示例
函数指针使用
(例程路径:安装目录\example\function_pointer)
AnyControl系统支持用户定义函数指针,在系统中声明的函数POU均可以定义函数指针。
例如用户定义了函数fun_input_two_simple_add,有两个输入参数类型均为INT,函数返回值为DINT:
用户可以定义指向fun_input_two_simple_add函数的指针,并且直接使用函数指针可以完成调用,使用方式与C语言类似:
函数指针:
(1)可以通过 ADR_POU 操作符来获取AnyControl系统中定义的FUN POU的地址,系统中其他模块可以使用该指针完成函数回调的功能;
(2)可以通过LibraryLoad加载动态链接库后,使用LibraryGetFunctionPointer获取动态库中的函数地址,以此来完成动态库中函数的调用。
调用第三方库文件
基本使用示例如下图所示:
具体实现步骤及注意事项如下:
1、在AnyControl中定义与被调用函数相同的FUN类型POU,其中参数的类型、顺序、函数返回值均需要与库中函数一致。并定义指向该FUN的指针变量。
需要特别注意:
INOUT类型的引脚在AnyControl系统中实际是按照指针类型进行处理,在动态库中定义时,请按照指针方式定义;
参数类型为LREAL、指针、结构体、功能块、字符串类型时,请按照指针方式进行定义及使用。
结构体、功能块等复杂类型需要注意成员的对齐方式,目前AnyControl中统一约定自然对齐方式,在动态库中定义类型时请遵循自然对齐规则。
2、定义完成后:
(1)调用LibraryLoad函数即可通过库文件的名称来完成库的动态加载,在加载完成后,请判断返回句柄的有效性再进行使用,避免引起非预期的结果。库文件的路径支持绝对路径和相对路径的方式,注意请使用完整的库名称,包含后缀。
(2)调用LibraryGetFunctionPointer函数即可通过函数名称获得需要调用的函数的实际地址,并将该地址赋值到第一步定义好的函数指针中。
(3)使用函数指针进行传参、调用即可。注意在调用前判断函数指针有效性。
(4)在完成所需功能后,需要调用LibraryUnload函数将动态库卸载,释放相关资源。
3、关于动态库说明:
(1)第三方动态库需要与AnyControl runtime匹配,runtime如果为64位程序,则需要提供64位的动态链接库,如果为32位程序,则需要提供32位的动态链接库;
(2)在AnyControl中访问的函数,请在动态库中正确导出。
更加丰富的调用示例请参见AnyControl中的示例工程- function_pointer。 | |
---|---|