PDA

Просмотр полной версии : ФБ для диагностики и настройки



Рогов Алексей
04.07.2025, 09:38
Коллеги, добрый день!

Прошу Вас подключиться к теме диагностики и инструментам настройки оборудования. Предлагаю ФБ для вычисления и индикации времени между двумя событиями в миллисекундах. Писал целевым образом для пневмоцилиндра, но, вероятно этот метод можно применить и для круговых осей - изготовить некое подобие энкодера.
Для тестирования рекомендую записать программу в прибор и подключить к входам два датчика PNP или герконы.
Уважаемых программистов попрошу оптимизировать код, если потребуется.
Ожидаю продолжения темы, ведь диагностика упрощает жизнь и заказчику и исполнителю

84666Спасибо!

EFrol
04.07.2025, 10:11
Понеслась:
84667

Рогов Алексей
04.07.2025, 10:17
Понеслась:
84667

Я в комментарии писал, что не обязательно, но применимо к пневмоцилиндру : если магнитное кольцо проскакивает датчик - при неточной настройке - для этого и огород и фильтр тут не помощник. На Ваше усмотрение.

EFrol
04.07.2025, 10:29
Вариант:
84668


function_block tmrEvent

var_input
i1, i2 : bool;
end_var

var_output
tUp : real;
tDown : real;
end_var

var
tsUp : udint;
tsDown : udint;
rt1 : SYS.RTRIG;
ft1 : SYS.FTRIG;
rt2 : SYS.RTRIG;
ft2 : SYS.FTRIG;
end_var

rt1(I:=i1); ft1(I:=i1); rt2(I:=i2); ft2(I:=i2);
if ft1.Q then tsUp := time_to_udint(get_time()); end_if // Начало подъема
if ft2.Q then tsDown := time_to_udint(get_time()); end_if // Начало спуска
if rt2.Q then tUp := udint_to_real(time_to_udint(get_time()) - tsUp) / 1000; end_if // Конец подъема
if rt1.Q then tDown := udint_to_real(time_to_udint(get_time()) - tsDown) / 1000; end_if // Конец спуска

end_function_block

Рогов Алексей
04.07.2025, 10:53
Ваш код красивый, и работает только с правильно настроенным датчиком. Мой же не допускает счёт при повторном срабатывании одного и того же датчика. Благодарю за отзыв!

EFrol
04.07.2025, 11:34
Тогда в чём суть диагностики? Фиксировать повторное срабатывание или не допускать счёт?

Рогов Алексей
04.07.2025, 12:09
Повторное срабатывание в моём случае НЕ допускает счёт. Цель диагностики настроить пневмопривод и при несоответствии времени хода эталону выдать сообщение или аварию. В Вашем случае можно будет зафиксировать проскок датчика, в моём нет, согласен. Только сравнивать надо целые числа, конечно.
Ваш код намного короче, поэтому я и просил упростить задачку в первом сообщении.

EFrol
04.07.2025, 12:45
Если я настрою фильтрацию дребезга, так что проскок будет не замечен, то счёт будет продолжаться бесконечно.
Правильнее запускать таймер на определенное время и останавливать его когда цель достигнута.
Ну а если таймер всё таки остановился по окончанию времени, а событие не произошло = это и есть авария.
Однако это может быть случайная флуктуация (например, давление в пневмосистеме вдруг снизилось при переходе на другой компрессор),
само событие я фиксирую в электронном журнале, но если датчик сработал позже процесс продолжаю без аварийной остановки.

В зависимости от требуемой цели можно фиксировать таймаут:
84672

Dimensy
04.07.2025, 13:37
Если сделать вот так, то контакты сколько угодно могут дребезжать



function_block tim_p // Контроль времени хода механизма

var_input
T1 : bool; // Датчик начального положения
T2 : bool; // Датчик конечного положения
end_var

var_output
Q : udint; // Время хода в микросекундах
end_var

var
Tm : udint; // Время с подачи питания на реле
fl : bool;
ft1 : SYS.FTRIG;
end_var

ft1(I := T1);

if ft1.Q and not fl then
Tm := time_to_udint(get_time());
fl := true;
end_if

if T2 and fl then
Q := time_to_udint(get_time()) - Tm;
fl := false;
end_if

end_function_block


А, еще, мне кажется, что корректнее было бы считать время между подачей сигнала и срабатыванием датчика, а не между срабатываниями обоих датчиков