Интеграция с Rapid SCADA
Развитые средства интеграции со сторонним программным обеспечением являются одной из ключевых особенностей Rapid SCADA. Комплексные решения, в состав которых входит Rapid SCADA и один или несколько сторонних программных продуктов, позволяют более полно удовлетворить требования Заказчика по функциональности автоматизированной системы. Данная статья рассказывает о структуре текущих, архивных и конфигурационных данных Rapid SCADA и о способах интеграции с программным комплексом.
Перед изучением данного материала рекомендуется внимательно прочитать Техническое описание Rapid SCADA.
Структура данных Rapid SCADA
Для интеграции с Rapid SCADA интерес представляют категории данных, описанные в следующей таблице.
Категория данных | Расположение по умолчанию | Описание | |
---|---|---|---|
Текущие данные | C:\SCADA\ArchiveDAT\Cur | Текущие значения и статусы входных каналов | |
Архивные данные | C:\SCADA\ArchiveDAT\Min C:\SCADA\ArchiveDAT\Hour |
Значения и статусы входных каналов за определённое время | |
События | C:\SCADA\ArchiveDAT\Events | События и тревоги | |
Конфигурация | C:\SCADA\BaseDAT | «Рабочая копия базы конфигурации программного комплекса | описывающая автоматизированную систему в целом» |
Приведённые выше данные сохраняются в файлах специально разработанного формата DAT. Этот формат обеспечивает быстрый доступ на чтение и запись, а также работоспособность комплекса в случае повреждения части файла.
Информацию в файлах DAT можно представить в виде таблиц базы данных, состоящих из столбцов и строк. Поэтому работа с данными Rapid SCADA привычна для разработчиков и не представляет сложности.
Способы получения данных
Интеграция с Rapid SCADA подразумевает, прежде всего, интеграцию с приложением SCADA-Сервер, которое входит в состав программного комплекса. SCADA-Сервер управляет текущими и архивными данными системы на основе конфигурации, принимает и предоставляет информацию приложениям.
Считать данные Rapid SCADA и преобразовать в набор объектов можно с помощью библиотеки ScadaData.dll. Актуальную версию этой библиотеки можно получить, установив Rapid SCADA и выполнив поиск файла ScadaData.dll в директории установки. Исходный код библиотеки доступен на GitHub по ссылке.
Библиотека ScadaData.dll использует платформу .NET и написана на языке программирования C#. Поэтому разрабатываемые интеграционные модули должны быть написаны на одном из .NET совместимых языков. Для разработки необходимо использовать Microsoft Visual Studio версии 2010 или выше. Не забудьте добавить ссылку на ScadaData.dll к Вашему проекту.
Далее рассматриваются два основных способа обмена данными между Rapid SCADA и сторонними приложениями, которые реализованы в ScadaData.dll.
1-й способ. Прямой доступ к файлам
Считывание текущих и архивных данных
Текущие и архивные данные хранятся в файлах формата DAT в виде таблиц срезов. Срез – это набор значений и статусов входных каналов в определённый момент времени.
По умолчанию текущие, архивные данные и события сохраняются SCADA-Сервером в директорию C:\SCADA\ArchiveDAT. Файл текущих данных имеет имя current.dat. Файлы архивов именуются в формате mYYMMDD.dat для минутных архивов и hYYMMDD.dat для часовых архивов, где YYMMDD – год, месяц и день данных, хранящихся в файле. Каждый архивный файл содержит данные за одни сутки.
Для работы с файлами DAT, которые содержат таблицы срезов, предназначен класс Scada.Data.SrezAdapter.
Пример считывания данных из файла таблицы срезов:
1 2 3 4 5 6 |
using Scada.Data; ... SrezTableLight snapshotTable = new SrezTableLight(); SrezAdapter adapter = new SrezAdapter(); adapter.FileName = @"C:\SCADA\ArchiveDAT\Cur\current.dat"; adapter.Fill(snapshotTable); |
В приведённом примере адаптер заполняет таблицу срезов типа SrezTableLight. Кроме таблицы SrezTableLight, указанной в примере, адаптер поддерживает загрузку данных в объекты типов DataTable и Trend.
DataTable – это стандартная реализация таблицы в .NET. Она работает значительно медленнее по сравнению со SrezTableLight, поэтому использовать DataTable следует лишь в тех случаях, когда это явно необходимо.
Класс Trend предназначен для быстрой работы с данными одного входного канала. Этот класс может использоваться, например, если необходимо построить график значений канала.
Следующий пример выводит в консоль данные из таблицы срезов:
1 2 3 4 5 6 7 8 9 10 11 12 |
foreach (SrezTableLight.Srez snapshot in snapshotTable.SrezList.Values) { int cnlCnt = snapshot.CnlNums.Length; Console.WriteLine("Snapshot {0}, number of channels is {1}:", snapshot.DateTime, cnlCnt); for (int i = 0; i < cnlCnt; i++) { Console.WriteLine(" Channel[{0}] = {1}, {2}", snapshot.CnlNums[i], snapshot.CnlData[i].Val, snapshot.CnlData[i].Stat); } } |
Считывание событий
Считывание событий из файла формата DAT выполняется аналогично считыванию срезов. Класс EventAdapter производит чтение данных в экземпляр класса EventTableLight или DataTable. Класс EventTableLight предпочтителен по отношению к DataTable из-за скорости работы. Файлы событий именуются в формате eYYMMDD.dat, где YYMMDD – год, месяц и день событий, хранящихся в файле.
Пример считывания и вывода событий:
1 2 3 4 5 6 7 8 9 10 11 12 |
// read events EventTableLight eventTable = new EventTableLight(); EventAdapter adapter = new EventAdapter(); adapter.FileName = @"C:\SCADA\ArchiveDAT\Events\e150131.dat"; adapter.Fill(eventTable); // events output foreach (EventTableLight.Event ev in eventTable.AllEvents) { Console.WriteLine("Number: {0}. Date & time: {1}. Channel: {2}", ev.Number, ev.DateTime, ev.CnlNum); } |
Возможности записи в файлы текущих, архивных данных и событий не рассматривается в данной статье, т.к. запись в эти файлы выполняется SCADA-Сервером. Другие приложения не должны напрямую изменять файлы архивов, вместо этого необходимо взаимодействовать со SCADA-Сервером по протоколу TCP, как описано далее.
Считывание базы конфигурации
База конфигурации редактируется с помощью программы SCADA-Администратор. После того, как в базу конфигурации внесены необходимые правки, по щелчку на соответствующей кнопке создаётся рабочая копия базы, которая используется остальными приложениями Rapid SCADA. Рабочая копия базы конфигурации сохраняется в файлах формата DAT и располагается по умолчанию в директории C:\SCADA\BaseDAT. Каждый файл DAT содержит одну таблицу базы данных. Содержимое этих файлов можно просмотреть с помощью пользовательского интерфейса SCADA-Сервера.
Для считывания информации из файлов DAT, содержащих таблицы базы конфигурации, предназначен класс Scada.Data.BaseAdapter. Данные загружаются в таблицу типа DataTable. Для базы конфигурации, таблицы которой содержат не более 65535 строк, быстродействия DataTable вполне достаточно.
Пример считывания таблицы базы конфигурации:
1 2 3 4 |
DataTable dataTable = new DataTable("BaseTable"); BaseAdapter adapter = new BaseAdapter(); adapter.FileName = @"C:\SCADA\BaseDAT\incnl.dat"; adapter.Fill(dataTable, true); |
Работа с объектами DataTable подробно описана в MSDN.
2-й способ. Взаимодействие по протоколу TCP.
Для обмена информацией между SCADA-Сервером и другими приложениями, например, SCADA-Коммуникатором, SCADA-Web, используется протокол TCP. В дополнение к функциям запроса данных, используя протокол TCP, возможно передавать SCADA-Серверу команды телеуправления, которые затем будут направлены контроллерам.
SCADA-Сервер открывает на компьютере TCP порт, указанный в его настройках, остальные приложения подключаются к нему в качестве клиентов. Список подключенных клиентов можно проконтролировать в текстовом файле состояния SCADA-Сервера. При подключении клиент должен отправить серверу имя пользователя и пароль, чтобы получить права на запрос данных и отправку команд. Имя пользователя и пароль прописываются в базе конфигурации или в Active Directory, при этом пользователь должен иметь роль Приложение.
Следующий пример показывает, как создать объект для подключения к SCADA-Серверу и получить таблицу срезов:
1 2 3 4 5 6 7 8 9 10 11 12 |
using Scada.Client; ... CommSettings settings = new CommSettings("localhost", 10000, "ScadaServerCtrl", "12345", 10000); ServerComm serverComm = new ServerComm(settings); SrezTableLight snapshotTable = new SrezTableLight(); bool dataReceived = serverComm.ReceiveSrezTable("current.dat", snapshotTable); serverComm.Close(); if (dataReceived) Console.WriteLine("Data received successfully"); else Console.WriteLine("Error receiving data: " + serverComm.ErrMsg); |
Как видно из примера, для взаимодействия со SCADA-Сервером по протоколу TCP существует специальный класс Scada.Client.ServerComm. Настройки соединения задаются с помощью объекта типа CommSettings. Полученные данные таблицы срезов записываются в объект типа SrezTableLight, уже знакомый по предыдущим примерам.
Основные методы класса ServerComm, используемые для интеграции с Rapid SCADA, перечислены в следующей таблице.
Имя метода | Описание |
---|---|
ReceiveBaseTable | Принять таблицу базы конфигурации от SCADA-Сервера |
ReceiveSrezTable | Принять таблицу срезов от SCADA-Сервера |
ReceiveTrend | Принять тренд входного канала от SCADA-Сервера |
ReceiveEventTable | Принять таблицу событий от SCADA-Сервера |
ReceiveFileAge | Принять дату и время изменения файла от SCADA-Сервера |
SendStandardCommand | Отправить стандартную команду ТУ SCADA-Серверу |
SendBinaryCommand | Отправить бинарную команду ТУ SCADA-Серверу |
SendRequestCommand | Отправить команду внеочередного опроса КП SCADA-Серверу |
ReceiveCommand | Принять команду ТУ от SCADA-Сервера |
SendSrez | Отправить текущий срез SCADA-Серверу |
SendArchive | Отправить архивный срез SCADA-Серверу |
SendEvent | Отправить событие SCADA-Серверу |
CheckEvent | Отправить команду квитирования события SCADA-Серверу |
Close | Завершить работу со SCADA-Сервером и освободить ресурсы |
Подключаемые модули для SCADA-Сервера
Функциональность SCADA-Сервера можно гибко расширять с помощью подключаемых модулей. Подключаемый модуль представляет собой библиотеку, написанную на .NET совместимом языке программирования, например, C# с соблюдением определённых правил. Модуль позволяет добавить дополнительную логику, срабатывающую при определённых внутренних действиях SCADA-Сервера. Это может быть запуск и остановка, получение новых данных или событий и т.д.
Серверные модули удобно использовать в следующих случаях:
- если необходима передача информации в сторонние системы или базы данных сразу в момент её получения SCADA-Сервером;
- если необходима дополнительная сложная обработка получаемых SCADA-Сервером данных;
- если требуется автоматически генерировать команды управления при выполнении заданных условий.
Разработка подключаемых модулей выполняется в среде Microsoft Visual Studio версии 2010 и выше. Чтобы реализовать модуль, необходимо создать проект типа Class Library и реализовать два класса, унаследованных от классов Scada.Server.Modules.ModView и Scada.Server.Modules.ModLogic. Первый класс описывает пользовательский интерфейс модуля, а второй – логику его работы.
Рекомендуется скачать решение OpenModules с GitHub по ссылке, которое содержит простой для изучения пример создания тестового модуля ModTest. Можно создавать собственные модули, используя данный проект как образец.
При создании проекта и классов необходимо соблюдать правила именования:
- Имя файла библиотеки модуля должно начинаться с префикса Mod. Например, ModTest.dll.
- Классы, унаследованные от ModView и ModLogic, должны относиться к пространству имён Scada.Server.Modules.
- Имена классов, унаследованных от ModView и ModLogic, должны иметь вид ModTestView и ModTestLogic соответственно, где ModTest – имя DLL модуля.
- Имена классов чувствительны к регистру символов.
Скомпилированную DLL серверного модуля необходимо скопировать в директорию подключаемых модулей SCADA-Сервера, по умолчанию C:\SCADA\Server\Mod\
Затем перейти на страницу Модули SCADA-Сервера, добавить модуль, сохранить настройки и перезапустить службу SCADA-Сервера.
Теги: programming, scada