CANopen通信之NMT通信

原创 2015年11月19日 11:27:31

      在介绍NMT通信机制之前,先介绍一下NMT这个通信对象的定义。在以下部分中COB-ID使用的是 CANopen 预定义连接集中已定义的缺省标志符。

1) NMT 模块控制( NMT Module Control

       只有 NMT-Master 节点能够传送 NMT Module Control 报文。 所有从设备必须支持 NMT 模块控制服务。NMT Module Control 消息不需要应答。 NMT 消息格式如下:


    当 Node-ID=0,则所有的 NMT 从设备被寻址(广播)。 CS 是命令字,可以取如下值:


2) NMT 节点保护( NMT Node Guarding)

    通过节点保护服务, NMT 主节点可以检查每个节点的当前状态, 当这些节点没有数据传送时这种服务尤其有意义。

NMT-Master 节点发送远程帧(无数据)如下:


NMT-Slave 节点发送如下报文应答:


数据部分包括一个触发位( bit7),触发位必须在每次节点保护应答中交替置“ 0”或者“ 1 ”。触发位在第一次节点保护请求时置为“ 0”。位 到位 6( bits06)表示节点状态,可为下表中的数值。


注意:带*号的状态只有支持扩展 boot-up 的节点才提供。注意状态 从不在节点保护应答中出现,因为一个节点在这个状态时并不应答节点保护报文。

或者,一个节点可被配置为产生周期性的被称作心跳报文( Heartbeat)的报文。


状态可为下表种的数值:


当一个 Heartbeat 节点启动后它的 Boot-up 报文是其第一个 Heartbeat 报文。 Heartbeat 消费者通常是NMT-Master 节点,它为每个 Heartbeat 节点设定一个超时值,当超时发生时采取相应动作。

一个节点不能够同时支持 Node Guarding 和 Heartbeat 协议。

3) NMT Boot-up

NMT-slave 节点发布 Boot-up 报文通知 NMT-Maste节点它已经从 initialising 状态进入 pre-operational状态。


以上介绍NMT通信的基本原理和机制。下面介绍NMT通信具体的示例:

本示例中硬件采用的是周立功的USB-CAN模块和ARM A8架构的RSB-4210开发板,本次测试程序使用CanFestival中的示例程序修改而成。CanFestival中的各种示例程序适用于多种平台(UnixWin32等),多种场合。本次测试用的程序是examples文件夹中CANOpenShell例程。
具体开发过程如下:

可参考以下步骤修改并编译CANOpenShell应用程序

1. 打开终端”Terminal”

2. 输入命令”cd /CanFestival-3-7740ac6fdedc/examples/CANOpenShell”,切换到CANOpenShell文件夹下;

3. 输入命令”gedit CANOpenShell.c”,可以编辑修改” CANOpenShell.c”文件;

4. 根据第4章中设计的介绍,只需根据需求修改节点处于运行状态时的程序代码,即可实现所需功能。这里修改CANOpenShellOD_operational(CO_Data* d)函数中的内容如下:

void CANOpenShellOD_operational(CO_Data* d)

{

system("cd /tools");

system("echo 177 >/sys/class/gpio/export");

system("echo out >/sys/class/gpio/gpio177/direction");

system("echo 1 >/sys/class/gpio/gpio177/value");

system("sleep 1");

system("echo 0 >/sys/class/gpio/gpio177/value");

system("sleep 1");

system("echo 1 >/sys/class/gpio/gpio177/value");

system("sleep 1");

system("echo 0 >/sys/class/gpio/gpio177/value");

printf("Node_operational\n");

}

程序修改的功能是驱动RSB-4210上的蜂鸣器。蜂鸣器的驱动文件的路径为” /sys/class/gpio/”,可在该文件夹中配置相关文件值,来设定蜂鸣器输入输出的方向和值的大小。

1. 输入2”cd ..”命令,切换到/CanFestival-3-7740ac6fdedc目录;

2. 输入”make”命令编译修改过的文件;

3. 输入”make install”命令把编译好的文件放在install目录下;

4. 输入” CP CANOpenShell /media/rootfs/tools/myinstall/bin/”,把编译生成的CANOpenShell可执行文件拷贝到SD卡上;

5. 拔出SD卡插到RSB-4210开发板上(注意断电插拔SD卡);

6. 打开串口终端软件”AbsoluteTelnet”,按第3章中的相关步骤设置串口;

7. 输入”root”后按回车键;

8. 输入”./br500k.sh”,设置通信波特率为500K;

9. 输入” cd /tools/myinstall/bin/”命令,切换到CANOpenShell所在的目录下;

10. 输入” ./CANOpenShell”命令,执行CANOpenShell文件。但由于没有设置CANID等参数,此时无法执行,可按系统提示进行设置,如图5-1所示:


                                            图5-1 系统设置提示截图

15.按系统提示输入命令” ./CANOpenShell load#../lib/libcanfestival_c

an_socket.so,0,500K,1,0”,如图5-2所示,设置USBCAN-2E-U中的CAN0口通信,通信波特率为500K,把RSB-4210配置成从设备,从设备ID配置成01

执行上述命令后,从节点自动进入预运行状态,如图5-3所示


                                                 图5-2 编译命令截图


                                         图5-3 从节点状态变化截图

16.打开USBCAN-2E-U的测试软件CANTest,配置好波特率等参数后,即可配置帧ID和数据帧的值进行通信。

    在利用NMT通信方式数据帧进行通信时,数据帧的data[0]01时,切换节点状态到运行状态,发送状态和接收状态如图5-4和图5-5所示,同时驱动蜂鸣器发出2次声音;当数据帧的data[0]02时,切换节点状态到停止状态,发送状态和接收状态如图5-6和图5-7所示。

在图5-4中,设置帧ID为:00000001数据帧是8字节数据,从左至右分别为data[0]-data[7]。从1.2.5的介绍可知,ID00000001发送的报文是NMT报文data[0]=01时,表示的意义是启动一个节点,data[1]=01表示的是节点ID,这个ID5-2中设置的从节点ID保持一致。主节点发送后,从节点接收到的数据显示为NMT报文,节点状态由“Node-preOperational”转换为“Node-Operational”状态,正确响应命令请求。


                                     图5-4 CANTest中设置发送数据截图


                                 图5-5 从节点状态变化截图

在图5-6中,从1.2.5的介绍可知,设置帧ID为:00000001,表示发送的是NMT报文。数据帧中data[0]=02,表示的意义是终止一个节点。data[1]=01表示的是节点ID,这个ID5-2中设置的从节点ID保持一致。发送图5-6中所示的数据时,节点状态由“Node-Operational”转换为“Node-stopped”状态,正确响应命令请求。如图5-7所示。


                                    图5-6 CANTest中设置发送数据截图


                               图5-7 从节点状态变化截图





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

CAN与CANOpen(五)

4.3通讯对象 CANOpen协议共有 6种通讯对象,分别是: PDO、 SDO、 SYNC、 TIME、 EMCY、 NMT。这 6种通讯对象完成了 CANOpen协议的所有通讯功能。其中我们只介...

CANopen通信之NMT通信

介绍NMT通信机制之前,先介绍一下NMT这个通信对象的定义。在以下部分中COB-ID使用的是 CANopen 预定义连接集中已定义的缺省标志符。 1) NMT 模块控制( NMT Module ...

《Java 线程编程》学习笔记5

《Java 线程编程》学习笔记5第5章 完美终止线程5.1 中断线程:interrupt() 当一个线程运行时,另一个线程可以调用对应的 Thread 对象的 interrupt() 方法来中断它:p...

CANopen预定义连接集

为了减小简单网络的组态工作量, CANopen 定义了强制性的缺省标识符( CAN-ID)分配表。这些标志符在预操作状态下可用, 通过动态分配还可修改他们。 CANopen 设备必须向它所支持的通讯对...

CANopen 块传输通信详解

这篇文件主要是记录自己曾经研究过 CANopen 源码,中间研究块传输话费了不少时间,在此,将双方通信的基本思路记录下来。 1.块上传详解(读取)   这里以图2为例子, 进行说明 假设主节点...

施耐德M340的CANopen通信指导

  • 2014年10月14日 16:40
  • 12.14MB
  • 下载

CANopen通信之PDO通信

过程数据对象(Process Data Object,PDO)是用来传输实时数据的,提供对设备应用对象的直接访问通道,它用来传输实时短帧数据,具有较高的优先权。PDO 传输的数据必须少于或等于 8 个...

<模型汇总_3>深度学习中最贪玩的模型dual-learning NMT

之前给介绍了牛逼的CNN(Convolutional Neural Network)和深度学习加速神器BNN(Binarized neural network),感兴趣的同学可以添加微信公众号...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CANopen通信之NMT通信
举报原因:
原因补充:

(最多只允许输入30个字)