NQC: Probleme mit Endlosschleifen

Rund um die Version 1.5 und 2.0
NQC und andere Software für den RCX

Moderator: Moderatoren

yilzi
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 27. Mär 2011 14:32

NQC: Probleme mit Endlosschleifen

Beitragvon yilzi » 27. Mär 2011 15:09

Hallo, ich arbeite gerade an einem Projekt für die Schule, wo ich ein Lego-Gewächshaus programmieren muss. Ich beschreibe zuerst mal mein Problem..
Ich möchte dieses Gewächshaus so programmieren, dass sich die Klappe öffnet, wenn der Temperatursensor über 30°C misst. Dann soll sich die Klappe so lange öffnen bis der Rotationssensor 18 Umdrehungen gemessen hat. Wenn die Temperatur dann wieder unter 30°C beträgt, dann soll sich die Klappe wieder schließen. Und das soll das Gewächshaus in einer Endlosschleife tun.

Und nun habe ich folgendes Programm geschrieben:


Code: Alles auswählen

task main()
{
  SetSensorType(SENSOR_1,SENSOR_TYPE_TEMPERATURE);         
  SetSensorMode(SENSOR_1,SENSOR_MODE_CELSIUS);           
  SetSensorType(SENSOR_2,SENSOR_TYPE_ROTATION);           
 
  while(true)
 
     {
     if (SENSOR_1 >= 30);
     
     {
      OnFwd(OUT_A);
      until (SENSOR_2 == 18);
      Off(OUT_A);
      }


      if (SENSOR_1 <=30);

      {
     
      OnRev(OUT_A);
      until (SENSOR_2 == -18);
      Off(OUT_A);
       }
     }
    }




Wenn ich das Programm nun starte achtet der RCX nicht auf den Temperatursensor und der Motor startet einfach. Er stopt zwar nach 18 Umdrehungen, aber danach ist schluss.

Ich weiß die Programmiersprache NQC ist schon älter, aber ich hoffe, dass mir jemand bei meinem Problem helfen kann.
Zuletzt geändert von yilzi am 27. Mär 2011 18:43, insgesamt 1-mal geändert.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 27. Mär 2011 15:35

hallo,
erstmal herzlich willkommen im Forum.

du musst zunächst die ";" direkt hinter den if-statements löschen, so macht er nicht das, was danach kommt.
Lesbarer wir dann dein Code, wenn du Einrückungen machst und die Code-Tags ([ code ]-Button)benutz

Teste mal das umgeschriebene Programm und sieh zu, was jetzt passiert.

Code: Alles auswählen

task main()
{
  SetSensorType(SENSOR_1,SENSOR_TYPE_TEMPERATURE);
  SetSensorMode(SENSOR_1,SENSOR_MODE_CELSIUS);
  SetSensorType(SENSOR_2,SENSOR_TYPE_ROTATION);

  while(true)
  {
    if (SENSOR_1 >= 30)
    {
      OnFwd(OUT_A);
      until (SENSOR_2 == 18);
      Off(OUT_A);
    }

    if (SENSOR_1 <=30)
    {
      OnRev(OUT_A);
      until (SENSOR_2 == -18);
      Off(OUT_A);
    }
  }
}



Für den RCX aus dem RIS gibt es ein extra Unterforum "Robotic Invention System". Ich werde deinen Thread später dorthin verschieben.
Viel Erfolg weiterhin!
:)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

yilzi
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 27. Mär 2011 14:32

Beitragvon yilzi » 27. Mär 2011 15:47

Erstmal vielen Dank für die rasche Antwort. Tut mir leid, dass ich den Thread ins falsche Forum geschrieben habe.

Das Programm habe ich getestet - jetzt startet der Motor wieder direkt nachdem ich Run gedrückt habe und wenn er bei 18 umdrehungen angekommen ist, läuft er langsamer ein bisschen weiter und dann fängt er wieder an, sich schneller zu drehen.

Habt ihr vielleicht eine Ahnung, wie man dieses Programm anders schreiben kann bzw. seht ihr irgendwelche Fehler?

Vielen Dank!

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 27. Mär 2011 16:00

du solltest vllt auch das <= durch < ersetzen, sonst hat er für =30 zwei Reaktionsvorschriften.
das ==18 würde ich durch >=18 ersetzen,
das ==-18 durch <=0 (denn er dreht ja auf Null zurück, nicht auf -18),
und ich bin mir nicht sicher, ob du die Sensorwerte richtig abfragst.

Aber das wird vllt noch nicht alles sein.
Da müssen jetzt mal NQC-Spezialisten ran...
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 27. Mär 2011 17:00

