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

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

Автор Тема: Кнопки с блокировкой  (Прочитано 3952 раз)

Серега

  • Старожил
  • ****
  • Сообщений: 287
    • Просмотр профиля
Кнопки с блокировкой
« : 16 Июля 2020, 14:32:11 »
Добрый день!
Нужно было сделать взаимно разблокирующиеся кнопки. Поясню:
1. 2 кнопки с фиксацией (Открыть и Закрыть), привязаны к соответствующим переменным. Так же привязаны вторые переменные (с приставкой еХ) - сигналы от кольцевиков
2. При запуске проекта идет инициализация переменных и изменяются свойства графических элементов согласно условиям в скриптах (доступность текст и т.д.)
3. Соответственно когда проект полностью запущен кнопка "Открыть" отжата, доступна, надпись на ней "Открыть". Кнопка "Закрыть" нажата, не доступна(как бы заблокирована), и надпись "Закрыто"
Думал сделать как бы промежуточное состояние кнопки. Нажали подали команду через привязанную переменную. Пока не сработал например кольцевик (вторая переменная кнопки) в текущем положении кнопки поменять по сработке надпись. Но что то пошло не так.
1. Создал скрипт в глобальном модуле:
Код: (delphi)
procedure ChangeTextButton(NameButton:TM_Button; Caption_On:string;  Caption_Off:string);
begin
  if NameButton.VariableEx.Value = 1 then
    NameButton.States[1].Caption := Caption_On
  else
    NameButton.States[1].Caption := Caption_Off;
end;

2. Создал скрипт "Запуск проекта" и вызвал из глобального процедуру:
Код: (delphi)
ChangeTextButton(Button427, 'Выключен', 'Выключается'); 
3. Из ПЛК посылаю нужное состояние кольцевика (True). Запускаю проект вместе с орс. И...
И на кнопке надпись  'Выключается'.
Можете сказать, что делаю не так.
Жду вопросов и ответов.

« Изменён: 16 Июля 2020, 17:30:09 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #1 : 16 Июля 2020, 21:18:03 »
    Здравствуйте!

В Вашем случае всего четыре состояния, циклически изменяющихся: "Закрыто", "Открывается", "Открыто", "Закрывается" - вполне достаточно двух кнопок по четыре состояния, связанных одной переменной, в следующих парах для одного состояния:
0 - "Открыть" - "Закрыто";
1 - "Открывается" - "" (назовите состояние сами, в примере пустое поле);
2 - "Открыто" - "Закрыть";
4 - "" - "Закрывается".
Общая переменная привязана к основной переменной кнопок, индивидуальные переменные состояния привязаны к дополнительным переменным своих кнопок. Теги кнопок 0 и 2.
Скрипт "Изменилась основная переменная":
Код: (delphi)
begin
  with Sender as TM_Button do begin
    Enabled := Variable.AsInt = Tag;
    Open.Value := Variable.AsInt = 1;       // управляющая линия "Открыть"   
    Close.Value := Variable.AsInt = 3;      // управляющая линия "Закрыть"
  end;
end.
Скрипт "Изменилась дополнительная переменная":
Код: (delphi)
begin
  with Sender as TM_Button do if VariableEx.AsBool then Variable.Value := (Tag + 2) mod 4; // условие достижения крайнего положения = true
end.

Пример с моделью электромеханического клапана во вложении.

Серега

  • Старожил
  • ****
  • Сообщений: 287
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #2 : 21 Июля 2020, 15:11:01 »
Добрый день!
Автору pan2000 спасибо! Довольно часто даете нужное направление. Но ...
Тех.поддержка проверьте работает ли у Вас вызов внешнего интерфейса глобального модуля при работе со вспомогательной переменной.
В глобальном модуле вот это:
Код
procedure ChangeTextButton(NameButton:TM_Button; VarEx:TM_Variable; Caption_On:string; Caption_Off:string);
begin
if VarEx.Value = 1 then
  begin
    NameButton.States[1].Caption := Caption_On;
    Text1606.Text := "Правда";
  end
else
  begin
    NameButton.States[1].Caption := Caption_Off;
    Text1606.Text := "Не Правда";
  end;
end;
+ объявление  в interface. Вызов в 1-секундном скрипте такой:
Код
ChangeTextButton(Button427, sen2, 'Выключен', 'Выключается');
Я точно знаю в каком состоянии кнопки нужно поменять надпись. Вроде это просто. Но нужного результата нет.
Можете как-то прокомментировать?

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #3 : 21 Июля 2020, 19:44:57 »
  Здравствуйте!

Очевидно, что не выполняется сравнение строго с 1.
Правильное сравнение возможно для одинаковых типов. Например, значение типа Value может отличаться от значений типа AsBool для true. В примере можно посмотреть как изменяются значения переменной sen2 в зависимости от явного указания типа.
Код: (delphi)
//                                                                               результат для sen2 = true
  Text1608.Text := 'VariableEx.Value=' + IntToStr(VariableEx.value) + #10       //  -1
                 + 'VariableEx.AsInt=' + IntToStr(VariableEx.asint) + #10       //   1
                 + 'VariableEx.AsBool=' + IntToStr(integer(VariableEx.AsBool)); //   1
