999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx

基于C/S架構(gòu)的數(shù)據(jù)壓縮系統(tǒng)設(shè)計與實現(xiàn)

2019-11-05 02:52:08
自動化與儀表 2019年10期
關(guān)鍵詞:服務(wù)

錢 晨

(光大環(huán)保技術(shù)研究院(南京)有限公司,南京210003)

隨著環(huán)保業(yè)務(wù)的飛速發(fā)展,大量的現(xiàn)場運行數(shù)據(jù)需要被收集并存儲。目前普遍采用擴充服務(wù)器的物理性能和提高其處理速度等方式,然而該方式存在很大的局限性,無法從根本上解決數(shù)據(jù)存儲的問題,還極大地提高了硬件成本。因此,在有限的磁盤空間容納更多的數(shù)據(jù),成為亟需解決的問題。故在此背景下提出對歷史數(shù)據(jù)進行壓縮存儲的方法和系統(tǒng)。該數(shù)據(jù)壓縮系統(tǒng)采用C/S 模式,通過命名管道的通訊方式,實現(xiàn)客戶端與服務(wù)端進程間通訊,將客戶端獲取的數(shù)據(jù)在服務(wù)端以插入的方式進行分類保存,充分地利用了磁盤空間,實現(xiàn)數(shù)據(jù)存儲。

1 技術(shù)概述

在數(shù)據(jù)壓縮系統(tǒng)的設(shè)計過程中,主要涉及以下關(guān)鍵技術(shù):

1)管道 是Windows 系統(tǒng)進行進程間通訊的一種工具,可以分為匿名管道(Anonymous Pipes)和命名管道(Named Pipes)2 種類型[1]。同時,它也是一種具有兩端點的通信通道,在每個端點上均可進行數(shù)據(jù)收發(fā)操作,如圖1所示。雖然這2 種管道的功能基本一致,但匿名管道提供的服務(wù)有限,有著一定的局限性[2]。

圖1 管道通信模型Fig.1 Pipe communication model

2)服務(wù)控制管理器 Windows 后臺運行的任務(wù)統(tǒng)稱為服務(wù)(Service),它們?yōu)橛脩籼峁┛梢栽诒镜鼗蜻h程計算機上的啟動、停止、恢復(fù)應(yīng)用程序等功能。實際上這些功能的實現(xiàn)均基于服務(wù)控制管理器SCM(service control manager)進行管理控制[3]。SCM擁有一個基于注冊表的服務(wù)數(shù)據(jù)庫,包含所有已安裝服務(wù)程序的相關(guān)信息,通過可視化界面控制和管理服務(wù)的啟動、停止和恢復(fù)等[4]。

2 系統(tǒng)總體設(shè)計

該系統(tǒng)以Window 7 32 位操作系統(tǒng)為平臺,應(yīng)用VC++ 6.0 基于控制臺的Win 32 Console Application 開發(fā)。其中,C/S 通信模塊采用Windows 命名管道技術(shù),后臺存儲服務(wù)模塊通過調(diào)用SCM 編程接口,實現(xiàn)開機自啟動功能。

該系統(tǒng)的整體結(jié)構(gòu)框架如圖2所示。系統(tǒng)基于C/S 框架模型,客戶端通過以太網(wǎng)通訊與OPC(OLE for processing control)服務(wù)器相連采集實時數(shù)據(jù)。服務(wù)端讀取標(biāo)簽文件(Tag.cnt)和配置文件,完成初始化后創(chuàng)建命名管道并完成與客戶端的連接,隨后經(jīng)過命名管道讀取數(shù)據(jù),并啟動數(shù)據(jù)保存線程,將數(shù)據(jù)以插入的方式進行分類保存。

圖2 系統(tǒng)整體結(jié)構(gòu)框架Fig.2 Framework of system overall structure

3 系統(tǒng)客戶端功能設(shè)計

在編寫系統(tǒng)客戶端(EBHKcore)程序之前,先進行數(shù)據(jù)庫配置:

①點擊OPC 表,設(shè)置OPC 服務(wù)器的名稱、用戶名、登錄密碼及OPC 域名等。如果要連接遠程OPC服務(wù)器,填寫對方的IP 地址即可。

②點擊Tag 表,配置OPC 標(biāo)簽點。項名由OPC服務(wù)器中的通道號+設(shè)備號+點名組成,必須與OPC服務(wù)器中的信息一一對應(yīng),否則在讀取該點數(shù)據(jù)時會發(fā)生錯誤;記錄方式(保存方式)分為按時間間隔保存和按誤差超限保存;記錄間隔用于表示多長時間保存一次;誤差用于表示超過誤差閾值通過管道發(fā)送數(shù)據(jù)。

