張端陽 肖 力 付忠敏
(華中科技大學自動化學院 武漢 430074)
工業現場的數據采集變得越來越模塊化,但當需要測量多個外部的數據時,可能需要多個模塊。將這些由傳感器采集的數據通過網絡上傳的時候,由于沒有時間信息,遠程上位機不能很好將采集數據融合處理,一般只能獨立的對采集上來的數據處理。為了實現對采集數據的時鐘同步,需要對數據采集模塊間進行時鐘同步。
當前幾種比較流行的時間同步協議有NTP(Network Time Protocol)[1]和 PTP(Precision Time Protocol)[2],兩者的原理類似,都是實現主時鐘節點和從時鐘節點間的時間同步,其中PTP協議是網絡測量和控制系統時鐘同步協議(IEEE1588協議)的簡稱,具體的差異如圖1所示。從圖中可以看出,NTP和PTP時間戳的截取的位置不同。NTP獲取的時間戳的位置是應用層,而PTP時間戳的截取的位置是在物理層。正是由于獲取時間戳的位置不同,這樣PTP可以有效地去除運行操作系統和TCP/IP協議棧時間抖動對時鐘同步的影響。但是由于PTP獲取時間戳位置的在物理層,所以需要特殊的硬件支持,即在具體的應用中硬件需要支持PTP,這個實際的硬件設計帶來了一定的成本,但是NTP不需要硬件支持。獲取時間戳的位置的差異促使PTP的同步時鐘精度是NTP同步時鐘精度的10000倍。PTP的同步時鐘精度是亞微秒級(100ns)。在該精度下可以滿足大多數時間同步的精度要求,比如PTP可用于高速鐵路地震預警系統采集設備[3]。

圖1 時間戳截取的位置
由于上述的對硬件特殊要求[4~9],這使 PTP 的實用性遠沒有NTP簡單。為了實現高精度的同步并且去掉對硬件時間戳的依賴,由圖1可知捕獲時間戳的位置越接近物理層時間精度越高,故本文實現在數據鏈路層上捕獲時間戳。這樣既可以去掉對硬件時間戳的依賴同時提高時鐘同步精度。
PTP時鐘同步的基本原理是通過消息傳遞機制使控制網絡中的時鐘節點與最精確的時鐘節點間保持同步。最精確的時鐘節點被稱為主時鐘,其它的時鐘節點被稱為從時鐘。當有時鐘加入到控制網絡中,該時鐘節點通過最佳主時鐘算法確定該控制網絡中主時鐘,進而使用PTP協議中的相關算法與該主時鐘同步。
PTP時鐘同步的基本原理如圖2所示,其基本實現可以分為下面基本步驟:
第一步,主時鐘首先廣播一個Sync(同步)報文,此時從時鐘記錄接收到的Sync報文的本地時間戳t2。
第二步,緊接第一步主時鐘發送一個follow_up(跟進)報文,此報文記錄的Sync報文發送時主時鐘的時間戳t1。當從時鐘接收follow_up報文時,從時鐘記錄此時的報文中的時間戳t1。
第三步,從時鐘發送一個Delay_req(延時請求)報文,并記錄下此時的本地發送時間戳t3。
第四步,主時鐘接收到Delay_req報文時,記錄此時接收到的主時鐘本身的時間戳t4,然后主時鐘發送一個Delay_resp(延時響應)報文,該報文記錄時間戳t4。當從時鐘接收到Delay_resp報文時,從中提取時間戳t4。

圖2 PTP時鐘同步的基本原理
經過上面的四步后,從時鐘擁有了時間戳t1,t2,t3和t4。通過上面的四個時間戳我們可以計算出此時報文的網絡傳輸延時時間和從時鐘相對于主時鐘的時偏移量。這樣完成了主從時鐘節點間的同步。
主從時鐘間網路延時計算:

式(1)成立的條件是報文在主從時鐘節點間傳輸延時的時間是相等的,同一局域網或者子網中上面的假設是成立的。當計算出上面的時鐘偏移量和主從時鐘節點間的網絡傳輸延時,也就完成了主從時鐘節點間的同步。
為了保持主從時鐘節點間的精確同步,主時鐘節點周期性的發送Sync和follow_up報文,從時鐘節點接收的報文后,對報文處理并更新時間。同時從時鐘節點周期性的發送Delay_req報文,主時鐘節點記錄接收報文的時間戳,并將時間戳記錄在Delay_resp中并發給從時鐘節點,從時鐘節點接收到延時請求的響應報文,處理后重新計算網絡的傳輸延時。
注意上面的時間同步的原理成為兩步通信原理。如果直接將發送Sync報文的時間戳直接記錄在Sync報文中,此時不發送Follow_up報文,則實現的是一步通信原理。
IEEE1588協議規定在一個PTP同步系統中只能存在一個主時鐘,最佳主時鐘算法在多個潛在的主時鐘中決定哪一個會成為PTP同步系統的主時鐘節點。
最佳主算法[2]的步驟:
首先比較兩個時鐘節點的優先級,如果優先級相同則比較兩個時鐘節點的時鐘類型,如果時鐘類型相同則繼續比較兩個時鐘節點的時鐘精度,如果兩個時鐘的精度還相同,繼續比較兩個時鐘節點的時鐘穩定性,如果時鐘穩定性也相同,就比較兩個時鐘節點的時鐘ID,選擇兩個時鐘的ID數字較小者為最優主時鐘。這樣可以從兩個潛在主時鐘中選出一個最優的主時鐘,而且系統內所有時鐘的最佳主時鐘算法相同,同一個時鐘同步系統中每個時鐘計算得到的最佳主時鐘相同。最佳主時鐘算法的流程圖如圖3所示。

圖3 最佳主時鐘算法
通過上面的最佳主時鐘算法,可以從同步的控制系統中挑選出最佳的主時鐘。這樣系統中所有其他的從時鐘同步于系統中的當前的主時鐘。
1)PTP封裝的格式
PTP的報文可以在封裝在多種以太網[4]的報文中例如UDP/IP,UDP/IP6,IEEE802.3/Ethernet,DeviceNET等等。在本文中,將PTP封裝在以太網的幀中,使用了UDP/IP,其具體的封裝的格式如圖4所示。

圖4 PTP數據包的封裝
2)PTP數據包的頭部
所有的PTP數據包都包含一個頭部信息,其具體的封裝的格式如圖5所示。

圖5 PTP報文頭部
(1)傳輸協議(半字節):如果PTP協議建立在UDP/IPv4協議的基礎上,則此處值為0x01。
(2)報文類型(半字節):用整數表示報文的類型,0表示Sync報文,1表示Delay_req報文,4~7是保留,8表示Follow_up報文,9表示Delay_resp報文,B表示Announce報文。
(3)PTP協議版本:IEEE1588v2版本報文,此值設置為2。
(4)報文長度:PTP報文中的所有字節數包括PTP報文中的頭部。字節數從報文的頭部到PTP報文結尾。
(5)域號:指定報文所處的域號。
(6)報文標志域:標志域中每一個二進制位表示報文的一種屬性。主要指示出報文是單播通訊還是兩步通訊。本文實現的是兩步通訊。
(7)修正域:修正域中的值由透明時鐘指定。指示了報文在透明時鐘中的駐留時間。在本次實現中沒有用到。
(8)發送報文時鐘ID:包含時鐘ID和端口號。
(9)報文序列號:指定報文發送的序號,由上面同步的基本原理的講解可知,Follow_up報文序號與Sync報文序號相同,Delay_resp報文序號與Delay_req報文序號相同。
(10)控制域:控制域指明PTP報文是哪種報文,0x00表示Sync報文,0x01表示Delay_req報文,0x02表示Follow_up報文,0x03表示的是Delay_resp報文。
(11)報文發送時間間隔:表示相應報文發出的時間間隔,可以表示Announce,Sync等報文的發送時間間隔。
3)Announce報文
Announce報文主要用于確定時鐘同步系統中的最佳主時鐘。當系統上電后潛在的主時鐘節點發送Announce報文,其他的節點(包括此時潛在的主時鐘本身)接收到Announce報文后,運行最佳主時鐘算法從時鐘同步系統挑選出最佳主時鐘。Announce報文的格式如圖6所示,各字節解釋如下:
(1)時間戳:該值設置為0或者本地時鐘的估計值,誤差在±1s,本文的實現沒有使用該時間戳,直接置為0。
(2)UTC時鐘偏移量:該值表示PTP標準時鐘相對于UTC(協調世界時)的偏移量,該值是一個量,設置為33。

圖6 Announce報文格式
(3)超主時鐘優先級1和超主時鐘優先級2:主時鐘的優先級1和主時鐘優先級2的級別。
(4)超主時鐘時鐘性能:主時鐘的時鐘性能包括時鐘類型,時鐘精度等。
(5)超主時鐘ID:主時鐘的時鐘標識號。
(6)超主時鐘通信級數:本地時鐘距離主時鐘的傳輸路徑的距離,該值越小表示本地時鐘距離超主時鐘越近。默認的情況下設置為零。
(7)時鐘源:表示超主時鐘的時鐘源。時鐘源包括原子時,GPS時鐘,陸地無線電,PTP時鐘源,NTP時鐘源,其他時鐘源或者內部振蕩器時鐘源。默認的情況下是內部振蕩器時鐘源。
4)Sync和Delay_req報文
Sync和Delay_req報文的封裝格式相同,只是標識位的設置不同,其報文封裝如圖7所示。

圖7 Sync和Delay_req報文格式
起始時間戳:記錄報文攜帶的時間戳。
5)Follow_up報文
Follow_up報文的封裝格式如圖8所示。

圖8 Follow_up報文格式
精確起始時間戳:記錄的是發送Sync的精確的起始時間戳。
6)Delay_resp報文
Delay_resp報文是對Delay_req報文的回復,該報文是由主時鐘發送。報文的封裝的格式如圖9所示。

圖9 Delay_resp報文格式
(1)接收時間戳:主時鐘接收到Delay_req報文的時間時間戳。
(2)請求端口號:Delay_req報文發送的從時鐘的端口號。
由于主時鐘節點和從時鐘節點時鐘頻率的不一致性,以及從時鐘的外部晶振源的頻率隨著周圍溫度和濕度的變化而發生漂移。基于以上的原因,本文中加入了從時鐘的時鐘頻率的調整算法,來補償頻率的變化。由于本文的實現是基于stm32系列的arm芯片,其提供的寄存器完成精密校準方法更新系統時間方框圖如圖10所示。
圖中加數寄存器的值與常數值是直接相關的。在每一個系統時鐘周期中加數寄存器中的值累加到累加器寄存器中。當累加器寄存器中值溢出時,將常數值加到亞秒寄存器中。當亞秒寄存器中的值超過109時,秒寄存器中的值加1。這樣就可以很精確地控制系統的時間。累加器寄存器和亞秒寄存器是兩個32位的寄存器,由上面的寄存器聯動,我們可以將上述兩寄存器看做一個64位的寄存器,則stm32的系統時鐘頻率,寄存器位數,加數寄存器和常數值間的關系如下


圖10 精密校準更新系統的時間
其中add表示加數寄存器的值,Increment是亞秒寄存器遞增常數值,SysClk是系統時鐘。ptp時鐘周期和亞秒寄存器遞增的常數值間的關系如下

其中 ptptick是ptp時鐘周期,Increment是亞秒寄存器遞增常數值。
由式(3)和式(4)可知,當ptp時鐘周期是20ns,并且系統時鐘頻率SysClk=168MHz,此時Increment為43,加數寄存器add值為0x4C19EF00。
為了對從時鐘的頻率進行精密的校準,軟件必須使用主時鐘發送的Sync報文對從時鐘頻率偏移進行計算,并更新加數寄存器以來調整從時鐘時鐘頻率。實現該算法的步驟如下
1)使用0x4C19EF00初始化加數寄存器,并使用43初始化亞秒遞增寄存器的常數值。分別記為FCV0和Inc0。
2)主時鐘第n次發送Sync報文到從時鐘的時間戳記為Mst(n)(master sync time)。從時鐘在其本地時鐘在Sct(n)(slave clock time)時刻接收到該同步報文,使用如下公式計算Mct(n)(master clock time):

