Verfasst am: 23.05.2014, 10:48
Titel: Abbilden der Verbindungen der Blöcke
Ich bin noch recht neu im Simulink und muss die Struktur eines Modell umformen. Dabei müssen die einzelnen Blöcke und die Verbindungen irgendwie ermittelt werden. Dafür brauch ich noch ein wenig Hilfe.
Bisher hab ich rausgefunden:
Blöcke im Modell: find_system(gcs, 'Type', 'Block')
Schnittstelle zu einem Block: get_param('model/element', 'PortConnectivity')
Der Struct Array beinhaltet nun SrcBlock bzw. DstBlock. Laut Doku. sind das nun Handles, nur wie komme ich zum Blockname? Siehe hier.
Ich schreibe mal gleich ein kleines Beispiel. Ganz wichtig zu wissen ist aber, dass einige Informationen über Signale ("Blockverbindungen") erst zu Laufzeit bekannt sind und daher nicht einfach so aus dem geöffneten Modell extrahierbar sind.
Bei mir geht es. Ich tippe auf ein Versäumnis beim Thema Präzision
Code:
vdp
b1=get_param('vdp/Fcn','PortConnectivity');
b1(2)% Bei mir erscheint 8.0012 get_param(b1(2).DstBlock,'Name')% geht get_param(8.0012,'Name')% gibt Fehler format long
b1(2)% Aha, es ist 8.001220703125000 get_param(8.001220703125000,'Name')% geht
Vielen Dank nochmal.
Ein anderes Problem was dicht am vorherigen ansetzt.
Ich möchte eine Breitensuche implementieren und ermittle über 'PortConnectivity' meine Nachbarn. Im Befehlsfenster kann ich dann zur Kontrolle auf das Struct zugreifen im Code verweigert dieser mir die Ausführung 'Attempt to reference field of non-structure array'.
Der Sinn der Fehlermeldung erschließt mir in diesen Kontext nicht. Wieso der folgende Code diese Meldung produziert?
Bitteschön, ist alles noch mit heißer Nadel, weil's recht früh harkte. Egal, es harkt immer wenn ich versuche die beiden Arrays aus get_param zuzuweisen.
Code:
function block_graph = find_blocks(system_name)
%
%block_graph = [];
%get list of all inputs and uses first element as start node
inputs = find_system(system_name, 'BlockType', 'Inport');
if ~isempty(inputs)
block_graph = breadth_first_search(inputs(1));
end end
function ret = breadth_first_search(start_node) %
%fprintf('DEBUG: %s', start_node) disp(start_node);
neighbours = get_param(start_node, 'PortConnectivity');
collector = [];
ports = [neighbours.SrcBlock, neighbours.DstBlock];
for i=1:length(ports)
list_extend(collector, ports(i)) end
%neigbour = []
%ret.SrcBlock , ret.DstBlock
Ich danke dir, mein Code funktioniert erst einmal. Falls jemand ähnliches vorhat hier eine Inspiration(geht sicher eleganter).
Code:
function block_graph = find_blocks(system_name) % retrieve all links between blocks as a dictionary
inputs = find_system(system_name, 'BlockType', 'Inport');
block_graph = containers.Map();
for n=1:length(inputs)
input_name = inputs{n}(length(system_name)+2:length(inputs{n}));
block_graph = depth_first_search(system_name, input_name, block_graph);
end end
function ret = depth_first_search(system, start_node, dict) % depth first search with given start node and dict as memory
collector = cell(0);
attribute = get_param(sprintf('%s/%s', system, start_node), 'PortConnectivity');
%iterate over all ports of block, check if it connected and add linked blocks
for k=1:length(attribute)
amount = length(attribute(k).DstBlock);
if amount > 0 || ~isempty(attribute(k).SrcBlock) if amount == 0
%port isfor incoming
amount = length(attribute(k).SrcBlock);
port = attribute(k).SrcBlock;
else
port = attribute(k).DstBlock;
end
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.