Re: Probleme mit Zeitmessung Kategorie: Programmierung (von Schroeder - 16.01.2007 17:58) | ||
Als Antwort auf Probleme mit Zeitmessung von Stefan - 16.01.2007 13:47 | ||
| ||
> 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 | ||
Antwort schreiben Antworten: Re: Probleme mit Zeitmessung (von Stefan - 17.01.2007 13:44) 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) |