LabVIEWForum.de - While-Schleife sofort beenden ?

LabVIEWForum.de

Normale Version: While-Schleife sofort beenden ?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo zusammen,

Ich bin noch ein relativer Grünschnabel in Sache LabView Programmierung, daher stelle ich Euch vermutlich eine "blöde" Frage.

Zur Zeit bin ich an einer Steuerung dran, die etwas komplexer ist und auch mit motorisierten Bewegungen arbeitet. Den ganzen Ablauf habe ich in While-Schlaufen so gebunden, dass eine nach dem Anderen abgearbeitet wird. (Vermutlich ist dies in sic schon nicht ganz sauber.). Nun muss ich zwingend der Sicherheit zu liebe einen Not-Aus einbauen. Daher müsste ich wissen, wie man eine While-Schleife beenden kann, ohne die ganze Prozedur in der Schlaufe abzuarbeiten.

Meine Hoffnung ist, dass es eine einfache Variante gibt.

Könnt Ihr mir da weiter helfen ? Gerne auch mit einem Beispiel.

Vielen Dank im Voraus.
(03.10.2019 08:42 )RobertRoth schrieb: [ -> ]Daher müsste ich wissen, wie man eine While-Schleife beenden kann, ohne die ganze Prozedur in der Schlaufe abzuarbeiten.

Meine Hoffnung ist, dass es eine einfache Variante gibt.

Hallo Robert,

grundsätzlich gibt es in LabVIEW, wie in den meisten Programmiersprachen kopf- und fußgesteuerte Schleifen. Der ersten sagt man im vorhinein, wie oft sie etwas tun soll, der zweiten im nachhinein, ob sie etwas nochmal tun soll.
Den Abbruch mehrerer parallel laufender Schleifen kann man über lokale oder ggf. globale Flags oder eleganter über einen Melder realisieren. Wenn dein Problem nun aber nicht der Abbruch der Schleife(n) ist, sondern der Abbruch des in der Schleife laufenden Quellcodes, dann müsste man sich erstmal die Struktur dieses Quellcodes ansehen. Grundsätzlich könnte man in einer Parallel-Notaus-Schleife mit der EXIT-Funktion das gesamte Programm killen. Das wird aber nicht der gewünschte Effekt sein.
Für den Abbruch innerhalb einer abzuarbeitenden Prozedur müsstest du eben an bestimmten Prozedurpunkten eine Abbruchmöglichkeit schaffen. Deshalb wäre es dafür sinnvoll, die Abarbeitung in einer State-Machine zu realisieren.

Gruß, Marko
Danke Trinitatis für Deine schnelle Antwort.

Da ich wirklich Anfänger bin, habe ich nur die hälfte verstanden. Bitte entschuldige meine Unfähigkeit.

Ich komme eigentlich aus der Basic Programmierung. Und auch dies ist schon ne weile her. Daher habe ich auch das mit den Schlaufen verstanden. Quasi "For-Next" und "Whil-Wend" Schlaufen.

Nun arbeite ich mit While Schlaufen, da ich keine Argumente vorgängig definieren kann. Jede Schlaufe ansich wartet auf eine gewisse Erfüllung.

Mein Problem ist nun, dass ich z.B. in der einen Schleife einen Schrittmotor ansteure, der soll bis zu einem Endschalter fahren. Breche ich nun die Schleife ab, so geht das erst, wenn die Schleife ihre endbedingung erzielt hat, Endschalter gedrückt. Die Schleife sollte aber sofort beenden. (in einem weiteren Schritt kann ich den Motor dann stoppen, dies ist kein Thema.)

Dieses Problem zieht sich natürlich über mehrere Schleifen. Bricht die eine ab, sollen die anderen nicht mehr ausgeführt werden. Ich müsste also den Weg umleiten können.

Sorry, wenn ich die Fachwörter noch überhaupt nicht kenne. Bitte um Verständnis :-)

Grüessli
Robi...

P.S. Ein Beispiel würde mir vermutlich am meisten helfen. Danke...
(03.10.2019 14:21 )RobertRoth schrieb: [ -> ]Mein Problem ist nun, dass ich z.B. in der einen Schleife einen Schrittmotor ansteure, der soll bis zu einem Endschalter fahren. Breche ich nun die Schleife ab, so geht das erst, wenn die Schleife ihre endbedingung erzielt hat, Endschalter gedrückt. Die Schleife sollte aber sofort beenden. (in einem weiteren Schritt kann ich den Motor dann stoppen, dies ist kein Thema.)

