boa服务器实现温湿度显示,SMT车间温湿度分布式远程监控系统的设计

随着SMT生产工艺技术的提高,生产车间对环境的温湿度提出了温度25±3℃。湿度45%RH~65%RH的要求。为了达到这样的温湿度要求,就不仅需要提高温湿度传感器的精度,而且要求现场的管理人员能够实时的查看现场的环境数据,同时要求远程的上级管理人员能够查询和管理各个监测点的温湿度数据。

为了解决现场温湿度实时显示的问题,张晨吴等人在基于485总线的数字化温湿度测控系统的设计一文中,提出为485温湿度变送器扩展LCD显示模块来实现温湿度实时显示的方案。这种独立实时显示方案需要为每个监测节点配置LCD模块,存在成本投入高、不方便实时查看的缺点。文中针对这一缺点,提出了利用QT技术实现现场温湿度集中实时显示的方案,这个方案只需一个LCD模块即可实现各监测点温湿度实时查看,不仅成本低,而且方便管理。为了解决温湿度的远程管理问题,肖鸿威在基于modbus协议的空间分布式温湿度测控系统设计一文中,提出了采用工控机和SQLserver的方案来实现温湿度的远程采集和管理,这种方案需要配置高性能的工业PC,成本昂贵。针对这一不足,本文提出了采用嵌入式ARM平台和SQLITE数据库方案,这种方案不仅成本低,而且设备小巧,安装维护灵活方便。

根据SMT车间温湿度数据采集、监控的要求,本文设计了基于SQLITE数据库的分布式温湿度远程监控系统。本系统充分利用了QT技术和SQ LITE数据库的优点,搭建基于ARM微处理器和Linux操作系统的嵌入式Web服务器,从而实现现场数据的集中实时显示和远程管理。

1 系统的硬件平台和软件平台本系统以嵌入式Linux系统为核心,包括硬件平台和软件平台。首先在以S3C2440微处理器为核心的硬件平台上搭建嵌入式Linux环境,然后在Linux环境下移植Qtopia、SQLITE数据库和Boa服务器,最后通过Qtopia开发环境完成QT实时显示界面的设计,利用CG1技术实现Web服务器对SQLITE数据库的远程数据查询。并且通过485总线搭建温湿度的底层采集网络。系统的平台示意图如图1所示。

e5cb143d892947d5f488bccd2f5bf6e0.png

1.1 系统的硬件平台传统的以单片机为核心的分散式仪表监控模式,显然已经不能满足当前监控系统对远程访问和集中管理的要求。采用主机-终端的监控模式,虽然能够对现场的温湿度进行实时管理,但是这种监控模式布线相对复杂,传输的距离受到限制,很难对不同地点的温湿度进行监控。

为了对不同地点的温湿度进行实时的远程管理,需要搭建一个基于以太网的分布式监控系统。基于以太网的监控系统可以采用PC、PLC或者ARM为核心,采用PLC为核心的以太网监控系统通常需要配备以太网模块,采用PC为核心的监控系统通常需要配置高性能的工业PC,这样与以ARM为核心的监控系统相比,价格要昂贵的多。因此,本文采用以ARM为核心的以太网温湿度远程监控系统。

1.2 系统的软件平台本系统的软件平台主要包括宿主机和目标机。宿主机是VMware8.0虚拟机下Fedora9.0的Linux操作系统+PC机,目标机为ARM9电路板。其中在宿主机上需要完成Bootloader的编译,裁剪内核,制作内核映像文件和根文件系统映像文件,然后将其下载到ARM板的Flash,从而完成嵌入式Linux操作系统的搭建。

本系统的软件设计是建立在已搭建好的嵌入式Linux操作系统的基础上。要设计QT实时显示界面需要在宿主机上搭建起QT开发环境,需要在ARM板上通过移植Qtopia2.2.0搭建起QT运行环境,最后将在宿主机编译的执行文件下载到ARM板上。要实现采集数据的远程web查询,需要在ARM板上移植SQLITE数据库和Boa服务器,然后通过CGI程序实现对SQLITE数据库的访问。

2 QT实时显示界面的设计    Qtopia是一个基于Ote的类似桌面系统的应用环境,它能够为基于嵌入式Linux的消费电子产品提供和创建图形用户界面,使用Qtopia开发的应用程序界面清晰美观、操作方便,多用于PDA产品的界面开发中。

2.1 QT开发环境和运行环境的建立QT开发是在宿主机上完成,而QT程序的运行是在ARM板上完成的,因为宿主机是X86体系,而ARM板一般是ARM体系,所以必须在宿主机上既要搭建适合X86的开发环境,又要搭建适合ARM体系的开发环境。本系统通过编译X86版本的Qtopia-2.2.0和ARM版本的Qtopia-2.2.0恰当的实现了QT开发环境的搭建。

QT程序的运行环境是在ARM板上,因此需要将Qtopia移植到ARM板上,即将Qtopia添加到文件系统中,为了让Qtopia能够在ARM板上运行起来,需要制作一个Qtopia运行脚本,然后将其权限设置为可执行文件,同时修改文件系统的“etc/init.d/rc.S”文件,在其中添加“qtopia &”的语句。

2.2 QT界面程序的设计在QT的程序设计中会用到信号和槽,信号和槽是QT用于对象间通讯的一种机制,它是QT的中心特征,也是QT与其他工具包最不同的部分。而且信号和槽的机制是安全的:一个信号的签名必须与它的接收槽的签名相匹配。因此,信号和槽的机制可以保证一旦一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。

在本系统的QT程序中,使用主函数调用初始化函数,进行硬件的初始化,并打开传感器设备;然后调用读取函数,读一次底层数据后发送一个信号,在QT程序中该信号连接一个槽,每发送一个信号,就会执行一次数据的显示。程序流程如图2所示。[page]

ef58fe88dd863765bc3d32711a1e825c.png

本系统中实现QT界面实时显示的两个重要函数:

f8d18efdde223780c4500032172673d8.png

信号和槽的连接是通过连接语句实现的。下面介绍QT程序中用到的2个connect语句:

f72907e5c33e9ac5b000dfc8558554cd.png

因此,当按下ok后,界面中将有数据显示。

2.3 交叉编译QT程序及实际运行结果在编译好的ARM版本的Qtopia-2.2.0开发环境下,利用progen工具生成.pro文件,命令行为progen-o xianshi.pro;利用tmake工具生成Makefile文件,命令行为tmake-oMakefile xianshi.pro。然后通过make命令生成可执行文件,并将生成的执行文件xianshi下载到ARM板的/opt/Qtopia/bin/目录下,将桌面图标文件xianshi.png下载到ARM板的/opt/Qtopia/pics/目录下,将桌面启动器文件xiansh i.desktop下载到ARM板的/opt/Qtopia/Apps/Applicationst目录下。最后重启ARM板,在触摸屏上点击xiansh test文件图标,打开QT界面,再点击Initialization按钮和Ok按钮即可得到相关测试数据。最终的运行结果如图3所示。

7f98ec31628144862df61c006b08dd30.png

该运行结果充分证明了QT程序已成功在ARM板上运行。将QT程序设置为每1秒刷新一次温湿度数据,让ARM板长时间运行,QT界面的温湿度显示仍然保持流畅,因此,说明该设计满足实时显示的要求。

3 CGI访问SQLITE数据库的实现嵌入式系统在数据的采集和处理过程中有大量的动态数据,而对数据的存取主要有两种方式:一种是基于文件的方式,一种是基于数据库的方式。对于文件方式,应用程序通常独占数据文件的读写操作,数据共享性差;对于数据库方式,数据和应用程序相互独立,通过事务进行调度和并发控制,可有效的实现对数据进行存取、查询等共享操作,并且运行时需要较少的内存。因此,本系统采用了基于SQLITE数据库的方式。

嵌入式web服务器对SQLITE数据库的访问是通过CGI技术实现的。本系统在宿主机上通过编译SQLITE数据库工具包搭建起SQLITE数据库开发环境,在ARM板上通过移植Boa服务器和SQLITE数据库搭建起CGI程序运行环境,然后在宿主机环境下编译CGI程序并将生成的执行文件下载到ARM板相关目录下,从而实现CGI对SQLITE数据库的访问。图4为嵌入式Web服务器对SQLITE数据库进行访问的结构图。[page]

f928b3360c51f18ed898302f2d9da32f.png

3.1 CGI对嵌入式Boa服务器的访问    CGI(Common Gateway Interface)是一个web服务器与外部应用程序交互的标准接口,它允许将其输出结果经web服务器传送给web浏览器。web服务器将web浏览器发来的消息,传递给CGI程序,由CGI程序进行处理,处理完成后把响应的结果再回送给web服务器,web服务器再把消息发送给web浏览器。CGI程序可以用多种语言来实现,如Perl、C、Unix shell等,由于C语言有较强的平台无关性,占用的资源少,效率高,本系统选取C语言来编写CGI程序。

