西门子博途:SCL编程调用函数/调用函数块
调用函数的语法
以下语法用于调用函数:
<函数名称> (参数列表); //标准调用
<操作数>:=<函数名称> (参数列表); //在表达式中调用
函数值
在 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 声明代替有条件调用函数。
调用函数快的语法下列语法用于以单个背景或多重背景方式调用函数块:
- 单个背景:
- 如果函数块来自项目:<DB 名称>(参数列表)
- 如果函数块来自“指令”(Instructions) 任务卡:<DB 名称>.<指令名称> (参数列表)或<指令名称> (参数列表)
- 多重背景<#背景名称> (参数列表)
以单个背景或多重背景的方式调用
可以单个背景或多重背景方式调用函数块。
以单个背景方式进行调用
调用的函数块将其数据存储在自身的数据块中。
以多重背景方式进行调用
调用的函数块将其数据存储在调用函数块的背景数据块中。
关于调用类型的更多信息,请参见“另请参见”。
递归块调用
参数列表
如果要从 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"。