嵌入式
返回首页

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

2012-11-29 来源:21IC

 引言
  多年来,过程工业一直致力于开发一种单一的、开放的标准对现场的各类设备进行编址。标准的最初目标是用单一的数字标准取代4-20mA标准。当范围扩展到寻址复杂的、高难度的服务时(如:控制器间的高速通讯、大量快速扫描设备间的时间同步)单一标准的开发变得延迟了。同时,通讯技术的成本近几年已经明显的降低,将简单设备直接连接到网络上(而不必考虑SP50现场总线)的成本由此变得经济。简单设备的这种标准要求同现存的120/220VAC和24VDC离散、硬接线I/O标准具有相同级别的互换性。DeviceNet在允许多个复杂设备互连接的同时,允许简单设备的互换性。除了读取离散设备的状态外,DeviceNet还可以报告马达启动器内温度、读取负载电流、改变驱动器加减速速率、或统计前一小时通过传输带传送的包裹计数。
  DeviceNet是一个开放的网络标准。规范和协议都是开放的 ― 供应商将设备连接到系统时,无需为硬件,软件或授权付费。任何人都能以名义上的复制成本(目前:$250USD+邮费)从开放式DeciceNet供应商协会(ODVA)获得DeviceNet规范。任何制造(或有打算制造)DeviceNet产品的公司都可以加入ODVA,并参加对DeviceNet规范进行增补的技术工作组。
  本文设计针对的DeviceNet从设备特性如下:属于DeviceNet group 2 only 从设备;采用Predefine的通讯连接;可通过硬件开关设置125kbps、250kbps、500kbps波特率;可通过硬件开关设置0~63 MAC ID。在软件、硬件设计前应首先进行从设备(泵/阀)I/O需求分析(即profile文档设计),由于篇幅关系本文从略。
  下面就该从设备通讯适配器的硬件和软件设计做一个详细介绍。

一、通迅适配器硬件系统设计
1 功能简介
  DeviceNet是基于CAN总线的一种总线协议标准。因此,DeviceNet从设备适配器硬件首先应实现CAN总线的基本功能,主要包括:报文收发、访问控制及其他物理层的诸多功能。此外,为实现DeviceNet协议,硬件应具有足够大的程序存贮空间,并具有足够快的运行速度,以保证协议程序的顺利执行。

2 硬件原理
  DeviceNet节点硬件主要由以下几部分组成:电源,单片机系统,看门狗及掉电保护电路,CAN控制器SJA1000,CAN收发器82C251,拨码开关及状态LED显示,双口RAM IDT7005,AnyBus接口。总体设计框图见图1。



各部分功能介绍:
电源
  DeviceNet适配器通过总线获取电源,并将电压降到系统所需的5V。该电源电路的电压输入范围为11-25V,输出5V,并具有防止反接和掉点检测功能。硬件采用7805(1.5A)实现电压转换,并采用场效应管IRFD9120防止电源反接对系统造成损害。
单片机
  DeviceNet适配器选用Winbond公司的高性能8位单片机W78E58。W78E58功能与引脚与80C52完全兼容,并提供256字节的内部RAM以及32K字节的Flash EEPROM,从而使系统不需扩展外部程序存贮器便可满足DeviceNet协议程序的容量要求。W78E58最高可在40MHZ的主频下运行,处理速度完全满足DeviceNet节点通信的实时性要求。
为减少芯片的数量及降低硬件成本,本系统只扩展一片8K的双口RAM,其前面7K字节用于外部数据存贮,最后1K用于提供与其它应用电路的通讯接口。

看门狗及掉电保护电路
  采用MAX706芯片,从而减少了复位及电源检测电路所需的元器件数量,该芯片与分离器件相比具有更高的可靠性。MAX706芯片主要有以下功能:
