调用函数的语法
以下语法用于调用函数:
<函数名称> (参数列表); //标准调用
<操作数>:=<函数名称> (参数列表); //在表达式中调用
函数值
在 SCL 中,提供返回值的函数可在任何表达式中代替操作数。因此,返回值也称为 SCL 中的“函数值”。
函数的调用选项取决于函数是否将函数值返回到调用块。
在 RET_VAL 参数中定义函数值。如果 RET_VAL 参数为 VOID 数据类型,则函数不会向调用块返回值。如果 RET_VAL 参数为另一种数据类型,则函数会返回该数据类型的函数值。
在 SCL 中,RET_VAL 参数可以使用除 ANY、ARRAY、STRUCT 和 VARIANT,以及 TIMER 和 COUNTER 参数类型之外的所有数据类型。
调用选项
SCL 中的调用函数有两种可能:
函数(有和没有函数值)的标准调用
使用标准调用,可以将函数的结果作为输出参数或输入输出参数。
在有函数值的函数中调用表达式
返回函数值的函数可以在任何表达式中代替操作数,例如,在赋值表达式中。
函数计算函数值(与函数同名),并将其返回到调用块。这里,该值可替换此函数调用。
调用后,函数的结果将作为函数值或作为 output 和 in-out 参数提供。
递归块调用
用户可采用递归方式进行块调用。即,块可以自我调用。请注意,此类调用的深度限值为 24 级,且不支持多重背景。
参数列表
如果要从 SCL 块调用另一个代码块,则需要为被调用块的形参提供实参。
可以通过赋值指令指定这些参数。该赋值指令可以为被调用块中定义的参数进行赋值(实参)。
调用后将在括号内直接列出被调用代码代的形参。输入参数和输入输出参数的赋值标识符为“:=”,输出参数的赋值标识符为“=>”。参数后面的灰色占位符表示所需的数据类型和参数类型。
参数的指定规则
下列规则适用于为函数指定参数:
必须提供该函数的所有参数。
赋值的顺序不重要。
常数、变量和表达式可作为实参。
形参和实参的数据类型需匹配。也选择某些特定实参,其数据类型可隐式转换为形参的数据类型。
各赋值操作通过逗号进行分隔。
如果被调用的块中只有一个参数,那么在括号中指定的就是实参。无需再指定形参。
在 SCL 中调用函数时,无法通过 EN 使用释放机制。可以使用 IF 声明代替有条件调用函数。
调用函数快的语法 下列语法用于以单个背景或多重背景方式调用函数块:
单个背景:
如果函数块来自项目: (参数列表)
如果函数块来自“指令”(Instructions) 任务卡: .<指令名称> (参数列表) 或 <指令名称> (参数列表)
多重背景 <#背景名称> (参数列表)
以单个背景或多重背景的方式调用
可以单个背景或多重背景方式调用函数块。
以单个背景方式进行调用
调用的函数块将其数据存储在自身的数据块中。
以多重背景方式进行调用
调用的函数块将其数据存储在调用函数块的背景数据块中。
关于调用类型的更多信息,请参见“另请参见”。
递归块调用
参数列表
如果要从 SCL 块调用另一个代码块,可以为被调用块的形参提供实参。
可以通过赋值指令指定这些参数。该赋值指令可以为被调用块中定义的参数进行赋值(实参)。
调用后将在括号内直接列出被调用代码代的形参。输入参数和输入输出参数的赋值标识符为“:=”,输出参数的赋值标识符为“=>”。参数后面的占位符表示所需的数据类型和参数类型。
参数的指定规则
下列规则适用于指定参数:
常数、变量和表达式可作为实参。
赋值的顺序不重要。
形参和实参的数据类型需匹配。也选择某些特定实参,其数据类型可隐式转换为形参的数据类型。
各赋值操作通过逗号进行分隔。
如果被调用的块中只有一个参数,那么在括号中指定的就是实参。无需再指定形参。
SCL 中调用函数的示例
标准调用
以下为标准函数调用 FB 的示例:
// 标准函数调用 "MyFC" (MyInput := 10, MyInOut := "Tag1"); |
结果
执行 "MyFC" 块之后,输入/输出参数 "MyInOut" 中确定的值可用于调用块的 "Tag1" 中,而且需要在此做进一步处理。
以赋值方式调用
以下为以赋值方式调用函数的示例:
(*在赋值表达式中调用,为 "MyFC" 定义了函数值*) #MyOperand := "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9, MyInOut := "Tag1"); |
结果
"MyFC" 的函数值将传输到 "#MyOperand" 中。
以算术表达式方式进行调用
以下为以算术表达式的方式调用函数的示例:
(*在数学表达式中调用,为 "MyFC" 定义了函数值*) #MyOperand := "Tag2" + "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9); |
结果
"MyFC" 的函数值将加到 "Tag2" 上,并将结果传送到 "MyOperand"。
在 SCL 中调用函数块的示例 |
以单个背景方式进行调用 以下为以单个背景方式调用 FB 的示例:
// 以单个背景方式调用 "MyDB" (MyInput:=10, MyInout:= "Tag1"); |
结果
执行调用之后,输入/输出参数 "MyInout" 中确定的值可用于 "MyDB" 数据块的 "Tag1" 中。
以多重背景方式进行调用
以下为以多重背景方式调用 FB 的示例:
// 以多重背景方式进行调用 #MyFB (MyInput:= 10, MyInout:= "Tag1"); |
结果
执行 "#MyFB" 块之后,in/out 参数 "MyInout" 中确定的值可用于调用代码块中该数据块内的 "Tag1"。