' schrieb:Bei richtig eingesetzten Programmen möchte man meist auch nicht, dass diese sich bei einem Fehler beenden, sondern evtl. noch irgendein Ventil ansteuern, etwas drucklos schalten, einen Fehlerhinweis anzeigen o.ä.
Daher mein Rat: Fehler-Cluster bei Schleifen immer als Schieberegister ausführen.
hm, dein Einwand hat doch aber erstmal nichts mit dem SR zu tun, sondern spricht gegen das sofortige Programmende bei einem Fehler, also gegen die Verknüpfung des Fehlerstatus mit der Abbruchbedingung der While-Schleife?
Im VI ist immer noch Überflüssiges enthalten:
1) Bei Einzelwertausgabe ist kein besonderer Start erforderlich
2) Das Task-Zürücksetzen beinhaltet auch die Freigabe
3) Man muß nicht alle 100ms denselben Wert wieder ausgeben. Besser ist eine Ereignisbehandlung bei Wertänderung.
Fehlerbehandlung: Ich mache es so, daß bei einem Fehler in der Konfiguration gar nichts erst losgeht. Das Shift-Register ist hier Geschmackssache, darüber läßt sich streiten. Hier ist es überflüssig, da es nie wirksam wird: Im Fehlerfall wird die Schleife abgebrochen, es ist also Nonsens-Code. Zu meiner Programmierehre gehört es, solchen Code grundsätzlich zu vermeiden. Wer aber aus einem höheren metaphysischen Prinzip heraus dafür ist, soll das meinetwegen tun, es schadet ja nicht. Solche Winzigkeiten aber vom Resourcccenverbrauch (im Nanosekunden-oder Millibitbereich
) zu diskutieren hat keinerlei praktischen Wert - das ist nur heiße Luft.
[
attachment=29716]
Hi Lucki,
ersteinmal danke für deinen ausführlichen Beitrag!
Zum
SR: Sehe ich ein, das SR scheint in meinem Beispiel wirklich überflüssig zu sein, ein "einfacher" Tunnel reicht hier wohl. Vor ca. 8 Jahren hatte ich mal eine LabVIEW - Vorlesung gehört und ich konnte mich irgendwie daran erinnern, dass ich immer ein SR verwenden sollte, für's Error-handling, daher habe ich gar nicht groß darüber nachgedacht...
Zur
Einzelwertausgabe: Ich möchte
kontinuierlich einen bestimmten Spannungswert ausgeben und zwar solange bis ich einen anderen Wert einstelle. Daher scheint mir deine Variante nicht zu funktionieren, aber das kann ich ja nachher im Labor schnell ausprobieren
Zum
Taskbeenden: Ich wusste nicht, dass in dem Zurücksetzen auch die Freigabe enthalten ist, danke für die Info!
Zu den
100 ms: Die hatte ich dort stehen, um keine 100% Systemauslastung zu haben, was nicht der Fall ist, wenn ich die Schleife nur alle 100 ms ausführe. Deine Variante scheint mir deutlich eleganter (ich habe früher LV 6.0 benutzt und muss mich jetzt erstmal mit den "neuen" Sachen vertraut machen... ). Du hast an die Sanduhr links oben nichts angeschlossen, ich hätte erwartet, dass das bedeutet, das ständig auf neue Ereignisse hin überprüft wird und man somit wieder bei 100% Systemlast wäre. Interessanterweise ist das aber nicht der Fall, was ich nicht verstehe...
Ansonsten wundere ich mich, dass du die Schalter in die Ereignisschleifen gelegt hast: Angenommen man hat eine ganze Reihe von verschiedenen Ereignissen, dann hätte ich die Schalter alle außerhalb der Ereignisschleife positioniert. Spricht da irgendwas dagegen?
Die Case structure außen um die while-Schleife herum gefällt mir
Ohne die anderen Posts genau gelesen zu haben, hier ein Bsp. aus dem Examplefinder:
[
attachment=29765]
Gruß Markus
das ist aber ein Funktionsgenerator (wenn ich mich nicht täusche) und ich erzeuge mit meinem vi ja "nur" einen konstanten Spannungswert, ich will gar keinen Funktionsgenerator.
Das Bsp. kannst Du doch problemlos auf einen Wert abändern.
Gruß Markus
' schrieb:Zur Einzelwertausgabe: Ich möchte kontinuierlich einen bestimmten Spannungswert ausgeben und zwar solange bis ich einen anderen Wert einstelle. Daher scheint mir deine Variante nicht zu funktionieren, aber das kann ich ja nachher im Labor schnell ausprobieren
Wenn es sich um Impulse handeln würde, könnte ich den Einwand verstehen: Da gibt es einen klaren Unterschied zwischen Einzelausgabe und kontinuierlicher Ausgabe. Aber ein einmalig ausgegebener Spannungswert bleibt doch immer, also "kontinuierlich" stehen, da muß ich doch nicht dauernd die gleiche Anweisung wiederholen, um den Wert zu halten. (Das Problem ist hier eher, daß der Wert selbst nach Beenden von Labview noch stehen bleiben kann)