Здравствуйте.
1. Если нужно блокировать кнопку по изменению переменной, указанной в свойстве "Переменная (https://clck.ru/3GfyCn)" на True/1, то на событие "OnDataChange (https://clck.ru/3GfwfE)" используйте следующий универсальный (https://simple-scada.com/help/script/script-types.html)скрипт:
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)скрипт:
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.
Здравствуйте.
...наверное, можно как то автоматически их обнулять...
Кнопка/кнопки изменяют состояния по действиям оператора и изменению состояния установки. Пример для некоторой модели установки во вложении.
Модель установки на основе реверсивного счетчика, по значениям переменных SCi_pusk и SCi_stop формирует временные диаграммы сигналов состояния системы в переменной SCo_Kod__Sostoyanie_:
- бит 0: 1 - система стоит, 0 - работает;
- бит 5: 32 - жалюзи открываются/закрываются, 0 - в покое;
- бит 10: 1024 - двигатель включен, 0 - выключен.
1. Кнопка имеет четыре состояния: ПУСК, ОТКР., СТОП, ЗАКР. Основная переменная связана с вспомогательной переменной состояния кнопки, дополнительная с переменной состояния системы.
В состояниях ОТКР. и ЗАКР. кнопка недоступна, а переход к следующему состоянию определяется значением переменной состояния системы.
Скрипты по изменению основной и дополнительной переменных:
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.
// обратная связь от установки
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. Пара двоичных кнопок с общим вектором состояния, Однако в этом случае скрипты становятся сложнее, а информативность ниже, т.к. допустимы только три состояния вектора (запрещено - доступны одновременно ПУСК и СТОП).
Здравствуйте.
Кнопка пуск записывает переменную в 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, то можно добавить такой сброс в скрипт из нашего прошлого сообщения, например:
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 (остальные состояния удалить). Тогда кнопка будет записывать фиксированное значение.