УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

Вопрос по SYS.Archive["va_"].getVals()


Автор Сообщение
Сообщение создано: 22. 01. 2021 [14:50]
samsond
Dmitry Samsonov
Создатель темы
Зарегистрирован(а) с: 11.02.2020
Сообщения: 14
Прошу помочь разобраться с поведением SYS.Archive.getVals()

Вызов, указанный ниже, дает значение <EVAL> (вывод опять же приведен). Хотя архив точно не пустой.

JAVASCRIPT
out_fore_trend = SYS.Archive["va_Pvs1_pressure_var"].getVals(SYS.time()-10000, SYS.time(), 1000);


Значение out_fore_trend в результате вызова:
JAVASCRIPT
<TArrayObj>
<real><EVAL></real>
</TArrayObj>


Если как-то изменить (на неправильное) значение в имени архива, то вывод пропадает вообще:

JAVASCRIPT
<TVarObj>
</TVarObj>


что возвращает SYS.Archive.getVals() в случае пустого архива и в случае ошибок?

попутно еще вопрос. на скриншотах приведены страницы с описанием архива, о котором речь. если заглянуть в данные в виде таблицы, то последние несколько минут всегда <EVAL>, хотя если включить отображение графика, то видно, что данные есть! как это объяснить? не является ли это причиной неудач вызова SYS.Archive["va_Pvs1_pressure_var"].getVals()?



[Сообщение редактировалось 3 раз(а), в последний раз 22.01.2021 в 15:47.]
Вложенный файл

1.png (Тип файла: image/png, Размер: 316.19 килобайт) — 1048 загрузок
2.png (Тип файла: image/png, Размер: 124.33 килобайт) — 1040 загрузок
3.png (Тип файла: image/png, Размер: 57.5 килобайт) — 1020 загрузок
Сообщение создано: 24. 01. 2021 [11:16]
Sfinx2
Zubarev Dmitriy
Зарегистрирован(а) с: 03.02.2018
Сообщения: 29
JAVASCRIPT
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/

http://oscada.org/ru/forum/attachments/%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5913/

[Сообщение редактировалось 4 раз(а), в последний раз 24.01.2021 в 11:25.]
Сообщение создано: 02. 02. 2021 [00:29]
samsond
Dmitry Samsonov
Создатель темы
Зарегистрирован(а) с: 11.02.2020
Сообщения: 14
Уважаемый Sfinx2,

Я проверил ваш пример. Действительно, вызов вида

JAVASCRIPT
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
Вопрос решен.

Следующий код выдает правильный результат:

JAVASCRIPT
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;



1417