Примеры

ЗначокПРИМЕР

dpQuery(«SELECT ALERT ‘_alert_hdl.._value’ FROM ‘*’ WHERE _DPT =\ «ExampleDP_Float\» «, tab);

ПРИМЕЧАНИЕ

SQL-запрос должен находиться в одной строке. В примере выше запрос находится в двух строках только для по причине нехватки места.

dpQuery(«SELECT ‘_online.._value’ FROM ‘*’
  WHERE (_ELC==DPEL_FLOAT) & ‘_online.._value > 1″);

ЗначокПРИМЕЧАНИЕ

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

ЗначокПРИМЕР

В результате выполнения нижеприведенного запроса должны быть отобраны текущие значения (online value) и их метки времени. Запрос применяется ко всем элементам, имеющим тип данных «bool». Константы, которые могут использоваться в запросе, приведены в разделе «
Типы данных элементов точек данных
«.

select = «SELECT ‘_online.._stime’,’_online.._value’ FROM ‘*’ WHERE _ELC == DPEL_BOOL»;

В примере ниже запрашиваются текущие значения и метки времени конечных элементов с установленным пользовательским битом 7. В тексте запроса используется ключевое слово «AND».

select = «SELECT ‘_online.._stime’,’_online.._value’ FROM ‘*’ WHERE _LEAF
  AND ‘_online.._userbit7’ == 1″;

В примере ниже в предложении SELECT в качестве одного из критериев отбора используется уровень «EL» (уровень конфигурационных элементов). Еще одним из критериев отбора является тип точек данных («Query»).

select = «SELECT ‘Text1:_online.._value’,’Text2:_online.._value’,
  ‘Text3:_online.._value’ FROM ‘*’ WHERE _DPT = \»Query\» «;

ЗначокПРИМЕЧАНИЕ

Запрос может применяться только к конфигурационным элементам, управляемым менеджером событий. К ним относятся пользовательский диапазон значений, диапазон значений «КАСКАД Цифра» (_u_range, _pv_range), полномочия (_auth), функции точек данных (_dp_fct), заменяющее значение (_default), обработка алармов (_alert_hdl), аларм-класс (_alert_class), текущее значение, исходное значение (_online, _original) и блокировка (_lock).

В примерах ниже используются различные точки данных. Наряду с «mld_float» типа «ExampleDp_Float» и «mld_bit» («ExampleDp_Bit») существуют следующие дополнительные точки данных:

Точка данных «Gas_pipe_1» типа «Gas_pipe» (тип не входит в объем поставки системы «КАСКАД Цифра» и должен быть создан дополнительно).

Рисунок: Точка данных «Gas_pipe_1»

Точки данных «Engine1» и «Engine2» типа «Engine» (тип также не входит в объем поставки системы «КАСКАД Цифра» и должен быть создан дополнительно).

Рисунок: Точки данных «Engine1» и «Engine2»

Выборка текущих значений

Пример запроса для выборки текущих значений:

SELECT ‘_online.._value’ FROM ‘mld_float.**’

(тот же результат может быть достигнут, например, при помощи функции «dpGet»). В данном конкретном примере запрашиваются все текущие значения, соответствующие структуре «mld_float.:_online.._value».

В сценарии Control соответствующая инструкция SQL должна выглядеть следующим образом:

dpQuery («SELECT ‘_online.._value’ FROM ‘mld_float.**'», tab);

В качестве результата выполнения запроса возвращается двумерная матрица. Затем матрица записывается в переменную «tab». В связи с отсутствием информации о типе возвращаемых в матрице данных, переменная «tab» имеет тип «dyn_dyn_anytype».

Необходимо отметить, что полученные значения хранятся во втором столбце. В связи с автоматическим добавление к матрице строки заголовка первое значение находится в ячейке [2][2]. Следующие значения находятся в ячейках [3][2], …, [n][2] (n = последняя строка}).

Выборка исторических алармов

Как было указано ранее, различные данные распределены по различным областям базы данных. При использовании в сценарии Control ключевого слова «SELECT» выполняется обращение к области с «обычными» значениями. При использовании одновременно ключевых слов «SELECT ALERT» выполняется чтение сохраненных алармов.

