www.pudn.com > vcsvr.rar > OPCDef.cpp


#include "stdafx.h" 
#include "OPCDef.h" 
#include "TagDef.h" 
 
//函数声明 
HMODULE hLibrary; 
INITOPCSERVER InitOPCSvr; 
REGSERVER RegServer; 
UNREGSERVER UnregServer; 
ACTIVECODE ActiveCode; 
CREATETAG CreateTag; 
SETTAGPROPERTIES SetTagProperties; 
UPDATETAGWITHTIMESTAMP UpdateTagWithTimeStamp; 
ENABLEWRITENOTIFICATION EnableWriteNotification; 
ENABLEDISCONNECTNOTIFICATION EnableDisconnectNotification; 
SETSERVERSTATE SetServerState; 
RUNSVR RunSvr; 
UNINITOPCSVR UninitOPCSvr; 
SHUTDOWN ShutDown; 
 
CMainFrame *pMainFrame; 
 
BOOL InitOPCDef() 
{ 
	//载入开发工具包 
	hLibrary=LoadLibrary(TEXT("opcdll.dll")); 
	//获得工具包输出函数指针 
	if(hLibrary) 
	{ 
		//初始化服务器 
		InitOPCSvr=(INITOPCSERVER)GetProcAddress(hLibrary,TEXT("InitOPCSvr")); 
		//反初始化服务器 
		UninitOPCSvr=(UNINITOPCSVR)GetProcAddress(hLibrary,"UninitOPCSvr"); 
		//注册服务器 
		RegServer=(REGSERVER)GetProcAddress(hLibrary,"RegServer"); 
		//注销服务器 
		UnregServer=(UNREGSERVER)GetProcAddress(hLibrary,"UnregServer"); 
		//序列号激活 
		ActiveCode=(ACTIVECODE)GetProcAddress(hLibrary,"ActiveCode"); 
		//设置服务启运行状态 
		SetServerState=(SETSERVERSTATE)GetProcAddress(hLibrary,"SetServerState"); 
		//运行服务器 
		RunSvr=(RUNSVR)GetProcAddress(hLibrary,"RunSvr"); 
		ShutDown=(SHUTDOWN)GetProcAddress(hLibrary,"ShutDown"); 
		//创建服务器标签 
		CreateTag=(CREATETAG )GetProcAddress(hLibrary,"CreateTag"); 
		//设置服务器标签属性 
		SetTagProperties=(SETTAGPROPERTIES )GetProcAddress(hLibrary,"SetTagProperties"); 
		//更新服务器标签数据 
		UpdateTagWithTimeStamp=(UPDATETAGWITHTIMESTAMP )GetProcAddress(hLibrary,"UpdateTagWithTimeStamp"); 
		//设置写方法函数 
		EnableWriteNotification=(ENABLEWRITENOTIFICATION )GetProcAddress(hLibrary,"EnableWriteNotification"); 
		//设置断开连接通知函数 
		EnableDisconnectNotification=(ENABLEDISCONNECTNOTIFICATION )GetProcAddress(hLibrary,"EnableDisconnectNotification"); 
		return true; 
	} 
	else return false; 
} 
 
//释放OPC工具包 
BOOL FreeOPCDef() 
{ 
	if(!hLibrary) 
	{	 
		return FreeLibrary(hLibrary); 
	} 
	else return true; 
} 
//写回调函数 
void __stdcall WriteTag(DWORD handle,VARIANT* pNewValue,DWORD* pDeviceError) 
{ 
	long I; 
	FILETIME ft; 
	*pDeviceError=-1; 
	GetSystemTimeAsFileTime(&ft); 
	for(I=0;I<=TagCount;I++) 
	{ 
		if(TagList[I].hHWND==handle) 
		{ 
			//是否调用UpdateTagWithTimeStamp由设备的驱动的通讯方式决定 
			TagList[I].vValue=*pNewValue; 
			TagList[I].lQuality=192; 
			TagList[I].ft= ft; 
			UpdateTagWithTimeStamp(TagList[I].hHWND,TagList[I].vValue,TagList[I].lQuality,TagList[I].ft); 
			*pDeviceError=0; 
			break; 
		} 
	} 
} 
//断开连接通知回调函数 
void __stdcall DisconnectSvr(DWORD Numbr) 
{ 
	//如果当前客户端连接数量为零则关闭服务器 
	if(!Numbr) 
	{	 
		UninitOPCSvr(); 
		FreeLibrary(hLibrary); 
		exit(0); 
	} 
}