CANopen通信之NMT通信

CANopen通信之NMT通信在介绍 NMT 通信机制之前 先介绍一下 NMT 这个通信对象的定义 在以下部分中 COB ID 使用的是 nbsp CANopen nbsp 预定义连接集中已定义的缺省标志符 1 nbsp NMT nbsp 模块控制 nbsp NMT nbsp Module nbsp Control nbsp nbsp nbsp nbsp 只有 nbsp NMT Master nbsp 节点能够传送 nbsp NMT nbsp Module nbsp Control nbsp 报文 nbsp 所有从设备必须支持 nbsp NMT nbsp 模块控制服务 NMT nbsp Module nbsp Control nbsp

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

1) NMT 模块控制( NMT Module Control

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

CANopen通信之NMT通信

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

CANopen通信之NMT通信

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

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

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

CANopen通信之NMT通信

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

CANopen通信之NMT通信

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

CANopen通信之NMT通信

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

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

CANopen通信之NMT通信

状态可为下表种的数值:

CANopen通信之NMT通信

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

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

3) NMT Boot-up

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

CANopen通信之NMT通信

以上介绍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所示:

CANopen通信之NMT通信

                                            图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所示

CANopen通信之NMT通信

                                                 图5-2 编译命令截图

CANopen通信之NMT通信

                                         图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”状态,正确响应命令请求。

CANopen通信之NMT通信

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

CANopen通信之NMT通信

                                 图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所示。

CANopen通信之NMT通信

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

CANopen通信之NMT通信

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





















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

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

(0)
上一篇 2026年3月17日 上午11:58
下一篇 2026年3月17日 上午11:58


相关推荐

发表回复

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

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