數(shù)據(jù)庫配置完成后,啟動EBHKcore,讀取數(shù)據(jù)庫Tag 表中的信息(如圖3所示),按TagID 排序生成Tag.cnt 文件,該文件主要用于后臺歷史數(shù)據(jù)壓縮存儲服務(wù)。緊接著,按照Tag 表中的記錄方式、記錄間隔及誤差,指導(dǎo)命名管道向后臺存儲服務(wù)發(fā)送滿足條件的數(shù)據(jù)。

對于Structs.h 頭文件中聲明的3 個重要的結(jié)構(gòu)體,其含義以及聲明代碼如下:

1)PIPEHEADER(管道頭結(jié)構(gòu)體) 顧名思義就是放置在發(fā)送管道的首端,用于記錄發(fā)送緩沖區(qū)中數(shù)據(jù)結(jié)構(gòu)的個數(shù)、數(shù)據(jù)結(jié)構(gòu)的長度,以及管道發(fā)送字節(jié)的總長度。

2)LOGRECORD (數(shù)據(jù)結(jié)構(gòu)) 用于存放管道中即將發(fā)送變量的各種重要信息,如TagID、質(zhì)量碼、數(shù)值,以及數(shù)值刷新時間等。

3)PIPERET (管道返回結(jié)構(gòu)體) 結(jié)構(gòu)與管道頭類似,顧名思義是從服務(wù)端返回的校驗結(jié)構(gòu)體,用于判斷客戶端的數(shù)據(jù)發(fā)送是否成功,校驗客戶端發(fā)送數(shù)據(jù)的可靠性和完整性,確保服務(wù)端能夠順利地進行數(shù)據(jù)存儲。

將這些結(jié)構(gòu)體變量作為參數(shù),放入客戶端部分的核心函數(shù)CallNamedPipe()中。該函數(shù)用于客戶端進程請求服務(wù)端連接,具體的參數(shù)含義以及調(diào)用代碼如下:

4 系統(tǒng)服務(wù)端功能設(shè)計

該數(shù)據(jù)壓縮系統(tǒng)服務(wù)端的服務(wù)控制管理模塊主要包含3 個函數(shù):服務(wù)程序主函數(shù)(main),服務(wù)入口函數(shù)(service_main),控制服務(wù)處理函數(shù)(Service Control handle)。服務(wù)端設(shè)計流程如圖4所示。

圖4 服務(wù)端設(shè)計流程Fig.4 Server design flow chart

①服務(wù)程序主函數(shù)(main) 初始化一個服務(wù)表入口(SERVICE_TABLE_ENTRY)結(jié)構(gòu)體數(shù)組(提供一個service_main 函數(shù)),然后調(diào)用服務(wù)控制分派(StartServiceCtrlDispatcher)函數(shù)連接程序主線程到服務(wù)控制管理程序;②服務(wù)入口函數(shù)(service_main) 執(zhí)行服務(wù)初始化任務(wù),由于此處只需要一個服務(wù)進程完成歷史數(shù)據(jù)壓縮存儲,所以對應(yīng)一個服務(wù)入口;③控制服務(wù)處理函數(shù)(Service Control handle) 調(diào)用注冊服務(wù)控制處理(RegisterServiceCtrlHandler)函數(shù)來注冊它的控制處理器(Control Handler)函數(shù)。

服務(wù)啟動(ServiceStart)成功后,進行保存前的初始化工作,讀取配置文件和標(biāo)簽文件(Tag.cnt),如圖4所示。具體地讀ini 配置文件獲取his 文件的保存路徑,讀Tag.cnt 文件初始化m_mapIDToType 映射(鍵:ID 值:Type)。隨后便可由服務(wù)端循環(huán)創(chuàng)建非阻塞模式命名管道不停地接收客戶端的數(shù)據(jù)。

命名管道服務(wù)端主要包含2 個重要函數(shù),分別為創(chuàng)建命名管道(CreateNamedPipe)函數(shù)和連接命名管道(ConnectNamedPipe)函數(shù)。在創(chuàng)建命名管道前,先定義并初始化SECURITY_ATTRIBUTES 結(jié)構(gòu)體,作為CreateNamedPipe()函數(shù)的實參,具體的初始化代碼如下:

然后,在服務(wù)端創(chuàng)建一個命名管道,具體參數(shù)含義及代碼如下:

命名管道創(chuàng)建并初始化后,進行管道連接操作,由于創(chuàng)建管道時的打開模式為FILE_FLAG_OVERLAPPED,所以必須初始化OVERLAPPE 結(jié)構(gòu)體,其關(guān)鍵語句如下:

OVERLAPPE 結(jié)構(gòu)體初始化后,服務(wù)端連接管道,同時等待客戶端連接請求的到來。該過程的具體實現(xiàn)代碼如下:

如果命名管道連接成功,創(chuàng)建并進入實例線程InstanceThread,如圖4所示,讀取管道中客戶端發(fā)送的數(shù)據(jù)流,并把數(shù)據(jù)放入緩沖數(shù)組byBuf 中。如果實際讀取得字節(jié)長度≥管道頭中記錄的發(fā)送字節(jié)總長度,把管道校驗結(jié)構(gòu)體pr 的wCode 成員變量置位并發(fā)送給客戶端釋放連接。同時,服務(wù)端可以進行保存,并啟動保存線程SaveThread,按管道頭中的數(shù)據(jù)類型進行分類保存,保存過程中先創(chuàng)建、初始化歷史文件(his),再通過緩存記錄位號數(shù)據(jù)、位號刷新時刻及其在文件中的存儲位置,最后根據(jù)記錄的信息在文件中對應(yīng)的位置處寫入位號數(shù)據(jù)和刷新時刻。如此反復(fù),將管道中發(fā)送過來的每一個位號的信息都寫入his 文件中按順序存儲。

要實現(xiàn)服務(wù)端程序EBHKHIS.exe 開機自啟動,無需人為的手動干預(yù),就要以管理員身份打開命令提示符窗口,輸入以下腳本:

服務(wù)添加后,退出cmd,打開控制面板→管理工具→服務(wù),就會發(fā)現(xiàn)EBHKHIS Service 已經(jīng)在后臺啟動。

5 數(shù)據(jù)存儲設(shè)計

歷史文件(his)按照日期每天零點進行創(chuàng)建,位號數(shù)據(jù)依據(jù)數(shù)值刷新時刻以插入的形式存儲在his中。his 文件的存儲結(jié)構(gòu)如圖5所示,其包括文件頭、數(shù)據(jù)塊信息以及具體位號數(shù)據(jù)。

由圖可見,文件頭由多個變量組成,占1024 B;數(shù)據(jù)塊信息包含多個標(biāo)簽(Tag),每個Tag 由多個字段組成,占594 B。當(dāng)需要存儲下一個Tag 時,文件指針實現(xiàn)自增長,將其存儲在已有Tag 之后。圖5還展示了Tag1 和Tag2 的存儲結(jié)構(gòu),即由數(shù)值刷新時刻(經(jīng)過編碼)和對應(yīng)的數(shù)值組成。其中,數(shù)值刷新時刻是將TagID、 質(zhì)量碼疊加到數(shù)值刷新時刻再進行編碼后形成的,所以說歷史文件中存儲的是經(jīng)過處理的數(shù)據(jù),而非文本形式的原始數(shù)據(jù)。這樣,能夠防止歷史文件中的數(shù)據(jù)被泄露,保證其安全性。

舉例說明,his 文件存儲結(jié)構(gòu)如圖5所示,Tag數(shù)據(jù)塊信息中Tag1 的dwLastTagPos 為0,即在歷史文件的位置0 處存儲,如圖5下方所示的Tag1;Tag數(shù)據(jù)塊信息中Tag2 的dwLastTagPos 為12,即在歷史文件的位置12 處存儲,如圖5下方所示的Tag2。依此類推,采用這樣緊湊的方式存放數(shù)據(jù),能夠充分地利用存儲空間,避免存儲空間的浪費。

圖5 his 文件存儲結(jié)構(gòu)Fig.5 His file storage structure

針對某特定的TagID,可以經(jīng)過命名管道獲取多個數(shù)據(jù),多個數(shù)據(jù)可以是一次接收到的或者也可以是多次接收到的,不同的數(shù)據(jù)可以具有相同或不同的數(shù)值刷新時刻和數(shù)值(value)。舉例說明,假設(shè)Tag1 的TagID=ID1。若接收到一個新的數(shù)據(jù),其TagID 也為ID1,則認(rèn)為它們同屬于Tag1,可以將其按照數(shù)值刷新時刻進行插入。

若新收到的數(shù)據(jù)的數(shù)值刷新時刻(dwNewSec)>已存儲的數(shù)值刷新時刻(dwLastSec),則將Tag 數(shù)據(jù)塊信息部分Tag1 已存儲的數(shù)值刷新時刻(dwLast-Sec)更新為新收到的數(shù)據(jù)的數(shù)值刷新時刻,將Tag數(shù)據(jù)塊信息部分Tag1 已存儲的數(shù)值存儲位置(dwLastTagPos)更新為新收到的數(shù)據(jù)的數(shù)值存儲位置。也就是說,Tag 數(shù)據(jù)塊信息部分各個Tag 的dwLastTagPos 和dwLastSec,是根據(jù)最后接收到的數(shù)據(jù)而不斷更新的,并且根據(jù)這些更新的信息指導(dǎo)接下來的數(shù)據(jù)存儲。

舉例說明,如果又收到一個新的Tag1 數(shù)據(jù),可以按順序依次存儲編碼后的數(shù)值刷新時刻t12 以及對應(yīng)的Tag 數(shù)值V2。由圖5可見,將Tag 數(shù)據(jù)塊信息中Tag1 的dwLastTagPos 更新為24,dwLastSec 更新為T12,并在歷史文件的位置24 處(即圖5下方所示的Tag2 之后) 存儲與圖5下方所示的Tag1 相類似的編碼后的T12 和V2。這樣就可以將Tag1 的所有數(shù)據(jù)進行存儲,并且以這種插入的存儲方式進行存儲能夠節(jié)省存儲空間,使得存儲空間的利用率更高。若dwNewSec=dwLastSec,則將對應(yīng)位置處的數(shù)值進行更新即可。

另外,可以為歷史文件設(shè)定預(yù)留空間,假設(shè)為1024 B。可理解,如果dwLastPos+預(yù)留空間1024 B>文件長度(B),說明預(yù)留空間不足,此時需要額外增加空間,一般是512 kB 的整數(shù)倍。再者,還可以根據(jù)需求設(shè)定時間跨度,定時刪除部分歷史文件,減少磁盤的占用空間。

6 結(jié)語

通過VC++編程的具體實例,介紹了SCM 接口技術(shù)、命名管道在進程間通信的應(yīng)用,以及后臺數(shù)據(jù)存儲的方法。該方法實現(xiàn)了從客戶端獲取實時數(shù)據(jù),把滿足條件的數(shù)據(jù)通過管道通信的方式發(fā)送至后臺存儲服務(wù),最后以插入的方式進行分類保存的功能。該系統(tǒng)經(jīng)過在線測試和現(xiàn)場試運行階段后,已正式投入使用,并在各個項目公司取得良好的效果。

猜你喜歡
服務(wù)
自助取卡服務(wù)
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
服務(wù)在身邊 健康每一天
高等教育為誰服務(wù):演變與啟示
招行30年:從“滿意服務(wù)”到“感動服務(wù)”
商周刊(2017年9期)2017-08-22 02:57:56
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
主站蜘蛛池模板: 国产成年女人特黄特色大片免费| 亚洲高清中文字幕| 欧洲日本亚洲中文字幕| 国产丝袜啪啪| 亚洲开心婷婷中文字幕| 国产精品吹潮在线观看中文| 日韩在线2020专区| 欧美激情视频一区| 国产日韩欧美中文| 一本大道香蕉中文日本不卡高清二区 | 国产一区二区免费播放| 成人精品午夜福利在线播放| 日韩国产另类| 国产精品内射视频| 中文字幕无线码一区| 婷婷色丁香综合激情| 亚洲精品综合一二三区在线| 日韩精品资源| 99精品国产高清一区二区| 深爱婷婷激情网| 国产欧美综合在线观看第七页| 欧美一区二区精品久久久| 久久人人爽人人爽人人片aV东京热| 亚洲av中文无码乱人伦在线r| 午夜限制老子影院888| 乱人伦中文视频在线观看免费| 广东一级毛片| 在线观看免费人成视频色快速| 亚洲中文字幕23页在线| 国产一级毛片高清完整视频版| 超碰色了色| 国产亚洲成AⅤ人片在线观看| 67194亚洲无码| 欧美在线天堂| av在线无码浏览| a级毛片免费在线观看| 欧美日韩亚洲国产| 午夜精品福利影院| 色久综合在线| 久久99热66这里只有精品一| 国产一区二区网站| 手机精品视频在线观看免费| 国产在线观看91精品| 四虎影视8848永久精品| 国产91蝌蚪窝| 老司机午夜精品网站在线观看| 天堂成人av| 亚洲天堂视频在线观看| 国产日韩精品一区在线不卡 | 亚洲有码在线播放| 综合社区亚洲熟妇p| 亚洲精品中文字幕午夜| 韩国自拍偷自拍亚洲精品| 国产福利观看| 国产丝袜91| 亚洲成年网站在线观看| 一级成人欧美一区在线观看| 亚洲人成影视在线观看| 欧美午夜理伦三级在线观看| 欧美国产日韩在线| 亚洲视频一区在线| 国产亚洲精品97AA片在线播放| 亚洲成AV人手机在线观看网站| 日本免费新一区视频| 国产精品成人第一区| 在线国产毛片手机小视频| 麻豆精品久久久久久久99蜜桃| 久久综合丝袜日本网| 欧美色图久久| 国产 日韩 欧美 第二页| 亚洲黄色高清| 国产91九色在线播放| 一级毛片不卡片免费观看| 亚洲精品国产日韩无码AV永久免费网| 欧美日韩成人在线观看| 国产在线视频导航| 97人妻精品专区久久久久| 毛片网站免费在线观看| 国产在线一区二区视频| AV老司机AV天堂| 成年人福利视频| 欧美亚洲一区二区三区导航|