408 lines
14 KiB
HTML
408 lines
14 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
|
|||
|
<TITLE>NTP PARSE clock data formats</TITLE>
|
|||
|
<h1>NTP PARSE clock data formats</h1>
|
|||
|
|
|||
|
<p>The parse driver currently supports several clocks with different
|
|||
|
query mechanisms. In order for you to find a sample that might be
|
|||
|
similar to a clock you might want to integrate into parse i'll sum
|
|||
|
up the major features of the clocks (this information is distributed
|
|||
|
in the parse/clk_*.c and ntpd/refclock_parse.c files).
|
|||
|
|
|||
|
<hr>
|
|||
|
<h2>Meinberg clocks</h2>
|
|||
|
<pre>
|
|||
|
Meinberg: start=<STX>, end=<ETX>, sync on start
|
|||
|
pattern="\2D: . . ;T: ;U: . . ; \3"
|
|||
|
pattern="\2 . . ; ; : : ; \3"
|
|||
|
pattern="\2 . . ; ; : : ; : ; ; . . "
|
|||
|
</pre>
|
|||
|
<p>
|
|||
|
Meinberg is a german manufacturer of time code receivers. Those clocks
|
|||
|
have a pretty common output format in the stock version. In order to
|
|||
|
support NTP Meinberg was so kind to produce some special versions of
|
|||
|
the firmware for the use with NTP. So, if you are going to use a
|
|||
|
Meinberg clock please ask whether there is a special Uni Erlangen
|
|||
|
version.
|
|||
|
You can reach <A HREF="http://www.meinberg.de/">Meinberg</A> via the Web.
|
|||
|
Information can also be ordered via eMail from <A HREF="mailto: info@meinberg.de">info@meinberg.de</A>
|
|||
|
|
|||
|
<p>
|
|||
|
General characteristics:
|
|||
|
<br>
|
|||
|
Meinberg clocks primarily output pulse per second and a describing
|
|||
|
ASCII string. This string can be produced in two modes. either upon
|
|||
|
the reception of a question mark or every second. NTP uses the latter
|
|||
|
mechanism. The DCF77 variants have a pretty good relationship between
|
|||
|
RS232 time code and the PPS signal while the GPS receiver has no fixed
|
|||
|
timeing between the datagram and the pulse (you need to use PPS with
|
|||
|
GPS!) on DCF77 you might get away without the PPS signal.
|
|||
|
<pre>
|
|||
|
The preferred tty setting for Meinberg is:
|
|||
|
CFLAG (B9600|CS7|PARENB|CREAD|HUPCL)
|
|||
|
IFLAG (IGNBRK|IGNPAR|ISTRIP)
|
|||
|
OFLAG 0
|
|||
|
LFLAG 0
|
|||
|
</pre>
|
|||
|
<pre>
|
|||
|
The tty setting for Meinberg GPS 166/167 receivers is:
|
|||
|
CFLAG (B19200|CS8|PARENB|CREAD|HUPCL)
|
|||
|
IFLAG (IGNBRK|IGNPAR|ISTRIP)
|
|||
|
OFLAG 0
|
|||
|
LFLAG 0
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>
|
|||
|
The clock is run at datagram once per second.
|
|||
|
Stock dataformat is:
|
|||
|
<pre>
|
|||
|
<STX>D:<dd>.<mm>.<yy>;T:<w>;U:<hh>:<mm>:<ss>;<S><F><D><A><ETX>
|
|||
|
pos: 0 00 00 0 00 0 11 111 1 111 12 2 22 2 22 2 2 2 3 3 3
|
|||
|
1 23 45 6 78 9 01 234 5 678 90 1 23 4 56 7 8 9 0 1 2
|
|||
|
|
|||
|
<STX> = '\002' ASCII start of text
|
|||
|
<ETX> = '\003' ASCII end of text
|
|||
|
<dd>,<mm>,<yy> = day, month, year(2 digits!!)
|
|||
|
<w> = day of week (sunday= 0)
|
|||
|
<hh>,<mm>,<ss> = hour, minute, second
|
|||
|
<S> = '#' if never synced since powerup else ' ' for DCF U/A 31
|
|||
|
'#' if not PZF sychronisation available else ' ' for PZF 535
|
|||
|
<F> = '*' if time comes from internal quartz else ' '
|
|||
|
<D> = 'S' if daylight saving time is active else ' '
|
|||
|
<D> = 'U' if UTC time code is deliverd else ' '
|
|||
|
<A> = '!' during the hour preceeding an daylight saving time
|
|||
|
start/end change
|
|||
|
<A> = 'A' if a leap second is announced
|
|||
|
</pre>
|
|||
|
|
|||
|
<pre>
|
|||
|
<STX><dd>.<mm>.<yy>; <w>; <hh>:<mm>:<ss>; <U><S><F><D><A><L><R><ETX>
|
|||
|
pos: 0 00 0 00 0 00 11 1 11 11 1 11 2 22 22 2 2 2 2 2 3 3 3
|
|||
|
1 23 4 56 7 89 01 2 34 56 7 89 0 12 34 5 6 7 8 9 0 1 2
|
|||
|
<STX> = '\002' ASCII start of text
|
|||
|
<ETX> = '\003' ASCII end of text
|
|||
|
<dd>,<mm>,<yy> = day, month, year(2 digits!!)
|
|||
|
<w> = day of week (sunday= 0)
|
|||
|
<hh>,<mm>,<ss> = hour, minute, second
|
|||
|
<U> = 'U' UTC time display
|
|||
|
<S> = '#' if never synced since powerup else ' ' for DCF U/A 31
|
|||
|
'#' if not PZF sychronisation available else ' ' for PZF 535
|
|||
|
<F> = '*' if time comes from internal quartz else ' '
|
|||
|
<D> = 'S' if daylight saving time is active else ' '
|
|||
|
<A> = '!' during the hour preceeding an daylight saving time
|
|||
|
start/end change
|
|||
|
<L> = 'A' LEAP second announcement
|
|||
|
<R> = 'R' alternate antenna
|
|||
|
</pre>
|
|||
|
<p>Meinberg GPS166 receiver
|
|||
|
<br>
|
|||
|
You must get the Uni-Erlangen firmware for the GPS receiver support
|
|||
|
to work to full satisfaction !
|
|||
|
<pre>
|
|||
|
<STX><dd>.<mm>.<yy>; <w>; <hh>:<mm>:<ss>; <+/-><00:00>; <U><S><F><D><A><L><R><L>; <position...><ETX>
|
|||
|
*
|
|||
|
000000000111111111122222222223333333333444444444455555555556666666
|
|||
|
123456789012345678901234567890123456789012345678901234567890123456
|
|||
|
\x0209.07.93; 5; 08:48:26; +00:00; ; 49.5736N 11.0280E 373m\x03
|
|||
|
*
|
|||
|
|
|||
|
<STX> = '\002' ASCII start of text
|
|||
|
<ETX> = '\003' ASCII end of text
|
|||
|
<dd>,<mm>,<yy> = day, month, year(2 digits!!)
|
|||
|
<w> = day of week (sunday= 0)
|
|||
|
<hh>,<mm>,<ss> = hour, minute, second
|
|||
|
<+/->,<00:00> = offset to UTC
|
|||
|
<S> = '#' if never synced since powerup else ' ' for DCF U/A 31
|
|||
|
'#' if not PZF sychronisation available else ' ' for PZF 535
|
|||
|
<U> = 'U' UTC time display
|
|||
|
<F> = '*' if time comes from internal quartz else ' '
|
|||
|
<D> = 'S' if daylight saving time is active else ' '
|
|||
|
<A> = '!' during the hour preceeding an daylight saving time
|
|||
|
start/end change
|
|||
|
<L> = 'A' LEAP second announcement
|
|||
|
<R> = 'R' alternate antenna (reminiscent of PZF535) usually ' '
|
|||
|
<L> = 'L' on 23:59:60
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>For the Meinberg parse look into clock_meinberg.c
|
|||
|
|
|||
|
<br>
|
|||
|
<h2>Raw DCF77 Data via serial line</h2>
|
|||
|
<p>RAWDCF: end=TIMEOUT>1.5s, sync each char (any char),generate psuedo time
|
|||
|
codes, fixed format
|
|||
|
<p>
|
|||
|
direct DCF77 code input
|
|||
|
|
|||
|
<p>In Europe it is relatively easy/cheap the receive the german time code
|
|||
|
transmitter DCF77. The simplest version to process its signal is to
|
|||
|
feed the 100/200ms pulse of the demodulated AM signal via a level
|
|||
|
converter to an RS232 port at 50Baud. parse/clk_rawdcf.c holds all
|
|||
|
necessary decoding logic for the time code which is transmitted each
|
|||
|
minute for one minute. A bit of the time code is sent once a second.
|
|||
|
|
|||
|
<pre>
|
|||
|
The preferred tty setting is:
|
|||
|
CFLAG (B50|CS8|CREAD|CLOCAL)
|
|||
|
IFLAG 0
|
|||
|
OFLAG 0
|
|||
|
LFLAG 0
|
|||
|
</pre>
|
|||
|
|
|||
|
<h2>DCF77 raw time code</h2>
|
|||
|
|
|||
|
|
|||
|
<p>From "Zur Zeit", Physikalisch-Technische Bundesanstalt (PTB), Braunschweig
|
|||
|
und Berlin, M<>rz 1989
|
|||
|
<br>
|
|||
|
<pre>
|
|||
|
Timecode transmission:
|
|||
|
|
|||
|
AM:
|
|||
|
|
|||
|
time marks are send every second except for the second before the
|
|||
|
next minute mark
|
|||
|
time marks consist of a reduction of transmitter power to 25%
|
|||
|
of the nominal level
|
|||
|
the falling edge is the time indication (on time)
|
|||
|
time marks of a 100ms duration constitute a logical 0
|
|||
|
time marks of a 200ms duration constitute a logical 1
|
|||
|
|
|||
|
FM:
|
|||
|
|
|||
|
see the spec. (basically a (non-)inverted psuedo random phase shift)
|
|||
|
|
|||
|
Encoding:
|
|||
|
|
|||
|
Second Contents
|
|||
|
0 - 10 AM: free, FM: 0
|
|||
|
11 - 14 free
|
|||
|
15 R - alternate antenna
|
|||
|
16 A1 - expect zone change (1 hour before)
|
|||
|
17 - 18 Z1,Z2 - time zone
|
|||
|
0 0 illegal
|
|||
|
0 1 MEZ (MET)
|
|||
|
1 0 MESZ (MED, MET DST)
|
|||
|
1 1 illegal
|
|||
|
19 A2 - expect leap insertion/deletion (1 hour before)
|
|||
|
20 S - start of time code (1)
|
|||
|
21 - 24 M1 - BCD (lsb first) Minutes
|
|||
|
25 - 27 M10 - BCD (lsb first) 10 Minutes
|
|||
|
28 P1 - Minute Parity (even)
|
|||
|
29 - 32 H1 - BCD (lsb first) Hours
|
|||
|
33 - 34 H10 - BCD (lsb first) 10 Hours
|
|||
|
35 P2 - Hour Parity (even)
|
|||
|
36 - 39 D1 - BCD (lsb first) Days
|
|||
|
40 - 41 D10 - BCD (lsb first) 10 Days
|
|||
|
42 - 44 DW - BCD (lsb first) day of week (1: Monday -> 7: Sunday)
|
|||
|
45 - 49 MO - BCD (lsb first) Month
|
|||
|
50 MO0 - 10 Months
|
|||
|
51 - 53 Y1 - BCD (lsb first) Years
|
|||
|
54 - 57 Y10 - BCD (lsb first) 10 Years
|
|||
|
58 P3 - Date Parity (even)
|
|||
|
59 - usually missing (minute indication), except for leap insertion
|
|||
|
</pre>
|
|||
|
|
|||
|
<hr>
|
|||
|
<h2>Schmid clock</h2>
|
|||
|
|
|||
|
<p>
|
|||
|
Schmid clock: needs poll, binary input, end='\xFC', sync start
|
|||
|
|
|||
|
<p>
|
|||
|
The Schmid clock is a DCF77 receiver that sends a binary
|
|||
|
time code at the reception of a flag byte. The contents
|
|||
|
if the flag byte determined the time code format. The
|
|||
|
binary time code is delimited by the byte 0xFC.
|
|||
|
<PRE>
|
|||
|
TTY setup is:
|
|||
|
CFLAG (B1200|CS8|CREAD|CLOCAL)
|
|||
|
IFLAG 0
|
|||
|
OFLAG 0
|
|||
|
LFLAG 0
|
|||
|
|
|||
|
</PRE>
|
|||
|
|
|||
|
|
|||
|
<p> The command to Schmid's DCF77 clock is a single byte; each bit
|
|||
|
allows the user to select some part of the time string, as follows (the
|
|||
|
output for the lsb is sent first).
|
|||
|
|
|||
|
<pre>
|
|||
|
Bit 0: time in MEZ, 4 bytes *binary, not BCD*; hh.mm.ss.tenths
|
|||
|
Bit 1: date 3 bytes *binary, not BCD: dd.mm.yy
|
|||
|
Bit 2: week day, 1 byte (unused here)
|
|||
|
Bit 3: time zone, 1 byte, 0=MET, 1=MEST. (unused here)
|
|||
|
Bit 4: clock status, 1 byte, 0=time invalid,
|
|||
|
1=time from crystal backup,
|
|||
|
3=time from DCF77
|
|||
|
Bit 5: transmitter status, 1 byte,
|
|||
|
bit 0: backup antenna
|
|||
|
bit 1: time zone change within 1h
|
|||
|
bit 3,2: TZ 01=MEST, 10=MET
|
|||
|
bit 4: leap second will be
|
|||
|
added within one hour
|
|||
|
bits 5-7: Zero
|
|||
|
Bit 6: time in backup mode, units of 5 minutes (unused here)
|
|||
|
</pre>
|
|||
|
|
|||
|
<hr>
|
|||
|
<h2>Trimble SV6 ASCII time code (TAIP)</h2>
|
|||
|
|
|||
|
<p>
|
|||
|
Trimble SV6: needs poll, ascii timecode, start='>', end='<',
|
|||
|
query='>QTM<', eol='<'
|
|||
|
|
|||
|
<p> Trimble SV6 is a GPS receiver with PPS output. It needs to be polled.
|
|||
|
It also need a special tty mode setup (EOL='<').
|
|||
|
<pre>
|
|||
|
TTY setup is:
|
|||
|
CFLAG (B4800|CS8|CREAD)
|
|||
|
IFLAG (BRKINT|IGNPAR|ISTRIP|ICRNL|IXON)
|
|||
|
OFLAG (OPOST|ONLCR)
|
|||
|
LFLAG (ICANON|ECHOK)
|
|||
|
|
|||
|
Special flags are:
|
|||
|
PARSE_F_PPSPPS - use CIOGETEV for PPS time stamping
|
|||
|
PARSE_F_PPSONSECOND - the time code is not related to
|
|||
|
the PPS pulse (so use the time code
|
|||
|
only for the second epoch)
|
|||
|
|
|||
|
Timecode
|
|||
|
0000000000111111111122222222223333333 / char
|
|||
|
0123456789012345678901234567890123456 \ posn
|
|||
|
>RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx< Actual
|
|||
|
----33445566600112222BB7__-_____--99- Parse
|
|||
|
>RTM 1 ;* < Check
|
|||
|
</pre>
|
|||
|
|
|||
|
<hr>
|
|||
|
<h2>ELV DCF7000</h2>
|
|||
|
<p>
|
|||
|
ELV DCF7000: end='\r', pattern=" - - - - - - - \r"
|
|||
|
<p>
|
|||
|
The ELV DCF7000 is a cheap DCF77 receiver sending each second
|
|||
|
a time code (though not very precise!) delimited by '`r'
|
|||
|
<pre>
|
|||
|
Timecode
|
|||
|
YY-MM-DD-HH-MM-SS-FF\r
|
|||
|
|
|||
|
FF&0x1 - DST
|
|||
|
FF&0x2 - DST switch warning
|
|||
|
FF&0x4 - unsynchronised
|
|||
|
</pre>
|
|||
|
<hr>
|
|||
|
<h2>HOPF 6021 und Kompatible</h2>
|
|||
|
|
|||
|
<p>
|
|||
|
HOPF Funkuhr 6021 mit serieller Schnittstelle
|
|||
|
Created by F.Schnekenbuehl <frank@comsys.dofn.de> from clk_rcc8000.c
|
|||
|
Nortel DASA Network Systems GmbH, Department: ND250
|
|||
|
A Joint venture of Daimler-Benz Aerospace and Nortel.
|
|||
|
|
|||
|
<pre>
|
|||
|
hopf Funkuhr 6021
|
|||
|
used with 9600,8N1,
|
|||
|
UTC via serial line
|
|||
|
"Sekundenvorlauf" ON
|
|||
|
ETX zum Sekundenvorlauf ON
|
|||
|
dataformat 6021
|
|||
|
output time and date
|
|||
|
transmit with control characters
|
|||
|
transmit evry second
|
|||
|
|
|||
|
Type 6021 Serial Output format
|
|||
|
|
|||
|
000000000011111111 / char
|
|||
|
012345678901234567 \ position
|
|||
|
sABHHMMSSDDMMYYnre Actual
|
|||
|
C4110046231195 Parse
|
|||
|
s enr Check
|
|||
|
|
|||
|
s = STX (0x02), e = ETX (0x03)
|
|||
|
n = NL (0x0A), r = CR (0x0D)
|
|||
|
|
|||
|
A B - Status and weekday
|
|||
|
|
|||
|
A - Status
|
|||
|
|
|||
|
8 4 2 1
|
|||
|
x x x 0 - no announcement
|
|||
|
x x x 1 - Summertime - wintertime - summertime announcement
|
|||
|
x x 0 x - Wintertime
|
|||
|
x x 1 x - Summertime
|
|||
|
0 0 x x - Time/Date invalid
|
|||
|
0 1 x x - Internal clock used
|
|||
|
1 0 x x - Radio clock
|
|||
|
1 1 x x - Radio clock highprecision
|
|||
|
|
|||
|
B - 8 4 2 1
|
|||
|
0 x x x - MESZ/MEZ
|
|||
|
1 x x x - UTC
|
|||
|
x 0 0 1 - Monday
|
|||
|
x 0 1 0 - Tuesday
|
|||
|
x 0 1 1 - Wednesday
|
|||
|
x 1 0 0 - Thursday
|
|||
|
x 1 0 1 - Friday
|
|||
|
x 1 1 0 - Saturday
|
|||
|
x 1 1 1 - Sunday
|
|||
|
</pre>
|
|||
|
<hr>
|
|||
|
<h2>Diem Computime Clock</h2>
|
|||
|
|
|||
|
<p>
|
|||
|
The Computime receiver sends a datagram in the following format every minute
|
|||
|
<pre>
|
|||
|
Timestamp T:YY:MM:MD:WD:HH:MM:SSCRLF
|
|||
|
Pos 0123456789012345678901 2 3
|
|||
|
0000000000111111111122 2 2
|
|||
|
Parse T: : : : : : : \r\n
|
|||
|
|
|||
|
T Startcharacter "T" specifies start of the timestamp
|
|||
|
YY Year MM Month 1-12
|
|||
|
MD Day of the month
|
|||
|
WD Day of week
|
|||
|
HH Hour
|
|||
|
MM Minute
|
|||
|
SS Second
|
|||
|
CR Carriage return
|
|||
|
LF Linefeed
|
|||
|
</pre>
|
|||
|
<hr>
|
|||
|
<h2>WHARTON 400A Series Clock with a 404.2 Serial interface</h2>
|
|||
|
|
|||
|
<p>
|
|||
|
The WHARTON 400A Series clock is able to send date/time serial messages
|
|||
|
in 7 output formats. We use format 1 here because it is the shortest.
|
|||
|
We set up the clock to send a datagram every second.
|
|||
|
For use with this driver, the WHARTON 400A Series clock must be set-up
|
|||
|
as follows :
|
|||
|
<pre>
|
|||
|
Programmable Selected
|
|||
|
Option No Option
|
|||
|
BST or CET display 3 9 or 11
|
|||
|
No external controller 7 0
|
|||
|
Serial Output Format 1 9 1
|
|||
|
Baud rate 9600 bps 10 96
|
|||
|
Bit length 8 bits 11 8
|
|||
|
Parity even 12 E
|
|||
|
</pre>
|
|||
|
WHARTON 400A Series output format 1 is as follows :
|
|||
|
<pre>
|
|||
|
Timestamp STXssmmhhDDMMYYSETX
|
|||
|
Pos 0 12345678901234
|
|||
|
0 00000000011111
|
|||
|
|
|||
|
STX start transmission (ASCII 0x02)
|
|||
|
ETX end transmission (ASCII 0x03)
|
|||
|
ss Second expressed in reversed decimal (units then tens)
|
|||
|
mm Minute expressed in reversed decimal
|
|||
|
hh Hour expressed in reversed decimal
|
|||
|
DD Day of month expressed in reversed decimal
|
|||
|
MM Month expressed in reversed decimal (January is 1)
|
|||
|
YY Year (without century) expressed in reversed decimal
|
|||
|
S Status byte : 0x30 +
|
|||
|
bit 0 0 = MSF source 1 = DCF source
|
|||
|
bit 1 0 = Winter time 1 = Summer time
|
|||
|
bit 2 0 = not synchronised 1 = synchronised
|
|||
|
bit 3 0 = no early warning 1 = early warning
|
|||
|
</pre>
|