一份結構化文本 (Structured Text, ST) 語言(根據 IEC 61131‐3 標準)的常用關鍵字 - benchen2001/matiec GitHub Wiki
好的,這是一份結構化文本 (Structured Text, ST) 語言(根據 IEC 61131-3 標準)的常用關鍵字、用途說明以及相關的標準功能或功能區塊列表。
請注意,不同的 PLC 廠商可能會在標準基礎上提供額外的關鍵字或功能,這裡主要列出 IEC 61131-3 標準中定義的核心部分。
I. 程式組織單元 (POU - Program Organization Units)
-
PROGRAM
...END_PROGRAM
- 用途: 定義一個程式的主體。程式是 PLC 執行的基本單位,通常會週期性地被掃描執行。
- 對應 Function: 無直接對應 Function,這是組織結構。
-
FUNCTION_BLOCK
...END_FUNCTION_BLOCK
- 用途: 定義一個功能區塊。功能區塊是有內部狀態(記憶體)的可重用程式碼單元。每次實例化(Instance)時,它會保留自己的變數值。
-
對應 Function/FB: 定義了可被調用的功能區塊,例如標準庫中的
TON
,TOF
,TP
,CTU
,CTD
,CTUD
,R_TRIG
,F_TRIG
,SR
,RS
等都是用類似概念實現的標準功能區塊。
-
FUNCTION
...END_FUNCTION
- 用途: 定義一個函數。函數是沒有內部狀態(記憶體)的可重用程式碼單元。每次調用時,給定相同的輸入會得到相同的輸出,執行完畢後內部變數不保留。函數必須返回一個值。
-
對應 Function: 定義了可被調用的函數,例如標準庫中的
ABS
,SQRT
,SIN
,COS
,LEN
,CONCAT
,MAX
,MIN
,LIMIT
,SEL
,MUX
以及大量的類型轉換函數(如INT_TO_REAL
,BOOL_TO_STRING
等)都是標準函數。
II. 變數宣告區段 (Variable Declaration Sections)
(這些關鍵字通常成對出現,定義一個宣告區塊)
-
VAR
...END_VAR
-
用途: 宣告標準內部變數。在
PROGRAM
中是程式變數,在FUNCTION_BLOCK
中是靜態變數(實例記憶體),在FUNCTION
中是臨時變數(但通常建議用VAR_TEMP
)。 - 對應 Function: 無。
-
用途: 宣告標準內部變數。在
-
VAR_INPUT
...END_VAR
-
用途: 在
FUNCTION_BLOCK
或FUNCTION
中宣告輸入變數。這些變數的值由調用者傳入。 - 對應 Function: 無。
-
用途: 在
-
VAR_OUTPUT
...END_VAR
-
用途: 在
FUNCTION_BLOCK
或FUNCTION
中宣告輸出變數。這些變數的值由 POU 內部計算產生,並可被調用者讀取。 - 對應 Function: 無。
-
用途: 在
-
VAR_IN_OUT
...END_VAR
-
用途: 在
FUNCTION_BLOCK
或FUNCTION
中宣告輸入/輸出變數(傳址/引用)。POU 可以讀取和修改這些變數,修改會直接影響到調用者傳入的原始變數。 - 對應 Function: 無。
-
用途: 在
-
VAR_GLOBAL
...END_VAR
- 用途: 宣告全域變數。這些變數在整個專案或特定範圍內可見和存取。
- 對應 Function: 無。
-
VAR_EXTERNAL
...END_VAR
- 用途: 在 POU 中宣告對已定義的全域變數的存取。它本身不建立變數,只是引用外部已存在的全域變數。
- 對應 Function: 無。
-
VAR_TEMP
...END_VAR
-
用途: 宣告臨時變數。這些變數只在 POU 單次執行期間存在,用於中間計算,執行完畢後值不保留。常用於
FUNCTION
。 - 對應 Function: 無。
-
用途: 宣告臨時變數。這些變數只在 POU 單次執行期間存在,用於中間計算,執行完畢後值不保留。常用於
-
VAR CONSTANT
...END_VAR
- 用途: 宣告常數。其值在編譯時確定且不能在程式執行時修改。
- 對應 Function: 無。
-
RETAIN
/NON_RETAIN
-
用途: 變數屬性修飾詞,放在
VAR
...END_VAR
區塊內變數宣告之後。RETAIN
表示變數值在 PLC 電源關閉再開啟後應保持其最後的值(需硬體支援)。NON_RETAIN
是預設值,表示斷電後值會丟失或恢復為初始值。 - 對應 Function: 無。
-
用途: 變數屬性修飾詞,放在
-
AT
-
用途: 用於將變數直接定位到特定的記憶體位址或 I/O 位址 (例如
%IX0.0
,%QB4
)。通常在VAR_GLOBAL
或VAR
區塊中使用。 - 對應 Function: 無。
-
用途: 用於將變數直接定位到特定的記憶體位址或 I/O 位址 (例如
III. 資料類型關鍵字 (Data Types)
-
基本資料類型:
-
BOOL
: 布林 (TRUE/FALSE) -
BYTE
: 8 位元無符號整數 -
WORD
: 16 位元無符號整數 -
DWORD
: 32 位元無符號整數 -
LWORD
: 64 位元無符號整數 -
SINT
: 8 位元有符號整數 -
INT
: 16 位元有符號整數 -
DINT
: 32 位元有符號整數 -
LINT
: 64 位元有符號整數 -
USINT
: 8 位元無符號整數 (同 BYTE) -
UINT
: 16 位元無符號整數 (同 WORD) -
UDINT
: 32 位元無符號整數 (同 DWORD) -
ULINT
: 64 位元無符號整數 (同 LWORD) -
REAL
: 32 位元浮點數 -
LREAL
: 64 位元浮點數 -
TIME
: 時間長度 (例如 T#5s, T#1m30s) -
DATE
: 日期 (例如 D#2023-10-27) -
TIME_OF_DAY
(或TOD
): 一天中的時間 (例如 TOD#14:30:00) -
DATE_AND_TIME
(或DT
): 日期和時間 (例如 DT#2023-10-27-14:30:00) -
STRING
: 字串 -
WSTRING
: 寬字串 (Unicode) - 用途: 定義變數可以儲存的資料種類。
-
對應 Function: 有大量的類型轉換函數,例如
BOOL_TO_INT
,INT_TO_REAL
,REAL_TO_STRING
,STRING_TO_TIME
等等。
-
-
TYPE
...END_TYPE
- 用途: 定義使用者自訂的資料類型,通常用於定義結構 (STRUCT) 或列舉 (ENUM)。
- 對應 Function: 無。
-
STRUCT
...END_STRUCT
-
用途: 在
TYPE
區塊內定義一個結構體,將多個不同類型的變數組合成一個單一的資料類型。 - 對應 Function: 無。
-
用途: 在
-
ARRAY [...] OF
- 用途: 定義一個陣列,包含指定範圍和類型的多個元素。
- 對應 Function: 無。
IV. 流程控制關鍵字 (Control Flow)
-
IF
...THEN
...END_IF
-
用途: 條件判斷。如果
IF
後的布林表達式為TRUE
,則執行THEN
和END_IF
之間的程式碼。 -
對應 Function:
SEL
(選擇函數:SEL(G, IN0, IN1)
,如果 G 為 FALSE 輸出 IN0,如果 G 為 TRUE 輸出 IN1)。
-
用途: 條件判斷。如果
-
ELSIF
...THEN
-
用途: 在
IF
結構中添加額外的條件判斷。如果前面的IF
或ELSIF
條件為FALSE
,則檢查這個ELSIF
的條件。 -
對應 Function: 無直接對應,但
CASE
結構或多個SEL
可以實現類似邏輯。
-
用途: 在
-
ELSE
-
用途: 在
IF
或CASE
結構中,如果所有前面的條件都為FALSE
,則執行ELSE
和END_IF
/END_CASE
之間的程式碼。 - 對應 Function: 無。
-
用途: 在
-
CASE
...OF
...END_CASE
- 用途: 多重選擇結構。根據一個整數或列舉變數的值,選擇執行對應分支的程式碼。
-
對應 Function:
MUX
(多路選擇器:MUX(K, IN0, IN1, ..., INn)
,根據 K 的值選擇輸出 IN0 到 INn 中的一個)。
-
FOR
...TO
...BY
...DO
...END_FOR
-
用途: 計數迴圈。重複執行
DO
和END_FOR
之間的程式碼,計數器變數從初始值變化到結束值,可選BY
指定步長(預設為 1)。 - 對應 Function: 無。
-
用途: 計數迴圈。重複執行
-
WHILE
...DO
...END_WHILE
-
用途: 條件前測試迴圈。只要
WHILE
後的布林表達式為TRUE
,就重複執行DO
和END_WHILE
之間的程式碼。如果一開始條件就為FALSE
,則一次也不執行。 - 對應 Function: 無。
-
用途: 條件前測試迴圈。只要
-
REPEAT
...UNTIL
...END_REPEAT
-
用途: 條件後測試迴圈。先執行一次
REPEAT
和UNTIL
之間的程式碼,然後檢查UNTIL
後的布林表達式。如果為FALSE
,則重複執行,直到表達式變為TRUE
。保證至少執行一次。 - 對應 Function: 無。
-
用途: 條件後測試迴圈。先執行一次
-
EXIT
-
用途: 立即跳出當前所在的迴圈結構 (
FOR
,WHILE
,REPEAT
)。 - 對應 Function: 無。
-
用途: 立即跳出當前所在的迴圈結構 (
-
RETURN
-
用途: 立即結束當前 POU (
PROGRAM
,FUNCTION_BLOCK
,FUNCTION
) 的執行。在FUNCTION
中,通常在此之前會給函數的返回值賦值。 - 對應 Function: 無。
-
用途: 立即結束當前 POU (
-
CONTINUE
- 用途: (注意:此關鍵字並非 IEC 61131-3 原始標準的一部分,但在很多現代 PLC 系統中被支援) 跳過當前迴圈的剩餘部分,直接進入下一次迴圈的判斷或迭代。
- 對應 Function: 無。
V. 運算符 (Operators)
雖然不是嚴格意義上的 "關鍵字",但它們是 ST 語法的核心部分。
-
:=
- 用途: 賦值運算符。將右側表達式的值賦給左側的變數。
- 對應 Function: 無。
-
算術運算符:
+
,-
,*
,/
,MOD
(取模)- 用途: 執行數學運算。
-
對應 Function:
ADD
,SUB
,MUL
,DIV
,MOD
(有些系統提供函數形式),ABS
,SQRT
,EXP
,LN
,LOG
,SIN
,COS
,TAN
,ASIN
,ACOS
,ATAN
等數學函數。
-
比較運算符:
=
,<>
,<
,>
,<=
,>=
-
用途: 比較兩個值,結果為
BOOL
。 -
對應 Function:
EQ
(=),NE
(<>),LT
(<),GT
(>),LE
(<=),GE
(>=) (有些系統提供函數形式),LIMIT
(檢查是否在範圍內),MAX
,MIN
。
-
用途: 比較兩個值,結果為
-
邏輯運算符:
AND
(或&
),OR
,XOR
,NOT
- 用途: 執行布林邏輯運算。
-
對應 Function:
AND
,OR
,XOR
,NOT
(也可作為函數)。
-
位元運算符:
AND
(或&
),OR
,XOR
,NOT
- 用途: 對整數類型進行位元操作 (與邏輯運算符共用關鍵字,根據操作數類型區分)。
-
對應 Function:
SHL
(左移),SHR
(右移),ROL
(循環左移),ROR
(循環右移)。
VI. 其他
-
()
- 用途: 函數/功能區塊調用時包圍參數列表;改變運算優先級。
- 對應 Function: 無。
-
[]
- 用途: 存取陣列元素。
- 對應 Function: 無。
-
.
- 用途: 存取結構體 (STRUCT) 的成員;存取功能區塊實例的輸入/輸出/內部變數。
- 對應 Function: 無。
-
註解:
- : 單行註解 (很多系統支援,但非原始標準)
-
(*
...*)
: 多行註解 (標準) - 用途: 添加程式說明,不影響程式執行。
- 對應 Function: 無。
這個列表涵蓋了 IEC 61131-3 ST 語言中最核心和常用的關鍵字及其用途。實際應用中,請參考您所使用的具體 PLC 平台的編程手冊,以了解其支援的完整關鍵字集和標準庫功能。