INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Array in der Whileschleife begrenzen



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

21.05.2008, 13:40
Beitrag #1

joe1234 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 136
Registriert seit: Sep 2007

2010
2007
kA


Deutschland
Array in der Whileschleife begrenzen
Hallo,

ich habe mir ein Programm gebastelt indem ich ein Array in einer While-Schleife durch Indizierung schiebe und durch weitere Werte ergänze. Nun sind es ziehmlich viele Werte (pro 120ms 12 Werte!!!) und ich wollte mal wissen, ob es möglich wäre so ein Array zu begrenzen?

Bsp.
Grenzwert = 800 Werte
While - Schleife läuft solange bis die 800 Werte im Array vollgeschrieben sind. Danach soll der erste Werte entfernt werden und der Neue hinzugefügt werden (also einfach schieben und der älteste (erste) Wert fällt dann raus), aber das "Fenster" über die 800 Werte sollte dann immer bestehen.

Ich hoffe, das Bsp ist verständlich.

Gruß Joe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.05.2008, 13:57
Beitrag #2

oenk Offline
LVF-Stammgast
***


Beiträge: 361
Registriert seit: May 2005

>= 7.1
2004
EN

3018
Schweiz
Array in der Whileschleife begrenzen
Du meinst wohl einen Ringpuffer, oder?
Such mal im Forum, da wirst du sicher einiges finden....

Gruss,
Christian

In theory, there is no difference between theory and practice; In practice, there is.

Chuck Reid
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.05.2008, 14:49 (Dieser Beitrag wurde zuletzt bearbeitet: 21.05.2008 14:50 von Lucki.)
Beitrag #3

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Array in der Whileschleife begrenzen
Meines Wissesn nach - bitte korrigiert mich, wenn ich mich irre - gíbt es keinen Rinpuffer als fertiges VI, es ist Handarbeit angesagt.
Ein supereinfache (wenn auch nicht unbedingt die schnellste) Lösung ist aber die: Das Signalverlausfdiagramm enthält intern einen Ringpuffer. Einfach die Histrorylänge auf 800 vorgeben und die anfallenden Daten in das Diagramm geben. Mit dem Eigenschaftsknoten "History" lassen sich die letzten 800 Datenpunkt jederzeit zurücklesen. Falls die Daten nicht gesehen werden müssen, aus dem Diag ein verborgenes Element machen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.05.2008, 19:17
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Array in der Whileschleife begrenzen
Schon mehrfach hier verlinkt:

http://forum.ib-berger.com/index.php?showtopic=92

MfG, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.05.2008, 22:26
Beitrag #5

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Array in der Whileschleife begrenzen
' schrieb:Schon mehrfach hier verlinkt:
Interessant. Zum Vergleich habe ich diese Demo gleich mal modifiziert. Funktional gleich, aber mit "missbräuchlicher Verwendung" eines Signalverlaufsdiagramms als Ringpuffer.
Lv85_img
Sonstige .vi  1D_async_ringbuffer.LV711.vi (Größe: 25,87 KB / Downloads: 298)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
26.05.2008, 14:50 (Dieser Beitrag wurde zuletzt bearbeitet: 26.05.2008 14:52 von joe1234.)
Beitrag #6

joe1234 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 136
Registriert seit: Sep 2007

2010
2007
kA


Deutschland
Array in der Whileschleife begrenzen
Erstmal Danke für eure Beispiele!
Aber irgendwie habe ich ein Problem diesen Ringpuffer einzubauen. Mein VI sieht so aus:

   

Es handelt sich hier um diese 13 Arrays im SGL-Format. Diese werde in Abhängigkeit von der ID in den jeweiligen Array geschrieben. Den Ringpuffer müsste ich ja in jedes Case einbauen, oder? Wenn ich das realisiere mit dem Bsp von Lucki, dann wird mein VI extrem langsam. Das Bsp von Jens kann ich irgendwie gar nicht einbauen!
Kann da jemand helfen oder zumindest sagen, warum mein VI so langsam wird?


LV8.5

