目錄
名詞縮寫說明... 2
1.通訊概述... 3
2.CAN總線... 5
2.1 CAN總線介紹... 5
2.2 CAN總線的組成... 6
3.CANOPEN協議... 9
3.1協議簡介... 9
3.2對象和對象字典... 9
3.3 EDS文件... 10
3.4 SDO通訊... 11
3.5 PDO通訊... 12
3.6 PDO觸發類型... 14
3.7映射PDO.. 15
3.8 HeartBeat&NodeGuarding. 17
3.9網絡狀態管理... 18
參考文獻... 20
附錄A CANopen控制字常用功能表... 20
附錄B CANopen通訊錯誤對照表... 21
名詞縮寫說明
CAN Controller Area Network控制局域網
CANopen CAN總線的一種應用層協議名稱
PDO Process data object過程數據對象
SDO Service data object服務數據對象
TPDO 發送PDO
RPDO 接收PDO
Object 對象,CANopen協議中的名詞
Index 索引,即編號
SubIndex 子索引,和索引類似,也是編號
節點 CAN總線上各設備的名稱
從站 CAN總線上各設備在CANopen應用層的名稱,本文中節點和從站都表示CAN總線上的節點
主站 CANopen應用層中的第一個節點
1.通訊概述
在開始學習CAN之前,我們先說下通訊的組成。最早的通訊我們可以認為是旗語,用不同的旗子,不同的擺放來傳遞信息。后面出現了電話、電報,可以用來傳遞信息。隨着計算機的出現,通訊方式變的越來越多樣化,可以傳遞的信息量也越來越多。早期的通訊方式都沒有什么固定標准,兩者之間規定好相應的規則即可,這個規則就可以理解為通訊協議,而幫助傳遞信息的就是總線。總線是傳輸信息的載體,是實實在在的硬件,總線+協議最終構成了通訊方式。這里要提前說下的是總線和協議不是一回事,總線是總線,協議是協議,后面我們會慢慢介紹。
如果通訊的發展停留在這個階段,那我們現在所處的世界就不像現在豐富多彩了。為了建立一定的標准去方便不同系統互聯通訊,這個時候就有一些組織提出了制定規范來解決這個問題。經過多次修訂,最終就有了開放系統互連的通訊模型,簡稱OSI(Open System Interconnection)七層模型。圖1-1即為OSI七層模型的示意圖。
圖1-1 OSI七層模型
從模型中我們可以看到,通訊最終是轉化為比特流發送出去,我們說的通訊速率就是比特流的速率,比如百兆網絡100Mbit/s。比特流的傳輸載體是物理層,是我們看的見摸得着的線纜以及接口芯片等。物理層往上是數據鏈路層,數據鏈路層的職責是負責將具體的數據轉化成比特流,然后通過物理層的硬件發送。可以簡單理解為,硬件的編碼與解碼,比如要發送數字8,那么數字8的比特流高低電平是怎樣的;當收到一串比特流后,應該轉換為哪個數字,這個就靠數據鏈路層完成的,數據鏈路層也是硬件,以及底層的協議。
數據鏈路層再往上,還有五層。這五層都有一個特點,他們都是軟件層,是運行在處理器上的軟件代碼,這五層完成數據報的解析,編組,歸類,最終到顯示。當我們用因特網看視頻時,這些層就在周而復始發送請求,解析數據,並最終刷新到顯示界面。這五層搞起來確實有點復雜,有些時候其實是不需要的,比如我們知道數據的具體含義,我們就不需要再去分組整理數據,直接使用即可,工業通訊應用正是符合這個特點。尤其是針對運動控制或者過程控制總線,層數太多不僅沒用,反而會增加不必要的成本,並且運動控制或者過程控制這種專用總線上數據的含義都是嚴格一一對應的,不需各種分組分段解析啥的。所以,將五層壓縮為一層,叫應用層。物理層,數據鏈路層,應用層都有各自的功能,三層功能沒有重疊部分。發送工作流程是當數據到達后應用層后把數據放到對應的存儲區,數據需要發送時到對應區域取出數據,交給數據鏈路層,比特流經物理層發送出去;接收工作流程就是反過來,物理層上的比特流被數據鏈路層解析為正確的數值,放到對應的存儲區域,應用層需要數據的時候取走數據即可。
所以,工業通訊環境下,一般就是三層的通訊模型。如下表1-1所示,各層有各層的功能。表1-1
層名稱 |
功能 |
應用層 |
搬運數據,完成控制功能 |
數據鏈路層 |
承上啟下,生成比特流,以及解析比特流 |
物理層 |
比特流傳輸載體 |
任何一種通訊都滿足這三層的通訊模型,理解了三層通訊模型后,后續無論遇到什么新的總線,就按這個框架去學習,突破現象看本質。學起來也就更輕松,理解的也會更透徹,不會似懂非懂,更不會出現碰運氣才能通訊上的情況。
2.CAN總線
2.1 CAN總線介紹
控制局域網CAN(Controller Area Network)是德國博世公司為汽車應用而開發的多主機局部網絡,用於汽車的監測和控制。CAN總線設計的初衷是為了解決汽車上眾多的電子設備之間的通信問題、減少電子設備之間繁多的信號線。這就是CAN總線的起源。
CAN總線的通信過程如圖2-1所示,可以用寄快遞來比喻,有發送的有接收的。還有一個濾波器設置,保證是送到正確的地址,不需要接收的節點不需要處理,過濾掉即可。
圖2-1
CAN總線上傳輸的信息叫報文,也就是要傳遞的信息,當總線空閑時,任何連接的單元都可以發送新的報文。CAN報文有兩種不同的幀格式,標准格式和擴展格式。標准格式是11位標識符,擴展格式是29位標識符。標志符的作用就是寫明此幀數據發送的地址信息、數據信息的長度。我們以數據幀為例,說明下報文的構成,如下圖2-2所示。
圖2-2
每一幀數據的開始有個幀起始位,緊跟着是仲裁域和控制域,也就是對應標識符那一段。數據域是要發送的數據,數據域之后是跟着CRC循環冗余校驗,這個確保發送和傳輸的數據正確性,如果傳輸過程中數據被損壞,則發送的CRC和接收端計算的CRC不一樣,數據傳輸錯誤。CRC之后就是應答域,表示節點收到數據,最后是幀結尾,表示這一幀數據結束了。
剛說的報文中的這些域,以及幀起始和幀結尾對應的電氣信號都是高低電平。CAN總線的信號傳輸是差分信號,靜態時對地均是2.5V,當有數據時CAN_H是3.5V,CAN_L是1.5V。CAN總線的電平如圖2-3所示
圖2-3
需要傳輸的數據會被CAN控制器轉換為連續不斷的高低電平,接收端接收到信號后會將連續不斷的高低電平翻譯為對應的數據。這個CAN控制器就是我們前文說的數據鏈路層,數據鏈路層的協議就是CAN總線的底層協議。現在CAN總線的底層協議有CAN 2.0A和CAN 2.0B,區別是標志符的長度不一樣,2.0B是29位標識符,同時也可以識別11位標志符的報文。CAN總線的底層協議不是我們學習的重點,了解即可,這個是CAN控制器開發者需要關心的,也就是芯片開發者的主要工作。作為使用者或者叫應用工程師,我們重點關注的是應用層的高級協議,比如我們后面要重點介紹的CANOPEN就是應用層協議,是應用層的東西。
2.2 CAN總線的組成
CAN總線或者任何總線的組成從抽象層面講,都是物理層、數據鏈路層,或者包含應用層,CAN總線是沒有包含應用層的,應用層是開發者后續增加的。基於CAN總線的應用層有很多,如CANOPEN、DeviceNet、SDS、CANKingdom等等,這些都是叫應用層協議。故我們可知,同樣的總線可以有不同的應用層。同樣的應用層也可以基於不同的總線,比如CANOPEN協議在EtherCAT總線上也有,即CoE。簡言之,應用層是軟件代碼,數據鏈路層是既有硬件,也包含硬件的底層協議,物理層是單純的硬件。
接下來看看CAN總線的物理層和數據鏈路層。物理層由雙絞線和CAN收發器組成,常用的CAN收發器有TJA1050芯片。數據鏈路層就是CAN控制器,CAN控制器既有獨立的芯片,如SJA1000,也有嵌入到MCU的CAN控制器,如我們常用的STM32系列微控制器一般都自帶CAN控制器。CAN控制器的結構示意如下圖2-4所示,CAN控制器能獨立處理總線上的數據,處理完成的數據再和主控制器交互。
前面我們提到CAN總線上任意時間只能有一個節點發送數據,其余節點都是在接收狀態,如果這個時候有其他節點要發送數據的話那要怎么辦呢?是不是等當前節點的數據發送完成了再去補發呢?這些都不需要,CAN控制器中有一個發送緩沖器管理着數據的發送,如果總線上有數據則進入等待,總線空閑的時候再發送出去。如果同時有幾個節點要發送數據,怎么辦,通過仲裁解決,ID值小的節點先發送,ID值大的節點等待,直到數據發送出去。接收數據的時候CAN控制器會把數據直接寫入接收緩沖區,如果不是本節點需要的數據,濾波器會直接過濾掉。這樣主控制器就不用一直輪詢來接收數據了,CAN控制器產生相應的接收中斷來通知主控制器數據已經達到,大大提高主控制器的效率。
圖2-4
CAN總線的拓撲結構如下圖2-5所示,理論上總線可以有無限多的節點。但節點越多,通訊的速度就會越慢,並且CAN總線是半雙工的,任何一個節點在使用的時候,其他節點都不能發送數據。CAN總線上第一個和最后一個節點120Ω終端電阻是需要的,主要是為了減少信號的回波反射,使總線更會更穩定。CAN總線的最快波特率是1Mb/s,同一總線上的波特率要一致。總線越長,則波特率越低,一般常用的就是1Mb/s到125kb/s。
圖2-5
CAN總線大概就是這樣,我們只需知道它的物理層和數據鏈路層的原理和組成即可,不需要深入這兩層的具體實現細節。用CAN總線通訊數據是非常簡單的事情,初始化好CAN控制器,配置好濾波器,當總線上有本節點關心的數據時,數據就會存到緩存區並觸發中斷,主控制器去讀取數據即可。需要基於MCU的CAN總線通訊相關例子的可以自己去百度搜索,或者看下MCU芯片的使用手冊,這里不展開講了。對CAN總線的基本概念有個系統性的了解即可,編寫程序用總線實現通訊,達到我們的控制要求才是我們的主要目的。下面將會把主要篇幅用來介紹CANOPEN協議,CANOPEN協議在伺服控制系統中非常常見,非常主流。同樣,協議的具體實現細節不展開講,主要講下協議的基本概念,術語,重點是怎樣使用。
3.CANOPEN協議
3.1協議簡介
CAN總線是博世公司創立的,而CANOPEN協議是一個叫CiA的組織制定的,CiA是CAN in Automation的縮寫。這個組織是一個非營利性機構,是幫助成員制定各種規范,成為這個組織的會員就會獲得一個vendor ID,這個ID就是一個廠商編號,用以區別不同廠商。與CANopen相關的規范文件有DS301/DS401/DS402,其中DS301只是CANopen的一個基礎規范,具體到細分領域有,I/O模組的DS401,伺服控制的DS402。感興趣的可以自己去翻下這些手冊,百度都可以下載,接下來我們就開始講CANopen協議了。
前面我們講了CAN總線的通訊方式,在CAN總線中是沒有主從概念的,所有節點都可以是主,所有節點都可以是從,節點之間可以相互通訊。但在CANopen協議中是有主從概念的,這一點要記住。CANopen協議中規定了,一個總線中只能有一個節點為主站,節點號為0,其余的節點都是從節點,節點號從1開始遞增。只能在主從之間通訊,從站之間不能直接通訊,從站之間的通訊也需要經過主站。CANopen協議中有對象的概念,理解了對象這個名詞的含義后對學習協議非常有幫助。
3.2對象和對象字典
CANopen協議下的通訊方式有SDO和PDO。SDO是service data object服務數據對象的縮寫,PDO是process data object過程數據對象的縮寫。對象這個名詞比較抽象,剛開始可能不好理解。對象是有編號和名稱等信息的,可以簡單理解為區分不同寄存器的一個描述,不必過於糾結為什么叫對象這個名字。很多對象組合在一起就形成了對象字典,對象字典就是把不同功能的對象羅列到一起,方便查找不同對象的編號、名稱、功能等詳細信息。CANopen協議的對象有上百個之多,如0x6040控制字,0x6041是狀態字,還有設置目標位置,規划速度的等等。
除了對象這個概念之外,有的對象又還有子索引,如果0x1800 TPDO1的參數對象就不僅僅只有一個地址。0x1800是這個對象的入口,下面還有子索引,子索引的編號一般是從0x00開始。要全部記住這些對象的功能編號是不太可能的,當我們需要的時候去查對象字典就可以了,關鍵是要理解這些名詞,然后知道怎樣去看,突破現象看本質。每個CANopen產品都會有一個對象字典手冊,里面有詳細全面的描述,使用的時候要參考這個。
對象的代表的含義就是和芯片手冊中各個寄存器的功能一樣,理解到這一點,接下來的學習就掃清障礙了,熟練程度就需要項目實戰了。
3.3 EDS文件
還有一個與對象相關的名詞叫EDS文件,EDS是英文electronic data sheet的縮寫,即電子數據表格。在CANopen中的EDS文件就是從站的對象描述文件,通過這個文件我們就可以知道對應從站有哪些對象,對象的入口地址編號是多少,有沒有子索引,有幾個子索引,是否映射了PDO等等。相當於一個非常詳細的背景信息,這就是EDS文件的作用。圖3-1是EDS文件內容的一個截屏,里面的關於每個對象的詳細描述,能看的懂,知道怎么修改可以配置PDO即可,關於PDO的配置在后面會詳細說明。
圖3-1
3.4 SDO通訊
SDO是詢問才應答的模式,詢問是主站詢問從站,應答是從站應答主站,相當於從站給主站提供服務,只有詢問才會有應答。圖3-2是SDO通訊讀數據,主->從和從->主的報文結構。詢問的時候發送的COB-ID = 0x600+Node-ID,0x600標識符,節點編號是變化的,節點1就是0x601,節點2對應0x602,依此類推。應答的時候發送的COB-ID = 0x580+Node-ID,0x580標識符,節點編號是變化的,節點1就是0x581,節點2對應0x582,依此類推。緊跟着COB-ID的就是數據區,Byte0是控制字符,簡單理解就是要進行什么操作,讀的數據長度是多少。當應答是時候,Byte0也是控制字符。這個Byte0的含義請看圖3-3,詢問的時候Byte0都是發0x40,應答的時候則根據不同的數據長度會不同。圖3-3只是以一個廠家的手冊舉例,具體到不同廠家是大同小異,也許有的會分的更細,使用的時候發現不一樣的,再詳細參考對應廠家的手冊。
Byte1 Byte2對象地址,地址都是兩個byte的,發送的時候需要分開,低位地址在前,高位地址在后。Byte3是子索引地址,如果當前對象沒有分子索引的則填0x00。Byte4-7在讀的時候是沒有意義的,全部填0x00即可。
應答的時候Byte1-3是和發送出去的指令一樣的,Byte4-7就是讀取回來的數據,同樣也是低字節在前,高字節在后,低字在前,高字在后。
圖3-2
如果讀取的時候發生錯誤,則錯誤碼就存在Byte4-7這四個字節中,也低字節在前,高字節在后。錯誤碼的具體含義請參附錄B ,一般就是地址寫錯之類的錯誤。
圖3-3
SDO通訊寫入數據和讀取數據差不多,如圖3-4所示,也是詢問之后再應答的模式。指令中Byte0的含義參見圖3-3,寫入數據長度不同則操作碼不同。Byte4-7是要寫入的數據,同樣也是低字節在前,高字節在后,低字在前,高字在后。
應答的時候Byte0是0x60,且Byte4-7如果全部都是0x00,則表示寫入數據成功,沒有錯誤。反之則Byte0是0x80,Byte4-7則是報錯的代碼,沒有寫入成功,錯誤碼的具體含義請參附錄B,Byte1-3的含義還是對應的對象和索引地址。
圖3-4
SDO通訊比較簡單,按部就班的操作就可以。一般容易出錯的是Byte0控制字符不對,對象地址寫錯,子索引寫錯,寫的數據超出范圍,或者寫入了只讀對象,使能模式下禁止某些對象的寫入等等,都比較好排查。
3.5 PDO通訊
帶着問題學習PDO通訊。為什么已經有SDO通訊方式了,還要再去折騰PDO通訊呢?這會增加嵌入式開發的難度,也會增加使用者的難度,豈不得不償失。這就要先說說SDO的不足了,SDO雖然能滿足數據的讀寫,但是SDO是一發一收的模式,會更多的占用總線資源,前面我們已經講過CAN總線是半雙工的形式,任何時間總線上只能有一個操作,后面的操作要排隊等待。CAN總線的波特率最快只有1Mbps,這種改善的效果是立竿見影的,可以大大增加數據的吞吐量。當然PDO的優點不僅僅是這個,接下來我們慢慢掀開PDO的神秘面紗。
PDO是過程數據對象,分為TPDO發送過程數據對象和RPDO接收收據對象,TPDO可以理解從站把數據上傳給主站,RPDO可以理解為主站把數據寫入從站。TPDO和RPDO各4個,有各自對應的COB-ID,如表3-1所示
表3-1
名稱 |
對象 |
子索引 |
默認COB-ID |
Node-ID=1時 |
TPDO1 |
0x1800 |
0x01 |
0x180+Node-ID |
0x181 |
TPDO2 |
0x1801 |
0x01 |
0x280+Node-ID |
0x281 |
TPDO3 |
0x1802 |
0x01 |
0x380+Node-ID |
0x381 |
TPDO4 |
0x1803 |
0x01 |
0x480+Node-ID |
0x481 |
RPOD1 |
0x1400 |
0x01 |
0x200+Node-ID |
0x201 |
RPDO2 |
0x1401 |
0x01 |
0x300+Node-ID |
0x301 |
RPDO3 |
0x1402 |
0x01 |
0x400+Node-ID |
0x401 |
RPDO4 |
0x1403 |
0x01 |
0x500+Node-ID |
0x501 |
每個PDO的最大數據長度是8個byte,映射的數據長度可以小於8個byte,則總共的收發PDO長度最大為各32個byte。那么PDO要怎么映射呢?
每個PDO都有兩個對象,一個是參數對象,如TPDO1的參數對象就是0x1800,這個對象不止一個子索引。0x01子索引存的是COB-ID,0x02子索引定義的是PDO的傳輸類型,這個接下來會單獨講解。0x03子索引是TPDO的最小傳輸時間間隔,RPDO沒這個參數。不同廠家的可能還有更多的子索引,但這幾個是肯定有的。PDO的另一個對象是管理映射的,比如TPDO1管理映射的對象是0x1A00,子索引0x00是存儲總共映射了幾個對象,從0x01開始,存的就是映射對象的具體信息,包括映射的對象地址,數據長度。
一個對象管理PDO具體的映射信息,我們就知道了映射了哪些對象。另一個對象則管理PDO的COB-ID,傳輸類型。這樣我們就可以通過PDO的COB-ID來直接寫入或者讀取PDO中映射的對象數據,也就是說相當於一個報文可以操作幾個對象了,省去了SDO通訊每讀一個對象都要一來一回的不便,效率大大提高。說了這么多,舉例讓大家看的更清楚,理解的更透徹。
表3-2
PDO名稱 |
COB-ID |
映射的對象 |
||
RPDO1 |
0x201 |
0x6040 |
0x607A |
0x6060 |
TPDO1 |
0x181 |
0x6041 |
0x6064 |
0x6061 |
如表3-2所示,RPDO1中映射了3個對象,分別是控制字、目標位置、運行模式,我只需要一條指令就可以一次把這三個對象都寫入數據,指令是
0x201 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
0x201是RPDO1的COB-ID,后面是跟着要寫入的數據,寫入的數據是根據映射的先后順序寫入的,前面的兩個byte就會寫入到0x6040,緊跟着的四個byte寫入到0x607A,最后一個byte寫入0x6060。因為映射的三個對象數據寬度不一樣,寫入的數據是根據對象的數據寬度來定的,按順序排列。
TPDO1的和RPDO1的類似,只要一次就可以把三個對象的數據都傳給主站,返回的指令是
0x181 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
0x181是TPDO1的COB-ID,后面是跟着上傳的數據,前面的兩個byte就對應0x6041的狀態,緊跟着的四個byte對應0x6064,也就是實際位置,最后一個bayte對應0x6061運行模式。
到這里是不是看到PDO的強大和方便之處了,果然有存在的必要吧。接下來再講講PDO的觸發類型,以及怎樣映射PDO。
3.6 PDO觸發類型
PDO不是配置完了之后就會上傳數據,需要設置觸發方式,不同的觸發方式上傳數據的條件不一樣。只有觸發條件滿足之后PDO才會上傳數據給主站,不然總線上就亂套了。有三種觸發方式,分別同步觸發、遠程幀觸發和異步觸發。
同步觸發方式是從站只有收到主站的同步幀之后才會上傳數據,同步幀是主站發出的,指令格式是COB-ID = 0x80,數據區全部為空,只要有一個COB-ID=0x80發出。當從站監測到總線上有同步幀之后,所有需要等待同步命令才執行的PDO都會開始工作。
遠程幀觸發是主站發送遠程幀請求,對應的PDO上傳數據,注意是只有對應的PDO上傳數據,這一點與同步模式不一樣。指令格式是COB-ID =0x181,數據區也是全部為空,即數據長度為0,這里是舉例0x181,其他PDO同樣操作。當對應從站的PDO監測到這個請求后,就會上傳數據。
異步觸發方式又叫事件觸發,一般是值改變時間和定時事件。值改變事件是當PDO中對象的數值發生改變時就會上傳數據,但如果數據一直改變就會一直上傳,這樣會導致總線滿載,所以這個觸發方式下抑制時間參數會生效,兩次上傳的最短時間間隔不會小於這個抑制時間。這個抑制時間只有TPDO有,RPDO沒有。定時事件就是把定時時間值設好,當時間到了之后就上傳數據。
這幾種觸發方式都又各自的特點,需要根據實際需要選擇適合的觸發方式。
3.7映射PDO
PDO映射,常見三種方法。第一種是廠家的調試軟件上可以直接配置,這個方便簡單,好用。這里以maxon驅動器的作為舉例講解下,如圖3-5是RPDO的映射,設置好COB-ID,PDO是否生效,觸發方式,右邊就是添加PDO要傳輸哪些對象。
圖3-5
TPDO的映射比RPDO多了遠程幀方式和抑制時間設置,如圖3-6,這個在前面已經講過,其他的配置都一樣。這種通過向導配置PDO的方式就是這么簡單,配置完成后保存到flash,以后每次上電就是這個配置了,非常方便。
圖3-6
第二種映射PDO方式是通過CANopen通訊報文配置,這種就比較繁瑣了,需要一條一條的發送指令。但有的廠家不支持向導配置方式的時候,我們也不得不用。這里具體TPDO的配置,RPDO配置的方法也是一樣,舉例的從站號是1。如下代碼所示,第一步先使0x1800子索引0x01的最高位為1,這樣就可以開始修改TPDO了。接着設置觸發方式,清空映射對象的數目,映射對象,映射對象的數量,最后0x1800子索引0x01的最高位置0,這樣配置就完成了。如果要映射幾個對象,就是在0x1A00中繼續添加要映射的對象。
//使1800 subindex1通訊對象TPDO 最高位為1,以便修改TPDO
0601 23 00 18 01 81 01 00 80
0581 60 00 18 01 00 00 00 00
//設置通訊模式 255-異步
0601 2F 00 18 02 FF
0581 60 00 18 02 00 00 00 00
//清空1A00中映射的對象數目
0601 2F 00 1A 00 00
0581 60 00 1A 00 00 00 00 00
//映射第一個對象6064 subindex0 20代表數據長度,00是6064的第0個subindex
0601 23 00 1A 01 20 00 64 60
0581 60 00 1A 01 00 00 00 00
//設置1A00中映射的對象數目
0601 2F 00 1A 00 01
0581 60 00 1A 00 00 00 00 00
//將1800 subindex1的最高位清零,是TPDO有效
0601 23 00 18 01 81 01 00 00
0581 60 00 18 01 00 00 00 00
第三種映射PDO的方式是通過EDS文件,EDS文件前面已經介紹過了,就是對象的信息描述。主站在上電后,把EDS文件的內容讀取,然后再下發到從站中去。這種配置是CANopen主站完成的,其流程細節和第二種方式一樣,只不過不用自己一個一個發送。
三種PDO映射方式的最終效果是一樣的,使用過程中怎么方便怎么來,怎樣可以實現怎樣來。
3.8 HeartBeat&NodeGuarding
我們帶着問題繼續學習,假如CAN總線上的某個從站斷線了,從前面學到的知識我們有辦法讓主站知道這個節點斷線了?肯定是可以的,比如設置一個超時時間,超過規定的時間沒有收到上傳的消息就認為這個從站斷線了,但如果每一個指令都要這要去判斷的話效率就低了。為了解決這個問題,在設計CANopen協議的時候就設計了兩種機制去監測節點的狀態,HeartBeat和NodeGuarding。
HeartBeat直譯的話就是心跳,如果一直有心跳就表示狀態正常,如果沒有的話就表示出問題了。當HeartBeat功能打開之后,從站就會根據設定好的時間間隔去上傳自己的狀態。CANopen協議下,從站有如下表3-3所示幾種狀態。假如設定的心跳參數是1s上傳一次從站狀態,則每次上傳的報文就是COB-ID+當前狀態,如0x701 0x04。當從站的狀態發生變化時,報文也會跟着變化,比如切換為運行模式的時候,就會上傳0x701 0x05。只要從站沒故障,則從站一直按照這個頻率上傳自己的狀態,這就確保了從站在出現故障時盡快讓控制系統得知,觸發控制系統的故障機制,盡可能減小損失。
表3-3
編號 |
狀態 |
狀態對應的值 |
1 |
Bootup初始化 |
0x00 |
2 |
Stopped停止 |
0x04 |
3 |
Pre-operational預運行 |
0xFF |
4 |
Operational運行 |
0x05 |
NodeGuarding要達到的目的是和HeartBeat一樣的,但他們的實現方式不一樣。這兩個功能只能二選一,一個啟用則另外一個失效。NodeGurading功能在從站端設置節點監控的時間,比如1s,則需要主站每間隔1s發送節點狀態請求,然后從站才上傳自己的狀態。如果在規定的時間內,從站沒有等到主站的請求,則從站會報錯,這一點和心跳功能不一樣。在節點監控功能下,如果主站故障了,從站也會跟着故障。
一般來看,用心跳功能的多點。因為主站處理的東西比較多,如果是節點監控功能的話,主站超時發送狀態請求則會導致整個總線故障,而主站可能只是處理其他數據而來不及發送狀態請求,這是不希望發生的。況且這個從站狀態監控功能只需要按一定頻率上傳狀態就可以了,沒有嚴苛到不能有任何時間偏差。所以,現在有些廠家都取消了NodeGuarding功能。
3.9網絡狀態管理
設想下,假如總線上有很多從站,這個時候突然有一個從站故障了,如果不得不斷電才能恢復這個從站的話,是不是感覺太不友好,又太麻煩了。然而不用擔心,因為協議在設計的時候就考慮到了這種情況,增加了網絡狀態管理功能。
網絡狀態管理有如下這幾種功能,啟動遠程節點,停止遠程節點,重置節點,重置通訊,進入Pre-OP也就是預運行模式。這幾種功能的操作對象下表3-4
功能 |
COB-ID |
Byte0 |
Byte1 |
描述 |
進入Pre-OP |
0 |
0x80 |
0 |
總線上所有節點進入Pre-op |
0 |
0x80 |
n |
n表示具體站號(下同),指定的站號進入Pre-op |
|
重置通訊 |
0 |
0x82 |
0 |
總線上所有節點重置通訊 |
0 |
0x82 |
n |
指定的站號重置通訊 |
|
重置節點 |
0 |
0x81 |
0 |
總線上所有節點重啟 |
0 |
0x81 |
n |
指定的站號重啟 |
|
啟動遠程節點 |
0 |
0x01 |
0 |
總線上所有節點啟動 |
0 |
0x01 |
n |
指定的站號啟動 |
|
停止遠程節點 |
0 |
0x02 |
0 |
總線上所有節點停止 |
0 |
0x02 |
n |
指定的站號停止 |
指令的具體格式,舉例所有節點進入Pre-op,則為0x00 0x80 0x00,第一個是COB-ID,第二三個是數據區,其他功能指令類似,通過這些指令就可以靈活的控制總線上的各個節點了。啟動和停止遠程節點的含義,節點初始化完成后是只可以進行SDO通訊的,PDO的通訊以及心跳上傳都要等待主站發送啟動命令后才開始工作,這就是啟動遠程節點的意思。停止遠程節點的話,PDO和從站心跳這些功能都會停止。其他功能應該都好理解,不再一一敘述。
其實CANopen用起來也不是特別復雜,搞清楚他的框架,有哪些功能,對照手冊操作幾遍基本就學會了。基本的操作學會之后,自己再總結一遍,查漏補缺,就無師自通了。
參考文獻
1.《CAN總線應用層協議實例解析(第2版)》北京航空航天大學出版社,牛躍聽,周立功,高宏偉,黃敏思
2.CANopen協議手冊,DS301 DS402
3.maxon相關使用手冊
附錄A CANopen控制字常用功能表
這里列舉了幾個模式的常用控制指令,使能的開和關都是一樣的,其他模式的可以參考對應廠家的使用手冊,基本是一樣的,有區別的可能是有特殊功能定義。
序號 |
控制模式 |
對象字典 |
值 |
功能 |
描述 |
1 |
規划位置模式 |
0X6040-00 |
0X06 |
使能設備 |
關 |
0X0F |
開 |
||||
0X1F |
開始運動 |
絕對 |
|||
0X3F |
絕對立即 |
||||
0X7F |
相對 |
||||
0X5F |
相對立即 |
||||
0X10F |
停止運動 |
正常減速 |
|||
0X0B |
急停 |
||||
2 |
回零模式 |
0X6040-00 |
0X1F |
開始回零 |
|
0X11F |
停止回零 |
|
|||
3 |
規划速度模式 |
0X6040-00 |
0X00F |
開始運動 |
|
0X10F |
停止運動 |
|
|||
4 |
清除錯誤 |
0X6040-00 |
0X80 |
清除錯誤 |
|
附錄B CANopen通訊錯誤對照表
如圖3-4所示,