Zeitsynchronisierung auf zwei Computern



  • Ich lasse zwei C-Programme auf verschiedenen Computern laufen, die miteinander kommunizieren sollen. Konkret geht es um eine Entfernungsmessung:

    Computer A sendet ein Ultraschall-Signal, Computer B empfängt es und berechnet aus der Laufzeit die Distanz. Das Problem ist nun, wie Computer A Computer B mitteilen kann, dass das Ultraschall-Signal unterwegs ist.

    Was ich bisher probiert habe:

    1. A sendet ein Signal über WLAN. Problem: TCP/IP ist nicht dafür geschaffen, Signale in Echtzeit zu übertragen. Die Sendezeit über WLAN variiert sehr stark.

    2. A sendet ein Signal über Bluetooth. Problem: Die Zeit zur Signalübermittlung ist auch hier nicht konstant.

    Was ich mir noch vorstellen könnte:
    Die Uhren von A und B laufen synchron und es wird zu jeder vollen Sekunde ein Ultraschall-Signal gesendet. Dann muss B nur die Zeit zwischen der vollen Sekunde und dem Eintreffen des Signals messen.
    Allerdings habe ich keine Ahnung wie man Funktionen zu jeder vollen Sekunde startet. Geht das überhaupt? Und habt ihr vielleicht noch andere Ideen?



  • A sendet ein Signal an B. Sobald es ankommt, sendet B ein Signal an A. Der kann nun die Zeitdauer halbieren und die Entfernung berechnen, so entfällt das Synchronisieren der Uhren.



  • Das ist natürlich eine gute Idee. Leider hat aber A nur einen Sender und B nur einen Empfänger 😞



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Installiere auf dem einen Rechner einen NTP Server und synchronisiere die beiden Rechner.

    Hinweise gibt es bei der PTB.

    Unter welchem Betriebsystem soll das denn laufen?


  • Mod

    snOOfy schrieb:

    Das ist natürlich eine gute Idee. Leider hat aber A nur einen Sender und B nur einen Empfänger 😞

    Ich behaupte mal, dann ist es unmöglich außer du bringst mehr ins System, z.B. eine dritte Uhr mit der beide reden können.



  • snOOfy schrieb:

    1. A sendet ein Signal über WLAN. Problem: TCP/IP ist nicht dafür geschaffen, Signale in Echtzeit zu übertragen. Die Sendezeit über WLAN variiert sehr stark.

    Hast du das probehalber mal mit UDP getestet?



  • @DirkB: NTP ist nicht genau genug. Ich habe es getestet und es schafft nur etwa eine Genauigkeit von 10ms. In der Zeit legt das Ultraschallsignal schon 10*10^(-3)s*343m/s=3,4m zurück. Ich erhoffe mir eigentlich einen Messfehler von höchstens 10cm. Aber vielleicht ist das ja utopisch...

    Zum Betriebssystem: Ubuntu auf Computer A, Debian auf Computer B.

    @cooky451: Nein, UDP habe ich noch nicht getestet. Bis eben habe ich da noch nie von gehört. Wenn du meinst dass das vielversprechend ist könnte ich mich da mal einarbeiten.



  • snOOfy schrieb:

    @cooky451: Nein, UDP habe ich noch nicht getestet. Bis eben habe ich da noch nie von gehört. Wenn du meinst dass das vielversprechend ist könnte ich mich da mal einarbeiten.

    TCP ist eigentlich eher zur Datenübertragung gedacht. TCP garantiert dass die Daten ankommen, dass sie vollständig ankommen, dass sie in der richtigen Reihenfolge ankommen, blah. Deswegen ist TCP nicht wirklich schnell. UDP garantiert quasi nichts, hat dafür aber auch kaum Overhead und ist schnell. Echtzeit Multiplayerspiele nutzen z.B. UDP. Ob das bei dem einen Signal einen großen Unterschied macht weiß ich nicht, aber ein Versuch ist es wert. (Der Aufwand von TCP auf UDP umzustellen dürfte minimal sein, wenn du Sockets vom System hast.)



  • Du kannst auch an jeden Rechner einen GPS- oder DCF77-Empfänger anschließen und deren Zeit nehmen.

    Bei DCF77 hast du auch gleich den Sekundentakt.



  • 340 cm = 10 ms
    10 cm = 10 ms / 34 ≈ 300 ns.

    Schau dir doch mal das Verfahren an, dass das Cern bei den überlichtschnellen Neutrinos benutzt hat: http://www.heise.de/newsticker/meldung/Wirbel-um-Fehler-bei-den-ueberschnellen-Neutrinos-1362506.html
    Ganz so genau brauchst du es ja nicht.



  • DCF77 klingt interessant, ich weiß nur nicht ob man das hier drinnen überhaupt empfängt und die USB-Empfänger sind garnicht mal so günstig. Und wer weiß ob ich die Uhren damit tatsächlich auf 300ns genau bekomme.
    Im Moment erhoffe ich mir mehr von dem Ansatz mit dem "jetzt wird gesendet"-Signal. Selbst wenn die Übertragung dieses Signals nicht in Echtzeit erfolgt könnte es ja sein, dass ich eine Übertragungsart mit konstanter Verzögerung finde, so dass ich das rausrechnen kann.



  • snOOfy schrieb:

    ..., dass ich eine Übertragungsart mit konstanter Verzögerung finde, so dass ich das rausrechnen kann.

    Wird auch nicht besser sein als bei NTP.

    Es gibt aber auch Echtzeit-Ethernet.

    Zudem darfst du die Latenz von deinem System nicht unterschätzen.



  • schau mal hier: http://en.wikipedia.org/wiki/IEEE_1588
    gibt's auch für linux, und kann sogar die phase synchronisieren.

    ansonsten kann man auch über das medium synchronisieren, z.b. mit: http://en.wikipedia.org/wiki/Synchronous_Ethernet
    ist vielleicht das, was der DirkB meint.


Anmelden zum Antworten