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

📄 opcst_x.cpp

📁 使用OPCST开发的进程外OPCDA服务器
💻 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 + -