车道收费系统的关键技术及其Delphi环境下的实现.doc_第1页
车道收费系统的关键技术及其Delphi环境下的实现.doc_第2页
车道收费系统的关键技术及其Delphi环境下的实现.doc_第3页
车道收费系统的关键技术及其Delphi环境下的实现.doc_第4页
车道收费系统的关键技术及其Delphi环境下的实现.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

车道收费系统的关键技术及其Delphi环境下的实现摘要: 前言 本文讨论了高速公路收费系统中车道收费系统的关键技术,从系统稳定、可靠、简单、实用的角度提出了新的设计思路,并给出了Delphi环境下的具体实现。详细内容: 目前我国高速公路收费系统一般都是采用人工判别车型、人工收费、计算机管理、检测器计算校核、闭路电视辅助监督的半自动收费方式。在这种采用半自动收费方式的收费系统中,车道收费系统是其核心。车道收费系统运行于车道控制机上,实现车道收费设备(栏杆机、红绿灯、天棚灯、IC卡读写器、票据打印机等)自动控制,协助收费员完成入口发卡、出口收费操作。车道收费系统要24小时连续运行,对收费数据的完整性、可靠性和实时性都有很高的要求。同时车道收费系统还要为防作弊提供有力手段。本文就车道收费系统的关键技术进行讨论,并给出在Delphi环境下的具体实现,车道收费系统采用Client/Server体系结构,网络操作系统(NOS)为Windows NT 4.0,数据库管理系统为Microsoft SQL 7.0,车道控制机操作系统为Win95/Win98。前端开发工具为Delphi 5.0。 单机、网络双轨制工作 车道收费系统要求具有24小时不间断工作能力,即使在车道的收费站之间的网络连接中断时。同时要求网络中断时,收费员要能象网络正常时一样工作,并且系统能把收费数据保留在车道上,当网络恢复正常时,系统会自动把数据上传。这就是所谓的单机、网络双轨制工作。即系统要能在网络正常和中断之间自动切换,保持正常工作状态,同时要保证数据的完整性。 国内绝大多数车道收费软件都是采用面向非连接的异步轮寻数据方式,以避免那种面向连接数据通信方式为网络中断或不稳定时,系统会长时间的等待,甚至逻辑闭锁,从而导致与车道连续工作要求和响应时间要求相冲突的问题。然而这种面向非连接的异步数据轮寻方式在通讯策略控制上很麻烦,且收费数据上传的实时性上也受得一定限制。笔者在此提出一种新的设计思想,可以很好地解决这些问题。 Windows操作系统是一个多任务操作系统,不象在DOS这样的单任务操作系统中,用户在计算机中启动一个程序后,只有等待其完成后才能运行另一个程序。在Windows操作系统中,用户可以一次启动多个程序,甚至可以启动一个程序的多个实例。因此,在车道收费系统中,我们可以把车道应用程序分解为两个独立的应用程序。一个Toll.ExE的程序专门负责前台的收费业务,并把收费数据(包括抓拍的图像)存放在本地盘上。这个Toll.EXE程序不涉及到网络。因此当网络出现故障或者不稳定时,它依然能正常工作;另一个叫Back.EXE的程序专门负责车道和收费站服务器之间的后台数据通信,包括定时下载员工表、费率表、黑白名单。服务器时钟和实时上传收费数据。Back.EXE程序运行与网络状态有关,但不影响前台收费业务的进行。车道收费系统运行时,先最小化运行Back.EXE程序。在Back.EXE程序中再调用Toll.EXE。对于用户来说,车道收费系统象一个程序。在Delphi 5.0中,要实现在一个应用程序调用另一个应用程序非常简单。因为Delphi中调用Windows API函数如同调用自身内部函数一样(Delphi已在Window.pas中全部声明了Windows API),Windows API函数中WinExec函数可实现此功能。具体调用格式为: WinExec(:Toll.Exe,SW_MAXIMIZE)。 以上讨论只是解决了当网络发生故障或不稳定时,系统仍能正常工作的问题,要解决收费数据实时上传问题就必须保持Back.EXE和Toll.EXE程序的实时通信。当然Back.EXE程序定时(用定时器来触发完成)发送数据也可以。但实际收费业务中车道车流量密度随机很大,高峰时,收费员处理不过来,而有时十分钟,甚至一个小时都没有一辆车(深夜常见的现象)。因此,定时器时间间隔不好定。间隔过大不能达到收费数据实时发送的要求,过小则计算机资源消耗过多,且在长时间无车时,显然是做无用功。因此,采用定时发送收费数据的方式很不合理。Windows系统是消息(Message)驱动的操作系统。Window的应用程序通过对接收到的各种消息进行处理来完成任务。因此基于Window的消息响应机制可以建立Back.EXE程序和Toll.EXE程序之间的实时通信以实现收费数据的实时上传。其具体实现过程为: A在Toll.EXE程序中先定义消息。当程序处理完了一条收费记录(即收费数据存入当地数据库表中后)后,Back.EXE程序发送已定义的消息,在发送消息之前,要先找到Back.EXE程序的窗口句柄。 Const Wm_TollMsg=WM_USER+1000 /定义消息 If HwndBack=0 then /找Back.EXE程序的窗口句柄 HwndBack:=FindWindow(TFrmBack,Back) PostMessage(HwndBack,wm_TollMSG,0,0) /向Back.EXE程序发送消息 B在Back.EXE程序中定义消息,此处消息和A中定义的消息为同一消息;然后定义消息处理过程。这个消息处理过程主要是把当地数据中未发送的数据向收费站服务器发送。 Const Wm_TollMSG=WM_USER+1000 /定义消息 Public Procedure DoTollMsg(Var Msg:Tmessage);Message wm_TollMsg; Procedure TfrmBack DoTollMsg(var Msg:Tmessage); /宣告消息处理过程 Begin WriteSoldb /向服务器发送收费数据 End 图像的自动抓拍、压缩和上传 图像抓拍是车道收费系统中的一个重要功能。入口图像抓拍可以严格控制“一车一卡”(只有系统抓拍到通行车图像收费员才能进行发卡操作);出口抓拍可以严格控制收费员人为地“大车判小车、收费车判免费车”和对违章、冲关、免费车等进行稽查和处理。因此车道收费系统要实现图像自动抓拍,并要把抓拍到车道图像实时、可靠、自动地从车道控制机上传到服务器数据库,以供用户及时地进行图像稽核、查询和管理。 图像自动抓拍原理为:车辆驶入收费车道触发一号地感线圈。车辆检测器检测到车辆并向数字IO板的相应输入端口发送信号,车道收费系统一直启动一线程在监视此IO端口,从而能实现实时采集到此信号,启动图像捕捉卡进行抓拍。 图像的抓拍可以使用Microsoft的Video For Windows SDK开发包,此开发包提供了视频和音频捕捉的全系统函数。车道收费系统只需抓拍静态的一帧图片,因此可以基于此开发包做一个简单的DLL库。同时,一般的视频捕捉卡制造商都会针对自己的卡提供二次开发的DLL或Active控件。笔者使用的视频捕捉卡是FlyVideo。此卡随带的开发包中有一个CapWnd.ocx控件。将其在Window中注册和Delphi中引入后的图像抓拍非常简单。其函数如下: Function TfrmMain.CapBMP():Integer Begin Try Begin CapWnd1.Freeze; CapWnd1.SaveDib(Vehicle.bmp);/抓拍存为Vehicle.bmp图像 CapWnd1.Preview; End; Except Begin Result=-1; Exit; End; End; Result=0; End; 上面抓拍的图像是.bmp图像,图像文件很大(380280约250400K)。因此实际应用中必须压缩为文件很小的.Jpg文件。Delphi中有一个TjpegImage类用来处理JPEG文件。下面是笔者设计的一个由BMP文件压缩成JPEG文件的函数。其中压缩比Quality可由用户自定。 Function TfrmMain.BMPTOJPG(BmpFile,JpgFile:pchar;Quality:word):integer; Var. Bmp:TbitMap; Jpeg:TjegImage; Begin Bmp:=nil; Jpge:=nil; If (Trim(BmpFile) = ) or (Trim(JpgFile) = ) then Begin Result=-2; Exit; End Try Begin Bmp:=Tbitmap.create; /建立bitmap类实例 Bmp.LoadFromFile(BmpFile); /读入Bmp文件 End; Except Begin If Bmpnil then Bmp.Free; /释放Bitmap类 Result:=-1; Exit; End; End; Try Begin Jpeg:=TjpegImage.Create; /建立TjpegImage类实例 Jpeg.Assign(Bmp); /复制图像数据 JpressionQuality:=Quality; /设置压缩率 Jpeg.SaveToFile(JpgFile); /图像压缩后存盘 End; Except Begin If Bmpnil then Bmp.Free; If Jpegnil then Jpeg.Free; /释放TjpegImage类 Result:=-3; Exit; End; End; Bmp.Free; Jpeg.Free; Result:=0; End; 图像在要地盘中是以单个文件来存储,当地数据记录中有一字段(JpgFile)来记录图像文件名。而图像在服务器的数据库表单中存储是作为一个大容量字段来存储。在SQL Server中是作为Image类型的数据。图像传输和数据传输一样。方法如下: TollDat.InsertImg.paramByName(Image).LoadFromFile(JpgFile,ftBlob); TollData.InsertImg.ExecSQL; TollData数据模块 InsertImgQuery控件,用于向服务器数据库表单插入记录 JpgFile本地盘中压缩后的Jpg文件名 下载服务器时钟 在收费系统中,所有车道控制机的时钟一致是很重要的。在开放式收费系统中,车道时钟以站级服务时间为准。在单条封闭式收费系统中,车道时钟以路段分中心服务器时钟为准。在联网收费系统中,车道时钟以总中心服务器时钟为准,通常下载服务器时钟的方法是:基于TCP/IP协议的Winsock编程,即车道机向服务器发出申请,服务器接到申请后,取出自身时钟传给车道机。车道机得到服务器传来的时钟加上网上单程传输时间来设置自身时钟。这种编程方式可以使所有车道车钟统一到毫秒级,但编程实现较为复杂,由于收费系统中收费业务时钟只要统一到秒级即可。在此笔者提出一种简单可行的方法,其思路为:服务器上除了有Windows NT Server外,还有SQL Server,而SQL Server会定时和NT Server统一时钟。因此车道机只要能取到NT Server的时钟即可。其简单的实现方法如下: Function TfrmBack.AdjTime:Boolean; Var. CurTime:Tsystemtime Begin Try TollData.QueryDate.Open; /取得SQL Server时钟 DecodeTime(TollData.QueryDateCarDateTime,CarTime.Whour,CurrTime.wMinute,CurrTime.wSecond,CurTime.wMillisecond); DecodeDate(TollData.QueryDateCurDateTime,CurTime,wYear,CurTime.wMonth,CurTime.wDay); SetLocalTime(CurTime); Result:=True; Except Result:=False; End; TollData.QueryDate.close; End; QueryDate_Query控件连接到服务器一数据库上,其SQL字符串列表为QueryDate.SQl:=Select GetDate( ) as CurDateTime。 上述取服务器时钟的方法同样可以用来诊探网络状态。当ADJTime()函数返回True时,说明网络正常;返回False时,说明网

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论