Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Programm springt nicht in die Regelschleife Kategorie: Programmierung (von Erich - 10.08.2006 10:20)
Ich nutze:
C164CI-ControllerBoard, CC2-Application-Board, OSOPT V3.1
Hallo liebe Freunde :-)


Mein altes Problem "Programm läuft nicht" besteht weiterhin. Aber das Problem hat sich verlagert.
Dank Ingo, der das Menü simplifiziert hat, kann man wenigstens Werte eingeben
(leider ist das Menü nur nicht mehr so, dass es bei jeder Fehleingabe nachfragt - damit gehts wohl
schlicht und einfach nicht).
Ab und zu wird in die Routine "Startposition anfahren" gesprungen (wenn ich ein loop mit break statt
while blubb <= bla schreibe)
und gar nicht in die Regelschleife - je nachdem, ob while oder loop dasteht, heiÃ?t es dann ganz am
Ende immer "laenge = 0" auf dem Display, aber "lagen = 6" oder "lagen = 0".


Logikfehler in der REgelschleife sind weiterhin meine Sache, aber warum springt es nicht hinein?
(Quelltext unten)

Erich





long
  TrommelBreite,
  Hoehe[3],

  Puls0[3], Puls1[3], Puls2[3], PID,
  TrommelAbstand, counter, count1, count2, boolturn, turncount, ok,
  port2cnt[3], timerTor, tAvgl, laenge, Lagen, laengencount, lagencount, temp, port1cnt[3], FD, ErrCnt;



  string s;

//string auf LCD ausgeben, Tastaturcode zurückgeben
  function keyvalue(string s) returns long
  {
   lcdext.clear();
   lcdext.goto(1, 0);
   lcdext.print(s);
   return keyboardmod.getcode();
  }
 
 
 
//------------
  thread main
