CANopen原理--心跳

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ethercat_i7/article/details/81221422

本文介绍CANopen中心跳信号的原理,以及在开源CANopen协议栈CanFestival中的实现过程。

一、心跳的作用

CANopen网络中,当一个节点需要知道另一个节点的状态时,除了发送远程帧查询节点状态外,节点也可以周期性的发送心跳信号,向网络上的其它节点通告本节点的状态。
发送心跳的节点称为生产者,生产者既可以是主节点,也可以是从节点。
接收心跳的节点称为消费者,消费者既可以是主节点,也可以是从节点。
这里写图片描述
消费者负责监控心跳信号是否正常,若在规定的时间内没有收到心跳信号,则应该产生一个错误信息。

二、心跳的帧格式

心跳帧的格式如下:
这里写图片描述
其中,数据区为1个字节的节点状态,不同的值对应的含义如下:

//CanFestival-3.0-rc3\include\states.h
enum enum_nodeState {
  Initialisation  = 0x00, 
  Disconnected    = 0x01,
  Connecting      = 0x02,
  Preparing       = 0x02,
  Stopped         = 0x04,
  Operational     = 0x05,
  Pre_operational = 0x7F,
  Unknown_state   = 0x0F
};

三、心跳周期

心跳生产者发送心跳帧的周期由对象字典0x1017(Producer Heartbeat Time)的值确定,单位为1ms。
设定发送心跳帧的定时器:

\CanFestival-3.0-rc3\src\lifegrd.c
void heartbeatInit(CO_Data* d)
{
    ......
    if ( *d->ProducerHeartBeatTime )
    {
        TIMEVAL time = *d->ProducerHeartBeatTime;
        d->ProducerHeartBeatTimer = SetAlarm(d, 0, &ProducerHearbeatAlarm, MS_TO_TIMEVAL(time), MS_TO_TIMEVAL(time));
    }
}

其中,*d->ProducerHeartBeatTime的值即对象字典0x1017的值,在CanFestival给的示例程序中,即
TestMaster_obj1017的值:

\CanFestival-3.0-rc3\examples\TestMasterSlave\TestMaster.c
/* index 0x1017 :   Producer Heartbeat Time */ 
                    UNS16 TestMaster_obj1017 = 0x0;   /* 0 */

TestMaster_obj1017初始值为0,一般由主站在初始化时设置为非0值。

四、发送心跳帧

每当定时器超时后,将调用ProducerHearbeatAlarm()发送心跳帧:

\CanFestival-3.0-rc3\src\lifegrd.c
void ProducerHearbeatAlarm(CO_Data* d, UNS32 id)
{
    if(*d->ProducerHeartBeatTime)
    {
        Message msg;
        msg.cob_id.w = *d->bDeviceNodeId + 0x700;
        msg.len = (UNS8)0x01;
        msg.rtr = 0;
        msg.data[0] = d->nodeState; /* No toggle for heartbeat !*/
        /* send the heartbeat */
            MSG_WAR(0x3130, "Producing heartbeat: ", d->nodeState);
            canSend(d->canHandle,&msg );
    }else{
        d->ProducerHeartBeatTimer = DelAlarm(d->ProducerHeartBeatTimer);
    }
}

五、实例

以倍福EL6751为主节点的一个CANopen网络中,用USB-CAN检测到的心跳信号如下:
这里写图片描述

其中,ID为0x0000077f的帧是主节点EL6751发送的心跳帧,ID为0x00000701的帧是从节点1发送的心跳帧,数据中的状态为5,表明2个节点均处于Operational状态。

六、参考资料

1、CanFestival 3.0 RC3
2、CiA301 V4.2.0

展开阅读全文

没有更多推荐了,返回首页