下載opc基金會的OPC Proxy DLL然後按照說明進行安裝。這些動態庫是opc程序運行所必須的。
1. 將下列文件拷貝至要運行OPC服務器和OPC客戶端的機器上的SYSTEM32目錄下
copy opcproxy.dll C:\WINDOWS\system32
copy opccomn_ps.dll C:\WINDOWS\system32
copy opc_aeps.dll C:\WINDOWS\system32
copy opchda_ps.dll C:\WINDOWS\system32
copy aprxdist.exe C:\WINDOWS\system32
copy opcenum.exe C:\WINDOWS\system32
2. 註冊這些 dll 文件
REGSVR32 opcproxy.dll
REGSVR32 opccomn_ps.dll
REGSVR32 opc_aeps.dll
REGSVR32 opchda_ps.dll
3. 如果在windows 系統(\WINDOWS \system32)目下不存在actxprxy.dll,運行aprxdist.exe
4. 安裝 opcenum.exe
opcenum /regserver
二.opcserver開發
1. 新建vc工程。比如建壹個控制臺工程。在工程中包含如下頭文件
#include "opcda.h"
#include "opc_ae.h"
#include "WTOPCsvrAPI.h"
#include "WtOPCsvrEXTapi.h"
以上頭文件在例子程序中都能找到,拷貝到自己的工程下。
WTOPCsvrAPI.h是開發包動態庫提供的導出函數文件。裏面有每個函數的具體說明,調用的時候看壹下說明。
2. 在.cpp中定義壹個GUID這個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
4. 初始化
(1)調用UpdateRegistry()函數完成註冊。下面是壹個調用參考例子代碼
BOOL COPCSimSvrApp::InitInstance()
{
TCHAR szTokens[] = _T("-/ ");
CString HelpPath;
CString SvrName, SvrDescrip;
int i;
HelpPath = AfxGetApp()->m_pszHelpFilePath;
i = HelpPath.ReverseFind('\\');
HelpPath = HelpPath.Left(i+1);
HelpPath += "OPCSIMSVR.EXE";
//
// Self-Registration code
// (look for cmdline options to register & unregister server)
//
SvrName = "WinTECH.OPCServer";
SvrDescrip = "WinTECH Software OPC Server Simulator";
CString tempCmdLine(m_lpCmdLine);
LPTSTR lpszToken = _tcstok(tempCmdLine.GetBuffer(1), szTokens);
while (lpszToken != NULL)
{
if (_tcsicmp(lpszToken, _T("UnregServer"))==0)
{
UnregisterServer ((BYTE *)&CLSID_OPCSimSvr, SvrName);
return (FALSE);
}
else if (_tcsicmp(lpszToken, _T("RegServer"))==0)
{
UpdateRegistry ((BYTE *)&CLSID_OPCSimSvr,
SvrName,
SvrDescrip,
HelpPath);
return (FALSE);
}
lpszToken = _tcstok(NULL, szTokens);
}
(2)調用InitWTOPCsvr完成開發包dll初始化。
以上兩個步驟不可顛倒。
5. 創建item
這裏的item是服務器所有的item,這些item通過opc庫戶端能瀏覽到。創建item的函數為CreateTag().
Opc有兩種地址空間形式:扁平和多層結構的。
比如調用創建的點為item1、item2、item3.這類結構就是扁平的。各個點類似與文件系統中的文件。
比如調用創建的點為test.item1、test.item2、test.item3這種點名,開發包會自動形成多層的點結構。Test類似與文件系統中的文件夾,item類似與文件系統中的文件夾下的文件。扁平式和多層結構在客戶端瀏覽點名時體現。
多層結構的點名之間默認是用“.”分隔。為了簡單可以將我們的opcserver設計為扁平結構。
創建壹個點時會返回壹個handle用來標識這個點。我們程序需要自己建立這個handle和數據庫中保存設備實時值的對應關系。這部分可以參考例子代碼。
6. 建立壹個定時器采集設備數據
定時從數據庫中取得各個handle對應的item的值。然後比較各個item的值是否和上壹次讀取的值有變化,如果有變化調用UpdateTagToList放入對應的隊列。開發包會自動將變化的值送到客戶端。
大致流程為
(1) 從數據庫中采集壹遍所有點的實時值。
(2) 調用StartUpdateTags()
(3) 循環讀取每個item在數據庫中的數據,和上壹次讀取到的進行比較。如果有變化調用UpdateTagToList()
(4) 最用調用EndUpdateTags()完成所有item的更新。
7. 客戶端控制
客戶端寫tag的值的時候,在opcserver是通過壹個回調函數來響應的。
在服務器端必須調用EnableWriteNotification()來指定寫值的回調函數。回調函數的格式為:
typedef VOID (CALLBACK* WRITENOTIFYPROC)(HANDLE, VARIANT*, DWORD*);
然後在回調函數內部實現從HANDLE指定的tag寫到具體的控制設備對應的變量中。
8. 其它常用函數
RequestDisconnect()壹般在opcserver在關閉時調用,用來通知客戶端opcserver自己要關閉。
NumbrClientConnections()用來計算當前有多少個客戶端連接到了opcserver
UninitWTOPCsvr()程序退出時清理
SetVendorInfo()設置廠商信息
三.opc客戶端測試
下面以本機opcquickclient.exe為例說明服務器和客戶端之間的應用關系。
1. 運行opcquickclient.exe
2. 點擊edit->new server connection 菜單。彈出server properties對話框。從中展開opc data access server version 2.0.會瀏覽到本機安裝的所有opcserver。選中我們自己開發的opcserver,點擊確定。完成與服務器的連接
3. 點擊edit->new group 用默認值添加組。
4. 點擊edit->new item 彈出如下對話框。(下圖是壹個多層結構地址空間的例子,單層的更簡單)選中左側的某個父節點,右側會顯示出各個子tag。選中要向opcserver查詢的tag,點擊add leaves。然後點擊ok
5. 在客戶端主界面上能看到剛才要查詢的tag。它會自動跟隨opcserver端數據的變化而變換。
6. 右鍵要控制的tag,在菜單中選擇同步寫或者異步寫(壹般建議用異步,避免阻塞客戶端的正常運行)。鍵入要寫入的值。查看設備上是否動作。從而檢驗opcserver是否編寫的正確。