Найдите самый короткий путь к управлению в модели Simulink

Описание модели

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

Чтобы открыть модель, введите эту команду в папку в качестве примера.

open_system('sldemo_hevc')

В этой модели гибридное электрическое транспортное средство управляет на наклоне, и начальная скорость составляет 0 м/с. Установите целевую скорость на 30 м/с В Driver, управление ПИДом сравнивает фактическую скорость с целевой скоростью и отправляет команду, чтобы увеличить или уменьшить скорость к модулю оценки потребления энергии. Power demand estimation преобразует в желаемую степень, и степень, в основном, обеспечивается электрическим двигателем. Если электрический двигатель не может обеспечить достаточно крутящего момента, то механизм и обеспечивает дополнительный крутящий момент. В Vehicle Dynamic, дорожное сопротивление включая сопротивление сопротивления качению и силы тяжести, а также аэро перетаскивание вычисляется. Фактическая скорость транспортного средства постоянно возвращается в Driver через обратную связь, пока транспортное средство не достигает целевой скорости.

Проследите Все Источники, которые Контролируют Фактическую Скорость

Используйте API трассировки сигнала, чтобы найти самый короткий путь к управлению к фактической скорости. Поскольку фактический сигнал скорости входит во второй импорт Scope, используйте Scope как источник трассировки.

g = sltrace('sldemo_hevc/Scope', 'source', 'port', '2', 'traceall', 'on');
highlight(g);

Получите график трассировки

Результаты трассировки могут быть описаны как digraph MATLAB. График трассировки включает ребра и узлы.

Узел в графике трассировки соответствует порту блока в модели Simulink®. Второй порт Scope узел. Можно найти таблицу узлов информации об узле.

nodes = g.TraceGraph.Nodes;

Ребра показываются парой индексов узла в графике трассировки. Можно получить доступ к информации об узле из таблицы узлов с соответствующим индексом узла. Линия Simulink® между узлами показывается указателем (указателями) сегмента.

edges = g.TraceGraph.Edges;

Вычислите ребра графика трассировки sltrace.Graph возразите и используйте встроенные в MATLAB® функции диграфа, чтобы построить график трассировки, как показано на рисунке.

fig = g.TraceGraph.plot('Layout', 'force');

Найдите Кратчайший путь из графика трассировки

Узел запуска является выходным портом target speed [m/s], и конечный узел является вторым импортом Scope. Используйте таблицу узлов, чтобы получить индексы узла узла запуска и конечного узла и вычислить кратчайший путь между ними, как показано на рисунке.

startNode = 7;
endNode = 2;
shortestPath = g.TraceGraph.shortestpath(startNode, endNode);
highlight(fig, shortestPath, 'EdgeColor','r','NodeColor','r','MarkerSize',6,'LineWidth',1);

Найдите самый короткий путь к управлению из модели Simulink

Таблица ребер содержит два типа ребер: действительные ребра и виртуальные ребра, включая внутренние ребра и скрытые ребра. Во-первых, отфильтруйте виртуальные ребра с помощью find MATLAB функция.

realEdgeIdx = find(cellfun(@(x) ~ischar(x), edges.Segments) == 1);
realEdges = edges(realEdgeIdx, :);

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

elements = [];
for i = 1:length(shortestPath) - 1
    srcNodeIdx = shortestPath(i);
    dstNodeIdx = shortestPath(i+1);
    srcBlockHandle = nodes.Block(srcNodeIdx);
    srcNodeEdgeIdx = find(realEdges.EndNodes(:,2) == dstNodeIdx);
    if length(srcNodeEdgeIdx) > 1
       dstNodeEdgeIdx = find(realEdges.EndNodes(srcNodeEdgeIdx, 2) == dstNodeIdx) ;
       edgeIdx = srcNodeEdgeIdx(dstNodeEdgeIdx);
    elseif length(srcNodeEdgeIdx) == 1
        edgeIdx = srcNodeEdgeIdx;
    else
        continue;
    end
    elements = [elements srcBlockHandle flip(realEdges.Segments{edgeIdx})];
end

Обработайте последний узел в кратчайшем пути и подсветите кратчайший путь в модели Simulink, как показано на рисунке.

lastNodeIdx = shortestPath(end);
lastBlockHandle = nodes.Block(lastNodeIdx);
elements = [elements lastBlockHandle];
highlight(g, elements)