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 

Polling von Curser-Position in Waveform Graph vermeiden



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!

09.10.2014, 05:42
Beitrag #1

UFPhC Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Oct 2014

7.1, 8.5, 2013
2009
DE



Polling von Curser-Position in Waveform Graph vermeiden
Hallo zusammen,

ich hab mir ein Programm geschrieben, das Messdaten erfasst und sie in einem Waveform Graph darstellt und anschließend speichert. Funktioniert alles ganz gut soweit.

Nun wollte ich eine "kleine Spielerei" einbauen, und zwar zwei frei ziehbare Curser (x-Achse), die mir den Bereich des gemessenen Signalmaximums wiedergeben. Die Position wird per Eigenschaftsknoten abgefragt und ausgegeben.
Das ganze erzeugt allerdings nochmal deutlich an CPU-Last, die ich vorher nicht hatte, entweder liegt es an der Cursoraktualisierung im Graphen oder am Polling der Cursorpositionen. Die Messdaten kommen so im 1 Sekunden-Takt, die Cursor flimmern allerdings etwas, es scheint, als würden die häufiger aktualisiert.

Das Programm besteht aus der Haupt-Whileschleife (ungebremst), welche eine Case- (Statusmaschine) und Eventstruktur (Benutzereingaben) beinhaltet. Der Graph wird in einem Case dargestellt. Der Eigenschaftsknoten und die Cursorpositionsanzeiger liegen in der While-Schleife.

Ich habe schon versucht, es irgendwie hinzubekommen, dass die Position der Cursor erst aktualisiert wird, wenn man sie verschiebt (was in der Regel recht selten vorkommt), so a la Eventstruktur, ging aber nicht. Mir würde es auch reichen, wenn die Cursor später (im nächsten Durchlauf, z.B.) aktualisiert werden.

Liegt es an der Natur des Graphen/der Cursor, dass die Last hochgeht oder lässt sich das irgendwie regeln.

Vielen Dank schonmal und viele Grüße!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
09.10.2014, 08:20 (Dieser Beitrag wurde zuletzt bearbeitet: 09.10.2014 08:22 von GerdW.)
Beitrag #2

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Polling von Curser-Position in Waveform Graph vermeiden
Hallo UFPhC,

wenn man Polling vermeiden will, nutzt man die Eventstruktur!

In deinem Fall das "Cursor verschieben"-Event…

Zitat:Das Programm besteht aus der Haupt-Whileschleife (ungebremst)
Du hast überhaupt keine Wartezeiten in dieser Schleifen???

Zitat:Ich habe schon versucht, es irgendwie hinzubekommen, dass die Position der Cursor erst aktualisiert wird, wenn man sie verschiebt (was in der Regel recht selten vorkommt), so a la Eventstruktur, ging aber nicht.
Hmm
Wenn jemand sagt "geht nicht", aber keine vernünftige Fehlerbeschreibung liefert, muss man antworten: "Geht doch!"

Allgemein: Wenn du ein Problem mit deinem VI hast, solltest du uns einen Blick darauf gönnen…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.10.2014, 03:16
Beitrag #3

UFPhC Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Oct 2014

7.1, 8.5, 2013
2009
DE



RE: Polling von Curser-Position in Waveform Graph vermeiden
Hallo Gerd,

Vielen Dank für Deine Hilfe, Du hattest völlig recht, es geht doch! Wink Ich hatte nur falsch gesucht und dachte, es gäbe einen extra Eintrag dafür, musste aber natürlich beim Graphen selber nachschauen.
So ist jetzt auch die Last wieder auf das ursprüngliche Level (ca. 60%, 50% machen allein schon die Fastcard aus) gefallen.

Zu Deiner Frage mit der Wartezeit: In der Haupt While-Schleife ist keine Wartezeit, in der Benutzereingabe (Event-Struktur) musste ich eine setzen, sonst hat er manche Sachen nicht sauber angezeigt. Bin mir allerdings noch nicht ganz im Klaren, wie der Timeout der Eventstruktur mit einer Bremse in der While-Schleife zusammenspielt.

Ich hab mal ein Bild angehängt.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.10.2014, 07:19
Beitrag #4

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Polling von Curser-Position in Waveform Graph vermeiden
Hallo UFPhC,

- wozu die Abfrage auf FirstCall mit dem Case hinterher, wenn deine Schleife endlos läuft? Außerdem hast du hier eine RaceCondition!
- wenn du eine Statemachine programmierst, dann nimm ein Schieberegister. Du musst nicht in jedem State in eine lokale Variable des States schreiben. Und der FirstCall wird dann auchnicht mehr benötigt!
- wozu liegen die ganzen Terminals ungenutzt in der Schleife? Warum nutzt du die nicht, um wenigstens ein paar der lokalen Variablen zu löschen?
- UnbundleByName erhöht die Lesbarkeit eines Blockdiagramm ungemein!
- Ja, dein Aufbau benötigt einen kleinen Timeout der Event-Struktur…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.10.2014, 07:45
Beitrag #5

UFPhC Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Oct 2014

7.1, 8.5, 2013
2009
DE



RE: Polling von Curser-Position in Waveform Graph vermeiden
Hallo Gerd,

vielen Dank für Deine Tipps und Hinweise!

Zitat:- wozu die Abfrage auf FirstCall mit dem Case hinterher, wenn deine Schleife endlos läuft? Außerdem hast du hier eine RaceCondition!
Das mit der RC hab ich mir fast gedacht, ich hab die FirstCall Abfrage nachträglich eingebaut, weil beim Beenden des VIs (ein State mit dem 8-eckigen Stop-VI) das Programm danach wieder auf Standby gesetzt werden muss, wenn ich es erneut laufen lasse, unschön, ich weiß. Muss mal noch sehen, wie ich das besser hinbekomme. (So wie es jetzt ist müsste das in eine Sequenz vor der While-Schleife, oder?)

Zitat:- wenn du eine Statemachine programmierst, dann nimm ein Schieberegister. Du musst nicht in jedem State in eine lokale Variable des States schreiben. Und der FirstCall wird dann auchnicht mehr benötigt!
Funktioniert das auch, wenn ich mal händisch (per GUI) in einen anderen State springen will? Muss mir die Beispiele mal nochmal genauer zu Gemüte führen.

Zitat:- wozu liegen die ganzen Terminals ungenutzt in der Schleife? Warum nutzt du die nicht, um wenigstens ein paar der lokalen Variablen zu löschen?
Die hab ich alle mal zusammengestellt, um das ganze etwas übersichtlicher zu halten. Habe jetzt aber auch mitbekommen, dass lokale Variablen bei LV weitestgehend vermieden werden sollten.

Zitat:- Ja, dein Aufbau benötigt einen kleinen Timeout der Event-Struktur…
Wie müsste ich das denn machen, um keinen Timeout zu brauchen, oder geht das hier gar nicht anders?

Die ganzen Status LEDs müssten sich eigentlich auch irgendwie anders abfragen lassen, das ist mit Sicherheit nicht die eleganteste Lösung
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.10.2014, 07:52
Beitrag #6

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Polling von Curser-Position in Waveform Graph vermeiden
Hallo UFPhC,

Zitat:Muss mal noch sehen, wie ich das besser hinbekomme. (So wie es jetzt ist müsste das in eine Sequenz vor der While-Schleife, oder?)
Nein, das wird die Initialisierung des schon erwähnten Schieberegisters. Fertig…

Zitat:Funktioniert das auch, wenn ich mal händisch (per GUI) in einen anderen State springen will?
Ja.

Zitat:Die hab ich alle mal zusammengestellt, um das ganze etwas übersichtlicher zu halten.
Was ist daran übersichtlicher? Man sieht nicht mehr den DATAFLOW! Und das ist das Grundprinzip von LabVIEW…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
14.10.2014, 11:53
Beitrag #7

th13 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 177
Registriert seit: Oct 2013

2020 SP1
2013
EN


Deutschland
RE: Polling von Curser-Position in Waveform Graph vermeiden
Offtopic2
Hi Gerd,

(14.10.2014 07:52 )GerdW schrieb:  Was ist daran übersichtlicher? Man sieht nicht mehr den DATAFLOW! Und das ist das Grundprinzip von LabVIEW…
Ich finde es auf jeden Fall übersichtlicher, wenn man alle benutzten Objekte auf einen Blick erfassen kann. Und den Dataflow gibt es ja innerhalb der Strukturen ja trotzdem noch. Bei uns in der Firma ist das jedenfalls Standard. Desweiteren hat das den Vorteil, dass in der liste der lokalen Variablen nicht der eine Zugriff fehlt, der über das Terminal geht.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.10.2014, 13:16
Beitrag #8

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Polling von Curser-Position in Waveform Graph vermeiden
Hallo th,

Zitat:wenn man alle benutzten Objekte auf einen Blick erfassen kann.
Woher weiß ich, dass die Controls/Indicator benutzt sind, wenn alle Terminals an einer Stelle gesammelt wurden? Ich weiß nur, dass sie existieren…

Zitat:Und den Dataflow gibt es ja innerhalb der Strukturen ja trotzdem noch. Bei uns in der Firma ist das jedenfalls Standard.
Es ist also Standard, dass man RaceConditions provoziert, weil man zwar innerhalb von Strukturen auf den DATAFLOW achtet, aber dies womöglich außerhalb verdrängt?

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.10.2014, 16:14
Beitrag #9

th13 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 177
Registriert seit: Oct 2013

2020 SP1
2013
EN


Deutschland
RE: Polling von Curser-Position in Waveform Graph vermeiden
immer noch Offtopic2
Hi Gerd,

Zitat:Woher weiß ich, dass die Controls/Indicator benutzt sind, wenn alle Terminals an einer Stelle gesammelt wurden? Ich weiß nur, dass sie existieren…
Man kann auch Controls/Indicators erstellen und sie nie wieder benutzen. Sei es weil der Draht unbenutzt an einer Schleife endet oder in einem Cluster gespeichert wird und nie wieder gebraucht wird. Dagegen hilft in beiden Fällen nur saubere Programmierung.

Zitat:Es ist also Standard, dass man RaceConditions provoziert, weil man zwar innerhalb von Strukturen auf den DATAFLOW achtet, aber dies womöglich außerhalb verdrängt?
Man hat keine RaceConditions, wenn sich außerhalb der äußeren Struktur nur die Terminals (ohne Defaultzuweisungen oder dergleichen) befinden. Es gibt bei uns außerhalb keinen Code.

Wenn wir weiter diskutieren wollen, sollten wir evtl. einen eigenen Thread anlegen.

Thomas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.10.2014, 11:38
Beitrag #10

UFPhC Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Oct 2014

7.1, 8.5, 2013
2009
DE



RE: Polling von Curser-Position in Waveform Graph vermeiden
Hallo nochmal,

das mit den Variablen wird wohl immer eine kleine Streitsache bleiben, an manchen Stellen ist es vll. übersichtlicher, an manchen nicht.

Nichtsdestotrotz stört mich die Initialisierungs-RC in meinem Programm schon ein wenig, daher habe ich über die Realisierung mit dem Schieberegister nachgedacht.
So ganz klar ist mir jedoch die User-Interaktion mittels Eventstruktur nicht. Steht die Eventstruktur wie in meinem Beispiel auch innerhalb der Programm-Whileschleife? Ich müsste dann ja noch irgendwie eine Abfrage einbauen, die klärt, ob es eine Benutzereingabe gegeben hat, damit dieser Status dann weiter gegeben werden kann oder ob die SM ihre Aufgaben weiter abarbeiten soll.

Hat da vll. jemand ein Beispiel für mich?

Vielen Dank schon mal!

P.S.: Unbundle by name ist geändert Wink
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
  Motorsteuerung (VCP) Erfassung Geschwindigkeit und Position JanM 2 3.268 15.06.2021 07:48
Letzter Beitrag: GerdW
  EOF Fehler vermeiden chrissy 6 5.789 13.12.2016 08:26
Letzter Beitrag: chrissy
  RPM Messung über Drehgeber Position RobinDR 3 3.834 19.11.2016 16:13
Letzter Beitrag: GerdW
  Cursor-Position einlesen unbekannt 1 3.582 30.03.2014 17:40
Letzter Beitrag: Trinitatis
  Wie sehr großen Cluster vermeiden? Matze 10 9.466 31.10.2013 17:21
Letzter Beitrag: macmarvin
  Position Pfeilschaltschläche Enum verschieben Hasenfuss 2 3.901 11.04.2013 15:13
Letzter Beitrag: Hasenfuss

Gehe zu: