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

Buffer in Simulink erzeugen

 

Strauße
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 07.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2010, 15:37     Titel: Buffer in Simulink erzeugen
  Antworten mit Zitat      
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! Wink

Möchte eben einfach, dass immer die letzten x Werte (20 Sekunden / sample time) zur Verfügung stehen.

Viele Grüsse und danke

Tobias
Private Nachricht senden Benutzer-Profile anzeigen


dany2k3k
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 01.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2010, 01:16     Titel:
  Antworten mit Zitat      
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 Smile


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

buffer.mdl
 Beschreibung:
have fun

Download
 Dateiname:  buffer.mdl
 Dateigröße:  29.32 KB
 Heruntergeladen:  1977 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Strauße
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 07.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2010, 16:22     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
dany2k3k
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 01.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2010, 17:13     Titel:
  Antworten mit Zitat      
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
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.