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