函数 (FC) 的参数
函数没有可以存储块参数值的数据存储器。因此,调用函数时,必须给所有形参分配实参。
输入参数 (Input)
每次块调用前,只能读取输入参数一次。这样,在块中写入一个输入参数时,不会对实参造成影响;而仅写入形参。
输出参数 (Output)
每次块调用之后,只能读取输出参数参数一次。这样,就不会读取块中的输出参数。请注意,如果仍需读取输出参数,将只会读取该形参的值。无法读取该块中实参的值。
如果在函数中没有写入该函数的输出参数,那么将使用为特定数据类型预定义的值。例如,BOOL 类型的预定义值为“false”。但结构化的输出参数不会预先赋值。
为了防止对预定义的值或未定义的值进行其它意外处理,则需在进行块编程时注意以下事项:
对于块中的所有程序路径,请确保将值写入输出参数。为此,请注意跳转命令可能会跳过设置输出的指令序列。
请注意,置位和复位命令取决于逻辑运算的结果。如果输出参数值通过这些命令和 RLO = 0 来确定,则不会生成值。
可以的话,请为函数的输出参数分配一个默认值。
输入/输出参数 (InOut)
在块调用之前读取输入/输出参数并在快调用之后写入。如果在块中读取或写入参数,那么只能访问形参。
具有结构化数据类型的输入/输出参数不属于以上情况。结构化的数据类型中可包含多种数据元素,如 ARRAY 或 STRUCT。这些元素将通过一个指针传递给被调用块。因此,在块中读取或写入结构化输入/输出参数时,将始终访问实参。
函数的输入/输出参数不会写入该函数中,而是将之前的输出值或输入值用作为函数值。因此,需要注意上述有关输出参数的信息,这样才可对旧值处理得当。
临时局部数据 (Temp)
在进行块处理过程中,仅支持临时局部数据。具体的处理方式,取决于块的优化设置:
标准访问
下列规则适用于可标准访问的代码块以及设置了持久性“在 IDB 中设置”(Set in IDB) 的所有变量:
如果正在使用临时局部数据,则必须确保在使用前对值进行初始化。否则,这些值将为随机数。WSTRING 数据类型的 STRING 临时数据例外:系统将自动预分配实际长度 0。
优化访问
以下规则适用于可优化访问的代码块:
如果函数中未写入临时变量,则将使用指定数据类型的预定义值。
下表列出了一些预定义值示例:
数据类型 | 预定义的值 |
---|---|
Bool | False |
Int | 0 |
REAL | 0.0 |
Char | ' ' |
Wchar | WCHAR#' ' |
DTL | DTL#1970-01-01-0000 |
DATE_AND_TIME | DT#1990-01-01-0000 |
Date | D#1990-01-01 |
对于 PLC 数据类型的元素,将预先赋值 PLC 数据类型 (UDT) 声明中所指定的默认值。
即使应用于 PLC 数据类型中,STRING 和 WSTRING 均预指定为实际值“0”。
即使应用于 PLC 数据类型中,ARRAY 数据类型的元素将预指定为值“0”。
函数值 (Return)
通常,函数会计算函数值。可以通过输出参数 RET_VAL 将此函数值返回给调用块。为此,必须在函数的接口中声明输出参数 RET_VAL。RET_VAL 始终是函数的输出参数。参数 RET_VAL 可以是除 ARRAY 和 STRUCT 以及 TIMER 和 COUNTER 参数类型之外的所有数据类型。
在 SCL 编程语言中,函数可以在表达式中直接调用。然后,根据计算出的函数值得出表达式结果。因此,SCL 中函数值不能为数据类型 ANY。
SCL 中调用函数的示例
标准调用
以下为标准函数调用 FB 的示例:
SCL |
---|
// 标准函数调用 "MyFC" (MyInput := 10, MyInOut := "Tag1"); |
结果
执行 "MyFC" 块之后,输入/输出参数 "MyInOut" 中确定的值可用于调用块的 "Tag1" 中,而且需要在此做进一步处理。
以赋值方式调用
以下为以赋值方式调用函数的示例:
SCL |
---|
(*在赋值表达式中调用,为 "MyFC" 定义了函数值*) #MyOperand := "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9, MyInOut := "Tag1"); |
结果
"MyFC" 的函数值将传输到 "#MyOperand" 中。
以算术表达式方式进行调用
以下为以算术表达式的方式调用函数的示例:
SCL |
---|
(*在数学表达式中调用,为 "MyFC" 定义了函数值*) #MyOperand := "Tag2" + "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9); |
结果
"MyFC" 的函数值将加到 "Tag2" 上,并将结果传送到 "MyOperand"。