- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Алгоритм определения провала давления
Модератор: Глоб.модераторы
-
- эксперт
- Сообщения: 1151
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 49 раз
- Поблагодарили: 135 раз
Алгоритм определения провала давления
Не могу придумать алгоритм для ПЛК (реализовывать буду на ST), посоветуйте, пожалуйста, варианты.
Требуется определить провал давления и после него выполнить заданные действия.
Для провала давления заданы параметры - длительность (минимальная и максимальная) и минимальная глубина провала. Задача осложняется тем, что установившееся давление не стабильное, может колебаться.
У меня есть 2 варианта решения, которые мне не очень нравятся, хочу послушать ваши предложения.
Требуется определить провал давления и после него выполнить заданные действия.
Для провала давления заданы параметры - длительность (минимальная и максимальная) и минимальная глубина провала. Задача осложняется тем, что установившееся давление не стабильное, может колебаться.
У меня есть 2 варианта решения, которые мне не очень нравятся, хочу послушать ваши предложения.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- почётный участник форума
- Сообщения: 5806
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 680 раз
- Поблагодарили: 856 раз
Алгоритм определения провала давления
Уважаемый U.L.A. лично мне видятся следующие подзадачи:
1) Усреднение на большом интервале для определения установившегося давления;
2) Запись в массив типа FIFO данных по отклонению давления от установившегося. Глубина стека должна превышать максимальную длительность "провала";
3) Обработка данных массива с целью определения параметров "провала";
При таком подходе начало "провала" можно зафиксировать по скорости и величине изменения давления до завершения "провала". В отличие от длительности, разумеется.
Ситуацию с плавным изменением среднего давления можно разрешить выбором допустимой скорости изменения давления (периодом усреднения по п.1). Надо также определиться, как сбрасывать "флаг начала провала", т.е. уменьшение давления какой длительности считать уже не "провалом", а быстрым переходом на другую уставку давления. Тут ещё можно использовать информацию об изменении задания.
Как-то так.
1) Усреднение на большом интервале для определения установившегося давления;
2) Запись в массив типа FIFO данных по отклонению давления от установившегося. Глубина стека должна превышать максимальную длительность "провала";
3) Обработка данных массива с целью определения параметров "провала";
При таком подходе начало "провала" можно зафиксировать по скорости и величине изменения давления до завершения "провала". В отличие от длительности, разумеется.
Ситуацию с плавным изменением среднего давления можно разрешить выбором допустимой скорости изменения давления (периодом усреднения по п.1). Надо также определиться, как сбрасывать "флаг начала провала", т.е. уменьшение давления какой длительности считать уже не "провалом", а быстрым переходом на другую уставку давления. Тут ещё можно использовать информацию об изменении задания.
Как-то так.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- эксперт
- Сообщения: 1151
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 49 раз
- Поблагодарили: 135 раз
Алгоритм определения провала давления
Я примерно так и представлял один из вариантов, только думал, что удобнее хранить не все точки давления, а максимум и минимум за секунду. Иначе очень большой массив получается (скан контроллера чаще 10 раз в секунду)
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- почётный участник форума
- Сообщения: 5806
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 680 раз
- Поблагодарили: 856 раз
Алгоритм определения провала давления
Скан контроллера и нужное Вам разрешение во времени (точность) - разные вещи.
Пишите в массив реже, каждый пятый или каждый десятый скан, а ещё лучше по RTC, только и всего.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- администратор
- Сообщения: 4925
- Зарегистрирован: 25 июл 2008, 07:12
- Имя: Диев Александр Васильевич
- Страна: Россия
- город/регион: г. Сегежа, Карелия
- Благодарил (а): 245 раз
- Поблагодарили: 426 раз
Алгоритм определения провала давления
А если взять первую производную? Она покажет наклон линии, по значению которой можно отловить резкое падение и возврат. Перед этим, возможно, понадобится некоторое сглаживание, чтобы влияние шумов снизить.
Повторное использование кода не отменяет повторного использования мозга при его повторном использовании.
-
- эксперт
- Сообщения: 1172
- Зарегистрирован: 14 ноя 2013, 20:35
- Имя: Анатолий Сергеевич
- Страна: Россия
- город/регион: Башкортостан
- Благодарил (а): 13 раз
- Поблагодарили: 68 раз
Алгоритм определения провала давления
Если уставка по давлению не менялась и отсутствовало изменение управляющего воздействия на отсечной механизм необходимо выполнить следующее:
Если текущее значение вышло из разрешенного коридорора значений (с учетом погрешности модуля и первичного преобразователя) начинать запись в массив размер которого выставляется требуемой длительностью провала(например 10 за секунду).
Далее сравниваются поочередно значения элементов массива - если меньше то падение, больше то скачек.
Тем самым выявится два события: начало падения и начало скачка.
Массив можно циклически перезаписывать на случай выхода значения за пределы на длительность больше разрешенной.
Мне так это видится.
Если текущее значение вышло из разрешенного коридорора значений (с учетом погрешности модуля и первичного преобразователя) начинать запись в массив размер которого выставляется требуемой длительностью провала(например 10 за секунду).
Далее сравниваются поочередно значения элементов массива - если меньше то падение, больше то скачек.
Тем самым выявится два события: начало падения и начало скачка.
Массив можно циклически перезаписывать на случай выхода значения за пределы на длительность больше разрешенной.
Мне так это видится.
-
- администратор
- Сообщения: 18827
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 989 раз
- Поблагодарили: 1872 раза
Алгоритм определения провала давления
Тоже об этом подумал.
Отправлено спустя 44 минуты 34 секунды:
У электриков такая защита есть: df/dt (первая производная частоты по времени). Позволяет быстро отследить нештатный провал частоты и не ждать пока частота завалится до критического порога: если частота повалилась быстро, то достигнув критического порога уже поздно будет реагировать.
Отправлено спустя 9 минут 9 секунд:
По скорости изменения давления, наверное, как раз и можно отделить обычные колебания от провала когда что-то пошло не так.
Давление ЧЕГО кстати?
По вопросам работы Форума можно обратиться по этим контактам.
-
- почётный участник форума
- Сообщения: 3974
- Зарегистрирован: 20 янв 2010, 22:23
- Имя: Никита
- Страна: РФ
- город/регион: Мурманск
- Благодарил (а): 21 раз
- Поблагодарили: 230 раз
Алгоритм определения провала давления
Это основная проблема. Хотя как раз тут опрос много раз в секунду может помочь. Все зависит от соотношения длительности провала, времени реагирования и шага квантования. Ну и относительной величины провала и шумов.
1. Тупо вычислять производную, как наклон тренда. Для вычисления пользоваться скользящим средним по десятку-двум предыдущих значений. Хорошо, когда на начальном участке четко заметно падение и на реагирование допустимо потратить несколько отсчетов. И при этом сам тренд достаточно горизонтален, т.е. параметр имеет фиксированное значение (плюс-минус шумы)
2. Отслеживать скользящее точно так же, но провал определять по увеличению отклонения каждого нового отсчета (или выход за среднеквадратичное отклонение, плюс-минус настроечный коэффициент) границы- реагировать будет быстрее, но вероятность ложных срабатываний выше. Справедливо опять же, для горизонтального параметра.
3. С головой залезть в статистику, записать или поднять из архивов тренды провалов, подобрать подходящую функцию и на каком-то временном интервале выполнять регресионный анализ, нужный кусок выделять на основании роста коэффициента корреляции. То же, что и в предыдущем пункте, только наоборот, и привязка не к горизонтали, а к самому провалу. Мороки много.
4. Тупо задать зону нечувствительности, дабы отсечь шумы и провал отлавливать по выходу за границы зоны.
Много еще чего можно придумать, но без примера с данными рассуждать можно до бесконечности.
Опыт - это когда на смену вопросам: "Что? Где? Когда? Как? Почему?" приходит единственный вопрос: "Нахрена? "
-
- здесь недавно
- Сообщения: 19
- Зарегистрирован: 19 янв 2017, 13:55
- Имя: Сидельников Анатолий
- Страна: РФ
- город/регион: Ижевск
- Поблагодарили: 2 раза
Алгоритм определения провала давления
Здравствуйте! Из опыта самый хороший и рабочий вариант:
Медианный фильтр далее реальное дифференцирование 3, 5, 7 точек, далее фильтр Бесселя (меньше колебательности при скачке) и все вы получаете скорость изменения параметра, оценивайте ее.
Медианный фильтр далее реальное дифференцирование 3, 5, 7 точек, далее фильтр Бесселя (меньше колебательности при скачке) и все вы получаете скорость изменения параметра, оценивайте ее.
-
- эксперт
- Сообщения: 1151
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 49 раз
- Поблагодарили: 135 раз
Алгоритм определения провала давления
Всем спасибо за обсуждение!
Давление нефти. Длительность провала 1..35 секунд, глубина провала не менее 4 бар. Давление 20..50 бар.
Был на этой неделе в командировке, алгоритм реализовал. Проверить удалось только при помощи калибратора, алгоритм работает. Испытать на реальном процессе не дали.
Реализовал при помощи сохранения минимальной и максимальной точки за каждую секунду, и последующего анализа за необходимый интервал времени. Реальный скан контроллера 8-11 мс, поэтому хранить и обрабатывать каждую точку очень ресурсоемко. Если интересно, могу выложить код, он не очень большой.
Давление нефти. Длительность провала 1..35 секунд, глубина провала не менее 4 бар. Давление 20..50 бар.
Был на этой неделе в командировке, алгоритм реализовал. Проверить удалось только при помощи калибратора, алгоритм работает. Испытать на реальном процессе не дали.
Реализовал при помощи сохранения минимальной и максимальной точки за каждую секунду, и последующего анализа за необходимый интервал времени. Реальный скан контроллера 8-11 мс, поэтому хранить и обрабатывать каждую точку очень ресурсоемко. Если интересно, могу выложить код, он не очень большой.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- осмотрелся
- Сообщения: 144
- Зарегистрирован: 20 янв 2015, 10:13
- Имя: Алексей
- Страна: Россия
- Поблагодарили: 10 раз
Алгоритм определения провала давления
Интересно.
Потому что в заданных условиях красивого решения нет.
Потому что в заданных условиях красивого решения нет.
-
- эксперт
- Сообщения: 3648
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 8 раз
- Поблагодарили: 286 раз
Алгоритм определения провала давления
Есть одно красивое решение. Провалом следует считать такое давление, когда почти нарушился или нарушился технологический процесс. Нужно разработать модель технологического процесса, выработать критерий нарушения техпроцесса.
Например, давление используется для зажима детали. Модель должна учесть процесс ослабления зажима при падении давления и процесс выпадения детали из зажима (ну то есть когда уже наступил пипец, нарушение). Ну вообщем, если в модель подать реальное давление, она скажет, когда произошел недопустимый провал. Надеюсь в вашем конкретном случае модель несложная и давление используется не в нескольких техпроцессах.......
Например, давление используется для зажима детали. Модель должна учесть процесс ослабления зажима при падении давления и процесс выпадения детали из зажима (ну то есть когда уже наступил пипец, нарушение). Ну вообщем, если в модель подать реальное давление, она скажет, когда произошел недопустимый провал. Надеюсь в вашем конкретном случае модель несложная и давление используется не в нескольких техпроцессах.......
-
- эксперт
- Сообщения: 1151
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 49 раз
- Поблагодарили: 135 раз
Алгоритм определения провала давления
Модель очень сложная, так как представляет собой трубопровод длиной несколько сотен км по сложному рельефу, с несколькими насосными станциями.
Код такой (Unity v.4.0):
Код такой (Unity v.4.0):
Код: Выделить всё
(** Новая секунда **)
(* %SW50: Seconds (16#SS00),
%SW51: Hours and Minutes (16#HHMM), *)
bVDnewSec := false;
IF %SW50 <> iVD_SW50_old OR %SW51 <> iVD_SW51_old THEN
(* Новая секунда *)
bVDnewSec := true;
iVD_SW50_old := %SW50;
iVD_SW51_old := %SW51;
END_IF;
(** По давлению на выходе **)
IF bVDnewSec THEN
ROL_ARREAL(1, arVD_maxDavl);
ROL_ARREAL(1, arVD_minDavl);
arVD_maxDavl[1] := 0.0;
arVD_minDavl[1] := 1000.0;
IF NOT bVD_Algoritm_Davl AND NOT bVD_Algoritm_Chast THEN
(* Алгоритм не запущен *)
IF arVD_maxDavl[2]-arVD_minDavl[2] <= rVDustavki[9] THEN
(* На предыдущей секунде разброс давления меньше, чем "Максимальный разброс давления, при котором давление считается установившимся" *)
rTemp := (arVD_maxDavl[2]+arVD_minDavl[2])/2.0;
rVDkoridor_max := rTemp + rVDustavki[9]/2.0;
rVDkoridor_min := rTemp - rVDustavki[9]/2.0;
iVDnSecUstanDavl := 0;
iVDlenArr:= LENGTH_ARREAL(arVD_maxDavl);
FOR j := 4 TO iVDlenArr - 2 DO
IF arVD_maxDavl[j] <= rVDkoridor_max AND arVD_minDavl[j] >= rVDkoridor_min AND
arVD_maxDavl[j+1] <= rVDkoridor_max AND arVD_minDavl[j+1] >= rVDkoridor_min AND
arVD_maxDavl[j+2] <= rVDkoridor_max AND arVD_minDavl[j+2] >= rVDkoridor_min THEN
(* Давление на данной секунде и предыдущие 2 секунды было в коридоре, соответствующем 2й секунде *)
iVDnSecUstanDavl := j;
EXIT;
END_IF;
END_FOR;
IF iVDnSecUstanDavl > 0 THEN
(* Было установившееся давление, соответствующее текущему *)
iVDnMinProval := REAL_TO_INT(rVDustavki[7]); (* Минимальное время, за которое происходит восстановление давления на выходе *)
iVDnMaxProval := REAL_TO_INT(rVDustavki[8]); (* Максимальное время, за которое происходит восстановление давления на выходе *)
IF iVDnSecUstanDavl -3 >= iVDnMinProval AND iVDnSecUstanDavl -3 <= iVDnMaxProval THEN
(* Провал был в заданном диапазоне времени *)
bVDflag1 := true;
bVDflag2 := false;
FOR j := 3 TO iVDnSecUstanDavl - 1 DO
bVDflag1 := bVDflag1 AND arVD_maxDavl[j] <= rVDkoridor_max; (* Давление было ниже коридора *)
bVDflag2 := bVDflag2 OR (rVDkoridor_max - arVD_minDavl[j] >= rVDustavki[6]); (* Зафиксирован провал необходимой глубины *)
END_FOR;
IF bVDflag1 AND bVDflag2 THEN
(* Все условия соблюдены *)
bVD_Algoritm_Davl := true;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
(* Максимальное давление на данной секунде *)
IF Pout_LPF > arVD_maxDavl[1] THEN
arVD_maxDavl[1] := Pout_LPF;
END_IF;
(* Минимальное давление на данной секунде *)
IF Pout_LPF < arVD_minDavl[1] THEN
arVD_minDavl[1] := Pout_LPF;
END_IF;
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.