《電子技術應用》
您所在的位置:首頁 > 其他 > 設計應用 > 利用OPC實現VC應用程序與PLC的數據交換
利用OPC實現VC應用程序與PLC的數據交換
摘要: VC(Visual C++)是功能強大的一種Windows應用程序可視化軟件開發工具。VC支持面向對象的設計方法,并可以使用功能強大的微軟基礎類庫MFC(Micro - soft foundation class)。并且由于Microsoft公司在操作市場上的壟斷地位,用VC開發出來的軟件穩定性好、可移植性強,而且軟件與硬件相互獨立[1],可以用來開發控制系統的上層管理系統。RSView32是作為一種專門用于工業控制的組態軟件,不僅包含了大量圖形開發工具和現成圖形庫,使用戶能夠方便的進行系統開發,而且還可以對報警、活動記錄、事件、歷史趨勢等進行組態,是一個功能強大的工業自動化產品[2],因此可以很方便地對下層設備進行組態。在實際系統開發時,利用OPC技術把兩種工具有效的結合起來,使上層的VC程序通過RSView32間接地與下層PLC進行數據通信,以獲取令人滿意的結果。
Abstract:
Key words :

1  引言
VC(Visual  C++)是功能強大的一種Windows應用程序可視化軟件開發工具。VC支持面向對象的設計方法,并可以使用功能強大的微軟基礎類庫MFC(Micro - soft foundation class)。并且由于Microsoft公司在操作市場上的壟斷地位,用VC開發出來的軟件穩定性好、可移植性強,而且軟件與硬件相互獨立[1],可以用來開發控制系統的上層管理系統。RSView32是作為一種專門用于工業控制的組態軟件,不僅包含了大量圖形開發工具和現成圖形庫,使用戶能夠方便的進行系統開發,而且還可以對報警、活動記錄、事件、歷史趨勢等進行組態,是一個功能強大的工業自動化產品[2],因此可以很方便地對下層設備進行組態。在實際系統開發時,利用OPC技術把兩種工具有效的結合起來,使上層的VC程序通過RSView32間接地與下層PLC進行數據通信,以獲取令人滿意的結果。

2  OPC介紹
OPC(OLE for Process Control)是根據Microsoft的OLE(現在Active)、COM(部件對象模型)和DCOM(分布式部件對象模型)技術所要求的功能制定的一個開放和互用式的用戶界面標準,它保證了自動化/控制應用程序和區域系統/設備之間的互用。它以OLE/COM機制作為應用程序級的通訊標準,采用 CLIENT/SERVER模式,典型的OPC體系結構如圖1所示:

 

 

圖1     典型的OPC體系結構
OPC規范中提供了兩套接口方案,即定制接口和自動化接口。定制接口效率高,通過該接口能夠發揮OPC服務器的最佳性能,采用C++語言的客戶一般采用定制接口方案;自動化接口使解釋性語言和宏語言訪問OPC服務器成為可能,采用VB等語言的客戶一般采用自動化接口。
OPC 數據存取服務器由三類對象組成:服務器(Server)、組(Group)、數據項(Item)。服務器對象用于指出特定的OPC服務器應用程序名,并作為組對象的容器;組對象存儲由若干Item組成的Group信息并邏輯組織數據項;數據項對象()存儲具體的Item的定義、數據值、狀態值等信息,一個 Item就代表一個具體的過程變量。OPC客戶應用程序要獲取OPC服務器的數據,必須事先指定服務器應用程序所在的計算機名(服務器應用程序和客戶應用程序不在同一臺PC上)、OPC數據訪問服務器名和該服務器提供的OPC項的定義。
建立OPC連接后,客戶應用程序一般可以通過三種方式從OPC 服務器讀取數據:使用同步接口IOPC- SyncIO,簡單有效,適合于只讀取少量數據的客戶程序;使用接口IOPCCallback的“訂閱”的功能OnChange,每當數據有變化時,服務器自動通知客戶;使用異步接口IOPCASyncIO2,可以直接與物理設備通訊,速度慢但數據精確度高。

