船舶监控专用组态软件SQL查询实时数据库的实现
2012-11-10徐向文朱鹄骏
徐向文, 朱鹄骏
(上海船舶运输科学研究所 研发中心,上海200135)
0 引 言
船舶监控专用组态软件是由上海船舶运输科学研究所自主研发,具有自主知识产权的软件开发平台。该软件平台完全针对船舶监控领域提出的船舶监控系统软件开发平台。该平台以其强大的数据库处理核心,支持多种网络架构方式;灵活的画面组态方式,支持多机热备、热切换、WEB发布等功能,得到了广大用户的认可和赞誉。
1 软件概述
1.1 船舶监控专用组态软件主要构成
1)应用程序管理器。
2)图形界面开发程序。
3)图形界面运行程序。
4)测点组态程序。
5)实时数据库系统运行程序。
6)I/O驱动程序。
1.2 船舶监控专用组态软件架构
从图1中可以看出,船舶监控专用组态软件的核心是实时数据库,实时数据库传输效率、历史数据存储效率、报警存储效率及历史数据查询效率、报警数据查询效率及当前参数查询效率是评价该软件性能的重要指标。为提高数据查询效率,同时使查询更加通用化,对船舶监控专用组态软件1.0版进行了功能扩展,增加结构化查询语言(Str uct ured Query Language,SQL)查询功能,与标准SQL类似,会使用标准SQL就会用组态软件实时数据库SQL。
图1 船舶监控专用组态软件架构
1.3 SQL查询技术
数据库通常分为层次型数据库、网络型数据库、关系型数据库。关系型数据库是较常用的数据库,如:Microsoft SQL Server、Microsoft Access、Oracle等。SQL是通用、简单灵活和功能极强的数据库语言,专门用来与数据库进行通信和数据操作。实时数据库与传统意义上的数据库有所不同,广泛应用于数据量大、实时性强、数据存储分散等工业控制领域,存储过程控制数据。由于其存储数据的特殊性,实时数据库内部数据存储结构不能以二维表的方式存储,这样就给查询数据增加了难度。目前,也有一些软件公司增加了基于SQL查询实时数据库的功能,如:In SQL、PHD、Inf o Pl us等,但大多数都是内置了微软的SQL查询引擎技术。组态软件遵循标准SQL语言规范,开发出了实时数据库SQL查询技术,沿用标准SQL查询的基本语句。它具有如下特点:
(1)简单、灵活、使用方便;
(2)支持全局自定义函数及系统内置函数,函数支持任意嵌套;
(3)别名;
(4)支持排序及聚合函数;
(5)支持分组。
2 SQL查询模式
由于船舶监控领域的特殊性,对某些测点参数反应速度、报警实时性要求比较高,要求数据库必须保证这些查询的实时性。因此在船舶监控专用组态软件中将查询模式分为同步SQL查询模式与异步SQL查询模式。
2.1 同步SQL查询模式
1)同步查询时,客户端提出查询请求,服务端立即响应SQL查询请求,并将查询结果实时返回到请求端,请求端堵塞,一直到服务端返回。
2)优点:实时性较强,适合数据量小、查询过程耗时较少的查询。
3)缺点:在数据库服务器负担较重,或者查询耗时比较多的情况下,服务端无法及时处理该查询时,请求端一直处于等待状态,直到超时。
2.2 异步SQL查询模式
1)异步查询时,客户端提出查询请求,服务端在有空闲时处理SQL查询请求,并将查询结果返回,同时通知请求端数据返回完毕,请求端无需堵塞,待数据服务端完成查询返回后,通知请求端。
2)优点:请求端提出查询请求后,无需堵塞,继续执行,服务端如果负担较重时并不立即执行查询,而是等待空闲时再执行查询,可以在一定程度上缓解服务器端压力。适合数据量大、耗时较长、实时性要求较低的情况。
3)缺点:查询后并不立即返回客户端,在数据服务端负担较重时,无法保证实时性。
3 船舶监控专用组态软件SQL查询重要语法介绍
船舶监控专用组态软件1.0版本采用数据库访问接口来访问实时数据库,该方法需要比较复杂编程才能够实现查询、解析。新版本在此基础进行功能扩充,支持SQL查询方式进行实时数据库查询,只需了解基本查询语句,就能查询实时数据库,使查询更加简便、灵活且效率更高。通过演示部分进行测点历史曲线绘制,可以看到,用户不需要进行复杂编程,只需简单的脚本编程就能够实现实时数据库查询。
船舶监控专用组态软件SQL查询面向对象为组态工程师、监控系统现场维护工程师,因此无法要求他们具备深透的SQL语言知识,只需了解基本SQL查询语句就能实现SQL查询;另外SQL查询服务端为实时数据库,为了保证查询效率,在遵循标准SQL查询语言的规范下,对部分语法进行了简化、修改。
3.1 SQL查询语句组成
SELECT字段1,字段2,…,字段N FROM数据表 WHERE条件表达式 [Or der by字段名]
SQL查询语句由3部分组成:字段集合、数据表、条件表达式。
1)字段集合:是要查询的字段列表,字段之间用逗号分隔,如果想要显示数据表所有字段,可以使用“*”作为字段进行查询。
2)数据表:分为基本数据表(历史、报警、实时)和嵌套数据表(由查询语句生成的数据表)。
3)条件表达式:SQL查询要满足的表达式,是SQL查询的核心部分。
4)排序:是SQL查询语句可选部分,分为升序、降序两种,默认为升序。
5)分组:也是SQL查询语句可选部分,按照1个或多个字段对查询结果集进行分组,主要用于对查询结果统计分析。
3.2 字段列表
1)多个字段之间用逗号分隔,例如,查询点名为A1.PV,某一段时间范围的历史值及采样时间:
SELECT DATETI ME,VALUE FROM HISDATA WHERE NA ME='A1.PV'AND Date Ti me>= #2011/8/31 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
2)显示数据表所有字段,可以使用“*”作为字段名称进行查询,例如,要显示报警数据表所有显示字段信息:
SELECT * FROM ALARMDATA WHERE Date Ti me>= #2011/8/20 08:00:00# AND Date-Ti me<= #2011/8/31 17:00:00# AND AREA =0
3)别名,可以给字段重新命名,用关键字as别名,例如,给历史数据表Date Ti me字段起名为“日期时间”:
SELECT DATETI ME as日期时间,VAL UE as历史值FROM HISDATA WHERE NA ME='A1.PV'AND Date Ti me>= #2011/8/31 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
4)允许字段作为自定义函数或系统函数参数使用,函数参数定义方式为传值,不允许传递引用。系统函数(实时数据库内置函数)参数调用,例如,把数据表里的日期时间转换为年月日格式:
SELECT str Ti me(Date Ti me,2)as日期时间,VALUE FROM HISDATA WHERE NA ME='A1.PV'AND Date Ti me>= #2011/8/31 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
5)允许对字段进行运算,例如,对历史数据表里的Val ue字段进行数学运算。
(1)数值型字段:基本数学运算
SELECT(VAL UE*2+100)/50-10 as测量值FROM HISDATA WHERE NA ME='A1.PV'AND Date Ti me>= #2011/8/20 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
(2)字符串型字段,字符操作,如与字符串相关的操作(字符串连接等):
SELECT name+'123'as点名 FROM HISDATA WHERE NA ME ='A1.PV'AND Date Ti me>=#2011/8/20 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
(3)允许数据类型相同的字段进行混合运算,例如,可以对历史数据表里的Date Ti me,Value字段进行混合运算:
SELECT(Date Ti me+ Value)*2 as测量值 FROM HISDATA WHERE NA ME='A1.PV'AND Date Ti me>= #2011/8/20 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
6)支持常量字段,表示该字段的值是常量,如:
SELECT 1 as常量列,Val ue FROM HISDATA WHERE NA ME='A1.PV'AND Date Ti me>= #2011/8/20 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
7)字段允许作为聚合函数参数使用,用于统计分析,支持的聚合函数有 MAX、MIN、SU M、AVG,COUNT,如,查找点名为“A1.PV”,某段时间范围内的历史最大值:
SELECT MAX(VAL UE)as最大值FROM HISDATA WHERE NA ME='A1.PV'AND Date Ti me>= #2011/8/20 08:00:00# AND Date Ti me<= #2011/8/31 17:00:00#
8)COUNT:用于统计返回数据集记录数,如:
SELECT COUNT(1)FROM HISDATA WHERE NA ME IN ('A1.PV','A2.PV','A3.PV')AND DATETI ME >= #2011/8/28 14:30:00# AND DATETI ME< #2011/8/29 15:48:10# AND INTERVAL=0
9)TEXT:它是历史数据表新增的显示字段,它的取值为点的DESC参数值,用于存字符串历史,它对应的点名为“A1.DESC”,如:
SELECT na me,VALUE,TEXT FROM HISDATA WHERE NA ME IN ("A1.PV","A2.PV","A3.PV","A1.DESC")AND DATETI ME>= #2011/8/28 14:30:00# AND DATETI ME< #2011/8/29 15:48:10# ORDER BY TEXT DESC
3.3 数据表
数据表分为基本数据表(历史、报警、实时)及嵌套数据表(由SQL查询生成的数据表)。
1)查询基本数据表:
SELECT Name,DATETI ME,VAL UE FROM HISDATA WHERE NA ME='A1.PV'AND DATETI ME>= #2011/8/24 8:30:00# AND DATETI ME< #2011/8/24 8:43:10#
2)查询嵌套数据表:
SELECT Name,DATETI ME,VALUE FROM (SELECT *FROM HISDATA WHERE NA ME='A1.PV'AND DATETI ME>= #2011/8/12 8:30:00# AND DATETI ME< #2011/8/24 8:43:10#)where 1=1
3.4 条件表达式
条件表达式是组态软件SQL查询语句的核心部分也是最灵活的部分,它是1个查询表达式,用于读取满足条件的数据。
4 利用SQL查询历史数据库实现测点历史曲线绘制
4.1 创建SQL查询对象
在左面导航栏中选中,画面→查询→内置SQL查询→创建ObSql1(见图2)。
图2 创建SQL查询对象
4.2 连接数据库
4.3 查询
4.4 Back Func函数负责查询结果解析
将查询结果解析,利用历史曲线组件显示查询结果。
4.5 关闭连接
Ob Sql1.Disconnect();
4.6 最终效果
图3 查询结果利用历史曲线组件显示效果
5 结 语
船舶监控专用组态软件采用面向实时数据库系统的SQL查询技术,可大幅提高组态软件的灵活性、适应性和运行效率,可将组态软件中的数据查询功能应用与组态软件的开发维护彻底分离,方便用户在组态层完成用户定制数据功能,特别适用于船舶监控系统实际应用中船方需要不断更改定制数据的需求,可大幅度降低软件维护成本,便于船舶监控专用组态软件的全面推广。
[1] 朱鹄骏,徐向文,唐姝.船舶专用组态软件设计与实现方法[J].上海船舶运输科学研究所学报,2010,33(2):88-92.