李亞運,孫耀杰
(河北工業大學 電子信息工程學院,天津 300401)
基于ISO15765的C++程序檢測方法
李亞運,孫耀杰
(河北工業大學 電子信息工程學院,天津 300401)
一個C++程序工程被完成之后,不可能馬上投入使用,要經過大量的調試和優化.C++程序工程通常由一個個函數所構成,函數中的關鍵變量或返回值在程序執行過程中是否出現異常,可以映射出程序的運行狀況.因此,為了減少對程序的修改次數,縮短調試程序的時間,研究設計了一種基于ISO15765的C++程序檢測方法.制定了上、下位機通信協議規范;開發了符合ISO15765的底層函數檢測協議棧;開發了C++函數檢測上位機系統;設計了Excel格式的測試案例來傳遞函數變量及記錄檢測結果.
ISO15765;函數;檢測;底層協議棧;上位機
在過去的幾年里軟件行業得到了迅猛的發展,以汽車為例,從發動機到變速器再到剎車,越來越多的功能靠微處理器及其軟件進行控制.許多企業為了改善其軟件系統的質量以及軟件開發過程的質量,對軟件的評估與測試越來越重視.軟件測試是一項技術性的工作,但同時也涉及經濟學和心理學的一些重要因素.多年以來,軟件界的大多數人都持有一個想法,即編寫程序僅僅是為了提供給機器執行,并不是供人們閱讀,軟件測試的唯一方法就是在計算機上執行它[1].
但是后來,程序員們逐漸認識到檢測程序源代碼對于構成完善的軟件測試和調試手段的價值.相對于在計算機上測試軟件應用,直接檢測源代碼的優點在于,一旦發現錯誤通常就能在代碼中對其進行精確定位,這就大大降低了調試成本.另外,這個過程往往會發現成批的錯誤,這樣錯誤就可以一同得到修正.因此,本文根據C++語言的結構特點,研究分析了一種基于ISO15765協議的C++程序檢測方法,并應用此方法開發了一款C++函數檢測系統.
本文研究的C++測試方法設計的基本原理主要包括 ISO15765診斷協議和 CAN總線技術. ISO15765協議為ISO11898中指定的CAN通信車載診斷系統定義了通用要求.CAN通信車載診斷系統有其特有的硬件與軟件配置,如果傳輸系統本身有故障,則整個CAN網絡中的信息將無法傳輸. CAN總線系統是一個有兩條線的總線系統,通過這兩個數據總線,數據便可以按順序傳到與系統相連的控制單元.下面將對ISO15765診斷協議規范和CAN總線技術特點進行詳細地介紹.
1.1 ISO15765體系結構
雖然ISO15765協議主要應用于車載CAN診斷系統,但是ISO15765協議也能夠作為其他CAN通信系統的網絡層協議.這是因為,ISO15765協議基于ISO/IEC 7498和ISO/IEC 10731指定的開發互聯參考(OSI)模型.OSI模型將通信系統分為7層,從上到下依次為應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層以及物理層,其中的一部分被應用到ISO15765協議.

圖1 ISO15765體系結構Fig.1 Architecture of ISO15765
圖1將ISO15765協議映射到OSI模型,ISO15765定義的服務被分割成3部分:IS0 15765-3定義的診斷服務對應著應用層;ISO15765-2定義的網絡層服務對應著網絡層,ISO11898-1定義的CAN通信服務對應著數據鏈路層和物理層.不僅應用層服務要遵守ISO 14229-1和ISO 15031-5這些國際診斷標準,ISO15765-3協議也要與國家標準或汽車制造商自定義的標準兼容.網絡層服務可以獨立于物理層實現,并且只為通用車載診斷(OBD)指定物理層,對于其他應用領域,ISO15765協議可以應用在任何CAN物理層.
1.2 CAN總線技術特點
1986年2月,Robert Bosh公司在SAE(美國汽車工程師學會)大會上介紹了一種新型的串行總線-CAN(控制器局域網),那是CAN誕生的時刻.后來由于CAN本身的通信速率高、可靠性好、價格低等特點,其應用領域已不再局限用于汽車行業,而向鐵路、武器裝備和一般工業自動化領域發展.1991年,Philips Semiconductors制定了CAN總線技術規范Version2.0,這使得不同領域通信報文標準化、規范化,從而讓任何兩個CAN節點之間建立兼容性.1993年11月,CAN的國際標準ISO11898出版,這標志著CAN總線技術將逐漸成為工業數據通信的主流技術之一[2].
CAN總線是一種分布式的控制總線,總線上的每一個節點一般來說都比較簡單,通過CAN總線將各節點連接只需要較少的線纜,可靠性也較高.ISO11898定義了一個總線結構的拓撲,采用干線和支線的連接方式:干線的兩個終端都端接一個120 Ω的終端電阻;節點通過沒有端接電阻的支線連接到總線[3],CAN總線網絡結構如圖2所示.

圖2 CAN總線網絡結構示意圖Fig.2 Diagram of CAN bus network structure
在實際應用中,可通過擴大CAN總線通信距離,增加CAN總線工作節點的數量,如圖3所示.眾多工作節點之間需要進行大量的實時數據交換.若所有工作節點都掛在一個CAN網絡上,這么多節點通過一條CAN總線進行通信,信息管理配置稍有不當,就很容易出現總線負荷過大,將導致系統實時響應速度下降,這在實時系統中是不允許的.因此在對各工作節點的實時性進行了分析之后,根據各節點對實時性的要求,設計高、低速兩個速率不同CAN通信網絡.將實時性要求嚴格、可靠性要求高的節點組成高速CAN通信網絡,將其他實時性要求較低的節點組成低速CAN通信網絡,并架設網關將這兩個速率不同的CAN通信網絡連接起來,實現全部節點之間的數據共享[4].

圖4 基于ISO15765的程序檢測方法的優點Fig.4 The advantages of the program detection method based on ISO15765
基于ISO15765協議的程序檢測方法與其他程序檢測方法相比較具有以下4個方面的優勢,如圖4.經濟性:基于ISO15765的檢測方法需要的設備、工時、人力很少,而且對人員的專業素質要求不高,于是該方法的檢測作業費用很低.穩定性:在相同的檢測條件下,各變量、參數、結果的測量值具有良好的一致性[5].通用性:ISO15765協議是一個通用型很強的協議,應用該協議作為C++程序檢測的通信標準是對該協議的創新使用.可以將這一檢測方法擴展到檢測其他語言類型的程序,使其得到更加廣泛的應用.法規適應性:基于ISO15765的檢測方法的核心思想是采用黑盒測試這一重要的測試策略,將程序視為一個黑盒子,測試目標與程序的內部機制、結構完全無關,而是將重點集中放在發現程序中關鍵變量值是否在正確的取值范圍.
應用本文設計的檢測方法開發具有實際檢測功能的C++函數檢測系統.檢測系統利用CAN總線進行上、下位機的通信,完成函數變量的傳遞、賦值及檢測,通信過程中遵循基于ISO15765的通信協議規范,最后結果在Excel案例中列表顯示.
2.1 開發環境與編程語言
檢測系統使用微軟的Visual Studio 2013作為開發環境,C++作為編程語言,開發過程可以概述為VC++編寫MFC窗口界面,下圖5為檢測系統上位機界面.

