Programm springt nicht in die Regelschleife Kategorie: Programmierung (von Erich - 10.08.2006 10:20) | ||
| ||
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) |