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