<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > OPC服務(wù)器的研究及其在CAN總線系統(tǒng)中的實(shí)現(xiàn)

          OPC服務(wù)器的研究及其在CAN總線系統(tǒng)中的實(shí)現(xiàn)

          作者: 時(shí)間:2009-09-29 來源:網(wǎng)絡(luò) 收藏

          1技術(shù)簡(jiǎn)介

          本文引用地址:http://www.ex-cimer.com/article/163548.htm

            1.1什么是

            (OLEforProcessControl),即用于過程控制的對(duì)象鏈接與嵌入技術(shù),是一種規(guī)范,是在工業(yè)控制和生產(chǎn)自動(dòng)化領(lǐng)域中使用的硬件和軟件的接口標(biāo)準(zhǔn)。OPC以組件對(duì)象模型和分布式組件對(duì)象模型(COM/DCOM)技術(shù)為基礎(chǔ),采用客戶/(Client/Server)的模式,定義了一組COM對(duì)象接口標(biāo)準(zhǔn)。

            OPC規(guī)范是由世界范圍內(nèi)自動(dòng)化領(lǐng)域中處于領(lǐng)導(dǎo)地位的硬件和軟件開發(fā)商,在微軟的協(xié)作下制定的,并且已經(jīng)得到越來越多的客戶和硬件制造商的認(rèn)可。

            1.2OPC的意義

            在傳統(tǒng)的控制中,針對(duì)同一個(gè)硬件設(shè)備,每個(gè)應(yīng)用軟件都要根據(jù)自己的需求開發(fā)一套硬件驅(qū)動(dòng)程序。這不僅加大了開發(fā)和維護(hù)費(fèi)用,而且?guī)砹嗽L問沖突問題。

            OPC技術(shù)將各個(gè)硬件設(shè)備驅(qū)動(dòng)程序和通訊程序封裝成獨(dú)立的OPC,上層應(yīng)用軟件(作為OPC客戶端)可以不關(guān)心硬件的性能特點(diǎn),而通過標(biāo)準(zhǔn)的OPC接口訪問OPC。

            這樣不僅解決了上述問題,而且了軟件的“即插即用”。OPC相當(dāng)于一塊軟件“主板”,它能夠直接與現(xiàn)場(chǎng)的PLC、工業(yè)網(wǎng)絡(luò)、數(shù)據(jù)采集和WindowsCE設(shè)備連接,快速有效地獲取現(xiàn)場(chǎng)實(shí)時(shí)數(shù)據(jù)。PC機(jī)內(nèi)的各種監(jiān)視、控制和管理等應(yīng)用軟件則像是插在OPC主板上的軟件“芯片”,芯片可以通過OPC獲得現(xiàn)場(chǎng)實(shí)時(shí)數(shù)據(jù),芯片之間也可以按照OPC協(xié)議進(jìn)行通訊,從而軟件的“即插即用”。

            1.3OPC對(duì)象與接口

            OPC的核心是COM/DCOM技術(shù)。在COM模型中,軟件的功能被分解為一些組件,這些組件通過COM協(xié)議在一定條件下連接起來,相應(yīng)的功能。COM對(duì)象分為客戶端和服務(wù)器兩類,客戶端通過COM接口訪問服務(wù)器[2]。

            OPC數(shù)據(jù)訪問規(guī)范描述了OPC服務(wù)器需要實(shí)現(xiàn)的COM對(duì)象接口,它定義了定制接口(custominterface)和自動(dòng)化接口(automationinterface)[1]。OPC客戶程序通過接口與服務(wù)器通訊,間接讀取數(shù)據(jù)。OPC服務(wù)器必須實(shí)現(xiàn)定制接口,也可以有選擇地實(shí)現(xiàn)自動(dòng)化接口。一般來說,自動(dòng)化接口能為VB等高級(jí)語言客戶程序提供極大的便利,但數(shù)據(jù)傳輸效率較低;而定制接口則為用C/C++語言編寫的程序帶來靈活高效的調(diào)用手段。

            OPC客戶程序訪問服務(wù)器時(shí),創(chuàng)建一個(gè)服務(wù)器對(duì)象(這里指的是邏輯對(duì)象,目的是利用這個(gè)邏輯對(duì)象建立與實(shí)際服務(wù)器的連接),調(diào)用這個(gè)服務(wù)器對(duì)象的接口,服務(wù)器對(duì)象創(chuàng)建組對(duì)象并返回組對(duì)象的指針,客戶程序獲得組對(duì)象的指針后調(diào)用其接口。

            注意,OPC項(xiàng)并不是OPC客戶直接操作的對(duì)象,因?yàn)镺PC項(xiàng)沒有定義外部接口,對(duì)象的所有操作都是通過包容該項(xiàng)的組對(duì)象進(jìn)行的。

          2OPC數(shù)據(jù)訪問服務(wù)器的結(jié)構(gòu)及設(shè)計(jì)步驟

            2.1OPC數(shù)據(jù)訪問服務(wù)器的結(jié)構(gòu)


          圖1OPC數(shù)據(jù)訪問服務(wù)器的結(jié)構(gòu)

            本文實(shí)現(xiàn)的OPC數(shù)據(jù)訪問服務(wù)器具有數(shù)據(jù)采集的功能,提供符合OPC規(guī)范的定制接口。主要由OPC服務(wù)器對(duì)象、OPC組對(duì)象、OPC項(xiàng)對(duì)象和針對(duì)(ControllerAreaNetwork控制器局域網(wǎng))通訊卡編寫的I/O動(dòng)態(tài)鏈接庫(DLL)組成,采用如圖1所示的結(jié)構(gòu)。

            OPC服務(wù)器對(duì)象是客戶端與服務(wù)器交互的首要對(duì)象。客戶端通過訪問服務(wù)器對(duì)象的接口函數(shù)與之進(jìn)行交互。一個(gè)服務(wù)器對(duì)象里可以設(shè)置一個(gè)以上的組對(duì)象。OPC服務(wù)器對(duì)象的主要功能是:①創(chuàng)建和管理OPC組對(duì)象;②管理服務(wù)器內(nèi)部的狀態(tài)信息;③將服務(wù)器的錯(cuò)誤代碼翻譯成描述性語句;④瀏覽服務(wù)器內(nèi)部的數(shù)據(jù)組織結(jié)構(gòu)。

            OPC組對(duì)象用于組織管理服務(wù)器內(nèi)部的實(shí)時(shí)數(shù)據(jù)信息,它是OPC項(xiàng)對(duì)象的集合。正因?yàn)橛辛私M對(duì)象,OPC應(yīng)用程序就可以成批地對(duì)所需要的數(shù)據(jù)進(jìn)行訪問,也可以以組為單位啟動(dòng)或停止數(shù)據(jù)訪問。其主要功能是:①管理組對(duì)象內(nèi)部的狀態(tài)信息;②創(chuàng)建和管理項(xiàng)對(duì)象;③OPC服務(wù)器內(nèi)部的實(shí)時(shí)數(shù)據(jù)存取服務(wù)(同步或異步方式)。

            OPC服務(wù)器對(duì)象和組對(duì)象支持的接口由OPC規(guī)范定義,但并未規(guī)定具體如何實(shí)現(xiàn),需要開發(fā)人員自己完成。

            OPC項(xiàng)則與現(xiàn)場(chǎng)設(shè)備中的模塊相對(duì)應(yīng),它包含數(shù)據(jù)項(xiàng)的值(value)、品質(zhì)(quality)和時(shí)間戳(timestamp)。

            I/ODLL是針對(duì)具體硬件設(shè)備開發(fā)的驅(qū)動(dòng)程序,實(shí)現(xiàn)從現(xiàn)場(chǎng)設(shè)備讀取數(shù)據(jù)的功能。

            2.2實(shí)現(xiàn)OPC數(shù)據(jù)訪問服務(wù)器的主要步驟:

            2.2.1獲得并注冊(cè)O(shè)PC標(biāo)準(zhǔn)組件

            根據(jù)COM規(guī)范,COM服務(wù)器可分為進(jìn)程內(nèi)服務(wù)器、本地服務(wù)器和遠(yuǎn)程服務(wù)器。后兩種服務(wù)器與客戶程序運(yùn)行在不同的進(jìn)程空間,屬于進(jìn)程外服務(wù)器。為了實(shí)現(xiàn)進(jìn)程間通訊,需要用到代理/存根模塊。代理/存根模塊由接口描述語言(IDL)直接生成。OPC基金會(huì)為每種OPC服務(wù)器提供了相應(yīng)的代理/存根動(dòng)態(tài)鏈接庫,這些文件可以在OPC基金會(huì)的網(wǎng)站(www.opcfoundation.org)上免費(fèi)下載。

            注意,設(shè)計(jì)OPC服務(wù)器時(shí)可以在OPC對(duì)象上增加接口以滿足特定的要求,但不能修改標(biāo)準(zhǔn)的OPCIDL文件或相應(yīng)的proxy/stubDLL。新增的接口描述應(yīng)定義在獨(dú)立的IDL文件中,并由該文件生成獨(dú)立的代理/存根模塊來完成接口的調(diào)用工作。

            組件的注冊(cè)將在后面介紹。

            2.2.2編寫OPC服務(wù)器代碼

            首先定義0PC數(shù)據(jù)服務(wù)器的名稱(ProgID)和類標(biāo)識(shí)(CLSID),實(shí)現(xiàn)COM庫的初始化功能和0PC數(shù)據(jù)服務(wù)器類廠對(duì)象的接口功能。然后實(shí)現(xiàn)OPC對(duì)象和數(shù)據(jù)緩沖區(qū)。接下來針對(duì)具體硬件編寫I/ODLL,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)讀取。這項(xiàng)工作是十分繁重的,要求開發(fā)人員具有良好的COM編程知識(shí),具體過程限于篇幅不能詳述,這里指出兩點(diǎn)引起注意:

            ⑴全局唯一標(biāo)識(shí)符(GUID)

            GUID是為每個(gè)COM對(duì)象提供的十六字節(jié)標(biāo)識(shí)數(shù)。COM類至少有兩個(gè)GUID:類標(biāo)識(shí)(CLSID)和接口標(biāo)識(shí)(IID)。CLSID用于標(biāo)識(shí)COM類,登記在Windows注冊(cè)表中,包含指向包括COM類的DLL或EXE組件的路徑。IID用于標(biāo)識(shí)該類的接口,被應(yīng)用程序用來查詢和觸發(fā)該類的方法,也登記在注冊(cè)表中。由于對(duì)象類是由GUID標(biāo)識(shí)的,所以必須保證它們的唯一性,才能使最終用戶在使用由不同軟件商開發(fā)的組件時(shí)不會(huì)發(fā)生沖突。

            可以使用宏DEFINE_GUID(name,long,word,word,word,byte1,…,byte8)

            其中name是標(biāo)識(shí)數(shù)的名字,其余參數(shù)是實(shí)際的ID碼。類標(biāo)識(shí)的命名慣例是CLSID_ClassName,而接口ID的命名慣例是IID_InterfaceName。

            有兩種途徑來獲得GUID:

           ?、費(fèi)icrosoftVisualC++提供了兩個(gè)工具來產(chǎn)生GUID:UUIDGen.exe和GUIDGen.exe(大小寫沒有影響)。前者是一個(gè)命令行程序,直接產(chǎn)生一個(gè)GUID;后者是一個(gè)基于對(duì)話框的應(yīng)用程序,運(yùn)行UUIDGen.exe,產(chǎn)生一個(gè)CreateGUID對(duì)話框。它提供四種格式,選定之后,按NewGUID鍵產(chǎn)生新的GUID,顯示在Result欄中;按Copy鍵可以復(fù)制產(chǎn)生的結(jié)果。

           ?、诶肅OM庫提供的API函數(shù)來產(chǎn)生GUID:

            HRESULTCoCreateGuid(GUID*pguid)

            如果創(chuàng)建GUID成功,則函數(shù)返回S_OK,并且pguid將指向所得到的GUID值。

            


          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();