1132451Sroberto<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2132451Sroberto 3132451Sroberto<html> 4132451Sroberto 5182007Sroberto <head> 6182007Sroberto <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"> 7182007Sroberto <meta name="generator" content="HTML Tidy, see www.w3.org"> 8182007Sroberto <title>NTP PARSE clock data formats</title> 9182007Sroberto <link href="scripts/style.css" type="text/css" rel="stylesheet"> 10182007Sroberto </head> 11132451Sroberto 12182007Sroberto <body> 13182007Sroberto <h3>NTP PARSE clock data formats</h3> 14182007Sroberto <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).</p> 15280849Scy<p>Last update: 16280849Scy <!-- #BeginDate format:En2m -->21-Oct-2010 23:44<!-- #EndDate --> 17280849Scy UTC</p> 18182007Sroberto <hr> 19182007Sroberto <h4>Meinberg clocks</h4> 20182007Sroberto <pre> 21132451SrobertoMeinberg: start=<STX>, end=<ETX>, sync on start 22132451Sroberto pattern="\2D: . . ;T: ;U: . . ; \3" 23132451Sroberto pattern="\2 . . ; ; : : ; \3" 24132451Sroberto pattern="\2 . . ; ; : : ; : ; ; . . " 25132451Sroberto</pre> 26182007Sroberto <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:%20info@meinberg.de">info@meinberg.de</a></p> 27182007Sroberto <p>General characteristics:<br> 28182007Sroberto 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. DCF77 AM clocks have a limited accuracy of a few milliseconds. The DCF77 PZF5xx variants provide higher accuracy and have a pretty good relationship between RS232 time code and the PPS signal. Except for early versions of the old GPS166 receiver type, Meinberg GPS receivers have a very good timing relationship between the datagram and the pulse. The beginning of the start bit of the first character has basically the same accuracy as the PPS signal, plus a jitter of up to 1 bit time depending on the selected baud rate, i.e. 52 μs @ 19200. PPS support should always be used, if possible, in order to yield the highest possible accuracy.</p> 29182007Sroberto <p>The preferred tty setting for Meinberg DCF77 receivers is 9600/7E2:</p> 30182007Sroberto <pre> 31132451Sroberto CFLAG (B9600|CS7|PARENB|CREAD|HUPCL) 32132451Sroberto IFLAG (IGNBRK|IGNPAR|ISTRIP) 33132451Sroberto OFLAG 0 34132451Sroberto LFLAG 0 35132451Sroberto </pre> 36182007Sroberto <p>The tty setting for Meinberg GPS16x/17x receivers is 19200/8N1:</p> 37182007Sroberto <pre> 38132451Sroberto CFLAG (B19200|CS8|PARENB|CREAD|HUPCL) 39132451Sroberto IFLAG (IGNBRK|IGNPAR|ISTRIP) 40132451Sroberto OFLAG 0 41132451Sroberto LFLAG 0 42132451Sroberto </pre> 43182007Sroberto <p>All clocks should be run at datagram once per second.<br><br></p> 44182007Sroberto <p>Format of the Meinberg standard time string:</p> 45182007Sroberto<pre> 46182007Sroberto <b><i><STX></i>D:<i>dd.mm.yy</i>;T:<i>w</i>;U:<i>hh.mm.ss</i>;<i>uvxy</i><i><ETX></i></b> 47182007Sroberto pos: 0 000000001111111111222222222233 3 48182007Sroberto 1 234567890123456789012345678901 2 49132451Sroberto 50182007Sroberto <i><STX></i> = start-of-text, ASCII code 0x02 51182007Sroberto <i>dd.mm.yy</i> = day of month, month, year of the century, separated by dots 52182007Sroberto <i>w</i> = day of week (1..7, Monday = 1) 53182007Sroberto <i>hh:mm:ss</i> = hour, minute, second, separated by dots 54182007Sroberto <i>u</i> = '#' for GPS receivers: time is <b>not</b> synchronized 55182007Sroberto '#' for older PZF5xx receivers: no correlation, not synchronized 56182007Sroberto '#' for other devices: never sync'ed since powerup 57182007Sroberto ' ' if nothing of the above applies 58182007Sroberto <i>v</i> = '*' for GPS receivers: position has <b>not</b> been verified 59182007Sroberto '*' for other devices: freewheeling based on internal quartz 60182007Sroberto ' ' if nothing of the above applies 61182007Sroberto <i>x</i> = 'U' if UTC time is transmitted 62182007Sroberto 'S' if daylight saving time is active 63182007Sroberto ' ' if nothing of the above applies 64182007Sroberto <i>y</i> = '!' during the hour preceding start or end of daylight saving time 65182007Sroberto 'A' during the hour preceding a leap second 66182007Sroberto ' ' if nothing of the above applies 67182007Sroberto <i><ETX></i> = end-of-text, ASCII code 0x03 68132451Sroberto</pre> 69182007Sroberto <p>Format of the Uni Erlangen time string for PZF5xx receivers:</p> 70182007Sroberto<pre> 71182007Sroberto <b><i><STX></i><i>dd.mm.yy</i>; <i>w</i>; <i>hh:mm:ss</i>; <i>tuvxyza</i><i><ETX></i></b> 72182007Sroberto pos: 0 000000001111111111222222222233 3 73182007Sroberto 1 234567890123456789012345678901 2 74182007Sroberto 75182007Sroberto <i><STX></i> = start-of-text, ASCII code 0x02 76182007Sroberto <i>dd.mm.yy</i> = day of month, month, year of the century, separated by dots 77182007Sroberto <i>w</i> = day of week (1..7, Monday = 1) 78182007Sroberto <i>hh:mm:ss</i> = hour, minute, second, separated by colons 79182007Sroberto 80182007Sroberto <i>t</i> = 'U' if UTC time is transmitted, else ' ' 81182007Sroberto <i>u</i> = '#' for older PZF5xx receivers: no correlation, not synchronized 82182007Sroberto '#' for PZF511 and newer: never sync'ed since powerup 83182007Sroberto ' ' if nothing of the above applies 84182007Sroberto <i>v</i> = '*' if freewheeling based on internal quartz, else ' ' 85182007Sroberto <i>x</i> = 'S' if daylight saving time is active, else ' ' 86182007Sroberto <i>y</i> = '!' during the hour preceding start or end of daylight saving time, else ' ' 87182007Sroberto <i>z</i> = 'A' during the hour preceding a leap second, else ' ' 88182007Sroberto <i>a</i> = 'R' alternate antenna (reminiscent of PZF5xx), usually ' ' for GPS receivers 89182007Sroberto <i><ETX></i> = end-of-text, ASCII code 0x03 90132451Sroberto</pre> 91182007Sroberto <p>Format of the Uni Erlangen time string for GPS16x/GPS17x receivers:</p> 92182007Sroberto<pre> 93182007Sroberto <b><i><STX></i><i>dd.mm.yy</i>; <i>w</i>; <i>hh:mm:ss</i>; <i>+uu:uu</i>; <i>uvxyzab</i>; <i>ll.lllln</i> <i>lll.lllle</i> <i>hhhh</i>m<i><ETX></i></b> 94182007Sroberto pos: 0 0000000011111111112222222222333333333344444444445555555555666666 6 95182007Sroberto 1 2345678901234567890123456789012345678901234567890123456789012345 6 96182007Sroberto 97182007Sroberto <i><STX></i> = start-of-text, ASCII code 0x02 98182007Sroberto <i>dd.mm.yy</i> = day of month, month, year of the century, separated by dots 99182007Sroberto <i>w</i> = day of week (1..7, Monday = 1) 100182007Sroberto <i>hh:mm:ss</i> = hour, minute, second, separated by colons 101182007Sroberto <i>+uu:uu</i> = offset to UTC in hours and minutes, preceded by + or - 102182007Sroberto <i>u</i> = '#' if time is <b>not</b> synchronized, else ' ' 103182007Sroberto <i>v</i> = '*' if position has <b>not</b> been verified, else ' ' 104182007Sroberto <i>x</i> = 'S' if daylight saving time is active, else ' ' 105182007Sroberto <i>y</i> = '!' during the hour preceding start or end of daylight saving time, else ' ' 106182007Sroberto <i>z</i> = 'A' during the hour preceding a leap second, else ' ' 107182007Sroberto <i>a</i> = 'R' alternate antenna (reminiscent of PZF5xx), usually ' ' for GPS receivers 108182007Sroberto <i>b</i> = 'L' during a leap second, i.e. if the seconds field is 60, else ' ' 109182007Sroberto <i>ll.lllln</i> = position latitude in degrees, 'n' can actually be 'N' or 'S', i.e. North or South 110182007Sroberto <i>lll.lllle</i> = position longitude in degrees, 'e' can actually be 'E' or 'W', i.e. East or West 111182007Sroberto <i>hhhh</i> = position altitude in meters, always followed by 'm' 112182007Sroberto <i><ETX></i> = end-of-text, ASCII code 0x03 113132451Sroberto</pre> 114182007Sroberto <p>Examples for Uni Erlangen strings from GPS receivers:</p> 115182007Sroberto<pre> 116182007Sroberto \x02 09.07.93; 5; 08:48:26; +00:00; ; 49.5736N 11.0280E 373m \x03 117182007Sroberto \x02 08.11.06; 3; 14:39:39; +00:00; ; 51.9828N 9.2258E 176m \x03 118182007Sroberto</pre> 119182007Sroberto <p>The Uni Erlangen formats should be used preferably. Newer Meinberg GPS receivers can be configured to transmit that format, for older devices there may be a special firmware version available.</p> 120182007Sroberto <p>For the Meinberg parse look into clk_meinberg.c<br><br></p> 121182007Sroberto <hr> 122182007Sroberto <h4>Raw DCF77 Data via serial line</h4> 123182007Sroberto <p>RAWDCF: end=TIMEOUT>1.5s, sync each char (any char),generate psuedo time codes, fixed format</p> 124182007Sroberto <p>direct DCF77 code input</p> 125182007Sroberto <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.</p> 126182007Sroberto <pre> 127132451Sroberto The preferred tty setting is: 128132451Sroberto CFLAG (B50|CS8|CREAD|CLOCAL) 129132451Sroberto IFLAG 0 130132451Sroberto OFLAG 0 131132451Sroberto LFLAG 0 132132451Sroberto</pre> 133182007Sroberto <h4>DCF77 raw time code</h4> 134182007Sroberto <p>From "Zur Zeit", Physikalisch-Technische Bundesanstalt (PTB), Braunschweig und Berlin, März 1989<br> 135182007Sroberto </p> 136182007Sroberto <p>Timecode transmission:</p> 137182007Sroberto <pre> 138132451Sroberto AM: 139132451Sroberto 140132451Sroberto time marks are send every second except for the second before the 141132451Sroberto next minute mark 142132451Sroberto time marks consist of a reduction of transmitter power to 25% 143132451Sroberto of the nominal level 144132451Sroberto the falling edge is the time indication (on time) 145132451Sroberto time marks of a 100ms duration constitute a logical 0 146132451Sroberto time marks of a 200ms duration constitute a logical 1 147132451Sroberto</pre> 148182007Sroberto <p>see the spec. (basically a (non-)inverted psuedo random phase shift) encoding:</p> 149182007Sroberto <pre> 150132451Sroberto FM: 151132451Sroberto 152132451Sroberto Second Contents 153132451Sroberto 0 - 10 AM: free, FM: 0 154132451Sroberto 11 - 14 free 155132451Sroberto 15 R - alternate antenna 156132451Sroberto 16 A1 - expect zone change (1 hour before) 157132451Sroberto 17 - 18 Z1,Z2 - time zone 158132451Sroberto 0 0 illegal 159132451Sroberto 0 1 MEZ (MET) 160132451Sroberto 1 0 MESZ (MED, MET DST) 161132451Sroberto 1 1 illegal 162182007Sroberto 19 A2 - expect leap insertion/deletion (1 hour before) 163182007Sroberto 20 S - start of time code (1) 164132451Sroberto 21 - 24 M1 - BCD (lsb first) Minutes 165132451Sroberto 25 - 27 M10 - BCD (lsb first) 10 Minutes 166182007Sroberto 28 P1 - Minute Parity (even) 167132451Sroberto 29 - 32 H1 - BCD (lsb first) Hours 168182007Sroberto 33 - 34 H10 - BCD (lsb first) 10 Hours 169182007Sroberto 35 P2 - Hour Parity (even) 170132451Sroberto 36 - 39 D1 - BCD (lsb first) Days 171132451Sroberto 40 - 41 D10 - BCD (lsb first) 10 Days 172132451Sroberto 42 - 44 DW - BCD (lsb first) day of week (1: Monday -> 7: Sunday) 173182007Sroberto 45 - 49 MO1 - BCD (lsb first) Month 174182007Sroberto 50 MO10 - 10 Months 175132451Sroberto 51 - 53 Y1 - BCD (lsb first) Years 176132451Sroberto 54 - 57 Y10 - BCD (lsb first) 10 Years 177182007Sroberto 58 P3 - Date Parity (even) 178182007Sroberto 59 - usually missing (minute indication), except for leap insertion 179132451Sroberto</pre> 180182007Sroberto <hr> 181182007Sroberto <h4>Schmid clock</h4> 182182007Sroberto <p>Schmid clock: needs poll, binary input, end='\xFC', sync start</p> 183182007Sroberto <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.</p> 184182007Sroberto <pre> 185132451Sroberto TTY setup is: 186132451Sroberto CFLAG (B1200|CS8|CREAD|CLOCAL) 187132451Sroberto IFLAG 0 188132451Sroberto OFLAG 0 189132451Sroberto LFLAG 0 190132451Sroberto 191132451Sroberto</pre> 192182007Sroberto <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).</p> 193182007Sroberto <pre> 194132451Sroberto Bit 0: time in MEZ, 4 bytes *binary, not BCD*; hh.mm.ss.tenths 195132451Sroberto Bit 1: date 3 bytes *binary, not BCD: dd.mm.yy 196132451Sroberto Bit 2: week day, 1 byte (unused here) 197132451Sroberto Bit 3: time zone, 1 byte, 0=MET, 1=MEST. (unused here) 198132451Sroberto Bit 4: clock status, 1 byte, 0=time invalid, 199132451Sroberto 1=time from crystal backup, 200132451Sroberto 3=time from DCF77 201132451Sroberto Bit 5: transmitter status, 1 byte, 202132451Sroberto bit 0: backup antenna 203132451Sroberto bit 1: time zone change within 1h 204132451Sroberto bit 3,2: TZ 01=MEST, 10=MET 205132451Sroberto bit 4: leap second will be 206132451Sroberto added within one hour 207132451Sroberto bits 5-7: Zero 208132451Sroberto Bit 6: time in backup mode, units of 5 minutes (unused here) 209132451Sroberto</pre> 210182007Sroberto <hr> 211182007Sroberto <h4>Trimble SV6 ASCII time code (TAIP)</h4> 212182007Sroberto <p>Trimble SV6: needs poll, ascii timecode, start='>', end='<', query='>QTM<', eol='<'</p> 213182007Sroberto <p>Trimble SV6 is a GPS receiver with PPS output. It needs to be polled. It also need a special tty mode setup (EOL='<').</p> 214182007Sroberto <pre> 215132451Sroberto TTY setup is: 216132451Sroberto CFLAG (B4800|CS8|CREAD) 217132451Sroberto IFLAG (BRKINT|IGNPAR|ISTRIP|ICRNL|IXON) 218132451Sroberto OFLAG (OPOST|ONLCR) 219132451Sroberto LFLAG (ICANON|ECHOK) 220132451Sroberto</pre> 221182007Sroberto <p>Special flags are:</p> 222182007Sroberto <pre> PARSE_F_PPSPPS - use CIOGETEV for PPS time stamping 223132451Sroberto PARSE_F_PPSONSECOND - the time code is not related to 224132451Sroberto the PPS pulse (so use the time code 225132451Sroberto only for the second epoch) 226132451Sroberto 227132451Sroberto Timecode 228132451Sroberto 0000000000111111111122222222223333333 / char 229132451Sroberto 0123456789012345678901234567890123456 \ posn 230132451Sroberto >RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx< Actual 231132451Sroberto ----33445566600112222BB7__-_____--99- Parse 232132451Sroberto >RTM 1 ;* < Check 233132451Sroberto</pre> 234182007Sroberto <hr> 235182007Sroberto <h4>ELV DCF7000</h4> 236182007Sroberto <p>ELV DCF7000: end='\r', pattern=" - - - - - - - \r"</p> 237182007Sroberto <p>The ELV DCF7000 is a cheap DCF77 receiver sending each second a time code (though not very precise!) delimited by '`r'</p> 238182007Sroberto <pre> 239132451Sroberto Timecode 240132451Sroberto YY-MM-DD-HH-MM-SS-FF\r 241132451Sroberto 242132451Sroberto FF&0x1 - DST 243132451Sroberto FF&0x2 - DST switch warning 244132451Sroberto FF&0x4 - unsynchronised 245132451Sroberto</pre> 246182007Sroberto <hr> 247182007Sroberto <h4>HOPF 6021 und Kompatible</h4> 248182007Sroberto <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.</p> 249182007Sroberto <pre> 250132451Sroberto hopf Funkuhr 6021 251132451Sroberto used with 9600,8N1, 252132451Sroberto UTC via serial line 253132451Sroberto "Sekundenvorlauf" ON 254132451Sroberto ETX zum Sekundenvorlauf ON 255132451Sroberto dataformat 6021 256132451Sroberto output time and date 257132451Sroberto transmit with control characters 258132451Sroberto transmit evry second 259132451Sroberto </pre> 260182007Sroberto <p>Type 6021 Serial Output format</p> 261182007Sroberto <pre> 262132451Sroberto 000000000011111111 / char 263132451Sroberto 012345678901234567 \ position 264132451Sroberto sABHHMMSSDDMMYYnre Actual 265132451Sroberto C4110046231195 Parse 266132451Sroberto s enr Check 267132451Sroberto 268132451Sroberto s = STX (0x02), e = ETX (0x03) 269132451Sroberto n = NL (0x0A), r = CR (0x0D) 270132451Sroberto 271132451Sroberto A B - Status and weekday 272132451Sroberto 273132451Sroberto A - Status 274132451Sroberto 275132451Sroberto 8 4 2 1 276132451Sroberto x x x 0 - no announcement 277132451Sroberto x x x 1 - Summertime - wintertime - summertime announcement 278132451Sroberto x x 0 x - Wintertime 279132451Sroberto x x 1 x - Summertime 280132451Sroberto 0 0 x x - Time/Date invalid 281132451Sroberto 0 1 x x - Internal clock used 282132451Sroberto 1 0 x x - Radio clock 283132451Sroberto 1 1 x x - Radio clock highprecision 284132451Sroberto 285132451Sroberto B - 8 4 2 1 286132451Sroberto 0 x x x - MESZ/MEZ 287132451Sroberto 1 x x x - UTC 288132451Sroberto x 0 0 1 - Monday 289132451Sroberto x 0 1 0 - Tuesday 290132451Sroberto x 0 1 1 - Wednesday 291132451Sroberto x 1 0 0 - Thursday 292132451Sroberto x 1 0 1 - Friday 293132451Sroberto x 1 1 0 - Saturday 294132451Sroberto x 1 1 1 - Sunday 295132451Sroberto</pre> 296182007Sroberto <hr> 297182007Sroberto <h4>Diem Computime Clock</h4> 298182007Sroberto <p>The Computime receiver sends a datagram in the following format every minute</p> 299182007Sroberto <pre> 300132451Sroberto Timestamp T:YY:MM:MD:WD:HH:MM:SSCRLF 301132451Sroberto Pos 0123456789012345678901 2 3 302132451Sroberto 0000000000111111111122 2 2 303132451Sroberto Parse T: : : : : : : \r\n 304132451Sroberto 305132451Sroberto T Startcharacter "T" specifies start of the timestamp 306132451Sroberto YY Year MM Month 1-12 307132451Sroberto MD Day of the month 308132451Sroberto WD Day of week 309132451Sroberto HH Hour 310132451Sroberto MM Minute 311132451Sroberto SS Second 312132451Sroberto CR Carriage return 313132451Sroberto LF Linefeed 314132451Sroberto</pre> 315182007Sroberto <hr> 316182007Sroberto <h4>WHARTON 400A Series Clock with a 404.2 Serial interface</h4> 317182007Sroberto <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 :</p> 318182007Sroberto <pre> 319132451Sroberto Programmable Selected 320132451Sroberto Option No Option 321132451Sroberto BST or CET display 3 9 or 11 322132451Sroberto No external controller 7 0 323132451Sroberto Serial Output Format 1 9 1 324132451Sroberto Baud rate 9600 bps 10 96 325132451Sroberto Bit length 8 bits 11 8 326132451Sroberto Parity even 12 E 327132451Sroberto</pre> 328182007Sroberto <p>WHARTON 400A Series output format 1 is as follows :</p> 329182007Sroberto <pre> 330132451Sroberto Timestamp STXssmmhhDDMMYYSETX 331132451Sroberto Pos 0 12345678901234 332132451Sroberto 0 00000000011111 333132451Sroberto 334132451Sroberto STX start transmission (ASCII 0x02) 335132451Sroberto ETX end transmission (ASCII 0x03) 336132451Sroberto ss Second expressed in reversed decimal (units then tens) 337132451Sroberto mm Minute expressed in reversed decimal 338132451Sroberto hh Hour expressed in reversed decimal 339132451Sroberto DD Day of month expressed in reversed decimal 340132451Sroberto MM Month expressed in reversed decimal (January is 1) 341132451Sroberto YY Year (without century) expressed in reversed decimal 342132451Sroberto S Status byte : 0x30 + 343132451Sroberto bit 0 0 = MSF source 1 = DCF source 344132451Sroberto bit 1 0 = Winter time 1 = Summer time 345132451Sroberto bit 2 0 = not synchronised 1 = synchronised 346132451Sroberto bit 3 0 = no early warning 1 = early warning 347132451Sroberto</pre> 348182007Sroberto <hr> 349182007Sroberto <script type="text/javascript" language="javascript" src="scripts/footer.txt"></script> 350182007Sroberto </body> 351132451Sroberto 352280849Scy</html> 353