Сообщество Engee

Дерево отказов/неисправностей

Автор
avatar-daniil02daniil02
Notebook

Диагностика автономного подводного планерного робота с помощью дерева отказов / неисправностей

Данный пример посвящен анализу дерева отказов / неисправностей (FTA - Fault Tree Analysis), это такой метод идентефикации и анализа факторов, которые могут способствовать возникновению исследуемого нежелательного события.

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

Автономный планерный робот (Autonomous Underwater Glider - AUG)

Для построения дерева неисправностей мы использовали данные 58 запусков роботов, которые собирались в течение 2 лет.

При анализе надежности системы мы выявили 10 типов неисправностей. В работе рассматривается их комплексный вклад в надежность робота.

К ним относятся:

  • Неисправности в энергосистеме
  • Неисправности системы обнаружения утечек
  • Неисправности системы погружения
  • Неисправности системы обнаружения окружающей среды
  • Неисправности системы предотвращения столкновений
  • Сбои в компьютерной системе
  • Неисправности двигательной установки
  • Неисправность системы связи
  • Неопознанные неисправности

Построение дерева неисправностей

Дерево строится в пять этапов следующим образом:

  1. Определяется вершина события. Ей может быть само нежелательное событие или последствия его возникновения. В этой статье рассматриваются неисправности
    только трех уровней: компонентов (датчиков), подсистем и системы.

  2. Определяется вклад неисправностей каждой компоненты в неисправности верхнего уровня, а затем используется соответствующие элементы управления AND (1) и OR (2), для построения дерева неисправностей подсистемы или основной системы.

image.png

image.png

  1. Следует рассматривать дерево неисправностей каждой подсистемы, как модуль основного дерева неисправностей. В этом примере мы используем десять модулей, девять подсистем и одно поддерево неизвестных неисправностей.

  2. Нахождение вероятности отказа каждого компонента.

  3. Построение основного дерева неисправностей и оценка
    надежности системы с помощью построения графиков.

image_4.png

На скриншоте - дерево отказов / неисправностей, которое мы рассматриваем

Компонента

Для каждой компоненты есть свое значение параметра Lambda.

Рассмотрим на примере компоненты Battery Detection. Значение параметра равно 7.5*10^-6:

image.png

Уравнение ошибки компоненты описано следующей моделью:

image.png

Мы рассмотрели компоненту Battery Detection, остальные компоненты данного дерева отказов выглядят аналогично.

Подсистема

Далее, высчитанная для компоненты в конкретный момент времени вероятность, вместе с другими сигналами подсистемы (в данном случае подсистема POWER и ее компоненты: Battery Detection, Battery, Voltage Detection, Current Monitoring) формируют вероятность подсистемы.

image.png

В блоке Engee Function реализован расчет вероятности нежелательного события подсистемы, где u1, u2, u3, u4 - вероятности событий компонентов подсистемы в определенный момент времени:

struct Block <: AbstractCausalComponent end

    function (c::Block)(t::Real,u1,u2,u3,u4)
      y=1-((1-(u1)).*(1-(u2)).*(1-(u3)).*(1-(u4)));
    return(y)
end

После этого производится рассчет надежности каждой подсистемы:

image.png

Мы рассмотрели подсистему POWER, другие подсистемы данного дерева отказов выглядят аналогично.

Система и график ее надежности

После расчетов вероятностей нежелательных событий подсистем, мы вычисляем вероятность нежелательного события системы в целом, а после - ее надежность по аналогии.

Для построения графика надежности системы переходим в каталог с текущим скриптом:

In [ ]:
cd( @__DIR__ ) # Переместимся в каталог, где лежит текущий скрипт
homePath = string(@__DIR__)
Out[0]:
"/user/FTA/FTA_Robot_Glider"

Задаем функцию загрузки и запуска модели:

In [ ]:
function start_model_engee()
    try
        engee.close("FTA_Robot_Glider", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/FTA_Robot_Glider.engee") # загрузка модели
        end;
    try
         engee.run(m, verbose=true) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/FTA_Robot_Glider.engee") # загрузка модели
         engee.run(m, verbose=true) # запуск модели
        end
    end
Out[0]:
start_model_engee (generic function with 1 method)

Запустим модель:

In [ ]:
try
    start_model_engee() # загрузка и запуск модели
    catch err
end;
Building...
Progress 0%
Progress 100%
Progress 100%

Считаем полученные данные:

In [ ]:
data = collect(simout);
Total_Reliability = collect(data[2]);
Signals_Reliability = collect(data[1]);

И наконец, построим графики зависимости надежности системы и подсистем от времени:

In [ ]:
plot(size=(650,450), legend=:topleft, legendfontsize=6)
plot!(Total_Reliability.time[:],Total_Reliability.value[:], label="Robot Glider")
plot!(title = "Надежность робота", ylabel = "Reliability", xlabel="Time, hr")
plot!(Signals_Reliability.time[:],[row[1] for row in Signals_Reliability.value], label="Power")
plot!(Signals_Reliability.time[:],[row[2] for row in Signals_Reliability.value], label="Leak")
plot!(Signals_Reliability.time[:],[row[3] for row in Signals_Reliability.value], label="Diving")
plot!(Signals_Reliability.time[:],[row[4] for row in Signals_Reliability.value], label="Environment detection")
plot!(Signals_Reliability.time[:],[row[5] for row in Signals_Reliability.value], label="Collision")
plot!(Signals_Reliability.time[:],[row[6] for row in Signals_Reliability.value], label="Computer")
plot!(Signals_Reliability.time[:],[row[7] for row in Signals_Reliability.value], label="Propultion")
plot!(Signals_Reliability.time[:],[row[8] for row in Signals_Reliability.value], label="Communication")
plot!(Signals_Reliability.time[:],[row[9] for row in Signals_Reliability.value], label="Navigation")
plot!(Signals_Reliability.time[:],[row[10] for row in Signals_Reliability.value],label="Unknown")
Out[0]:

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

Заключение

Мы рассмотрели принцип построения дерева неисправностей на примере автономного подводного робота в среде Engee.

Дерево отказов / неисправностей как метод поиска корня проблем в системе, позволяет не только выявить проблему, но и
поспособствовать разработке решения этой проблемы за счет демонстрации уязвимых мест.