Dieses Problem zieht sich natürlich über mehrere Schleifen. Bricht die eine ab, sollen die anderen nicht mehr ausgeführt werden. Ich müsste also den Weg umleiten können.

Hallo Robert,
das ist ja dann das von mir schon skizzierte und erwartete Problem. Ich nehme an, du "sagst" dem Schrittmotor, fahre zu Position 100.000 und pollst dann mit Hilfe einer Ist-Positionsanfrage, ob er schon da ist. Zumindest solltest du das so tun und nicht eine Totzeit abwarten, nach der er wahrscheinlich da ist. Wenn du das so machst, könntest du ja in deiner NotAus-Schleife ein Stopkommando senden. Wenn du aber nur auf den Endschalter wartest, dann hast du ja keine Info über die Istposition - dann bleibt dir ja nur, mit einem Stop-Kommando dazwischenzuhacken...

In jedem Fall musst du eine abzuarbeitende Prozedur in abbrechbare Stücke zerhacken. Wenn ich beispielsweise ein Programm dazu bringen will, dass es 60s wartet, dann setze ich keine 60000 an die Wait-Funktion, sondern lasse das Programm in einer Schleife von 100-200ms - Waits warten, die ich jederzeit abbrechen könnte.
Die nachfolgenden Programmschritte kannst du dann mit Hilfe der NotAus-Info umgehen - dazu eignet sich eben die Statemachine besonders gut.


Gruß, Marko
Guten Morgen Trinitatis

Vielen Dank für Deine Antwort.
Einerseits bin ich etwas endtäuscht, dass es offensichtlich keinen sofortigen Ausstieg aus einer While-Schleife gibt. Andereseits ist die Lösung mit dem Stückeln auf 100-200 ms eine geniale idee.

Ich werde es versuchen, ob ich dies hinkriege und werde dann wieder eine Rückmeldung bringen.

Noch mals herzlichen Dank und schönes Wochenende.

Grüessli
Robi...
Hallo Robert,

Zitat:Ich komme eigentlich aus der Basic Programmierung.
Einerseits bin ich etwas endtäuscht, dass es offensichtlich keinen sofortigen Ausstieg aus einer While-Schleife gibt.
Wie genau würde sowas denn in BASIC aussehen?

Andererseits: schau dir mal die Links in meiner Signatur an unf mache dich mit dem DATAFLOW vertraut. (Der ist in LabVIEW wichtig!)

Zitat:Den ganzen Ablauf habe ich in While-Schlaufen so gebunden, dass eine nach dem Anderen abgearbeitet wird. (Vermutlich ist dies in sic schon nicht ganz sauber.).
Ja, das hört sich unsauber an.
Warum verwendest du keine Statemachine?
Sali GerdW

In Basic kannst Du mit einem GoTo oder GoSub befehl einfach aus der While-Schlaufe raus springen.

Du musst mich entschuldigen, ich bin in LabView wirklich anfänger und soll nun schon eine Steuerung programmieren. Nun, ja, ich bin etwas überfordert und daher um so dankbarer, dass es dieses Forum gibt.

Statemachine werde ich gleich mal schauen, was ich alles darüber rausfinde.


Vorläufig mal liebe Grüsse und bis bald...
Robi...
Hallo Robert,


Zitat:In Basic kannst Du mit einem GoTo oder GoSub befehl einfach aus der While-Schlaufe raus springen.
Ein GoSUB springt nicht "irgendwie aus der Schleife raus", sondern ruft eine Funktion auf und kehrt exakt zum Aufrufort zurück!
(In LabVIEW entspricht das dem simplen Aufruf eines subVIs…)

Ein GOTO erzeugt Spaghetti-Code. sowas ist mittlerweile (aka seit Jahrzehnten!) verpönt.

Wie wäre sowas in BASIC:
Code:
WHILE
  IF x THEN
   do something
  ELSE
   do nothing
  ENDIF
WEND
Und wie würde das in LabVIEW aussehen? (Und wie knapp wärst du damit vor einer Statemachine?)

