Запросить [большие] записи данных из 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 объекта.
1 ответ
Таким образом, оказывается, что есть два свойства, которые можно настроить для увеличения количества возвращаемых выборок и времени до истечения времени ожидания. Оба свойства установлены на объекте сервера (ihApp):
ihApp.MaximumQueryIntervals = MaximumQueryIntervals # Default is 50000
ihApp.MaximumQueryTime = MaximumQueryTime # Default is 60 (seconds)
Увеличение обоих этих значений, казалось, решило мои проблемы. Некоторые теги определенно требуют больше времени для запроса, чем другие (за тот же период времени и тот же метод выборки), поэтому увеличение макс. время запроса помогло сделать возвращаемые данные запроса более надежными.
Когда QueryRecordset() завершает работу, он возвращает False, если произошла ошибка, и не заполняет ни одну из записей данных. Тип ошибки может быть показан с помощью:
drecord.LastError