Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: matiem от 28 Февраля 2025, 17:57:02

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

Название: Re: Как создать притеняемую кнопку.
Отправлено: pan2000 от 01 Марта 2025, 16:29:54
   Здравствуйте.
Условие:
по сути, притенять кнопку нужно от момента нажатия, до значения переменной 1024. после этого она должная стать активной и перейти в состояние 2
предполагает наличие трёх состояний и, соответственно трех графических образов, причем собственно нажатие кнопки переведет её в следующее состояние.
Возможные варианты создания третьего притемненного состояние:
- при нажатии кнопка становится невидимой, графический объект (Текст, Кнопка или ...) размещенный непосредственно под кнопкой изображает притемненное состояние. По достижении условия кнопка вновь становится видимой;
- добавление третьего (притемненного) состояния к кнопке. в котором кнопка становится "Недоступной". По достижении условия кнопка переходит в состояние "Стоп" и вновь становится доступной;
- аналогично предыдущему варианту, но с использованием автомата состояний. Кнопка прикрыта сверху прозрачным объектом, управляющим автоматом с переходами по нажатию: "Пуск"->"Притемнение", "Притемнение"->"Притемнение", "Стоп"->"Пуск". По достижении условия автомат переходит в состояние "Стоп".
Притемненное состояние кнопки может использоваться для индикации промежуточных состояний (разумеется если они могут быть выделены):
ПУСК -> двигатель запускается -> жалюзи открывается -> что-то ещё случается -> СТОП
Примеры вариантов во вложении.
Название: Re: Как создать притеняемую кнопку.
Отправлено: Simple Scada от 01 Марта 2025, 20:33:06
Здравствуйте.
1. Если нужно блокировать кнопку по изменению переменной, указанной в свойстве "Переменная (https://clck.ru/3GfyCn)" на True/1, то на событие "OnDataChange (https://clck.ru/3GfwfE)" используйте следующий универсальный  (https://simple-scada.com/help/script/script-types.html)скрипт:
Код: (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, то эту переменную нужно указать в свойстве "Доп. переменная (https://clck.ru/3GcsQM)" кнопки и на событие "OnDataChangeEx (https://clck.ru/3GcsXq)" использовать следующий универсальный  (https://simple-scada.com/help/script/script-types.html)скрипт:
Код: (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.
Название: Re: Как создать притеняемую кнопку.
Отправлено: matiem от 04 Марта 2025, 06:27:07
спасибо. но есть сложность ещё вот с чем.
кнопка пуск записывает переменную в SCi_pusk -1.
а для остановки другая кнопка стоп записывает в SCi_stop - тоже 1.
значит вентиляция остановится, а значения останутся SCi_pusk:1 и SCi_stop:1.
старт после этого в петлю вообще уходит и больше не проявляется (пока руками значение не сдвинешь в 0)
получается для записи 0 надо нажимать их ещё раз.
наверное, можно как то автоматически их обнулять. Что то похожее нашел на форуме, но не получилось увязать с моим проектом
в проекте можно использовать либо одну кнопку пуск/стоп. либо раздельно пуск и стоп. не принципиально. тайм аутом кнопки старт тоже можно пренебречь
Название: Re: Как создать притеняемую кнопку.
Отправлено: pan2000 от 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. Пара двоичных кнопок с общим вектором состояния, Однако в этом случае скрипты становятся сложнее, а информативность ниже, т.к. допустимы только три состояния вектора (запрещено - доступны одновременно ПУСК и СТОП). 
Название: Re: Как создать притеняемую кнопку.
Отправлено: Simple_Scada от 04 Марта 2025, 21:42:30
Здравствуйте.

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

По описанию непонятно, по каким именно условиям/событиям переменные 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.
Возможные режимы работы кнопки описаны по ссылке (https://simple-scada.com/help/manual/button.html) (см. описание свойства "Тип"). Если у Вас используется две кнопки, каждая из которых должна записывать фиксированное значение (1), то нужно использовать кнопки "с фиксацией" и оставить у каждой из них одно состояние (https://simple-scada.com/help/manual/button.html?anchor=btnsost) со значением 1 (остальные состояния удалить). Тогда кнопка будет записывать фиксированное значение.