在整車上截取、分析CAN報文時經(jīng)常要用到上位機,而這上位機是怎么寫出來的呢?這篇文章將基于已有例程從0開始講解用C#語言編寫上位機的方法及過程。
本文適用于常與CAN報文打交道,同時想編寫上位機但不知從何下手的同仁們。也適合想學習編程但不知如何入門的同袍。篇幅所限,本文只講解與CAN報文上位機相關的編程方法及知識,以實現(xiàn)目的為主,對于不相關的代碼及知識點僅作簡述或略過。學好本文內(nèi)容,再研究細節(jié)或去看其他入門教材就輕松多啦~~(本文基于C#語言,所用到的功能用法跟C語言差不多。)
注:本文是根據(jù)周立功官網(wǎng)的例程和微軟Visual Studio編程軟件來講解上位機的編寫,CAN報文的收發(fā)需要基于例程中對應的設備。(本文提到的例程支持十多種設備,具體可查看例程中kerneldlls文件夾的.dll文件。同時也可根據(jù)本文講解的內(nèi)容來編寫其他用途的電腦軟件。)
兩天時間可作如下分配:
- 0.5天準備(下載、安裝工具軟件)
- 0.5天依照本文練習
- 1天自由回味練習,學習充分的話可自行依照相應知識點自行深入探索
文章結構如下:
- 我們想要上位機實現(xiàn)哪些功能
- 編寫前的準備工作
- 初步介紹上位機代碼的結構和基礎知識
- 編寫告警、數(shù)據(jù)顯示界面
- 上位機編寫常用控件介紹
上位機功能
編寫之前想一下,我們需要這個上位機實現(xiàn)哪些功能呢?常用的不外乎以下幾個,本文將重點講解解析顯示報文信息的編寫方法。
- 連接CAN盒,截取報文
- 解析顯示報文信息(如顯示告警狀態(tài)、數(shù)據(jù)變化等)
- 使用上位機模擬對應工況,向CAN網(wǎng)絡發(fā)送報文
準備工作
首先呢要站在巨人的肩膀上,本文的編寫要先引用兩位巨人的成果。(下載軟件、資料請認準官網(wǎng))
第一位巨人:周立功。首先進入其官網(wǎng)點開搜索界面,搜索\”USBCAN\”關鍵字。這時出現(xiàn)了五十多項資料供下載,咱們直接找到\”【應用軟件】USBCAN-8E-U上位機例程\”下載。(官網(wǎng)還有很多有用的資料、書籍、軟件供免費下載哈,感興趣的可以詳細看下~)下載好后將其中的\”c#例子(vs2005)\”文件夾解壓下來放好,這個是周立功官網(wǎng)上的上位機例程,本文將基此進行講解。
當然,一起下載的例程里面還有基于其他語言(如MATLAB、LabView、VB等等)的,有興趣的可以嘗試,本文只基于C#例程。
搜索下載例程
下載文件內(nèi)包含的例程
第二位巨人:微軟。到官網(wǎng)下載編程工具軟件Visual Studio,然后安裝在電腦上。目前最新版是2019版,其實用2005版或更高即可。本文用2017版作講解,編寫上位機只用到了Visual Studio的皮毛功能,用哪個版本都差不多。
Visual Studio被人號稱宇宙最強IDE,支持多種編程語言及功能,但其體積也超大,下載、安裝比較費時,這也是準備工作需要0.5天的原因。
o(︶︿︶)o 準備好零食,一邊安裝一邊吃著~
(友情提示:Visual Studio功能強大、模塊眾多,安裝好后若想卸載,可能有少數(shù)模塊不能完全被從電腦上移除,這不影響電腦本身的使用,不特地去看它就行了。但若只是準備淺嘗輒止看看就走,且自帶強迫癥的各位需慎重哦~)
上位機例程結構介紹
準備工作做好后,到解壓的\”c#例子(vs2005)\”文件夾下找到\”WindowsApplication1.sln\”,雙擊打開。
打開后右側是此工程所包含的文件,鼠標雙擊\”Form1.cs\”,此時左邊會顯示例程上位機的界面。點擊上方的\”啟動\”按鈕,即可運行上位機軟件。上位機界面從上到下主要包含三大塊:設備參數(shù)、發(fā)送數(shù)據(jù)幀、信息。
初次打開上位機
上位機界面
- 設備參數(shù)。這里可以忽略。其中定時器0、定時器1里填的參數(shù)對應的是CAN網(wǎng)絡波特率,也可將這兩個定時器框格去掉,改用選擇波特率的模式會更方便順手。不過這不影響功能使用,此處略過。
- 發(fā)送數(shù)據(jù)幀??梢韵駽AN網(wǎng)絡發(fā)送對應的報文。
- 信息。這里會顯示所有接收到的報文,本文對應的報文解析功能就是基于這里,接下來會重點講述。
運行上位機
鼠標雙擊此上位機界面的最上方(\”CAN通用測試例子\”幾字所在行),此時會進入代碼編輯界面。代碼左邊有一列豎線,線上有很多\”-\”號,點擊該符號即可將對應段落的代碼隱縮起來。豎線左邊的數(shù)字時代碼的行數(shù)。
今天我們就在\”Form1.cs\”和\”Form1.cs[設計]\”這兩處操作編寫。
編寫報文解析顯示功能
首先先定個小目標吧,不用賺一個億,把國標直流充電網(wǎng)的CCS報文實時動態(tài)顯示出來就行。
在直流充電過程中,上位機接到CCS報文后,界面上需要顯示充電機輸出電壓值、電流值、累計充電時間,還要顯示充電允許狀態(tài)。
初步設想用以下這樣的圖標界面顯示出來。電壓、電流、時間的數(shù)值隨接收到的報文實時更新,充電允許狀態(tài)的文字、顏色也隨報文變化。
調(diào)整界面
先在界面上畫出對應的框格用于顯示。
不過目前這界面太滿了,可以將鼠標放在界面邊沿,將界面拖動拉大。也可以選中\(zhòng)”Form1\”界面,然后在右下角的屬性欄,找到\”size\”處,原始尺寸是\”856 * 1094\”,咱們把它改成\”1280 * 768\”這種常用的尺寸大小(可以隨意改,看著順眼就行),此時可在界面空余的地方添加新的框體。
調(diào)完尺寸后發(fā)現(xiàn)原先有部分界面被擋住了怎么辦?沒事,還是在屬性這里,把鼠標往上滑,找到\”AutoScroll\”處,將\”FALSE\”改為\”TRUE\”就可以了。另外更重要的一點是界面內(nèi)元素的排列布置,將鼠標選中對應的框體,然后就可以將其拖到合適的位置。這個不影響今天講的功能,此處略過。
添加元素
對應上方的設想,需要往界面上方添加四個文字標簽,然后文字標簽右邊添加四個對應的實時顯示框格。
點擊最左邊上方那里的\”工具箱\”,點開\”所有Windows窗體\”,往下滑動選中\(zhòng)”label\”,然后在界面上空白地方點一下,該出就出現(xiàn)了一個名稱為\”label25\”的標簽(為什么是25呢?因為原始例程里面已有了24個label)。
此時右下角的顯示的就是這個\”label25\”的屬性了。在屬性里面選中\(zhòng)”Text\”,將后方的文字\”label25\”改成\”輸出電壓:\”。
再在工具箱中選好一個label,放在界面上\”輸出電壓:\”的右側,然后在這個label26的屬性中做如下修改:到\”AutoSize\”處將\”TURE\”改為\”FALSE\”(這樣就可以手動修改label標簽的尺寸了)、到\”BackColor\”處,將顏色換成喜歡的、到\”Text\”處,將后方文字\”label26\”全刪掉(初始文字可以不要,等接到報文后再顯示)、到\”TextAlign\”處,改為\”MiddleCenter\”(使label中的文字居中顯示)。
然后依照同樣的步驟,繼續(xù)在下方添加設想的剩余三行內(nèi)容(也可選中這已有的兩個label,然后按住Ctrl鍵,同時拖動鼠標即可復制)。(label屬性中的\”(NAME)\”處可將名稱修改為喜歡的,此處略過,均用默認名稱)
提取報文
上位機界面調(diào)整好后,現(xiàn)進入代碼編輯界面。
找到第374行代碼,這個for循環(huán)里面即是上位機從CAN盒中提取的報文(定時從CAN盒中提取,一次可能會有多條,res是提取到的條數(shù),因此用一個for循環(huán)來挨條報文處理。具體過程略過。),將這些報文一條一條地在界面中\(zhòng)”信息\”框體顯示出來。這個不管,我們直接在此處加上咱們想要的CCS報文解析代碼。
在第337行加入如下代碼
此處對所添加的代碼中的字符作如下解釋(改不了字體顏色,這段文字得耐心看下哈~)
- obj.ID為接收到的此條報文的ID,若是CCS則進入if內(nèi)CCS報文解析代碼的處理,若不是,則跳過if內(nèi)這段代碼
- Double Volt_ou.這個與C語言不同,C#的參數(shù)在使用前定義即可,不用都在函數(shù)最開始處(C#全局變量不能放在現(xiàn)在的這個位置,得放在前面,此處略過)。這里的\”Double\”為C#C語言的數(shù)據(jù)類型關鍵字,該關鍵字將新創(chuàng)建的Volt_out這個變量定義為浮點型(就是可以帶小數(shù)點的數(shù)字)
- obj.Data[0]為此條報文的第一字節(jié)中的數(shù)據(jù),由此往后obj.Data[1]、obj.Data[2]等依次為第二、第三字節(jié)中的數(shù)據(jù)。這里將十六進制換算為十進制,算法也可改為Double Volt_out = obj.Data[0] obj.Data[1]*256,此處略過。
- Volt_out = Volt_out / 10,是為了保留小數(shù)點后一位,因為obj.Data[0]都是整數(shù)型,如果在上一條解析完后若直接÷10,則小數(shù)點后一位就被舍去了,具體原理不再敘述,此處略過。
- label26.Text,\”label26\”表示此處要對(NAME)為label26的標簽進行操作,后面的.Text表示這個標簽中的文字將按照\”=\”后方的內(nèi)容來顯示
- Convert.ToString(Volt_out),Convert表示此處要用到轉換功能,后面的.ToString(Volt_out)表示要將括號內(nèi)的\”Volt_out\”轉換成字符串(即文本),具體原理不再敘述,此處略過。
- \”V\”,上面將Volt_out轉換成文本后只顯示數(shù)字(如\”580.0\”),而沒有單位,此處可在該數(shù)字后面添加一個字母\”V\”
- label32.ForeColor,表示此處要對label32中文本的字體顏色進行操作,改為\”=\”后方的顏色
- Color.Black,表示此處要用到顏色,什么顏色呢?是Black(黑色)。當然也可以改成其他顏色了(如Red、Yellow等等)
- label32.BackColor表示此處要對label32標簽的背景顏色進行操作。
編譯運行
點擊上方的\”啟動\”按鈕,上位機就編譯運行了。
路徑\”c#例子(vs2005)WindowsApplication1WindowsApplication1binDebug\”內(nèi)即是生成的上位機可執(zhí)行程序。將這個文件夾內(nèi)所有文件拷到其他電腦上,可以直接打開\”WindowsApplication1.exe\”使用,無需安裝。
這段操作、代碼雖不復雜,界面也很簡單,但由此擴展,可將其他需要的報文都進行進行解析顯示,并對界面布置、顏色、功能等進行相應優(yōu)化,到時就組合成一個能用好看的上位機啦~
上位機編寫常用控件
此處僅簡單介紹常用組件的簡單功能,具體可在使用時網(wǎng)上查詢其屬性。
Button——按鈕,用鼠標點擊后會觸發(fā)對應操作
ComboBox——選擇,如例程中選擇索引號的那個,可預提供多項用于選擇
Label——標簽,顯示文字
TextBox——文本框,用于輸入文本,程序可根據(jù)輸入內(nèi)容執(zhí)行對應操作
Timer——定時器,設定好周期、開啟定時器,即可按周期定時執(zhí)行內(nèi)部代碼
ToolTip——提示,鼠標懸停在對應位置時,會自動浮出相應的文字
GroupBox、Panel——二者作用差不多,相當于一個容器,可將其他組件放在里面
Chart——圖標,可將對應數(shù)據(jù)用曲線形式展示
總結
?當然,對大神來說,這些都不是事,什么例程、什么工具箱都可以無視,直接用代碼寫好想要顯示的界面、按鍵、圖標的尺寸、顏色、形狀等等,然后讓其按想法自動顯示、變化。不過咱們不是大神,還是哪個方便用哪個吧。
本文只是簡單描述了上位機接收顯示部分,對于不直接影響功能的部分均略過,若有還需詳細描述的地方歡迎提出來。
有興趣的也可以自己繼續(xù)摸索更多待挖掘的地方~
對于本文提到的例程軟件官網(wǎng)下載地址、下載到的上位機例程以及文中編寫的代碼有疑問或需要資源的,歡迎到評論區(qū)交流^_^
版權聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。