Sonstige .vi  CAN_to_USB_Bedienung.vi (Größe: 131,39 KB / Downloads: 293)


Hier ist noch mein VI. (Wahrscheinlich werden nicht alle SubVIs erkannt!)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
26.05.2008, 15:51
Beitrag #7

RoLe Offline
LVF-Guru
*****


Beiträge: 1.236
Registriert seit: Jul 2007

-
1997
en

0
Schweiz
Array in der Whileschleife begrenzen
' schrieb:Meines Wissesn nach - bitte korrigiert mich, wenn ich mich irre - gíbt es keinen Rinpuffer als fertiges VI, es ist Handarbeit angesagt.

Zur Info, hier gibt es Ringpuffer Beispiele:
C:ProgrammeNational InstrumentsLabVIEWexamplesgeneralglobals.llb

.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
26.05.2008, 16:19
Beitrag #8

joe1234 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 136
Registriert seit: Sep 2007

2010
2007
kA


Deutschland
Array in der Whileschleife begrenzen
' schrieb:Zur Info, hier gibt es Ringpuffer Beispiele:
C:ProgrammeNational InstrumentsLabVIEWexamplesgeneralglobals.llb


Danke. Ich schaue es mir heute abend mal an.

Gruß Joe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
26.05.2008, 18:06 (Dieser Beitrag wurde zuletzt bearbeitet: 26.05.2008 18:27 von Lucki.)
Beitrag #9

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Array in der Whileschleife begrenzen
' schrieb:Hier ist noch mein VI. (Wahrscheinlich werden nicht alle SubVIs erkannt!)
Also aus Deinem Bild werde ich nocht richtig schlau. Aber selbstverständlich brauchst Du den Ringpuffer nicht mehrere Male. Einfach alle Elenete die gepuffert werden sollen als Cluster zusammenfassen.
Auch Deine ganz oben beschriebene Aufgabenstellung ist zwar klar, aber unvollständig. Klar ist, daß Du die Werte in den Puffer lesen willst und nur die letzten 800 Werte zu behalten wünschst. Was aber dann mit den Werten weiter geschehen soll, sagst Du nicht. Willst Du den geamten Puffer lesen und ihn dabei jedesmal leeren? Willst Du ihn lesen, ohne ihn zu leeren? Willst Du das älteste Element lesen und dabei aus dem Puffer entfernen. (Es ist bei Puffern üblich, daß das was gelesen wird aus dem Puffer entfernt wird)-

Erfreuliche Nachricht: Ich habe über das Thema Ringpuffer nochmal nachgedacht und bin jetzt glaube ich zur besten Lösung gekommen. Vergiss also das Signalverlausfsdiagramm, wenn Du die Daten nicht ständig sehen willst.
Die Methode ist, Queues als Puffer zu "missbrauchen". Habe mal ein passendes VI gemacht, sicherheitshalber mit allen obengenannten Methoden des Lesens.
Tip: Kein Horror vor Queues. es ist etwas ganz Einfaches, mit einer Stunde Lesen der Hilfe für die wenigen Funktionen hat man es darauf.
Lv85_img
Sonstige .vi  Datenbuffer.vi (Größe: 29,01 KB / Downloads: 299)

Und für Vergleichstudien hier die Rinpuffer-Demo von ib-Berger, umgestellt auf Queues:
Lv85_img
Sonstige .vi  1D_async_ringbuffer.LV711_2_.vi (Größe: 25,91 KB / Downloads: 289)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.05.2008, 13:26
Beitrag #10

joe1234 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 136
Registriert seit: Sep 2007

2010
2007
kA


Deutschland
Array in der Whileschleife begrenzen
' schrieb:Also aus Deinem Bild werde ich nocht richtig schlau. Aber selbstverständlich brauchst Du den Ringpuffer nicht mehrere Male. Einfach alle Elenete die gepuffert werden sollen als Cluster zusammenfassen.
Auch Deine ganz oben beschriebene Aufgabenstellung ist zwar klar, aber unvollständig. Klar ist, daß Du die Werte in den Puffer lesen willst und nur die letzten 800 Werte zu behalten wünschst. Was aber dann mit den Werten weiter geschehen soll, sagst Du nicht. Willst Du den geamten Puffer lesen und ihn dabei jedesmal leeren? Willst Du ihn lesen, ohne ihn zu leeren? Willst Du das älteste Element lesen und dabei aus dem Puffer entfernen. (Es ist bei Puffern üblich, daß das was gelesen wird aus dem Puffer entfernt wird)-

