📄 opcmodul.cpp.bak
字号:
//////////////////////////////////////////////////////////////////////////////////////////////
// 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;
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 + -