Архив рубрики: SQL

Резюме и ссылки

Для работы с текущими и историческими данными система «КАСКАД Цифра» также поддерживает в языке Control использование инструкций SQL, соответствующих общему синтаксису SQL. Начиная с версии 2.11.1 система «КАСКАД Цифра» также предоставляет возможность создания запросов с помощью специальной SQL-панели.

РазделОписание
Введение в язык сценариев CTRLВведение в язык сценариев Сontrol системы «КАСКАД Цифра»
SQL-панельПостроение запросов с помощью SQL-панели

Глоссарий

Следующая таблица содержит основные сокращения и термины:

ТерминЗначение
SQLStructured Query Language (database query language) — язык структурированных запросов
DPТочка данных
DPEЭлемент точки данных
DPTТип точки данных
DBБаза данных
Hot link connection — подписка на измененияНапример, dpQueryConnect …

Советы и рекомендации (SQL в сценариях Control)

TIMERANGE

В случае наличия большого количества значений в базе данных целесообразно ограничивать временные диапазоны запрашиваемых данных при помощи функции «TIMERANGE()«. Необходимо иметь в виду, что в инструкциях SELECT сначала считываются все значения, соответствующие предложению FROM, после чего отбрасываются значения, не соответствующие дополнительным условиям. Данный процесс требует некоторого времени.

Не рекомендуется

Как упоминалось ранее в предыдущих разделах, текущие и исторические данные хранятся отдельно. В связи с этим существуют некоторые неиспользуемые форматы:

  • SELECT ‘_alert_hdl.._value’
     
  • SELECT ALERT ‘_online.._value’
     
  • dpQueryConnect…(‘_alert_hdl’)

ЗначокВНИМАНИЕ

Запросы на отбор значений или атрибутов точек данных должны формироваться аккуратно. Например, при отборе значений «_u_range» (например, «min»/»max») требуется указание уровня детализации:
SELECT ‘_online.._value’, ‘_u_range.1.max’ FROM ‘{test1,test2}’
Без указания номера для уровня детализации результаты будут некорректными!

Примеры

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

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’).

Работа с SQL-панелью

ПРИМЕР

В приведенном ниже примере представлено формирование запроса с помощью SQL-панели. Запрос должен применяться к элементам точек данных «ExampleDP_Arg1» и «ExampleDP_Arg2» (обе точки данных относятся к типу «ExampleDP_Float»). В результате выполнения запроса должны быть отобраны исходные значения (original value) и их метки времени. При повторении примера, при необходимости, могут быть использованы другие точки данных.

Шаги:

  1. Откройте SQL-панель (из панели управления системой).
     
  2. На вкладке «Select» в выпадающем списке «Атрибут» выберите «_original.._value» и нажмите кнопку  или  для добавления его в предложение SELECT. Повторите данные действия также для атрибута «_original.._stime».

Рисунок: Элементы предложения SELECT

  1. На вкладке «From» при помощи селектора точек данных выберите точку данных «ExampleDP_Arg1» и нажмите  или  для добавления ее в предложение FROM. Повторите данные действия также для точки данных «ExampleDP_Arg2».

Рисунок: Элементы предложения FROM

  1. Для формирования запроса на основании введенной информации нажмите кнопку «Создать«. Сформированный текст запроса будет отображен в нижней части SQL-панели. При этом автоматически будет выбрана вкладка «Данные».

Рисунок: Текст запроса

  1. Для запуска запроса нажмите кнопку «Запустить» (кнопка находится во вкладке «Данные«).

Рисунок: Результат выполнения запроса

РЕЗУЛЬТАТ

Данные, отобранные в результате выполнения запроса, отображаются на вкладке «Данные». В первом столбце находятся элементы предложения FROM («ExampleDP_Arg1» и «ExampleDP_Arg2»), в последующих столбцах расположены отобранные значения интересующих атрибутов («_original.._value» и «_original.._stime». Данные атрибуты были указаны в предложении SELECT при формировании запроса).

Прочие функции

Внизу SQL-панели расположены дополнительные кнопки.

Открытие страницы справки с описанием текущего ключевого слова SQL.

Сохранение текста инструкции SQL в директории <путь_проекта>/dplist. Имя файла может быть любым, однако файл должен иметь расширение «.txt«.

Открытие существующего файла с инструкцией SQL из директории <путь_проекта>/dplist. Данные файлы могут создаваться либо при помощи SQL-панели, либо при помощи текстового редактора (например, «Блокнота»). Текст запроса (инструкции SQL) отображается внизу SQL-панели. Кнопка для запуска запроса находится на вкладке «Данные».

Данная кнопка предназначена для формирования инструкции SQL на основании информации, введенной ранее на различных вкладках SQL-панели. В случае открытия ранее созданного файла с текстом запроса необходимость использования данной кнопки отсутствует.

ПРИМЕЧАНИЕ

Нажатие кнопки «Создать» не приводит к запуску запроса. Запуск запроса и отображение результатов во вкладке «Данные» производится только при нажатии в этой вкладке кнопки «Запустить».

Закрытие SQL-панели.

Вкладка «Данные»

Рисунок: Вкладка «Данные»

На данной вкладке отображаются результаты выполнения запроса. Для запуска запроса используется кнопка «Запустить«. Кнопка «Удалить таблицу» используется для очистки области отображения результатов. По завершении выполнения запроса на панели отображаются результаты выполнения запроса, количество возвращенных строк, длительность выполнения запроса, а также общее затраченное время, включая формирование списка. Текст запроса (инструкция SQL) отображается в нижней части SQL-панели. Запрос может быть сохранен и повторно использован в пользовательских сценариях.

Вкладка «Sort/Group»

Рисунок: Вкладка «Sort/Group»

Вкладка «Sort/Group» используется для задания в запросе порядка сортировки и критериев группировки.

Более подробная информация об использовании «SORT/GROUP» в запросах представлена в разделе «Запросы«.

Вкладка «Timerange»

Рисунок: Вкладка «Timerange»

Вкладка «Timerange» используется для ограничения временного периода. Параметр «modus» используется для обеспечения совместимости с предыдущими версиями. Значения, отличающиеся от 1 (т.е. 2 или 3), более не поддерживаются. Значение 1 соответствует «Каждая точка данных в отдельности».

Более подробная информация об использовании «TIMERANGE» в запросах представлена в разделе «Запросы«.

ВНИМАНИЕ

Использование знаков подстановки в «bonus» не допускается.

Вкладка «Where»

Рисунок: Вкладка «Where»

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

Более подробная информация об использовании в запросах ключевого слова «WHERE» представлена в разделе «Запросы«.

ВНИМАНИЕ

В SQL-панели при формировании предложения WHERE могут использоваться только атрибуты конфигурационных элементов.