模式在主控機軟件中的應(yīng)用與研究
1 引言
目前采用PC機與多臺單片機構(gòu)成的分布式系統(tǒng)、工業(yè)控制系統(tǒng)、數(shù)據(jù)傳輸系統(tǒng)等得到廣泛應(yīng)用。它既利用了單片機價格低、功能強、抗干擾能力好以及面向控制等優(yōu)點來構(gòu)建適宜分布于工業(yè)現(xiàn)場、使用方便靈活的監(jiān)控站或下位機,又結(jié)合PC機豐富的軟硬件資源,提供管理功能強大、人機界面友好的操作平臺。
隨著社會經(jīng)濟發(fā)展,個人和單位的貴重物品、重要文件、有價單證等日益增多,迫切需要安全保管。銀行開設(shè)保管箱租賃業(yè)務(wù)把專用保管箱出租給客戶滿足了客戶需求。銀行保管箱系統(tǒng)由軟件部分和硬件部分構(gòu)成:軟件部分支持客戶管理、保管箱狀態(tài)監(jiān)視等;硬件部分包括PC機與單片機通信、單片機與單片機通信等。
由PC機與多個單片機組成的應(yīng)用系統(tǒng),一方面需要穩(wěn)定可靠的數(shù)據(jù)通信,另一方面PC機端也需要一個可靠、易維護、可復(fù)用的軟件管理系統(tǒng)。在采用面向?qū)ο蟮能浖O(shè)計與分析過程中模式技術(shù)起著越來越重要的作用。模式是對特定上下文中遇到的一般性問題的可重用解決方案的概要。模式可以分為三個抽象層次[1]:體系結(jié)構(gòu)模式,設(shè)計模式,實現(xiàn)模式。體系結(jié)構(gòu)模式表示軟件系統(tǒng)基礎(chǔ)的結(jié)構(gòu)組織方案,例如,分層應(yīng)用程序模式。設(shè)計模式描述了特定場景下用來解決一般設(shè)計問題的類和相互通信的對象[2]. 實現(xiàn)模式是與特定的編程語言相關(guān)的模式。每個下層模式都是對上一層的優(yōu)化。使用模式技術(shù)能夠設(shè)計出一個滿足可靠、易維護、可復(fù)用系統(tǒng)的需要。文中將依保管箱系統(tǒng)為例闡述模式在PC機與多個單片機組成系統(tǒng)中的應(yīng)用。
2 系統(tǒng)總體結(jié)構(gòu)及業(yè)務(wù)流程
保管箱系統(tǒng)總體結(jié)構(gòu)圖如圖1所示。系統(tǒng)由一臺主控計算機(PC機)與五臺下位機(基于8051的單片機)通過RS485總線組成網(wǎng)絡(luò)。由于RS485串行通信具有距離長、抗噪聲能力強的優(yōu)點[3],所以在PC機與多臺單片機構(gòu)成的系統(tǒng)中常采用RS485技術(shù)。圖1中每個保險箱內(nèi)嵌入一個單片機組成一個嵌入式系統(tǒng)。每個鑰匙也由單片機構(gòu)成,它與對應(yīng)的下位機點對點相連,我們稱下位機為鑰匙架。
圖1 系統(tǒng)總體結(jié)構(gòu)圖
系統(tǒng)業(yè)務(wù)流程:在銀行的營業(yè)前臺客戶在主控機上進行身份驗證后,被分配一把鑰匙,客戶從鑰匙架上取走此鑰匙,然后帶著鑰匙與自己租用的保險箱中的單片機進行點對點通信打開箱子??蛻籼幚硗陿I(yè)務(wù)后,用鑰匙鎖上保管箱并把它帶回到前臺放回原地,這時主控機獲得此下位機的最新狀態(tài)。
3 主控機軟件的體系結(jié)構(gòu)模式
分層是軟件設(shè)計中解決復(fù)雜問題的最常用技術(shù)。高層使用低層提供的各種服務(wù),而低層并不關(guān)注高層的存在。一般情況下采用層技術(shù)可以使各類開發(fā)者更專注于本層的工作而不需要知道其它層的情況。采用分層技術(shù)并根據(jù)分層應(yīng)用程序模式[1]可把主控機軟件設(shè)計為三層:表示層、業(yè)務(wù)層與通信層。表示層處理用戶與軟件系統(tǒng)之間的交互;業(yè)務(wù)層處理問題域中的各種業(yè)務(wù);通信層負責(zé)向業(yè)務(wù)層提供通信支持,并保證向上層提供信息的可靠性和及時性。一般當(dāng)系統(tǒng)需要數(shù)據(jù)庫支持永久保存數(shù)據(jù)時,可以增加數(shù)據(jù)存取層作為與通信層同處一層的層,如圖2所示。
圖2 主控機軟件的三層體系結(jié)構(gòu)模式
保管箱系統(tǒng)中,主控機與下位機之間的通信封裝在通信層中,業(yè)務(wù)層上需要鑰匙時,它只要向通信層提出請求,由通信層判斷哪一臺下位機可以提供鑰匙,并在獲取下位機信息后提供給業(yè)務(wù)層,通信層要保證提供信息的可靠性和及時性。通信層是整個軟件系統(tǒng)的基礎(chǔ),使用設(shè)計模式可以滿足此層所需的高可靠性要求。
4 通信層與下位機的通信原理
通信層發(fā)送被呼叫的下位機地址,等待下位機的應(yīng)答,若應(yīng)答信號正確則發(fā)送控制命令;若應(yīng)答信號不正確則再發(fā)送被呼叫的地址,并等待接收應(yīng)答信息。對同一下位機多次呼叫而在規(guī)定時間內(nèi)無應(yīng)答信號或應(yīng)答信號不正確,則提示出錯。
5 通信層中的設(shè)計模式
根據(jù)設(shè)計模式的目的,設(shè)計模式可分為創(chuàng)建型、結(jié)構(gòu)型和行為型三類[2]。結(jié)構(gòu)模式和行為模式被用來組織類或?qū)ο笾g的關(guān)系和職責(zé),形成應(yīng)用程序的構(gòu)架;創(chuàng)建型模式用于生成和管理對象[4],包括單件模式、對象池模式等,其中對象池模式是利用單件模式發(fā)展而成的。使用創(chuàng)建型模式把對象的使用與對象的生成和管理分離,使類的職責(zé)更加單一、明確,可以提高軟件的可維護性。通信層采用對象池模式隱藏了PC機與單片機之間通信,提高了業(yè)務(wù)層的可測試性。如果通信層接口比較復(fù)雜,則可以在通信層上采用外觀模式(Facade Pattern)[2]為上層提供一個簡單接口以簡化對通信層的使用。保管箱系統(tǒng)中通信層利用對象池模式生成下位機對象供業(yè)務(wù)層使用,使得業(yè)務(wù)層只專注于業(yè)務(wù)實現(xiàn)而不再關(guān)注對象的生成方式。
5.1單件模式
單件模式(Singleton Pattern)[2]屬于創(chuàng)建型模式,它讓類自身負責(zé)創(chuàng)建自己的實例,并保證這個實例是此類的唯一實例,而且它提供一個全局獲取點來獲取此實例。用C#描述的算法框架如下:
class Singleton{
private static Singleton instance;
private Singleton() {} // 保證此類在類外部不被實例化
public static Singleton Instance(){ //提供一個全局獲取點
if (instance == null){ // 保證此實例的唯一性
instance = new Singleton(); //類自身創(chuàng)建自己的實例
}
return instance;
}
}
5.2對象池模式
對象池模式(Object Pool Pattern)是由單件模式發(fā)展而來的創(chuàng)建型模式[4]。當(dāng)創(chuàng)建一個對象的代價很高或使用的某個類的對象數(shù)目固定時,可以用對象池模式復(fù)用這些對象。這些對象的產(chǎn)生和管理必須遵守一些明確的規(guī)則,例如如何管理一個對象、多少對象被產(chǎn)生、當(dāng)這些對象完成它們當(dāng)前任務(wù)后如何復(fù)用它們等等。保管箱系統(tǒng)中,每個下位機是一個對象,下位機對象的數(shù)目是固定,因此在通信層中可以引入對象池模式生成和管理這些對象。引入對象池模式后通信層的結(jié)構(gòu)如圖3所示。
圖3 引入對象池模式后通信層的結(jié)構(gòu)圖
對象池模式由下位機類KeyRack和類的管理者KeyRackManager類組成,此模式不僅包括下位機對象的產(chǎn)生,而且包括對下位機對象的管理。KeyRackManager處理成單件模式,它是唯一的可以產(chǎn)生KeyRack對象的類。它的數(shù)據(jù)域中有一個私有數(shù)組racks,用來存貯 KeyRack對象,在KeyRackManager的構(gòu)造函數(shù)中初始化racks。方法acquireKeyRack用來獲取一個有鑰匙的下位機對象,實現(xiàn)算法如下:
public KeyRack acquireKeyRack(){
int i=0;
while (i MAX){ //MAX是一個表示下位機個數(shù)的常數(shù)
if (racks[i].Status.Equals(KeyRackState.有鑰匙)){
break;
}
i++;
}
if (i>= MAX){
throw new Exception("當(dāng)前沒有可用鑰匙");
}
return racks[i];
}
以上算法說明當(dāng)業(yè)務(wù)層需要一個KeyRack對象時,只需要調(diào)用通信層上的方法acquireKeyRack即可獲得,而不需要知道此對象的產(chǎn)生方式。開發(fā)者根據(jù)需要也可以指定具體需要哪一個下位機對象。方法releaseKeyRack用來從racks中釋放一個鑰匙架對象。 statisticalState用來統(tǒng)計下位機對象的當(dāng)前狀態(tài)。
類KeyRack包含的屬性有:下位機標(biāo)識符ID、當(dāng)前下位機狀態(tài)Status(有鑰匙、無鑰匙或損壞)。方法getMCUState用來與編號為 id的下位機通信,并把獲取的狀態(tài)信息賦給屬性Status;此方法被類的構(gòu)造函數(shù)調(diào)用;在Windows系統(tǒng)下實現(xiàn)與下位機串行通信的方便途徑是采用專門處理串行通信的控件。
為了保證通信的可靠性,一方面在設(shè)計下位機軟件時采用狀態(tài)重復(fù)檢測、關(guān)鍵字重發(fā)等措施,另一方面在主控機軟件的通信層中采用雙重檢測。
在類KeyRack中對標(biāo)識符為pID的下位機狀態(tài)進行定時檢測,算法如下:
public KeyRack(int pID)
{ …
ID=pID;
System.Timers.Timer aTimer=new System.Timers.Timer();//檢測初始化
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval=1000; //1秒檢測一次編號為ID下位機
aTimer.Enabled=true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e){
getMCUState( ID ); //與編號為ID的下位機進行通信
}
在類KeyRackManager中對所有下位機狀態(tài)進行定時巡察,算法如下:
private KeyRackManager( ){
System.Timers.Timer aTimer=new System.Timers.Timer(); //巡察初始化
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval=2000; //2秒鐘巡察一次
aTimer.Enabled=true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e){ //巡察
int i;
for (i=0;i MAX;i++){
racks[i].Status=racks[i].currentState(i);
}
}
以上通過KeyRack和KeyRackManager實現(xiàn)雙重檢測,保證了通信層向業(yè)務(wù)層提供高可靠性的信息。
6 結(jié)束語
文中介紹了在PC機與多個單片機構(gòu)成的應(yīng)用系統(tǒng)中主控機管理軟件的三層體系結(jié)構(gòu)模式和通信層中采用對象池模式及雙重檢測技術(shù)。我們使用這些技術(shù)開發(fā)了銀行保管箱系統(tǒng),實際運行證明,該系統(tǒng)穩(wěn)定、可靠、易維護。同時,文中提出的帶有通信層的三層體系結(jié)構(gòu)模式及在通信層中采用對象池模式和雙重檢測方法可以推廣到其它相似的應(yīng)用系統(tǒng)中。
本文作者創(chuàng)新點:明確提出主控機軟件的三層體系結(jié)構(gòu),使得主控機軟件設(shè)計更加清晰;對通信層的設(shè)計首次提出使用對象池模式和雙重檢測方法,保證此層具有高可靠性和較好的可維護性。
作者簡介:
沈峰,男,1976年生,安徽蒙城人,碩士研究生,主要研究領(lǐng)域為面向?qū)ο蟮南到y(tǒng)模型和設(shè)計方法、計算機自動控制。電子郵件:shenfeng@aiofm.ac.cn,
通信地址:安徽合肥市1125信箱網(wǎng)絡(luò)中心 230031;
李曉風(fēng),男,1966年生,安徽碭山人,研究員,碩士生導(dǎo)師,主要研究領(lǐng)域為計算機自動控制、現(xiàn)代軟件工程方法等。
SHEN Feng,Male, born in 1976,graduate student,His research interests include object-oriented system model and design methods , computer autocontrol.
LI Xiao-Feng,Male, born in 1966, professor,advisor of graduate students , His research interests includ computer autocontrol and modern software engineering methods.
參考文獻
1 Microsoft Corporation.Enterprise Solution Patterns Using Microsoft.Net version 1.0[M/OL]. http://msdn.microsoft.com/architecture/
2 Gamma, Helm, Johnson, et al. Design Patterns: Elements of Reusable Object-Oriented Software[M]. Boston:Addison-Wesley Publishing Company Inc, 1995.
3 李光明、李研、李茜.用VB實現(xiàn)S7-300PLC與PC機的普通串口通信[J]. 微計算機信息,2005,21卷(7-1期):35
4 Alan Shalloway,James R.Trott. Design Patterns Explained A New Perspective on Object-Oriented Design,Second Edition[M]. Boston: Addison-Wesley Publishing Company Inc, 2004.
評論