Automatische Messung beim Sensorausfall & zur bestimmten Zeit
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!
Automatische Messung beim Sensorausfall & zur bestimmten Zeit
' schrieb:Hier zuerst zwei Anmerkungen.
Du hast außerhalb der vier Haupt-While-Schleifen zwei lokale Variablen von "Programm Stop", die du nach Beendigung der entsprechenden While-Schleife auf false setzt. Das False-Setzen machst du deshalb, damit beim nächsten Programmstart die Variable auf False steht - und die vier While-Schleifen nicht wieder abbrechen. Der Gedanke ist richtig, das Vorgehen falsch. Du darfst das False-Setzen erst dann machen, wenn alle vier Haupt-While-Schleifen beendet sind (das hängt mit der parallelen Verarbeitung zusammen).
Mach das False-Setzen wie folgt: Ganz links platzierst du einen Sequenzrahmen, in dem du das False-Setzen machst. Danach seqenzierst du die vier While-Schleifen mit dem Sequenzrahmen. Einfach dadurch, indem du den boolschen Wire aus dem Rahmen herausführst und an alle vier While-Schleifen hinklickst. Dadurch wird eine Sequenzierung erreicht zwischen dem False-Setzen und dem Beginn der While-Schleifen, die dann eben erst beginnen, wenn "Programm Stop" false ist.
Ich gehe davon aus, dass die Variable "Messwerte speichern" nach der einen Minute, während der gespeichert werden soll, automatisch auf False gesetzt wird. Das ist Voraussetzung für das weitere Vorgehen.
Jetzt zu deinem "automatischen Speichern alle Stunde oder zu einer bestimmten Uhrzeit". Das geht ganz einfach - auch ohne Statemachine.
Mach eine fünfte While-Schleife, in der du einfach eine Stunde wartest. Danach setzt du die Variable "Messung speichern" auf true. Und wartest wieder eine Stunde. usw. Die Variable "Messung speichern" wird ja automatisch - siehe oben - wieder zurückgesetzt. Das Eine-Stunde-Warten muss du aber aufteilen in z.B. 36000 mal 100ms. Es wird also 100ms gewartet, dann ein Zähler hochgezählt (bessert: runten), bei 36000 (also 0) wird die Variable "Messung speichern" auf true gesetzt und der Zähler resettet.
Hallo IchSelbst,
danke für deine Hinweise,
ich hab hier was fertig gemacht. bzg. Programm Stoppen, hast du so gemeint ? oder hab ich falsch verstanden ? so muss ich aber 2 mal auf dem Stopp knopf auf dem FP drücken. damit das programm vollständig gestoppt wird!
zum punkt 1 minute speichern, hab ich auch was zusammen gebastelt, soweit funktioniert gut!!!! siehe Screenshot aber wie geht das mit der Statemachine so eine aufgabe ? hab ich paar versuche gehabt aber fehlgeschlagen!!
zum punk 2 messung nach einer bestimmter zeit speichern bin ich noch dabei. aber irgendwie hab ich nicht richtig verstanden wie du es gemeint hast. kannst du noch bitte paar wörter dazu sagen
beste Grüße,
Amir
Coming together is a beginning, keeping together is progress, working together is success.
Automatische Messung beim Sensorausfall & zur bestimmten Zeit
' schrieb:hast du so gemeint ?
Ja, aber: In den Sequenzrahmen muss die Variable "Programm Stoppen" mit rein. Die soll nämlich dort zu Beginn des Programmes gelöscht werden. Die beiden Variablen, von denen ich oben geschreiben habe, und die du nach einer While-Schleife auf False gesetzt hast, müssen natürlich weg.
Außerdem: Das neue (linke) Bild ist anderes, als das ursprüngliche Bild. Auf dem neuen Bild befinden sich die vier (Haupt-)While-Schleifen innerhalb einer weiteren While-Schleife, um die auch noch eine Case-Sequenz ist.
Zitat:so muss ich aber 2 mal auf dem Stopp knopf auf dem FP drücken. damit das programm vollständig gestoppt wird!
Dann sind die beiden lokalen variablen, die nach einer While-Schleife auf False gesetzt werden, noch im Programm.
Zitat:aber wie geht das mit der Statemachine so eine aufgabe ?
Eine einzelne Aufgabe wie z.B. das Feststellen, ob eine Minute um ist, macht man nicht in einer Statemachine. Das lässt du besser so wie es ist.
Zitat:zum punk 2 messung nach einer bestimmter zeit speichern bin ich noch dabei. aber irgendwie hab ich nicht richtig verstanden wie du es gemeint hast. kannst du noch bitte paar wörter dazu sagen
Mach eine weitere While-Schleife. Die While-Schleife läuft mit einem Raster von 100ms. In der While-Schleife befindet sich eine (ganz kleine) Statemachine. State1: Zähler auf 36000 setzen. State2: DownCount, Counter>0 => Weiter State2, sonst State3. State3: Lokale Variable "Messung speichern" auf true setzen, Weiter bei State1. Ich mach dir hierzu heute abend ein Beispiel.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Automatische Messung beim Sensorausfall & zur bestimmten Zeit
Ich hab das zweite Bild vergessen.
Oh, ganz böse Fehler im zweiten Bild!
Du denkst strukturiert. Das ist in LV falsch. Hier musst du im Datenfluß-Modell denken.
Das Feststellen, ob 1 Minute um ist, und das Löschen der Variablen "Messung speichern" ist an sich so in Ordnung - nur die tatsächliche Ausführung ist nicht in Ordnung. Du hast vom Anzeigeelement "Messzeit" eine lokale Variable gemacht und vergleichst die mit 60. Das Verwenden einer lokalen Variablen führt hier aber zu sogenannten Race-Conditions! Lass die lokale Variable einfach weg und verbinde den Eingang am Vergleicher mit dem Wire, der in das Anzeigeelement "Messzeit" hineingeht (respektive der aus dem Geteiltdurch heraus kommt).
Genau das selbe gilt für die Variable "Messdaten speichern" am Eingang des UND-Elementes. Lass die lokale Variable einfach weg und verbinde den Eingang des UND mit dem Wire, der vom Bedienelement "Messung speichern" herauskommt.
So wie du das programmiert hast, kann es richtig gehen. Es muss nicht zwangsläufig zu einem Fehler führen. Aber es kann einen Fehler geben. Machst du alles mit Datenfluß, kann es nicht zu einem Fehler kommen - garantiert.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Automatische Messung beim Sensorausfall & zur bestimmten Zeit
' schrieb:Ich hab das zweite Bild vergessen.
Oh, ganz böse Fehler im zweiten Bild!
Du denkst strukturiert. Das ist in LV falsch. Hier musst du im Datenfluß-Modell denken.
Das Feststellen, ob 1 Minute um ist, und das Löschen der Variablen "Messung speichern" ist an sich so in Ordnung - nur die tatsächliche Ausführung ist nicht in Ordnung. Du hast vom Anzeigeelement "Messzeit" eine lokale Variable gemacht und vergleichst die mit 60. Das Verwenden einer lokalen Variablen führt hier aber zu sogenannten Race-Conditions! Lass die lokale Variable einfach weg und verbinde den Eingang am Vergleicher mit dem Wire, der in das Anzeigeelement "Messzeit" hineingeht (respektive der aus dem Geteiltdurch heraus kommt).
Genau das selbe gilt für die Variable "Messdaten speichern" am Eingang des UND-Elementes. Lass die lokale Variable einfach weg und verbinde den Eingang des UND mit dem Wire, der vom Bedienelement "Messung speichern" herauskommt.
So wie du das programmiert hast, kann es richtig gehen. Es muss nicht zwangsläufig zu einem Fehler führen. Aber es kann einen Fehler geben. Machst du alles mit Datenfluß, kann es nicht zu einem Fehler kommen - garantiert.
vielen Dank. :-)
zu deinem Beitrag oben, das ist das fast das selbe Bild. Nun hab ich im ersten Beitrag das bild vereinfacht und ein teil davon hier gestellt.!!
ich hab in meinem programm insgesamt 10 Parallele grosse While Schleifen mit jeweilige unterschleifen.. !! (davon eine Hauptschleife zum Daten Lesen Von DAQ, in dem 3 unterSchleifen sind (DI. AI. von DAQ input und Daten speichern. mit Case in einer unterschleife, was du auch gesagt hast.)
Dann eine Parallele schleife zu dieser grossen Schleife heisst Daten Lesen. Den Rest sind wieder parallel zu dieser 2 grossen schleifen.! Die laufen alle parallel, und sind nur für daten darstellung zuständig! (Die sind mit boolische Var. gebunden im Case struktur mit wartezeit, und werden als POP UP fenster ausgeführt wenn man auf dem FP darauf klickt. ich hab die im ersten beitrag nur 2 davon und den rest weggelassen, weil die ähnliche Funktion haben!!
Für mich gehts nur um die Hauptschleife , wo die daten eingelesen werden und weiterverarbeitet und gespeichert werden (In 3 unterschleifen (analog DAQ Lesen unterschleife, Digital DAQ lesen unterschleife, und daten verarbeiten und speichern unterschleife mit case struktur zum speichern! (im erstem beitragsbild!ganz oben) Die ganze grosse Hauptschleife mit Case um die allen 3 schleifen ist nur da, damit ich einem knopf noch die Messung starten kann.
Ich danke nochmal für deine Hilfe, freue mich auf dein Hiweis VI heute Abend! für die Speicherung in einer bestimmten Zeit.
ich habs nochmal mit dem Sequenz probiert, aber irgendwie ist beim Programm beenden langsam! als ob die schleife noch läuft,..vielleicht mach ich da falsch. hab einfach Programm Stopp buttom drin mit False gebunden und weiter zu alle anderen schleifen gebunden, aber irgedwie geht nicht richtig..
Coming together is a beginning, keeping together is progress, working together is success.
Automatische Messung beim Sensorausfall & zur bestimmten Zeit
' schrieb:ich hab in meinem programm insgesamt 10 Parallele grosse While Schleifen mit jeweilige unterschleifen.. !!
Das ist ganz schlecht. Nicht für das Programm selbst. Aber für die Pflege des Programms. Und für spätere Änderungen.
Eigentlich muss ich sagen: Das musst du alles neu machen. Hier muss ein ganz anderes Konzept her. Man kann in einem solchen Falle wie folgt vorgehen: Wenn man eine kleine Änderung machen will, kann man den Teil, den die Änderung betrifft, richtig machen.
Mach jetzt aber erst mal so weiter, bis das Programm fertig ist.
Zitat:Den Rest sind wieder parallel zu dieser 2 grossen schleifen.! Die laufen alle parallel, und sind nur für daten darstellung zuständig!
Solche While-Schleifen würde man in ein SubVI auslagern können. Die Daten würden dann per Queue/Melder übergeben werden.
1
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).