WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Abbilden der Verbindungen der Blöcke

 

amoibos
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.05.14
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 23.05.2014, 10:48     Titel: Abbilden der Verbindungen der Blöcke
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 23.05.2014, 11:05     Titel:
  Antworten mit Zitat      
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.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 23.05.2014, 11:12     Titel:
  Antworten mit Zitat      
Code:

vdp
b1=get_param('vdp/Fcn','PortConnectivity');
get_param(b1(2).DstBlock,'Name')
 
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
amoibos
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.05.14
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 23.05.2014, 11:53     Titel:
  Antworten mit Zitat      
Ich danke dir. Gibts einen Grund warum man nicht direkt die Zahl übergeben kann(Repräsentation des Float, die man nicht direkt verwenden sollte)?
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 23.05.2014, 12:23     Titel:
  Antworten mit Zitat      
Bei mir geht es. Ich tippe auf ein Versäumnis beim Thema Präzision Smile

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
 


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
amoibos
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.05.14
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 28.05.2014, 13:28     Titel:
  Antworten mit Zitat      
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?

Code:

start_node = 'sys/In1'
neighbours = get_param(start_node, 'PortConnectivity')
disp(neighbours.DstBlock)
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 28.05.2014, 13:38     Titel:
  Antworten mit Zitat      
Am Besten einen lauffähigen Code mit einem Demo-Modell (wie ich mit vdp) bereitstellen. Dann kann ich die Fehlermeldung erläutern.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
amoibos
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.05.14
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 28.05.2014, 14:05     Titel:
  Antworten mit Zitat      
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
   
end

function list_extend(coll, elements)
% helper function which append elements list to coll list
   
    old_len = length(coll);
    for index=1:length(elements)
        coll(old_len + index) = elements(index);
    end    
end


sys.slx
 Beschreibung:

Download
 Dateiname:  sys.slx
 Dateigröße:  12.42 KB
 Heruntergeladen:  477 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 28.05.2014, 15:24     Titel:
  Antworten mit Zitat      
Folgende Änderung und der Code läuft:

Code:
ports = [neighbours{1}.SrcBlock, neighbours{1}.DstBlock]
 

Obs es das Richtige tur, kann ich aber nicht sagen Smile

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
amoibos
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.05.14
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 29.05.2014, 20:47     Titel:
  Antworten mit Zitat      
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 is for incoming
                amount = length(attribute(k).SrcBlock);
                port = attribute(k).SrcBlock;
            else
                port = attribute(k).DstBlock;
            end

            %get all links
            for m=1:amount
                collector(length(collector) + 1) = cellstr(get_param(port(m), 'Name'));
            end
         
        end
    end
   
    % convert cell to string array, stores in a dictionary
    dict(start_node) = char(collector);
   
    for k=1:length(collector)
       key = char(collector(k));
        if ~dict.isKey(key)
            dict = depth_first_search(system, key, dict);
        end
    end
   
    ret = dict;
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.