3  RSView32作為OPC服務器
西門子專門用于工業控制的通用組態軟件之一RSView32支持OPC技術,它可以用作一個OPC客戶和外部OPC服務器軟件通信,也可以作為一個OPC服務器和其它第三方支持OPC技術的軟件進行連接。本文中RSView32作為服務器,VC應用程序作為客戶端,采用C/S模式實現兩者之間的數據交換
3.1  使RSView32作為OPC服務器[4]
用下列方法之一使RSView32作為OPC服務器:
(1) 選擇“啟動”編輯器里“啟動”頁上的“OPC/DDE服務器”復選框;
(2) 發出RTDataServerOn命令(從命令行或另一個 RSView32組件里,使用RTDataServerOff命令可以取消此功能),這將允許其它應用程序讀取數值但不能改變它;
(3) 發出RTDataWriteEnable命令(從命令行或另一個RSView32組件里,使用RTDataWriteDisable命令可以取消此功能),這允許從外部OPC應用程序寫入,以改變RSView32的標記值。
3.2  建立 OPC 客戶項目[4]
VC應用程序要從RSView32取得數據,必須使用下列信息:
服務器:RSI.RSView32OPCTagServer;
類型:本機/遠程;
服務器計算機名或地址:如果客戶和服務器在同一計算機上,這項可以是空白。
訪問路徑:項目名;
更新速率:一個以秒為單位的速率;
條目:標記名。可以通過查看RSView32的標簽數據庫獲得。

4  VC應用程序作為OPC客戶端的程序實現
在VC環境中使用定制接口開發OPC客戶應用程序,下面是程序實現的關鍵步驟。
4.1  包含OPC頭文件
開發OPC客戶應用程序,除了需要OPC接口外,還需要在程序中包含OPC標準庫文件,可以從OPC基金會網站(網址:www.opcfoundation.org)下載這些文件:
#include "opcda_i.c"    OPC數據存取接口
#include "opcda.h"      OPC數據存取2.0頭文件
#include "opccomn_i.c"  OPC公共接口定義
#include "opccomn.h"    OPC公共頭文件
4.2  初始化COM支持庫
由于OPC是基于COM技術制定,所以在使用接口類之前必須首先使用CoInitialize(NULL)函數初始化COM庫,如果成功,函數返回值等于S_ OK。
4.3  連接opc服務器
OPC 客戶能夠連接到OPC服務器上,并建立OPC組和OPC數據項,這是OPC數據訪問的基礎,如果沒有這個機制,數據訪問的其它機能不可能實現[4]。連接 OPC服務器,OPC客戶需要事先指定計算機名(如果OPC服務器和OPC客戶不在同一臺計算機上)和OPC數據訪問服務器名 (RSI.RSView32OPCTagServer)。實現代碼如下:
ConnectToServer(/*in */LPOLESTR ProgID,/*in*/ BOOL IsRemote,/*out */ IUnknown **ppUnknown)
{
CLSID OPCCLSID;
HRESULT hRet=CLSIDFromProgID(ProgID,&OPCCLSID);
//將字符串ProgID轉換為唯一OPCCLSID
if(IsRemote)
//opc服務器和opc客戶不在同一臺計算機上
{  
COSERVERINFO ServerInfo;
memset(&ServerInfo,0,sizeof(ServerInfo));
ServerInfo.pwszName=T2OLE("ServerComouter");
MULTI_QI qi[1];
memset(qi, 0, sizeof(qi));
qi[0].pIID=&IID_IUnknown;
HRESULT hRet=CoCreateInstanceEx(OPCCLSID,NULL,CLSCTX_REMOTE_SERVER,
&ServerInfo,1,qi);
*ppUnknown=qi[0].pItf;
}
else
//opc服務器和opc客戶在同一臺計算機上
{
hRet=CoCreateInstance(OPCCLSID,NULL,CLSCTX_LOCAL_SERVER,IID_IUnknown,
(void **)ppUnknown);
}
}

