方法是一种语言元素,类似于在功能块环境中可使用的功能。可将其视为包含相应功能块实例的功能。正如功能,方法包含返回值、以及用于临时变量和参数的自有声明部分。
此外,作为面向对象编程的方法,您可使用接口来整理可在项目中使用的方法。
要将方法分配至功能块或接口,可在
中选择相应的功能块或接口,单击绿色加号按钮并执行命令 。或者,您也可以右键单击功能块或接口节点并从上下文菜单执行命令 。在
对话框中,输入 、所需的 、 以及 (请参阅下文)。如果方法不包含实现且实现由衍生功能块提供,请选择选项 。要选择返回数据类型,单击按钮 ,打开 对话框。:出于兼容性考虑,访问说明符为选用项。说明符 的作用等同于不设置说明符。
也可从选择列表中选择其中一个选项:
:方法上的访问限制为功能块。
:方法上的访问限制为功能块及其衍生物。
:方法上的访问限制为当前命名空间(库)。
单击
进行确认。方法编辑器视图打开。EcoStruxure Machine Expert 利用功能块内的继承简化面向对象的编程:当在继承自另一功能块的功能块上执行 时,列出基本功能块中使用的 、 、 和 元素以供选择:
在基本功能块中定义的
为 、 和 的 、 、 和 元素可供选择。您可以调整继承对象的定义。在继承对象中,将相同的 分配给源元素。为 的 、 、 和 不可选择,因为对基本功能块的访问受限。
方法调用也称为虚拟功能调用。有关更多信息,请参阅方法调用一章。
对于调用方法,请注意:
方法的数据是临时的,仅在执行方法时有效(堆栈变量)。因此,在方法的每次调用时重新初始化在方法中声明的变量和功能块。
仅允许接口中定义的方法具有输入、输出和输入/输出变量,但是没有主体(实现部分)。
诸如功能这样的方法可具有额外输出。必须在方法调用期间分配它们。
声明的访问说明符定义方法的调用方式:
:方法可以在其自己的命名空间中调用。
:方法可以在其自己的 POU 和衍生中调用。
:方法可以在其自己的 POU 中调用。
:方法调用不受限制。
对于方法实现,请注意以下几点:
在方法的主体中,允许访问功能块实例变量。
如果需要,可使用 THIS 指针,其将始终指向当前实例。
在方法中无法访问功能块的 VAR_TEMP
变量。
方法可以对自身执行递归调用。
使用以下语法来调用方法:
<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-stackusage : '<estimated_stack_size_in_bytes>'}
,则不生成编译器消息。有关实现示例,请参阅 Attribute estimated-stack-usage
章节。
因此,指定方法名称不足以满足递归方法调用的要求。在此情况下,会生成以下编译器消息:
Program name, function or function block instance expected instead of
注意 | |
---|---|
在设备描述文件中,可定义应当始终由库模块的特定功能块实例以循环任务的方式调用特定方法。如果该方法具有以下输入参数,则也会在活动的应用程序没有运行时处理它。
示例
VAR_INPUT
pTaskInfo : POINTER TO DWORD;
pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO;
END_VAR
程序员可通过 pApplicationInfo
来检查应用程序状态,并定义应当发生什么。
IF pApplicationInfo^.state = RUNNING THEN <instructions> END_IF