Announcement

Collapse
No announcement yet.

Echtzeitanwendunen in Delphi und Win98

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #31
    Hallo Hagen

    Unter Echtzeit versteht man in der Regel eine so kleine Auflösung, die reicht um die Aufgabe ohne Probleme zu lösen. Alle Steuerung haben eine gewisse Latenzzeit. Eine SPS z.B. hat auch eine gewisse Zykluszeit, welche bei anspruchsvollen Aufgaben auch zu gross sein kann. Im Gegensatz zum PC hat solch spezialisierte Hardware aber keine Aussetzer. Beim PC sind diese Aussetzer bedingt durch Zugriffe auf Festplatte, verschieben von Fenstern oder sogar blosses Bewegen der Maus. Multitasking-Systeme wie Windows haben hier ein besonderes Handikap, bedingt durch die verschiedenen Tasks. Anspruchsvolle Aufgaben schafft ein PC unter Windows desshalb nicht (z.B. Auslesen von schnellen Impulsen). In dieser Diskussion geht es um Timer, die möglichst schnell und genau sein sollten. Der PC mit Windows setzt hier gewisse Grenzen. Ich versuche nun diese so gut wie möglich auszureizen. Dazu ein Beispiel: Ich will einen Schrittmotor ansteuern. Mit dem Multimediatimer, den ich verwende erreiche ich eine max. Frequenz von 500Hz. Wenn der Schrittmotor nun 200 Schritte pro Umdrehung hat, erreiche ich 500 / 200 * 60 = 150U/min. Für meine Aufgabe reicht dies (mehr wäre zwar nicht schlecht, aber ich kann damit leben). Eine höhere Auflösung ist theoretisch möglich. Ich bin im Besitz einer Funktion, welche Microsekunden zählt. Bei meinen Versuchen mit diesem Zähler erreichte ich aber keine höhere Frequenz als mit dem Multimedia-Timer. Eine höhere Frequenz könnte sich ergeben, wenn der PC schneller ist. Einen schnelleren PC habe ich zwar nicht, doch auf auf einem langsameren (200PI statt 350PII) erreichte ich dieselbe Auflösung. Wahrscheinlich muss der PC dann ein Stück schneller sein, damit sich die Steigerung bemerkbar macht. Als zweite Möglichkeit zur Steigerung der Geschwindigkeit sehe ich noch die Optimierung: Overhead verkleinern, Thread-Priorität hoch, Routinen am Besten in Assembler, keine unnötigen Programme im Hintergrund usw. Bevor ich mich jetzt aber ans Optimieren mache, versuche ich erst einmal die Schrittmotorsteuerung zu komplettieren (Es entsteht eine TSteppermotor - Komponente, ob diese dem Overhead gut tut?)

    Damit habe ich jetzt meine Erkenntnisse zusammengetragen. Auf Verbesserungsvorschläge bin ich gespannt.

    Gruss And

    Comment


    • #32
      Hallo,

      ich habe so einige Echtzeitanwendungen (mit Interbus, Can-Bus, RS485 und dergleichen) geschrieben, und kann ein paar Zusammenhänge beitagen:

      Grundsätzlich ist Windows nicht Echtzeitfähig und auch nie 100% dazu zu vergewaltigen. Es bleibt immer ein Kompromiß zwischen Komfort und Geschwindigkeit. Sowohl beim Multimediatimer als auch beim Thread (höchste Priorität) bleibt die kleinste Zeiteinheit 1 ms.

      Der Multimediatimer stimmt zwar im Mittel aber mit dem Oscilloskop die Zeiten kontrolliert, wird einem übel. Dieser Timer stimmt im Mittel über einen großen Zeitraum sehr genau. Die Einzelintervalle allerdings können von 50 us bis mehreren 10 ms dauern. Dieser Timer holt nämlich die durch andere Rechenzeitverteilung verlorengegangenen Ticks unmittelbar hintereinander nach.

      Der Thread ist zwar erst ab 5-10 ms so richtig reproduzierbar, aber dann wesentlich verlässlicher als der MM-Timer. Ich benutze lieber den Thread.

      Es gibt aber immer noch Betriebssystemzugriffe, die höhere Priorität haben, und beide Timer ausbremsen. Wenn z.B. auf ein Diskettenlaufwerk zugegriffen wird, und keine Diskette eingelegt ist, oder wenn im Netz ein nicht vorhandenes Verzeichnis angesprochen wird, steht wirklich alles.

      Wirkliche Echtzeit unter Windows geht aber letztlich doch, und wird von einigen großen Firmen auch praktiziert. Ich selber kenne nur die Vorgehensweise aus einigen Fachvorträgen: Man "löte" an den NMI des Prozessors, der in einem PC nämlich nicht benutzt wird, einen Harware-Timer. Die Interruptroutine liegt beim NMI unverschiebbar an fester Adresse. Hier muß dann ein Assemblerprogramm dafür sorgen daß ein bestimmter Algorithmus abläuft. Aber vorsicht: Die Komunikation mit Windows bzw. Delphi dürfte wohl sehr kompliziert werden. Um Vxd-Treiber oder ähnlichem kommt man wohl nicht herum. Allerdings kann dieser Interrupt dann im Extremfall weit schneller als 1 Microsekunde (Micro ist richtig) sein.

      mfg Pete

      Comment


      • #33
        Hi

        Peter, Du sprichst mir aus der Seele. Meine Anmerkung das der Thread/Process hoch priorisiert werden sollte, bezog sich nicht darauf eine höhere Auflösung zu erreichen, sondern dient einfach nur zur "Stabilisierung" der eigenen Routine. Wie gesagt, sollte man mit zu geringer Priorität fahren, werden garantiert andere Threads/Processe dazwischenfunken.

        Hi Andy

        Du solltest überlegen in dem "Ansteuerungs-Thread" nur zwischengepufferte Ansteuerungsbefehle auszufürhren. Dies macht die Hauptanwendung indem der Thread lauft stabiler und der Thread kann sich auf die wesentliche Arbeit, zu steuern, konzentrieren. Ich glaube mit einer Zwischengepufferten Ansteuerungssequenz, die dann zeitkorrekt vom Thread abgearbeitet wird, hast Du schon viel gewonnen.
        Ansonsten bleibt Dir wohl nur übrig auf BCB umzusteigen und VxD's zu programmieren.

        Gruß Hage

        Comment


        • #34
          Hallo,

          ich glaube, zu den hier angesprochenen Defiziten unter Windows (z.B. genaue Millisekunden-Timer) haben wir einiges anzubieten. Ich will jetzt hier aber nicht viel Werbung machen - wer Interesse hat, kann sich ja mal auf unserer Web-Seite informieren: www.kithara.de

          Gruss
          Stefa

          Comment


          • #35
            <p>So nach einer langen Pause bin ich wieder einmal hier.</p>
            <p>Unterdessen läuft schon einiges. Die Bemerkungen über die Echtzeitfähigkeit haben sich alle bewahrheitet, von Zeit zu Zeit
            stockt der Motor kurz. Glücklicherweise ist dies bei meine Anwendung nicht so kritisch, ich kann damit Leben.</p>
            <p>Was den Timer angeht: Der Motor rutscht bei 250Hz durch, so dass ich auch den Thread nehmen könnte. Der Windows-Timer
            hat halt eben die oben genannten Nachteile.</p>
            <p>Ansonsten danke ich allen, welche mir geholfen haben, dass sich der Motor jetzt zumindest dreht!</p>
            <p>Gruss Andy</p&gt

            Comment


            • #36
              Es gibt die API-Funktionen QueryPerformanceCounter() und QueryPerformnaceFrequency() um zeit-genaueren Thread (meist µS genau) zu erzeugen. Man muß aber zusätzlich die Thread-Priorität auf Echtzeit einstellen dann saust jeder Motor wie F1.
              Vergiß den Windows-Timer

              Comment


              • #37
                Hmm, versuche ich einmal. Wichtige ist in diesem Fall nicht die max. frequenz (wenn sie über 500Hz) liegt, sondern die Genauigkeit (Periodenabstände)

                Comment


                • #38
                  Läuft es wenigstens mit 500Hz frequenzstabil, also windows98 bedienen, programm bedienen? Ich habe nämlich was geschrieben, was windows lahmlegt, genausogut kann man auch dos aus windows starten, und so lange man dort ist kann man alles tun, nur kein windows. Ich frage mich allmählich, ob man sich unter windows nicht zu sehr verbiegen muß. Kann man nicht einen Interrupt-Timer als assemblercode schreiben und am BS vorbei auf die Ports schreiben? Was interessiert mich ein Druckertreiber, wenn ich Schrittmotoren ansteuern will?
                  Hat jemand erfolge zu vermelden? in welcher richtung?
                  gruß
                  andrea

                  Comment


                  • #39
                    Um es im Windows "sauber" hinzubekommen musst Du vom Delphi abstand nehmen und am besten in die MS C++ Fraktion wechseln. Nur da kann man mit relativ geringem Aufwand seinen eigenen Gerätetreiber coden. Dieser ist dann sehr wohl in der Lagen auf Ports und Interrupts zuzugreifen. Allerdings aus Sicht eines Delphi Entwicklers sind das Unterschiede wie zwischen verschiedenen Welten.<br>
                    Natürlich, hat man sich erstmal eingearbeitet und kommt zurecht (nach 2-3 Monaten) dann sagt man sich immer " ach eigentlich recht simpel ".<br>

                    Auch bist Du dann hier in diesem Forum falsch, es gibt für diesen Bereich bessere Foren. Schau mal bei Experts Exchange rein.

                    Gruß Hage

                    Comment

                    Working...
                    X