《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > COM組件技術在現場總線控制系統組態軟件中的應用

COM組件技術在現場總線控制系統組態軟件中的應用

2008-08-11
作者:李正軍, 宋曉慶, 王松磊

  摘? 要: 簡要介紹了現場總線控制系統" title="現場總線控制系統">現場總線控制系統的組成以及組態軟件" title="組態軟件">組態軟件的功能,重點講述了COM組件技術在組態軟件中的應用及VxD驅動程序的開發。

  關鍵詞: 現場總線? 組態軟件? COM? VxD

?

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

1 系統組成

  現場總線控制系統主要由PC機、ISA或PCI總線智能適配器、智能測控模塊" title="測控模塊">測控模塊、組態軟件、HMI軟件、COM服務器、用戶軟件等構成。

  現場總線系統中所有信息的傳遞都是雙向的,COM服務器介于智能適配器和上位機" title="上位機">上位機軟件之間,負責完成數據的傳輸。上位機軟件相當于客戶機端應用軟件,它使用COM服務器提供的接口來操作適配器,對適配器進行初始化及向特定單元寫入和讀出數據。

  由于在Windows保護模式下不能直接訪問存儲器,所以需要編寫VxD驅動程序,將物理地址轉換成線性地址,然后COM就可以象使用DLL一樣調用VxD的函數,完成對ISA或PCI總線智能適配器的操作。

  從測控模塊到上位機軟件自下而上的數據傳輸完成了用戶對測控模塊的監測;而上層軟件通過COM將數據送往適配器,再由適配器送往測控模塊,實現了用戶對測控模塊工作參數的設置及工作狀態的管理。圖1給出了系統軟件結構框圖。

?

2 組態軟件的功能

  現場總線控制系統組態軟件是一套基于Windows 98和Windows 2000平臺[或更高版本]、用于快速構造和生成上位機監控系統的組態軟件,它提供了從數據采集到數據處理、遠程控制、報警處理、報表輸出等實際工程問題的完整解決方案。它使用COM服務器提供的接口與適配器進行數據交換,是COM客戶機端的程序。

3 COM組件技術

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

  在現場總線控制系統中,COM組件服務器負責組態軟件等上位機軟件與智能適配器之間的數據傳輸,因為適配器通過CAN現場總線與測控模塊連接,所以對適配器的操作就是對模塊的監測與控制。

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

3.1 適配器初始化函數

  只有適配器初始化成功后,才能進行其它操作。由于在Windows保護模式下不能直接訪問適配器,COM程序需要調用VxD程序將存儲器對應的物理地址轉換成線性地址指針lpBaseAddress,這樣對適配器的操作就轉換成對以該指針為首地址的數組的操作。向這個數組的0x3F0、0x3F1和0x3F8單元分別寫入上位機節點號以及適配器與模塊間的通信波特率和適配器程序規定的命令字0xC6(表示適配器初始化),等待幾十ms后,如果適配器接收到上面的數據并做出適當的反應,它會將0x3F8單元清零,這就表示初始化適配器成功;如果該單元不為零,則初始化失敗。

3.2 數據傳輸格式

  適配器初始化成功后,就可以同它交換數據了。下面簡單說明一下發送數據和接收數據的格式。

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

3.3 模塊檢查函數

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

3.4 寫適配器數據函數

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

3.5 讀適配器數據函數

  除了向適配器發送數據,還可以從適配器上讀取模塊傳上來的數據。讀取數據的命令字是0xA5。實現該任務的函數是GetPV([in]BYTE bDesNode,[out]float value[8]),第一個參數是模塊節點號,第二個參數是返回的測量值數組。

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

?

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

  COM接口定義:

  interface INCardWork : IDispatch

?????? {???????????

????????????? [id[1],helpstring(“適配器初始化函數,返回值為是

????????????? 否成功”])

????? HRESULT NCardInit([in]BYTE bSrcNode,[in]BYTE

????????????? bIntrAdd,[in]BYTE bRate,[in]long bSegmentAdd,[out]

????????????? BOOL *flag):

????????????? [id[2],helpstring(“將客戶端" title="客戶端">客戶端傳送的數組賦值給Room

????????????? [][]”])

????????????? HRESULT SendData[[in]BYTE SendBuf[256]]:

????????????? [id[3],helpstring[“啟動多線程”])????????????????????????

????????????? HRESULT SendFinish([in]BOOL bFinish):

????????????? [id[4],helpstring(“此函數返回值表示數據是否已

????????????? 向下位機發送完畢,同時可顯示哪些模塊未被配

????????????? 置,通常在此函數前先用FinishQuery([out]BOOL*

????????????? bFinish)查詢發送是否完畢”])

????????????? HRESULT ReceiveResult([out]BOOL *bSendFinish):

????????????? [id[5],helpstring(“此函數返回值表示數據是否已

????????????? 向下位機發送完畢,“真”表示發送完畢”])

????????????? HRESULT FinishQuery([out]BOOL *bFinish):

????????????? [id[6],helpstring(“網絡檢查,用來在發送數據前檢

????????????? 測是否有該節點存在”])

????????????? HRESULT NetCheck([in]BYTE sour,[in]BYTE des,

????????????? [in]BYTE type,[out]BOOL *flag):

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

????????????? HRESULT GetPV([in]BYTE bDesNode,[out]float val-

????????????? ue[256]):

?????? }

