Здравствуйте.
...наверное, можно как то автоматически их обнулять...
Кнопка/кнопки изменяют состояния по действиям оператора и изменению состояния установки. Пример для некоторой модели установки во вложении.
Модель установки на основе реверсивного счетчика, по значениям переменных 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. Пара двоичных кнопок с общим вектором состояния, Однако в этом случае скрипты становятся сложнее, а информативность ниже, т.к. допустимы только три состояния вектора (запрещено - доступны одновременно ПУСК и СТОП).