[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为0elmo->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)结果
例程链接