孙华峰,陆 荣,杨立志
(1.江苏理工学院,江苏 常州 213001;2.南化集团连云港碱厂,江苏 连云港 222042;3.江阴职业技术学院,江苏 江阴 214433)
茅口取水站是南化集团连云港碱厂生产、生活用水的主要原水取水站,将取自蔷薇河的水经定期杀藻杀菌,送到马山净水站进行净化处理,作为碱厂的生产水和生活水,取水能力设计为3 600m3/h。
图1 连云港碱厂茅口取水站远程检测平台系统结构图
南化集团连云港碱厂生产生活用水来自连云港蔷薇河下游,受季节及上游来水影响,取水口经常出现浮草、污物堆积严重等问题,由于取水站距离厂区较远,检测、处理费时费力,造成每年均出现5-8次较为严重的污染事件。为方便相关人员及时检测并处理以上问题,采用友善mini6410嵌入式开发板结合摄像设备构建了远程检测平台[1-2],对取水口部分关键部位进行局部监控,监控数据经由网络传输到厂区监控平台。整个系统设计框架如下图1所示。在图1中,检测平台采用mini6410开发板作为基板,外接OV9650摄像头用于采集取水口周围图像信息,采用HC-SR04超声测距模块检测集水井水位,加氯间水射器压力、二氧化氯压力,离心泵一次侧电压值等运行数据经各自的变送器转换为4~20mA电流送往基板A/D转换接口,运行数据及图像数据经网络传输到厂区监控中心。传输方式有两种,一种方式根据监控中心发来的命令,按照命令要求实时采集相关数据进行传送。另一种方式是每天定时集中采集两次,统一发往监控中心。
检测系统分为远程监控终端和现场检测平台,现场检测平台操作系统采用嵌入式linux2.6.30内核,内核裁剪过程中对100M以太网配置及视频捕获有关驱动等配置着重进行了处理,保留内核自带的A/D转换功能。针对HC-SR04超声模块的工作特点,利用开发板预留管脚GPB0接Trigger信号,GPB12接echo信号,并增添超声模块驱动程序到内核。驱动程序采用linux misc驱动模式开发,文件名为HCSR04.c,具体设计步骤如图2示:
图2 超声模块驱动程序流程图
驱动程序的主要功能是:当应用程序调用read函数向驱动申请水位数据时,驱动程序将向超声传感器发送trigger信号,并获取系统当前jiffies值,超声测距模块接收到trigger信号后会通过超声发生装置发送超声波,当接收到超声回波后,超声模块将产生echo信号触发eint11中断,在中断处理函数中再次获取系统当前jiffies值,并根据以下公式得到液位距离值传送到用户空间:
上式中,△J为两次获取的jiffies的差值。
将上述驱动源文件及makefile文件放到内核目录下,并修改顶层kconfig文件,编译内核,烧写到板子上。应用程序采用Qt进行开发,据此根文件系统制作中添加QT-4.7.0相关库,采用busybox-1.20制作。
根据任务特点,应用层划分为视频捕获,数据采集,数据传输三个功能模块。
在Linux系统中普遍采用V4L技术[3]实现视频处理,当前最新技术为V4L2,图3给出V4L2实现图像捕获的设计流程:
上述流程图中第二步的主要目的是为了了解摄像设备当前的工作参数,如能够拍摄多高,多宽的图像,能拍摄jpeg格式,bmp格式还是png格式的图像等。
摄像设备的各种输出格式由struct v4l2_fromat类型的结构体变量进行描述。这一类型在v4l2.h头文件中作出定义,在使用时只要将该头文件包含到自己的程序中,就可以直接用来定义变量了,具体使用形式如下:
图3 采用V4L2技术进行视频捕获的主要流程
第三步通过以下语句修改捕获的图像格式等信息。
(1)myformat.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
(2)myformat.fmt.pix.width=320;
(3)myformat.fmt.pix.height=240;
(4)myformat.fmt.pix.pixelformat=V4L2_PIX_FMT_JPEG;
(5)ret=ioctl(fd,VIDIOC_S_FMT,& myformat);//设置图像格式
打开摄像设备,成功设置格式后,接下来需要向驱动申请帧缓存,一般申请数不超过5,根据设计需要我们申请两帧(struct v4l2_requestbuffer)。对申请到的帧缓存,采用mmap函数映射到用户空间,方便提取图像数据。将帧缓存放入缓存队列后,就可以开始图像采集了。
现场需要监控的数据,除取水口图像数据,还有取水泵电压、液位等,这些数据在应用层按照linux环境下访问普通文件的方法一样访问对应于/dev目录下的相关设备文件,通过read函数调用,对应的设备驱动程序会将采集的数据拷贝到用户空间。
表1 主要设备部件及其性能
操作指标
(1)电机起动电压54 kV—63 kV 电流≤36A
(2)电机温升≤75℃
(3)出水压力,0.4MPa—0.6 MPa
数据传输分成两个部分:(1)图像数据传输。(2)普通数据传输。为了方便远程监控平台处理,在检测端开启两个线程,分别独立发送图像数据和普通数据,根据监控要求,每天传输两帧图像,数据量不大,在设计时采用面向连接的TCP/IP网络协议实现。
具体设计采用Qt提供的线程类实现[4,5],QT通过三种形式提供了对线程的支持。它们分别是,一、平台无关的线程类,二、线程安全的事件投递,三、跨线程的信号-槽连接。这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势。
Qt包含下面一些线程相关的类:
表2 Qt线程类
在设计过程中需要考虑如何区分哪一个线程用来传送图像,哪一个线程用来传送检测数据和控制命令,这样才不至于使发送端和接收端出现紊乱,本文采用的办法是通过套接字描述符来区分,当主控室发来连接请求,监控端的listen函数侦听到后,将自动调用incomingconnection函数与之响应,该函数是QTcpServer类的一个虚函数,在该函数的实现中将为本次连接请求创建相应的套接字,而系统将为该套接字创建套接字描述符,唯一的标识本次连接,设计时将该套接字描述符保存到事先开辟的全局内存空间中,当发送或接收方通过该连接进行通信时,通过在Qthread的run函数中比对相关的socketDescriptor就可以判断到底是传送图像的线程在活动还是用来传送数据的线程在活动,据此发送接收方可以实现正确的通信,而不至于发生错误。
本文围绕南化集团连云港碱厂茅口取水站的实际监控需要,以mini6410嵌入式开发板为平台,通过裁剪linux2.30.6内核,开发、修改内核中相关设备驱动程序实现了一种能够对取水口现场进行监视和控制的取水口监控系统,实践证明该系统简单有效,能够完成取水口相关生产环节的监控任务。
[1]谢莹.基于Web架构的视频监控系统设计与实现[D].武汉:华中科技大学,2011.
[2]马俊骥.基于无线网络的视频监控系统设计与实现[D].成都:电子科技大学,2010.
[3]陈福,马莉,周树杰,等.基于嵌入式系统的视频图像捕获研究与实现[J].微计算机信息,2005(25):12-13.
[4]陈琦.QT 的编程技术及应用[J].科技信息.2008(33):503-504.
[5]刘小春,张有为,向伟.嵌入式Linux下Qt/Embedded应用关键技术研究[J].微计算机信息.2007(35):62-63.
[6]孙琼.嵌入式Linux应用程序开发详解[M].北京:人民邮电出版社,2006.