4.4  創建OPC組
IOPCServer接口的AddGroup()方法可以創建一個有指定名稱和屬性的OPC組。在調用該方法之前,可以使用上一步得到的Iunknown接口指針,通過QueryInterface()方法請求IOPCServer接口指針。代碼如下:  
ppUnknown->QueryInterface(IID_IOPCServer,(void **)&pServer);
//得到IOPCServer接口指針
pServer->AddGroup(L"",TRUE,500,1235,&lTimeBias,&fTemp,0,&hOPCServerGroup,  &dwActualRate,IID_IOPCItemMgt,& pOPCItemMgt);
4.5  添加數據項
IOPCItemMgt接口的AddItem()方法可以添加具有特殊屬性的指定數量的數據項。
pOPCItemMgt->AddItems(ItemNumber,ItemArray,
(OPCITEMRESULT**)&pItemResult,(HRESULT **)&pErrors);
ItemArray 為OPCITEMDEF類型結構數組,它包含數據項的詳細信息,客戶需要知道要進行交換的數據在RSView32標簽數據庫中的名稱、數據類型及作為 OPC服務器的RSView32項目名稱。添加數據項之前,要用這些數據項信息對ItemArray結構數組進行初始化。
4.6  數據交換
成功地增加完所需要的數據項后,OPC客戶(VC應用程序)和OPC服務器(RSView32)就可以進行數據交換了。在數據量不大的情況下,可以使用 IOPCSyncIO同步接口的Write()和Read()兩個方法進行數據的讀寫操作,從而實現OPC客戶(VC應用程序)和OPC服務器 (RSView32)之間的數據交換。代碼如下:
ppUnknown->QueryInterface(IID_IOPCSyncIO,(void **)&pOPCSync);
//得到IOPCSyncIO接口指針
pOPCSync->Read(OPC_DS_CACHE,ReadNumber,hServerRead,&pItemValue,&pErrors);
//讀ReadNumber個數據
pOPCSync->Write(WriteNumber,hServerWrite,WriteValue,&pErrors);
//寫WriteNumber個數據
4.7  釋放接口指針
在VC應用程序停止運行之前必須使用Release()方法刪除已創建的OPC對象并釋放內存。

 

