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