标志
关键词: METHOD
方法是 IEC 61131-3 标准的扩展,也是面向对象编程的工具,用于数据封装。一个方法包含一个声明和一个实现。不过,与函数不同,方法不是独立的 POU,它从属于功能块或程序。方法可以访问上位 POU 的所有有效变量。
您可以使用接口来组织方法。
您可以在程序或功能块下面添加方法。单击“Project Add Object Method” 打开“Add Method” 对话框。
声明
-
方法的变量包含仅在方法执行期间有效的临时数据(堆栈变量)。每次调用方法时,方法中声明和实现的所有变量都会被重新初始化。
-
与函数一样,方法也可以有额外的输出。您必须在方法调用中分配这些额外的输出。
-
根据所声明的访问规范,一个方法只能在它自己的命名空间 (
INTERNAL
) 内被调用,只能在它自己的 POU 及其衍生物 (PROTECTED
) 内被调用,或者只能在它自己的 POU (PRIVATE
) 内被调用。对于PUBLIC
,可以从任何地方调用该方法。
接口方法可以声明输入、输出和VAR_IN_OUT
变量,但不包含实现。
另见
实施
-
在方法的执行过程中,允许访问功能块实例或程序变量。
-
THIS
指针允许访问自己的功能块实例。因此,只有在分配给功能块的方法中才允许使用指针。 -
方法不能访问
VAR_TEMP
功能块的变量。 -
方法可以递归调用自身。




注意

当你复制 POU 下面的方法并将其添加到接口下面,或将方法移到接口下面时,包含的实现会自动移除。
调用方法
呼叫语法
<return value variable> := <POU name> . <method name> ( <method input name> := <variable name> (, <further method input name> := <variable name> )* );
在方法调用中,需要将传输参数赋值给方法的输入变量。这样做时要尊重声明。只需指定输入变量的名称即可,无需注意它们在声明中的顺序。
示例
声明
METHOD PUBLIC DoIt : BOOL VAR_INPUT iInput_1 : DWORD; iInput_2 : DWORD; sInput_3 : STRING(12); END_VAR
致电
bFinishedMethod := fbInstance.DoIt(sInput_3 := 'Hello World ', iInput_2 := 16#FFFF, iInput_1 := 16);
调用方法时,方法的返回值会被赋值,例如赋值给本地声明的变量。省略输入变量名时,必须注意声明顺序。
示例
声明
METHOD PUBLIC DoIt : BOOL VAR_INPUT iInput_1 : DWORD; iInput_2 : DWORD; sInput_3 : STRING(12); END_VAR
致电
bFinishedMethod := fbInstance.DoIt( 16, 16#FFFF,'Hello World ');
递归方法调用
在执行过程中,方法可以调用自身,可以通过THIS
指针直接调用,也可以通过指定功能块的局部变量调用。
-
THIS^. <method name> ( <parameter transfer of all input and output variables> )
使用
THIS
指针直接调用相关功能块实例 -
VAR fb_Temp : <function block name>; END_VAR
通过临时实例化相关功能块的方法的局部变量调用
对于递归调用,编译器会发出警告。如果提供的方法带有 pragma{attribute 'estimated-stack-usage' := '<sstimated_stack_size_in_bytes>'}
,那么编译器警告就会被抑制。有关实施示例,请参阅 "属性'estimated-stack-usage'"章节。
要递归调用方法,仅指定方法名称是不够的。如果只指定了方法名称,则编译器会出错:“程序名称、函数或功能块实例,而不是”
功能块的特殊方法
|
自动隐式声明,但也可以显式声明 包含功能块的初始化代码,该代码在功能块的声明部分进行了定义 |
|
明确声明是必要的。 在复制功能块实例后调用(如在线更改时)。它会重新初始化新的实例模块。 |
|
明确声明是必要的。 在新下载或重置之前,或在线更改期间,调用每个功能块实例的所有移动或删除实例。 |
属性 |
提供 |
添加方法 "对话框
功能 :定义对话框关闭时所选 POU 下方的方法。
请致电 :菜单栏:“项目 添加对象 方法” ;上下文菜单
要求 :在“POU” 视图或“Device” 视图中选择程序 (PRG
) 或功能块 FUNCTION_BLOCK
)。
在派生功能块下面插入同名方法时,插入在基本功能块下面的方法的接口会被复制。
“名称” |
示例: 如果 POU 下方尚未插入标准方法 |
“返回类型” |
返回值的默认数据类型或结构化数据类型 例如 |
“执行语言” |
示例:“结构化文本 (ST)” |
“访问指定器” |
控制数据访问。
|
“摘要” |
|
“添加” |
在所选对象下方添加一个新方法。 |
生成继承 POU 时的输入支持
在进行面向对象编程并使用 POU 的继承(关键字EXTENDS
)时,可以获得如下支持:
在从基本 POU 派生的 POU 下面插入动作、属性、方法或转换时,会打开“Add ...” 对话框。然后,姓名输入框扩展为一个列表框。列表框包含从基本 POU 中可用的操作、属性、方法或转换中选择的有效选项。例如,现在您可以轻松接受基础 POU 的方法,然后将其调整为 POU 的派生函数。
这里没有列出带有访问修饰符PRIVATE
的方法和属性,因为它们也不被继承。带有访问修饰符PUBLIC
的方法和属性在被派生 POU 接受时,会自动获得一个空白的访问修饰符字段,这在功能上是一样的。
示例
