LabVIEWForum.de
Daten lesen/schreiben Vorrangproblem Variablen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenkommunikation (/Forum-Datenkommunikation)
+---- Thema: Daten lesen/schreiben Vorrangproblem Variablen (/Thread-Daten-lesen-schreiben-Vorrangproblem-Variablen)



Daten lesen/schreiben Vorrangproblem Variablen - buettnerstefan - 26.05.2015 11:49

Hallo LV-Gemeinde,

ich hab grad Pech beim Denken und hoffe das jemand ne gute Idee hat.
Ich hab über Modbus TCP-IP eine Verbindung zu einer SPS aufgebaut, und kann da die Variablen auslesen (read holding Registers) und schreiben (write multiple Registers). Kommt alles an und passt erstmal soweit. Nun hab ich in einer While-Schleife eine Eventstruktur welche im timeoutcase mir alle 100ms die Werte liest und auf die Frontpanelelemente gibt. Einige dieser Frontpanelelemente sind Bedienelemente wie Motor An/Aus oder Sollposition. Um in diese schreiben zu können komme ich nicht darum lokale Variablen oder Eigenschaftsknoten dieser zu erstellen.
Nun habe ich weitere Ereignis-Case in denen ich bei "value change" den Wert an die SPS schreibe. Das klappt zwar, aber manchmal wird mein neuer Wert noch vor dem senden von dem alten (ausgelesenen) Wert überschrieben (selbst bei booleans!!). Wie kann ich das verhindern? Macht die Eventstrucktur immer erst das case fertig bevor sie auf das nächste Event reagiert?

- Lesefrequenz runtersetzen ist keine Option, da die Messwerte mit dieser Protokolliert werden soll
- Haken bei "Frontpanel während case für bedienung sperren" klappt nicht
- Es handelt sich um 50 Register mit read und r/w bunt gemischt, also trennung dieser seeeehr aufwendig
- Bedienelemente nur am Anfang lesen ist auch keine Option, da ich sehen will das der neue Wert angekommen ist bzw. welcher grad drin steht (SPS kann auch ändern)

Bin beim Forum surfen auf den Begriff Queue gekommen, hab aber keine Idee wie ich das einbinden soll.
Hatte auch schon die Idee State-Maschine, aber 50 Schieberegister?? Huh

Beste Grüße
Construction


RE: Daten lesen/schreiben Vorrangproblem Variablen - Trinitatis - 26.05.2015 14:37

Hallo Stefan,

das ist wohl eine race condition zw. Wertänderung durch dich und Überschreiben der Dedienelementwerte durch das TO case. Das Herabsetzen der Lesegeschwindigkeit würde dein Problem auch nicht beseitigen sondern nur seltener machen. Und die Sperrung des FP kann hier auch nicht helfen, da ja dein Sende case und dein TO case ohnehin nacheinander ausgeführt werden.

Der einfachste Weg (wenn auch nicht der ideale) wäre wohl eine Bediensperre einzubauen, die entweder das Auslesen aus der SPS oder deine Bedienung zulässt.


Gruß, Marko


RE: Daten lesen/schreiben Vorrangproblem Variablen - jg - 26.05.2015 15:39

Natürlich wird - solange du dich im Timeout Case befindest - das Value Change Event nicht abgearbeitet, sondern nur in eine "Event-Queue" gespeichert.

Die Frage ist: Wie liest du den "New Value" nach dem Value-Change Event aus? Aus einer lokalen Variable oder dem Terminal? Das wäre falsch. Aber so geht es:
[attachment=53210]
[attachment=53211]
Gruß, Jens


RE: Daten lesen/schreiben Vorrangproblem Variablen - buettnerstefan - 26.05.2015 16:11

Vielen Dank für die schnellen Antworten!

@Marko: geht leider nicht, da schreiben und lesen gleichzeitig gehen muss.

@Jens: Das sieht schon vielversprechend aus, aber wie mach ich das bei 50 Werten mit dem new Value? Und mit der Sekunde verzögerung in der timeoutschleife komm ich dann leider auch nicht mehr auf meine 10 Messwerte die Sekunde..

Ich hab ja in meinem timeout-case die lesefunktion (aller 100ms) und schreibe direkt in die reinen Anzeigeelemente. Und für die Bedienelemente schreibe ich jetzt in eine "read-Variable" und mach für jedes Bedienelement ein value-change-case?? Also muss ich für jedes Bedienelement noch ein Anzeigeelement erstellen welches als read-Variable für dieses dient? Oder gibt es auch variablen ohne Frontpanel-element? Aber wenn ich diese Sekunde Verzögerung zum schreiben in das case packe macht meine Messwerterfassung ja solange auch Pause oder hab ich gerade einen Denkfehler?

So viele Fragen, ohjeGlas1


RE: Daten lesen/schreiben Vorrangproblem Variablen - jg - 26.05.2015 16:24

Der Time-Out 1 Sekunde in meinem Beispiel dient NUR dazu, um zu zeigen, dass es prinzipiell funktioniert. Das sollst du nicht übernehmen.

Die "Read"-Boolean repräsentiert deinen Modbus-Lesevorgang - inkl. Lesezeit (hier extrem verlängert auf 1 Sekunde).

Trotzdem wird im Value-Change-Case der Wert nach Value-Change aus dem "Eingabe"-Boolean ausgelesen, auch wenn die Event-Struktur gerade im Timeout festhängt und dadurch per lokaler Variable den Wert von "Eingabe" eigentlich wieder überschreibt.

Gruß, Jens


RE: Daten lesen/schreiben Vorrangproblem Variablen - buettnerstefan - 26.05.2015 16:42

Okay, ich glaube jetzt hab sogar ich es verstanden Big Grin

Also meinen timeout-case lasse ich wie er ist (die gelesenen Werte werden in locale variablen geschrieben) und nun lege ich für 50 event-cases an, jeweils mit dem zugehörigen Bedienelement drinnen und nutze zum schreiben aber den NewVal- Anschluss.
Vielen Dank!


BTW..gibt es auch noch eine Variante in der man ganz auf lokale Variablen (oder Eigenschaftsknoten) verzichten kann, weil die ja so schlecht sind und so..Hmm


RE: Daten lesen/schreiben Vorrangproblem Variablen - jg - 26.05.2015 21:48

Ob du wirklich 50 Cases brauchst, hängt von dir ab. Man kann natürlich auch mehrere Events in einem Event-Case zusammenfassen.

Um lokale Variablen wirst du bei deinem Ansatz nicht herumkommen, es ist nun mal neben PropertyNodes die einzige Möglichkeit, einem Control einen Wert zuzuweisen. Und in diesem Fall spricht nichts gegen lokale Variablen.

Gruß, Jens