Jump to content

Recommended Posts

Geschrieben

Hallo zusammen,

 

ich habe ein kleines Problem bei der Programmierung der Steuerung eines Schrittmotors. Zur Programmierung nutze ich C# mit dem Net Framework 4.8. Des Weiteren habe ich auf meinem Rechner den Brick Viewer 2.3.16 installiert.

Folgendes soll mein Programm können:

  • Beim Drücken von „Button1“ soll der Motor zunächst mit Geschwindigkeit v_SVS (Schnellvorschub) einen bestimmten Weg drehen und danach mit reduzierter Geschwindigkeit v_NV (Normalvorschub) weiterdrehen
  • Beim Drücken von „Button2“ soll der Motor gestoppt werden und anschließend mit einer Geschwindigkeit v_SRZ (Schnellrückzug) einen bestimmten Weg in die entgegengesetzte Richtung drehen bis er stoppt
  • Anbei findet Ihr ein Diagramm des skizzierten Geschwindigkeitsverlaufs

 

Die Programmierung für „Button1“ funktioniert bislang. Allerdings macht die Programmierung für Button2 Probleme. Bei Klick auf „Button2“ habe ich folgendes programmiert:

stepper1.Stop();            
stepper1.SetMaxVelocity(398);
System.Threading.Thread.Sleep(2);
stepper1.SetSteps(10000/2);

 

Leider funktioniert die Programmierung bislang nicht erwartet. Der Schrittmotor stoppt, aber dreht nicht die vorgegebenen Schritte (1000) zurück. Eine Abfrage von GetRemainingSteps() gibt 0 zurück.

Nach vielem Probieren habe ich festgestellt, dass wenn ich die Ausführung des Programmcodes ausreichend lange pausiere (Thread.Sleep) die Programmierung funktioniert. Das heißt, dass der Motor gestoppt wird und im Anschluss einen gewissen Weg in die entgegengesetzte Richtung dreht. In meinem Fall soll der Übergang aus der Phase Normalvorschub in den Schnellrückzug ohne Unterbrechung erfolgen. Aus diesem Grund wollte ich fragen, wie ich die Programmierung abändern kann, um ein Pausieren der Anwendung zu vermeiden und einen schnellen Übergang vom Normalvorschub in den Schnellrückzug zu ermöglichen?

Über eure Hilfe wäre ich dankbar.

Geschwindigkeitsverlauf.svg

Geschrieben

Hallo zusammen,

 

nach längerem rumprobieren habe ich eine Lösung über einen kleinen Umweg gefunden. Diese möchte ich anhand meinem Pseudocode veranschaulichen.

Beim Start von „Button1“ wird der Schnellvorschub mit ‚Set_Steps‘ und ‚stepper1.SetMaxVelocity()‘ aktiviert und ein Callback beim erreichen der Zielposition gesetzt (‚PositionReachedCallback‘). In der Callback-Funktion wird erneut die maximale Geschwindigkeit gesetzt und der Motor in Vorwärtsrotation gesetzt:

	private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            stepper1.SetMaxVelocity(Convert.ToInt32(v_SVS / proSchritt));
            stepper1.SetSteps(Convert.ToInt32(s_SVS / proSchritt));
            stepper1.PositionReachedCallback += SVS_finished; //setzen des Callbacks
        }
        void SVS_finished(BrickSilentStepper sender, int position) //Callback
        {
            stepper1.PositionReachedCallback -= SVS_finished; //detach Callback
            stepper1.SetMaxVelocity(Convert.ToInt32(v_NV / proSchritt));
            stepper1.DriveForward();
        }

 

Beim Drücken von Button2 (Cancel) wird erneut die maximale Geschwindigkeit gesetzt und dem Motor gesagt, dass er in die entgegengesetzte Rotationsrichtung drehen soll. Danach wird die Zielposition berechnet und in einer while Schleife überprüft, ob die Zielposition erreicht wurde. Im Anschluss stoppt der Motor.

	private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            int target = Convert.ToInt32(-s_SRZ / proSchritt); //target position in steps
            stepper1.SetMaxVelocity(Convert.ToInt32(v_SRZ / proSchritt));
            stepper1.DriveBackward();
            stepper1.SetCurrentPosition(0);
            int i = 0;
            while (stepper1.GetCurrentPosition() <= target && i < 1000000)
            {
                i++;
            }
            stepper1.Stop();
        }

 

Ich finde die Lösung zwar nicht schön, aber Sie ist erstmal funktionsfähig. Sollte jemand wissen, warum mein erster Ansatz nicht funktioniert würde ich mich über eine Rückmeldung freuen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...