打印
[应用相关]

STM32-CANOpen报文类型

[复制链接]
2647|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CANOpen应用层协议细化了CAN总线协议中关于标识符的定义。定义标准报文的11比特标识符中高4比特为功能码,后7比特为节点号,重命名为通讯对象标识符(COB-ID)。
功能码将所有的报文分为7个优先级,按照优先级从高至低依次为:网络命令报文(NMT)、同步报文(SYNC)、紧急报文(EMERGENCY)、时间戳(TIME)、过程数据对象(PDO)、服务数据对象(SDO)、节点状态报文(NMT Err Control)

7位的节点号则表明CANOpen网络最多可支持127个节点共存(0号节点为主站),下表给出了各报文的COB-ID范围。


沙发
dingbo95|  楼主 | 2018-7-15 19:19 | 只看该作者


MNT命令为最高优先级报文,由CANOpen主站发出,用以更改从节点的运行状态。

SYNC报文定期由CANOpen主站发出,所有的同步PDO根据SYNC报文发送。

EMERGENCY报文由出现紧急状态的从节点发出,任何具备紧急事件监控与处理能力的节点会接收并处理紧急报文。

TIME报文由CANOpen主站发出,用于同步所有从站的内部时钟。

PDO分为4对发送和接收PDO,每一个节点默认拥有4对发送PDO和接收PDO,用于过程数据传递。

SDO分为发送SDO和接收SDO,用于读写对象字典。

MT Error Control报文由从节点发出,用以监视从节点的运行状态。


使用特权

评论回复
板凳
dingbo95|  楼主 | 2018-7-15 19:20 | 只看该作者
在def.h中用代码表述了各种报文的功能码
#define NMT                0x0        //网络命令报文
#define SYNC                0x1        //同步报文
#define TIME_STAMP        0x2        //时间报文
#define PDO1tx                0x3        //过程数据对象1发送报文
#define PDO1rx                0x4        //过程数据对象1接收报文
#define PDO2tx                0x5        //过程数据对象2发送报文
#define PDO2rx                0x6        //过程数据对象2接收报文
#define PDO3tx                0x7        //过程数据对象3发送报文
#define PDO3rx                0x8        //过程数据对象3接收报文
#define PDO4tx                0x9        //过程数据对象4发送报文
#define PDO4rx                0xA        //过程数据对象4接收报文
#define SDOtx                0xB        //服务数据对象接收报文
#define SDOrx                0xC        //服务数据对象发送报文
#define NODE_GUARD        0xE        //节点守护报文
#define LSS                    0xF        //层配置服务报文


使用特权

评论回复
地板
dingbo95|  楼主 | 2018-7-15 19:21 | 只看该作者
在移植CANOpen时,CAN总线接收到报文后要调用CANOpen提供的接口canDispatch根据功能码进行报文处理,在states.c中定义了canDispatch函数
<code class="language-cpp">/* 定时事件触发处理函数 */  
void canDispatch(CO_Data *d, Message *m)  
{  
    /* 取出cob_id */  
    UNS16 cob_id = UNS16_LE(m->cob_id);  
  
    /* 判断报文类型 */  
    switch(cob_id >> 7)  
    {  
        /* 同步/紧急报文 */  
        case SYNC:  
            /* 同步报文COB-ID为0x80 */  
            if(cob_id == 0x080)  
            {  
                /* 当前状态下允许同步报文,则进行处理 */  
                if(d->CurrentCommunicationState.csSYNC)  
                    proceedSYNC(d);  
            }   
            /* 紧急报文COB-ID为0x81-0xFF */  
            else  
            {  
                /* 当前状态下允许紧急报文,则进行处理 */  
                if(d->CurrentCommunicationState.csEmergency)  
                    proceedEMCY(d,m);  
            }  
            break;  
  
        /* 时间报文 */  
        /* case TIME_STAMP: */  
              
        /* PDO报文 */  
        case PDO1tx:  
        case PDO1rx:  
        case PDO2tx:  
        case PDO2rx:  
        case PDO3tx:  
        case PDO3rx:  
        case PDO4tx:  
        case PDO4rx:  
            /* 当前状态下允许PDO报文,则进行处理 */  
            if(d->CurrentCommunicationState.csPDO)  
                proceedPDO(d,m);  
            break;  
              
        /* SDO报文 */  
        case SDOtx:  
        case SDOrx:  
            /* 当前状态下允许SDO报文,则进行处理 */  
            if(d->CurrentCommunicationState.csSDO)  
                proceedSDO(d,m);  
            break;  
              
        /* 心跳/节点守护报文 */  
        case NODE_GUARD:  
            /* 当前状态下允许心跳/节点守护报文,则进行处理 */  
            if(d->CurrentCommunicationState.csLifeGuard)  
                proceedNODE_GUARD(d,m);  
            break;  
         
        /* 改变节点状态报文 */  
        case NMT:  
            /* 用于主站改变从站状态,所以从站才会收到 */  
            if(*(d->iam_a_slave))  
            {  
                proceedNMTstateChange(d,m);  
            }  
            break;  
              
#ifdef CO_ENABLE_LSS  
        /* 层设置服务报文 */  
        case LSS:  
            if(!d->CurrentCommunicationState.csLSS)  
                break;  
  
            if((*(d->iam_a_slave)) && cob_id==MLSS_ADRESS)  
            {  
                proceedLSS_Slave(d,m);  
            }  
            else if(!(*(d->iam_a_slave)) && cob_id==SLSS_ADRESS)  
            {  
                proceedLSS_Master(d,m);  
            }  
            break;  
#endif  
    }  
}  
</code>  


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

1197

帖子

5

粉丝