⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opcmodul.cpp

📁 OPCserver OPCserver.rar
💻 CPP
字号:
#include "Stdafx.h" 
#include "opc\opcdefine.h"

//{90CA4F34-B61A-4e29-8DC6-B6DEF41B25BD}
static const GUID lpOPCClsID = 
{ 0x8a3cc25, 0x5953, 0x47c1, { 0x9f, 0x81, 0xef, 0xe3, 0x4, 0x6f, 0x2d, 0x8c } };

const LPSTR lpOPCClsIDA="{08A3CC25-5953-47c1-9F81-EFE3046F2D8C}";

const LPCSTR lpOPCProgID="TLSvrRDK.OPCTOOLKIT.DEMO";
const LPCSTR lpOPCDescr ="Tuo Lin RDK DEMO by Vc";

BOOL OnRegister(){
	//注册OPC服务器
	
	char m_pszCurrentFile[MAX_PATH];
	CString sOpcExeName;
	::GetModuleFileName(GetModuleHandle(NULL), m_pszCurrentFile, MAX_PATH);
	
	sOpcExeName=m_pszCurrentFile;
	return  TL_RegistryS(lpOPCClsIDA,lpOPCProgID,lpOPCDescr,sOpcExeName);
	//return  TL_Registry((BYTE *)&lpOPCClsID,lpOPCProgID,lpOPCDescr,sOpcExeName);
}
BOOL OnUnRegister(){
	//反注册OPC服务器
	return TL_UnregisterS (lpOPCClsIDA, lpOPCProgID);   
	//return TL_Unregister ((BYTE *)&lpOPCClsID, lpOPCProgID);   
}
BOOL OnInitOpcServer(){
	//初始化OPC Server
	BOOL bResult;
	//加上时演示版会出现提示框
	//bResult=TL_SetupRegCode("TUOLIN20030713NOTAGCOUNTS");
	bResult =TL_InitOpcServer((BYTE *)&lpOPCClsID,500);
    
    TL_EnableWriteNotification (WriteNotifyCallback);
    TL_EnableDisconnectNotification (&DisconnectProc);
    TL_EnableDeviceRead (&DeviceReadProc);
 
	return bResult;
}
void OnUnInitOpcServer(){
	//结束OPC Server
	TL_UnInitOpcServer ();
}

CTypedPtrArray<CObArray, CTagName*> m_TagList;  //数组指针

BOOL OnAddItem(CString m_name,int m_type,VARIANT m_value,CString m_description)
{
    CTagName * pTagName;
	
	pTagName= new CTagName() ;
	pTagName->m_sTagName =m_name;
	pTagName->m_sDescr =m_description;
	pTagName->m_vType =m_type;
	VariantCopy (& (pTagName->m_vValue) , &m_value);
	
    SYSTEMTIME sysTime;
	GetSystemTime(&sysTime);
	SystemTimeToFileTime(&sysTime,&pTagName->m_ft);
	
	//增加点
	pTagName->m_hHWND = TL_CreateTag (pTagName->m_sTagName, pTagName->m_vValue, OPC_QUALITY_BAD,TRUE);
	
	WCHAR	WCHARStr[256];
    char    buf[100];
	strcpy(buf,pTagName->m_sDescr );
    MultiByteToWideChar( CP_ACP, 0,buf , -1,WCHARStr, 256);
	VARIANT	m_DescStr;
	VariantInit (&m_DescStr);
    m_DescStr.bstrVal =SysAllocString(WCHARStr);
	//pTagName->m_sDescr 
	// 101 详见DA 2.04 中的 41页 4.4.6 节
	TL_SetTagProperties(pTagName->m_hHWND , 101,"Item Description", m_DescStr);
	VariantClear (&m_DescStr);
	//add to CObarray
	m_TagList .Add ((CTagName *)pTagName);
	
	VariantClear (&m_value);
	if (pTagName->m_hHWND !=INVALID_HANDLE_VALUE){
		return TRUE;
	} else {
		return FALSE;
	}
	
}
BOOL OnUpdateItem(CTagName * pTagItem)
{
	return  TL_UpdateTagWithTimeStamp (pTagItem->m_hHWND , pTagItem->m_vValue, pTagItem->m_lQuality ,&pTagItem->m_ft );

}
BOOL OnDelItem(int iIndex)
{
   BOOL bResult;
   CTagName * pTagName;
   //从 0 开始
   int iTagCounts = m_TagList.GetSize ();
   if ((iIndex >iTagCounts-1) || (iIndex <0))
   { 
	   AfxMessageBox("Error Range!");
	   bResult=FALSE;
   } else {
       //remove opc tagname
	   pTagName = (CTagName * )m_TagList.GetAt (iIndex);
	   TL_RemoveTag(pTagName->m_hHWND);
	   //remove opc Array 
       delete m_TagList[iIndex];
       m_TagList.RemoveAt (iIndex);
	   bResult=TRUE;	   
   }

   return bResult;
}
//////////////////////////////////////////////////////////////////////
// CTagName Class
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTagName::CTagName()
{//初始值
	m_sTagName="";//tagname
	m_sDescr="";//Description
    
	SYSTEMTIME sysTime;
	GetSystemTime(&sysTime);
	SystemTimeToFileTime(&sysTime,& m_ft);
	
	m_vType=VT_NULL;      //type
	
	m_lQuality=OPC_QUALITY_BAD;   //Quality
	
	m_hHWND=INVALID_HANDLE_VALUE;     //Handle	
	
	VariantInit (&m_vValue);
	
}

CTagName::~CTagName()
{
	
}

BOOL RandomQuality(WORD * m_Quality) 
{
	BOOL bResult;
	bResult=TRUE;
	int iRandomData; 
	iRandomData =rand() % 15;

	switch (iRandomData){		
	case 0: 
		*m_Quality= OPC_QUALITY_BAD;        
		break;
	case  1:
		*m_Quality= OPC_QUALITY_UNCERTAIN;
		break;
	case   2:
		*m_Quality= OPC_QUALITY_GOOD;
		break;
	case   3:
		*m_Quality= OPC_QUALITY_CONFIG_ERROR;
		break;
	case  4:
		*m_Quality= OPC_QUALITY_NOT_CONNECTED;
		break;
	case  5:
		*m_Quality= OPC_QUALITY_DEVICE_FAILURE;
		break;
	case  6:
		*m_Quality= OPC_QUALITY_SENSOR_FAILURE;
		break;
	case  7:
		*m_Quality= OPC_QUALITY_LAST_KNOWN;
		break;
	case  8:
		*m_Quality= OPC_QUALITY_COMM_FAILURE;
		break;
	case  9:
		*m_Quality= OPC_QUALITY_OUT_OF_SERVICE;
		break;
	case  10:
		*m_Quality= OPC_QUALITY_LAST_USABLE;
		break;
	case   11:
		*m_Quality= OPC_QUALITY_SENSOR_CAL;
		break;
	case   12:
		*m_Quality= OPC_QUALITY_EGU_EXCEEDED;
		break;
	case   13:
		*m_Quality= OPC_QUALITY_SUB_NORMAL;
		break;
	case   14:
		*m_Quality= OPC_QUALITY_LOCAL_OVERRIDE;
		break;
	default://"OPC_Unknown"
		*m_Quality= -1;
		bResult =FALSE;
        break;  		
	}
    //固定设定为OPC_QUALITY_GOOD
	*m_Quality=OPC_QUALITY_GOOD;
	return bResult;        

}
BOOL FormatQualityToString(WORD m_Quality,LPSTR m_StrValue)
{
	BOOL bResult;
	bResult=TRUE;
	char buf[50];
	switch (m_Quality){		
	case  OPC_QUALITY_BAD:
        sprintf(buf,"OPC_QUALITY_BAD");
		break;
	case  OPC_QUALITY_UNCERTAIN:
		sprintf(buf,"OPC_QUALITY_UNCERTAIN");
		break;
	case  OPC_QUALITY_GOOD :
		sprintf(buf,"OPC_QUALITY_GOOD");
		break;
	case  OPC_QUALITY_CONFIG_ERROR :
		sprintf(buf,"OPC_QUALITY_CONFIG_ERROR");
		break;
	case  OPC_QUALITY_NOT_CONNECTED:
		sprintf(buf,"OPC_QUALITY_NOT_CONNECTED");
		break;
	case  OPC_QUALITY_DEVICE_FAILURE:
		sprintf(buf,"OPC_QUALITY_DEVICE_FAILURE");
		break;
	case  OPC_QUALITY_SENSOR_FAILURE:
		sprintf(buf,"OPC_QUALITY_SENSOR_FAILURE");
		break;
	case  OPC_QUALITY_LAST_KNOWN:
		sprintf(buf,"OPC_QUALITY_LAST_KNOWN");
		break;
	case  OPC_QUALITY_COMM_FAILURE    :
		sprintf(buf,"OPC_QUALITY_COMM_FAILURE");
		break;
	case  OPC_QUALITY_OUT_OF_SERVICE  :
		sprintf(buf,"OPC_QUALITY_OUT_OF_SERVICE");
		break;
	case  OPC_QUALITY_LAST_USABLE     :
		sprintf(buf,"OPC_QUALITY_LAST_USABLE");
		break;
	case  OPC_QUALITY_SENSOR_CAL      :
		sprintf(buf,"OPC_QUALITY_SENSOR_CAL");
		break;
	case  OPC_QUALITY_EGU_EXCEEDED    :
		sprintf(buf,"OPC_QUALITY_EGU_EXCEEDED");
		break;
	case  OPC_QUALITY_SUB_NORMAL      :
		sprintf(buf,"OPC_QUALITY_SUB_NORMAL");
		break;
	case  OPC_QUALITY_LOCAL_OVERRIDE  :
		sprintf(buf,"OPC_QUALITY_LOCAL_OVERRIDE");
		break;
	default:
		sprintf(buf,"OPC_Unknown");
		bResult =FALSE;
        break;  		
	}
    strcpy(m_StrValue,buf);
	return bResult;        

}
BOOL FormatTypeToString(int iType,LPSTR m_StrValue){
	BOOL bResult;
	bResult=TRUE;
	char buf[50];
	switch (iType){
	case 0: //Boolean
		sprintf(buf,"Boolean");
		break;
	case 1: //Char
		sprintf(buf,"Char");
		break;
	case 2: //Byte
		sprintf(buf,"Byte");
		break;
	case 3: //Short
		sprintf(buf,"Short");
		break;
	case 4: //Word
		sprintf(buf,"Word");
		break;
	case 5://Long
		sprintf(buf,"Long");
		break;
	case 6://DWord
		sprintf(buf,"DWord");
		break;
	case 7://Float
		sprintf(buf,"Float");
		break;
	case 8://Double
		sprintf(buf,"Double");
		break;
	case 9://String
		sprintf(buf,"CString");
		break;
	case 10://BCD
		sprintf(buf,"BCD");
		break;
	case 11://LBCD
		sprintf(buf,"LBCD");
		break; 
	default:
		sprintf(buf,"UnKnown");	 
		bResult=FALSE;		
	}
    strcpy(m_StrValue,buf);
	return bResult;        
}
BOOL FormatStringToVARIANT(int iType,VARIANT * m_value,CString m_sValue)
{
	BOOL bResult;
	bResult=TRUE;
	switch (iType){
	case 0: //Boolean
		m_value->vt = VT_BOOL;
		break;
	case 1: //Char
		m_value->vt = VT_I1;
		break;
	case 2: //Byte
		m_value->vt = VT_UI1;
		break;
	case 3: //Short
		m_value->vt = VT_I2;
		break;
	case 4: //Word
		m_value->vt = VT_UI2;
		break;
	case 5://Long
		m_value->vt = VT_I4;
		break;
	case 6://DWord
		m_value->vt = VT_UI4;
		break;
	case 7://Float
		m_value->vt = VT_R4;
		break;
	case 8://Double
		m_value->vt = VT_UI4;
		break;
	case 9://String
		m_value->vt =VT_BSTR;
		break;
	case 10://BCD
		m_value->vt = VT_I4;;
		break;
	case 11://LBCD
		m_value->vt = VT_I4;;
		break; 
	default:
		m_value->vt =VT_I4;;
		VariantClear( m_value );
		bResult=FALSE;
		return bResult;        
	}
	
	COleVariant vt( m_sValue );   
	vt.ChangeType( m_value->vt );  //cast type
	if (m_value->vt == VT_BSTR)
	{
		m_value->bstrVal = vt.bstrVal;
	}
	else
	{
		VariantClear( m_value );
		VariantCopy( m_value,&vt);
	}
	return bResult;
}
BOOL RandomVARIANT(VARIANT * m_value)
{
	BOOL bResult;
	bResult=TRUE;  
	CString sRandStr;
	
	WCHAR	WCHARStr[256];
    char    buf[100];
	int iRandom; 
	float fRandom;
	bool bRandom;
	iRandom = rand() % 100; 
	fRandom = rand() / 100+ ((float)(rand() % 100) /100);
	if (rand() <500){
	   sRandStr="Tuolin SoftWare";
	} else {
		 if (rand() <2000){
			 sRandStr="Tuolin OPC Server";
		 }else{
			 if (rand() <5000){
                sRandStr="Rapid Development Kit";
			 }else {
                sRandStr="Rapid Development Kit 2002/10";
			 }
		 } 
	}
    strcpy(buf,sRandStr);
    MultiByteToWideChar( CP_ACP, 0,buf , -1,
        WCHARStr, 256);

	if (rand()%100 >50){
	   bRandom  =false;
	}else {
       bRandom  =true;
	}
 	
	switch(m_value->vt)
		{
		case VT_I1:
		case VT_UI1:		// BYTE
			 m_value->bVal=iRandom;
			break;
		case VT_I2:			// SHORT
			m_value->iVal =iRandom;
			break;
		case VT_UI2:		// Word
			m_value->uiVal =iRandom*100;
			break;
		case VT_I4:			// LONG
			m_value->lVal=iRandom* (-1200);
			break;
		case VT_UI4:		// DWord
			m_value->ulVal=iRandom*500; 
			break;
		case VT_INT:		// INTEGER
			 m_value->intVal=iRandom;
			break;
		case VT_UINT:		// UINT
		    m_value->uintVal =iRandom;
			break;
		case VT_R4:			// Float
			m_value->fltVal =fRandom;
			break;
		case VT_R8:			// Double
			m_value->dblVal =fRandom* 9.6;
			break;
		case VT_BSTR:		//BSTR
		 
			m_value->bstrVal = SysAllocString(WCHARStr);
			break;
		case VT_BOOL:      //Boolean
		    m_value->boolVal=bRandom;
			break;
		default:
			bResult=FALSE;
			break;
		}
	 
	return bResult;  
}
BOOL FormatVARIANTToString(VARIANT m_value,LPSTR m_sValue)
{
	BOOL bResult;
	bResult=TRUE; 
	char buf[50];
	switch(m_value.vt)
		{
		case VT_I1:
		case VT_UI1:		// BYTE
			sprintf (buf, "%d ", m_value.bVal );
			break;
		case VT_I2:			// SHORT
			sprintf	(buf, "%d ", m_value.iVal );
			break;
		case VT_UI2:		// Word
			sprintf	(buf, "%d ", m_value.uiVal );
			break;
		case VT_I4:			// LONG
			sprintf	(buf, "%ld ", m_value.lVal );
			break;
		case VT_UI4:		// DWord
			sprintf	(buf, "%ld ", m_value.ulVal );
			break;
		case VT_INT:		// INTEGER
			sprintf	(buf, "%ld ", m_value.intVal );
			break;
		case VT_UINT:		// UINT
			sprintf	(buf, "%ld ", m_value.uintVal );
			break;
		case VT_R4:			// Float
			sprintf	(buf, "%5.2f ", m_value.fltVal );
			break;
		case VT_R8:			// Double
			sprintf	(buf, "%9.5f ", m_value.dblVal );
			break;
		case VT_BSTR:		//BSTR
			sprintf	(buf, "%ls ", m_value.bstrVal );
			break;
		case VT_BOOL:      //Boolean
			if (m_value.boolVal)
				strcpy (buf, "TRUE");
			else
				strcpy (buf, "FALSE");
			break;	 
		default:
			sprintf	(buf, " Unknown type:%d ", m_value.vt );
            bResult=FALSE;
			break;
		}
	strcpy(m_sValue,buf);	
	return bResult;  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -