2013-06-09 19 views
7

Ich möchte die Daten von simulink während der Simulation abrufen und serielle Netzwerkfunktion verwenden, um diese Daten an ein anderes Programm zu senden. Weil ich ein anderes Programm benutzen muss, um einige Tricks zu machen und Befehl an Simulink zurück zu senden, also muss ich Daten von simulink während Laufzeit holen, damit ein anderes Programm den richtigen Befehl bilden kann.Wie Simulink Daten in den Arbeitsbereich während der Simulation exportieren?

Ich habe versucht mit To Workspace-Block, um die Daten zu exportieren.

enter image description here

Allerdings kann ich nur Wert in der ersten Stunde der Simulation.

Und ich habe auch versucht, Bereich zu verwenden und einige Eigenschaften zu ändern: Aktivieren Sie Daten in Arbeitsbereich speichern, und deaktivieren Sie Limite-Daten in den letzten.

enter image description here

enter image description here

Zuerst begann ich Simulation, und ich fand die ScopeData nicht im Arbeitsbereich angezeigt hat. Nur wenn ich die Simulation stoppe, würde ScopeData im Arbeitsbereich erscheinen.

enter image description here

Und danach, kann ich ScopeData.signals.values ​​verwenden, um Werte zu erhalten.

Aber was ich will ist: wenn ich Simulation starte, würde ScopeData im Arbeitsbereich erscheinen, so dass ich diese Daten an andere Programme senden kann.

Weiß jemand, wie man das erreicht?

Ich fand this page könnte hilfreich sein, aber ich weiß immer noch nicht, wie Daten während der Simulation kontinuierlich exportieren.

+0

Senden Sie die Daten an ein Matlab-Programm oder ein anderes Programm wie Excel oder etwas? Wenn ja, welches andere Programm? –

+0

Ich sende Daten an Proteus, weil ich einige Befehle auf Mikrochip schreiben möchte, um die Blöcke in Simulink zu steuern. –

+0

Ich weiß, dass Sie die Daten in den Simulink-Zeilen mit [get_param'] (http://www.mathworks.com/help/simulink/slref/get_param.html) cammand erhalten können, wenn der Simulink auf ** external gesetzt ist Modus ** während der Simulation (nicht sicher über andere Modi). Sie können einen Timer (mit der gleichen Frequenz Ihres Simulinks) einrichten und dies in seinem "Callback" tun. – pm89

Antwort

10

Verwenden Sie get_param, um Daten nur zum aktuellen Zeitpunkt zu lesen. Auch um die Daten mit set_param eines Verstärkers oder eines anderen Blocks an Simulink zurückzusenden.

Ein Beispiel von get_param

Erste Last und Start die Simulation:

load_system('myModel') 
set_param('myModel','SimulationCommand','Start'); 

Um Daten auf einer beliebigen Zeile Ihres Simulink-Modell zu lesen:

  1. Holen Sie sich einen Simulink-Block obje ct (lassen Sie uns versuchen, eine Uhr mit dem Namen Uhr):

    block = 'myModel/Clock'; 
    rto = get_param(block, 'RuntimeObject'); 
    
  2. dann die Daten auf seiner ersten bekommen (oder überhaupt) Ausgangstor (oder Eingang) dieses Blocks.

    time = rto.OutputPort(1).Data; 
    

Sie könnten das Lesen, in einem Timer-Rückruf tun.

Auch könnte dies nützlich sein: Command Line Functionality for Simulink

+3

Obwohl dies einige Daten erhalten würde, arbeitet der Timer in MATLAB und hat Das hat nichts mit der Simulink-Simulationszeit zu tun, daher gibt es keine Garantie dafür, Daten zu den Simulationszeiten zu erhalten, die Sie benötigen. –

+0

Ich stimme dir zu @PhilGoddard, aber ich fand dies der einzige Weg. Es gibt jedoch einige Problemumgehungen und schmutzige Tricks, um zu verhindern, dass irgendwelche Daten verloren gehen, wie zum Beispiel die Timerfrequenz zu erhöhen (um die Wahrscheinlichkeit von Datenverlusten zu verringern) und einen Zähler in Simulink einzurichten (um zu verhindern, dass die gleichen Daten doppelt erfasst und gescannt werden) verloren oder nicht). – pm89

+0

Die Problemumgehungen verhindern nicht, dass Daten fehlen. Sie können helfen, weniger Daten zu verlieren, aber sie können nicht garantieren, dass Sie keine Daten verpassen. –

3

Während der Simulation speichert Simulink protokollierte Daten in einem internen Puffer und schreibt die Daten nur in den Arbeitsbereich, wenn die Simulation angehalten oder angehalten wird. Es klingt, als ob Sie wirklich eine S-Funktion schreiben müssen (die Signalwerte auf einer Zeitschritt-zu-Zeit-Basis erhält) und mit Proteus auf diese Weise kommunizieren.

Natürlich Simulink ist ein Nicht-Echtzeit-Simulator, also, wenn Sie darüber reden, etwas in Echtzeit Kontrolle zu tun, dann sind Sie wahrscheinlich den falschen Ansatz insgesamt.

+0

Ich möchte einen Roboterarm in Simulink (Simmechanik, eigentlich) mit Mikrochip in Porteus als Controller steuern. Ist das also nicht erreichbar? Ich verstehe nicht die Bedeutung von Simulink ist ein Nicht-Echtzeit-Simulator ~ –

+2

Keine der Betriebssysteme, auf denen MATLAB/Simulink läuft, sind Echtzeit. Dies bedeutet unter anderem, dass 1 Einheit Simulationszeit (fast sicher) nicht 1 Einheit Echtzeit entspricht. Die Uhr in Simulink könnte sagen, dass sie seit 10s läuft, aber die Uhr an Ihrer Wand könnte etwas weniger als 10s oder etwas länger als 10s sagen (abhängig von der Komplexität Ihres Modells). Wenn Sie nur langsame Abtastraten benötigen und sich nicht um garantierte Leistung kümmern, müssen Sie das Modell für die Echtzeitsteuerung in C konvertieren (mit Simulink Coder) und dann diesen Code auf einem Echtzeit-Betriebssystem kompilieren und ausführen. –

+0

Sie können Ihre Logik immer mit Simulink-Streaming von Live-Daten an einen Controller testen, denken Sie daran, dass es sich nicht um Echtzeit handelt. Die Hauptlogik kann getestet werden, aber kritische Timing-Aufgaben sind nicht möglich (zB die Reaktionszeit in Mikrosekunden eines Ereignisses, das über Interrupt oder etwas Ähnliches passiert) – Karim

2

jederzeit während der Simulation können Sie Simulink zwingen, die Simulation Ausgangsdaten in den Arbeitsbereich zu schreiben:

set_param(bdroot,'SimulationCommand','WriteDataLogs'); 

ich gefunden habe, dass dieser Befehl recht ist instabil in meinem Matlab 2010a für Win64. Insbesondere muss ich es vermeiden, wenn die Simulation gestoppt wird (d. H. Zuerst get_param(bdroot,'SimulationStatus')), sonst zeigt Matlab einen Fehler an und fragt nach einem Neustart.

+0

Das war, was ich gesucht habe! Funktioniert auch während einer Echtzeitsimulation. –