1 CANopen是一种架构在控制局域网路
(Control Area Network, CAN)上的高层通讯协定,其协议在嵌入式系统及单片机上广泛使用,是工业控制常用到的一种现场总线。依靠CANopen协议集的支持,可以对不同的从站设备通过总线进行配置和系统重构。相信在不久的将来随着国内对CANopen协议的研究深入,CANopen协议会在各个领域有广泛的应用。
CANopen 是OSI模型中的网络层以上 (包括网络层)的协定。
CANopen 支持网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的传送。数据的传输和接收都基于CAN总线。如图1,通常多个从站设备靠CANopen网络传输数据给一个CANopen主站设备。
CANopen需要有对象字典,SDO(服务数据对象)处理功能,PDO(过程数据对象)处理功能,定时器,NMT(网络管理)处理功能等。
2 CANopen对象字典介绍及设计
对象字典(od:object dictionary)是CANopen协议的核心。对象字典(od:object dictionary)是一个有序的对象组;每个对象采用一个16位的索引值来寻址,为了允许访问数据结构中的单个元素,同时定义了一个8位的子索引。通过接收主站发送的SDO(服务数据对象)报文,可以设置从站的对象字典,主要对象字典请参见表1。从站在做事件处理时通常会读取对象字典,根据对象字典里的数据进行事件处理。
譬如从站的1017索引是记录从站发送心跳包的时间间隔。当从站程序运行时并且从站是准备、停止、运行状态时,程序会查找1017索引的0号子索引里的数据进行处理。如果里面有数据的话(假设数据为2000),程序则会根据数据所设置的时间通过定时器判断来每2000毫秒发送心跳包。
表1 从站主要对象字典介绍
索引:对象 16 位元的位址。数据的类型:一个代表对象的类型,可以是阵列、纪录或只是一个变量。类型:变量的类型。属性:提供此是否可读/可写的资料,有下列四种:可读/写、只读、唯写、只读常数。
以下是建立6003索引的代码案例,并且里面的数据是(2.78593)*100000的代码片
UNS32 AIdata=(2.78593)*100000;//要写入索引数据
static UNS8 highestSubIndex_6003 = 0; // 子索引为:1个(从0开始计数)
subindex Index6003[] = {
{RW,uint32,sizeof(UNS32),(void*)&AIdata}
};//建立索引的读写属性,数据类型,数据大小,索引数据
3 NMT节点管理介绍及设计
NMT(网络管理, Network management)
会定义(设备内部)从站的状态变更命令(如启动设备或停止设备)、侦测远端设备故障情形等。通常从站都由主机通过NMT报文来启动、停止和重启。每一个从站还必须配有一个单独的设备标识符,即从站节点ID。(从站节点ID一般在程序启动后,节点初始化状态时设置。)
节点可分为4种状态,初始化状态(Initialisatio),预操作状态(Pre_operational),操作状态(Operational)和停止状态(Stopped)。主站发送来的NMT格式一般为00 00 01 05,其中00 00是NMT功能码,代表主站发来的是NMT报文,01是要将从站节点设定为操作状态(参考表2),05是从站节点的ID。
表2 状态码表
当程序启动或者复位,一开始都是初始
化状态,此状态会进行节点内部设置,如设置从站节点ID及一些索引数据的初始化,完成这些操作后,程
序进入预操作状态,在预操作状态下,主站通常会通过SDO报文设置从站对象字典,包括心跳时间的设定,同步功 CANOPEN从站协议在stm32f103zet6单片机上的实现-给人_文库下载http://www.wenkuxiazai.com/doc/90842bd76bec0975f565e20c-2.html 能设置,数据存储映射设置等,当设置完毕后,会发送NMT节点管理报文将从站设为操作状态,此时从站节点如果已经设
置了同步功能,当从站节点收到主站发送过
来的同步报文后(通常是收到的报文是00 80 ,需要从站根据1005对象字典内的数据来确定可识别的同步报文ID,若数据为00 80,那么收到00 80的报文后发送从站状态数据)会返回目前从站的状态数据。
NMT主要涉及的代码为: proceedNMTstateChange(Message *m)函数:
此函数主要功能是根据主站发送的设定状态码来设置从站节点的状态,代码片段如下:
if( ( (*m).data[1] == 0 ) || ( (*m).data[1] == bDeviceNodeId ) ){//判断报文是否是发给本从站
switch( (*m).data[0]){ //解析报文 case NMT_Start_Node:
if ( (nodeState == Pre_operational) || (nodeState == Stopped) )
nodeState = Operational; break;
case NMT_Stop_Node:
if ( nodeState == Pre_operational ||nodeState == Operational )
nodeState = Stopped; break;
case NMT_Enter_PreOperational:
if ( nodeState == Operational || nodeState == Stopped )
nodeState= Pre_operational; break;
case NMT_Reset_Node: nodeState = Initialisation; break;
4 心跳功能介绍及设计
所谓“心跳”,指的是主站/从站之间的一种通信。采用心跳机制的好处在于,如果从站设备发生故障(如断电,重启等),会停止发送心跳报文,若主站一段时间内没有收到心跳报文,主站设备就会检测到从站发生了故障。(心跳报文:CANopen设备将根据主站给从站设置心跳时间间隔参数(索引1017h)的周期发送心跳报文。)
Stm32f103zet6单片机内置定时器用于计算心跳报文发送间隔,假设对象字典设置的数据报文发送间隔为