25.02.2013, 16:18
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2013 16:25 von Kiesch.)
|
Kiesch
LVF-Stammgast
Beiträge: 412
Registriert seit: Mar 2009
2019, 2018, 2016
2009
DE
04519
Deutschland
|
RE: kontinuierliche Datenübergabe von mehreren SubVis in ein Array
Äh... mal ein kurzer Einwurf:
Warum reicht nicht eine Referenz aufs Array und Reinschreiben über Teilarray ersetzen? (mit jeweils eben einem Element)
Da sich jedes Netzteil nur für "sein" Arrayelement (Netzteil 1 nur für Index 0, zwei nur für Index 1 ....) interessiert sollte das doch auch noch keine Racing Conditions hervorrufen oder? (sinnvollerweise würde man ja annehmen, dass Labview das auf unterster Ebene über ein Schreiben in die Referenz des entsprechenden Array Elements erledigt und nicht das ganze restliche Array mit anpackt)
Oder macht das Labview anders? Ich meine - ist sicher nicht die eleganteste Lösung, aber in dem Fall wohl mit relativ wenig Aufwand umzusetzen. Probleme gäbe es doch nur wenn man es mit einer Lese und einer Schreiboperation zu tun hätte die voneinander abhängen UND noch dazu mehrere Prozesse auf den gleichen Bereich Schreiben dürfen. Das ist hier ja meinem empfinden nach nicht der Fall.
Soweit ich das verstehe soll das ja "nur" ne Anzeige sein, die im schlimmsten Fall mal mitgeschrieben wird...
Was sauber durchdacht sein muss ist die Spannungsverstellung der Netzteile. Wenn man dafür den Netzteilen einfach einmal einen Wert schickt und die den dann selbst anfahren ist das relativ unkritisch, dann muss man anschließend nur überwachen wann der Wert erreicht ist (geht ja meist sehr fix). Wenn man dagegen manuell durch Spannung nachprüfen und modifizieren fahren muss, dann sollte man entsprechende Reaktionszeiten einplanen (sprich: Nicht zu schnell regeln, da man sonst überregelt).
Sauberer sind natürlich die Lösungen mit Queue / FGV. Der Trick ist jeweils, dass nur ein Schreib- / Leseprozess zur gleichen Zeit durchgeführt wird - entweder weil nur eine Stelle im Program schreiben kann (Queue Konsument im Main VI der alle Daten geschickt kriegt), oder die FGV verhindert, dass zwei Prozesse sie gleichzeitig ausführen (entsprechend darf das VI dafür natürlich auch NICHT als Ablaufinvariant markiert werden).
P.S: Beide Varianten können allerdings immer noch nicht sicher sicherstellen, dass auch wirklich auf Lesevorgänge mit verarbeiten der gelesenen Daten und daraus resultierendem Schreiben auch wirklich keine Racing Conditions entstehen können (dafür muss man noch zusätzlich Sperrmechanismen implementieren) - aber auch solche Probleme sehe ich bei deinem Aufbau jetzt auf Anhieb nicht.
P.P.S: Zu deiner Frage wie du die Daten aus der FGV in die Main kriegst:
Die Daten aus der FGV liest du einfach mit einem (von dir programmierten) "ganzes Array" lesen in der Main ein und schreibst die in die Anzeige. (dazu brauchen dann noch die Netzteile eine Funktion mit der sie jeweils nur ihren Datensatz setzen).
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
*Zitat: IchSelbst*
|
|
|
25.02.2013, 16:29
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2013 16:31 von GerdW.)
|
GerdW
______________
Beiträge: 17.469
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: kontinuierliche Datenübergabe von mehreren SubVis in ein Array
Hallo Kiesch,
Zitat:Referenz aufs Array und Reinschreiben über Teilarray ersetzen?
ReplaceArraySubset ist eine Read-Modify-Write-Operation - und leider keine atomare!
Du musst also in jedem subVI das komplette Array lesen, ein Element ersetzen und das komplette Array zurückschreiben.
Siehst du hier die RaceCondition, wenn dies mehrfach parallel ausgeführt wird?
|
|
|
26.02.2013, 13:42
(Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2013 13:47 von GerdW.)
|
GerdW
______________
Beiträge: 17.469
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: kontinuierliche Datenübergabe von mehreren SubVis in ein Array
Hallo Henning,
zur Namensgenerierung der Netzteil-Queue: nimm doch "NT-%03d" als Formatstring, dann brauchst du keine Fallunterscheidung bzgl. der Nummer (>9 oder <10) machen...
Zitat:kann man nun das Array, mit dem richtigen Wert, in jeder Registerkarte angezeigt bekommen, außer in der ersten Registerkarte dort soll das Array nicht zu sehen sein.
- Einfache Lösung: auf jeder Registerkarte, auf der das Array zu sehen sein soll, eine Kopie anlegen. (Bei 15 Tabs sehr umständlich...)
- Auch einfache Lösung: ein Array vor den Tab-Container legen (!) und das Array unsichtbar machen, wenn Tab0 aufgerufen wird, sonst sichtbar...
|
|
|
26.02.2013, 14:00
|
simbi
LVF-Grünschnabel
Beiträge: 16
Registriert seit: May 2011
11.0
2011
DE
Deutschland
|
RE: kontinuierliche Datenübergabe von mehreren SubVis in ein Array
Hallo Gerd,
vielen Dank für den Tipp mit dem Formatstring.
Mit vor den Container legen meinst du eine Ebene höher oder?
Das mit der Kopie wollte ich eigentlich nicht, dann hätte ich eigentlich auch nicht das Array gebraucht, könnte dann gleich jedem Wert eine eigene Anzeige geben.
|
|
|
26.02.2013, 14:07
|
jg
CLA & CLED
Beiträge: 15.864
Registriert seit: Jun 2005
20xx / 8.x
1999
EN
Franken...
Deutschland
|
RE: kontinuierliche Datenübergabe von mehreren SubVis in ein Array
(26.02.2013 14:00 )simbi schrieb: Mit vor den Container legen meinst du eine Ebene höher oder?
Sowas in der Art. Nur mit den Ebenen (oben im FP) kommst du aber nicht weiter.
Du musst das Control erst außerhalb vom Tab-Control platzieren, dann markieren, und dann mit den Cursor-Tasten "vor" das Tab-Control verschieben.
Gruß, 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.
|
|
|
26.02.2013, 14:11
|
simbi
LVF-Grünschnabel
Beiträge: 16
Registriert seit: May 2011
11.0
2011
DE
Deutschland
|
RE: kontinuierliche Datenübergabe von mehreren SubVis in ein Array
Hallo Jens,
ja genau so meinte ich das auch.
Vielen Dank
MfG, Henning
|
|
|
27.02.2013, 14:20
|
Kiesch
LVF-Stammgast
Beiträge: 412
Registriert seit: Mar 2009
2019, 2018, 2016
2009
DE
04519
Deutschland
|
RE: kontinuierliche Datenübergabe von mehreren SubVis in ein Array
(25.02.2013 16:29 )GerdW schrieb: Hallo Kiesch,
Zitat:Referenz aufs Array und Reinschreiben über Teilarray ersetzen?
ReplaceArraySubset ist eine Read-Modify-Write-Operation - und leider keine atomare!
Du musst also in jedem subVI das komplette Array lesen, ein Element ersetzen und das komplette Array zurückschreiben.
Siehst du hier die RaceCondition, wenn dies mehrfach parallel ausgeführt wird?
Hallo Gerd,
nachdem ich einen langen Post darüber geschrieben habe warum man das atomar programmieren können sollte (und das deswegen geschehen sein sollte), ist mir grade der Denkfehler aufgefallen: Die Fehlerbehandlung macht die Probleme, da man erst die Arraygröße überprüfen muss bevor man replaced. Zwischen diesen zwei Schritten kann sich aber die Arraygröße ändern (theoretisch). Es ist also genau genommen vermutlich nur ein Read - Write (bzw. Read - Modify).
Gruß Kiesch
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
*Zitat: IchSelbst*
|
|
|
| |