u 提供单片机和SJA1000所需的上电复位、手动复位信号;
u 提供1.6秒的看门狗定时器;
u 具有电源电压检测功能。
WDI为看门狗定时器清零引脚,如果该引脚保持低电平或高电平超过 1.6秒,则Watch Dog输出引脚WDO将变成低电平使系统复位,从而使程序运行更加可靠。由于SJA1000和单片机分别为低电平和高电平复位,因而RESET引脚的输出通过非门连接到单片机的复位端。

CAN控制器SJA1000
  DeviceNet总线报文的收发以及媒体访问控制等都是依据CAN总线协议,而这些协议都要通过CAN控制器加以实现。DeviceNet通信节点选用目前比较流行的PHILIPS CAN控制器SJA1000,由于DeviceNet总线协议采用11位的identifier,因此应使SJA1000工作在Basic CAN模式。其片选、ALE、以及读写等信号分别与138译码器及单片机的相应信号相连;中断信号连接到单片机的外部中断1(P3.3);选用16MHZ晶振。



硬件设计原理图
CAN收发器82C251
  CAN收发器82C251(Transceiver)的主要作用是收发CAN总线上的信号,即,一方面将总线信号转换为CAN控制器所需的信号,另一方面,将CAN控制器的输出信号转化为CAN总线信号。DeviceNet通信节点选用PHILIPS PCA82C251收发器,其TXD、RXD引脚分别与SJA1000的TXD和RXD引脚相连,CANL、CANH引脚分别连接到DeviceNet Connector的2、4端。

拨码开关及状态LED显示
  DeviceNet适配器通过一组拨码开关和两个双色二极管实现节点的MAC地址、波特率设置以及节点和网络状态显示。由于DeviceNet最多支持64个从节点,并且只有三种波特率可供选择,因此只需一个八位的DIP开关便可实现MAC地址和波特率的设置(其中六位用以设置MAC地址,两位用来选择波特率)。对节点和网络状态分别采用一个双色二极管进行指示。由于单片机接口的限制,硬件中通过一片74HC273锁存器扩展了一个输出接口,从而驱动两个双色二极管进行显示。
  硬件中将DIP开关通过上拉电阻接到单片机的P1口,并将其中的高两位用作波特率设置、低六位用于MAC地址选择。将138译码器的片选输出Y3与单片机的写信号相或后连到273的CLK输入端,由此扩展一个输出口用以驱动双色二极管进行状态显示。

双口RAM IDT7005
  DeviceNet适配器通过一个具有中断功能的双口RAM IDT7005提供与其它应用电路的通讯接口。IDT7005具有两套完全独立的数据线、地址线、读写控制线,允许两个CPU对双口RAM的的同一个单元在不同的时间进行读写。具有两套完全独立的中断逻辑,实现两个CPU间的握手控制信号。IDT7005的最高两个字节1FFEH和1FFFH分别兼做两个断口的中断逻辑单元。
  硬件中双端口RAM IDT7005右端口的地址、数据及读写控制线分别与单片机系统的相应信号线相连,中断信号连接单片机的外部中断0(P3.2)。其左端口的地址、数据及读写、中断控制线依据AnyBus的接口标准连接到34针接口的相应管脚。

AnyBus接口
  AnyBus作为一种通用的现场总线通讯节点提供了与其他应用电路之间进行数据交换的接口标准,并对接口的引脚进行了严格的定义。

二、 DeviceNet总线通信协议
  DeviceNet协议规范是描述DeviceNet设备之间实现连接和交换数据的一套协议。另外,为了实现不同厂商生产的设备之间的互交换性和互操作性,ODVA维护并根据工业领域的需要不断更新和修改该标准。
  在DeviceNet规范卷I的第3章、第4章和第5章中定义了DeviceNet通讯协议。这些章节分别详细介绍连接,信息协议和与通讯相关的对象。
  使用DeviceNet的应用同标准或应用特定对象相结合产生所谓的设备描述。设备描述是从网络的角度对设备的定义。DeviceNet规范卷II的第6章对对象库进行了详细的描述。DeviceNet规范卷II的第3章是设备描述库。
  DeviceNet支持选通,查询,周期,状态改变和应用触发的数据通讯方式,用户可根据设备性能和应用要求选择主/从、多主和点对点或三种方式组合的配置。数据通讯方式的选择,可以明显加快系统的反应时间。流行的DeviceNet应用采用标准的,预定义的连接组,使设备在主/从连接组之下工作。

