Arduino / Accelstepper Hilfe



  • Guten Abend miteinander ,
    Ich bin neue hier im Forum und komme gleich mit einem Riesen Problem !!!

    Erst mal ich heiße Patrick bin Noch 29 und Schlossermeister von Beruf.

    Ich habe mir eine Cocktailmaschine gebaut.
    Der Controller ist ein Arduino die Motoren sind Nema 17!
    Soweit so gut im groben und Ganzen funktioniert auch erst mal alles!
    Ich arbeite mit der accelstepper lib.

    Nun hier mein Problem
    Erst mal mache ich mit drei Achsen eine Referenzfahrt, eine nach der anderen! Das funktioniert auch soweit.
    Nun will ich mit X und Y positionieren, dann mit Z aus der Flasche mein Getränk holen.
    Und da beginnen auch schon die Fehler einmal fährt er zur Flasche A und holt sich dreimal ein Getränk, dann fährt er zur Flasche B Und holt kein Getränk sondern fährt sofort wieder zur A und holt sich einmal ein Getränk dann fährt er wieder zu Flasche E und holt sich dreimal ein Getränk!!!!!!

    Theoretisch ist aber programmiert das er zu Flasche A fahren soll Getränke abholen, Dann zur Flasche B und dort ein Getränk abholen!!!

    Kann mir bei dieser Sache irgend jemand helfen bin am verzweifeln und komme einfach nicht mehr weiter!!!
    Nun die große Überraschung ich habe am 12. Juli Geburtstag und wollte mich damit Selbst beschenken!!!



  • @patrick_sucko ```
    ... #include "AccelStepper.h"

    #define home_switchX 52
    #define home_switchY 50
    #define home_switchZ 48

    // AccelStepper Setup
    AccelStepper stepperX(1,12,13); // 1 = Easy Driver interface
    // UNO Pin 2 connected to STEP pin of Easy Driver
    // UNO Pin 3 connected to DIR pin of Easy Driver

    AccelStepper stepperY (1,3,4);

    AccelStepper stepperZ(1, 6, 7); // 1 = Easy Driver interface
    // UNO Pin 5 connected to STEP pin of Easy Driver
    // UNO Pin 6 connected to DIR pin of Easy Driver

    // Stepper Travel Variables
    long TravelX; // Used to store the X value entered in the Serial Monitor
    long TravelY;
    long TravelZ; // Used to store the Z value entered in the Serial Monitor

    int move_finishedX=1;
    int move_finishedY=1;
    int move_finishedZ=1; // Used to check if move is completed
    int move_finishedXY=1;
    int move_finishedZZ=1;
    int sicherheit=1;
    int sicherheit2=2;

    long initial_homingX=-1;
    long initial_homingY=-1;
    long initial_homingZ=-1;

    //---------------------------------------

    //void cola () {
    // p2 ();
    // CL1 ();
    // p3 ();
    // CL1 ();
    // p4 ();
    // CL1();

    //}

    void p2 (void){

    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){

    sicherheit=0;
    move_finishedXY=0; // Set variable for checking move of the Steppers

    stepperX.moveTo(65); // Set new move position for X Stepper
    stepperY.moveTo(570); // Set new move position for Z Stepper

    }

    // Check if the Steppers have reached desired position
    if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0))
    {
    stepperX.run(); // Move Stepper X into position
    stepperY.run(); // Move Stepper Y into position
    }

    // If move is completed display message on Serial Monitor
    if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
    move_finishedXY=1; // Reset move variable
    move_finishedZ=3;
    sicherheit=3;
    delay(500);
    }

    }

    void p3 (void){

    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){

    sicherheit=0;
    move_finishedXY=0; // Set variable for checking move of the Steppers

    stepperX.moveTo(200); // Set new move position for X Stepper
    stepperY.moveTo(400); // Set new move position for Z Stepper

    }

    // Check if the Steppers have reached desired position
    if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0))
    {
    stepperX.run(); // Move Stepper X into position
    stepperY.run(); // Move Stepper Y into position
    }

    // If move is completed display message on Serial Monitor
    if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
    move_finishedXY=1; // Reset move variable
    move_finishedZ=3;
    sicherheit=3;
    delay(500);
    }

    }

    void p4 (void){

    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){

    sicherheit=0;
    move_finishedXY=0; // Set variable for checking move of the Steppers

    // Set Max Speed and Acceleration of each Steppers

    stepperX.moveTo(3800); // Set new move position for X Stepper
    stepperY.moveTo(3950); // Set new move position for Z Stepper
    delay (1000);

    }

    // Check if the Steppers have reached desired position
    if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() !=0))
    {
    stepperX.run(); // Move Stepper X into position
    stepperY.run(); // Move Stepper Z into position
    }

    // If move is completed display message on Serial Monitor
    if ((move_finishedXY == 0) && (stepperX.distanceToGo () == 0) && (stepperY.distanceToGo () == 0)) {
    move_finishedXY=1; // Reset move variable
    sicherheit=1;
    move_finishedZ=3;
    delay(500);
    }
    }

    //----------------------------------------------------

    void CL1 (void){

    while(( move_finishedZ == 3) && (sicherheit == 3)){

    sicherheit=0;
    move_finishedZ=0; // Set variable for checking move of the Steppers

    stepperZ.moveTo(7000); // Set new move position for X Stepper
    delay(1000);
    }

    if ((stepperZ.distanceToGo() != 0) )
    {
    stepperZ.run(); // Move Stepper X into position
    }

    // If move is completed display message on Serial Monitor
    if ((move_finishedZ == 0) && (stepperZ.distanceToGo() == 0) ) {
    move_finishedZ=2; // Reset move variable
    sicherheit=1;
    delay(500);
    }

    while(( move_finishedZ == 2 ) && (sicherheit ==1 )){

    sicherheit=0;
    move_finishedZ=10; // Set variable for checking move of the Steppers

    // Set Max Speed and Acceleration of each Steppers

    stepperZ.moveTo(20); // Set new move position for X Stepper
    }

    // Check if the Steppers have reached desired position
    if ((stepperZ.distanceToGo() != 0) )
    {
    stepperZ.run(); // Move Stepper X into position
    }

    // If move is completed display message on Serial Monitor
    if ((move_finishedZ == 10) && (stepperZ.distanceToGo() == 0) ) {
    move_finishedZ=1; // Reset move variable
    sicherheit=1;
    move_finishedXY=1;
    sicherheit2=2;
    delay(500);
    }
    }

    //---------------------------------------------------------------------

    //void cola () {
    // p2 ();
    // CL1 ();
    // p4 ();
    // CL1();
    //
    //
    //}

    void setup() {

    Serial.begin(9600); // Start the Serial monitor with speed of 9600 Bauds

            pinMode (home_switchX,INPUT_PULLUP);
            pinMode (home_switchY,INPUT_PULLUP);
            pinMode (home_switchZ,INPUT_PULLUP);
    

    delay (5);
    Serial.println("Homing . . . .");

    // Set Max Speed and Acceleration of each Steppers
    stepperX.setMaxSpeed(900.0); // Set Max Speed of X axis
    stepperX.setAcceleration(500.0); // Acceleration of X axis

    stepperY.setMaxSpeed(400.0); // Set Max Speed of X axis
    stepperY.setAcceleration(500.0);

    stepperZ.setMaxSpeed(1600.0); // Set Max Speed of Z axis slower for rotation
    stepperZ.setAcceleration(600.0); // Acceleration of Z axis

            //X auf Endschalter fahren
            while (!digitalRead(home_switchX)) {  // Make the Stepper move CCW until the switch is activated   
                stepperX.moveTo(initial_homingX);  // Set the position to move to
                initial_homingX--;  // Decrease by 1 for next move if needed
                stepperX.run();  // Start moving the stepper
                delay(4);
                }
    
            //Y auf Endschalter fahren
            while (!digitalRead(home_switchY)) {  // Make the Stepper move CCW until the switch is activated   
                stepperY.moveTo(initial_homingY);  // Set the position to move to
                initial_homingY--;  // Decrease by 1 for next move if needed
                stepperY.run();  // Start moving the stepper
                delay(4);
                }
    
            //Z auf Endschalter fahren
            while (!digitalRead(home_switchZ)) {  // Make the Stepper move CCW until the switch is activated   
                stepperZ.moveTo(initial_homingZ);  // Set the position to move to
                initial_homingZ--;  // Decrease by 1 for next move if needed
                stepperZ.run();  // Start moving the stepper
                delay(4);
                 }
    
    
                  //X vom endschalter runter und 0 setzen
                  while (digitalRead(home_switchX)) { // Make the Stepper move CW until the switch is deactivated
                  stepperX.moveTo(initial_homingX);  
                  stepperX.run();
                  initial_homingX++;
                  delay(5);
                  }
                   stepperX.setCurrentPosition(0);
            
    
                   //Y vom endschalter runter und 0 setzen
                  while (digitalRead(home_switchY)) { // Make the Stepper move CW until the switch is deactivated
                  stepperY.moveTo(initial_homingY);  
                  stepperY.run();
                  initial_homingY++;
                  delay(5);
                  }
                  stepperY.setCurrentPosition(0);
                 
    
                   //Z vom endschalter runter und 0 setzen
                  while (digitalRead(home_switchZ)) { // Make the Stepper move CW until the switch is deactivated
                  stepperZ.moveTo(initial_homingZ);  
                  stepperZ.run();
                  initial_homingZ++;
                  delay(5);
                  }
                  stepperZ.setCurrentPosition(0);
                 
                  Serial.println("Homing Completet");
                   //  Set Max Speed and Acceleration of each Steppers
    

    }

    void loop()
    { p2();
    CL1();
    p4();
    CL1();
    }

    ...



  • wenn mir jetzt noch jemand sagen kann wie ich Bilder einfüge, dann würde ich euch mal meine Arbeit zeigen



  • "Einfügen" garnicht. Lass einfach einen Link darauf da.

    Würdest Du bitte Deinen Beitrag bearbeiten und ``` über und ``` unter Deinen Code schreiben? Alternativ markiere Deinen Code und klicke auf </>.



  • Fotos kannst du hier nicht einfügen, du kannst aber die Links zu einem externen Bildhoster posten (picload.org etc.).
    Auch kannst du deinen ersten Post noch einmal editieren und Codetags verwenden (Code markieren und oben auf </> klicken.

    Ein cooles Projekt ist es aber auf jeden Fall.

    Um zumindest noch etwas Sinnvolles zu schreiben:

    move_finishedXY=1;
    move_finishedZ=3;
    sicherheit=3;
    delay(500);
    

    Was genau die einzelnen Werte bedeuten, weiß man selber nicht mehr, wenn man sich den Code nach ein paar Monaten noch einmal anschaut (Leser, die diesen Code zum ersten Mal sehen, erst recht nicht). Besser ist es, gleich diese Konstanten sinnvoll zu benennen (per define, const int oder enum).

    stepperX.moveTo(65); // Set new move position for X Stepper
    stepperY.moveTo(570); // Set new move position for Z Stepper
    

    Wenn diese Werte gar von der Flaschenform (bspw.) abhängen, sollten sie gar nicht im Code vorkommen, sondern aus einer Datei eingelesen werden, sodass nicht jedes Mal kompiliert werden muss.

    Das eigentlich Problem solltest du noch einmal genauer eingrenzen: Was erwartest du von einem bestimmten Stück des gezeigten Codes und was genau kommt dabei [fälschlicheweise] heraus.



  • #include "AccelStepper.h" 
    
    
    #define home_switchX 52
    #define home_switchY 50
    #define home_switchZ 48
    
    
    // AccelStepper Setup
    AccelStepper stepperX(1,12,13);   // 1 = Easy Driver interface
                                      // UNO Pin 2 connected to STEP pin of Easy Driver
                                      // UNO Pin 3 connected to DIR pin of Easy Driver
    
    AccelStepper stepperY (1,3,4);
    
                                      
    
    AccelStepper stepperZ(1, 6, 7);   // 1 = Easy Driver interface
                                      // UNO Pin 5 connected to STEP pin of Easy Driver
                                      // UNO Pin 6 connected to DIR pin of Easy Driver
    
    
    
    // Stepper Travel Variables
    long TravelX;  // Used to store the X value entered in the Serial Monitor
    long TravelY;
    long TravelZ;  // Used to store the Z value entered in the Serial Monitor
    
    
    int move_finishedX=1;
    int move_finishedY=1;
    int move_finishedZ=1;  // Used to check if move is completed
    int move_finishedXY=1;
    int move_finishedZZ=1;
    int sicherheit=1;
    int sicherheit2=2;
    
    long initial_homingX=-1;
    long initial_homingY=-1;
    long initial_homingZ=-1;
    
    
    //---------------------------------------
    
    
    //void cola () {
    //  p2 ();  
    //  CL1 ();
    //  p3  ();
    //  CL1 (); 
    //  p4 ();   
    //  CL1();
      
      
    //}
    
    
    
    
    void p2 (void){
    
    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){
     
      sicherheit=0;
      move_finishedXY=0;  // Set variable for checking move of the Steppers
      
      stepperX.moveTo(65);  // Set new move position for X Stepper
      stepperY.moveTo(570);  // Set new move position for Z Stepper
    
      }
      
    // Check if the Steppers have reached desired position
      if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0)) 
            {
            stepperX.run();  // Move Stepper X into position
            stepperY.run();  // Move Stepper Y into position
            }
    
    
    // If move is completed display message on Serial Monitor
      if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
        move_finishedXY=1;  // Reset move variable
        move_finishedZ=3;
        sicherheit=3;
        delay(500);
      }
     
    }
    
    
    void p3 (void){
    
    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){
     
      sicherheit=0;
      move_finishedXY=0;  // Set variable for checking move of the Steppers
      
      stepperX.moveTo(200);  // Set new move position for X Stepper
      stepperY.moveTo(400);  // Set new move position for Z Stepper
    
      }
      
    // Check if the Steppers have reached desired position
      if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0)) 
            {
            stepperX.run();  // Move Stepper X into position
            stepperY.run();  // Move Stepper Y into position
            }
    
    
    // If move is completed display message on Serial Monitor
      if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
        move_finishedXY=1;  // Reset move variable
        move_finishedZ=3;
        sicherheit=3;
        delay(500);
      }
     
    }
    
    void p4 (void){
    
    
    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){
     
      sicherheit=0;
      move_finishedXY=0;  // Set variable for checking move of the Steppers
      
      //  Set Max Speed and Acceleration of each Steppers
      
      
      
      stepperX.moveTo(3800);  // Set new move position for X Stepper
      stepperY.moveTo(3950);  // Set new move position for Z Stepper
      delay (1000);
    
     
      }
      
    // Check if the Steppers have reached desired position
      if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() !=0)) 
            {
            stepperX.run();  // Move Stepper X into position
            stepperY.run();  // Move Stepper Z into position
            }
    
    // If move is completed display message on Serial Monitor
      if ((move_finishedXY == 0) && (stepperX.distanceToGo () == 0) && (stepperY.distanceToGo () == 0)) {
        move_finishedXY=1;  // Reset move variable
        sicherheit=1;
        move_finishedZ=3;
        delay(500);
      }
    }
    
    //----------------------------------------------------
    
    
    
    
    void CL1 (void){
      
      while(( move_finishedZ == 3) && (sicherheit == 3)){
     
      sicherheit=0;
      move_finishedZ=0;  // Set variable for checking move of the Steppers
      
      
      stepperZ.moveTo(7000);  // Set new move position for X Stepper
      delay(1000);
      }
      
      if ((stepperZ.distanceToGo() != 0) ) 
            {
            stepperZ.run();  // Move Stepper X into position
            }
    
    
    // If move is completed display message on Serial Monitor
      if ((move_finishedZ == 0) && (stepperZ.distanceToGo() == 0) ) {
        move_finishedZ=2;  // Reset move variable
        sicherheit=1;
        delay(500);
      }
    
      
    
      while(( move_finishedZ == 2 ) && (sicherheit ==1 )){
     
      sicherheit=0;
      move_finishedZ=10;  // Set variable for checking move of the Steppers
      
      //  Set Max Speed and Acceleration of each Steppers
        
      
      stepperZ.moveTo(20);  // Set new move position for X Stepper
      }
      
    // Check if the Steppers have reached desired position
      if ((stepperZ.distanceToGo() != 0) ) 
            {
            stepperZ.run();  // Move Stepper X into position
            }
    
    
    // If move is completed display message on Serial Monitor
      if ((move_finishedZ == 10) && (stepperZ.distanceToGo() == 0) ) {
        move_finishedZ=1;  // Reset move variable
        sicherheit=1;
        move_finishedXY=1;
        sicherheit2=2;
        delay(500);
      }
    }
    
    //---------------------------------------------------------------------
    
    
    
    
    
    //void cola () {
    //  p2 ();  
    //  CL1 (); 
    //  p4 ();   
    //  CL1();
    //  
    //  
    //}
    
    
    void setup() {
    
      
      Serial.begin(9600);  // Start the Serial monitor with speed of 9600 Bauds
      
                pinMode (home_switchX,INPUT_PULLUP);
                pinMode (home_switchY,INPUT_PULLUP);
                pinMode (home_switchZ,INPUT_PULLUP);
    
    delay (5);
              Serial.println("Homing . . . .");
    
    //  Set Max Speed and Acceleration of each Steppers
      stepperX.setMaxSpeed(900.0);      // Set Max Speed of X axis
      stepperX.setAcceleration(500.0);  // Acceleration of X axis
    
      stepperY.setMaxSpeed(400.0);      // Set Max Speed of X axis
      stepperY.setAcceleration(500.0);
    
      stepperZ.setMaxSpeed(1600.0);      // Set Max Speed of Z axis slower for rotation
      stepperZ.setAcceleration(600.0);  // Acceleration of Z axis
    
    
                //X auf Endschalter fahren
                while (!digitalRead(home_switchX)) {  // Make the Stepper move CCW until the switch is activated   
                    stepperX.moveTo(initial_homingX);  // Set the position to move to
                    initial_homingX--;  // Decrease by 1 for next move if needed
                    stepperX.run();  // Start moving the stepper
                    delay(4);
                    }
    
                //Y auf Endschalter fahren
                while (!digitalRead(home_switchY)) {  // Make the Stepper move CCW until the switch is activated   
                    stepperY.moveTo(initial_homingY);  // Set the position to move to
                    initial_homingY--;  // Decrease by 1 for next move if needed
                    stepperY.run();  // Start moving the stepper
                    delay(4);
                    }
    
                //Z auf Endschalter fahren
                while (!digitalRead(home_switchZ)) {  // Make the Stepper move CCW until the switch is activated   
                    stepperZ.moveTo(initial_homingZ);  // Set the position to move to
                    initial_homingZ--;  // Decrease by 1 for next move if needed
                    stepperZ.run();  // Start moving the stepper
                    delay(4);
                     }
        
    
                      //X vom endschalter runter und 0 setzen
                      while (digitalRead(home_switchX)) { // Make the Stepper move CW until the switch is deactivated
                      stepperX.moveTo(initial_homingX);  
                      stepperX.run();
                      initial_homingX++;
                      delay(5);
                      }
                       stepperX.setCurrentPosition(0);
                
    
                       //Y vom endschalter runter und 0 setzen
                      while (digitalRead(home_switchY)) { // Make the Stepper move CW until the switch is deactivated
                      stepperY.moveTo(initial_homingY);  
                      stepperY.run();
                      initial_homingY++;
                      delay(5);
                      }
                      stepperY.setCurrentPosition(0);
                     
    
                       //Z vom endschalter runter und 0 setzen
                      while (digitalRead(home_switchZ)) { // Make the Stepper move CW until the switch is deactivated
                      stepperZ.moveTo(initial_homingZ);  
                      stepperZ.run();
                      initial_homingZ++;
                      delay(5);
                      }
                      stepperZ.setCurrentPosition(0);
                     
                      Serial.println("Homing Completet");
                       //  Set Max Speed and Acceleration of each Steppers
    
    
    
    }
    
    void loop()
    { p2();  
      CL1();
      p4();   
      CL1();
    }
    


  • https://www.dropbox.com/sh/qhyfihemsbxc6rc/AAAXk9TvcHnJwt1WpAhTqtxoa?dl=0

    Hier ein paar Bilder des Vorhabens.

    Wie man auf den Bildern sehen kann will ich...
    -X und Y unter Flasche A positionieren
    -Mit Z einen Hub machen um den Dosierer zu leeren
    -X kleine Bewegung nach Links oder Rechts ( muss, sonst tut sich der Dosierer nicht wieder Füllen )
    -Z wieder den Hub nach unten
    -X und Y wieder unter Flasche B positionieren

    • usw ……

    Im Code ist die kleine X Ausweichbewegung noch nicht programmiert.

    Fehler ist: wie man in der loop sieht fahre ich Flasche A (p2) an und mache dann den Hub (CL1) fahre dann zu Flasche B (p4) und mache dann wieder den Hub (CL1)

    Tatsächliche Programmabfolge:
    mal p2,CL1,CL1,CL1,p4,CL1, p2, p4
    mal p2, CL1, p4, CL1, p2, p4, p2, CL1, CL1

    genauer gesagt, es gibt keine Abfolge, obwohl sie für meine begriffe klar und fest vorgegeben wurde.

    Bitte helft mir um einen glücklichen Geburtstag mit meinen Gästen feiern zu können.

    P.S das programmierte Setup funktioniert einwandfrei.

    mit freundlichen Grüßen Patrick Sucko



  • Was sollen die while-Schleifen bewirken?

    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){
     
      sicherheit=0;
      move_finishedXY=0;  // Set variable for checking move of the Steppers
      
      //  Set Max Speed and Acceleration of each Steppers
     
      stepperX.moveTo(3800);  // Set new move position for X Stepper
      stepperY.moveTo(3950);  // Set new move position for Z Stepper
      delay (1000);
    }
    

    Logisch gesehen würde hier eine 'if'-Anweisung reichen, denn du setzt ja sofort die beiden Variablen (so daß die Schleife danach sowieso direkt abgebrochen wird).

    Ich kenne mich zwar nicht so genau mit den Arduino-Funktionen aus, aber erst durch ein 'stepperX.run()' wird doch der Stepper bewegt?! Also macht das 'delay()' nach den moveTo-Funktionen keinen Sinn, denn damit setzt du ja nur die neue Position.

    Und auch die direkte Abfrage mittels

    if ((move_finishedXY == 0) && (stepperX.distanceToGo () == 0) && (stepperY.distanceToGo () == 0)) {
      // ...
    }
    

    direkt nach der run-Funktion macht m.E. keinen Sinn (denn z.B. die Variable 'move_finishedXY' hat sich ja nicht wieder geändert).

    Mir kommt also die Logik deines Programm eigenartig vor und daher ist es kein Wunder, daß der Stepper sich nicht so bewegt, wie du es dir vorstellst...



  • void p4 (void){
    
    
    while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){
    

    Die 3. Bedingung ist falsch und ein typischer Anfängerfehler.



  • Ja, das habe ich auch schon bemerkt das die 3. Bedingungen falsch ist! Mir sind auch noch weitere Fehler aufgefallen, die ich heute mal beheben und testen will! Heute widme ich mich wieder etwas dem Projekt, und werde später einen aktualisierten Code wieder einstellen!

    Überhaupt freue ich mich dass mir jemand helfen will, danke schon mal im Voraus



  • Ups, da habe ich ja den passenden Code-Ausschnitt zitiert (denn in den anderen Funktionen ist zumindestens syntaktisch diese Abfrage richtig).