王詩清, 王建偉, 楊 斌, 袁廣寶
(1. 國網遼寧省電力有限公司 電力科學研究院, 遼寧 沈陽 110018;2. 北京四方繼保工程技術有限公司, 北京 100085)
規(guī)約的一致性測試是IED投入使用前的必要過程[1]. IEC61850-10部分規(guī)定的一致性測試是用于驗證IED通信接口與IEC61850標準要求的一致性. 該部分規(guī)定了實現IEC61850規(guī)約一致性測試的標準技術及提出性能參數時要使用的特定測量技術. 使用這些技術將提高系統(tǒng)集成商集成IED、 正確操作IED及支持預期應用的能力. IEC61850規(guī)約的一致性測試是保證IED設備實現互聯(lián)互通互操作性的基礎, 如果不能實現互聯(lián)互通互操作, 規(guī)約的制定就沒有了意義. IEC61850規(guī)約一致性的測試能夠在最大程度上保證IED設備間通信接口與IEC61850標準協(xié)議相一致, 進而確保設備能夠實現互聯(lián)互通互操作. 但是, 由于IEC61850規(guī)約一致性測試內容多、 涉及細節(jié)關注點多、 對專業(yè)性要求高、 設置配置復雜等原因, 使得完成這類測試需要具備極高的IEC61850規(guī)約專業(yè)知識的專業(yè)技術人員, 并借助不同的工具軟件和測試設備才能夠完成, 從而導致IEC61850規(guī)約一致性的檢測效率低、 人工檢測易造成細節(jié)點的遺漏缺失、 無法遍歷全覆蓋測試等問題. 因此, 快速、 高效、 準確、 可遍歷全覆蓋的IEC61850規(guī)約一致性自動化測試變的更加必要.
目前, 眾多的檢測方法和工具被應用于IEC61850服務器規(guī)約一致性測試當中. 但不論使用哪種工具, 都需要對IEC61850規(guī)范標準非常了解, 且同時需要對server端的設備(被測試設備)進行一些人工操作, 如在進行報告服務測試時, 需要人工操作被測試設備來觸發(fā)生成變位報告, 同時, 需要抓包對該報告報文進行分析, 判斷其是否符合預期. 若對IEC61850規(guī)范標準理解不全面不正確, 經常會導致測試結果出現問題和偏差.
針對目前IEC61850服務器規(guī)約一致性測試工作中的諸多問題, 鑒于目前開源庫資源的日趨豐富及完善, 本文提出了一種基于開源庫, 使用Python對IEC61850服務器規(guī)約一致性進行全覆蓋遍歷的全自動化測試方法. 因IEC61850服務器規(guī)約一致性測試包括的內容較多, 本文將主要針對報告服務的自動化測試技術的實現提出解決方法. 首先提出IEC61850服務器規(guī)約一致性測試的基本過程方法. 針對較難實現自動測試的報告服務提出了通過取代服務模擬置數產生報告的方式, 杜絕人工干預, 從而實現自動觸發(fā)生成報告, 進而對IEC61850報告服務進行自動測試的方法, 加強一致性測試的可信度和嚴謹性.
國際上將IEC61850作為變電站通信網絡和系統(tǒng)的統(tǒng)一標準, 用于統(tǒng)一變電站內功能和裝置等各個方面, 使變電站內裝置間的通信變得更加統(tǒng)一便捷. 在這一標準下建立起統(tǒng)一各廠商的通用配置, 支持不同智能電子設備間的信息共享和互操作. 其主要優(yōu)勢和作用在于為同網絡上工作的不同設備建立信息比對和命令執(zhí)行共享途徑, 實現通信的統(tǒng)一性, 避免因通訊協(xié)議的不同造成設備間繁瑣的規(guī)約轉換. 規(guī)約一致性的測試是對IED設備間進行互聯(lián)互通互操作的基本保障. IEC61850服務器規(guī)約一致性檢測的基本過程[2]如圖 1 所示.
圖 1 IEC61850規(guī)約一致性測試過程
由圖 1 所示的IEC61850規(guī)約一致性服務器端的一般測試過程可以看出, 首先, 我們需要對服務器端提供的PICS, MICS, PIXIT文檔及IED設備的能力描述文件ICD進行靜態(tài)的檢查[3], 確保文檔完備且文檔對IEC61850-10中所需要聲明的服務內容及服務響應行為都進行了相應說明; 然后, 根據所提供的PICS, PIXIT文檔中所提及的服務及服務響應情況, 使用各類工具軟件或測試設備, 按照IEC61850-10中的測試用例逐一進行檢測驗證[4]; 最后, 根據檢測情況出具對應的試驗報告和過程報文. 以上便是一個完整的一般性的IEC61850規(guī)約一致性服務器端的檢測過程.
IEC61850一致性測試主要是驗證 IED 通信接口與IEC61850標準要求的一致性, 其包括肯定測試用例和否定測試用例, 常見的IEC61850規(guī)約一致性測試系統(tǒng)結構如圖 2 所示.
圖 2 常見IEC61850一致性測試系統(tǒng)結構
圖 2 中, 被測試設備(DUT)一般為保護或智能控制設備, 其一致性測試過程如下:
通常用一個通信仿真器(Client Simulator)作為一個IEC61850客戶端, 通過以太網向被測設備(DUT)發(fā)送服務請求并記錄和處理結果信息. 通信仿真器通常采用UniCASim simulator[5].
被測試設備的信號觸發(fā)等輔助試驗可由試驗測試儀(Signal Generator)提供, 包括電壓電流等模擬量和開關量的輸出, 進行環(huán)境仿真, 并與通信仿真器(Client Simulator)相互通信.
通常使用一個網絡協(xié)議報文分析儀(Protocol Analyzer)來監(jiān)控測試過程中出現的錯誤, 網絡協(xié)議分析儀將對整個過程的報文進行記錄和解析, 并分析所得檢測結果.
最后, 應配置一個時鐘同步裝置用來對被測試設備、 試驗測試儀、 通信仿真器等一致性測試中各個設備的時間進行同步. 以上設備便構成了IEC61850的一致性服務端測試的基本框架.
傳統(tǒng)的IEC61850服務端報告服務的測試, 需要連接試驗測試儀手動進行模擬量或開關量的觸發(fā), 被測試設備和測試軟件系統(tǒng)之間沒有形成有效的閉環(huán), 因需要人工干預觸發(fā)信息, 不能自動判斷結果, 影響測試的全面性.
IEC61850規(guī)范明確了需要對取代服務的支持[6], 且目前絕大部分的IED設備也都提供了取代服務. 這樣就使得IEC61850規(guī)約一致性報告服務的自動檢測在不借助外部設備或外部手動置數等手段的情況下可以實現.
基于開源庫, 使用Python來實現的IEC61850服務器規(guī)約一致性的自動測試[7], 將會使得整個測試驗證過程變得“簡單、 高效、 集成和智能”, 尤其是對于整個一致性規(guī)約測試中最難進行測試的報告服務.
將規(guī)約一致性報告服務的測試劃分成3個模塊:
1)報告觸發(fā)模塊: 使用取代功能模擬置數觸發(fā)有預期結果的報告;
2)報告分析解析模塊: 對觸發(fā)生成的報告進行解析分析, 并將解析的結果存入到Python的字典中放入消息隊列;
3)結果判定運行模塊: 從消息隊列中獲取字典信息, 并通過字典信息的關鍵字獲取對應值和實際預期結果進行比對判斷.
整個報告服務自動測試實現過程如圖 3 所示.
圖 3 報告服務自動測試實現過程
使用Python對規(guī)約一致性報告服務的全自動測試技術實現過程如下:
1) 數據信息的準備
自動測試結果運行主線程啟動后, 調用初始化功能函數在線獲取被測試設備(IED)的數據模型信息, 將其存入到Python的字典中, 通過return返回給主線程.
獲取到數據模型的字典信息后, 通過數據模型字典信息中的關鍵字key(如: dev_content_dict[‘Brcb_List’])獲取到被測試設備的報告控制塊信息.
然后, 再通過Python的for循環(huán), 對所有報告控制進行初始設置, 設置報告控制的OptFlds和TrgOps, 使報告控制的OptFlds支持Data Reference; TrgOps支持dchg和GI的觸發(fā)選項.
對報告控制塊的初始設置準備完成后, 再次通過Python的for循環(huán), 開始對每個設置完畢的報告控制塊列表進行遍歷操作, 依次進行RptEna寫False, 清除報告控制塊緩存報告, 使能RptEna, 寫總召GI, 從共享消息隊列中獲取報告信息并解析返回結果, 得到滿足測試要求的報告控制塊后退出循環(huán). 實際生成的具有Data Reference的GI總召報告信息如圖 4 所示.
圖 4 觸發(fā)生成總召報告報文信息圖
最后, 根據以上步驟獲取到滿足要求的待測試報告控制塊的信息及該報告控制塊關聯(lián)的數據集里成員的Data Reference信息, 并將其保存在DataRefNameList列表中. 通過Python的字符串替換功能str.replace()將對應的取代數據信息存放在新建立的列表中(如: BRCB_BeLinked_sub_List). 具體Python實現過程如圖 5 所示.
圖 5 Python獲取待測試報告控制塊過程
2) 變位報告的觸發(fā)
通過第一步“數據信息的準備”操作后, 已經獲取到了滿足要求的待測試報告控制塊信息、 報告控制塊關聯(lián)數據集里成員信息列表以及報告控制塊關聯(lián)數據集對應的取代信息列表. 然后, 通過Python的for循環(huán)調用取代函數, 對取代信息列表進行寫使能和初始值的設置操作. 寫完初始值后再清除該報告控制塊的緩存區(qū)和共享消息隊列.
經過以上操作, 對待測試的報告控制塊里的成員數據進行了初始值設置, 并清除了緩存區(qū)報告和共享消息隊列里的信息, 就可以保證使用write函數對subVal值進行修改時產生的dchg變位報告為預期報告. 整個過程如圖 6 所示.
圖 6 觸發(fā)預期結果報告過程
3) 變位報告報文的解析及結果判定
在完成以上操作后, 產生了dchg的變位報文, 該變位報文里的預期結果為通過取代功能寫入的subVal值. 因取代觸發(fā)的變位報文在取代值發(fā)生變化時就會立刻產生, 需要使用多線程技術對報告報文進行實時的捕獲和解析. 多線程將報告分析解析模塊設置為守護線程. 報告分析解析模塊使用Python的pcap功能模塊, 該功能模塊可驅動以太網并根據關鍵字或關鍵信息進行過濾, 從而能夠有效、 實時地捕獲到有用的報告報文.
考慮MMS是按照TLV進行編碼[8], 需要按照有效偏移位逐個對捕獲到的報告報文進行解析, 如圖 7 所示, 將有效Tag位對應的length和value進行解析分析, 并將解析分析后的value值存放在字典中, 最終通過put將字典信息發(fā)送到共享隊列中.
圖 7 報告報文解析過程
自動測試結果運行主線程為整個報告服務自動測試的主程序, 包含IEC61850-10中所有報告服務的測試用例[9]. 主程序的主要作用是按照測試用例要求, 實現測試過程并將預期結果發(fā)送給報告觸發(fā)模塊, 使其產生有預期結果的報告報文, 然后, 再從消息隊列中獲取報告分析解析模塊解析出來的實際報告的結果信息, 將預期結果和實際結果進行比較, 從而得出測試結果. 若和預期一致則測試通過, 若不一致則測試不通過, 從而實現了報告服務不依賴外部模擬設備全自動的閉環(huán)測試. 整個閉環(huán)自動測試過程如圖 8 所示.
圖 8 規(guī)約一致性報告服務閉環(huán)自動測試
1) 可變模擬量的處理
因報告控制塊RCB所關聯(lián)的數據集DatSet里的成員較多, 有部分成員的值是模擬量值[10], 例如, 反應IED設備的溫度量、 電壓值等, 這些模擬量值都會伴隨環(huán)境溫度、 時間的變化而改變, 在變化的過程中就會觸發(fā)一些和測試不相干的報告報文, 這樣就容易對測試結果產生不確定的影響. 為了保證測試結果的確定性, 自動測試主線程需要通過取代對該RCB關聯(lián)的數據集里的所有成員進行取代遍歷, 將數據集里的所有成員的初始值設置成固定不變的值, 這樣就可以避免因環(huán)境溫度、 時間等變化而引起的數據集里成員值發(fā)生變化的情況, 避免對測試結果不確定的影響. 從而保證了測試結果的正確性.
2) 報告控制塊的篩選
對于被測試IED設備來說, 一般都會有多個RCB報告控制塊, 而每個報告控制塊RCB所關聯(lián)的數據集DatSet是不同的, 每個數據集DatSet中的成員數也都不同. 為了獲取到合適的RCB, 設置完RCB的屬性后, 先對RCB進行寫總召GI操作, 觸發(fā)RCB生成總召報告, 通過報告分析解析模塊可以獲取到該RCB關聯(lián)數據集的成員數量及成員信息.
3) 分幀報文的處理
因MMS的報告報文有超過1 518 B的情況, 單幀報文無法上送整個報文信息, 對分幀報文的解析分析需要進行特殊處理. 考慮到TCP報文的幀頭部分內容是固定的, 對分幀標記的偏移位進行判斷, 若分幀標記表示報文有分幀, 則將該報文的固定幀頭取出存入到列表headerbuf中, 除去固定報文幀頭以外的內容存入到segmentbuf列表中, 當發(fā)現分幀報文的尾幀后, for循環(huán)遍歷重組的segmentbuf列表并進行重新組幀, 具體實現邏輯如圖 9 所示.
圖 9 報告報文分幀處理邏輯
根據IEC61850-10標準要求, 對報告服務及其他服務都有明確要求, 在測試過程的分析和測試結果的判定時都需要參照標準要求. 報告服務的自動測試同樣適用該標準. 按照IEC61850標準要求, 報告控制塊包含的DA在RptEna=True和RptEna=False情況下具有可寫和不可寫屬性, 如表 1 所示.
表 1 報告控制塊屬性表
由于篇幅所限, 本文僅針對較為復雜較難實現自動化測試的報告服務提出了實現自動化檢測的詳細的分析、 建議及解決方法. 旨在對IEC61850服務器規(guī)約一致性測試自動化的實現提供一定的參考.
利用基于開源庫使用Python實現IEC61850服務器規(guī)約一致性自動測試的方法對工程中常見的北京四方繼保自動化股份有限公司CSC-122數字式母聯(lián)保護裝置的報告服務進行檢測.
緩存報告分段測試, 測試用例描述如表 2 所示.
表 2 報告分段測試用例說明
使用Python進行報告分段自動測試的整個過程如下:
1) 自動選取報告控制塊, 自動選取條件為該報告控制塊關聯(lián)的數據集里的成員個數≥6個;
2) 選取成功后, 通過寫GI生成總召報告并解析獲取到該報告控制塊關聯(lián)數據集里各個成員的reference信息, 如表 3 所示;
表 3 測試報告控制塊數據集成員信息
3) 重新設置連接關聯(lián)初始值PDUSize, 將初始的PDUSize值由65 000設置為600, 如表 4 所示;
表 4 PUD Size設置
4)清除隊列, 重新寫總召, 產生總召報告, 報告解析模塊實時獲取到總召報告并將解析結果存入到字典中發(fā)送到共享隊列中, 如表 5 所示;
表 5 分段報告共享隊列及實際報文
5)實時總召GI報告信息, 并根據測試用例要求判斷實際結果是否通過, 如表 6 所示;
表 6 分段總召報告內容解析
由表 6 對No.1和No.2的報告內容進行比對分析, 兩個報告中的SeqNum都為0, SubSeqNum從0開始遞增, MoreSeqmentsFollow最后一個報告該屬性值置00, 所有分段報告的TimeOfEntry值相同, 都為‘01778c7c355c’, 3個判斷條件同時滿足預期, 符合測試用例要求, 測試通過, 如圖 10 所示.
圖 10 報告分段測試結果圖
基于開源庫, 使用Python實現IEC61850服務器規(guī)約一致性自動測試能夠滿足一般服務器端IED設備的一致性通信需求, 可以通過Python語言靈活調用開源庫的各種接口, 實現IEC61850服務器規(guī)約一致性所有服務的測試, 同時由于Python語言的靈活性、 易于維護編寫性, 可以實現對取代服務、 讀寫操作等進行全覆蓋的遍歷測試, 能夠大大提升IEC61850服務器規(guī)約一致性測試的覆蓋率, 更有利于觸發(fā)和發(fā)現問題. 由于實現了自動化測試, 很好地解決了IEC61850服務器規(guī)約一致性測試對技術和專業(yè)知識要求高的問題. 進而對智能化變電站里IED設備間的互聯(lián)互通互操作[11-15]起到積極重要的作用.