PDA

Просмотр полной версии : Получение данных из MS SQL в MasterSCADA



energy_aleks
17.03.2011, 13:20
Добрый день! Суть такова: имеется БД MS SQL, в которой архивируется состояние системы другой скадой. Требуется из этой базы данных получать эту информацию (так же как и при опросе ОРС сервера) и обрабатывать её в MasterSCADA. Не как не могу написать запрос в БД или по другому - написать процедуру получения данных, в SQL не силен. Может кто поможет и выложит примерчик написания хранимой процедуры??? Нужно по ID параметра получить его последнее значение.:confused:

SCADAMaster
17.03.2011, 18:13
Вам нужен только текст процедуры?
Ну например вот такой. Создает процедуру которая возвращает из таблицы MyTable, поле MyName, ID которого равен значению MyID
CREATE PROCEDURE (@MyID int, @MyName int output)
AS
BEGIN
SELECT @MyName=name from MyTable where ID=@MyID;
END
GO

energy_aleks
18.03.2011, 11:03
Вам нужен только текст процедуры?
Ну например вот такой. Создает процедуру которая возвращает из таблицы MyTable, поле MyName, ID которого равен значению MyID
CREATE PROCEDURE (@MyID int, @MyName int output)
AS
BEGIN
SELECT @MyName=name from MyTable where ID=@MyID;
END
GO

Да, в принципе меня устроит только текст процедуры.
По Вашему примеру, как я понимаю, таблица MyTable содержит только одну строчку с ID = MyID. И эта строка постоянно обновляется. Такой пример я уже пробовал, все работает. Но в моей таблице содержится множество строк с ID = MyID, различие в них в том, что они содержат еще метку времени (т.е. когда были помещены в таблицу). Вот мне как раз и нужно выбрать последнее значение записи с ID = MyID. В таблице имеется столбец Value. Структура таблицы такова: ID, Time, Value.
Help me please!!!

SCADAMaster
18.03.2011, 13:35
Ну сделайте тогда такой запрос:
SELECT TOP 1 @MyName=name from MyTable where ID=@MyID;

energy_aleks
18.03.2011, 14:52
Ну сделайте тогда такой запрос:
SELECT TOP 1 @MyName=name from MyTable where ID=@MyID;

Спасибо за содействие.
Попробовал сделать такой запрос, в результате постоянно принимаю значение самой первой записи в таблице с ID=@MyID.
Мне кажется, что в запросе должно присутствовать условие с использованием значения Time.

SCADAMaster
18.03.2011, 15:11
Тогда так:
SELECT TOP 1 @MyName=name from MyTable where ID=@MyID ORDER BY [TIME] DESC

energy_aleks
18.03.2011, 15:39
Тогда так:
SELECT TOP 1 @MyName=name from MyTable where ID=@MyID ORDER BY [TIME] DESC

Да, данная комбинация вроде заработала:) , но время выборки происходит очень долго около 45сек. :eek: для одного параметра. А я предполагаю делать выборки для примерно 20 параметров. С чем это может быть связано. И как ускорить процесс выборки?

SCADAMaster
18.03.2011, 15:54
Нужно задать индекс (первичный ключ) <ID, TIME>

energy_aleks
18.03.2011, 15:55
Нужно задать индекс (первичный ключ) <ID, TIME>

А вот про это можно по подробнее.:)

SCADAMaster
18.03.2011, 16:07
В Managment Studio вызовите контекстное меню у таблицы, выберите "Индексы и ключи". Добавьте ключ, выберите столбцы ID и Time.

energy_aleks
18.03.2011, 16:22
В Managment Studio вызовите контекстное меню у таблицы, выберите "Индексы и ключи". Добавьте ключ, выберите столбцы ID и Time.

Огромное спасибо за Ваши советы. Пока все работает на ура. Выборка происходит мгновенно. :D И последний вопрос - как повлияет увеличение количества выбираемых ID на скорость выборки?

SCADAMaster
18.03.2011, 16:27
Это можно узнать только экспериментально, потому что зависит от многих параметров.

energy_aleks
18.03.2011, 16:33
Это можно узнать только экспериментально, потому что зависит от многих параметров.

Ну хорошо, будем эксперементировать. Еще раз спасибо.

Kuzmi4
08.04.2011, 12:07
Добрый день. У меня подобный вопрос. Впервые общаюсь С MS SQL, поэтому мало что понял из вышесказанного.
Итак задача следующая:
Существует SQL-база, структура которой создана в SQL2008R2. Данные формируются контроллером через закрытый для нас драйвер.
Требуется В MasterScade 3.2 Demo-версии (в качестве эксперимента) "вытащить" данные из базы.
Расскажите пожалуйста с чего начать, что где и как касаемо и MSSQL и MasterSCADы.
Заранее благодарю!

SCADAMaster
08.04.2011, 13:07
Сначала обновить Demo версию до текущей 3.3 SP2.
Далее создать в базе хранимую процедуру которая будет делать выборку нужных вам данных. В MasterSCADA добавляете БД-коннектор, настраиваете подключение к базе (путь к серверу, имя базы, авторизацию). Добавляете в коннектор процедуру, прописываете имя процедуры которую вы создали в базе и добавляете входы и выходы.

Kuzmi4
08.04.2011, 15:07
Огромное спасибо.
Походу возник еще вопрос. Дело в том, что сама SQL-база а точнее поля внутри нее равны 0. Смогу ли я записать в существующую базу произвольные данные (задавая их в режиме отладки Мастер Скады) и как проверить их в SQL или произвезти обратные действия?

Kuzmi4
08.04.2011, 15:29
Уже не требуется)

SCADAMaster
08.04.2011, 15:33
Смогу ли я записать в существующую базу произвольные данные (задавая их в режиме отладки Мастер Скады) и как проверить их в SQL или произвезти обратные действия?
Вам нужно считать из базы или записать в нее?
Вы хотите проверить считывание из базы в MasterSCADA без контроллера?
Ну в принципе можно, если у вас есть структура базы которую формирует драйвер контроллера, заполните поля данными используя Microsoft Management Studio, сделайте процедуру и проверьте считывание.
Вам наверное придется считывать самую верхнюю строку, используйте Select Top.

Если вам нужно записывать в базу, в принципе все тоже самое, создаете еще одну процедуру но уже используете запрос Insert into

Kuzmi4
08.04.2011, 17:58
Все, спасибо! Проблемы были в запросах. Да нужно было извлечь все данные из базы. Теперь контакт есть даже в версии 3.2.

Kuzmi4
11.04.2011, 17:36
Вопрос. Как из таблицы SQL с несколькими полями в МастерСкаде вытащить все данные, можно ли это сделать одной процедурой или функцией и какой нужен для этого запрос. По одному результату, проблем нет, а если результат состоит из нескольких строк, МастерСкада ругается на большое количество аргументов (при добавлении входов/выходов).

SCADAMaster
12.04.2011, 11:21
Как из таблицы SQL с несколькими полями в МастерСкаде вытащить все данные, можно ли это сделать одной процедурой или функцией и какой нужен для этого запрос.
То есть вам нужно выполнить запрос чтения, и в результате получить несколько значений?
В этом случае значения должны войти в архив MasterSCADA, и следовательно иметь его структуру (то есть значение, метка времени, признак качества). Есть ли в вашей таблице метка времени?
Если есть то тогда можно использовать выборку. Ставите галочку "Использовать выборку", ставите галочку "Временной параметр", и указываете каким номером он идет в запросе. Аналогично с признаком качества (но его использовать необязательно - тогда все значения в архив будут приходить с хорошим признаком).
Запрос может быть например такой:
CREATE PROCEDURE MyProcedure1
AS
BEGIN

Select TOP 100 val, tim, qual from My_Table1;
END
где val - значение
tim - метка времени
qual - признак качества.

