(十年前的舊文,不舍等扔)
創建日期:2005-11-17
修改日期:2005-11-17
文件名稱:簡單CANOpen 協議說明.doc
作者:winshton
版本:V1.0
(注:本文以24in 24out I/O模塊為例說明,對在單片機下實現簡單的CANopen簡單功能作分析設計,文檔中所有功能均已在AVR上實現)
本說明是CAN上層協議CANOpen協議的嵌入式簡化,較原始CANOpen版本簡單易用,且更適應嵌入式模塊通訊的需要,並且兼容CANOpen協議。
下面按照協議支持的功能分別進行說明:
-
NMT網絡管理服務
網絡管理狀態表:
終端主節點→從節點
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
√
√
啟動引導
√
√
網絡管理
√
√
√
錯誤控制
√
√
-
過程數據對象(PDO)服務
過程數據對象用於在節點之間傳送過程數據,如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):
- I/O節點→監控終端(TPDO)
COB-ID
0字節
1字節
2字節
385(0x181)
Data:輸入I/O狀態量
Input_Digital_1
Input_Digital_2
Input_Digital_3
- I/O節點←監控終端(RPDO)
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下載和上傳的全速模式,不支持正常模式也不支持塊下載和上傳,因為數據量不大,實現的功能足夠用,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。
-
錯誤控制——心跳(或者叫脈動)協議(heatbeat)
錯誤控制用於了解總線上各節點的狀態,本文只實現心跳協議,由各節點向監控終端定期發送心跳報文,報告本節點的狀態,報文如下:
設節點NODE_ID=2
節點→監控終端
COB-ID
0字節
1794(0x702)
節點狀態
0x00
返回狀態如下:
狀態代碼
狀態含義
0x00
BOOTUP啟動狀態
0x04
STOPPED停止
0x05
OPERATIONAL可操作
0x7F
PRE-OPERATIONAL預操作
節點在啟動之后發出BOOTUP心跳,然后按固定頻率發出脈動消息幀,監控終端接收該報文用以檢測該節點狀態。
參考文獻:
- CiA Draft Standard 401 <Device Profile for Generic I/O Modules> CAN in Automation
- CiA Draft Standard 301 <Application Layer and Communication Profile> CAN in Automation
- 周立功 <CANopen 協議介紹>
- 史久根 等《CAN 現場總線系統設計技術》
- www.microcanopen.com 《MicroCANopen Atmel 89C51CC01 Application Examples》