组态软件读取历史数据的方法小结 点击:462 | 回复:1



工控大亨

    
  • 精华:13帖
  • 求助:5帖
  • 帖子:851帖 | 1682回
  • 年度积分:0
  • 历史总积分:5491
  • 注册:2006年1月03日
发表于:2008-06-18 15:40:16
楼主
紫金桥软件自带了过程数据库,可以高效的保存相关数据点的历史记录,同时提供了丰富的方法读取所需的历史记录。笔者使用紫金桥做了多个工程,仅就个人经验进行简单小结,这里和大家分享,还望能起到抛砖引玉的作用,如有不对之处,还望指正。
关于保存历史记录

通过紫金桥组态软件自身的过程数据库,可以通过两种方式自动保存数据点的历史记录,定时保存和变化率保存,定时保存适合保存变化不是很快,或者比较有规律的数据点,变化率保存的应用范围相对更广,适合变化较快或者较慢的情形,这里要注意两点内容:

* 对于定时保存的历史记录一般不做压缩的,所以不建议对于较多的数据库点设置为保存间隔较短的定时保存,否则历史记录的文件体积会增加相对较快;
* 对于变化率保存的数据,系统会自动压缩保存,要注意的是其变化率是相对于该点的量程而言的,而不是相对于上次保存的历史值。数据点的量程可以在“点组态”基本参数中修改;

个人觉得过程数据库很适合保存现场连续的采集值,对于一些字符型的数据,可能还需要借助关系数据库来保留历史值了。而关系数据库在保存连续数值方面也远不如过程数据库方便。关于紫金桥对关系数据库的各种操作,笔者将在其它文档中进行说明,这里不再赘述。
历史数据的读取

紫金桥软件提供了多种方式读取历史数据,这里仅就一些常用的方法进行说明。一般有三种方式读取历史记录,分别是:历史曲线、读取单点历史、读取批量历史。在说明各种方式之前先要解释下“坏值”的概念,数据点只有在系统运行时才能保存历史记录,对于系统没有运行时的历史值,如果该时刻早于当前时刻,紫金桥软件通常会赋一个坏值,-9999。而对于未到时间的历史值可以在“系统参数”进行设置,如图所示:

下面简述下读取历史记录的三种操作:
1 通过历史曲线

通过历史曲线或者趋势分析曲线可以直接查询相关点的历史值,这种方法的优点在于数据很直观,便捷、曲线可以任意放大。

历史曲线:

趋势分析:

历史曲线和趋势分析曲线的不同在于,历史曲线可以通过“打散单元”的操作将该组件分解,自行根据需要重新组合;而趋势分析组件功能更强,提供了历史曲线没有的统计数据、全屏显示等功能,但是不支持分解操作,不能自行组合。
2 读取单点历史记录

单独采集某点某时刻的历史值或某段时间的统计值一般通过脚本函数实现:

* 读取某刻历史值一般使用三种函数:GetHisData(Var,Year,Month,Day,Hour,Minute,Second,MilliSec);

GetHisData2(Var,StartTime, MilliSec);

GetHisDataEx(DataSource, VarName ,StartTime,MilliSecond);

GetHisData和GetHisData2前者适合读取具体时刻的历史值,后者通过一个时间值来获取历史记录,该值是一个整数,表示相对于1970年1月1日08:00时过去的秒数,这个秒数在紫金桥软件中非常常用。实际工程中,这个秒数可以通过函数LongTime ("2001/01/01 14:50:48")得到,该函数可以自动得到某时刻过去的秒数。秒数也可以通过一些组件得到,比如起始时间组件,如图所示:

图中有一个起始时间组件,其下是该组件的time属性所对应的相对于1970/1/1/08:00:00 过去的秒数。比如该组件被命名为EndTime,在脚本中通过#EndTime.time即可得到相应的秒数。

* 读取某段时间内的统计值可以通过函数GetStatisDataEx(DataSource,VarName, StartTime,TimeSpan, Flag,Time)或GetStatisData(Var, Year, Month, Day, Hour, TimeSpan, Flag,Time)得到一段时间内的最大值、最小值或者平均值。

