关键字:卷烟机组 CANBUS 实时监听器 DELPHI 多线程 数据库
引 言
卷烟生产中的卷烟机组主要包括两大部分,上位机MLP,用于为控制系统和检测系统提供操作和显示的装置,它包括一个工业PC和一个监视器。以及下位机SRP,包括传感器,调节装置或者检测装置。SRP主要包括四种结点1)SPS,2)HIP,3)CIS,4)SRM。上位机和下位机各结点之间的通信是频繁的,数据对象众多,数据种类也繁多,包括参数上传,下传,指令,域数据等等,所以在这之中,难免会因为操作人员操作失误或者控制器本身的原因导致错误,但错误发生的时候需要尽快的分析,发现错误,解决错误。因此我们需要建立一个可靠的错误判断机制。本文所讨论的CANBUS实时监听器正是应这种需求而产生的。工作人员根据实时监听器所捕获的并且友好显示的线路上的适时数据便可分析出是哪一方出了问题,出了什么类型的问题。这对安全生产,准确控制起了举足轻重的作用。
(一) 硬件实现
在实时监听器的实现中,我们选择采用了周立功公司的PCI-9810非智能CAN接口卡作为硬件接口用于接收捕获CAN总线上的传输数据。如下图
PCI-9810非智能CAN接口卡是具有高性能价格比的CAN-bus总线通讯适配卡,它使PC机方便的连接到CAN总线上,实现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种,而且有上传和下传之分,可见所要显示的量之大,加上上下传的参数有着相同的数据结构,所以我们采用查询预先建立好的数据库的方法来进行显示。
关于数据库系统 数据库系统为我们提供了一种把与我们的工作和生活紧密相关的信息集合在一起的方法。它还提供了在某个集中的地方存储和维护这些信息的方法。数据库系统主要由三大部分组成:数据库管理系统,数据库应用程序,数据库。
数据库系统的DELPHI实现 (1)建立数据库,在本项目中,我们是利用Microsoft Access 建立了一个关系数据库(由若干表组成的数据库)。其中包含了一张表,该表的字段分为id表示用以判断的字符串,以及location表示参数值应填的文本框代号。(2)在应用程序中要实现对所建立的数据库的访问需要用到数据库引擎和数据库访问组件以及数据库控制组件,DELPHI7中提供了BDE,ADO数据引擎,考虑到项目中的数据库应用相对简单,我们选择了常用的BDE(Borland Database Engine)控制读取所建立的数据库,具体操作为1)利用DEPHI7文件夹中的BDE Administer为所建立的数据库创建别名。2)在窗体中添加数据库访问组件和数据库控制组件(包括Data Access页和BDE页中的组件)来实现应用程序与数据库之间的联系。项目中,我们用Table组件来封装数据表,通过BDE数据引擎从数据库表格中取得数据(参数值应填的文本框代号)并通过DataSource组件将数据传递给数据控制组件TDBEdit,3)在程序中,我们通过TTable提供的Gotokey的方法实现对数据库的查找,以及通过对TDBEdit中的数据的使用。实现了将不同参数值填到其唯一对应的文本框中。
2 域请求和域数据的处理
因为域数据的多类,多变性,以及不确定性,我们不能用处理参数一样的数据库或者其他统一处理的方法,所以在程序中我们使用的是用多层复合选择语句进行判断然后根据不同的域数据做出不同的处理,域数据是根据标识符上传的,只有数据没有别的判断信息,对域数据的判断决定于域请求的数据内容,因此在程序中首先判断桢是否为域请求,如果是,则将桢数据赋值对应的变量,这些变量保存的便是域数据的判断信息,而如果根据标识符判断出为域数据,则根据变量保存的信息进行对应的处理。
在域数据的处理中,很多情况是要绘出曲线。对此,我们选择了DELPHI的Tchart控件。利用其Series属性里面的Fast-line,将收到的数据正确的绘成曲线。
3 指令和消息的处理
指令和消息的处理类似于域数据的处理,也是采用多层复合选择语句进行判断,然后做出相应的处理,在此,相应的处理即将指令,消息的相关信息填入文本框。
〈5〉软件流程图
数据处理函数dataprocess()流程图
结 论
在本项目中,CAN卡PCI-9810的控制器是SJA1000,在收发数据方面它支持正常和只听两种模式,在监听器的实际运行中我们选用只听模式进行线路监听,取的了不错的效果,而且在界面的设计过程中上我们添加了发送部分,这是便于进行CAN卡的检测 以及数据接收的调试,此时需要选择正常模式。
本文作者的创新点:结合实际情况的具体需要,合理的选用了Delphi作为软件开发平台,在实时性方面,我们选择了Delphi自身提供的线程类,而不是按照常规选择windows提供的API函数,从而使程序的设计变的简洁,另外在数据的处理方面,我们不仅采用了通常的数据库方法,而且还根据实际需要采用了其他简易可行的方法。很好地完成了需求。
总之,借鉴前者地经验加上实际地创新我们成功设计了实时监听器并通过了实际检验,本项目所设计的实时监听器在实用性,实时性,准确性,以及友好性上都是很不错的。
参考文献:
[1]饶运涛,邹继军等,《现场总线CAN原理与应用技术》,北京航空航天大学出版社,2003
[2]刘瑞新,汪远征等,《Delphi 程序设计教程》,机械工业出版社,2001
[3]张增强,刘成等,《Delphi7 数据库开发完全手册》,清华大学出版社,2003
[4]訾树波,于德敏等《工业生产实施数据采集及管理数据库模型设计》,微计算机信息,2005年第21卷第7-3期。