硬汉嵌入式论坛

 找回密码
 立即注册
查看: 593|回复: 10
收起左侧

[技术讨论] CANopen未经过NMT指令会切换工作状态

[复制链接]

27

主题

97

回帖

178

积分

初级会员

积分
178
发表于 2025-2-8 20:06:07 | 显示全部楼层 |阅读模式
公司使用了CANopen协议栈的设备,现在设备接入到产品系统,系统里面别的设备用的都是普通的CAN进行数据收发,然后发现,CAN总线上有的数据帧会将CANopen设备从预操作状态切换到停止状态,具体数据帧是:

CAN-ID:0x70
数据 :0x02 0x02 0xxx 0xxx 0xxx ....
这一帧数据会导致node-ID为 0x02 的CANopen设备进入到停机状态,通过多次测试,发现CAN-ID 0x00~0x70都会导致工作状态进行切换,并且发现DATA0决定设备状态,DATA1决定设备node-ID;
我查了一下,发现0x70这个CAN-ID没有具体功能码的定义呀,是不是当时协议栈移值不对呢?
还有问一下,CANopen可不可以让总线的单独一个节点进行状态切换呢?
回复

使用道具 举报

27

主题

97

回帖

178

积分

初级会员

积分
178
 楼主| 发表于 2025-2-8 20:16:44 | 显示全部楼层
查了下资料,这块CANopen控制单独节点工作状态切换是在NMT报文更改设备状态,后面的字节(也就是DATA1)改为 node-ID 即可,0x00是修改所有从节点工作状态
回复

使用道具 举报

27

主题

97

回帖

178

积分

初级会员

积分
178
 楼主| 发表于 2025-2-8 20:21:06 | 显示全部楼层
发现NMT命令,CAN-ID部分,本来是0x000,然后保持CAN-ID的功能码部分不变,然后随意改node-ID部分都可以更改节点的工作状态
回复

使用道具 举报

27

主题

97

回帖

178

积分

初级会员

积分
178
 楼主| 发表于 2025-2-8 20:21:55 | 显示全部楼层
哼哼唧唧2022 发表于 2025-2-8 20:21
发现NMT命令,CAN-ID部分,本来是0x000,然后保持CAN-ID的功能码部分不变,然后随意改node-ID部分都可以更 ...

就是保持功能码部分为0,node-ID随意,都可以更改节点的工作状态
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-2-9 08:18:28 | 显示全部楼层
NMT的话,主要就是这个

12.png
回复

使用道具 举报

27

主题

97

回帖

178

积分

初级会员

积分
178
 楼主| 发表于 2025-2-9 08:47:57 | 显示全部楼层
eric2013 发表于 2025-2-9 08:18
NMT的话,主要就是这个

谢谢硬汉!NMT命令是我图看错了,问一下就是一个系统中在CAN自定义协议和CANopen协议里面,CAN自定义协议的CAN-ID为多少时不会导致触发CANopen的一些机制进行改变呢?我看了下具体的ID定义,CANopen的功能码部分都是已经完全占用了的,心里有点没底,强行被拉去出差的
回复

使用道具 举报

27

主题

97

回帖

178

积分

初级会员

积分
178
 楼主| 发表于 2025-2-9 09:03:28 | 显示全部楼层
eric2013 发表于 2025-2-9 08:18
NMT的话,主要就是这个

硬汉哥,就是我们这个CANopen只用了SDO,没有用PDO,我让他们把自定义协议的CAN-ID用到PDO的CAN-ID段,应该不会对CANopen有不可预知的影响吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-2-10 06:22:59 | 显示全部楼层
哼哼唧唧2022 发表于 2025-2-9 09:03
硬汉哥,就是我们这个CANopen只用了SDO,没有用PDO,我让他们把自定义协议的CAN-ID用到PDO的CAN-ID段,应 ...

在程序里面把PDO处理的宏定义关闭了,然后了这个设备不需要兼容其它CANopen设备,是可以的。
回复

使用道具 举报

27

主题

97

回帖

178

积分

初级会员

积分
178
 楼主| 发表于 2025-2-10 10:39:16 | 显示全部楼层
eric2013 发表于 2025-2-10 06:22
在程序里面把PDO处理的宏定义关闭了,然后了这个设备不需要兼容其它CANopen设备,是可以的。

好的,谢谢!
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2025-2-10 10:57:37 | 显示全部楼层

楼主自定义协议CANID可以用0x600-0x7FF这是CANopen未用ID
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-4-4 23:11:08 | 显示全部楼层
eric2013 发表于 2025-2-10 06:22
在程序里面把PDO处理的宏定义关闭了,然后了这个设备不需要兼容其它CANopen设备,是可以的。

硬汉哥,我想问一下NMT 的 0x81 应用层复位状态,比如现在我的场景是:在索引为 0x2003上有一个类型为UNSIGNED8的条目,并且设置它为TPDO,发送出来方便我调试,然后在节点上线后,使用SDO修改了这个条目的值,然后可以正确看到NMT发送了00 以及进入7F (应该就是成功复位了),但是这个值并没有还原到节点上线时的值,这正常吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 22:09 , Processed in 0.430558 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表