超經(jīng)典CANoe綜合項目工程案例_第1頁
超經(jīng)典CANoe綜合項目工程案例_第2頁
超經(jīng)典CANoe綜合項目工程案例_第3頁
超經(jīng)典CANoe綜合項目工程案例_第4頁
超經(jīng)典CANoe綜合項目工程案例_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

\o"發(fā)布于-09-2619:26"CANoe入門Stepbystep系列(一)基本應用CANoe是Vector公司針對汽車電子行業(yè)總線分析工具,當前我用CANoe7.6版本進行簡介,其她版本功能基本差不多。硬件我使用是CANcaseXL.1,CANoe軟件安裝很簡樸,先裝驅動,再裝軟件。安裝完畢,插上USB,連接硬件,這樣在控制面板中,VectorHardware進行查看通過查看信息可知,CANcaseXL中兩個piggy,一種是251(高速CAN),一種是7269(LIN),此外慣用尚有1054(低速CAN,或稱容錯CAN),由于CANcaseXL中只能支持兩路通訊,這樣piggy可以自由組合2,硬件連接正常,打開CANoe軟件File->NewConfiguration可以選取新建工程模版,咱們這里選取CAN_500kBaud.tcn,這樣新建了波特率為500KCAN工程,可以File->SaveConfiguration,進行保存3,接下來就要使用CANdb++Editor工具對總線網(wǎng)絡節(jié)點,消息,信號,進行定義了。點擊工具欄這個圖標

,或開始菜單中找這個工具啟動啟動后,F(xiàn)ile->CreateDatabase,選取CANTemplate.dbc,選取目錄及文獻名,進行保存右鍵Networknodes->New,進行網(wǎng)絡節(jié)點定義,這里只需要填寫Name即可,例如:Node_A然后添加Node_B,完畢后如下圖,這樣在Networknodes目錄下面添加出來兩個節(jié)點節(jié)點添加完畢后,下一步添加CAN消息,右鍵Messages->New,這是需要定義名稱,ID,DLC等信息,如下:然后在Transmitters頁面,點擊Add按鈕,添加Node_A為發(fā)送節(jié)點,意思就是說,此消息是從Node_A節(jié)點發(fā)送出來其實尚有一種辦法就是,此時暫時不定義發(fā)送節(jié)點,然后直接以拖曳方式拖曳到發(fā)送節(jié)點上,功能上是同樣有了消息,消息里攜帶東西自然是信號咯,那么咱們開始創(chuàng)立一種信號右鍵Signals->New,填寫如下信息信號固然要放到消息中咯,切換到Messages頁面,Add咱們剛剛建立Message_A,固然和上面同樣,采用拖曳方式從Signal到Message中建立關聯(lián)也是可以。上面信息中Intel模式和Motorola格式區(qū)別如下:用0和1來表達開關信號狀態(tài)似乎還不是很直觀,咱們可以使用on和off來表達就好了,于是View->ValueTables,右鍵空白處->New,鍵入如下信息:

定義好了之后,還需要跟信號進行關聯(lián)。右鍵需要關聯(lián)信號->EditSignal,ValueTable中關聯(lián)剛才建立那個ValueTalbe項這樣一種信號就完畢了,此外還需要加一種類似信號,可以點擊Signal根目錄,在右邊選取Signal復制,及粘貼,然后雙擊復制好Signal后,進行某些編輯,然后用上面辦法關聯(lián)Message即可迅速建立第二個信號了,是不是很以便繼續(xù)添加第三個信號,Indicator_A,跟上面同樣,但是我這個信號想放在Message第二個字節(jié)位置,怎么辦?其實很簡樸,有兩種辦法:第一種,右鍵已經(jīng)關聯(lián)好,即在Message目錄下信號,Editmappedsignal,在彈出對話框中Startbit中填8,這樣就這個信號就跑到該消息第二個字節(jié)中了。第二種辦法,右鍵該消息->EditMessage,在Layout頁面中,拖動信號色塊進行移動以上Message_A消息及消息下所定義已經(jīng)定義完畢如法炮制此外一種消息Message_B,完畢后如下圖。下面創(chuàng)立環(huán)境變量,右鍵Environmentvariables

