Hallo an Alle,
ich messe verschiedenen Sensoren anhand DAQ. und werte die aus. Bei der überschreitung von einem bestimmten wert (z.b. 5V) sollte ein Sensoraufall fehler realisiert werden. das habe ich mit boolische funktionen für jedes sensor individuell bestimmt. (Dynamic Data zur Double umgewandelt und ein Vergleich mit einem Wert gemacht, falls True, dann gibt 1 aus, und der Alarm blinkt.)
ich hab auch eine Messung speichern funktion ( mit Express VI Messdaten speichern) in einem Case Struktur gepakt. mit Boolian verbunden. Wenn auf FP auf dem knopf messung speichern gedrückt wird, wird Case Struktur ausgeführt, und messung gespeichert.
soweit gut.
1. ich will dass bei einem sensorausfall ( bestimmter wert über..) automatisch für 60 Sec. die messdaten gespeichert werden. wie kann ich das realisieren? mit boolische funktionen kann ich nur 2 werte miteinander vergleichen. dabei hab ich viele sensoren, wie kann das am besten realisieren?
2. zur einer bestimmt zeit eine automatische messung für 60 Sec. durchführen. z.b. alle 2 stunden oder um 12 uhr mittag und nacht. ich bin in diesem punkt gar nicht weiter gekommen. hat jemand vielleicht dazu ein block? die zeit, wo die messung anfägt und aufhört will ich auch dokumentieren. aber wie?
danke euch.
Prince.
Hallo nochmal,
zum punkt 1. hab die boolische vergleichblock gefunden, die für mehrere variable geeignet ist.
punkt 2. hab immer noch keine idee :-( hat jemand vielleicht ein fertiges block oder so ? scheint eine allgemeine frage zu sein.
Grüße,
' schrieb:scheint eine allgemeine frage zu sein.
Hast du dich schon mal mit Statemachine auseinandergesetzt?
Erster Schritt: Warten, bis Zeitänderung um oder bis Zeitpunkt erreicht. Gewartet wird im Raster von 100ms - damit die Statemaschine abbrechbar ist. Dieser Schritt besteht aus mehreren States.
...
' schrieb:Hast du dich schon mal mit Statemachine auseinandergesetzt?
Erster Schritt: Warten, bis Zeitänderung um oder bis Zeitpunkt erreicht. Gewartet wird im Raster von 100ms - damit die Statemaschine abbrechbar ist. Dieser Schritt besteht aus mehreren States.
...
hm..da wirds ja richtig kompliziert. irgendwie statemachine passt zu meinem programmaufbau nicht! hab damit igendwie versucht, aber nicht funkioniert. gibts andere einfachere lösungen ?
' schrieb:irgendwie statemachine passt zu meinem programmaufbau nicht!
Das State-Machine-Konzept passt bei 99.5% aller Anwendungen...und grade bei dir nicht?
' schrieb:irgendwie statemachine passt zu meinem programmaufbau nicht!
Das hat ja noch keiner gesagt! Naja, irgendwann ist immer das erste Mal.
Lieber Prince Amir
Wie sag ich's meinem Kinde? Was? Was der Achim ja schon angedeutet hat.
Das Konzept "Statemachine" ist ein grundlegendes Konzept. Als Konzept ist es programmiersprachen-unabhängig. Gerade LV ist hervorragend geeignet, dieses Konzept umzusetzen. Die Verwendung von Statemachines für professionelle Programme ist unabdingbar. Und jedes Programm, das Messwerte erfasst, berechnet, anzeigt und speichert und das auch noch selbständig über einen größeren Zeitraum ist per se ein professionelles Programm. Den Fall, dass eine Statemachine nicht in ein Programm integriert werden kann, gibt es nicht.
So, und jetzt zu deiner Aufgabe.
Natürlich ist auch in dein Programm eine Statemachine integrierbar. Ich vermute mal, das Problem liegt nicht an deinem Programm, sondern an deinen Programmierkenntnissen, die du mit Hilfe des Forums ja verbessern willst.
Die Statemachine muss nicht zwangsläufig in deinen bestehenden Datenfluß integriert werden. Sie kann auch in einer extra While-Schleife laufen und den bestehenden Datenfluß mittels Queues und/oder Melder (naja, ausnahmsweise erlauben wird auch globale und lokale Variablen) quasi fernsteuern.
Ich würde vorschlagen, zu postet mal ein VI und schreibst dazu, wo genau das mit der Wartezeit und das mit dem Messen für 60 Sekunden gemacht werden soll. Oder mach ein Bild.
' schrieb:Das hat ja noch keiner gesagt! Naja, irgendwann ist immer das erste Mal.
Lieber Prince Amir
Wie sag ich's meinem Kinde? Was? Was der Achim ja schon angedeutet hat.
Das Konzept "Statemachine" ist ein grundlegendes Konzept. Als Konzept ist es programmiersprachen-unabhängig. Gerade LV ist hervorragend geeignet, dieses Konzept umzusetzen. Die Verwendung von Statemachines für professionelle Programme ist unabdingbar. Und jedes Programm, das Messwerte erfasst, berechnet, anzeigt und speichert und das auch noch selbständig über einen größeren Zeitraum ist per se ein professionelles Programm. Den Fall, dass eine Statemachine nicht in ein Programm integriert werden kann, gibt es nicht.
So, und jetzt zu deiner Aufgabe.
Natürlich ist auch in dein Programm eine Statemachine integrierbar. Ich vermute mal, das Problem liegt nicht an deinem Programm, sondern an deinen Programmierkenntnissen, die du mit Hilfe des Forums ja verbessern willst.
Die Statemachine muss nicht zwangsläufig in deinen bestehenden Datenfluß integriert werden. Sie kann auch in einer extra While-Schleife laufen und den bestehenden Datenfluß mittels Queues und/oder Melder (naja, ausnahmsweise erlauben wird auch globale und lokale Variablen) quasi fernsteuern.
Ich würde vorschlagen, zu postet mal ein VI und schreibst dazu, wo genau das mit der Wartezeit und das mit dem Messen für 60 Sekunden gemacht werden soll. Oder mach ein Bild.
Lieber IchSelbst,
vielen Dank für deine Antwort. Ich hab hier auf jeden Fall viel gelernt, und dadurch viel weitergekommen und meine Kenntnisse erweitert. Nun hab ich mit State Machine zu kämpfen.
bin irgendwie nicht damit weitergekommen, obwohl ich paar bsps. hier im Forum gesehen habe, aber als ich implementiert habe, hat das ganze programm nicht funktioniert.
ich hab meine kommentare und wo, was passieren sollte im programm als Txt. geschrieben. Wenn man VI öffnet sieht man das.
1. Wo soll ich genau im meinem VI die S.M. verwenden ?
2. Brauch ich da Event Struktur in der S.M oder nicht?
kannst du bitte mein VI anschauen, und mir Tipps geben, wie ich am besten vorgehen soll, damit ich später bei der weiteren Erweiterung nicht an der Grenzen stöße,
besten Dank.
Amir.
L.V Version 8.6 DE
' schrieb:1. Wo soll ich genau im meinem VI die S.M. verwenden ?
VIs kann ich gerade nicht ansehen, weil ich hier am Rechner kein LV habe.
Zitat:2. Brauch ich da Event Struktur in der S.M oder nicht?
In einer Statemachine eine Eventstruktur? Nein, erstmal nicht!
Ich müsste da erst mal drüber nachdenken. Das Problem dabei ist: Was passiert, wenn der Event nicht eintritt? Dann muss der TimeOut-Case verwendet werden, da sonst die SM stehen bleibt. Bei Verwendung einer Eventstruktur innerhalb einer Statemachine sehe ich viele Schwierigkeiten.
Zitat:kannst du bitte mein VI anschauen
Leider erst heute abend. Kannst du ein Bild machen? Vielleicht geht's damit auch.
Zitat:damit ich später bei der weiteren Erweiterung nicht an der Grenzen stöße
Und genau wegen solcher Aspekte sollte man vor vorne herein nach Möglichkeit "anständig" programmieren.
' schrieb:VIs kann ich gerade nicht ansehen, weil ich hier am Rechner kein LV habe.
In einer Statemachine eine Eventstruktur? Nein, erstmal nicht!
Ich müsste da erst mal drüber nachdenken. Das Problem dabei ist: Was passiert, wenn der Event nicht eintritt? Dann muss der TimeOut-Case verwendet werden, da sonst die SM stehen bleibt. Bei Verwendung einer Eventstruktur innerhalb einer Statemachine sehe ich viele Schwierigkeiten.
Leider erst heute abend. Kannst du ein Bild machen? Vielleicht geht's damit auch.
Und genau wegen solcher Aspekte sollte man vor vorne herein nach Möglichkeit "anständig" programmieren.
So, hier hab ich 2 Screenshots gemacht.
jetzt kanns du öffnen.
Grüße,
P.S. in dem Case Messwerte Speichern, Beim True, werden die Messwerte in Express VI gespeichert, und die zeit gemessen. Im Screenshot sieht man nur False Case.
' schrieb:So, hier hab ich 2 Screenshots gemacht.
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.