В этом примере показано, как найти самый короткий путь к управлению для гибридного электрического транспортного средства с помощью Сигнала, Прослеживающего 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);
Таблица ребер содержит два типа ребер: действительные ребра и виртуальные ребра, включая внутренние ребра и скрытые ребра. Во-первых, отфильтруйте виртуальные ребра с помощью 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)