耐心查看,必有所获!尽量别跳过,否则有些前面写了的,后面可不一定解释了。
一个系列的首页:https://blog.csdn.net/kissgoodbye2012/article/details/
canopen需要掌握的知识:
1.对象字典OD——最重要,需要了解。
2.NMT节点管理——主节点来操作;
3.PDO过程数据传输;
4.SDO对象字典配置;
参考文章:
这篇写得比较好:https://blog.csdn.net/iamplane/article/details/
写在前面的话(必看)
一个canopen网络,有且仅有一个NMT主机节点,可以配置包括自身在内的所有canopen网络的节点。
而后设备再canopen网络中发送Boot-up信号,自动进入预操作状态,此状态为主要的配置节点状态。
完成配置后,节点需要NMT 主机发送NMT 报文进入操作状态。操作状态是CANopen 正常工作时的状态,
各个模块都应正常工作。
当NMT 主机发送停止节点报文时,设备进入停止状态,CANopen 子设备的通信只有NMT 模块正常工作。
NMT功能
- 初始化、启动和停止CANOPEN网络中的设备;
- 查询CANOPEN网络中设备的状态;
CANOPEN节点控制
一个canopen子设备的状态及其转换关系,如图1所示,有如下几种:
图1 NMT状态执行图
- 状态有三种:预操作状态(pre-oprational),运行状态(oprational)和停止状态(Stopped)
- 可以随时复位节点和复位通信操作;
- 可以从预操作状态到运行或者停止状态;
- 可以从运行到预操作状态或者停止状态;
- 可以从停止到预操作状态,但不能到运行状态;
(canopen命令)——can标准帧的发送格式
(数据帧,非远程帧)0x000+CS(命令字节)+Node-ID
其中的CS命令字节:
0x01(1)——启动节点
0x02(2)——停止节点
0x80(128)——进入预操作状态
0x81(129)——复位节点
0x82(130)——复位通信
通俗的讲:就是标准帧头为0x000的节点,发送两个字节的数据。
表1 各种状态下可以进行的服务
查询节点的状态(也称NMT错误控制)
两种方式:
第一种——主节点发送 节点保护 命令,查询节点的当前状态;
第二种——子节点每隔一段时间发送 心跳包 ,报告自身状态给主节点。
注1:不允许同时使用寿命保护和心跳。
注2:节点保护、寿命保护和心跳的时间不宜设置过短,以免增大网络负载!
这里的寿命保护,是针对从节点而言的。防止主节点掉线,所以主节点必须间隔一定时间发送节点保护指令。
当然,推荐且最常用的是心跳方式。
(1)节点保护
节点保护是NMT 主机通过远程帧,周期地查询NMT 从机的状态。节点保护遵循的是主从模型,每个远程帧都必须得到应答。
———-主节点发送指令:0x700+Node-ID;(远程帧)
由于是远程帧,没有数据,所以只需要标准帧的帧头,指示想要查询的节点。
———-从节点应答指令:0x700+Node-ID Byte1(状态字节) ;(数据帧)
状态字节是一个字节,包括一个触发位( bit7),触发位必须在每次节点保护应答中交替置“ 0”或者“ 1 ”。触发位在第一次节点保护请求时置为“ 0”,下一次应答就会置“ 1 ”。
位 0 到位 6( bits0~6)表示节点状态,可为下面的数值。
状态字节有如下几种值:
0x00(0)——正在初始化
0x01(1)——未连接
0x02(2)——连接中
0x03(3)——准备中
0x04(4)——停止状态
0x05(5)——开始状态
0x7F(127)——预操作状态
注意:
- 其中主节点发送中和从节点发送中的Node-ID都是从节点的节点号。
- 0x01,0x02,0x03的状态只有支持扩展 boot-up 的节点才提供。
- 0x00从不在节点保护应答中出现,因为一个节点在这个状态时并不应答节点保护报文。
(2)心跳
心跳模式采用的是生产者——消费者模型。CANopen 设备可根据生产者心跳间隔对象0x1017h (从节点)设置的周期来
发送心跳报文,单位为ms。网络总具有消费者心跳功能的节点,根据对象0x1016h(主节点) 设置的消费者时间监视该
生产者,一旦在消费者心跳时间范围内未接收到相应节点的生产者心跳,则认为该节点出现故障。
配置方法:通过SDO对象通信方式,这是一种应答模式的配置方法。具体看看SDO通信。
配置生产者心跳时间间隔1017h 后,节点心跳功能激活,开始产生心跳报文。
配置消费者心跳1016h 的有效子索引后,接收到相应节点发出的一帧心跳即开始监视。
1016h 某子索引时间≥主机生产者时间×1.8,否则易误报从机认为主机掉站。对于伺服控制的建议:心跳生产者的时间不要低于20ms,而消费者心跳时间不要低于40ms,且为相应生产者心跳时间的1.8 倍以上。还是那句话,节点保护、寿命保护和心跳的时间不宜设置过短,以免增大网络负载!
心跳报文的格式:0x700+Node-ID Byte1(状态字);(数据帧)
状态字节是一个字节,包括一个触发位( bit7),触发位必须在每次节点保护应答中交替置“ 0”或者“ 1 ”。触发位在第一次节点保护请求时置为“ 0”,下一次应答就会置“ 1 ”。
位 0 到位 6( bits0~6)表示节点状态,可为下面的数值。
状态字节有如下几种值:
0x00(0)——正在初始化
0x01(1)——未连接
0x02(2)——连接中
0x03(3)——准备中
0x04(4)——停止状态
0x05(5)——开始状态
0x7F(127)——预操作状态
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234021.html原文链接:https://javaforall.net