其中Mtsd(n)表示是主時鐘到從時鐘網絡延時(master to slave delay)。
3)當前同步周期的主時鐘計數Mcc(n)(master clock count)的計算公式如下其中主時鐘到從時鐘網路延時在n時刻與n-1時刻認為相等的。

4)當前同步周期的從時鐘計數Scc(n)(slave clock count)的計算公式如下

5)當前同步周期的主從時鐘差值Cdc(n)(clock Differentcount)的計算公式:

6)從時鐘的分頻系數Fc(fn)(Freq Scale Factor)的計算公式如下:

7)加數寄存器的頻率補償值 Fcv(n)(Freq Compensation Value)的計算公式如下:

上述的算法可以在一個同步周期內對時鐘頻率補償值進行修正,但是由于網絡傳輸的影響可能需要多個周期來對頻率補償值進行修正。
主時鐘選擇的是本地的主機,在該主機上實現的ptp的主時鐘。所用的軟件是linuxptp。這樣上位機和自己開發的嵌入式的開發板之間就可以構成ptp的主從時鐘。測試所用到的網絡結構如圖11所示。

圖11 測試網絡結構
在本文中,實現了以stm32f407為微控制器核心的嵌入式操作系統。為了使后期編程的方便,在stm32f407中移植了嵌入式操作系統。由于通訊需求,需要在stm32f407上移植TCP/IP協議棧。為了移植簡便,本文選擇的嵌入式TCP/IP協議棧是Lw IP(輕型IP協議棧)。主要實驗選定的PHY是dp83848。雖然該PHY不支持IEEE1588的硬件時間戳,但是由于為了使實現的ptp更加的通用,捕獲時間戳的位置有原來的物理層提升到數據鏈層,如圖12所示。

圖12 本實驗中時間戳捕獲的位置
在數據鏈路層捕獲PTP時間戳使PTP精度有一定的下降,但是由于去掉了物理層的硬件特殊要求并且該時鐘精度也可以滿足大部分的應用的場合,所以實驗中實現的在數據鏈路層捕獲時間戳。在Lw IP移植的過程中,主要完成對PHY驅動配置函數編寫,Lw IP的底層接收和發送的函數,Lw IP初始函數等。除了上述函數外,為了使Lw IP協議棧與嵌入式操作系統匹配,需要編寫操作系統與Lw IP協議棧之間的接口函數即操作系統的模擬層。這些函數實現的功能是線程的創建函數,信號量創建、釋放、等待和釋放信號量內存函數,互斥信號量的創建、鎖定、解鎖和釋放互斥信號量內存函數,消息郵箱的創建、釋放、等待和消息郵箱內存釋放函數。
完成上面的函數后,可以在上位機即PC機ping嵌入式的開發板,可以檢測上位機與開發板間的連接是否正常。測試的命令:
ping 192.168.1.16-i0.001
其中ping是網絡測試的命令,192.168.1.16是嵌入式開發板的ip地址,-i0.001表示發送ICMP報文的時間間隔。測試的結果如表1所示。
其中min是rtt最小值,avg是rtt的均值,max是rtt的最大值,mdev是rtt的標準差該值越小表示網絡越穩定。測試中一共發送了1645個數據包,測試的過程中沒有丟失數據包。
在上面移植的基礎上,本文對Lw IP中的pbuf數據接收進行了修改加入表示時間的兩個32位int類型的數據,用于存儲接收和發送以太網數據的本地時間戳,具體結構如下
structpbuf{
……
#ifdef LWIP_PTP
int time_sec;
int time_nsec;
#endif
};
其中time_sec用于存儲秒數,time_nsec用于存儲納秒數。定義上面的與ptp有關的數據結構,實現相關的函數。
綜上所述從時鐘節點的軟件框架如圖13所示。

圖13 從時鐘節點軟件架構
在上位機的命令窗口中敲入相應的命令行:
ptp4l-ienp8s0-m-S
其中enp8s0是主機的網口的名字,-m表示打印相關的信息-S表示使用的軟件時間戳。
測試的到的數據結果如圖14所示:

