Satk ドキュメント

このページは瀬戸口貴司氏の作成したものを、GHS-OSDのサイト内に移したものです。


[ダウンロード]

 このリンクを右クリックして実行ファイル「Satk.exe」ダウンロードして下さい。

[はじめに]

 Satk - Satellite Assisted Time Keeperは、GPS受信機を利用してパソコンの時刻を管理するために開発された。
 SatkはGPS受信機からのメッセージをRS−232C経由で受け取り、時刻情報と位置情報を表示する。また、受け取った時刻情報とパソコン内部時計の時刻を比較し、必要により校正する。
 更に、SNTP(Simple Network Time Protocol) Client/Server によりネットワーク上の他のコンピュータと時刻の同期をとる。

[動作環境]

[インストールとアンインストール]

[Satkの操作]

  1. Satkを起動すると、「JST」欄にパソコン内部時計の時刻が表示される。
  2. 「設定」ボタンをクリックすると「条件設定」ダイアログボックスが表示される。ここで設定したパラメタは、「システムに保存」をチェックすることによりレジストリに登録される。Satkをアンインストールする時などレジストリの情報を削除したい時には「システムから削除」ボタンをクリックする。
  3. 「接続」ボタンの押下によりGPS受信機との通信を開始する。受信した情報は「時刻情報」、「位置情報」の欄に表示される(SNTPクライアントとして動作させる時の操作は[Satkのネットワーク機能]の項を参照)。
  4. 通信中に表示される時刻は、NTTの時報サービス等と比べるとタイミングがズレているが「通信遅延」の上下ボタンでタイミングを合わせることが出来る(1PPSがRS-232CのDSRピンで通知される場合には、自動で合わせられる)。
  5. 「同期」ボタンを押下することによりパソコン内部時計の時刻をGPS受信機からの時刻で校正する。尚、GPS受信機と通信中でない時にはパソコン内部時計の時刻に対して一番近い正分に合わせる。パソコンの環境により時刻の「同期」がとりにくい場合には、「同期調整」の数値を変えて見るとよい。
  6. 「切断」ボタンでGPS受信機との通信を終了し、「終了」ボタンでプログラムを終了する。

[ジュピターへのコマンド送信]

GPS受信機として「ジュピター」を使用している場合には、「ジュピターコマンド」ダイアログから8種類のコマンドを送信することが出来る。

  1. NMEA−0183モード
    受信機との通信モードをNMEA−0183モードに変更する。
  2. バイナリーフォーマット
    受信機との通信モードをバイナリーフォーマットに変更する。
  3. ポジションピニング設定
    Position Pinningの機能をオンにする。
    ※「Position Pinning」は、アンテナの移動速度が「ゼロ」の時、受信機の計算した経緯度のデータ表示を固定する機能である。ジュピターは測位計算を1秒毎に行っているが、微小な測定誤差の範囲で表示がふらつく。Position Pinningをオンにすると、このふらつきを無視し、特定の値に固定して出力される。ジュピターではデフォルトでPosition Pinningがオンとなっている。
  4. ポジションピニング解除
    Position Pinningの機能をオフにする。
    ※経緯度の測定値の誤差を評価したい時に有効な機能である。
  5. WGS−84系
    測地系を World Geodetic System に設定する。
  6. 日本測地系
    測地系を Tokyo - MEAN FOR Japan,Korea,Okinawa に設定する。
  7. その他の測地系
    コードを指定することにより、測地系の変更を行う。
  8. NMEAセンテンス選択
    GGA、RMC、GSA、GSVのセンテンスのうち受信したいものを選択する。
※その他の受信機へのコマンド送信については、取り扱い説明書を参照のこと。また、直接Satkでサポートしていない受信機でもNMEA−0183モードで通信しているのであれば、「テストダイアログ」から直接コマンド文字列を送信することが出来る。

[テストダイアログ]

Satkの利用度を広げるために「テストダイアログ」を提供した。

  1. 情報表示
  2. RS−232Cコマンドの送信(ASCIIキャラクタで通信中に限る)
  3. サーバとの時刻同期
  4. ログ出力

[Satk のネットワーク機能]

  1. 「接続先」として「ネットワーク」を指定し、接続先のIPアドレス(またはホスト名)を指定すると、Satkはネットワーククライアントとして動作する(自アドレスはSatkが検出する)。
  2. その際、「プロトコル」として「SNTP」を指定すると「Simple Network Time Protocol Version 4(ユニキャストモード)」で動作する。従ってサーバはSatkであってもネット上の(含むインターネット)(S)NTPサーバであっても構わない。
  3. 「プロトコル」を「Satk」とした場合には、サーバをSatkとした前提でローカルなプロトコルで動作する。これにより「モニター」ボタンのクリックで、サーバに表示された位置情報をクライアント側で見ることが出来る。またサーバの時刻の同期源がなくても強引にサーバの内部時計の時刻と同期させる(ので注意が必要)。
  4. Satkはクライアントからの要求を受けるとGPS受信機に接続している/いないに拘らず(タイムサーバとして、状態に応じた)応答を返す。

[ジュピターとパソコンの接続]

 ジュピターとパソコンとのインターフェイス回路は、せんだい宇宙館のホームページ
   http://uchukan.sendai-net.jp
で紹介されている。
 また、株SPAよりジュピターから1PPS信号をDSRピンに乗せて通知するRS−232Cケーブルが提供されている。

[参考文献]

[開発履歴]

[Ver1.1について]

[Ver2.0について]

[Ver2.1について]

※GPS受信機「GT−77」(株SPA)から時刻情報を有効に取り出せるように機能を追加した。
また、本ドキュメントにおける時刻管理の精度に関する記述を書き直した。
  1. 「条件設定」フォームで、「受信機」の種類として「GT−77」を追加する。尚、「GT−77」を指定した場合には、「秒補正」値は「0」とする。
  2. 「接続」時、「GT−77」を使用する時にはNMEAの出力センテンスとして「tps」(1秒周期)を追加する。
  3. 受信機への「コマンド送信」時に、「GT−77」が使用されておれば専用のフォームを表示し、「出力センテンス」、「TRAIMスイッチ」、「1PPSコントロール」、「測地系」の制御が出来るようにする。
    尚、「出力センテンス」を全てチェックすると、データ量がRS-232Cの通信許容量(4800BPS)を超えてしまうので注意が必要である。
  4. 受信状態を確認するために、GGAセンテンスの測位状態のチェックに加えて、「tpsセンテンス」の「現在時刻ステータス」が「3」(UTC)になっていなければ警告を出す。
  5. 1PPSを受信スレッドが検出したら、すぐに時刻の表示を更新する。この変更に伴い、時刻表示の「一時停止」を、受信機と通信中は「位置表示の一時停止」とした。
    ※V2.2から「一時停止」機能そのものを削除した。

[Ver2.2について]

  1. 機能の追加または削除によるフォームの再編
    「テスト」ボタンの追加([テストダイアログ]参照)、「タスクトレイ上での実行」、「停止」機能の削除、「ログ取得」機能の追加、「時差」パラメタの追加、等などによる。
  2. 対象とするGPS受信機の追加
    ジュピター、GT−77に加え、CCA−370H(株SPA)に対応、「その他の受信機」として、eT36tm(株SPA)、G8(Ashtech)で正常に動作することを確認した。尚、GT−74(株SPA)はGT−77とコマンドレベルで互換性があることを確認した。
  3. タスクトレイ上での実行
    この機能追加に伴い、指定によりログを記録するようにした。ログはSatkの実行ファイルが置いてあるフォルダと同じ場所に記録される。
    ログに記録されるメッセージは最新の256行分を「ログ情報」フォームで見ることができる。ログ取得の指定をしていない場合にも、このフォームは表示されるが、その場合にはSatkの終了時にフォームの内容をログとして保存するかどうかを問い合わせる。
  4. SNTPモードにおける追加機能
    一定時間ごとにサーバにアクセスする機能を追加した(「条件設定」フォームの「サーバへの接続間隔」パラメタ)。尚、ここの数値をゼロにするとサーバへの自動アクセスは行わない。
  5. タイムサーバとしての時刻
    V2.1までは、Windows APIであるGetLocalTime()関数が返す時刻のみを利用していた。V2.2からGPS受信機と通信中は、1PPSを受け取った時刻と、その時刻からのhigh-resolution performance counter機能(Windows)が提供するカウンタの差で補正した時刻を利用することにした。
    この修正により、タイムサーバとしての時刻の精度が大幅に向上した。

[Ver2.21について]

Ver2.2に対して若干の修正を施した
  1. Satkモードでクライアント動作中にSatkサーバと接続した時、「モニタ」ボタンで表示される位置情報の緯度の表示が「度とその小数」で表示されるバグを修正した。
  2. 1PPS通知をRS-232CのDSRピンから受けない時のサーバ動作の不具合を修正した。
  3. タイムサーバとしての時刻精度を測定する機能を追加した。関連して、テストダイアログの「PPS間隔」の表示形式を変更した。

[Ver3.0について]

  1. 「時報」ボタンを追加した。このボタンをクリックすることにより、その時刻をログに出力すると同時に、クリップボードにテキスト形式でコピーする。
  2. 終了時に、「ログを出力しない」と設定してある時は、保存するかどうか問い合わせるのをやめた。
    関連して、ログの表示を開発環境のTListBoxコンポーネントからTMemoコンポーネントに変更した。
  3. PPS間隔の統計情報の採り方を修正した(結果として標準偏差として表示される値が大きくなった)。
  4. Satkから起動するダイアログボックスの表示を動的に行うことにより実行中のメモリ節約を図った。
  5. 「条件設定」フォームの接続先に「ポート3」を追加した。

[Ver3.1について]

  1. 「条件設定」フォームの接続先に「ポート4」を追加した。
  2. CCA−453tm(株SPA)がCCA−370Hと互換性があることを確認。

[Ver3.2について]

GPS受信機ジュピターとバイナリモードで通信中、UTC0時ちょうどに時刻を合わせると、1000番センテンスの時刻が2秒遅れているために24時間遅れる不具合を修正(時刻は1108番センテンスから採っているが、日付は1000番のものを使用している)。

[Ver3.3について]

パソコン内部時計の誤差が1時間以上あった時、状態により次のように動作する。

[Ver3.4について]

NMEAセンテンスのうちPGRMMセンテンスを受信したら測地系を表示する。
※マース15(株SPA)での動作を確認し、同機から出力されるセンテンスを活かすべく対応したもの。

[Ver3.5について]

  1. バグ対応 - 1PPSが上がらない時、「同期」ボタンは「自動校正する/しない」に関らず有効になっていたが、「同期」ボタンをクリックした時の内部の動作が「自動校正する/しない」で逆になっていた。
  2. 1PPSが上がらない時、「同期」ボタンは「自動校正する」時には無効にするように修正。
  3. 「テストダイアログ」にGPS受信機からのセンテンスを表示する際、末尾に改行コードがついており、ログファイルに出力した時に見にくかったので(改行コードを)削除。
  4. 「テストダイアログ」に「センテンスをログに出力」チェックボックスを追加。これがチェックされた状態でダイアログボックスを閉じると、GPS受信機からのセンテンスをログファイルに書き出すようにした。
  5. 「自動校正する」時、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バイトの符号なし整数」とした。

[補足事項]

[謝 辞]

改めて感謝します。