こんにちは、ドルフィンシステムの笹生です。
今回で 22回目の USRP のサンプルについての紹介となります。
今回紹介するサンプルはタイトルの「複数の USRP デバイスを PPS で時刻同期させるサブ VI 」となります。このサブVI は 18回目の解説記事「2台の USRP を PPS で同期して受信するサンプル」のブロックダイアグラムで使用されています。
このサンプルはサブ VI となりますので使用例は 18回目の解説記事「2台の USRP を PPS で同期して受信するサンプル」をご覧いただければと思います。
それでは「niUSRP EX Synchronize Clocks Multi-Device (PPS).vi」を見ていきましょう。
サンプルプログラムの開き方につきましては第一回のブログを参照してください。
niUSRP EX Synchronize Clocks Multi-Device (PPS).vi
サンプルのフォルダを開くと以下のようにずらずらっと並んでおります
名前順にソートされて22番目の VI が「niUSRP EX Synchronize Clocks Multi-Device (PPS).vi」です。
このサブ VI の目的は複数台の USRP を使用する場合に PPSトリガを使って時刻同期をすることです。
それではフロントパネルを見てみましょう。
下のような GUI を確認できます。
サブ VI ですので、フロントパネル上の制御器が入力、表示器が出力の役割を持ちます。
名称 | デフォルト | 設定値について |
Device Names | | 2台の USRP の IP アドレスをセミコロン区切りで入力します。 上位の VI からは「192.168.10.2;192.168.10.3」と入力されます。
|
Devices | dev0 dev1 | 文字列配列です。Device Namesで複数のデバイスをまとめて 指定していますが、これで特定するようです。 dev0, dev1 という文字列指定はデバイス全体を示すようです。 |
Max Number of Allowed Synchronization Iterations | 20 | 同期するまで最大何回トライするかを指定します。 |
SetTime | 2, 0 | GPS時刻を使わない時に、この Set Time で指定した時間を 待って同期のトリガをかけます。 2つパラメータありますが、whole seconds は秒、 fractional seconds は小数部です。 |
Set Device Clock to GPS Time? | FALSE | GPS の時刻で同期させる場合は True を指定 |
error in (no error) | | エラー入力、上位でエラーがある場合は実行されずに抜けます。 |
Device Names Out | | Device Names がそのまま出力されます。 |
Synchronization Done? | | 同期できた場合は True が出力されます。 |
error out | | エラー出力 |
アトリビュートなどの解説がこのページにあります。
ブロックダイアグラムはこのような感じです。
処理の大まかな流れとしては
①処理開始(マスターデバイスで PPSエッジを認識して同期処理開始)
②時刻取得(複数デバイスで前回 PPSエッジ時刻を取得)
③同期時刻セット(次回タイムベースエッジの時刻をセット(GPSの場合とそうでない場合))
④同期(GPSでない時、前回 PPSエッジ時刻を取得して同じ場合同期成功)
⑤同期チェック(同期成功の場合、時刻が同期しているかチェックする)
という流れになります。
①処理開始
①マスターデバイスで PPSエッジを認識して同期処理開始の部分について解説します。
①-1 : 特殊な属性設定
いきなり特殊な設定が出てきました。
「Special Attribute to enable setting time immediately」
というコメントがついておりまして、Attribute ID を指定して False を設定しています。
このAttribute ID に与える ID がどういったものなのかを調べてみたものの、残念ながら分かりませんでした。コメントからすると ID 1150523 は「時間をすぐに設定できる特別な属性」を False (無効)にしているようです。
この後、試行回数分ループする While ループに入ります。
①-2 : マスターデバイスの時刻取得
試行ループ内の最初の処理は以下の処理です。
同期処理試行の最初にするのが、マスターデバイス (配列の 0 番目)の「previous timebase edge (ひとつ前の PPSエッジ)」での時刻(秒)を取得することです。
①-3 : マスターデバイスの時刻取得その2
最初の取得は不確定な部分もあるので、1秒以上経過するまでこの While ループで待つ処理をしている。これで PPS のエッジを 1度は受けたとうことを確認しているようだ。
①-4 : 300ms 待つ
ここでウェイトを入れている理由についてはコメントがないのでよくわかりませんでした。
②時刻取得
②複数デバイスで前回 PPSエッジ時刻を取得
For ループで全デバイスの
「previous timebase edge (ひとつ前の PPSエッジ)」での時刻(秒)を取得しています。
③同期時刻セット
③次回タイムベースエッジの時刻をセット(GPSの場合とそうでない場合)
③-1 : GPS時刻のセット(GPS使用時)
次の処理は Case ストラクチャの中にあり、True は GPS 使用時の処理です。
「Next timebase edge (次の PPSエッジ)」でセットする時刻を GPS 時刻として設定します。
③-2 : Set Time で指定された時刻のセット(GPS未使用時)
次の処理は Case ストラクチャの中にあり、False は GPS 未使用時の処理です。
上位から設定された Set Time を「Next timebase edge (次の PPSエッジ)」に設定しています。
どちらも niUSRP Set Time 関数での channel list に空の文字列を入れているので、すべてのデバイスに同じ時刻を設定することになります。
④同期
④GPSでない時、前回 PPSエッジ時刻を取得して同じ場合同期成功
④-1 : GPS の時は特に処理なしで同期フラグ True
④-2 : GPS 未使用時は同期状態確認
②で取得した時刻と、今取得した
「previous timebase edge (ひとつ前の PPSエッジ)」での時刻(秒)が同一であれば同期とみなし、異なる場合は同期していないとしています。
⑤同期チェック
⑤同期成功の場合、時刻が同期しているかチェックする
⑤-1 : ケースストラクチャが False (フラグが同期していない) の場合
特に何もせず、ループが終わってしまった場合は同期しなかったというエラーメッセージを追加している。
⑤-2 : ケースストラクチャが True (フラグが同期成功) の場合
⑤-2-1 : GPS 使用時
↓
1000ms 待機
↓
マスタデバイスの「previous timebase edge (ひとつ前の PPSエッジ)」での時刻(秒)が取得したGPS 時刻以上になったら OK として終了
⑤-2-2 : GPS 未使用時
1000ms 待機
↓
マスタデバイスの「previous timebase edge (ひとつ前の PPSエッジ)」での時刻(秒)が Set Time 時刻以上になったら OK として終了
まとめ
このサンプルは 外部 PPS トリガ信号を使用して 複数の USRP を同期させるサブ VI です。
情報が無かった Attribute ID などがありますが、USRP のデバイス内の時刻の扱いについて理解すればこのサブVIよりシンプルに PPS 同期の関数を作成することはできるような気もしますが、どうなんでしょう。。。
このサブ VI の難易度は上級者向け(★★★)としたいと思います。
0 件のコメント :
コメントを投稿