下載opc基金會的OPC代理dll,按照說明安裝。這些動態庫是opc程序運行所必需的。
1.將下列文件復制到要運行OPC服務器和OPC客戶端的機器上的SYSTEM32目錄中。
復制opcproxy.dll C:\ WINDOWS \ system32
復制OPC comn _ PS . dll C:\ WINDOWS \ system32
復制OPC _ aeps . dll C:\ WINDOWS \ system32
復制op chda _ PS . dll C:\ WINDOWS \ system32
復制aprxdist.exe C:\ WINDOWS \ system32
復制opcenum.exe C:\ WINDOWS \ system32
2.註冊這些dll文件
opcproxy.dll註冊服務商32
REGSVR32 opccomn_ps.dll
REGSVR32 opc_aeps.dll
REGSVR32 opchda_ps.dll
3.如果actxprxy.dll在windows系統(\WINDOWS \system32)下不存在,請運行aprxdist.exe。
安裝opcenum.exe
opcenum /regserver
2.opcserver開發
1.新的vc項目。例如,構建控制臺項目。在項目中包含以下頭文件。
#包含“opcda.h”
#包含" opc_ae.h "
#包含" WTOPCsvrAPI.h "
#包含" WtOPCsvrEXTapi.h "
上述頭文件可以在示例程序中找到,並復制到您自己的項目中。
WTOPCsvrAPI.h是開發包的動態庫提供的導出函數文件。每個功能都有具體的說明,所以打電話時請閱讀說明。
2.在中定義guid。cpp。該GUid是用於標識opcserver的唯壹id。它可以由操作系統工具生成,也可以被編譯。格式如下。
const GUID
CLSID_OPCSimSvr = {0x99b8f472,0xc037,0x11d2,{0x80,0xb8,0x0,0x60,0x97,0x58,0x58,0xbe } }
3.在項目中添加到WtOPCSvr動態庫的連接。
WTOPCsvr動態庫的相關文件可以在前面的示例包中找到。
wtopcsvr . lib WTOPCsvr.dll是對應的lib和dll。
初始化
(1)調用UpdateRegistry()函數完成註冊。以下是調用參考示例代碼。
BOOL COPCSimSvrApp::InitInstance()
{
TCHAR SZ tokens[]= _ T("-/");
CString HelpPath
CString SvrName,SvrDescrip。
int I;
help path = AfxGetApp()-& gt;m _ pszHelpFilePath
i =幫助路徑。reverse find(' \ \ ');
幫助路徑=幫助路徑。左(I+1);
HelpPath += "OPCSIMSVR。EXE”;
//
//自行註冊碼
//(尋找cmdline選項來註冊& amp註銷服務器)
//
SvrName = "WinTECH。OPC server ";
SvrDescrip = "WinTECH軟件OPC服務器模擬器";
CString tempCmdLine(m _ lpCmdLine);
LPTSTR lpszToken = _ tcstok(tempCmdLine。GetBuffer(1),SZ tokens);
while (lpszToken!=空)
{
if (_tcsicmp(lpszToken,_T("UnregServer"))==0)
{
unregister server((BYTE *)& amp;CLSID_OPCSimSvr,SVR name);
返回(假);
}
else if (_tcsicmp(lpszToken,_T("RegServer"))==0)
{
更新註冊表((BYTE *)& amp;CLSID_OPCSimSvr,
SvrName,
SvrDescrip,
幫助路徑);
返回(假);
}
lpszToken = _tcstok(NULL,szTokens);
}
(2)調用InitWTOPCsvr完成開發包dll的初始化。
以上兩步不能顛倒。
5.創建項目
這裏的條目都是服務器的條目,可以通過opc庫用戶瀏覽。創建項目的函數是CreateTag()。
Opc有兩種地址空間形式:平面和多層結構。
例如,調用創建的點是item1、item2和item3。這種結構是扁平的。每個點都類似於文件系統中的壹個文件。
比如調用創建的點命名為test.item1,test.item2,test.item3,開發包會自動形成多層點結構。Test類似於文件系統中的壹個文件夾,item類似於文件系統中壹個文件夾下的壹個文件。客戶端瀏覽點名體現了扁平化和多層結構。
默認情況下,多層結構的名稱由“.”分隔。為簡單起見,我們可以將我們的OPC服務器設計成水平結構。
創建點時,會返回壹個句柄來標識該點。我們的程序需要建立這個句柄和數據庫中存儲的設備實時值之間的對應關系。這部分可以參考示例代碼。
6.建立壹個計時器來收集設備數據。
定期從數據庫中獲取每個句柄對應的項的值。然後比較每壹項的值與上次讀取的值是否有變化,如果有變化就調用UpdateTagToList放到對應的隊列中。開發包會自動將更改後的值發送給客戶端。
壹般過程如下
(1)從數據庫中收集所有點的實時值。
(2)調用StartUpdateTags()
(3)循環讀取數據庫中各項的數據,並與上次讀取的數據進行比較。如果有變化,調用UpdateTagToList()。
(4)通過調用EndUpdateTags()更新所有項目。
7.客戶端控件
當客戶端寫入tag的值時,OPC服務器通過回調函數進行響應。
在服務器端,必須調用EnableWriteNotification()來指定用於寫入值的回調函數。回調函數的格式是:
typedef VOID(CALLBACK * WRITENOTIFYPROC)(HANDLE,VARIANT*,DWORD *);
然後將HANDLE指定的標簽寫入回調函數內特定控件設備對應的變量中。
8.其他常用功能
RequestDisconnect()通常在opcserver關閉時調用,通知客戶端opcserver想要關閉自己。
NumbrClientConnections()用於計算當前有多少客戶端連接到opcserver。
UninitWTOPCsvr()程序退出時清理。
SetVendorInfo()設置供應商信息。
三。opc客戶端測試
下面以本地opcquickclient.exe為例說明服務器和客戶端之間的應用關系。
1.運行opcquickclient.exe
2.
單擊編輯->;新建服務器連接菜單。將彈出“服務器屬性”對話框。從中展開opc
數據訪問服務器版本
2.0.將瀏覽安裝在該機器上的所有opcserver。選擇我們自己的opcserver,然後單擊確定。完成與服務器的連接。
3.單擊編輯->;新組使用默認值添加組。
4.單擊編輯->;新建項目彈出如下對話框。(下圖是多層地址空間的例子,單層地址空間更簡單。)左邊選擇壹個父節點,右邊會顯示每個子標簽。選擇要查詢opcserver的標簽,點擊添加樹葉。然後單擊確定。
5.在客戶端主界面可以看到妳只想查詢的標簽。它會隨著opcserver數據的變化而自動變化。
6.右鍵單擊要控制的標簽,在菜單中選擇同步寫入或異步寫入(壹般建議異步寫入,以免阻塞客戶端的正常運行)。鍵入要寫入的值。查看設備上是否有動作。以便檢查OPC服務器是否被正確寫入。