李照國 ,潘洪湘 ,張 婷
(1.南瑞集團公司(國網電力科學研究院),南京 211106;2.國電南瑞科技股份有限公司,南京 211106;3.智能電網保護和運行控制國家重點實驗室,南京 211106)
電力系統是與時間相關的系統,各子系統應基于統一的時間基準運行,以滿足時間一致性的要求[1-4]。隨著電力系統時間同步監測功能的推廣,對變電站監控系統的對時精度也提出了更高的要求,站內時間同步監測精度應小于3 ms。
NTP(網絡時間協議)是由RFC 1305定義的時間同步協議,用來在分布式時間服務器和客戶端之間進行時間同步[5]。NTP基于UDP(用戶數據報協議)報文進行傳輸,使用的UDP端口號為123。使用NTP的目的是對網絡內所有具有時鐘的設備進行同步,使網絡內所有設備的時鐘保持一致,從而使設備能夠提供基于統一時間的多種應用[6-9]。對于運行NTP的本地系統,既可以接受來自其他時鐘源的同步,又可以作為時鐘源同步其他時鐘,并且可以和其他設備互相同步。
目前,大部分變電站監控系統通過NTP實現時間同步,監控系統主要采用Linux操作系統,因此本文的策略針對Linux系統。在互聯網上,通過NTP同步的2臺機器之間的典型精度在幾毫秒之內。在局域網上,通過優化NTP的對時過程,其精度通常可以達到幾十微秒,如果使用硬件時間戳或硬件參考時鐘,也可以達到亞微秒級的精度。
計算機時間以各種方式表示,具體取決于硬件功能、操作系統和系統時鐘模型。
Linux系統實際上有2個時鐘,分別為硬件時鐘和系統時鐘。硬件時鐘,也叫做RTC或者CMOS時鐘,由主板電池進行驅動。當操作系統關機時,計算機使用硬件時鐘來保持時間,但是運行時的操作系統是不用這個時間的。系統時鐘,也叫做內核時鐘或者軟件時鐘,是由軟件根據時鐘中斷來進行計數的,系統時鐘在操作系統關機的情況下是不存在的,因此,操作系統啟動時,系統時鐘通過讀取硬件時鐘的時間進行初始化。系統時間是指當前系統時鐘的時間。
時鐘由1個振蕩器和1個振蕩器計數器組成,用于記錄在給定時間內相對某個初始值的增量。時鐘中斷是由計算機的計時電路產生的。計時電路按照一定的計數方式對晶體振蕩器產生的輸入脈沖進行計數操作,每次計數到期,計時電路就產生1個時鐘中斷。操作系統利用時鐘中斷維護系統時鐘的正常工作,每次時鐘中斷,操作系統的時間計數變量就加1。
在使用NTP進行對時的計算機系統中,影響計算機時鐘誤差的3個主要因素分別為:不對稱的網絡延遲;計算機硬件和軟件的潛在因素;時鐘振蕩器的漂移。文獻[10]給出了計算機時鐘和理想時鐘誤差的計算公式:

式中:t為當前時間;t0為上一次更新時間;T為時間偏差;R為頻率偏差;D為時鐘振蕩器的漂移偏差;x為隨機誤差。
式(1)中前三項偏差有一定的規律,可以進行修正。時鐘振蕩器的漂移偏差,通常可以被時間偏差和頻率偏差進行控制。NTP協議可以對前兩項偏差進行預測。
分辨率是一個時鐘讀數與另一個時鐘讀數的區別程度。系統時鐘分辨率定義為用戶態下獲得的系統時鐘的最小增量,可以為1 ns,1μs,1 ms,10 ms等,最壞情況下也不會超過1 s。
使用操作系統函數gettimeofday()獲取系統時鐘的分辨率,過程如圖1所示。現在商用計算機的時鐘分辨率可以達到微秒級。

圖1 獲取時鐘分辨率流程
NTP客戶端第一次向NTP服務端發送報文時,有一個地址解析過程。以太網上每一個網絡接口都有其硬件地址,在硬件層次上進行的數據幀交換必須有正確的接口地址。Linux內核必須知道目的端的硬件地址才能發送數據,獲取目的端硬件地址的工作由ARP(地址解析協議)完成,其過程如圖2所示。

