直接跳到内容

函数指针操作

LibraryLoad

  • 位置

sys_function_pointer.aclib

  • 功能说明

加载动态库。使用此功能前,需确保要加载的动态库存在,建议将动态库放置在Runtime根目录,Windows下Runtime路径为“\AnyControl\runtime\”。

img

  • 参数说明
输入参数数据类型描述常量
fileNameSTRING(255)动态库路径(相对路径或绝对路径均可。例如:'C:\AnyControl\runtime\TestLib.dll' 或 ./TestLib.dll' ,相对路径是指Runtime的根目录。)×
输出参数数据类型描述常量
LibraryLoadPOINTER TO BYTE返回句柄×
  • 示例

例如在linux系统下,用户的一个动态库,其位置为:/sd/userfunction.so,则加载方式如下:

CFC示例

img

ST示例

img

LD示例

img

IL示例

img

LibraryGetFunctionPointer

  • 位置

sys_function_pointer.aclib

  • 功能说明

获取动态库某个函数的地址,假设其中一个函数名为“ADD_function”。

img

  • 参数说明
输入参数数据类型描述常量
handlePOINTER TO BYTE动态库句柄×
functionNameSTRING(255)函数名×
输出参数数据类型描述常量
LibraryGetFunctionPointerPOINTER TO BYTE返回的函数地址×
  • 示例

例如在动态库/sd/userfunction.so获取里面ADD_function的地址:(需先在工程中组态ADD_function函数,且返回值和内部变量名和类型需与动态库中完全一致)

CFC示例

img

ST示例

img

LD示例

img

IL示例

img

LibraryUnload

  • 位置

sys_function_pointer.aclib

  • 功能说明

卸载动态库。

img

  • 参数说明
输入参数数据类型描述常量
handleDWORD动态库句柄×
输出参数数据类型描述常量
LibraryUnloadDINT返回的卸载结果×
  • 示例

CFC示例

img

ST示例

img

LD示例

img

IL示例

img

函数指针使用示例

函数指针使用

(例程路径:安装目录\example\function_pointer)

AnyControl系统支持用户定义函数指针,在系统中声明的函数POU均可以定义函数指针。

例如用户定义了函数fun_input_two_simple_add,有两个输入参数类型均为INT,函数返回值为DINT:

img

用户可以定义指向fun_input_two_simple_add函数的指针,并且直接使用函数指针可以完成调用,使用方式与C语言类似:

img

函数指针:

(1)可以通过 ADR_POU 操作符来获取AnyControl系统中定义的FUN POU的地址,系统中其他模块可以使用该指针完成函数回调的功能;

(2)可以通过LibraryLoad加载动态链接库后,使用LibraryGetFunctionPointer获取动态库中的函数地址,以此来完成动态库中函数的调用。

调用第三方库文件

基本使用示例如下图所示:

img

具体实现步骤及注意事项如下:

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中访问的函数,请在动态库中正确导出。

img更加丰富的调用示例请参见AnyControl中的示例工程- function_pointer。
函数指针操作已经加载完毕