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

article/2025/8/26 16:24:35

本文主要讲述CANopen中的NMT报文,即网络管理(Network ManagemenT),该服务可以用于启动网络和监控设备。

NMT报文由NMT主机发送,对从机进行启动、监控和重启,在CANopen网络中只允许有一个活动的NMT主机。如果网络中有多个设备可以配置成主机,那么同一时刻只有一个可以配置成主机。


一 NMT报文及功能

NMT报文属于Master/Slave模式

1. 模块控制报文

该报文用于对Slave从机进行各种控制,报文格式如下,
在这里插入图片描述
必须由NMT Master发给NMT Slave(s),报文的COB-ID是0x000

报文数据段传输的第0个字节是CS (Command Specifier),用于表示控制命令,具体有以下5个命令,
在这里插入图片描述
PS:NMT Service这一列里有个Remote Node,即远程节点,其实就是Slave节点,这是相对于NMT Master来说的。如果NMT Master也是个CAN设备,那么NMT Master自身可以叫做Local Node

报文数据段传输的第1个字节是Slave从机的Node Id,如果为0,表示网内所有Slave设备都会收到这个报文。

2. 设备监控报文

该功能主要用于监控Slave设备的当前状态,分为Node Guarding和Heartbeat两种方式。

2.1 Node Guarding

NMT Master主动向Slave发送一个CAN远程帧(没有数据段),如下图,
在这里插入图片描述
然后Slave会返回一个指定格式的消息给Master,如下图,
在这里插入图片描述
Byte0包含一个toggle位(bit7),每一次Node Guard请求都会在0和1之间进行翻转(第一次值为0),翻转的目的是为了区分设备当前状态值和历史状态值;bit 6-0用来表示Slave的当前状态,有以下几种状态,
在这里插入图片描述
PS:状态0永远不会出现在Node Guarding的reply里,因为在Initialising状态下,不会对Node Guarding请求做出响应。

2.2 Heartbeat

也叫做心跳报文,由NMT Slave主动发送,NMT Master接收,无需response,这种模式也叫做生产者/消费者模式,NMT Slave是生产者,NMT Master是消费者
在这里插入图片描述
有以下4种状态,
在这里插入图片描述
当一个使用Heartbeat的CAN设备启动,其第一条心跳报文就是Boot-up,
在这里插入图片描述

2.3 小结

Node Guarding和Heartbeat都可以实现设备监控的目的,同一时刻只能使用其中一种,推荐使用Heartbeat,更加简单,另外Node Guarding需要用到远程帧,不是所有CAN设备都支持远程帧。

3. 启动报文

当NMT Slave设备启动时,都会发送这条报文,用来告知Master自己已经从 Initialising状态切换到Pre-operational状态。
在这里插入图片描述
启动报文和Heartbeat中的Boot-up有点重合,当一个使用Heartbeat的CAN设备启动,其第一条心跳报文就是Boot-up,但如果使用的是Node Guarding,那么CAN设备启动后发送的第一条报文就是启动报文,后续就是Node Guarding请求了。


二 代码实战

学习了理论后,再通过实践来加深理解。

首先,通过下面的Slave代码,创建1个Slave节点,id是6,初始化完成后自动进入Pre-operational状态,

import signal
import canopenrunning = Truedef sigint_handler(signum, frame):global runningprint('')running = Falseexit(0)# 处理按键发送的信号,优雅的关闭程序
signal.signal(signal.SIGINT,  sigint_handler)
signal.signal(signal.SIGHUP,  sigint_handler)
signal.signal(signal.SIGTERM, sigint_handler)# 创建一个网络用来表示CAN总线
network = canopen.Network()# 连接到CAN总线
network.connect(bustype='socketcan', channel='vcan0')# 创建slave节点,其id是6,对象字典为CANopenSocket.eds
node = network.create_node(6, 'CANopenSocket.eds')# node向CAN总线上发送启动消息
node.nmt.send_command(0)# node进入PRE-OPERATIONAL状态
node.nmt.state = 'PRE-OPERATIONAL'# node发送心跳报文,每隔1s发送一次
node.nmt.start_heartbeat(1000) # 1000ms# 循环
while running:pass

