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!
Hi,
Sorry dass ich gerade nicht alle deine Fragen beantworten kann aber ich kann den Rechner mit LabVIEW nur in bestimmte Zeiten benutzen. Deshalb Versuche ich direkt auf das Wesentliche zu gehe.
Also so weit habe ich es geschafft. Wie soll ich 'alle anderen commands' definieren um alle Befehle nach einander in der Steuerung zu schreiben?
Zitat:Und wenn ich es erweitere kommt so was vor...
Warum machst du auch aus dem 1D-Array (eine Liste/ein Vektor mit Befehlen) ein 3D-Array? Was soll das bringen?
Mit erweitern meinte ich: einfach das Array nach unten aufziehen, sodass mehr Elemente sichtbar sind…
ich bin ganz von vorne angefangen und deine erste Tipp gefolgten und zwar ein Zustandsautomat zu erstellen.
Den habe ich auch gemacht und funktioniert teilweise. Also es gibt noch ein paar Sachen die ich noch nicht hinbekommen kann und die beschreibe ich in folgenden Text.
Wie soll das Programm funktionieren:
1. Initialisierung von X und Z Achsen:
Der Schrittmotor fährt den Wagen nach links bis zum Endschalter. Wenn der Endschalter gedrückt ist hört Case Init X1/2 auf und springt zum Init X2/2. Im Init X2/2 wird der den Wagen in Gegenrichtung also nach rechts bewegt, um einen Reset der Positionsfehler des Motors zu erreichen. Also jetzt ist der Endschalter nicht mehr gedrückt und X Achse ist auf 0 positioniert.
Selbe Vorgang passiert für Z Achse auch.
2. Abtasten XZ:
Richtung und Schrittweite "Abtaste X" = Richtung und Schrittweite "Abtaste X2"= s47, links(d0)
Richtung "Abtaste Z - links"= links(d0)
Richtung "Abtaste Z - rechts"= rechts(d1)------- Schrittweite für beide = s47
2.1 Funktionsweise:
a) "Abtaste X" bewegt sich um eine Schritt und eine Wiederholung--> "Abtaste Z - links"
b)"Abtaste Z - links", macht 150 Wiederholungen(W150)--> "Abtaste X2"
c) "Abtaste X" bewegt sich um eine Schritt und eine Wiederholung--> "Abtaste Z - rechts"
d) "Abtaste Z - rechts" = "Abtaste Z - links" aber Richtungsumkehr--> "Abtaste X"
Ich habe bei "Abtaste X" und "Abtaste X2" einen Timer von 10000ms eingestellt damit der Motor erst mit "Abtaste Z-links/rechts" fertig ist und dann mit "Abtaste X/X2" anfängt ansonsten überschreibt die
Steuerung die Befehle und X startet bevor Z fertig ist.
Meine Ziel:
1.Wenn Punkt 2 ausgeführt wird und einer von der Endschalter gedrückt wird muss das Programm sofort beendet werden. Weil in meinen Fall endet der Case aber der nächste wird gleich gestartet. Einen Befehl mit dem die Steuerung zurück gibt, dass der Schalter gedrückt ist, finde ich nicht. Also wie kann ich das realisieren?
2. Bei drücken auf "Abbrechen" oder "Stop" stop soll das Programm auch beendet werden.
3. Punkt 2 "Abtasten XZ" soll 50 mal durchlaufen und dann aufhören. Hier habe ich mit Schleifen usw probiert und trotzdem komme ich nicht zum Erfolg.
Was werden Sie mich raten um meine Ziele erfüllen zu können?
Vielen Dank!
P.S. Entschuldigung für die Schreib- und Grammatikfehler, ich bin Austauschstudent und ich schreibe nur meine Bachelor-arbeit in DE.
Zitat:1.Wenn Punkt 2 ausgeführt wird und einer von der Endschalter gedrückt wird muss das Programm sofort beendet werden. Weil in meinen Fall endet der Case aber der nächste wird gleich gestartet. Einen Befehl mit dem die Steuerung zurück gibt, dass der Schalter gedrückt ist, finde ich nicht. Also wie kann ich das realisieren?
Wenn dein Programm auf diesen Endschalter reagieren soll, dann musst du ihn auch abfragen.
Entweder deine Motorsteuerung bietet dir eine Möglichkeit, diesen Status abzufragen - oder du musst dir mit einer eigenen DAQ-Hardware helfen…
Zitat:2. Bei drücken auf "Abbrechen" oder "Stop" stop soll das Programm auch beendet werden.
Dann musst du diese Buttons auch in jedem State abfragen.
Oder du stellst sicher, dass die einzelnen States nur sehr kurz dauern, dann kannst du die Buttons natürlich nach jedem State abfragen…
Zitat:3. Punkt 2 "Abtasten XZ" soll 50 mal durchlaufen und dann aufhören. Hier habe ich mit Schleifen usw probiert und trotzdem komme ich nicht zum Erfolg.
Dann musst du dir ein zusätzliches Schieberegister anlegen, in dem dann ein Zähler verwaltet wird.
Wenn der Button "Abtasten XZ" geklickt wird, wird der Zähler auf 50 gesetzt. Jeder Aufruf von "Abtaste X" dekrementiert diesen Zähler. Wenn der Zähler "Null" erreicht, wird der erneute Aufruf von "Abtaste X" abgebrochen…
Das sind alles Bedingungen, mit denen du entscheidest, welcher State als nächstes aufgerufen wird. Man kann durchaus mehrere Bedingungen abfragen und daraus Entscheidungen generieren…
Für die erste Frage mit den Endschalter habe ich eine HW-Lösung gefunden
Für die zweite habe ich meine Teil-Lösung angehängt "Zustandsautomat_stop". Das Problem hier ist wenn ich der Motor Stoppen will , muss ich das Kommando "S" schicken und nach meine Versuche kann die Steuerung das nicht leisten. Also wenn der Motor schon gestartet ist und ich den Befehl S eingebe, ist das Programm schon bei Motor2. Zum Beispiel ich bin bei "Abtaste X", der Motor startet und dann sofort werden die Befehle an Motor2 also Vorgang "Abtaste Z - links" gestartet und keine Befehle mehr zum Motor1 kommen. Solche können gesendet werden,erst nach den die Befehle für Motor2 gesendet worden sind. Deshalb sehe ich keine Möglichkeit wie man das realisieren kann.
Für die dritte Frage finde ich keine Lösung....
Ich habe es so versucht: Schieberegister für die for-Schleife "Abtaste X" erstellt, dann ein Indikator am Ausgangsregister und ich möchte dieses Wert wieder am Anfang eingeben. Und dann es vergleichen (z.B. bei 50 Durchgänge: Eingangswert > 50 T/F?) und dann weiter auswählen welche Case ausgeführt wird. So einen vergleich wie in den "Zustandsautomat_stop".
Weil so wie du es beschrieben hast, verstehe ich gar nicht von wo ich anfangen soll
30.09.2018, 17:48 (Dieser Beitrag wurde zuletzt bearbeitet: 30.09.2018 17:50 von GerdW.)
Zitat:Zum Beispiel ich bin bei "Abtaste X", der Motor startet und dann sofort werden die Befehle an Motor2 also Vorgang "Abtaste Z - links" gestartet und keine Befehle mehr zum Motor1 kommen. Solche können gesendet werden,erst nach den die Befehle für Motor2 gesendet worden sind. Deshalb sehe ich keine Möglichkeit wie man das realisieren kann.
Das ist so, weil DU es so programmiert hast!
Niemand schreibt dir vor, wie du von "Abtaste X" zu "Abtaste Z" kommst: du musst nicht direkt in den nächsten State wechseln!
Wenn man wichtige Bedingungen prüfen will, kann man dies bei JEDEM Statewechsel tun, z.B. nach der Case-Struktur, bevor man die nächste Iteration startet…
Man kann auch, mit entsprechend vielen Bedingungen, mehr als nur 2 mögliche States als nächsten wählen.
Zitat:Für die dritte Frage finde ich keine Lösung....
Ich habe es so versucht: Schieberegister für die for-Schleife "Abtaste X" erstellt, dann ein Indikator am Ausgangsregister und ich möchte dieses Wert wieder am Anfang eingeben. Und dann es vergleichen (z.B. bei 50 Durchgänge: Eingangswert > 50 T/F?) und dann weiter auswählen welche Case ausgeführt wird. So einen vergleich wie in den "Zustandsautomat_stop".
Wenn du das Schieberegister an der äußeren While-Loop anlegst, dann hast du IN JEDEM State Zugriff auf die darin enthaltenen Daten.
Tipp:
Einen State durchverdrahten, dann auf den Ausgangstunnel einen Rechtsklick und diesen Tunnel als "Linked Tunnel" festlegen: es werden automatisch auch alle anderen States durchverdrahtet. Dann nur noch die "interessanten" States, die diesen Draht mit seinen Daten benötigen, editieren…
Hallo GerdW, ich habe für eine Weile das Programm gelassen...
Jetzt bin ich wieder dran und ich habe die gewünschte Funktionalität erreicht. Es ist nur noch eine Sache und zwar, wenn ich den STOP-Button drücke, bleibt er auch gedrückt bis ich das Programm komplett neustarte. Ich meine Stop und wieder Run. Ich habe es wie hier( https://knowledge.ni.com/KnowledgeArticl...AU&l=de-DE ) beschrieben ist probiert. Leider wurden alle Variablen zurückgesetzt und das ist ungünstig für mich, weil die Variable "Anzahl abgetastete SChichten" soll nicht restarted werden.
Hätten Sie einen Vorschlag für mich ?
Du liest schon aus einer lokalen Variable des Stop-Buttons. Da liegt es doch nahe, den Button über das Setzen der lokalen Variable wieder auf FALSE zu setzen:
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!