吳惠妍
(北京全路通信信號研究設計院集團有限公司,北京 100070)
隨著軟件復雜度的增加,傳統的軟件開發方法已不能滿足效率和安全性的需求。為解決這一不足,高安全應用開發環境SCADE應運而生,SCADE已普遍應用于航空航天、國防、軌道交通等對安全性要求極高的領域。SCADE開發的模型在經過模型仿真以及模型測試后可直接生成高安全性的代碼。
SCADE模型仿真和測試普遍采用人工編輯輸入數據測試的方式,這使得大多數的測試只能手動進行,沒有測試輔助工具或者測試腳本支持數據生成。而且人工編輯的數據由于其與真實數據存在差異,測試環境的保真度差,這也會導致不確定或者不正確的測試結果(假陽性和假陰性結果)。此外,在與外部實物環境進行聯合測試時,需要編譯并裝載(load)到目標平臺上,如果發現新的缺陷(bug),則需要返回模型再次修改,如圖1所示,開發、仿真、測試效率亟待提高。

圖1 傳統仿真流程Fig.1 Traditional simulation process
如果在模型設計階段就能將模型與外部實物環境進行互聯,測試環境的仿真度得以提高,進而減少模型生成代碼編譯后裝載到平臺上產生的錯誤,這樣測試也不會被視作發生在瀑布開發周期后期的一個階段,而是不斷發生在迭代、增量和并發開發周期的持續性活動完成快速迭代。實物接入在線仿真環境如圖2所示。關鍵技術在于模型如何與外部實物通信。

圖2 實物在線仿真Fig.2 Online physical simulation
SCADE自帶的模型庫不包含與外界進行通信的模塊,需要進行單獨開發。與外界通信有多種方式,如基于以太網的UDP、TCP通信、串行通信等,本文以最常用的通信為例,闡述SCADE與外界通信的實現方式。
UDP發送模塊中包含數據拷貝模塊,該模塊用于將變長的數據格式化為固定長度的數據,UDP發送模塊是導入代碼模塊,是由人工編寫代碼的方式采用C語言實現的socket通信,實現根據socket句柄、IP地址及端口號完成UDP數據的發送。
該UDP通信模塊實現與外部實物互聯,其特點在于:1)支持數據錄播及回放功能,可以提高回歸測試自動化的程度;2)UDP通信IP地址和端口號可配置;3)UDP通信模塊支持多路鏈接,且鏈路之間相互獨立,沒有任何依賴及干擾。
UDP通信接收子模塊共有3個分支,其中,第1個分支由UDP信息接收(updRecvElt)操作符、數據錄入(dataSava)操作符構成,該分支用于實物環境下的仿真,并同時錄制數據;第2個分支由數據下載(dataLoad)操作符構成,該分支用于離線環境的實現數據回放;第3個分支由UDP信息接收(updRecvElt)操作符構成,該分支用于僅在實物環境下的仿真,不需要錄制數據的場景。
關鍵部分包含UDP信息接收操作符、數據錄入操作符、數據下載操作符,這3個操作符均為導入代碼模塊(Imported Operator),是由人工編寫C代碼導入實現的。其中,UDP信息接收操作符用于根據socket句柄及端口號完成UDP數據的接收;數據錄入操作符用于完成每個測試用例中測試數據的記錄,每一次記錄形成一個以"testcase*"命名的文件夾,各端口收集的數據分別存儲到不同的命名為"data*.csv"的文件中,如圖3所示,數據下載操作符用于完成數據的回放,當選擇回放記錄條目后,該模塊會讀取對應的"data*.csv"的數據并載入仿真環境中。

圖3 數據記錄格式Fig.3 Data record format
接口設計時采用參數配置的方式。配置參數包括端口"port",IP地址"add*",數據長度"dataLen",如圖4所示,使用相關模塊時,僅需在模塊屬性對話框中進行參數設置即可。

圖4 接口設計Fig.4 Interface design
被測模型可能同時存在多個與外界通信的接口,且各通信之間需要相互獨立,不能相互依賴及干擾,因此UDP通信模塊將socket句柄交由外部模型來管理。UDP通信模塊申請socket句柄之后將套接字句柄(socketHander)交由SCADE的"last"變量保存,如圖5所示中的"last’socketHandler"。這樣多個UDP連接可以通過同一個UDP信息接收模塊分時復用,在不同時刻通過輸入不同的套接字句柄來實現,UDP通信由模型的輸入參數(socketHanderIn)決定。

圖5 socketHandler處理Fig.5 socketHandler processing
SCADE有數據流圖和安全狀態機兩套建模機制,分別適合于連續系統和離散系統建模。本文提供的模型與實物聯合仿真測試框架采用狀態機來實現,狀態機中有4個狀態。
1)初始(init)狀態包含索引(indexPlus)操作符。在實物環境下仿真測試時會記錄多個測試用例(testcase*)。索引操作符用于選定仿真過程從哪個測試用例開始載入數據。
2)數據回放狀態(dataReplay)包含無數據(noData)模塊和被測模塊環境(testEnv)。無數據模塊用于判定所選取的數據包(一個測試用例中可能有多個數據包)是否已讀完,只在有數據的時候才能激活。而被測模塊環境是對被仿真模塊搭建的仿真環境,被仿真測試模型SystemUT有6個通信連接,因此為其搭建了對應的仿真測試環境模塊。被仿真測試模型環境內嵌到一個初始化操作符中,切換到新的測試用例之前要先初始化被測對象的仿真環境。
3)新用例(newCase)狀態用于在本測試用例的數據包數據讀完之后切換至下一個測試用例,當測試用例全部讀完并仿真后,進入終止(finish)狀態。
4)終止(finish)狀態,仿真結束。
整個仿真測試流程如圖6所示。從第一個測試用例開始測試過程,遍歷測試用例中所有數據包中的數據并發送給被測對象,在每個測試用例測試結束后,需要進行測試仿真環境的初始化,以便準備下一個測試用例。這樣迭代直至所有測試用例執行完畢,測試結束。

圖6 測試框架工作流程Fig.6 Test framework workflow
相比僅在SCADE內部做模型仿真測試,與外部實物環境的聯合仿真有更多優勢:
1)模型測試能夠獲得更真實的測試數據輸入;
2)省去了繁重的手工編輯測試數據的工作,保證數據的有效性,測試變得更加便捷快速;
3)數據記錄和回放功能使得仿真測試可以脫離外部實物環境也能進行同樣真實度的仿真測試;
4)在數據記錄完之后的回歸測試更加方便,可實現自動化。