Чтение из базы

<< 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 будет выглядеть так:

BDpart2_img17

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

Рассмотрим пример. На сетевом компьютере работает SCADA-система, которая записывает свои данные в MSSQL, необходимо получать эти данные в MasterSCADA.Таблица ("MyTable") имеет следующую структуру:

BDpart2_img18

Столбец "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 (нумерация идет с нуля).

BDpart2_img19

У выходов в дереве системы"Val1", "Val2" и "Val3" поставим флаг архивирования.

Запустим режим исполнения. Данные начали поступать в архив.

BDpart2_img20

Но есть проблема – даже если данные не обновляются (вторая 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 –добавим вход типа "Время".

BDpart2_img21

Теперь создадим объект в дереве объектов, добавим в него расчет, назовем его Метка времени сделаем, чтобы расчет возвращал метку времени какого-нибудь из выходов процедуры.

BDpart2_img22

Для корректной работы на закладке Опрос выхода поставим галочку Восстановление при рестарте и поставим значение до опроса.

BDpart2_img23

Установим связь между модулем Расчет и входом процедуры "Время".

Запустим режим исполнения - теперь в MasterSCADA поступают только свежие данные.

Если признак качества переменной вам не нужен, то снимите галочку Параметр качества на закладке Параметры в настройках хранимой процедуры MasterSCADA. В этом случае поступающие данные всегда будут иметь признак качества "хороший" (192).

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

Необходимо знать, что в режиме работы без метки времени MasterSCADA не может отбросить старые данные, поэтому необходимо ограничивать глубину выборки в процедуре. Например, если таблица имеет первичный ключ в виде инкрементирующего поля (ID), то для ограничения выборки можно использовать его – передавать в запрос выборки последнее полученное значение ID, и выбирать только те записи, где ID больше заданного.