Autor Beitrag
Kay E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Do 02.12.10 12:22 
Hallo zusammen!

Für meine Diplomarbeit muss ich ein Programm schreiben, das mir eine Zeitmessung auf die Zehntelsekunde genau garantiert.
Genauer: Ich muss Ventilöffnungszeiten schalten. Dazu war der Gedanke, ich nehme einfach eine TTimer-Komponente und weise der als Intervall-Länge die Öffnungsdauer des Ventils zu. Wenn das Ventil geschlossen ist, wirds geöffnet, ansonsten wirds geschlossen.
Ich hab dann durch Zufall mitbekommen, dass die TTimer-Komponente massive Abweichungen von bis zu 10% vom Sollwert haben kann und stark von der prozessorauslastung abhängt. Dazu hab ich ein programm geschrieben, dass 10 Minuten mit einem bestimmten Intervall runterzählt und dann die tatsächlich benötigte zeit mit der Sollzeit vergleicht. Die Datei dazu ist im Anhang, falls es jemanden interessiert.

Die eigentliche Frage ist jetzt: Wie kann ich die Schaltzeiten (mehr oder weniger) garantieren? Eine genauigkeit von einer Zehntelsekunde mit einem Fehler von 15% wäre akzeptabel.

Für Tipps und Vorschläge wär ich sehr dankbar!

Grüße Kay
Einloggen, um Attachments anzusehen!
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Do 02.12.10 12:28 
Vielleicht hilft dir das hier: Suche in: Delphi-Forum, Delphi-Library QUERYPERFORMANCECOUNTER
Den kannst du in eine (Endlos-)Schleife packen und prüfen, wann die Zeit abgelaufen ist. Dann feuerst du entsprechend dein Event.
Garantieren kannst du damit aber auch nichts. Nicht bei einem Betriebssystem mit präemptiven Scheduling.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 02.12.10 12:44 
Soweit ich weiß, hat der Timer eine Auflösung von ca. 15ms. Genauere Werte sind da nicht drin. Wenn du nur eine Genauigkeit im Zehntelsekundenbereich benötigst (= 100ms), dann sollte ein Timer eigentlich noch ausreichen. Wenn man den Timer für einen Countdown nimmt, können sich natürlich Abweichungen mehr oder weniger stark aufaddieren. Daher sollte man dann in jedem OnTimerEvent die aktuelle Zeit mit der Zielzeit vergleichen und nicht einfach annehmen "nach x Intervallen ist es soweit".

Eine wirklich genaue Zeit kannst du mit Windows wie schon gesagt nicht garantieren, allerdings habe ich bei den Zeitmessungen für einige Algorithmen bei meiner Diplomarbeit mit QueryPerformanceCounter nur Abweichungen im Millisekundenbereich beobachten können (oder noch nichtmal das). Das sollte für deine Zwecke sicher ausreichen. :)

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.12.10 12:53 
Ein Timer ist in der Endphase der Schaltung ungeeignet. Denn er basiert auch Windows Messages. Und wenn die nicht sofort abgearbeitet werden, verzögert sich das auch schon mal.

Deshalb solltest du einfach schauen, dass du ein paar Sekunden von der eigentlichen Schaltung in eine Schleife gehst und dort dann zwar CPU-Leistung verschwendest, aber dafür auch sehr genau die Zeit treffen kannst.

Deine Abweichung ist aber extrem, das ist dann wohl eher ein Programmierfehler wie user profile iconGausi schon meinte:
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Daher sollte man dann in jedem OnTimerEvent die aktuelle Zeit mit der Zielzeit vergleichen und nicht einfach annehmen "nach x Intervallen ist es soweit".
Denn die Anzahl der Events zählen, ist eine seltsame Idee.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Fr 03.12.10 15:42 
Hallo zusammen!

Was das Zählen der Intervalle angeht: Das hab ich nur gemacht, um die Differenz des Timers herauszufinden. Schlussendlich im Programm wird das dann anders gelöst werden.

Ich habe gestern mittag die Application.OnIdle-Methode implementiert und wieder die Nacht durchlaufen lassen. Im Anhang stehen die Ergebnisse. Zusammenfassend kann man sagen, dass die Methode drastisch genauer ist, als das TimerEvent, wobei es immer noch sehr Prozessorlast-abhängig ist (siehe markierte Stelle im File). Aber ich denke, solange auf dem Rechner kein anderes aktives Programm läuft (abgesehen von den Standart-Windows-Diensten etc.), sollte das so funktionieren.

Wie ich den QueryPerfomanceCounter zu benutzen habe, war mir schleierhaft. Wenn ich in der Delphi-Hilfe danach suche, wird mir nur die function Ticks angezeigt - was ja nicht wirklich das gleiche sein dürfte...

Danke für euren Input! Ich denke, die Genauigkeit, die ich da mit dem Testprogramm erreicht hab, sollte für die Ansteuerung ausreichen.


Grüße!
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 03.12.10 16:16 
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Wie ich den QueryPerfomanceCounter zu benutzen habe, war mir schleierhaft.
Siehe Dokumentation:
msdn.microsoft.com/e...ms644904(VS.85).aspx

user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich in der Delphi-Hilfe danach suche, wird mir nur die function Ticks angezeigt - was ja nicht wirklich das gleiche sein dürfte...
Das ist eine API-Funktion, deshalb steht die auch nicht in der Delphi-Hilfe drin. Wenn, dann nur in der mitgelieferten Hilfe zur API.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Fr 03.12.10 16:51 
Aaaah, das erklärt einiges. Les ich mir gleich mal durch, danke dir!
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 03.12.10 17:35