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