Вопрос по SYS.Archive["va_"].getVals()
Автор |
Сообщение |
Сообщение создано: 22. 01. 2021 [14:50]
|
samsond
Dmitry Samsonov
Создатель темы
Зарегистрирован(а) с: 11.02.2020
Сообщения: 14
|
Прошу помочь разобраться с поведением SYS.Archive.getVals()
Вызов, указанный ниже, дает значение <EVAL> (вывод опять же приведен). Хотя архив точно не пустой.
out_fore_trend = SYS.Archive["va_Pvs1_pressure_var"].getVals(SYS.time()-10000, SYS.time(), 1000);
Значение out_fore_trend в результате вызова:
<TArrayObj>
<real><EVAL></real>
</TArrayObj>
Если как-то изменить (на неправильное) значение в имени архива, то вывод пропадает вообще:
что возвращает SYS.Archive.getVals() в случае пустого архива и в случае ошибок?
попутно еще вопрос. на скриншотах приведены страницы с описанием архива, о котором речь. если заглянуть в данные в виде таблицы, то последние несколько минут всегда <EVAL>, хотя если включить отображение графика, то видно, что данные есть! как это объяснить? не является ли это причиной неудач вызова SYS.Archive["va_Pvs1_pressure_var"].getVals()?
[Сообщение редактировалось 3 раз(а), в последний раз 22.01.2021 в 15:47.]
Вложенный файл
1.png (Тип файла: image/png, Размер: 316.19 килобайт) — 1067 загрузок
2.png (Тип файла: image/png, Размер: 124.33 килобайт) — 1060 загрузок
3.png (Тип файла: image/png, Размер: 57.5 килобайт) — 1041 загрузок
|
Сообщение создано: 24. 01. 2021 [11:16]
|
Sfinx2
Zubarev Dmitriy
Зарегистрирован(а) с: 03.02.2018
Сообщения: 29
|
parameter = "/DAQ/LogicLev/ABK/ABK/chnl0";
time = "1559673600"; // время в формате unix
arh = "FSArch.electro_data"; // архиватор
val = DAQ.JavaLikeCalc.lib_doc.getVal(parameter,time,0,3,arh,false); // получаем значение архива
попутно еще вопрос. на скриншотах приведены страницы с описанием архива, о котором речь. если заглянуть в данные в виде таблицы, то последние несколько минут всегда <EVAL>, хотя если включить отображение графика, то видно, что данные есть! как это объяснить?
Похоже, ты не вполне понимаешь как работают архиваторы. Данные не сразу помещаются в архив, а попадают с начала в специальный буфер. Затем с определенной периодичностью (В настройках архиватора есть параметр "Период архивирования, секунд"). Поэтому, ты опрашивая архив не получаешь данных. Их в архиве действительно еще нет.
И да, пользуйся поиском. Тема уже обсасывалась бесконечное число раз.
http://oscada.org/ru/forum/posts//kak_sdelat_pravilno_zapros_dannykh_iz_arkhiva//1/
[Сообщение редактировалось 4 раз(а), в последний раз 24.01.2021 в 11:25.]
|
Сообщение создано: 02. 02. 2021 [00:29]
|
samsond
Dmitry Samsonov
Создатель темы
Зарегистрирован(а) с: 11.02.2020
Сообщения: 14
|
Уважаемый Sfinx2,
Я проверил ваш пример. Действительно, вызов вида
outvar = SYS.Archive["va_Pvs1_pressure_var"].getVal(0, false, "");
выдает последнее значение в архиве. Однако мой вопрос был не про функцию getVal(), а про функцию getVals().
Дело в том, что мне нужно вытаскивать не одну (например, последнюю) точку, а сразу массив точек за какой-то период времени.
Можно делать это по одной точке в цикле, но это чрезвычайно неэффективно!
Почитав документацию на getVal(), я понял, что время, похоже, отсчитывается в обратную сторону, т.е., 0 означает запрос самого свежего значения.
Я попробовал эту же логику на getVals(), однако ничего не поменялось относительно первого поста - возвращается <EVAL> либо ничего...
|
Сообщение создано: 02. 02. 2021 [17:40]
|
Sfinx2
Zubarev Dmitriy
Зарегистрирован(а) с: 03.02.2018
Сообщения: 29
|
Array getVals( int begTm, int endTm, int period, string arch = "" ) — получает архив/историю значений от begTm и по endTm для архиватора arch:
begTm — время начала запрошенного диапазона данных, в микросекундах, будет изменено в реальное начало данных;
endTm — время окончания запрошенного диапазона данных, в микросекундах;
period — период данных, в микросекундах, должно быть обязательно определено и будет использовано максимальное значение для этого архива, будет изменено в периодичность реальных данных;
arch — архиватор запроса, установить в пустую строку для проверки всех архиваторов, установить в "<buffer>" для обработки только буфера.
Я бы попытался сделать так:
out_fore_trend = SYS.Archive["va_Pvs1_pressure_var"].getVals(SYS.time()-10000, SYS.time(), 1000,"");
[Сообщение редактировалось 2 раз(а), в последний раз 02.02.2021 в 17:41.]
|
Сообщение создано: 03. 02. 2021 [22:57]
|
samsond
Dmitry Samsonov
Создатель темы
Зарегистрирован(а) с: 11.02.2020
Сообщения: 14
|
Попробовал явно указать пустую строку. Результат тот же.
Также попробовал поискать реализацию SYS.getVals() в исходниках openSCADA, но что-то не смог найти сходу.
Может быть, кто-то подскажет, где смотреть?
|
Сообщение создано: 19. 02. 2021 [01:35]
|
samsond
Dmitry Samsonov
Создатель темы
Зарегистрирован(а) с: 11.02.2020
Сообщения: 14
|
Вопрос решен.
Следующий код выдает правильный результат:
addr = "DAQ.System.tst.UpTimeStation.full";
aO = SYS.nodeAt(addr, ".").arch();
out1 = aO.getVals(aO.begin(), aO.end(), 1e6, "DBArch.test_valarch");
out2 = aO.period();
out3 = aO.begin();
out4 = aO.end();
rcount = out1.length;
out = aO;
|
|
|