//------------
{

  lcdext.init();

  ports.deact(8);
  ports.deact(9);
  ports.deact(10);

  ports.getcount(0);
  ports.getcount(1);
  ports.getcount(2);
  ports.deact(11);
  ports.deact(12);
  ports.deact(13);
  ports.deact(14);

  ErrCnt = 0;
  boolturn = 0;

  plm.setperiod(0, 3000);
  plm.setperiod(1, 3000);
  plm.setperiod(2, 3000);

  counter = 0;
  count1 = 0;
  count2 = 0;
  turncount = 0;

  port1cnt = 0;
  port2cnt = 0;

  plm.out(0, 0);
  plm.out(1, 0);
  plm.out(2, 0);
  ports.set(15, 1);

  wait ports.get(12); // wartet auf High-pegel am Port
 
  ports.set(15, 0);


  Puls1[0] = 0;  Puls1[1] = 0;  Puls1[2] = 0;
  Puls0[0] = 0;  Puls0[1] = 0;  Puls0[2] = 0;
  Puls2[0] = 0;  Puls2[1] = 0;  Puls2[2] = 0;

  lagencount = 0;
  laengencount = 0;

  tAvgl = system.timer();
  timerTor = system.timer ();

  ok = 0;


//Menü
  while ok != 1
  {
     laenge = 0;
     s = "Laenge dm?";
     laenge = keyvalue(s);

     Lagen = 0;
     if laenge == 0
     {
       s = "Lagen";
       Lagen = keyvalue(s);
     }

     s = "TrAbst mm";
     TrommelAbstand = 4*(keyvalue(s)- 40);
     if (TrommelAbstand <= 0)
       TrommelAbstand = 0;

     s = "TrBreit mm";
     TrommelBreite = TrommelAbstand + 4*keyvalue(s);
     if TrommelBreite > 210*4
       TrommelBreite = 210*4;

     s = "Faserd. in um?";
     FD = keyvalue(s)*(8/51); //Verhältnis wichtig! Faserdicke * Encoder-Ergebnis1 * (32/51)/ 4

     s = "1 = ok";
     ok = keyvalue(s);
     
     lcdext.clear();
  }
 
//Ende Menü
  counter = ports.getcount(2);
// Wickelführung: Startposition anfahren - da geht das Programm alle Schaltjahre rein
  temp = 0;
  plm.out(1, 2300);
  loop
  {
   temp = temp + ports.getcount(1);
   if temp >= TrommelAbstand
     break;
   lcdext.goto(1,0);
   s="count(1):";
   str.putlong(s,temp);
   lcdext.print(s);
   lcdext.goto(2,0);
   s="TrAbstand:";
   str.putlong(s,TrommelAbstand);
   lcdext.print(s);
   lcdext.clear();
  }
 
  lcdext.clear();
  plm.out(1, 0);

//  Regelschleife - die kann ich total vergessen

  loop
  {

    if ((Lagen != 0) and (lagencount == Lagen))
    or ((laenge != 0) and (laenge <= counter)) or (ports.get(13) == 1)
    or (ErrCnt >= 5)
      break;

    if (system.timer()-500) >= tAvgl
    {
      Hoehe[0] = ports.adc(0) - 500;
      Puls2[0] = Puls2[1] - 1*(Hoehe[0] - 1*Hoehe[1] + 1*Hoehe[0] - 1*(2*Hoehe[1] - Hoehe[2] -
        Hoehe[0]));
      if (Puls2[0] >= 3000)
        Puls2[0] = 3000;
      if (Puls2[0] < 0)
        Puls2[0] = 0;

      Hoehe[2] = Hoehe[1];
      Hoehe[1] = Hoehe[0];
      tAvgl = system.timer();
      plm.out(2, Puls2[0]);
    }
    if (system.timer()-1000) >= timerTor
    {
      count1 = ports.getcount(1);
      if boolturn == 0
        turncount = turncount + count1;
      if boolturn == 1
        turncount = turncount - count1;
      port1cnt[0] = ports.getcount(1)*1000 - FD*(ports.getcount(0)); //*1000, da FD integer bleiben soll.
        Puls1[0] = Puls1[2] + 0.1*(port1cnt[0] - 1*port1cnt[1] + 1*port1cnt[0] - 1*(2*port1cnt[1] -
          port1cnt[2] - port1cnt[0]));

      if (Puls1[0] > 3000)
        Puls1[0] = 3000;
      if (Puls1[0] < 0)
        Puls1[0] = 0;

      Puls1[2] = Puls1[1];
      Puls1[1] = Puls1[0];
      port1cnt[2] = port1cnt[1];
      port1cnt[1] = port1cnt[0];
      timerTor = system.timer();

      if (turncount > TrommelBreite)and(boolturn==0)
      {
        boolturn = 1;
        ports.set(15, 1);
        lagencount = lagencount + 1;
      };
      if (turncount < TrommelAbstand)and(boolturn==1)
      {
        boolturn = 0;
        ports.set(15,0);
        lagencount = lagencount + 1;
      };

      if boolturn == 0
        plm.out(1, Puls1[0]);
      else
        plm.out(1, 3000 - Puls1[0]);

      count2 = ports.getcount(2);
      if count2 != 0
         ErrCnt = 0;
      else
         ErrCnt = ErrCnt + 1;
      counter = (counter + count2)/11;
      if counter >= laenge
        break;

      port2cnt[0] = count2 - ports.adc(1)/40
      if (port2cnt[0] >= 0)
        PID = 1;

      if PID != 1
      {
        Puls0[0]= Puls0[0] + 40;
        Puls0[1]= Puls0[0];
        Puls0[2]= Puls0[0];
        port2cnt[1] = port2cnt[0];
        port2cnt[0] = port2cnt[0];
      }
      else
      {
        Puls0[0] = Puls0[2] + 0.01*(port2cnt[0] - 1*port2cnt[1] + 1*port2cnt[0] - 1*(2*port2cnt[1] -
          port2cnt[2] - port2cnt[0]));
        Puls0[2] = Puls0[1];
        Puls0[1] = Puls0[0];
        port2cnt[2] = port2cnt[1];
        port2cnt[1] = port2cnt[0];
      }
      plm.out(0, Puls0[0]);
      timerTor = system.timer();
    }
  }
 
 
 
 
  plm.out(1, 0);
  lcdext.clear();
  s = "Laenge: ";
  str.putint(s, counter);
  lcdext.goto(1, 0);
  lcdext.print(s);
  s = "Lagen: ";
  str.putint(s, lagencount);
  lcdext.goto(2, 0);
  lcdext.print(s);
  plm.out(1, 0);
  ports.set(15, 0);

  halt;
}


    Antwort schreiben


Antworten:

uuuf - habs (von Erich - 10.08.2006 15:49)