从CAN到CANOpen——准入门大全(五)

第九节、关于NMT:

NMT用于CAN网络管理,有一个主节点,和最多127个子节点。

每一个子节点上线,都必须发送节点上线报文(boot-up)。节点上线报文的ID为0x700+节点ID。数据只有一个字节,即0。

为了方便主节点监控各子节点的状态,子节点会定期上传心跳报文,报文格式和节点上线报文一致,区别只是心跳报文的数据部分传送的是自己的状态。状态对应的代码如下图:

由上图可见,节点上线报文其实是心跳报文的一种特殊情况。

CANopen从站按其对象字典中 1017h 中填写的心跳生产时间(mS)进行心跳报文的发送。CANopen主站则会按其 1016h 中填写的心跳消费时间进行检查,假设超过诺干次心跳消费时间没有收到从站的心跳报文,则认为从站已经离线或者损坏。

心跳报文(包括节点上线报文),在CANopen协议中,也属于错误控制协议部分。错误控制协议还包括一个节点监护协议,意思是由主节点定期监护子节点的状态,但这种做法目前已经不太推荐了。

节点的状态包括六种状态:1.初始化;2.应用层复位;3.通讯复位;4.预操作状态(Pre-operational);5.操作状态(Operational);6.停止状态(Stopped)。状态机在上电复位后,主要在4、5、6状态之间切换,所以也可以把1~3状态视为一种状态(Initialisation)。

节点可以自己在6种(4种)状态里切换,也可以由主节点控制进行状态切换。

NMT报文可以主动控制子节点的状态,子节点不需要回复。NMT报文的格式如下:

COB-ID是广播地址,数据字段的第一个字节是控制命令,第二个字节是节点ID。

控制命令又可分为如下几种:

注,128就是0x80。

第十节、关于LSS:

LSS是CANopen的一个子协议,英文直译层设置服务。主要作用就是配置节点ID,设置波特率等。

LSS采用主-从模式、点对点进行通信。LSS的主设备,也是NMT的主节点,其它设备都是从节点。报文COB-ID固定为0x7E5(主发送)或0x7E4(从发送)。报文的数据字段固定为8字节。

每个设备都有唯一的LSS地址,该地址由4个32位数构成:制造商ID;产品码;修订码;序列号。其中制造商ID由CiA统一分配,其它参数都是制造商自行决定。LSS地址存放在对象字典主索引的0x1080处,该项子索引对应关系如下图:

LSS地址和节点ID不是一回事:LSS地址是全球唯一的、由4个32位数组成的地址;节点ID是设备接入CAN网络后,由主设备(NMT)临时分配的号码,只有7位(从0x01到0x7F)。

主设备配置节点ID的过程如下(所有报文中的数字默认都是16进制,00表示保留(不需要发送)或确实是0x0的数据):

(1). 主发COB-ID:0x000;数据80 xx。第一个字节0x80是命令码,表示设置原节点ID为xx(第二个字节)的设备进入配置态;

(2). 主发COB-ID:0x7E5;数据40 xx xx xx xx 00 00 00。第一个字节0x40是命令码,表示切换选中节点状态;第二到第五字节是命令参数,4个xx表示四字节的制造商ID;

(3). 主发COB-ID:0x7E5;数据41 xx xx xx xx 00 00 00。第一个字节0x41是命令码,继续发参数;第二到第五字节是四字节的产品码;

(4); 主发COB-ID:0x7E5;数据42 xx xx xx xx 00 00 00。第一个字节0x42是命令码,继续发参数;第二到第五字节是四字节的修订码;

(5); 主发COB-ID:0x7E5;数据43 xx xx xx xx 00 00 00。第一个字节0x43是命令码,继续发参数;第二到第五字节是四字节的序列号;

(6); 从发COB-ID:0x7E4;数据44 01 00 00 00 00 00 00。第一个字节0x44是命令码;第二个字节表示从节点状态,0表示切换到可操作状态,1表示切换到配置状态;

(7). 主发COB-ID:0x7E5;数据11 xx 00 00 00 00 00 00。第一个字节0x11是命令码,表示配置节点ID;第二个字节表示新配置的的节点ID;

(8). 从发COB-ID:0x7E4;数据11 xx xx 00 00 00 00 00。第一个字节0x11是命令码,表示从节点的反馈;第二个字节为0表示配置成功,否则是错误码;第三个字节是特殊错误码。

(9). 主发COB-ID:0x7E5;数据17 00 00 00 00 00 00 00。第一个字节0x17是命令码,保存配置命令。

(10). 从发COB-ID:0x7E4;数据17 xx xx 00 00 00 00 00。第一个字节0x17是命令码,表示从节点的反馈;第二个字节为0表示配置成功,否则是错误码;第三个字节是特殊错误码。

(11). 主发COB-ID:0x7E5;数据04 xx。第一个字节0x04是命令码,切换全局状态;第二个字节是参数,0x00表示切换到可操作性状态,0x01表示切换到配置状态。

(12). 主发COB-ID:0x000;数据81 xx。第一个字节0x81是命令码,表示重启原节点ID为xx(第二个字节)的设备。

(13). 从发COB-ID:0x700+新配置的节点ID;数据00。这部分其实不属于LSS协议了,而是节点上线报文,见第九节开始部分。

下图是一个具体的例子,将一个出厂节点ID为0x7F的设备,改为0x05的节点ID。例子分为上下两部分,上半部分主要和输入LSS地址查找对应设备有关,下半部分才是修改节点ID部分。

上面是多个节点存在时的节点ID设置过程,如果只有一个节点,那么就不用输入LSS地址了,上图的上半部分可以简化为

(1). 主发COB-ID:0x000;数据80 xx。第一个字节0x80是命令码,表示设置原节点ID为xx(第二个字节)的设备进入配置态;

(2). 主发COB-ID:0x7E5;数据04 01 00 00 00 00 00 00。第一个字节0x04是命令码,表示切换选中节点状态;第二个字节是命令参数,0表示切换到可操作状态,1表示切换到配置状态;

其实,第一步也是相同的,只是第二步大大简化了而已,然后的步骤就同上图的下半部分了。如下图所示例子:

LSS还有一些其它部分的内容,详见CANopen LSS子协议中文翻译.pdf(里面有些小错误)。这里只简单说明设置波特率的报文。

(1). 主发COB-ID:0x7E5;数据13 xx xx 00 00 00 00 00。第一个字节0x13是命令码,表示配置位定时(波特率)参数;第二个参数选择使用哪个位定时表;第三个参数是所选位定时表索引。位定时表为0时,对应使用CiA的标准位定时表,如下图:

(2). 从发COB-ID:0x7E4;数据13 xx xx 00 00 00 00 00。第一个字节0x13是命令码;第二个字节是错误码(包含成功状态);第三个字节是特殊错误码。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值