MobaTools + 2 Schrittmotoren in einer Schrittkette stoppen

Guten Morgen MicroBahner,
Guten Morgen Comunity,

Ich hätte da mal eine Frage an euch.

In meiner Schrittkette lasse ich im case "beginn_Sensor_fahrt" die Motoren S4 und S5 in Richtung der beiden Kap.Sensoren fahren.

Im darauffolgenden case "suche_Ref_Sensor" sollte dann sowohl der Motor S4 als auch der Motor S5 gestoppt werden, sobald sie den jeweiligen Sensor erreicht haben.
Es stoppt jedoch nur S4, S5 dreht einfach weiter obwohl er den Sensor erreicht hat.

Wenn ich für jeden Motor einen eigenes switch/case Scenario mache funktionert es, da kann ich dann aber immer nur einen Motor nach dem anderen betreiben und stoppen.

Mein Wunsch wäre jedoch, dass sich beide Motoren gleichzeitig bewegen, und nach betättigung des jeweiligen Kap.Sensors unabhängig voneinander stoppen.

Ich denke die MobaTool´s können das, es liegt sicher nur an meinem Sketch.

    /***************************************/
    /*        beginn der Referenzfahrt     */
    /***************************************/

    case beginn_Sensor_fahrt:
      S4.rotate(1);
      S5.rotate(-1);
      Z_Start = AUS;
      Zustand = suche_Ref_Sensor;
      break;

    /********************************************************/
    /*        suche Referenz mit Kap. Sensor S4 und S5      */
    /********************************************************/

    case suche_Ref_Sensor:

      if ( Z_Kap_Sensor_Drehtisch_unten == 0 ) {           // wenn Drehtisch in Position, stoppt Kap.Sensor S4
        S4.rotate(0);
      
      
        if ( Z_Kap_Sensor_vert_Schwenktisch == 0 ) {         // wenn Drehtisch in Position, stoppt Kap.Sensor S4
          S5.rotate(0);
        }

        Z_Start = AUS;
        Zustand = Weiche;
      }
      break;

LG
Christian

Die Bedingung ( Z_Kap_Sensor_vert_Schwenktisch == 0 ) ist von der ersten abhängig.
Wenn die erreicht ist, gehst Du aber schon in den Zustand Weiche. - Damit ist der Schwenktisch unerreichbar.
Wenn Du beide willst, dann musst auch beide abfragen und warten bis beide durch sind.


case suche_Ref_Sensor:

if ( Z_Kap_Sensor_Drehtisch_unten == 0 ) {           // wenn Drehtisch in Position, stoppt Kap.Sensor S4
  S4.rotate(0);
}

if ( Z_Kap_Sensor_vert_Schwenktisch == 0 ) {         // wenn Drehtisch in Position, stoppt Kap.Sensor S4
  S5.rotate(0);
}

if (Z_Kap_Sensor_Drehtisch_unten && Z_Kap_Sensor_vert_Schwenktisch)
{
  Z_Start = AUS;
  Zustand = Weiche;
}

break;

ob das besonders clever ist, las ich mal so stehen. :wink:
PS: Mindestens ein Kommentar passt nicht zu Inhalt.

Guten Morgen my_xy_projekt,

perfekt, vielen Dank für deinen Input, so stoppen nun beide :smiley:.

Die letzte if abfrage habe ich so eingegeben:

      if (Z_Kap_Sensor_Drehtisch_unten == 0 && Z_Kap_Sensor_vert_Schwenktisch == 0)

Das zweite Kommentar habe ich auch korrigiert :upside_down_face:

Blockquote
ob das besonders clever ist, las ich mal so stehen.

Meinst Du kann es so zu Problemen kommen, hättest Du evtl. einen Tipp für mich, wie ich die Abfrage besser lössen könnte ?

lg
Christian

Ich würde das anders aufbauen.
Da Dein Switch Case noch mehr hat, habe ich das jetzt nur auf das runtergebrochen, was oben stand.
Es kommen dann zwei Funktionen raus, die Du immer wieder verwenden kannst.

case beginn_Sensor_fahrt:
Z_Start = AUS;
Zustand = suche_Ref_Sensor;
break;

case suche_Ref_Sensor:
if (!referenzDrehtisch() && !referenzSchwenktisch())
{
  Z_Start = AUS;
  Zustand = Weiche;
}
break;



bool referenzDrehtisch()
{
  if ( Z_Kap_Sensor_Drehtisch_unten == 0 ) {           // wenn Drehtisch in Position, stoppt Kap.Sensor S4
    S4.rotate(0);
  }
  else
  {
    S4.rotate(1);
  }
  return Z_Kap_Sensor_Drehtisch_unten;
}

bool referenzSchwenktisch()
{

  if ( Z_Kap_Sensor_vert_Schwenktisch == 0 ) {         // wenn Drehtisch in Position, stoppt Kap.Sensor S4
    S5.rotate(0);
  }
  else
  {
    S5.rotate(-1);
  }
  return Z_Kap_Sensor_vert_Schwenktisch;
}

ungetestet und nur ausm Bauch raus.

Leider zeigst Du nur einen Ausschnitt aus deinem Sketch, da kann man nicht viel erkennen. Wenn man blockadefrei programmiert, muss der Parallel-Betrieb auch mit einem getrennten switch/case für jeden Motor funktionieren.