當(dāng)前位置:首頁 > 工業(yè)控制 > 工業(yè)控制技術(shù)文庫
[導(dǎo)讀] COM(Component Object Model)組件技術(shù)是構(gòu)造二進(jìn)制兼容軟件的規(guī)范,通過它可以建立能夠相互傳輸數(shù)據(jù)的組件,其服務(wù)器-客戶機(jī)結(jié)構(gòu)非常適合工控軟件應(yīng)用程序的開發(fā)。由于工控軟件不

COM(Component Object Model)組件技術(shù)是構(gòu)造二進(jìn)制兼容軟件的規(guī)范,通過它可以建立能夠相互傳輸數(shù)據(jù)的組件,其服務(wù)器-客戶機(jī)結(jié)構(gòu)非常適合工控軟件應(yīng)用程序的開發(fā)。由于工控軟件不僅包括PC機(jī)上的HMI(人-機(jī)界面)程序,還包括與各種基于ISA或PCI總線的數(shù)據(jù)采集卡進(jìn)行數(shù)據(jù)交換的程序,這部分程序?qū)﹂_人員的硬件水平要求較高,而且開發(fā)難度較大,與HMI程序是相互獨(dú)立的,所以可以把工控軟件分成兩部分,即把HMI程序作為客戶機(jī)端程序,把與硬件進(jìn)行數(shù)據(jù)交換的程序作為服務(wù)器端程序。基于這種思想,本文將服務(wù)器-客戶機(jī)結(jié)構(gòu)應(yīng)用到現(xiàn)場總線控制系統(tǒng)的組態(tài)軟件中,著重介紹客戶機(jī)和服務(wù)器的功能及實(shí)現(xiàn)。首先介紹現(xiàn)場總線控制系統(tǒng)的組成。

1、 系統(tǒng)組成

現(xiàn)場總線控制系統(tǒng)主要由PC機(jī)、ISA或PCI總線智能適配器、智能測控模塊、組態(tài)軟件、HMI軟件、COM服務(wù)器、用戶軟件等構(gòu)成。

現(xiàn)場總線系統(tǒng)中所有信息的傳遞都是雙向的,COM服務(wù)器介于智能適配器和上位機(jī)軟件之間,負(fù)責(zé)完成數(shù)據(jù)的傳輸。上位機(jī)軟件相當(dāng)于客戶機(jī)端應(yīng)用軟件,它使用COM服務(wù)器提供的接口來操作適配器,對適配器進(jìn)行初始化及向特定單元寫入和讀出數(shù)據(jù)。

由于在Windows保護(hù)模式下不能直接訪問存儲(chǔ)器,所以需要編寫VxD驅(qū)動(dòng)程序,將物理地址轉(zhuǎn)換成線性地址,然后COM就可以象使用DLL一樣調(diào)用VxD的函數(shù),完成對ISA或PCI總線智能適配器的操作。

從測控模塊到上位機(jī)軟件自下而下的數(shù)據(jù)傳輸完成了用戶對測控模塊的監(jiān)測;而上層軟件通過COM將數(shù)據(jù)送往適配器,再由適配器送往測控模塊,實(shí)現(xiàn)了用戶對測控模塊工作參數(shù)的設(shè)置及工作狀態(tài)的管理。圖1給出了系統(tǒng)軟件結(jié)構(gòu)框圖。

2、 組態(tài)軟件的功能

現(xiàn)場總線控制系統(tǒng)組態(tài)軟件是一套基于Windows 98和Windows 2000平臺(tái)(或更高版本)、用于快速構(gòu)造和生成上位機(jī)監(jiān)控系統(tǒng)的組成軟件,它提供了從數(shù)據(jù)采集到數(shù)據(jù)處理、遠(yuǎn)程控制、報(bào)警處理、報(bào)表輸出等實(shí)際工程問題的完整解決方案。它使用COM服務(wù)器提供的接口與適配器進(jìn)行數(shù)據(jù)交換,是COM客戶機(jī)端的程序。

3、 COM組件技術(shù)

組件是完成一定功能的軟件塊,可以被其它程序使用,而且容易替換。為了使每個(gè)人編寫的組件具有可移植性,必須建立一個(gè)標(biāo)準(zhǔn),保證其兼容性和可互換性。COM正是這樣一種標(biāo)準(zhǔn),遵循COM規(guī)則就可以建立能夠相互交換數(shù)據(jù)的組件。

