📄 opcst_x.cpp
字号:
#include "stdafx.h"
#include "opcst_x.h"
//////模拟应用环境
#include "stdio.h"
#include <time.h>
HINSTANCE hInstance;//模块实例
SVendorInfo VendorInfo; //OPC DA模块供应商信息
SOPCServerInfo OPCServerInfo; //OPC DA服务器参数设备
typedef union UVariant
{
VARIANT_BOOL bVar;
SHORT sVar;
LONG lVar;
FLOAT fVar;
}UVariant;
typedef struct SDeviceRecord
{
unsigned uDevID;
VARTYPE vtType;
UVariant vValue;
}SDeviceRecord;
#define BUF_SIZE 40
//模拟设备缓冲区
SDeviceRecord SimulatorBuf[BUF_SIZE];
int ii;
void InitParm()
{
VendorInfo. wBuildNumber= 12;
sprintf(VendorInfo.VendorInfo64 , "OPCDA out process test");
VendorInfo.wMajorVersion = 8;
VendorInfo.wMinorVersion = 3;
OPCServerInfo.cTagNameSeperator = '/';
OPCServerInfo.dwForceRefresh_Band = 20;
OPCServerInfo.uUpdateRate = 23;
}
void InitDeviceBuffer()
{
memset(SimulatorBuf,0,BUF_SIZE*sizeof(SDeviceRecord));
for(ii=0;ii<8;ii++)
{
SimulatorBuf[ii].uDevID = ii;
SimulatorBuf[ii].vtType = VT_BOOL;
SimulatorBuf[ii].vValue.bVar = 0;
}
for(ii=8;ii<16;ii++)
{
SimulatorBuf[ii].uDevID = ii;
SimulatorBuf[ii].vtType = VT_I2;
SimulatorBuf[ii].vValue.sVar = 0;
}
for(ii=16;ii<24;ii++)
{
SimulatorBuf[ii].uDevID = ii;
SimulatorBuf[ii].vtType = VT_I4;
SimulatorBuf[ii].vValue.lVar = 0;
}
for(ii=24;ii<32;ii++)
{
SimulatorBuf[ii].uDevID = ii;
SimulatorBuf[ii].vtType = VT_R4;
SimulatorBuf[ii].vValue.fVar = 0;
}
for(ii=32;ii<BUF_SIZE;ii++)
{
SimulatorBuf[ii].uDevID = ii;
SimulatorBuf[ii].vtType = VT_R4;
SimulatorBuf[ii].vValue.fVar = 0;
}
/* Seed the random-number generator with current time so that
* the numbers will be different every time we run.
*/
srand( (unsigned)time( NULL ) );
}
BYTE bRet_WR ;
BYTE bRet_RD;
bool WriteVariant(
unsigned devid,
VARIANT *value
)
{
if (devid >=BUF_SIZE || devid < 0)
return false;
bRet_WR= 0;
switch(value->vt)
{
case VT_BOOL:
SimulatorBuf[devid].vValue.bVar = V_BOOL(value);
break;
case VT_I2:
SimulatorBuf[devid].vValue.sVar = V_I2(value);
break;
case VT_I4:
SimulatorBuf[devid].vValue.lVar = V_I4(value);
break;
case VT_R4:
SimulatorBuf[devid].vValue.fVar = V_R4(value);
break;
default:
bRet_WR = -1;
}
if(bRet_WR != 0)
{
LOGWRITE("Write variant 's ret != 0");
return false;
}
else
return true;
}
bool ReadVariant(
unsigned devid,
VARIANT *value,
const VARTYPE vtype)
{
if (devid >=BUF_SIZE)
return false;
bRet_RD= 0;
switch(vtype)
{
case VT_BOOL:
//SimulatorBuf[devid].vValue.bVar = rand()%2;
V_BOOL(value) = SimulatorBuf[devid].vValue.bVar;
break;
case VT_I2:
//SimulatorBuf[devid].vValue.sVar = rand() %1000;
V_I2(value) = SimulatorBuf[devid].vValue.sVar;
break;
case VT_I4:
//SimulatorBuf[devid].vValue.lVar = rand() %1000;
V_I4(value) = SimulatorBuf[devid].vValue.lVar;
break;
case VT_R4:
if (devid >=32)
SimulatorBuf[devid].vValue.fVar = (float)(( rand() % 1000) * 0.997);
V_R4(value) = SimulatorBuf[devid].vValue.fVar;
break;
default:
bRet_RD = -1;
}
if(bRet_RD != 0)
{
LOGWRITE("Read variant 's ret != 0");
return false;
}
else
return true;
}
void LoadDeviceTag()
{
unsigned uOPCID;//OPC DA服务器内部ID号
VARIANT var;
VariantInit(&var);
double dMaxVal = 20000.999;
double dMinVal = -10000.999;
char Buf[128];
for(ii=0;ii<8;ii++)
{
sprintf(Buf ,"BoolTag/RW_TagName%d",ii );
V_VT(&var) = VT_BOOL;
V_BOOL(&var) = VARIANT_FALSE;
AddOPCTag(&uOPCID , ii, Buf,true, &var, 0,1) ;
}
for(ii=6;ii<16;ii++)
{
sprintf(Buf ,"ShortTag/RW_TagName%d",ii );
V_VT(&var) = VT_I2;
V_I2(&var) = 120;
AddOPCTag(&uOPCID , ii, Buf,true, &var, dMinVal,dMaxVal) ;
}
for(ii=16;ii<24;ii++)
{
sprintf(Buf ,"LongTag/RW_TagName%d",ii );
V_VT(&var) = VT_I4;
V_I4(&var) = 125;
AddOPCTag(&uOPCID , ii, Buf,true, &var, dMinVal,dMaxVal) ;
}
for(ii=24;ii<32;ii++)
{
sprintf(Buf ,"FloatTag/RW_TagName%d",ii );
V_VT(&var) = VT_R4;
V_R4(&var) = (float)18.34;
AddOPCTag(&uOPCID , ii, Buf,true, &var, dMinVal,dMaxVal) ;
}
for(ii=32;ii<BUF_SIZE;ii++)
{
sprintf(Buf ,"FloatTag/R_TagName%d",ii );
V_VT(&var) = VT_R4;
V_R4(&var) = (float)34.5656;
AddOPCTag(&uOPCID , ii, Buf,false, &var, dMinVal,dMaxVal) ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -