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

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

Автор Тема: Variable, VariableEx. Бит, тег в свойствах кнопки  (Прочитано 23625 раз)

Ivan_Vit

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Здравствуйте, подскажите, буду очень признателен!

Из руководства:
Если необходимо изменять цвет по биту одной переменной, а скорость анимации по биту другой переменной, то нужно указать в свойстве изображения «Переменная» первую переменную, а в свойстве «Доп. переменная» вторую переменную. Далее, нужно написать универсальный скрипт приведенный ниже и установить его на событие OnDataChange и OnDataChangeEx требуемых изображений:
Код: (delphi)
begin
if Sender is TM_Image then // сначала убедимся, что скрипт вызван объектом «Изображение»
with Sender as TM_Image do // далее будем работать с объектом Sender, как с изображением
begin
// меняем цвет изображения по основной переменной
if GetBit(AsInt, 3) = TRUE then
Color := clGreen
else
Color := clRed;
// меняем скорость анимации изображения по доп. переменной «VariableEx»
if GetBit(VariableEx.AsInt, 1) = TRUE then
AnimSpeed := 10
else
AnimSpeed := 0;
end;
end.
Мой случай:
У меня есть две переменные status_36 и status_37, по status_36 по биту 5 сигнал аварии, транспарант( кнопка ) должна гореть красным.
По status_37 по биту 0 приходит сигнал работы, кнопка должна при работе гореть зеленым.
Далее, свойствах кнопки я могу указать основную и доп. переменную, а также могу указать бит и тег, в событиях кнопки есть ondatachange и ondatachangeEx.
Нужно ли в свойствах кнопки вписывать биты, по которым приходит сигнал, если да то как , так как есть одна строка куда указывается бит и одна строка, где указывается тег. А у меня же два бита используются 5 и 0.
Проблема в том , что в свойствах кнопки есть только одно поле «Бит», но у меня два бита в разных переменных. Невозможно указать оба бита в одном поле.

Далее, если я правильно понял ( прошу, дайте знать правильно/неправильно понял)
кнопкой(транспарантом) можно управлять полностью через скрипт, при этом настройка свойствах кнопки будет следующей:

Основная переменная (Variable): status_36
Доп. переменная (VariableEx): status_37
Бит: 0 или оставить пустым (так так как управление полностью через скрипт). Отмечу, что оставить пустым не получается, есть вариант сделать "-1" (что означает не работать с битами). Остается только ставить нуль, но это сомнительно.
Tag: не использую.

Тогда скрипт будет таким:
Код: (delphi)
begin
if Sender is TM_Button then
with Sender as TM_Button do
begin
// Проверяем бит 5 в status_36 (авария)
var alarmBit := 5; // бит для аварии
var workBit := 0; // бит для работы

// Получаем значения переменных
var alarmStatus := GetBit(AsInt, alarmBit); // Основная переменная (status_36)
var workStatus := GetBit(VariableEx.AsInt, workBit); // Доп. переменная (status_37)

// Определяем цвет
if alarmStatus = TRUE then
States[0].Color := clRed // Авария — красный
else if workStatus = TRUE then
States[0].Color := clGreen // Работа — зеленый
else
States[0].Color := clGray; // Ни аварии, ни работы — серый
end;
Основной вопрос заключается в том, а если этих кнопок будет много, то будет ли возможность сделать универсальный скрипт для такого случая ? Чтобы к каждой кнопки не привязывать скрипт, где просто нужно поменять нумера для битов.
« Изменён: 31 Января 2026, 19:06:24 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1385
    • Просмотр профиля
Re: Variable, VariableEx. Бит, тег в свойствах кнопки
« Ответ #1 : 31 Января 2026, 19:01:18 »
Здравствуйте.

Вместо нескольких отдельных переменных/битов, на ПЛК можно создать одну целочисленную переменную с нужными состояниями, например: 1 - работа, 2 - авария, 3 - пауза и затем использовать ее в скада-системе. Это самый лучший и простой способ.   

Судя по описанию, Вам необходимо создать индикатор состояния работы оборудования. Для этого можно использовать компоненты "Фигура", "Изображение" или "Текст". "Кнопка" это сложный компонент, состоящий из множества элементов. Рекомендуем использовать доступные компоненты по назначению. Если требуется управлять значением переменной, то используйте кнопку. Если нужно создать индикатор работы оборудования, то используйте Фигуру, Изображение или Текст.

Компонент "Текст" по внешнему виду можно настроить в точности как кнопку.

Чтобы написать универсальный скрипт для Вашей задачи, нужно:
1. Разместить на мнемосхеме компонент "Текст".
2. Разбить целочисленные внешние переменные на биты, как это описано по ссылке. Тогда с каждым битом переменной можно будет работать как с отдельной переменной.
3. Переменную бита аварии указать в свойстве "Переменная" объекта Текст.
4. Переменную бита работы указать в свойстве "Доп. переменная" объекта Текст.
5. Создать скрипт с типом события "Универсальный скрипт" и следующим кодом:
Код: (delphi)
begin
  if Sender is TM_Text then        // проверяем, что Sender это текст
    with Sender as TM_Text do      // приводим Sender к типу "Text"
    begin
      if AsBool then               // если основная переменная объекта = True, то
      begin
        Text := "Авария";
        Color := clRed;
      end else                     // иначе
        if VariableEx.AsBool then  // если доп. переменная объекта = True, то
        begin
          Text := "Работа";
          Color := clGreen;
        end else                   // в других случаях
        begin
          Text := "Пауза";
          Color := clGray;
        end;
   end;
end.
6. Данный скрипт назначить на два события объекта: "OnDataChange" и "OnDataChangeEx" – это нужно для того, чтобы скрипт выполнялся по изменению двух переменных.
Пример проекта во вложении.

Данный скрипт универсальный и его можно использовать для любых объектов Текст, которые должны работать аналогичным образом. Так как в проекте предполагается использовать однотипные объекты, то рекомендуем использовать систему шаблонов.
« Изменён: 31 Января 2026, 19:13:01 от Simple_Scada »