« Изменён: 22 Июля 2020, 04:45:41 от pan2000 »

Серега

  • Старожил
  • ****
  • Сообщений: 287
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #4 : 22 Июля 2020, 17:12:29 »
Добрый день!
Написали проблему, а потом и сами поняли в чем косяк.
Вы все верно говорите.
Все таки True не много отличается от 1.  ;D

Серега

  • Старожил
  • ****
  • Сообщений: 287
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #5 : 28 Июля 2020, 16:41:13 »
Добрый день!
Просто хочу уточнить одну вещь.
Есть основная переменная и дополнительная. Обе boolean.
Скрипт на изменения переменных, то есть любой из них.
По изменению меняем соответствующие параметры нужного объекта (пока только протестил на кнопке).
Если основная переменная стоит в состоянии True, то изменения состояния второстепенной переменной влияют на объект.
Если основная переменная стоит в состоянии False, то изменения состояния второстепенной переменной ни как не влияют на объект.
В руководстве какого либо описания не смог найти.
Можете пояснить принцип действия? Или это фишка. Или опять не понимаю принципа.
Жду ответов и предложений.
 
 

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #6 : 29 Июля 2020, 14:46:53 »
    Здравствуйте!

 Для правильной оценки изменения параметров нужно контролировать сам параметр, а не изменение визуальных свойств объекта (эффект суслика).
Например для объекта "Кнопка" с двумя состояниями - параметр изменение цвета в состоянии 1: при состоянии 1 изменение видно, а при 0 - нет, но оно есть.
Простейшее средство контроля - объект "Текст", при клике которого в его поле выводится значение контролируемого параметра, и, возможно ещё, дополнительная информация.

Серега

  • Старожил
  • ****
  • Сообщений: 287
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #7 : 29 Июля 2020, 16:59:31 »
Приветствую!
Хорошо. Рассмотрим гипотетический пример.
Есть дверь. Есть концевик, который отвечает за состояние двери "Закрыта".
Есть объект кнопка с фиксацией с основной и вспомогательной переменной.
Основная переменная - команда на открытие (=False) / закрытие (=True) 
Вспомогательная переменная - состояние концевика (дверь открыта = False / дверь закрыта = True)
Допустим имеется дельта времени пока дверь сойдет с концевика.
И теперь возникает идея реализовать все с помощью одной кнопки и команду отдать и состояние двери увидеть (через скрипты изменять свойства кнопки)
И в результате получаем, что пока есть команда изменить свойства можно (например текст и фон)
Нет команды нет изменений. Тогда как узнать состояние концевика?
Да многие могут сказать выведи дополнительно элемент и привяжи состояние концевика.
Принцип построения части проекта построен на перепривязки переменных.
В общем долго объяснять почему это не подходит. Надо. Так захотел заказчик.
Поэтому спрашиваю еще раз.
Цитировать
...
Если основная переменная стоит в состоянии True, то изменения состояния второстепенной переменной влияют на объект.
Если основная переменная стоит в состоянии False, то изменения состояния второстепенной переменной ни как не влияют на объект.
...
Это фишка или глюк.
Жду ответов и вопросов.


Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Кнопки с блокировкой
« Ответ #8 : 29 Июля 2020, 18:11:15 »
Здравствуйте.

Цитировать
Если основная переменная стоит в состоянии True, то изменения состояния второстепенной переменной влияют на объект.
Если основная переменная стоит в состоянии False, то изменения состояния второстепенной переменной ни как не влияют на объект.
В Simple-Scada ничего подобного, разумеется, нет. Основанная и дополнительная переменная никак между собой не связаны. Вы можете через скрипты запрограммировать какое-то другое поведение и сделать зависимость (возможно Вы так и сделали?), тогда она будет.

В целом, в Simple-Scada все компоненты работают примитивно, в них нет никаких чудес, как например зависимости между основной и доп. переменной и тому подобного. Активные компоненты, такие как кнопки, флажки, поля ввода, раскрывающиеся списки работают через связь с основной переменной. Т.е. если нажать кнопку, то переменная связанная с кнопкой изменится (в зависимости от текущего состояния кнопки). Аналогично в обратную сторону - если изменить переменную на контроллере, то кнопка автоматически примет состояние соответствующее значению переменной. Также с другими активными компонентами.
Остальные компоненты (неактивные), такие как Текст, Фигура и др. работают так, как опишет разработчик проекта в скриптах.
« Изменён: 29 Июля 2020, 18:12:48 от Simple-Scada »

Серега

  • Старожил
  • ****
  • Сообщений: 287
    • Просмотр профиля
Re: Кнопки с блокировкой
« Ответ #9 : 30 Июля 2020, 12:27:25 »
Добрый день!
Товарищи извините. Надо быть ВНИМАТЕЛЬНЫМ и отдохнувшим.  :-\
И не использовать Ctrl + C/Ctrl + V. А если используешь проверить раз 15.
Все заработало как надо. Спасибо за ответы