DeviceNet是基于连接的网络
  DeviceNet中的连接提供在多种应用之间交换信息的路径,当建立一个连接时,与连接相关的信息的传送就会分配一个标识符,称为连接标识符(CID, Connection Identifier)。如果某个连接需要双向数据交换,则应该分配两个不同的连接标识符。
DeviceNet通讯协议是基于连接概念的协议。要想同设备交换信息,就必须先与它建立连接。要想建立一个连接,每个DeviceNet产品,都必须具有一个未连接信息管理器(UCMM)或一个未连接埠,二者都是通过保留某些可用的CAN标识符实现其功能的。DeviceNet规范卷I的第4章详细介绍了UCMM。
  当用UCMM或未连接端口建立一个显式报文连接时,这个连接可用于从一个节点向其它节点传送信息,或建立附加的I/O连接。一旦建立了连接,就可以在网络设备之间传送I/O数据。此时,DeviceNet I/O报文的所有协议都包含在11位的CAN标识符中,其它部分都是数据。
  11位的CAN标识符用来定义连接ID。DeviceNet将11位的CAN标识符分为4组,前三组的连接ID包括了6位的媒体访问控制标识符(MAC ID)以及信息标识符(Message ID)。信息组的定义如下图所示,组4信息用于离线通讯。设备可以是客户机或服务器或兼之。客户机和服务器可是生产者,消费者或兼之。在典型的客户机设备中,它的连接将产生请求和消费响应。在典型的服务器设备中,它的连接将消费请求和生产响应。DeviceNet提供几种该模式的变形。某些客户机或服务器中的连接只能消费报文。这些连接将是周期或状态改变报文的目的地。类似的,某些客户机或服务器中的连接只能生产信息。这些连接是周期或状态改变报文的源,使用周期和状态改变连接可以大幅度降低对网络带宽的要求。


DeviceNet具有4个定义的信息组

  通过设计,DeviceNet系统中的节点能够对自己的标识符进行管理。这些标识符交错分布在整个范围内。所有的节点都有一个完整的它们能获得的报文优先权范围,而与它们的MAC ID无关。重复MAC ID算法保证了CAN标识符的唯一性,而不需要网络集中工具或记录。与此相关的问题是重复节点的检测。因为DeviceNet的设备地址是在CAN的标识场中,CAN的标识场提供了检测设备地址重复的机制。防止地址重复优于问题发生后再解决问题 其它基于CAN的网络则没有考虑到这些问题。

DeviceNet的报文传送
  DeviceNet应用层定义如何分配标识符(控制优先权),如何用CAN数据场指定服务,传送数据以及判断它的含义。报文在通讯网络中流动的方式是很重要的。老式的通讯技术是由具有特定源和目的地址的报文组成的。DeviceNet使用更为有效的生产者/消费者模式,取代了传统的源/目的的传输方式。该模式要求对报文打包,使它具有数据标识场。标识符还提供解决多级优先权(仲裁中使用)的手段,以便更高效传送I/O 数据,并供多个消费者使用。
  带有数据的设备用正确的标识符在网络上发送数据。所有需要数据的设备在总线上监听报文。设备通过对识别标识符来决定是否接受该报文。采用生产者 ― 消费者模式,报文将不再专属于特定的源或目的。控制器发出的一个信息,用很窄的带宽就可以供多个马达启动器使用。
  DeviceNet定义了两种不同类型的报文,称作I/O报文和显式报文。I/O报文 适用于实时性要求较高和面向控制的数据。I/O报文数据帧中的8位数据场不包含任何与协议有关的位,只有当I/O报文为大报文经过分割后形成的I/O报文片段时,数据场中有一位由报文分割协议使用。连接标识符提供了I/O报文的相关信息,在I/O报文利用连接标识符发送之前,报文的发送和接受设备都必须先进行设定。设定的内容包括源和目的对象的属性,以及数据生产者和消费者的地址。显式报文 则适用于两个设备间多用途的点对点报文传递,是典型的请求-响应通讯方式,常用于节点的配置、问题诊断等。显示报文通常使用优先级低的连接标识符,并且该报文的相关信息包含在显示报文数据帧的数据场中,包括要执行的服务和相关对象的属性及地址。