CGI程序有GET和POST两种提交数据的方法。其中,GET方式提交数据,是将数据保存在QUERY_STRING环境变量中,通过调用函数getenv(“QUERY_STRING”)来读取数据;POST方式提交数据,则程序先从CONTENT-LENGTH环境变量中得到数据的字长,然后从标准输入中读取相应长度的字符串。一般,如果只是为取得和显示数据多采用GET方式提交数据,一旦涉及数据的保存和更新,多采用POST的方式提交数据,本系统采用的是GET方式来提交数据。

CGI是建立在Boa服务器的基础上的,关于Boa服务器的移植在此不再赘述。

3.2 嵌入式SQLITE数据库的实现

3.2.1 嵌入式SQLITE数据库简介    SQLITE是D.Richard Hipp开发的开源性嵌入式数据库引擎,全部源代码大约3万行左右,编译后的程序大小250 kB,甚至可以缩小至150 kB左右。它具有体积小、数据容量大、处理速度快、占用内存少的特点。并且它用一个小型的C库来实现嵌入式关系数据库管理体制,提供了对SQL92的大多数支持,包括:多表和索引、事务、视图、触发和一系列的用户驱动及其接口。

3.2.2 SQLITE常用的API函数1)打开数据库:int sqlite3_open(const char*filename,SOLITE3**db);//*filename是数据库的文件名,**db是数据库句柄。

2)运行函数:int sqlite3_exec (sqlite3*,const char**sql,sqlite3_callback,void*,char**errmsg);callback是回调函数,用户可以根据需要自己编写callback函数获得操作数据库的结果。

3)查询数据:int sqlite3_get_table(sqlite3*,const char*sql,char***result,int *nrow,int *ncolumn,char **errmsg);//参数result以数组的形式存放查询的数据,参数nrow和ncolumn分别为查询语句返回的结果集的行数和列数。

4)关闭数据库:int sqlite3_close(sqlite3*)。

3.2.3 嵌入式SQLITE数据库在ARM—LINUX上的移植本系统是将嵌入式SQLITE数据库应用到S3C2440+

Linux环境中,首先需要在宿主机的交叉编译环境下,编译生成SQLITE的可执行文件,然后将其下载到ARM板的相关目录下。移植SQLITE的主要步骤如下:

1)解压sqlite-3.5.6.tar.gz工具包,命令为tar-zxvf sqlite-3.5.6.tar.gz;

2)解压完成之后进入sqlite-3.5.6目录下新建一个文件夹build。

3)进入build文件夹,执行./configure--host=arm-linux-prefiX=/opt/sqlite-3.5.6/build,其中host是指定进行编译的交叉编译器.prefix是编译后目标存放的路径。

4)执行make和make install命令,在新建的build目录下生成bin、lib、include、share 4个文件夹。

5)将build/bin目录下的文件拷贝到ARM板的/usr/bin中,将build/lib目录下的文件拷贝到ARM板的lib文件夹下。

6)修改ARM板/usr/bin/sqlite3的权限,命令为chmod 755sqlite3。

完成上述6步后,可以在ARM板的终端输入:sqlite3test.db来验证SQLITE数据库是否移植成功。

3.3 嵌入式Web服务器对SQLITE数据库的远程查询    要实现嵌入式Web服务器对SQLITE数据库的远程数据查询,需要实现数据的查询和网页显示。针对生产车间温湿度数据的当前值、最大值和最小值,本系统设计了对最近五次的温湿度和所有温湿度的最大值、最小值进行查询的CGI程序。在CGI程序中,利用sqlite3_get_table(db,“selectmax(temperature)from dhtll;”,&result,&nrow,&neolumn,&errmsg)来实现对温度数据最大值的查询,其它数据的查询类似。要实现温湿度的网页显示需要在CGI程序中指定输出一个文本的html网页,通过printf(“Content-type:text/html\n\n”)程序语句即可实现。

编写好的CGI程序需要在特定的交叉编译环境下才能编译成功。这里使用arm-linux-gcc-I/opt/build/include-L/opt/build/lib-o main.cgi main.c-lsqlite3编译生成main.cgi(其中-I和-L后面指定的是头文件和链接文件),然后将其下载到ARM板的www目录下,并将该文件设置为可执行文件权限。最后在客户端的IE浏览器上输入http://192.168.58.230/main.html即可进入温湿度实时查询界面,其中下图5显示的是温湿度的历史数据页面。

cf61e54060f2869aa3db5ad9e3ea8217.png

该运行结果说明Boa服务器和SQLITE数据库已成功移植到了设计的ARM电路板上,并且编写的CGI程序完成了对SQLITE数据库的远程访问功能。经多次实验运行,本系统的嵌入式web服务器工作稳定,执行速度快并且安全、可靠。