圖2 地址解析過程
因此,客戶端應該首先向服務端發1幀ECHO報文,以使內核緩存IP地址和硬件地址之間進行映射,在下次發送報文時,直接使用該映射,減少中間環節。同時,該操作也促使內核把客戶端程序加載到內存中,加快指令執行速度。
本文中的NTP對時方式采用客戶機/服務器方式。其工作原理為:客戶機首先向服務器發送1個NTP包,其中包含了該包離開客戶機的時間戳T1(以客戶時間為參照);當服務器接收到該包時,依次填入包到達的時間戳T2、包離開的時間戳T3(以服務器時間為參照),然后立即把包返回給客戶機;客戶機在接收到響應包時,記錄包返回的時間戳T4(以客戶時間為參照)。
客戶機使用上述4個時間戳可以計算出路徑時延: d=(T4-T1)-(T3-T2), 客戶機相對服務器的時間偏差: offset=[(T2-T1)+(T3-T4)]/2。
客戶機在對服務器時間的連續采樣中,需要檢查數據包的有效性,以便做進一步的處理。有效性檢查需要經過如下6個步驟:
(1)復制數據包檢查。防止本包數據是上一包數據的完全復制,消除對同一包數據處理2次的可能性。
(2)連貫性檢查。收到的數據包里所包含的時間戳T1,必須和客戶機最近發出去的數據包里T1保持一致。連貫性檢查保證服務器回復的是客戶機最近一次的請求,這將保證接收數據包的順序,同時可以防止偽造的數據包。
(3)正確初始化檢查。檢查時間戳T1和T2是否為零,防止客戶機和服務器沒有進行正確的初始化。
(4)路徑時延檢查。在變電站的網絡結構下,客戶機和服務器之間的路徑時延必須小于20 ms,否則丟棄該數據包。當站內網絡擁堵時,客戶機計算出的路徑時延就會比較大。
(5)路徑時延變化率檢查。檢查本次采樣中的路徑時延與采樣庫中最小的路徑時延之比,如果大于2,則丟棄本次數據包。
(6)路徑時延增長量檢查。檢查本次采樣中的路徑時延與采樣庫中最小的路徑時延之差,應該小于采樣庫里路徑時延標準差的10倍,否則丟棄本次數據包。
只有數據包通過這些有效性檢查后,才可進行進一步的統計處理。
通過NTP不僅要同步計算機時間,同時要計算出計算機時間的誤差范圍。時間偏差為客戶機/服務器的查詢時間之差與服務器/客戶機的響應時間之差的和的一半。通過記錄數據包到達和離開服務器的時間、離開和到達客戶機的時間,可以計算出這些差值。路徑時延為從客戶機請求到接收應答的時間,并減去服務器處理請求的時間,因為服務器的處理時間是和網絡問題無關的。在處理NTP采樣數據時,必須考慮時間偏差、路徑時延和誤差因素。誤差因素主要反映了讀時鐘操作和時鐘頻率的公差。
本策略中最大的采樣數設置為64個采樣點,通過循環的方式進行更新,每次丟棄時間最久的采樣點。新的采樣點的T4時間如果小于最近一次采樣點的T4時間,說明服務器或者本地時間進行了調整,這時需要清空采樣庫,重新開始積累采樣。
一元線性回歸方程的模型表示如下:

式中:Yt為因變量;Xt為自變量;Ut為隨機誤差;b為截距項;a為回歸系數。
以T4為自變量,時間偏差為因變量,使用最小方差線性擬合技術估算出回歸系數和截距,回歸系數為客戶機與服務器之間的頻差,截距為客戶機與服務器之間的相差。
NTP算法假設在服務器與客戶機通信過程中,請求報文和應答報文經歷的路徑時延相等。但在變電站監控系統的網絡環境中,NTP服務器到客戶機(監控系統)方向上的網絡報文遠遠多于客戶機(監控系統)到NTP服務器方向上的網絡報文,因此請求報文與應答報文往返時延并不相等,此外路徑時延還受到操作系統協議棧時延、網絡鏈路時延、路由器處理和排隊時延的影響。在時間采樣數據的篩選中對路徑時延的大小、變化率、增長量進行檢查,并丟掉不合格的數據包,這些數據不再參與回歸分析。
對采樣數據進行加權處理,可以減少不對稱的往返路徑時延對對時精度的影響,從而提高監控系統對時精度。本策略中根據路徑時延的大小對采樣數據進行加權,路徑時延越小其所占權重越大。同時,在線性回歸的計算中,對殘差進行分析,根據其是否均勻分布,多次對該組采樣數據進行回歸計算,每次計算中去掉該組數據中的一個采樣點,最終取殘差最好的一組值計算出客戶機與服務器之間的頻差、相差。
Linux內核使用David L.Mill的時鐘調整算法,系統調用adjtimex()讀取和可選地設置該算法的調整參數。它以一個指向結構體timex指針為參數,更新內核參數相應的值,并且通過相同的結構體來返回內核當前的值。該算法的目標是將計時精度提高到1μs,最終達到1 ns。
內核將系統時鐘實現為64位邏輯時鐘,在每個硬件中斷或時鐘滴答時其值遞增。通過循環地對時鐘滴答增加或減少某個值調整時鐘頻率,其范圍為-0.5‰~0.5‰。在可用的情況下,一個稱為處理器周期計數器的輔助計數器用于在時鐘滴答中斷之間插值。每秒結束時系統時鐘校正例程重新計算,并確定新的相位調整和頻率調整,在接下來的一秒中,時鐘調整例程在每個時鐘滴答中斷處分攤這些調整。
Adjtimex()函數適用于時間變量以秒和納秒以及以秒和微秒表示的內核。無論哪種情況,當必要的硬件支持可用時,系統時鐘分辨率都是納秒級。即使硬件時鐘的分辨率僅為微秒級,該函數也能提供大量信號進行整飾和平均,以最大限度地減少讀取和舍入誤差。雖然時鐘校正在NTP中每次應答執行一次,但在內核算法中每次時鐘中斷處都執行。
使用NTP對時的計算機,其時間波動主要是由于網絡和操作系統延遲造成的,其頻率波動主要是由溫度變化造成的。商業計算機沒有明確的手段來控制環境溫度,因此在一天的正常運行中,振蕩器頻率可能會在百萬分之幾之間變化。為了進一步提高對時精度,可以根據溫度對頻率進行調節,由于振蕩器在物理上與CPU(中央處理單元)芯片接近,因此可以根據CPU的溫度對頻率進行調節。此外,也可以使用驅動程序或硬件時間戳,進一步提高監控系統對時精度,但這需要介入內核驅動或網絡接口程序。