當前位置:編程學習大全網 - 源碼下載 - 如何開發OPC Server

如何開發OPC Server

壹.準備工作:

下載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是否編寫的正確。

  • 上一篇:如何訓練神經網絡消除初始值的影響
  • 下一篇:職場的每壹步選擇,是不是比高考還難?
  • copyright 2024編程學習大全網