Добрый день!
Нужно было сделать взаимно разблокирующиеся кнопки. Поясню:
1. 2 кнопки с фиксацией (Открыть и Закрыть), привязаны к соответствующим переменным. Так же привязаны вторые переменные (с приставкой еХ) - сигналы от кольцевиков
2. При запуске проекта идет инициализация переменных и изменяются свойства графических элементов согласно условиям в скриптах (доступность текст и т.д.)
3. Соответственно когда проект полностью запущен кнопка "Открыть" отжата, доступна, надпись на ней "Открыть". Кнопка "Закрыть" нажата, не доступна(как бы заблокирована), и надпись "Закрыто"
Думал сделать как бы промежуточное состояние кнопки. Нажали подали команду через привязанную переменную. Пока не сработал например кольцевик (вторая переменная кнопки) в текущем положении кнопки поменять по сработке надпись. Но что то пошло не так.
1. Создал скрипт в глобальном модуле:
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. Создал скрипт "Запуск проекта" и вызвал из глобального процедуру:
ChangeTextButton(Button427, 'Выключен', 'Выключается');
3. Из ПЛК посылаю нужное состояние кольцевика (True). Запускаю проект вместе с орс. И...
И на кнопке надпись 'Выключается'.
Можете сказать, что делаю не так.
Жду вопросов и ответов.
Здравствуйте!
В Вашем случае всего четыре состояния, циклически изменяющихся: "Закрыто", "Открывается", "Открыто", "Закрывается" - вполне достаточно двух кнопок по четыре состояния, связанных одной переменной, в следующих парах для одного состояния:
0 - "Открыть" - "Закрыто";
1 - "Открывается" - "" (назовите состояние сами, в примере пустое поле);
2 - "Открыто" - "Закрыть";
4 - "" - "Закрывается".
Общая переменная привязана к основной переменной кнопок, индивидуальные переменные состояния привязаны к дополнительным переменным своих кнопок. Теги кнопок 0 и 2.
Скрипт "Изменилась основная переменная":
begin
with Sender as TM_Button do begin
Enabled := Variable.AsInt = Tag;
Open.Value := Variable.AsInt = 1; // управляющая линия "Открыть"
Close.Value := Variable.AsInt = 3; // управляющая линия "Закрыть"
end;
end.
Скрипт "Изменилась дополнительная переменная":
begin
with Sender as TM_Button do if VariableEx.AsBool then Variable.Value := (Tag + 2) mod 4; // условие достижения крайнего положения = true
end.
Пример с моделью электромеханического клапана во вложении.
Добрый день!
Автору 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, 'Выключен', 'Выключается');
Я точно знаю в каком состоянии кнопки нужно поменять надпись. Вроде это просто. Но нужного результата нет.
Можете как-то прокомментировать?
Здравствуйте!
Очевидно, что не выполняется сравнение строго с 1.
Правильное сравнение возможно для одинаковых типов. Например, значение типа Value может отличаться от значений типа AsBool для true. В примере можно посмотреть как изменяются значения переменной sen2 в зависимости от явного указания типа.
// результат для 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