GPS『GM-316』と閏秒

CANDY殿のページにてGarminGPS 15Lは閏秒対応らしい。
http://www.bsddiary.net/doc/ntpd-leapseconds.html

手持ちのGPSではどうなっていたのか気になったので調べてみた。
Logが残っていたのは、全くの偶然だった。
秋葉原aitendo で売ってたGPS GM-316(SiRF GSC3f/LPx 7989)には、PPS出力があるので購入したが、
パルス幅が1us固定なのでNTPの時刻源として扱うには別回路で500ms位にしてやらんとならん。
この回路を検討中で、それ以外の電源やシリアルレベルコンバータ等の回路は完成して
足れ流れ状態のNMEA出力が偶然Logに残っていたのだ。
# 非常に小型、外部ANT端子あり、3.3V系、PPS出力あり、高感度なのでとても気に入っている。


このGPSから出力されるNMEAメッセージで、時刻が含まれているのはGPZDA,GPGGA,GPGLLの3つである。
GPZDAには年月日も含まれている。また、毎秒GPZDAから順番に出力されている。
今回の閏秒は、『日本時刻で平成21年(2009年)1月1日(木)に午前8時59分59秒と午前9時00分00秒の間に「8時59分60秒」を挿入します。』なので、

  1. :8時59分59秒(JST)が2回出力される?
  2. :9時00分00秒(JST)が2回出力される?
  3. :8時59分60秒(JST)が1回出力される?

のいずれかになる。と思っていたのだが・・・・

% grep ZDA GPS-316.log|sort | uniq -d
$GPZDA,000000.000,02,01,2009,,
$GPZDA,235945.000,31,12,2008,,

なんじゃこりゃ〜〜〜〜〜!!(大外れ!!)


閏秒らしいのは、"GPZDA,000000.000,02,01,2009"だが、これは1月2日である。(バグ?1日ずれた閏秒??)
"235945.000,31,12,2008"に至っては意味が解らん。(結果的に2秒ずらした事になるの???)

詳細を見てみよう。
出力をみるとGPGGA,GPGLLの時刻以外が異なっており、何らかの誤操作/誤動作による行コピー等ではな事がわかる。
# 緯度、経度は一部伏せ文字にしている。

  • 235945.000,31,12,2008付近[23:59:44-23:59:47]
(1)正常
$GPZDA,235944.000,31,12,2008,,
$GPGGA,235944.000,35xx.xx78,N,139yy.yy34,E,2,08,1.7,-9.5,M,39.2,M,2.8,0000
$GPGLL,35xx.xx78,N,139yy.yy34,E,235944.000,A,D
(2)正常
$GPZDA,235945.000,31,12,2008,,
$GPGGA,235945.000,35xx.xx79,N,139yy.yy31,E,2,08,1.7,-11.3,M,39.2,M,3.8,0000
$GPGLL,35xx.xx79,N,139yy.yy31,E,235945.000,A,D
(3)異常1(ZDAが前秒と同じ時刻[235945.000]で、GPGGA,GPGLLと異なる)
$GPZDA,235945.000,31,12,2008,,
$GPGGA,235946.000,35xx.xx81,N,139yy.yy28,E,2,08,1.7,-13.0,M,39.2,M,0.8,0000
$GPGLL,35xx.xx81,N,139yy.yy28,E,235946.000,A,D
(4)異常2(GGA,GLLが前秒と同じ時刻[235946.000])
$GPZDA,235946.000,31,12,2008,,
$GPGGA,235946.000,35xx.xx83,N,139yy.yy24,E,2,07,1.8,-16.2,M,39.2,M,1.8,0000
$GPGLL,35xx.xx83,N,139yy.yy24,E,235946.000,A,D
(5)正常
$GPZDA,235947.000,31,12,2008,,
$GPGGA,235947.000,35xx.xx76,N,139yy.yy26,E,2,07,1.8,-13.0,M,39.2,M,2.8,0000
$GPGLL,35xx.xx76,N,139yy.yy26,E,235947.000,A,D
  • 000000.000,02,01,2009付近[2009/01/01 23:59:59- 2009/01/02 00:00:02]
(1)正常
$GPZDA,235959.000,01,01,2009,,
$GPGGA,235959.000,35xx.xx15,N,139yy.yy47,E,2,08,1.7,-132.6,M,39.2,M,0.8,0000
$GPGLL,35xx.xx15,N,139yy.yy47,E,235959.000,A,D
(2)正常
$GPZDA,000000.000,02,01,2009,,
$GPGGA,000000.000,35xx.xx09,N,139yy.yy51,E,2,08,1.7,-129.5,M,39.2,M,0.8,0000
$GPGLL,35xx.xx09,N,139yy.yy51,E,000000.000,A,D
(3)異常1(ZDAが前秒と同じ時刻[000000.000]で、GPGGA,GPGLLと異なる)
$GPZDA,000000.000,02,01,2009,,
$GPGGA,000001.000,35xx.xx05,N,139yy.yy54,E,2,07,1.8,-126.5,M,39.2,M,1.8,0000
$GPGLL,35xx.xx05,N,139yy.yy54,E,000001.000,A,D
(4)異常2(GGA,GLLが前秒と同じ時刻[000001.000])
$GPZDA,000001.000,02,01,2009,,
$GPGGA,000001.000,35xx.xx02,N,139yy.yy52,E,2,08,1.7,-127.0,M,39.2,M,2.8,0000
$GPGLL,35xx.xx02,N,139yy.yy52,E,000001.000,A,D
(5)正常
$GPZDA,000002.000,02,01,2009,,
$GPGGA,000002.000,35xx.xx98,N,139yy.yy52,E,2,08,1.7,-126.0,M,39.2,M,0.8,0000
$GPGLL,35xx.xx98,N,139yy.yy52,E,000002.000,A,D

更に、uniqでは重複行(=閏秒による1秒遅れ)は発見できても欠落(=閏秒による1秒進め)は発見できないので簡易なスクリプトで調査する。

% cat ./GPS-316.log | grep GPZDA | cut -d \, -f 2 | \
gawk ' \
   { C= $1 }\
   { A= B - C }\
       { printf " %d : %d \n",C,A } \
   {B=C} \
'

この出力から、grep -ve '-1' -ve '-41' --ve'-4041' でフィルタすると、1日の変わり目以外はでないはず。
だけど、『 175946 : -2 』こんなのが出て来た。
つまり、GPZDAの時刻が2秒ずれた事があった様だ。(閏秒で時刻を進める時の動作と同じ)

  • 175945.000,01,01,2009付近[1秒進んだとき]
(1)正常
$GPZDA,175943.000,01,01,2009,,
$GPGGA,175943.000,35xx.xx50,N,139yy.yy31,E,2,08,1.2,55.5,M,39.2,M,2.8,0000
$GPGLL,35xx.xx50,N,139yy.yy31,E,175943.000,A,D
(2)正常
$GPZDA,175944.000,01,01,2009,,
$GPGGA,175944.000,35xx.xx49,N,139yy.yy32,E,2,08,1.2,55.3,M,39.2,M,3.8,0000
$GPGLL,35xx.xx49,N,139yy.yy32,E,175944.000,A,D
(3)異常1(GPZDAが前秒より2秒進んでいる)
$GPZDA,175946.000,01,01,2009,,
$GPGGA,175945.000,35xx.xx48,N,139yy.yy33,E,2,08,1.2,55.4,M,39.2,M,0.8,0000
$GPGLL,35xx.xx48,N,139yy.yy33,E,175945.000,A,D
(4)異常2(GPGGA,GPGLLが前秒より2秒進んでいる)
$GPZDA,175947.000,01,01,2009,,
$GPGGA,175947.000,35xx.xx47,N,139yy.yy34,E,2,08,1.2,55.8,M,39.2,M,0.8,0000
$GPGLL,35xx.xx47,N,139yy.yy34,E,175947.000,A,D
(5)正常
$GPZDA,175948.000,01,01,2009,,
$GPGGA,175948.000,35xx.xx45,N,139yy.yy35,E,2,08,1.2,56.3,M,39.2,M,0.8,0000
$GPGLL,35xx.xx45,N,139yy.yy35,E,175948.000,A,D


GPS GM-316(SiRF GSC3f/LPx 7989)についてまとめ。
(上記を閏秒の動作とした時)

  • 閏秒(+1秒追加)では、前秒と同じ時刻を出力する(00分60秒は出力しない)
  • GPZDAと、GPGGA,GPGLLは同時に変更されない。
  • GM-316は、閏秒調整と思われる動作が3回も発生した。
閏秒方向 観測された時刻 メモ
挿入 235945.000,31,12,2008 調整の意図不明
削除 175945.000,01,01,2009 調整の意味不明。本来動作とは逆の動作(削除)
挿入 000000.000,02,01,2009 調整日が1日ずれてる。バグか??


GM-316は閏秒の扱い方に関しては、『ダメダメなGPS』って事になりそうだ。
# でもこの感度の良さはとても気に入っている。


それよりも、我が家のNTPの源となっている、GARMIN GPS16-HVS,GPS18-LVCは閏秒の時にどんな出力をするのか非常に気になる。