技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國(guó)傳動(dòng)網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 先進(jìn)控制軟件系統(tǒng)實(shí)時(shí)數(shù)據(jù)庫(kù)的設(shè)計(jì)

先進(jìn)控制軟件系統(tǒng)實(shí)時(shí)數(shù)據(jù)庫(kù)的設(shè)計(jì)

時(shí)間:2007-12-18 10:14:00來(lái)源:dujing

導(dǎo)語(yǔ):?本文通過(guò)對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)的概述和分析,論述了實(shí)時(shí)數(shù)據(jù)庫(kù)模塊的實(shí)現(xiàn)方法,以面向?qū)ο蟮木幊谭绞浇o出了定義類(lèi)的部分代碼
前 言 近年來(lái),DCS(集散控制系統(tǒng))以其強(qiáng)大的控制功能、可靠的安全性能和良好的可移植性在國(guó)內(nèi)外工控領(lǐng)域獲得廣泛的應(yīng)用,DCS的日益普及為實(shí)現(xiàn)先進(jìn)控制、實(shí)時(shí)優(yōu)化等新技術(shù)提供了強(qiáng)有力的硬件支持和保障。先進(jìn)控制除了具有改善控制性能、提高經(jīng)濟(jì)效益等主要功能外,也是深度開(kāi)發(fā)和利用DCS資源、提高企業(yè)自動(dòng)化和管理水平的重要途徑。先進(jìn)控制軟件的設(shè)計(jì)一般分為幾個(gè)模塊:模型辨識(shí)器、多變量預(yù)估控制器、魯棒PID控制器(含各種中間控制器)、實(shí)時(shí)數(shù)據(jù)庫(kù)、工藝計(jì)算包等,其中實(shí)時(shí)數(shù)據(jù)庫(kù)模塊是其他模塊的紐帶和橋梁。所以,實(shí)時(shí)數(shù)據(jù)庫(kù)模塊設(shè)計(jì)的好壞直接影響到先進(jìn)控制軟件設(shè)計(jì)的成敗。實(shí)時(shí)數(shù)據(jù)庫(kù)是先進(jìn)控制軟件系統(tǒng)的重要組成部分,也是設(shè)計(jì)的難點(diǎn)之一。實(shí)時(shí)數(shù)據(jù)庫(kù)是先進(jìn)控制軟件系統(tǒng)的數(shù)據(jù)處理中心。在先進(jìn)控制系統(tǒng)投用運(yùn)行環(huán)境時(shí),工業(yè)現(xiàn)場(chǎng)的生產(chǎn)狀況將實(shí)時(shí)地反映在變量的數(shù)值中,操作者在計(jì)算機(jī)前發(fā)布的指令也要迅速送達(dá)生產(chǎn)現(xiàn)場(chǎng),所有這一切都是以實(shí)時(shí)數(shù)據(jù)庫(kù)為中介環(huán)節(jié)。同時(shí),實(shí)時(shí)數(shù)據(jù)庫(kù)又是事務(wù)調(diào)度中心,數(shù)據(jù)采集事務(wù)、圖形顯示事務(wù)、報(bào)警事務(wù)、歷史數(shù)據(jù)存盤(pán)事務(wù)等等都由實(shí)時(shí)數(shù)據(jù)庫(kù)統(tǒng)一調(diào)配,從而達(dá)到控制的實(shí)時(shí)性。 1.實(shí)時(shí)數(shù)據(jù)庫(kù)概述 在引入實(shí)時(shí)數(shù)據(jù)庫(kù)概念之前,先介紹一下數(shù)據(jù)對(duì)象。在先進(jìn)控制軟件設(shè)計(jì)中定義的數(shù)據(jù)不同于傳統(tǒng)意義的數(shù)據(jù)或變量,它不只包含了變量的數(shù)值特征,還將與數(shù)據(jù)相關(guān)的其它屬性(如數(shù)據(jù)的狀態(tài)、報(bào)警限值等)以及對(duì)數(shù)據(jù)的操作方法(如存盤(pán)處理、報(bào)警處理等)封裝在一起,作為一個(gè)整體,以對(duì)象的形式提供服務(wù)。這種把數(shù)值、屬性和方法定義成一體的數(shù)據(jù)稱(chēng)為數(shù)據(jù)對(duì)象。在設(shè)計(jì)中,用數(shù)據(jù)對(duì)象來(lái)表述系統(tǒng)中的實(shí)時(shí)數(shù)據(jù),用對(duì)象變量代替?zhèn)鹘y(tǒng)意義的值變量。用數(shù)據(jù)庫(kù)技術(shù)管理的所有數(shù)據(jù)對(duì)象的集合稱(chēng)為實(shí)時(shí)數(shù)據(jù)庫(kù),實(shí)時(shí)數(shù)據(jù)庫(kù)提供管理、刷新、查詢(xún)數(shù)據(jù)對(duì)象等操作。 實(shí)時(shí)數(shù)據(jù)庫(kù)與普通商用數(shù)據(jù)庫(kù)不同,實(shí)時(shí)數(shù)據(jù)庫(kù)的主要目標(biāo)是使盡量多的事務(wù)在規(guī)定的時(shí)間要求內(nèi)完成,而不是公平地分配系統(tǒng)以使所有的事務(wù)都得到執(zhí)行。它有以下幾個(gè)特點(diǎn): 1)時(shí)間約束實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的主要特征是在數(shù)據(jù)對(duì)象和事務(wù)上施加了時(shí)間約束。對(duì)數(shù)據(jù)的時(shí)間約束,就是在數(shù)據(jù)庫(kù)的普通一致性要求以外,又規(guī)定了時(shí)態(tài)一致性要求。在實(shí)時(shí)系統(tǒng)中,具有時(shí)間約束的數(shù)據(jù)主要來(lái)自于外部的動(dòng)態(tài)數(shù)據(jù),如由傳感器采集的現(xiàn)場(chǎng)數(shù)據(jù),和由這些數(shù)據(jù)導(dǎo)出的數(shù)據(jù)。因此,可將數(shù)據(jù)的時(shí)間約束分為兩類(lèi),即數(shù)據(jù)的絕對(duì)一致性和數(shù)據(jù)的相對(duì)一致性。數(shù)據(jù)的絕對(duì)一致性是指實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)應(yīng)與外部數(shù)據(jù)(又稱(chēng)為環(huán)境數(shù)據(jù))相一致,即要求數(shù)據(jù)庫(kù)中的數(shù)據(jù)能及時(shí)地反映外部環(huán)境的狀態(tài)。例如,在化工過(guò)程控制系統(tǒng)中,要求數(shù)據(jù)庫(kù)中記錄的塔的溫度、壓力等信息,與塔的實(shí)際的溫度、壓力等參數(shù)保持一致。這種一致性的破壞有時(shí)可能會(huì)導(dǎo)致災(zāi)難性的后果。在實(shí)時(shí)系統(tǒng)中,常常需要從一組數(shù)據(jù)項(xiàng)導(dǎo)出另外的數(shù)據(jù),例如,根據(jù)系統(tǒng)的電流、電壓導(dǎo)出系統(tǒng)的功率。此時(shí)往往要求用來(lái)導(dǎo)出新數(shù)據(jù)的一組數(shù)據(jù)在時(shí)間上應(yīng)盡量接近,這就形成了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)中數(shù)據(jù)的相對(duì)一致性概念。 2)事務(wù)調(diào)度 傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng)中,事務(wù)調(diào)度的目標(biāo)是提高系統(tǒng)對(duì)事務(wù)的吞吐率,但實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)則要求能使盡量多的事務(wù)在其期限內(nèi)完成。因此,實(shí)時(shí)事務(wù)的調(diào)度與傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng)中的事務(wù)調(diào)度是有差別的。大多數(shù)的實(shí)時(shí)事務(wù)調(diào)度策略都是圍繞事務(wù)的優(yōu)先級(jí)進(jìn)行的。 3)實(shí)時(shí)數(shù)據(jù)庫(kù)的實(shí)時(shí)數(shù)據(jù)存儲(chǔ)管理 實(shí)時(shí)數(shù)據(jù)庫(kù)主要承擔(dān)系統(tǒng)所有實(shí)時(shí)數(shù)據(jù)的存儲(chǔ)和管理,為相關(guān)的功能提供快速、正確的實(shí)時(shí)信息,因此,對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)來(lái)說(shuō),其實(shí)時(shí)性是第一位的,考慮到這一點(diǎn),實(shí)時(shí)數(shù)據(jù)庫(kù)在系統(tǒng)運(yùn)行過(guò)程中,應(yīng)占用空間小,并常駐內(nèi)存,以保證數(shù)據(jù)庫(kù)讀取速度快,存取靈活,易于各功能模塊之間的數(shù)據(jù)共享。 實(shí)時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)共享采用內(nèi)存文件映射來(lái)實(shí)現(xiàn)。 對(duì)于那些實(shí)時(shí)性要求不高的非共享數(shù)據(jù)和共享數(shù)據(jù),如采樣值的轉(zhuǎn)換系數(shù)等可以放在外存儲(chǔ)空間。因此,在實(shí)時(shí)數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),要妥善處理時(shí)間和存儲(chǔ)空間之間的矛盾,以保證先進(jìn)控制系統(tǒng)的實(shí)時(shí)性。 2 實(shí)時(shí)數(shù)據(jù)庫(kù)的分析與設(shè)計(jì) 首先從功能角度分析實(shí)時(shí)數(shù)據(jù)庫(kù)的設(shè)計(jì)。 1)實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的功能分析: 現(xiàn)場(chǎng)數(shù)據(jù)采集:實(shí)時(shí)數(shù)據(jù)庫(kù)提供了與典型數(shù)據(jù)源的接口,讀寫(xiě)通訊設(shè)備寄存器的現(xiàn)場(chǎng)值,送到開(kāi)辟的內(nèi)存緩沖區(qū)。 預(yù)處理機(jī)制:可以直接在實(shí)時(shí)數(shù)據(jù)庫(kù)中對(duì)原始數(shù)據(jù)進(jìn)行處理,如數(shù)據(jù)轉(zhuǎn)化。滾動(dòng)存儲(chǔ)機(jī)制:實(shí)時(shí)數(shù)據(jù)庫(kù)的各數(shù)據(jù)對(duì)象以鏈表形式存放在內(nèi)存中,故數(shù)據(jù)庫(kù)的容量相對(duì)容固定,當(dāng)新的數(shù)據(jù)產(chǎn)生時(shí),自動(dòng)更新數(shù)據(jù)對(duì)象的現(xiàn)場(chǎng)值屬性。 自動(dòng)更新機(jī)制:當(dāng)實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)對(duì)象現(xiàn)場(chǎng)值屬性改變時(shí),自動(dòng)啟動(dòng)線(xiàn)程,更新顯示畫(huà)面的數(shù)據(jù) 顯示,如需存盤(pán),存入 Access 數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)實(shí)時(shí)監(jiān)控。 觸發(fā)和定時(shí)機(jī)制:提供豐富的觸發(fā)和定時(shí)機(jī)制,供各類(lèi)數(shù)據(jù)處理、先進(jìn)控制和優(yōu)化算法使用,以保證數(shù)據(jù)的實(shí)時(shí)性、有效性、一致性。補(bǔ)償機(jī)制:當(dāng)不能保證連續(xù)運(yùn)行時(shí)(如系統(tǒng)備份),需要提供相應(yīng)的補(bǔ)償機(jī)制,以保證數(shù)據(jù)不會(huì)丟失。 數(shù)據(jù)檢索機(jī)制:可以以類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)的方式檢索實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)對(duì)象,取得所需的數(shù)據(jù)對(duì)象屬性或操作。 態(tài)匯總機(jī)制:實(shí)時(shí)數(shù)據(jù)庫(kù)提供了報(bào)警狀態(tài)、操作事件等信息的動(dòng)態(tài)匯總功能。 2)實(shí)時(shí)數(shù)據(jù)庫(kù)事務(wù)調(diào)度分析 在先進(jìn)控制軟件系統(tǒng)投入運(yùn)行后,同時(shí)要進(jìn)行與 DCS 數(shù)據(jù)采集、數(shù)據(jù)處理、圖形顯示刷新、歷史數(shù)據(jù)存盤(pán)、緊急事件報(bào)警或越位報(bào)警等等,所有的這些事務(wù),都要并行處理,如等待時(shí)間太長(zhǎng),無(wú)法滿(mǎn)足實(shí)時(shí)性的要求。這樣就要求我們實(shí)現(xiàn)一種并行編程,在只有一個(gè) CPU 的機(jī)器上,也就是要將該 CPU 時(shí)間按照一定的優(yōu)先準(zhǔn)則分配給各個(gè)事件,定期處理某一事件而不會(huì)在某一事件處理過(guò)長(zhǎng),在 32 位 Windows98或 WindowsNT4.0 下,用多線(xiàn)程的編程技術(shù)來(lái)實(shí)現(xiàn)這種并行編程,實(shí)時(shí)調(diào)度各事務(wù)。 3)實(shí)時(shí)數(shù)據(jù)庫(kù)的設(shè)計(jì) 以面向?qū)ο缶幊蹋∣OP)的設(shè)計(jì)技術(shù),將實(shí)時(shí)數(shù)據(jù)庫(kù)定義為類(lèi)的形式。如圖 2 所示,將實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)定義的與各圖形顯示模塊、歷史數(shù)據(jù)存盤(pán)模塊等相聯(lián)系的接口函數(shù)劃分為幾個(gè)模塊加以說(shuō)明: 實(shí)時(shí)數(shù)據(jù)庫(kù)初始化模塊:該模塊主要是根據(jù)先進(jìn)控制所需要的數(shù)據(jù)創(chuàng)建各數(shù)據(jù)對(duì)象,以鏈表作為存儲(chǔ)方式,并建立各數(shù)據(jù)對(duì)象對(duì)應(yīng)的對(duì)象名索引,以提高訪問(wèn)數(shù)據(jù)對(duì)象的訪問(wèn)速度,同時(shí)建立 Access 歷史數(shù)據(jù)庫(kù)。 基本操作模塊:提供數(shù)據(jù)對(duì)象的基本操作,如通過(guò)數(shù)據(jù)對(duì)象名或 ID 取得數(shù)據(jù)對(duì)象的其他屬性或通過(guò)名稱(chēng)取得數(shù)據(jù)對(duì)象的 ID 等等。 讀寫(xiě)數(shù)據(jù)操作模塊:提供數(shù)據(jù)對(duì)象的讀寫(xiě)數(shù)據(jù)操作,將存放在數(shù)據(jù)緩沖區(qū)的現(xiàn)場(chǎng)值寫(xiě)入實(shí)時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)對(duì)象的現(xiàn)場(chǎng)值屬性中去,讀取數(shù)據(jù)對(duì)象中的當(dāng)前值。 3通訊設(shè)備讀寫(xiě)操作模塊:管理通訊設(shè)備,讀取設(shè)備的當(dāng)前工作狀態(tài),對(duì)指定的設(shè)備進(jìn)行操作。 窗口操作模塊:讀取用戶(hù)窗口的名稱(chēng),對(duì)指定的用戶(hù)窗口進(jìn)行操作,讀取用戶(hù)窗口的當(dāng)前狀態(tài)。 報(bào)警操作模塊:存儲(chǔ)報(bào)警信息,讀取數(shù)據(jù)對(duì)象的報(bào)警限值。 存盤(pán)操作模塊:在 Access 數(shù)據(jù)庫(kù)中存儲(chǔ)需要存盤(pán)的數(shù)據(jù)。 3.實(shí)時(shí)數(shù)據(jù)庫(kù)的實(shí)現(xiàn) 實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)對(duì)象類(lèi)的定義:數(shù)據(jù)對(duì)象分為模擬量、開(kāi)關(guān)量、字符串三個(gè)類(lèi)型,下面重點(diǎn)介紹模擬量類(lèi)的定義,并給出部分VC++代碼,其他類(lèi)的定義與此類(lèi)似,在此不做介紹。 //模擬量的類(lèi)定義: class AnalogType : public CObject { public: AnalogType(); virtual ~AnalogType(); private: //基本屬性操作參數(shù) CString ObjectName; //對(duì)象名 float ObjectInivalue; //初始值 float ObjectMinvalue; //最小值 float ObjectMaxvalue; //最大值 CString ObjectUnit; //對(duì)象的工程單位 int ObjectPointN; //小數(shù)位數(shù) //存盤(pán)操作參數(shù) BOOL IsSave; //是否存盤(pán) int SaveTime; //存盤(pán)時(shí)間 //報(bào)警操作參數(shù) BOOL IsAlarm //是否報(bào)警 int AlarmPriority; //優(yōu)先級(jí) float LowLowvalue; //低低報(bào)警 float Lowvalue; //低報(bào)警 float HeighHeighvalue; //高高報(bào)警 float Heighvalue; //高報(bào)警 float LowDevvalue; //低偏差報(bào)警值 float HeighDevvalue; //高偏差報(bào)警值 int FieldvalueInt; //現(xiàn)場(chǎng)的實(shí)時(shí)整型值 float FieldvalueFloat; //現(xiàn)場(chǎng)的實(shí)時(shí)模擬值 //定義數(shù)據(jù)操作 public: //定義屬性的輸入接口提供初始化操作 void SetObjectName(CString name) {ObjectName=name; } void SetObjectInivalue(float inivalue) {ObjectInivalue=inivalue;} void SetObjectMinvalue(float minvalue) {ObjectMinvalue=minvalue;} void SetObjectMaxvalue(float maxvalue) {ObjectMaxvalue=maxvalue;} void SetObjectUnit(CString unit) {ObjectUnit=unit;} …… //定義輸出接口,提供給基本數(shù)據(jù)操作和存盤(pán)、報(bào)警操作 CString GetObjectName() { return ObjectName; } float GetObjectInivalue() { return ObjectInivalue;} float GetObjectMinvalue() { return ObjectMinvalue;} float GetObjectMaxvalue() { return ObjectMaxvalue;} CString GetObjectUnit() { return ObjectUnit;} …… //現(xiàn)場(chǎng)的實(shí)時(shí)值操作 void SetFieldvalue(float valuefield) {Fieldvalue=valuefield; } float GetFieldvalue() { return Fieldvalue; } }; 實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)的設(shè)計(jì),用 VC++聲明的頭文件如下: class RealDB : public CObject { private : AnalogType *TemAnalog; SwitchType *TemSwitch; POSITION temposition; int DataNum; private: //創(chuàng)建 Access 歷史數(shù)據(jù)庫(kù)和表 BOOL CreateNewTable(); BOOL CreateHistoryAlarmDB(); BOOL CreateHistoryObjectTable(); public: CDaoTableDef *m_newtable; CDatabase m_dataobject; CObList m_listdata; //數(shù)據(jù)對(duì)象的鏈表 CString IndexTag[200]; //定義最大數(shù)據(jù)對(duì)象個(gè)數(shù) 200 int AnalogSwitchSign; //定義模擬和開(kāi)關(guān)型的分割位置 //操作 public: RealDB(); virtual ~RealDB(); BOOL CreateDataObject(); //創(chuàng)建數(shù)據(jù)對(duì)象 //數(shù)據(jù)對(duì)象的基本操作 BOOL GetProFromName(CString Name, int Type , float InitV ,CString Unit , float MaxV , float MinV , int PointN ); BOOL GetProFromID(int id,CString Name, int Type , float InitV ,CString Unit , float MaxV , float MinV , int PointN ); int GetIDFromDataName(CString dataname); //通過(guò)標(biāo)記名取得 ID 號(hào) CString GetDataNameFromID(int id); //通過(guò) ID 取得數(shù)據(jù)對(duì)象的名稱(chēng) int GetDataType(CString Name); int GetAlmDataName(CString name[200]); //報(bào)警數(shù)據(jù)對(duì)象集合 int GetSaveDataName(CString alarmname[200]); //保存數(shù)據(jù)對(duì)象的集合 //數(shù)據(jù)對(duì)象的現(xiàn)場(chǎng)值讀寫(xiě)操作 BOOL GetvalueFromName(CString name,float value); //通過(guò)標(biāo)記名取得現(xiàn)場(chǎng)值 BOOL SetvalueFromName(CString name,float value); //通過(guò)標(biāo)記名將現(xiàn)場(chǎng)值寫(xiě)入數(shù)據(jù)對(duì)象中 BOOL GetvalueFromID(int id,float value); //通過(guò) ID 號(hào)取得現(xiàn)場(chǎng)值 BOOL SetvalueFromID(int id,float value); //通過(guò) ID 號(hào)寫(xiě)入現(xiàn)場(chǎng)值 BOOL GetvalueArrayFromID(int Num,int id[],float value[]);//成組讀取數(shù)據(jù)對(duì)象的現(xiàn)場(chǎng)值 BOOL SetvalueArrayFromID(int Num, int id[], float value[]);//成組寫(xiě)入數(shù)據(jù)對(duì)象的現(xiàn)場(chǎng)值 …… }; 4 結(jié)束語(yǔ) 實(shí)時(shí)數(shù)據(jù)庫(kù)設(shè)計(jì)是先進(jìn)控制軟件設(shè)計(jì)的重要組成部分,是難點(diǎn)部分,本文通過(guò)對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)的概述和分析,論述了實(shí)時(shí)數(shù)據(jù)庫(kù)模塊的實(shí)現(xiàn)方法,以面向?qū)ο蟮木幊谭绞浇o出了定義類(lèi)的部分代碼。實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)復(fù)雜,由于篇幅有限,本文沒(méi)有一一詳細(xì)說(shuō)明。筆者所開(kāi)發(fā)的實(shí)時(shí)數(shù)據(jù)庫(kù)可以與已經(jīng)開(kāi)發(fā)的先進(jìn)控制軟件連接起來(lái),已經(jīng)在實(shí)驗(yàn)室調(diào)試通過(guò),還有一些工作(如實(shí)時(shí)數(shù)據(jù)庫(kù)管理系統(tǒng)、實(shí)時(shí)數(shù)據(jù)庫(kù)接口等)也正在進(jìn)行。

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:基于嵌入式Linux的嵌入式Linu...

下一篇:微能WIN-V63矢量控制變頻器在...

中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來(lái)源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(www.treenowplaneincome.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來(lái)源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,均來(lái)自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來(lái)源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。