《十一》canfestival系列教程之canopen中節(jié)點(diǎn)保護(hù)
canopen中保護(hù)方式分為兩種,
一種是心跳
另一種是節(jié)點(diǎn)保護(hù)
本文介紹節(jié)點(diǎn)保護(hù)的內(nèi)容.

原理
假設(shè)
單片機(jī)是主機(jī).
驅(qū)動(dòng)器是從機(jī).
單片機(jī)控制多個(gè)驅(qū)動(dòng)器.
在can接線斷開的時(shí)候,單片機(jī)無法控制驅(qū)動(dòng)器,會(huì)導(dǎo)致電機(jī)跑飛.(會(huì)按照最后給定的速度轉(zhuǎn)動(dòng))
這樣可能會(huì)導(dǎo)致意外發(fā)生.
所以引入了節(jié)點(diǎn)保護(hù)(節(jié)點(diǎn)守護(hù)).
單片機(jī)會(huì)每隔一段時(shí)間,向每個(gè)驅(qū)動(dòng)器發(fā)送一次請(qǐng)求節(jié)點(diǎn)保護(hù)的請(qǐng)求幀報(bào)文.
驅(qū)動(dòng)器每隔一段時(shí)間也會(huì)進(jìn)行檢測(cè),如果沒有收到請(qǐng)求的報(bào)文,就說明掉線了.然后驅(qū)動(dòng)器會(huì)停止工作.(這個(gè)功能要在驅(qū)動(dòng)器端進(jìn)行配置好)
單片機(jī)也會(huì)檢測(cè)驅(qū)動(dòng)器返回的節(jié)點(diǎn)保護(hù)報(bào)文,如果在規(guī)定時(shí)間沒有收到,就認(rèn)為驅(qū)動(dòng)器掉線了.
之后的錯(cuò)誤處理需要自己編寫,比如編寫亮紅燈,還是串口輸出,都可以.

程序流程之上電狀態(tài)

就是字典里最后的一個(gè)代碼.
它的作用就是,把配置好的字典參數(shù)賦值給一個(gè)結(jié)構(gòu)體.最終傳給程序使用
跳入里面可以看到:

NMT就是網(wǎng)絡(luò)管理.
中實(shí)際上包含了節(jié)點(diǎn)保護(hù)部分.
這里NMTable_Initializer的值決定了單片機(jī)上電后,節(jié)點(diǎn)保護(hù)所處的狀態(tài).
跳進(jìn)去,

說明單片機(jī)一上電是Unknown_state的狀態(tài).
分析到這里,其實(shí)只需要知道單片機(jī)一上電,實(shí)際上是Unknown_state狀態(tài)的,
這個(gè)狀態(tài)是沒有辦法發(fā)送節(jié)點(diǎn)報(bào)文的.

程序流程之發(fā)送節(jié)點(diǎn)保護(hù)
回到主函數(shù).
主函數(shù)中會(huì)有一個(gè)切換到操作模式的函數(shù).

它的意思是,把單片機(jī)切換到操作模式.
跳進(jìn)之后,找到

然后再跳進(jìn),就會(huì)運(yùn)行到

這里會(huì)運(yùn)行到

也就是到了節(jié)點(diǎn)保護(hù)初始化函數(shù).
跳進(jìn)去.可以看到下圖,里面有心跳和節(jié)點(diǎn)保護(hù).我們用的是節(jié)點(diǎn)保護(hù).

然后跳入,就會(huì)發(fā)現(xiàn)軟件定時(shí)器的配置.canfestival為節(jié)點(diǎn)保護(hù)配置了一個(gè)軟件定時(shí)器.
然后,就等中斷到了,調(diào)用GuardTimeAlarm函數(shù)了.GuardTimeAlarm里面就是發(fā)送節(jié)點(diǎn)保護(hù)報(bào)文的.

所有這些功能都是在主函數(shù)中完成的,然后進(jìn)入主while中就不需要配置了.只需要等待軟件定時(shí)器中斷了...
我們跳入GuardTimeAlarm函數(shù).


100c和100D的索引配置
還是從這個(gè)函數(shù)去看.


config.h文件的改動(dòng)
一般情況下是不需要進(jìn)行改動(dòng)的.



整體截圖
主函數(shù)截圖

改寫報(bào)錯(cuò)函數(shù).
當(dāng)節(jié)點(diǎn)單片機(jī)長時(shí)間沒有收到節(jié)點(diǎn)保護(hù)報(bào)文,就會(huì)報(bào)錯(cuò).
然后,我在里面添加了點(diǎn)亮小燈.也就是can節(jié)點(diǎn)保護(hù)超時(shí),小燈就會(huì)點(diǎn)亮.

在單片機(jī)can中斷接收里面.
(驅(qū)動(dòng)器返回的節(jié)點(diǎn)保護(hù)報(bào)文,會(huì)進(jìn)入到這里)
