本文介绍CANopen中的NMT状态机,及在CanFestival中的实现过程。

一、NMT状态机

CANopen中状态机包含4个状态:Initialisation、Pre-operational、Operational和Stopped。
相互之间的关系和跳转条件如下:


其中,从Initialisation到Pre-operational的跳转一般是从节点自动完成的,其它跳转一般由主节点发送NMT帧触发。

二、NMT帧格式

NMT帧的ID为0,NodeID为需要控制的节点号,若要控制所有节点则NodeID为0。

其中cs(Command Specifier)在def.h中定义:

/* NMT Command Specifier, sent by master to change a slave state */
/* ------------------------------------------------------------- */
/* Should not be modified */
#define NMT_Start_Node              0x01
#define NMT_Stop_Node               0x02
#define NMT_Enter_PreOperational    0x80
#define NMT_Reset_Node              0x81
#define NMT_Reset_Comunication      0x82

三、CanFestival中的实现

CanFestival关于NMT的代码主要在nmtMaster.c、nmtSlave.c和States.c中,以从节点为例,当收到NMT帧时的处理流程为:
canDispatch() -> proceedNMTstateChange() :

void proceedNMTstateChange(CO_Data* d, Message *m)
{......      if( ( (*m).data[1] == 0 ) || ( (*m).data[1] == *d->bDeviceNodeId ) ){      switch( (*m).data[0]){ /* command specifier (cs) */           case NMT_Start_Node:if ( (d->nodeState == Pre_operational) || (d->nodeState == Stopped) )setState(d,Operational);break;        case NMT_Stop_Node:if ( d->nodeState == Pre_operational ||d->nodeState == Operational )setState(d,Stopped);case NMT_Enter_PreOperational:if ( d->nodeState == Operational || d->nodeState == Stopped )setState(d,Pre_operational);break;        case NMT_Reset_Node:setState(d,Initialisation);case NMT_Reset_Comunication:setState(d,Initialisation);break;        }/* end switch */      }/* end if( ( (*m).data[1] == 0 ) || ( (*m).data[1] == bDeviceNodeId ) ) */}
}

在setState()中将d->nodeState设为相应的状态,并执行相应状态下的动作。

四、实例


帧0:停止节点1。
帧1:停止所有节点。
帧2:复位所有节点通信。
帧3::启动节点1。
帧4:启动所有节点。

CANopen原理--NMT状态机相关推荐

  1. 学习CANopen --- [3] NMT报文

    本文主要讲述CANopen中的NMT报文,即网络管理(Network ManagemenT),该服务可以用于启动网络和监控设备. NMT报文由NMT主机发送,对从机进行启动.监控和重启,在CANope ...

  2. Canopen协议 (1):网络状态管理(NMT)

    工控应用中,常常会遇到一些设备:电机或者其他传感器需要通过Can 这个硬件接口来通信,而且往往通信协议都是走的都是Canopen协议.自己当初搞的时候对协议也是云里雾里,为了大家不走歪路,早日走上人生 ...

  3. CANopen协议基础知识

    CANopen协议基础知识 资料: DS301协议中文文档:https://winshton.gitbooks.io/canopen-ds301-cn/content/chapter5.html 30 ...

  4. CANOPEN使用心得1-cia301、cia402简单提要

    canopen简单提要 can总线    can特点:多主控制.高达1M通讯速度.通讯校验. 错误检测处理及恢复等,can总线通讯接口规定了CAN协议的物理层和数据链路层功能. canopen协议   ...

  5. CANopen协议及应用

    文章目录 CANopen协议 CAN总线 CAN报文 CANopen概述 对象字典(Object Dictionary) 概述 通讯对象子协议区 制造商特定子协议 CANopen报文 NMT网络管理 ...

  6. CANOPEN 汇总

    CANopen原理--SDO(download) CANopen通信之PDO通信 CANOPEN的PDO CANOpen中SDO和PDO的COB-ID理解 Epec Programming and L ...

  7. 大前端开发者需要了解的基础编译原理和语言知识

    转自:https://yq.aliyun.com/articles/180879 在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Py ...

  8. uiswitchbutton 点击不改变状态_ES6专题—Generator与react状态机(14)

    大家在写App和一些单页面程序的时候,经常会遇到这样的情况: 当点击左边的箭头的时候,会出现灰黑色的抽屉效果,再点击一下向左的箭头,就会收起来,当然向右滑动和向左滑动也能实现抽屉效果的开关.还有,当抽 ...

  9. CanOpen通信协议python实现

    1. CANOpen--在ISO层级中位置和诞生 CAN(Controller Area Network)现场总线仅仅定义了第1层(物理层,见ISO11898-2标准).第2层(数据链路层,见ISO1 ...

最新文章

  1. 二分类任务:确定一个人是否年收入超过5万美元
  2. python的电脑推荐_推荐8款常用的Python GUI图形界面开发框架
  3. 众多Android 开源项目推荐,给力工作给力学习
  4. python基础之python中if __name__ == '__main__': 的解析
  5. mysql 主备及时_MySQL高可用(二)主备延时如何解决?
  6. Spring Boot文档阅读笔记-构建Restful风格的WebService
  7. 模仿mongodb采用xml+json实现小型数据库
  8. py 的 第 34 天
  9. Android考察报告模板,《跨越星弧》星球地质考察报告首次公开!
  10. 《算法设计与分析》王红梅 第二版部分习题
  11. SPSS统计分析行业应用实战--SPSS 24.0新增
  12. 计算机病毒与木马的区别,计算机病毒和木马的区别
  13. 光谱共焦位移传感器原理和特性
  14. 计算机xp怎么做备份,如何备份xp系统电脑所有系统文件
  15. 【禁止套娃】用PPSSPP模拟PSP模拟Neogeo模拟SNK拳皇97
  16. ARP报文头部格式和请求流程
  17. 数字内容产业的产业链结构
  18. php启动,重启,关闭命令
  19. 风电场气象服务器是什么系统,风电场气象参数采集与管理系统
  20. 神话造词——了解单词的起源及演变如何能帮我们更好地记单词

热门文章

  1. 家用是买轿车还是suv_SUV的完整形式是什么?
  2. 6大中文分词工具测试比较
  3. Oracle 列由VARCHAR2改为CLOB类型
  4. 天津理工大学概率论与数理统计期末考试复习
  5. AVX是什么?AVX指令集技术与应用解析
  6. 很多计算机资料高速下载,有目录(转)
  7. “阿凡达”三维立体拍摄制作技术的解密
  8. ios设置字体-黑体,加粗等
  9. 《孙子初问世》--游戏策划书
  10. 知识就是力量:博客中实现个人微信免签收款,让知识产生价值