Я бы грешил на механические контакты кнопок и концевиков.
Поставьте на каждый дискретный вход с кнопками, от которых возможен счёт, по схеме устранения дребезга контактов на основе таймеров и RS-триггера.
Постоянную фильтра сделайте от 20мс - обычно этого достаточно.
Что-то типа
Или в текстовом виде
Код:
VAR
(* переменные для обработки положения переключателя "Насосы в автоматическом режиме" *)
bPumpAtAuto : BOOL; (* обработанное антидребезгом состояние переключателя *)
tonPumpAtAuto : TON; (* переключатель в "АВТО" - после паузы антидребезга *)
tofPumpAtManual : TOF; (* переключатель в "РУЧНОМ" - после паузы антидребезга *)
rsPumpAtAutoStatus : RS; (* переключатель в "АВТО" - управляется от состояний нажата/отпущена после паузы антидребезга *)
rtrigPumpAtAuto : R_TRIG; (* одиночный импульс при переключении в автоматический режим *)
END_VAR
(*--------------------------------------------------------------------------*)
(* переключатель "Насосы в автоматическом режиме" *)
(*--------------------------------------------------------------------------*)
(* Проверка нажатия кнопки b_Button с подавлением дребезга *)
tonPumpAtAuto(in:=xPumpAtAuto, pt:=t#20ms);
tofPumpAtManual(in:=xPumpAtAuto, pt:=t#20ms);
rsPumpAtAutoStatus(SET:=tonPumpAtAuto.q, reset1:=NOT tofPumpAtManual.Q);
rtrigPumpAtAuto(clk:=rsPumpAtAutoStatus.Q1);
bPumpAtAuto:=rsPumpAtAutoStatus.Q1;