Skip to main content

对象:方法

象征: _cds_icon_method.png

关键词: METHOD

方法是 IEC 61131-3 标准的扩展,是面向对象编程的工具,用于数据封装。方法包含声明和实现。但是,与函数不同的是,方法不是独立的 POU,它从属于功能块或程序。方法可以访问上级 POU 的所有有效变量。

您可以在程序或功能块下方添加方法。点击 项目 → 添加对象 → 方法.然后 添加方法 对话框打开。

您可以使用接口来组织方法。

有关详细信息,请参阅: 实现一个接口

重要

当您将方法复制到 POU 下并将其添加到接口下,或将方法移到那里时,包含的实现将自动删除。

宣言

句法:

METHOD <access specifier> <method name> : <type of return value>

<access specifier>

选修的

访问说明符

根据声明的访问说明符,方法只能在其自己的命名空间内调用(INTERNAL), 仅在其自身的 POU 及其衍生品中 (PROTECTED), 或者只在它自己的 POU (PRIVATE).为了 PUBLIC,可以从任何地方调用该方法。

<method name>

方法标识符

<type of retur value>

选修的

方法的返回类型

注意:对于没有显式返回类型的方法,第一个声明的输出用作返回值。仅当既未声明返回类型也未声明输出时,方法才不会返回值。但是,在任何一种情况下都不会生成编译器错误。

59. 变量声明(参数)的可能范围

<scope list>

适用范围:

  • VAR_IN_OUT <variable declaration list> END_VAR

    对于输入/输出变量的变量声明

  • VAR_INPUT <variable declaration list> END_VAR

    对于输入的变量声明

  • VAR_OUTPUT <variable declaration list> END_VAR

    对于输出的变量声明

    与函数一样,方法可以有额外的输出。调用该方法时,您还需要将参数(变量)传递给其他输出。

  • VAR <variable declaration list> END_VAR

    用于本地目的的变量声明

<variable declaration list>

变量声明

<variable name> : <data type> := <initial value> ;

根据用途分配给范围的以分号分隔的变量(参数)列表。

  • 输入和输入/输出的变量可以有一个初始值分配给他们

    初始值的分配是可选的。但是,如果指定了一个,则在调用该方法时可以省略为此参数传递的参数。这些类型的参数称为可选参数。

  • 方法的变量(参数)包含仅在方法执行期间有效的临时数据(堆栈变量)。每次调用该方法时,都会重新初始化方法中声明和实现的所有变量。



517. 例子

宣言

METHOD PUBLIC DoIt : BOOL
VAR_INPUT
        iInput_1 : DWORD;
        iInput_2 : DWORD;
        sInput_3 : STRING(12);
END_VAR


执行

选修的

  • 允许访问功能块实例或程序变量以实现该方法。

  • 指针允许访问它自己的功能块实例。因此,仅在分配给功能块的方法中才允许使用指针。

  • 一个方法无法访问 VAR_TEMP 值 功能块的变量。

  • 方法可以递归调用自身。

  • 接口方法没有实现

    接口方法 可以声明输入、输出和 VAR_IN_OUT 变量,但不包含实现。

调用方法

调用语法:

<return value variable> := <POU name> . <method name> ( <argument passing> );

<return value variable>

返回值的变量

该类型必须与方法的返回类型相匹配。

注意:对于没有显式返回类型的方法,第一个声明的输出用作返回值。仅当既未声明返回类型也未声明输出时,方法才不会返回值。但是,在任何一种情况下都不会生成编译器错误。

<POU name>

安排方法的功能块实例的标识符

<method name>

方法标识符

<argument passing>

带实际参数的逗号分隔列表

一个参数被传递给方法的每个参数(变量):

<parameter name> := <actual argument>

  • 每个声明的输入/输出或输入都分配有实际参数。参数可以是值(文字)、表达式或具有匹配类型的变量。

  • 实际参数(相同类型的变量)分配给每个声明的输出分配。参数必须是具有匹配类型的变量。

  • 可以省略为输入或输入/输出传递参数。

    因此,列表中的参数数量可能少于参数数量(输入范围或输入/输出)。特别是,如果它是在声明中指定了默认值或初始值的可选参数,则可以省略传递参数。

    提示:如果您在调用该方法时从输入助手获得帮助,那么它会通知您现有的初始值。

  • 传递带有名称和赋值运算符的参数规范的参数是可选的。

    仅指定参数就足够了。声明中变量的顺序决定了将哪个参数传递给哪个参数。

