指令
SCL作為一種編程語(yǔ)言,可以實(shí)現(xiàn)LAD/FBD所有的功能,大多數(shù)的指令與LAD/FBD都是相同的,只是在編輯器中的外形不同。只有一些指令使用是不太一樣的甚至LAD/FBD沒(méi)有的,這里只介紹這些不同的。
SCL特殊的指令有以下幾種,如圖1-3紅框中的指令:
圖1 讀寫存儲(chǔ)器
圖2 轉(zhuǎn)換操作
圖3 程序控制指令
在這三部分中,讀寫存儲(chǔ)器的PEEK POKE指令可以參考鏈接,轉(zhuǎn)換操作可以參考鏈接,這里只介紹圖3的程序控制指令。
程序控制指令
程序控制指令見(jiàn)以下表格。
程序控制語(yǔ)句 | 說(shuō)明 | |
---|---|---|
選擇 | IF-THEN語(yǔ)句 | 用將程序執(zhí)行轉(zhuǎn)移到兩個(gè)備選分支之一(取決于條件為 True 還是 False) |
CASE語(yǔ)句 | 用于選擇執(zhí)行 n 個(gè)備選分支之一(取決于變量值) | |
循環(huán) | FOR語(yǔ)句 | 只要控制變量在指定值范圍內(nèi),就重復(fù)執(zhí)行某一語(yǔ)句序列 |
WHILE-DO語(yǔ)句 | 只要仍滿足執(zhí)行條件,就重復(fù)執(zhí)行某一語(yǔ)句序列 | |
REPEAT-UNTIL語(yǔ)句 | 重復(fù)執(zhí)行某一語(yǔ)句序列,直到滿足終止條件為止 | |
程序跳轉(zhuǎn) | CONTINUE語(yǔ)句 | 停止執(zhí)行當(dāng)前循環(huán)迭代 |
EXIT語(yǔ)句 | 無(wú)論是否滿足終止條件,都會(huì)隨時(shí)退出循環(huán) | |
GOTO語(yǔ)句 | 使程序立即跳轉(zhuǎn)到指定標(biāo)簽 | |
RETURN語(yǔ)句 | 使程序立刻退出正在執(zhí)行的塊,返回到調(diào)用塊 |
程序控制指令是SCL編程的基礎(chǔ),接近高級(jí)語(yǔ)言的指令,雖然這些功能通過(guò)LAD/FBD也可以實(shí)現(xiàn),但使用SCL編寫會(huì)更加方便,邏輯條理也更加清晰。
IF:條件執(zhí)行
說(shuō)明:使用"條件執(zhí)行"指令,可以根據(jù)條件控制程序流的分支。該條件是結(jié)果為布爾值(True 或 False)的表達(dá)式??梢詫ool變量、邏輯表達(dá)式或比較表達(dá)式作為條件。
執(zhí)行該條件執(zhí)行指令時(shí),將對(duì)指定的表達(dá)式進(jìn)行運(yùn)算。如果表達(dá)式的值為 True,則表示滿足該條件;如果其值為 False,則表示不滿足該條件。
根據(jù)分支的類型,可以對(duì)以下形式的指令進(jìn)行編程:
IF...THEN... 分支:
IF <條件>
THEN <語(yǔ)句1>
END_IF;
圖4 IF...THEN... 分支
如果滿足該條件,則將執(zhí)行 THEN 后編寫的指令。如果不滿足該條件,則程序?qū)?END_IF 后的下一條指令開(kāi)始繼續(xù)執(zhí)行。
IF...THEN... ELSE...分支:
IF <條件>
THEN <語(yǔ)句1>
ELSE <語(yǔ)句2>
END_IF;
圖5 IF...THEN... ELSE...分支
如果滿足該條件,則將執(zhí)行 THEN 后編寫的語(yǔ)句。如果不滿足該條件,則將執(zhí)行 ELSE 后編寫的語(yǔ)句。不論執(zhí)行哪一個(gè)語(yǔ)句,之后都將從 END_IF 后的下一條指令開(kāi)始繼續(xù)執(zhí)行。
IF...THEN... ELSIF...分支:
IF <條件1>
THEN <語(yǔ)句1>
ELSIF <條件2>
THEN <語(yǔ)句2>
END_IF;
圖6 IF...THEN... ELSIF...分支
如果滿足條件1,則將執(zhí)行 THEN 后的語(yǔ)句1,執(zhí)行這些語(yǔ)句后,程序?qū)?END_IF 后繼續(xù)執(zhí)行。
如果不滿足條件1,則將檢查條件2。如果滿足條件2,則將執(zhí)行 THEN 后的語(yǔ)句2。執(zhí)行這些語(yǔ)句后,程序?qū)?END_IF 后繼續(xù)執(zhí)行。
如果不滿足任何條件,則直接執(zhí)行 END_IF 后的程序部分。
在 IF 指令內(nèi)可以嵌套任意多個(gè) ELSIF 和 THEN 組合。可以選擇對(duì) ELSE 分支進(jìn)行編程。
參數(shù)
下表列出了該指令的參數(shù):
參數(shù) | 數(shù)據(jù)類型 | 存儲(chǔ)區(qū) | 說(shuō)明 |
---|---|---|---|
<條件> | BOOL | I、Q、M、D、L | 待求值的表達(dá)式。 |
<語(yǔ)句> | - | 在滿足條件時(shí),要執(zhí)行THEN后的語(yǔ)句。如果不滿足條件,則執(zhí)行 ELSE 后編寫的語(yǔ)句。 |
示例
圖7 IF示例
下表展示了不同的操作數(shù)數(shù)值對(duì)目標(biāo)變量的影響:
操作數(shù) | 值 | |||
---|---|---|---|---|
"Tag_1" | True | False | False | False |
"Tag_2" | False | True | False | False |
"Tag_3" | False | False | True | False |
"Tag_Value" | 10 | 20 | 30 | 0 |
CASE:創(chuàng)建多路分支
說(shuō)明:使用"創(chuàng)建多路分支"指令,可以根據(jù)數(shù)字表達(dá)式的值執(zhí)行多個(gè)指令序列中的一個(gè)。
按如下方式聲明此指令:
CASE <變量> OF
<常數(shù)1>: <語(yǔ)句1>;
<常數(shù)2>: <語(yǔ)句2>;
......
<常數(shù)n>: <語(yǔ)句n>;
ELSE <語(yǔ)句>;
END_CASE;
圖8 CASE語(yǔ)句
參數(shù)
下表列出了該指令的參數(shù):
參數(shù) | 數(shù)據(jù)類型 | 存儲(chǔ)區(qū) | 說(shuō)明 |
---|---|---|---|
<變量> | 整數(shù)、位序列* | I、Q、M、D、L | 與設(shè)定的常數(shù)值進(jìn)行比較的值。 |
<常數(shù)> | 位序列 | - |
若為位序列,則常數(shù)可以為以下值: 二進(jìn)制數(shù)(例如,2#10) 八進(jìn)制數(shù)(例如,8#77) 十六進(jìn)制數(shù)(例如,16#AD) 未定型的常數(shù)(例如,1000) |
整數(shù) |
作為指令序列執(zhí)行條件的常數(shù)值。常數(shù)可以為以下值: 整數(shù)(例如,5) 整數(shù)范圍(例如,15 到 20) 由整數(shù)和范圍組成的枚舉(例如,10、11、15 到 20) |
||
<語(yǔ)句> | - | - | 當(dāng)表達(dá)式的值等于某個(gè)常數(shù)值時(shí),將執(zhí)行該常數(shù)后的各種指令。如果不滿足條件,則執(zhí)行 ELSE 后編寫的指令。如果兩個(gè)值不相等,則執(zhí)行這些指令。 |
* TIA PORTAL V16開(kāi)始支持位序列數(shù)據(jù)類型的變量
示例
圖9 CASE示例
下表展示了不同的操作數(shù)數(shù)值對(duì)目標(biāo)變量的影響:
操作數(shù) | 值 | ||||
---|---|---|---|---|---|
"Tag_Value" | 0 | 1,3,5 | 6,7,8,9,10 | 16,17,20,21,22,23,24,25 | 其他 |
"Tag_1" | 1 | - | - | - | - |
"Tag_2" | - | 1 | - | - | - |
"Tag_3" | - | - | 1 | - | - |
"Tag_4" | - | - | - | 1 | - |
"Tag_5" | - | - | - | - | 1 |
FOR:在計(jì)數(shù)循環(huán)中執(zhí)行
說(shuō)明:使用"在計(jì)數(shù)循環(huán)中執(zhí)行"指令,重復(fù)執(zhí)行程序循環(huán),直至運(yùn)行變量不在指定的取值范圍內(nèi)。
也可以嵌套程序循環(huán)。在程序循環(huán)內(nèi),可以編寫包含其它運(yùn)行變量的其它程序循環(huán)。
通過(guò)指令"復(fù)查循環(huán)條件"(Continue),可以終止當(dāng)前正在運(yùn)行的程序循環(huán)。通過(guò)指令"立即退出循環(huán)"(Exit)終止整個(gè)循環(huán)的執(zhí)行。
注意:
有關(guān)運(yùn)行次數(shù)和運(yùn)行變量的信息:
程序運(yùn)行時(shí)無(wú)法更改運(yùn)行次數(shù)。出于性能原因,應(yīng)在塊接口的"Temp"部分中聲明運(yùn)行變量。在循環(huán)中,該運(yùn)行變量無(wú)法更改。
按如下方式聲明此指令:
FOR <運(yùn)行變量> := <起始值> TO <結(jié)束值> BY <增量> DO
<語(yǔ)句>;
END_FOR;
如果增量為1,可以簡(jiǎn)寫為:
FOR <運(yùn)行變量> := <起始值> TO <結(jié)束值> DO
<語(yǔ)句>;
END_FOR;
圖10 FOR語(yǔ)句
下表列出了該指令的參數(shù):
參數(shù) | 數(shù)據(jù)類型 | 存儲(chǔ)區(qū) | 說(shuō)明 |
---|---|---|---|
<運(yùn)行變量> | 有符號(hào)整數(shù)、無(wú)符號(hào)整數(shù)* | I、Q、M、D、L | 執(zhí)行循環(huán)時(shí)會(huì)計(jì)算其值的操作數(shù)。執(zhí)行變量的數(shù)據(jù)類型將確定其它參數(shù)的數(shù)據(jù)類型。 |
<起始值> | I、Q、M、D、L | 表達(dá)式,在運(yùn)行變量首次執(zhí)行循環(huán)時(shí),將為運(yùn)行變量分配該表達(dá)式的值。 | |
<結(jié)束值> | I、Q、M、D、L |
表達(dá)式,在運(yùn)行程序最后一次循環(huán)時(shí)會(huì)為運(yùn)行變量分配該表達(dá)式的值。在每個(gè)循環(huán)后都會(huì)檢查運(yùn)行變量的值: 未達(dá)到結(jié)束值: 執(zhí)行符合 DO 的語(yǔ)句 達(dá)到結(jié)束值: 最后執(zhí)行一次 FOR 語(yǔ)句 超出結(jié)束值: 完成 FOR 循環(huán) 執(zhí)行該指令期間,不允許更改結(jié)束值。 |
|
<增量> | I、Q、M、D、L |
表達(dá)式,根據(jù)增量表達(dá)式的值,執(zhí)行變量在每次循環(huán)后都會(huì)遞增(正增量)或遞減(負(fù)增量)自身變量值。 如果未指定增量,則在每次循環(huán)后執(zhí)行變量的值加 1。 執(zhí)行該指令期間,不允許更改增量。 |
|
<語(yǔ)句> | - | 只要運(yùn)行變量的值在取值范圍內(nèi),每次循環(huán)都就會(huì)執(zhí)行的語(yǔ)句。取值范圍由起始值和結(jié)束值定義。 |
*TIA PORTAL V16開(kāi)始支持無(wú)符號(hào)整數(shù)類型的變量
示例
圖11 FOR示例
Tag_Value 操作數(shù)乘以b_array 數(shù)組變量的元素 (2, 4, 6, 8)。并將計(jì)算結(jié)果讀入到a_array 數(shù)組變量的元素 (2, 4, 6, 8) 中。
下表展示了給定 Tag_Value 與 b_array[i] 的值得到 a_array[i] 的結(jié)果:
設(shè)定 | Tag_Value | |||
值 | 5 | |||
設(shè)定 | b_array[2] | b_array[4] | b_array[6] | b_array[8] |
值 | 3 | 5 | 7 | 9 |
結(jié)果 | a_array[2] | a_array[4] | a_array[6] | a_array[8] |
值 | 15 | 25 | 35 | 45 |
WHILE:滿足條件時(shí)執(zhí)行
說(shuō)明:使用"滿足條件時(shí)執(zhí)行"指令可以重復(fù)執(zhí)行程序循環(huán),直至不滿足執(zhí)行條件為止。該條件是結(jié)果為布爾值(True 或 False)的表達(dá)式。可以將邏輯表達(dá)式或比較表達(dá)式作為條件。
執(zhí)行該指令時(shí),將對(duì)指定的表達(dá)式進(jìn)行運(yùn)算。如果表達(dá)式的值為 True,則表示滿足該條件;如果其值為 False,則表示不滿足該條件。
也可以嵌套程序循環(huán)。在程序循環(huán)內(nèi),可以編寫包含其它運(yùn)行變量的其它程序循環(huán)。
通過(guò)指令"復(fù)查循環(huán)條件"(Continue),可以終止當(dāng)前連續(xù)運(yùn)行的程序循環(huán)。通過(guò)指令"立即退出循環(huán)"(Exit)終止整個(gè)循環(huán)的執(zhí)行。
可按如下方式聲明此指令:
WHILE <條件>
DO <語(yǔ)句>;
END_WHILE;
圖12 WHILE語(yǔ)句
參數(shù)
下表列出了該指令的參數(shù):
參數(shù) | 數(shù)據(jù)類型 | 存儲(chǔ)區(qū) | 說(shuō)明 |
---|---|---|---|
<條件> | BOOL | I、Q、M、D、L | 表達(dá)式,每次執(zhí)行循環(huán)之前都需要進(jìn)行求值。 |
<語(yǔ)句> | - | 在滿足條件時(shí),要執(zhí)行的語(yǔ)句。如果不滿足條件,則程序?qū)?END_WHILE 后繼續(xù)執(zhí)行。 |
示例
圖13 WHILE示例
下表展示了循環(huán)初始和循環(huán)結(jié)束時(shí)變量值的變化
初始 | 循環(huán)結(jié)束 | |
Tag_2 | 5 | |
Tag_1 | 0 | 5 |
REPEAT:不滿足條件時(shí)執(zhí)行
說(shuō)明:使用"不滿足條件時(shí)執(zhí)行"指令可以重復(fù)執(zhí)行程序循環(huán),直至不滿足執(zhí)行條件為止。該條件是結(jié)果為布爾值(True 或 False)的表達(dá)式??梢詫⑦壿嫳磉_(dá)式或比較表達(dá)式作為條件。
執(zhí)行該指令時(shí),將對(duì)指定的表達(dá)式進(jìn)行運(yùn)算。如果表達(dá)式的值為 True,則表示滿足該條件;如果其值為 False,則表示不滿足該條件。
即使?jié)M足終止條件,至少也會(huì)執(zhí)行一次循環(huán)內(nèi)的語(yǔ)句。
也可以嵌套程序循環(huán)。在程序循環(huán)內(nèi),可以編寫包含其它運(yùn)行變量的其它程序循環(huán)。
通過(guò)指令"復(fù)查循環(huán)條件"(Continue),可以終止當(dāng)前連續(xù)運(yùn)行的程序循環(huán)。通過(guò)指令"立即退出循環(huán)"(Exit)終止整個(gè)循環(huán)的執(zhí)行。
可按如下方式聲明此指令:
REPEAT <語(yǔ)句>;
UNTIL <條件>
END_REPEAT;
圖14 REPEAT語(yǔ)句
參數(shù)
下表列出了該指令的參數(shù):
參數(shù) | 數(shù)據(jù)類型 | 存儲(chǔ)區(qū) | 說(shuō)明 |
---|---|---|---|
<語(yǔ)句> | - | 在設(shè)定條件的值為 False 時(shí)執(zhí)行的指令。即使?jié)M足終止條件,此指令也執(zhí)行一次。 | |
<條件> | BOOL | I、Q、M、D、L | 表達(dá)式,每次執(zhí)行循環(huán)之后都需要進(jìn)行求值。如果表達(dá)式的值為 False,則將再次執(zhí)行程序循環(huán)。如果表達(dá)式的值為 True,則程序循環(huán)將從 END_REPEAT 后繼續(xù)執(zhí)行。 |
示例
圖15 REPEAT示例
下表展示了循環(huán)初始和循環(huán)結(jié)束時(shí)變量值的變化
初始 | 循環(huán)結(jié)束 | |
Tag_2 | 5 | |
Tag_1 | 0 | 6 |
CONTINUE:復(fù)查循環(huán)條件
說(shuō)明:使用"復(fù)查循環(huán)條件"指令,可以結(jié)束 FOR、WHILE 或 REPEAT 循環(huán)的當(dāng)前程序運(yùn)行。
執(zhí)行該指令后,將再次計(jì)算繼續(xù)執(zhí)行程序循環(huán)的條件。該指令將影響其所在的程序循環(huán)。
圖16 CONTINUE用在FOR循環(huán)
圖17 CONTINUE用在WHILE循環(huán)
圖18 CONTINUE用在REPEAT循環(huán)
示例
圖19 CONTINUE示例
下表展示了計(jì)算結(jié)果:
變量 | 計(jì)算結(jié)果 |
"DB10".Test[0] | - |
"DB10".Test[1] | - |
"DB10".Test[2] | - |
"DB10".Test[3] | - |
"DB10".Test[4] | - |
"DB10".Test[5] | 1 |
"DB10".Test[6] | 1 |
"DB10".Test[7] | 1 |
如果滿足條件 i < 5,則不執(zhí)行后續(xù)值分配 ("DB10".Test[i] := 1)。運(yùn)行變量 (i) 以增量"1"遞增,然后檢查其當(dāng)前值是否在設(shè)定的循環(huán)取值范圍內(nèi)。如果執(zhí)行變量在循環(huán)取值范圍內(nèi),則將再次計(jì)算 IF 的條件。
如果不滿足條件 i < 5,則將執(zhí)行后續(xù)值分配 ("DB10".Test[i] := 1) 并開(kāi)始一個(gè)新循環(huán)。在這種情況下,執(zhí)行變量也會(huì)以增量"1"進(jìn)行遞增并接受檢查。
EXIT:立即退出循環(huán)
說(shuō)明:使用"立即退出循環(huán)"指令,可以隨時(shí)取消 FOR、WHILE 或 REPEAT 循環(huán)的執(zhí)行,而無(wú)需考慮是否滿足條件,并在循環(huán)結(jié)束(END_FOR、END_WHILE 或 END_REPEAT)后繼續(xù)執(zhí)行程序。
該指令將影響其所在的程序循環(huán)。
圖20 EXIT語(yǔ)句
示例
圖21 EXIT示例
下表展示了計(jì)算結(jié)果:
變量 | 計(jì)算結(jié)果 |
"DB10".Test[0] | 1 |
"DB10".Test[1] | 1 |
"DB10".Test[2] | 1 |
"DB10".Test[3] | 1 |
"DB10".Test[4] | 1 |
"DB10".Test[5] | 1 |
"DB10".Test[6] | - |
"DB10".Test[7] | - |
如果滿足條件 i > 5,則將取消循環(huán)執(zhí)行。程序?qū)?END_FOR 后繼續(xù)執(zhí)行。
如果不滿足條件 i <= 5,則將執(zhí)行后續(xù)值分配 ("DB10".Test[i] :=1) 并開(kāi)始一個(gè)新循環(huán)。將運(yùn)行變量 (i) 以 1 進(jìn)行遞增,并進(jìn)行檢查該變量的當(dāng)前值是否在程序中設(shè)定的循環(huán)取值范圍之內(nèi)。如果執(zhí)行變量 (i) 在循環(huán)取值范圍內(nèi),則將再次計(jì)算 IF 的條件。
GOTO:跳轉(zhuǎn)
說(shuō)明:使用"跳轉(zhuǎn)"指令,可以從標(biāo)注為跳轉(zhuǎn)標(biāo)簽的指定點(diǎn)開(kāi)始繼續(xù)執(zhí)行程序。
跳轉(zhuǎn)標(biāo)簽和"跳轉(zhuǎn)"指令必須在同一個(gè)塊中。在一個(gè)塊中,跳轉(zhuǎn)標(biāo)簽的名稱只能指定一次。每個(gè)跳轉(zhuǎn)標(biāo)簽可以是多個(gè)跳轉(zhuǎn)指令的目標(biāo)。不允許從"外部"跳轉(zhuǎn)到程序循環(huán)內(nèi),但允許從循環(huán)內(nèi)跳轉(zhuǎn)到"外部"。
注意:
LAD/FBD語(yǔ)言內(nèi)的SCL段,不能使用GOTO指令。
跳轉(zhuǎn)標(biāo)簽遵循以下語(yǔ)法規(guī)則:
字母(a 至 z,A 至 Z)
字母和數(shù)字組合;請(qǐng)必須字母為開(kāi)始
可按如下方式聲明此指令:
GOTO <跳轉(zhuǎn)標(biāo)簽>;
...
<跳轉(zhuǎn)標(biāo)簽>: <語(yǔ)句>
示例
圖22 GOTO示例
下表展示了每個(gè)操作數(shù)數(shù)值對(duì)目標(biāo)變量的變化影響:
操作數(shù) | 值 | |||||||
Tag_Value | 1 | 2 | 3 | 其他 | ||||
初始值 | 結(jié)束值 | 初始值 | 結(jié)束值 | 初始值 | 結(jié)束值 | 初始值 | 結(jié)束值 | |
Tag_1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
Tag_2 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
Tag_3 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
Tag_4 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
根據(jù)"Tag_Value"操作數(shù)的值,程序?qū)膶?duì)應(yīng)的跳轉(zhuǎn)標(biāo)簽標(biāo)識(shí)點(diǎn)開(kāi)始繼續(xù)執(zhí)行。例如,如果"Tag_Value"操作數(shù)的值為 2,則程序?qū)奶D(zhuǎn)標(biāo)簽"MyLABEL2"開(kāi)始繼續(xù)執(zhí)行。在這種情況下,將跳過(guò)"MyLABEL1"跳轉(zhuǎn)標(biāo)簽所標(biāo)識(shí)的程序行。
RETURN:退出塊
說(shuō)明:使用"退出塊"指令,可以終止當(dāng)前處理塊中的程序執(zhí)行,并在調(diào)用塊中繼續(xù)執(zhí)行。
如果該指令出現(xiàn)在塊結(jié)尾處,則可以跳過(guò)。
圖23 RETURN語(yǔ)句
示例
圖24 RETURN示例
如果"Tag_Error"操作數(shù)的信號(hào)狀態(tài)不為 0,則將終止當(dāng)前處理塊中的程序執(zhí)行。
-
西門子
+關(guān)注
關(guān)注
94文章
3055瀏覽量
116143 -
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1947瀏覽量
34847 -
SCL
+關(guān)注
關(guān)注
1文章
239瀏覽量
17115
原文標(biāo)題:西門子SCL語(yǔ)言編程,常用指令介紹
文章出處:【微信號(hào):xue_PLC,微信公眾號(hào):PLC技術(shù)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論