CANopen從站協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
摘要:CANopcn作為一種開放性好、標(biāo)準(zhǔn)化、低成本的基于CAN總線的應(yīng)用層協(xié)議,目前已經(jīng)廣泛地應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域。文章根據(jù)CANop-en DS301應(yīng)用層協(xié)議規(guī)范,在以C8051F500單片機(jī)為控制核心的開發(fā)平臺(tái)上建立了CANopen從節(jié)點(diǎn)協(xié)議棧總框架,并實(shí)現(xiàn)了其中的各種功能模塊,整合成完整的協(xié)議棧,在搭建的實(shí)驗(yàn)平臺(tái)上進(jìn)行了協(xié)議棧的測試,實(shí)驗(yàn)表明:該協(xié)議棧功能完整,實(shí)時(shí)性滿足使用要求。
關(guān)鍵詞:CANopen;C8051F500;從站協(xié)議
0 引言
隨著現(xiàn)代工業(yè)的發(fā)展,控制系統(tǒng)的規(guī)模與復(fù)雜度成倍增長,數(shù)據(jù)傳輸?shù)耐掏铝亢涂煽啃砸笠搽S之提升,現(xiàn)場總線技術(shù)就是在這種情況下被提出并迅速發(fā)展起來的。CAN總線是現(xiàn)場總線國際標(biāo)準(zhǔn)之一,它具有可靠性好、實(shí)時(shí)性高、抗干擾能力較強(qiáng)等優(yōu)點(diǎn),廣泛應(yīng)用于汽車和工業(yè)控制領(lǐng)域。但由于其只定義了物理層和數(shù)據(jù)鏈路層,并非一個(gè)完整的協(xié)議,在高級(jí)應(yīng)用中需要應(yīng)用層的支持,于是CANopen標(biāo)準(zhǔn)應(yīng)運(yùn)而生。
CANopen是自動(dòng)化CAN用戶和制造商協(xié)會(huì)(CiA,CAN-in-Automation)定義的CAN總線應(yīng)用層協(xié)議。它采用面向?qū)ο蟮乃枷朐O(shè)計(jì),具有很好的模塊化特性和很高的適應(yīng)性。CANopcn不僅定義了應(yīng)用層和通信子協(xié)議,還為大多數(shù)重要的設(shè)備類型定義了大量的規(guī)范,不同廠商遵循這些規(guī)范開發(fā)出的設(shè)備之間能夠輕易實(shí)現(xiàn)互操作。
CANopen作為基于CAN總線的高層協(xié)議標(biāo)準(zhǔn),在發(fā)布后不久就獲得了廣泛的承認(rèn)。尤其是在歐洲,CANopcn協(xié)議被認(rèn)為是在基于CAN的工業(yè)系統(tǒng)中占據(jù)領(lǐng)導(dǎo)地位的標(biāo)準(zhǔn)。
1 CANopen協(xié)議總體框架
CANopen協(xié)議棧主要包含了兩部分,一部分是通信規(guī)范,另一部分是設(shè)備規(guī)范。通信規(guī)范(CiA:DS-3011定義了基本的數(shù)據(jù)通信方式和特性,設(shè)備規(guī)范(CiA DSP 401-DSP4XX)則針對(duì)不同的設(shè)備類型進(jìn)行了報(bào)文ID的分配和設(shè)備特征數(shù)據(jù)的定義,規(guī)范了設(shè)備的行為規(guī)范。其中通信規(guī)范是通用的,本文設(shè)計(jì)與實(shí)現(xiàn)的就是這一部分。
在通信規(guī)范中,為了互操作性和兼容性,CANopcn設(shè)備都必須遵從標(biāo)準(zhǔn)的CANopen設(shè)備模型來進(jìn)行軟件設(shè)計(jì),如圖1所示。
CAN通信接口通過操作CAN控制器,在總線上收發(fā)各種通信對(duì)象,來實(shí)現(xiàn)與其他CANopen節(jié)點(diǎn)基于協(xié)議規(guī)范的數(shù)據(jù)交互;對(duì)象字典是CANop-cn設(shè)備的核心,存儲(chǔ)節(jié)點(diǎn)所有的信息,并向應(yīng)用程序和通信對(duì)象提供訪問接口;通信部分通過對(duì)對(duì)象字典進(jìn)行操作,與其他節(jié)點(diǎn)交換各種通信對(duì)象實(shí)現(xiàn)CANopen操作;應(yīng)用程序由用戶根據(jù)應(yīng)用要求和設(shè)備的具體任務(wù)自己實(shí)現(xiàn)。
2 CANopen功能模塊實(shí)現(xiàn)
2.1 CAN驅(qū)動(dòng)程序?qū)崿F(xiàn)
針對(duì)C8051F500單片機(jī),實(shí)現(xiàn)了CAN驅(qū)動(dòng)程序。CAN驅(qū)動(dòng)程序負(fù)責(zé)完成CAN控制器的操作、報(bào)文收發(fā)、CAN錯(cuò)誤處理等任務(wù),由以下部分組成:1)CAN控制器的初始化,主要對(duì)CAN控制器的相關(guān)寄存器進(jìn)行配置,包括波特率的設(shè)置,消息對(duì)象的配置,接收、發(fā)送屏蔽寄存器的設(shè)置;2)CAN發(fā)送程序,任務(wù)是將打包好的數(shù)據(jù)根據(jù)幀標(biāo)識(shí)符,通過接口寄存器分發(fā)到相應(yīng)的郵箱里,然后啟動(dòng)發(fā)送;3)CAN接收程序,由CAN中斷處理程序來完成,負(fù)責(zé)將報(bào)文分配給各個(gè)通信模塊處理。
2.2 對(duì)象字典實(shí)現(xiàn)
對(duì)象字典OD(Object Dictionary)是一個(gè)有序的對(duì)象組:每個(gè)對(duì)象采用一個(gè)16位的索引值來尋址,同時(shí)定義了一個(gè)8位的子索引用于訪問數(shù)據(jù)結(jié)構(gòu)中的單個(gè)元素。每個(gè)CANopen設(shè)備中都必須包含一個(gè)對(duì)象字典。對(duì)象字典分為了兩部分,通用的通信子協(xié)議區(qū)域和特定的設(shè)備子協(xié)議區(qū)域,前者包含了描述這個(gè)設(shè)備通信行為的所有參數(shù),后者包含了設(shè)備任務(wù)相關(guān)的所有數(shù)據(jù)。
本文設(shè)計(jì)的對(duì)象字典結(jié)構(gòu)如圖2所示。
針對(duì)單片機(jī)計(jì)算資源緊缺的特點(diǎn),對(duì)象字典實(shí)體采用二維靜態(tài)結(jié)構(gòu)體來實(shí)現(xiàn),它具有結(jié)構(gòu)簡單、訪問效率高等優(yōu)點(diǎn)。讀寫函數(shù)與對(duì)象字典實(shí)體配套使用,目的是將對(duì)象字典封閉起來,有效地杜絕非法訪問的情況,保障對(duì)象字典的數(shù)據(jù)安全。
2.3 通信對(duì)象的實(shí)現(xiàn)
CANopcn協(xié)議規(guī)定了4類通訊對(duì)象:SDO(Service Data Objeet,服務(wù)數(shù)據(jù)對(duì)象)、過程數(shù)據(jù)對(duì)象)、NMT(NetworkManagement,網(wǎng)絡(luò)管理對(duì)象)以及特殊功能對(duì)象。
2.3.1 PDO模塊
PDO服務(wù)主要用來實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)的傳輸,基于生產(chǎn)者和消費(fèi)者模式,它的通信行為由通信參數(shù)決定,傳送的數(shù)據(jù)由映射參數(shù)來決定。本文實(shí)現(xiàn)的PDO模塊包含了三個(gè)子模塊,如圖3所示。
建立PDO報(bào)文模塊被其他兩個(gè)模塊調(diào)用,他的任務(wù)是根據(jù)映射參數(shù)表把對(duì)象字典中對(duì)象的數(shù)據(jù)復(fù)制進(jìn)PDO報(bào)文中,交由其他模塊處理,建立過程中需注意PDO報(bào)文的剩余容量。接收PDO模塊的任務(wù)是完成PDO數(shù)據(jù)的解析,將數(shù)據(jù)放入指定對(duì)象中;發(fā)送模塊負(fù)責(zé)根據(jù)CANopen協(xié)議規(guī)范,依據(jù)PDO通信參數(shù),實(shí)現(xiàn)各種PDO傳輸方式,包括同步周期、同步事件預(yù)觸發(fā)、異步事件觸發(fā)等方式。
2.3.2 SDO模塊
SDO模塊是對(duì)象字典的遠(yuǎn)程訪問接口,一般被用來進(jìn)行節(jié)點(diǎn)參數(shù)配置和獲取。它基于客戶端服務(wù)器模式,每個(gè)訪問請(qǐng)求都必須應(yīng)答,實(shí)現(xiàn)了可靠的點(diǎn)對(duì)點(diǎn)數(shù)據(jù)傳輸。CANopen為SDO服務(wù)設(shè)計(jì)了5個(gè)請(qǐng)求/應(yīng)答子協(xié)議,分別是:啟動(dòng)域下載/上傳、域分段下載\上傳、中止域傳送。
本文設(shè)計(jì)的SDO模塊包含了訪問發(fā)起模塊和應(yīng)答模塊。訪問發(fā)起模塊的任務(wù)是根據(jù)上層的調(diào)用發(fā)起SDO通信,實(shí)現(xiàn)了5個(gè)訪問子協(xié)議中的請(qǐng)求部分;應(yīng)答模塊則解析收到的SDO報(bào)文中攜帶的命令字,實(shí)現(xiàn)了5個(gè)訪問子協(xié)議中的應(yīng)答部分。
2.3.3 NMT模塊
每個(gè)CANopen節(jié)點(diǎn)內(nèi)都運(yùn)行著一個(gè)狀態(tài)機(jī),狀態(tài)轉(zhuǎn)換由主節(jié)點(diǎn)控制,不同的狀態(tài)對(duì)應(yīng)不同的節(jié)點(diǎn)任務(wù),也對(duì)應(yīng)了不同的模塊可用性。狀態(tài)轉(zhuǎn)換如圖4所示。
本文實(shí)現(xiàn)的從節(jié)點(diǎn)NMT模塊的任務(wù)是響應(yīng)主站的NMT控制命令,并反饋?zhàn)陨頎顟B(tài),匯報(bào)錯(cuò)誤信息。狀態(tài)轉(zhuǎn)換模塊的流程:接收到NMT命令后,首先解析NMT命令字,檢查狀態(tài)轉(zhuǎn)換合法性,然后設(shè)置節(jié)點(diǎn)狀態(tài),啟停各功能模塊:狀態(tài)反饋模塊采用了CiA組織推薦使用的心跳模式,即從節(jié)點(diǎn)周期性地向網(wǎng)絡(luò)上發(fā)送包含自身狀態(tài)信息的心跳報(bào)文,供主站和其他節(jié)點(diǎn)監(jiān)視。
2.3.4 總體流程
借助于狀態(tài)機(jī),設(shè)計(jì)了如圖5的程序運(yùn)行總體流程。
從節(jié)點(diǎn)上電啟動(dòng)后,先進(jìn)行必要的硬件初始化,如系統(tǒng)時(shí)鐘、port、CAN接口、定時(shí)器、AD等,完成后設(shè)置節(jié)點(diǎn)狀態(tài)為initialization,進(jìn)入狀態(tài)機(jī),軟件在狀態(tài)機(jī)內(nèi)循環(huán)運(yùn)行。通信初始化函數(shù)主要負(fù)責(zé)初始化從節(jié)點(diǎn)的對(duì)象字典,節(jié)點(diǎn)初始化函數(shù)則負(fù)責(zé)將節(jié)點(diǎn)的輸出置為上電值,設(shè)置完成后設(shè)置節(jié)點(diǎn)狀態(tài)為pre-operational,軟件運(yùn)行至preoperational函數(shù),這個(gè)函數(shù)的功能是協(xié)助主站完成對(duì)從節(jié)點(diǎn)的通信配置。當(dāng)從節(jié)點(diǎn)收到start remote node命令后,進(jìn)入operational狀態(tài),此狀態(tài)包含了從節(jié)點(diǎn)的控制程序,即從節(jié)點(diǎn)開始正常運(yùn)行,執(zhí)行指定的底層任務(wù),如數(shù)據(jù)采集、控制輸出等。若節(jié)點(diǎn)接收到主站的stop remote node命令,則進(jìn)入stopped函數(shù),在此狀態(tài)下從節(jié)點(diǎn)停止執(zhí)行底層任務(wù),等待主節(jié)點(diǎn)的啟動(dòng)命令。
3 實(shí)驗(yàn)
3.1 測試實(shí)驗(yàn)平臺(tái)的搭建
為了測試本文的CANopen從節(jié)點(diǎn)協(xié)議,搭建了基于USB-CAN模塊的測試平臺(tái),結(jié)構(gòu)如圖6所示。主站是裝有ZLGCANTest的計(jì)算機(jī),以USB-CAN通信模塊作為CAN網(wǎng)絡(luò)接口,實(shí)現(xiàn)與從站的連接。示波器監(jiān)視總線波形,通信波特率設(shè)置為500kb/s。
3.2 實(shí)時(shí)性測試
首先進(jìn)行了協(xié)議棧的實(shí)時(shí)性測試,測試分為兩步,第一步是測試PDO通信的最小周期,設(shè)置PDO為同步周期發(fā)送模式,即收到一個(gè)同步報(bào)文后返回一個(gè)數(shù)據(jù)包,測試結(jié)果如圖7所示。
可見同步幀與數(shù)據(jù)包的間隔時(shí)間約為1ms,整個(gè)總線占用時(shí)間約為1.3ms。
第二步進(jìn)行了SDO模塊的最小響應(yīng)時(shí)間測試,測試結(jié)果如圖8所示。
可見SDO請(qǐng)求報(bào)文和響應(yīng)報(bào)文間隔時(shí)間約為0.7ms,總線占用時(shí)間約為1.1ms。協(xié)議棧的實(shí)時(shí)性基本滿足我們的使用要求。
3.3 功能性測試
我們對(duì)實(shí)現(xiàn)的協(xié)議棧進(jìn)行了CANopen協(xié)議功能和兼容性的測試,測試結(jié)果如表1所示。
目前,我們已經(jīng)將該協(xié)議棧應(yīng)用于實(shí)驗(yàn)室建立的低溫等離子體測控設(shè)備系統(tǒng)中,經(jīng)過一段時(shí)間的使用,此協(xié)議棧滿足我們的使用要求。
4 結(jié)論
本文依據(jù)CiA DS301規(guī)范,設(shè)計(jì)了CANopen協(xié)議總體框架和軟件功能模塊,并將其應(yīng)用于基于C8051F500獸片機(jī)的嵌入式CAN智能節(jié)點(diǎn)上,實(shí)現(xiàn)了CANopen從站軟件。協(xié)議棧采用C語言編寫,可移植性較好。經(jīng)測試表明:協(xié)議棧實(shí)時(shí)性滿足使用要求,功能完整性較好。