圖5 上位機系統界面Fig.5 Interface design of upper device
C++與C相比有許多優點,主要體現在封裝性、繼承性和多態性.封裝性把數據和操作數據的函數組織在一起,不僅使程序結構更加緊湊,并且提高了類內部數據的安全性;繼承性增加了軟件的可擴充性及代碼重用行;多態性使設計人員在設計程序時可以對問題進行更好的抽象,有利于代碼的維護和可重用[6].
VC++全稱是Visual C++,是由微軟提供的C++開發工具,它與C++的根本區別就在于,C++是語言,而VC++是用C++語言編寫程序的工具平臺.MFC全稱Microsoft Foundation Classes,也就是微軟基礎類庫.它是VC++的核心,是C++與Windows API的結合,很徹底的用C++封裝了Windows SDK(Software Development Kit,軟件開發工具包)中的結構和功能,不需要開發者再去解決那些很復雜很乏味的難題,比如每個窗口都要使用Windows API注冊、生成與管理.VC++不是只能夠創建MFC應用程序,MFC也不是只能用于VC++中,它同樣也可以用在Borland C++等編譯器中,但是幾乎沒有人這樣做.

表1N_PDU格式Tab.1 Format of N_PDU

表2 網絡層幀類型Tab.2 Frame type of Network layer

圖6 上、下位機的通信機制Fig.6 Communication mechanism between upper and lower computer

表3 基于ISO15765的診斷服務列表Tab.3 Diagnostic services based on ISO15765

圖7 系統工作流程圖Fig.7 Working flowchart of system
2.2 數據傳輸機制
協議數據單元(N_PDU) 由3個部分組成,如表1所示.N_PDU使得數據在網絡層的單節點與單節點之間,或者單節點與多個其他節點(對等協議實體)之間傳輸.
N_AI:用于識別網絡層的通信對等實體,本文檔采用11位的ID號.
N_PCI:識別相互交換的N_PDU的類型,網絡數據單元類型包括單幀、首幀、后續幀和流控制4種.每種類型對應的格式如表2所示.
N_Data:用于向上位機傳輸請求的數據,格式如表2所示.
圖6是檢測系統上、下位機通信機制的示意圖.下位機(Sever) 與上位機(Client) 之間是以數據幀(格式如表2所示)的方式進行通信的.上位機發送給下位機的報文稱之為請求,下位機發送給上位機的報文稱之為回復,由上位機發送的請求信息包括SID,FID(測試函數的ID),PID(輸入變量的ID),輸入值,由控制器反饋的響應信息包括SID,FID(對應于測試函數的ID) ,PID(輸出變量的ID),輸出值數據.
2.3 診斷服務定義
應用ISO15765協議的定義的診斷服務可以使下位機與上位機之間的通信方式更加標準化、規范化,具體應用的診斷服務如表3.服務0x22的目的是讀取測試案例中的輸入值數據,并通過CAN通信對C++程序中函數的變量進行賦值;服務0x31的功能是啟動函數執行;而服務0x2f的作用是利用CAN總線將輸出值數據傳入Excel表中的相應位置.
系統工作時會將表3中服務依次應用,具體流程如圖7所示.點擊瀏覽按鈕(系統界面如圖4),選擇要操作的測試案例,某一案例被選中后,系統首先會對案例進行整體掃描,采集案例的格式、有效行、列數、輸入值個數等參數信息.案例信息被采集完全后,會在“Information”編輯框內出現提示消息.此時,點擊開始工作按鈕,則上位機系統與底層協議棧之間開始進行CAN通信.
第1步,進行輸入值的傳遞.
第2步,上位機在輸入值賦值完畢后請求函數執行,C++函數連續執行十次之后給予上位機正響應.
第3步,得到正響應的上位機向底層協議棧請求輸出值,然后進行輸出值的傳遞.
第4步,上位機對得到的輸出值進行判定,如果所有的輸出值都在有效范圍內,則認證為“Succeed”,否則為認證為“Fail”.
經過以上4步操作,將C++函數中的輸出值、輸入值、認證結果造表,形成最后的報告.查看報告有兩種方法,一種是直接找到報告所在文件夾,雙擊打開;另一種方法更加便捷,可以直接點擊CheckResult按鈕在“Result List”編輯框內查看.