dpQuery («SELECT ALERT ‘_alert_hdl..value’ FROM ‘mld_bit'», tab);

При указании уровня элементов DP (в примере выше: «mld_bit»), в связи с автоматическим добавлением недостающих данных, указание последующих уровней иерархии DP («.**») не требуется. Напротив, уровни KF.DT.AT должны указываться всегда.

Подписка на изменения

Функции языка Control, поддерживающие использование SQL запросов, а также «стандартные» методы программирования в языке Control, позволяют активировать подписку на изменения значений. Пример активации подписки на изменения при помощи функции «dpQueryConnect»:

dpQueryConnectSingle(«workfunc», TRUE,
«EV_connect_single», «SELECT ‘_online.._value’ FROM ‘mld_*'»);
workfunc(string ident, dyn_dyn_anytype result)

Вышеуказанная строка используется для активации подписки на изменения всех текущих значений (online values) точек данных, имена которых начинаются на «mld_».

В случае изменения одного из значений вызывается функция «workfunc» с двумя аргументами. Имеются различия при работе с алармами и значениями, см. подраздел «Различия между значениями и алармами«.

Для передачи собственных значений в функцию «workfunc» в примере выше используется аргумент «EV_connect_single» (см. описание функции «dpQueryConnectSingle» !!!)

Второй аргумент, используемый при вызове функции «dpQueryConnectSingle» в примере выше («TRUE»), указывает на необходимость возврата образа текущего состояния базы данных в момент активации подписки на изменения.

Логика …ConnectSingle c …ALERT SINGLE

Запись значения осуществляется только в случае выхода одного из значений, на изменения которых активирована подписка на изменения, за пределы диапазона допустимых значений или в случае возврата в пределы диапазона допустимых значений. Никакие значения не записываются при нахождении значений в пределах диапазонов допустимых значений при запуске.

ЗначокПРИМЕР

В следующих примерах также используется точка данных «mld_float». Логика адресации конечных элементов с использованием знаков подстановки может быть проанализирована на основе возвращаемой таблицы.

dpQueryConnectSingle(«workfunc», TRUE,»EV_alert_connect_single»,
  «SELECT ALERT SINGLE _alert_hdl.._value’ FROM ‘mld_*'»);
workfunc(string ident, dyn_dyn_anytype result);

ЗначокПРИМЕР

В данном примере представлены запрос алармов всех точек данных и отображение результатов.

/* SimpleCtrlScriptStart {invalid}
SimpleCtrlScript {SetValue}
object {Text1}
attribute {backCol}
value {Red}
SimpleCtrlScriptEnd */
main()
{
  int rc;
  setValue(«Text1″,»backCol»,»Red»);
  rc = dpQueryConnectSingle( «work», 0, «ident», «SELECT ALERT SINGLE
‘_alert_hdl.._value’ FROM ‘*'» );
  DebugN («nach QueryConnectSingle: «, rc );
}
work( string ident, dyn_dyn_anytype val )
{
  int i;
  DebugN( «Work: «, dynlen( val ) );
  for (i = 2; i <= dynlen( val ); i++ )
DebugN( «value: «, i, val[i][1], val[i][2] );
}

Все конечные элементы точек данных и их исходные значения (original values)

Пример запроса:

dpQuery(«SELECT ‘_original.._value’ FROM ‘Engine1’ WHERE _LEAF», tab);

Для возвращения всех элементов точки данных «Engine1» автоматически расширяется до «Engine1.**» .

Далее отбираются значения атрибута «_original.._value» всех элементов.

На третьем шаге полученный промежуточный результат фильтруется согласно условиям в запросе. При этом отбираются текущие значения отдельных элементов точки данных «Engine1» (Engine1.torque:_original.._value and Engine1.Fault:_original.._value).

Пример запроса для отбора 100 последних по времени строк:

dpQuery(«SELECT ‘_original.._value’, ‘_original.._stime’ FROM ‘*’ SORT
BY 2 LAST 100″, tab);

В данном запросе для фактического получения последних 100 значений важно отсортировать таблицу с промежуточным результатом. В целом, порядок записей в промежуточной таблице заранее не известен. При этом, при наличии в базе данных большого количества точек данных, промежуточная таблица может быть также велика. В связи с этим целесообразным является использование другого подхода с применением функции «TIMERANGE» с соответствующим значением параметра «bonus». Альтернативный запрос для получения последних 100 значений:

dpQuery(«SELECT ‘_original.._value’, ‘_original.._stime’ FROM ‘*’
  TIMERANGE(/»now/»,/»2030.01.01/»,2,100) SORT BY 2″, tab);

В данном примере текущее время указано в виде времени начала, время окончания не указано. Последние 100 значений обновлены и отсортированы по времени. Указанный в «TIMERANGE» временной диапазон имеет смысл только при «modus» = 2 (см. «TIMERANGE«).

Текущие значения вращающего момента всех двигателей системы

Предполагается, что все точки данных для двигателей имеют один и тот же тип точек данных «engines» с элементом «torque» (вращающий момент). Пример запроса:

dpQuery(«SELECT ‘value’ FROM ‘*.torque:_original..’ WHERE _DPT =
  \»engines\»», tab);

Еще один вариант запроса:

dpQuery(«SELECT ‘_original.._value’, ‘_original.._stime’ FROM ‘engine*.torque'», tab);

В дополнение к требованию о едином типе точек данных для всех двигателей необходимо убедиться в том, что имена точек данных для двигателей соответствуют соглашению об именовании. В запросе, наряду с выборкой исходных значений, производится также выборка соответствующих меток времени.

ЗначокПРИМЕЧАНИЕ

В общем случае, более предпочтительным является второй вариант запроса, поскольку в первом варианте сначала отбираются значения всех элементов «torque» всех точек данных, а затем из полученного промежуточного результата отбираются значения, соответствующие точкам данных с типом «engines».

Набор пользовательских диапазонов значений некоторых элементов

При помощи нижеприведенного запроса могут быть отобраны различные атрибуты интересующих точек данных (здесь: «min» и «max»):

dpQuery(«SELECT ‘min’, ‘max’ FROM ‘gaspipe1.**:_pv_range'», tab);

В данном случае результатом являются граничные значения конфигурационного элемента «диапазон значений «КАСКАД Цифра»». Уровень детализации 0 (имеется в виду уровень «DT» в «KF.DT.AT») добавляется автоматически (‘gaspipe1.**:_pv_range.0.min’).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *