徐蘭春
當前雖然分布式控制系統軟件眾多,但是均由專門廠商開發,擁有龐大的軟件包,價格昂貴。對于中小型企業來說,他們需要的是一套小巧、經濟實用、操作起來簡明方便、運行穩定可靠、易于擴展因此的系統,因此靈活、易于擴展、集成、高內聚、低耦合的小型分布式控制系統軟件需求很強。
采用國際電工委員會的IEC61131-3開放型國際編程標準編寫控制系統軟件,因此通用性得到保證,并且采用面向對象和基于組件的開發思想,使得開發各個模塊簡明直觀、易于復用和擴展。實時數據庫數據分類存儲,提高了系統運行效率和實時性。使用XML技術存儲數據,使得其網絡上易于傳輸。
結合中小型企業對控制軟件要求小巧、經濟實用、穩定可靠、易于擴展等需求特點,本文設計了DCS軟件系統結構系統的典型模塊包括:集中應用程序管理器、人機界面模塊(包括開發和運行兩部分)、實時數據庫模塊、歷史數據庫模塊、I/O驅動模塊,如圖1所示:

圖1 系統總體結構
系統通過I/O驅動模塊從工業現場設備獲得數據,對數據進行必要轉換,送到實時數據庫后,一方面通過人機界面模塊把需要顯示的信息顯示在屏幕上,另一方面按照組態要求和操作員的指令將控制指令信息送到工業現場設備,對執行機構實施控制。對于需要存儲的歷史變量,周期地從實時數據庫中獲取。
人機界面模塊完成系統和用戶之間的交互作用,主要包括以下功能:1)圖形顯示功能;2)圖形編輯功能;3)圖形文件管理。雖然工業現場設備種類繁多,外形各異,但是各種復雜設備的圖形均可由一些基本的圖元組成,我們可以用這些基本圖元構成復雜的工業流程畫面。用戶在人機界面模塊中的基本操作,如圖2所示:

圖2 人機界面模塊設計圖
本系統人機界面模塊采用C#編程語言,在Visual Studio 2010環境下開發,將圖元分為3種:基本圖元類、合成圖元類、動態圖元類。我們先抽象出一個抽象的抽象圖形類CGraphicObject,讓基本圖元類、合成圖元類、動態圖元類來繼承它,抽象圖形類有Color和Pen等字段,還有待實現的Draw()、SetData()、Inside()、Intersect()、DisplayFocus()等方法,用于保存圖元的數據、繪制圖元、和判斷圖元所處的位置。基本圖元類包括直線CLine、圓CCirc、方形CRect、折線Cbrok類等,他們繼承抽象圖形類CGraphicObject,實現父類的一些方法,并添加自己特有的字段和方法;下面是基本圖元類中方形類的定義:
public class CRectangle:CGraphicObject
{
public Point x;
public long w,h;
……
public CRectangle();
public CRectangle(Point x,long w,long h);
public CRectangle(Point x,Point y);
public override void SetData(Point x,Point y);
public override void Draw(Graphics g);
public override bool Inside(Rectangle R);
public override bool Intersect(Point p);
public override void DisplayFocus(Graphics g);
……
}
和基本圖元類一樣,合成圖元類仍然繼承基類CgraphicObject,所不同的是合成圖元類多了一些字段和方法:如字段Grapiclist用來存儲基本圖元對象,方法AddObj()和Remove(),用于增刪合成圖元內子對象;動態圖元類也是由基本圖元類CGraphicObject直接派生而得來的,它特有的屬性為sbdrawing和m_vnum等。Sbdrawing是一個數組,用來存儲大量的基本圖元對象,m_vnum是數組中具體某個圖元的下標,通過數它可以獲得相應的圖元,設置相應屬性,如是否顯示等。
繪制好的基本圖元,我們需要將它以文件的形式保存,在開發模塊中,圖元信息應保存在內存中以便用戶對圖元進行修改。一般有數組、鏈表、關系數據庫文件的保存方式。鏈表優點插入圖元和刪除圖元比較方便、缺點實現起來比較復雜。關系數據庫文件方式優點使用起來比較方便,缺點系統開銷太大,另外保密性不好。本系統采用數組的方式,這個方法實現起來比較容易。我們定義一個圖形數組類,包含一個List類型的字段list,用于在內存中保存已繪制的圖形(各個CgraphicObject對象),還有一些對字段list中對象進行操作的方法。繪圖完成時需要將所繪制的圖形保存起來以便下次使用,使用XmlSerializer進行串行化,將圖元對象以文件的形式保存起來,當需再次打開圖形使用時,通過Deserialize操作,再在把圖形對象繪制出來。
實時數據庫除了具有傳統數據庫的功能外,還有自己的特有的性質,主要實時性方面的要求。實時系統數據庫要求在規定的時間內完成指定的任務。
1.實時數據庫中數據的面向對象分析。在分布式控制軟件中,實時數據庫處理的對象一般是各種“點”(或稱為變量)。一個點由若干參數組成,系統以點的參數保存各種信息。一般來說,標準的點類型有:模擬I/O點類型、數字I/O點類型、模擬內存點類型、數字內存點類型、累計點類型等[1]。結合所有類型“點”的性質抽象出一個基類,基類直接派生出I/O點和內存點;I/O點派生出I/O數字點和I/O模擬點,內存點派生出內存數字點和內存模擬點。
2.實時數據庫系統數據的存儲策略。實時數據庫系統綜合采用了傳統數據庫系統、文件系統和內存數據庫系統。采用的存儲策略是:(1)對于長期需要保存的非共享數據,采用文件的方式存儲在磁盤或者其他可以移動的設備上,具體方法與本文基本圖元存儲類似。(2)對于工業控制過程中有些數據量很大,但又不經常使用的數據,將其存放在外存中,采用微軟的SQL Server,可以通過LINQ to SQL對數據進行存取操作。(3)對于每個采樣周期都要更新的數據采用內存數據庫系統存取。本文采用紅黑樹來組織這類數據,紅黑樹在二叉樹定義的基礎上,增加了自己的5條規則:1)任何一個節點不是紅色就是黑色;2)根節點為黑色;3)如果節點是紅色,則子節點必為黑色;4)任意一個葉子節點必須為黑色;5)任何以節點至NULL(樹尾端)的任何路徑,所含黑節點的個數必須相同。以上5條性質的強約束使得這棵樹是大致平衡的,因此對紅黑樹元素的操作(如查找)在最壞的情況下都是高效的。在一棵有100萬個節點的樹中查找任意元素最多需要約30次比較,實時性得到保證。為了便于對底層數據進行操作,采用C++開發實時數據庫。下面是紅黑樹類的定義:
class Rb_Tr
{
private:
Tr_node*root;//根指針
Tr_node*Nil;//哨兵結點指針
public:
Rb_Tr();
~Rb_Tr();
void Leaf_Rotate(Tr_node*x);//左旋轉
void Right_Rotate(Tr_node*x);//右旋轉
bool RB_Search(int k,Tr_node*&x);//搜索
bool RB_Insert(Tr_node*x);//插入
void RB_Insert_Fixup(Tr_node*z);//插入后調整紅黑樹結構
void RB_Create(int A[],int n);//創建紅黑樹
Tr_node *RB_Successor(Tr_node*x);//返回結點x的直接后繼
bool RB_Delete(int k);//刪除
void RB_Delete_Fixup(Tr_node*x);//刪除后調整紅黑樹結構
void LevelOrder_Traverse();//層次遍歷紅黑樹
void InOrder_Traverse();//中序遍歷紅黑樹
};
這樣,通過外存數據庫(SQL Server 2008)、文件管理系統、內存數據庫,既保證了數據的共享性、完整性、又節約了內存,保證了系統的響應速度。
歷史數據庫用于存儲實時數據庫中需要長期保存的數據,它按照一定的周期定時從實時數據庫中獲取數據。該模塊的設計主要用到了LINQ to SQL,它是.NET Framework 3.5版的一個組件,提供了用于將關系數據作為對象管理的運行時基礎結構[3]。在 LINQ to SQL 中,關系數據庫的數據模型映射到用開發人員所用的編程語言表示的對象模型。我們在SQL Server 2008中建立歷史數據庫,建立所需要存儲各類點的表,然后在Visual Studio 2010環境下使用對象關系設計器,把歷史數據庫中的數據模型映射到我們編程語言表示的對應模型上,從而實現歷史數據庫中的數據與編程語言(C#或C++)表示的對像模型數據(人機界面模塊中的數據和實時數據庫中的數據)交互。
本軟件開發的某船舶控制系統的壓載系統監控界面,圖中為自動控制模式下的壓載水置換模式工況。該模式下船的左舷向右舷排水或右舷向左舷排水以平衡船在水中的姿態。使用情況表明該系統穩定可靠、界面直觀易懂、實時性良好,并能根據各種工況進行相應的處理,如圖3所示:

圖3 壓載系統人機界面
本文結合中小企業對分布式控制系統軟件需求的特點,設計了一個小型的分布式控制系統軟件。文中重點論述了人機界面開發和實時數據庫兩個核心模塊,采用了面向對象的思想來設計分析各個模塊底層的數據結構,對高層軟件架構采用了基于組件開發的思想,使得軟件結構清晰合理,易于開發、便于擴展,同時使用起來穩定可靠、經濟適用。
[1]李建偉,郭宏.監控組態軟件的設計與開發[M].冶金工業出版社.2007.
[2]馬國華.監控組態軟件及其應用[M].清華大學出版社.2001.
[3]王小科,王軍.C#開發實戰1200例[M].清華大學出版社.2011.6.
[4]程潔.大話設計模式[M].清華大學出版社.2007.12.
[5]廖勇,李新峰,付志濤.Visual C#學習筆記[M].電子工業出版社.2008.5.
[6]付釗,呂海峰.組態軟件中實時數據庫的研究[J].計算機時代.2011.7.