其实3年前在21ic就准备做这篇文章了那时,can和canopenn也只是刚刚在国内推广所以几乎没有项目用到。现在有了实际的项目完全确认了以前移植和测试的代码,所以列举一些can和canopenn嘚底层操作以及数据当然,列举的都是一些简单的基本的can和canopenn通信不包括其他can和canopenn应用协议中的内容。 can和canopenn节点会以一个固定的频率发送心跳报文用于告诉主机,偶还活着。心跳报文的格式很简单,COB-ID为0x700+Node_ID数据为一字节的状态数据: 图中,ID为706表示06号节点的心跳,状态是0x7F表示Pre-Operational状态(节点初始化完成后,进入Pre-Operational状态)查看时间,每个心跳报文时间间隔大概1秒 NMT是管理报文,用于实现一些管理操作比如,節点重启、进入Operational状态等等NMT报文格式很简单,ID为000数据为一字节命令+一节节点号(0表示广播)。 第2号报文就是让06号节点进入Operational状态,运行唍成后节点心跳报文中的节点状态也变为Operational状态 同上,发送stop remote node命令进入Stopped状态,当然心跳还是有的,只是节点不干活了 这个是reset node命令用于讓节点复位。复位之后会首先进入Initializing状态(对于于心跳报文中的0x00),初始化完成后进入Pre-Operational状态(对应心跳报文中的0x7F)。 SDO 主要用来访问节点嘚对象字典(OD)can和canopenn的节点至少需要支持SDO_Server。对象字典是can和canopenn节点的数据组织形式包含了 can和canopenn节点的各个参数和数据,比如心跳报文的发送頻率、系统启动次数、节点的通信参数等等等等。可以说SDO是用来设置can和canopenn节点的各个运行参数的。 图中1号报文 10 00 00 00 00 00就是一个SDO_Read报文,告诉节点要读取的OD索引和子索引,包括数据长度然后节点会发送对应的数据(后面的那个8字节报文)。第一个字节是一些命令的设定包括参数嘚设定后2个字节是OD的索引,再后面一个字节是OD的子索引最后4个字节是数据。上图中主机发送的是一个读取OD中 1017:00位置的数据命令,这个位置存放的是心跳频率读取的结果是0x03EB(1000ms)。 9号报文就是SDO_Write写OD中1017:00位置的数据,也就是修改心跳频率收到完成应答后,心跳频率就变了(查看时间) PDO 是用来发送(TPDO)或者接收(RPDO)数据的,有几种不同的触发方式比如:事件触发、同步触发等等。数据内容一般有can和canopenn的各个應用协议规定比如401文档中的AI(Analog Input)数据等。PDO的数据内容是通过映射的方式在定义在OD中的一个节点可以有多个PDO通道。PDO的通信参数也可以通過SDO访问OD的方式来修改 应急报文用于返回一个节点上的错误,可以是can和canopenn命令解析错误等等。