孫景樂 許元元



摘要:該文針對工業控制系統的數據特點,提出一種時間戳壓縮算法,僅使用參考時間和數據時間戳的秒和毫秒數值即可記錄完整的時間戳信息。該算法可以使工業控制系統中的時間戳數據壓縮為原來的四分之一。該時間戳壓縮算法有效減少網絡數據傳輸量,提升了工業控制系統的系統效率和容量。
關鍵詞:時間戳;壓縮;工業控制系統
中圖分類號:TP311? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)15-0063-00
1前言
在工業控制系統中,數據一般包含三個基本要素:數值、時間戳和質量碼。數據指傳感器采集的實際數值,例如溫度為300攝氏度,壓力為1.5兆帕;時間戳用來記錄采集數據的時刻,精度一般毫秒即可;質量碼用來表征數據的可信度。關于工業控制系統的數據壓縮的算法[1-2]比較多,但基本都是基于數值的。時間戳在數據的三要素中占用很大比例,如何在不丟失時間信息的前提下,減少時間戳的數據量是工業控制系統需要解決問題。
工業控制系統中數據采集都是周期性的,采集周期一般在秒或毫秒級別。采集頻率較高時,為了提高網絡數據傳輸效率,一般將多個采集周期的數據打包后傳輸到上層應用,傳輸周期一般在500毫秒以上。在一個傳輸周期內,數據包會包含多個采集周期的數據,但同一個數據包內的數據的時間戳差別僅體現在秒或毫秒級別上,其中“年月日時分”的數值都是相同的。如果有1萬個監測點,那么就有1萬次重復的“年月日時分”,這樣造成傳輸數據量增加,網絡負荷增加。本文提出一種簡化時間戳壓縮算法,可以極大減少時間戳的數據量,有效降低網絡通信的數據量,提高系統效率。
2時間戳壓縮算法
2.1簡化時間戳的定義
無論是Windows系統使用的FILETIME①結構,還是Linux平臺使用struct timeval②結構,都至少需要8個字節才能表示一個完整的時間戳[3-5]。對于重復的“年月日時分”部分,可以只保留一份,秒的最大數值為59,占用1個字節,毫秒的最大數值為999,需要2個字節,所以保留秒和毫秒信息仍然需要3個字節。本文提出的簡化時間戳僅需要2個字節即可表示一個數據時間戳的秒和毫秒的信息,且時間信息不丟失,可還原完整時間戳。使用簡化時間戳記錄數據時的基本步驟如下。
1)數據采集時只記錄采集時刻的秒和毫秒數值。
2)用總毫秒數表示秒和毫秒的數值,即總毫秒數=秒數值×1000+毫秒數值。
1分鐘有60秒,所以該數值最大值不超過6000,一個無符號16位整數的表示范圍為0~65535,所以使用無符號16位整數即可記錄該時間戳數值。無符號16位數僅占用2個字節(1字節包含8個比特位)。
3)數據包中包含一個完整的時間戳作為參考時間,一般采用數據打包的時刻。該時間戳作為參考時間,用于應用層面還原數據的完整時間戳。
下面給出使用簡化時間戳記錄數據時間戳的示例:
示例1:
假如數據1采集時刻為“2022-1-9 13:21:15.368”(數值和質量碼不在本文的討論范圍,僅考慮時間戳),數據1的采集時刻可以記為:15368毫秒(15秒×1000+368),占用2個字節。
數據2采集時刻為“2022-1-9 13:20:56.039”,則其簡化時間戳為56039秒。后續數據3、數據4都按照此方法記錄。
在“2022-1-9 13:21:16.368”時刻數據打包并通過網絡發送。那么打包時刻 “2022-1-9 13:21:16.368” 即可作為的參考時間(占8個字節)。
2.2 數據量降低效果分析
按照常規時間戳定義數據格式如表1所示。而采用簡化時間戳后的數據格式定義如表2所示。對比兩個表中的灰度背景的行可知,每個數據減少2個字節,但多出一個8字節(表1中斜體部分)。
常規時間戳表示方法需要8個字節,采用簡化時間戳僅需要2個字節,是常規時間戳的四分之一。一個采集數據點可節約6個字節。
在進行數據采集時,根據點的類型不同,數據采集周期也不同,開關量一般在50毫秒到500毫秒之間,模擬量一般在200毫秒到1秒之間。數據采集后并不是立刻發送,而是需要累積一段時間再發送到二層,這個周期稱為發送周期,發送周期一般為500毫秒到2秒。對于同一個采集點,一個發送周期的數據包中包含了多次的采集數據。對于大型工業控制系統,數據采集點可達10萬個,那么一個數據包可包含大約40萬個采集數據。1萬點則可節省6萬個字節,對于整個數據包可節約240萬字節,約2.3M數據量,壓縮效果非??捎^。參考時間雖然需要占用8個字節,但是整個數據包中僅需要一個參考時間,可忽略不計。所以簡化時間戳對于降低時間戳數據量效果非常明顯。
2.3設計約束
簡化時間戳僅適用于數據的時間戳變化范圍在1分鐘之內的應用場景,如圖 1所示,L表示基準時間左邊的調節范圍,R表示基準時間右邊的調節范圍,且L+R=60秒。工業控制系統的數據采集周期一般都在500毫秒到5秒范圍內,所以一次數據傳輸中,所有數據的變化范圍一定在60秒以內,是可以使用簡化時間戳表示。如果變化范圍超過1分鐘,則無法正確還原原始時間戳。原因就是每分鐘都會有某個時刻的秒和毫秒時間,如果不限定一分鐘內,則無法確定是哪個分鐘的秒和毫秒。時間戳還原方法在后續章節詳細介紹。
3時間戳還原算法
3.1簡化時間戳還原算法
還原算法的基本思路是,根據實際應用場景,確定L的值,根據約束等式L+R = 60,如圖 1所示,R即可確定。假設Tb為基準參考時間,Tb1為基準時間的“年月日時分“部分的數值③,Tb2表示為基準時間的”秒毫秒“部分的數值,Ts表示簡化時間戳的總毫秒數值,用Tr表示還原后的完整時間戳。詳細步驟如下:0903A774-C8CA-488F-964C-45596FCBF1E3
1)計算分離Ts中的秒Ts_s和毫秒數值Ts_ms;
Ts_s =? Ts÷1000 ?,此處為向下取整運算。
Ts_ms = Ts mod 1000 ,此處為取模運算
2)取出基準時間中的“年月日時分“部分的數值Tb1;
3)用Tb1、Ts_s和Ts_ms組合成一個新的臨時完整時間戳Tt,并讓Tr=Tt;
4)取出基準時間Tb中的秒和毫秒的數值,并轉化為毫秒數Tb2;
Tb2 = 秒×1000+毫秒
5)修正Tr的結果
如果Tb2 < Ts,且 (Ts – Tb2) ≥ R×1000,則
Tr=Tt – 60秒
如果Tb2 > Ts,且 (Tb2 - Ts) > L×1000,則
Tr=Tt+60秒
6)輸出Tr為最終還原的完整時間戳
下面通過示例講述簡化時間戳的還原過程。
示例3:
本示例以示例1中的數據為輸入,即Ts為15368毫秒,Tb為“2022-1-9 13:21:16.368”。此時,Tb1為2022-1-9 13:21,Tb2為16368毫秒。假定L=50秒,那么R=10秒。那么還原過程為:
根據步驟1)可得到,Ts_s=? 15368÷1000 ? =15秒,Ts_ms=15368 mod 1000=368毫秒;
根據步驟2)可得Tb1=“2022-1-9 13:21”;
根據步驟3),將Tb1與Ts_s、Ts_ms合并為一個新的完整時間Tr=Tt=“2022-1-9 13:21:15.368”;
按照步驟4)可計算得到Tb2=16×1000+368=16368毫秒;
步驟5)中,由于兩個條件都不滿足,不需要修正。最終還原的完整時間戳為“2022-1-9 13:21:15.368”。
對于數據2的時間戳,Ts=56039毫秒,在還原的時候,步驟1)到步驟4)的計算過程都一樣,步驟4)執行完成后,Tr=Tt=“2022-1-9 13:21:56.039”,實際原始時間戳為“2022-1-9 13:20:56.039”,分鐘數值多了一分鐘,與實際不符合。該錯誤可在步驟5)中得到糾正。前面的步驟可計算Tb2=16368毫秒,滿足Tb2 3.2 L和R取值討論 前面討論過,該簡化方法使用于數據波動時間范圍小于1分鐘,L與R的取值需要視具體的使用場景進行調整。示例2中設置L=50秒,是考慮到數據都是在打包時刻之前進行采集的,所以L值可設定偏大一些。如果數據是在設置好參考時間后進行采集,那么數據的時間戳偏差都在參考時間右邊,此種場景則可設置L=10秒,那么R=50秒。所以L和R的值不是固定不變的,需要根據實際情況靈活調整。 4結論 本文根據工業控制系統數據采集的特點,提出簡化時間戳方法,并給出時間戳還原的詳細步驟。使用簡化時間戳,可以使時間戳數據變為原來的四分之一,大大減少了網絡數據傳輸量,提高了工業控制系統的系統效率。 注釋: ① Windows平臺的時間格式中的一種,使用一個64位整數(分為低32位和高32位)記錄距離1601年1月1日零時零分零秒時刻的100納秒數. ② Linux平臺使用的時間格式,分為兩部分,其中tv_sec是有符號32位整數,記錄距離1970年1月1日的秒數,tv_usec是有符號32位整數,記錄相對于tv_sec下的微秒數. ③ 此處為了敘述方便,使用更直觀的“年月日時分”敘述,實際編程實現時使用的是對應平臺的時間格式(FILETIME或struct timeval). 參考文獻: [1] 李煥,劉海濤.DCS模擬量數據的分部壓縮方法[J].電子測試,2013(12):52-53. [2] 龍海軍,姚光霖.核電站DCS系統歷史數據壓縮算法的研究[J].科技資訊,2013,11(8):29-30. [3] 巧用Unix的時間戳[J].計算機與網絡,2012(11):32. [4] 陳開渠.十進制時間戳協議[J].中國科學院研究生院學報,2001,18(2):144-148. [5] 張科偉,唐曉波.時間戳協議研究[J].計算機應用研究,2004,21(10):100-103. 【通聯編輯:聞翔軍】0903A774-C8CA-488F-964C-45596FCBF1E3