使用 SNTP 設定 CompactRIO 與 NIST 伺服器同步

更新 Jun 2, 2025

環境

硬件

  • 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、Desktop ETS、FieldPoint、Industrial Controller、Smart Camera,以及 Linux Real-Time 裝置原生不支援 SNTP 同步。此流程僅適用於執行 VxWorks 作業系統的 CompactRIO 控制器。要確認控制器所使用的作業系統,請參考 Real-Time Controllers and Real-Time Operating System Compatibility

從 LabVIEW Real-Time 8.6 開始,使用 VxWorks 作業系統的 CompactRIO real-time 控制器可以設定與 SNTP 伺服器同步。

若要將控制器設定為與 SNTP 伺服器同步,請依照下列步驟進行:

  1. 使用 FTP 將控制器上的 ni-rt.ini 檔案傳送到你的 Windows 電腦。

  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
  1. 使用 FTP 將已修改的 ni-rt.ini 檔案傳回控制器。更新 ni-rt.ini 並重新啟動後,cRIO 控制器將會自動與 SNTP 伺服器進行同步。

下表說明了 .ini 中各項設定的意義:

代幣類型默認重要性描述
source_priority string sntpREQUIRED 列出已安裝的時間同步外掛程式的相對優先順序。對於 cRIO,可用的選項為 rtcdiosntp。 
source.sntp.enable bool false REQUIRED 設為 true 以啟用 SNTP 時間同步外掛程式。設為 false 則為停用。 
source.sntp.address string 0.0.0.0REQUIRED 指定 SNTP 時間伺服器的 IPv4 位址。請從 NIST Internet Time Service Clock 網站選擇你所在區域的伺服器。使用「.」分隔的 IP 位址。此時不支援使用主機名稱(如 pool.ntp.org)。 
source.sntp.intervalint 60Recommended 預設情況下,SNTP 用戶端驅動程式在每次查詢時間伺服器之間會休眠此間隔時間(秒)。可以指定新的秒數以調整間隔。 
source.sntp.port int 123Optional 預設情況下,SNTP 使用標準連接埠與伺服器通訊。如伺服器使用非標準連接埠,請指定新的連接埠號碼。 
source.sntp.verbose bool false Optional 預設情況下,SNTP 驅動程式的錯誤訊息不會顯示。設為 true 可在主控台顯示詳細錯誤資訊。 
source.sntp.log bool false Optional 設為 true 時會將時間戳記記錄至檔案。此功能僅應用於除錯用途。啟用後,日誌將儲存在 ni-rt\system\ts_sntp_log.txt。 

附加資訊

ts_sntp_log.txt(64位元十六進位)範例內容:

currentLocalTimeNS, frequencyHz, t1_raw, t2_ns, t3_ns, t4_raw 
30744de63d52117c: 98989929.000000, 000000004b7deac0, 30744e740a609a99, 30744e740a60ee36, 000000004b90fef7 

 

參數
定義
currentLocalTimeNS cRIO 上的本地時間 
frequencyHz 時脈處理器頻率 
t1_raw 起始時間戳記,用戶端送出的時間請求 
t2_ns接收時間戳記,伺服器接收到請求的時間 
t3_ns傳送時間戳記,伺服器回應的時間 
t4_raw目的時間戳記,用戶端接收到回應的時間 

 

如果將上方範例的時間戳記轉換為十進位,結果如下:

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_rawt4_raw 並不太具有直接用途。相反地,我們需要將它們各自轉換為自控制器上次啟動以來所經過的時間長度:

t1_raw = 0x4b7deac0 = 1,266,543,296 ticks  
t1_duration_since_boot = (tick count * nanoseconds per second / frequency) = (1,266,543,296 * 1e9 / 98,989,929) = 12,794,668,192 ns(約 1.27 秒)  
t4_duration = 12,807,299,366 ns(約 12.8 秒)

 

現在我們可以在交換發生時計算出有意義的 t 值:

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

這個值會儲存在軟體中的變數裡。當 Real-Time 控制器需要知道目前時間時,它會讀取當前的 tick 計數值,將其轉換為 duration(tick * 1e9 / freq),然後加上這個 t 值。這個 t 值代表本地計數器與 NTP 伺服器計數器之間的差異,但它不代表本地時間戳記的誤差量(也就是我們與參考值的偏差量)。

使用這筆資料無法計算出我們與 NTP 時間參考點的即時偏差。不過我們可以觀察 t 值隨時間的變化。每次 t 值的變化量會顯示出,在前一個同步間隔中,本地時間概念與 NTP 主伺服器之間的偏移程度。這可以大致反映出我們與參考值之間的偏差。

此外,還有以下兩種方法可以評估伺服器效能:


  1. 計算往返延遲 d 與本地時鐘偏差 t:

d = (t4_raw - t1_raw) - (t2_ns - t3_ns)  
t = ((t2_ns - t1_raw) + (t3_ns - t4_raw)) / 2
  1. 比較 cRIO 的本地時間與伺服器時間:

(t2_ns + t3_ns) / 2

SNTP 是簡化版的網路時間協定(NTP)。更多其他時間伺服器的選項可參見相關文件中的連結。

SNTP 同步是在系統啟動後根據與參考時間的差異進行一次性的調整。啟動後,它會根據差異調整處理器時鐘以補償漂移。此演算法包含一個容許誤差(tolerance),若超過容許範圍(例如與伺服器時間差太大),則會停止同步處理器時鐘。呼叫 Set Date & Time VI 通常會用於手動修正這類差異以啟動同步。