📄 opcmodul.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 + -