張端陽(yáng) 肖 力 付忠敏
(華中科技大學(xué)自動(dòng)化學(xué)院 武漢 430074)
工業(yè)現(xiàn)場(chǎng)的數(shù)據(jù)采集變得越來(lái)越模塊化,但當(dāng)需要測(cè)量多個(gè)外部的數(shù)據(jù)時(shí),可能需要多個(gè)模塊。將這些由傳感器采集的數(shù)據(jù)通過(guò)網(wǎng)絡(luò)上傳的時(shí)候,由于沒(méi)有時(shí)間信息,遠(yuǎn)程上位機(jī)不能很好將采集數(shù)據(jù)融合處理,一般只能獨(dú)立的對(duì)采集上來(lái)的數(shù)據(jù)處理。為了實(shí)現(xiàn)對(duì)采集數(shù)據(jù)的時(shí)鐘同步,需要對(duì)數(shù)據(jù)采集模塊間進(jìn)行時(shí)鐘同步。
當(dāng)前幾種比較流行的時(shí)間同步協(xié)議有NTP(Network Time Protocol)[1]和 PTP(Precision Time Protocol)[2],兩者的原理類(lèi)似,都是實(shí)現(xiàn)主時(shí)鐘節(jié)點(diǎn)和從時(shí)鐘節(jié)點(diǎn)間的時(shí)間同步,其中PTP協(xié)議是網(wǎng)絡(luò)測(cè)量和控制系統(tǒng)時(shí)鐘同步協(xié)議(IEEE1588協(xié)議)的簡(jiǎn)稱(chēng),具體的差異如圖1所示。從圖中可以看出,NTP和PTP時(shí)間戳的截取的位置不同。NTP獲取的時(shí)間戳的位置是應(yīng)用層,而PTP時(shí)間戳的截取的位置是在物理層。正是由于獲取時(shí)間戳的位置不同,這樣PTP可以有效地去除運(yùn)行操作系統(tǒng)和TCP/IP協(xié)議棧時(shí)間抖動(dòng)對(duì)時(shí)鐘同步的影響。但是由于PTP獲取時(shí)間戳位置的在物理層,所以需要特殊的硬件支持,即在具體的應(yīng)用中硬件需要支持PTP,這個(gè)實(shí)際的硬件設(shè)計(jì)帶來(lái)了一定的成本,但是NTP不需要硬件支持。獲取時(shí)間戳的位置的差異促使PTP的同步時(shí)鐘精度是NTP同步時(shí)鐘精度的10000倍。PTP的同步時(shí)鐘精度是亞微秒級(jí)(100ns)。在該精度下可以滿(mǎn)足大多數(shù)時(shí)間同步的精度要求,比如PTP可用于高速鐵路地震預(yù)警系統(tǒng)采集設(shè)備[3]。
圖1 時(shí)間戳截取的位置
由于上述的對(duì)硬件特殊要求[4~9],這使 PTP 的實(shí)用性遠(yuǎn)沒(méi)有NTP簡(jiǎn)單。為了實(shí)現(xiàn)高精度的同步并且去掉對(duì)硬件時(shí)間戳的依賴(lài),由圖1可知捕獲時(shí)間戳的位置越接近物理層時(shí)間精度越高,故本文實(shí)現(xiàn)在數(shù)據(jù)鏈路層上捕獲時(shí)間戳。這樣既可以去掉對(duì)硬件時(shí)間戳的依賴(lài)同時(shí)提高時(shí)鐘同步精度。
PTP時(shí)鐘同步的基本原理是通過(guò)消息傳遞機(jī)制使控制網(wǎng)絡(luò)中的時(shí)鐘節(jié)點(diǎn)與最精確的時(shí)鐘節(jié)點(diǎn)間保持同步。最精確的時(shí)鐘節(jié)點(diǎn)被稱(chēng)為主時(shí)鐘,其它的時(shí)鐘節(jié)點(diǎn)被稱(chēng)為從時(shí)鐘。當(dāng)有時(shí)鐘加入到控制網(wǎng)絡(luò)中,該時(shí)鐘節(jié)點(diǎn)通過(guò)最佳主時(shí)鐘算法確定該控制網(wǎng)絡(luò)中主時(shí)鐘,進(jìn)而使用PTP協(xié)議中的相關(guān)算法與該主時(shí)鐘同步。
PTP時(shí)鐘同步的基本原理如圖2所示,其基本實(shí)現(xiàn)可以分為下面基本步驟:
第一步,主時(shí)鐘首先廣播一個(gè)Sync(同步)報(bào)文,此時(shí)從時(shí)鐘記錄接收到的Sync報(bào)文的本地時(shí)間戳t2。
第二步,緊接第一步主時(shí)鐘發(fā)送一個(gè)follow_up(跟進(jìn))報(bào)文,此報(bào)文記錄的Sync報(bào)文發(fā)送時(shí)主時(shí)鐘的時(shí)間戳t1。當(dāng)從時(shí)鐘接收f(shuō)ollow_up報(bào)文時(shí),從時(shí)鐘記錄此時(shí)的報(bào)文中的時(shí)間戳t1。
第三步,從時(shí)鐘發(fā)送一個(gè)Delay_req(延時(shí)請(qǐng)求)報(bào)文,并記錄下此時(shí)的本地發(fā)送時(shí)間戳t3。
第四步,主時(shí)鐘接收到Delay_req報(bào)文時(shí),記錄此時(shí)接收到的主時(shí)鐘本身的時(shí)間戳t4,然后主時(shí)鐘發(fā)送一個(gè)Delay_resp(延時(shí)響應(yīng))報(bào)文,該報(bào)文記錄時(shí)間戳t4。當(dāng)從時(shí)鐘接收到Delay_resp報(bào)文時(shí),從中提取時(shí)間戳t4。
圖2 PTP時(shí)鐘同步的基本原理
經(jīng)過(guò)上面的四步后,從時(shí)鐘擁有了時(shí)間戳t1,t2,t3和t4。通過(guò)上面的四個(gè)時(shí)間戳我們可以計(jì)算出此時(shí)報(bào)文的網(wǎng)絡(luò)傳輸延時(shí)時(shí)間和從時(shí)鐘相對(duì)于主時(shí)鐘的時(shí)偏移量。這樣完成了主從時(shí)鐘節(jié)點(diǎn)間的同步。
主從時(shí)鐘間網(wǎng)路延時(shí)計(jì)算:
式(1)成立的條件是報(bào)文在主從時(shí)鐘節(jié)點(diǎn)間傳輸延時(shí)的時(shí)間是相等的,同一局域網(wǎng)或者子網(wǎng)中上面的假設(shè)是成立的。當(dāng)計(jì)算出上面的時(shí)鐘偏移量和主從時(shí)鐘節(jié)點(diǎn)間的網(wǎng)絡(luò)傳輸延時(shí),也就完成了主從時(shí)鐘節(jié)點(diǎn)間的同步。
為了保持主從時(shí)鐘節(jié)點(diǎn)間的精確同步,主時(shí)鐘節(jié)點(diǎn)周期性的發(fā)送Sync和follow_up報(bào)文,從時(shí)鐘節(jié)點(diǎn)接收的報(bào)文后,對(duì)報(bào)文處理并更新時(shí)間。同時(shí)從時(shí)鐘節(jié)點(diǎn)周期性的發(fā)送Delay_req報(bào)文,主時(shí)鐘節(jié)點(diǎn)記錄接收?qǐng)?bào)文的時(shí)間戳,并將時(shí)間戳記錄在Delay_resp中并發(fā)給從時(shí)鐘節(jié)點(diǎn),從時(shí)鐘節(jié)點(diǎn)接收到延時(shí)請(qǐng)求的響應(yīng)報(bào)文,處理后重新計(jì)算網(wǎng)絡(luò)的傳輸延時(shí)。
注意上面的時(shí)間同步的原理成為兩步通信原理。如果直接將發(fā)送Sync報(bào)文的時(shí)間戳直接記錄在Sync報(bào)文中,此時(shí)不發(fā)送Follow_up報(bào)文,則實(shí)現(xiàn)的是一步通信原理。
IEEE1588協(xié)議規(guī)定在一個(gè)PTP同步系統(tǒng)中只能存在一個(gè)主時(shí)鐘,最佳主時(shí)鐘算法在多個(gè)潛在的主時(shí)鐘中決定哪一個(gè)會(huì)成為PTP同步系統(tǒng)的主時(shí)鐘節(jié)點(diǎn)。
最佳主算法[2]的步驟:
首先比較兩個(gè)時(shí)鐘節(jié)點(diǎn)的優(yōu)先級(jí),如果優(yōu)先級(jí)相同則比較兩個(gè)時(shí)鐘節(jié)點(diǎn)的時(shí)鐘類(lèi)型,如果時(shí)鐘類(lèi)型相同則繼續(xù)比較兩個(gè)時(shí)鐘節(jié)點(diǎn)的時(shí)鐘精度,如果兩個(gè)時(shí)鐘的精度還相同,繼續(xù)比較兩個(gè)時(shí)鐘節(jié)點(diǎn)的時(shí)鐘穩(wěn)定性,如果時(shí)鐘穩(wěn)定性也相同,就比較兩個(gè)時(shí)鐘節(jié)點(diǎn)的時(shí)鐘ID,選擇兩個(gè)時(shí)鐘的ID數(shù)字較小者為最優(yōu)主時(shí)鐘。這樣可以從兩個(gè)潛在主時(shí)鐘中選出一個(gè)最優(yōu)的主時(shí)鐘,而且系統(tǒng)內(nèi)所有時(shí)鐘的最佳主時(shí)鐘算法相同,同一個(gè)時(shí)鐘同步系統(tǒng)中每個(gè)時(shí)鐘計(jì)算得到的最佳主時(shí)鐘相同。最佳主時(shí)鐘算法的流程圖如圖3所示。
圖3 最佳主時(shí)鐘算法
通過(guò)上面的最佳主時(shí)鐘算法,可以從同步的控制系統(tǒng)中挑選出最佳的主時(shí)鐘。這樣系統(tǒng)中所有其他的從時(shí)鐘同步于系統(tǒng)中的當(dāng)前的主時(shí)鐘。
1)PTP封裝的格式
PTP的報(bào)文可以在封裝在多種以太網(wǎng)[4]的報(bào)文中例如UDP/IP,UDP/IP6,IEEE802.3/Ethernet,DeviceNET等等。在本文中,將PTP封裝在以太網(wǎng)的幀中,使用了UDP/IP,其具體的封裝的格式如圖4所示。
圖4 PTP數(shù)據(jù)包的封裝
2)PTP數(shù)據(jù)包的頭部
所有的PTP數(shù)據(jù)包都包含一個(gè)頭部信息,其具體的封裝的格式如圖5所示。
圖5 PTP報(bào)文頭部
(1)傳輸協(xié)議(半字節(jié)):如果PTP協(xié)議建立在UDP/IPv4協(xié)議的基礎(chǔ)上,則此處值為0x01。
(2)報(bào)文類(lèi)型(半字節(jié)):用整數(shù)表示報(bào)文的類(lèi)型,0表示Sync報(bào)文,1表示Delay_req報(bào)文,4~7是保留,8表示Follow_up報(bào)文,9表示Delay_resp報(bào)文,B表示Announce報(bào)文。
(3)PTP協(xié)議版本:IEEE1588v2版本報(bào)文,此值設(shè)置為2。
(4)報(bào)文長(zhǎng)度:PTP報(bào)文中的所有字節(jié)數(shù)包括PTP報(bào)文中的頭部。字節(jié)數(shù)從報(bào)文的頭部到PTP報(bào)文結(jié)尾。
(5)域號(hào):指定報(bào)文所處的域號(hào)。
(6)報(bào)文標(biāo)志域:標(biāo)志域中每一個(gè)二進(jìn)制位表示報(bào)文的一種屬性。主要指示出報(bào)文是單播通訊還是兩步通訊。本文實(shí)現(xiàn)的是兩步通訊。
(7)修正域:修正域中的值由透明時(shí)鐘指定。指示了報(bào)文在透明時(shí)鐘中的駐留時(shí)間。在本次實(shí)現(xiàn)中沒(méi)有用到。
(8)發(fā)送報(bào)文時(shí)鐘ID:包含時(shí)鐘ID和端口號(hào)。
(9)報(bào)文序列號(hào):指定報(bào)文發(fā)送的序號(hào),由上面同步的基本原理的講解可知,F(xiàn)ollow_up報(bào)文序號(hào)與Sync報(bào)文序號(hào)相同,Delay_resp報(bào)文序號(hào)與Delay_req報(bào)文序號(hào)相同。
(10)控制域:控制域指明PTP報(bào)文是哪種報(bào)文,0x00表示Sync報(bào)文,0x01表示Delay_req報(bào)文,0x02表示Follow_up報(bào)文,0x03表示的是Delay_resp報(bào)文。
(11)報(bào)文發(fā)送時(shí)間間隔:表示相應(yīng)報(bào)文發(fā)出的時(shí)間間隔,可以表示Announce,Sync等報(bào)文的發(fā)送時(shí)間間隔。
3)Announce報(bào)文
Announce報(bào)文主要用于確定時(shí)鐘同步系統(tǒng)中的最佳主時(shí)鐘。當(dāng)系統(tǒng)上電后潛在的主時(shí)鐘節(jié)點(diǎn)發(fā)送Announce報(bào)文,其他的節(jié)點(diǎn)(包括此時(shí)潛在的主時(shí)鐘本身)接收到Announce報(bào)文后,運(yùn)行最佳主時(shí)鐘算法從時(shí)鐘同步系統(tǒng)挑選出最佳主時(shí)鐘。Announce報(bào)文的格式如圖6所示,各字節(jié)解釋如下:
(1)時(shí)間戳:該值設(shè)置為0或者本地時(shí)鐘的估計(jì)值,誤差在±1s,本文的實(shí)現(xiàn)沒(méi)有使用該時(shí)間戳,直接置為0。
(2)UTC時(shí)鐘偏移量:該值表示PTP標(biāo)準(zhǔn)時(shí)鐘相對(duì)于UTC(協(xié)調(diào)世界時(shí))的偏移量,該值是一個(gè)量,設(shè)置為33。
圖6 Announce報(bào)文格式
(3)超主時(shí)鐘優(yōu)先級(jí)1和超主時(shí)鐘優(yōu)先級(jí)2:主時(shí)鐘的優(yōu)先級(jí)1和主時(shí)鐘優(yōu)先級(jí)2的級(jí)別。
(4)超主時(shí)鐘時(shí)鐘性能:主時(shí)鐘的時(shí)鐘性能包括時(shí)鐘類(lèi)型,時(shí)鐘精度等。
(5)超主時(shí)鐘ID:主時(shí)鐘的時(shí)鐘標(biāo)識(shí)號(hào)。
(6)超主時(shí)鐘通信級(jí)數(shù):本地時(shí)鐘距離主時(shí)鐘的傳輸路徑的距離,該值越小表示本地時(shí)鐘距離超主時(shí)鐘越近。默認(rèn)的情況下設(shè)置為零。
(7)時(shí)鐘源:表示超主時(shí)鐘的時(shí)鐘源。時(shí)鐘源包括原子時(shí),GPS時(shí)鐘,陸地?zé)o線(xiàn)電,PTP時(shí)鐘源,NTP時(shí)鐘源,其他時(shí)鐘源或者內(nèi)部振蕩器時(shí)鐘源。默認(rèn)的情況下是內(nèi)部振蕩器時(shí)鐘源。
4)Sync和Delay_req報(bào)文
Sync和Delay_req報(bào)文的封裝格式相同,只是標(biāo)識(shí)位的設(shè)置不同,其報(bào)文封裝如圖7所示。
圖7 Sync和Delay_req報(bào)文格式
起始時(shí)間戳:記錄報(bào)文攜帶的時(shí)間戳。
5)Follow_up報(bào)文
Follow_up報(bào)文的封裝格式如圖8所示。
圖8 Follow_up報(bào)文格式
精確起始時(shí)間戳:記錄的是發(fā)送Sync的精確的起始時(shí)間戳。
6)Delay_resp報(bào)文
Delay_resp報(bào)文是對(duì)Delay_req報(bào)文的回復(fù),該報(bào)文是由主時(shí)鐘發(fā)送。報(bào)文的封裝的格式如圖9所示。
圖9 Delay_resp報(bào)文格式
(1)接收時(shí)間戳:主時(shí)鐘接收到Delay_req報(bào)文的時(shí)間時(shí)間戳。
(2)請(qǐng)求端口號(hào):Delay_req報(bào)文發(fā)送的從時(shí)鐘的端口號(hào)。
由于主時(shí)鐘節(jié)點(diǎn)和從時(shí)鐘節(jié)點(diǎn)時(shí)鐘頻率的不一致性,以及從時(shí)鐘的外部晶振源的頻率隨著周?chē)鷾囟群蜐穸鹊淖兓l(fā)生漂移?;谝陨系脑?,本文中加入了從時(shí)鐘的時(shí)鐘頻率的調(diào)整算法,來(lái)補(bǔ)償頻率的變化。由于本文的實(shí)現(xiàn)是基于stm32系列的arm芯片,其提供的寄存器完成精密校準(zhǔn)方法更新系統(tǒng)時(shí)間方框圖如圖10所示。
圖中加數(shù)寄存器的值與常數(shù)值是直接相關(guān)的。在每一個(gè)系統(tǒng)時(shí)鐘周期中加數(shù)寄存器中的值累加到累加器寄存器中。當(dāng)累加器寄存器中值溢出時(shí),將常數(shù)值加到亞秒寄存器中。當(dāng)亞秒寄存器中的值超過(guò)109時(shí),秒寄存器中的值加1。這樣就可以很精確地控制系統(tǒng)的時(shí)間。累加器寄存器和亞秒寄存器是兩個(gè)32位的寄存器,由上面的寄存器聯(lián)動(dòng),我們可以將上述兩寄存器看做一個(gè)64位的寄存器,則stm32的系統(tǒng)時(shí)鐘頻率,寄存器位數(shù),加數(shù)寄存器和常數(shù)值間的關(guān)系如下
圖10 精密校準(zhǔn)更新系統(tǒng)的時(shí)間
其中add表示加數(shù)寄存器的值,Increment是亞秒寄存器遞增常數(shù)值,SysClk是系統(tǒng)時(shí)鐘。ptp時(shí)鐘周期和亞秒寄存器遞增的常數(shù)值間的關(guān)系如下
其中 ptptick是ptp時(shí)鐘周期,Increment是亞秒寄存器遞增常數(shù)值。
由式(3)和式(4)可知,當(dāng)ptp時(shí)鐘周期是20ns,并且系統(tǒng)時(shí)鐘頻率SysClk=168MHz,此時(shí)Increment為43,加數(shù)寄存器add值為0x4C19EF00。
為了對(duì)從時(shí)鐘的頻率進(jìn)行精密的校準(zhǔn),軟件必須使用主時(shí)鐘發(fā)送的Sync報(bào)文對(duì)從時(shí)鐘頻率偏移進(jìn)行計(jì)算,并更新加數(shù)寄存器以來(lái)調(diào)整從時(shí)鐘時(shí)鐘頻率。實(shí)現(xiàn)該算法的步驟如下
1)使用0x4C19EF00初始化加數(shù)寄存器,并使用43初始化亞秒遞增寄存器的常數(shù)值。分別記為FCV0和Inc0。
2)主時(shí)鐘第n次發(fā)送Sync報(bào)文到從時(shí)鐘的時(shí)間戳記為Mst(n)(master sync time)。從時(shí)鐘在其本地時(shí)鐘在Sct(n)(slave clock time)時(shí)刻接收到該同步報(bào)文,使用如下公式計(jì)算Mct(n)(master clock time):
其中Mtsd(n)表示是主時(shí)鐘到從時(shí)鐘網(wǎng)絡(luò)延時(shí)(master to slave delay)。
3)當(dāng)前同步周期的主時(shí)鐘計(jì)數(shù)Mcc(n)(master clock count)的計(jì)算公式如下其中主時(shí)鐘到從時(shí)鐘網(wǎng)路延時(shí)在n時(shí)刻與n-1時(shí)刻認(rèn)為相等的。
4)當(dāng)前同步周期的從時(shí)鐘計(jì)數(shù)Scc(n)(slave clock count)的計(jì)算公式如下
5)當(dāng)前同步周期的主從時(shí)鐘差值Cdc(n)(clock Differentcount)的計(jì)算公式:
6)從時(shí)鐘的分頻系數(shù)Fc(fn)(Freq Scale Factor)的計(jì)算公式如下:
7)加數(shù)寄存器的頻率補(bǔ)償值 Fcv(n)(Freq Compensation Value)的計(jì)算公式如下:
上述的算法可以在一個(gè)同步周期內(nèi)對(duì)時(shí)鐘頻率補(bǔ)償值進(jìn)行修正,但是由于網(wǎng)絡(luò)傳輸?shù)挠绊懣赡苄枰鄠€(gè)周期來(lái)對(duì)頻率補(bǔ)償值進(jìn)行修正。
主時(shí)鐘選擇的是本地的主機(jī),在該主機(jī)上實(shí)現(xiàn)的ptp的主時(shí)鐘。所用的軟件是linuxptp。這樣上位機(jī)和自己開(kāi)發(fā)的嵌入式的開(kāi)發(fā)板之間就可以構(gòu)成ptp的主從時(shí)鐘。測(cè)試所用到的網(wǎng)絡(luò)結(jié)構(gòu)如圖11所示。
圖11 測(cè)試網(wǎng)絡(luò)結(jié)構(gòu)
在本文中,實(shí)現(xiàn)了以stm32f407為微控制器核心的嵌入式操作系統(tǒng)。為了使后期編程的方便,在stm32f407中移植了嵌入式操作系統(tǒng)。由于通訊需求,需要在stm32f407上移植TCP/IP協(xié)議棧。為了移植簡(jiǎn)便,本文選擇的嵌入式TCP/IP協(xié)議棧是Lw IP(輕型IP協(xié)議棧)。主要實(shí)驗(yàn)選定的PHY是dp83848。雖然該P(yáng)HY不支持IEEE1588的硬件時(shí)間戳,但是由于為了使實(shí)現(xiàn)的ptp更加的通用,捕獲時(shí)間戳的位置有原來(lái)的物理層提升到數(shù)據(jù)鏈層,如圖12所示。
圖12 本實(shí)驗(yàn)中時(shí)間戳捕獲的位置
在數(shù)據(jù)鏈路層捕獲PTP時(shí)間戳使PTP精度有一定的下降,但是由于去掉了物理層的硬件特殊要求并且該時(shí)鐘精度也可以滿(mǎn)足大部分的應(yīng)用的場(chǎng)合,所以實(shí)驗(yàn)中實(shí)現(xiàn)的在數(shù)據(jù)鏈路層捕獲時(shí)間戳。在Lw IP移植的過(guò)程中,主要完成對(duì)PHY驅(qū)動(dòng)配置函數(shù)編寫(xiě),Lw IP的底層接收和發(fā)送的函數(shù),Lw IP初始函數(shù)等。除了上述函數(shù)外,為了使Lw IP協(xié)議棧與嵌入式操作系統(tǒng)匹配,需要編寫(xiě)操作系統(tǒng)與Lw IP協(xié)議棧之間的接口函數(shù)即操作系統(tǒng)的模擬層。這些函數(shù)實(shí)現(xiàn)的功能是線(xiàn)程的創(chuàng)建函數(shù),信號(hào)量創(chuàng)建、釋放、等待和釋放信號(hào)量?jī)?nèi)存函數(shù),互斥信號(hào)量的創(chuàng)建、鎖定、解鎖和釋放互斥信號(hào)量?jī)?nèi)存函數(shù),消息郵箱的創(chuàng)建、釋放、等待和消息郵箱內(nèi)存釋放函數(shù)。
完成上面的函數(shù)后,可以在上位機(jī)即PC機(jī)ping嵌入式的開(kāi)發(fā)板,可以檢測(cè)上位機(jī)與開(kāi)發(fā)板間的連接是否正常。測(cè)試的命令:
ping 192.168.1.16-i0.001
其中ping是網(wǎng)絡(luò)測(cè)試的命令,192.168.1.16是嵌入式開(kāi)發(fā)板的ip地址,-i0.001表示發(fā)送ICMP報(bào)文的時(shí)間間隔。測(cè)試的結(jié)果如表1所示。
其中min是rtt最小值,avg是rtt的均值,max是rtt的最大值,mdev是rtt的標(biāo)準(zhǔn)差該值越小表示網(wǎng)絡(luò)越穩(wěn)定。測(cè)試中一共發(fā)送了1645個(gè)數(shù)據(jù)包,測(cè)試的過(guò)程中沒(méi)有丟失數(shù)據(jù)包。
在上面移植的基礎(chǔ)上,本文對(duì)Lw IP中的pbuf數(shù)據(jù)接收進(jìn)行了修改加入表示時(shí)間的兩個(gè)32位int類(lèi)型的數(shù)據(jù),用于存儲(chǔ)接收和發(fā)送以太網(wǎng)數(shù)據(jù)的本地時(shí)間戳,具體結(jié)構(gòu)如下
structpbuf{
……
#ifdef LWIP_PTP
int time_sec;
int time_nsec;
#endif
};
其中time_sec用于存儲(chǔ)秒數(shù),time_nsec用于存儲(chǔ)納秒數(shù)。定義上面的與ptp有關(guān)的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)相關(guān)的函數(shù)。
綜上所述從時(shí)鐘節(jié)點(diǎn)的軟件框架如圖13所示。
圖13 從時(shí)鐘節(jié)點(diǎn)軟件架構(gòu)
在上位機(jī)的命令窗口中敲入相應(yīng)的命令行:
ptp4l-ienp8s0-m-S
其中enp8s0是主機(jī)的網(wǎng)口的名字,-m表示打印相關(guān)的信息-S表示使用的軟件時(shí)間戳。
測(cè)試的到的數(shù)據(jù)結(jié)果如圖14所示:
圖14 同步時(shí)間測(cè)試的圖形
由上圖的可知,主從時(shí)鐘間的偏差在2us內(nèi),這是滿(mǎn)足設(shè)計(jì)的要求。將上述收集到的數(shù)據(jù)制成表格的形式如表2所示。
表2 時(shí)鐘同步時(shí)間偏移(單位:ns)
本實(shí)驗(yàn)中一共采集了515組數(shù)據(jù),每組數(shù)據(jù)間的時(shí)間間隔為1s,即一共采集數(shù)據(jù)的時(shí)間為515s。計(jì)算采集到數(shù)據(jù)的均值是-53和標(biāo)準(zhǔn)差為489.617,可知實(shí)驗(yàn)中的時(shí)間同步可以滿(mǎn)足實(shí)際的需求,同步的時(shí)間偏差絕大部分處于±500ns內(nèi)。
由于實(shí)驗(yàn)中采用了精密的從時(shí)鐘的頻率的校準(zhǔn),可以進(jìn)一步地提高時(shí)鐘同步的精度,可以有效地抑制由溫度,濕度等造成的頻率的漂移。
使用wireshark對(duì)網(wǎng)卡的數(shù)據(jù)包進(jìn)行抓取,可以得到網(wǎng)絡(luò)中的主要是Sync報(bào)文和Follow_up報(bào)文,主時(shí)鐘發(fā)送這兩種報(bào)文的周期是1s,并且每隔一段固定的時(shí)間從時(shí)鐘將發(fā)送Delay_req報(bào)文,主時(shí)鐘節(jié)點(diǎn)對(duì)該報(bào)文進(jìn)行回復(fù)。由此算出主從時(shí)鐘節(jié)點(diǎn)間網(wǎng)絡(luò)傳輸?shù)难訒r(shí)。
在多模塊的測(cè)試中,從時(shí)鐘采用了相同的硬件和軟件的設(shè)計(jì),只是多個(gè)模塊的IP地址不同,得到了相同的實(shí)驗(yàn)結(jié)果,實(shí)驗(yàn)驗(yàn)證了在同一局域網(wǎng)中多模塊的精密的時(shí)鐘同步。
本文提出了一種基于軟件時(shí)間戳的ptp(精密時(shí)間協(xié)議)的實(shí)現(xiàn)。在沒(méi)有硬件的支持的硬件時(shí)間戳的支持下,也可以實(shí)現(xiàn)主從時(shí)鐘節(jié)點(diǎn)間的高精度的時(shí)間同步。實(shí)驗(yàn)中主從時(shí)鐘節(jié)點(diǎn)間的同步偏移量在2μs內(nèi)即精度在2μs內(nèi),并且主從時(shí)鐘節(jié)點(diǎn)間時(shí)鐘同步所需要的時(shí)間是半分鐘左右,而NTP時(shí)鐘精度雖然可以在幾次報(bào)文交互中達(dá)到秒級(jí),但是需要較長(zhǎng)的時(shí)間才能將同步的精度達(dá)到1ms。NTP時(shí)鐘同步時(shí)間過(guò)長(zhǎng)不滿(mǎn)足工業(yè)現(xiàn)場(chǎng)的使用,并且時(shí)鐘精度只能達(dá)到1ms,這也不滿(mǎn)足工業(yè)現(xiàn)場(chǎng)的要求。
[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]譚超,蘇超,胡詩(shī)俊,等.基于IEEE-1588的高精度時(shí)鐘同步系統(tǒng)設(shè)計(jì)[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:協(xié)議[M].北京:機(jī)械工業(yè)出版社,2000.107-141.W.R.Stevens,F(xiàn)an Jianhua.TCP/IP Detailed Explanations Volume 1:Protocol[M].Beijing:Mechanical Industry Press,2000.107-141
[5]鄒崎.IEEE1588協(xié)議分析與實(shí)現(xiàn)研究[D].武漢:華中科技大學(xué),2009.ZOU Qi.Study on IEEE1588 protocol analysis and implementation[D].Wuhan:Huazhong University of Science and Technology,2009.
[6]譚敏禛.基于IEEE1588協(xié)議的時(shí)間服務(wù)器授時(shí)精度研究[D].南京:南京大學(xué),2012.Tan Minzhen.Research on Timing Accuracy of Time Server Based on IEEE1588 Protocol[D].Nanjing:Nanjing University,2012
[7]唐雪松.基于STM32F407的IEEE1588從時(shí)鐘設(shè)計(jì)與實(shí)現(xiàn)[D].大連:大連理工大學(xué),2014.TANG Xuesong.Design and Realization of IEEE1588 Slave Clock Based on STM32F407[D].Dalian:Dalian University of Technology,2014.
[8]王飛雪,王平,謝昊飛.IEEE1588時(shí)間同步協(xié)議在Linux下的分析與實(shí)現(xiàn)[J].微計(jì)算機(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的通信設(shè)備時(shí)間同步系統(tǒng)設(shè)計(jì)[D].成都:成都理工大學(xué),2010.ZHANG Wenli.Design of Time Synchronization System for Communication Equipment Based on IEEE 1588[D].Chengdu:Chengdu University of Technology,2010.