圖8 Office應用程序對象模型Fig.8 Application object model of office
2.4 MFC操作Excel
測試案例的格式是Excel,在使用MFC對Excel進行讀寫操作之前,首先要了解微軟Excel對象模型.觀察圖8,其中Application代表應用程序本身.即Excel應用程序;workbooks是Workbook的集合,代表了工作薄;Worksheets是Worksheet的集合,是Workbook的子對象;Range是Worksheet的子對象,可以理解為Sheet中一定范圍的單元格;Shapes是Worksheet的子對象,用于存儲圖片等信息的單元格.
利用VC操作Excel的方法通常有兩種:1)利用ODBC把Excel文件當成數據庫文件進行讀、寫、修改等操作,網上有人編寫了CSpreadSheet類,可以提供支持.2)利用Automation(OLD Automation)方法,將Excel當成組件服務器,利用VBA,又分為基于MFC的和SDK兩種.本文使用的是第2種基于MFC的OLE編程方法,具體實現過程如下:
1)首先項目中添加類”Typelib中的MFC類->選擇文件中”,選擇office的安裝路徑中的excel.exe.
2)選中以下幾項_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然后導入.
3) 導入后自動在工程中添加 Capplication,CworkSheet,CworkBook,CworkSheets,CworkBooks,Crange這些類;并將把這些類的頭文件中的第一句話#import".......EXCEL.EXE"nonamespace刪除.
4)編譯時會遇到問題Not enough actual parameters for macro'DialogBoxW'.解決的方法:在CRange類中找到VARIANT DialogBox() {},并將DialogBox其改成_DialogBoxW.
5)在MFC對話框上添加控件按鈕,并添加事件,寫入自定義代碼.
將本文設計的檢測系統對聯騰動力新能源汽車項目的VCU行車程序進行檢測,從行車程序中選取Runcase、TC_DriveBackup、TC_DriveFeedback、TC_DriveForward、TC_TrqSend等五個函數作為樣本測試函數.系統運行情況良好,被反復使用亦未出現BUG,能夠檢測出函數中出現的錯誤,且沒有發現誤判現象.由此說明,本文提出的基于ISO15765的C++程序檢測方法能夠實際運用到C++程序的測試中,并且效果理想.
[1]Myers G J.軟件測試的藝術[M].張曉明,黃琳,譯.北京:機械工業出版社,2006.
[2]朱雙華.汽車CAN系統故障診斷與檢測技術[M].長沙:國防科技大學出版社,2008.
[3]張文杰,王坤.淺談CAN通信的硬件抗干擾設計[J].科技信息,2012(23):144-144.
[4]龍志強,李曉龍,竇峰山,等.CAN總線技術與應用系統設計[M].北京:機械工業出版社,2013.
[5]鄭建華,朱蓉.面向Web系統開發的代碼自動生成技術研究[J].福建電腦,2011,27(12):8-9.
[6] 孫鑫.VC++深入詳解[M].北京:電子工業出版社,2012.
[責任編輯 代俊秋]
A detection method of C++program based on ISO15765
LI Yayun,SUN Yaojie
(School of Electronics and Information Engineering,Hebei University of Technology,Tianjin 300401,China)
A C++program project can not be used immediately when it is completed.And it must be debugged and optimized heavily.A C++program project usually consists of some functions.The running status of C++application can be known by making judgments about whether the key value or return value of the function is abnormal or not.So a detection method of C++program based on ISO15765 is designed to reduce the modification times and debugging time of the program.The communication standard between the upper system and the lower system is finished;An underlying function detection protocol stack in line with ISO15765 standards is developed;A host computer system with the function of C++function detection is developed;An detection case in Excel format is made up to transmit parameter and log the detection results.
ISO15765;function;detection;underlying protocol stack;PC Software
TP391.5
A
1007-2373(2017)01-0024-05
10.14081/j.cnki.hgdxb.2017.01.004
2016-11-21
天津市自然科學基金重點項目(14JCZDJC32600)
李亞運(1991-),男,碩士.
:孫耀杰(1960-),男,教授,sun678@126.com.