陸續(xù)把其她環(huán)境變量加好,IndicatorAccess屬性為Write哦,加完如下:數(shù)據(jù)庫定義這款基本上就OK了。保存后關閉CANdb++Editor,回到CANoe主程序中。請在Configuration->Options->ConfigurationSettings->ChannelUsage設立使用通訊通道,由于這個只需要1路CAN,其她都設立為0就可以。點這個選項頁面可浮現(xiàn)SimulateSetup界面右鍵Databases->Add,把剛剛創(chuàng)立好dbc給加載進來,之后再連線上右鍵->InsertNetworkNode成果如下:右鍵這個ECU模塊->Configuration,在NetworkNode選取Node_A,完畢,然后添加Node_B完畢后如下圖,這樣dbc與CANoe關聯(lián)就好了。4,界面設計網(wǎng)絡及相應關系設立好之后,應當設計界面了,一種良好界面可以直觀顯示及控制各種信號。界面設計工具備兩種:一種是PanelDesigner,新界面設計工具,此外一種是PanelEditor是老界面設計工具,無論采用何種工具設計界面,都可以和CANoe較好兼容,沒有問題。下面咱們先用第一種界面設計工具來完畢界面設計點擊工具欄這個圖標或File->OpenPanelDesigner,打開界面編輯器,界面如下:保存一下該界面,起名為Panel_A,一種空界面上可以放置右上邊若干組件。放置好之后,選中界面上組件時候,右下側回顯示當前選中組件屬性,可以更改相應大小位置等,但最重要是Symbol屬性,這里要說一下,每個界面組件也都需要與CANoe關聯(lián),否則單純界面是沒有任何意義,關聯(lián)重要是信號和環(huán)境變量,在Symbol屬性SymbolFilter屬性中可以進行選取,咱們這里關聯(lián)是環(huán)境變量,因此選取EnvironmentVariable,然后再點擊上面Symbol屬性,然后在彈出頁面中選取相應關聯(lián)變量完畢后可以按同樣辦法設計Panel_B,也可以SaveAs辦法迅速建立同樣Panel但是與環(huán)境變量關聯(lián)和界面文字需要進行微調。這樣兩個Panel都已完畢。也已經(jīng)建立了與CANoe之間關聯(lián)。5,CAPL編程所有前期準備工作和組裝工作都已完畢,當前需要編寫程序使整個系統(tǒng)有機運營起來。回到CANoeSimulationSetup界面,然后點擊Node_A模塊,像鉛筆同樣圖標,填寫程序名稱,這里Node_A,然后打開編程界面,完畢如下程序。然后完畢Node_B程序。小技巧:如果背不出詳細消息名稱,信號名稱或環(huán)境變量,可以右鍵程序空白處,你會得到意外驚喜,試試看。OK大功告成6,運營當前點擊工具欄,運營程序。注意:這里表達實際網(wǎng)絡,所有消息是發(fā)送到物理網(wǎng)絡上,如果只是驗證程序,設立成這樣就可以了。完整運營成果如下:就是這樣,一步一步,咱們完畢了第一種完整CANoe應用工程,雖然這只是入門第一步,但整個CANoe開發(fā)流程基本涵蓋,如果能跑出上面運營成果,依然可以給咱們諸多驚喜。咱們需要這樣驚喜,由于這是咱們繼續(xù)前行動力。\o"發(fā)布于-09-2619:33"CANoe入門Stepbystep系列(二)CAPL編程CAPL就是CommunicationApplicationProgrammingLaguage縮寫,CAPL類似于C語言語法,因而所有語法請參照C語言教程,這里不在這里進行詳述,關于C語言,毫無疑問,一方面推薦人們看譚浩強教師書,典型中典型,看完這本C語言應當沒問題了。CAPL在CANoe中起到重要作用,她將所有某些聯(lián)系起來(請看下圖)當前咱們予以上一節(jié)基本上,來著重簡介CAPL編程。CAPL語法是C語言,又有某些C++特性,this指針,事件等,對于事件理解可以學習任意一種面對對象語言,首推C#.NET,可以參照我博客學習,固然這個似乎比CAPL自身更加難,事件也更加多,但這并不妨礙對事件理解,其中事件類型如下圖:下面來幾種小例子協(xié)助理解來個CANoe版本helloworld!來興奮一小下吧。開整~在打開CANoe,新建個工程,在SimulationSetup中加個Networknode,點鉛筆,忘了嗎,上一節(jié)剛講過,右鍵Start->New,鍵入如下代碼編譯后,關閉CAPLBrower。運營CANoe工程,成果如下,哇塞成功咯,好有成就感啊。這個例子似乎跟CAN通訊沒啥太大關系啊,好,咱們接下來再做一種例子運營成果如下,按鍵盤b鍵,將發(fā)送一種CAN消息,連dlc是啥都不懂得同窗,推薦先學習一下CAN基本知識,推薦瑞薩公司《CAN入門書》,講非常好。運營剛剛那個例子你會發(fā)現(xiàn),按一下b,只發(fā)送一條消息,但在實際應用中CAN消息都是循環(huán)持續(xù)發(fā)送,咱們要對剛剛程序進行某些修改。完畢這樣功能。程序如下:variables

