一份結構化文本 (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)

  1. PROGRAM ... END_PROGRAM

    • 用途: 定義一個程式的主體。程式是 PLC 執行的基本單位,通常會週期性地被掃描執行。
    • 對應 Function: 無直接對應 Function,這是組織結構。
  2. FUNCTION_BLOCK ... END_FUNCTION_BLOCK

    • 用途: 定義一個功能區塊。功能區塊是有內部狀態(記憶體)的可重用程式碼單元。每次實例化(Instance)時,它會保留自己的變數值。
    • 對應 Function/FB: 定義了可被調用的功能區塊,例如標準庫中的 TON, TOF, TP, CTU, CTD, CTUD, R_TRIG, F_TRIG, SR, RS 等都是用類似概念實現的標準功能區塊。
  3. 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)

(這些關鍵字通常成對出現,定義一個宣告區塊)

  1. VAR ... END_VAR

    • 用途: 宣告標準內部變數。在 PROGRAM 中是程式變數,在 FUNCTION_BLOCK 中是靜態變數(實例記憶體),在 FUNCTION 中是臨時變數(但通常建議用 VAR_TEMP)。
    • 對應 Function: 無。
  2. VAR_INPUT ... END_VAR

    • 用途: 在 FUNCTION_BLOCKFUNCTION 中宣告輸入變數。這些變數的值由調用者傳入。
    • 對應 Function: 無。
  3. VAR_OUTPUT ... END_VAR

    • 用途: 在 FUNCTION_BLOCKFUNCTION 中宣告輸出變數。這些變數的值由 POU 內部計算產生,並可被調用者讀取。
    • 對應 Function: 無。
  4. VAR_IN_OUT ... END_VAR

    • 用途: 在 FUNCTION_BLOCKFUNCTION 中宣告輸入/輸出變數(傳址/引用)。POU 可以讀取和修改這些變數,修改會直接影響到調用者傳入的原始變數。
    • 對應 Function: 無。
  5. VAR_GLOBAL ... END_VAR

    • 用途: 宣告全域變數。這些變數在整個專案或特定範圍內可見和存取。
    • 對應 Function: 無。
  6. VAR_EXTERNAL ... END_VAR

    • 用途: 在 POU 中宣告對已定義的全域變數的存取。它本身不建立變數,只是引用外部已存在的全域變數。
    • 對應 Function: 無。
  7. VAR_TEMP ... END_VAR

    • 用途: 宣告臨時變數。這些變數只在 POU 單次執行期間存在,用於中間計算,執行完畢後值不保留。常用於 FUNCTION
    • 對應 Function: 無。
  8. VAR CONSTANT ... END_VAR

    • 用途: 宣告常數。其值在編譯時確定且不能在程式執行時修改。
    • 對應 Function: 無。
  9. RETAIN / NON_RETAIN

    • 用途: 變數屬性修飾詞,放在 VAR...END_VAR 區塊內變數宣告之後。RETAIN 表示變數值在 PLC 電源關閉再開啟後應保持其最後的值(需硬體支援)。NON_RETAIN 是預設值,表示斷電後值會丟失或恢復為初始值。
    • 對應 Function: 無。
  10. AT

    • 用途: 用於將變數直接定位到特定的記憶體位址或 I/O 位址 (例如 %IX0.0, %QB4)。通常在 VAR_GLOBALVAR 區塊中使用。
    • 對應 Function: 無。

III. 資料類型關鍵字 (Data Types)

  1. 基本資料類型:

    • 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 等等。
  2. TYPE ... END_TYPE

    • 用途: 定義使用者自訂的資料類型,通常用於定義結構 (STRUCT) 或列舉 (ENUM)。
    • 對應 Function: 無。
  3. STRUCT ... END_STRUCT

    • 用途: 在 TYPE 區塊內定義一個結構體,將多個不同類型的變數組合成一個單一的資料類型。
    • 對應 Function: 無。
  4. ARRAY [...] OF

    • 用途: 定義一個陣列,包含指定範圍和類型的多個元素。
    • 對應 Function: 無。

