4 CAN接口通訊軟件設(shè)計(jì)
對(duì)于can的通訊程序,采用分層處理的方法,包括驅(qū)動(dòng)層和應(yīng)用層。因此,can接口軟件通訊包括兩部分:can驅(qū)動(dòng)程序和can應(yīng)用程序。驅(qū)動(dòng)程序負(fù)責(zé)完成linux內(nèi)核與sja1000之間的數(shù)據(jù)通訊,即linux內(nèi)核設(shè)置sja1000的控制寄存器,讀寫sja1000接收、發(fā)送緩沖器。應(yīng)用程序部分負(fù)責(zé)完成用戶空間和內(nèi)核空間的數(shù)據(jù)交換,以及分析從sja1000接收到的報(bào)文,封裝要發(fā)送報(bào)文。接收的報(bào)文主要包括來自變流模塊和變槳偏航控制模塊的機(jī)組狀態(tài)信息及風(fēng)速風(fēng)向、各類溫度和轉(zhuǎn)速信號(hào)等。發(fā)送的報(bào)文包括下發(fā)給變流模塊和變槳偏航控制模塊的控制指令及控制參數(shù)。
4.1 can驅(qū)動(dòng)程序設(shè)計(jì)
(1)底層驅(qū)動(dòng)程序總體設(shè)計(jì)。在linux中設(shè)備驅(qū)動(dòng)程序是由一組數(shù)據(jù)結(jié)構(gòu)和函數(shù)組成的,它包含設(shè)備服務(wù)子程序(如open、read、write、close、ioctl等)、初始化函數(shù)can_init()和中斷處理程序can_interrupt()。
在linux加載can驅(qū)動(dòng)時(shí)調(diào)用can_init(),向操作系統(tǒng)注冊(cè)設(shè)備,同時(shí)完成can總線波特率的設(shè)置,id過濾器的設(shè)置,清空接收和發(fā)送緩沖區(qū),開啟中斷等工作,完成初始化后,退出復(fù)位模式,進(jìn)入正常的工作模式。
read從接收緩沖區(qū)讀取數(shù)據(jù);write向發(fā)送緩沖區(qū)寫人數(shù)據(jù);release關(guān)閉can 控制器;ioctl向can 控制器發(fā)各種操作命令,包括設(shè)置sja1000總線波特率、id過濾器等;open 打開can 控制器,并使用函數(shù)request_irq()向系統(tǒng)申請(qǐng)中斷,并設(shè)置中斷處理程序?yàn)閏an_interrupt(),當(dāng)sja1000內(nèi)部中斷寄存器(ir)的任意位置為1時(shí),int引腳低電平有效,調(diào)用其中斷處理函數(shù)can-interrupt(),在該函數(shù)中讀取中斷控制寄存器,判斷中斷原因(接收中斷、發(fā)送中斷、錯(cuò)誤中斷、數(shù)據(jù)溢出中斷、喚醒中斷),從而調(diào)用相應(yīng)的服務(wù)子程序。
(2)sja1000讀寫邏輯分析及設(shè)計(jì)。由于sja1000的地址線和數(shù)據(jù)線是分時(shí)復(fù)用的,需要通過軟件編程模擬地址鎖存信號(hào),以達(dá)到數(shù)據(jù)和地址的分時(shí)傳輸,因此,在程序設(shè)計(jì)中,要考慮sja1000的讀寫時(shí)序。圖4為sja1000的寫時(shí)序圖。
圖4 sja1000寫時(shí)序圖
系統(tǒng)中can通訊協(xié)議采用擴(kuò)展幀格式,29位id定義見圖6。
圖6 can通訊協(xié)議擴(kuò)展幀id
其中,命令碼是來自不同模塊的報(bào)文的代號(hào),占id的高12位,范圍為0x000-0x0FFf,包含同一組信號(hào)的報(bào)文具有唯一的命令碼。源地址和目標(biāo)地址取決于控制器地址,主控制器為0x01,網(wǎng)側(cè)變流控制器為0x02,電機(jī)側(cè)變流控制器為0x03,變槳偏航控制器為0x04。id的低9位分別為后續(xù)幀標(biāo)志和后續(xù)幀幀數(shù),若后續(xù)幀標(biāo)志為1,則表示該報(bào)文還有后續(xù)幀需要傳輸。#p#分頁標(biāo)題#e#
(2) 基于qt/e的圖形界面應(yīng)用程序設(shè)計(jì)。本系統(tǒng)中主控制器圖形界面應(yīng)用程序基于linux平臺(tái)的qt/e實(shí)現(xiàn)。圖形界面應(yīng)用程序主要功能有兩個(gè):一是從can 總線接收風(fēng)電機(jī)組運(yùn)行狀態(tài)信息,并顯示給用戶,二是判斷并處理機(jī)組狀態(tài)信息,通過can接口向各子控制模塊發(fā)送控制信息。由于本系統(tǒng)中can以多主方式工作,接收來自多個(gè)節(jié)點(diǎn)的數(shù)據(jù),并向多個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù),因此,在應(yīng)用程序中要封裝不同的報(bào)文,還要分析收到數(shù)據(jù)的信息。
為了提高系統(tǒng)的響應(yīng),應(yīng)用程序采用多線程機(jī)制,本系統(tǒng)中設(shè)計(jì)三個(gè)獨(dú)立線程來處理不同的任務(wù)。主線程負(fù)責(zé)主界面實(shí)時(shí)數(shù)據(jù)顯示,歷史數(shù)據(jù)查詢以及機(jī)組狀態(tài)的邏輯判斷和流程控制等。由于數(shù)據(jù)庫的讀寫是對(duì)磁盤文件的直接操作,速度較慢,因此在一獨(dú)立線程中實(shí)現(xiàn)歷史數(shù)據(jù)的寫操作,以防止對(duì)主線程控制程序的影響,而對(duì)于歷史數(shù)據(jù)的查詢,現(xiàn)場只在特定情況下用到,仍在主線程中實(shí)現(xiàn)。can總線數(shù)據(jù)的交互比較頻繁,為了避免數(shù)據(jù)的丟失,在一獨(dú)立線程中完成數(shù)據(jù)的接收。
5 結(jié)束語
目前,風(fēng)力發(fā)電控制技術(shù)主要掌握在國外大企業(yè)手中,國內(nèi)機(jī)組的控制器主要依靠技術(shù)進(jìn)口,因此,研究并設(shè)計(jì)有自主產(chǎn)權(quán)的機(jī)組控制系統(tǒng)有著深遠(yuǎn)的意義。
參考文獻(xiàn)
[1] 葉杭冶. 風(fēng)力發(fā)電機(jī)組的控制技術(shù)[m]. 北京:機(jī)械工業(yè)出版社,2006.
[2] 孫大鵬. 雙饋風(fēng)力發(fā)電機(jī)組電控與安全保護(hù)系統(tǒng)設(shè)計(jì)研究[d]. 北京:華北電力大學(xué)研究生論文,2009.
[3] 繞運(yùn)濤等. 現(xiàn)場總線can原理與應(yīng)用技術(shù)[m]. 北京:北京航空航天大學(xué)出版社,2007:242-243.
[4] 儲(chǔ)忠,溫陽東. 基于s3c2410控制的can總線接口設(shè)計(jì)[j]. 合肥學(xué)院學(xué)報(bào):自然科學(xué)版,2007,5,2:59-62.
轉(zhuǎn)載請(qǐng)注明出處。