Satk ドキュメント
このページは瀬戸口貴司氏の作成したものを、GHS-OSDのサイト内に移したものです。
[ダウンロード]
このリンクを右クリックして実行ファイル「Satk.exe」ダウンロードして下さい。
[はじめに]
Satk - Satellite Assisted Time Keeperは、GPS受信機を利用してパソコンの時刻を管理するために開発された。
SatkはGPS受信機からのメッセージをRS−232C経由で受け取り、時刻情報と位置情報を表示する。また、受け取った時刻情報とパソコン内部時計の時刻を比較し、必要により校正する。
更に、SNTP(Simple Network Time Protocol) Client/Server によりネットワーク上の他のコンピュータと時刻の同期をとる。
[動作環境]
- Windows(95以上)パソコン、但し利用する機能により次のものが必要となる、
- GPS受信機と通信するためには、RS−232C端子
- SNTP機能を利用するためには、ネットワーク接続機器
- GPS受信機(使用する場合のみ)
RS−232Cによる通信機能を提供するもの。メッセージフォーマットはNMEA−0183フォーマット、ロックウェル社の「バイナリーデータメッセージフォーマット」、または日本無線株式会社のJRCフォーマット(後の2者を「バイナリーフォーマット」と略すことにする)。
[インストールとアンインストール]
- インストールは、実行ファイルをハードディスクにコピーするだけ。
- Satkで設定する諸パラメタはレジストリに登録することが出来るが、実行ファイルを削除する時にはレジストリ情報も削除する必要がある([Satkの操作]参照)。
[Satkの操作]
- Satkを起動すると、「JST」欄にパソコン内部時計の時刻が表示される。
- 「設定」ボタンをクリックすると「条件設定」ダイアログボックスが表示される。ここで設定したパラメタは、「システムに保存」をチェックすることによりレジストリに登録される。Satkをアンインストールする時などレジストリの情報を削除したい時には「システムから削除」ボタンをクリックする。
- 「接続」ボタンの押下によりGPS受信機との通信を開始する。受信した情報は「時刻情報」、「位置情報」の欄に表示される(SNTPクライアントとして動作させる時の操作は[Satkのネットワーク機能]の項を参照)。
- 通信中に表示される時刻は、NTTの時報サービス等と比べるとタイミングがズレているが「通信遅延」の上下ボタンでタイミングを合わせることが出来る(1PPSがRS-232CのDSRピンで通知される場合には、自動で合わせられる)。
- 「同期」ボタンを押下することによりパソコン内部時計の時刻をGPS受信機からの時刻で校正する。尚、GPS受信機と通信中でない時にはパソコン内部時計の時刻に対して一番近い正分に合わせる。パソコンの環境により時刻の「同期」がとりにくい場合には、「同期調整」の数値を変えて見るとよい。
- 「切断」ボタンでGPS受信機との通信を終了し、「終了」ボタンでプログラムを終了する。
[ジュピターへのコマンド送信]
GPS受信機として「ジュピター」を使用している場合には、「ジュピターコマンド」ダイアログから8種類のコマンドを送信することが出来る。
- NMEA−0183モード
受信機との通信モードをNMEA−0183モードに変更する。
- バイナリーフォーマット
受信機との通信モードをバイナリーフォーマットに変更する。
- ポジションピニング設定
Position Pinningの機能をオンにする。
※「Position Pinning」は、アンテナの移動速度が「ゼロ」の時、受信機の計算した経緯度のデータ表示を固定する機能である。ジュピターは測位計算を1秒毎に行っているが、微小な測定誤差の範囲で表示がふらつく。Position
Pinningをオンにすると、このふらつきを無視し、特定の値に固定して出力される。ジュピターではデフォルトでPosition
Pinningがオンとなっている。
- ポジションピニング解除
Position Pinningの機能をオフにする。
※経緯度の測定値の誤差を評価したい時に有効な機能である。
- WGS−84系
測地系を World Geodetic System に設定する。
- 日本測地系
測地系を Tokyo - MEAN FOR Japan,Korea,Okinawa に設定する。
- その他の測地系
コードを指定することにより、測地系の変更を行う。
- NMEAセンテンス選択
GGA、RMC、GSA、GSVのセンテンスのうち受信したいものを選択する。
※その他の受信機へのコマンド送信については、取り扱い説明書を参照のこと。また、直接Satkでサポートしていない受信機でもNMEA−0183モードで通信しているのであれば、「テストダイアログ」から直接コマンド文字列を送信することが出来る。
[テストダイアログ]
Satkの利用度を広げるために「テストダイアログ」を提供した。
- 情報表示
- センテンス - 通信中のシリアルポートからのセンテンスを表示する。バイナリ通信中は、Satkで編集した擬似センテンスを表示する。
- PPS間隔 - 1PPSを検出したときのhigh-resolution
performance counterのカウント値を表示する。
- 位置統計 - 経度・緯度情報の平均値と標準偏差を表示する。
- RS−232Cコマンドの送信(ASCIIキャラクタで通信中に限る)
- NMEA−1083センテンスで通信する受信機であれば、すべてここから制御することが可能である。
- GPS受信機に限らず、ここからシリアルポートを介した相手機器との通信が可能となる。
- サーバとの時刻同期
- GPS受信機が2台ある場合、2台のPCにそれぞれ受信機を接続し、LANで繋いで各PCで動作するタイムサーバの時刻精度を比較することができる。
- 接続先として公のインターネットタイムサーバを指定すると、サーバから返してくる「Precision」の精度の範囲で、自システムの絶対誤差を知ることが出来る。
この場合には、通信遅延を考慮して精度を評価する必要がある。
- ログ出力
- このダイアログで表示されたメッセージは16行で捨てられることになる。ログが表示されている状態で「ログ出力」ボタンをクリックすることにより、Satkのログに記録される。
- 「センテンスをログに出力」チェックボックスがチェックされた状態でこのダイアログボックスを閉じるとGPS受信機からのセンテンスをログファイルに書き出す(V3.5)。
[Satk のネットワーク機能]
- 「接続先」として「ネットワーク」を指定し、接続先のIPアドレス(またはホスト名)を指定すると、Satkはネットワーククライアントとして動作する(自アドレスはSatkが検出する)。
- その際、「プロトコル」として「SNTP」を指定すると「Simple
Network Time Protocol Version 4(ユニキャストモード)」で動作する。従ってサーバはSatkであってもネット上の(含むインターネット)(S)NTPサーバであっても構わない。
- 「プロトコル」を「Satk」とした場合には、サーバをSatkとした前提でローカルなプロトコルで動作する。これにより「モニター」ボタンのクリックで、サーバに表示された位置情報をクライアント側で見ることが出来る。またサーバの時刻の同期源がなくても強引にサーバの内部時計の時刻と同期させる(ので注意が必要)。
- Satkはクライアントからの要求を受けるとGPS受信機に接続している/いないに拘らず(タイムサーバとして、状態に応じた)応答を返す。
[ジュピターとパソコンの接続]
ジュピターとパソコンとのインターフェイス回路は、せんだい宇宙館のホームページ
http://uchukan.sendai-net.jp
で紹介されている。
また、株SPAよりジュピターから1PPS信号をDSRピンに乗せて通知するRS−232Cケーブルが提供されている。
[参考文献]
- 「せんだい宇宙館ホームページ」、http://uchukan.sendai-net.jp より
- 「ジュピター商品仕様書」、株式会社SPAシステムプロデューサアソシエイツ
- 「ジュピターサンプルプログラム利用者の手引き」、同上
- 「GT−77商品仕様書」、同上
- 「ジュピターQ&A(Pro)」、同社ホームページ、http://www.spa-japan.co.jp/ より
- 「CCA−370H 説明書」、株式会社SPAシステムプロデューサアソシエイツ
- 「CCA−370H 操作説明書」、株式会社SPAシステムプロデューサアソシエイツ
- 「CCA−370H 入出力データ説明書」、株式会社SPAシステムプロデューサアソシエイツ
- 「GPS35 Technical Specification」、株式会社SPAシステムプロデューサアソシエイツ
- 「eT36tm 補足資料」、株式会社SPAシステムプロデューサアソシエイツ
- 「GPS受信機JRCフォーマット入出力信号仕様書」、株式会社SPAシステムプロデューサアソシエイツ
- 「eT36tm(と姉妹機)のマニュアル」、株式会社SPAシステムプロデューサアソシエイツ
- 「G8マニュアル(PDF版)」、 ftp://ftp.ashtech.com/Reference%20Manuals/g8/
- 「月刊Cマガジン」、1998年12月号、Borland C++Builder3によるRS-232C制御と 文字列操作、荒井孝一、ソフトバンク
- 「RFC Editor」サイト、http://www.rfc-editor.org/ より
- C++Builder5 オンラインヘルプ
[開発履歴]
- 2000.07.03 Ver1.0 慧(さと)がおすわりをする頃
- 2000.08.18 Ver1.1 慧(さと)がハイハイをする頃
- 2000.10.06 Ver2.0 慧がつかまり立ちをするので目が離せない
- 2000.12.27 Ver2.1 慧が家の中を徘徊している
- 2001.09.14 Ver2.2 慧は「トレパン時々おむつ」、もう一寸だ
- 2001.11.10 Ver2.21 慧は2歳になって、おむつも完全に外れた
- 2001.12.28 Ver3.0 慧がカメラの前でポーズをとるようになった
- 2002.05.29 Ver3.1 慧の日課は新聞を玄関に取りにいくことから
- 2002.11.02 ※慧の3歳の誕生日にドキュメントを書き直した
- 2002.11.11 Ver3.2 慧は幼稚園の入園説明会に行った
- 2003.04.23 Ver3.3 慧の幼稚園入園を記念して
- 2003.07.24 Ver3.4 慧の初めての夏休み
- 2003.11.02 Ver3.5 慧の4歳の誕生日
- 2004.04.03 Ver3.51 慧は補助輪つきの自転車を乗り回している
- 2005.01.07 Ver3.54 慧の七草を祝った
[Ver1.1について]
- GPS受信機ジュピターからバイナリーメッセージを受信出来るようにした。これにより1PPSとの同期が保証されるようになった。また、バイナリーメッセージから得られる測地系の情報も表示するようにした。
- ジュピターへの送信コマンドとして、「コードによる測地系の指定」を追加した。
- 「ジュピター」以外のGPS受信機とのNMEA−0183センテンスによる通信機能を拡張した。即ち、RS−232Cによる通信パラメタの変更、「秒表示の補正」(ジュピターからは常に2秒遅れた時刻が出力される)を可能にした。
- PC時計の自動校正が出来るようにした。
- GPS受信機と接続中でない時でもパソコンの時刻合わせが出来るようにした。この場合、「同期」ボタンのクリックにより、一番近い正分に合わせる。
- 「停止」ボタンをクリックすることにより、時刻表示を一時停止/再開する機能を追加した。
※V2.2でこの機能は廃止した。
- 使用環境に固有のパラメタはシステムに登録することにより、次回の起動でもパラメタを引き継ぐようにした。また、登録した情報の削除も行えるようにした。
- パソコンからビープ音を出力するための条件を設定出来るようにした。
- 1PPSの信号をRS−232CのDSRで検出するようにした。
- 時刻の取得/設定およびタイマーインターバルの管理をV1.0では開発処理系が提供する関数群で行っていたが、V1.1からWindowsのAPIで処理することにより時間管理の精度を向上させた。
[Ver2.0について]
- 「同期調整」の1カウントを100ミリ秒から20ミリ秒に変更した。
※V2.2から100ミリ秒に戻した。
- バイナリーフォーマット時の経緯度の表示形式を度、分、秒(小数2桁)とした。
- 条件設定の「自動校正」と「Beep音条件」のパラメタ形式を変更した。
- バイナリーモードで「RS−232Cケーブルから1PPSのDSR信号が上がる」時の処理として、時刻の表示を即(受信スレッド内で)行うようにした。また、時刻の自動校正の指定がある時にも、ここで行うようにした。それに伴って「通信遅延」の表示を、目標値である「4」に固定したものから実測値によるものに変更した。
- 「PC誤差」および「通信遅延」の表示単位を「0.1秒」から「10ミリ秒」に変更した。
- 「PC誤差」の表示で誤差が2桁秒以上になると表示が切れてしまうので表示欄を広げた。また、PC誤差の表示間隔を「毎秒」から5秒間隔に変更した。
- Satkの2重起動を防止するようにした。
- ネットワーク機能を追加した。これに関連して画面のレイアウトが一部変更になった。
[Ver2.1について]
※GPS受信機「GT−77」(株SPA)から時刻情報を有効に取り出せるように機能を追加した。
また、本ドキュメントにおける時刻管理の精度に関する記述を書き直した。
- 「条件設定」フォームで、「受信機」の種類として「GT−77」を追加する。尚、「GT−77」を指定した場合には、「秒補正」値は「0」とする。
- 「接続」時、「GT−77」を使用する時にはNMEAの出力センテンスとして「tps」(1秒周期)を追加する。
- 受信機への「コマンド送信」時に、「GT−77」が使用されておれば専用のフォームを表示し、「出力センテンス」、「TRAIMスイッチ」、「1PPSコントロール」、「測地系」の制御が出来るようにする。
尚、「出力センテンス」を全てチェックすると、データ量がRS-232Cの通信許容量(4800BPS)を超えてしまうので注意が必要である。
- 受信状態を確認するために、GGAセンテンスの測位状態のチェックに加えて、「tpsセンテンス」の「現在時刻ステータス」が「3」(UTC)になっていなければ警告を出す。
- 1PPSを受信スレッドが検出したら、すぐに時刻の表示を更新する。この変更に伴い、時刻表示の「一時停止」を、受信機と通信中は「位置表示の一時停止」とした。
※V2.2から「一時停止」機能そのものを削除した。
[Ver2.2について]
- 機能の追加または削除によるフォームの再編
「テスト」ボタンの追加([テストダイアログ]参照)、「タスクトレイ上での実行」、「停止」機能の削除、「ログ取得」機能の追加、「時差」パラメタの追加、等などによる。
- 対象とするGPS受信機の追加
ジュピター、GT−77に加え、CCA−370H(株SPA)に対応、「その他の受信機」として、eT36tm(株SPA)、G8(Ashtech)で正常に動作することを確認した。尚、GT−74(株SPA)はGT−77とコマンドレベルで互換性があることを確認した。
- タスクトレイ上での実行
この機能追加に伴い、指定によりログを記録するようにした。ログはSatkの実行ファイルが置いてあるフォルダと同じ場所に記録される。
ログに記録されるメッセージは最新の256行分を「ログ情報」フォームで見ることができる。ログ取得の指定をしていない場合にも、このフォームは表示されるが、その場合にはSatkの終了時にフォームの内容をログとして保存するかどうかを問い合わせる。
- SNTPモードにおける追加機能
一定時間ごとにサーバにアクセスする機能を追加した(「条件設定」フォームの「サーバへの接続間隔」パラメタ)。尚、ここの数値をゼロにするとサーバへの自動アクセスは行わない。
- タイムサーバとしての時刻
V2.1までは、Windows APIであるGetLocalTime()関数が返す時刻のみを利用していた。V2.2からGPS受信機と通信中は、1PPSを受け取った時刻と、その時刻からのhigh-resolution
performance counter機能(Windows)が提供するカウンタの差で補正した時刻を利用することにした。
この修正により、タイムサーバとしての時刻の精度が大幅に向上した。
[Ver2.21について]
Ver2.2に対して若干の修正を施した
- Satkモードでクライアント動作中にSatkサーバと接続した時、「モニタ」ボタンで表示される位置情報の緯度の表示が「度とその小数」で表示されるバグを修正した。
- 1PPS通知をRS-232CのDSRピンから受けない時のサーバ動作の不具合を修正した。
- タイムサーバとしての時刻精度を測定する機能を追加した。関連して、テストダイアログの「PPS間隔」の表示形式を変更した。
[Ver3.0について]
- 「時報」ボタンを追加した。このボタンをクリックすることにより、その時刻をログに出力すると同時に、クリップボードにテキスト形式でコピーする。
- GPS受信機と接続中であり1PPSの通知を受けている時は、ミリ秒の単位まで表示する。
- GPS受信機と接続中であるが1PPSの通知を受けない時、またはSNTPクライアントとして動作中は「100ミリ秒」の単位まで表示する。
- 上記以外の時は、秒の小数を「xxx」として表示する。
- 終了時に、「ログを出力しない」と設定してある時は、保存するかどうか問い合わせるのをやめた。
関連して、ログの表示を開発環境のTListBoxコンポーネントからTMemoコンポーネントに変更した。
- PPS間隔の統計情報の採り方を修正した(結果として標準偏差として表示される値が大きくなった)。
- Satkから起動するダイアログボックスの表示を動的に行うことにより実行中のメモリ節約を図った。
- 「条件設定」フォームの接続先に「ポート3」を追加した。
[Ver3.1について]
- 「条件設定」フォームの接続先に「ポート4」を追加した。
- CCA−453tm(株SPA)がCCA−370Hと互換性があることを確認。
[Ver3.2について]
GPS受信機ジュピターとバイナリモードで通信中、UTC0時ちょうどに時刻を合わせると、1000番センテンスの時刻が2秒遅れているために24時間遅れる不具合を修正(時刻は1108番センテンスから採っているが、日付は1000番のものを使用している)。
[Ver3.3について]
パソコン内部時計の誤差が1時間以上あった時、状態により次のように動作する。
- GPS受信機と通信中で、「自動校正する」と設定されていた場合、校正は行わない。
- GPS受信機と通信中で、「自動校正しない」と設定されていた場合、従来どおり校正を行う。
- ネットワーククライアントとして動作中は、校正は行わず、メッセージを表示する。
[Ver3.4について]
NMEAセンテンスのうちPGRMMセンテンスを受信したら測地系を表示する。
※マース15(株SPA)での動作を確認し、同機から出力されるセンテンスを活かすべく対応したもの。
[Ver3.5について]
- バグ対応 - 1PPSが上がらない時、「同期」ボタンは「自動校正する/しない」に関らず有効になっていたが、「同期」ボタンをクリックした時の内部の動作が「自動校正する/しない」で逆になっていた。
- 1PPSが上がらない時、「同期」ボタンは「自動校正する」時には無効にするように修正。
- 「テストダイアログ」にGPS受信機からのセンテンスを表示する際、末尾に改行コードがついており、ログファイルに出力した時に見にくかったので(改行コードを)削除。
- 「テストダイアログ」に「センテンスをログに出力」チェックボックスを追加。これがチェックされた状態でダイアログボックスを閉じると、GPS受信機からのセンテンスをログファイルに書き出すようにした。
- 「自動校正する」時、PCの内部時計を5秒間隔でチェック&校正していたが、10秒間隔に修正。
※補足
「PCのスペックが追いつかないためにGet/SetLocalTime()APIの処理が他の処理の後回しにされた結果、PCの内部時計が正しく校正されない」ことへの対策として、「自動校正した次のどこかのタイミングでPC内部時計とGPS受信機からの時刻を再度比較し、1秒以上ずれていたら警告をログに残す」ことで検出できないかと検討。自動校正の間隔を10秒に変更したのは、間の5秒でこの処理を入れたことによる。
[Ver3.51について]
条件設定画面の「受信機」に「Garmin社標準」の項目を追加
[Ver3.53について]
時差の数値を±13時まで(1時間単位で)拡張
[Ver3.54について]
高速CPU(概ね3GHz以上)で動作させた時、high-resolution
performance counter機能(Windows)におけるPerformance
Frequencyの値を4バイトの符号付整数として扱うとオーバーフローすることが判明、とりあえずの対処として同値を「4バイトの符号なし整数」とした。
[補足事項]
- プログラムは、C++Builder 5 (インプライズ)で作成しました。
- バグ情報、質問、感想などは、メールでお送り下さい。
set@bronze.ocn.ne.jp
- 転載等は、予めメールにてご連絡下さい。
- 本プログラムは、フリーウェアですが著作権は放棄していません。
- 万一、本プログラムの不具合により、使用者に損害が生じても、一切の責任は負いません。
[謝 辞]
- 「せんだい宇宙館」の早水勉氏には、「宇宙館式GPSラジオ」(ジュピターを内蔵し、1PPS情報を正しく認識して、受信情報をRS−232Cまたはビデオ信号に伝える装置、現在GHS時計Ver.2.1)の提供から、Satkのテスト、公開等々色々な点でお世話になりました。
- (株)SPA様には、ジュピターに関する細かい質問に丁寧にお答え頂きました。また、DSRで1PPSを伝えるアドバイスと、そのためのケーブルを提供して頂きました。
- Satkは、版数を上げるに従い多くの方々から、ご指導・ご支援を頂いております。
改めて感謝します。