第一篇:MQ典型使用场景---MQ在高速公路联网收费系统中的应用
MQ典型使用场景---MQ在高速公路联网收费系统中的应用
MQ典型使用场景
---MQ在高速公路联网收费系统中的应用
前言
ApusicMQ介绍系列主要用来向中间件的技术支持人员、市场营销人员,以及对MQ感兴趣的同事做的一个完整体系化的介绍。
在中间件的产品家族里面,消息中间件是一个比较特殊的产品,它既不像应用服务器那样有着广泛的用户基础,也没有云计算、SOA那样的噱头,很多人根本就不知道消息中间件是个什么东西,有什么用。事实上,消息中间件是一个古老而经久不衰的产品,说它古老是因为它产生的时间甚至早于应用服务器,且一出来就备受推崇;说它经久不衰是因为现在只要涉及到数据通信它仍然是首选。这是一个经过时间验证的产品,它的用途已经在行业内形成了广泛的共识,不再需要额外的炒作。
公司早在2006年便开始了Apusic消息中间件的开发,即便如此,这个时间也比IBM、东方通晚了十多年。之后便一直处于断断续续发展的境地,再加上它实在是太底层、太基础了,以至于很多同事都对它不太了解。从2010年下半年开始,公司加大了对它的投入,形成了一个稳定的开发团队来加速它的发展,并于2010年底发行了一个稳定性和健壮性都大幅提升的版本:Apusic MQ7.5。
本系列致力于完整的介绍MQ产品,从而改变人们对它不了解的现状,主要内容将会包括MQ概念介绍、MQ运作原理和术语介绍、Apusic MQ功能和性能介绍、典型使用场景和案例分析等。
本文档是该系列的第四篇,主要描述MQ在高速公路联网收费系统中的应用。该案例不对整个系统和业务进行介绍,而只是针对其中的数据传输模块进行阐述。
背景介绍
我国的高速公路经过多年的发展,规模日趋完善,但高速公路的管理却明显跟不上高速公路自身的发展。由于投资体制、管理体制等多方面的原因,我国高速公路基本上都是分段建设,一路一公司,分散管理。在我国高速公路里程不断增加且逐步贯通成网的情况下,这种分段割据的管理状况,一方面严重影响了路网的统一性;另一方面增大了管理成本。如一些地方同一路线上多个合资公司并存,互相独立,分段收费,造成主线站设置过密,影响畅通。
为了打破这种分散式管理的局面,交通部颁布了《高速公路联网收费的技术要求》。车辆只需在高速公路的出入口停车收费,即使跨区段行使也是如此,分段计费、财务结算和分割由计算机自动完成,驾驶员无需在同一高速公路上分段停车缴费,从而提升通行效率。
系统介绍
高速公路联网收费系统一般由车道收费与控制系统、收费站系统、路公司分中心系统、收费结算中心系统构成。
联网收费系统示意图
其中,车道和收费站之间是局域网,其他的都是广域网。
上述各系统间存在大量的数据通信,例如车道系统每天需要将原始缴费记录和对一些违章违法车辆的抓拍图像逐级上传到结算中心,结算中心除了负责定期财务结算外还负责日常的管理,结算中心需要将各种通知、命令、费率表以及配置信息及时的逐级下发到各个车道,因此系统中的通信模块在其中的作用至关重
要。
MQ解决方案
经过分析,该案例的数据通信具有如下特点:
通信系统之间是典型的树形结构;
任意两级系统之间最好采用异步的通信模式,异步通信的好处在于当对方系
统和网络状况正常的时候会很快的将数据传递过去,否则会将数据暂存起来,等到正常后再发送。以车道系统和收费站系统为例,当两者之间的网络故障时(尽管是局域网,仍然有可能故障),车道系统会将数据缓存起来,等到故障排除后再进行发送;如果采用同步的方式,则必须等到故障排除后才能进行下一步操作,这对过往的车主来说是无法忍受的。
另外,根据这个案例的业务特点,相关的通信需求如下:
由于涉及到资金等关键业务数据,因此必须保证数据的可靠传输。例如在发
生各种突发故障时(如网路断线,机器掉电等故障)保证数据不丢失,并在故障排除后能够被继续传输;
由于系统需要7*24小时的收费运营,必须保证通信子系统的稳定运行; 收费站在某些时候可能会有大量的车辆通过,如节假日,这就要求通信子系
统要具有长时间传输大量数据的能力;
随着车流量的不断增加,收费系统的业务量也会不断增加,现有的主机处理
能力可能难以满足需求,这就要求通信子系统具备很好的扩展能力,在不影响现有系统的前提下能够动态的增删车道、收费站、路公司分中心节点。综合上述这些需求和特点:异步通信、层次化或网状的通信网络、可靠传输、大数据量传输、动态扩展…等,我们可以发现:消息中间件是这个案例中通信子系统的最好选择。以下就是基于MQ的解决方案:
MQ解决方案示意图
整个数据流程如下:
1)车道收费系统将车辆原始缴费信息等提交到与之关联的MQ Server;
2)车道MQServer将记录暂存在本地并返回;同时MQServer会检查收费站的MQ Server是否可达,如果可达则将原始的缴费记录投递过去;
3)收费站MQ Server定期(一般是一天传一次)将本收费站所有车道的原始
记录投递到路公司分中心进行统计汇总;
4)路公司分中心MQ Server定期将汇总信息上传到结算中心;
5)结算中心定期进行结算、财务分割,后端还可能与银行、车辆通行卡管理中
心进行对接,进行资金划拨和通行卡账户金额管理。与这些系统对接也最好通过MQ来完成,本文档为了简单起见就不再展开来描述。
后续根据业务需求如果需要增加车道或收费站,对通信子系统来说,只需要在相应的节点上增加一个MQ Server,并分别配置一条传输通道到它的上级节点和下级节点即可,对现有系统不需要做任何改动。
案例总结
以上只是对高速公路联网收费系统的简单描述,实际使用场景可能会有一定的出入,比如系统的组网可能会更加复杂,除了树状的组网外还有网状结构,也有可能组网的层次会更多,但组网越复杂越能体现MQ的优势。
从这个例子我们也可以看到,MQ虽然是一个底层的中间件产品,但并非难以理解,它提供的功能其实非常单一,就是“提供可靠的数据传输”。在这个网络高度发达的时代,这种应用之间的通信场景比比皆是,以本案例所在的交通行业为例,除了高速收费外,在公安局的停车场监管系统、海事局的水上交通安全
管理系统,以及地铁、城市交通等系统中,都能找到大量的MQ使用场景。
第二篇:ETC技术在广东省高速公路联网收费中的应用案例
建议研究的主要内容:
目前国内仅少数省份建立了省级高速公路联网监控中心,但其整体水平和智能化程度均不高,资源的整合力度较弱,路段监控系统中存在的大量异构视频信号或异构设备数据难以在统一的联网监控平台下进行管理。课题以广东省交通集团高速公路监控(客服)中心的建设工程为依托,构建全省联网监控数据中心,无缝整合异构视频资源,利用GIS技术实现路网状态展示和指挥调度决策支持。
最终提高全省联网监控标准化程度和路网综合管理水平,为公众安全出行提供更加便捷、顺畅的服务,为道路管理者提供交通处置和应急指挥的决策支持。课题的主要研究内容包括:
1、全省联网数据中心。研究并建立全省联网监控数据中心,实现所有路段监控数据的集中统一管理(包括视频以及数据的采集、存储、分析、挖掘、应用以及增值等等)。这是随后一系列智能化路网状态分析、评估、展现以及发布的基础;也是提高整个路网综合营运管理智能化水平的重中之重。
2、异构视频资源整合。研究各种视频信号资源(包括模拟视频信号、数字视频信号)与视频格式(包括MPEG2、MPEG4、H.264等)并进行无缝整合,重点解决多种视频系统不能有效管理与共享的弊端,构建综合视频管理平台。
3、基于GIS、GPS的路网分析。研究全省高速公路路网拓扑结构,建立全省高速公路路网地理信息基础数据,包括路段路线信息、桩号坐标信息、监控设备坐标信息、路线分段(双向,一公里分为一段)、路段交汇点、互通立交点、禁止通行点等等;以此为依据实现快速准确定位;结合联网收费系统车流数据实现路网营运状态综合分析、出行路线规划查询、营运及事故信息直观显示等;并结合GPS技术为集团内部车辆管理提供最高效的方式。
4、应急指挥调度。研究针对各路段、各区域具体情况的应急预案,开发应急预案管理及指挥调度系统软件,提高相邻路段间的协调调度能力,实现路网安全畅通。
5、出行信息发布网站。研究各种交通信息发布技术与渠道,开发公众出行信息发布网站,及时向社会工作发布实时路况信息,使信息真正发挥作用,实现联网监控系统的社会效益,并通过合理的渠道实现信息的有偿增值服务。本课题的研究,主要有以下创新点:
? 通过建立全省联网监控系统数据中心,对监控系统中的数据进行统一规划,完成标准化的数据字典,最终实现所有路段监控数据的集中统一管理,提升监控管理的标准化水平。
? 通过建立综合视频管理平台,使得不同格式的视频信号、实时视频信号与历史查询视频信号在同一软件平台上进行统一管理。同时构建冗余视频通道,为指挥调度决策提供现场实时图像支持,为事故调查取证提供录像查询支持。
? 研究广东省高速公路路网拓扑结构及运营状态综合分析技术,建立全省高速公路路网地理信息基础数据,结合联网收费系统车流数据实现路网营运状态综合分析、出行路线规划查询、营运及事故信息直观显示等。
? 开发基于GIS、GPS的应急预案及指挥调度系统,实现直观化、高效率的应急指挥调度。通过广东省联网监控综合管理平台的建设,将实现以下目标:
? 构建全省联网监控数据中心,实现所有路段监控数据的集中统一管理; ? 无缝整合各种视频信号资源,构建综合视频管理平台;
? 将地理信息系统(GIS)与GPS导航技术相结合,实现路网状态综合分析及直观展示; ? 建立应急预案及指挥调度系统,提高相邻路段间的协调调度能力,实现路网安全畅通; ? 建立丰富的交通信息对外发布渠道,实现信息增值。
ETC技术在广东省高速公路联网收费中的应用案例
来源:广东联合电子收费股份有限公司 作者:宋启明 2010-6-5 13:22:25 评论
0 条
广东省高速公路联网收费从1998年开始开展前期工作,2002年正式启动,经过两年多的努力,在2004年底取得突破性进展,12月18日广东省高速公路联网收费系统正式开通。广东省高速公路联网收费项目采用组合式收费技术方案,推广采用电子不停车收费(ETC)技术,大大提高了公路的通行效率。本文对广东省高速公路联网收费推广ETC的有关技术和营运情况进行介绍。
一、项目总体建设目标及规划
广东省高速公路联网收费项目的总体建设目标:一是分区域实现高速公路联网收费,取消区域内主线收费站,逐步实现区域合并;二是采用兼容电子不停车收费和人工半自动收费的组合式收费技术,实现粤通卡全省“一卡通行”;三是推广采用电子不停车收费技术,提高公路的通行效率。
按照这一目标,广东省公路联网收费工作先在高速公路实行,再推广到普通公路电子收费。其中高速公路联网收费工作分成三个阶段实施: 第一阶段至2 0 0 5年底结束,全省高速公路分6个区域实现联网收费,同时开通电子不停车收费与粤通卡一卡通行;第二阶段是从2 0 0 6年开始,全省的6个区域合并成3个区域,进一步扩大不停车收费的范围; 第三阶段是从2 0 1 0年开始,争取用几年的时间,把全省3个区域合并成1个区域,使电子不停车收费成为全省公路收费的主流形式。
二、目前项目进展
广东省高速公路联网收费系统在2004年底开通营运,目前已稳定运行了三年多,数据结算准确安 全,业主账务拆分清晰,营运管理有序进行,用户使用ETC缴费高效、快捷。截至目前,全省62条高速公路已有60条实现联网收费和粤通卡缴费,撤并16个主线收费站,减少新建主线站29个,建成开通166条ETC车道;2006年结算通行费金额已达到168亿元,其中非现金部分的通行额已接近20亿元。粤通卡单月的缴费金额已占高速公路收费额的1 3%,一些车流量较大的高速公路,如广深高速公路,已达到了1 7%以上。
目前广东已建立了一个覆盖全省范围的、全方位的粤通卡客户服务体系。在全省2 1个地级市都建立了客户服务中心,并开通了集呼叫中心、互联网服务和短信服务于一体的96533客户服务平台,此外,利用社会资源开通了4 0 0多个银行充值代理点、2 3 7个加油站服务代理点、若干个汽车4S店代理点和一批分布在主要收费站旁的快速安装点。粤通卡和ETC收费的优越性和便利性已经得到了社会认可,用户发展迅速,应用环境曰趋成熟。除了在广东省内的应用,粤通卡还与香港的ETC同行合作在香港发行了 决易通·粤通卡”,实现跨区域联网合作。2006年9月份,澳港两地不停车联网缴费网络开通,5万多的粤港两地牌照的车辆用户可持“快易通·粤通卡”在广东省内享受到ETC和粤通卡非现金缴费服务。
三、项目营运模式
(一)建设模式
广东省高速公路投资主体复杂,协调难度大,为了协调各方利益,广东省制订了“统一规划、统一标准、统一发卡、统一结算” 的原则,专门成立了不以营利为目的的联网收费专营公司一一广东联合收费公司,以企业化运作的方式负责全省联网收费系统的具体实施工作,为全省高速公路联网收费系统运行的实施打造了统一的技术支持、营运管理与服务平台。
由广东联合收费公司负责投资建设粤通卡(非现金)结算中心、联网收费(现金)结算中心及六个区域管理点、粤通卡客户服务网点; 由各个路段业主负责区域路段收费系统的建设及改造。这种建设模式分工明确,降低了整体营运成本,提高了综合效益按照上述的建设模式,营运管理也分工清晰,各有关单位各负其责。这一模式将公路收费从封闭管理格局转化为区域协作管理的格局。彻底打破了“一路一公司” 的封闭式管理模式,广东联合收费公司与各路段业主、银行之间的职责、权利、义务关系均界定清晰。通过大力推广粤通卡和ETC收费,打破了原来公路区域分割、封闭收费的格局,增加了公路收费的透明度和服务性,使公路收费从传统的管理职能转变为主动的服务功能,大力提高了公路系统的道路通行能力和行业管理水平,全面提升了电子信息服务在公路系统的应用水平,提高了整体运作效率。
(二)商业化的运营服务模式
首先,在客户服务方面,广东联合收费公司建设了覆盖全省的客户服务中心,组建了专业的客户服务团队、并与社会合作建设了一大批代理油站、银行代理点,在需求量大的主要收费站设立了粤通卡的快速安装点,在全省开通了965 3 3的粤通卡服务热线,与邮政合作推出了“电话订购、送卡上门”等服务,解决了粤通卡发行的瓶颈问题,为用户提供多样化、便捷的贴身服务。
其次,广东联合收费公司在服务内容上不断推陈出新,制订了全省统一服务规范,使客户在任一网点都可享受统一、规范的标准化服务,定期为广大车辆用户提供发票和清单邮寄服务,方便司机报销和财务管理,使客户的发票管理更加严谨简单。此外,有针对性为不同类型的客户提供个性化服务,如卡片的个性化印刷、充值、月结、扣款短信通知,网上转账自动充值、零余额账户解决方案等服务。
再次,在推广方面结合高速公路实际情况开展针对性专项营销,吸引现金缴纳通行费的客户使用粤通卡走ETC通道,吸引车辆使用粤通卡走高速公路,提高业主的通行费收缴金额,提升收费站通行能力,实现广东联合收费公司、路段业主、车辆用户三赢局面。
在品牌建设与服务宣传方面,广东联合收费公司坚持服务社会、方便群众的宗旨,以诚信服务为核心,建立统一的品牌形象,统一宣传规范,通过市场化的宣传推广策略,在品牌方面实 现“高知名度、高参与度、高认知度” 的目标,从产品、传播和客户的角度建立鲜明的形象和认知。在营销推广方面,以公司不营利的公益特点和实力为基础,强化品牌的公信力,提升客户对产品和服务的认同,提高品牌的认知度和美誉度。为了确保广大车辆用户办理粤通卡业务更方便、更快捷,广东联合收费公司正不断拓宽粤通卡的服务领域,利用已有粤通卡平台,从自身实际出发,以满足广大群众利益为出发点,把应用范围进一步推广到与群众出行、消费有关的公路缴费和电子支付等方面。
四、项目效益
根据交通部公路科学研究院对广东高速公路联网收费项目进行的效益评价,按2006年的高速公路建设规模,广东全省高速公路联网收费后,实现撤并、减少主线收费站和采用ETC收费技术大幅度提高了通行效率,累计减少建设费用约1 4亿元,每年减少运营费用约1,5亿元。预计至2 0 1 0年,节约建设和营运费用约61,5亿元,远期至2020年预计累计可节约建设营运费用约1 4 7,1亿元。~PA'I-,ETC每条车道通行能力相当于5— 7条人工车道,以目前建成开通的161条ETC车道计算,未来至少可减少建设6 0 0多条人工收费车道,全省因此可节约收费站车道扩建费用约20多亿元,同时大幅度节约营运成本。
除了给道路投资带来巨大经济效益,项目还大大节约了道路使用者的油耗和时间,符合节能减tl}的需求。广东省因实施联网收费累计为道路使用者带来巨大效益,这些效果最终体现为社会成本的显著降低,以及宏观经济效益的提高。
五、发展规划
广东省高速公路联网收费为用户提供方便快捷的不停车和停车方式非现金收费服务,同时也搭建了一个覆盖范围广阔的电子交易支持平台。下一步广东联合收费公司将坚持以科学发展观统领发展全局,发挥全省统一品牌、全省统一结算体系、遍及全省的客服及通讯网络、技术领先等四大优势,整合省内相关资源,构建泛珠三角区域电子支付基础体系,使公司在业务和资产规模方面将实现跨越式发展,在管理上向集团化经营发展,使公司成为国内领先的电子支付营运商,全力打造广东省“交通一卡通
第三篇:UML建模技术在高速公路收费系统软件设计中的应用
UML建模技术在高速公路收费系统软件开发中的研究及应用
张治元
(长沙通信职业技术学院计算机信息工程系 湖南 长沙 410015)
摘 要 本文在分析UML建模技术的基础上,提出了基于UML的高速公路收费系统。详细分析了系统的逻辑结构、两层C/S体系结构、MIDAS技术、Socket通讯;并设计了车道收费系统。
关键词:统一模型语言 收费系统 多层分布式应用服务 安全套接字 分类号:TP393.08 文献标识码:A
Investigation and Application of UML modeling
in highway charge system
Zhang Zhiyuan(ChangSha Communication Technology College, The Computer and Informnation Inpartment,changsha 410015)Abstract: This article put forward a highway charge system based on UML after analyzed the modeling technology with UML。This article detailed analyzed the logic structure, the two-layer Client/Server architecture, the technology of MIDAS, the communication of Socket, and designed the roadway charge system and the station management system。
Key Words:
UML highway charge system MIDAS Socket 1.引言
1994~1996年软件工程家Grady Booch.Ivar Jacobson.James Rumbaug先后集于Rational公司,他们以各自原有的方法为基础,并吸收其他方法的长处,共同提出新的面向对象的分析与设计语言----统一模型语言UML(Unified Modeling Language)。
UML的目标是以面向对象图的方式来描述任何类型的系统,适宜建立软件系统的模型。此外,UML适用于系统开发过程中从需求规格描述到系统完成后测试的不同阶段。
UML是一种建模语言,不是一种方法,它独立于过程。利于它建模时,可遵循任何类型的建模过程。但该建模语言的作者们给出了一种推荐性的建模过程指导,即RUP(Rational Unified Process)。
RUP是以用例为驱动、体系结构为中心、迭代和增量的过程。RUP包括四个阶段(包括初始、细化、构造、迁移),每个阶段又分为若干次迭代,每次迭代都有一个核心工作流(包括需求、分析、设计、实现、测试5个活动:)。
总之,标准建模语言UML适用于以面向对象技术来描述任何类型的系统,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。
本文的第二部将对高速公路收费系统的体系结构的设计作简单的描述;第三部分详细介绍系统的关键技术-MIDAS技术和Socket通讯;车道软件系统的实现将在第四部分中给出;最后是全文的总结。
2.系统的体系结构设计
本系统的体系结构图(图1)用UML描述如下:
其中收费操作在车道机实现、管理操作在管理机上实现。应用服务器是中间层,它们和数据库服务器一起形成事实上的多层体系结构。本系统中,由于车道和收费站分布的分散性,必须要把界面部件和工控控制部件从应用服务上分离开来。应用服务器上可接多台异地管理机,方便管理者异地操作管理。管理机程序也可以直接和车道机通讯,比如监控收费员收费等,从而减轻应用服务器的负荷、减少网络通信量。
多层C/S结构各层间的通信效率若不高,即使分配给各层的硬件能力很强,其作为整体来说也达不到所要求的性能。此外,设计时慎重考虑各层间的通信方法、通信频度及数据量也是非常必要的。在本系统中,通讯分为三种实现:一为MIDAS实现,如监控服务部件——监控界面部件、信息查询分析接口部件——查询分析界面部件;一为TCP协议,如监控服务部件——工控控制部件;而车道机——服务机、车道机——管理机通讯采用UDP协议。
图1 系统的体系结构图
3.系统关键技术
(1)MIDAS技术
系统选用Delphi作为开发工具。Delphi具有几乎完美的面向对象语言和技术,具有完善的数据处理能力和对标准技术的完整支持。更为重要的是内置的MIDAS体系对多层C/S的充分支持。
MIDAS(Multi-tiered Distributed Application Services),即多层分布式应用服务,是Borland公司的一项成熟技术。MIDAS技术是基于面向对象编程模型的,支持CORBA和DCOM的Delphi集成开发。Borland 提供了通过DCOM、TCP/IP和OLEnterprise等连结方式。MIDAS可以把数据集包装为Variant、OLE Variant或Any,然后作为参数跨网络传递给远程方法调用。服务器端将数据集打包成Variant,并传输到客户端,在客户端数据包被解包,并通过界面显示给客户端用户。客户端通过调用应用服务器上的IProvider接口,实现对应用服务器上相关方法的访问和操作。由于接口是基于DCOM的,所以,客户端的访问和调用都是自动完成的,基本不再需要人工干预——当客户机访问服务器时,如果服务器应用还没有运行,客户程序将自动激活它。因此本系统中监控服务部件——监控界面部件、信息查询分析接口部件——查询分析界面部件通讯用MIDAS实现,这对在管理机上异地操作的管理员来说是非常便利的。当然,DCOM编程机制是比较复杂的,但MIDAS技术简化了DCOM应用。
(2)Socket通讯
Socket是双向的通信端点,按通信特性可将套接字分类,主要有两类:TCP协议和UDP协议。TCP协议是基于字节流的Socket,提供可靠和无差错的字节流通信。采取稳定的连接和差错检测机制来保障通信的质量,但消耗资源大。由于收费信息要可靠和持续的传递到应用服务器,故工控控制部件——监控服务部件之间通过TCP协议建立连接通信,由Delphi中tclientsocket和tserversocket的子类实现。
UDP协议是基于数据报的Socket,提供不可靠的无连接数据报传输服务,优点是消耗资源小,占用网络频宽小,速度快。管理机要根据需要监控某车道机,是和车道机瞬时的间断的通信,不需要进行持续不断的通信,不需建立稳定的连接,对信息传输的质量也不要求很高,故采用UDP协议,由Delphi中TNMUDP类继承实现。
4.车道收费系统设计
本文仅描述入口车道软件系统的设计过程。(1)功能设计
入口车道的主要功能是录入车型、车种、入口站代号,然后发放IC卡作为通行证,同时要对免费车、冲关车、车队和作废等进行处理,对出现异常或故障的车道要先关闭作下班操作。为了满足实时性和稳定性的要求,在设计车道收费系统中采用后台控制技术而没有采用多线程的形式,系统采用两层C/S结构,本地有本地数据库,与站级数据库的联系采用后台技术。这样在网络繁忙或网络不通 时也能按时完成收费,从而保证了系统的实时性和稳定性的要求,如果采用多线程,发生上述故障时,系统必须等待,这样就不能满足收费系统的要求。
为了提高程序运行的响应速度,程序采用状态控制方式,设计一个状态变量state,程序根据当前state的值决定下一步的处理流程(图2)。state的值有12种,它们分别是:
图2 入口发卡状态图
state=1:初始状态;
state=2:输入用户名和密码状态; state=3:等待处理状态; state=4:车型处理状态; state=5:处理完成状态; state=6:正常下班处理状态; state-7:车队处理状态; state=8:车队处理结束状态; state=9:免费车处理状态; state=10:冲关处理状态; state=11:异常下班处理状态; state=12:异常处理状态。
系统设计了一个显示当前处理的变量lnextstate.caption,动态显示当前需要或正在处理的信息,以便操作能进行相应的操作。
车道部分还包括许多工控设备,如车辆检测器、显示灯和自动栏杆等。为了提高响应速度,这些工控设备与车道机的通讯采用串口通讯。辅助设备还有语音器、费额显示器和摄像头等。(2)程序设计
本系统首先定义了一个TMainF类,TMainF类是从TForm类继承而来的,他是一个主窗体,是其他控件的载体。
其中设置了六个容器控件,十四个标签控件,两个状态显示控件和三个查询控件,用以显示各种信息和状态,查询数据等。设置了一个时钟对象,用于处理时间同步问题。设置了两个通讯对象,即消息传递对象,处理从工控设备传来的信息和向工控设备发送控制命令。设置了一个本地数据库对象,用于本地数据库的数据检索与查询。设置了三个图象对象,用于显示图象信息。
程序的功能是通过函数或过程中实现的,下面以车队处理为例来说明函数或过程的实现,车队处理过程设计如下:
如何判断是车队,先调用BarUP()函数,参数为1,在窗体用图像显示栏杆抬起,然后调用UpDateLed()函数,参数为0,控制自动栏杆抬起,让车辆通行,调用SetColor()函数,参数为1,将红绿灯设置红绿灯,并显示“车队”操作和“抬起栏杆”。
程序代码如下:
procedure TMainF.DoSquence;begin BarUp(1);//图像显示栏杆起与降,0表示放下,1表示抬起
frmStart.UpdateLed(0);//控制自动栏杆的抬起与放下,0表示抬起,1表示放下 SetColor(1);//置红绿灯,0为红灯,1为绿灯 lNowOperation.Caption:='车队';lNextstate.Caption:='抬起栏杆';end;5.结束语
本高速公路收费系统采用面向对象方法和UML建模技术,选用Delphi作为开发工具,充分利用其MIDAS技术和Socket通讯,在开发过程中较好地解决了实时性、准确性、稳定性和扩充性。充分满足高速公路收费系统的总体要求。
UML的应用在飞速发展,在本系统的设计中对UML的应用还不是全方面的,UML暂只提供C++与Visual C++、Java、Visual Basic、XML DTD和CORBA/IDL代码生成与逆向转出工程代码,不支持Delphi代码生成与逆向转出工程代码,因此在分析设计后不能直接转换为代码,需要进一步研究。【参考文献】
[1](美)Bran Selic.A generic Framework for Modeling Resources with UML[J].Computer:Innovative Technology for Computer Professionals,Membership Magazine of the IEEE Computer Society 2000,33(6):64~69 [2]刘宇熹.高速公路收费系统的设计与研究[J].华南师范大学学报(自然科学版),2001.1 :57~61 [3]王晓红.高速公路收费系统应用软件的设计与实现[J].交通标准化, 2001,No.4: 21~24 [4]方幼林等.数据仓库中数据质量控制研究.计算机工程与应用,2003.13:1~4 [5]陈宇等.采用E2CN拥塞控制的TCP连接时延模型分析.计算机工程,2005.11:16~18 [6] Douglas E & Comer Davi.TCP/IP网络互连第3卷:客户/服务器编程及应用Linux/POSIX Sockets版.人民邮电出版社.2002年1月
[7](美)Alexander M.Meystel &James S.Albus.智能系统——结构、设计与控制.电子工业出版社.2005年1月
第四篇:循序渐进,逐步建设宁夏高速公路联网收费系统
循序渐进,逐步建设宁夏高速公路联网收费
贾斌 张晶 王芳 王晓东
(宁夏交通信息监控中心,宁夏 银川 750001)
摘要:本文系统阐述了宁夏高速公路联网收费的建设思路、总体计划、实施建议及每一建设阶段的工作重点和工作任务,对全区高速公路机电工程的建设和具体实施具有重要的指导意义。关键词:高速公路 联网收费 建设思路引言
宁夏的高速公路建设起步于1997年,经过7年多的建设,截止2004年末,已建成通车高速公路里程达549公里,自首府银川市向周边省市贯通的高速公路网已初步形成。随着高速公路网络的不断发展和完善,高速公路联网收费系统也在逐步发展建设中。
理者对交通信息系统建设的需求不断增加,迫切需要我们改变目前的现状,尽快实现全区的联网收费。
实现高速公路网的联网收费运营管理,实现对通行费的拆分、结算、划拨、IC卡的统一发行与管理以及与之相关大量技术标准的统一问题,是宁夏高速公路联网收费建设的重要和迫切问题。合理的解决好这个问题,宁夏高速公路联网收费的现状及建设思路
宁夏高速公路机电系统建设和运营管理相对滞后于高速路网的发展,机电工程仅实施了单站收费系统,监控、通信系统尚未建设。
(1)宁夏高速公路实行建管分离,运营管理采用二级管理模式。
(2)宁夏高速公路收费系统建设均按照“单站收费、一卡通行”的原则实施。
(3)已建成通车的高速公路交通流量较小,基本为自由流状态,服务为一级水平,路网的监控、通信系统尚未建设。
随着高速公路路网规模的不断扩大、收费站的增加、业务量的增强以及交通流量的提高,以上模式将不再适应建设发展和运营管理的需要。加之近年来高速公路用户和管
对避免投资浪费,高效发挥高速公路交通工程系统的功能具有重要的意义。由于高速公路联网管理中收费、通信、监控三大系统涉及到机电工程技术发展迅猛,在各个分阶段建成通车的高速公路联网的过程中,管理衔接、收费接口、通信接口以及联合监控等问题往往容易造成先期建成的设备和后期设备无法良好兼容使用,这些问题在各条高速公路单独进行的交通工程设计中,也往往不能得到有效的解决。只有站在全区甚至全国高速公路联网管理建设的高度上,从整体实现宁夏高速公路网的管理科学、收费有效、便捷畅通、安全舒适,进行统一规划、统一设计才是解决好这一问题的根本途径。
宁夏开展高速公路联网收费建设的的研究工作比较早,在区内第一条高速公路开通之前就开始了这项工作,目的就是要解决在相当长的一段时间内宁夏高速公路联网收费建设过程中设计、建设及运营中的问题。通过大量的工作,宁夏最终确定了“单站收费、一卡通行”,待管理中心建成后“建设一段、并入一段”的总体建设思路。现阶段,宁夏的联网收费技术还只停留在收费站一级,仅仅是实现了“一卡通行”,还没有建立起联网收费运营管理的框架,完成联网收费还有许多工作。宁夏高速公路联网收费建设实施的总体计划
目前,《宁夏高速公路联网收费技术方案》、《宁夏高速公路联网收费、监控、通信系统暂行技术要求》已于2005年2月通过了交通厅的审查,从而确定了全区联网收费系统实施的技术路线和总体方案。同期宁夏高速公路管理中心作为全区联网收费的核心,其房建初步设计已通过交通厅审查,现正进行施工图设计,将于2005年开工建设。统筹、科学、合理地安排各项工程的实施,确保联网收费总中心和分中心、分中心和收费站的同步建设,全面加快全区联网收费的建设周期,是总体计划的关键问题。3.1 银川分中心建设及相应改造
要实现全区联网收费,首先要建设高速公路通信干线以及干线汇接点,以保证全线的数据传输。银川既是宁夏路网的中心,又是联网收费的中心,在通信系统上还是一个重要的汇接中心,因此银川分中心片区的通信系统有必要在第一阶段实施。同时,银川片区的通车路段里程最长、车流量最大,且片区管辖的重点路段(包括石中北段、姚叶
段、银古王线和银川绕城高速南环)已建设完成,银川片区分中心的建设时机基本成熟。另外,姚叶等路段收费系统因开通时间较长,部分设备已老化,需要更新,可以借此时机按照联网收费的技术要求进行相应改造。
所以这一阶段联网收费建设的重心应放在银川片区分中心的建设和其管辖路段机电系统的软硬件改造上。
3.2 银川片区联网收费系统的调试和试运行阶段
在银川片区分中心的建设和其管辖路段机电系统的软硬件改造完成后,可以将片区
内符合联网收费的路段接入银川分中心,逐步实现银川片区内的联网收费,并进行调试和试运行。
同时,这一阶段也是我们汲取联网收费的建设经验和培养技术队伍的重要时期。3.3 中宁、固原片区分中心建设阶段
按照规划中宁片区近期(2004-2009)建设的高速公路为210公里,固原片区近期(2004-2009)建设的高速公路为62公里,所辖路段里程较短。在这一阶段里,中宁、固原片区的高速公路网已部分开通,其建设时机也逐步成熟起来,特别是固原片区分中心。在这一阶段同样要注意建设的同步性,即中宁、固原片区分中心的建设应与所辖路段的建设同步进行。
3.4 高速公路管理中心机电工程建设和全区联网收费系统的调试、试运行、运行阶段
在银川、中宁、固原片区内联网收费的建设完成同时,宁夏高速公路管理中心房建工程也基本建设完成,通信干线网形成了自愈环保护形式,全区高速公路联网收费系统
建设时机成熟。在这一阶段可以进行高速公路管理中心机电工程和已建成、改造完毕的高速路网在全区范围内的联网调试、试运行和运行,最终实现全区的联网收费、监控和通信系统。宁夏高速公路联网收费系统第一阶段具体实施建议
4.1 第一阶段的总体实施方案与内容 4.1.1 银川分中心的建设
目前银川分中心有两种建设思路:一种是和即将建设的高速公路管理中心同址建设,另一种是在银川互通立交或银川收费站建设。考虑到总中心和分中心某些设备可以共用,选用第一种建设思路会比较经济,但不利于分期建设。
考虑到总中心和分中心同期建设的必要性以及银川片区联网收费建设时机已基本成熟,在银川互通立交或银川收费站建设银川分中心不失为一种较好的思路。按照《宁夏高速公路联网收费三大系统暂行技术要求》的标准,相对弱化银川分中心的收费系统和监控系统建设,在满足基本管理要求(如联网收费管理,重要路段、特大桥梁的监视)的基础上,逐步将银川分中心所管辖范围内的路段并网管理。这不仅可以为全区高速公路联网收费和管理中心的建设、管理积累经验,有利于培养技术管理人员,而且如以后考虑将银川分中心的管理功能上移到总中心,可把银川分中心的设备用于中宁和固原分中心的机电工程建设,避免不必要的资金浪费。
4.1.2银川片区通信系统的建设
为实现全区联网收费管理,必须首先建设银川片区管理区域的高速公路通信干线以及干线汇接点,以保证全线数据传输。4.1.3银川片区监控系统的建设
银川片区高速路网密度最大,交通流量也不断增加,为满足长期发展的要求,监控系统外场设备应按《宁夏高速公路联网收费
技术方案》中规划的服务水平二级来设置。但在具体设计上,应按“一次设计、分期实施”的原则进行。4.1.4收费软件的统一
2005年宁夏联网收费系统建设要实施三个项目,即:同固高速公路收费系统、中营高速公路收费系统、姚叶高速公路收费系统改造,同时面临一个问题——计重收费改造(含新路段的新建)问题,实施计重收费原有的软件就必须进行改造。
高速公路站级收费软件是保证系统功能和正常联网运行,以及进行系统升级改造的核心和关键,并在某种程度上反映出系统功能的优劣和建设水平的高低。目前宁夏高速公路机电工程的软件由三个承包商分路段开发,三家公司的收费软件也基本兼容。但是,考虑到全区高速公路联网收费的发展需求和目前计重收费、车牌自动识别、费率表结构更改等原因及将来的新的需求,都将引起原有收费软件的改造和升级。过多的软件承包商必将给建设单位造成协调工作量大,后期维护成本高等问题。所以,必须对全区收费软件进行统一改造。
4.1.5银川片区站级收费系统的软、硬件改造
目前银川片区内已建站级收费系统不能够满足联网收费系统的要求,要实现银川片区的联网收费必须对其进行改造,主要包括以下几方面内容:
(1)片区内站级收费系统设备的更新、改造
银川片区内已建成通车路段的收费系统因建设时期早,在新的技术条件下,已不适应全区联网收费的需求,且部分设备已老化,尤其是姚叶段收费系统更新迫在眉睫,都需按照联网收费的技术要求进行更新改造。
(2)计重收费系统的实施
实施计重收费是宁夏全区高速路网范围内的一件大事,不仅要考虑新建路段的建设,还要考虑老路段的改造,并且所要实现的计重收费应是联网计重收费系统,这就对联网收费提出了新的要求。
a)实施联网计重收费需要增加或更改
相应的车辆处理流程;
b)实施联网计重收费需要收费车道在土建、标志、设备、软件及硬件等方面进行改造;
c)实施联网计重收费需要对收费站软
件、收费总中心软件提出新的要求;
d)实施联网计重收费需要对联网收费
数据编码重新定义
所以,制定宁夏高速公路计重收费技术方案及技术要求,以保证全区收费软件的统一和联网收费的顺利进行是一项重要的工作。
(3)车牌自动识别系统的实施
实施车牌自动识别系统与实施计重收费一样,不仅要考虑新建路段的建设,而且要考虑老路段的改造。车牌自动识别系统是防止“倒换卡”等作弊方式的有效手段,即在入口,识别车牌号、抓拍图像、分割二值化图,将其存储,车牌号及二值化图写入通行卡中;在出口,识别车牌号、抓拍图像、分割二值化图,将其存储,同时读取通行卡上信息,在车控机中进行出入口的车牌号码匹配对比,若车牌不符,收费系统向收费员提示报警同时弹出出入口二值化图,收费员人工判断车辆原始图片上的重要部分——二值化图是否一致,若不一致基本可以确认是换卡车辆,再调图取证处罚。所以,实施车牌自动识别系统同样需要对现有收费车道的软硬件进行改造。
为节约建设时间和成本,避免不必要的重复,以上几项工作可在银川片区站级收费系统改造时期一并进行。
4.2银川分中心进入实施阶段后的具体工作内容
4.2.1前期准备工作
前期准备工作主要包括如下两方面的内容:
(1)根据宁夏高速公路的路网规划,科学合理地确定银川片区分中心的管理范围;
(2)要根据银川片区分中心的功能定位,做好银川分中心机电工程初步设计工作。4.2.2招标建设思路
根据银川片区分中心机电工程的主要内容工程招标可划分为两个标段:
(1)Ⅰ标段的工程范围为银川片区范围内通信系统、监控系统、分中心机电工程建设;
(2)Ⅱ标段工程范围为站级收费软件按照统一技术标准进行招标。4.3.3具体实施步骤:
(1)首先以姚叶段或银古王段为试点,结合计重收费和车牌自动识别系统的要求,对原有站级收费系统进行升级改造。待试点改造成功后,进一步推广,从而实现银川片区内所有站级收费软件的统一;
(2)其次完成银川片区范围内各条高速公路通信主干网、监控系统建设;
(3)最后完成银川片区分中心机电工程的初步设计和建设工作,实现银川片区联网收费。
4.3.4银川分中心机电工程初步设计工作内容
(1)银川分中心管辖范围内通信系统的设计;
(2)银川分中心管辖范围内监控系统的设计;
(3)银川分中心机电工程的设计;
(4)增加计重收费和车牌识别功能的站级收费软件的技术标准;
5.结束语
宁夏高速公路联网收费系统的建设是一个庞大的系统工程,资金投入大、建设周期长、参与主体多,不可能一蹴而就。在设计、招投标、施工过程中,要体现“统一规划、一次设计、分期实施、逐步联网、不断完善”的建设原则。本文所述内容可供从事高速公路机电工程建设的技术人员和管理人员参考借鉴。
参考文献:
[1]《高速公路联网收费暂行技术要求》[S],交公路发[2000] 463号,2000
[2]《高速公路交通工程及沿线设施》[S],人民交通出版社,2004
[3]《高速公路规划设计与管理》[s],哈尔滨工业大学出版社,2006
[4]《宁夏高速公路联网收费技术方案》[S],宁夏交通厅,2005
[5]《宁夏高速公路联网收费暂行技术要求》[S],宁夏交通厅,2005
第五篇:C语言课程设计《高速公路联网收费系统》代码
作者:吴侠志
就读院校:东莞理工学院
#include “stdafx.h” #define NUM 4 #define max_len 8 #include
char *mytime(struct tm *timeptr);
//获取系统时间的函数 void Delay(int n);//延时函数 char *filename(int startkey);void initialize(struct car *cars,int num,FILE *fp);///初始化函数 int refer(struct car *cars,int startkey);//查询
int km[10]={0,0,82,162,288,368,391,514,800,867};
/* 记录各站与首站的里程,单位:km */ double price[6]={0.0,0.6,1.2,1.8,2.4,3.0};
/* 记录各类车的里程价位,单位:元/辆公里 */ char *address[10]={“0”,“湛江”,“茂名”,“阳江”,“开平”,“佛山”,“广州”,“深圳”,“汕头”,“汾水”};char *kind[6]={“特殊车”,“一类车”,“二类车”,“三类车”,“四类车”,“五类车”};
struct car { int card_num;
/* 卡号 */ int car_type;int station_in;char time_in[26];int station_out;char time_out[26];char is_in;double money;int flag;}cars[9*NUM+1];
int num=0;int pass=0;int main(int argc, char* argv[]){ int i,key,choice,j,k,m,size;double pay,money;char enter,pwd[max_len+1],password[max_len+1],ch;FILE *fp;fp=fopen(“标记.txt”,“a+”);fclose(fp);
fp=fopen(“记录.txt”,“a+”);
fclose(fp);
printf(“t欢迎登录广东同三高速公路联网收费系统n”);printf(“┏━━━━━━━━━━━━━━━━━━━━┓n”);printf(“┃
1.湛江
2.茂名
3.阳江
┃n”);printf(“┃
4.开平
5.佛山
6.广州
┃n”);printf(“┃
7.深圳
8.汕头
9.汾水关
┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择所在站点,并输入该序号:”);int startkey;while(1){
fflush(stdin);
while(scanf(“%d%c”,&startkey,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
if(startkey==1 || startkey==2 || startkey==3 || startkey==4 || startkey==5 || startkey==6 || startkey==7 || startkey==8 || startkey==9)
{
break;
}
else
{
printf(“terror!!input again:”);
continue;
} } printf(“初始化中……”);
fp=fopen(“标记.txt”,“a+”);fscanf(fp,“%d”,&num);fclose(fp);
fp=fopen(“password.txt”,“a+”);fscanf(fp,“%d”,&pass);fclose(fp);if(pass==0)
{
} fp=fopen(“password.txt”,“w+”);fprintf(fp,“%d”,88888888);fclose(fp);
fp=fopen(“记录.txt”,“a+”);rewind(fp);initialize(cars,num,fp);
fclose(fp);Delay(5);time_t timer;struct tm *tblock,*a;timer=time(NULL);a=localtime(&timer);while(1){ system(“cls”);fflush(stdin);printf(“所在地:%s站n登录时间:%sn”,address[startkey],mytime(a));printf(“┏━━━━━━━━━━━━━━━━━━━━━┓n”);printf(“┃
1.发卡
┃n”);printf(“┃
2.检卡并收费
┃n”);printf(“┃
3.查询
┃n”);printf(“┃
4.注销并退出系统
┃n”);printf(“┃
5.退出系统
┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择,并输入序号:”);while(1){
while(scanf(“%d%c”,&key,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
fp=fopen(“标记.txt”,“r+”);
fscanf(fp,“%d”,&num);
fclose(fp);
fp=fopen(“记录.txt”,“r+”);
rewind(fp);
initialize(cars,num,fp);
fclose(fp);
j=0;
for(i=1;i<=9*NUM;i++){
if(cars[i].is_in=='y' && cars[i].station_in!=startkey && cars[i].station_out==0)
{
j++;
break;
} } k=0;for(m=1;m<=9*NUM;m++){
if(cars[m].is_in=='n' && cars[m].station_in==0 && cars[m].station_out==startkey)
{
k++;
cars[m].flag=k;
} } if((key==1 && k>0)||(key==2 && j>0)|| key==3 || key==4 || key==5)break;else if(key==2 && j==0){
printf(“t目前尚无车辆要离站!!input again:”);
fflush(stdin);
continue;} else if(key==1 && k==0){
printf(“t目前卡片不足!!input again:”);
fflush(stdin);
continue;} else {
printf(“terror!!input again:”);
fflush(stdin);
continue;} } if(key==1){ system(“cls”);timer=time(NULL);tblock=localtime(&timer);srand((unsigned)time(NULL));//用即时的系统时间来做随机数种子.生成随机数
choice=(rand()%k)+1;//随机生成choice,格式rand()%k即要求产生k以内的
for(m=1;m<=9*NUM;m++)
{
if(cars[m].is_in=='n' && cars[m].station_in==0 && cars[m].station_out==startkey && cars[m].flag==choice)
{
break;
}
}
printf(“卡号是:%dn现在时间是:%sn”,m,mytime(tblock));
cars[m].station_in=startkey;
cars[m].station_out=0;
strcpy(cars[m].time_in,mytime(tblock));
strcpy(cars[m].time_out,“无”);
num=1;
fp=fopen(“标记.txt”,“w+”);
fprintf(fp,“%d”,num);
fclose(fp);
fp=fopen(“记录.txt”,“w+”);
for(i=1;i<=9*NUM;i++)
{
fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out);
}
fclose(fp);
printf(“┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓n”);
printf(“┃0.特殊车:军警车、紧急车
┃n”);
printf(“┃1.一类车:小轿车、吉普车、的士头人货车、摩托车
┃n”);
printf(“┃2.二类车:面包车、小型人货车、轻型货车、小型客车
┃n”);
printf(“┃3.三类车:中型客车、大型普通客车、中型货车、大型豪华客车┃n”);
printf(“┃4.四类车: 大型货车、大型拖(挂)车、20英尺集装箱车
┃n”);
printf(“┃5.五类车: 重型货车、重型拖(挂)车、40英尺集装箱车
┃n”);
printf(“┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛n”);
printf(“请选择车型,并输入序号:”);
while(1)
{
fflush(stdin);
while(scanf(“%d%c”,&size,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
if(size==0 || size==1 || size==2 || size==3 || size==4 || size==5)break;
else
{
printf(“terror!!input again:”);
continue;
}
}
cars[m].is_in='y';
cars[m].car_type=size;
fp=fopen(filename(startkey),“a+”);
fprintf(fp,“%30s%8d%12s%20snn”,mytime(tblock),m,kind[cars[m].car_type],“发卡,放行”);
fclose(fp);
fp=fopen(“标记.txt”,“w+”);
fprintf(fp,“%d”,num);
fclose(fp);
fp=fopen(“记录.txt”,“w+”);
for(i=1;i<=9*NUM;i++)
{
fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out);
}
fclose(fp);
printf(“登记完毕,请发卡放行,并按任意键回到主菜单a”);
getche();
}
else if(key==2)
{
system(“cls”);
printf(“请输入卡号(按0返回):”);
while(1)
{
ch='y';
fflush(stdin);
while(scanf(“%d%c”,&choice,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
fp=fopen(“标记.txt”,“r+”);
fscanf(fp,“%d”,&num);
fclose(fp);
fp=fopen(“记录.txt”,“r+”);
rewind(fp);
initialize(cars,num,fp);
fclose(fp);
if(choice<0 || choice>9*NUM)
{
printf(“无此卡号...ntinput again:”);
continue;
}
else if(choice==0)
{
ch='n';
break;
}
else if(choice>0 && choice<=9*NUM && cars[choice].is_in=='n')
{
printf(“该卡号尚未发布...ntinput again:”);
continue;
}
else if(choice>0 && choice<=9*NUM && cars[choice].is_in=='y' && cars[choice].station_in!=startkey && cars[choice].station_out==0)
{
break;
}
else if(choice>0 && choice<=9*NUM && cars[choice].is_in=='y' && cars[choice].station_in==startkey && cars[choice].station_out==0)
{
printf(“该卡号车于%s从本站进入高速,尚在行...ntinput again:”,cars[choice].time_in);
continue;
}
else
{
printf(“terror!!input again:”);
continue;
}
}
if(ch=='n')continue;
cars[choice].station_out=startkey;
fp=fopen(“记录.txt”,“w+”);
for(i=1;i<=9*NUM;i++)
{
fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out);
}
fclose(fp);
if(cars[choice].car_type==0)
{
printf(“该车于%s在%s进入高速,为特殊车,无需收费n”,cars[choice].time_in,address[cars[choice].station_in]);
}
else
{
i=abs(km[cars[choice].station_in]-km[cars[choice].station_out]);
money=cars[choice].money=i*price[cars[choice].car_type];
printf(“该车于%s在%s进入高速,需缴费%.1lf款:”,cars[choice].time_in,address[cars[choice].station_in],cars[choice].money);
fflush(stdin);
while(1)
{
while(scanf(“%lf%c”,&pay,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
if(pay>money)
{
printf(“缴付%.1lf元,找零%.1lf元...n”,pay,pay-money);
money=0;
break;
}
else if(pay { money=money-pay; printf(“缴付%.1lf元,需再缴付%.1lf元:”,pay,money); continue; } else { printf(“已缴费完毕,共收取人民币%.1lf元...n”,cars[choice].money); break; } } } timer=time(NULL); tblock=localtime(&timer); printf(“现在时间是:%sn”,mytime(tblock)); strcpy(cars[choice].time_out,mytime(tblock)); 元,请付 fp=fopen(“档案.txt”,“a+”); fprintf(fp,“%5d%12s%15s%30s%10.1lf元n”,choice,kind[cars[choice].car_type],address[cars[choice].station_in],cars[choice].time_in,cars[choice].money); fprintf(fp,“%32s%30snn”,address[cars[choice].station_out],cars[choice].time_out); fclose(fp); cars[choice].money=0; cars[choice].is_in='n'; cars[choice].station_in=0; cars[choice].station_out=startkey; strcpy(cars[choice].time_in,“无”); strcpy(cars[choice].time_out,“无”); fp=fopen(filename(startkey),“a+”); if(cars[choice].car_type==0)fprintf(fp,“%30s%8d%12s%20snn”,mytime(tblock),choice,kind[cars[choice].car_type],“收卡,放行”); else fprintf(fp,“%30s%8d%12s%20snn”,mytime(tblock),choice,kind[cars[choice].car_type],“缴费,收卡,放行”); fclose(fp); cars[choice].car_type=0; fp=fopen(“记录.txt”,“w+”); for(i=1;i<=9*NUM;i++) { fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out); } fclose(fp); printf(“请收卡放行,并按任意键回到主菜单a”); getche(); } else if(key==3) { system(“cls”); refer(cars,startkey); } else if(key==4) { while(1) { system(“cls”); printf(“input password: ”); for(i=0;;) { fflush(stdin); ch=getch();if(ch=='r' || ch=='n') { break;} else if(ch=='b'){ if(i-->0) { pwd[i]=' '; printf(“b b”); //删除前个字符,光标退一个 } continue;} else if(i==max_len) { continue;} else { pwd[i++]=ch; //接收字符到密码中 printf(“*”);} } pwd[i]=' ';fp=fopen(“password.txt”,“a+”);rewind(fp);fscanf(fp,“%8s”,password);fclose(fp);if(strcmp(pwd,password)==0){ break;} else { printf(“n密码错误或空密码!!(空密码时系统规定为不能注销)n”);printf(“想再输一遍密码吗?(y or n):”);while(1){ fflush(stdin); ch=getche(); if(ch=='y' || ch=='Y') { system(“cls”); break; } else if(ch=='n' || ch=='N') { break; } else { printf(“b b”); continue; } } if(ch=='y' || ch=='Y')continue; else if(ch=='n' || ch=='N')break; } } if(ch=='n' || ch=='N')continue; i=0; for(j=1;j<=9;j++) { fp=fopen(filename(j),“w+”); fclose(fp); } fp=fopen(“记录.txt”,“w+”); fclose(fp); fp=fopen(“标记.txt”,“w+”); fprintf(fp,“%dn”,i); fclose(fp); fp=fopen(“档案.txt”,“w+”); fclose(fp); printf(“n注销成功!!n”); break; } else { fp=fopen(“记录.txt”,“w+”); for(i=1;i { fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out); } fclose(fp); fp=fopen(“标记.txt”,“w+”); fprintf(fp,“%dn”,num); fclose(fp); break; } } return 0;} char *mytime(struct tm *timeptr) //获取系统时间的函数 { char wday_name[7][4]={“Sun”,“Mon”,“Tue”,“Wed”,“Thu”,“Fri”,“Sat”};static char result[29];sprintf(result,“%d年%d月%d日(%3s)%d:%d:%d ”,1900+timeptr->tm_year,1+timeptr->tm_mon,timeptr->tm_mday,wday_name[timeptr->tm_wday],timeptr->tm_hour,timeptr->tm_min, timeptr->tm_sec);return result;} char *filename(int startkey){ static char name[22];sprintf(name,“车辆处理与记录%d.txt”,startkey);return name;} void Delay(int n)//延时函数 { int i,j,k;for(i=1;i<=n;i++){ for(j=1;j<500;j++) { for(k=1;k<500;k++) { } } } } void initialize(struct car *cars,int num,FILE *fp)///初始化函数 { int i,j;if(num==0){ for(j=1;j<=9;j++) { for(i=NUM*(j-1)+1;i { cars[i].money=0; cars[i].card_num=i; cars[i].is_in='n'; cars[i].car_type=0; cars[i].station_in=0; cars[i].station_out=j; strcpy(cars[i].time_in,“无”); strcpy(cars[i].time_out,“无”); } } } else { for(i=1;i<=9*NUM;i++) { fscanf(fp,“%d %d %c %lf %d %d %st%stn”,&cars[i].card_num,&cars[i].car_type,&cars[i].is_in,&cars[i].money,&cars[i].station_in,&cars[i].station_out,cars[i].time_in,cars[i].time_out); } } } int refer(struct car *cars,int startkey)//查询 { FILE *fp;int i,j,key,num,k;char ch,enter;time_t timer;struct tm *tblock; while(1){ system(“cls”); printf(“┏━━━━━━━━━━━━━━━━━━━━┓n”); printf(“┃ ****资料查询**** ┃n”); printf(“┃ 1.里程价 ┃n”); printf(“┃ 2.汽车类型 ┃n”); printf(“┃ 3.沿线站点间里程 ┃n”); printf(“┃ 4.高速通车情况 ┃n”); printf(“┃ 5.道路交通安全法实施条例 ┃n”);printf(“┃ 6.车辆处理与记录 ┃n”);printf(“┃ 0.回到主菜单 ┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择,并输入序号:”);while(1){ fflush(stdin);while(scanf(“%d%c”,&key,&enter)==0 || enter!='n'){ printf(“terror!!input again:”); fflush(stdin);} if(key==1 || key==2 || key==3 || key==4 || key==5 || key==6 || key==0){ system(“cls”); switch(key) { case 1: { printf(“t里程价n”); for(i=1;i<6;i++) { printf(“%s:%.1lf元/公里n”,kind[i],price[i]); } printf(“nt按任意键回到查询菜单”); fflush(stdin); getche(); break; } case 2: { printf(“t汽车类型n”); printf(“一类车:小轿车、吉普车、的士头人货车、摩托车n”); printf(“二类车:面包车、小型人货车、轻型货车、小型客车n”); printf(“三类车:中型客车、大型普通客车、中型货车、大型豪华客车n”); printf(“四类车: 大型货车、大型拖(挂)车、20英尺集装箱车n”); printf(“五类车: 重型货车、重型拖(挂)车、40英尺集装箱车n”); printf(“nt按任意键回到查询菜单”); fflush(stdin); getche(); break; } case 3: { printf(“t沿线站点间里程n”);printf(“┏━━━━━━━━━━━━━━━━━━━━┓n”);printf(“┃ 1.湛江 2.茂名 3.阳江 ┃n”);printf(“┃ 4.开平 5.佛山 6.广州 ┃n”);printf(“┃ 7.深圳 8.汕头 9.汾水关 ┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择起始站,并输入序号:”);fflush(stdin);while(1){ while(scanf(“%d%c”,&i,&enter)==0 || enter!='n'){ printf(“terror!!input again:”); fflush(stdin);} if(i==1 || i==2 || i==3 || i==4 || i==5 || i==6 || i==7 || i==8 || i==9)break;else { printf(“terror!!input again:”); continue;} } printf(“请选择终点站,并输入序号:”);fflush(stdin);while(1){ while(scanf(“%d%c”,&j,&enter)==0 || enter!='n'){ printf(“terror!!input again:”); fflush(stdin);} if(j==1 || j==2 || j==3 || j==4 || j==5 || j==6 || j==7 || j==8 || j==9)break;else { printf(“terror!!input again:”); continue;} } printf(“tt里程为:%d公里.n”,abs(km[i]-km[j]));printf(“nt按任意键回到查询菜单”);fflush(stdin);getche();break; “); } case 4: { fp=fopen(”标记.txt“,”r+“); fscanf(fp,”%d“,&num); fclose(fp); fp=fopen(”记录.txt“,”r+“); rewind(fp); initialize(cars,num,fp); fclose(fp); j=0; k=0; for(i=1;i<=9*NUM;i++) { if(cars[i].station_in!=0 && cars[i].station_out==0)j++; if(cars[i].station_in!=0 && cars[i].station_out!=0)k++; } timer=time(NULL); tblock=localtime(&timer); printf(”现在时间是:%sn“,mytime(tblock)); printf(”在行车辆:共%d辆.n“,j); if(k>0)printf(”t且有%d辆车正在缴费处缴费,尚未离开.nn“,k); printf(”t以下为此高速公路通车情况.nnnn“); printf(”%5s%12s%15s%30s%10sn“,”卡号“,”车型“,”进/出站点“,”进/出时间“,”金额 fp=fopen(“档案.txt”,“a+”); rewind(fp); fflush(stdin); while(feof(fp)==0) { fflush(stdin); ch=fgetc(fp); putch(ch); } fclose(fp); printf(“t按任意键回到查询菜单”); fflush(stdin); getche(); break;} case 5: { fp=fopen(“广东省道路交通安全法实施条例.txt”,“a+”);printf(“t广东省道路交通安全法实施条例n”); } case 6: { } case 0: rewind(fp);fflush(stdin);while(1){ for(i=0;(i<4000 && feof(fp)==0)||(i>=4000 && ch!='n' && feof(fp)==0);i++){ fflush(stdin); ch=fgetc(fp); putch(ch);} if(feof(fp)==0){ printf(“nnt按任意键翻到下一页”); getche(); system(“cls”); continue;} else break;} fclose(fp);printf(“t按任意键回到查询菜单”);fflush(stdin);getche();break; printf(“%30s%8s%12s%20sn”,“时间”,“卡号”,“车型”,“处理情况”);fp=fopen(filename(startkey),“a+”);rewind(fp);fflush(stdin);while(feof(fp)==0){ fflush(stdin);ch=fgetc(fp);putch(ch);} fclose(fp);printf(“t按任意键回到查询菜单”);fflush(stdin);getche();break; } } } { return 0; break; } } } else { printf(“terror!!input again:”);continue;} if(key==1 || key==2 || key==3 || key==4 || key==5 || key==6)break;