CANopen是一種架構(gòu)在控制局域網(wǎng)路(Controller Area Network, CAN)上的高層通訊協(xié)定,包括通訊子協(xié)定及設(shè)備子協(xié)定常在嵌入式系統(tǒng)中使用,也是工業(yè)控制常用到的一種現(xiàn)場(chǎng)總線(xiàn)。CANopen 實(shí)現(xiàn)了OSI模型中的網(wǎng)絡(luò)層以上(包括網(wǎng)絡(luò)層)的協(xié)定。CANopen 標(biāo)準(zhǔn)包括尋址方案、數(shù)個(gè)小的通訊子協(xié)定及由設(shè)備子協(xié)定所定義的應(yīng)用層。 CANopen 支援網(wǎng)絡(luò)管理、設(shè)備監(jiān)控及節(jié)點(diǎn)間的通訊,其中包括一個(gè)簡(jiǎn)易的傳輸層,可處理資料的分段傳送及其組合。一般而言數(shù)據(jù)鏈結(jié)層及物理層會(huì)用CAN來(lái)實(shí)作。除了 CANopen 外,也有其他的通訊協(xié)定(如EtherCAT)實(shí)作 CANopen 的設(shè)備子協(xié)定。CANopen由非營(yíng)利組織CiA(CAN in Automaion)進(jìn)行標(biāo)準(zhǔn)的起草及審核工作,基本的 CANopen 設(shè)備及通訊子協(xié)定定義在 CAN in Automation (CiA) draft standard 301中。針對(duì)個(gè)別設(shè)備的子協(xié)定以 CiA 301 為基礎(chǔ)再進(jìn)行擴(kuò)充。如針對(duì) I/O 模組的 CiA401 及針對(duì)運(yùn)動(dòng)控制的 CiA402。
本說(shuō)明是CAN上層協(xié)議CANOpen協(xié)議的嵌入式簡(jiǎn)化,較原始CANOpen版本簡(jiǎn)單易用,且更適應(yīng)嵌入式模塊通訊的需要,并且兼容CANOpen協(xié)議。
下面按照協(xié)議支持的功能分別進(jìn)行說(shuō)明:
NMT網(wǎng)絡(luò)管理服務(wù)
網(wǎng)絡(luò)管理狀態(tài)表:
終端主節(jié)點(diǎn)→從節(jié)點(diǎn)
| COB-ID | 0-字節(jié) | 1-字節(jié) |
| 0 | 命令說(shuō)明符 | 節(jié)點(diǎn)ID |
| (16#000) | (CS) | (1) |
說(shuō)明:一般終端主節(jié)點(diǎn)是指上位機(jī),如上位用于網(wǎng)絡(luò)管理和監(jiān)控的PC機(jī),從節(jié)點(diǎn)是指被管理的各模塊。
如果節(jié)點(diǎn)ID是0表示命令會(huì)被廣播至所有從節(jié)點(diǎn),從節(jié)點(diǎn)必須執(zhí)行相應(yīng)的命令。
命令說(shuō)明符功能見(jiàn)下表:
| 命令說(shuō)明符(CS) | 意義 |
| 1(16#01) | 啟動(dòng)節(jié)點(diǎn)進(jìn)入可操作狀態(tài) |
| 2(16#02) | 停止遠(yuǎn)程節(jié)點(diǎn) |
| 128(16#80) | 使節(jié)點(diǎn)進(jìn)入預(yù)操作狀態(tài) |
| 129(16#81) | 復(fù)位節(jié)點(diǎn) |
| 130(16#82) | 復(fù)位通訊 |
例:?jiǎn)?dòng)節(jié)點(diǎn)1進(jìn)入可操作狀態(tài),
| 16#000 | 16#80 | 16#04 |
網(wǎng)絡(luò)管理狀態(tài)表:

| 狀態(tài)轉(zhuǎn)換 | 說(shuō)明 |
| (1) | 通電后自動(dòng)初始化 |
| (2) | 完成初始化自動(dòng)進(jìn)入預(yù)操作狀態(tài) |
| (3),(6) | 啟動(dòng)遠(yuǎn)程節(jié)點(diǎn) |
| (4),(7) | 進(jìn)入預(yù)操作狀態(tài) |
| (5)(8) | 停止遠(yuǎn)程節(jié)點(diǎn) |
| (9),(10),(11) | 復(fù)位節(jié)點(diǎn) |
| (12),(13),(14) | 復(fù)位通訊 |
根據(jù)節(jié)點(diǎn)的狀態(tài)提供以下服務(wù):
| 初始化 | 預(yù)操作 | 可操作 | 停機(jī) | |
| PDO | √ | |||
| SDO | √ | √ | ||
| 啟動(dòng)引導(dǎo) | √ | √ | ||
| 網(wǎng)絡(luò)管理 | √ | √ | √ | |
| 錯(cuò)誤控制 | √ | √ |
過(guò)程數(shù)據(jù)對(duì)象(PDO)服務(wù)
過(guò)程數(shù)據(jù)對(duì)象用于在節(jié)點(diǎn)之間傳送過(guò)程數(shù)據(jù),如I/O模塊I/O狀態(tài)讀取和設(shè)定,模擬量采集和模擬量輸出等等,本協(xié)議考慮從機(jī)硬件限制最多支持4組PDO,每組包含一個(gè)RPDO和一個(gè)TPDO,現(xiàn)已I/O模塊為例進(jìn)行說(shuō)明:
設(shè)I/O模塊有24輸入,24輸出,24輸入通過(guò)TPDO傳給監(jiān)控終端或其他節(jié)點(diǎn),24輸出通過(guò)RPDO由控制節(jié)點(diǎn)對(duì)其進(jìn)行設(shè)定,采用發(fā)送和接收PDO1組,即標(biāo)識(shí)符TPDO:0x180+NODE_ID,RPDO:0x200+NODE_ID,用3個(gè)字節(jié)就可以表示24個(gè)I/O量,因此發(fā)送和接收PDO可以表示如下(假設(shè)NODE_ID=1):
| COB-ID | 0字節(jié) | 1字節(jié) | 2字節(jié) |
| 385(0x181) | Data:輸入I/O狀態(tài)量 | ||
| Input_Digital_1 | Input_Digital_2 | Input_Digital_3 | |
| COB-ID | 0字節(jié) | 1字節(jié) | 2字節(jié) |
| 513(0x201) | Data:輸出I/O狀態(tài)量 | ||
| Output_Digital_1 | Output_Digital_2 | Output_Digital_3 | |
如果是8通道的模擬量采集模塊則需要兩個(gè)TPDO來(lái)傳送采集的數(shù)據(jù),不需要RPDO,因?yàn)槊總€(gè)通道產(chǎn)生一個(gè)16位數(shù)據(jù),一共是16字節(jié),每個(gè)TPDO只能夠傳送8字節(jié)。兩個(gè)TPDO標(biāo)識(shí)符分別為:0x180+NODE_ID,0x280+NODE_ID。
每幀數(shù)據(jù)格式如下表(設(shè)NODE_ID=2):
TPDO1
| COB-ID | 0-1字節(jié) | 2-3字節(jié) | 4-5字節(jié) | 6-7字節(jié) |
| 385(0x182) | Data:輸入模擬量 | |||
| Output_Anolog_1 | Output_Anolog_2 | Output_Anolog_3 | Output_Anolog_4 | |
TPDO2
| COB-ID | 0-1字節(jié) | 2-3字節(jié) | 4-5字節(jié) | 6-7字節(jié) |
| 385(0x182) | Data:輸入模擬量 | |||
| Output_Anolog_5 | Output_Anolog_6 | Output_Anolog_7 | Output_Anolog_8 | |
1. I/O節(jié)點(diǎn)←監(jiān)控終端(RPDO)
2. I/O節(jié)點(diǎn)→監(jiān)控終端(TPDO)
服務(wù)數(shù)據(jù)對(duì)象(SDO)服務(wù)
服務(wù)數(shù)據(jù)對(duì)象用于讀寫(xiě)節(jié)點(diǎn)的對(duì)象字典,現(xiàn) 只實(shí)現(xiàn)SDO下載和上傳的全速模式,不支持正常模式也不支持塊下載和上傳,因?yàn)閿?shù)據(jù)量不大,實(shí)現(xiàn)的功能足夠用,SDO全速下載和上傳采用應(yīng)答式服務(wù),由監(jiān)控終端向節(jié)點(diǎn)發(fā)送服務(wù)請(qǐng)求,由節(jié)點(diǎn)返回應(yīng)答。
現(xiàn)假設(shè)某節(jié)點(diǎn)NODE_ID=3,協(xié)議報(bào)文如下:
讀節(jié)點(diǎn)OD
假設(shè),讀SDO index = 0x1018 subindex = 0x00,返回的是1字節(jié)data=0x04
監(jiān)控終端→節(jié)點(diǎn)(終端請(qǐng)求)
| COB-ID | 0字節(jié) | 1字節(jié) | 2字節(jié) | 3字節(jié) | 4字節(jié) | 5字節(jié) | 6字節(jié) | 7字節(jié) |
| 1539(0x603) | 命令 | index | subindex | Reserved(保留) | ||||
| 0x40 | 0x18 | 0x10 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |
監(jiān)控終端←節(jié)點(diǎn)(節(jié)點(diǎn)應(yīng)答)
| COB-ID | 0字節(jié) | 1字節(jié) | 2字節(jié) | 3字節(jié) | 4字節(jié) | 5字節(jié) | 6字節(jié) | 7字節(jié) |
| 1411(0x583) | 命令 | index | subindex | 數(shù)據(jù) | 湊夠8個(gè)字節(jié) | |||
| 0x4F | 0x18 | 0x10 | 0x00 | 0x04 | 0x00 | 0x00 | 0x00 | |
寫(xiě)節(jié)點(diǎn)OD
假設(shè),寫(xiě)SDO index=0x1017,subindex=0x00,寫(xiě)數(shù)據(jù)為0x07D0
監(jiān)控終端→節(jié)點(diǎn)(終端請(qǐng)求)
| COB-ID | 0字節(jié) | 1字節(jié) | 2字節(jié) | 3字節(jié) | 4字節(jié) | 5字節(jié) | 6字節(jié) | 7字節(jié) |
| 1539(0x603) | 命令 | index | subindex | 要寫(xiě)入的數(shù)據(jù) | 湊8個(gè)字節(jié) | |||
| 0x2B | 0x17 | 0x10 | 0x00 | 0xD0 | 0x07 | 0x00 | 0x00 | |
監(jiān)控終端←節(jié)點(diǎn)(節(jié)點(diǎn)應(yīng)答)
| COB-ID | 0字節(jié) | 1字節(jié) | 2字節(jié) | 3字節(jié) | 4字節(jié) | 5字節(jié) | 6字節(jié) | 7字節(jié) |
| 1411(0x583) | 命令 | index | subindex | 湊夠8個(gè)字節(jié) | ||||
| 0x60 | 0x18 | 0x10 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |
如果監(jiān)控終端發(fā)送的請(qǐng)求,節(jié)點(diǎn)處理出錯(cuò),將返回SDO中止報(bào)文,報(bào)文如下:
| COB-ID | 0字節(jié) | 1字節(jié) | 2字節(jié) | 3字節(jié) | 4字節(jié) | 5字節(jié) | 6字節(jié) | 7字節(jié) |
| 1411(0x583) | 命令 | index | subindex | 錯(cuò)誤代碼 | ||||
| 0x80 | 0x18 | 0x10 | 0x00 | 0-7位 | 8-15位 | 16-23位 | 24-31位 | |
節(jié)點(diǎn)返回的錯(cuò)誤代碼如下:
SDO_ABORT_UNSUPPORTED 0x06010000UL 不支持該功能
SDO_ABORT_NOT_EXISTS 0x06020000UL 不存在的索引
SDO_ABORT_READONLY 0x06010002UL 只讀,不可寫(xiě)
SDO_ABORT_TYPEMISMATCH 0x06070010UL 類(lèi)型不匹配
SDO_ABORT_UNKNOWN_COMMAND 0x05040001UL 未知命令
SDO_ABORT_UNKNOWNSUB 0x06090011UL 未知子索引
注:命令字節(jié)含義請(qǐng)參考CANOpen協(xié)議文件DS301。
錯(cuò)誤控制——心跳(或者叫脈動(dòng))協(xié)議(heatbeat)
錯(cuò)誤控制用于了解總線(xiàn)上各節(jié)點(diǎn)的狀態(tài),本文只實(shí)現(xiàn)心跳協(xié)議,由各節(jié)點(diǎn)向監(jiān)控終端定期發(fā)送心跳報(bào)文,報(bào)告本節(jié)點(diǎn)的狀態(tài),報(bào)文如下:
設(shè)節(jié)點(diǎn)NODE_ID=2
節(jié)點(diǎn)→監(jiān)控終端
| COB-ID | 0字節(jié) |
| 1794(0x702) | 節(jié)點(diǎn)狀態(tài) |
| 0x00 |
返回狀態(tài)如下:
| 狀態(tài)代碼 | 狀態(tài)含義 |
| 0x00 | BOOTUP啟動(dòng)狀態(tài) |
| 0x04 | STOPPED停止 |
| 0x05 | OPERATIONAL可操作 |
| 0x7F | PRE-OPERATIONAL預(yù)操作 |
節(jié)點(diǎn)在啟動(dòng)之后發(fā)出BOOTUP心跳,然后按固定頻率發(fā)出脈動(dòng)消息幀,監(jiān)控終端接收該報(bào)文用以檢測(cè)該節(jié)點(diǎn)狀態(tài)。
編輯:hfy
-
CAN
+關(guān)注
關(guān)注
59文章
3060瀏覽量
472597 -
CANopen
+關(guān)注
關(guān)注
8文章
492瀏覽量
48791
發(fā)布評(píng)論請(qǐng)先 登錄
協(xié)議轉(zhuǎn)換“黑科技”:耐達(dá)訊自動(dòng)化CANopen轉(zhuǎn)Profibus 網(wǎng)關(guān)破解電機(jī)控制通信難題
CANopen轉(zhuǎn)Profinet是一種構(gòu)建于控制局域網(wǎng)設(shè)備之上的協(xié)議網(wǎng)關(guān)
嵌入式需要掌握哪些核心技能?
CANopen轉(zhuǎn)Profient網(wǎng)關(guān)協(xié)議介紹
入行嵌入式應(yīng)該怎么準(zhǔn)備?
CANopen轉(zhuǎn)EtherCAT協(xié)議轉(zhuǎn)換案例解析
NVMe協(xié)議研究掃盲
ElfBoard嵌入式教育科普|CAN接口全面解析
協(xié)議大和解:ETHERCAT轉(zhuǎn)CANopen網(wǎng)關(guān)配置
面向高溫工業(yè)場(chǎng)景的EtherCAT/CANopen協(xié)議轉(zhuǎn)換系統(tǒng)設(shè)計(jì)與應(yīng)用
EtherCAT轉(zhuǎn)CANopen協(xié)議網(wǎng)關(guān)應(yīng)用詳解
CanOpen轉(zhuǎn)Profinet協(xié)議轉(zhuǎn)換:解鎖型鋼成型機(jī)高效控制新維度
使用ES32實(shí)現(xiàn)CANopen從機(jī)
CAN上層協(xié)議CANOpen協(xié)議的嵌入式簡(jiǎn)化說(shuō)明
評(píng)論