?????? 適配器初始化函數:

?????? #include

?????? #include ″winioctl.h″

  //包含其它頭文件

  .........???????????????????????????????????????????????????????????????????

  STDMETHODIMP CNCardWork::NCardInit[BYTE bSrcNode,

?????? BYTE bIntrAdd,BYTE bRate,long bSegmentAdd,BOOL

?????? *flag]

  {

  NCardCtrl cardctrl: //NcardCtrl類的函數調用VxD函數?

  ?exbSrcNode=bSrcNode: //給上位機節點賦值

???? exbRate=bRate: ??? //下位機與適配器間的通信波特率

???? BOOL transfersign: //初始化是否成功標志

???? DWORD dwSegmentaddress=bSegmentAdd:

?????????????????????????????????? //適配器段地址

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

???? lpBaseAddress=[PBYTE]cardctrl.MapLinearAddress[dwSeg-

???? mentaddress,0x400,hDevice]:

????              //調用VxD函數,獲得指向ISA總線物理地址的線性

???? 地址指針

???? cardctrl.UnMapLinearAddress[lpBaseAddress,hDevice]: ???

??????????????????????????????????????????????????????? //關閉VxD調用適配器初始化函數

???? _outp[0x310,0x01]:??????????????????????????? //打開郵箱鎖

???? lpBaseAddress[0x3F0]=bSrcNodeNumber: //上位機節點號

???? lpBaseAddress[0x3F1]=bRate:????? //波特率

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

???? DrvDelay[20,false]:??????????????????????????? //延時20ms

????? ............???????????????????????????????????? //初始化后其它操作

???? _outp[0x310,00]:???????????????????????? //關閉郵箱鎖

???? return S_OK:?

  }

4 虛擬設備驅動程序

  VxD是虛擬設備驅動程序(Virtual Device Driver)的縮寫,中間的x表示某一設備。它能夠無限制地訪問所有硬件設備、自由地檢測操作系統的數據結構(如描述符和頁表)以及訪問任何內存位置。

  本文中,VxD將ISA總線對應的物理地址轉換成一段線性地址,供應用程序使用。VxD的開發工具是VtoolsD,轉換時用的函數為MapPhysToLinear。以下是部分程序代碼:

  //定義結構體

  typedef struct _MapDevRequest

  {

  ? PVOID mdr_PhysicalAddress: DWORD mdr_SizeInBytes:

  ? PVOID mdr_LinearAddress: WORD mdr_Status:

  }MAPDEVREQUEST,*PMAPDEVREQUEST:

  #include

  //包含其它頭文件

  ......................

  DWORD LadrvDevice::OnW32DeviceIoControl(PIOCTL-

  ?????? ? PARAMS pDIOCParams)

  {

  ?????? PMAPDEVREQUEST pRea:? //自己定義的結構體

????  ?? 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:

  }

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

?

參考文獻

1 李正軍.LON總線在毫伏信號測量智能節點中的應用.濟南:山東大學學報[工學版],2002:[32]4

2 李正軍.基于LonWorks的熱電偶溫度測量智能節點的設計.自動化博覽[增刊],2002(5)

3 Ash Rofail,Yasser Shohoud. COM與COM+從入門到精通.北京:電子工業出版社,2000.4

4 陽憲惠.現場總線技術及其應用.北京:清華大學出版社,1999

5 武安河,周利莉.Windows設備驅動程序(VxD與WDM).北京:電子工業出版社,2001

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 三级三级三级a级全黄公司的 | 久久精品综合视频 | 国产中文99视频在线观看 | 精品亚洲欧美高清不卡高清 | 99在线免费观看视频 | 亚洲欧美日韩中文字幕在线一区 | 九九热国产在线 | 91视频免费网站 | 欧美福利视频导航 | 亚洲第一黄网站 | 国产94在线传媒麻豆免费观看 | 最刺激黄a大片免费观看下截 | 国产丝袜制服在线 | 欧洲成人免费高清视频 | 中文字幕在线观看一区二区三区 | 欧美精品亚洲精品日韩专 | 色午夜视频| 日韩去日本高清在线 | 亚州精品视频 | 黄色影片在线免费观看 | 国产精品视频无圣光一区 | 免费视频你懂得 | 98bb国产精品视频 | 日韩视频在线观看一区二区 | 欧美成人区 | 成人欧美视频在线观看 | 动漫成年美女黄漫网站小视频 | 看全色黄大色黄大片 视 | 我把寡妇日出水好爽视频 | 亚洲欧美日本国产综合在线 | 午夜影皖普通区 | 精品x8x8视频 | 婷婷网五月天天综合天天爱 | 在线成人欧美 | 欧美特黄a级高清免费大片 欧美太黄太色视频在线观看 | 小明永久播放平台领域2015 | 国产精品推荐天天看天天爽 | 成人1234 | 欧美国产成人一区二区三区 | h国产| 日韩伦理影院 |