用于卷煙機組的CAN總線實時監聽器的設計與實現
引 言
卷煙生產中的卷煙機組主要包括兩大部分,上位機MLP,用于為控制系統和檢測系統提供操作和顯示的裝置,它包括一個工業PC和一個監視器。以及下位機SRP,包括傳感器,調節裝置或者檢測裝置。SRP主要包括四種結點1)SPS,2)HIP,3)CIS,4)SRM。上位機和下位機各結點之間的通信是頻繁的,數據對象眾多,數據種類也繁多,包括參數上傳,下傳,指令,域數據等等,所以在這之中,難免會因為操作人員操作失誤或者控制器本身的原因導致錯誤,但錯誤發生的時候需要盡快的分析,發現錯誤,解決錯誤。因此我們需要建立一個可靠的錯誤判斷機制。本文所討論的CANBUS實時監聽器正是應這種需求而產生的。工作人員根據實時監聽器所捕獲的并且友好顯示的線路上的適時數據便可分析出是哪一方出了問題,出了什么類型的問題。這對安全生產,準確控制起了舉足輕重的作用。
(一) 硬件實現
在實時監聽器的實現中,我們選擇采用了周立功公司的PCI-9810非智能CAN接口卡作為硬件接口用于接收捕獲CAN總線上的傳輸數據。如下圖
PCI-9810非智能CAN接口卡是具有高性能價格比的CAN-bus總線通訊適配卡,它使PC機方便的連接到CAN總線上,實現CAN2.0B協議的連接通訊。它是一款采用專用PCI接口轉換芯片設計的非智能型CAN接口卡,即插即用,符合PCI2.1規范。它采用中斷接收方式,可最大限度減輕占用PC的負荷;具有最多8幀的數據緩沖區。另外我們采用了周立功公司提供的Windows驅動程序升級版PCI-9810BWDM驅動文件將其驅動。
(二) 界面軟件實現
界面軟件實現主要包括四大方面,1)軟件平臺的選擇,2)對硬件接口CAN卡的使用,3)利用接口接收CANBUS線路上數據的實現,4)所接收數據的處理(主要是判斷和顯示)的實現。
〈1〉軟件平臺的選擇—DELPHI
系統的開發可利用多種程序設計語言,如DELPHI,VB,VC,PB等語言都是面向對象的程序設計語言,但把幾者相比較,DELPHI是唯一一套能夠同時適用于開發數據庫應用、網絡及WEB 應用等所有軟件的高效率開發環境,且第三方控件多,開發比較快,且設計界面比VB,VC,PB 靈活。基于以上因素,考慮到所要監聽CANBUS線路的傳輸數據信息量大、種類多,以及信息之間相對獨立,又有關系且必須備有優良的圖形顯示等特點,我們選擇DELPHI作為軟件開發平臺。
〈2〉對硬件接口PCI-9810的操作的實現
在DELPHI程序中,我們是通過調用周立功提供的通用VCI動態鏈接庫來實現對硬件接口PCI-9810的操作的,該動態鏈接庫提供了界面軟件能在windows下運行必需的代碼和其他資源,其中主要包括十個接口函數如設備相關函數和CAN通訊相關函數以及相關的數據結構的定義。把動態鏈接庫文件夾添加到項目文件夾,然后把庫源文件添加到程序代碼的應用文件單元即可實現對動態鏈接庫的調用,也就實現了對PCI-9810卡的打開,關閉,啟動,復位,收發數據等操作。
〈3〉CANBUS線路上數據的實時接收
CANBUS線路上的數據對CAN卡來說有著不期性,所以要能對數據實時,準確的接收,必須要通過程序實現一種功能即線路上一旦有數據,就能捕獲。對于此,我們采用的方式是利用多線程。即在程序中專門開辟一個線程用于對線路的監聽,接收。
關于多線程
在32位的windows系統中,系統可以同時運行多個進程,一個調入內存并準備執行的應用程序稱為一個進程,它由裝入內存的程序代碼和操作系統及由此創建的應用程序執行環境組成,進程就是應用程序的運行實例。每個進程都有自己私有的虛擬地址空間和動態分配的內存,以及文件,線程和其它模塊。每個進程都有一個主線程,但可以建立另外的線程。進程中的線程是并行執行的,每個線程占用CPU的時間由系統來劃分,可以把線程看成是操作系統分配CPU時間的基本實體。每個進程也可以同時執行多個線程并由系統不停地在各個線程之間切換。
多線程的DELPHI實現
雖然Windows 提供了比較多的多線程設計的API 函數,但是直接使用API 函數一方面極其不方便,而且使用不當還容易出錯。為避免這個問題,我們采用了DEPHI所提供的方法即繼承TThread類產生線程對象。TThread由DELPHI的VCL類庫提供用于線程編程。在Tthread類中封裝了windows中關于線程機制的API函數,繼承TThread類產生的線程對象就代表了實際程序中的一個線程。線程對象通過封裝使用線程所需的內容大大簡化了多線程問題的處理。另外,在DELPHI中,Tthread在Classes單元中聲明,直接從Tobject繼承下來的,因此,它不是組件。Tthread是個抽象類,所以不能創建Tthread的實例,而只能創建其派生類的實例。在本程序中利用Ttread類來編寫多線程的步驟如下
(1)從Tthread類派生出一個新的線程類。即建立的TreceiveThread。
(2)創建線程對象。即在Types里面定義thread1:TreceiveThread。
(3)在DELPHI自動生成的用于保存派生類代碼的新的單獨的文件中重載Execute過程,在該過程中將對CAN線路上的數據實時接收并調用對接收到的數據進行處理的基本顯示和分類顯示函數。在Execute過程中使用了repeat…..until語句來判斷過程是否結束。
(4)如果Execute過程執行完畢,則該線程就結束了,并釋放線程占用的??臻g。
〈4〉對所接收的數據進行處理
對數據的實時處理包括兩方面:1)將接收到的數據楨按照接收數據的數據結構完全顯示,這包括楨類型,楨格式,楨ID,楨數據等等。2)將數據進行更深一層的分析判斷出數據的真實含義,并將其填入對應的文本框或者畫出對應的狀態圖等等。
(1)對于第一種基本顯示,我們采用的是用DELPHI提供的listbox控件進行
滾動顯示,listbox的容量足夠本顯示的需要,另外,我們還添加了一個按鈕控件用于按照操作人員的需要隨時清除listbox里面的內容。
(2)對于第二種分類顯示。對于不同的數據,我們將用不同的分析處理方法進行顯示。根據數據的現實含義,主要分為1)上,下傳參數。2)域請求和域數據,3)下傳指令和上傳消息。下面將分別介紹處理方法:
1 利用數據庫系統進行上,下傳參數的顯示
在CAN線路上傳輸的參數不僅多達近200種,而且有上傳和下傳之分,可見所要顯示的量之大,加上上下傳的參數有著相同的數據結構,所以我們采用查詢預先建立好的數據庫的方法來進行顯示。
關于數據庫系統數據庫系統為我們提供了一種把與我們的工作和生活緊密相關的信息集合在一起的方法。它還提供了在某個集中的地方存儲和維護這些信息的方法。數據庫系統主要由三大部分組成:數據庫管理系統,數據庫應用程序,數據庫。
評論