基于数据库的亚控KingView软件报表设计
2011-06-09孙彦鹏李晓辉
孙彦鹏,郑 晟,李晓辉
(太原理工大学 信息工程学院,山西 太原 030024)
近年来,国家重点建设交通领域,公路建设得到极大的发展,取得了令人瞩目的成绩。2010年底,全国公路总里程突破400万公里,达400.82万公里,全国高速公路达7.41万公里,居世界第二位。全国公路隧道为7 384处,512.26万米,比上年末增加1 245处,118.06万米,比“十五”末增加4 495处、359.55万米。其中,特长隧道265处、113.80万米,长隧道1 218处、202.08万米[1]。隧道内空间狭小、与外界联系相对较困难,隧道中突发事件具有随机性和不可预测性[2]。如果不采取及时的监控、消防、救援措施,会造成无法挽回的巨大损失。因此需要监控隧道中的实时状况,根据生成各种报表分析具体隧道的通行特点,制定完善的预案措施,减少发生事故时人员和财产损失。目前隧道中常用的监控软件有KingView、ForceControl、WINCC、MCGS 等, 其中 KingView 占有相当大的比例,很有必要研究它的报表生成方式。
1 两种生成报表的流程及特点
KingView自带的报表功能,使用自定义格式的数据库,其他软件无法读取其中数据。由于缺少直接对KingView自带工业数据库进行处理的API函数,目前常用的处理方法是将数据从工业数据库中读出到表中,利用表的自带函数将表中的数据运算后生成历史报表,如图1所示。如果采集变量多、统计时间跨度长,这种生成报表的方法将消耗大量的系统资源。
图1 改进前生成报表的方法Fig.1 Previous method of generating reports
图2为改进后的方法,将采集到的数据同时存入KingView自定义格式的数据库和通用数据库(文中选取SQL Server 2005),在SQL Server 2005中生成报表,并由KingView调取。
图2 改进后生成报表的方法Fig.2 Improved method of generating reports
在KingView中,定义变量时,选择合适的记录方式,可以将采集数据的数据写入其自定义的工业数据库中。如果将KingView采集的数据录入SQL Server2005,则需要采用ODBC的访问接口。
1.1 ODBC简介
开放数据库互连 (Open Database Connectivity,ODBC)是微 软 公 司 开 放 服 务 结 构 (WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC[3]。
在服务器上新建一个SQL数据库(数据库名为:tjxdata.mdf),用 Windows控制面板中自带的 ODBCData Sources(32bit)管理工具新建一个 Microsoft SQL Driver(*.mdf)驱动的数据源,名为:tjxdata,然后配置该数据源,指向SQL数据库[4]。
1.2 K ingView中连接SQL Server2005
在KingView“应用程序命令语言--运行时”输入下列代码:\本站点 datetime=\本站点 $日期+""+\本站点 $时间;在 “应用程序命令语言--启动时”输入下列代码:SQLConnect(DeviceID,"DSN=tjxdata;UID=;PWD=");根据实际情况填写tjxdata数据库的UID和PWD,使KingView与tjxdata数据源在KingView运行之初建立了连接。
1.3 tjxdata中表和K ingView中记录体
以风机表的处理为例,在服务器的tjxdata数据库中定义表fjdata,如表 1所示;在 KingView“SQL访问管理器”中的“记录体”选项中建立记录体fjdata,如图3所示。
表1 fjdata表字段设计Tab.1 Field design of table fjdata
1.4 录入数据库的实现方法
1.4.1 数字量数据录入数据库的实现方法
如图4所示,PLC代码中,所有风机的停止代码共用相同的中心控制字(PLC地址为3505)和中心编号(PLC地址为3554),KingView界面中风机“停止”按钮,所对应的代码如下:
图3 记录体fjdata的格式Fig.3 Format of bind fjdata
按下时:\本站点fj_stop=0;
按住时:\本站点 fj_stop=1;\本站点 fj_no=2;
抬起时:\本站点fj_stop=0;
图4 风机PLC代码Fig.4 PLC code of fan
分析以上代码可知,点击 “停止”按钮时,\本站点fj_stop产生的脉冲在 “数据改变语言”中,检测\本站点fj_stop的脉冲上升沿,将数据以记录体fjdata规定的字段方式写入fjdata表中,具体代码如下:
1.4.2 模拟量数据录入数据库的实现方法
模拟量数据录入tjxdata数据库的方式类似于数字量,不同之处在于,模拟量录入代码在“数据改变语言”的“秒”改变脚本中实现每5 s往tjxdata数据库中录入一次数据。以下为具体代码:
2 数据库部分表的结构及代码
由KingView插入SQL Server2005的数据是原始数据,存放在原始数据表中。模拟型数据,则需将原始数据处理后存入专门定义的模拟量日报表中,加快之后KingView查询报表速度。对于风机、车道指示器等数字量,用户关心的是某个操作员在某个时刻对某个设备进行了某种操作,这在原始表中已经有明确的记录,因而不需建立数字量日报表。当日报表中的某时刻的记录生成后,删除模拟量的原始表中对应的数据,以节省服务器硬盘空间[5]。
2.1 由原始表生成模拟量日报表
在tjxdata中建立covi日报表covi_rpt,字段类型及说明如表2所示。
表2 covi_rpt表字段Tab.2 Field design of table covi_rpt
在tjxdata中建立covi日报表的存储过程covi_d,将上一小时的原始数据汇总后写入日报表covi_rpt,其代码如下:
2.2 在tjxdata中建立作业
建立作业,在每小时的某个固定时刻执行存储过程covi_d,将上一小时原始表中的模拟量数据汇总后写入对应的日报表。将SQL Agent服务启动,并设置为自动启动,否则作业不会被执行,设置方法为:我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定[6]。
2.3 对日报表中的记录按天汇总
日报表covi_rpt中的记录是以小时为单位,KingView中生成日报表时不仅要显示每小时的数据,而且要求按天进行汇总,因此需要对covi_rpt中的记录进行再次汇总。用内嵌表值函数实现上述,产生的数据不插入日报表covi_rpt中,其代码如下[7]:
由日报表covi_rpt生成covi的月报表covi_mpt,由月报表covi_mpt生成covi的年报表covi_ypt的思路与由原始表生成日报表covi_rpt类似,其具体代码略去。
具体查询和区间查询使用相同的代码,设定开始时间@stdate和结束时间@enddate两个输入参数。具体查询时,KingView传递相同的参数给@stdate和@enddate,即查询的起始时间等于结束时间。
2.4 删除原始表中冗余数据
原始表中的数据,只是用来产生日报表,当日报表某条记录生成之后,原始表中生成该记录的数据为冗余数据,可以删除以释放硬盘空间。为日报表covi_rpt建立触发器实现,其代码如下[8]:
2.5 K ingView中查询数据库的代码
KingView中主要使用KVADODBGrid Class和Mirosoft Date and Time Picker Controller两个下拉框控件。一个下拉框负责报表类型,可供选择的选项有日报表、月报表、年报表,默认选项为日报表,另一个下拉框负责查询类型,可供选择的选项有具体查询和区间查询,默认的选项为具体查询。为选定的KVADODBGrid Class控件关联变量名Ctrl_rpt,并连接数据库,Mirosoft Date and Time Picker Controller控件的month、year等属性都是float型,要将控件所选择的日期传递给数据库自定义函数的nchar型参数,最好进行数据类型显示转换。此外,因为服务器中日报表的日期时间列为nchar型,不是datetime型,所以还需将诸如2011-8-3等转换为2011-08-03的形式[9]。建立一个按钮,命名为“查询”,按下该按钮时,将下拉框所选内容对应的参数以动态SQL语言的形式传递给服务器,服务器将查询结果返回给KVADODBGrid Class控件。
3 结 论
针对KingView自带的报表功能生成月报表与年报表较为困难的问题,给出了另一种生成方法。选择SQL Server2005作为数据库[10],存数监控软件采集到的数据,并生成各种报表,综合使用了自定义函数、存储过程、触发器、作业等SQL功能模块,大大地加快数据运算,减轻监控计算机的负担。
[1]中华人民共和国交通运输部.2010年公路水路交通运输行业发展统计公报[EB/OL].(2011-04-28)[2011-09-01].http://www.moc.gov.cn/zhuzhan/tongjigongbao/fenxigongbao/hangyegongbao/201104/t20110428_937558.htm l.
[2]卢毅,曹枚,季锦章.隧道联动控制预案研究——中国高速公路隧道监控与运营管理技术研讨会论文集[C]//中国公路杂志社,2008:38-40.
[3]百度百科.ODBC数据源[EB/OL].(2007-01-04)[2011-09-01].http://baike.baidu.com/view/700818.htm.
[4]百度文库.组态王6.53初级培训教程_完整版(9~12讲).[EB/OL].(2011-02-28)[2011-09-01].http://wenku.baidu.com/view/55f56fbafd0a79563c1e723d.html.
[5]郭敬文,吴克河,郭颖.面向电力系统的跨平台报表系统[J].现代电力,2003,20(1):88-90.GUO Jing-wen,WU Ke-he, GUO Ying.Development of report system for EPS based J2EE platform[J].Modern Electric Power, 2003,20(1):88-90.
[6]林毅奇.自动报表的设计与实现[D].厦门:厦门大学,2006.
[7]王庆忠.市级供电公司电力报表系统的研究与实现[D].北京:华北电力大学,2006.
[8]邹建.中文版SQL Server2000开发与管理应用实例 [M].北京:人民邮电出版社,2005.
[9]刘韬,楼兴华.SQL Server2000数据库系统开发实例导航[M].北京:人民邮电出版社,2004.
[10]乔晓明,陈有为.基于SQL Server构建数据挖掘应用[J].现代电子技术,2011(4):35-37.QIAO Xiao-ming,CHEN You-wei.Application of data mining based on SQL Server[J].Modern Electronics Technique,2011(4):35-37.