模式在主控機軟件中的應用與研究
1 引言
目前采用PC機與多臺單片機構成的分布式系統、工業(yè)控制系統、數據傳輸系統等得到廣泛應用。它既利用了單片機價(jià)格低、功能強、抗干擾能力好以及面向控制等優(yōu)點(diǎn)來(lái)構建適宜分布于工業(yè)現場(chǎng)、使用方便靈活的監控站或下位機,又結合PC機豐富的軟硬件資源,提供管理功能強大、人機界面友好的操作平臺。
隨著(zhù)社會(huì )經(jīng)濟發(fā)展,個(gè)人和單位的貴重物品、重要文件、有價(jià)單證等日益增多,迫切需要安全保管。銀行開(kāi)設保管箱租賃業(yè)務(wù)把專(zhuān)用保管箱出租給客戶(hù)滿(mǎn)足了客戶(hù)需求。銀行保管箱系統由軟件部分和硬件部分構成:軟件部分支持客戶(hù)管理、保管箱狀態(tài)監視等;硬件部分包括PC機與單片機通信、單片機與單片機通信等。
由PC機與多個(gè)單片機組成的應用系統,一方面需要穩定可靠的數據通信,另一方面PC機端也需要一個(gè)可靠、易維護、可復用的軟件管理系統。在采用面向對象的軟件設計與分析過(guò)程中模式技術(shù)起著(zhù)越來(lái)越重要的作用。模式是對特定上下文中遇到的一般性問(wèn)題的可重用解決方案的概要。模式可以分為三個(gè)抽象層次[1]:體系結構模式,設計模式,實(shí)現模式。體系結構模式表示軟件系統基礎的結構組織方案,例如,分層應用程序模式。設計模式描述了特定場(chǎng)景下用來(lái)解決一般設計問(wèn)題的類(lèi)和相互通信的對象[2]. 實(shí)現模式是與特定的編程語(yǔ)言相關(guān)的模式。每個(gè)下層模式都是對上一層的優(yōu)化。使用模式技術(shù)能夠設計出一個(gè)滿(mǎn)足可靠、易維護、可復用系統的需要。文中將依保管箱系統為例闡述模式在PC機與多個(gè)單片機組成系統中的應用。
2 系統總體結構及業(yè)務(wù)流程
保管箱系統總體結構圖如圖1所示。系統由一臺主控計算機(PC機)與五臺下位機(基于8051的單片機)通過(guò)RS485總線(xiàn)組成網(wǎng)絡(luò )。由于RS485串行通信具有距離長(cháng)、抗噪聲能力強的優(yōu)點(diǎn)[3],所以在PC機與多臺單片機構成的系統中常采用RS485技術(shù)。圖1中每個(gè)保險箱內嵌入一個(gè)單片機組成一個(gè)嵌入式系統。每個(gè)鑰匙也由單片機構成,它與對應的下位機點(diǎn)對點(diǎn)相連,我們稱(chēng)下位機為鑰匙架。
圖1 系統總體結構圖
系統業(yè)務(wù)流程:在銀行的營(yíng)業(yè)前臺客戶(hù)在主控機上進(jìn)行身份驗證后,被分配一把鑰匙,客戶(hù)從鑰匙架上取走此鑰匙,然后帶著(zhù)鑰匙與自己租用的保險箱中的單片機進(jìn)行點(diǎn)對點(diǎn)通信打開(kāi)箱子??蛻?hù)處理完業(yè)務(wù)后,用鑰匙鎖上保管箱并把它帶回到前臺放回原地,這時(shí)主控機獲得此下位機的最新?tīng)顟B(tài)。
3 主控機軟件的體系結構模式
分層是軟件設計中解決復雜問(wèn)題的最常用技術(shù)。高層使用低層提供的各種服務(wù),而低層并不關(guān)注高層的存在。一般情況下采用層技術(shù)可以使各類(lèi)開(kāi)發(fā)者更專(zhuān)注于本層的工作而不需要知道其它層的情況。采用分層技術(shù)并根據分層應用程序模式[1]可把主控機軟件設計為三層:表示層、業(yè)務(wù)層與通信層。表示層處理用戶(hù)與軟件系統之間的交互;業(yè)務(wù)層處理問(wèn)題域中的各種業(yè)務(wù);通信層負責向業(yè)務(wù)層提供通信支持,并保證向上層提供信息的可靠性和及時(shí)性。一般當系統需要數據庫支持永久保存數據時(shí),可以增加數據存取層作為與通信層同處一層的層,如圖2所示。
圖2 主控機軟件的三層體系結構模式
保管箱系統中,主控機與下位機之間的通信封裝在通信層中,業(yè)務(wù)層上需要鑰匙時(shí),它只要向通信層提出請求,由通信層判斷哪一臺下位機可以提供鑰匙,并在獲取下位機信息后提供給業(yè)務(wù)層,通信層要保證提供信息的可靠性和及時(shí)性。通信層是整個(gè)軟件系統的基礎,使用設計模式可以滿(mǎn)足此層所需的高可靠性要求。
4 通信層與下位機的通信原理
通信層發(fā)送被呼叫的下位機地址,等待下位機的應答,若應答信號正確則發(fā)送控制命令;若應答信號不正確則再發(fā)送被呼叫的地址,并等待接收應答信息。對同一下位機多次呼叫而在規定時(shí)間內無(wú)應答信號或應答信號不正確,則提示出錯。
5 通信層中的設計模式
根據設計模式的目的,設計模式可分為創(chuàng )建型、結構型和行為型三類(lèi)[2]。結構模式和行為模式被用來(lái)組織類(lèi)或對象之間的關(guān)系和職責,形成應用程序的構架;創(chuàng )建型模式用于生成和管理對象[4],包括單件模式、對象池模式等,其中對象池模式是利用單件模式發(fā)展而成的。使用創(chuàng )建型模式把對象的使用與對象的生成和管理分離,使類(lèi)的職責更加單一、明確,可以提高軟件的可維護性。通信層采用對象池模式隱藏了PC機與單片機之間通信,提高了業(yè)務(wù)層的可測試性。如果通信層接口比較復雜,則可以在通信層上采用外觀(guān)模式(Facade Pattern)[2]為上層提供一個(gè)簡(jiǎn)單接口以簡(jiǎn)化對通信層的使用。保管箱系統中通信層利用對象池模式生成下位機對象供業(yè)務(wù)層使用,使得業(yè)務(wù)層只專(zhuān)注于業(yè)務(wù)實(shí)現而不再關(guān)注對象的生成方式。
5.1單件模式
單件模式(Singleton Pattern)[2]屬于創(chuàng )建型模式,它讓類(lèi)自身負責創(chuàng )建自己的實(shí)例,并保證這個(gè)實(shí)例是此類(lèi)的唯一實(shí)例,而且它提供一個(gè)全局獲取點(diǎn)來(lái)獲取此實(shí)例。用C#描述的算法框架如下:
class Singleton{
private static Singleton instance;
private Singleton() {} // 保證此類(lèi)在類(lèi)外部不被實(shí)例化
public static Singleton Instance(){ //提供一個(gè)全局獲取點(diǎn)
if (instance == null){ // 保證此實(shí)例的唯一性
instance = new Singleton(); //類(lèi)自身創(chuàng )建自己的實(shí)例
}
return instance;
}
}
5.2對象池模式
對象池模式(Object Pool Pattern)是由單件模式發(fā)展而來(lái)的創(chuàng )建型模式[4]。當創(chuàng )建一個(gè)對象的代價(jià)很高或使用的某個(gè)類(lèi)的對象數目固定時(shí),可以用對象池模式復用這些對象。這些對象的產(chǎn)生和管理必須遵守一些明確的規則,例如如何管理一個(gè)對象、多少對象被產(chǎn)生、當這些對象完成它們當前任務(wù)后如何復用它們等等。保管箱系統中,每個(gè)下位機是一個(gè)對象,下位機對象的數目是固定,因此在通信層中可以引入對象池模式生成和管理這些對象。引入對象池模式后通信層的結構如圖3所示。
圖3 引入對象池模式后通信層的結構圖
對象池模式由下位機類(lèi)KeyRack和類(lèi)的管理者KeyRackManager類(lèi)組成,此模式不僅包括下位機對象的產(chǎn)生,而且包括對下位機對象的管理。KeyRackManager處理成單件模式,它是唯一的可以產(chǎn)生KeyRack對象的類(lèi)。它的數據域中有一個(gè)私有數組racks,用來(lái)存貯 KeyRack對象,在KeyRackManager的構造函數中初始化racks。方法acquireKeyRack用來(lái)獲取一個(gè)有鑰匙的下位機對象,實(shí)現算法如下:
public KeyRack acquireKeyRack(){
int i=0;
while (i MAX){ //MAX是一個(gè)表示下位機個(gè)數的常數
if (racks[i].Status.Equals(KeyRackState.有鑰匙)){
break;
}
i++;
}
if (i>= MAX){
throw new Exception("當前沒(méi)有可用鑰匙");
}
return racks[i];
}
以上算法說(shuō)明當業(yè)務(wù)層需要一個(gè)KeyRack對象時(shí),只需要調用通信層上的方法acquireKeyRack即可獲得,而不需要知道此對象的產(chǎn)生方式。開(kāi)發(fā)者根據需要也可以指定具體需要哪一個(gè)下位機對象。方法releaseKeyRack用來(lái)從racks中釋放一個(gè)鑰匙架對象。 statisticalState用來(lái)統計下位機對象的當前狀態(tài)。
類(lèi)KeyRack包含的屬性有:下位機標識符ID、當前下位機狀態(tài)Status(有鑰匙、無(wú)鑰匙或損壞)。方法getMCUState用來(lái)與編號為 id的下位機通信,并把獲取的狀態(tài)信息賦給屬性Status;此方法被類(lèi)的構造函數調用;在Windows系統下實(shí)現與下位機串行通信的方便途徑是采用專(zhuān)門(mén)處理串行通信的控件。
為了保證通信的可靠性,一方面在設計下位機軟件時(shí)采用狀態(tài)重復檢測、關(guān)鍵字重發(fā)等措施,另一方面在主控機軟件的通信層中采用雙重檢測。
在類(lèi)KeyRack中對標識符為pID的下位機狀態(tài)進(jìn)行定時(shí)檢測,算法如下:
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的下位機進(jìn)行通信
}
在類(lèi)KeyRackManager中對所有下位機狀態(tài)進(jìn)行定時(shí)巡察,算法如下:
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);
}
}
以上通過(guò)KeyRack和KeyRackManager實(shí)現雙重檢測,保證了通信層向業(yè)務(wù)層提供高可靠性的信息。
6 結束語(yǔ)
文中介紹了在PC機與多個(gè)單片機構成的應用系統中主控機管理軟件的三層體系結構模式和通信層中采用對象池模式及雙重檢測技術(shù)。我們使用這些技術(shù)開(kāi)發(fā)了銀行保管箱系統,實(shí)際運行證明,該系統穩定、可靠、易維護。同時(shí),文中提出的帶有通信層的三層體系結構模式及在通信層中采用對象池模式和雙重檢測方法可以推廣到其它相似的應用系統中。
本文作者創(chuàng )新點(diǎn):明確提出主控機軟件的三層體系結構,使得主控機軟件設計更加清晰;對通信層的設計首次提出使用對象池模式和雙重檢測方法,保證此層具有高可靠性和較好的可維護性。
作者簡(jiǎn)介:
沈峰,男,1976年生,安徽蒙城人,碩士研究生,主要研究領(lǐng)域為面向對象的系統模型和設計方法、計算機自動(dòng)控制。電子郵件:shenfeng@aiofm.ac.cn,
通信地址:安徽合肥市1125信箱網(wǎng)絡(luò )中心 230031;
李曉風(fēng),男,1966年生,安徽碭山人,研究員,碩士生導師,主要研究領(lǐng)域為計算機自動(dòng)控制、現代軟件工程方法等。
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實(shí)現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.
評論