Kuzmi4
12.04.2011, 14:20
В моем случае не совсем так. У меня существует таблица. К примеру первый столбец name, который состоит из 4 строк (названия датчиков) следущие столбцы-их характеристика, шкала, описание и тому подобное. В мастер скаде, выбирая датчик, нужно увидеть остальные столбцы.
Процедура следущая:
AS
BEGIN
SELECT descr, min, max, lo, hi, units
FROM meter_type
WHERE (name = @name)
END

где
descr, min, max, lo, hi, units-столбцы со значениями характеристик
name - название датчика
С SQL общаюсь совсем мало.

SCADAMaster
12.04.2011, 15:00
К примеру первый столбец name, который состоит из 4 строк (названия датчиков) следущие столбцы-их характеристика, шкала, описание и тому подобное. В мастер скаде, выбирая датчик, нужно увидеть остальные столбцы.

Ну это совсем другое дело. Просто нужно в таблице сделать несколько выходных переменных и одну входную
CREATE PROCEDURE MyProcedure (@MyID int, @MyValue int output, @MyValue int output)
AS
BEGIN
SELECT @MyValue=My_table.Value, @MyValue1=My_table.Value1 from My_table where My_table.ID=@MyID;
END

Kuzmi4
12.04.2011, 16:01
Благодарю, но

Ну это совсем другое дело. Просто нужно в таблице сделать несколько выходных переменных и одну входную

Если создать подобный запрос, то SQL при выполнении требует ввода остальных (@MyValue int output) переменных. И в Мастер Cкаде, как я понял тоже следует добавить выходы

SCADAMaster
12.04.2011, 16:18
И в Мастер Cкаде, как я понял тоже следует добавить выходы
Конечно. И в MasterSCADA тоже, добавляете переменные в процедуре БД коннектора, указываете тип.

Kuzmi4
12.04.2011, 17:16
Да, я так и делаю вопрос в том, что SQL при таком запросе требует указать выходные переменные @MyValue int output (т.е. сам запрос некорректен)и соответственно в Мастер Скаде не отображаются выходные параметры. Подскажите пожалуйста как быть?

SCADAMaster
12.04.2011, 17:47
А вы правильно настроили процедуру в самой SCADA? В приложении пример под данную хранимую процедуру.

Kuzmi4
12.04.2011, 18:03
Да в мастер скаде все настроенно также. Один результат я могу получить (используя set @result). А при выполнении процедуры-правильно что у меня SQL спрашивает ввести дополнительные выходные параметры (как то не логично, я же хочу по одному параметру доставать данные)?

SCADAMaster
12.04.2011, 18:29
Один результат я могу получить (используя set @result).
Что значит один результат?


А при выполнении процедуры-правильно что у меня SQL спрашивает ввести дополнительные выходные параметры (как то не логично, я же хочу по одному параметру доставать данные)?
Выходные параметры (помеченные в процедуре out), это параметры которые возвращаются в SCADA. Вы задаете один входной параметр - имя вашего датчика, по нему происходит поиск в базе, найденные значения из остальных столбцов этой присваиваются выходным параметрам и возвращаются в SCADA.

Kuzmi4
13.04.2011, 11:30
Все, благадарю!
Запрос создал в менеджменте и все подцепилось, до этого создавал в вижуал студии. Может не проавильно создал обращение к запросу. Будем разбираться дальше

Capiton
28.04.2011, 14:25
А где можно подробнее почитать как строить процедуры и вообще поподробнее о них.

Capiton
29.04.2011, 10:37
Может кто нибудь подскажет как в MySQL написать подобную процедуру описанную в справке к MAsterScade. Чтоб можно было записывать данные в базу и читать их от туда. ПРосто не силен в SQL.
mssql Процедура из справки.

CREATE PROCEDURE Ins_ParamValue
@name char(50),
@value float,
@time_stamp datetime,
@status smallint
AS
INSERT into data values (@name, @value, @time_stamp, @status)

SCADAMaster
30.04.2011, 18:49
А где можно подробнее почитать как строить процедуры и вообще поподробнее о них.
MasterSCADA предоставляет интерфейс доступа к хранимым процедурам базы данных. Вам нужно прочитать (хотя бы по диагонали) любой учебник по интересующей вас базе данных.