[1] NMT网络管理
[1-1]概念:
NMT到底是啥?
答:简单理解就是由一台主机来管理从机,主机可以控制从机的状态。
那么机器到底有哪些状态呢?
答:看下面这图,总共就这些状态
[1-2]命令:
主机如何去控制状态切换呢?
答:
下图是NMT命令的格式:
[1-3]例程:
在canfestival代码中例如:
//设置了nodeID 为0x00
setNodeId(&master_objdict_Data, 0x00);
//初始化
setState(&master_objdict_Data, Initialisation);
//网络管理切换到操作状态,此时这个状态我直接设置成了操作状态,代表主机开始运行了,比如配置了心跳检测,主机就会不停检测从机是否发来心跳包
setState(&master_objdict_Data, Operational);//Operational
在举一个cia402控制elmo私服驱动器的nmt例程:
Elmo_NMTWrite(elmo, 0x80); //Pre-Operation
...
...
Elmo_NMTWrite(elmo, 0x1); //启动
Elmo_NMTWrite函数
/******************************************************************************* 写NMT *******************************************************************************/
void Elmo_NMTWrite(Elmo* elmo, long cmd)
{
elmo->elmoCAN.IDE = CAN_ID_STD; // 发送标准帧
elmo->elmoCAN.StdId = 0; // NMT COB-ID为0
elmo->elmoCAN.RTR=CAN_RTR_DATA; //数据帧
elmo->elmoCAN.DLC = 2; // CAN报文数据长度
elmo->elmoCAN.Data[0]= cmd; // CAN报文前缀
elmo->elmoCAN.Data[1]= elmo->ulNodeID;
CAN_Transmit(CAN1, &(elmo->elmoCAN)); // 调用发送报文函数
}
[1-4]实验:
nmt的实验,最多就是心跳包的实验,下面以canfestival为例。
实验目的:从机发送心跳报文给主机,主机识别,如果主机识别不到,就调用回调函数进行报警。
原理:
1.CANopen从站 按其对象字典中 1017h 中填写的心跳生产时间(ms)进行心跳报文的发送。
2.CANopen主站 则会按其 1016h 中填写的心跳消费时间进行检查,假设超过诺干次心跳消费时间没有收到从站的心跳报文,则认为从站已经离线或者损坏。
问题一:canfestival如何分辨主从机?
问题二:对象字典中主从机的区别?
答:index 0x1017 : Producer Heartbeat Time. 0x1017有值的是从机,发送心跳包
[1-4-1]从机心跳
对于从机来说,只需要配置好1017h,就会自动发送心跳包出来。
那么从机是如何自动发送的呢?
答:
[1-4-2]主机心跳
对于主机来说,主机根据0x1016索引内设置的值对从机进行心跳检测
他的类型是32位的,前16位代表从机ID号
比如:
2s检测一次,检测不到就会触发回调函数void _heartbeatError(CO_Data* d, UNS8 heartbeatID){heartbeat_error(d,heartbeatID);}
主机修改细节:
(1)修改
(2)添加回调
(3)绑定心跳报警回调函数
(4)结果
例程链接
今天的文章canopen学习总结(一)——NMT网络管理分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/86057.html