王 奚,王新月,李 航,張秀明
(1.北京和利時智能技術有限公司,陜西 西安 710075;to 2.寧波和利時信息安全研究院有限公司,陜西 西安 710075;3.中國移動通信集團黑龍江有限公司,黑龍江 哈爾濱 150028)
可編程邏輯控制器(programmable logic controller,PLC)作為通用自動控制裝置,具有較強的工作環境適應性,深受工業控制界的歡迎。PLC在現代工業的各個領域都有應用,已成為自動化控制的核心[1]。國際上各大PLC制造企業都傾全力研發滿足工業生產需要的PLC,并形成系列化產品,從而在不同領域和地區構建各自的市場[2]。
隨著工業4.0概念的推出,各領域都在飛速發展,各類應用場景越來越復雜。工業控制領域中PLC所需要適應的場景、具備的功能越來越多,對PLC產品的測試工作發起挑戰。PLC產品的新功能和新應用場景的測試工作會占用更多的時間。而在保證既有功能的產品質量的前提下提高這部分測試工作的效率,是困擾業界的難題。
近年來,自動化測試領域蓬勃發展。相對于手工測試,自動化測試具有以下優點[3-4]:①提高測試效率;②實現更多高難度繁瑣操作的測試;③解放人力資源;④增強測試穩定性。這些優勢正是PLC測試所需要的。PLC測試需要完整的自動化測試系統,實現從上到下、從軟件到硬件的自動化測試平臺。
PLC控制器與編程軟件通常是捆綁在一起的。編程軟件的功能與PLC本身的功能緊密相連[5]。所以通常對PLC產品系統的測試,也包括對PLC編程軟件的測試。除了PLC編程軟件以外,PLC控制器根據功能的實現又可劃分為PLC嵌入式軟件和PLC硬件。因此,自動化測試平臺的被測對象分為以下3個部分。
①PLC編程軟件(基于IEC 61131-3標準)。對PLC 進行編程的軟件,一方面能以程序實現過程的自動化,另一方面又能對PLC 的工作狀態進行監控[5]。該軟件具有編譯、下裝、仿真、多種數據類型變量、硬件配置、多種編程語言等功能。
②PLC嵌入式軟件。PLC主要由嵌入式軟件實現部分功能,如Modbus、自由協議、文件操作、多任務等。
③PLC硬件。PLC主要由硬件實現的有DI、DO、AI、AO等通道。
PLC編程軟件的自動化測試由Python語言實現。Python是面向對象的腳本語言,具有跨平臺、可擴展、解釋性強、易學易讀等特性[6]。Pywinauto是基于Python、用于自動化測試的腳本模塊,主要功能是實現對Windows標準控件操作的可編程處理,包括對窗口的指定、鼠標或鍵盤操作、獲得控件屬性等[7]。對PLC編程軟件測試的實現就是通過Pywinauto等工具對界面中各個控件的識別,并模擬鼠標和鍵盤對這些控件進行操作,從而實現對編程軟件的自動化測試。
目前,B/S體系的軟件自動化測試比較成熟。它的表示層為通用的瀏覽器[8]?,F有的工具Selenium可以完全模擬用戶在瀏覽器上進行各種Web操作[9]。而PLC編程軟件作為C/S體系的軟件,控件標準程度較低,自動化測試的轉化難度遠高于B/S軟件,使用到的Pywinauto等工具也不如Selenium成熟、穩定。因此,實現方案需要在現有工具的基礎上封裝一些對控件常用的操作方法,并在測試用例轉化時調用這些方法,從而大大提高轉化效率以及對后續軟件升級的兼容性。
例如,將右鍵菜單頁面的選擇封裝成1個函數,如下所示。
def right_menu_select(*args):
"""
右鍵選擇 AT最多存在兩級右鍵菜單,支持兩級
@Time : 2020/3/6
@Author : wangxi
:param args: 右鍵菜單元素名稱或序號(str/int),逗號隔開,兩種類型可組合使用:
"""
m = 0
#標志位
if len(args) > 2:
#輸入大于兩個元素報錯
raise TypeError(' right_menu_select takes 2 positional argument but {} were
given'.format(len(args)))
for input_name in args:
if isinstance(input_name, int):
#輸入為int型
Keyboard.SendKeys('{VK_DOWN %d}' % input_name)
Keyboard.SendKeys('{ENTER}')
elif m == 0:
#輸入為str型且第一級菜單
popwindow.child_window(title=input_name,
control_type="MenuItem").click_input()
elif m == 1:
#輸入為str型且第二級菜單
popmenu.child_window(title=input_name,control_type="MenuItem").click_input()
m = 1
測試用例中,使用到右鍵菜單選擇操作時,調用這個函數并傳入相應參數即可。如后續編程軟件升級導致右鍵菜單控件的識別或用法發生變化,則直接修改該函數即可。這對于不斷升級的軟件的測試非常重要。類似的基礎方法封裝有80個。這些方法構成了測試框架的基礎層。
為了滿足常用業務場景,基礎方法的上一層作了業務方法的封裝,例如變量、硬件配置、程序組織單元(program organization unit,POU),包括程序、功能塊、函數等。根據業務的復雜程度,每種業務封裝了幾個至幾十個方法不等。這2層方法的封裝不僅可以提高測試用例轉化為腳本語言的轉化效率,還可大大降低后續的維護成本。
業務層的上一層是用例層。用例層中用到的一些便利方法如下所示。
①ddt數據結構。該結構將測試數據和測試代碼分開,提高了代碼轉化及執行效率,并且便于后期維護。
②ini配置文件。其存儲全局變量等信息,便于后期維護。
③異常截圖。在用例執行失敗或錯誤后截圖保存,可方便定位分析問題。
④測試記錄寫入。該功能可以將每條用例的執行結果自動填入記錄測試結果的excel文檔;測試結果自動填入pass/fail/error;執行人自動填入robot。這可以替代手動整理測試記錄的工作。
測試框架采用了Python的單元測試框架unittest。unittest具有能夠組織、管理和執行多個測試用例,以及提供豐富的斷言方法等優點。每條測試用例寫在1個testcase中,執行過程包括測試前準備環境的搭建(setUp)、執行測試代碼、還原測試后環境(tearDown),以及根據斷言輸出pass和fail的測試結果。測試報告使用了HTMLTestRunner,將testcase中斷言的結果打印在報告中并進行數據統計。
嵌入式軟件測試采用對PLC編程軟件的操作與編寫自動化測試工程相結合的方式實現。對PLC編程軟件的操作采用了與2.1節中PLC編程軟件自動化測試相同的方法實現,使用了Python語言。自動化測試工程是使用PLC編程軟件編寫的自動化測試工程。每個工程可以測試嵌入式軟件某項功能。
例如,Modbus主站功能的自動化測試工程。工程中組態邏輯如下。
①使用Modbus寫的功能碼向從站(從站通常選用PLC控制器,需配合組態相關從站邏輯)寫隨機數。
②用Modbus讀取功能碼讀回寫入地址上的數據。
③對比每個讀取與寫入的數據:如相同,則繼續;如不同,則記錄相關錯誤信息以及錯誤次數。
④工程中,組態以邏輯①~邏輯③的方式測試所有PLC支持的Modbus功能碼后,由主站通過通信方式通知從站切換到下一種通信參數(波特率校驗位停止位的組合);同時,主站切換到下一種通信參數。
⑤切換后,再次進行上述的通信測試,在整個過程中統計丟包率及記錄診斷異常信息。
自動化測試工程是整個嵌入式軟件自動化測試的核心,可以實現對嵌入式軟件功能的測試。但每個自動化測試工程僅實現了針對單一功能的自動化測試。為了將這些單一功能的測試串聯起來,就需要對PLC編程軟件進行自動化操作,為每個工程編寫配置文件,使Python按照配置文件的內容進行一系列操作。例如工程打開關閉、工程下裝監視在線讀寫數據。這就實現了各個子功能測試之間的銜接。
嵌入式軟件自動化測試工作流程如圖1所示。
圖1 嵌入式軟件自動化測試工作流程
嵌入式軟件自動化測試工作流程主要通過解析配置文件并按照配置文件描述的信息執行操作步驟,例如下裝在線任務啟動讀寫變量等。每個配置文件執行完成后會產生1個pass或fail的測試結果。所有配置文件執行完成后生成測試報告。
PLC硬件自動化測試方案采用硬件測試和軟件界面相結合的方式。
①硬件測試。國家儀器公司(National Instrument,NI)板卡具有精度高、可靠性高、用戶接口功能強大等特點[10]。硬件通道測試采用NI板卡,通過對PLC各輸出通道的采集及輸入通道的輸出控制等實現對PLC硬件功能的測試。
②軟件界面。LabVIEW是基于圖形編譯語言的虛擬儀器軟件開發平臺。其表現形式和功能類似于實際的儀器,特別適用于實驗室等需要經常改變儀器和設備參數及對信號進行分析研究的場合[11]。系統采用LabVIEW實現與控制器數據交互,與NI板卡數據的交互、控制,界面圖形的組態,以及數據處理等功能。
硬件自動化測試環境如圖2所示。
圖2 硬件自動化測試環境
軟硬件結合使用實現了對AI/AO精度、穩定度、通道間串擾以及DI/DO邏輯等功能的測試驗證。
PLC硬件自動化測試流程如下。
①使用PLC編程軟件編寫實現相關功能的標準化測試工程。LabVIEW軟件調用接口程序下裝組態工程到PLC,使PLC硬件通道實現相應功能。
②LabVIEW軟件控制NI板卡提供可編程控制器輸入、輸出信號、通信等功能信號,同時通過動態連接庫與PLC進行數據交互,獲取測試結果。
③LabVIEW軟件控制器完成測試過程,生成測試報告,保存測試數據。
完整的測試流程是通過Jenkins調度完成的,具體按照以下步驟進行自動觸發調度。
①執行腳本自動安裝最新提測軟件(編程軟件)及升級PLC的固件版本(嵌入式軟件),為后續測試作好準備。
②執行UI Test實現對PLC編程軟件測試,生成測試報告。
③執行Firmware Test,實現對控制器嵌入式軟件的測試,生成測試報告。
④將以上生成的所有測試報告通過郵件形式發送給相關人員。
根據測試需要,步驟②和步驟③可以都執行,也可以選擇性執行其中1個。
PLC自動化測試系統平臺如圖3所示。
圖3 PLC自動化測試系統平臺示意圖
PLC自動化測試系統平臺目前已在和利時LE、MC、LK系列產品以及編程軟件AutoThink上測試、使用。根據測試需要,測試應用場景分以下3種。
①每日構建:篩選部分自動化測試用例,以確保每日構建軟件版本的可用性。
②單元測試:篩選部分自動化測試用例可覆蓋基本功能,確保提交集成測試前所有基本功能可用。
③集成/系統測試:根據版本變更范圍,執行全部或大部分自動化測試用例,確保除新增/修改功能以外的功能正常。
本文設計并實現了以PLC產品及其編程軟件為對象的自動化測試系統平臺。該平臺對3個不同的被測對象選取了不同的測試方案,并使用Jenkins將各部分流程串接起來,實現了整體的自動化測試。該平臺可滿足每日構建測試、單元測試和集成測試這3種測試場景的使用。該平臺的投用大大提升了PLC產品的測試效率及產品穩定性。