canopen协议的介绍之NMT节点管理;

canopen协议的介绍之NMT节点管理;耐心查看 必有所获 尽量别跳过 否则有些前面写了的 后面可不一定解释了 一个系列的首页 https blog csdn net kissgoodbye2 article details canopen 需要掌握的知识 1 对象字典 OD 最重要 需要了解 2 NMT 节点管理 主节点来操作 3 PDO 过程数据传输 4 SDO 对象字典配置

耐心查看,必有所获!尽量别跳过,否则有些前面写了的,后面可不一定解释了。

 

一个系列的首页:https://blog.csdn.net/kissgoodbye2012/article/details/

canopen需要掌握的知识:

1.对象字典OD——最重要,需要了解。

2.NMT节点管理——主节点来操作;

3.PDO过程数据传输;

4.SDO对象字典配置;

 

参考文章:

这篇写得比较好:https://blog.csdn.net/iamplane/article/details/

 

写在前面的话(必看)

一个canopen网络,有且仅有一个NMT主机节点,可以配置包括自身在内的所有canopen网络的节点。

而后设备再canopen网络中发送Boot-up信号,自动进入预操作状态,此状态为主要的配置节点状态。

完成配置后,节点需要NMT 主机发送NMT 报文进入操作状态。操作状态是CANopen 正常工作时的状态
各个模块都应正常工作。

当NMT 主机发送停止节点报文时,设备进入停止状态,CANopen 子设备的通信只有NMT 模块正常工作。

NMT功能

  1. 初始化、启动和停止CANOPEN网络中的设备;
  2. 查询CANOPEN网络中设备的状态;

 CANOPEN节点控制

一个canopen子设备的状态及其转换关系,如图1所示,有如下几种:

canopen协议的介绍之NMT节点管理;

                                            图1   NMT状态执行图

  • 状态有三种:预操作状态(pre-oprational),运行状态(oprational)和停止状态(Stopped)
  • 可以随时复位节点和复位通信操作;
  • 可以从预操作状态到运行或者停止状态;
  • 可以从运行到预操作状态或者停止状态;
  • 可以从停止到预操作状态,但不能到运行状态

(canopen命令)——can标准帧的发送格式

(数据帧,非远程帧)0x000+CS(命令字节)+Node-ID

其中的CS命令字节:

            0x01(1)——启动节点

            0x02(2)——停止节点

            0x80(128)——进入预操作状态

            0x81(129)——复位节点

            0x82(130)——复位通信

通俗的讲:就是标准帧头为0x000的节点,发送两个字节的数据。

                                                                      表1     各种状态下可以进行的服务

canopen协议的介绍之NMT节点管理;

查询节点的状态(也称NMT错误控制)

两种方式:

第一种——主节点发送 节点保护 命令,查询节点的当前状态;

第二种——子节点每隔一段时间发送 心跳包 ,报告自身状态给主节点。

 

注1:不允许同时使用寿命保护和心跳。
注2:节点保护、寿命保护和心跳的时间不宜设置过短,以免增大网络负载!

这里的寿命保护,是针对从节点而言的。防止主节点掉线,所以主节点必须间隔一定时间发送节点保护指令。

当然,推荐且最常用的是心跳方式。

 

(1)节点保护

节点保护是NMT 主机通过远程帧,周期地查询NMT 从机的状态。节点保护遵循的是主从模型,每个远程帧都必须得到应答

———-主节点发送指令:0x700+Node-ID;(远程帧)

由于是远程帧,没有数据,所以只需要标准帧的帧头,指示想要查询的节点。

———-从节点应答指令:0x700+Node-ID   Byte1(状态字节) ;(数据帧)

状态字节是一个字节,包括一个触发位( bit7),触发位必须在每次节点保护应答中交替置“ 0”或者“ 1 ”。触发位在第一次节点保护请求时置为“ 0”,下一次应答就会置“ 1 ”。

位 0 到位 6( bits0~6)表示节点状态,可为下面的数值。

状态字节有如下几种值:

         0x00(0)——正在初始化

         0x01(1)——未连接

         0x02(2)——连接中

         0x03(3)——准备中

         0x04(4)——停止状态

         0x05(5)——开始状态

         0x7F(127)——预操作状态

注意:

  • 其中主节点发送中和从节点发送中的Node-ID都是从节点的节点号。
  • 0x01,0x02,0x03的状态只有支持扩展 boot-up 的节点才提供。
  • 0x00从不在节点保护应答中出现,因为一个节点在这个状态时并不应答节点保护报文。

