VAR ... END_VAR - benchen2001/matiec GitHub Wiki

好的,iec_bison.yy 檔案是使用 Bison 工具來產生 IEC 61131-3 語言解析器 (Parser) 的語法定義檔。其中 VAR ... END_VAR 相關的區塊是用來宣告不同類型變數的標準語法結構。

以下是 iec_bison.yy 中通常會定義的各種 VAR ... END_VAR 相關區塊的語法規則(非終端符名稱可能略有不同,但結構類似)及其說明,使用正體中文:


在 IEC 61131-3 標準中,變數宣告區塊定義了程式組織單元(POU - Program Organization Unit,如 PROGRAM, FUNCTION_BLOCK, FUNCTION)或全域範圍內使用的變數名稱、資料類型、初始值(可選)、記憶體位址(可選)等屬性。

iec_bison.yy 檔案透過語法規則來辨識這些宣告區塊。以下是常見的區塊類型及其意義:

  1. VAR ... END_VAR (標準內部變數)

    • 語法規則 (示意)
      var_declarations: VAR var_decl_list END_VAR;
      
    • 說明
      • 宣告 POU 內部的標準變數。
      • 這些變數的作用域僅限於宣告它們的 POU 內部。
      • 對於 FUNCTION,每次呼叫時變數會重新初始化(除非是 RETAINNON_RETAIN,但這通常用於 VAR_GLOBAL 或 FB 內的 VAR)。
      • 對於 FUNCTION_BLOCK 或 PROGRAM 的實例,這些變數的值在掃描週期之間會被保留(除非特別標註為 NON_RETAIN)。
  2. VAR_INPUT ... END_VAR (輸入變數)

    • 語法規則 (示意)
      input_declarations: VAR_INPUT var_decl_list END_VAR;
      
    • 說明
      • 宣告 POU(通常是 FUNCTION 或 FUNCTION_BLOCK)的輸入參數。
      • 這些變數的值由呼叫者傳入。
      • 在 POU 內部,這些變數通常是唯讀的(不能在 POU 內部賦值)。
  3. VAR_OUTPUT ... END_VAR (輸出變數)

    • 語法規則 (示意)
      output_declarations: VAR_OUTPUT var_decl_list END_VAR;
      
    • 說明
      • 宣告 POU(通常是 FUNCTION 或 FUNCTION_BLOCK)的輸出參數。
      • POU 內部的邏輯計算結果會賦值給這些變數。
      • 呼叫者可以讀取這些變數的值。
  4. VAR_IN_OUT ... END_VAR (輸入輸出變數)

    • 語法規則 (示意)
      in_out_declarations: VAR_IN_OUT var_decl_list END_VAR;
      
    • 說明
      • 宣告 POU(通常是 FUNCTION 或 FUNCTION_BLOCK)的輸入輸出參數。
      • 這些變數以「傳址」或「傳參考」的方式傳遞。
      • 呼叫者傳入一個變數,POU 內部可以讀取也可以修改這個變數,修改會直接影響呼叫者傳入的原始變數。
  5. VAR_GLOBAL ... END_VAR (全域變數)

    • 語法規則 (示意)
      global_var_declarations: VAR_GLOBAL var_decl_list END_VAR;
      
    • 說明
      • 宣告全域變數。這些變數在特定的全域範圍內(例如整個資源或組態)是可見且可存取的。
      • 任何 POU 只要知道其名稱(或透過 VAR_EXTERNAL 引用),就可以存取這些變數。
      • 全域變數通常只應在一個地方使用 VAR_GLOBAL 宣告。
      • 可以使用 RETAINNON_RETAIN 關鍵字指定其值是否在斷電後保持。
  6. VAR_EXTERNAL ... END_VAR (外部變數)

    • 語法規則 (示意)
      external_var_declarations: VAR_EXTERNAL var_decl_list END_VAR;
      
    • 說明
      • 在一個 POU 內部宣告,用來「引用」一個已經在別處(通常是使用 VAR_GLOBAL)宣告的全域變數。
      • 它本身不建立新的變數,只是告知此 POU 將會存取哪個已存在的全域變數。
      • 宣告的類型必須與對應的 VAR_GLOBAL 宣告相符。
  7. VAR_TEMP ... END_VAR (暫存變數)

    • 語法規則 (示意)
      temp_var_declarations: VAR_TEMP var_decl_list END_VAR;
      
    • 說明
      • 宣告 POU 內部的暫存變數。
      • 這些變數的值在每次 POU 執行(對於 FUNCTION)或每個掃描週期(對於 FUNCTION_BLOCK/PROGRAM)開始時是未定義的,不保證會保留上一次的值。
      • 主要用於單次執行或單個掃描週期內的臨時計算。
  8. VAR_ACCESS ... END_VAR (存取變數)

    • 語法規則 (示意)
      access_var_declarations: VAR_ACCESS access_decl_list END_VAR;
      
    • 說明
      • 用於定義透過通訊服務或其他機制存取遠端變數的路徑或方式。
      • 通常包含存取路徑、變數名稱以及存取權限(如 READ_ONLY, WRITE_ONLY, READ_WRITE)。
      • 這部分語法相對複雜,較少在基本 POU 邏輯中使用,更多用於系統組態或通訊設定。
  9. VAR_CONFIG ... END_VAR (組態變數)

    • 語法規則 (示意)
      config_var_declarations: VAR_CONFIG config_decl_list END_VAR;
      
    • 說明
      • 通常出現在 CONFIGURATION 區段中。
      • 用於宣告與硬體組態、資源分配、任務排程等相關的變數。
      • 例如,將程式中的變數直接對應到實體 I/O 位址(使用 AT %I..., AT %Q... 等)。

內部結構 var_decl_list (示意)

在上述各種 VAR...END_VAR 區塊內部,通常會包含一個或多個變數宣告行 (var_decl_list)。每個宣告行定義了一個或多個相同類型的變數,其基本結構類似:

// 示意規則
var_decl_list: /* empty */ | var_decl_list single_var_declaration ';';

single_var_declaration:
    identifier_list ':' type_specifier opt_location opt_initial_value opt_comment
    ;

identifier_list: IDENTIFIER | identifier_list ',' IDENTIFIER;
  • identifier_list: 一個或多個用逗號分隔的變數名稱。
  • :: 分隔符。
  • type_specifier: 變數的資料類型(如 BOOL, INT, REAL, 自訂的結構或功能區塊類型等)。
  • opt_location: 可選的記憶體位址指定(如 AT %IX0.0)。
  • opt_initial_value: 可選的初始值賦值(如 := 10)。
  • opt_comment: 可選的行尾註解。

總結:

iec_bison.yy 檔案中的這些 VAR...END_VAR 相關規則,定義了 IEC 61131-3 語言中不同種類變數宣告區塊的語法結構。解析器根據這些規則,能夠正確辨識原始碼中的變數宣告,並將其轉換成內部表示(例如抽象語法樹),以便後續的編譯或分析。每種 VAR 關鍵字(VAR, VAR_INPUT, VAR_GLOBAL 等)都賦予了其後宣告的變數特定的作用域、生命週期和存取特性。