Разработка драйверов устройств
Чтобы добавить поддержку нового типа устройств в Rapid SCADA, необходимо разработать драйвер устройства. В терминах Rapid SCADA драйвер называется библиотекой КП или DLL КП. Разработанная библиотека динамически подключается программой SCADA-Коммуникатор и выполняет опрос устройств и отправку команд управления.
Для разработки понадобится Microsoft Visual Studio 2010 или выше, а также библиотеки ScadaCommCommon.dll, ScadaData.dll и Log.dll, содержащие базовую функциональность. Актуальные версии этих DLL можно найти в директории установки Rapid SCADA.
Общая последовательность действий по разработке библиотеки КП:
- Запустите Visual Studio и создайте новый проект типа Class Library. Используйте для проекта .NET Framework
- Добавьте ScadaCommCommon.dll, ScadaData.dll и Log.dll в References проекта.
- Создайте класс, унаследованный от Scada.Comm.Devices.KPView, в котором реализуется пользовательский интерфейс библиотеки.
- Создайте класс, унаследованный от Scada.Comm.Devices.KPLogic, в котором реализуется логика обмена данными с устройствами.
- Выполните сборку проекта и выложите полученную DLL в директорию библиотек КП программы SCADA-Коммуникатор. По умолчанию C:\SCADA\ScadaComm\KP
- Перезапустите графическую оболочку SCADA-Коммуникатора, чтобы DLL стала доступна.
- Отлаживайте код библиотеки, используя журналы SCADA-Коммуникатора или с помощью удалённой отладки Visual Studio.
Необходимо соблюдать несколько правил именования файла DLL и классов:
- Имя файла создаваемой DLL должно начинаться с префикса Kp. Например, KpTest.dll.
- Классы, унаследованные от KPView и KPLogic, должны относиться к пространству имён Scada.Comm.Devices.
- Имена классов, унаследованных от KPView и KPLogic, должны иметь вид KpTestView и KpTestLogic соответственно, где KpTest – имя библиотеки КП.
- Имена классов чувствительны к регистру символов.
Примером создаваемой библиотеки КП является проект KpTest, относящийся к решению OpenKPs. Данное решение доступно на GitHub по ссылке. Ознакомьтесь проектом KpTest и другими проектами из OpenKPs и используйте их как основу при разработке собственных драйверов.
Реализация класса пользовательского интерфейса
Простейший пример реализации класса, унаследованного от KPView:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
namespace Scada.Comm.Devices { public sealed class KpTestView : KPView { public override string KPDescr { get { return "Библиотека КП для тестирования."; } } } } |
Обязательное действие при реализации класса – переопределить свойство KPDescr, которое возвращает описание библиотеки КП, отображаемое SCADA-Коммуникатором.
Дополнительные возможности при реализации пользовательского интерфейса библиотеки КП:
- свойство DefaultCnls, если его переопределить, задаёт описания каналов, которые используется сервисом автоматической генерации каналов SCADA-Администратора;
- переопределение свойства DefaultReqParams задаёт параметры опроса КП по умолчанию, используемые SCADA-Коммуникатором;
- переопределение метода ShowProps позволяет отобразить форму для настройки свойств КП в SCADA-Коммуникаторе.
Примеры реализации перечисленных выше возможностей содержатся в проектах KpModbus и KpSms решения OpenKPs в классах KpModbusView и KpSmsView соответственно.
Реализация класса логики работы
Для реализации логики обмена данными с устройствами, необходимо создать класс, который наследуется от KPLogic. Класс KPLogic содержит множество полезных свойств и методов, необходимых разработчику, основные из которых будут рассмотрены далее. Чтобы глубже понять, как устроены библиотеки КП, и использовать все предоставляемые Rapid SCADA возможности, рекомендуется изучить исходный код класса KPLogic, а также код библиотек, входящих в решение OpenKPs.
Конструктор создаваемого класса должен содержать целочисленный параметр number, в который передаётся номер КП из базы конфигурации. В большинстве случаев в конструкторе создаются теги КП, которые являются объектами класса с именем KPTag. Теги могут быть разбиты на группы, относящиеся к классу TagGroup.
Следующий пример демонстрирует реализацию конструктора:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public KpTestLogic(int number) : base(number) { List<TagGroup> tagGroups = new List<TagGroup>(); TagGroup tagGroup = new TagGroup("Group 1"); tagGroup.KPTags.Add(new KPTag(1, "Tag 1")); tagGroup.KPTags.Add(new KPTag(2, "Tag 2")); tagGroup.KPTags.Add(new KPTag(3, "Tag 3")); tagGroups.Add(tagGroup); tagGroup = new TagGroup("Group 2"); tagGroup.KPTags.Add(new KPTag(4, "Tag 4")); tagGroup.KPTags.Add(new KPTag(5, "Tag 5")); tagGroups.Add(tagGroup); InitKPTags(tagGroups); } |
Класс KPLogic содержит ряд виртуальных методов, которые переопределяются в собственном классе при реализации алгоритма работы нового драйвера. Виртуальные методы описаны в следующей таблице:
Имя виртуального метода | Описание |
---|---|
Session | Выполнить сеанс опроса КП |
SendCmd | Отправить команду ТУ |
ProcIncomingReq | Обработать уже считанный входящий запрос |
ProcUnreadIncomingReq | Обработать не считанный входящий запрос |
OnAddedToCommLine | Выполнить действия после добавления КП на линию связи |
OnCommLineStart | Выполнить действия при запуске линии связи |
OnCommLineTerminate | Выполнить действия при завершении работы линии связи |
OnCommLineAbort | Выполнить действия при прерывании работы линии связи |
OnConnectionSet | Выполнить действия после установки соединения |
BindTag | Привязать тег КП к входному каналу базы конфигурации |
CheckBehaviorSupport | Проверить поддержку режима работы канала связи |
InvalidateCurData | Установить текущие данные как недостоверные |
GetInfo | Получить информацию о работе КП |
ConvertTagDataToStr | Преобразовать данные тега КП в строку |
В большинстве случаев достаточно переопределить только методы Session и SendCmd, реализующие сеанс опроса устройства и отправку команды соответственно. Переопределяя какой-либо метод, можно вызвать метод базового класса, чтобы использовать существующую логику, например:
1 2 3 4 5 |
public override void SendCmd(Command cmd) { base.SendCmd(cmd); CalcCmdStats(); } |
Библиотека KP.dll содержит класс CommUtils, который содержит вспомогательные методы. Также стоит обратить внимание на полезный класс ScadaUtils из библиотеки ScadaData.dll. Использование данных классов сокращает время разработки и позволяет применить единый подход для множества программных модулей.
Теги: programming, scada