(十年前的舊文,不捨等扔)git
建立日期:2005-11-17網絡
修改日期:2005-11-17spa
文件名稱:簡單CANOpen 協議說明.doc設計
做者:winshtonhtm
版本:V1.0對象
(注:本文以24in 24out I/O模塊爲例說明,對在單片機下實現簡單的CANopen簡單功能做分析設計,文檔中全部功能均已在AVR上實現)blog
本說明是CAN上層協議CANOpen協議的嵌入式簡化,較原始CANOpen版本簡單易用,且更適應嵌入式模塊通信的須要,而且兼容CANOpen協議。索引
下面按照協議支持的功能分別進行說明:文檔
網絡管理狀態表:get
終端主節點→從節點
COB-ID |
0-字節 |
1-字節 |
0 |
命令說明符 |
節點ID |
(16#000) |
(CS) |
(1) |
說明:通常終端主節點是指上位機,如上位用於網絡管理和監控的PC機,從節點是指被管理的各模塊。
若是節點ID是0表示命令會被廣播至全部從節點,從節點必須執行相應的命令。
命令說明符功能見下表:
命令說明符(CS) |
意義 |
1(16#01) |
啓動節點進入可操做狀態 |
2(16#02) |
中止遠程節點 |
128(16#80) |
使節點進入預操做狀態 |
129(16#81) |
復位節點 |
130(16#82) |
復位通信 |
例:啓動節點1進入可操做狀態,
16#000 |
16#80 |
16#04 |
網絡管理狀態表:
狀態轉換 |
說明 |
(1) |
通電後自動初始化 |
(2) |
完成初始化自動進入預操做狀態 |
(3),(6) |
啓動遠程節點 |
(4),(7) |
進入預操做狀態 |
(5)(8) |
中止遠程節點 |
(9),(10),(11) |
復位節點 |
(12),(13),(14) |
復位通信 |
根據節點的狀態提供如下服務:
初始化 |
預操做 |
可操做 |
停機 |
|
PDO |
√ |
|||
SDO |
√ |
√ |
||
啓動引導 |
√ |
√ |
||
網絡管理 |
√ |
√ |
√ |
|
錯誤控制 |
√ |
√ |
過程數據對象用於在節點之間傳送過程數據,如I/O模塊I/O狀態讀取和設定,模擬量採集和模擬量輸出等等,本協議考慮從機硬件限制最多支持4組PDO,每組包含一個RPDO和一個TPDO,現已I/O模塊爲例進行說明:
設I/O模塊有24輸入,24輸出,24輸入經過TPDO傳給監控終端或其餘節點,24輸出經過RPDO由控制節點對其進行設定,採用發送和接收PDO1組,即標識符TPDO:0x180+NODE_ID,RPDO:0x200+NODE_ID,用3個字節就能夠表示24個I/O量,所以發送和接收PDO能夠表示以下(假設NODE_ID=1):
COB-ID |
0字節 |
1字節 |
2字節 |
385(0x181) |
Data:輸入I/O狀態量 |
||
Input_Digital_1 |
Input_Digital_2 |
Input_Digital_3 |
COB-ID |
0字節 |
1字節 |
2字節 |
513(0x201) |
Data:輸出I/O狀態量 |
||
Output_Digital_1 |
Output_Digital_2 |
Output_Digital_3 |
若是是8通道的模擬量採集模塊則須要兩個TPDO來傳送採集的數據,不須要RPDO,由於每一個通道產生一個16位數據,一共是16字節,每一個TPDO只可以傳送8字節。兩個TPDO標識符分別爲:0x180+NODE_ID,0x280+NODE_ID。
每幀數據格式以下表(設NODE_ID=2):
TPDO1
COB-ID |
0-1字節 |
2-3字節 |
4-5字節 |
6-7字節 |
385(0x182) |
Data:輸入模擬量 |
|||
Output_Anolog_1 |
Output_Anolog_2 |
Output_Anolog_3 |
Output_Anolog_4 |
TPDO2
COB-ID |
0-1字節 |
2-3字節 |
4-5字節 |
6-7字節 |
385(0x182) |
Data:輸入模擬量 |
|||
Output_Anolog_5 |
Output_Anolog_6 |
Output_Anolog_7 |
Output_Anolog_8 |
服務數據對象用於讀寫節點的對象字典,現 只實現SDO下載和上傳的全速模式,不支持正常模式也不支持塊下載和上傳,由於數據量不大,實現的功能足夠用,SDO全速下載和上傳採用應答式服務,由監控終端向節點發送服務請求,由節點返回應答。
現假設某節點NODE_ID=3,協議報文以下:
讀節點OD
假設,讀SDO index = 0x1018 subindex = 0x00,返回的是1字節data=0x04
監控終端→節點(終端請求)
COB-ID |
0字節 |
1字節 |
2字節 |
3字節 |
4字節 |
5字節 |
6字節 |
7字節 |
1539(0x603) |
命令 |
index |
subindex |
Reserved(保留) |
||||
0x40 |
0x18 |
0x10 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
監控終端←節點(節點應答)
COB-ID |
0字節 |
1字節 |
2字節 |
3字節 |
4字節 |
5字節 |
6字節 |
7字節 |
1411(0x583) |
命令 |
index |
subindex |
數據 |
湊夠8個字節 |
|||
0x4F |
0x18 |
0x10 |
0x00 |
0x04 |
0x00 |
0x00 |
0x00 |
寫節點OD
假設,寫SDO index=0x1017,subindex=0x00,寫數據爲0x07D0
監控終端→節點(終端請求)
COB-ID |
0字節 |
1字節 |
2字節 |
3字節 |
4字節 |
5字節 |
6字節 |
7字節 |
1539(0x603) |
命令 |
index |
subindex |
要寫入的數據 |
湊8個字節 |
|||
0x2B |
0x17 |
0x10 |
0x00 |
0xD0 |
0x07 |
0x00 |
0x00 |
監控終端←節點(節點應答)
COB-ID |
0字節 |
1字節 |
2字節 |
3字節 |
4字節 |
5字節 |
6字節 |
7字節 |
1411(0x583) |
命令 |
index |
subindex |
湊夠8個字節 |
||||
0x60 |
0x18 |
0x10 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
若是監控終端發送的請求,節點處理出錯,將返回SDO停止報文,報文以下:
COB-ID |
0字節 |
1字節 |
2字節 |
3字節 |
4字節 |
5字節 |
6字節 |
7字節 |
1411(0x583) |
命令 |
index |
subindex |
錯誤代碼 |
||||
0x80 |
0x18 |
0x10 |
0x00 |
0-7位 |
8-15位 |
16-23位 |
24-31位 |
節點返回的錯誤代碼以下:
SDO_ABORT_UNSUPPORTED 0x06010000UL 不支持該功能
SDO_ABORT_NOT_EXISTS 0x06020000UL 不存在的索引
SDO_ABORT_READONLY 0x06010002UL 只讀,不可寫
SDO_ABORT_TYPEMISMATCH 0x06070010UL 類型不匹配
SDO_ABORT_UNKNOWN_COMMAND 0x05040001UL 未知命令
SDO_ABORT_UNKNOWNSUB 0x06090011UL 未知子索引
注:命令字節含義請參考CANOpen協議文件DS301。
錯誤控制用於瞭解總線上各節點的狀態,本文只實現心跳協議,由各節點向監控終端按期發送心跳報文,報告本節點的狀態,報文以下:
設節點NODE_ID=2
節點→監控終端
COB-ID |
0字節 |
1794(0x702) |
節點狀態 |
0x00 |
返回狀態以下:
狀態代碼 |
狀態含義 |
0x00 |
BOOTUP啓動狀態 |
0x04 |
STOPPED中止 |
0x05 |
OPERATIONAL可操做 |
0x7F |
PRE-OPERATIONAL預操做 |
節點在啓動以後發出BOOTUP心跳,而後按固定頻率發出脈動消息幀,監控終端接收該報文用以檢測該節點狀態。
參考文獻: