簡介
在以下示例中,可通過 RDREC 讀取 IO 設備的診斷數據記錄“16#E00A”。觸發斷路時,系統將錯誤信息輸出為一條診斷數據記錄。
說明 診斷數據記錄的數目 對于該 IO 設備,模塊上每個觸發錯誤的插槽都將生成自己的數據記錄。因此,診斷信息中可包含多條記錄。 在該示例中,將讀取多個模塊的多個硬件錯誤(通道錯誤),并將這些錯誤復制到存儲器數組的相應結構中。根據指定的設置,存儲器數組(“recordA”、“recordB”)最多可包含 6 條數據記錄、16 個通道。 |
要求
安裝的硬件
需安裝以下硬件設備:
一個 IO 控制器(如,S7-1513-1 PN)
一個 IO 設備(如,ET 200MP IM 155-5 PN HF)
一個或多個高性能型的數字量輸出模塊(如,DQ 4x24VDC HF)
說明 觸發斷路 確保觸發斷路的 DQ 模塊通道未接線。 |
說明 硬件配置的操作步驟 要進行硬件配置,請按以下步驟操作:
|
創建 PLC 數據類型
要傳輸和存儲數據,需要以下 PLC 數據類型:
說明 數組的大小 如果要更改數組的大小(用于讀取存儲器、數據記錄或通道),則需執行以下操作: 通道:在 PLC 數據類型(“RECdiag_0100”、“RECdiag_0101”)中修改數組的大小(“Array[0..y] of USI_v..”)。在 gDB 中修改“maxChannelPos”值。 數據記錄:在 gDB 中修改數組的大小(“recordA”、“recordB”)。在 gDB 中修改“maxRecordPos”值。 讀取存儲器(“recordBYTE”):在 gDB 中修改數組的大小(“recordBYTE”)和“maxPosition”的值。請注意,診斷數據記錄“16#E00A”的最大總長度為 4176 個字節。 |
創建監控表
要觸發斷路,需使用監控表的“強制”(Force) 功能。
例如,如果要將輸出“%QW0”的值強制為“16#FFFF”,則所有組態有斷路的通道可使用該輸出觸發一個硬件錯誤。
數據的存儲
創建以下變量和結構,將數據存儲在一個全局數據塊 (gDB) 中:
讀取 IO 設備前端模塊的硬件標識符,并使用“id”變量進行存儲。通過“PLC 變量 > 系統常量”(PLC tags > System constants) 以及
等條目,可查找到前端模塊的硬件標識符。所用的數據類型為“HW_SubModule”。函數“SLI_FC_start_RDiag”:參數互連
要啟動“RDREC”指令,可根據硬件故障創建函數“SLI_FC_start_RDiag”。
在 FC 中創建以下互連。
在診斷中斷 OB (OB82) 中,調用函數“SLI_FC_start_RDiag”。
函數“SLI_FC_reset_RDiag”:參數互連
要在發生錯誤后復位過程值,需創建函數“SLI_FC_reset_RDiag”。
在 FC 中創建以下局部變量。
在 FC 中創建以下互連。
程序段 1:要復位過程值,需創建以下互連。第 1 部分:
第 2 部分:
第 3 部分:
第 4 部分:
程序段 2:要復位“reset”變量,需創建以下互連。
函數塊“SLI_FB_chooseStruct_RDiag”:參數互連
創建函數塊“SLI_FB_chooseStruct_RDiag”,選擇相應的數據記錄結構,并將數據復制到數組中的指定位置。
更多信息,請參見“程序段 6”的“結果”(Result) 部分或該程序段的注釋字段(參見“程序代碼”)。
函數塊“SLI_FB_RDREC_Diag”:參數互連
創建函數塊“SLI_FC_start_RDiag”,調用并處理“RDREC”指令以及所有其它后續進程。
在該函數塊中創建以下局部變量。
在該 FB 中創建以下互連:
程序段 1:調用函數“SLI_FC_reset_RDiag”并創建名為“RDREC”的“Label”指令。
程序段 2:互連“RDREC”指令的參數,如下所示:
程序段 3:發生 RDREC 錯誤時,如果要保存該狀態,則需進行參數互連,如下所示
程序段 4:要結束 RDREC 的執行,需創建以下互連。
程序段 5:要跳轉回程序段 1,需創建以下互連。
程序段 6:調用函數塊“SLI_FB_chooseStruct_RDiag”,如下所示。
在循環 OB (OB1) 中調用函數塊“SLI_FB_RDREC_Diag”。
事件 FB“SLI_FB_RDREC_Diag”
程序段 1:
如果常開觸點(“reset”)的信號狀態為“TRUE”,則系統將復位 FB“SLI_FB_chooseStruct_RDiag”的過程值和全局數據塊的過程值。
程序段 2:
輸入參數 REQ(“startRead”)返回信號狀態“TRUE”時,啟動指令“RDREC”。
說明 調用“startRead” 根據 OB82 的調用結果,每次檢測到硬件錯誤時,“startRead”將復位為“TRUE”。通過變量“countCalls”,可計數 RDREC 成功調用的次數。觸發三個通道錯誤后,“countCalls”值將為“3”。 |
“RDREC”指令將通過輸入參數 ID(“id”)調用 IO 設備的前端模塊。輸入參數 INDEX(“dataRecNbr”)用于調用 IO 設備的診斷數據記錄“16#E00A”。
“RDREC”指令將通過多次調用讀取診斷數據,并使用 RECORD 參數(“recordBYTE”)保存所讀取的數據(x 條數據記錄)。讀取的數據長度記錄在 LEN 輸出參數(“#lengthOut”)中,并使用變量“readLength”進行保存進行進一步處理。根據輸入參數 MLEN 的值(“maxLength”的值為“0”),待讀取的數據長度無限制。
在執行過程中,輸出參數 BUSY(“busy”)將置位為“TRUE”;VALID(“checkedValid”)將置位為“FALSE”。僅當執行完成后,才會輸出成功讀取的結果(“checkedValid”置位為“TRUE”);函數塊“SLI_FB_chooseStruct_RDiag”將該結果用作一個起始條件。要結束函數塊“SLI_FB_chooseStruct_RDiag”的執行,系統將變量“checkedValid”置位為“FALSE”。
并在輸出參數 STATUS(“#statusExe”)處,顯示該塊的狀態。在本示例中,該過程成功執行且無任何錯誤。
程序段 3:
當常開觸點(“error”)的信號狀態為“TRUE”時,如果發生錯誤(“memErrStatus”),則系統保存該狀態(“#statusExe”)。同時復位變量“checkedValid”和“startRead”,并停止 RDREC 的執行。函數塊“SLI_FB_chooseStruct_RDiag”的執行將無法啟動。
程序段 4:
RDREC 完全執行后(“#statusExe”的值為“16#0070_0200”),“startRead”將置位為“FALSE”。并停止 RDREC 的執行。
程序段 5:
如果常開觸點(“startRead”)的信號狀態為“TRUE”,則將跳轉到程序段 1 的“RDREC”標簽處(使用 "JMP" 指令)。
程序段 6:
如果變量“checkedValid”的信號狀態為“TRUE”,且變量“reset”的信號狀態為“FALSE”,則在函數塊“SLI_FB_chooseStruct_RDiag”中啟動排序過程。
在函數塊“SLI_FB_chooseStruct_RDiag”中,將選擇相應數據記錄的結構類型以及與 UserStructureIdentifier 相匹配的結構類型。系統將數據記錄的數據復制到相應數組中的正確位置中。之后,將根據相應數據記錄的大小多次重復執行以上操作。此時,系統將讀取一個或多個通道的信息。
如果對數據記錄內容進行操作后,“數據記錄的長度 + 前置長度”(“#allRecLEN”)小于所有讀取的數據長度(“readLength”),則將從頂部重新開始函數塊的執行。此時,系統將讀取另一個數據記錄、進行內容比較,并將該數據記錄的數據復制到相應數組的正確位置處。
通過將局部變量(“#readComplete”、“#dbComplete”、“#limitReach”)和全局變量“checkedValid”設置為“FALSE”,可完成排序過程。
基于以下變量,可記錄該排序過程:
“data_sorting_done”:該變量用于指示函數塊“SLI_FB_chooseStruct_RDiag”的執行已結束。同時變量“checkedValid”復位,表示該函數塊無法重新執行。
“outputOverflow”:該結構中包含三個變量,每個變量分別記錄不同的數組超出限值錯誤。例如,讀取的數據記錄數量超出相應數組(“recordA”或“recordB”)可存儲的最大數量。
“different_structs_used”:如果使用“recordA”和“recordB”存儲診斷數據記錄,則變量“different_structs_used”將返回值“TRUE”。
“countRecs”:該變量用于計數復制的數據數目。
“chooseStruct”:該變量用于指示上一次所用的結構。值“4”用于指示“recordB”結構中上一次以“USI Type 1”形式存儲的數據記錄。
“posForRec”:該變量將存儲數據記錄(“recordA”或“recordB”)的數組中最近使用的位置。值“1”用于指示“recordB[1]”中上一次存儲的數據記錄(參見“chooseStruct”)。
“posForChannel”:該變量將存儲通道(“USI_DetailsType[x]”)的數組中最近使用的位置。值“0”用于指示“recordB[1]/USI_DetailsType[0]”中存儲的通道(參見“chooseStruct”和“posForRec”)。
下圖中顯示了位置“0”(“recordB[0]”)處,結構為“B”/“0101”的數據記錄。
“ChannelLocation”的值“16#8000”顯示了子模塊級的診斷信息。基于“ChannelErrorType”的值“16#0006”,插槽 2 處(參見“SlotNumber”)模塊上子模塊 1(“SubSlotNumber”)的通道 0 和 1(參見“ChannelNumber”)發生斷路。
“A”/“0100”的結構體:
“B”/“0101”的結構體:
類型 1 的結構,與“UserStructureIdentifier”中的值相同:
類型 1 的結構用于基本通道診斷。
類型 2 的結構,與“UserStructureIdentifier”中的值相同:
類型 2 的結構用于擴展通道診斷。
類型 3 的結構,與“UserStructureIdentifier”中的值相同:
類型 3 的結構用于制造商特定的通道診斷。在本示例中,結構的組態未定義,并假定類型 3 的長度為 28 個字節。
“A”/“0100”結構的匯總信息:
“B”/“0101”結構的匯總信息:
審核編輯:劉清
-
控制器
+關注
關注
112文章
16204瀏覽量
177420 -
存儲器
+關注
關注
38文章
7453瀏覽量
163608 -
PLC控制
+關注
關注
9文章
251瀏覽量
27262 -
觸發器
+關注
關注
14文章
1996瀏覽量
61052
原文標題:西門子PLC:使用 RDREC 讀取診斷數據記錄的編程示例
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論