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

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

Автор Тема: Как создать притеняемую кнопку.  (Прочитано 441 раз)

matiem

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Как создать притеняемую кнопку.
« : 28 Февраля 2025, 17:57:02 »
имеется кнопка (пуск/стоп) с фиксацией. два состояния.
1 состояние: номер 0, значение 1, текст пуск
2 состояние: номер 1, значение 0, текст стоп
Задача в том, чтобы при нажатии кнопки пуск она становилась неактивна и нажать на неё нельзя на такое время пока не откроются жалюзи и установка перейдет в работу.
Данные о состояний системы беру отсюда: SCo_Kod__Sostoyanie_
в значении 1 система стоит
в значении 32 открываются жалюзи
в значении 1024 запуск двигателя
по сути, притенять кнопку нужно от момента нажатия, до значения переменной 1024. после этого она должная стать активной и перейти в состояние 2


pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Как создать притеняемую кнопку.
« Ответ #1 : 01 Марта 2025, 16:29:54 »
   Здравствуйте.
Условие:
по сути, притенять кнопку нужно от момента нажатия, до значения переменной 1024. после этого она должная стать активной и перейти в состояние 2
предполагает наличие трёх состояний и, соответственно трех графических образов, причем собственно нажатие кнопки переведет её в следующее состояние.
Возможные варианты создания третьего притемненного состояние:
- при нажатии кнопка становится невидимой, графический объект (Текст, Кнопка или ...) размещенный непосредственно под кнопкой изображает притемненное состояние. По достижении условия кнопка вновь становится видимой;
- добавление третьего (притемненного) состояния к кнопке. в котором кнопка становится "Недоступной". По достижении условия кнопка переходит в состояние "Стоп" и вновь становится доступной;
- аналогично предыдущему варианту, но с использованием автомата состояний. Кнопка прикрыта сверху прозрачным объектом, управляющим автоматом с переходами по нажатию: "Пуск"->"Притемнение", "Притемнение"->"Притемнение", "Стоп"->"Пуск". По достижении условия автомат переходит в состояние "Стоп".
Притемненное состояние кнопки может использоваться для индикации промежуточных состояний (разумеется если они могут быть выделены):
ПУСК -> двигатель запускается -> жалюзи открывается -> что-то ещё случается -> СТОП
Примеры вариантов во вложении.

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 245
    • Просмотр профиля
    • Simple-Scada
Re: Как создать притеняемую кнопку.
« Ответ #2 : 01 Марта 2025, 20:33:06 »
Здравствуйте.
1. Если нужно блокировать кнопку по изменению переменной, указанной в свойстве "Переменная" на True/1, то на событие "OnDataChange" используйте следующий универсальный скрипт:
Код: (delphi)
begin
  if Sender is TM_Button then    // проверяем, что Sender это кнопка
    with Sender as TM_Button do  // приводим Sender к типу "TM_Button"
      if Variable.AsBool then
        Enabled := False;
end.
Данный скрипт будет отключать доступ к кнопке, когда значение основной переменной = True.

2. Если нужно разблокировать кнопку по изменению второй переменной (в Вашем случае "SCo_Kod__Sostoyanie_") на 1024, то эту переменную нужно указать в свойстве "Доп. переменная" кнопки и на событие "OnDataChangeEx" использовать следующий универсальный скрипт:
Код: (delphi)
begin
  if Sender is TM_Button then    // проверяем, что Sender это кнопка
    with Sender as TM_Button do  // приводим Sender к типу "TM_Button"
      if VariableEx.AsInt = 1024 then
        Enabled := True;
end.
Данный скрипт будет включать доступ к кнопке, когда значение доп. переменной = 1024.

matiem

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Как создать притеняемую кнопку.
« Ответ #3 : 04 Марта 2025, 06:27:07 »
спасибо. но есть сложность ещё вот с чем.
кнопка пуск записывает переменную в SCi_pusk -1.
а для остановки другая кнопка стоп записывает в SCi_stop - тоже 1.
значит вентиляция остановится, а значения останутся SCi_pusk:1 и SCi_stop:1.
старт после этого в петлю вообще уходит и больше не проявляется (пока руками значение не сдвинешь в 0)
получается для записи 0 надо нажимать их ещё раз.
наверное, можно как то автоматически их обнулять. Что то похожее нашел на форуме, но не получилось увязать с моим проектом
в проекте можно использовать либо одну кнопку пуск/стоп. либо раздельно пуск и стоп. не принципиально. тайм аутом кнопки старт тоже можно пренебречь

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Как создать притеняемую кнопку.
« Ответ #4 : 04 Марта 2025, 18:55:52 »
  Здравствуйте.

...наверное, можно как то автоматически их обнулять...

  Кнопка/кнопки изменяют состояния по действиям оператора и изменению состояния установки. Пример для некоторой модели установки во вложении.
Модель установки на основе реверсивного счетчика, по значениям переменных SCi_pusk и SCi_stop формирует временные диаграммы сигналов состояния системы в переменной SCo_Kod__Sostoyanie_:
- бит 0: 1 - система стоит, 0 - работает;
- бит 5: 32 - жалюзи открываются/закрываются, 0 - в покое;
- бит 10: 1024 - двигатель включен, 0 - выключен.

1. Кнопка имеет четыре состояния: ПУСК, ОТКР., СТОП, ЗАКР. Основная переменная связана с вспомогательной переменной состояния кнопки, дополнительная с переменной состояния системы.
В состояниях ОТКР. и ЗАКР. кнопка недоступна, а переход к следующему состоянию определяется значением переменной состояния системы.
Скрипты по изменению основной и дополнительной переменных:
Код: (delphi)
begin
  with Sender as TM_Object do
  begin
    Enabled := not GetBit(AsInt, 0);  // недоступна в нечетных состояниях кнопки (ОТКР. и ЗАКР.)
// конверсия состояний кнопки в состояние управляющих переменных
    case AsInt of
    0: begin SCi_pusk.Value := false; SCi_stop.Value := false; end;
    1: begin SCi_pusk.Value := true; SCi_stop.Value := false; end;
//    2: begin SCi_pusk.Value := true; SCi_stop.Value := false; end;
    3: begin SCi_pusk.Value := false; SCi_stop.Value := true; end;
    end;
  end;
end.
Код: (delphi)
// обратная связь от установки
begin
  with Sender as TM_Object do
  begin
    case AsInt of
    1: if GetBit(VariableEx.AsInt, 10) then value := 2;       // от включения двигателя
//    3: if not GetBit(VariableEx.AsInt, 5) then value := 0;    // от закрытых жалюзи
    3: if GetBit(VariableEx.AsInt, 0) then value := 0;        // от состояния системы
    end;
  end;
end.

2. Пара двоичных кнопок с общим вектором состояния, Однако в этом случае скрипты становятся сложнее, а информативность ниже, т.к. допустимы только три состояния вектора (запрещено - доступны одновременно ПУСК и СТОП). 

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1301
    • Просмотр профиля
Re: Как создать притеняемую кнопку.
« Ответ #5 : 04 Марта 2025, 21:42:30 »
Здравствуйте.

Цитировать
Кнопка пуск записывает переменную в SCi_pusk -1, а для остановки другая кнопка стоп записывает в SCi_stop - тоже 1. Значит вентиляция остановится, а значения останутся SCi_pusk:1 и SCi_stop:1. Старт после этого в петлю вообще уходит и больше не проявляется (пока руками значение не сдвинешь в 0). Получается для записи 0 надо нажимать их ещё раз.
Если предполагается, что переменные должны сбрасываться, то почему они не сбрасываются в ПЛК по нужным условиям? Логику работы оборудования обычно реализуют на ПЛК, т.к. это удобнее и надежнее (нет зависимости от работы ПК, состояния связи и т.д.). Поэтому рекомендуем реализовать все что требуется (сброс значений и другие условия) на ПЛК, а в скада-системе использовать кнопку "с фиксацией" со значениями 0/1. Вместо ПЛК можно попытаться реализовать все через скрипты скада-системы, но такой вариант будет в любом случае хуже.

По описанию непонятно, по каким именно условиям/событиям переменные SCi_pusk, SCi_stop должны сбрасываться на 0. Если переменная SCi_pusk связанная с кнопкой "Пуск" должна сброситься на 0, когда переменная SCo_Kod__Sostoyanie_ изменится на 1024, то можно добавить такой сброс в скрипт из нашего прошлого сообщения, например:
Код: (delphi)
begin
  if Sender is TM_Button then    // проверяем, что Sender это кнопка
    with Sender as TM_Button do  // приводим Sender к типу "TM_Button"
      if VariableEx.AsInt = 1024 then
      begin
        Enabled := True;         // разблокировать кнопку
        Value := 0;              // записать 0 в основную переменную объекта
      end;
end.
Сброс на ноль переменной SCi_stop, связанной с кнопкой "Стоп" можно реализовать аналогично.

Цитировать
Кнопка пуск записывает переменную в SCi_pusk -1, а для остановки другая кнопка стоп записывает в SCi_stop - тоже 1.
Возможные режимы работы кнопки описаны по ссылке (см. описание свойства "Тип"). Если у Вас используется две кнопки, каждая из которых должна записывать фиксированное значение (1), то нужно использовать кнопки "с фиксацией" и оставить у каждой из них одно состояние со значением 1 (остальные состояния удалить). Тогда кнопка будет записывать фиксированное значение.