Разработка логических модулей

Логические модули обладают следующими возможностями:

  • Получать текущие, исторические данные и события с максимально возможной скоростью для последующей обработки.
  • Записывать данные и события в архивы.
  • Перехватывать поступающие на Сервер команды.
  • Отправлять команды.

Рассмотрим разработку логической части и пользовательского интерфейса простого модуля, который будет иметь кодовое обозначение ModAbc. Для разработки сложных модулей изучите и используйте в качестве примеров исходный код существующих модулей на GitHub.

Реализация логики

Создайте новый проект на основе шаблона Class Library. Введите наименование проекта ModAbc.Logic, выберите фреймворк .NET 8.0.

Добавьте зависимости на библиотеки ScadaCommon.dll, ScadaCommon.Log.dll и ScadaServerCommon.dll. Актуальные бинарные файлы этих библиотек можно найти в директории установки Rapid SCADA, либо собрать самостоятельно из исходного кода.

По двойному щелчку в Solution Explorer откройте файл проекта ModAbc.Logic.csproj и отредактируйте его свойства, как показано ниже.

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>disable</Nullable>
  <RootNamespace>Scada.Server.Modules.ModAbc.Logic</RootNamespace>
</PropertyGroup>

Создайте класс ModAbcLogic и скопируйте код, который приведён ниже. Этот класс реализует логику работы модуля. Обратите внимание, что пространство имён и имя класса должны содержать код модуля ModAbc. Изучите исходный код базового класса ModuleLogic и интерфейс IServerContext, чтобы узнать о возможностях, доступных при реализации логики модуля.

using Scada.Data.Models;

namespace Scada.Server.Modules.ModAbc.Logic
{
    public class ModAbcLogic : ModuleLogic
    {
        private const int InputChannel = 105;
        private const int OutputChannel = 104;
        private const int UserID = 11;
        private const double Threshold = 10.0;

        private bool high = false;
        private bool low = false;

        public ModAbcLogic(IServerContext serverContext)
            : base(serverContext)
        {
        }

        public override string Code => "ModAbc";

        public override void OnServiceStart()
        {
            Log.WriteAction("Модуль ModAbc запущен");
        }

        public override void OnServiceStop()
        {
            Log.WriteAction("Модуль ModAbc остановлен");
        }

        public override void OnIteration()
        {
            CnlData curData = ServerContext.GetCurrentData(InputChannel);

            if (curData.IsDefined)
            {
                if (curData.Val >= Threshold)
                {
                    if (!high)
                    {
                        ServerContext.SendCommand(new TeleCommand(OutputChannel, 1, UserID));
                        high = true;
                    }
                }
                else
                {
                    high = false;
                }

                if (curData.Val < Threshold)
                {
                    if (!low)
                    {
                        ServerContext.SendCommand(new TeleCommand(OutputChannel, 0, UserID));
                        low = true;
                    }
                }
                else
                {
                    low = false;
                }
            }
        }
    }
}

Выполните сборку проекта и скопируйте ModAbc.Logic.dll в директорию модулей Сервера ScadaServer\Mod

Реализация интерфейса

Создайте новый проект на основе шаблона Windows Forms Class Library. Введите наименование проекта ModAbc.View, выберите фреймворк .NET 8.0.

Добавьте зависимости на библиотеки ScadaCommon.dll, ScadaCommon.Forms.dll, ScadaCommon.Log.dll и ScadaServerCommon.dll.

По двойному щелчку в Solution Explorer откройте файл проекта ModAbc.View.csproj и отредактируйте его свойства, как показано ниже.

<PropertyGroup>
  <TargetFramework>net8.0-windows</TargetFramework>
  <Nullable>disable</Nullable>
  <UseWindowsForms>true</UseWindowsForms>
  <ImplicitUsings>enable</ImplicitUsings>
  <RootNamespace>Scada.Server.Modules.ModAbc.View</RootNamespace>
</PropertyGroup>

Создайте класс ModAbcView и скопируйте код, который приведён ниже. Этот класс реализует пользовательский интерфейс модуля. Обратите внимание, что пространство имён и имя класса должны содержать код модуля ModAbc. В нашем примере пользовательский интерфейс модуля фактически отсутствует, тем не менее необходима минимальная реализация интерфейса, чтобы модуль можно было использовать в приложении Администратор. Изучите исходный код базового класса ModuleView, чтобы узнать о доступных возможностях.

namespace Scada.Server.Modules.ModAbc.View
{
    public class ModAbcView : ModuleView
    {
        public override string Name => "Модуль ABC";
        public override string Descr => "Простой пример модуля";
    }
}

Выполните сборку проекта и скопируйте ModAbc.View.dll в директорию библиотек Администратора ScadaAdmin\Lib

Запуск модуля

Запустите приложение Администратор или перезапустите его, если оно было открыто. Создайте и откройте копию проекта HelloWorld, затем в разделе Сервер > Модули найдите разработанный модуль. Убедитесь, что при выборе модуля его описание корректно отображается. Если при отображении описания модуля возникла ошибка, скорее всего, допущена неточность в пространстве имён или имени класса интерфейса модуля.

Включите модуль ModAbc и передайте проект на выполнение. В журнал Сервера будет выводиться информация о запуске и остановке модуля. При переходе значения канала 105 через заданный константой порог 10, будут отправляться команды 0 или 1 на канал 104.