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

📄 opcmodul.cpp

📁 OPCserver OPCserver.rar
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////////////////////
//  filename : opcmodul.cpp
//  opc server 定义文件 For DA 2.05 版
//  author: tuolin                  email: tuolin2003@sina.com
//  Lasttime: 2003/07/14
//////////////////////////////////////////////////////////////////////////////////////////////
#include "opcdefine.h"
#include "opcmodul.h"
//{90CA4F34-B61C-4e29-8DC6-B6DEF41B25BD}
GUID lpOPCClsID =
{ 0x90ca4f34, 0xb61c, 0x4e29, { 0x8d, 0xc6, 0xb6, 0xde, 0xf4, 0x1b, 0x25, 0xbd } };

LPCSTR lpOPCClsIDA="{90CA4F34-B61C-4e29-8DC6-B6DEF41B25BD}";

LPCSTR lpOPCProgID="TLSvrRDK.OPCTOOLKIT.CB6";
LPCSTR lpOPCDescr ="Tuo Lin RDK by CB6";
int MaxCounts =50;
BOOL OnRegister(){
	//注册OPC服务器

	char m_pszCurrentFile[MAX_PATH];
	String sOpcExeName;
	::GetModuleFileName(GetModuleHandle(NULL), m_pszCurrentFile, MAX_PATH);

	sOpcExeName= m_pszCurrentFile;
       	return  TL_RegistryS((char *)lpOPCClsIDA,lpOPCProgID,lpOPCDescr,sOpcExeName.c_str());
	//return  TL_Registry((BYTE *)&lpOPCClsID,lpOPCProgID,lpOPCDescr,sOpcExeName);
}
BOOL OnUnRegister(){
	//反注册OPC服务器
        char * lpcliid;
        lpcliid =(char *)lpOPCClsIDA;

	return TL_UnregisterS (lpcliid, lpOPCProgID);
	//return TL_Unregister ((BYTE *)&lpOPCClsID, lpOPCProgID);   
}
BOOL OnInitOpcServer(){
       //初始化OPC Server
       BOOL bResult;  
      //设定服务器的分隔符
       TL_SetQualifier ('.');
       
       bResult=TL_SetupRegCode("TUOLIN20030713NOTAGCOUNTS");
       bResult=TL_InitOpcServer((BYTE *)&lpOPCClsID,500);
       TL_EnableWriteNotification (WriteNotifyCallback);
       TL_EnableDisconnectNotification (&DisconnectProc);
       TL_EnableDeviceRead (&DeviceReadProc);

       m_TagList = new TList();
       return bResult;
}
void OnUnInitOpcServer(){
	//结束OPC Server
        m_TagList->Clear() ;
        delete m_TagList;
	TL_UnInitOpcServer ();
}

TList * m_TagList;  //数组指针
BOOL OnAddItem(LPSTR m_name,int m_type,VARIANT m_value,LPSTR 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.c_str() , 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->Count ;
   if ((iIndex >iTagCounts-1) || (iIndex <0))
   {
           MessageDlg("Error Range",
               mtInformation, TMsgDlgButtons() << mbOK, 0);
	   bResult=FALSE;
   } else {
       //remove opc tagname
	   pTagName = (CTagName * )m_TagList->Items[iIndex];
	   TL_RemoveTag(pTagName->m_hHWND);
	   //remove opc Array
       delete m_TagList->Items[iIndex];
       m_TagList->Delete(iIndex);
	   bResult=TRUE;
   }

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

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

__fastcall CTagName::CTagName(void) : TObject()
{//初始值
	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);

}

__fastcall CTagName::~CTagName(void)
{
	VariantClear(&m_vValue);
}

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;  		
	}
	*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,"String");
		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,String 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;
	}

	return bResult;
}
BOOL RandomVARIANT(VARIANT * m_value)
{
	BOOL bResult;
	bResult=TRUE;
	String 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.c_str() );
    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;
}
BOOL OnAddItems()
{
  int i;
  CTagName *pTag;
  char tagname[40];
  char descrname[40];
  int iTagCounts = m_TagList->Count ;
  if (iTagCounts>=MaxCounts) return false;
  pTag = new CTagName ;
  for (i=0 ;i<MaxCounts;i++){
        sprintf(tagname,"TAG%d",i);
        sprintf(descrname,"m_sDescr tag %d",i);
        //pTag->m_hHWND  = 0 ;
        switch (div(i,5).rem){
           case  1:
                pTag->m_vType = VT_I2;

                break;
           case  2:
               pTag->m_vType = VT_I4;
               break;
           case 3:
               pTag->m_vType = VT_BOOL;
               break;
            default :
               pTag->m_vType = VT_BSTR;
               break;
         }
        pTag->m_vValue.vt =pTag->m_vType;
        pTag->m_sTagName= tagname;
        pTag->m_sDescr=descrname;

        OnAddItem(tagname ,pTag->m_vType ,pTag->m_vValue, descrname );
  }
 delete pTag;
 return true;
}
BOOL OnDelItems()
{
  int i;
  if (  m_TagList==NULL) return false;
   int iTagCounts = m_TagList->Count ;
   if (iTagCounts<=0) return false;
   for (i= iTagCounts;i<=0;i--){
       OnDelItem(i);
   }

   return true;
}
BOOL OnRandomData(){
  //MaxCounts
  int i;
  CTagName *pTag;
  time_t m_time;
  FILETIME ft;
  SYSTEMTIME sysTime;
  GetSystemTime(&sysTime);
  SystemTimeToFileTime(&sysTime,&ft);

   if (  m_TagList==NULL) return false;
   int iTagCounts = m_TagList->Count ;
   for (i= 0;i<iTagCounts;i++){
       //OnDelItem(i);
        //取出指针
	pTag =(CTagName * )m_TagList->Items[i];
	//刷新值
        RandomVARIANT(&pTag->m_vValue);
        RandomQuality(&pTag->m_lQuality);
        pTag->m_ft = ft;
   }
   return true;
}
BOOL OnUpdateData(){
  //修改所有点opc server
  int i;
  CTagName *pTag;
  if (  m_TagList==NULL) return false;
  int iTagCounts = m_TagList->Count ;
   for (i=0 ;i< iTagCounts;i++){
       pTag =(CTagName * )m_TagList->Items[i];
       TL_UpdateTag(pTag->m_hHWND, pTag->m_vValue, pTag->m_lQuality);
   }
   return true;
}

⌨️ 快捷键说明

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