MasT3r-A Geschrieben February 12, 2015 at 10:12 Geschrieben February 12, 2015 at 10:12 Hallo Tinkerfreunde! Ich weiß es gibt hier im Forum schon einige ähnliche Beiträge, doch hilft mir das nicht ganz weiter! Ich möchte zwei Endschalter an meinem Kreuztisch anbringen um die Referenzfahrt zu ermöglichen. Dabei verfahre ich beide Achsen X und Y langsam in die gewünschten Ecken und beim Überfahren des Endschalters möchte ich das die Motoren stehen bleiben .. dann 50 Steps wieder vorfahren so das die Motoren vom Endschalter wegfahren. UND dann die Aktuelle Position '0' setzen. Mein Problem ist halt der Interrupt des Endschalters (beide am IO-4). Wenn ich ein LOW auf dem Pin erhalte soll er ja stehen bleiben.. dann komm ich aber nicht wieder raus aus der Ecke. Mein Enumeration sieht so aus: // Enumeration is for IO-4 Bricklet if (deviceIdentifier == BrickletIO4.DEVICE_IDENTIFIER) { io4 = new BrickletIO4(UID, ipcon); io4.Interrupt += InterruptCB; // Enable interrupt io4.SetInterrupt(15 << 0); } und mein InterruptCB so: private void InterruptCB(BrickletIO4 sender, byte interruptMask, byte valueMask) { if (io4 != null) { string interruptBinary = System.Convert.ToString(interruptMask, 2); string valueBinary = System.Convert.ToString(valueMask, 2); SetTextBoxRef0(interruptBinary); SetTextBoxRef1(valueBinary); if (interruptBinary == "1" & valueBinary == "1110") //Endschalter (Y-Achse) { Y_Achse.Stop(); io4.SetInterrupt(14 << 0); InterruptY(); } else if (interruptBinary == "10" & valueBinary == "1101") //Endschalter (X-Achse) { X_Achse.Stop(); io4.SetInterrupt(13 << 0); InterruptX(); } } } InterruptX() sieht so aus: private void InterruptX() { X_Achse.Stop(); Thread.Sleep(100); X_Achse.SetSteps(50); if (pos_reached_x == 1) { Thread.Sleep(100); X_Achse.SetCurrentPosition(0); pos_reached_x = 0; io4.SetInterrupt(15 << 0); } } Ich habe versucht den Interrupt für diesen Pin an der Stelle abzuschalten. Doch leider funktioniert das nicht. Hat jemand ne Idee wie ich den Interrupt für den Pin abschalten kann für die Zeit bis der Motor aus der Endlage herausgefahren ist.?? Grüße Artur Zitieren
Nic Geschrieben February 13, 2015 at 10:03 Geschrieben February 13, 2015 at 10:03 Warum rufst du jeweils 2x Stepper.Stop auf ? Für wichtige Endlagenschalter würde ich auch temp. den Interrupt nicht ausschalten, sondern im Interrupt-Event eher prüfen ob Stepper.State == Forw. oder Backw. vorliegt. Da es kein GetState gibt müsstest du dir das ev. in einer Ableitung des TBrickStepper selbst implementieren oder im Stepper-Callback OnNewState eine Hilfsvariable setzen. Mit GetCurrentPosition bekommst du zur Laufzeit auch die aktuelle Position und musst diese nicht über pos_reached_x prüfen. Oder besser auf das Event OnPositionReached reagieren. Zitieren
MasT3r-A Geschrieben February 17, 2015 at 19:51 Autor Geschrieben February 17, 2015 at 19:51 Hey Nic - danke das werde ich morgen auf jeden Fall testen.. Grüße Artur Zitieren
MasT3r-A Geschrieben February 19, 2015 at 10:04 Autor Geschrieben February 19, 2015 at 10:04 Sooo es hat geklappt ..Danke Nic für den Denkanstoß mein InterruptCB sieht nun so aus: private void InterruptCB(BrickletIO4 sender, byte interruptMask, byte valueMask) { if (io4 != null) { string interruptBinary = System.Convert.ToString(interruptMask, 2); string valueBinary = System.Convert.ToString(valueMask, 2); SetTextBoxRef0(interruptBinary); SetTextBoxRef1(valueBinary); if ( ((valueBinary == "1110") || (valueBinary == "1100")) && ((y_new_state == "BESCHLEUNIGUNG")||(y_new_state == "FAHREN")) )//Endschalter (Y-Achse) { Y_Achse.Stop(); y_stop_nach_endschalter = true; } if (((valueBinary == "1101") || (valueBinary == "1100")) && ((x_new_state == "BESCHLEUNIGUNG") || (x_new_state == "FAHREN"))) //Endschalter (X-Achse) { X_Achse.Stop(); x_stop_nach_endschalter = true; } if (x_stop_nach_endschalter == true && y_stop_nach_endschalter == true) { Interrupt(); } } } und meine NewState für X und Y so: private void NewStateX(BrickStepper sender, byte stateNew, byte statePrevious) { State_x_previous_Label(Convert.ToString(statePrevious)); State_x_new_Label(Convert.ToString(stateNew)); // x_State_previous if (statePrevious == 1) { x_prev_state = "STOP"; } if (statePrevious == 2) { x_prev_state = "BESCHLEUNIGUNG"; } if (statePrevious == 3) { x_prev_state = "FAHREN"; } if (statePrevious == 4) { x_prev_state = "VERZOEGERUNG"; } // x_State_new if (stateNew == 1) { x_new_state = "STOP"; } if (stateNew == 2) { x_new_state = "BESCHLEUNIGUNG"; } if (stateNew == 3) { x_new_state = "FAHREN"; } if (stateNew == 4) { x_new_state = "VERZOEGERUNG"; } } private void NewStateY(BrickStepper sender, byte stateNew, byte statePrevious) { State_y_previous_Label(Convert.ToString(statePrevious)); State_y_new_Label(Convert.ToString(stateNew)); // y_State_previous if (statePrevious == 1) { y_prev_state = "STOP"; } if (statePrevious == 2) { y_prev_state = "BESCHLEUNIGUNG"; } if (statePrevious == 3) { y_prev_state = "FAHREN"; } if (statePrevious == 4) { y_prev_state = "VERZOEGERUNG"; } // y_State_new if (stateNew == 1) { y_new_state = "STOP"; } if (stateNew == 2) { y_new_state = "BESCHLEUNIGUNG"; } if (stateNew == 3) { y_new_state = "FAHREN"; } if (stateNew == 4) { y_new_state = "VERZOEGERUNG"; } } Grüße Zitieren
Nic Geschrieben February 19, 2015 at 11:38 Geschrieben February 19, 2015 at 11:38 Damit der Code übersichtlicher und wartbarer ist, würde ich grundsätzlich Enums verwenden, siehe http://csharp.net-informations.com/statements/enum.htm. Also den redundanten Klartext "BESCHLEUNIGUNG" mit z.B. MyStepperStatesEnum.DriveInside (zum Endschalter) bzw. *DriveOutside (vom Endschalter weg) tauschen. Statt die Integer-Werte der StepperStates vom Brick kannst auch gleich die Konstanten aus den Bindings verwenden: also statt if (stateNew == 1) besser if (stateNew == BrickStepper.STATE_STOP). Erzähl doch ein wenig zu deiner Anwendung oder wozu du den Kreuztisch verwenden möchtest. Dann ist das hier im Forum nicht so trockene Kost und ev. gibst Du mit deinem Projekt Inspiration oder Denkanstöße an andere weiter Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.