《十一》canfestival系列教程之canopen中节点保护
canopen中保护方式分为两种,
一种是心跳
另一种是节点保护
本文介绍节点保护的内容.

原理
假设
单片机是主机.
驱动器是从机.
单片机控制多个驱动器.
在can接线断开的时候,单片机无法控制驱动器,会导致电机跑飞.(会按照最后给定的速度转动)
这样可能会导致意外发生.
所以引入了节点保护(节点守护).
单片机会每隔一段时间,向每个驱动器发送一次请求节点保护的请求帧报文.
驱动器每隔一段时间也会进行检测,如果没有收到请求的报文,就说明掉线了.然后驱动器会停止工作.(这个功能要在驱动器端进行配置好)
单片机也会检测驱动器返回的节点保护报文,如果在规定时间没有收到,就认为驱动器掉线了.
之后的错误处理需要自己编写,比如编写亮红灯,还是串口输出,都可以.

程序流程之上电状态

就是字典里最后的一个代码.
它的作用就是,把配置好的字典参数赋值给一个结构体.最终传给程序使用
跳入里面可以看到:

NMT就是网络管理.
中实际上包含了节点保护部分.
这里NMTable_Initializer的值决定了单片机上电后,节点保护所处的状态.
跳进去,

说明单片机一上电是Unknown_state的状态.
分析到这里,其实只需要知道单片机一上电,实际上是Unknown_state状态的,
这个状态是没有办法发送节点报文的.

程序流程之发送节点保护
回到主函数.
主函数中会有一个切换到操作模式的函数.

它的意思是,把单片机切换到操作模式.
跳进之后,找到

然后再跳进,就会运行到

这里会运行到

也就是到了节点保护初始化函数.
跳进去.可以看到下图,里面有心跳和节点保护.我们用的是节点保护.

然后跳入,就会发现软件定时器的配置.canfestival为节点保护配置了一个软件定时器.
然后,就等中断到了,调用GuardTimeAlarm函数了.GuardTimeAlarm里面就是发送节点保护报文的.

所有这些功能都是在主函数中完成的,然后进入主while中就不需要配置了.只需要等待软件定时器中断了...
我们跳入GuardTimeAlarm函数.


100c和100D的索引配置
还是从这个函数去看.


config.h文件的改动
一般情况下是不需要进行改动的.



整体截图
主函数截图

改写报错函数.
当节点单片机长时间没有收到节点保护报文,就会报错.
然后,我在里面添加了点亮小灯.也就是can节点保护超时,小灯就会点亮.

在单片机can中断接收里面.
(驱动器返回的节点保护报文,会进入到这里)
