Просмотр полной версии : ФБ для диагностики и настройки
Рогов Алексей
04.07.2025, 09:38
Коллеги, добрый день!
Прошу Вас подключиться к теме диагностики и инструментам настройки оборудования. Предлагаю ФБ для вычисления и индикации времени между двумя событиями в миллисекундах. Писал целевым образом для пневмоцилиндра, но, вероятно этот метод можно применить и для круговых осей - изготовить некое подобие энкодера.
Для тестирования рекомендую записать программу в прибор и подключить к входам два датчика PNP или герконы.
Уважаемых программистов попрошу оптимизировать код, если потребуется.
Ожидаю продолжения темы, ведь диагностика упрощает жизнь и заказчику и исполнителю
84666Спасибо!
Рогов Алексей
04.07.2025, 10:17
Понеслась:
84667
Я в комментарии писал, что не обязательно, но применимо к пневмоцилиндру : если магнитное кольцо проскакивает датчик - при неточной настройке - для этого и огород и фильтр тут не помощник. На Ваше усмотрение.
Вариант:
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
Ваш код красивый, и работает только с правильно настроенным датчиком. Мой же не допускает счёт при повторном срабатывании одного и того же датчика. Благодарю за отзыв!
Тогда в чём суть диагностики? Фиксировать повторное срабатывание или не допускать счёт?
Рогов Алексей
04.07.2025, 12:09
Повторное срабатывание в моём случае НЕ допускает счёт. Цель диагностики настроить пневмопривод и при несоответствии времени хода эталону выдать сообщение или аварию. В Вашем случае можно будет зафиксировать проскок датчика, в моём нет, согласен. Только сравнивать надо целые числа, конечно.
Ваш код намного короче, поэтому я и просил упростить задачку в первом сообщении.
Если я настрою фильтрацию дребезга, так что проскок будет не замечен, то счёт будет продолжаться бесконечно.
Правильнее запускать таймер на определенное время и останавливать его когда цель достигнута.
Ну а если таймер всё таки остановился по окончанию времени, а событие не произошло = это и есть авария.
Однако это может быть случайная флуктуация (например, давление в пневмосистеме вдруг снизилось при переходе на другой компрессор),
само событие я фиксирую в электронном журнале, но если датчик сработал позже процесс продолжаю без аварийной остановки.
В зависимости от требуемой цели можно фиксировать таймаут:
84672
Если сделать вот так, то контакты сколько угодно могут дребезжать
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
А, еще, мне кажется, что корректнее было бы считать время между подачей сигнала и срабатыванием датчика, а не между срабатываниями обоих датчиков
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot