GetError 與 GetErrorID 指令的使用
在 STEP7 11 中,可以通過GetError (獲取本地錯誤信息)或者GetErrorID (獲取本地錯誤ID )指令查詢塊內出現的錯誤。
請注意:GetError 和 GetErrorID 均支持塊內的錯誤處理。當在程序塊中調用GetError 或GetErrorID 指令后,如果該程序塊發生錯誤,CPU則將忽略任何預定義的系統響應。也就是說CPU 會忽略此錯誤,而且CPU 的Error 燈(紅色)也不會亮,CPU 也不會停機。所以說該指令在某種程度上也起到了抑制程序錯誤的作用,同時有一定的風險存在。
建議該指令在程序塊中的最后一個網絡中調用, 這樣可以診斷整個程序塊中的錯誤,如果在程序中間調用該指令,則后面的程序如果有錯誤,CPU 也會忽略錯誤,不會停機,也沒有相關報錯,將不利于問題的診斷。
1. GetError 與 GetErrorID 的調用
在編程界面下, 點擊右側 “指令-> 基本指令-> 程序控制操作” 中可以找到GetError及GetErrorID 兩個指令。(見下圖1)
圖1.
2. GerError 指令的使用
GetError:使用“獲取本地錯誤信息”指令,可以查詢塊內出現的錯誤。如果在塊執行期間出現錯誤,則發生的第一個錯誤的詳細信息將保存在輸出 ERROR 中。消除第一個錯誤后,該指令會在Error 處輸出下一個錯誤的信息。僅當使能輸入 EN 的信號狀態為“1”且顯示了錯誤信息時,才置位“獲取本地錯誤信息”指令的使能輸出 ENO。
GetError 指令的輸出參數Error 的數據類型為:ErrorStruct(見圖2),請注意:常規的變量類型中并未包含此類型。
圖2
定義Error 變量的步驟:
1.需要創建一個全局數據塊并定義變量,例如變量名為Error,在DB 塊中手動輸入" Errorstruct ",該變量類型無法通過下拉列表選擇(見圖3)。
圖3
通常輸入“ E ” 時就可以看見該變量類型,可以直接點選。(見圖4)
圖4.
2. 定義后的Error 結構如下:(見圖5),詳細的參數介紹請參考該指令的幫助文件。(選中塊, 按鍵盤上功能鍵 F1 )
圖5.
3. 定義完成后可以直接在引腳輸入所創建的DB 塊的名稱,即可在下拉框中找到所定義的Error 變量( 見圖6)。
圖6.
直接選擇Error 即可完成輸出參數的定義(圖7)。
圖7.
可以通過打開DB 塊,監控Error的狀態判斷程序是否報錯。詳細報錯信息請參考該塊的幫助(選中塊, 按鍵盤上功能鍵 F1 )
例如: 在FC1 中編程調用一個不存在的地址 DB1.DBX0.0,此時GetError 指令執行, cpu 運行正常, 沒有error 燈亮,診斷緩沖區也不會報錯( 見圖8 )。
圖8.
?注意:在TIA Protal v11 中,如果程序中使用了未定義的變量或未創建的變量,編譯將會報警,但程序可以下載, 未定義變量不能通過變量分配,見下圖9。
圖9.
此時監控DB 塊中Error 變量的狀態, 根據監視值查詢幫助可以知道 FC1 中調用的全局數據塊 DB1 中,偏移地址0 不存在(圖10)。
圖10.
3. GetErrorID 的使用
GetErrorID:使用“獲取本地錯誤 ID”指令(見圖11),可以查詢塊內出現的錯誤。如果在塊執行過程中系統信號出錯,會將發生的第一個錯誤的 ID 保存在輸出 ID 的變量中。ID 輸出中只能指定 WORD 數據類型的操作數(見圖12)。消除第一個錯誤后,該指令才會輸出發生的下一個錯誤的ID。僅當“獲取本地錯誤 ID”指令的輸入的信號狀態為“1”且顯示了錯誤信息時,才置位該指令的輸出。
圖11
圖12
下表列出了GetRrrorID 指令的輸出參數 ID 可以輸出的值對應的報錯信息。(GetError 指令輸出結構變量中的ErrorID適用于下表)
ID | ID | 說明 |
0 | 0 |
無錯誤 |
2503 | 9475 |
指針無效 |
2505 | 9477 |
在用戶程序中調用“Stop”指令 (SFC46) |
2520 | 9504 |
STRING 無效 |
2522 | 9506 |
讀取錯誤:操作數超出有效范圍 |
2523 | 9507 |
寫入錯誤:操作數超出有效范圍 |
2524 | 9508 |
讀取錯誤:操作數無效 |
2525 | 9509 |
寫入錯誤:操作數無效 |
2528 | 9512 |
讀取錯誤:數據對齊 |
2529 | 9513 |
寫入錯誤:數據對齊 |
252C | 9516 |
指針無效 |
2530 | 9520 |
寫入錯誤:數據塊 |
2533 | 9523 |
使用了無效指針 |
2534 | 9524 |
塊編號錯誤 FC |
2535 | 9525 |
塊編號錯誤 FB |
2538 | 9528 |
訪問錯誤:DB 不存在 |
2539 | 9529 |
訪問錯誤:使用了錯誤 DB |
253A | 9530 |
全局數據塊不存在 |
253C | 9532 |
故障信息或函數不存在 |
253D | 9533 |
系統函數不存在 |
253E | 9534 |
故障信息或函數塊不存在 |
253F | 9535 |
系統塊不存在 |
2550 | 9552 |
訪問錯誤:DB 不存在 |
2551 | 9553 |
訪問錯誤:使用了錯誤 DB |
2575 | 9589 |
程序嵌套深度出錯 |
2576 | 9590 |
本地數據分配出錯 |
2942 | 10562 |
讀取錯誤:Input |
2943 | 10563 |
寫入錯誤:Output |
常問問題
?GetError 與GetErrorID 的區別?
答:GetError 與GetErrorID 區別在于 GetError 可以得到比較詳細的信息,如塊編號,偏移地址等, 便于問題的快速診斷及定位。GetErrorID 指令僅輸出簡單報錯信息。
如果程序比較復雜,建議使用GetError 指令可以更快捷的幫助查找程序錯誤 。
?是否可以在一個塊中( FC 或 FB )中不同的網絡段中(Network)多次調用 GetError 或 GetError ID 指令?
答:可以。在一個塊中不同的網絡段中調用多次GetError 指令或 GetErrorID 指令,可以診斷一個塊中不同網絡段中的錯誤(見圖13)。
圖13.
當然也可以在一個塊中的最后一個網絡只調用一次,如果程序中存在多處錯誤,發生的第一個錯誤的詳細信息將輸出至輸出參數Error 或 ID 處, 當第一個錯誤消失后,第二個錯誤的錯誤信息才被輸出至輸出參數。
?是否可以在 OB1 中調用GetError 或 GetError ID 指令?
答:可以,使用方法與在FC 或 FB 中調用類似。
情況一:OB1 程序中出錯:
如果OB1 中的程序出錯,例如調用未組態硬件的 I 地址,但未調用GetError 指令,CPU error 燈會紅色閃爍,診斷緩沖區報錯(見圖14), 但CPU不會停機( 僅限于CPU 固件版本v2.0 以上版本,固件版本為V1.0 的CPU 在此種情況下會停機)
圖14.
此時如果在OB1 中最后一條網絡調用GetError 或GetErrorID 指令,則診斷緩沖區的報錯信息消失, CPU 指示燈恢復正常。
情況二:OB1 本身的網絡中沒有錯誤, 但在 OB1 中調用的塊中存在錯誤, 例如FC1中存在錯誤:
1 )如果OB1 中無條件調用的塊例如FC1 出錯,OB1的其它網絡沒有錯誤, FC1 中有錯誤但并沒有調用Get Error 指令,CPU error 燈也會紅色閃爍,診斷緩沖區報錯(見圖15),但CPU不會停機( 僅限于CPU 固件版本v2.0 以上版本,固件版本為V1.0 的CPU 在此種情況下會停機),當在FC1 調用GetError 指令后, CPU 報錯信息消失,指示燈恢復正常。
圖15.
2 )如果OB1 中有條件調用塊,例如FC1, 但FC1 在OB 1 中的執行條件沒有滿足,則 CPU 不會報錯。一旦FC1 調用條件滿足被執行,且FC1 中的錯誤一直存在,則CPU error 燈也會閃,診斷緩沖區報錯(見圖15), 但CPU不會停機( 僅限于CPU 固件版本v2.0 以上版本,固件版本為V1.0 的CPU 在此種情況下會停機) 。
3) 如果OB1 中調用的塊FC 有錯誤,在OB1 中調用了GetError 指令,但出錯的塊 FC1 中未調用 GetError 指令,則CPU 也會出現 指示燈Error 紅色閃爍,診斷緩沖器報錯。見圖16。
圖16.
總結:由此可見, GetErrorID 或GetError 指令是基于塊的指令,只能診斷調用它的塊中的錯誤,如果出錯的程序中未調用該指令,則無法診斷該塊中的錯誤。
審核編輯:郭婷
-
cpu
+關注
關注
68文章
10905瀏覽量
213031
原文標題:S-1500 :GetError 與 GetErrorID 指令的使用
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論