欢迎技术交流: OPCMaster@163.com QQ:760807322
OPCMaster服务器支持OPCDA1.0、2.0、3.0和XML DA规范,大家对DA规范比较熟悉,在这里大致解释一下XML-DA和别人不同的实现思路。
OPCMaster服务器采用自己开发的动态库OM_OPCSvr.dll,也就是大家说的OPC服务器快速开发工具。最新版本的OM_OPCSvr.dll是在VS2008环境下采用STL开发的。为了跨平台不采用MFC和ATL开发语言。
一般做网关的想法是:提供8个OPC基金会规定的WEB服务器,而服务事件上是实现了OPC客户端的功能,由客户端访问到具体的服务器,我称之为串行的方法。一般采用c#开发,本人2006年曾经就是这样实现的。
WEB客户端访问示意图是:WEB客户端<------->OPCGateway<------->OPC客户端<--------->OPCDA服务器接口 <---->服务器内部的地址空间 <--------->物理设备
主要特点是:逻辑分层清楚,可以不用了解DA服务器的实现,缺点是不能跨平台(C#程序能在LINUX上跑吗),响应时间会慢,部署麻烦,需要安装IIS。
而 我希望OPC的网关(OPCGateWay)部署简单,免安装IIS,而且可以实现跨平台。这样我采用的方法是纯C++开发语言,并且是并行的方法。并行的WEB客户端访问示意图是:
WEB客户端访问示意图是:WEB客户端<------->OPCGateway<------->DA服务器内部的地址空间 <--------->物理设备
OPCDA客户端<---->OPC服务器接口<------->DA服务器内部的地址空间 <--------->物理设备
就是说WEB的XML-DA客户端和OPCDA客户端访问的路线图是并行的。之所以能免IIS,当然是完全在内部实现了IIS类似的功能。
正是因为采用了并行的方法,使得在LINUX上实现XML-DA服务器的时候,可以不依赖于OPC的相关东西,就完全看做是一个普通的WEB服务的实现。
在OM_OPCSvr.dll开发工具里,只要调用一个API函数,就可以激活XML-DA服务器的功能。
///////////// XML DA 1.0 ////////////////
// //
// Support XML DA 1.0 //
// //
//////////////////////////////////////////////////////////////////////////////////////////
BOOL OMOPCSVRAPI EnableXMLDaWebService ();
以下是开发工具的导出函数,有兴趣的可以一看。
#ifndef OM_OPCSVRAPI_H
#define OM_OPCSVRAPI_H
#ifdef OM_OPCSVRAPI_CPP
#define OMOPCSVRAPI _declspec(dllexport)
#else
#define OMOPCSVRAPI _declspec(dllimport)
#endif
typedef VOID (CALLBACK* WRITENOTIFYPROC)(HANDLE TagHandle, VARIANT *pValue, DWORD* DeviceError);
typedef VOID (CALLBACK* DISCONNECTPROC)(DWORD NumberActiveClients);
#ifdef __cplusplus
extern "C" {
#endif
/////////////////////////////////////////////////////////////////////////////////////////////
//
// Initialization and Registration functions
//
/////////////////////////////////////////////////////////////////////////////////////////////
BOOL OMOPCSVRAPI UpdateRegistry (LPCSTR strCLSID, LPCSTR strName, LPCSTR strDescr, BOOL bIsOutProcess = TRUE);
BOOL OMOPCSVRAPI UnregisterServer (LPCSTR strCLSID, LPCSTR Name);
BOOL OMOPCSVRAPI InitOPCSvr(LPCSTR strCLSID, BOOL bIsOutProc = TRUE, DWORD dwCoInit = 0);
void OMOPCSVRAPI SetVendorInfo(LPCSTR lpVendorInfo,double dbVersion );
void OMOPCSVRAPI SetServerRate(DWORD dwServerRate);
/////////////////////////////////////////////////////////////////////////////////////////////
//
// OPC Item Functions
//
/////////////////////////////////////////////////////////////////////////////////////////////
BOOL OMOPCSVRAPI SetServerDelimiter(LPCSTR lpDelimiter);
HANDLE OMOPCSVRAPI CreateTag (LPCSTR Name, VARIANT Value, WORD InitialQuality, BOOL IsWritable = FALSE);
BOOL OMOPCSVRAPI UpdateTag (HANDLE TagHandle, VARIANT Value, WORD Quality);
BOOL OMOPCSVRAPI UpdateTagWithTimeStamp (HANDLE TagHandle, VARIANT Value, WORD Quality, FILETIME timestamp);
BOOL OMOPCSVRAPI UpdateTagByName (LPCSTR Name, VARIANT Value, WORD Quality);
BOOL OMOPCSVRAPI RemoveTag (HANDLE TagHandle);
BOOL OMOPCSVRAPI RemoveTagByName (LPCSTR Name);
/////////////////////////////////////////////////////////////////////////////////////////////