在現(xiàn)場總線控制系統(tǒng)中,COM組件服務(wù)器負(fù)責(zé)組態(tài)軟件等上位機(jī)軟件與智能適配器之間的數(shù)據(jù)傳輸,因?yàn)檫m配器通過CAN現(xiàn)場總線與測控模塊連接,所以對適配器的操作就是對模塊的監(jiān)測與控制。

COM服務(wù)器提供的接口中有適配器初始化、模塊檢查、向模塊發(fā)送數(shù)據(jù)及讀取模塊數(shù)據(jù)等函數(shù)。下面著重介紹數(shù)據(jù)發(fā)送接收模式及如何編寫這4個(gè)有代表性的函數(shù)。

3.1 適配器初始化函數(shù)

只有適配器初始化成功后,才能進(jìn)行其它操作。由于在Windows保護(hù)模式下不能直接訪問適配器,COM程序需要調(diào)用VxD程序?qū)?u>存儲(chǔ)對應(yīng)的物理地址轉(zhuǎn)換成線性地址指針lpBaseAddress,這樣對適配器的操作就轉(zhuǎn)換成對以該指針為首地址的數(shù)組的操作。向這個(gè)數(shù)組的0x3F0、0x3F1和0x3F8單元分別寫入上閏機(jī)節(jié)點(diǎn)號(hào)以及適配器與模塊間的通信波特率和適配器程序規(guī)定的命令字0xC6(表示適配器初始化),等待幾十ms后,如果適配器接收到上面的數(shù)據(jù)并做出適當(dāng)?shù)姆磻?yīng),它會(huì)將0x3F8單元清零,這就表示初始化適配器成功;如果該單元不為零,則初始化失敗。

3.2 數(shù)據(jù)傳輸格式

適配器初始化成功后,就可以同它交換數(shù)據(jù)了。下而簡單說明一下發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的格式。

適配器初始化得到的線性地址指針lpBaseAddress的1~5單元分別存放上位機(jī)節(jié)點(diǎn)號(hào)、模塊節(jié)點(diǎn)號(hào)、保留字、發(fā)送或接收字節(jié)長度及模塊操作的命令字。lpBaseAddress[6]~lpBaseAddress[256]存放所要發(fā)送的數(shù)據(jù);從lpBaseAddress[0x106]單元開始存放接收到的數(shù)據(jù),lpBaseAddress[0x3F8]存放操作適配器的命令字,適配器根據(jù)這個(gè)單元內(nèi)容進(jìn)行處理,如果是0xC6,則初始化適配器和模塊上的CAN控制器;如果是0xC7,則將數(shù)組里的數(shù)送給模塊上的E2PROM,模塊收到數(shù)據(jù)后根據(jù)lpBaseAddress[5]的命令字進(jìn)行相應(yīng)處理;如果是0xB0,則按照接收到的數(shù)據(jù)配置模塊工作狀態(tài);如果是0xA5,則將此時(shí)的測量值送到適配器上,由COM程序讀出。

3.3 模塊檢查函數(shù)

適配器初始化成功后,還要檢查適配器與下面的測控模塊是否連接好,或者是否存在組態(tài)軟件要組態(tài)的模塊,也就是要進(jìn)行模塊檢查操作。模塊檢查的命令字是0xAD,向數(shù)組的1~5單元分別寫入上位機(jī)節(jié)點(diǎn)號(hào)、模塊節(jié)點(diǎn)號(hào)、保留字、發(fā)送數(shù)據(jù)長度和模塊檢查命令字0xAD,向0x3F8單元寫入0xC7(表示向適配器寫入數(shù)據(jù)),等待幾十ms后,如果0x3F8單元清零而且0x100單元被置為0xAA,表示該模塊存在而且可以通信;否則,表明該模塊不存在或者硬件上有問題。

3.4 寫適配器數(shù)據(jù)函數(shù)

