<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева системы > БД-коннекторы и блоки процедур > Использование хранимых процедур > Чтение из базы |
Процедура для выполнения запроса чтения строится аналогичным образом. Вот пример процедуры выполняющей запрос чтения:
CREATE PROCEDURE SelDate
@Time_val datetime out,
@Val1 int out,
@Val2 int out,
@Val3 int out
AS
BEGIN
SELECT @Time_val=MyTable.Time_val,@Val1=MyTable.Val1,
@Val2=MyTable.Val2,@Val3=MyTable.Val3
from MyTable;
END
Однако нужно иметь ввиду, что запрос чтения может вернуть несколько строк, а на выходы процедуры MasterSCADA поступит только одна. Поэтому нужно создавать запрос, который установит на выходах только один набор значений. Для этого нужно использовать ограничение выборки оператором WHERE – он задает критерии поиска. В данном коде он будет искать только те записи, где "ID" записи равно заданному. Поскольку "ID" в данной таблице это первичный ключ, а он всегда уникален, то процедура будет возвращать только один набор значений (или ни одного).
ALTER PROCEDURE[dbo].[SelDate]
@Time_val datetime out,
@Val1 int out,
@Val2 int out,
@Val3 int out,
@number int
AS
BEGIN
SELECT @Time_val=MyTable.Time_val,@Val1=MyTable.Val1,
@Val2=MyTable.Val2,@Val3=MyTable.Val3
from MyTable where ID=@number;
END
В этом случае окно настройки процедуры в MasterSCADA будет выглядеть так:
Но как быть, если необходимо в результате запроса чтения получить несколько значений? В этом случае необходимо использовать режим выборки. В этом режиме MasterSCADA запрашивает данные из базы, а полученные на выходы значения записывает в архив. В итоге с данными запроса можно работать как с архивными данными.
Рассмотрим пример. На сетевом компьютере работает SCADA-система, которая записывает свои данные в MSSQL, необходимо получать эти данные в MasterSCADA.Таблица ("MyTable") имеет следующую структуру:
Столбец "ID" (первичный ключ) тип int, столбец "Time_val" времени в формате DateTime, 3 столбца значений ("val1", "val2", "val3") в формате real (вещественный) и поле признака достоверности – если признак качества хороший то в поле 1, если плохой – 0.
Сначала создадим в базе хранимую процедуру
CREATE PROCEDURE SelectValue
AS
BEGIN
SELECT Time_val,val1,val2,val3,(qual*192) From MyTable
END
Данная процедура будет возвращать все записи перечисленных столбцов из таблицы "MyTable". Признак качества умножается на 192 – это необходимо, что привести его к значениям качества ОРС, с которыми работает MasterSCADA. Если запрос вернет значение признака качества 0, то MasterSCADA также получит ноль (статус "Ошибка"), а если запрос вернет 1, то MasterSCADA получит признак качества 192 (статус "Хороший").
Теперь настроим MasterSCADA – добавим БД-коннектор, настроим в нем связи, добавим в него процедуру. Чтобы включить режим выборки нужно поставить соответствующую галочку. Появится дополнительная таблица, в которую нужно добавить возвращаемые процедурой переменные. Кроме того появились два дополнительных параметра – Временной параметр (с ним мы работали когда производили запись архивных значений) и Параметр качества, с их помощью мы будем получать и назначать переменными метку времени и признак качества. Установим Временной параметр – 0, параметр качества – 4 (нумерация идет с нуля).
У выходов в дереве системы"Val1", "Val2" и "Val3" поставим флаг архивирования.
Запустим режим исполнения. Данные начали поступать в архив.
Но есть проблема – даже если данные не обновляются (вторая SCADA система ничего не пишет) данные все равно постоянно считываются – это видно в поле Текущие данные (каждый цикл опроса данные в нем быстро меняются). Таким образом, каждый запрос мы выбираем данные из всей таблицы. Конечно, MasterSCADA отбрасывает уже имеющиеся данные и не записывает их в свой архив, но по мере увеличения объема базы будет увеличиваться и объем получаемых данных, что приведет к нагрузке на локальную сеть и компьютеры. Чтобы избежать этой проблемы нужно ограничить глубину выборки запроса.
Мы создадим запрос, в который будем передавать метку времени – время последнего полученного значения, а запрос построим таким образом, чтобы он не возвращал данные имеющие более позднюю метку (не возвращал значения, которые уже есть).
Изменим процедуру:
ALTER PROCEDURE[dbo].[SelectValue]
@TimeVal DateTime
AS
BEGIN
SELECT Time_val,val1,val2,val3,(qual*192) From MyTable
where Time_val>@TimeVal
END
Итак, процедура имеет вход времени, а в условие запроса WHERE указано выбирать только те данные, время которых больше заданной метки. Таким образом, старые данные поступать в MasterSCADA не будут.
Теперь настроим процедуру в MasterSCADA –добавим вход типа "Время".
Теперь создадим объект в дереве объектов, добавим в него расчет, назовем его Метка времени сделаем, чтобы расчет возвращал метку времени какого-нибудь из выходов процедуры.
Для корректной работы на закладке Опрос выхода поставим галочку Восстановление при рестарте и поставим значение до опроса.
Установим связь между модулем Расчет и входом процедуры "Время".
Запустим режим исполнения - теперь в MasterSCADA поступают только свежие данные.
Если признак качества переменной вам не нужен, то снимите галочку Параметр качества на закладке Параметры в настройках хранимой процедуры MasterSCADA. В этом случае поступающие данные всегда будут иметь признак качества "хороший" (192).
Выборкой можно получать данные, не имеющие поля с меткой времени – для этого нужно снять галочку Временной параметр. В этом случае поступающие данные будут получать метку времени в виде текущего времени, т.е. времени на момент получения данных.
Необходимо знать, что в режиме работы без метки времени MasterSCADA не может отбросить старые данные, поэтому необходимо ограничивать глубину выборки в процедуре. Например, если таблица имеет первичный ключ в виде инкрементирующего поля (ID), то для ограничения выборки можно использовать его – передавать в запрос выборки последнее полученное значение ID, и выбирать только те записи, где ID больше заданного.