函數(shù) (FC) 的參數(shù)
函數(shù)沒有可以存儲塊參數(shù)值的數(shù)據(jù)存儲器。因此,調(diào)用函數(shù)時,必須給所有形參分配實參。
輸入?yún)?shù) (Input)
每次塊調(diào)用前,只能讀取輸入?yún)?shù)一次。這樣,在塊中寫入一個輸入?yún)?shù)時,不會對實參造成影響;而僅寫入形參。
輸出參數(shù) (Output)
每次塊調(diào)用之后,只能讀取輸出參數(shù)參數(shù)一次。這樣,就不會讀取塊中的輸出參數(shù)。請注意,如果仍需讀取輸出參數(shù),將只會讀取該形參的值。無法讀取該塊中實參的值。
如果在函數(shù)中沒有寫入該函數(shù)的輸出參數(shù),那么將使用為特定數(shù)據(jù)類型預(yù)定義的值。例如,BOOL 類型的預(yù)定義值為“false”。但結(jié)構(gòu)化的輸出參數(shù)不會預(yù)先賦值。
為了防止對預(yù)定義的值或未定義的值進行其它意外處理,則需在進行塊編程時注意以下事項:
對于塊中的所有程序路徑,請確保將值寫入輸出參數(shù)。為此,請注意跳轉(zhuǎn)命令可能會跳過設(shè)置輸出的指令序列。
請注意,置位和復(fù)位命令取決于邏輯運算的結(jié)果。如果輸出參數(shù)值通過這些命令和 RLO = 0 來確定,則不會生成值。
可以的話,請為函數(shù)的輸出參數(shù)分配一個默認(rèn)值。
輸入/輸出參數(shù) (InOut)
在塊調(diào)用之前讀取輸入/輸出參數(shù)并在快調(diào)用之后寫入。如果在塊中讀取或?qū)懭雲(yún)?shù),那么只能訪問形參。
具有結(jié)構(gòu)化數(shù)據(jù)類型的輸入/輸出參數(shù)不屬于以上情況。結(jié)構(gòu)化的數(shù)據(jù)類型中可包含多種數(shù)據(jù)元素,如 ARRAY 或 STRUCT。這些元素將通過一個指針傳遞給被調(diào)用塊。因此,在塊中讀取或?qū)懭虢Y(jié)構(gòu)化輸入/輸出參數(shù)時,將始終訪問實參。
函數(shù)的輸入/輸出參數(shù)不會寫入該函數(shù)中,而是將之前的輸出值或輸入值用作為函數(shù)值。因此,需要注意上述有關(guān)輸出參數(shù)的信息,這樣才可對舊值處理得當(dāng)。
臨時局部數(shù)據(jù) (Temp)
在進行塊處理過程中,僅支持臨時局部數(shù)據(jù)。具體的處理方式,取決于塊的優(yōu)化設(shè)置:
標(biāo)準(zhǔn)訪問
下列規(guī)則適用于可標(biāo)準(zhǔn)訪問的代碼塊以及設(shè)置了持久性“在 IDB 中設(shè)置”(Set in IDB) 的所有變量:
如果正在使用臨時局部數(shù)據(jù),則必須確保在使用前對值進行初始化。否則,這些值將為隨機數(shù)。WSTRING 數(shù)據(jù)類型的 STRING 臨時數(shù)據(jù)例外:系統(tǒng)將自動預(yù)分配實際長度 0。
優(yōu)化訪問
以下規(guī)則適用于可優(yōu)化訪問的代碼塊:
如果函數(shù)中未寫入臨時變量,則將使用指定數(shù)據(jù)類型的預(yù)定義值。
下表列出了一些預(yù)定義值示例:
| 數(shù)據(jù)類型 | 預(yù)定義的值 |
|---|---|
| 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 數(shù)據(jù)類型的元素,將預(yù)先賦值 PLC 數(shù)據(jù)類型 (UDT) 聲明中所指定的默認(rèn)值。
即使應(yīng)用于 PLC 數(shù)據(jù)類型中,STRING 和 WSTRING 均預(yù)指定為實際值“0”。
即使應(yīng)用于 PLC 數(shù)據(jù)類型中,ARRAY 數(shù)據(jù)類型的元素將預(yù)指定為值“0”。
函數(shù)值 (Return)
通常,函數(shù)會計算函數(shù)值??梢酝ㄟ^輸出參數(shù) RET_VAL 將此函數(shù)值返回給調(diào)用塊。為此,必須在函數(shù)的接口中聲明輸出參數(shù) RET_VAL。RET_VAL 始終是函數(shù)的首個輸出參數(shù)。參數(shù) RET_VAL 可以是除 ARRAY 和 STRUCT 以及 TIMER 和 COUNTER 參數(shù)類型之外的所有數(shù)據(jù)類型。
在 SCL 編程語言中,函數(shù)可以在表達(dá)式中直接調(diào)用。然后,根據(jù)計算出的函數(shù)值得出表達(dá)式結(jié)果。因此,SCL 中函數(shù)值不能為數(shù)據(jù)類型 ANY。
SCL 中調(diào)用函數(shù)的示例
標(biāo)準(zhǔn)調(diào)用
以下為標(biāo)準(zhǔn)函數(shù)調(diào)用 FB 的示例:
| SCL |
|---|
|
// 標(biāo)準(zhǔn)函數(shù)調(diào)用 "MyFC" (MyInput := 10, MyInOut := "Tag1"); |
結(jié)果
執(zhí)行 "MyFC" 塊之后,輸入/輸出參數(shù) "MyInOut" 中確定的值可用于調(diào)用塊的 "Tag1" 中,而且需要在此做進一步處理。
以賦值方式調(diào)用
以下為以賦值方式調(diào)用函數(shù)的示例:
| SCL |
|---|
|
(*在賦值表達(dá)式中調(diào)用,為 "MyFC" 定義了函數(shù)值*) #MyOperand := "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9, MyInOut := "Tag1"); |
結(jié)果
"MyFC" 的函數(shù)值將傳輸?shù)?"#MyOperand" 中。
以算術(shù)表達(dá)式方式進行調(diào)用
以下為以算術(shù)表達(dá)式的方式調(diào)用函數(shù)的示例:
| SCL |
|---|
|
(*在數(shù)學(xué)表達(dá)式中調(diào)用,為 "MyFC" 定義了函數(shù)值*) #MyOperand := "Tag2" + "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9); |
結(jié)果
"MyFC" 的函數(shù)值將加到 "Tag2" 上,并將結(jié)果傳送到 "MyOperand"。
編輯:黃飛
?
電子發(fā)燒友App














評論