运行后在candump窗口下观察如下,
在这里插入图片描述
0x7F是127,表示can节点进入了Pre-operational状态。

下面是master代码,会把所有NMT的命令都执行一遍,具体可以看注释,

import time
import canopen# 创建一个网络用来表示CAN总线
network = canopen.Network()# 添加slave节点,其id是6,对象字典为CANopenSocket.eds
node = canopen.RemoteNode(6, 'CANopenSocket.eds')
network.add_node(node)# 连接到CAN总线
network.connect(bustype='socketcan', channel='vcan0')sleep_sec = 2 # 2秒# 发送'Start Remode Node'命令,把slave设置为OPERATIONAL状态
node.nmt.state = 'OPERATIONAL'time.sleep(sleep_sec)# 发送'Reset Node'命令,把slave设置为Initialising状态
node.nmt.state = 'RESET'time.sleep(sleep_sec)# 发送'Enter Pre-operational State'命令,把slave设置为PRE-OPERATIONAL状态
node.nmt.state = 'PRE-OPERATIONAL'time.sleep(sleep_sec)# 发送'Start Remode Node'命令,把slave设置为OPERATIONAL状态
node.nmt.state = 'OPERATIONAL'time.sleep(sleep_sec)# 发送'Stop Remode Node'命令,把slave设置为STOPPED状态
node.nmt.state = 'STOPPED'time.sleep(sleep_sec)# 发送'Reset Communication'命令,把slave设置为Initialising状态
node.nmt.send_command(0x82)time.sleep(sleep_sec)# 发送'Enter Pre-operational State'命令,把slave设置为PRE-OPERATIONAL状态
node.nmt.state = 'PRE-OPERATIONAL'time.sleep(sleep_sec)# 发送'Start Remode Node'命令,把slave设置为OPERATIONAL状态
node.nmt.state = 'OPERATIONAL'

运行master.py后,在candump窗口可以看到如下状态变化,
在这里插入图片描述
已上状态切换完全是按照CANopen DS301中规定的状态机进行的,如下图,
在这里插入图片描述


三 总结

本文主要讲述CANopen协议中的NMT报文,并以代码实战展示了如何使用NMT报文以及对应的状态切换。

如果有写的不对的地方,希望能留言指正,谢谢阅读。


http://chatgpt.dhexx.cn/article/l07nhWC0.shtml

相关文章

论文引介 | NMT with Conditional Sequence Generative Adversarial Nets

文章原名:Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets 作者:Zhen Yang, Wei Chen, Feng Wang and Bo Xu 单位:Institute of Automation, Chinese Academy of Sciences 译者:韩旭…

NMT对抗训练的三部曲

来自:天宏NLP 进NLP群—>加入NLP交流群 本文主要介绍NMT模型鲁棒性的相关改进工作,介绍一下对抗训练的三部曲,一作皆是ChengYong,分别中了2018,2019和2020的ACL。 第一项工作为 Towards Robust Neural Machine Tran…

手把手教你用fairseq训练一个NMT机器翻译系统

以构建英-中NMT为例,在linux上运行,fairseq版本为0.8.0 环境准备 Requirements: fairseq:pytorch包,包括许多网络结构,https://github.com/pytorch/fairseqmosesdecoder:机器翻译的标准数据处…

00_NMT网络管理的模块控制

目录 NMT服务 NMT错误控制 NMT 节点守护 HeartBeat Message 心跳报文 NMT Boot-up 在can网络中,只有主站可以发送控制信息,来控制从站,从站不需要发送对网络控制消息的响应消息。 网络管理系统负责初始化、启动及停止网络及网络中的设备…

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

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

canopen学习总结(一)——NMT网络管理

[1] NMT网络管理 [1-1]概念: NMT到底是啥? 答:简单理解就是由一台主机来管理从机,主机可以控制从机的状态。 那么机器到底有哪些状态呢? 答:看下面这图,总共就这些状态 [1-2]命令&#xff1…

NMT

1)刚开始时,在RNN的基础上引入attention,即将两者结合应用,完整解释并附上完整code。详见下链接: 基于RNNAttention的机器翻译 2)接着,Facebook在CNN的基础上引入attention,参见论…

Neural Machine Translation(NMT)技术概述

在神经网络语言模型处理NLP领域,我做的研究一直都和文本分类相关,其实还有很多其他的应用领域,比方说:语言翻译、词性标注、命名实体识别等。感觉还是有必要了解一下如何用神经网络语言模型对这些应用进行建模的。因此&#xff0c…

NMT with Attention

1.数据准备 termcolor.colered 对输出进行染色,凸显。colored(f"tokenize(hello): ", green) from termcolor import colored import random import numpy as npimport trax from trax import layers as tl from trax.fastmath import numpy as fastnp …

CANopen通信之NMT通信

在介绍NMT通信机制之前,先介绍一下NMT这个通信对象的定义。在以下部分中COB-ID使用的是 CANopen 预定义连接集中已定义的缺省标志符。 1) NMT 模块控制( NMT Module Control) 只有 NMT-Master 节点能够传送 NMT Module Control 报文。 所有从…

NMT:神经网络机器翻译

前言 SMT是在神经网络之前最主流的翻译模式,统计机器翻译;NMT则是基于神经网络的翻译模式,也是当前效果最好的翻译模式。现在基于几篇paper来梳理下神经网络下的翻译模型。 NMT based RNN 1) First End-to-End RNN Trial   2014年&…

神经机器翻译(Neural machine translation, NMT)学习笔记

神经机器翻译(Neural machine translation, NMT)是最近提出的机器翻译方法。与传统的统计机器翻译不同,NMT的目标是建立一个单一的神经网络,可以共同调整以最大化翻译性能。最近提出的用于神经机器翻译的模型经常属于编码器-解码器…

Java本机内存跟踪NMT实战详解

JVM通常会额外分配内存。这些额外的分配,会导致java程序占用的内存,超出-Xmx的限制。让我们使用NMT查看内存的使用情况 NMT 是什么 NMT 是一种 Java Hotspot VM 功能,用于跟踪 HotSpot VM 的内部内存使用情况。您可以使用该jcmd实用程序访问…

fastText模型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目标一、fastText的模型架构1. N-gram的理解1.1 bag of word 2. fastTex模型中层次化的softmax2.1 哈夫曼树和哈夫曼编码2.1.1 哈夫曼树的定义2.1.2 哈夫曼树的相关…

fastText Python 教程

诸神缄默不语-个人CSDN博文目录 fastText Python官方GitHub文件夹网址:fastText/python at main facebookresearch/fastText 本文介绍fastText Python包的基本教程,包括安装方式和简单的使用方式。 我看gensim也有对fasttext算法的支持(ht…

玩转Fasttext

Fasttext是Facebook AI Research最近推出的文本分类和词训练工具,其源码已经托管在Github上。Fasttext最大的特点是模型简单,只有一层的隐层以及输出层,因此训练速度非常快,在普通的CPU上可以实现分钟级别的训练,比深度…

FastText详解

词向量对比word2vec https://zhuanlan.zhihu.com/p/75391062 0、实战经验 word2vec vs fastText区别? 思想:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。 word2vec vs fastText区别? …

FastText原理

一、简介 fasttext是facebook开源的一个词向量与文本分类工具,在2016年开源,典型应用场景是“带监督的文本分类问题”。提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度更快。 fastText结合了自然语言处理和机器学习中最…

Fasttext

Fasttext Paper Fasttext特点 模型简单,只有一层的隐层以及输出层,因此训练速度非常快不需要训练词向量,Fasttext自己会训练两个优化:Hierarchical Softmax、N-gram Fasttext模型架构 fastText模型架构和word2vec中的CBOW很相…

[NLP]文本分类之fastText详解

Word2vec, Fasttext, Glove, Elmo, Bert, Flair pre-train Word Embedding 一、fastText简介 fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点: 1、fastText在保持高精度的情况下加快了训练速度和测试速度 2、fastText不需要预…