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及一些索引数据的初始化,完成这些操作后,程
序进入预操作状态