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 檔案透過語法規則來辨識這些宣告區塊。以下是常見的區塊類型及其意義:
-
VAR ... END_VAR(標準內部變數)- 語法規則 (示意):
var_declarations: VAR var_decl_list END_VAR; - 說明:
- 宣告 POU 內部的標準變數。
- 這些變數的作用域僅限於宣告它們的 POU 內部。
- 對於 FUNCTION,每次呼叫時變數會重新初始化(除非是
RETAIN或NON_RETAIN,但這通常用於VAR_GLOBAL或 FB 內的VAR)。 - 對於 FUNCTION_BLOCK 或 PROGRAM 的實例,這些變數的值在掃描週期之間會被保留(除非特別標註為
NON_RETAIN)。
- 語法規則 (示意):
-
VAR_INPUT ... END_VAR(輸入變數)- 語法規則 (示意):
input_declarations: VAR_INPUT var_decl_list END_VAR; - 說明:
- 宣告 POU(通常是 FUNCTION 或 FUNCTION_BLOCK)的輸入參數。
- 這些變數的值由呼叫者傳入。
- 在 POU 內部,這些變數通常是唯讀的(不能在 POU 內部賦值)。
- 語法規則 (示意):
-
VAR_OUTPUT ... END_VAR(輸出變數)- 語法規則 (示意):
output_declarations: VAR_OUTPUT var_decl_list END_VAR; - 說明:
- 宣告 POU(通常是 FUNCTION 或 FUNCTION_BLOCK)的輸出參數。
- POU 內部的邏輯計算結果會賦值給這些變數。
- 呼叫者可以讀取這些變數的值。
- 語法規則 (示意):
-
VAR_IN_OUT ... END_VAR(輸入輸出變數)- 語法規則 (示意):
in_out_declarations: VAR_IN_OUT var_decl_list END_VAR; - 說明:
- 宣告 POU(通常是 FUNCTION 或 FUNCTION_BLOCK)的輸入輸出參數。
- 這些變數以「傳址」或「傳參考」的方式傳遞。
- 呼叫者傳入一個變數,POU 內部可以讀取也可以修改這個變數,修改會直接影響呼叫者傳入的原始變數。
- 語法規則 (示意):
-
VAR_GLOBAL ... END_VAR(全域變數)- 語法規則 (示意):
global_var_declarations: VAR_GLOBAL var_decl_list END_VAR; - 說明:
- 宣告全域變數。這些變數在特定的全域範圍內(例如整個資源或組態)是可見且可存取的。
- 任何 POU 只要知道其名稱(或透過
VAR_EXTERNAL引用),就可以存取這些變數。 - 全域變數通常只應在一個地方使用
VAR_GLOBAL宣告。 - 可以使用
RETAIN或NON_RETAIN關鍵字指定其值是否在斷電後保持。
- 語法規則 (示意):
-
VAR_EXTERNAL ... END_VAR(外部變數)- 語法規則 (示意):
external_var_declarations: VAR_EXTERNAL var_decl_list END_VAR; - 說明:
- 在一個 POU 內部宣告,用來「引用」一個已經在別處(通常是使用
VAR_GLOBAL)宣告的全域變數。 - 它本身不建立新的變數,只是告知此 POU 將會存取哪個已存在的全域變數。
- 宣告的類型必須與對應的
VAR_GLOBAL宣告相符。
- 在一個 POU 內部宣告,用來「引用」一個已經在別處(通常是使用
- 語法規則 (示意):
-
VAR_TEMP ... END_VAR(暫存變數)- 語法規則 (示意):
temp_var_declarations: VAR_TEMP var_decl_list END_VAR; - 說明:
- 宣告 POU 內部的暫存變數。
- 這些變數的值在每次 POU 執行(對於 FUNCTION)或每個掃描週期(對於 FUNCTION_BLOCK/PROGRAM)開始時是未定義的,不保證會保留上一次的值。
- 主要用於單次執行或單個掃描週期內的臨時計算。
- 語法規則 (示意):
-
VAR_ACCESS ... END_VAR(存取變數)- 語法規則 (示意):
access_var_declarations: VAR_ACCESS access_decl_list END_VAR; - 說明:
- 用於定義透過通訊服務或其他機制存取遠端變數的路徑或方式。
- 通常包含存取路徑、變數名稱以及存取權限(如 READ_ONLY, WRITE_ONLY, READ_WRITE)。
- 這部分語法相對複雜,較少在基本 POU 邏輯中使用,更多用於系統組態或通訊設定。
- 語法規則 (示意):
-
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 等)都賦予了其後宣告的變數特定的作用域、生命週期和存取特性。