新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 用于卷烟机组的CAN总线实时监听器的设计与实现

用于卷烟机组的CAN总线实时监听器的设计与实现

作者:时间:2012-02-22来源:网络收藏

引 言
  
卷烟生产中的主要包括两大部分,MLP,用于为和检测系统提供操作和显示的装置,它包括一个工业PC和一个监视器。以及下位机SRP,包括传感器,调节装置或者检测装置。SRP主要包括四种结点1)SPS,2)HIP,3)CIS,4)SRM。和下位机各结点之间的通信是频繁的,数据对象众多,数据种类也繁多,包括参数上传,下传,指令,域数据等等,所以在这之中,难免会因为操作人员操作失误或者控制器本身的原因导致错误,但错误发生的时候需要尽快的分析,发现错误,解决错误。因此我们需要建立一个可靠的错误判断机制。本文所讨论的CANBUS实时监听器正是应这种需求而产生的。工作人员根据实时监听器所捕获的并且友好显示的线路上的适时数据便可分析出是哪一方出了问题,出了什么类型的问题。这对安全生产,准确控制起了举足轻重的作用。

(一) 硬件实现
  
在实时监听器的实现中,我们选择采用了周立功公司的PCI-9810非智能CAN接口卡作为硬件接口用于接收捕获上的传输数据。如下图
  
PCI-9810非智能CAN接口卡是具有高性能价格比的CAN-bus总线通讯适配卡,它使PC机方便的连接到上,实现CAN2.0B协议的连接通讯。它是一款采用专用PCI接口转换芯片设计的非智能型CAN接口卡,即插即用,符合PCI2.1规范。它采用中断接收方式,可最大限度减轻占用PC的负荷;具有最多8帧的数据缓冲区。另外我们采用了周立功公司提供的Windows驱动程序升级版PCI-9810BWDM驱动文件将其驱动。


(二) 界面软件实现
  
界面软件实现主要包括四大方面,1)软件平台的选择,2)对硬件接口CAN卡的使用,3)利用接口接收CANBUS线路上数据的实现,4)所接收数据的处理(主要是判断和显示)的实现。
  
〈1〉软件平台的选择—DELPHI

系统的开发可利用多种程序设计语言,如DELPHI,VB,VC,PB等语言都是面向对象的程序设计语言,但把几者相比较,DELPHI是唯一一套能够同时适用于开发数据库应用、网络及WEB 应用等所有软件的高效率开发环境,且第三方控件多,开发比较快,且设计界面比VB,VC,PB 灵活。基于以上因素,考虑到所要监听CANBUS线路的传输数据信息量大、种类多,以及信息之间相对独立,又有关系且必须备有优良的图形显示等特点,我们选择DELPHI作为软件开发平台。
  
〈2〉对硬件接口PCI-9810的操作的实现
  
在DELPHI程序中,我们是通过调用周立功提供的通用VCI动态链接库来实现对硬件接口PCI-9810的操作的,该动态链接库提供了界面软件能在windows下运行必需的代码和其他资源,其中主要包括十个接口函数如设备相关函数和CAN通讯相关函数以及相关的数据结构的定义。把动态链接库文件夹添加到项目文件夹,然后把库源文件添加到程序代码的应用文件单元即可实现对动态链接库的调用,也就实现了对PCI-9810卡的打开,关闭,启动,复位,收发数据等操作。
  
〈3〉CANBUS线路上数据的实时接收
  
CANBUS线路上的数据对CAN卡来说有着不期性,所以要能对数据实时,准确的接收,必须要通过程序实现一种功能即线路上一旦有数据,就能捕获。对于此,我们采用的方式是利用多线程。即在程序中专门开辟一个线程用于对线路的监听,接收。
  
关于多线程
  
在32位的windows系统中,系统可以同时运行多个进程,一个调入内存并准备执行的应用程序称为一个进程,它由装入内存的程序代码和操作系统及由此创建的应用程序执行环境组成,进程就是应用程序的运行实例。每个进程都有自己私有的虚拟地址空间和动态分配的内存,以及文件,线程和其它模块。每个进程都有一个主线程,但可以建立另外的线程。进程中的线程是并行执行的,每个线程占用CPU的时间由系统来划分,可以把线程看成是操作系统分配CPU时间的基本实体。每个进程也可以同时执行多个线程并由系统不停地在各个线程之间切换。
  
多线程的DELPHI实现
  
虽然Windows 提供了比较多的多线程设计的API 函数,但是直接使用API 函数一方面极其不方便,而且使用不当还容易出错。为避免这个问题,我们采用了DEPHI所提供的方法即继承TThread类产生线程对象。TThread由DELPHI的VCL类库提供用于线程编程。在Tthread类中封装了windows中关于线程机制的API函数,继承TThread类产生的线程对象就代表了实际程序中的一个线程。线程对象通过封装使用线程所需的内容大大简化了多线程问题的处理。另外,在DELPHI中,Tthread在Classes单元中声明,直接从Tobject继承下来的,因此,它不是组件。Tthread是个抽象类,所以不能创建Tthread的实例,而只能创建其派生类的实例。在本程序中利用Ttread类来编写多线程的步骤如下
  
(1)从Tthread类派生出一个新的线程类。即建立的TreceiveThread。
  
(2)创建线程对象。即在Types里面定义thread1:TreceiveThread。
  
(3)在DELPHI自动生成的用于保存派生类代码的新的单独的文件中重载Execute过程,在该过程中将对CAN线路上的数据实时接收并调用对接收到的数据进行处理的基本显示和分类显示函数。在Execute过程中使用了repeat…..until语句来判断过程是否结束。
  
(4)如果Execute过程执行完毕,则该线程就结束了,并释放线程占用的栈空间。
  
〈4〉对所接收的数据进行处理
  
对数据的实时处理包括两方面:1)将接收到的数据桢按照接收数据的数据结构完全显示,这包括桢类型,桢格式,桢ID,桢数据等等。2)将数据进行更深一层的分析判断出数据的真实含义,并将其填入对应的文本框或者画出对应的状态图等等。
  
(1)对于第一种基本显示,我们采用的是用DELPHI提供的listbox控件进行
  
滚动显示,listbox的容量足够本显示的需要,另外,我们还添加了一个按钮控件用于按照操作人员的需要随时清除listbox里面的内容。
  
(2)对于第二种分类显示。对于不同的数据,我们将用不同的分析处理方法进行显示。根据数据的现实含义,主要分为1)上,下传参数。2)域请求和域数据,3)下传指令和上传消息。下面将分别介绍处理方法:

1 利用数据库系统进行上,下传参数的显示
  
在CAN线路上传输的参数不仅多达近200种,而且有上传和下传之分,可见所要显示的量之大,加上上下传的参数有着相同的数据结构,所以我们采用查询预先建立好的数据库的方法来进行显示。
  
关于数据库系统数据库系统为我们提供了一种把与我们的工作和生活紧密相关的信息集合在一起的方法。它还提供了在某个集中的地方存储和维护这些信息的方法。数据库系统主要由三大部分组成:数据库管理系统,数据库应用程序,数据库。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