李亞運(yùn),孫耀杰
(河北工業(yè)大學(xué) 電子信息工程學(xué)院,天津 300401)
基于ISO15765的C++程序檢測(cè)方法
李亞運(yùn),孫耀杰
(河北工業(yè)大學(xué) 電子信息工程學(xué)院,天津 300401)
一個(gè)C++程序工程被完成之后,不可能馬上投入使用,要經(jīng)過(guò)大量的調(diào)試和優(yōu)化.C++程序工程通常由一個(gè)個(gè)函數(shù)所構(gòu)成,函數(shù)中的關(guān)鍵變量或返回值在程序執(zhí)行過(guò)程中是否出現(xiàn)異常,可以映射出程序的運(yùn)行狀況.因此,為了減少對(duì)程序的修改次數(shù),縮短調(diào)試程序的時(shí)間,研究設(shè)計(jì)了一種基于ISO15765的C++程序檢測(cè)方法.制定了上、下位機(jī)通信協(xié)議規(guī)范;開(kāi)發(fā)了符合ISO15765的底層函數(shù)檢測(cè)協(xié)議棧;開(kāi)發(fā)了C++函數(shù)檢測(cè)上位機(jī)系統(tǒng);設(shè)計(jì)了Excel格式的測(cè)試案例來(lái)傳遞函數(shù)變量及記錄檢測(cè)結(jié)果.
ISO15765;函數(shù);檢測(cè);底層協(xié)議棧;上位機(jī)
在過(guò)去的幾年里軟件行業(yè)得到了迅猛的發(fā)展,以汽車(chē)為例,從發(fā)動(dòng)機(jī)到變速器再到剎車(chē),越來(lái)越多的功能靠微處理器及其軟件進(jìn)行控制.許多企業(yè)為了改善其軟件系統(tǒng)的質(zhì)量以及軟件開(kāi)發(fā)過(guò)程的質(zhì)量,對(duì)軟件的評(píng)估與測(cè)試越來(lái)越重視.軟件測(cè)試是一項(xiàng)技術(shù)性的工作,但同時(shí)也涉及經(jīng)濟(jì)學(xué)和心理學(xué)的一些重要因素.多年以來(lái),軟件界的大多數(shù)人都持有一個(gè)想法,即編寫(xiě)程序僅僅是為了提供給機(jī)器執(zhí)行,并不是供人們閱讀,軟件測(cè)試的唯一方法就是在計(jì)算機(jī)上執(zhí)行它[1].
但是后來(lái),程序員們逐漸認(rèn)識(shí)到檢測(cè)程序源代碼對(duì)于構(gòu)成完善的軟件測(cè)試和調(diào)試手段的價(jià)值.相對(duì)于在計(jì)算機(jī)上測(cè)試軟件應(yīng)用,直接檢測(cè)源代碼的優(yōu)點(diǎn)在于,一旦發(fā)現(xiàn)錯(cuò)誤通常就能在代碼中對(duì)其進(jìn)行精確定位,這就大大降低了調(diào)試成本.另外,這個(gè)過(guò)程往往會(huì)發(fā)現(xiàn)成批的錯(cuò)誤,這樣錯(cuò)誤就可以一同得到修正.因此,本文根據(jù)C++語(yǔ)言的結(jié)構(gòu)特點(diǎn),研究分析了一種基于ISO15765協(xié)議的C++程序檢測(cè)方法,并應(yīng)用此方法開(kāi)發(fā)了一款C++函數(shù)檢測(cè)系統(tǒng).
本文研究的C++測(cè)試方法設(shè)計(jì)的基本原理主要包括 ISO15765診斷協(xié)議和 CAN總線(xiàn)技術(shù). ISO15765協(xié)議為ISO11898中指定的CAN通信車(chē)載診斷系統(tǒng)定義了通用要求.CAN通信車(chē)載診斷系統(tǒng)有其特有的硬件與軟件配置,如果傳輸系統(tǒng)本身有故障,則整個(gè)CAN網(wǎng)絡(luò)中的信息將無(wú)法傳輸. CAN總線(xiàn)系統(tǒng)是一個(gè)有兩條線(xiàn)的總線(xiàn)系統(tǒng),通過(guò)這兩個(gè)數(shù)據(jù)總線(xiàn),數(shù)據(jù)便可以按順序傳到與系統(tǒng)相連的控制單元.下面將對(duì)ISO15765診斷協(xié)議規(guī)范和CAN總線(xiàn)技術(shù)特點(diǎn)進(jìn)行詳細(xì)地介紹.
1.1 ISO15765體系結(jié)構(gòu)
雖然ISO15765協(xié)議主要應(yīng)用于車(chē)載CAN診斷系統(tǒng),但是ISO15765協(xié)議也能夠作為其他CAN通信系統(tǒng)的網(wǎng)絡(luò)層協(xié)議.這是因?yàn)?,ISO15765協(xié)議基于ISO/IEC 7498和ISO/IEC 10731指定的開(kāi)發(fā)互聯(lián)參考(OSI)模型.OSI模型將通信系統(tǒng)分為7層,從上到下依次為應(yīng)用層、表示層、會(huì)話(huà)層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層以及物理層,其中的一部分被應(yīng)用到ISO15765協(xié)議.
圖1 ISO15765體系結(jié)構(gòu)Fig.1 Architecture of ISO15765
圖1將ISO15765協(xié)議映射到OSI模型,ISO15765定義的服務(wù)被分割成3部分:IS0 15765-3定義的診斷服務(wù)對(duì)應(yīng)著應(yīng)用層;ISO15765-2定義的網(wǎng)絡(luò)層服務(wù)對(duì)應(yīng)著網(wǎng)絡(luò)層,ISO11898-1定義的CAN通信服務(wù)對(duì)應(yīng)著數(shù)據(jù)鏈路層和物理層.不僅應(yīng)用層服務(wù)要遵守ISO 14229-1和ISO 15031-5這些國(guó)際診斷標(biāo)準(zhǔn),ISO15765-3協(xié)議也要與國(guó)家標(biāo)準(zhǔn)或汽車(chē)制造商自定義的標(biāo)準(zhǔn)兼容.網(wǎng)絡(luò)層服務(wù)可以獨(dú)立于物理層實(shí)現(xiàn),并且只為通用車(chē)載診斷(OBD)指定物理層,對(duì)于其他應(yīng)用領(lǐng)域,ISO15765協(xié)議可以應(yīng)用在任何CAN物理層.
1.2 CAN總線(xiàn)技術(shù)特點(diǎn)
1986年2月,Robert Bosh公司在SAE(美國(guó)汽車(chē)工程師學(xué)會(huì))大會(huì)上介紹了一種新型的串行總線(xiàn)-CAN(控制器局域網(wǎng)),那是CAN誕生的時(shí)刻.后來(lái)由于CAN本身的通信速率高、可靠性好、價(jià)格低等特點(diǎn),其應(yīng)用領(lǐng)域已不再局限用于汽車(chē)行業(yè),而向鐵路、武器裝備和一般工業(yè)自動(dòng)化領(lǐng)域發(fā)展.1991年,Philips Semiconductors制定了CAN總線(xiàn)技術(shù)規(guī)范Version2.0,這使得不同領(lǐng)域通信報(bào)文標(biāo)準(zhǔn)化、規(guī)范化,從而讓任何兩個(gè)CAN節(jié)點(diǎn)之間建立兼容性.1993年11月,CAN的國(guó)際標(biāo)準(zhǔn)ISO11898出版,這標(biāo)志著CAN總線(xiàn)技術(shù)將逐漸成為工業(yè)數(shù)據(jù)通信的主流技術(shù)之一[2].
CAN總線(xiàn)是一種分布式的控制總線(xiàn),總線(xiàn)上的每一個(gè)節(jié)點(diǎn)一般來(lái)說(shuō)都比較簡(jiǎn)單,通過(guò)CAN總線(xiàn)將各節(jié)點(diǎn)連接只需要較少的線(xiàn)纜,可靠性也較高.ISO11898定義了一個(gè)總線(xiàn)結(jié)構(gòu)的拓?fù)?,采用干線(xiàn)和支線(xiàn)的連接方式:干線(xiàn)的兩個(gè)終端都端接一個(gè)120 Ω的終端電阻;節(jié)點(diǎn)通過(guò)沒(méi)有端接電阻的支線(xiàn)連接到總線(xiàn)[3],CAN總線(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示.
圖2 CAN總線(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)示意圖Fig.2 Diagram of CAN bus network structure
在實(shí)際應(yīng)用中,可通過(guò)擴(kuò)大CAN總線(xiàn)通信距離,增加CAN總線(xiàn)工作節(jié)點(diǎn)的數(shù)量,如圖3所示.眾多工作節(jié)點(diǎn)之間需要進(jìn)行大量的實(shí)時(shí)數(shù)據(jù)交換.若所有工作節(jié)點(diǎn)都掛在一個(gè)CAN網(wǎng)絡(luò)上,這么多節(jié)點(diǎn)通過(guò)一條CAN總線(xiàn)進(jìn)行通信,信息管理配置稍有不當(dāng),就很容易出現(xiàn)總線(xiàn)負(fù)荷過(guò)大,將導(dǎo)致系統(tǒng)實(shí)時(shí)響應(yīng)速度下降,這在實(shí)時(shí)系統(tǒng)中是不允許的.因此在對(duì)各工作節(jié)點(diǎn)的實(shí)時(shí)性進(jìn)行了分析之后,根據(jù)各節(jié)點(diǎn)對(duì)實(shí)時(shí)性的要求,設(shè)計(jì)高、低速兩個(gè)速率不同CAN通信網(wǎng)絡(luò).將實(shí)時(shí)性要求嚴(yán)格、可靠性要求高的節(jié)點(diǎn)組成高速CAN通信網(wǎng)絡(luò),將其他實(shí)時(shí)性要求較低的節(jié)點(diǎn)組成低速CAN通信網(wǎng)絡(luò),并架設(shè)網(wǎng)關(guān)將這兩個(gè)速率不同的CAN通信網(wǎng)絡(luò)連接起來(lái),實(shí)現(xiàn)全部節(jié)點(diǎn)之間的數(shù)據(jù)共享[4].
圖4 基于ISO15765的程序檢測(cè)方法的優(yōu)點(diǎn)Fig.4 The advantages of the program detection method based on ISO15765
基于ISO15765協(xié)議的程序檢測(cè)方法與其他程序檢測(cè)方法相比較具有以下4個(gè)方面的優(yōu)勢(shì),如圖4.經(jīng)濟(jì)性:基于ISO15765的檢測(cè)方法需要的設(shè)備、工時(shí)、人力很少,而且對(duì)人員的專(zhuān)業(yè)素質(zhì)要求不高,于是該方法的檢測(cè)作業(yè)費(fèi)用很低.穩(wěn)定性:在相同的檢測(cè)條件下,各變量、參數(shù)、結(jié)果的測(cè)量值具有良好的一致性[5].通用性:ISO15765協(xié)議是一個(gè)通用型很強(qiáng)的協(xié)議,應(yīng)用該協(xié)議作為C++程序檢測(cè)的通信標(biāo)準(zhǔn)是對(duì)該協(xié)議的創(chuàng)新使用.可以將這一檢測(cè)方法擴(kuò)展到檢測(cè)其他語(yǔ)言類(lèi)型的程序,使其得到更加廣泛的應(yīng)用.法規(guī)適應(yīng)性:基于ISO15765的檢測(cè)方法的核心思想是采用黑盒測(cè)試這一重要的測(cè)試策略,將程序視為一個(gè)黑盒子,測(cè)試目標(biāo)與程序的內(nèi)部機(jī)制、結(jié)構(gòu)完全無(wú)關(guān),而是將重點(diǎn)集中放在發(fā)現(xiàn)程序中關(guān)鍵變量值是否在正確的取值范圍.
應(yīng)用本文設(shè)計(jì)的檢測(cè)方法開(kāi)發(fā)具有實(shí)際檢測(cè)功能的C++函數(shù)檢測(cè)系統(tǒng).檢測(cè)系統(tǒng)利用CAN總線(xiàn)進(jìn)行上、下位機(jī)的通信,完成函數(shù)變量的傳遞、賦值及檢測(cè),通信過(guò)程中遵循基于ISO15765的通信協(xié)議規(guī)范,最后結(jié)果在Excel案例中列表顯示.
2.1 開(kāi)發(fā)環(huán)境與編程語(yǔ)言
檢測(cè)系統(tǒng)使用微軟的Visual Studio 2013作為開(kāi)發(fā)環(huán)境,C++作為編程語(yǔ)言,開(kāi)發(fā)過(guò)程可以概述為VC++編寫(xiě)MFC窗口界面,下圖5為檢測(cè)系統(tǒng)上位機(jī)界面.
圖5 上位機(jī)系統(tǒng)界面Fig.5 Interface design of upper device
C++與C相比有許多優(yōu)點(diǎn),主要體現(xiàn)在封裝性、繼承性和多態(tài)性.封裝性把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)組織在一起,不僅使程序結(jié)構(gòu)更加緊湊,并且提高了類(lèi)內(nèi)部數(shù)據(jù)的安全性;繼承性增加了軟件的可擴(kuò)充性及代碼重用行;多態(tài)性使設(shè)計(jì)人員在設(shè)計(jì)程序時(shí)可以對(duì)問(wèn)題進(jìn)行更好的抽象,有利于代碼的維護(hù)和可重用[6].
VC++全稱(chēng)是Visual C++,是由微軟提供的C++開(kāi)發(fā)工具,它與C++的根本區(qū)別就在于,C++是語(yǔ)言,而VC++是用C++語(yǔ)言編寫(xiě)程序的工具平臺(tái).MFC全稱(chēng)Microsoft Foundation Classes,也就是微軟基礎(chǔ)類(lèi)庫(kù).它是VC++的核心,是C++與Windows API的結(jié)合,很徹底的用C++封裝了Windows SDK(Software Development Kit,軟件開(kāi)發(fā)工具包)中的結(jié)構(gòu)和功能,不需要開(kāi)發(fā)者再去解決那些很復(fù)雜很乏味的難題,比如每個(gè)窗口都要使用Windows API注冊(cè)、生成與管理.VC++不是只能夠創(chuàng)建MFC應(yīng)用程序,MFC也不是只能用于VC++中,它同樣也可以用在Borland C++等編譯器中,但是幾乎沒(méi)有人這樣做.
表1N_PDU格式Tab.1 Format of N_PDU
表2 網(wǎng)絡(luò)層幀類(lèi)型Tab.2 Frame type of Network layer
圖6 上、下位機(jī)的通信機(jī)制Fig.6 Communication mechanism between upper and lower computer
表3 基于ISO15765的診斷服務(wù)列表Tab.3 Diagnostic services based on ISO15765
圖7 系統(tǒng)工作流程圖Fig.7 Working flowchart of system
2.2 數(shù)據(jù)傳輸機(jī)制
協(xié)議數(shù)據(jù)單元(N_PDU) 由3個(gè)部分組成,如表1所示.N_PDU使得數(shù)據(jù)在網(wǎng)絡(luò)層的單節(jié)點(diǎn)與單節(jié)點(diǎn)之間,或者單節(jié)點(diǎn)與多個(gè)其他節(jié)點(diǎn)(對(duì)等協(xié)議實(shí)體)之間傳輸.
N_AI:用于識(shí)別網(wǎng)絡(luò)層的通信對(duì)等實(shí)體,本文檔采用11位的ID號(hào).
N_PCI:識(shí)別相互交換的N_PDU的類(lèi)型,網(wǎng)絡(luò)數(shù)據(jù)單元類(lèi)型包括單幀、首幀、后續(xù)幀和流控制4種.每種類(lèi)型對(duì)應(yīng)的格式如表2所示.
N_Data:用于向上位機(jī)傳輸請(qǐng)求的數(shù)據(jù),格式如表2所示.
圖6是檢測(cè)系統(tǒng)上、下位機(jī)通信機(jī)制的示意圖.下位機(jī)(Sever) 與上位機(jī)(Client) 之間是以數(shù)據(jù)幀(格式如表2所示)的方式進(jìn)行通信的.上位機(jī)發(fā)送給下位機(jī)的報(bào)文稱(chēng)之為請(qǐng)求,下位機(jī)發(fā)送給上位機(jī)的報(bào)文稱(chēng)之為回復(fù),由上位機(jī)發(fā)送的請(qǐng)求信息包括SID,F(xiàn)ID(測(cè)試函數(shù)的ID),PID(輸入變量的ID),輸入值,由控制器反饋的響應(yīng)信息包括SID,F(xiàn)ID(對(duì)應(yīng)于測(cè)試函數(shù)的ID) ,PID(輸出變量的ID),輸出值數(shù)據(jù).
2.3 診斷服務(wù)定義
應(yīng)用ISO15765協(xié)議的定義的診斷服務(wù)可以使下位機(jī)與上位機(jī)之間的通信方式更加標(biāo)準(zhǔn)化、規(guī)范化,具體應(yīng)用的診斷服務(wù)如表3.服務(wù)0x22的目的是讀取測(cè)試案例中的輸入值數(shù)據(jù),并通過(guò)CAN通信對(duì)C++程序中函數(shù)的變量進(jìn)行賦值;服務(wù)0x31的功能是啟動(dòng)函數(shù)執(zhí)行;而服務(wù)0x2f的作用是利用CAN總線(xiàn)將輸出值數(shù)據(jù)傳入Excel表中的相應(yīng)位置.
系統(tǒng)工作時(shí)會(huì)將表3中服務(wù)依次應(yīng)用,具體流程如圖7所示.點(diǎn)擊瀏覽按鈕(系統(tǒng)界面如圖4),選擇要操作的測(cè)試案例,某一案例被選中后,系統(tǒng)首先會(huì)對(duì)案例進(jìn)行整體掃描,采集案例的格式、有效行、列數(shù)、輸入值個(gè)數(shù)等參數(shù)信息.案例信息被采集完全后,會(huì)在“Information”編輯框內(nèi)出現(xiàn)提示消息.此時(shí),點(diǎn)擊開(kāi)始工作按鈕,則上位機(jī)系統(tǒng)與底層協(xié)議棧之間開(kāi)始進(jìn)行CAN通信.
第1步,進(jìn)行輸入值的傳遞.
第2步,上位機(jī)在輸入值賦值完畢后請(qǐng)求函數(shù)執(zhí)行,C++函數(shù)連續(xù)執(zhí)行十次之后給予上位機(jī)正響應(yīng).
第3步,得到正響應(yīng)的上位機(jī)向底層協(xié)議棧請(qǐng)求輸出值,然后進(jìn)行輸出值的傳遞.
第4步,上位機(jī)對(duì)得到的輸出值進(jìn)行判定,如果所有的輸出值都在有效范圍內(nèi),則認(rèn)證為“Succeed”,否則為認(rèn)證為“Fail”.
經(jīng)過(guò)以上4步操作,將C++函數(shù)中的輸出值、輸入值、認(rèn)證結(jié)果造表,形成最后的報(bào)告.查看報(bào)告有兩種方法,一種是直接找到報(bào)告所在文件夾,雙擊打開(kāi);另一種方法更加便捷,可以直接點(diǎn)擊CheckResult按鈕在“Result List”編輯框內(nèi)查看.
圖8 Office應(yīng)用程序?qū)ο竽P虵ig.8 Application object model of office
2.4 MFC操作Excel
測(cè)試案例的格式是Excel,在使用MFC對(duì)Excel進(jìn)行讀寫(xiě)操作之前,首先要了解微軟Excel對(duì)象模型.觀察圖8,其中Application代表應(yīng)用程序本身.即Excel應(yīng)用程序;workbooks是Workbook的集合,代表了工作??;Worksheets是Worksheet的集合,是Workbook的子對(duì)象;Range是Worksheet的子對(duì)象,可以理解為Sheet中一定范圍的單元格;Shapes是Worksheet的子對(duì)象,用于存儲(chǔ)圖片等信息的單元格.
利用VC操作Excel的方法通常有兩種:1)利用ODBC把Excel文件當(dāng)成數(shù)據(jù)庫(kù)文件進(jìn)行讀、寫(xiě)、修改等操作,網(wǎng)上有人編寫(xiě)了CSpreadSheet類(lèi),可以提供支持.2)利用Automation(OLD Automation)方法,將Excel當(dāng)成組件服務(wù)器,利用VBA,又分為基于MFC的和SDK兩種.本文使用的是第2種基于MFC的OLE編程方法,具體實(shí)現(xiàn)過(guò)程如下:
1)首先項(xiàng)目中添加類(lèi)”Typelib中的MFC類(lèi)->選擇文件中”,選擇office的安裝路徑中的excel.exe.
2)選中以下幾項(xiàng)_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然后導(dǎo)入.
3) 導(dǎo)入后自動(dòng)在工程中添加 Capplication,CworkSheet,CworkBook,CworkSheets,CworkBooks,Crange這些類(lèi);并將把這些類(lèi)的頭文件中的第一句話(huà)#import".......EXCEL.EXE"nonamespace刪除.
4)編譯時(shí)會(huì)遇到問(wèn)題Not enough actual parameters for macro'DialogBoxW'.解決的方法:在CRange類(lèi)中找到VARIANT DialogBox() {},并將DialogBox其改成_DialogBoxW.
5)在MFC對(duì)話(huà)框上添加控件按鈕,并添加事件,寫(xiě)入自定義代碼.
將本文設(shè)計(jì)的檢測(cè)系統(tǒng)對(duì)聯(lián)騰動(dòng)力新能源汽車(chē)項(xiàng)目的VCU行車(chē)程序進(jìn)行檢測(cè),從行車(chē)程序中選取Runcase、TC_DriveBackup、TC_DriveFeedback、TC_DriveForward、TC_TrqSend等五個(gè)函數(shù)作為樣本測(cè)試函數(shù).系統(tǒng)運(yùn)行情況良好,被反復(fù)使用亦未出現(xiàn)BUG,能夠檢測(cè)出函數(shù)中出現(xiàn)的錯(cuò)誤,且沒(méi)有發(fā)現(xiàn)誤判現(xiàn)象.由此說(shuō)明,本文提出的基于ISO15765的C++程序檢測(cè)方法能夠?qū)嶋H運(yùn)用到C++程序的測(cè)試中,并且效果理想.
[1]Myers G J.軟件測(cè)試的藝術(shù)[M].張曉明,黃琳,譯.北京:機(jī)械工業(yè)出版社,2006.
[2]朱雙華.汽車(chē)CAN系統(tǒng)故障診斷與檢測(cè)技術(shù)[M].長(zhǎng)沙:國(guó)防科技大學(xué)出版社,2008.
[3]張文杰,王坤.淺談CAN通信的硬件抗干擾設(shè)計(jì)[J].科技信息,2012(23):144-144.
[4]龍志強(qiáng),李曉龍,竇峰山,等.CAN總線(xiàn)技術(shù)與應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:機(jī)械工業(yè)出版社,2013.
[5]鄭建華,朱蓉.面向Web系統(tǒng)開(kāi)發(fā)的代碼自動(dòng)生成技術(shù)研究[J].福建電腦,2011,27(12):8-9.
[6] 孫鑫.VC++深入詳解[M].北京:電子工業(yè)出版社,2012.
[責(zé)任編輯 代俊秋]
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
天津市自然科學(xué)基金重點(diǎn)項(xiàng)目(14JCZDJC32600)
李亞運(yùn)(1991-),男,碩士.
:孫耀杰(1960-),男,教授,sun678@126.com.