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