从Proficy Historian查询[大]数据记录?

时间:2015-12-10 05:49:38

标签: python win32com historian proficy

我正在使用Proficy Historian SDK和python27。我可以创建一个数据记录对象并添加查询条件属性(样本类型,开始时间,结束时间,采样间隔 - 以毫秒为单位)并使用datarecord.QueryRecordset()来执行查询。

我面临的问题是QueryRecordset方法似乎只适用于返回少量数据集(最多几百条记录),即一个较小的日期范围,否则它不会返回任何SCADA标记的结果。我有时可以通过慢慢确定日期范围来获得更多(几千)记录,但似乎不可靠。那么,有没有办法解决这个或不同的方式来进行查询或设置它?我的大多数查询都包含多个标记。否则,我想我只需要连续执行查询/滑动日期范围并一次拉几百条记录。

更新 我正在使用以下步骤预先形成查询:

from win32com.client.gencache import EnsureDispatch
from win32com.client import constants as c
import datetime

ihApp = EnsureDispatch('iHistorian_SDK.Server')
drecord = ihApp.Data.NewRecordset()
drecord.Criteria.Tags = ['Tag_1', 'Tag_2', 'Tag_3']
drecord.Criteria.SamplingMode = c.Calculated
drecord.Criteria.CalculationMode = c.Average
drecord.Criteria.Direction = c.Forward
drecord.Criteria.NumberOfSamples = 0 # This is the default value
drecord.Criteria.SamplingInterval = 30*60*1000 # 30 min interval in ms
# I've tried using the win32com pytime type instead of datetime, but it
# doesn't make a difference
drecord.Criteria.StartTime = datetime.datetime(2015, 11, 1)
drecord.Criteria.EndTime = datetime.datetime(2015, 11, 10)

# Run the query
drecord.Fields.Clear()
drecord.Fields.AllFields()
drecord.QueryRecordset()

可能发生的一个问题是以dd / mm / yyyy hh:mm格式使用日期/时间。当我创建pytime或datetime对象时,各个属性,例如在分配到drecord.Criteria.StartTime和drecord.Criteria.EndTime之前和之后,年,日,月,小时,分钟都是正确的,但是当我打印变量时,它总是以mm / dd / yyyy hh:mm格式出现,但这可能是由于对象的 str repr 方法。

1 个答案:

答案 0 :(得分:0)

因此,事实证明,有两个属性可以调整,以增加返回的样本数和超时发生前的时间。这两个属性都在服务器对象(ihApp)上设置:

ihApp.MaximumQueryIntervals = MaximumQueryIntervals # Default is 50000
ihApp.MaximumQueryTime = MaximumQueryTime # Default is 60 (seconds)

增加这两个值似乎解决了我的问题。一些标签肯定比其他标签需要更长的时间(在相同的时间段和相同的采样方法下),因此增加最大值。查询时间有助于使返回的查询数据更可靠。

当QueryRecordset()完成时,如果出现错误则返回False并且不填充任何数据记录。可以使用以下方式显示错误类型:

drecord.LastError