(2)心跳

心跳模式采用的是生产者——消费者模型。CANopen 设备可根据生产者心跳间隔对象0x1017h (从节点)设置的周期来
发送心跳报文,单位为ms。网络总具有消费者心跳功能的节点,根据对象0x1016h(主节点) 设置的消费者时间监视该
生产者,一旦在消费者心跳时间范围内未接收到相应节点的生产者心跳,则认为该节点出现故障。

配置方法:通过SDO对象通信方式,这是一种应答模式的配置方法。具体看看SDO通信。

配置生产者心跳时间间隔1017h 后,节点心跳功能激活开始产生心跳报文。

配置消费者心跳1016h 的有效子索引后,接收到相应节点发出的一帧心跳即开始监视。

1016h 某子索引时间≥主机生产者时间×1.8,否则易误报从机认为主机掉站。对于伺服控制的建议:心跳生产者的时间不要低于20ms,而消费者心跳时间不要低于40ms,且为相应生产者心跳时间的1.8 倍以上。还是那句话,节点保护、寿命保护和心跳的时间不宜设置过短,以免增大网络负载!

心跳报文的格式:0x700+Node-ID Byte1(状态字);(数据帧)

状态字节是一个字节,包括一个触发位( bit7),触发位必须在每次节点保护应答中交替置“ 0”或者“ 1 ”。触发位在第一次节点保护请求时置为“ 0”,下一次应答就会置“ 1 ”。

位 0 到位 6( bits0~6)表示节点状态,可为下面的数值。

状态字节有如下几种值:

         0x00(0)——正在初始化

         0x01(1)——未连接

         0x02(2)——连接中

         0x03(3)——准备中

         0x04(4)——停止状态

         0x05(5)——开始状态

         0x7F(127)——预操作状态

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234021.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 令人心动的WEB HOSTING 虚拟主机服务[通俗易懂]

    令人心动的WEB HOSTING 虚拟主机服务[通俗易懂]你正在为网站寻找虚拟主机(WEBHOSTING)吗?哪里能找到功能卓越,价格低廉的ISP服务商呢?跟着我,你便会找到惊喜.一个偶然的机会使我有机会访问到国外的网站服务公司HostExcellence. ,它的服务套餐有以下几种LinuxHostingPlans:StarterPlan-1Domain&50mb/$2.95InstantPlan-1Domain&

    2022年10月8日
    0
  • 从ResNet101到ResNet50

    从ResNet101到ResNet50一直用VGG训练,几天前想看下ResNet的效果如何,因为SSD源码中有python实现的ResNet网络结构实现代码,包含ResNet101和ResNet152,直接拿ResNet101来训练,GTX1060配置,batchsize竟然只降到2才跑的起来,果然一直收敛不了。看了下model_libs.py里面的实现代码:defResNet101Body(net,from_layer,u

    2022年10月7日
    0
  • 常见的图像增强方法有_图像中值滤波的算法实现

    常见的图像增强方法有_图像中值滤波的算法实现1.对比度拉升采用了线性函数对图像的灰度值进行变换2.Gamma校正采用了非线性函数(指数函数)对图像的灰度值进行变换这两种方式的实质是对感兴趣的图像区域进行展宽,对不感兴趣的背景区域进行

    2022年8月3日
    3
  • JVM 内存结构基于JDK1.8【JVM篇三】

    JVM 内存结构基于JDK1.8【JVM篇三】在我的上一篇文章别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】中,相信大家已经对java类加载机制有一个比较全面的理解了,那么类加载之后,字节码数据在Java虚拟机内存中是如何存放的?Java虚拟机在为类实例或成员变量分配内存是如何分配的?是的,这两个问题就涉及到了JVM内存结构的知识了,那么这篇文章将进行解答。文章目录1、内存结构还…

    2022年5月20日
    30
  • C# Form实现自定义光标

    WinForm代码如下:1usingSystem;2usingSystem.Reflection;3usingSystem.Runtime.InteropServices;4us

    2021年12月20日
    43
  • GPU利用率低的解决办法

    GPU利用率低的解决办法watch-n0.1-dnvidia-smi#检查GPU利用率参数解决办法:1.dataloader设置参数2.增大batchsize3.减少IO操作,比如tensorboard的写入和打印。4.换显卡

    2022年6月30日
    119

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号