《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 用于卷煙機(jī)組的CAN總線實(shí)時(shí)監(jiān)聽器的設(shè)計(jì)與實(shí)現(xiàn)
用于卷煙機(jī)組的CAN總線實(shí)時(shí)監(jiān)聽器的設(shè)計(jì)與實(shí)現(xiàn)
中電網(wǎng)
向立莉 梁杰申 王星
摘要: 本文闡述了如何利用PCI-9810(非智能單路CAN卡)作為硬件接口,,用DEPHI軟件開發(fā)平臺開發(fā)出友好的CAN總線實(shí)時(shí)監(jiān)聽器來實(shí)現(xiàn)對CAN-BUS線路數(shù)據(jù)的實(shí)時(shí)的,準(zhǔn)確的監(jiān)聽以及根據(jù)工作人員的需要進(jìn)行清楚易觀的實(shí)時(shí)分類顯示。
Abstract:
Key words :


引 言
  
卷煙生產(chǎn)中的卷煙機(jī)組主要包括兩大部分,,上位機(jī)MLP,,用于為控制系統(tǒng)和檢測系統(tǒng)提供操作和顯示的裝置,它包括一個工業(yè)PC和一個監(jiān)視器。以及下位機(jī)SRP,,包括傳感器,調(diào)節(jié)裝置或者檢測裝置,。SRP主要包括四種結(jié)點(diǎn)1)SPS,,2)HIP,3)CIS,,4)SRM,。上位機(jī)和下位機(jī)各結(jié)點(diǎn)之間的通信是頻繁的,數(shù)據(jù)對象眾多,,數(shù)據(jù)種類也繁多,,包括參數(shù)上傳,下傳,,指令,,域數(shù)據(jù)等等,所以在這之中,,難免會因?yàn)椴僮魅藛T操作失誤或者控制器本身的原因?qū)е洛e誤,,但錯誤發(fā)生的時(shí)候需要盡快的分析,發(fā)現(xiàn)錯誤,,解決錯誤,。因此我們需要建立一個可靠的錯誤判斷機(jī)制。本文所討論的CANBUS實(shí)時(shí)監(jiān)聽器正是應(yīng)這種需求而產(chǎn)生的,。工作人員根據(jù)實(shí)時(shí)監(jiān)聽器所捕獲的并且友好顯示的線路上的適時(shí)數(shù)據(jù)便可分析出是哪一方出了問題,出了什么類型的問題,。這對安全生產(chǎn),,準(zhǔn)確控制起了舉足輕重的作用。

(一) 硬件實(shí)現(xiàn)
  
在實(shí)時(shí)監(jiān)聽器的實(shí)現(xiàn)中,,我們選擇采用了周立功公司的PCI-9810非智能CAN接口卡作為硬件接口用于接收捕獲CAN總線上的傳輸數(shù)據(jù),。如下圖
  
PCI-9810非智能CAN接口卡是具有高性能價(jià)格比的CAN-bus總線通訊適配卡,它使PC機(jī)方便的連接到CAN總線上,,實(shí)現(xiàn)CAN2.0B協(xié)議的連接通訊,。它是一款采用專用PCI接口轉(zhuǎn)換芯片設(shè)計(jì)的非智能型CAN接口卡,即插即用,,符合PCI2.1規(guī)范,。它采用中斷接收方式,可最大限度減輕占用PC的負(fù)荷;具有最多8幀的數(shù)據(jù)緩沖區(qū),。另外我們采用了周立功公司提供的Windows驅(qū)動程序升級版PCI-9810BWDM驅(qū)動文件將其驅(qū)動,。


(二) 界面軟件實(shí)現(xiàn)
  
界面軟件實(shí)現(xiàn)主要包括四大方面,1)軟件平臺的選擇,,2)對硬件接口CAN卡的使用,,3)利用接口接收CANBUS線路上數(shù)據(jù)的實(shí)現(xiàn),,4)所接收數(shù)據(jù)的處理(主要是判斷和顯示)的實(shí)現(xiàn)。
  
〈1〉軟件平臺的選擇—DELPHI

系統(tǒng)的開發(fā)可利用多種程序設(shè)計(jì)語言,,如DELPHI,,VB,VC,,PB等語言都是面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,,但把幾者相比較,DELPHI是唯一一套能夠同時(shí)適用于開發(fā)數(shù)據(jù)庫應(yīng)用,、網(wǎng)絡(luò)及WEB 應(yīng)用等所有軟件的高效率開發(fā)環(huán)境,,且第三方控件多,開發(fā)比較快,,且設(shè)計(jì)界面比VB,,VC,PB 靈活,?;谝陨弦蛩兀紤]到所要監(jiān)聽CANBUS線路的傳輸數(shù)據(jù)信息量大,、種類多,,以及信息之間相對獨(dú)立,又有關(guān)系且必須備有優(yōu)良的圖形顯示等特點(diǎn),,我們選擇DELPHI作為軟件開發(fā)平臺,。
  
