电子器件
ChineseJournalofElectronDevices
Vol.29 No.2Jun.2006
DesignandAchievementofLinuxSCADABasedonQt
ANJi2yu
1,2
,YUTao
1,3
,LIYong2jun
1,2
,SUNTie2zheng
1,3
,ZHANGHang
1,3
1.ChangchunInstituteofOptics,FineMechanicsandPhysics,ChineseAcademyofSciences,Changchun130033,China;2.GraduateSchooloftheChineseAcademyofSciences,Beijing100039,China;3.NorthLCEngineeringR&DCenter,Changchun130033,China
Abstract:WiththeLinuxisadoptedinproductionsmoreandmore,thedesignoftheSCADAthatcanbeusedundertheLinuxcircumstanceisdemanded.ComparedwiththecharacteristicsandapplicationsoftheembeddedLinuxGUIbeingusedtoday,weputforwardamethodhowtodeveloptheSCADAusingtheQtundertheembeddedLinuxcircumstancesandthemethodhowtodeveloptheapplicationprogramofLinuxbyQt,andintroducedtheprincipleoftheSCADAdevelopmenttoo.Theachievingtechnicalfundamenta2boutdevelopingtheSCADAbyQt,andtherelevantkeytechniquewereemphasizedthat.Thedesigncanbeusedinsomehardwareplatform,theeffectisprovedtobewellinpractice.Keywords:embeddedLinuxGUI;SCADA;Qt;databaseEEACC:7210G
基于Qt的Linux组态软件研究与开发
安吉宇1,2,于 涛1,3,李拥军1,2,孙铁铮1,3,张 航1,3
1.中国科学院长春光学精密机械与物理研究所,长春130033;2.中国科学院研究生院,北京100039;3.北方液晶工程研究开发中心,长春130033.
摘 要:随着Linux越来越多的应用于各种产品,可应用于Linux环境下的组态软件的开发也成为一个热点。在比较了现有
常用的几种嵌入式LinuxGUI的特点后,提出了一种应用Qt在嵌入式Linux环境下开发组态软件的方法;简要的介绍了使用
Qt开发Linux应用程序的方法和组态软件的基本原理后,着重阐述了利用Qt开发组态软件的实现技术基础和相关关键技
术,该方法可应用于具体的硬件平台,效果良好。
关键词:嵌入式LinuxGUI;组态软件;Qt;数据库
中图分类号:TP311.13 文献标识码:A 文章编号:100529490(2006)0220532204 Linux操作系统的不断发展和壮大,尤其是源代码的开放性以及在网络方面的健壮性的优势,使得Linux操作系统逐渐成为工控领域的一大选择。随着嵌入式Linux越来越多的应用,尤其是各种嵌入式GUI技术的完善、成熟以及Linux操作系统对数据库、日志文件系统等技术的支持与应用,在嵌入式Linux中建立轻量级的组态软件成为可能。组态软件寻求多平台支持已经是一大发展趋势,未来的组态软件(英文简称SCADA,SupervisoryControl
andDataAcquisition)至少要同时兼容WinNT和Linux/Unix[1]。根据现状,提出了基于嵌入式Linux的组态软件的设计方法。
1 嵌入式LinuxGUI
1.1 嵌入式GUI
目前常用的面向嵌入式的LinuxGUI主要有飞漫公司的MiniGUI、Century公司的MicroWindows、Troltech的Qt和GTK+Team开发的GTK+。
收稿日期:2005212206
作者简介:安吉宇(19772),男,博士,主要从事嵌入式LinuxGUI应用与开发工作,ajy770406@sohu,com.
© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
第2期安吉宇,于 涛等:基于Qt的Linux组态软件研究与开发
进行代码转换和编译链接生成可执行文件。
533
MiniGUI的策略是首先建立在比较成熟的图
形引擎之上,比如SVGALib和LibGGI,开发的重
点在于窗口系统,如图形接口。在MiniGUI的开发中,引入了图形抽象层和输入抽象层(GAL和IAL)的概念。利用GAL和IAL,MiniGUI才可以在多种图形引擎上运行,并且便于移植。它尽量保持与Win32的兼容,这样在WinCE应用的任何场合,也可以使用MiniGUI[2]。
MicroWindows目前的开发重点则在底层的图形引擎,窗口系统和图形接口方面的功能还比较欠缺。但是它能够在没有任何操作系统或其他图形系统的支持下运行,它能够对裸显示设备进行直接操作,因而显得十分小巧,便于移植到各种硬件和软件系统上。最上层的API支持Win32和NanoX接口,这样就与Win32和XWindow窗口系统保持了兼容,在这些系统间移植应用软件就很容易。
GTK+是GIMP(一个开放源代码的图形程序)ToolKit的缩写,是目前编写图形用户界面比较流行
另外一种设计方法是手动编程实现,通过在
Windows的环境下使用VC++编写程序代码,需要在VC++运行环境的Tools菜单选中Custom2ize功能项,再弹出的对话框中有Add-insandMacrofiles选项,选中QMsDevDeveloperStudio-Add-In,就可以编译Qt的源代码,也可以直接链接QtDesigner源程序。直接在Linux环境下开发更便捷些。
2 组态软件设计和实现的相关技术
2.1 组态软件的基本原理组态软件是由开发环境和运行环境共同构成的,我们设计的组态软件开发环境是Linux或Win2dows交叉编译环境,运行环境在IntelPXA250平台下运行。通过I/O驱动程序从现场I/O设备获得实时数据,对数据进行必要的加工后,一方面以图的方式直观的显示在计算机屏幕上,另一方面按照组态要求和操作人员的指令将控制数据送给I/O设备,对执行机构实施控制或调整控制参数[4]。通过对现场数据的采集处理,以动画显示、报警处理、流程控制和报表输出等多种方式向用户提供解决实际工程问题的方案。组态软件的原理框图如图1[5]
的高层函数库之一。由于它的模块化设计和全C编写的特性,兼容性好,运行稳定,且它的库也比较小,GTK加上X服务器仅占用2.9M的硬盘空间,兼顾考虑性能和存储空间,它完全可以用于开发嵌入式的GUI应用程序,且具有免费从网上获取源代码的优
点,而且从Linux主流的桌面系统之一的GNOME用GTK开发出来的可见其功能的强大[3]。
Qt是一个多平台的C++图形用户界面应用程序框架,它注重给用户提供精美的图形用户界面所需要的所有元素。而且它是基于一种面向对象的思想,所以用户对其对象的扩展是相当容易的,并且它还支持真正的组件编程。
综上,MinGUI、MicroWindow和GTK+主要运行于Linux控制台,对于工控领域和用户来说纯Linux系统开发及使用都还需要一段时间来适应。
考虑到组态软件的组件化开发、多系统平台、多用户使用、多控件支持及丰富的类库支持,Qt程序设计包是个不错的选择。1.2 Qt开发应用程序的方法可通过两种方法来开发嵌入式Linux环境下的组态软件应用程序,一种是使用Qt的设计工具QtDesigner生成图形用户界面,利用图形界面生成工具快速地生成应用程序代码,这是一种快速开发应用程序的方法。在Linux环境和Window的交叉编译环境下都可以运行。程序编写完成后,使用QtDesigner的元对象编译器MOC(MetaObjectCom2piler)和用户编译器UIC(UserInterfaceCompiler)
图1 组态软件原理框图
由图1可见组态软件的开发系统主要由图形用
户界面系统、数据库系统、通信程序组件和I/O设备驱动程序等组件组成,其中监控实时数据库是组态软件的核心和引擎。图形界面系统、I/O驱动程序等组件以实时数据库为核心,通过高效的内部协议相互通信、共享数据。2.2 组态软件实现的技术基础组态软件的实现源于三方面的技术支持,首先是底层图形引擎的支持,用于画图以模拟现场的设备、显示设备的状态;其次是事件驱动的支持,用于实现图形对象之间及其与数据库或现场设备建立联
© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
534 电 子 器 件 第29卷
系,即动画连接,它是图形对象动起来和整个组态软件的桥梁;第三方面则是组态软件的核心数据库或
数据库文件的支持。
Qt的底层图形引擎实现基于framebuffer。framebuffer是在Linux内核架构版本1.2以后推出的标准显示设备驱动接口。framebuffer驱动程序主要实现两方面的工作,一方面是对LCD及其相关部件的初始化,包括画面缓冲区的创建和对LCD的DMA控制通道的设置,另一方面是对画面缓冲区的读写,具体代码是读、写、查找等系统调用接口[6]。Qt的底层抽象类是基于QScreen类和QGfx类,其中QScreen类是抽象出的底层显示基类,声明了对于显示设备的基本描述和操作方式,如打开、关闭、获得显示能力创建操作对象等;QGfx类为抽象出的对于显示设备的具体操作接口,如选择画刷、画线、画矩形、alpha操作等。Qt的事件驱动是基于Qt的一项关键技术Sig2nal/Slot(信号与沟槽)机制。不同于大多数GUI工具包的控件,其所能处理的每一个事件都对应一个回调函数,在Qt中,Signal和Slot替代了这些繁杂的回调函数指针[7]。Signal和Slot用于对象间的通信,建立图形对象的动画连接。动画连接的实现方法是将用户窗口中的图形对象与实时数据库中的数据对象建立相关性连接,并设置相应的动画属性,将物理对象的特征参数以动画图形方式来进行描述,这样在系统运行过程中,图形对象的外观和状态特征,就会由数据对象的实时采集结果进行驱动,从而实现图形的动画效果,使图形界面“动”起来,进而产生形象逼真的动画效果。
Qt中所有事件的基类是QEvent,Qt的主事件回路(QApplication∷exec())从事件队列里取得本地窗口系统事件,并把它们转换为QEvent,然后将这些转换过的事件发给QObject。QObject通过它们的QObject∷event()函数调用来接收事件,这是Qt内部的事件调用机制。
Qt中与用户输入事件相关的信号,是建立在对底层输入设备的接口调用之上的,Qt中的输入设备分为鼠标类与键盘类。其中鼠标类设备的抽象基类为QWSMouseHandle,键盘类设备的抽象类为QWSKeyboardHandle。2.3 组态软件的核心———-数据库或数据库文件
与Windows操作系统对数据库的操作类似,首先要建立数据库连接,然后对数据库连接进行相应的配置,最后使用数据库连接的API进行编程以开发数据库应用程序。在Linux系统下的数据库主要
有TXT、NNTP、MinuiSQL、PostgreSQL、MySQL、Sybase/MSSQL、Oracle,我们选择较常用的数据库
驱动是MySQL。
MySQL是一个快速的客户机/服务器结构的SQL数据库管理系统,由一个服务器守护程序mysqld及很多不同的客户程序和库函数组成,虽然它不是开放源代码产品,但可以自由使用[8]。主要优点是功能强大、灵活性好、应用编程接口丰富以及系统结构精巧。另外,在顶层MySQL支持ODBC语法,方便其他数据库的访问和建立连接,在下层具有C、C++、Eiffel、Java、Parl、PHP、Python和TCL等多种语言的API,方便不同用户编程和使用。下面以MySQL为例,介绍Linux环境下数据库操作的具体步骤和实现方式。2.3.1 Linux下的MySQL数据库的安装和配置
开发环境是redhat9.0,内核2.4.20,下载MySQL源码包mysql-3.23.54a-11.i386.rpm、mysql-devel-3.23.54a-11.i386.rpm和mysql-server-3.23.54a-11.i386.rpm。下载源代码包perl-CGI-2.81-88.i386.rpm、MySQL-shared-3.23.54a-1.i386.rpm和perl-DBD-MySQL,分别提供Perl语言的CGI模块、MySQL动态加载和使用需要的共享库、perl语言的MySQL接口,至于下载哪些包是根据系统的需要和来
进行的。解压缩安装成功后,MySQL所需的头文件都被安装到了/usr/include下,编译好的库文件安装到了/usr/lib下,与MySQL相关的可执行文件安装到了/usr/bin下,配置和启动文件放到了/etc下。运行命令etc/init.d/mysqldstart启动MySQL服务器,运行命令mysql进入数据库的创建、编辑环境,然后可使用命令createdadabases、dropdadabases和showdatabases创建、删除和显示数据库,通过use来选择某一数据库进行操作,用createtable、droptable、update来创建、删除表和更
新表中的数据,获取数据库和表的信息可使用以下几个命令来完成:show、mysqlshow和mysqldump。停止MySQL服务器使用命令etc/init.d/mysqldstop。建好的数据库会保存在/var/lib/mysql目录下,其中有一个缺省数据库是mysql。2.3.2 Linux下数据库的编程
可以用两种方式来实现数据库的应用程序,一种是通过MySQL提供的API进行编程,用C或者SQL语言都可以,这种方法比较通用,控制灵活并保证数据库的存储效率,但实现起来要复杂一些;另一种是通过LinuxGUI提供的MySQL支持对数据库进行编程,通过Qt来编程实现。
© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
第2期安吉宇,于 涛等:基于Qt的Linux组态软件研究与开发535
对数据库编程,进行数据库访问,首先要知道数
据存放的位置(数据源定义DNS)并进行连接;然后向数据源请求信息,将到手的信息进行处理并把处理后的数据返回给数据源进行可靠存储;这些工作完成后再断开与数据源的连接。以上是数据库进行数据请求和数据处理的流程。下面以MySQL数据库为例,介绍Linux系统下数据库的Qt编程实现。
(1)Linux下Qt的MySQL数据库的连接下载并安装Qt-MySQL-3.1.1-6.i386.rpm,该软件包提供MySQL数据库驱动对Qt3.1的SQL模块的支持,生成的动态库libqsqlmysql.so存放在/qt-3.1/plugins/sqldrivers/目录下。创建一个数据库连接需要三个操作:激活驱动程序、设置连接信息和打开连接。
首先通过QSqlDatabase::addDatabase(QMYSQL3”)激活了一个数据库驱动程序,传入“
驱动程序名,如果想连接多个数据库则需要多个参数。这里激活的是MySQL的数据库驱动,其他可利用的驱动程序还有:QODBC3(开放数据库连接)、QOCI8(Oracle8和9)、QTDS7(SybaseAdaptiveServer和MicrosoftSQLServer)和QPSQL7(Post2greSQL6和7),只要修改里面的数据库名称就可以。连接创建后该数据库就成为应用程序的默认数据库,并且能为Qt的SQL类所使用。然后调用setDatabaseName()、setUserName()、setPassword()和setHostName()来初始化连接信息,设置数据库名称(DNS)、用户名、用户密码和主机名。最后调用open()来打开数据库以存取数据,如果该步失败将返回假,用户可通过QSqlDatabase::lastError()来查明错误信息。
(2)MySQL数据库的Qt编程
可用两种方式来建立Qt的数据库应用程序,一种是应用QtDesigner来快速创建数据库应用程序,另一种是应用SQL模块自己编程实现。
使用QtDesigner主要通过该工具中封装的控件类来创建数据库,也要先激活数据库驱动程序,方法同上,这部分是手动编程实现的,是数据库的外连接。然后从QtDesigner的工具条中选择Project|DataBaseConnections创建内部数据库连接,配置数据库,包括数据库驱动类型、数据库名、用户名、密码、主机名和使用端口。通过QtDesigner内的QDataTable、QDataBrowser和QDataView三个与
数据库相关的控件类来建立表和记录,并进行相应的插入、删除、更新、检索表和表中的数据操作。
手动编程主要通过Qt的SQL模块。SQL模块主要分为用户接口层、应用编程接口层和驱动程序层三层来实现数据库操作。用户接口层提供了基于数据的窗口部件,这些窗口部件不仅连接数据库还可为用户所浏览,终端用户通过这些组件来浏览和编辑数据,也可在程序中与你的C++代码直接交互;支持这一层的类包括QSqlEditorFactory、QSqlPropertyMap、QSqlForm、QDataTable、QDataBrowser和QDataView。应用编程接口层用于存取数据库,QSqlDataBase类用来连接数据库,而数据交互的实现可利用QSqlQuery类或者用QSqlCursor类以SQL语句来实现,QSqlError、QSqlField、QSqlIndex和QSqlRecord也支持该层。驱动程序层由三个类组成:QSqlResult、QSqlDriv2erFactoryInterface和QSqlDriver,这个层在数据库和SQL类之间提供了底层的桥梁。
3 结束语
本文在介绍几种常用的嵌入式LinuxGUI的特点和作用、组态软件的基本原理及使用Qt开发应用程序的方法后,着重论述了使用Qt开发组态软件的实现技术基础和相关关键技术,给出了一种在嵌入式Linux环境下利用Qt工具包开发Linux组态软件的设计方案。参考文献:
[1] 马国华.监控组态软件及其应用[M].北京:清华大学出版社,
2002
[2] 丁丁等.三种主流嵌入式图形用户界面的移植及性能比较[J].
电子产品世界,2004,5.
[3] 高晓清等.基于GTK+库的GUI程序开发研究[J].数理医药
学杂志,2002,15(6):5472548.
[4] 王亚民等.组态软件设计与开发[M].西安电子科技大学出版
社,2003.
[5] 方来华等.组态软件核心技术研究[J].化工自动化及仪表,
2004,31(1):33235.
[6] 徐广毅等.Qt/Embedded在嵌入式Linux系统中的应用[J].
单片机与嵌入式系统应用,2004,12.
[7] Xteam(中国)软件技术有限公司.Qt程序设计[M].北京:清
华大学出版社,2002.
[8] 黄英.嵌入式Linux系统中的数据库连接方案[J].信息技术,
2004,28(5):75277.
© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
因篇幅问题不能全部显示,请点此查看更多更全内容