val = GetStatisDataEx("","FQ101.PV", LongTime("2007/09/04 14:30:00"), 2,0,strTime) 示例中Val变量可以得到FQ101.pv值在2007年9月4日14点30分起2个小时内的平均值。这里要注意的是,GetStatisData 和GetStatisDataEx函数会自动过滤掉坏值。在使用统计函数时,要确保对应的点在组态时选择上统计设置,如图所示:

此外还要注意的是,由于紫金桥系统是每小时自动统计下历史记录,对于刚保存的历史记录,比如1小时内的历史值,通过统计函数可能无法得到最新的统计值。如果需要得到即时的统计值,需要借助紫金桥软件提供的SPC历史组件进行统计。关于该组件的一些操作可以参看紫金桥软件相关帮助文档。
3 读取批量历史

读取批量历史通常以报表的形式显示出来。对于历史报表,依据不同的标准有不同的分法,按照行数区分可以分为固定行列和不固定行数,按显示的类型可以分为统计和非统计历史报表。所谓统计报表通常是对一些累加值的点进行统计,比如最大值、最小值、或者平均值等,非统计报表就是直接查询某时刻的历史值。不同情况下具体实现的方法也各不同,这里仅就笔者熟悉的方法进行简述。
行数固定的非统计历史报表

对于需要获取某段时间内,固定时间间隔的历史记录,通常其行数是固定的,比如需要对一天内的整点数值采样,其行数是24,时间间隔一小时。这种情况下,使用自由报表的“取批量历史”功能最为简单。具体操作方式简述如下:

首先选中自由报表中需要显示历史记录的一列,然后点击自由报表工具栏中右侧的公式选择按钮,如图所示:

点击后选择“取批量历史”,如图所示:

系统弹出对话框:

在“数据库变量”中填写所关联的数据点,比如“A1.pv”,根据实际情况设定“采集个数”和“时间间隔”,“采集个数”不能填写为变量。这里的“时间表达式” 是指批量历史中首个采集点的时间,可以是一个整形变量,其值是前文中提到的1970年1月1日08:00时过去的秒数。

优点:通过取批量历史的功能,可以轻松的获取某点采集个数固定,时间间隔固定的历史记录。

缺点:无法实现采集时间不固定、采集历史记录个数不固定的要求,无法采集统计值。

小技巧:通常显示历史记录的时候,往往需要在另一行显示该记录相对应的时间,可以选择一列,将该列的输入输出设置为“日期和时间”,然后将该列关联和历史值对应的秒数即可。
行数不固定的非统计报表

有时需要用户自行设置历史记录查询的开始时间和结束时间,查询的历史记录的间隔时间,这时往往需要借助历史数据对象来获取记录。

在紫金桥的图库中“历史数据”选择“历史数据对象”,如图所示:

将其拖拽置窗口,系统自动增加一历史数据对象,如图所示:

双击该对象,可以在属性对话框中进行参数设置,如图所示:

该组件通常运行时是隐藏的。可以在属性设置对话框中增加所需查询的历史点(可以同时查询多个)。通过点击“事件脚本”,可以在此编写所需的脚本语句,如图所示:

通常是通过按钮等事件调用历史数据对象的Start(BeginTime, Cycle, Count)函数,通过该函数可以设置查询的开始时间,查询的时间周期和查询的历史个数,并进行查询。当查询结束后,会执行“检索完成时”脚本。一般在 “检索完成时”的脚本中通过一个循环语句,把查询到的结果更新到自由报表中。例如脚本:

num=#his.GetColCount();//得到查询的行数

for k=1to num+1step1

#report.settxt(1,k+1,#his.GetTimeText(k-1,0));//得到时间

#rep



海魂洋仔

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 114回
  • 年度积分:0
  • 历史总积分:983
  • 注册:2005年10月14日
发表于:2008-06-23 11:59:44
1楼
thannkssss

热门招聘
相关主题

官方公众号

智造工程师