canopen 心跳报文

本文详细介绍了如何在CANopen设备中启用心跳报文功能,包括通过设置对象字典中的1017h启用周期性心跳报文发送,并探讨了心跳报文的掉站报警功能。通过配置1016h实现主站对从站的心跳监测,当超过预设时间未收到从站心跳报文时,主站会触发错误处理。

心跳报文

1. 如何启用💓报文功能?

对象字典中的1017h对应的就是生产者的Heartbeat time,生产者会根据设定的Heartbeat time进行周期性的心跳报文发送。1017h>0💓报文将被启用,等于0则不启用。
CIA V4.2.0:
t
If the heartbeat producer time is configured on a CANopen device the heartbeat protocol begins
immediately. If a CANopen device starts with a value for the heartbeat producer time unequal to 0 the
heartbeat protocol starts on the transition from the NMT state Initialisation to the NMT state Preoperational. In this case the boot-up message is regarded as first heartbeat message. It is not allowed
to use both error control mechanisms guarding protocol and heartbeat protocol on one NMT slave at
the same time. If the heartbeat producer time is unequal 0 the heartbeat protocol is used.

代码举例:
注意:1017h这里的设置值单位是ms
/* index 0x1017 :   Producer Heartbeat Time. */
    UNS16 Master_obj1017 = 0x3E8;	/* 1000 */
     subindex Master_Index1017[] = 
      {
        { RW, uint16, sizeof (UNS16), (void*)&Master_obj1017, NULL }
      };
2. 如何启用心跳报文的掉站报警功能?
协议框图

在这里插入图片描述

1. Heartbeat consumer 的字典1016h设置
例如:我对1016h添加了一个测试数据
/* index 0x1016 :   Consumer Heartbeat Time. */
   UNS8 Master_highestSubIndex_obj1016 = 1; /* number of subindex - 1*/
    UNS32 Master_obj1016[] = 
    {
         0x020FA0	/*  */
    };
    subindex Master_Index1016[] = 
     {
       { RO, uint8, sizeof (UNS8), (void*)&Master_highestSubIndex_obj1016, NULL },
       { RW, uint32, sizeof (UNS32), (void*)&Master_obj1016[0], NULL }

     };
说明:

上述代码中Master_obj1016[0]数组中 0x020FA0 的元素含义:
在这里插入图片描述
所以:0x020FA0 表示的含义就是Heartbeat consumer(主站)会对Node-ID为0x02的Heartbeat producer(从站)心跳站点掉线监测。如果超过0x0FA0毫秒(Heartbeat time)则Heartbeat consumer会产生一个Heartbeat Event。
在canfestival中Heartbeat consumer(主站)会调用lifegrd.c中的_heartbeatError()方法

上述执行过程补充:
在这里插入图片描述

CANopen的NMT(网络管理)报文在工业自动化通信中起着关键作用,解析它有助于理解和管理CANopen网络中设备的状态与操作。以下是解析CANOPEN NMT报文的方法: ### 了解NMT报文的基本信息 CANopen是工业自动化领域用于设备间数据交换和通信的协议,NMT报文是其重要组成部分。CANopen上电后会发送节点上线报文心跳报文等NMT报文,掌握NMT报文才能看懂CANopen网络上的各种CAN报文,对设备进行有效管理和调试 [^1][^2]。 ### 解析NMT报文的步骤 1. **确认CANopen设备状态**:CANopen上电后,通过心跳报文可判断其处于Pre - Operatonal(预操作状态),此时PDO功能关闭。需要用NMT报文让从切换到Operational(操作状态),PDO功能才有效。因为CANopen网络的实时性取决于PDO,多个节点实时高效通讯依赖PDO [^2]。 2. **识别CS命令字**:NMT报文含CS(Control Service)命令字,不同的CS命令字代表不同的操作。例如,01h 命令可让节点进入操作模式(启动状态);02h 可使节点进入停止模式(停止状态);80h 能让节点进入预操作模式;81h 用于复位节点(恢复至初始状态);82h 可复位节点通信(节点的CAN和CANopen通讯重新初始化) [^4]。 3. **结合硬件进行观察**:准备好如STM32H743开发板(已移植CANopen协议)和CAN分析仪等硬件,通过CAN分析仪观察CANopen网络上的报文,根据NMT报文的特征和CS命令字来解析报文内容 [^2]。 4. **处理多节点情况**:在调试多个CANopen节点时,如果只关注一个节点的报文,可使用NMT报文让其他节点进入停止状态,进入停止状态后,节点连基本的心跳报文都会停止发送 [^2]。 ### 示例代码(伪代码) ```python # 模拟CAN分析仪接收到的NMT报文 received_nmt_message = [0x01, 0x02] # 假设这是接收到的NMT报文数据 # 解析CS命令字 cs_command = received_nmt_message[0] # 根据CS命令字判断节点状态 if cs_command == 0x01: print("节点进入操作模式(启动状态)") elif cs_command == 0x02: print("节点进入停止模式(停止状态)") elif cs_command == 0x80: print("节点进入预操作模式") elif cs_command == 0x81: print("节点复位(恢复至初始状态)") elif cs_command == 0x82: print("节点通信复位(CAN和CANopen通讯重新初始化)") else: print("未知的CS命令字") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值