网络管理报文用于监视和设置节点的运行状态,心跳机制和寿命保护机制都基于该报文。

/* 改变节点状态 */
UNS8 masterSendNMTstateChange(CO_Data *d, UNS8 Node_ID, UNS8 cs)
{Message m;MSG_WAR(0x3501, "Send_NMT cs : ", cs);MSG_WAR(0x3502, "    to node : ", Node_ID);m.cob_id = 0x0000;m.rtr = NOT_A_REQUEST;m.len = 2;m.data[0] = cs;m.data[1] = Node_ID;return canSend(d->canHandle,&m);
}/* 发送节点守护报文:请求节点上报状态 */
UNS8 masterSendNMTnodeguard(CO_Data *d, UNS8 nodeId)
{Message m;/* MNT报文(数据帧表示响应,远程帧表示请求) */UNS16 tmp = nodeId | (NODE_GUARD << 7);/* cob-id */m.cob_id = UNS16_LE(tmp);/* 远程帧,请求 */m.rtr = REQUEST;/* 长度 */m.len = 0;MSG_WAR(0x3503, "Send_NODE_GUARD to node : ", nodeId);/* 发送该帧 */return canSend(d->canHandle,&m);
}/* 请求节点状态 */
UNS8 masterRequestNodeState(CO_Data *d, UNS8 nodeId)
{d->NMTable[nodeId] = Unknown_state;/* 如果节点号为0,则置所有节点为位置状态 */if(nodeId == 0) {UNS8 i = 0;for(i = 0; i < NMT_MAX_NODE_ID; i++) {d->NMTable[i] = Unknown_state;}}/* 发送节点守护报文:请求节点上报状态 */return masterSendNMTnodeguard(d, nodeId);
}
/* 处理状态改变报文 */
void proceedNMTstateChange(CO_Data *d, Message *m)
{/* 节点当前状态为预运行态、运行态、停止态,才能变换新状态 */if(d->nodeState == Pre_operational || d->nodeState == Operational || d->nodeState == Stopped) {MSG_WAR(0x3400, "NMT received. for node :  ", (*m).data[1]);/* 如果主站要求自己变换节点状态,才变更状态 */if(((*m).data[1] == 0) || ((*m).data[1] == *d->bDeviceNodeId)){/* 判断新状态 */switch((*m).data[0]){/* 预运行态和停止态切换到运行态 */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);break;/* 运行态和停止态切换到预运行态 */case NMT_Enter_PreOperational:if(d->nodeState == Operational || d->nodeState == Stopped)setState(d, Pre_operational);break;/* 切换到初始态 */case NMT_Reset_Node:/* 节点重置时调用回调函数 */if(d->NMT_Slave_Node_Reset_Callback != NULL)d->NMT_Slave_Node_Reset_Callback(d);setState(d, Initialisation);break;/* 重启通信 */case NMT_Reset_Comunication:{/* 获取节点号 */UNS8 currentNodeId = getNodeId(d);/* 回调函数 */if(d->NMT_Slave_Communications_Reset_Callback != NULL)d->NMT_Slave_Communications_Reset_Callback(d);
#ifdef CO_ENABLE_LSSif(currentNodeId!=d->lss_transfer.nodeID)currentNodeId = d->lss_transfer.nodeID;
#endif/* 设置节点号为0xFF */*d->bDeviceNodeId = 0xFF; /* 设置节点id */setNodeId(d, currentNodeId);}/* 设置节点初始化 */setState(d, Initialisation);break;}}}
}/* 从节点发送引导报文 */
UNS8 slaveSendBootUp(CO_Data* d)
{Message m;#ifdef CO_ENABLE_LSSif(*d->bDeviceNodeId == 0xFF)return 0;
#endifMSG_WAR(0x3407, "Send a Boot-Up msg ", 0);{UNS16 tmp = NODE_GUARD << 7 | *d->bDeviceNodeId; m.cob_id = UNS16_LE(tmp);}m.rtr = NOT_A_REQUEST;m.len = 1;m.data[0] = 0x00;return canSend(d->canHandle,&m);
}

CANOpen网络管理报文相关推荐

  1. 车载网络 - Autosar网络管理 - 网络管理报文

    三.网络管理报文 NM报文的ID一般定义为:基础ID+源地址,每个节点应分配一个唯一的标识符(ECU地址)Node_ID,网络管理报文一般会统一一个基地址,这个是根据主机厂不同而不同,有些是用0x40 ...

  2. CANopen | 网络管理NMT01 - 节点上线报文与心跳报文

    文章目录 一.前言 二.NMT节点上线报文 三.NMT心跳报文 一.前言 CANopen协议的NMT管理报文既是最简单又是最重要的知识点,为什么网络管理NMT这么重要? 1.CANopen从站上电后, ...

  3. CANOpen紧急报文

     紧急报文,当设备内部发生错误时触发该对象,即发送设备内部错误代码. 在canopen内部维持一个错误表,对发生的错误进行记录.当错误发生后从表中查看该错误是否已经发生并未被解决时,则报告主站:如果 ...

  4. CANOpen同步报文

    同步(SYNC),该报文对象基于生产者/消费者模式,由SYNC生产者周期性的广播,作为网络基本时钟,实现整个网络的同步传输,每个节点都以该同步报文作为同步PDO触发参数,因此该同步报文的COB-ID具 ...

  5. canopen 报文格式_CANopen协议报文处理

    CAN 报文由 7 个不同的位域组成,而 CANopen 就是规定其中的仲裁域(11 位标识符) 和数据域(8 字节数据) 的使用情况,11 位标识符和 8 字节数据在 CAN 帧中的位置如下图所示: ...

  6. canopen服务器协议,CANopen

    CAN應用層和CANopen CANopen 概述 CANopen是附加了一套设备子协议的高层(第7层)CAN通信协议.作为一种标准化.高度可配置的嵌入式网络解决方案,它广泛应用于实时工业应用.机器人 ...

  7. 嵌入式CANopen协议从入门到落地产品(更新2021.9.8)

    一.前言 我写CANopen系列博文的初衷是分享如何使用STM32单片机开发一款CANopen产品,所谓实战为主,理论为辅.只看CANopen协议的理论是很枯燥,而且根本看不会.我认为掌握CANope ...

  8. 基于ZYNQ的开源CANopen协议栈CANFestival移植

    1 概述 CanFestival是一个免费而且开源的CANopen协议栈,较为适合于对CANopen协议栈功能完备性和工作性能要求不高的应用场合.对于功能和性能要求较高的应用,也有很多第三方的商用CA ...

  9. CAN笔记(17) 预定义报文ID

    CAN笔记(17) 预定义报文 ID 1. 预定义报文 2. 网络管理与特殊协议报文ID 3. 过程数据对象和服务数据对象的报文ID 1. 预定义报文 在 CANOpen 创立之初 即使在 CAN 总 ...

最新文章

  1. centos7上安装redis6-0-5
  2. 【 MATLAB 】 WLLS algorithm Simulation of TOA - Based Positioning
  3. YII2 百度富文本mini版UMEditor的使用
  4. global mapper 制作地形图_福州大飞机模型制作厂家,产品模型,期待合作_境海模型...
  5. hdoj3351-stack
  6. [工具库]JOJSONBuilder工具类——一键把多个bean对象数据转换为JSON格式数据
  7. android service 访问数据库,XE5 ANDROID通过webservice访问操作MSSQL数据库
  8. GitOps:Weaveworks通过开发者工具实现CI/CD
  9. Linux 删除除某个文件之外的所有文件
  10. 将列表打印为表格数据
  11. 华为路由器支持ftp服务器,如何配置华为路由器的FTP
  12. html 表格转换为dbf,DBF Excel 文件相互转换-完美教程资讯
  13. x黑客X档案2006年07期
  14. org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.
  15. 关于 u-nas 报警声音
  16. linux消息分发机制,RabbitMQ消息分发轮询和Message Acknowledgment
  17. 华为云webSDK说明文档
  18. android实现自定义图标,Android开发中用Drawable 实现自定义电池图标
  19. C++ -Pointer指针总结(一)
  20. 普适计算-2014/03/28

热门文章

  1. java 分享巧克力_[leetcode 双周赛 11] 1231 分享巧克力
  2. 802.11 n wlan linux驱动下载,802.11n无线网卡驱动
  3. 2012计算机一级考试试题,2012年计算机一级考试试题题库(备考)
  4. js字符串的字典序_27. 字符串的排列
  5. (数据库系统概论|王珊)第十章数据库恢复技术-第一、二节:事务的基本概念和数据库恢复概述
  6. (计算机组成原理)第五章中央处理器-第五节1:指令流水线(定义和表示方法及性能指标)
  7. Linux 中的零拷贝技术
  8. 支持XML的公司和它们的开发工具有哪些?
  9. DRAM与SRAM的比较
  10. mysql除法运算保留小数的用法