新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 模式在主控機(jī)軟件中的應(yīng)用與研究

模式在主控機(jī)軟件中的應(yīng)用與研究

作者: 時(shí)間:2012-01-19 來源:網(wǎng)絡(luò) 收藏

1 引言

目前采用PC機(jī)與多臺(tái)單片機(jī)構(gòu)成的分布式系統(tǒng)、工業(yè)控制系統(tǒng)、數(shù)據(jù)傳輸系統(tǒng)等得到廣泛應(yīng)用。它既利用了單片機(jī)價(jià)格低、功能強(qiáng)、抗干擾能力好以及面向控制等優(yōu)點(diǎn)來構(gòu)建適宜分布于工業(yè)現(xiàn)場、使用方便靈活的監(jiān)控站或下位機(jī),又結(jié)合PC機(jī)豐富的軟硬件資源,提供管理功能強(qiáng)大、人機(jī)界面友好的操作平臺(tái)。

隨著社會(huì)經(jīng)濟(jì)發(fā)展,個(gè)人和單位的貴重物品、重要文件、有價(jià)單證等日益增多,迫切需要安全保管。銀行開設(shè)保管箱租賃業(yè)務(wù)把專用保管箱出租給客戶滿足了客戶需求。銀行保管箱系統(tǒng)由軟件部分和硬件部分構(gòu)成:軟件部分支持客戶管理、保管箱狀態(tài)監(jiān)視等;硬件部分包括PC機(jī)與單片機(jī)通信、單片機(jī)與單片機(jī)通信等。

由PC機(jī)與多個(gè)單片機(jī)組成的應(yīng)用系統(tǒng),一方面需要穩(wěn)定可靠的數(shù)據(jù)通信,另一方面PC機(jī)端也需要一個(gè)可靠、易維護(hù)、可復(fù)用的軟件管理系統(tǒng)。在采用面向?qū)ο蟮能浖O(shè)計(jì)與分析過程中模式技術(shù)起著越來越重要的作用。模式是對(duì)特定上下文中遇到的一般性問題的可重用解決方案的概要。模式可以分為三個(gè)抽象層次[1]:體系結(jié)構(gòu)模式,,實(shí)現(xiàn)模式。體系結(jié)構(gòu)模式表示軟件系統(tǒng)基礎(chǔ)的結(jié)構(gòu)組織方案,例如,分層應(yīng)用程序模式。描述了特定場景下用來解決一般設(shè)計(jì)問題的類和相互通信的對(duì)象[2]. 實(shí)現(xiàn)模式是與特定的編程語言相關(guān)的模式。每個(gè)下層模式都是對(duì)上一層的優(yōu)化。使用模式技術(shù)能夠設(shè)計(jì)出一個(gè)滿足可靠、易維護(hù)、可復(fù)用系統(tǒng)的需要。文中將依保管箱系統(tǒng)為例闡述模式在PC機(jī)與多個(gè)單片機(jī)組成系統(tǒng)中的應(yīng)用。

2 系統(tǒng)總體結(jié)構(gòu)及業(yè)務(wù)流程

保管箱系統(tǒng)總體結(jié)構(gòu)圖如圖1所示。系統(tǒng)由一臺(tái)主控計(jì)算機(jī)(PC機(jī))與五臺(tái)下位機(jī)(基于8051的單片機(jī))通過RS485總線組成網(wǎng)絡(luò)。由于RS485串行通信具有距離長、抗噪聲能力強(qiáng)的優(yōu)點(diǎn)[3],所以在PC機(jī)與多臺(tái)單片機(jī)構(gòu)成的系統(tǒng)中常采用RS485技術(shù)。圖1中每個(gè)保險(xiǎn)箱內(nèi)嵌入一個(gè)單片機(jī)組成一個(gè)嵌入式系統(tǒng)。每個(gè)鑰匙也由單片機(jī)構(gòu)成,它與對(duì)應(yīng)的下位機(jī)點(diǎn)對(duì)點(diǎn)相連,我們稱下位機(jī)為鑰匙架。

圖1 系統(tǒng)總體結(jié)構(gòu)圖

系統(tǒng)業(yè)務(wù)流程:在銀行的營業(yè)前臺(tái)客戶在上進(jìn)行身份驗(yàn)證后,被分配一把鑰匙,客戶從鑰匙架上取走此鑰匙,然后帶著鑰匙與自己租用的保險(xiǎn)箱中的單片機(jī)進(jìn)行點(diǎn)對(duì)點(diǎn)通信打開箱子??蛻籼幚硗陿I(yè)務(wù)后,用鑰匙鎖上保管箱并把它帶回到前臺(tái)放回原地,這時(shí)獲得此下位機(jī)的最新狀態(tài)。

3 軟件的體系結(jié)構(gòu)模式

分層是軟件設(shè)計(jì)中解決復(fù)雜問題的最常用技術(shù)。高層使用低層提供的各種服務(wù),而低層并不關(guān)注高層的存在。一般情況下采用層技術(shù)可以使各類開發(fā)者更專注于本層的工作而不需要知道其它層的情況。采用分層技術(shù)并根據(jù)分層應(yīng)用程序模式[1]可把主控機(jī)軟件設(shè)計(jì)為三層:表示層、業(yè)務(wù)層與。表示層處理用戶與軟件系統(tǒng)之間的交互;業(yè)務(wù)層處理問題域中的各種業(yè)務(wù);負(fù)責(zé)向業(yè)務(wù)層提供通信支持,并保證向上層提供信息的可靠性和及時(shí)性。一般當(dāng)系統(tǒng)需要數(shù)據(jù)庫支持永久保存數(shù)據(jù)時(shí),可以增加數(shù)據(jù)存取層作為與同處一層的層,如圖2所示。

圖2 主控機(jī)軟件的三層體系結(jié)構(gòu)模式

保管箱系統(tǒng)中,主控機(jī)與下位機(jī)之間的通信封裝在通信層中,業(yè)務(wù)層上需要鑰匙時(shí),它只要向通信層提出請求,由通信層判斷哪一臺(tái)下位機(jī)可以提供鑰匙,并在獲取下位機(jī)信息后提供給業(yè)務(wù)層,通信層要保證提供信息的可靠性和及時(shí)性。通信層是整個(gè)軟件系統(tǒng)的基礎(chǔ),使用可以滿足此層所需的高可靠性要求。

4 通信層與下位機(jī)的通信原理

通信層發(fā)送被呼叫的下位機(jī)地址,等待下位機(jī)的應(yīng)答,若應(yīng)答信號(hào)正確則發(fā)送控制命令;若應(yīng)答信號(hào)不正確則再發(fā)送被呼叫的地址,并等待接收應(yīng)答信息。對(duì)同一下位機(jī)多次呼叫而在規(guī)定時(shí)間內(nèi)無應(yīng)答信號(hào)或應(yīng)答信號(hào)不正確,則提示出錯(cuò)。

5 通信層中的設(shè)計(jì)模式

根據(jù)設(shè)計(jì)模式的目的,設(shè)計(jì)模式可分為創(chuàng)建型、結(jié)構(gòu)型和行為型三類[2]。結(jié)構(gòu)模式和行為模式被用來組織類或?qū)ο笾g的關(guān)系和職責(zé),形成應(yīng)用程序的構(gòu)架;創(chuàng)建型模式用于生成和管理對(duì)象[4],包括單件模式、等,其中是利用單件模式發(fā)展而成的。使用創(chuàng)建型模式把對(duì)象的使用與對(duì)象的生成和管理分離,使類的職責(zé)更加單一、明確,可以提高軟件的可維護(hù)性。通信層采用隱藏了PC機(jī)與單片機(jī)之間通信,提高了業(yè)務(wù)層的可測試性。如果通信層接口比較復(fù)雜,則可以在通信層上采用外觀模式(Facade Pattern)[2]為上層提供一個(gè)簡單接口以簡化對(duì)通信層的使用。保管箱系統(tǒng)中通信層利用對(duì)象池模式生成下位機(jī)對(duì)象供業(yè)務(wù)層使用,使得業(yè)務(wù)層只專注于業(yè)務(wù)實(shí)現(xiàn)而不再關(guān)注對(duì)象的生成方式。

5.1單件模式

單件模式(Singleton Pattern)[2]屬于創(chuàng)建型模式,它讓類自身負(fù)責(zé)創(chuàng)建自己的實(shí)例,并保證這個(gè)實(shí)例是此類的唯一實(shí)例,而且它提供一個(gè)全局獲取點(diǎn)來獲取此實(shí)例。用C#描述的算法框架如下:

class Singleton{
private static Singleton instance;

private Singleton() {} // 保證此類在類外部不被實(shí)例化
public static Singleton Instance(){ //提供一個(gè)全局獲取點(diǎn)
if (instance == null){ // 保證此實(shí)例的唯一性

instance = new Singleton(); //類自身創(chuàng)建自己的實(shí)例
}
return instance;
}

}

5.2對(duì)象池模式

對(duì)象池模式(Object Pool Pattern)是由單件模式發(fā)展而來的創(chuàng)建型模式[4]。當(dāng)創(chuàng)建一個(gè)對(duì)象的代價(jià)很高或使用的某個(gè)類的對(duì)象數(shù)目固定時(shí),可以用對(duì)象池模式復(fù)用這些對(duì)象。這些對(duì)象的產(chǎn)生和管理必須遵守一些明確的規(guī)則,例如如何管理一個(gè)對(duì)象、多少對(duì)象被產(chǎn)生、當(dāng)這些對(duì)象完成它們當(dāng)前任務(wù)后如何復(fù)用它們等等。保管箱系統(tǒng)中,每個(gè)下位機(jī)是一個(gè)對(duì)象,下位機(jī)對(duì)象的數(shù)目是固定,因此在通信層中可以引入對(duì)象池模式生成和管理這些對(duì)象。引入對(duì)象池模式后通信層的結(jié)構(gòu)如圖3所示。

圖3 引入對(duì)象池模式后通信層的結(jié)構(gòu)圖

對(duì)象池模式由下位機(jī)類KeyRack和類的管理者KeyRackManager類組成,此模式不僅包括下位機(jī)對(duì)象的產(chǎn)生,而且包括對(duì)下位機(jī)對(duì)象的管理。KeyRackManager處理成單件模式,它是唯一的可以產(chǎn)生KeyRack對(duì)象的類。它的數(shù)據(jù)域中有一個(gè)私有數(shù)組racks,用來存貯 KeyRack對(duì)象,在KeyRackManager的構(gòu)造函數(shù)中初始化racks。方法acquireKeyRack用來獲取一個(gè)有鑰匙的下位機(jī)對(duì)象,實(shí)現(xiàn)算法如下:

public KeyRack acquireKeyRack(){

int i=0;

while (i MAX){ //MAX是一個(gè)表示下位機(jī)個(gè)數(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ù)層需要一個(gè)KeyRack對(duì)象時(shí),只需要調(diào)用通信層上的方法acquireKeyRack即可獲得,而不需要知道此對(duì)象的產(chǎn)生方式。開發(fā)者根據(jù)需要也可以指定具體需要哪一個(gè)下位機(jī)對(duì)象。方法releaseKeyRack用來從racks中釋放一個(gè)鑰匙架對(duì)象。 statisticalState用來統(tǒng)計(jì)下位機(jī)對(duì)象的當(dāng)前狀態(tài)。

類KeyRack包含的屬性有:下位機(jī)標(biāo)識(shí)符ID、當(dāng)前下位機(jī)狀態(tài)Status(有鑰匙、無鑰匙或損壞)。方法getMCUState用來與編號(hào)為 id的下位機(jī)通信,并把獲取的狀態(tài)信息賦給屬性Status;此方法被類的構(gòu)造函數(shù)調(diào)用;在Windows系統(tǒng)下實(shí)現(xiàn)與下位機(jī)串行通信的方便途徑是采用專門處理串行通信的控件。

為了保證通信的可靠性,一方面在設(shè)計(jì)下位機(jī)軟件時(shí)采用狀態(tài)重復(fù)檢測、關(guān)鍵字重發(fā)等措施,另一方面在主控機(jī)軟件的通信層中采用雙重檢測。

在類KeyRack中對(duì)標(biāo)識(shí)符為pID的下位機(jī)狀態(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秒檢測一次編號(hào)為ID下位機(jī)

aTimer.Enabled=true;

}

private void OnTimedEvent(object source, ElapsedEventArgs e){ 

getMCUState( ID ); //與編號(hào)為ID的下位機(jī)進(jìn)行通信

}

在類KeyRackManager中對(duì)所有下位機(jī)狀態(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);

}

}

以上通過KeyRack和KeyRackManager實(shí)現(xiàn)雙重檢測,保證了通信層向業(yè)務(wù)層提供高可靠性的信息。

6 結(jié)束語

文中介紹了在PC機(jī)與多個(gè)單片機(jī)構(gòu)成的應(yīng)用系統(tǒng)中主控機(jī)管理軟件的三層體系結(jié)構(gòu)模式和通信層中采用對(duì)象池模式及雙重檢測技術(shù)。我們使用這些技術(shù)開發(fā)了銀行保管箱系統(tǒng),實(shí)際運(yùn)行證明,該系統(tǒng)穩(wěn)定、可靠、易維護(hù)。同時(shí),文中提出的帶有通信層的三層體系結(jié)構(gòu)模式及在通信層中采用對(duì)象池模式和雙重檢測方法可以推廣到其它相似的應(yīng)用系統(tǒng)中。

本文作者創(chuàng)新點(diǎn):明確提出主控機(jī)軟件的三層體系結(jié)構(gòu),使得主控機(jī)軟件設(shè)計(jì)更加清晰;對(duì)通信層的設(shè)計(jì)首次提出使用對(duì)象池模式和雙重檢測方法,保證此層具有高可靠性和較好的可維護(hù)性。

作者簡介:

沈峰,男,1976年生,安徽蒙城人,碩士研究生,主要研究領(lǐng)域?yàn)槊嫦驅(qū)ο蟮南到y(tǒng)模型和設(shè)計(jì)方法、計(jì)算機(jī)自動(dòng)控制。電子郵件:shenfeng@aiofm.ac.cn,

通信地址:安徽合肥市1125信箱網(wǎng)絡(luò)中心 230031;

李曉風(fēng),男,1966年生,安徽碭山人,研究員,碩士生導(dǎo)師,主要研究領(lǐng)域?yàn)橛?jì)算機(jī)自動(dò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.

參考文獻(xiàn)

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í)現(xiàn)S7-300PLC與PC機(jī)的普通串口通信[J]. 微計(jì)算機(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.



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