Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Создание своего класса  (Прочитано 2012 раз)

Banzai

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Создание своего класса
« : 07 Июля 2020, 05:35:02 »
Добрый день. Скажите, как можно реализовать свой собственный класс и как к нему обращаться из других скриптов? Если это возможно, не могли бы вы привести примеры кода?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Создание своего класса
« Ответ #1 : 07 Июля 2020, 10:17:37 »
Здравствуйте.
Создание классов возможно в версиях Simple-Scada 2.3.5.0 и выше. Для описания классов нужно создать в меню скриптов новый глобальный модуль и описать в нём класс (или несколько классов).
Рассмотрим небольшой пример. Пусть у нас есть три однотипных агрегата, каждый агрегат связан с какой-то переменной, которая отвечает за пуск/стоп агрегата, также он имеет имя и методы для остановки и пуска. Остановка и пуск агрегата должны сопровождаться выводом соответствующих сообщений. Для решения этих задач мы можем создать один отдельный класс, реализовать в нём методы пуск/стоп и использовать их. Вот пример модуля с комментариями.
Код: (delphi)
interface

type
  TAggregate = class         // класс
  private
    FName: string;           // имя агрегата
    FVariable: TM_Variable;  // переменная агрегата
  public
    // это конструктор класса
    constructor Create(const AName: string; AVar: TM_Variable);

    // эти методы отвечают за пуск / стоп агрегата
    procedure Start;
    procedure Stop;

    // имя и переменная агрегата доступны извне только для чтения
    property Name: string read FName;
    property Variable: TM_Variable read FVariable;
  end;

var
  // объявляем сами агрегаты, допустим их всего три
  Aggregate1: TAggregate;
  Aggregate2: TAggregate;
  Aggregate3: TAggregate;

implementation

constructor TAggregate.Create(const AName: string; AVar: TM_Variable);
begin
  // в конструкторе агрегат получает имя и переменную
  FName := AName;
  FVariable := AVar;
end;

procedure TAggregate.Start;
begin
  FVariable.Value := 1;  // запускаем агрегат
  AddMessage(Now, mkMessage, 'Агрегат "' + FName + '" запущен!', True, False);
end;

procedure TAggregate.Stop;
begin
  FVariable.Value := 0;  // останавливаем агрегат
  AddMessage(Now, mkMessage, 'Агрегат "' + FName + '" остановлен!', True, False);
end;

{ это секция инициализации, она выполняется один раз, при старте проекта }
initialization
  // создаём агрегаты
  Aggregate1 := TAggregate.Create('Транспортёр', vrAggr1);
  Aggregate2 := TAggregate.Create('Мешалка', vrAggr2);
  Aggregate3 := TAggregate.Create('Насос', vrAggr3);

{ это секция финализации, она выполняется один раз, при остановке проекта }
finalization
  // !!! Обязательно очищаем созданные объекты! Иначе получим утечку памяти!
  FreeAndNil(Aggregate1);
  FreeAndNil(Aggregate2);
  FreeAndNil(Aggregate3);

end.

Агрегаты описаны и созданы, за создание отвечает конструктор Create в котором агрегату назначается имя и переменная пуск / стоп. Теперь мы можем из любого скрипта управлять агрегатом, например запустить его:
Код: (delphi)
begin
  Aggregate1.Start;
end.

Обязательно освобождайте объект через FreeAndNil  после того, как работа с ним завершена, чтобы не получить утечку памяти. Например: FreeAndNil(Aggregate1);
Если вы передаёте переменную строкового типа как параметр, то рекомендуется объявлять её как константу. Например: constructor Create(const AName: string; AVar: TM_Variable);
« Изменён: 07 Июля 2020, 10:18:53 от Simple-Scada »

Banzai

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Создание своего класса
« Ответ #2 : 09 Июля 2020, 10:52:08 »
Спасибо, это именно то, что нужно. Можно ли эту информацию добавить в руководство по скриптам?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Создание своего класса
« Ответ #3 : 10 Июля 2020, 10:21:59 »
Да, добавим в руководство по скриптам.