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.