〈2〉對硬件接口PCI-9810的操作的實(shí)現(xiàn)
  
在DELPHI程序中,我們是通過調(diào)用周立功提供的通用VCI動態(tài)鏈接庫來實(shí)現(xiàn)對硬件接口PCI-9810的操作的,,該動態(tài)鏈接庫提供了界面軟件能在windows下運(yùn)行必需的代碼和其他資源,,其中主要包括十個接口函數(shù)如設(shè)備相關(guān)函數(shù)和CAN通訊相關(guān)函數(shù)以及相關(guān)的數(shù)據(jù)結(jié)構(gòu)的定義。把動態(tài)鏈接庫文件夾添加到項(xiàng)目文件夾,,然后把庫源文件添加到程序代碼的應(yīng)用文件單元即可實(shí)現(xiàn)對動態(tài)鏈接庫的調(diào)用,,也就實(shí)現(xiàn)了對PCI-9810卡的打開,關(guān)閉,,啟動,,復(fù)位,收發(fā)數(shù)據(jù)等操作,。
  
〈3〉CANBUS線路上數(shù)據(jù)的實(shí)時(shí)接收
  
CANBUS線路上的數(shù)據(jù)對CAN卡來說有著不期性,,所以要能對數(shù)據(jù)實(shí)時(shí),準(zhǔn)確的接收,,必須要通過程序?qū)崿F(xiàn)一種功能即線路上一旦有數(shù)據(jù),,就能捕獲。對于此,我們采用的方式是利用多線程,。即在程序中專門開辟一個線程用于對線路的監(jiān)聽,,接收。
  
關(guān)于多線程
  
在32位的windows系統(tǒng)中,,系統(tǒng)可以同時(shí)運(yùn)行多個進(jìn)程,,一個調(diào)入內(nèi)存并準(zhǔn)備執(zhí)行的應(yīng)用程序稱為一個進(jìn)程,它由裝入內(nèi)存的程序代碼和操作系統(tǒng)及由此創(chuàng)建的應(yīng)用程序執(zhí)行環(huán)境組成,,進(jìn)程就是應(yīng)用程序的運(yùn)行實(shí)例,。每個進(jìn)程都有自己私有的虛擬地址空間和動態(tài)分配的內(nèi)存,以及文件,,線程和其它模塊,。每個進(jìn)程都有一個主線程,但可以建立另外的線程,。進(jìn)程中的線程是并行執(zhí)行的,,每個線程占用CPU的時(shí)間由系統(tǒng)來劃分,可以把線程看成是操作系統(tǒng)分配CPU時(shí)間的基本實(shí)體,。每個進(jìn)程也可以同時(shí)執(zhí)行多個線程并由系統(tǒng)不停地在各個線程之間切換,。
  
多線程的DELPHI實(shí)現(xiàn)
  
雖然Windows 提供了比較多的多線程設(shè)計(jì)的API 函數(shù),但是直接使用API 函數(shù)一方面極其不方便,,而且使用不當(dāng)還容易出錯,。為避免這個問題,我們采用了DEPHI所提供的方法即繼承TThread類產(chǎn)生線程對象,。TThread由DELPHI的VCL類庫提供用于線程編程,。在Tthread類中封裝了windows中關(guān)于線程機(jī)制的API函數(shù),繼承TThread類產(chǎn)生的線程對象就代表了實(shí)際程序中的一個線程,。線程對象通過封裝使用線程所需的內(nèi)容大大簡化了多線程問題的處理,。另外,在DELPHI中,,Tthread在Classes單元中聲明,,直接從Tobject繼承下來的,,因此,,它不是組件。Tthread是個抽象類,,所以不能創(chuàng)建Tthread的實(shí)例,,而只能創(chuàng)建其派生類的實(shí)例。在本程序中利用Ttread類來編寫多線程的步驟如下
  
(1)從Tthread類派生出一個新的線程類,。即建立的TreceiveThread,。
  
(2)創(chuàng)建線程對象。即在Types里面定義thread1:TreceiveThread。
  