在確定了網(wǎng)絡(luò)中存在哪些可通信的模塊之后,就可以向它們發(fā)送數(shù)據(jù)并進(jìn)行配置。為了實(shí)現(xiàn)向適配器發(fā)送數(shù)據(jù),總共編寫了4個(gè)函數(shù)、SendData([in]BYTE SendBuf[256])、SendFinish([in]BOOL bFinish)、FinishQuery([out]BOOL*bFinish)和ReceiveResult([out]BOOL *bSendFinish)。SendData負(fù)責(zé)把一個(gè)模塊所需要發(fā)送的數(shù)據(jù)以數(shù)組的形式放到服務(wù)器的一個(gè)二維數(shù)組(Room[64][256])里,每個(gè)模塊的數(shù)據(jù)作為一行。由于向適配器發(fā)送數(shù)據(jù)后,要等待一段時(shí)間判斷模塊是否接收成功,所以SendFinish中開啟輔助線程來發(fā)送數(shù)據(jù)并等待結(jié)果,這相可不占用COM主程序的時(shí)間,使客戶調(diào)用接口函數(shù)后能立即返回,執(zhí)行其它操作。FinishQuery查詢數(shù)據(jù)發(fā)送是否結(jié)束。ReceiveResult彈出一個(gè)非模式對話框,顯示哪些模塊接收到數(shù)據(jù),哪些沒有。

3.5 讀適配器數(shù)據(jù)函數(shù)

除了向適配器發(fā)送數(shù)據(jù),還可以從適配器上讀取模塊傳上來的數(shù)據(jù)。讀取數(shù)據(jù)的命令字是0xA5。實(shí)現(xiàn)該任務(wù)的函數(shù)是GetPV([in]BYTE bDesNode,[out]float value),第一個(gè)參數(shù)是模塊節(jié)點(diǎn)號(hào),第二個(gè)參數(shù)是返回的測量值數(shù)組。

這里,COM是用ATL編寫的本地服務(wù)器,COM對象的線程是套間線程。接口定義了6個(gè)函數(shù),COM程序流程圖如圖2所示。

COM對象接口的函數(shù)聲明以及適配器初始化的程序如下:

COM接口定義:

interface INCardWork :IDispatch

{

[id(1),helpstring(“適配器初始化函數(shù),返回值為是否成功”)]

HRESULT NcardInit([in]BYTE

bSrcNode,[in]BYTE bIntrAdd,[in]BYTE bRate,[in]long bSegmantAdd,[out]BOOL *flag);

[id(2),helpstring(“將客戶端傳送的數(shù)組賦值給Room[][]”)][page]

HRESULT SendData[in]BYTE SendBuf[256]);

[id(3),helpstring(“啟動(dòng)多線程”)]

HRESULT SendFinish ([in]BOOL bFinish);

[id(4),helpstring(“此函數(shù)返回值表示數(shù)據(jù)是否已向下位機(jī)發(fā)送完畢,同時(shí)可顯示哪些模塊未被配置,通常在此函數(shù)前先用FinishQuery([out]BOOL*bFinish)查詢發(fā)送是否完畢”)]

HRESULT ReceiveResult([out]BOOL *bSendFinish);

[id(5)],helpstring(“此函數(shù)返回值表示數(shù)據(jù)是否已向下位機(jī)發(fā)送完畢,“真”表示發(fā)送完畢”)]

HRESULT FinishQuery([out]BOOL *bFinish);

[id(6),helpstring(“網(wǎng)絡(luò)檢查,用來在發(fā)送數(shù)據(jù)前檢測是否有該節(jié)點(diǎn)存在”)]

HRESULT NetCheck[in]BYTE sour,[in]BYTE des,[in]BYTE type,[out]BOOL *flag);

[id(7),helpstring(“讀取模塊的測量值”)]

HRESULT GetPV([iv]BYTE bDesNode,[out]float value[256]);

}

適配器初始化函數(shù):

#include

#include “winioctl.h”

//包含其它頭文件

……

STDMETHODIMP CNCardWork::NcardInit(BYTE bSrcNode,BYTE bIntrAdd,BYTE bRate,long bSegmentAdd,BOOL *flag)

