canopen協(xié)議詳解
can的數(shù)據(jù)幀結(jié)構(gòu):
canopen在can幀基礎(chǔ)上詳細(xì)分配了COB_ID和數(shù)據(jù)域的用法
通常我們所指 的幀ID就是COB_ID,COB_ID(11bits)=功能碼(4bits)+Node_ID(7bit),這個(gè)也在理論上說(shuō)明了can最多可以有 127 個(gè)節(jié)點(diǎn)。不過(guò),在實(shí)際應(yīng)用中,最大節(jié)點(diǎn)數(shù)量取決于所用 CAN 收發(fā)器的性能。
功能碼解釋?zhuān)?
剛接觸canopen時(shí)候?qū)δ艽a都不是很了解。簡(jiǎn)單來(lái)說(shuō)功能碼就是指明了每一個(gè)can幀的作用,是SDO還是PDO?是TPDO還是RPDO?,比如:
can幀ID SDO標(biāo)準(zhǔn)結(jié)構(gòu):
600h+Node_ID: 主站發(fā)往從站
580h+Node_ID: 從站回復(fù)主站
1
2
3
1
2
can幀ID PDO標(biāo)準(zhǔn)結(jié)構(gòu):
TPDO : 180h+Node_ID RPDO: 200h+Node_ID
280+Node_ID 300h+Node_ID
380+Node_ID 400h+Node_ID
480+Node_ID 500h+Node_ID
1
2
3
4
5
1
2
3
4
有了基本的SDO,PDO格式后,我們放上一張canopen對(duì)象字典結(jié)構(gòu)圖:
每個(gè) PDO 在對(duì)象字典中由兩個(gè)對(duì)象描述:通信參數(shù)和映射參數(shù)。
PDO 通信參數(shù)指明使用哪個(gè) COB-ID,傳輸類(lèi)型,禁用時(shí)間和定時(shí)時(shí)間;
PDO 映射參數(shù)用于設(shè)定 PDO報(bào)文中的數(shù)據(jù)的映射關(guān)系,確定要傳輸?shù)臄?shù)據(jù)在 CAN 報(bào)文數(shù)據(jù)域中的定位。該參數(shù)允許 PDO 的生產(chǎn)者和消費(fèi)者知道正在傳輸什么信。
一個(gè) PDO 最多可以映射 4 個(gè)對(duì)象。
接下來(lái)我們?cè)诹吭敿?xì)說(shuō)明一下通用子協(xié)議 區(qū)域 是怎樣定義的:
通用子協(xié)議 區(qū)域在對(duì)象字典中的索引為1000-1FFFh。其中
1400-15FFh 設(shè)置RPDO 通訊參數(shù)
1600-17FFh 設(shè)置RPDO映射參數(shù)
1800-19FFh 設(shè)置TPDO通訊參數(shù)
1A00-1BFFh 設(shè)置TPDO映射參數(shù)
下面我們以表格的的形式更加直觀的說(shuō)明一個(gè)PDO配置需要在哪些地方操作:
表格里面的額參數(shù)對(duì)應(yīng)請(qǐng)參考對(duì)象字典通用子協(xié)議 區(qū)域.
PDO 映射流程:
1、設(shè)置 PDO 對(duì)應(yīng)映射參數(shù)(1600 h 或 1601 h 或 1A00 h 或 1A01 h)子索引 0 的內(nèi)容為 0;
2、修改 PDO 對(duì)應(yīng)映射參數(shù)(1600 h 或 1601 h 或 1A00 h 或 1A01 h)子索引 1~4 的內(nèi)容,映射
數(shù)據(jù);
3、設(shè)置 PDO 對(duì)應(yīng)映射參數(shù)(1600 h 或 1601 h 或 1A00 h 或 1A01 h)子索引 0 的內(nèi)容為合法的
數(shù)字(該 PDO 映射的對(duì)象數(shù))。
4、 PDO 映射完成。
PDO 可以有多種傳送方式:
同步(通過(guò)接收 SYNC 對(duì)象實(shí)現(xiàn)同步)
周期:傳送在每 1 到 240 個(gè) SYNC 消息后觸發(fā)
異步: 由設(shè)備子協(xié)議中規(guī)定的對(duì)象特定事件觸發(fā)傳送。
一個(gè) PDO 可以指定一個(gè)禁止時(shí)間,即定義兩個(gè)連續(xù) PDO 傳輸?shù)淖钚¢g隔時(shí)間,避免由于高優(yōu)先級(jí)信
息的數(shù)據(jù)量太大,始終占據(jù)總線(xiàn),而使其它優(yōu)先級(jí)較低的數(shù)據(jù)無(wú)力競(jìng)爭(zhēng)總線(xiàn)的問(wèn)題。禁止時(shí)間由 16 位無(wú)
符號(hào)整數(shù)定義 符號(hào)整數(shù)定義,單位 100us。
一個(gè) PDO 可以指定一個(gè)事件定時(shí)周期,當(dāng)超過(guò)定時(shí)時(shí)間后,一個(gè) PDO 傳輸可以被觸發(fā)(不需要觸發(fā)
位)。事件定時(shí)周期由 16 位無(wú)符號(hào)整數(shù)定義,單位 1ms。
接下來(lái)我們通過(guò)一個(gè)例子說(shuō)明配置一個(gè)PDO的具體操作:
通過(guò)SDO配置1個(gè) RPDO映射為 6040h,步驟如下:(假設(shè)我們的設(shè)備節(jié)點(diǎn)ID為10)
60A 2F 00 16 00 00 00 00 00 //RPDO1 stop
60A 23 00 16 01 10 00 40 60 //6040h,長(zhǎng)度為16個(gè)字節(jié)
60A 2F 00 16 00 01 00 00 00 / / RPDO1 enable
設(shè)置 PDO 通訊參數(shù)
PDO1(發(fā)送)為異步周期性類(lèi)型 ? transmission_type (1800 h:02 h)= FF h
60A 2F 0018 02 FF 00 00 00
禁止時(shí)間 2ms(20×100us) ? inhibit_time (1800 h:03 )=14h
60A 2F 00 18 03 14 00 00 00
周期時(shí)間 10ms(10×1ms) ? event_time (1800 h:05 h)= 0A h
60A 2F 00 18 05 0A 00 00 00
這樣我們就配置完成了一個(gè)PDO。
我們還需要為RPDO配置COB_ID映射,要不我們會(huì)不知道這一幀數(shù)據(jù)要發(fā)送給哪個(gè)節(jié)點(diǎn)使用:
60A 23 00 14 01 0A 02.。
PDO 配置完成后,如果要使配置的生效,需要復(fù)位通訊(Reset Communication)。NMT 管理:
00 82 0A //使節(jié)點(diǎn)號(hào)為 A 的驅(qū)動(dòng)器通訊復(fù)位;
再啟動(dòng)通訊
00 01 0A // //使能節(jié)點(diǎn)A
這樣我們就可以通過(guò)幀ID為20A的RPDO對(duì)電機(jī)6040(控制字)進(jìn)行配置啦。比如使能電機(jī):
601 2B 40 60 00 06 00 00 00 //設(shè)置 6040h 為 6
601 2B 40 60 00 07 00 00 00 //設(shè)置 6040h 為 7
601 2B 40 60 00 0F 00 00 00 //設(shè)置 6040h 為 F,使電機(jī)使能;