摘 要:本文介紹了一種通過基于動(dòng)態(tài)鏈接庫(kù)的插件技術(shù)實(shí)現(xiàn)監(jiān)控程序的在線功能擴(kuò)展的方法。通過西門子的PRODAVE軟件和VC++實(shí)現(xiàn)了對(duì)S7-300PLC的監(jiān)控,從而檢驗(yàn)了方案的可行性。
關(guān)鍵詞:動(dòng)態(tài)鏈接庫(kù)、插件、PRODAVE、VC++
1概述
在過程控制系統(tǒng)中,上位監(jiān)控程序已經(jīng)成了系統(tǒng)不可缺少的組成部分。通過上位監(jiān)控程序?qū)ο到y(tǒng)進(jìn)行控制可以使操作的難度和復(fù)雜度都大大降低。隨著計(jì)算機(jī)功能的日益增強(qiáng),監(jiān)控程序能完成的功能也越來越多,在有些情況下可以讓上位機(jī)協(xié)助下位機(jī)完成控制功能。
目前,上位機(jī)程序設(shè)計(jì)主要有兩種方式,其一是采用專門的組態(tài)軟件,如WinCC、組態(tài)王等;另外就是通過編程語(yǔ)言自行開發(fā)。第一種方法操作簡(jiǎn)單、效率高、對(duì)開發(fā)人員的要求相對(duì)較低,但成本較高;第二種方法相對(duì)要復(fù)雜,要求開發(fā)者具有較高的編程水平,開發(fā)周期長(zhǎng),但與第一種方法比具有靈活、成本低的優(yōu)點(diǎn)。對(duì)于規(guī)模較小的項(xiàng)目出于降低成本的考慮可以采用第二種方法進(jìn)行開發(fā)。采用第二種方法就需要解決一些額外的技術(shù)難點(diǎn),比如系統(tǒng)已經(jīng)投入運(yùn)行后可能會(huì)由于生產(chǎn)規(guī)模的擴(kuò)大等原因需要增加額外的設(shè)備或模塊,這種情況下就要求監(jiān)控程序也要做出相應(yīng)的改動(dòng)。這時(shí)采用第二種方法開發(fā)的程序一般就會(huì)遇到修改工作量大、需要停機(jī)升級(jí)程序的問題。特別對(duì)于后一問題,在上位機(jī)協(xié)助下位機(jī)完成控制功能時(shí)是應(yīng)該盡量避免出現(xiàn)的。本文就是針對(duì)這一問題提出的基于插件技術(shù)的解決方案。
2插件背景知 識(shí)
2.1插件原理
插件是一種遵循一定規(guī)范的應(yīng)用程序接口的程序,可以理解為一個(gè)插件就是一種新功能。實(shí)現(xiàn)插件功能對(duì)插件容器和插件本身都要進(jìn)行考慮。這里首先要解決的問題就是插件容器不知道將來要安裝的插件要實(shí)現(xiàn)什么功能,而插件本身可能需要知道一些插件容器的信息來更好的實(shí)現(xiàn)與容器之間的結(jié)合。基于這種考慮,就需要在它們之間定義具體的接口(一般采用接口函數(shù)),接口的實(shí)際功能完全依賴于插件本身,如圖1所示。
[align=center]

圖1 插件結(jié)構(gòu)圖[/align]
采用插件的主要目的就是在不改動(dòng)監(jiān)控程序(插件容器)的前提下擴(kuò)展監(jiān)控程序的功能,因此,應(yīng)該在程序設(shè)計(jì)之初就要考慮接口函數(shù)的參數(shù)和返回類型。另外,由于插件一般是在程序運(yùn)行過程中安裝的,那么在下一次程序啟動(dòng)的時(shí)候希望程序能自動(dòng)的添加已經(jīng)安裝過的插件,因此要使監(jiān)控程序?qū)σ呀?jīng)安裝的插件進(jìn)行統(tǒng)一管理。
2.2動(dòng)態(tài)鏈接庫(kù)(DLL)
DLL是建立在客戶/服務(wù)器通信的概念上,包含若干函數(shù)、類或資源的庫(kù)文件。函數(shù)和數(shù)據(jù)被存儲(chǔ)在一個(gè)DLL(服務(wù)器)上并由一個(gè)或多個(gè)客戶導(dǎo)出而使用,這些客戶可以是應(yīng)用程序或者是其它的DLL。
微軟的Visual C++支持三種DLL,它們分別是Non-MFC DLL(非MFC動(dòng)態(tài)庫(kù))、Regular DLL(常規(guī)DLL)、Extension DLL(擴(kuò)展DLL)。Non-MFC DLL指的是不用MFC(微軟基礎(chǔ)類)的類庫(kù)結(jié)構(gòu),直接用C語(yǔ)言寫的DLL,其導(dǎo)出的函數(shù)是標(biāo)準(zhǔn)的C接口,能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用。Regular DLL和下述的Extension DLL一樣,是用MFC類庫(kù)編寫的,它的一個(gè)明顯的特點(diǎn)是在源文件里有一個(gè)繼承CWinApp的類(注意:此類DLL雖然從CWinApp派生,但沒有消息循環(huán),被導(dǎo)出的函數(shù)是C函數(shù)、C++類或者C++成員函數(shù)),調(diào)用常規(guī)DLL的應(yīng)用程序不必是MFC應(yīng)用程序,只要是能調(diào)用類C函數(shù)的應(yīng)用程序就可以,它們可以是在Visual C++、Dephi、Visual Basic、Borland C等編譯環(huán)境下利用DLL開發(fā)的應(yīng)用程序。
常規(guī)DLL又可細(xì)分成靜態(tài)鏈接到MFC和動(dòng)態(tài)鏈接到MFC上的。與常規(guī)DLL相比,使用擴(kuò)展DLL用于導(dǎo)出增強(qiáng)MFC基礎(chǔ)類的函數(shù)或子類,用這種類型的動(dòng)態(tài)鏈接庫(kù),可以用來輸出一個(gè)從MFC所繼承下來的類。
擴(kuò)展DLL是使用MFC的動(dòng)態(tài)鏈接版本所創(chuàng)建的,并且它只被用MFC類庫(kù)所編寫的應(yīng)用程序所調(diào)用。擴(kuò)展DLL 和常規(guī)DLL不一樣,它沒有一個(gè)從CWinApp繼承而來的類的對(duì)象,所以,開發(fā)人員必須在DLL中的DllMain函數(shù)添加初始化代碼和結(jié)束代碼。
2.3插件DLL特性
插件DLL的最大特點(diǎn)就是它具有固定的結(jié)構(gòu)。作為容器的監(jiān)控程序一旦發(fā)布,插件的結(jié)構(gòu)也就不能再改變了。因此良好的插件結(jié)構(gòu)設(shè)計(jì)對(duì)將來的功能擴(kuò)展來說至關(guān)重要。
為了提高開發(fā)效率,選用支持MFC的DLL是一個(gè)不錯(cuò)的選擇。需要注意的是如果要從DLL導(dǎo)出繼承自MFC的類的對(duì)象最好使用擴(kuò)展DLL,否則可能導(dǎo)致DLL中的對(duì)象和導(dǎo)出的對(duì)象存在差異。
3示例編程
以下示例簡(jiǎn)單的實(shí)現(xiàn)了對(duì)監(jiān)控畫面的擴(kuò)展。監(jiān)控主程序只對(duì)一個(gè)PLC進(jìn)行監(jiān)控,通過后續(xù)的插件可以在不影響主程序的前提下實(shí)現(xiàn)對(duì)更多PLC的監(jiān)控(這里只擴(kuò)展了一臺(tái))。
3.1 插件部分
在VC 6.0的AppWizard中選擇”MFC AppWizard(dll)”,并在下一步選擇” MFC Extension DLL”(因?yàn)樵诖死幸獙?dǎo)出繼承自MFC的類的對(duì)象)。在資源中插入一對(duì)話框模板,設(shè)置屬性為”Child”、”Thin”、”Title bar”,并為它創(chuàng)建一個(gè)以CPropertyPage為基類的新類CPage。接下來要做的就是進(jìn)行數(shù)據(jù)采集和監(jiān)控界面的設(shè)計(jì)。PRODAVE是用于PC與S7系列PLC之間的數(shù)據(jù)鏈接通信的工具箱。通過PC的MPI通信處理器,例如CP5511、CP5611,或PC/MPI適配器(PC-Adaptor),可以方便地在PLC與PC間建立數(shù)據(jù)鏈接[3]。值得注意的是,由于使用了MFC擴(kuò)展DLL,所以必須動(dòng)態(tài)加載PRODAVE的DLL文件。方法如下:
?、?定義函數(shù)指針
typedef int (WINAPI *Ploadtool)(char,char *,adr_table_type *);
?、?加載DLL并獲得函數(shù)指針
hProdave=LoadLibrary("W95_s7.dll");
Ploadtool loadtool=(Ploadtool)GetProcAddress(hProdave,"load_tool");
Punloadtool unloadtool=(Punloadtool)GetProcAddress(hProdave,"unload_tool");
?、?調(diào)用函數(shù)
loadtool(1, "S7ONLINE", &adr_table);
完成插件的具體功能后還需要實(shí)現(xiàn)導(dǎo)出函數(shù):
void showprop(void**dlg)
?。?*dlg=new CPdlg;
?。?
3.2 監(jiān)控程序
因?yàn)椴寮﨑LL導(dǎo)出的是一個(gè)屬性頁(yè),所以可以在監(jiān)控程序中添加此屬性頁(yè)。結(jié)合前文所述,監(jiān)控程序所要實(shí)現(xiàn)的功能主要有主體監(jiān)控功能、加載插件DLL、啟動(dòng)時(shí)自動(dòng)加載插件。
?、?主體監(jiān)控功能
這里實(shí)現(xiàn)了監(jiān)控程序的大部分功能,如主監(jiān)控畫面的設(shè)計(jì)等,但此處不是本文所要論述的重點(diǎn)。
② 加載插件DLL
此功能在函數(shù)BOOL CTestdllDlg::CreateObjectFromPath CreatePlugPage(CString name)中實(shí)現(xiàn):
BOOL CTestdllDlg::CreatePlugPage(CString name)
?。鸅OOL brt=FALSE;
PAGE temp;
if(name){
temp.hdll=LoadLibrary(name);
if(temp.hdll)
?。?fun func=(fun)GetProcAddress(temp.hdll,"showprop");
if(func)
?。?func((void**)&temp.page);
s.AddPage(temp.page);
brt= -1!=pagelist.Add(temp);
?。?
?。?
?。?
if(!brt)
FreeLibrary(temp.hdll);
return brt;
?。?
創(chuàng)建目錄并保存DLL文件:
CreateDirectory(m_strPlugFile, NULL); // m_strPlugFile為指定目錄名
if (!CopyFile(filename, m_strPlugFile, TRUE)) // filename為插件DLL文件名
{ return;
?。?
?、?啟動(dòng)時(shí)自動(dòng)加載插件
此功能在函數(shù)BOOL CTestdllDlg::CreateObjectFromPath(LPCTSTR szPath)中實(shí)現(xiàn):
BOOL CTestdllDlg::CreateObjectFromPath(LPCTSTR szPath)
?。?CString strPath = szPath;
CString strFindFile = szPath;
strFindFile += "\\*.dll";
WIN32_FIND_DATA wfd;
HANDLE hf = FindFirstFile(strFindFile, &wfd);
if (INVALID_HANDLE_VALUE != hf){
CreatePlugPage(strPath + "\\" + wfd.cFileName);
while (FindNextFile(hf, &wfd)){
CreatePlugPage(strPath + "\\" + wfd.cFileName);
?。?
FindClose(hf);
?。?
return TRUE;
?。?
4總結(jié)
很多文獻(xiàn)資料都曾介紹過監(jiān)控軟件的開發(fā)[4],但卻很少涉及成熟的開發(fā)軟件所具有的在線修改功能,這就限制了監(jiān)控軟件的應(yīng)用范圍。本文中提出的方法正是對(duì)這一不足進(jìn)行的必要補(bǔ)充。示例程序成功實(shí)現(xiàn)了在主監(jiān)控程序的基礎(chǔ)上通過插件的方法實(shí)現(xiàn)對(duì)更多PLC的監(jiān)控,說明了監(jiān)控程序是如何應(yīng)對(duì)生產(chǎn)設(shè)備增加這一情況的。采用這種方法不僅能成功解決自主開發(fā)的監(jiān)控程序需要停機(jī)進(jìn)行功能擴(kuò)展的問題,而且不需要對(duì)主監(jiān)控程序進(jìn)行任何改動(dòng),從而大大降低了工作量。
參考文獻(xiàn):
[1] 王艷. 用VC制作動(dòng)態(tài)連接庫(kù). 北京:微計(jì)算機(jī)信息. 2003.5: 70~71.
[2] 廖常初. S7-300/400 PLC應(yīng)用技術(shù). 北京: 機(jī)械工業(yè)出版社.2005.
[3] 姜建芳、蘇少鈺等.西門子S7-300系列PLC與PC機(jī)通信實(shí)現(xiàn)的研究.制造業(yè)自動(dòng)化.2003.1:52~54.
[4] 王亞民、陳青等.組態(tài)軟件設(shè)計(jì)與開發(fā).西安:西安電子科技大學(xué)出版社.2003.
[5] MSDN Library online. Microsoft corporation.