1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Алгоритм определения провала давления

Обсуждение вопросов, не относящихся ни к одному из других подразделов

Модератор: kirillio

Ответить

Автор темы
leon78
эксперт
эксперт
Сообщения: 1024
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 27 раз
Поблагодарили: 104 раза

Алгоритм определения провала давления

Сообщение leon78 »

Не могу придумать алгоритм для ПЛК (реализовывать буду на ST), посоветуйте, пожалуйста, варианты.
Требуется определить провал давления и после него выполнить заданные действия.
Для провала давления заданы параметры - длительность (минимальная и максимальная) и минимальная глубина провала.
График.png
Задача осложняется тем, что установившееся давление не стабильное, может колебаться.
У меня есть 2 варианта решения, которые мне не очень нравятся, хочу послушать ваши предложения.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5620
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 544 раза
Поблагодарили: 706 раз

Алгоритм определения провала давления

Сообщение Ryzhij »

Уважаемый U.L.A. :ges_hmm: лично мне видятся следующие подзадачи:
1) Усреднение на большом интервале для определения установившегося давления;
2) Запись в массив типа FIFO данных по отклонению давления от установившегося. Глубина стека должна превышать максимальную длительность "провала";
3) Обработка данных массива с целью определения параметров "провала";

При таком подходе начало "провала" можно зафиксировать по скорости и величине изменения давления до завершения "провала". В отличие от длительности, разумеется.
Ситуацию с плавным изменением среднего давления можно разрешить выбором допустимой скорости изменения давления (периодом усреднения по п.1). Надо также определиться, как сбрасывать "флаг начала провала", т.е. уменьшение давления какой длительности считать уже не "провалом", а быстрым переходом на другую уставку давления. Тут ещё можно использовать информацию об изменении задания.

Как-то так.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Автор темы
leon78
эксперт
эксперт
Сообщения: 1024
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 27 раз
Поблагодарили: 104 раза

Алгоритм определения провала давления

Сообщение leon78 »

Я примерно так и представлял один из вариантов, только думал, что удобнее хранить не все точки давления, а максимум и минимум за секунду. Иначе очень большой массив получается (скан контроллера чаще 10 раз в секунду)
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5620
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 544 раза
Поблагодарили: 706 раз

Алгоритм определения провала давления

Сообщение Ryzhij »

leon78 писал(а): Иначе очень большой массив получается (скан контроллера чаще 10 раз в секунду)
Скан контроллера и нужное Вам разрешение во времени (точность) - разные вещи.
Пишите в массив реже, каждый пятый или каждый десятый скан, а ещё лучше по RTC, только и всего.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
Аватара пользователя

VADR
администратор
администратор
Сообщения: 4711
Зарегистрирован: 25 июл 2008, 07:12
Имя: Диев Александр Васильевич
Страна: Россия
город/регион: г. Сегежа, Карелия
Благодарил (а): 192 раза
Поблагодарили: 336 раз

Алгоритм определения провала давления

Сообщение VADR »

А если взять первую производную? Она покажет наклон линии, по значению которой можно отловить резкое падение и возврат. Перед этим, возможно, понадобится некоторое сглаживание, чтобы влияние шумов снизить.
Повторное использование кода не отменяет повторного использования мозга при его повторном использовании.
Аватара пользователя

megavolt86
эксперт
эксперт
Сообщения: 1172
Зарегистрирован: 14 ноя 2013, 20:35
Имя: Анатолий Сергеевич
Страна: Россия
город/регион: Башкортостан
Благодарил (а): 13 раз
Поблагодарили: 65 раз

Алгоритм определения провала давления

Сообщение megavolt86 »

Если уставка по давлению не менялась и отсутствовало изменение управляющего воздействия на отсечной механизм необходимо выполнить следующее:
Если текущее значение вышло из разрешенного коридорора значений (с учетом погрешности модуля и первичного преобразователя) начинать запись в массив размер которого выставляется требуемой длительностью провала(например 10 за секунду).
Далее сравниваются поочередно значения элементов массива - если меньше то падение, больше то скачек.
Тем самым выявится два события: начало падения и начало скачка.
Массив можно циклически перезаписывать на случай выхода значения за пределы на длительность больше разрешенной.
Мне так это видится.
:ext_secret:
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 17472
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 749 раз
Поблагодарили: 1277 раз

Алгоритм определения провала давления

Сообщение Jackson »

VADR писал(а): А если взять первую производную? Она покажет наклон линии, по значению которой можно отловить резкое падение и возврат.
Тоже об этом подумал.

Отправлено спустя 44 минуты 34 секунды:
У электриков такая защита есть: df/dt (первая производная частоты по времени). Позволяет быстро отследить нештатный провал частоты и не ждать пока частота завалится до критического порога: если частота повалилась быстро, то достигнув критического порога уже поздно будет реагировать.

Отправлено спустя 9 минут 9 секунд:
leon78 писал(а): адача осложняется тем, что установившееся давление не стабильное, может колебаться.
По скорости изменения давления, наверное, как раз и можно отделить обычные колебания от провала когда что-то пошло не так.

Давление ЧЕГО кстати?
По вопросам работы Форума можно обратиться по этим контактам.
Аватара пользователя

Никита
почётный участник форума
почётный участник форума
Сообщения: 3899
Зарегистрирован: 20 янв 2010, 22:23
Имя: Никита
Страна: РФ
город/регион: Мурманск
Благодарил (а): 18 раз
Поблагодарили: 187 раз

Алгоритм определения провала давления

Сообщение Никита »

VADR писал(а): Перед этим, возможно, понадобится некоторое сглаживание, чтобы влияние шумов снизить
Это основная проблема. Хотя как раз тут опрос много раз в секунду может помочь. Все зависит от соотношения длительности провала, времени реагирования и шага квантования. Ну и относительной величины провала и шумов.
1. Тупо вычислять производную, как наклон тренда. Для вычисления пользоваться скользящим средним по десятку-двум предыдущих значений. Хорошо, когда на начальном участке четко заметно падение и на реагирование допустимо потратить несколько отсчетов. И при этом сам тренд достаточно горизонтален, т.е. параметр имеет фиксированное значение (плюс-минус шумы)
2. Отслеживать скользящее точно так же, но провал определять по увеличению отклонения каждого нового отсчета (или выход за среднеквадратичное отклонение, плюс-минус настроечный коэффициент) границы- реагировать будет быстрее, но вероятность ложных срабатываний выше. Справедливо опять же, для горизонтального параметра.
3. С головой залезть в статистику, записать или поднять из архивов тренды провалов, подобрать подходящую функцию и на каком-то временном интервале выполнять регресионный анализ, нужный кусок выделять на основании роста коэффициента корреляции. То же, что и в предыдущем пункте, только наоборот, и привязка не к горизонтали, а к самому провалу. Мороки много.
4. Тупо задать зону нечувствительности, дабы отсечь шумы и провал отлавливать по выходу за границы зоны.

Много еще чего можно придумать, но без примера с данными рассуждать можно до бесконечности.
Опыт - это когда на смену вопросам: "Что? Где? Когда? Как? Почему?" приходит единственный вопрос: "Нахрена? "

Gucev
здесь недавно
здесь недавно
Сообщения: 19
Зарегистрирован: 19 янв 2017, 13:55
Имя: Сидельников Анатолий
Страна: РФ
город/регион: Ижевск
Поблагодарили: 2 раза

Алгоритм определения провала давления

Сообщение Gucev »

Здравствуйте! Из опыта самый хороший и рабочий вариант:
Медианный фильтр далее реальное дифференцирование 3, 5, 7 точек, далее фильтр Бесселя (меньше колебательности при скачке) и все вы получаете скорость изменения параметра, оценивайте ее.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1024
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 27 раз
Поблагодарили: 104 раза

Алгоритм определения провала давления

Сообщение leon78 »

Всем спасибо за обсуждение!
Давление нефти. Длительность провала 1..35 секунд, глубина провала не менее 4 бар. Давление 20..50 бар.
Был на этой неделе в командировке, алгоритм реализовал. Проверить удалось только при помощи калибратора, алгоритм работает. Испытать на реальном процессе не дали.
Реализовал при помощи сохранения минимальной и максимальной точки за каждую секунду, и последующего анализа за необходимый интервал времени. Реальный скан контроллера 8-11 мс, поэтому хранить и обрабатывать каждую точку очень ресурсоемко. Если интересно, могу выложить код, он не очень большой.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Alex question
осмотрелся
осмотрелся
Сообщения: 144
Зарегистрирован: 20 янв 2015, 10:13
Имя: Алексей
Страна: Россия
Поблагодарили: 10 раз

Алгоритм определения провала давления

Сообщение Alex question »

Интересно.
Потому что в заданных условиях красивого решения нет.

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3559
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

Алгоритм определения провала давления

Сообщение Михайло »

Есть одно красивое решение. Провалом следует считать такое давление, когда почти нарушился или нарушился технологический процесс. Нужно разработать модель технологического процесса, выработать критерий нарушения техпроцесса.
Например, давление используется для зажима детали. Модель должна учесть процесс ослабления зажима при падении давления и процесс выпадения детали из зажима (ну то есть когда уже наступил пипец, нарушение). Ну вообщем, если в модель подать реальное давление, она скажет, когда произошел недопустимый провал. Надеюсь в вашем конкретном случае модель несложная и давление используется не в нескольких техпроцессах.......

Автор темы
leon78
эксперт
эксперт
Сообщения: 1024
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 27 раз
Поблагодарили: 104 раза

Алгоритм определения провала давления

Сообщение leon78 »

Модель очень сложная, так как представляет собой трубопровод длиной несколько сотен км по сложному рельефу, с несколькими насосными станциями.
Код такой (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;
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
Ответить

Вернуться в «Общие вопросы»