|
|
Buffer in Simulink erzeugen |
|
Strauße |
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 07.11.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 09.02.2010, 15:37
Titel: Buffer in Simulink erzeugen
|
|
Hallo,
ich versuche nun schon den ganzen Tag folgendes:
Ich kriege in Simulink (künftig über xPC) ein Messsignal. Hieraus möchte ich immer aus den letzten 20 Sekunden der Messung mit Embedded Matlab Berechnungen anstellen und bestimmte Werte (Frequenz, Amplitude, etc) auslesen. Hierzu muss ich die Werte der letzten 20 Sekunden zur Verfügung haben.
Wie kann ich (zu jedem Moment) auf diese gespeicherten Werte zugreifen? Mit Embedded Matlab kann ich keinen geeigneten Buffer schreiben, da "global" nicht zulässig ist. Den Simulink-Block "Buffer" versteh ich irgendwie nicht so ganz, was der macht und ob der dafür geeignet ist.
Das ganze sollte dann nicht viel Rechenzeit verbrauchen, da es Echtzeitfähig sein soll. Ich steh echt irgendwie auf dem Schlauch!
Möchte eben einfach, dass immer die letzten x Werte (20 Sekunden / sample time) zur Verfügung stehen.
Viele Grüsse und danke
Tobias
|
|
|
|
|
dany2k3k |
Forum-Fortgeschrittener
|
|
Beiträge: 66
|
|
|
|
Anmeldedatum: 01.02.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.02.2010, 01:16
Titel:
|
|
|
|
|
ich hätte da eine ad hoc lösung parat...
sie funktioniert,allerdings nicht besonders elegant:
wenn du damit leben kannst,auf gehts :d
lösungsherz ist der embedded matlab block und der 1/z block, den ich gewissermassen als globale variable missbrauche , da er den letzten wert speichert und im nächsten abtastschritt hergebt.
im 1/z block definierst du als anfangszustand einen vektor mit lauter nullen,genausolang wie du den buffer haben möchtest
(so dass elemente /abtastfrequenz = 20 sekunden)
der embedded block macht jetzt nix anderes als
ausgangsvektor = [signalwert,eingangsvektor(1 bis ende-1) ]
speichert also das signal an die erste stelle,und kickt den letzten wert raus.
der ausgangsvektor landet jetzt im 1/z glied, und steht somit zum nächsten abtastzeitpunkt wieder als eingang für den embedded block zur verfügung..
anbei das simulink file.
dürfte eigentlich selbsterklärend sein
nochmals kurz:
* im 1/z den anfangsvektor mit nullen definieren in der gewünschten dimension(im test bei mir einfach mal 10)
* buffero = neuer buffer, der wegen dem 1/z im nächsten abtastschritt dann wieder zur verfügung steht.
ist das ungefähr was du wolltest ?
lg
daniel
Beschreibung: |
|
Download |
Dateiname: |
buffer.mdl |
Dateigröße: |
29.32 KB |
Heruntergeladen: |
1977 mal |
|
|
|
Strauße |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 07.11.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 15.02.2010, 16:22
Titel:
|
|
Hallo,
vielen Dank. Hab die Antwort leider gerade erst gelesen.
Also das war im Prinzip das was ich wollte.
Ich hab das ganze jetzt mal mit dem "Delay Line" Block gemacht. Vermute mal, dass das etwas rechenzeitoptimaler ist (?).
Weiss aber noch nicht, wies mit dem kompilieren über XPC aussieht. Müsste aber gehen denke ich.
Hab mir Deine Lösung auch nochmal gespeichert. Im Prinzip ist es ja ganz einfach, wenn auch bisschen umständlich. Hatte/hab nur immer ein wenig Probleme mit dem embedded matlab wenn irgendwelche Dimensionen nicht von vornherein klar sind.
Vielen Dank und Grüsse,
Tobias
|
|
|
dany2k3k |
Forum-Fortgeschrittener
|
|
Beiträge: 66
|
|
|
|
Anmeldedatum: 01.02.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 15.02.2010, 17:13
Titel:
|
|
ich denke mal , du gehst ja mit dem buffer array in eine nächste funktion
falls deines nicht kompilierbar ist,meins ist garantiert kompilierbar,da ich es selber hier schon eingesetzt habe.
für meine funktion brauchst du die größe nicht,er setzt einfach den aktuellen messwert an die erste stelle,schiebt das alte 1 nach links und kickt den letzten raus. die größe des arrays wird ja im 1/z block über den startwert definiert.
in deinen funktionen kannst dir ja die größe des buffers einfach mit size oder length bekannt machen. dann bist schön flexibel und brauchst die größe in deine codes nicht hardcodieren.
lg
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|