Дерево отказов/неисправностей
Диагностика автономного подводного планерного робота с помощью дерева отказов / неисправностей
Данный пример посвящен анализу дерева отказов / неисправностей (FTA - Fault Tree Analysis), это такой метод идентефикации и анализа факторов, которые могут способствовать возникновению исследуемого нежелательного события.
Ниже мы приводим краткий обзор по оценке неисправностей в автономных подводных роботах, строим дерево неисправностей робота и анализируем результаты надежности системы.
Автономный планерный робот (Autonomous Underwater Glider - AUG)
Для построения дерева неисправностей мы использовали данные 58 запусков роботов, которые собирались в течение 2 лет.
При анализе надежности системы мы выявили 10 типов неисправностей. В работе рассматривается их комплексный вклад в надежность робота.
К ним относятся:
- Неисправности в энергосистеме
- Неисправности системы обнаружения утечек
- Неисправности системы погружения
- Неисправности системы обнаружения окружающей среды
- Неисправности системы предотвращения столкновений
- Сбои в компьютерной системе
- Неисправности двигательной установки
- Неисправность системы связи
- Неопознанные неисправности
Построение дерева неисправностей
Дерево строится в пять этапов следующим образом:
-
Определяется вершина события. Ей может быть само нежелательное событие или последствия его возникновения. В этой статье рассматриваются неисправности
только трех уровней: компонентов (датчиков), подсистем и системы. -
Определяется вклад неисправностей каждой компоненты в неисправности верхнего уровня, а затем используется соответствующие элементы управления AND (1) и OR (2), для построения дерева неисправностей подсистемы или основной системы.


-
Следует рассматривать дерево неисправностей каждой подсистемы, как модуль основного дерева неисправностей. В этом примере мы используем десять модулей, девять подсистем и одно поддерево неизвестных неисправностей.
-
Нахождение вероятности отказа каждого компонента.
-
Построение основного дерева неисправностей и оценка
надежности системы с помощью построения графиков.

На скриншоте - дерево отказов / неисправностей, которое мы рассматриваем
Компонента
Для каждой компоненты есть свое значение параметра Lambda.
Рассмотрим на примере компоненты Battery Detection. Значение параметра равно 7.5*10^-6:

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

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

В блоке 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
После этого производится рассчет надежности каждой подсистемы:

Мы рассмотрели подсистему POWER, другие подсистемы данного дерева отказов выглядят аналогично.
Система и график ее надежности
После расчетов вероятностей нежелательных событий подсистем, мы вычисляем вероятность нежелательного события системы в целом, а после - ее надежность по аналогии.
Для построения графика надежности системы переходим в каталог с текущим скриптом:
cd( @__DIR__ ) # Переместимся в каталог, где лежит текущий скрипт
homePath = string(@__DIR__)
Задаем функцию загрузки и запуска модели:
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
Запустим модель:
try
start_model_engee() # загрузка и запуск модели
catch err
end;
Считаем полученные данные:
data = collect(simout);
Total_Reliability = collect(data[2]);
Signals_Reliability = collect(data[1]);
И наконец, построим графики зависимости надежности системы и подсистем от времени:
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")
С помощью полученных данных, можно судить о величине вклада каждой подсистемы в надежность системы, а после использовать выводы для доработки подсистем робота, несущих наибольший вклад в отказ системы.
Как видно из полученного графика, самый большой вклад в отказ системы вносит подсистема Power.
Заключение
Мы рассмотрели принцип построения дерева неисправностей на примере автономного подводного робота в среде Engee.
Дерево отказов / неисправностей как метод поиска корня проблем в системе, позволяет не только выявить проблему, но и
поспособствовать разработке решения этой проблемы за счет демонстрации уязвимых мест.