预定义的主/从连接组
  DeviceNet提供了一个功能很强的应用层协议,允许动态配置设备间的连接。但考虑到有些设备根本不需要也没有资源去使用这一强大功能,DeviceNet指定了一套称为预定义主/从连接组的连接标识符,用来简化主/从结构中I/O和配置型数据的传送。
  许多传感器和执行器要实现的功能在设计时就已经预先决定了(如,感受压力、启动马达等等),因此这些设备将要生产和/或消费的数据的类型和数量在上电前就已经知道了。这些设备通常提供输入数据或请求输出数据和配置数据。预定义主/从连接组可以满足设备的这些要求,它提供的连接对象的全部配置在设备上电时就完成了。在启动数据流时,主机设备唯一必须执行的一个步骤就是要广播对从机内该预定义连接组的所有权。
  信息组2用于定义这些标识符组2信息的一个明显不同之处在于MAC ID没有指定为源MAC ID,允许使用目的MAC ID。该类连接的使用有严格的规则,以防止总线上出现重复CAN标识符。目的MAC ID的使用允许被集中的设备和必须同许多节点通讯的设备(主机)向其它节点借用标识符。此外,预留了MAC ID和信息ID区。从而允许组ID和MAC ID进入CAN标识场最高的8个有效位。这点非常重要,因为许多低成本,8位的CAN芯片只能硬件过滤前8位。目的MAC ID的使用进一步体现了允许设备利用硬件进行过滤的优点。另一主要的优点就是预定义主/从组大幅度简化了连接的建立,只需要用很少的信息来建立和运行I/O连接。预定义组包括一个显式报文连接和可选的几个不同的I/O连接,包括位选通命令/响应,查询命令/响应,状态改变和周期。

DeviceNet对象模型与设备描述
  对象模型 为管理和实现DeviceNet产品组件的属性(数据),服务(方法或步骤)和行为提供了一个模板。模型为每个属性提供了由4个数字组成的寻址方案。它们分别是节点地址(MAC ID),对象类标识符,实例编号和属性编号。这四级地址与显式报文连接相结合,将数据从DeviceNet网络上的一点传送到另一点。下表列出四个地址组件的范围:

DeviceNet地址组件的范围