5  結束語
OPC技術規范把硬件供應商和應用軟件開發者分離開來,使得雙方的工作效率都有了很大提高。軟件開發商無需了解硬件的實質和操作過程,就能訪問OPC數據服務器中的數據,尤其是開發商在已使用了組態軟件進行實時監控的過程控制系統基礎上,用C++等高級語言開發系統時,大大簡化了過去從設備傳輸數據的復雜過程。在某鋁廠的自動配料系統開發中,應用OPC技術方便地實現了VC應用程序和RSView32的數據交換,間接地實現了VC應用程序與PLC的通信,獲得了很好的結果。

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品盗摄一区二区三区| 亚洲二区在线观看| 卡一卡二国产精品| 久久国产精品免费一区| 午夜精品久久99蜜桃的功能介绍| 亚洲免费激情| 亚洲欧洲综合另类| 亚洲国产精品久久久久秋霞蜜臀 | 一区二区三区久久精品| 亚洲乱码国产乱码精品精天堂 | 久久九九99| 久久精品国产一区二区三区免费看| 羞羞视频在线观看欧美| 亚洲欧美日本国产专区一区| 亚洲女人av| 香蕉久久一区二区不卡无毒影院| 性做久久久久久久久| 久久精品国产亚洲高清剧情介绍| 久久久久高清| 麻豆久久精品| 欧美国产视频日韩| 欧美日韩一区二区三区高清| 欧美视频一区二区三区| 欧美午夜电影在线| 国产精品久久久亚洲一区 | 欧美激情一区二区三区在线视频观看| 欧美电影免费观看高清| 欧美日韩国产高清| 欧美午夜电影一区| 国产日韩一区二区三区| 极品尤物av久久免费看| 亚洲国产精品久久久久婷婷老年 | 在线综合欧美| 亚洲欧美日本国产专区一区| 久久丁香综合五月国产三级网站| 亚洲大片免费看| 99在线精品观看| 中文一区二区在线观看| 性色一区二区| 另类欧美日韩国产在线| 欧美国产日产韩国视频| 欧美日韩亚洲另类| 国产精品私房写真福利视频| 国产午夜精品一区二区三区视频| 在线观看中文字幕不卡| 日韩视频专区| 性一交一乱一区二区洋洋av| 亚洲国产你懂的| 正在播放亚洲一区| 久久精品1区| 欧美破处大片在线视频| 国产目拍亚洲精品99久久精品 | 亚洲精品色婷婷福利天堂| 亚洲一区二区在线观看视频| 久久激情五月激情| 欧美精品一区在线| 国产色产综合产在线视频| 亚洲激情偷拍| 亚洲欧美一区二区原创| 最新国产精品拍自在线播放| 亚洲一区二区网站| 麻豆freexxxx性91精品| 国产精品豆花视频| 伊人夜夜躁av伊人久久| 一区二区三区免费在线观看| 久久黄色影院| 亚洲欧美日韩精品一区二区| 免费欧美在线视频| 国产麻豆91精品| 亚洲精品一二| 久久黄金**| 午夜精品福利视频| 欧美激情综合网| 国产一区二区久久| 99精品福利视频| 亚洲国产精品成人综合色在线婷婷| 亚洲午夜久久久久久久久电影网| 久久久亚洲成人| 国产精品jizz在线观看美国 | 香蕉久久精品日日躁夜夜躁| 一区二区三区欧美成人| 久热成人在线视频| 国产酒店精品激情| 亚洲最快最全在线视频| 亚洲国产日韩欧美在线图片| 欧美一区亚洲二区| 欧美色播在线播放| 亚洲福利视频网| 欧美一区永久视频免费观看| 亚洲综合欧美| 欧美日韩国产一区二区三区地区| 今天的高清视频免费播放成人| 亚洲免费视频中文字幕| 亚洲视频在线二区| 欧美国产在线电影| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲一区二区免费在线| 亚洲图片在线观看| 欧美精品久久久久久久免费观看| 激情久久久久久久久久久久久久久久 | 一区二区三区四区五区视频| 欧美日韩1区| 亚洲视频在线看| 亚洲福利视频一区| 久久国产精品久久w女人spa| 国产精品久久久久久久久搜平片 | 蜜桃伊人久久| 国语自产精品视频在线看抢先版结局 | 亚洲国产激情| 久久久久免费观看| 国产视频在线一区二区 | 日韩一区二区精品葵司在线| 老司机午夜精品| 国产主播一区二区三区四区| 欧美在线关看| 久久超碰97人人做人人爱| 国产欧美日韩一区二区三区| 亚洲影院免费| 欧美一区二区三区四区高清| 国产精品免费观看在线| 宅男噜噜噜66国产日韩在线观看| 在线中文字幕日韩| 欧美午夜欧美| 亚洲一区二区黄色| 性感少妇一区| 欧美国产免费| 欧美视频在线免费看| 正在播放亚洲一区| 亚洲欧美制服中文字幕| 国产乱码精品一区二区三区忘忧草 | 国产精品理论片| 亚洲影视九九影院在线观看| 久久国产88| 黄色日韩网站视频| 亚洲国产美女久久久久| 欧美精品一区在线观看| 一区二区三区日韩精品视频| 亚洲欧美日韩国产另类专区| 国产精品视频男人的天堂| 欧美一级大片在线观看| 久久久夜夜夜| 亚洲区在线播放| 中文欧美字幕免费| 国产欧美短视频| 亚洲国产精品黑人久久久| 欧美福利网址| 一区二区三区欧美成人| 久久精品99国产精品酒店日本| 伊人狠狠色丁香综合尤物| 日韩亚洲欧美成人一区| 国产精品福利网站| 午夜精品一区二区在线观看| 久久综合九色综合欧美就去吻| 亚洲人成网在线播放| 亚洲免费在线视频| 国产在线精品一区二区中文| 亚洲美女中出| 国产精品欧美精品| 亚洲国产三级| 国产精品国产a| 久久av资源网| 欧美日本三级| 午夜精品久久久久久久久久久久久 | 久久激情网站| 亚洲肉体裸体xxxx137| 翔田千里一区二区| 1000部精品久久久久久久久| 一区二区三区四区五区视频| 国产精品一页| 亚洲免费观看高清完整版在线观看熊 | 久久久夜夜夜| 一本色道久久综合一区| 久久综合九色综合欧美就去吻| 日韩一级精品视频在线观看| 久久精品视频在线免费观看| 亚洲美女精品成人在线视频| 久久久九九九九| 99re6这里只有精品| 久久影院午夜片一区| 亚洲视频一起| 免费人成精品欧美精品| 亚洲自拍高清| 欧美国产1区2区| 欧美亚洲免费| 欧美视频在线观看| 亚洲精品国产精品国自产观看浪潮 | 欧美日韩成人在线| 欧美在线视频播放| 国产精品chinese| 最新亚洲视频| 国产人成精品一区二区三| 夜夜嗨av一区二区三区网站四季av| 国产日韩精品综合网站| 亚洲图片自拍偷拍| 亚洲第一页中文字幕| 久久免费视频观看| 亚洲午夜久久久| 欧美日韩国产三级| 亚洲激情小视频| 国产一区二区三区丝袜|