Ich kenne mich zwar auch nicht mit NQC aus, habe aber mal den NQC-Guide angeschaut(vielleicht hilft der dir auch), um jetzt die Grundlagen von NQC zu kennen. hier mal der etwas verbesserte Code:

Code: Alles auswählen

task main()
{
  int fenster;
  fenster = 0;  // muss wie unten beschrieben evtl. Geändert werden.
  SetSensorType(SENSOR_1,SENSOR_TYPE_TEMPERATURE);
  SetSensorMode(SENSOR_1,SENSOR_MODE_CELSIUS);
  SetSensorType(SENSOR_2,SENSOR_TYPE_ROTATION);
  SetSensorMode(SENSOR_2,SENSOR_MODE_ROTATION);
  while(true)
  {
    if (SENSOR_1 >= 30 && fenster == 0)
    {
      OnFwd(OUT_A);
      until(SENSOR_2 >= 18*16);
      Off(OUT_A);
      fenster = 1;
    }

    if (SENSOR_1 <30 && fenster == 1)
    {
      OnRev(OUT_A);
      until (SENSOR_2 <= 0);
      Off(OUT_A);
      fenster = 0;
    }
  }
}
Zuletzt geändert von NXT pro am 27. Mär 2011 17:36, insgesamt 3-mal geändert.
Real coders don't comment their code - it was hard to write, it should be hard to understand!

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 27. Mär 2011 17:28

OK nun hab ich den großen Fehler gefunden:
Wenn der Schleifendurchlauf erneut beginnt, ist die Temperatur ja wieder über 30°C und der Motor läuft weiter.
Das Programm aus meinem vorigem Post wird geändert.
EDIT: Programm oben ist geändert, je nachdem ob das Fenster am Anfang zu (=0) oder offen (=1) steht, muss die Variable fenster geändert werden.
Real coders don't comment their code - it was hard to write, it should be hard to understand!

yilzi
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 27. Mär 2011 14:32

Beitragvon yilzi » 27. Mär 2011 18:01

Das hat mich schonmal ein großes Stück weiter gebracht, vielen Dank! Das einzige Problem das ich jetzt noch ist, dass der Motor startet, obwohl es nicht wärmer als 30° ist.
Aber das werde ich hin bekommen, der Schritt mit den Variablen hat mich schonmal viel weiter gebracht!
Zuletzt geändert von yilzi am 27. Mär 2011 18:44, insgesamt 1-mal geändert.

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 27. Mär 2011 18:29

Hab das Programm jetzt nochmal ein wenig verändert und eine Temperaturausgabe hinzugefügt, mit der du den aktuellen Ausgabewert des Temperatursensors auf dem Display sehen kannst.

Code: Alles auswählen

task display()
{
  {
    SelectDisplay(DISPLAY_SENSOR_1);
    Wait(10);
  }
}

task main()
{
  int fenster;
  fenster = 0;  // muss wie unten beschrieben evtl. Geändert werden.
  SetSensorType(SENSOR_1,SENSOR_TYPE_TEMPERATURE);
  SetSensorMode(SENSOR_1,SENSOR_MODE_CELSIUS);
  SetSensorType(SENSOR_2,SENSOR_TYPE_ROTATION);
  SetSensorMode(SENSOR_2,SENSOR_MODE_ROTATION);
  start display;
  while(true)
  {

    if (SENSOR_1 >= 30 && fenster == 0)
    {
      OnFwd(OUT_A);
      until(SENSOR_2 >= 18*16);
      Off(OUT_A);
      fenster = 1;
    }

    if (SENSOR_1 <30 && fenster == 1)
    {
      OnRev(OUT_A);
      until (SENSOR_2 <= 0);
      Off(OUT_A);
      fenster = 0;
    }
  }
}
Real coders don't comment their code - it was hard to write, it should be hard to understand!

yilzi
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 27. Mär 2011 14:32

Beitragvon yilzi » 27. Mär 2011 19:42

Ich habe das Problem, dass der RCX nicht auf den Temperatursensor achtet. Also der Motor startet direkt, obwohl der Temperatursensor noch nicht über 30°C ist.

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 27. Mär 2011 20:00

Probiere mal dieses Programm:

Code: Alles auswählen


#define TEMPERATUR 300

task display()
{
  {
    SelectDisplay(DISPLAY_SENSOR_1);
    Wait(10);
  }
}

