基于嵌入式Linux的組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)的設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1 引言
實(shí)時(shí)數(shù)據(jù)庫(kù)(real-time database, RTDB)作為組態(tài)軟件設(shè)計(jì)與實(shí)現(xiàn)的核心內(nèi)容解決了其所 應(yīng)對(duì)的現(xiàn)代工業(yè)生產(chǎn)現(xiàn)場(chǎng)環(huán)境中生產(chǎn)數(shù)據(jù)與控制數(shù)據(jù)類型復(fù)雜多樣,數(shù)據(jù)處理與事件調(diào)度時(shí) 間約束嚴(yán)格等難題[1]。目前,國(guó)內(nèi)外已經(jīng)有多種基于Windows 操作系統(tǒng)平臺(tái)的實(shí)時(shí)數(shù)據(jù)庫(kù) 產(chǎn)品在自動(dòng)化過(guò)程控制領(lǐng)域中得到應(yīng)用[2],隨著Linux 操作系統(tǒng)的出現(xiàn),這種開(kāi)發(fā)平臺(tái)單一 的局面有望得到改觀。Linux 操作系統(tǒng)具有很多優(yōu)秀的特性適于組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的 開(kāi)發(fā),特別是其完善的進(jìn)程線程管理,進(jìn)程間通信機(jī)制與并發(fā)控制,可靠的內(nèi)存管理系統(tǒng)[3], 更是為時(shí)間約束嚴(yán)格的實(shí)時(shí)數(shù)據(jù)庫(kù)的開(kāi)發(fā)提供了有力的支持。因此,本文結(jié)合Linux 系統(tǒng)實(shí) 時(shí)多任務(wù)方面的特性,采取能夠滿足數(shù)據(jù)實(shí)時(shí)響應(yīng)要求的多級(jí)存儲(chǔ)結(jié)構(gòu),研究并提出了一種 基于嵌入式Linux 系統(tǒng)平臺(tái)并可應(yīng)用于監(jiān)控組態(tài)軟件的實(shí)時(shí)數(shù)據(jù)庫(kù)實(shí)現(xiàn)方案。
2 實(shí)時(shí)數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)的分析與設(shè)計(jì)
實(shí)時(shí)數(shù)據(jù)庫(kù)是監(jiān)控組態(tài)軟件數(shù)據(jù)處理,事務(wù)調(diào)度,各應(yīng)用程序間通信的中心。圖1 即示 出了組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)處理流程。
2.1 實(shí)時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)流分析
組態(tài)軟件運(yùn)行環(huán)境分為實(shí)時(shí)數(shù)據(jù)庫(kù)管理系統(tǒng)(RTDBMS)和實(shí)時(shí)監(jiān)控界面程序(real-time supervisory control interface, RTSCI)。實(shí)時(shí)數(shù)據(jù)庫(kù)管理系統(tǒng)需要把工業(yè)現(xiàn)場(chǎng)中復(fù)雜多樣的過(guò) 程和控制數(shù)據(jù)抽象為合理高效的數(shù)據(jù)結(jié)構(gòu),實(shí)時(shí)監(jiān)控界面程序則利用實(shí)時(shí)過(guò)程數(shù)據(jù)為現(xiàn)場(chǎng)監(jiān) 控人員提供一個(gè)反映實(shí)際生產(chǎn)過(guò)程的可視化圖形界面,在實(shí)際運(yùn)行中二者構(gòu)成客戶端/服務(wù) 器計(jì)算模式。RTDBMS 作為數(shù)據(jù)服務(wù)的提供者,需要滿足RTSCI 種類多樣的數(shù)據(jù)需求。
為了形象的描繪工業(yè)現(xiàn)場(chǎng)的實(shí)際生產(chǎn)過(guò)程,RTSCI 由多種圖形對(duì)象構(gòu)成,根據(jù)不同的數(shù) 據(jù)類型需求可分為實(shí)時(shí)顯示,實(shí)時(shí)趨勢(shì),歷史趨勢(shì),實(shí)時(shí)報(bào)警等。而應(yīng)用于現(xiàn)代工業(yè)生產(chǎn)現(xiàn) 場(chǎng)環(huán)境的實(shí)時(shí)數(shù)據(jù)庫(kù)還需要滿足嚴(yán)格的數(shù)據(jù)存取與事件響應(yīng)的定時(shí)限制。所以,傳統(tǒng)的數(shù)據(jù) 庫(kù)管理系統(tǒng)所采用的數(shù)據(jù)表示方法,存儲(chǔ)模式已不能滿足工控組態(tài)軟件所要求的響應(yīng)速度 [4]。為此,在設(shè)計(jì)實(shí)時(shí)數(shù)據(jù)庫(kù)時(shí),為了兼顧RTSCI 所要求的數(shù)據(jù)圖形表現(xiàn)多樣性與工業(yè)生產(chǎn) 環(huán)境時(shí)間約束的嚴(yán)格性,需要采用多種存儲(chǔ)介質(zhì)合理組合的多層級(jí)數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。
在工業(yè)生產(chǎn)過(guò)程中實(shí)時(shí)產(chǎn)生的過(guò)程量,是需要組態(tài)軟件在每個(gè)采樣周期中及時(shí)更新的動(dòng) 態(tài)數(shù)據(jù),為了保證實(shí)時(shí)數(shù)據(jù)庫(kù)的及時(shí)響應(yīng),須將其存儲(chǔ)在內(nèi)存中;對(duì)于RTSCI 的某些數(shù)據(jù) 需求,如歷史趨勢(shì)顯示,實(shí)時(shí)數(shù)據(jù)庫(kù)應(yīng)為之提供相比內(nèi)存更大的存儲(chǔ)空間,這類數(shù)據(jù)需求不 需要很高的響應(yīng)速度,可將之命名為靜態(tài)數(shù)據(jù),其所服務(wù)的圖形對(duì)象要求可按時(shí)間翻頁(yè)瀏覽, 這類靜態(tài)數(shù)據(jù)適于存儲(chǔ)在文件系統(tǒng)中;而需要長(zhǎng)期保存的生產(chǎn)過(guò)程量數(shù)據(jù),即歷史數(shù)據(jù),它 們是今后進(jìn)行生產(chǎn)效能分析的依據(jù),這些數(shù)據(jù)可以保存在通用數(shù)據(jù)庫(kù)中。這樣,由內(nèi)存數(shù)據(jù) 庫(kù),外存文件系統(tǒng)以及通用數(shù)據(jù)庫(kù)的三級(jí)存儲(chǔ)結(jié)構(gòu),便構(gòu)成了既可滿足實(shí)時(shí)數(shù)據(jù)定時(shí)限制又 兼顧數(shù)據(jù)需求多樣性的可應(yīng)用于監(jiān)控組態(tài)軟件的實(shí)時(shí)數(shù)據(jù)庫(kù)的存儲(chǔ)架構(gòu)。
2.2 利用共享內(nèi)存與命名管道技術(shù)實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)
Linux 提供了一組由AT&T System V.2 版本的UNIX 引入的進(jìn)程間通信(Inter-Process CommunicatiON, IPC)機(jī)制,其中的共享內(nèi)存技術(shù)允許兩個(gè)不相關(guān)的進(jìn)程訪問(wèn)同一段邏輯內(nèi) 存,是在兩個(gè)運(yùn)行中的進(jìn)程間傳遞數(shù)據(jù)的一種非常高效的數(shù)據(jù)訪問(wèn)機(jī)制[5],可為RTDBMS 與RTSCI 間的動(dòng)態(tài)數(shù)據(jù)交互提供有力的支持。但共享內(nèi)存技術(shù)本身并未提供任何同步機(jī)制, 因此還需要配合IPC 的信號(hào)量機(jī)制來(lái)保證二者間數(shù)據(jù)訪問(wèn)控制。Linux 提供的另一組在不相 關(guān)的進(jìn)程間進(jìn)行數(shù)據(jù)交互的函數(shù)是命名管道FIFO。它是將數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)中實(shí)現(xiàn)進(jìn)程 間共享的一種通信方式。命名管道適用于數(shù)據(jù)存取響應(yīng)時(shí)間要求相對(duì)寬松且數(shù)據(jù)交互總量較 大的應(yīng)用場(chǎng)合。同時(shí),F(xiàn)IFO 中實(shí)現(xiàn)數(shù)據(jù)讀寫的read 和write 調(diào)用的阻塞機(jī)制,還可以提供 進(jìn)程間的同步控制。
由上述對(duì)其特點(diǎn)的分析,F(xiàn)IFO 技術(shù)是實(shí)現(xiàn)RTDBMS 與RTSCI 間靜態(tài)數(shù)據(jù)交互較好的 選擇。上圖即示出了由共享內(nèi)存,命名管道,ODBC 接口等多種進(jìn)程間通信機(jī)制構(gòu)建的實(shí)時(shí) 數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)。值得注意的是,為了實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)庫(kù)與通用數(shù)據(jù)庫(kù)的雙向數(shù)據(jù)交換,需要編寫特定的通用數(shù)據(jù)庫(kù)接口(ODBC 接口)例程。Linux 提供了一組豐富的接口函數(shù)用來(lái)訪問(wèn) MySQL 數(shù)據(jù)庫(kù)。通過(guò)對(duì)通用數(shù)據(jù)庫(kù)MySQL 的數(shù)據(jù)連接進(jìn)行組態(tài),實(shí)時(shí)數(shù)據(jù)庫(kù)便可按照預(yù) 先指定的采樣周期,對(duì)規(guī)定時(shí)間區(qū)段內(nèi)的歷史數(shù)據(jù)與MySQL 數(shù)據(jù)庫(kù)建立數(shù)據(jù)連接。
3 實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的實(shí)現(xiàn)
3.1 數(shù)據(jù)模型的分析與構(gòu)建
傳統(tǒng)數(shù)據(jù)模型包括三個(gè)部分:一組數(shù)據(jù)對(duì)象及其結(jié)構(gòu),一組數(shù)據(jù)操作,關(guān)于數(shù)據(jù)對(duì)象與 操作的完整性約束[6]。而對(duì)于工業(yè)生產(chǎn)中所產(chǎn)生的實(shí)時(shí)數(shù)據(jù),還必須約束于嚴(yán)格的定時(shí)限制。
在應(yīng)用于工業(yè)現(xiàn)場(chǎng)控制的組態(tài)軟件中不僅包括實(shí)時(shí)產(chǎn)生的過(guò)程量數(shù)據(jù),還存在著描述系 統(tǒng)運(yùn)行狀況的系統(tǒng)數(shù)據(jù),在利用采集到的過(guò)程量數(shù)據(jù)的基礎(chǔ)上,經(jīng)處理后提取出的計(jì)算數(shù)據(jù), 以及涉及控制測(cè)量組態(tài)或從工控軟件輸出到輸出裝置上的數(shù)據(jù)等。由此,可將實(shí)時(shí)數(shù)據(jù)模型 抽象為:模擬量,開(kāi)關(guān)量,字符串量三種數(shù)據(jù)類型。
3.2 數(shù)據(jù)類型的實(shí)現(xiàn)
上述用于構(gòu)建實(shí)時(shí)數(shù)據(jù)過(guò)程量的三類數(shù)據(jù)模型,對(duì)應(yīng)于具體的實(shí)現(xiàn)分別可用:浮點(diǎn)型, 布爾型,字符數(shù)組來(lái)表示。實(shí)時(shí)數(shù)據(jù)可由結(jié)構(gòu)類型實(shí)現(xiàn),以其中的實(shí)時(shí)數(shù)據(jù)類型字段來(lái)區(qū)分 不同的過(guò)程量類型。實(shí)時(shí)數(shù)據(jù)結(jié)構(gòu)類型的實(shí)現(xiàn)如下。
/*枚舉類型標(biāo)記實(shí)時(shí)數(shù)據(jù)過(guò)程量類型 */
typedef enum {
double_t = 1,
bool_t
} pv_type_set;
/* 聯(lián)合類型實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)過(guò)程量值 */
typedef union {
double dPV;
bool swhPV;
} pv_data_set;
/* 實(shí)時(shí)數(shù)據(jù)的數(shù)據(jù)類型 */
#define name_LEN 20
#define DESC_LEN 50
typedef STruct {
char nAME[NAME_LEN + 1];//數(shù)據(jù)點(diǎn)名稱
pv_type_set type;//數(shù)據(jù)點(diǎn)類型
char desc[DESC_LEN + 1];//數(shù)據(jù)點(diǎn)描述信息
pv_data_set pv;//數(shù)據(jù)點(diǎn)過(guò)程量值
char domain[3];//數(shù)據(jù)點(diǎn)所在域號(hào)
char eu[DESC_LEN + 1];//數(shù)據(jù)點(diǎn)工程單位描述
double euLow;//數(shù)據(jù)點(diǎn)工程單位下限
double euHigh;//數(shù)據(jù)點(diǎn)工程單位上限
double pvRaw;//現(xiàn)場(chǎng)測(cè)量裸數(shù)據(jù)
bool IsRanCon;//是否進(jìn)行量程變換
double pvRawLow;//裸數(shù)據(jù)量程下限
double pvRawHigh;//裸數(shù)據(jù)量程上限
bool static;//靜態(tài)數(shù)據(jù)歷史數(shù)據(jù)存儲(chǔ)至文件系統(tǒng)
int storecyc;//備份周期
bool IsAlarm;//是否報(bào)警
int AlarmPriority;//報(bào)警優(yōu)先級(jí)
… …
} tag_node;
3.3 實(shí)時(shí)數(shù)據(jù)在數(shù)據(jù)庫(kù)中的組織形式及相關(guān)數(shù)據(jù)結(jié)構(gòu)
為了充分地利用 Linux 平臺(tái)對(duì)實(shí)時(shí)多任務(wù)操作的支持,實(shí)時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)采集與處理等任務(wù)應(yīng)以多進(jìn)程的形式并發(fā)執(zhí)行。而Linux 操作系統(tǒng)IPC 機(jī)制中的共享內(nèi)存技術(shù)可以根據(jù)需 要離散地分配內(nèi)存空間,從而可將所有數(shù)據(jù)點(diǎn)的共享內(nèi)存地址構(gòu)成索引并建表。在實(shí)際應(yīng)用 中,經(jīng)常會(huì)將若干在生產(chǎn)工藝上有關(guān)聯(lián)的數(shù)據(jù)點(diǎn)劃分為一個(gè)數(shù)據(jù)域,所以地址索引表為兩級(jí) 結(jié)構(gòu):第一級(jí)為域表,其中的數(shù)據(jù)項(xiàng)存儲(chǔ)特定數(shù)據(jù)域的地址;第二級(jí)為數(shù)據(jù)點(diǎn)表,數(shù)據(jù)項(xiàng)存 儲(chǔ)某一數(shù)據(jù)域中的每個(gè)數(shù)據(jù)點(diǎn)的內(nèi)存地址。域表與數(shù)據(jù)點(diǎn)表中存儲(chǔ)的數(shù)據(jù)點(diǎn)所在的域號(hào)字段 與數(shù)據(jù)點(diǎn)號(hào)字段組合構(gòu)成數(shù)據(jù)點(diǎn)ID。包括所有實(shí)時(shí)數(shù)據(jù)點(diǎn)的地址索引由一張域表與多張數(shù) 據(jù)點(diǎn)表構(gòu)成。根據(jù)存儲(chǔ)域表結(jié)構(gòu)的內(nèi)存地址,便可訪問(wèn)所有數(shù)據(jù)點(diǎn)的共享內(nèi)存地址。下面給 出域表與數(shù)據(jù)點(diǎn)表用到的數(shù)據(jù)結(jié)構(gòu)。
/* 描述域表數(shù)據(jù)項(xiàng)的數(shù)據(jù)結(jié)構(gòu) */
typedef struct {
char domIndex[3];//域號(hào)
tbTag_item *tbTag_ptr;//該域的數(shù)據(jù)點(diǎn)表地址
} tbDom_item;
/*描述數(shù)據(jù)點(diǎn)表數(shù)據(jù)項(xiàng)的數(shù)據(jù)結(jié)構(gòu)*/
typedef struct {
char tagIndex[3];//數(shù)據(jù)點(diǎn)號(hào)
tag_node *tag_ptr;//指向數(shù)據(jù)點(diǎn)的指針
int shmid;//存儲(chǔ)該數(shù)據(jù)點(diǎn)的共享內(nèi)存標(biāo)號(hào)
char name[NAME_LEN + 1];//數(shù)據(jù)點(diǎn)名稱
} tbTag_item;
域表與數(shù)據(jù)點(diǎn)表的數(shù)據(jù)項(xiàng)內(nèi)容與關(guān)系結(jié)構(gòu)示意見(jiàn)圖 3。
3.4 一組訪問(wèn)實(shí)時(shí)數(shù)據(jù)庫(kù)的通用編程接口
作為投入現(xiàn)場(chǎng)運(yùn)行的監(jiān)控組態(tài)軟件的核心部件,實(shí)時(shí)數(shù)據(jù)庫(kù)需要為現(xiàn)場(chǎng)操作人員提供類 似傳統(tǒng)數(shù)據(jù)庫(kù)管理系統(tǒng)的實(shí)時(shí)數(shù)據(jù)查詢與更新等功能。另外出于設(shè)備無(wú)關(guān)性的考慮,也需要 為監(jiān)控組態(tài)軟件的其他應(yīng)用程序提供一組用來(lái)直接訪問(wèn)實(shí)時(shí)數(shù)據(jù)庫(kù)的接口函數(shù)。這樣,對(duì)于 其他工控設(shè)備與實(shí)時(shí)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交換的需求,只要利用這樣一組接口函數(shù)開(kāi)發(fā)不同的驅(qū) 動(dòng)程序便可得到滿足,從而增強(qiáng)了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的通用性與開(kāi)放性。下面列出了一些較為 常用的數(shù)據(jù)訪問(wèn)接口函數(shù)。
int CreatTag();//創(chuàng)建數(shù)據(jù)點(diǎn)
char *GetNameByID(char *tagID);//通過(guò)數(shù)據(jù)點(diǎn)ID 取得數(shù)據(jù)點(diǎn)名
char *GetIDByName(char *tagName);//通過(guò)數(shù)據(jù)點(diǎn)名得到數(shù)據(jù)點(diǎn)ID
pv_type_set GetPVType(char *tagName);//通過(guò)數(shù)據(jù)點(diǎn)名得到數(shù)據(jù)點(diǎn)過(guò)程量值類型
int GetPVByName(char *tagName, pv_data_set *pv);//根據(jù)數(shù)據(jù)點(diǎn)名獲取數(shù)據(jù)點(diǎn)過(guò)程量值
int SetPVByName(char *tagName, pv_data_set *pv);//根據(jù)數(shù)據(jù)點(diǎn)名寫入數(shù)據(jù)點(diǎn)過(guò)程量值
5 結(jié)語(yǔ)
實(shí)時(shí)數(shù)據(jù)庫(kù)作為監(jiān)控組態(tài)軟件的核心部分,其組織結(jié)構(gòu)是否高效直接影響到與底層 I/O 過(guò)程設(shè)備的數(shù)據(jù)交換,與實(shí)時(shí)監(jiān)控界面程序的數(shù)據(jù)傳遞,與組態(tài)軟件中其它運(yùn)行程序的實(shí)時(shí) 通信等多項(xiàng)技術(shù)指標(biāo)。所以,其設(shè)計(jì)要求結(jié)構(gòu)精簡(jiǎn),存儲(chǔ)高效,并且具備相當(dāng)?shù)目煽啃耘c穩(wěn) 定性。經(jīng)實(shí)際應(yīng)用證明,由本文提出的利用共享內(nèi)存,文件系統(tǒng),通用數(shù)據(jù)庫(kù)多層級(jí)存儲(chǔ)介 質(zhì)相結(jié)合的實(shí)時(shí)數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu),能較充分地利用Linux 操作系統(tǒng)實(shí)時(shí)多任務(wù)方面的特性, 較好地滿足工業(yè)生產(chǎn)現(xiàn)場(chǎng)環(huán)境的實(shí)時(shí)響應(yīng)要求。另外,實(shí)時(shí)數(shù)據(jù)庫(kù)的開(kāi)發(fā)是一個(gè)有著廣闊前景的研究領(lǐng)域,其還包括諸如I/O 調(diào)度與緩沖管理,恢復(fù)與超載管理等多項(xiàng)實(shí)現(xiàn)內(nèi)容[7]。
本文作者創(chuàng)新點(diǎn):本文利用Linux 操作系統(tǒng)對(duì)多任務(wù)并發(fā)處理操作的良好支持,采用二 級(jí)地址索引為數(shù)據(jù)點(diǎn)獨(dú)立分配共享內(nèi)存空間,以多進(jìn)程調(diào)度的方式實(shí)現(xiàn)了數(shù)據(jù)采集與處理從 而提高了系統(tǒng)吞吐量和數(shù)據(jù)存取效率。同時(shí),多層級(jí)的實(shí)時(shí)數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)能較好地兼顧工 業(yè)生產(chǎn)環(huán)境的時(shí)間約束與數(shù)據(jù)圖形表現(xiàn)多樣性的要求。