《五》canfestival系列教程之sdo
如果把pdo比作高速公路,那么sdo就是普通的小路.
pdo高速公路雖然效率高,但是下雨,下雪,有霧的時會封路.(有干擾)
sdo小路有時候很方便,很穩(wěn)定.
因?yàn)閜do發(fā)送是生產(chǎn)--消費(fèi)模式.就是只管pdo發(fā)送,誰愿意接收就接收,不接收也無所謂.因?yàn)槲也还苡袥]有人接收,更不確定有沒有送到.
相比之下,sdo就穩(wěn)妥多了.它是服務(wù)器--客戶端模式,就是客戶發(fā)給我,我必須要回復(fù),要對客戶負(fù)責(zé).這樣有了來回消息交互,就不會出現(xiàn)數(shù)據(jù)錯誤.傳輸也比較穩(wěn)定了.
canopen的知識點(diǎn)和概念比較多,也比較散,建議大家準(zhǔn)備一個小本子,可以隨時記錄和查閱,用電腦記錄實(shí)際上很不方便.(親身體會......)

因?yàn)閟do穩(wěn)定的特性,所以一般作為pdo不能使用時的應(yīng)急方案,或者作為配置參數(shù)時使用的指令.
例如驅(qū)動器,上電后需要進(jìn)行配置,這里使用的就是sdo.
(這里驅(qū)動器是服務(wù)端,電腦是客戶端,用電腦去訪問驅(qū)動器的參數(shù).)
配置完成之后發(fā)送數(shù)據(jù),為了效率,才使用pdo.
但是電機(jī)故障,需要查找錯誤的時候,可以切換到sdo進(jìn)行錯誤的查找.

sdo是很重要的,因?yàn)榇蟛糠衷O(shè)備都需要進(jìn)行參數(shù)配置.
就以支持canopen的驅(qū)動器為例,通過編寫canfestival程序,配置驅(qū)動為速度模式.
在拿到驅(qū)動器后,可以先用sdo去讀取內(nèi)部的字典,
根據(jù)字典返回的數(shù)據(jù),就知道驅(qū)動器當(dāng)前的配置和運(yùn)行模式.
這一節(jié)我們只講解sdo發(fā)送的數(shù)據(jù)流程.
sdo的數(shù)據(jù)結(jié)構(gòu)為:

例如:
601, 22 00 14 01 01 02 00 80
上面是一條sdo指令,
0x601:?發(fā)送時can的id,它由兩部分組成,600+1,600代表了這時一條sdo. 1代表發(fā)送給1號節(jié)點(diǎn)的驅(qū)動器.
0x22:?寫命令,向驅(qū)動器里面寫入數(shù)據(jù),就是圖一中的指令字CS,它還有很多中,比如讀是0x40,這里需要查找ds301協(xié)議.
0x00 14:?因?yàn)閏an是小端模式,真正的順序是0x1400,這里是一個索引.
0x 01:?子索引,和上面的1400?組合在一起就是 1400,01索引.這個索引號是針對字典的,從字典表格中查找這個號(就相當(dāng)于一棟樓的門牌號),這個索引里面"住"的數(shù)據(jù),代表:驅(qū)動器接收的cob-id.
0x01 02?00 80:?數(shù)據(jù),因?yàn)槭切《四J?正常的數(shù)據(jù)順序應(yīng)該是0x 80 00 02 01.這條數(shù)據(jù)的意思是cob-id為0x80000201.
綜上,整條語句的意思也就是,向驅(qū)動器1400,01索引中寫入數(shù)據(jù)0x80000201.

如何把這條指令發(fā)送出去:
(從函數(shù)的名字也能看出這個是設(shè)置節(jié)點(diǎn)字典的,就是發(fā)送sdo的)
最核心的是writeNetworkDict()函數(shù).


跳進(jìn)去看一下


跳進(jìn)去看一下,_writeNetworkDict