新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于DeviceNet总线的从设备通迅适配器设计

基于DeviceNet总线的从设备通迅适配器设计

作者: 时间:2012-11-29 来源:网络 收藏

  参数对象 在带有可配置参数的设备中都用到了可选的参数对象。将为每个可配置的参数引入一个实例。参数对象带有设备配置参数,提供访问所有参数的标准组态工具。参数对象的配置选项属性可以包括数值,量程,文本和限制等。
  应用对象 配备了汇编对象或参数对象的设备通常至少应包含一个应用对象, 卷II的第六章DeviceNet对象库中有大量的标准应用对象。
  设备描述(Device Profiles) DeviceNet规范不仅仅是一个物理连接协议规范。它通过定义标准的设备模型促进不同厂商设备之间的互操作性。属于同一设备模型的所有设备都必须支持共同的标识和通讯状态数据。设备描述是针对各种设备而定义的。设备描述中包括设备各种特定的数据。符合设备类型描述的多个供货商提供的简单设备(例:按钮,马达启动器,光电池,气动阀执行器)在逻辑上是可互换的。

设备描述包括下列各项:
l 设备对象模型定义-定义设备对象模型如上图所示。通常用表格列出设备中存在的所有对象类,各类中的实例数,各个对象如何影响行为,以及每个对象的公共接口。
l 设备I/O数据格式定义-通常包含用于简化和加快数据传输的汇编对象的定义,汇编对象包含所需要的数据组件的地址(类,实例和属性)。
l 设备可配置参数的定义和访问这些参数的公共接口。该信息包含在电子数据文文件(EDS)中,EDS包含在设备的用户文件中。
DeviceNet规范定义了一个电子数据文文件(EDS),EDS是一个简单文件格式,供货商可以将产品的特殊信息提供给其它供货商。这样可以具有友好的用户配置工具,可以很容易的更新,无需经常修正配置软件工具。
  上面只讲述了DeviceNet协议规范的概貌,DeviceNet协议规范还是相当复杂的,整个协议规范有1000多页,有兴趣的读者可到ODVA官方网站下载。只有对协议规范有一定深度的理解后,才可以着手思考如何开发基于DeviceNet协议适配器的软件系统。

三、 软件系统设计
  下面主要介绍通讯协议的设计,软件的实现是以DeviceNet协议规范的2.0版本为指导的。不同的应用有不同的具体实现,本文只给出设计的原理和指道思想及原则。
1 DeviceNet通讯设备的上电状态流图
每个设备上电以前都有一个例行的状态流转过程,该过程描述了设备能够在DeviceNet上通讯之前必须完成的以下工作,例如重复MAC ID检测等;以及对设备通讯产生影响的网络事件。



DeviceNet状态流图
  上图是DeviceNet设备上电后的状态流转图,其中一共有4个状态:发送重复MAC ID检测报文状态,等待重复MAC ID检测报文状态,在线状态,通讯出错状态。设备在各个状态之间的流转是根据网络的事件情况,如下所示:
网络事件/状态转换关系



2 CAN芯片的初始化
  建立在CAN总线的通讯之前要预先有一些初始化过程。一般,独立式CAN芯片SJA1000在上电后或者上电后软件功能的重置时要初始化一下工作寄存器。当系统上电后,处理器首先运行自己的特殊初始化过程,然后再进入SJA1000的连接建立过程(SJA1000的17号管脚获得一个Reset低电平脉冲,并进入Reset模式)。在初始化SJA1000的寄存器之前,主微处理器应该检测Reset的mode/request标志,如果SJA1000已经是Reset模式,因为所有的寄存器只能在Reset模式下进行写操作,所有的寄存器都将获得的相应的配置信息。
  当完成所有的初始化工作后,SJA1000就进入工作(Operation)模式,并且使CAN控制器的中断功能有效。SJA1000的初始化流程如图2所示。
  下面是一段用C51编写的SJA1000初始化及一个模拟发送、接收过程的程序。
  程序说明:主程序首先对SJA1000进行初始化,config1(),把接收中断打开;然后等待。
  当监测到网络上有数据进入SJA1000的buffer时,进入中断服务程序service_int1()interrupt 2
  using 1,并把接收数据放入buffer数组中。
  首先判断是否该数据是针对5号节点的,如果不是,则丢弃,否则接收。
  判断收到的10个数据属于哪一类,根据逻辑发送相应响应。
发送程序send(UIN*value,int number)中,当发送缓冲区为空,则将需要发送的数据(在Sbuffer中)发给Master设备。
include
include
define UINT unsigned int
UINT a;
UINT buffer[10];
UINT Sbuffer[6];
UINT b=0;
int i;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_3=P1^3;
void config1() //对SJA1000进行初始化
{a=0;
XBYTE[0x4000]=0x01; //复位模式
XBYTE[0x4004]=0x11; //接收中断使能,wake_up中断使能
XBYTE[0x4005]=0xFF; //Accept Mask Register设置
XBYTE[0x4006]=0x00; //Bus Timing 0
XBYTE[0x4007]=0x1C; //时钟周期的设置
XBYTE[0x4008]=0xFA; //输出控制寄存器
XBYTE[0x401F]=0x48; //clock divider
EA=1;
EX1=1;
}
void send(UINT*value,int number)
{int i;
do
{
}while(XBYTE[0x4002]4= =0); //发送缓冲区为空,才能继续发送
for(i=0;iXBYTE[0x400A+i]=value[i]; //将发送的内容放入缓冲区
XBYTE[0x4001]=0x01; //发送命令
P1_0=!P1_0;
P1_1=0;
P1_3=!P1_3; //灯闪烁,以说明在发送中
XBYTE[0x7fff]=P1;
}
void service_int1() interrupt 2 using 1 //接收中断服务程序
{
UINT count;
UINT Status;
int c;
Status=XBYTE[0x4003]; //读一次则清中断
if (b700)
{for (c=0;c10;c++)
{buffer[c]=XBYTE[0x4014+c]; //接收信息放入buffer中
XBYTE[0x0000+10*b+c]=buffer[c];
}
b++;
}
XBYTE[0x4001]=0x04;
if (buffer[0]= =0x85)
switch (buffer[1]) //对buffer内容进行判断,决定response内容
{
case 0xc6;
Sbuffer[0]=0x85;
Sbuffer[1]=0x63;
Sbuffer[2]=0x00;
Sbuffer[3]=0xcb;
Sbuffer[4]=0x00;
send (Sbuffer,5);
break;
case 0x86;
{if (buffer[7]= =0x00)
Sbuffer[0]=0x85;
Sbuffer[1]=0x63;
Sbuffer[2]=0x00;
Sbuffer[3]=0xcb;
Sbuffer[4]=0x00;
send (Sbuffer,5);
}
else
{Sbuffer[0]=0x85;
Sbuffer[1]=0x64;
Sbuffer[2]=0x00;
Sbuffer[3]=0x94;
Sbuffer[4]=0x0e;
Sbuffer[5]=0xff;
晶振相关文章:晶振原理
上拉电阻相关文章:上拉电阻原理


评论


技术专区

关闭