(3)在DELPHI自動生成的用于保存派生類代碼的新的單獨(dú)的文件中重載Execute過程,,在該過程中將對CAN線路上的數(shù)據(jù)實(shí)時(shí)接收并調(diào)用對接收到的數(shù)據(jù)進(jìn)行處理的基本顯示和分類顯示函數(shù),。在Execute過程中使用了repeat…..until語句來判斷過程是否結(jié)束。
  
(4)如果Execute過程執(zhí)行完畢,,則該線程就結(jié)束了,,并釋放線程占用的棧空間,。
  
〈4〉對所接收的數(shù)據(jù)進(jìn)行處理
  
對數(shù)據(jù)的實(shí)時(shí)處理包括兩方面:1)將接收到的數(shù)據(jù)楨按照接收數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)完全顯示,,這包括楨類型,楨格式,,楨ID,,楨數(shù)據(jù)等等。2)將數(shù)據(jù)進(jìn)行更深一層的分析判斷出數(shù)據(jù)的真實(shí)含義,,并將其填入對應(yīng)的文本框或者畫出對應(yīng)的狀態(tài)圖等等,。
  
(1)對于第一種基本顯示,我們采用的是用DELPHI提供的listbox控件進(jìn)行
  
滾動顯示,,listbox的容量足夠本顯示的需要,,另外,我們還添加了一個按鈕控件用于按照操作人員的需要隨時(shí)清除listbox里面的內(nèi)容,。
  
(2)對于第二種分類顯示,。對于不同的數(shù)據(jù),我們將用不同的分析處理方法進(jìn)行顯示,。根據(jù)數(shù)據(jù)的現(xiàn)實(shí)含義,,主要分為1)上,下傳參數(shù),。2)域請求和域數(shù)據(jù),,3)下傳指令和上傳消息。下面將分別介紹處理方法:

1 利用數(shù)據(jù)庫系統(tǒng)進(jìn)行上,,下傳參數(shù)的顯示
  
在CAN線路上傳輸?shù)膮?shù)不僅多達(dá)近200種,,而且有上傳和下傳之分,可見所要顯示的量之大,,加上上下傳的參數(shù)有著相同的數(shù)據(jù)結(jié)構(gòu),,所以我們采用查詢預(yù)先建立好的數(shù)據(jù)庫的方法來進(jìn)行顯示。
  
關(guān)于數(shù)據(jù)庫系統(tǒng) 數(shù)據(jù)庫系統(tǒng)為我們提供了一種把與我們的工作和生活緊密相關(guān)的信息集合在一起的方法,。它還提供了在某個集中的地方存儲和維護(hù)這些信息的方法,。數(shù)據(jù)庫系統(tǒng)主要由三大部分組成:數(shù)據(jù)庫管理系統(tǒng),數(shù)據(jù)庫應(yīng)用程序,,數(shù)據(jù)庫,。
  
數(shù)據(jù)庫系統(tǒng)的DELPHI實(shí)現(xiàn) (1)建立數(shù)據(jù)庫,,在本項(xiàng)目中,我們是利用Microsoft Access 建立了一個關(guān)系數(shù)據(jù)庫(由若干表組成的數(shù)據(jù)庫),。其中包含了一張表,,該表的字段分為id表示用以判斷的字符串,以及l(fā)ocation表示參數(shù)值應(yīng)填的文本框代號,。(2)在應(yīng)用程序中要實(shí)現(xiàn)對所建立的數(shù)據(jù)庫的訪問需要用到數(shù)據(jù)庫引擎和數(shù)據(jù)庫訪問組件以及數(shù)據(jù)庫控制組件,,DELPHI7中提供了BDE,ADO數(shù)據(jù)引擎,,考慮到項(xiàng)目中的數(shù)據(jù)庫應(yīng)用相對簡單,,我們選擇了常用的BDE(Borland Database Engine)控制讀取所建立的數(shù)據(jù)庫,具體操作為1)利用DEPHI7文件夾中的BDE Administer為所建立的數(shù)據(jù)庫創(chuàng)建別名,。2)在窗體中添加數(shù)據(jù)庫訪問組件和數(shù)據(jù)庫控制組件(包括Data Access頁和BDE頁中的組件)來實(shí)現(xiàn)應(yīng)用程序與數(shù)據(jù)庫之間的聯(lián)系,。項(xiàng)目中,我們用Table組件來封裝數(shù)據(jù)表,,通過BDE數(shù)據(jù)引擎從數(shù)據(jù)庫表格中取得數(shù)據(jù)(參數(shù)值應(yīng)填的文本框代號)并通過DataSource組件將數(shù)據(jù)傳遞給數(shù)據(jù)控制組件TDBEdit,,3)在程序中,我們通過TTable提供的Gotokey的方法實(shí)現(xiàn)對數(shù)據(jù)庫的查找,,以及通過對TDBEdit中的數(shù)據(jù)的使用,。實(shí)現(xiàn)了將不同參數(shù)值填到其唯一對應(yīng)的文本框中。

