Re: Probleme mit Zeitmessung Kategorie: Programmierung (von Stefan - 17.01.2007 13:44) | ||
Als Antwort auf Re: Probleme mit Zeitmessung von Schroeder - 16.01.2007 17:58 | ||
| ||
> > Liebe Leute! > > > > Ich benutze die CC2 um per Druckluft Proben von einem Punkt A zu einem Punkt B zu schie�en und wieder > > zurück. Die Relais der C-Control steuern dabei die Druckluft. Die Zeit, wie lange die Proben in Punkt B > > verweilen, kann über die Station eingegeben werden. Wenn die Probe von Punkt B wieder zurückgeschossen > > wird, dann erhalte ich eine Anzeige, die mir die Uhrzeit des Ausschusszeitpunkts und die Verweildauer in > > Punkt B angibt. Wichtig ist für mich, dass die Verweildauer (akzeit) exakt eingehalten wird > > und zusätzlich möchte ich erreichen, dass der Ausschuss zu einer vollen Minute erfolgt. Das Problem ist > > nun, dass obwohl der Einschuss richtig erfolgt, die Ausschusszeit laut Anzeige nicht genau auf eine volle > > Minute fällt. Mit dem systeminternen Timer messe ich die Verweildauer (deltat) und die > > stimmt auch bis auf einige wenige Millisekunden. Warum stimmt die Anzeige des Ausschusszeitpunkts > > nicht? > > Ich würde mich sehr über eure Hilfe freuen. > > Stefan > > > > Hier noch der gekürzte Quellcode: > > > > // Variablen zur Zeitmessung werden definiert > > type ZeitPunkt > > { > > system.TIME zeit; > > long punkt; > > } > > > > // Funktion zum Einschie�en > > function EinSchuss(ZeitPunkt Ein) > > { > > lcdext.clear(); > > lcdext.print("Einschuss..."); > > stports.setRel(1,1); // Relais 1 wird geschaltet > > Ein.punkt=system.timer(); // Systeminterner Timer wird ausgelesen > > system.gettime(Ein.zeit); // Zeit wird ausgelesen > > sleep einzeit; > > stports.setRel(1,0); > > } > > > > // Funktion zum Ausschie�en > > function AusSchuss(ZeitPunkt Aus, int auszeit) > > { > > stports.setRel(2,1); > > Aus.punkt=system.timer(); > > system.gettime(Aus.zeit); > > lcdext.clear(); > > lcdext.print("Ausschuss..."); > > sleep auszeit; > > stports.setRel(2,0); > > } > > > > thread main > > { > > long akzeit; > > long deltat; > > long test; > > ZeitPunkt EinZeit,AusZeit; > > > > akzeit=AktZeit(akzeit); // hier wird Verweildauer eingelesen > > > > // Modulodivision, damit Einschuss erst startet, wenn die Ausschusszeit > > // auf eine volle Minute fällt > > while((system.second()+akzeit) % 60 != 0); > > EinSchuss(EinZeit); > > test=EinZeit.punkt+akzeit*1000; > > stkeyb.waitReleased(); > > while(test>system.timer())&(stkeyb.get()==255); > > AusSchuss(AusZeit,auszeit); > > stkeyb.waitReleased(); > > deltat=AusZeit.punkt-EinZeit.punkt; > > AusAnzeige(AusZeit.zeit,deltat); // Zeitanzeige > > } > > > > > > > > > > Hallo Stefan, > > wenn ich dein Programm richtig verstehe, dann wartest du erst auf eine volle Minute. > Es folgt der Einschuss, danach ein sleep auf eine mir unbekannte Zeit, > danach wartest du dann deine Deltazeit akzeit*1000 und auf eine Taste > bevor der Ausschuss erfolgt. Anhand des Ablaufes würde ich vermuten das die Auszeit > wohl sehr selten auf eine volle Minute fällt. Wie gross ist den die Differenz? > In deinem Beispiel dürfte auch die "einzeit" niemals grösser sein als akzeit*1000 da sonst die > erste Bedingung der letzten while schleife direkt erfüllt wäre. Da mit dem warten auf die Taste > macht das ganze ja erst recht unkalkulierbar. > "Immer bezugnemhmend, dass ich dein Programm auch richtig verstanden habe" > > Gruss > Peter Hallo Peter, ich warte nicht mit dem Einschuss auf eine volle Minute, sondern lege den Einschuss so, dass der Ausschuss auf eine volle Minute fällt. while((system.second()+akzeit) % 60 != 0); Die akzeit ist die Verweildauer in Punkt B. Wenn die Sekunden der momentanen Uhrzeit einen Wert erreicht haben, der nach Addition mit akzeit eine volle Minute ergibt, erfolgt der Einschuss. Die einzeit beträgt 10 und die auszeit 4 Sekunden, eine Eingabe der akzeit unter 15 Sekunden ist nicht möglich. Der Ausschuss erfolgt automatisch. Wenn system.timer gleich gro� wird wie test oder grö�er. Ein Tastendruck würde nur ein vorzeitiges Ende der Schleife und damit einen Ausschuss herbeiführen. while(test>system.timer())&(stkeyb.get()==255); Das System funktioniert eigentlich auch ganz gut und ich glaube, dass der Ausschuss auch zu einer vollen Minute erfolgt. Das Problem ist, dass die Anzeige nicht stimmt. Die Ausschussanzeige gibt mir immer einen Wert aus, der 1 bis 3 Sekunden vor Erreichen einer vollen Minute ist (also bei x Minuten und 57 bis 59 Sekunden). Ich verstehe nicht warum die Anzeige nicht stimmt. Vielleicht habe ich irgendwo beim Auslesen der Uhrzeit Probleme? Ich hoffe ich konnte das Problem nun ein wenig besser erklären. Liebe Grü�e Stefan | ||
Antwort schreiben Antworten: Re: Probleme mit Zeitmessung (von Schroeder - 18.01.2007 11:17) Re: Probleme mit Zeitmessung (von Stefan - 19.01.2007 11:38) Re: Probleme mit Zeitmessung (von Schroeder - 19.01.2007 21:09) Re: Probleme mit Zeitmessung (von Stefan - 22.01.2007 15:03) |