下图是一个通用DeviceNet设备的对象模型:

 
 
  标识对象DeviceNet产品一般都有一个标识对象实例(1实例)。此实例包含各种属性,如供货商ID、设备类型、产品代码、版本、状态、序列号、产品名称和说明。标识对象要求的服务是Get_Atrribute_Single和Reset。
  报文路由对象 DeviceNet产品一般都有一个报文路由对象实例(1实例)。报文路由对象向其它对象传送显式报文。一般在DeviceNet网络中它不具有外部可视性。
  DeviceNet对象 DeviceNet产品一般都有一个DeviceNet对象实例(1实例)。该实例有下列属性:节点地址或MAC ID ,波特率,总线关闭,总线 关闭计数器,单元选择和主机的MAC ID 。唯一要求的服务是Get_Atrribute_Single。
  汇编对象 DeviceNet产品一般具有一个或多个可选的汇编对象。这些对象的主要任务就是将来自不同应用对象的多个属性(数据)组合成一个能够随单个信息传送的属性。
  连接对象 DeviceNet产品一般至少包括两个连接对象。每个连接对象代表DeviceNet网络上两节点间虚拟连接中的一个端点。两种连接类型分别称为显式报文连接和I/O报文连接。显式报文包括属性地址,属性值和服务代码来描述所请求的行为。I/O报文只包含数据。I/O报文中,所有有关如何处理数据的信息都包含在与该I/O报文相关的连接对象中。
  参数对象 在带有可配置参数的设备中都用到了可选的参数对象。将为每个可配置的参数引入一个实例。参数对象带有设备配置参数,提供访问所有参数的标准组态工具。参数对象的配置选项属性可以包括数值,量程,文本和限制等。
  应用对象 配备了汇编对象或参数对象的设备通常至少应包含一个应用对象, 卷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 (b<700)
{for (c=0;c<10;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;

send (Sbuffer,6);
}
}
break;
case 0x85;
{if (buffer[6]= =0x02)
Sbuffer[0]=0x85;
Sbuffer[1]=0x64;
Sbuffer[2]=0x8e;
Sbuffer[3]=0x00;
Sbuffer[4]=0x00;
send (Sbuffer,6);
}
else
{Sbuffer[0]=0x85;
Sbuffer[1]=0x64;
Sbuffer[2]=0x00;
Sbuffer[3]=0x8e;
Sbuffer[4]=0x01;
Sbuffer[5]=0x00;
send (Sbuffer,6);
}
}
break;
case 0x87;
Sbuffer[0]=0x85;
Sbuffer[1]=0x64;
Sbuffer[2]=0x00;
Sbuffer[3]=0x90;
Sbuffer[4]=0x50;
Sbuffer[5]=0x00;
send (Sbuffer,6);
break;
case 0xA0;
Sbuffer[0]=0x78;
Sbuffer[1]=0xA1;
Sbuffer[2]=0x07;
send (Sbuffer,3);
break;
case 0xA1;
Sbuffer[0]=0x78;
Sbuffer[1]=0xA1;
Sbuffer[2]=0x07;
send (Sbuffer,3);
break;
}
}
void main ()
{
config1 ();
XBYTE[0x4000]=0x22; //operation mode
While (1)
{;}
}

3 DeviceNet通讯适配器的收发中断和时钟中断的设计
  CAN控制器和微处理器的数据交换可以使用中断方式和周期轮询的方式。从响应速度和执行的效率来讲,我们的应用环境使用中断的方式。因此我们必须编写自己的收发中断处理函数,其功能是将CAN控制器缓冲区中的报文拷贝到一个临时的全局缓冲区,并将该缓冲区作为高层协议处理和底层收发处理的一个接口,这样的设计具有良好的可扩展性。如果将来使用其它厂家的CAN控制器,所做的修改也仅仅是改动一些与具体硬件相应的几个底层函数。我们只要定义好互相通讯的接口,就可以将软件和硬件进行分离,在团队开发的环境中可以加快工作的进度和效率。
  另外,通讯协议中经常要用到一些定时的功能,因而我们也需要在底层编写一个定时中断处理程序,该函数使用一个硬件定时器,以一个最小的计时单位周期性的为上层应用提供计时状态。


图2 SJA1000的初始化流程

4 DeviceNet通讯适配器的报文收发程序和分段服务
  这里所讲的报文收发协议对不同的通讯协议有不同的定义。另外,CAN的数据长度不能超过8个字节,如何支持大于8个字节的报文要涉及到分段服务。分段协议信息由一个字节组成,其中高2位表示分段的类型,低6位作为分段的计数器,用来标识每个数据包,其计算方式是:fragmentCount=(fragmentcount+1) mod 64。下面是具体的分段的类型:


  因此,在程序的设计中应当加入对分段服务协议的支持。
  对于发送报文的处理与接收的过程是一个逆向过程。需要注意的是编写程序的时候要严格按照DeviceNet协议规范的定义,否则将产生不可预测的错误,为将来的协议一致性测试和底层调试都带来许多麻烦。

5 DeviceNet通讯适配器的主程序的设计
  软件由头文件、初始化程序、功能子程序和主程序组成。
软件的组成结构提供了硬件和软件升级的方便。软件中将与主处理器、CAN控制器等硬件接口的部分比较独立地设计,而主程序和功能子程序主要集中于协议的完成。对将来的硬件改型和可能的协议修改都提供了较大的方便。
  软件以Franklin C51语言编写,通过伟福E51L单片机开发装置进行调试。
软件结构图如下:



5.1 软件功能分解
  软件由头文件、初始化程序、功能子程序和主程序组成。其功能分解如下:
  头文件:定义所有的参数、类结构和函数,定义要使用的硬件资源(如定时器和寄存器等)变量名称;
初始化程序:完成对主处理器的内存及硬件(如堆栈、定时器等)初试化,完成CAN控制器的初始化。
功能子程序:详见各模块介绍。
主程序组成:主控制流程。

5.2 软件各模块功能详述
  模块按以下四个部分来介绍:头文件,初始化程序,功能子程序,主程序
  说明:泵和阀的实现程序非常类似,两者只相差一些参数,故此处以泵的源程序作为例子进行各个程序段的分析和说明。(详见源程序)

5.2.1 头文件
其主要操作为:
包含(include)要使用的其它头文件: reg51.h 51系列寄存器头文件
absacc.h 51系列硬件资源头文件
string.h C语言的字符操作头文件
定义(define)要使用的用户自定义数据类型;定义类(class)ID;定义连接的类型;
定义各实例(instacne)ID和定时器数量;定义全局状态(status)字对应位的内容;
定义全局事件(event)字对应位的内容;定义DeviceNet错误代码和附加错误代码;
定义DeviceNet服务代码;定义分段(fragment)值;定义连接状态;其它附加的定义;
  类结构定义: Identity,DeviceNet,Connection,Message Router,Assembly,Discrete Output,
Analog Input,Analog Output

5.2.2 初始化程序
  其主要操作为:SJA1000初始化;定时器初始化;各结构对象初试化;

5.2.3 功能子程序
  其主要操作为:具体定义在主程序中调用的各子程序;双口RAM中断子程序;定时器中断子程序;

5.2.4 主程序
  当实现所有的功能模块以后,最重要的是如果构造一个有机的主程序模块,将这些零散的模块组织起来,进行系统的初始化工作。另外还要设计一个优化的循环体周期性的执行以对DeviceNet网络上的报文产生动作。
  因为我们实现的是一个从站适配器,一般在轮询的情况下只对主设备的请求报文产生相应的应答,而不会主动发送报文,除了上电时的重复MAC ID例行检测。如何构造循环体是关键,我们这里采用了事件的方式,主循环体周期对网络事件的不同可能的状态产生动作。程序中定义不同的网络事件,主程序循环体对代表这些事件的标志位不停的轮询,当某个标志位因网络事件的触发而被置1的时候,主程序就进入相应的子程序进行对应事件的操作。操作完毕之后清楚标志位,退回到主程序循环中继续轮询所有的事件标志位。
其主要操作为:设置数据缓冲区;定义全局变量;开时钟;开中断;进行主循环;

结束语
  由本通讯适配器已于2002年3月13日在日本京都ASTEM RI通过ODVA一致性测试,其FCS已经成功的应用于2001年第2届北京中国国际现场总线技术交流会暨展览会,第3届上海国际工业博览会,吴忠仪表智能调节阀,东莞垃圾焚烧发电厂中的给水控制系统中。由于采用现场总线技术,取得了显著的经济效益。
进入嵌入式查看更多内容>>
相关视频
  • PX4固件二次开发课程

  • RISC-V嵌入式系统开发

  • NuttX Workshop 2024

  • 自己动手写操作系统

  • SOC系统级芯片设计实验

  • 自己动手做一台计算机

最新器件
精选电路图
  • 永不缺相启动运行的电动机控制电路

  • MT3608构成3.7V转12V的升压电路图

  • 运算放大器IC741的基本工作原理及在电路中的实现方式

  • 基于M66T旋律发​​生器的电路图解析

  • 基于CA3193的热电偶放大器电路

  • 基于TDA1554的立体声放大器电路

    相关电子头条文章