Моделирование работы встроенной системы контроля

Автор
avatar-poldipoldi
Соавторы
avatar-andrewraysandrewrays
Notebook

Моделирование работы встроенной системы контроля

Введение

Встроенная система контроля необходима для проверки входного сигнала на соответствие заданному критерию и формирования отказа в случае, если этот сигнал перестаёт ему соответствовать.

Подобные системы часто используются в работе сложных технических систем, где очень важна надёжность и отказобезопасность. Например, в автомобильной и авиакосмической отраслях.

Обзор модели

Структура модели и её основные особенности

Ниже показана полная модель системы, в которой моделируется работа встроенной системы контроля при трёх различных вариантах отказов:

  1. Постоянное смещение;
  2. Линейно нарастающий по времени увод сигнала;
  3. Шум высокой интенсивности.

vstroennyikontrol.png

В качестве входного сигнала используется синусода, которая может представлять собой, например, аналоговый сигнал какого-либо датчика. При необходимости входной сигнал может быть заменён на другой интересующий сигнал.

Далее в заданный момент времени формируется отказ. Момент времени для каждого отказа задаётся индивидуально:

  1. Для постоянного смещения в блоке Offset задаётся параметр Step Time;
  2. Для линейно нарастающего увода в блоке Linear Drift задаётся параметр Start Time;
  3. Для шума высокой интенсивности в блоке Switch задаётся параметр Threshold.

По умолчанию время, когда происходит отказ, равно 2.5 секундам.

В демонстрируемой модели встроенная система контроля представляет собой блок порогового контроля Threshold Monitoring и блок определения статуса отказа Failure Attribute Formation. Так как результатом работы блока порогового контроля является валидность проверяемого сигнала, а блок определения статуса отказа принимает на свой вход признак наличия ошибки, то для согласования их работы применяется блок логической инверсии NOT.

Пороговый контроль

Критерием валидности в рассмотренной выше модели является принадлежность входного сигнала заданному интервалу Thresholds (или полуинтервалу/отрезку, если заданы соответствующие настройки блока).

В случае, если заданный входной сигнал находится внутри установленных границ, то пороговый контроль выдаёт сигнал валидности validity = 1, в противном случае - validity = 0.

Блок определения статуса отказа

Блок определения статуса отказа служит для исключения ложной фиксации статуса, которая может быть вызвана шумами, ложными срабатываниями, выбросами данных и т.д.

У данного блока есть несколько вариантов подтверждения статуса отказа Failure attribution variant, которые отличаются способом восстановления статуса после снятия отказа:

  1. Instant recovery - мгновенное восстановление;
  2. Recovery confirmation - восстановление после заданного времени Recovery confirmation time, за которое не будет зафиксировано новых случаев отказа;
  3. Permanent lock - статус отказа "замораживается" без возможности восстановления.

При этом для подтверждения каждого варианта отказа требуется время подтверждения Failure confirmation time, за которое этот отказ будет устойчиво сохраняться.

Моделирование в Engee

Для моделирования в Engee необходимо загрузить и запустить модель.

In [ ]:
# Загрузка модели, если она еще не открыта на холсте
if "built-in_control"  getfield.(engee.get_all_models(), :name)
    engee.load( "$(@__DIR__)/built-in_control.engee");
end

# Запуск модели
model_data = engee.run( "built-in_control" );

Постоянное смещение

In [ ]:
# Данные: "Постоянное смещение"
time1 = model_data["analog signal 1"].time;
analog_signal1 = model_data["analog signal 1"].value;
digital_signal1 = model_data["digital signal 1"].value;
status1_instant_rec = model_data["status 1 (instant recovery)"].value;
status1_recovery_conf = model_data["status 1 (recovery confirmation)"].value;
status1_permanent_lock = model_data["status 1 (permanent lock)"].value;

thresholds1 = engee.get_param("built-in_control/Thresholds1", "Value");
In [ ]:
# График: "Постоянное смещение. Мгновенное восстановление статуса отказа"
plot(time1, [analog_signal1, digital_signal1, status1_instant_rec],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"], lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Постоянное смещение. Мгновенное восстановление статуса отказа")
hline!([thresholds1], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:
In [ ]:
# График: "Постоянное смещение. Восстановление отказа с подтверждением"
plot(time1, [analog_signal1, digital_signal1, status1_recovery_conf],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"],  lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Постоянное смещение. Восстановление отказа с подтверждением")
hline!([thresholds1], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:
In [ ]:
# График: "Постоянное смещение. Без восстановления отказа"
plot(time1, [analog_signal1, digital_signal1, status1_permanent_lock],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"],  lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Постоянное смещение. Без восстановления отказа")
hline!([thresholds1], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:

Линейно нарастающий по времени увод сигнала

In [ ]:
# Данные: "Линейно нарастающий увод сигнала датчика"
time2 = model_data["analog signal 2"].time;
analog_signal2 = model_data["analog signal 2"].value;
digital_signal2 = model_data["digital signal 2"].value;
status2_instant_rec = model_data["status 2 (instant recovery)"].value;
status2_recovery_conf = model_data["status 2 (recovery confirmation)"].value;
status2_permanent_lock = model_data["status 2 (permanent lock)"].value;

thresholds2 = engee.get_param("built-in_control/Thresholds2", "Value");
In [ ]:
# График: "Линейно нарастающий увод сигнала. Мгновенное восстановление статуса отказа"
plot(time2, [analog_signal2, digital_signal2, status2_instant_rec],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"], lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Линейно нарастающий увод сигнала. Мгновенное восстановление статуса отказа")
hline!([thresholds2], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:
In [ ]:
# График: "Линейно нарастающий увод сигнала. Восстановление отказа с подтверждением"
plot(time2, [analog_signal2, digital_signal2, status2_recovery_conf],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"],  lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Линейно нарастающий увод сигнала. Восстановление отказа с подтверждением")
hline!([thresholds2], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:
In [ ]:
# График: "Линейно нарастающий увод сигнала. Без восстановления отказа"
plot(time2, [analog_signal2, digital_signal2, status2_permanent_lock],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"],  lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Линейно нарастающий увод сигнала. Без восстановления отказа")
hline!([thresholds2], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:

Шум высокой интенсивности

In [ ]:
# Данные: "Шум высокой интенсивности"
time3 = model_data["analog signal 3"].time;
analog_signal3 = model_data["analog signal 3"].value;
digital_signal3 = model_data["digital signal 3"].value;
status3_instant_rec = model_data["status 3 (instant recovery)"].value;
status3_recovery_conf = model_data["status 3 (recovery confirmation)"].value;
status3_permanent_lock = model_data["status 3 (permanent lock)"].value;

thresholds3 = engee.get_param("built-in_control/Thresholds3", "Value");
In [ ]:
# График: "Шум высокой интенсивности. Мгновенное восстановление статуса отказа"
plot(time3, [analog_signal3, digital_signal3, status3_instant_rec],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"], lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Шум высокой интенсивности. Мгновенное восстановление статуса отказа")
hline!([thresholds3], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:
In [ ]:
# График: "Шум высокой интенсивности. Восстановление отказа с подтверждением"
plot(time3, [analog_signal3, digital_signal3, status3_recovery_conf],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"],  lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Шум высокой интенсивности. Восстановление отказа с подтверждением")
hline!([thresholds3], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:
In [ ]:
# График: "Шум высокой интенсивности. Без восстановления отказа"
plot(time3, [analog_signal3, digital_signal3, status3_permanent_lock],
label = ["Входной аналоговый сигнал" "Сигнал на входе системы контроля" "Статус отказа"],  lw = 2)
plot!(xlabel = "Время, с", legend=:bottomright, title = "Шум высокой интенсивности. Без восстановления отказа")
hline!([thresholds3], linecolor=8, ls=:dash, lw = 1.5, label= ["Заданные пороги контроля" :none])
Out[0]:

Заключение

В данном примере рассмотрена работа алгоритма порогового контроля при различных вариантах отказа входного сигнала для разных вариантов подтверждения статуса отказа.

Видно, что при заданных параметрах встроенной системы контроля она без проблем фиксирует 1 и 2 варианты отказов, но в 3 случае не срабатывает. Это связано с тем, что система встроенного контроля настроена таким образом, что выступает в роли фильтра, который не позволяет фиксировать многочисленные отказы случайного характера.

Однако, при других настройках всё может быть иначе, попробуйте!