4 结束语文中设计了基于SQLITE数据库的嵌入式Web服务器,引入QT技术来设计温湿度实时显示界面,利用SQLITE数据库和Boa服务器实现温湿度的远程管理。本系统是嵌入式技验测试稳定可靠,可应用到其他相关领域,为实现现场数据的集中实时显示和远程数据访问提供了一种切实可行的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList]

【问题描述】[简单] 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入&am…

html:(23):css代码语法和css注释语法

CSS代码语法 css 样式由选择符和声明组成,而声明又由属性和值组成,如下图所示: 选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色&…

FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息

在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个API专门用来打印多媒体文件的格式 —— av_dump…

html:(24):内联式css和嵌入式css

内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式、嵌入式和外部式三种。这一小节先来讲解内联式。 内联式css样式表就是把css代码直接写在现有的HTML标签中&am…

[剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]

【问题描述】[中等] 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的…

html:(25):选择器定义和标签选择器

什么是选择器? 每一条css样式声明(定义)由两部分组成,形式如下: 选择器{样式; } 在{}之前的部分就是“选择器”,“选择器”指明了{}中的“样式”的作用对象,也就是“样式”作用于网页中的哪些…

[剑指offer][JAVA]面试题第[64]题[求1+2+…+n][逻辑运算符]

【问题描述】[中等] 求 12...n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。输入: n 3 输出: 6【解答思路】 1. 递归(不合符题意) 时间复杂度:O(N^2) 空间…

html:(26):类选择器和id选择器

类选择器 类选择器在css样式编码中是最常用到的,如右侧代码编辑器中的代码:可以实现为“胆小如鼠”、“勇气”字体设置为红色。 语法: .类选器名称{css样式代码;} 注意: 1、英文圆点开头 2、其中类选器名称可以任意起名(但不…

[剑指offer][JAVA]面试题第[10-2]题[青蛙跳台阶问题][动态规划][递归]

【问题描述】[中等] 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e97(1000000007),如计算初始结果为:1000000008,请返回 1。【解答思路…

[剑指offer][JAVA]面试题第[11]题[旋转数组的最小数字][二分法][分治]

【问题描述】[简单] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 示…

html:(27):类和ID选择器的区别和子选择器

类和ID选择器的区别 学习了类选择器和ID选择器,我们会发现他们之间有很多的相似处,是不是两者可以通用呢?我们不要着急先来总结一下他们的相同点和不同点: 相同点:可以应用于任何元素不同点: 1、ID选择器…

对象的释放Dispose和Close对比

C#内存释放的几个方法对比: 而Close与Dispose这两种方法的区别在于,调用完了对象的Close方法后,此对象有可能被重新进行使用;而Dispose方法来说,此对象所占有的资源需要被标记为无用了,也就是此对象被销毁了…

html:(28):后代选择器和通用选择器

包含(后代)选择器 包含选择器,即加入空格,用于选择指定标签元素下的后辈元素。如右侧代码编辑器中的代码: .first span{color:red;} 这行代码会使第一段文字内容中的“胆小如鼠”字体颜色变为红色。 请注意这个选择器与子选择器的区别,子…

Java异常面试题

Java异常架构与异常关键字Java异常简介Java异常架构1. Throwable2. Error(错误)3. Exception(异常)运行时异常编译时异常4. 受检异常与非受检异常受检异常非受检异常Java异常关键字Java异常处理声明异常抛出异常捕获异常如何选择异…

html:(29):伪选择符和分组选择符

伪类选择符 更有趣的是伪类选择符,为什么叫做伪类选择符,它允许给html不存在的标签(标签的某种状态)设置样式,比如说我们给html中一个标签元素的鼠标滑过的状态来设置字体颜色: a:hover{color:red;} 上面…

[Leedcode][JAVA][第837题][新21点][动态规划][数学]

【问题描述】[中等] 爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是…

html:(30):继承和特殊性

继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代。比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签&…

[剑指offer][JAVA]面试题第[12]题[矩阵的路径][DFS][剪枝]

【问题描述】[中等] 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入…

html:(31):层叠和重要性

层叠 我们来思考一个问题:如果在html文件中对于同一个元素可以有多个css样式存在并且这多个css样式具有相同权重值怎么办?好,这一小节中的层叠帮你解决这个问题。 层叠就是在html文件中对于同一个元素可以有多个css样式存在,当有…

架构设计分布式数据结构与算法面试题

目录架构设计请列举出在JDK中几个常用的设计模式?什么是设计模式?你是否在你的代码里面使用过任何设计模式?静态代理、JDK动态代理以及CGLIB动态代理静态代理动态代理cglib代理单例模式工厂模式观察者模式装饰器模式秒杀系统设计分布式分布式…