IV. 流程控制關鍵字 (Control Flow)

  1. IF ... THEN ... END_IF

    • 用途: 條件判斷。如果 IF 後的布林表達式為 TRUE,則執行 THENEND_IF 之間的程式碼。
    • 對應 Function: SEL (選擇函數:SEL(G, IN0, IN1),如果 G 為 FALSE 輸出 IN0,如果 G 為 TRUE 輸出 IN1)。
  2. ELSIF ... THEN

    • 用途: 在 IF 結構中添加額外的條件判斷。如果前面的 IFELSIF 條件為 FALSE,則檢查這個 ELSIF 的條件。
    • 對應 Function: 無直接對應,但 CASE 結構或多個 SEL 可以實現類似邏輯。
  3. ELSE

    • 用途: 在 IFCASE 結構中,如果所有前面的條件都為 FALSE,則執行 ELSEEND_IF/END_CASE 之間的程式碼。
    • 對應 Function: 無。
  4. CASE ... OF ... END_CASE

    • 用途: 多重選擇結構。根據一個整數或列舉變數的值,選擇執行對應分支的程式碼。
    • 對應 Function: MUX (多路選擇器:MUX(K, IN0, IN1, ..., INn),根據 K 的值選擇輸出 IN0 到 INn 中的一個)。
  5. FOR ... TO ... BY ... DO ... END_FOR

    • 用途: 計數迴圈。重複執行 DOEND_FOR 之間的程式碼,計數器變數從初始值變化到結束值,可選 BY 指定步長(預設為 1)。
    • 對應 Function: 無。
  6. WHILE ... DO ... END_WHILE

    • 用途: 條件前測試迴圈。只要 WHILE 後的布林表達式為 TRUE,就重複執行 DOEND_WHILE 之間的程式碼。如果一開始條件就為 FALSE,則一次也不執行。
    • 對應 Function: 無。
  7. REPEAT ... UNTIL ... END_REPEAT

    • 用途: 條件後測試迴圈。先執行一次 REPEATUNTIL 之間的程式碼,然後檢查 UNTIL 後的布林表達式。如果為 FALSE,則重複執行,直到表達式變為 TRUE。保證至少執行一次。
    • 對應 Function: 無。
  8. EXIT

    • 用途: 立即跳出當前所在的迴圈結構 (FOR, WHILE, REPEAT)。
    • 對應 Function: 無。
  9. RETURN

    • 用途: 立即結束當前 POU (PROGRAM, FUNCTION_BLOCK, FUNCTION) 的執行。在 FUNCTION 中,通常在此之前會給函數的返回值賦值。
    • 對應 Function: 無。
  10. CONTINUE

    • 用途: (注意:此關鍵字並非 IEC 61131-3 原始標準的一部分,但在很多現代 PLC 系統中被支援) 跳過當前迴圈的剩餘部分,直接進入下一次迴圈的判斷或迭代。
    • 對應 Function: 無。

V. 運算符 (Operators)

雖然不是嚴格意義上的 "關鍵字",但它們是 ST 語法的核心部分。

  1. :=

    • 用途: 賦值運算符。將右側表達式的值賦給左側的變數。
    • 對應 Function: 無。
  2. 算術運算符: +, -, *, /, MOD (取模)

    • 用途: 執行數學運算。
    • 對應 Function: ADD, SUB, MUL, DIV, MOD (有些系統提供函數形式), ABS, SQRT, EXP, LN, LOG, SIN, COS, TAN, ASIN, ACOS, ATAN 等數學函數。
  3. 比較運算符: =, <>, <, >, <=, >=

    • 用途: 比較兩個值,結果為 BOOL
    • 對應 Function: EQ (=), NE (<>), LT (<), GT (>), LE (<=), GE (>=) (有些系統提供函數形式), LIMIT (檢查是否在範圍內), MAX, MIN
  4. 邏輯運算符: AND (或 &), OR, XOR, NOT

    • 用途: 執行布林邏輯運算。
    • 對應 Function: AND, OR, XOR, NOT (也可作為函數)。
  5. 位元運算符: AND (或 &), OR, XOR, NOT

    • 用途: 對整數類型進行位元操作 (與邏輯運算符共用關鍵字,根據操作數類型區分)。
    • 對應 Function: SHL (左移), SHR (右移), ROL (循環左移), ROR (循環右移)。

VI. 其他

  1. ()

    • 用途: 函數/功能區塊調用時包圍參數列表;改變運算優先級。
    • 對應 Function: 無。
  2. []

    • 用途: 存取陣列元素。
    • 對應 Function: 無。
  3. .

    • 用途: 存取結構體 (STRUCT) 的成員;存取功能區塊實例的輸入/輸出/內部變數。
    • 對應 Function: 無。
  4. 註解:

    • : 單行註解 (很多系統支援,但非原始標準)
    • (* ... *) : 多行註解 (標準)
    • 用途: 添加程式說明,不影響程式執行。
    • 對應 Function: 無。

這個列表涵蓋了 IEC 61131-3 ST 語言中最核心和常用的關鍵字及其用途。實際應用中,請參考您所使用的具體 PLC 平台的編程手冊,以了解其支援的完整關鍵字集和標準庫功能。

⚠️ **GitHub.com Fallback** ⚠️