2 域請求和域數(shù)據(jù)的處理
  
因?yàn)橛驍?shù)據(jù)的多類,,多變性,,以及不確定性,我們不能用處理參數(shù)一樣的數(shù)據(jù)庫或者其他統(tǒng)一處理的方法,,所以在程序中我們使用的是用多層復(fù)合選擇語句進(jìn)行判斷然后根據(jù)不同的域數(shù)據(jù)做出不同的處理,,域數(shù)據(jù)是根據(jù)標(biāo)識符上傳的,只有數(shù)據(jù)沒有別的判斷信息,,對域數(shù)據(jù)的判斷決定于域請求的數(shù)據(jù)內(nèi)容,,因此在程序中首先判斷楨是否為域請求,如果是,,則將楨數(shù)據(jù)賦值對應(yīng)的變量,,這些變量保存的便是域數(shù)據(jù)的判斷信息,而如果根據(jù)標(biāo)識符判斷出為域數(shù)據(jù),,則根據(jù)變量保存的信息進(jìn)行對應(yīng)的處理,。
  
在域數(shù)據(jù)的處理中,很多情況是要繪出曲線,。對此,,我們選擇了DELPHI的Tchart控件,。利用其Series屬性里面的Fast-line,,將收到的數(shù)據(jù)正確的繪成曲線,。

3 指令和消息的處理
  
指令和消息的處理類似于域數(shù)據(jù)的處理,也是采用多層復(fù)合選擇語句進(jìn)行判斷,,然后做出相應(yīng)的處理,,在此,相應(yīng)的處理即將指令,,消息的相關(guān)信息填入文本框,。
  
〈5〉軟件流程圖

  
數(shù)據(jù)處理函數(shù)dataprocess()流程圖

結(jié) 論
  
在本項(xiàng)目中,CAN卡PCI-9810的控制器是SJA1000,,在收發(fā)數(shù)據(jù)方面它支持正常和只聽兩種模式,,在監(jiān)聽器的實(shí)際運(yùn)行中我們選用只聽模式進(jìn)行線路監(jiān)聽,取的了不錯的效果,,而且在界面的設(shè)計(jì)過程中上我們添加了發(fā)送部分,,這是便于進(jìn)行CAN卡的檢測 以及數(shù)據(jù)接收的調(diào)試,此時(shí)需要選擇正常模式,。
  
本文作者的創(chuàng)新點(diǎn):結(jié)合實(shí)際情況的具體需要,,合理的選用了Delphi作為軟件開發(fā)平臺,在實(shí)時(shí)性方面,,我們選擇了Delphi自身提供的線程類,,而不是按照常規(guī)選擇windows提供的API函數(shù),從而使程序的設(shè)計(jì)變的簡潔,,另外在數(shù)據(jù)的處理方面,,我們不僅采用了通常的數(shù)據(jù)庫方法,而且還根據(jù)實(shí)際需要采用了其他簡易可行的方法,。很好地完成了需求,。
  
總之,借鑒前者地經(jīng)驗(yàn)加上實(shí)際地創(chuàng)新我們成功設(shè)計(jì)了實(shí)時(shí)監(jiān)聽器并通過了實(shí)際檢驗(yàn),,本項(xiàng)目所設(shè)計(jì)的實(shí)時(shí)監(jiān)聽器在實(shí)用性,,實(shí)時(shí)性,準(zhǔn)確性,,以及友好性上都是很不錯的,。

參考文獻(xiàn): 
  
[1]饒運(yùn)濤,鄒繼軍等,,《現(xiàn)場總線CAN原理與應(yīng)用技術(shù)》,,北京航空航天大學(xué)出版社,2003
[2]劉瑞新,,汪遠(yuǎn)征等,,《Delphi 程序設(shè)計(jì)教程》,機(jī)械工業(yè)出版社,,2001
[3]張?jiān)鰪?qiáng),,劉成等,,《Delphi7 數(shù)據(jù)庫開發(fā)完全手冊》,清華大學(xué)出版社,,2003
[4]訾樹波,,于德敏等《工業(yè)生產(chǎn)實(shí)施數(shù)據(jù)采集及管理數(shù)據(jù)庫模型設(shè)計(jì)》,微計(jì)算機(jī)信息,,2005年第21卷第7-3期,。

 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。