task main()
{
  int fenster;
  fenster = 0;  // muss wie beschrieben evtl. Geändert werden.
  SetSensorType(SENSOR_1,SENSOR_TYPE_TEMPERATURE);
  SetSensorMode(SENSOR_1,SENSOR_MODE_CELSIUS);
  SetSensorType(SENSOR_2,SENSOR_TYPE_ROTATION);
  SetSensorMode(SENSOR_2,SENSOR_MODE_ROTATION);
  ClearSensor(SENSOR_2);
  start display;
  while(true)
  {

    if (SENSOR_1 >= TEMPERATUR && fenster == 0)
    {
      OnFwd(OUT_A);
      until(SENSOR_2 >= 18*16);
      Off(OUT_A);
      fenster = 1;
    }

    if (SENSOR_1 < TEMPERATUR && fenster == 1)
    {
      OnRev(OUT_A);
      until (SENSOR_2 <= 0);
      Off(OUT_A);
      fenster = 0;
    }
  }
}


Ich habe bei diesem Programm den Grenzwert auf 300 gesetzt, da es sein kann das die Temperatur
mit einer Dezimalstelle ausgegeben wird.
Real coders don't comment their code - it was hard to write, it should be hard to understand!

yilzi
Mindstormsfreund
Mindstormsfreund
Beiträge: 5
Registriert: 27. Mär 2011 14:32

Beitragvon yilzi » 27. Mär 2011 21:00

Das gibts doch garnicht, jetzt hats geklappt :)

Vielen vielen vielen vielen vielen Dank für die ganze Mühe!

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 27. Mär 2011 21:09

gute Arbeit, NXT pro! :)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 27. Mär 2011 21:23

Doch, das gibt's:
Das ganze heisst nicht 300°C, sondern 30.0°C. Vorher hattest du somit 3.0°C als Grenzwert eingestellt.

Hier nochmal eine genauere Erklärung des Programms:

Code: Alles auswählen


#define TEMPERATUR 300  //Hier wird der Grenzwert eingestellt

task display()    //Zum Ausgeben der aktuellen Temperatur auf dem Display
{
  {
    SelectDisplay(DISPLAY_SENSOR_1); //Sensorwert ausgeben
    Wait(10);    //100 Sekunden warten, dass das Display nicht flackert
  }
}

task main()    //Main-Task
{
  int fenster;     //Deklariation der Variable fenster
  fenster = 0;  // muss wie beschrieben evtl. Geändert werden.
  SetSensorType(SENSOR_1,SENSOR_TYPE_TEMPERATURE);  //sagt dem RCX, dass ein Temperatursensor an Port 1 angeschlossen ist
  SetSensorMode(SENSOR_1,SENSOR_MODE_CELSIUS);  //und dass er in der Einheit Celsius (mit Dezimalstelle) ausgelesen werden soll
  SetSensorType(SENSOR_2,SENSOR_TYPE_ROTATION); //sagt dem RCX, dass ein Rotationssensor an Port 2 angeschlossen ist
  SetSensorMode(SENSOR_2,SENSOR_MODE_ROTATION); //und er als Rotationssensor ausgelesen werden soll (16Schritte/Umdrehung)
  ClearSensor(SENSOR_2); //setzt den Rotationssensor zurück
  start display; //startet den Task Display
  while(true) //Endlosschleife
  {

    if (SENSOR_1 >= TEMPERATUR && fenster == 0) //wenn sensor1 größer oder gleich Grenzwert und Fenster geschlossen (variable=0)
    {
      OnFwd(OUT_A);  //Motor A anschalten
      until(SENSOR_2 >= 18*16);   //warten, bis 18 Umdrehungen gefahren (18 Umdrehungen*16Zählschritte/Umdrehung)
      Off(OUT_A); //dann motoren ausschalten
      fenster = 1;  //und schreiben, dass Fenster offen ist
    }

    if (SENSOR_1 < TEMPERATUR && fenster == 1) //wenn Sensor1 kleiner als Grenzwert und Fenster geöffnet (variable=1)
    {
      OnRev(OUT_A); //Motor A anschalten
      until (SENSOR_2 <= 0); //warten, bis Fenster wieder beim Ausgangspunkt angekommen ist
      Off(OUT_A); //Motor ausschalten
      fenster = 0; //schreiben, dass Fenster geschlossen ist.
    }
  }
}

@yilzi: wenn du noch fragen hast, bitte schreiben.
Bis wann musst du es denn in der Schule zeigen?
Könntest du vielleicht ein Video von deinem Gartenhaus drehen?
Welche RCX-Version besitzt du?(RCX 1.0; RCX 1.5 oder RCX 2.0 ?)

@FP: Hättest du es auch geschafft?
Kannst du vor den Titel bitte [gelöst] schreiben?
Real coders don't comment their code - it was hard to write, it should be hard to understand!

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 27. Mär 2011 22:37

geht auch so:

- gelöst -
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E


Zurück zu „Robotics Invention Systeme“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss