馮克平(上海工程技術(shù)大學(xué)資產(chǎn)管理及保障處,上海201260)
計(jì)算機(jī)在工業(yè)領(lǐng)域的廣泛應(yīng)用以及工業(yè)自動(dòng)化程度的迅速提高,人們對工業(yè)自動(dòng)化的要求也越來越高,表現(xiàn)在種類繁多的控制設(shè)備和過程監(jiān)控裝置在工業(yè)領(lǐng)域的廣泛應(yīng)用,使得傳統(tǒng)的工業(yè)軟件已無法滿足用戶的各種需求。在開發(fā)傳統(tǒng)的工業(yè)軟件時(shí),工控領(lǐng)域的工程師需通過手工或委托第三方編寫人機(jī)接口應(yīng)用軟件,開發(fā)周期長,效率低,可靠性差;或者購買專用的工控系統(tǒng),通常是封閉的、功能專一的很難與外界進(jìn)行數(shù)據(jù)交互,升級和增加功能都受到嚴(yán)重的限制。工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件的出現(xiàn),為根本改變這一狀況提供了可能[1]。
工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件是從分布式監(jiān)控系統(tǒng)(distributed control system,DCS)發(fā)展而來。它不僅保留了DCS所具有的大規(guī)模數(shù)據(jù)采集處理功能、數(shù)據(jù)通訊及信息管理和操作顯示功能,而且有其獨(dú)特的優(yōu)點(diǎn):實(shí)時(shí)多任務(wù)、接口開放、使用靈活、功能多樣、運(yùn)行可靠和可擴(kuò)充性。工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件,顧名思義它是以靈活多樣的組態(tài)方式而不是編程方式為用戶提供良好的開發(fā)界面和簡捷的使用方法,其預(yù)設(shè)的各種軟件模塊可以非常容易地實(shí)現(xiàn)和完成監(jiān)控層的各項(xiàng)功能[2]。
評價(jià)一個(gè)工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件的優(yōu)劣,首先要看它支持I/O設(shè)備的種類是否豐富,以及在組態(tài)了多種I/O設(shè)備下的目標(biāo)應(yīng)用程序的運(yùn)行速度,然后還要看它是否便于功能擴(kuò)展及版本升級。所以,如何開發(fā)一個(gè)具有支持豐富的I/O設(shè)備并有很好的數(shù)據(jù)通訊的實(shí)時(shí)性,這在開發(fā)工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件中占據(jù)了重要的地位。
本文以從事開發(fā)工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件和設(shè)備驅(qū)動(dòng)模塊的經(jīng)驗(yàn),分析當(dāng)今各種主流工控設(shè)備和標(biāo)準(zhǔn)通信協(xié)議,探討如何在Windows平臺上構(gòu)建一個(gè)適用于各種I/O通訊方式的設(shè)備驅(qū)動(dòng)模塊開發(fā)平臺,從設(shè)計(jì)思路到應(yīng)用實(shí)例,提出了開發(fā)設(shè)備驅(qū)動(dòng)模塊的框架結(jié)構(gòu)及其關(guān)鍵部分的過程實(shí)現(xiàn)。
在Windows平臺上開發(fā)的工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件系統(tǒng),要充分發(fā)揮Windows所具有的實(shí)時(shí)多任務(wù)特性,一般將數(shù)據(jù)讀寫、數(shù)據(jù)顯示打印等分成若干個(gè)任務(wù)線程來完成。主要模塊有:系統(tǒng)任務(wù)管理、數(shù)據(jù)采集、畫面顯示、報(bào)表打印、系統(tǒng)組態(tài)、設(shè)備驅(qū)動(dòng)模塊等[1]。通常工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件系統(tǒng)是由組態(tài)子系統(tǒng)和運(yùn)行子系統(tǒng)兩大部分構(gòu)成的[2]:
(1)組態(tài)子系統(tǒng)自動(dòng)化工程設(shè)計(jì)師為實(shí)施其控制方案,常在組態(tài)子系統(tǒng)支持下進(jìn)行應(yīng)用程序的系統(tǒng)生成工作。通過建立一系列用戶數(shù)據(jù)文件(如:設(shè)備配置文件IO.ini,圖形目標(biāo)文件Monitor.ini),供運(yùn)行子系統(tǒng)運(yùn)行時(shí)使用。組態(tài)子系統(tǒng)可由若干個(gè)組態(tài)程序模塊組成,如設(shè)備驅(qū)動(dòng)組態(tài)模塊、數(shù)據(jù)采集組態(tài)模塊、圖形顯示組態(tài)模塊、實(shí)時(shí)數(shù)據(jù)庫組態(tài)模塊等。
(2)運(yùn)行子系統(tǒng)在系統(tǒng)運(yùn)行環(huán)境下,目標(biāo)應(yīng)用程序被載入計(jì)算機(jī)內(nèi)存并投入實(shí)時(shí)運(yùn)行。系統(tǒng)任務(wù)管理模塊會(huì)根據(jù)已組態(tài)好的用戶數(shù)據(jù)文件以多線程方式啟動(dòng)各個(gè)運(yùn)行模塊,完成采集和監(jiān)控現(xiàn)場設(shè)備的數(shù)據(jù),將現(xiàn)場工程運(yùn)行狀況以圖形或報(bào)表的方式顯示出來。運(yùn)行子系統(tǒng)由畫面顯示模塊、數(shù)據(jù)采集模塊、設(shè)備驅(qū)動(dòng)模塊等組成。
本文的分析主要涉及“數(shù)據(jù)采集模塊”和“設(shè)備驅(qū)動(dòng)模塊”。
作為Windows系統(tǒng)中一種重要的模塊化方法,動(dòng)態(tài)鏈接庫(DLL)技術(shù)是一種在Windows平臺下代碼可重用的技術(shù)。本文設(shè)計(jì)的設(shè)備驅(qū)動(dòng)模塊開發(fā)平臺就是采用Windows的動(dòng)態(tài)鏈接庫技術(shù),即每個(gè)設(shè)備的驅(qū)動(dòng)模塊都以DLL形式提供的。
在數(shù)據(jù)采集模塊中,因采用了動(dòng)態(tài)鏈接庫技術(shù),所以可以針對不同的設(shè)備、不同的通訊協(xié)議和實(shí)際需求,調(diào)用對應(yīng)的設(shè)備驅(qū)動(dòng)模塊DLL。即用hLibrary=LoadLibrary(設(shè)備驅(qū)動(dòng)模塊文件名)方式動(dòng)態(tài)裝載驅(qū)動(dòng)模塊,然后用lpDriverProc=GetProcAddress(hLibrary,"Driver")記住DLL的地址,當(dāng)需要訪問該設(shè)備的時(shí)候調(diào)用該DLL中的函數(shù),這樣可大大提高系統(tǒng)的可靠性,滿足不同情況的要求,同時(shí)也可以提高程序開發(fā)的效率。
工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件中通訊接口的一大特點(diǎn)就是面向種類繁多的硬件設(shè)備,有通過插在PCI、ISA插槽的板卡形式與計(jì)算機(jī)連接,有通過串行口以RS232/485的方式和上位機(jī)通信,有通過網(wǎng)絡(luò)通訊方式與工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件連接,仔細(xì)分析各自的特點(diǎn)并找出它們的共性,對開發(fā)通用的設(shè)備驅(qū)動(dòng)模塊是非常有價(jià)值的,如圖1所示。
(1)獨(dú)立板卡類通訊
獨(dú)立板卡類包括模數(shù)(A/D)轉(zhuǎn)換板、數(shù)模(D/A)轉(zhuǎn)換板、開關(guān)量(DI/DO)輸入輸出板及通信板卡等。它們直接插入計(jì)算機(jī)的總線槽里,通過ISA或PCI總線擴(kuò)展槽與計(jì)算機(jī)進(jìn)行數(shù)據(jù)通信。每塊板都有一個(gè)基地址范圍,計(jì)算機(jī)通過訪問該基地址即可達(dá)到輸入輸出數(shù)據(jù)。
在Windows平臺下,生產(chǎn)板卡類的廠家一般會(huì)提供以下4種主要的WindowsAPI函數(shù):
板卡初始化:Open()、Start();
功能設(shè)置查詢:SetRange()、SetGain()、GetRange()、GetGain()、IsDataReady()、Status();
數(shù)據(jù) IO:In()、Out()、DI()、DO();
暫停、關(guān)閉:Stop()、Close()。
(2)串口類通訊
各種智能儀表和智能模塊設(shè)備通常是通過串口 (通常叫COM口)與計(jì)算機(jī)連接通訊,或者說通過計(jì)算機(jī)的串口,采用該設(shè)備的通信協(xié)議與之通訊。但在Windows平臺下,無論是哪種通信協(xié)議,其通訊操作就如同對文件操作一樣,串行設(shè)備的打開和關(guān)閉操作與文件的打開和關(guān)閉使用的函數(shù)完全相同。幾個(gè)重要的WinAPI函數(shù)說明如下:
打開關(guān)閉串口通訊資源函數(shù)——CreateFile和CloseHandle;
配置串口通訊資源函數(shù)——BuildCommDCB和SetComm-State;
讀寫串口數(shù)據(jù)函數(shù)——ReadFile和WriteFile;
設(shè)置通訊事件函數(shù)——WriteCommEvent。
(3)網(wǎng)絡(luò)類通訊
網(wǎng)絡(luò)通訊可以采用TCP(transfercontrolprotocol)或者UDP(userdatagramprotocol)兩種方式,一般在工控軟件中考慮到數(shù)據(jù)的可靠傳輸,多數(shù)是采用TCP面向連接的通訊協(xié)議。
Windows平臺提供了方便的網(wǎng)絡(luò)應(yīng)用開發(fā)接口——Socket,用戶所開發(fā)的應(yīng)用程序可以通過網(wǎng)絡(luò)與其它Socket應(yīng)用程序通信。使用Socket開發(fā)應(yīng)用程序主要包括以下幾個(gè)基本步驟:創(chuàng)建并配置Socket、建立Socket連接、通過Socket進(jìn)行數(shù)據(jù)的發(fā)送和接收、關(guān)閉Socket。
根據(jù)以上分析可以看出,無論那種通訊方式都存在設(shè)備初始化、數(shù)據(jù)的讀寫、關(guān)閉通訊口3個(gè)基本步驟,而其它操作(如:功能設(shè)置查詢、配置通訊資源等)或歸類在設(shè)備初始化階段或用設(shè)備配置文件(如:IO.ini)詳細(xì)描述。
圖1 3類硬件通訊接口數(shù)據(jù)讀寫流程比較
(1)函數(shù)接口
用動(dòng)態(tài)鏈接庫(DLL)技術(shù)設(shè)計(jì)設(shè)備驅(qū)動(dòng)模塊,定義入口函數(shù)為Driver(WORDFunc,DWORDlpParam),其中Func是標(biāo)志,lpParam是根據(jù)Func不同值由采集模塊調(diào)用時(shí)給出的參數(shù)指針,根據(jù)上節(jié)分析,對3類通訊方式定義一種較為統(tǒng)一的數(shù)據(jù)結(jié)構(gòu),其描述見表1。
當(dāng)數(shù)據(jù)采集模塊依次調(diào)用 Driver(DRV_INITIAL,lpParam)、Driver(DEV_INITIAL,lpParam)、Driver(GRP_INITIAL,lpParam)、Driver(GRP_READ,lpParam)、Driver(DEV_INITEND,lpParam)、Driver(DRV_INITEND,lpParam),就可以完成設(shè)備初始化、數(shù)據(jù)的讀、關(guān)閉通訊口的3個(gè)基本步驟。而對1.2中歸納的3類硬件通訊接口,其調(diào)用Driver時(shí)的接口參數(shù)略有不同。
獨(dú)立板卡類通訊如表2所示,串口類通訊如表3所示,網(wǎng)絡(luò)類通訊如表4所示,可以看出,對于不同類型的硬件通訊接口只需定義各自的設(shè)備驅(qū)動(dòng)模塊列表(DRVPARAPTR)和部分設(shè)備列表(DEVPARAPTR)而無需改動(dòng)其它部分,即可完成數(shù)據(jù)采集模塊和設(shè)備驅(qū)動(dòng)模塊間的接口定義,大大地減少了設(shè)備驅(qū)動(dòng)模塊開發(fā)的工作量,縮短了軟件的開發(fā)周期,也能夠確保設(shè)備驅(qū)動(dòng)模塊的穩(wěn)定性。
表1 通訊方式入口參數(shù)定義描述
表2 獨(dú)立板卡類DLL函數(shù)接口的參數(shù)定義
表3 串口類DLL函數(shù)接口的參數(shù)定義
表4 網(wǎng)絡(luò)類DLL函數(shù)接口的參數(shù)定義
圖2 數(shù)據(jù)讀寫流程
(2)內(nèi)部數(shù)據(jù)結(jié)構(gòu)
內(nèi)部數(shù)據(jù)結(jié)構(gòu)是服務(wù)于設(shè)備驅(qū)動(dòng)模塊內(nèi)程序處理流程中所必需的數(shù)據(jù)結(jié)構(gòu),所以通用于不同類型的硬件通訊接口??紤]到多任務(wù)及Windows所特有的消息傳遞特性,設(shè)備驅(qū)動(dòng)模塊的內(nèi)部數(shù)據(jù)結(jié)構(gòu)定義如下(簡略):
typedef struct tagDATA{
HWND hWnd; //設(shè)備驅(qū)動(dòng)模塊內(nèi)部的窗體句柄,用于通訊口的消息處理
HANDLE hMutex;//用于存放IO共享緩存的互斥
…
WORD *LinePtr;//存放IO共享緩存,結(jié)構(gòu)為BUFF
WORD NumbersInLine;//動(dòng)態(tài)記錄IO共享數(shù)據(jù)區(qū)中有效個(gè)數(shù)
unsigned char ReadPosOfLine;
unsigned char WritePosOfLine;
}DATA;
typedef struct tagBUFF{
HWND MainWinhWnd;//調(diào)用模塊窗口句柄,用于返回?cái)?shù)據(jù)或設(shè)備通訊狀態(tài)
WORD GroupID;
WORD*AnswerData;//數(shù)據(jù)采集模塊的數(shù)據(jù)區(qū)指針
WORD *PostErrorCode;//保存通訊口的返回值
…
}BUFF;
其中,互斥量hMutex是針對多任務(wù)運(yùn)行環(huán)境下,各設(shè)備驅(qū)動(dòng)模塊線程訪問共享數(shù)據(jù)區(qū)(*LinePtr所指向)而設(shè)計(jì)的。變量 ReadPosOfLine、WritePosOfLine和 NumbersInLine,動(dòng)態(tài)記錄環(huán)形共享數(shù)據(jù)區(qū)中的有效數(shù)據(jù)個(gè)數(shù)以及存入取出的位置。*AnswerData中存放的是數(shù)據(jù)采集模塊寫入設(shè)備的原始數(shù)據(jù)或設(shè)備中讀出的返回給數(shù)據(jù)采集模塊的數(shù)據(jù)。
圖2說明了數(shù)據(jù)采集模塊對設(shè)備驅(qū)動(dòng)模塊的一次讀寫數(shù)據(jù)的流程,前提是設(shè)備驅(qū)動(dòng)模塊已被調(diào)用了設(shè)備初始化等操作。
如前所述,數(shù)據(jù)采集模塊啟動(dòng)后,用hLibrary=LoadLibrary(設(shè)備驅(qū)動(dòng)模塊文件名)方式動(dòng)態(tài)裝載設(shè)備驅(qū)動(dòng)模塊,并用lpDriverProc=GetProcAddress(hLibrary,"Driver")記住DLL的地址,然后分別調(diào)用Driver(DRV_INITIAL,lpParam)、Driver(DEV_INITIAL,lpParam)、Driver(GRP_INITIAL,lpParam)對設(shè)備作初始化操作,當(dāng)需要讀寫數(shù)據(jù)的時(shí)候調(diào)用函數(shù) Driver(GRP_READ,lpParam)或 Driver(GRP_WRITE,lpParam),在數(shù)據(jù)采集模塊退出時(shí)調(diào)用Driver(GRP_INITEND,lpParam)、Driver(DEV_INITEND,lpParam)、Driver(DRV_INITEND,lpParam),關(guān)閉設(shè)備驅(qū)動(dòng)模塊結(jié)束通訊。
利用Windows的多任務(wù)工具,對不同的設(shè)備端口開設(shè)各自獨(dú)立的線程進(jìn)行監(jiān)測,可以實(shí)現(xiàn)對所有硬件設(shè)備數(shù)據(jù)采集的并行處理。數(shù)據(jù)采集模塊在裝載設(shè)備驅(qū)動(dòng)模塊之前需要得到所有通訊設(shè)備的有關(guān)信息,如:地址范圍、工程量上下限、報(bào)警范圍、串口的波特率大小等等,一般是在組態(tài)子系統(tǒng)下由設(shè)備驅(qū)動(dòng)組態(tài)模塊和數(shù)據(jù)采集組態(tài)模塊完成,并構(gòu)成設(shè)備配置文件(如:IO.ini)。而在運(yùn)行環(huán)境下,數(shù)據(jù)采集模塊通過讀入配置文件得到這些參數(shù),在以后的 Driver()調(diào)用中作為參數(shù)lpParam傳遞給設(shè)備驅(qū)動(dòng)模塊。
本節(jié)以串口通訊類的設(shè)備驅(qū)動(dòng)模塊為例,簡述各調(diào)用函數(shù)的主要流程,如圖3~圖6所示。
圖3 設(shè)備驅(qū)動(dòng)模塊列表初始化及退出流程
圖4 設(shè)備列表初始化及退出流程
圖5 數(shù)據(jù)組表初始化及退出流程
圖6 設(shè)備驅(qū)動(dòng)模塊內(nèi)的窗體消息處理流程
應(yīng)用本文所述方案,在自行開發(fā)的“工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件”中先后開發(fā)了支持以下一些主要設(shè)備的設(shè)備驅(qū)動(dòng)模塊:
獨(dú)立板卡類通訊:CONTEC各類板卡、研華各類板卡;
串口類通訊:三菱PLC、歐姆龍PLC、西門子PLC、Sharp-PLC;
網(wǎng)絡(luò)類通訊:三菱PLC。
從每個(gè)設(shè)備的開發(fā)周期看,設(shè)備數(shù)與時(shí)間成反比,舉例來說,如果在同類通訊設(shè)備中開發(fā)第一個(gè)需兩個(gè)人月數(shù),那么開發(fā)第二個(gè)僅需一個(gè)人月數(shù),甚至更少的時(shí)間。
根據(jù)不同的工業(yè)現(xiàn)場,在自行開發(fā)的“工業(yè)實(shí)時(shí)監(jiān)控組態(tài)軟件”中配置對應(yīng)硬件接口的設(shè)備驅(qū)動(dòng)模塊構(gòu)成應(yīng)用系統(tǒng),經(jīng)用戶現(xiàn)場組態(tài)運(yùn)行,已成功應(yīng)用在多項(xiàng)具體項(xiàng)目中:
國內(nèi):上海寶鋼《高爐煤粉制粉裝置的數(shù)據(jù)采集監(jiān)控系統(tǒng)》、南京梅山煉鐵廠《1#高爐溫度、壓力計(jì)算機(jī)監(jiān)控系統(tǒng)》、浙江平湖熔劑廠《現(xiàn)場數(shù)據(jù)采集系統(tǒng)》等;
國外:東芝燃料電磁檢測系統(tǒng)、日本洗車機(jī)噴漆系統(tǒng)、TOYOTA BODY設(shè)備檢視生產(chǎn)管理系統(tǒng)等。
經(jīng)實(shí)際開發(fā)并應(yīng)用于工業(yè)現(xiàn)場,可以證明本文所給出的設(shè)計(jì)思路及設(shè)備驅(qū)動(dòng)模塊的框架結(jié)構(gòu)具有以下特點(diǎn):
(1)縮短開發(fā)周期:本文對硬件通訊操作的分析歸類,對軟件開發(fā)人員來說不僅可以節(jié)省對同類通訊設(shè)備的重復(fù)開發(fā),更因分類清晰而便于系統(tǒng)的模塊化開發(fā),縮短開發(fā)周期。
(2)良好的開放性:按照本文的設(shè)計(jì)思路及框架結(jié)構(gòu)所開發(fā)的工業(yè)實(shí)時(shí)監(jiān)控軟件系統(tǒng),具有良好的開放性,它能與多種通訊協(xié)議互聯(lián),支持多種硬件設(shè)備,提供多種數(shù)據(jù)訪問接口。
(3)易于調(diào)試、維護(hù)升級:共性設(shè)計(jì)并進(jìn)行模塊化開發(fā),不僅有利于開發(fā)過程中的調(diào)試,而且對以后的系統(tǒng)維護(hù)和產(chǎn)品升級也帶來了便利。
[1]胡松.關(guān)于工控組態(tài)軟件的幾個(gè)技術(shù)問題[J].科技風(fēng),2010(17):270-270.
[2]李賀斌.監(jiān)控組態(tài)軟件中設(shè)備驅(qū)動(dòng)程序開發(fā)平臺的研究與實(shí)現(xiàn)[D].秦皇島:燕山大學(xué),2006.
[3]張勇旭,李力雄,康盛.通用組態(tài)軟件驅(qū)動(dòng)程序的設(shè)計(jì)與開發(fā)[J].工業(yè)控制計(jì)算機(jī),2009,22(9):1-6.
[4]馬婧,馬茜.基于數(shù)據(jù)采集卡和組態(tài)軟件的PLC控制系統(tǒng)仿真[J].先進(jìn)制造與管理,2008,27(7):29-31.
[5]萬紅進(jìn).通用過程監(jiān)測軟件的研究與開發(fā)[D].南京:南京理工大學(xué),2007.
[6]孫立軍,丁偉玲.淺析組態(tài)軟件的發(fā)展趨勢[J].機(jī)電產(chǎn)品開發(fā)與創(chuàng)新,2008,21(2):87-88.
[7]朱曉鳳.基于SOCKET編程實(shí)現(xiàn)的組態(tài)軟件與控制器的網(wǎng)絡(luò)通訊[J].電子元器件應(yīng)用,2010,12(5):41-47.
[8]中國工控網(wǎng).組態(tài)軟件對比分析[OL].http://a.gongkong.com/customer/gktx/imgpdf/ztrjdbfx.pdf.
[9]陳在平,彭登峰.基于Visual Studio.NET的OPC客戶端的研究與實(shí)現(xiàn)[J].制造業(yè)自動(dòng)化,2008,30(12):22-72.
[10]史穎.基于VC的OPC客戶端軟件研究與實(shí)現(xiàn)[D].烏魯木齊:新疆大學(xué),2007.
[11]高連生,盛柏林.動(dòng)態(tài)鏈接庫在組態(tài)軟件中的應(yīng)用[J].工業(yè)控制計(jì)算機(jī),2010,23(6):21-22.
[12]王曉嵐.基于VB6.0串口通信的氣壓測高系統(tǒng)數(shù)據(jù)采集實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010,33(3):116-118.
[13]李光春,黃建國,王志剛.多線程技術(shù)在數(shù)據(jù)采集中的應(yīng)用[J].電子元器件應(yīng)用,2009,11(7):85-87.
[14]劉世德,王玉正,韓新強(qiáng).Windows下實(shí)時(shí)數(shù)據(jù)采集的實(shí)現(xiàn)[J].機(jī)械制造與自動(dòng)化,2010,39(3):133-134.
[15]李金波,陳慶文.數(shù)據(jù)采集服務(wù)器設(shè)計(jì)[J].自動(dòng)化技術(shù)與應(yīng)用,2010,29(5):39-43.