首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
紫金桥组态软件基于内置SQL查询历史数据的方法
紫金桥软件技术有限公司
收藏本文     查看收藏

一、引言

 

  在项目中,经常会涉及到查询历史数据,通常情况下都是使用查询历史的专用组件,或者利用系统函数GetHisDataEx()以及相关的函数进行查询,但是上述两种方法都有一定的局限性,现在紫金桥推出一种全新的查询方法:基于内置SQL查询历史数据的方法。

 

二、功能实现

 

  1.功能页面布局

 

  首先,创建一个窗口,窗口中如下图所示布局。放置两个“起始时间”控件用来控制查询历史数据的时间范围,分别命名为_StartTime、_EndTime;放置一个“文本框”,用来输入时间间隔,命名为_INTERVAL;放置一个“按钮”,用来控制查询脚本;在下面放置一个“自由报表”,用来显示已经查询出来的历史数据,命名为RPT_Data。并在窗口导航树下选择:画面\查询\内置SQL查询,新建一个查询命名为ObSql1。

 

 

  2.脚本实现

 

  所有的脚本均写在查询按钮中,方法比较简单,首先要在设置时间范围与时间间隔,然后在查询按钮中选择所要查询的数据点,并按照设置的数据进行查询,最后将查询到的数据放置到自由报表中。下面来分析查询按钮中的脚本。

 

ObHost Host1;

ObDataTable& ReturnTable;

string StrPar[];

string StrWhereCmd = ""; //Select查询时的Where语句

string StrNameCmd = ""; //Select查询时的Where语句中存放点名的字符串

string StrQuery = ""; //总的查询语句

string StrTableText = ""; 

int i,j;

int nTagCount; //所要查询数据点的个数

int nEveryTagCount; //每一个数据点返回历史数据的个数

int nTableVal = 0;

 

  上述部分为定义的一些临时变量,方便下面写程序时使用。

 

if  Host1.TagParSelMulti("",StrPar,-1) then

 

  If语句用来判断是否在点选择器中选择了数据点,如果选择了点,才会执行下面的脚本

 

nTagCount = StrPar.GetCount();

for i = 0 to nTagCount-1 step 1

StrNameCmd = StrNameCmd + "'" + StrPar[i] + "',";

next

StrNameCmd = StrNameCmd + "'" + StrPar[nTagCount-1] + "'";

 

  上述语句是将在点选择器中选择的数据点按照SQL语句的形式拼接成字符串。

 

StrWhereCmd = "INTERVAL="+IntToStr(#_INTERVAL.Val*1000,10)+"";

StrWhereCmd = StrWhereCmd + " and DATETIME >= #"+#_StartTime.GetStringDateTime()+"#";

StrWhereCmd = StrWhereCmd + " AND DATETIME< #"+#_EndTime.GetStringDateTime()+"#";

StrWhereCmd = StrWhereCmd + " AND NAME IN ("+StrNameCmd+")";

 

  上述语句是拼写SQL查询语句中的Where子句,其中第一句是设置时间间隔;第二句是设置查询的其实时间;第三句是设置查询的结束时间;第四句是设置所要查询的历史数据的数据点。

 

StrQuery = "SELECT Name,DATETIME,VALUE FROM HISDATA WHERE "+StrWhereCmd+"";

 

  上述语句是拼写整体的SQL查询语句,按照Where字句中的设置信息,从历史数据库中查询历史数据,并返回Name,DATETIME,VALUE三个字段的信息,这三个字段分别表示点名,历史数据的时间和历史数据。

 

#ObSql1.Connect("本地");

#ObSql1.Query(StrQuery,ReturnTable);

 

  上述语句是执行SQL查询,并将查询到的结构返回到通用数据表ReturnTable中。

 

nEveryTagCount = ReturnTable.GetRowCount()/nTagCount;

#RPT_Data.AddCol(nTagCount-1);

#RPT_Data.AddRow(nEveryTagCount-1);

 

  上述语句是按照查询返回的数据个数及数据点的个数,设置显示报表的大小,在报表中增加相应的列和行。

 

for i = 2 to #RPT_Data.RowCount() + 1 step 1

#RPT_Data.SetTxt(i,0,StrPar[i-2]); //设置表头,内容为点名

for j = 0 to nEveryTagCount step 1

ReturnTable.Get("VALUE",j,StrTableText);

#RPT_Data.SetTxt(i,j+1,StrTableText); //按照数据点向报表中放置查询到的数据

if #RPT_Data.Txt(1,j+1) == "" then 

ReturnTable.Get("DATETIME",j,nTableVal);

#RPT_Data.SetVal(1,j+1,nTableVal); //向报表中放置历史数据点时间,放置之前要 判断时间是否已经存在

endif

ReturnTable.RemoveRow(0);

next

next

endif

 

  上述语句是将查询到的结果放置到显示报表中。

 

  3.运行效果

 

 

 

三、结束语

 

  通过该方式增加了查询历史数据随意性,且加快了数据查询的速度。同时,查询到的数据可以根据自身需要进行多种形式的展示,方便数据的后期处理。


 

状 态: 离线

公司简介
产品目录

公司名称: 紫金桥软件技术有限公司
联 系 人: 李磊
电  话: 0459-8151391-808
传  真: 0459-8151391-804
地  址: 大庆市高新区服务外包产业园C-1座817室
邮  编: 163316
主  页:
 
该厂商相关技术文摘:
跨平台实时数据库变量引用导航功能介绍
跨平台实时数据库 如何利用MODBUS仿真软件测试MODBUS驱动
紫金桥跨平台实时数据库如何实现多屏显示
紫金桥跨平台软实时数据库Web服务器和数据服务器分离访问的配置
紫金桥跨平台软件远程采集RealInfo6.5
使用虚拟机做的工程实现跨网Web访问
紫金桥软件Microsoft Office Access 2003的ODBC数据源配置
紫金桥软件闸门整体自动化监控系统
通过紫金桥软件来提高画面组态速度
组态软件在配套设备中的应用
紫金桥的关系库同步工具简介
紫金桥组态软件与欧姆龙PLC以太网通信(FINS命令)——CPU型号-CJ2M-CPU33
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved