Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > > 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 (<code>akzeit</code>) 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 (<code>deltat</code>) 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: > > > > <code>// 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 > > }</code> > > > > > > > > > > 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