(Auch ich habe mal mit BASIC angefangen und ca. 5 Jahre damit gearbeitet. Und ja, ich habe damals auch GOTO verwendet. Aber ein GOTO in einer Schleife (mit dem Zweck aus der Schleife zu entschwinden) war IMMER in ein IF-THEN-ELSE eingebettet! Und ein GOTO-Befehl befreit dich auch nicht von der Aufgabe, vor dem eigentlichen Programmieren dir erst einmal einen Algorithmus zu überlegen und (vorzugsweise auf Papier) zu skizzieren!)

Edit:
Du hast noch kein einziges VI angehängt: worüber reden wir hier eigentlich?

Zitat:Du musst mich entschuldigen, ich bin in LabView wirklich anfänger und soll nun schon eine Steuerung programmieren.
Man überträgt dir eine (Programmier-)Aufgabe und gibt dir keine Zeit, die Programmiersprache erst einmal zu erlernen?
Du übernimmst eine (Programmier-)Aufgabe, ohne die Programmierumgebung zu kennen (oder eine dir bekannte Programmierumgebung zu wählen)?
Ich weiß nicht, was ich hier entschuldigen soll… Hmm
Hallo! vl nicht direkt zum Thema passend.. aber..
... habe gelesen das du mit Labview deine ersten Erfahrungen sammeln darfst Big Grin

Zu deinen Fragen: wie Gerd schon geschrieben hat, findest du hier im Forum zu unterschiedlichen Themengebieten Hilfe (siehe seine Signatur)

Weiters findest du auch gute Hilfe auf Youtube direkt von NI.. einfach deine Themen eingeben Wink
In Labview gibt es im Reiter Help - Find Examples eine recht umfangreiche Beispielbibliothek.

In der Stelle würd ich mich zu Beginn mit folgenden Themen beschäftigen:
-> Datenfluss in Labview!!
-Schleifen While /for/Case Struktur - und vor allem was die Unterschiede bei den Ausgängen sind ( Schieberegister , letzter Wert usw. )
indizierte Array - Eingänge damit du automatisch ein Array auslesen kannst, auch wenn du die genaue Anzahl der Elemente nicht kennst.
-> über die Schleifen und Schieberegister kannst du recht einfach einen Zustandsautomaten programmieren ( für diesen Strings oder besser Enum Konstanten mit "sprechenden Namen" verwenden)
-> gewöhne dir bei den Schleifen an, diese auch immer Gleich zu beschriften.. damit den Programm lesbar bleibt-

aufbauend darauf: Zustandsautomat mit einer Ereignisstruktur
darauf wieder aufbauend: Queued State machine ( Zustandsautomat mit Queues)

-Ergeinisstrukturen (Um auf konkrete Benutzereingaben vom Frontpanel reagieren zu können)
-Typdefinition (Damit du bei mehrfacher Verwendung deiner Elemente auch deren Eigenschaften mit vererbst)
-Sub-VIs (inkl Doku) -> damit dein Programm übersichtlich bleibt.
-Error Handling

Würde mir am Anfang auch gut überlegen welchen Programmaufbau du verwenden möchtest..

Ja ich persönlich finde die Unterlagen vom CLAD Zertifizierungskurs ( einfach auf der Homepage eingeben ) recht hilfreich!

Bei weiteren Fragen, melde dich einfach!

LG Stefan
Danke viel mals für Eure Antworten

GerdW, ich bin schon davon ausgegangen, dass in Basic in einer While-Schlaufe nicht ein nackter GoTo Befehl kommt. Aber dies ist ja nicht das Thema.
Zur Vorbereitung habe ich mir ein Anlaufdiagram erstellt. Da ich Anfänger bin, ist dies aber relativ dürftig ausgefallen aber in den Grundzügen korrekt.

Mein vi, RSM-New-01 hab ich nun mal drangehängt. Bitte spottet nicht all zu viel über meine Fehler ;-)

@stefan1312
Danke Dir für Deine Tips. Ich habe nun schon viel gelesen über die Programierung von LV, habe aber immer Bahnhof, da ich mir unter den meisten Grundbegriffen schon nicht wirklich was vorstellen kann. Ich bin aber dran und gebe mir Mühe, dies alles zu lernen. Ich habe auch das Gefühl, dass ich, trotz meines Unwissens, schon viel dazu gelernt habe.

Ich freue mich auf weitere Unterstützung und danke Euch dafür.

Grüessli,
Robi...

EDIT:
Im Angehänhten vi seht Ihr auch schon meinen Versuch der Not-Aus-Linie...
Seiten: 1 2
Referenz-URLs