圖14 同步時間測試的圖形
由上圖的可知,主從時鐘間的偏差在2us內,這是滿足設計的要求。將上述收集到的數據制成表格的形式如表2所示。

表2 時鐘同步時間偏移(單位:ns)
本實驗中一共采集了515組數據,每組數據間的時間間隔為1s,即一共采集數據的時間為515s。計算采集到數據的均值是-53和標準差為489.617,可知實驗中的時間同步可以滿足實際的需求,同步的時間偏差絕大部分處于±500ns內。
由于實驗中采用了精密的從時鐘的頻率的校準,可以進一步地提高時鐘同步的精度,可以有效地抑制由溫度,濕度等造成的頻率的漂移。
使用wireshark對網卡的數據包進行抓取,可以得到網絡中的主要是Sync報文和Follow_up報文,主時鐘發送這兩種報文的周期是1s,并且每隔一段固定的時間從時鐘將發送Delay_req報文,主時鐘節點對該報文進行回復。由此算出主從時鐘節點間網絡傳輸的延時。
在多模塊的測試中,從時鐘采用了相同的硬件和軟件的設計,只是多個模塊的IP地址不同,得到了相同的實驗結果,實驗驗證了在同一局域網中多模塊的精密的時鐘同步。
本文提出了一種基于軟件時間戳的ptp(精密時間協議)的實現。在沒有硬件的支持的硬件時間戳的支持下,也可以實現主從時鐘節點間的高精度的時間同步。實驗中主從時鐘節點間的同步偏移量在2μs內即精度在2μs內,并且主從時鐘節點間時鐘同步所需要的時間是半分鐘左右,而NTP時鐘精度雖然可以在幾次報文交互中達到秒級,但是需要較長的時間才能將同步的精度達到1ms。NTP時鐘同步時間過長不滿足工業現場的使用,并且時鐘精度只能達到1ms,這也不滿足工業現場的要求。
[1]Aavikko P.Network Time Protocol[J].2010.
[2]Eidson J,Kang L.IEEE Standard for a Precision Clock Synchronization Protocol for Networked Measu-rement and ControlSystems[J].2008,11(2):1-269.
[3]譚超,蘇超,胡詩俊,等.基于IEEE-1588的高精度時鐘同步系統設計[J].電子器件,2016,39(5):1103-1107.TANChao,SUChao,HU Shijun,etal.Design ofHigh Precision Clock Synchronization System Based on IEEE-1588[J].Electronic Devices,2016,39(5):1103-1107.
[4]W.R.Stevens,范建華.TCP/IP詳解卷1:協議[M].北京:機械工業出版社,2000.107-141.W.R.Stevens,Fan Jianhua.TCP/IP Detailed Explanations Volume 1:Protocol[M].Beijing:Mechanical Industry Press,2000.107-141
[5]鄒崎.IEEE1588協議分析與實現研究[D].武漢:華中科技大學,2009.ZOU Qi.Study on IEEE1588 protocol analysis and implementation[D].Wuhan:Huazhong University of Science and Technology,2009.
[6]譚敏禛.基于IEEE1588協議的時間服務器授時精度研究[D].南京:南京大學,2012.Tan Minzhen.Research on Timing Accuracy of Time Server Based on IEEE1588 Protocol[D].Nanjing:Nanjing University,2012
[7]唐雪松.基于STM32F407的IEEE1588從時鐘設計與實現[D].大連:大連理工大學,2014.TANG Xuesong.Design and Realization of IEEE1588 Slave Clock Based on STM32F407[D].Dalian:Dalian University of Technology,2014.
[8]王飛雪,王平,謝昊飛.IEEE1588時間同步協議在Linux下的分析與實現[J].微計算機信息,2006(34):283-285.WANGFeixue,WANGPing,XIEHaofei.Analysisand implementation of IEEE1588 time synchronization protocol in Linux[J].Microcomputer Information,2006(34):283-285.
[9]張文麗.基于IEEE1588的通信設備時間同步系統設計[D].成都:成都理工大學,2010.ZHANG Wenli.Design of Time Synchronization System for Communication Equipment Based on IEEE 1588[D].Chengdu:Chengdu University of Technology,2010.