Запрашивать [большие] записи данных из Proficy Historian?

Я использую 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()

Одной из проблем, которая может возникнуть, является использование даты/времени в формате дд/мм/гггг чч:мм. Когда я создаю объект pytime или datetime, отдельные атрибуты, например. год, день, месяц, час, минута верны до и после назначения drecord.Criteria.StartTime и drecord.Criteria.EndTime, но когда я печатаю переменную, она всегда выводится в формате мм/дд/гггг чч:мм, но это, вероятно, связано с методом объекта str или repr.


person Mr. Anderson    schedule 10.12.2015    source источник
comment
Я не знаю, о чем вы говорите, но в любом случае, хороший вопрос.   -  person Dmitry Yudin    schedule 10.12.2015
comment
Я добавлю немного кода завтра, когда вернусь на работу. Тем временем мой вопрос касается расширения того, что показано здесь   -  person Mr. Anderson    schedule 10.12.2015


Ответы (1)


Итак, оказалось, что есть два свойства, которые можно настроить, чтобы увеличить количество возвращаемых выборок и время до истечения времени ожидания. Оба свойства задаются на объекте сервера (ihApp):

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

Увеличение обоих этих значений, казалось, решило мои проблемы. Для некоторых тегов определенно требуется больше времени для запроса, чем для других (за тот же период времени и тот же метод выборки), поэтому увеличение макс. время запроса помогло сделать возврат данных запроса более надежным.

Когда QueryRecordset() завершается, он возвращает False, если произошла ошибка, и не заполняет ни одну из записей данных. Тип ошибки можно показать с помощью:

drecord.LastError
person Mr. Anderson    schedule 14.12.2015