{

message0x400msgA={dlc=1};

mstimertimerA;

intconditionA=0;

}onkey'a'

{

conditionA=!conditionA;

if(conditionA==1)

{

setTimer(timerA,200);

}

}ontimertimerA

{

if(conditionA==1)

{

setTimer(timerA,200);

}

msgA.byte(0)=msgA.byte(0)-1;

output(msgA);

}運營成果如下:按A鍵,Timer啟動,發(fā)送消息接下來咱們一起來看總結一下CAPL編程要點:CAPL編程學習,需要通過不斷在實踐中積累,此外別無她法。以上真真兒只是入門,如果你真心看過,不如你真心寫過。\o"發(fā)布于-09-2619:37"CANoe入門Stepbystep系列(三)簡樸例子剖析最佳學習方式是什么?模仿。有人會問,那不是山寨么?但是我以為,那是模仿初級階段,當把別人最佳設計已經(jīng)融化到自己血液里,變成自己東西,而靈活運用時候,才是真正高檔階段。正所謂畫虎畫皮難畫骨。但初級階段依然是必要經(jīng)歷過程,她會使你在達到高檔階段過程中少走諸多彎路,下面咱們來邁出這一步。先研究一下別人簡樸例子。

最佳例子莫過于Vector自身Demo了,這個在安裝完CANoe之后就會被自動安裝。先看最簡樸一種,名字叫Easy,但并不簡樸哦,比咱們之前簡介所有東西都整合再一起了,很簡樸,但很全面。但是如果你說,這個我自己也可以完全自己寫出來(并不是僅僅是看懂哦),那么我可以必定說,在工作中,你完全可以勝任普通任務規(guī)定哦~,剩余只是工作量問題了。但我相信到當前為止,你們諸多人,都無法寫出這樣程序,因此我建議你們把這個程序好好研究明白,這點很重要。廢話不多說,上圖,下面是打開運營后界面。通過面板可以控制,及顯示諸多動畫效果,做非常美麗。在別的窗體也將重要數(shù)據(jù)以圖表等體現(xiàn)方式呈現(xiàn)出來。咱們先看一下DBC內容吧Signals:EngineSpeed

車速信息FlashLight

雙跳燈HeadLight

大燈OnOff

引擎狀態(tài)

Messages:EngineState

引擎狀態(tài):包括信號有OnOff,EngineSpeedLightState

燈光狀態(tài):包括信號有FlashLight,HeadLight

Networknodes:Display

顯示節(jié)點,接受所有消息Engine

引擎節(jié)點,發(fā)送EngineState消息Light

燈光節(jié)點,發(fā)送LightState消息

Environmentvariables:

環(huán)境變量,普通與界面組件有關聯(lián),這樣就實現(xiàn)了圖形化界面控制與顯示,下面就是關聯(lián)界面組件EnvEngineSpeedDspMeter

EnvEngineSpeedDspText

EnvEngineSpeedEntry

EnvEngineStateDsp

EnvEngineStateSwitch

EnvHazardLightsSwitch

EnvHeadLightSwitch

EnvLightDsp

注意一下信號信息:Definition頁面,Init.Val輸入框使能了,之前是灰色狀態(tài),為什么呢?點擊一下藍色帶下劃線連接,彈出窗臺如下:意思是說這個值設立,必要要定義屬性才干有效,之前始終沒有提到信號屬性,這次還是第一次遇到哦。個人理解信號屬性是表白信號特點一系列參數(shù),固然消息和節(jié)點也均有相應屬性。為了更加詳細理解這個屬性,咱們求助于協(xié)助。哦,明白了,本來是用來初始化數(shù)據(jù)哦。其實在Definition表達是物理值,都要轉換成Raw值保存到GenSigStartValue屬性中。在屬性創(chuàng)立咱們之前也沒有提到過,這里講一下,請在CANdb++Editor菜單中,View->AttributeDefinitions右鍵,New,填寫好信息即可。屬性背后跟行為是密切有關,甚至跟底層dll,其她某些屬性請參照Help文檔,固然重要屬性咱們也會跟人們在背面提到。dbc尚有某些細節(jié),就是接受消息定義,之間也沒簡介過,例如Display節(jié)點只接受消息,那么你就應當在節(jié)點屬性上進行配備,辦法是右擊節(jié)點然后點EditNode,在MappedRxSig.中就可以定義接受信號了,Add…其實不定義接受消息也是可以,但會在File->Consistencycheck檢查中中顯示出無接受節(jié)點等報警。例如前面第一講例子dbc檢查如下:再看一下CAPL程序。engine.can程序如下:

variables

{

}onenvvarEnvEngineStateSwitch

//當撥動開關時候,會更改發(fā)動機發(fā)出信號

{

$EngineState::OnOff=@this;

//注意信號和環(huán)境變量直接賦值時符號,信號用$,環(huán)境變量用@

if(@this)

$EngineState::EngineSpeed=@EnvEngineSpeedEntry;

else

$EngineState::EngineSpeed=0;

}onenvvarEnvEngineSpeedEntry

//當移動車速滑條時,會更改發(fā)動機發(fā)出信號

{

if(@EnvEngineStateSwitch)

{

$EngineState::EngineSpeed=@this;

}

}onstart

//程序開始運營時候,將調用所有環(huán)境變量事件

{

CallAllOnEnvVar();

//callallenvvarproceduresofthismodeland

//thusconsidertheSTARTVALUESofallenvironment

//variablesfor:

//

-initializationofallmessagevariables

//

-startingofanytimers

//

-sendingmessages(output)withstartvalues

}light.can程序如下:variables

{

msTimertFlashLightFrequency;

//定義閃燈定期器

constintgFlashLightFrequency=500;

//定義閃燈頻率,初始化為500ms

intgHazardLightsStatus=0;

//定義危險燈信號

intgDebugCounterTX=0;

//用于調試,記錄TX報文個數(shù)

intgDebugCounterTXRQ=0;

//用于調試,記錄TXRQ報文個數(shù)

intgDebugCounterRX=0;

//用于調試,記錄RX報文個數(shù)

}onenvvarEnvHeadLightSwitch

//大燈開關狀態(tài)更改時,更新燈光消息信號

{

//assignEVvaluetothemessagesignal

$LightState::HeadLight=@this;

}onstart

{

CallAllOnEnvVar();

//callallenvvarproceduresofthismodeland

//thusconsidertheSTARTVALUESofallenvironment

//variablesfor:

//

-initializationofallmessagevariables

//

-startingofanytimers

//

-sendingmessages(output)withstartvalues

setWriteDbgLevel(0);//setDbgLevel=1togetmoreinformationinWrite-Window

}onmessageLightState

//調試用,打印有關信息

{

if(this.dir==TX)

{

gDebugCounterTX++;

if(gDebugCounterTX==10)

{

writeDbgLevel(1,"LightStateTXreceivedbynode%NODE_NAME%");

gDebugCounterTX=0;

}

}

if(this.dir==TXREQUEST)

{

gDebugCounterTXRQ++;

if(gDebugCounterTXRQ==10)

{

writeDbgLevel(1,"LightStateTXREQUESTreceivedbynode%NODE_NAME%");

gDebugCounterTXRQ=0;

}

}

if(this.dir==RX)

{

gDebugCounterRX++;

if(gDebugCounterRX==10)

{

writeDbgLevel(1,"Error:LightStateRXreceivedbynode%NODE_NAME%");

gDebugCounterRX=0;

}

}

}onenvVarEnvHazardLightsSwitch

//危險警示燈開關變化時,更新燈光消息閃燈信號

{

if(@this)

{

gHazardLightsStatus=1;

setTimer(tFlashLightFrequency,gFlashLightFrequency);

}

else

{

cancelTimer(tFlashLightFrequency);

gHazardLightsStatus=0;

}

$LightState::FlashLight=gHazardLightsStatus;

}ontimertFlashLightFrequency

//危險報警燈間隔閃爍控制

{

gHazardL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論