518. 例子

宣言

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);

当方法被调用时,方法的返回值被分配给一个本地声明的变量。



519. 例子

如果省略输入变量的名称,则参数的赋值将根据声明顺序进行。

宣言

METHOD PUBLIC DoIt : BOOL
VAR_INPUT
        iInput_1 : DWORD;
        iInput_2 : DWORD;
        sInput_3 : STRING(12);
END_VAR
IF iInput_1 = iInput_2 THEN
	DoIt := TRUE; // explicit return value
END_IF

根据声明中的顺序传递参数进行调用

bFinishedMethod := fbInstance.DoIt( 16, 16#0010,'Hello World ');


递归方法调用

在实现中,方法可以调用自身,或者直接通过 指针,或通过分配功能块的局部变量。

  • <return value variable> := <POU name> . <method name> ( <argument passing> );

    直接调用相关功能块实例 THIS 指针

  • <return value variable> := <POU name> . <method name> ( <argument passing> );

    通过临时实例化相关功能块的方法的局部变量调用

在递归的情况下发出编译器警告 称呼.如果该方法随 pragma 一起提供 {attribute 'estimated-stack-usage' := '<estimated stack size in bytes>'}, 然后编译器警告被抑制。

有关实现示例,请参阅“属性: '估计堆栈使用'“ 章节。

要递归调用方法,仅指定方法名称是不够的。如果仅指定了方法名称,则会发出编译器错误: 期望程序名称、功能或功能块实例而不是

功能块的特殊方法

FB_Init

声明自动隐式,但也可以显式声明

包含功能块的初始化代码,在功能块的声明部分中定义

FB_Reinit

明确声明是必要的。

在复制功能块的实例后调用(如在线更改期间)。它重新初始化新的实例模块。

FB_Exit

明确声明是必要的。

在新下载或重置之前或在所有移动或删除的实例的在线更改期间调用功能块的每个实例。

特性

提供 Set 和/或 Get 访问器方法。

对话: 添加方法

功能: 定义对话框关闭时所选 POU 下面的方法。

称呼项目→添加对象→方法;上下文菜单

要求:一个程序(PRG) 或功能块 (FUNCTION_BLOCK) 被选择在 POU 查看或 设备 看法。

注意

在派生功能块下方插入同名方法时,复制在基本功能块下方插入的方法的接口。

姓名

例子: meth_DoIt.

标准方法 FB_InitFB_Exit 如果它们尚未插入 POU 下方,则在列表框中提供。如果是派生功能块,那么列表框也提供了基本功能块的所有方法。

返回类型

返回值的默认数据类型或结构化数据类型

例子: BOOL

实现语言

例子: 结构化文本 (ST)

访问说明符

控制对数据的访问。

  • 民众 或未指定:访问不受限制。

  • 私人的:访问仅限于程序、功能块或 GVL。

    该对象被标记为 (private) 在 POU 或设备视图中。声明包含关键字 PRIVATE.

  • 受保护: 访问仅限于程序、功能块或 GVL 及其派生。声明包含关键字 PROTECTED.

    该对象被标记为 (protected) 在 POU 或设备视图中。

  • 内部的:对该方法的访问仅限于命名空间(库)。

    该对象被标记为 (internal) 在 POU 或设备视图中。声明包含关键字 INTERNAL.

抽象的

standard icon:标识该方法没有实现,并且该实现由派生的FB提供。

添加

在选定对象下方添加一个新方法。

生成继承 POU 时的输入支持

当你进行面向对象的编程并使用继承时 (EXTENDS 关键字)的 POU,您可以通过以下方式获得支持:

当您在派生自基本 POU 的 POU 下插入操作、属性、方法或转换时, 添加 … 对话框打开。然后名称的输入字段扩展到一个列表框。列表框包含从基本 POU 中可用的动作、属性、方法或转换中进行的有效选择。例如,现在您可以轻松地接受基本 POU 的方法,然后将其调整为 POU 的派生函数。

带有访问修饰符的方法和属性 PRIVATE 此处未列出,因为它们也不是继承的。带有访问修饰符的方法和属性 PUBLIC 接受派生的 POU 时自动获得一个空白的访问修饰符字段,这在功能上意味着相同的事情。

有关更多信息,请参阅: 财产方法过渡行动

520. 例子
_cds_img_input_wizzard_for_blocks.png