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

📄 callback.cpp

📁 最简单的VC编写的OPC客户端程序
💻 CPP
字号:

//--------------------------------------------------------- 
// (c) COPYRIGHT 2003,2004 http://www.opc-china.com INC.
// ALL RIGHTS RESERVED
// Original Author:Jigang Si
// Original Author Email:economic@126.com 
//--------------------------------------------------------- 
#include "stdafx.h"		// for OPC: include MFC, ATL and OPC header files - for OPC only
#include "AsynOpc.h"	// include class declaration for application class
#include "AsynOpcDlg.h" // include class declaration of dialog class

#include "Callback.h"		// for OPC: include class declaration fpr this callback class

CString GetQualityText(UINT qnr);
							// for OPC: prototype for a helper function to get OPC quality 
							//          text description from quality code
float value[MAXITEMNUM];
CString quility[MAXITEMNUM];
CString timestamp[MAXITEMNUM];
float readValue[MAXITEMNUM];
CString readQulity[MAXITEMNUM];
CString readTS[MAXITEMNUM];
HRESULT writeRes[MAXITEMNUM];
int changeFlag,readFlag,writeFlag;
/////////////////////////////////////////////////////////////////////////////
//
// IOPCDataCallback - implementation
STDMETHODIMP COPCDataCallback:: OnDataChange( 
            /* [in] */ DWORD dwTransid,
            /* [in] */ OPCHANDLE hGroup,
            /* [in] */ HRESULT hrMasterquality,
            /* [in] */ HRESULT hrMastererror,
            /* [in] */ DWORD dwCount,
            /* [size_is][in] */ OPCHANDLE __RPC_FAR *phClientItems,
            /* [size_is][in] */ VARIANT __RPC_FAR *pvValues,
            /* [size_is][in] */ WORD __RPC_FAR *pwQualities,
            /* [size_is][in] */ FILETIME __RPC_FAR *pftTimeStamps,
            /* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
	{			    
	
		DWORD i;
		changeFlag=1;
		for (i = 0;  i<dwCount; i++)
		{
			value[i]=pvValues[i].fltVal ;
			quility[i]=GetQualityText(pwQualities[i]);
			timestamp[i]=COleDateTime( pftTimeStamps[i] ).Format();
        }
		return S_OK;
	};


STDMETHODIMP  COPCDataCallback::OnReadComplete( 
		/* [in] */ DWORD dwTransid,
		/* [in] */ OPCHANDLE hGroup,
		/* [in] */ HRESULT hrMasterquality,
		/* [in] */ HRESULT hrMastererror,
		/* [in] */ DWORD dwCount,
		/* [size_is][in] */ OPCHANDLE __RPC_FAR *phClientItems,
		/* [size_is][in] */ VARIANT __RPC_FAR *pvValues,
		/* [size_is][in] */ WORD __RPC_FAR *pwQualities,
		/* [size_is][in] */ FILETIME __RPC_FAR *pftTimeStamps,
		/* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
	{		
 	    readFlag=1;
		if (pErrors[0] == S_OK) 
		{
			DWORD i;
			for (i = 0;  i<dwCount; i++)
			{
				readValue[i]=pvValues[i].fltVal ;
				readQulity[i]=GetQualityText(pwQualities[i]);
				readTS[i]=COleDateTime( pftTimeStamps[i] ).Format();
			}
		} 
		else
		{
		
			CString readQuality = GetQualityText(pErrors[0]);
		}
		
	
		return S_OK;
	};


STDMETHODIMP  COPCDataCallback::OnWriteComplete( 
        /* [in] */ DWORD dwTransid,
        /* [in] */ OPCHANDLE hGroup,
        /* [in] */ HRESULT hrMastererr,
        /* [in] */ DWORD dwCount,
        /* [size_is][in] */ OPCHANDLE __RPC_FAR *pClienthandles,
        /* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
{
	writeFlag=1;
	writeRes[0]=pErrors[0];
	return S_OK;
};



CString GetQualityText(UINT qnr)
{	CString qstr;

	switch(qnr)
    
    {	case OPC_QUALITY_BAD:			qstr = "BAD";
					break;
        case OPC_QUALITY_UNCERTAIN:		qstr = "UNCERTAIN";
					break;
        case OPC_QUALITY_GOOD:			qstr = "GOOD";
					break;
		case OPC_QUALITY_NOT_CONNECTED:	qstr = "NOT_CONNECTED";
					break;
        case OPC_QUALITY_DEVICE_FAILURE:qstr = "DEVICE_FAILURE";
					break;
        case OPC_QUALITY_SENSOR_FAILURE:qstr = "SENSOR_FAILURE";
					break;
        case OPC_QUALITY_LAST_KNOWN:    qstr = "LAST_KNOWN";
					break;
        case OPC_QUALITY_COMM_FAILURE:  qstr = "COMM_FAILURE";
					break;
        case OPC_QUALITY_OUT_OF_SERVICE:qstr = "OUT_OF_SERVICE";
					break;
        case OPC_QUALITY_LAST_USABLE:	qstr = "LAST_USABLE";
					break;
        case OPC_QUALITY_SENSOR_CAL:	qstr = "SENSOR_CAL";
					break;
        case OPC_QUALITY_EGU_EXCEEDED:  qstr = "EGU_EXCEEDED";
					break;
        case OPC_QUALITY_SUB_NORMAL:	qstr = "SUB_NORMAL";
					break;
        case OPC_QUALITY_LOCAL_OVERRIDE:qstr = "LOCAL_OVERRIDE";
					break;
        default:						qstr = "UNKNOWN ERROR";
	}
	return qstr;
}

⌨️ 快捷键说明

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