Jump to content

[C#] Endschalter am IO-4


Recommended Posts

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

 

 

 

 

 

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
Share on other sites

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 ;)

 

Link zu diesem Kommentar
Share on other sites

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...