{

NcardCtrl cardctrl; //NcardCtrl類的函數(shù)調(diào)用VxD函數(shù)

exbSrcNode=bSrcNode; //給上位機(jī)節(jié)點(diǎn)賦值

exbRate=bRate; //下位機(jī)與適配器的通信波特率

BOOL transfersign; //初始化是否成功標(biāo)志

DWORD dwSegmentaddress=bSegmentAdd;//適配器段地址

HANDLE hDevice=NULL; //指向線性指針對句柄

LpBaseAddress=(PBYTE)cardctrl.MapLinearAddress(dwSegmentaddress,0x400,hDevice);

//調(diào)用VxD函數(shù),獲得指向ISA總線物理地址的線性地址指針

cardctrl,UnMapLinearAddress(lpBaseAddress,hDevice);

//關(guān)閉VxD

//調(diào)用適配器初始化函數(shù)

_outp(0x310,0x01); //打開郵箱

lpBaseAddress[0x3F0]=bSrcNodeNumber;//上位機(jī)節(jié)點(diǎn)號(hào)

lpBaseAddress[0x3F1]=bRate; //波特率

lpBaseAddress[0x3F8]=0xC6; //適配器初始化命令字

DrvDelay(20,false); //延時(shí)20ms

………… //初始化后其它操作

_outp(0x310,00); //關(guān)閉郵箱鎖

return S_OK;

}

4 虛擬設(shè)備驅(qū)動(dòng)程序

VxD是虛擬設(shè)備驅(qū)動(dòng)程序(Virtual Device Driver)的縮寫,中間的x表示某一設(shè)備。它能夠無限制地訪問所有硬件設(shè)備、自由地檢測操作系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)(如描述符和頁表)以及訪問任何內(nèi)存位置。

本文中,VxD將ISA總線對應(yīng)的物理地址轉(zhuǎn)換成段線性地址,供應(yīng)用程序使用。VxD的開發(fā)工具是VtoolsD,轉(zhuǎn)換時(shí)用的函數(shù)為MapPhysToLinear。以下是部分程序代碼:

//定義結(jié)構(gòu)體

typedef struct _MapDevRequest

{

PVOID mdr_PhysicalAddress;DWORD mdr_SizeInBytes;

PVOID mdr_LinearAddress;WORD mdr_Status;

}MAPDEVREQUEST,*PMAPDEVREQUEST;

#include

[page]

//包含其它頭文件

…………

PARAMS pDIOCParams

{

PMAPDEVREQUEST pRea; //自己定義的結(jié)構(gòu)體

switch(pDIOCParams-》dioc_IOCtlCode)

{

case DIOC_OPEN:

case DIOC_CLOSEHANDLE:break;

case MDR_SERVICE_MAP:

pReq=*(PMAPDEVREQUEST*)pDIOCParams-》dioc_InBuf;

pReq-》mdr_LinearAddress=MapPhysToLinear

(pReq-》mdr_PhysicalAddress,pReq-》mdr_SizeInBytes,0);

if(pReq-》mdr_LinearAddress==NULL)

pReq-》mdr_Status=MDR_STATUS_ERROR;

else

pReq-》mdr_Status=MDR_STATUS_SUCCESS;

break;

case MDR_SERVICE_UNMAP:break;

default:

return ERROR_INVALID_FUNCTION;

}

return DEVIOCTL_NOERROR;

}

在現(xiàn)場總線控制系統(tǒng)中使用COM組件技術(shù),不僅可以使數(shù)據(jù)傳輸部分的功能獨(dú)立于客戶端程序,減小開發(fā)難度,而且使其可以被任何支持二進(jìn)制代碼的程序如Excel電子表格等直接調(diào)用。當(dāng)系統(tǒng)中采用服務(wù)器和客戶端方式時(shí),代碼更加易于維護(hù)。即使要升級(jí)服務(wù)器端程序,只要接口不變,其客戶端程序也完全不需要修改,大量后續(xù)工作被減輕。象服務(wù)器端一樣,客店端也只需關(guān)心服務(wù)器的接口,而不必考慮其如何實(shí)現(xiàn)數(shù)據(jù)交換。也就是說,COM服務(wù)器或客戶機(jī)中的一端功能發(fā)生改變,只要其接口保持不變,另一端不需修改就可以工作。本文所介紹的技術(shù)已在勝利油田某注水站等實(shí)際工程項(xiàng)目中得到成功的應(yīng)用。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