CompactRIOリアルタイムコントローラを構成してSNTPサーバと同期する

更新しました Aug 14, 2023

環境

ハードウェア

  • cRIO-9012
  • cRIO-9014
  • cRIO-9022
  • cRIO-9023
  • cRIO-9024
  • cRIO-9025
  • cRIO-9072
  • cRIO-9073
  • cRIO-9074
  • cRIO-9075
  • cRIO-9076
  • sbRIO-9601
  • sbRIO-9602
  • sbRIO-9605
  • sbRIO-9606
  • sbRIO-9611
  • sbRIO-9612
  • sbRIO-9623
  • sbRIO-9626
  • sbRIO-9631
  • sbRIO-9632
  • sbRIO-9633
  • sbRIO-9636
  • sbRIO-9642

CompactRIO Real-Time VxWorksコントローラをSNTPサーバと同期するように設定するにはどうすればよいですか?

PXI、デスクトップETS、FieldPoint、産業用コントローラ、スマートカメラ、およびLinuxリアルタイムターゲットは、SNTP同期をネイティブにサポートしていません。 このプロセスは、VxWorksオペレーティングシステム(OS)が搭載されているCompactRIOコントローラにのみ適用可能です。使用しているコントローラに搭載されているOSを確認するには、リアルタイムコントローラとリアルタイムオペレーティングシステムの互換性を参照してください。
 

LabVIEW Real-Time 8.6以降では、VxWorksオペレーティングシステムを使用するCompactRIOリアルタイムコントローラは、SNTPサーバと同期するように構成できます。
 

SNTPサーバと同期するようにコントローラーを構成するには、次の手順を行います。
 

  1. コントローラからWindowsマシンにni-rt.iniファイルをFTPで送信します。
     
  2. コントローラのni-rt.iniファイルにあるtime syncセクションの最後に以下の行を追加します。

    [TIME SYNC]
    source_priority=sntp;rtc;
    source.sntp.enable=true
    source.sntp.address=x.x.x.x
    source.sntp.interval=60
    source.sntp.port=123
    source.sntp.verbose=false
    source.sntp.log=false
     
  3. 変更したni-rt.iniファイルをコントローラにFTPで戻します。ni-rt.iniファイルを更新し再起動すると、cRIOコントローラはSNTPサーバとの同期を自動的に実装します。

    次の表で、.iniトークンについて説明します。
     
    トークンタイプデフォルト重要性説明
    source_priority文字列sntp必須インストールされた時間同期プラグインの相対的優先度をリストします。cRIOで使用可能なオプションはrtc、dio、およびsntpです。
    source.sntp.enableブールFalse必須Trueに設定するとsntp時間同期プラグインを有効にします。Falseに設定すると無効になります。
    source.sntp.address文字列0.0.0.0必須SNTPサーバのIPv4アドレスを指定します。下記のリンクにあるNIST Internet Time Service Clockからお使いの地域にあるサーバを選択します。ピリオドで区切られたアドレスを使用します。現時点では、pool.ntp.orgのような名前付けされたアドレスは無効です。
    source.sntp.interval整数60推奨デフォルトでSNTPクライアントドライバは、後続するタイムサーバのポーリング間隔でスリープ状態になります。間隔を調整するには、新規の遅延を秒単位で設定します。
    source.sntp.port整数123任意デフォルトで、SNTPは既知のポートを使用してタイムサーバと通信します。タイムサーバが非標準ポートにある場合は新規のポート番号を設定します。
    source.sntp.verboseブールFalse任意デフォルトでSNTPクライアントドライバエラーは、暗黙的に破棄されます。コンソール出力への詳細なエラーの表示を有効にするには、Trueに設定します。
    source.sntp.logブールFalse任意タイムスタンプをファイルにログするにはTrueに設定します。これはデバッグの目的のみで使用します。Trueに設定した場合、ログはni-rt\system\ts_sntp_log.txtに保存されます。

Additional Information

ts_sntp_log.txt(64ビット16進数)の例:

 
currentLocalTimeNS, frequencyHz, t1_raw, t2_ns, t3_ns, t4_raw
30744de63d52117c: 98989929.000000, 000000004b7deac0, 30744e740a609a99, 30744e740a60ee36, 000000004b90fef7
 
パラメータ説明
currentLocalTimeNScRIOのローカル時間
frequencyHzプロセッサクロックの周波数
t1_rawタイムスタンプを開始、クライアントが送信する時間要求
t2_nsタイムスタンプを受信、サーバが受信する時間要求
t3_nsタイムスタンプを送信、サーバが送信する時間応答
t4_rawタイムスタンプを出力、クライアントが受信する時間応答


上記の例から10進数にタイムスタンプを変更する場合は、以下のようになります。
 

t1_raw = 1,266,543,296
t2_ns = 3,491,501,871,416,253,081
t3_ns = 3,491,501,871,416,274,486
t4_raw = 1,267,793,655
 

ただし、t1_rawおよびt4_rawは有用ではありません。代わりに、コントローラが最後に起動されたときからの各継続時間を変換する必要があります。
 

t1_raw = 0x4b7deac0 = 1,266,543,296ティック
t1_duration_since_boot = (ティックカウント×ナノ秒分の秒/周波数) = (1,266,543,296×1e9 / 98,989,929) = 12,794,668,192ナノ秒  (~12.7秒)
t4_duration = 12,807,299,366ナノ秒  (~12.8秒)
 

この変換により、tに対して意味のある値を計算することができます。
 

t = ((t2 - t1) + (t3 - t4)) / 2
t = ((3491501871416253081-12794668192) + (3491501871416274486-12807299366)) / 2
t = 3,491,501,858,615,279,616ナノ秒
 

この値は、ソフトウェアで変数として保存されています。RTコントローラが何時かを知る必要があるとき、現在のティックカウントを読み取り、持続時間(ティック×1e9/周波数)を変換して、このt値を追加します。この値は、ローカルカウンタとNTPサーバのカウンタ間の違いを示していますが、ローカルタイムスタンプでの誤差量(リファレンスからのオフセット)を示していません。
 

このデータでNTP時間リファレンスからの即時オフセットを計算することは、実際は可能なことではありません。行うことはできるものの、どのようにt値がオーバータイムを変化するかを見ています。新旧のt値間の違いは、ローカル時間がどのくらい前の同期間隔間のNTPマスターから離れていくかを表します。これは、リファレンスからのオフセットの大まかなアイディアを得られます。
 

さらに、以下の2つの方法はサーバのパフォーマンスを評価するためにも利用できます。
 

  • 往復の遅延dおよびローカルクロックオフセットtを計算します。
    d = (t4_raw - t1_raw) - (t2_ns - t3_ns) 
    t = ((t2_ns - t1_raw) + (t3_ns - t4_raw)) / 2
     
  • cRIOのローカル時間とサーバ時間を以下の式を使用して比較します。
    (t2_ns + t3_ns) / 2
     

SNTPは、ネットワークタイムプロトコル(NTP)の簡素化されたサブセットです。SNTPの詳細については、RFC 2030を参照してください。他のタイムサーバのオプションの詳細については、下記の関連リンクを参照してください。。
 

SNTP同期は、起動時に日付/時刻の大幅な補正をおこないます。起動後、プロセッサクロックを調整してドリフトを考慮します。アルゴリズムには誤差許容値がありますが、その許容値を超える(つまり、同期から大きく外れている)と、プロセッサクロックを同期する調整を停止します。通常、日付と時間を設定VIを呼び出すとクロックがアルゴリズムの誤差許容値外になります。