Hi Lucki,
erstmal großes Danke für deine Mühen und Ideen!!!
Mein Ziel ist es, ein Programm mit LV zu schreiben, mit dem ich meinen USB-to-CAN von IXXAT auslesen kann. Dabei ist es wichtig, dass ich die Werte gemäß der ID zuordnen kann. Später will ich einfach eine Tabelle ausgeben können, die aus ausgewählten IDs besteht. Also wenn ich ID 1,2,3 und 4 anwähle, soll meine Tabelle auch aus ID 1,2,3,4 bestehen. Diese Werte will ich dann abspeichern können.
Das war ungefähr die grobe Beschreibung von meinem Ziel.
Aus meinem VI kann man erkennen, dass nach jedem While-Schleifendurchlauf genau 1 Cluster (besteht aus: ID, Timestamp, Data...) gelesen wird. Dabei werden alle 120 sec. (erkennbar am Timestamp) 13 Werte und zwar hintereinander ausgegeben (der Cluster überschreibt bei jeden Durchlauf seine Werte). In meinem VI habe ich deshalb eine Case-Struktur gemacht, die je nach ID den Wert in den passenden Array hineinschreibt, somit kann ich meine ausgelesenen Werte später nutzen (Darstellen, Speichern, evtl. Zeichnen). Nun werden die Arrays natürlich nach kürzester Zeit riesig und dies wollte ich durch einen Ringbuffer auf ca. 8000 (sollte einstellbar sein) Werte pro ID begrenzen, damit ich das Programm auch mal über Nacht laufen lassen kann, ohne dass mir meine PC "abschmiert".
Bevor ich die Werte in meine Arrays hineinschreibe, rechne ich sie noch um.
Ich hoffe, nun ist die Sache etwas klarer. Die Werte möchte ich also auf keinen Fall aus dem Ringbuffer löschen. Ich möchte lediglich die Werte in einer Tabelle darstellen und bei Bedarf abspeichern.

Hier habe ich noch einen Ringbuffer gefunden:
LV8.5

Sonstige .vi  Recent_History_Buffer__DBL_.vi (Größe: 25,04 KB / Downloads: 305)


Dieser ist eingentlich das was ich gesucht habe. Problem ist nur: ich kann nur einzelne Werte abspeichern und dann als Array ausgeben.

Die Idee mit dem Cluster-Ringbuffer ist ziehmlich gut. Denn dann würde ich ja nur einen Ringbuffer für alle Arrays benötigen!
Ich mache mir mal kurz Gedanken und werde mich dann später melden.

Gruß Joe
Ich benötige jedoch, dass ich einen 1D-Array abspeichere und dann einen 2D-Array (enthalten viele 1D-Arrays) ausgebe.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Nur ein SubVI in Whileschleife soll verzögert werden mikadm 2 3.475 12.08.2020 14:54
Letzter Beitrag: mikadm
  Numerisches Bedienelement maximale Signalsteigung begrenzen antwort 2 4.100 06.03.2017 13:46
Letzter Beitrag: antwort
  Signalverlaufslänge begrenzen Hasenfuss 4 3.833 26.04.2016 13:40
Letzter Beitrag: Lucki
  Einfachen Funktionsgenerator.vi generiertes Ausgangssignal begrenzen Moes 7 7.017 18.09.2015 11:38
Letzter Beitrag: Moes
  VI in Subpanel begrenzen Hasenfuss 1 4.383 24.09.2013 08:13
Letzter Beitrag: GerdW
  Array in seiner Größe begrenzen Hasenfuss 8 11.885 22.08.2013 15:33
Letzter Beitrag: GerdW

Gehe zu: