一、CAN和CANopen介紹
CAN(Controller Area Network)通訊以其高效率高穩定的特性,被廣泛應用在汽車電子、工業自動化以及物聯網通訊系統中。CANopen是基于CAN的通訊子協議,是一種為用于產品部件內部網絡通訊而開發的系統。其子協議CiA401,規范了數字量輸入、數字量輸出和模擬量采集相關的使用方法。智嵌物聯ZQWL研發的帶有CAN通訊接口的采集控制終端模塊均實現了CANopen CiA401協議,可以非常方便的接入現有的CAN控制網絡系統,縮短了開發周期,節省了開發費用。本文以智嵌物聯ZQWL所研發的產品ZQWL-IO-1DARA8A為例,介紹CANopen如何在智嵌物聯CAN產品中應用的。
先準備好產品1DARA8和USB-CAN調試器(ZQWL-UCAN-5C111):
該模塊支持標準的CANopen(CiA401)協議,用戶通過簡單配置后可以直接將其接入CANopen通訊網絡或替代原有的CANopen設備。模塊主要功能包括:
●1個TPDO,用于傳送開關量輸入狀態(DI)。
●1個RPDO,用于接收開關量輸出狀態(DO)。
●NMT服務器功能,處理NMT主機發來的命令。
●SDO功能,配置和讀取CANopen字典。
●DI極性控制、全局中斷控制、單個DI中斷控制以及DI的電平觸發方式控制(任意變化觸發、Low to High觸發或者High to Low觸發)。
●DO極性控制;設備故障或收到stop命令后的DO狀態可配置。
●CAN波特率可配置。
●保存整部對象字典到flash和恢復整部對象字典到出廠值。
CANopen的CiA401設備子協議詳細描述了對象字典的定義以及功能,該模塊實現了DI/DO部分,模塊的對象字典如下表:
Index | 子索引 Subindex | 名稱 name | 類型 Type | 屬性 Attr. | 默認值 default | 說明 description |
1000 | 0 | 設備類型 | u32 | RO | 0x00030191 | 支持CiA401的DI和DO |
1003 | 0 | Errors Register | u8 | RO | 0 | 錯誤寄存器 |
1005 | 0 | Sync COB-ID | u32 | RW | 0 | 同步報文COB-ID |
1006 | 0 | Sync Period | u32 | RW | 0 | 同步周期 |
1008 | 0 | Manufacturer | string | RO | ZQWL | 制造商 |
1009 | 0 | Hard Version | string | RO | V3.0 | 硬件版本 |
100A | 0 | Soft Version | string | RO | V3.0 | 軟件版本 |
1010 | 0 | Num ofSubindex | u8 | RO | 1 | 子索引數目 |
1 | Save all OD | u32 | W | 0x65766173 | 保存整部對象字典;讀時,返回0x00000001 | |
1011 | 0 | Num ofSubindex | u8 | RO | 1 | 子索引數目 |
1 | Default all OD | u32 | W | 0x64616F6C | 恢復整部對象字典;讀時,返回0x00000001 | |
1014 | 0 | Emnc COB-ID | u32 | RW | 0x80 | 緊急報文COB-ID |
1017 | 0 | Heart beat timer | u16 | RW | 0x0BB8 | 心跳包周期,單位ms |
1018 | 0 | Num ofSubindex | u8 | RO | 4 | 制造商信息 |
1 | Manufacturerid | u32 | RO | - | 制造商ID | |
2 | Product Code | u32 | RO | - | 產品代碼 | |
3 | Revision Number | u32 | RO | - | 修訂號 | |
4 | Serial Number | u32 | RO | - | 序列號 | |
1200 | 0 | Num ofSubindex | u8 | RO | 2 | SDO服務器信息 |
1 | SDO Rx COB-ID | u32 | RO | 0x0600+Node ID | SDO接收COB-ID | |
2 | SDO Tx COB-ID | u32 | RO | 0x0580+Node ID | SDO發送COB-ID | |
1400 | 0 | Num ofSubindex | u8 | RO | 6 | RPDO1通訊參數 |
1 | RPDO1 COB-ID | u32 | RO | RPDO1 COB-ID | ||
2 | Transmission Type | u8 | RW | 0xFF | 通訊類型 | |
3 | Inhibit Time | u16 | RW | 0 | 抑制時間 | |
4 | -- | -- | -- | -- | 保留 | |
5 | Event Timer | u16 | RW | 0 | 時間定時器 | |
6 | SYNC start value | u8 | RW | 0 | 同步初始值 | |
1401- 15FF | 0 | RPDOx禁用 | ||||
1600 | 0 | Num ofSubindex | u8 | RO | 1 | RPDO1映射參數 |
1 | RPDO1 mapping | u8 | RO | 0x62000108 | 映射地址 | |
1800 | 0 | Num ofSubindex | u8 | RO | 6 | TPDO1通訊參數 |
1 | TPDO1 COB-ID | u32 | RO | TPDO1 COB-ID | ||
2 | Transmission Type | u8 | RW | 0xFF | 通訊類型 | |
3 | Inhibit Time | u16 | RW | 0 | 抑制時間 | |
4 | -- | -- | -- | -- | 保留 | |
5 | Event Timer | u16 | RW | 0 | 時間定時器 | |
6 | SYNC start value | u8 | RW | 0 | 同步初始值 | |
1801- 19FF | 0 | TPDOx禁用 | ||||
1A00 | 0 | Num ofSubindex | u8 | RO | 1 | TPDO1映射參數 |
1 | TPDO1 mapping | u8 | RO | 0x60000108 | 映射地址 | |
2000 | 0 | Num ofSubindex | u8 | RO | 3 | 設備唯一序列號 |
1 | Serial id1 | u32 | RO | - | 序列號1 | |
2 | Serial id2 | u32 | RO | - | 序列號2 | |
3 | Serial id3 | u32 | RO | - | 序列號3 | |
2001 | 0 | Num ofSubindex | u8 | RO | 1 | CAN波特率寄存器 |
1 | CAN baud | u8 | RW | 0 | 見CAN波特率對應表 | |
6000 | 0 | Num ofSubindex | u8 | RO | 1 | DI狀態信息 |
1 | DI status | u8 | RW | 0x00 | DI狀態寄存器 | |
6002 | 0 | Num ofSubindex | u8 | RO | 1 | DI極性信息 |
1 | DI polarity | u8 | RW | 0x00 | DI極性寄存器 | |
6005 | 0 | Num ofSubindex | u8 | RO | 1 | DI全局中斷使能 |
1 | DI global Interrupt | bool | RW | TRUE(1) | DI全局中斷使能 | |
6006 | 0 | Num ofSubindex | u8 | RO | 1 | DI任意變化中斷使能 |
1 | DI any change Interrupt | u8 | RW | 0xFF | DI任意變化中斷使能 | |
6007 | 0 | Num ofSubindex | u8 | RO | 1 | DI由低到高中斷使能 |
1 | DI Low to High Interrupt | u8 | RW | 0x00 | DI由低到高中斷使能 | |
6007 | 0 | Num ofSubindex | u8 | RO | 1 | DI由高到低中斷使能 |
1 | DI High to Low Interrupt | u8 | RW | 0x00 | DI由高到低中斷使能 | |
6200 | 0 | Num ofSubindex | u8 | RO | 1 | DO狀態信息 |
1 | DO status | u8 | RW | 0x00 | DO狀態寄存器 | |
6202 | 0 | Num ofSubindex | u8 | RO | 1 | DO極性控制 |
1 | DO polarity | u8 | RW | 0x00 | DO極性控制 | |
6206 | 0 | Num ofSubindex | u8 | RO | 1 | DO錯誤模式使能 |
1 | DO error mode | u8 | RW | 0xFF | DO錯誤模式使能 | |
6207 | 0 | Num ofSubindex | u8 | RO | 1 | DO錯誤模式狀態值 |
1 | DO error value | u8 | RW | 0x00 | DO錯誤模式狀態值 |
注意下文所有的測試條件為:Node ID為1;CAN波特率以及對象字典均為默認值。
二、Boot up和心跳包測試
模塊上電會發出一個Boot up報文:id為701數據為00。
該模塊默認心跳時間為0X0BB8(3000ms)。模塊上電后發送心跳報文如下(采用我司生產的usb-can調試器):
注意,上述修改后參數,參數并未保存到flash中,模塊掉電或復位后心跳包時間仍然是原來的數值。如果用戶想保存到flash中,可以利用索引1010,具體操作方法參見下文。
三、NMT命令測試
模塊內置NMT服務器功能,可以根據NMT指令切換工作狀態,模塊上電初始化成功后自動進入到預操作模式(PreOperational),這時模塊會發送數據為7f、CAN id為701的心跳報文,如上節所述。
按照NMT命令規范,演示如下:
①進入操作模式(Operational)
發送can id為00,數據為01 01的報文:
模塊進入到stop模式,心跳包數據變為04,如上圖。進入stop模式時,繼電器輸出狀態可以通過索引6206和6207共同確定,具體可參考下文。
③復位命令
發送can id為00,數據為81 01的報文:
模塊復位,發一條Boot up報文;心跳包數據變為7f,模塊自動進入預操作模式(PreOperational),如上圖。
其他模式的切換參考標準CANopen通訊協議。
四、DO輸出命令測試
模塊通過RPDO1接收數據,來控制DO的輸出,根據RPDO1的通訊參數可知,對端的COB-ID為0x0200+Node ID,即0x0201??梢酝ㄟ^發can id為0x0201、數據長度為1字節的標準幀來控制DO的狀態,注意模塊只有在操作模式下時該指令有效。其中1字節的數據和繼電器對應關系為:
DO繼電器輸出和數據bit對應關系 | ||||||||
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DO | DO-8 | DO-7 | DO-6 | DO-5 | DO-4 | DO-3 | DO-2 | DO-1 |
例如打開第一個繼電器DO,可以發送如下數據:
CAN幀ID:0x0201;
CAN數據:0x01;
Bit位值的含義:0為正邏輯;0為反邏輯。
索引6202(子索引01)默認值為0x00,全部為正邏輯。用戶可以通過SDO命令修改DO輸出極性對象6202的值,來改變輸出極性,如改成0xff,那么,模塊收到上述數據后,將第一路繼電器關閉,其余路打開。
當然也可以用SDO命令讀取對象索引6200,子索引01來獲取DO的狀態。
五、DI默認參數測試
模塊通過TPDO1發送DI開關量輸入的狀態。是否觸發TPDO1的發送,由以下條件決定:
①TPDO1的通訊參數配置(索引1800);
②DI全局中斷配置(索引6005,子索引01);
③DI中斷觸發方式(索引6006/6007/6008);
④模塊當前的工作模式;
先看第一個條件,根據對象字典的默認配置可知,RPDO1的默認通訊參數為:
TPDO1的COB-ID為0x0180+Node ID(索引1800,子索引01),即0x0181;
TPDO1的通訊類型為0xFF(索引1800,子索引02),即為事件觸發模式;
TPDO1的抑制時間為0x00(索引1800,子索引03),即不抑制;
TPDO1的事件定時器為0x00(索引1800,子索引05),即不啟用;
所以第一個條件即為開關量事件觸發。
再看第二個條件,根據對象字典的默認配置可知,DI全局中斷為TURE,即打開狀態。
再看第三個條件,根據對象字典的默認配置可知,DI中斷觸發方式中,DI_any_change(索引6006,子索引01)的值為0xFF;Low_to_High(索引6007,子索引01)的值為0x00;How_to_Ligh(索引6008,子索引01)的值為0x00;
再看第四個條件,只有模塊在操作模式下時才能觸發TPDO1。
由以上配置可知,在操作模式下,DI有任意變化時,就會觸發中斷。
DI的狀態值在索引6000的對象中保存,DI輸入的極性在索引6002的對象中保存,下圖為TPDO1的觸發邏輯關系:
其中索引6003對象為禁止狀態,即不對DI做濾波處理,因為讀取硬件輸入狀態時已經做了延時消抖動處理。
TPDO1的數據(索引6000,子索引01)為1個字節,其和DI對應關系為
DI開關量輸入和數據bit對應關系 | ||||||||
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DI | DI-8 | DI-7 | DI-6 | DI-5 | DI-4 | DI-3 | DI-2 | DI-1 |
DI極性控制(索引6002子索引01)與DI的關系:
DO開關量輸入極性和對象索引6002數據bit對應關系 | ||||||||
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DI | DI-8 | DI-7 | DI-6 | DI-5 | DI-4 | DI-3 | DI-2 | DI-1 |
在默認參數條件下,DI有變化時,模塊輸出如下:
上圖,序號000001為第一路DI有觸發(有低電平變成了高電平);
序號000004為第一路DI有觸發(有高電平變成了低電平)。
當然也可以用SDO命令讀取對象索引6000,子索引01來獲取DI的狀態。
六、DI定時上傳設置測試
可以通過SDO命令寫通訊參數對象中的事件定時器(索引1800,子索引05)來實現DI狀態的定時上傳,例如將該對象寫0x00c8(200)ms:
發送CAN幀ID為0x0601,數據為:2b 00 18 05 c8 00 00 00
模塊收到后,將按照200ms上傳一次(觸發TPDO1)。
也可以用同樣的方式設置TPDO1的抑制時間。
七、DI同步上傳設置測試
可以通過SDO命令寫通訊參數對象中的通訊類型(索引1800,子索引02)和對象子索引1005(同步COB-ID)來實現DI狀態的同步上傳,注意通訊類型的值value必須為1~240(十進制),其含義是模塊收到value個同步幀時就觸發一次TPDO1,例如value設為0x01:
發送CAN幀ID為0x0601,數據為:2f 00 18 02 01 00 00 00
八、對象字典的恢復出廠測試
模塊可以用過SDO命令操作索引1011對象來實現對整部對象字典的恢復出廠。
目前僅支持恢復整部對象字典功能。
發送:CAN幀ID為0x0601,數據為:23 11 10 01 64 61 6f 6c;模塊收到后,將整部對象字典恢復到出廠默認參數:
-
工業控制系統
+關注
關注
3文章
110瀏覽量
16585
發布評論請先 登錄
相關推薦
評論