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

📄 extrdbi.cpp

📁 力控组态软件和extremedb实时数据库接口
💻 CPP
字号:
#include "StdAfx.h"
#include "eXtrDBI.h"
#include "PCAUTO.h"

extern eXtrDBI* g_peXtrDB;
extern PCAUTO* g_pPCAUTO;


static const char DB_NAME[]="IFeXtrDB";
static const int SEGSZ=1024*1024*20;
static const int PAGESZ=128;
static const int MAP_ADDRESS=0x20000000;
eXtrDBI::eXtrDBI()
{
	dbh=NULL;
	init(true);
}

eXtrDBI::~eXtrDBI(void)
{
	close();
}

int eXtrDBI::GetData(LPCTSTR name, float* pv)
{	

	MCO_RET rc;
	mco_trans_h t;
	mco_trans_start(dbh,MCO_READ_ONLY,MCO_TRANS_FOREGROUND,&t);
	AIO aio;
	rc=AIO_idxTree_find(t,name,wcslen(name),&aio);
	if (rc)
	{
		mco_trans_rollback(t);
		return FALSE;
	}
	rc=AIO_PV_get(&aio,pv);
	mco_trans_commit(t);
	if (rc)
	{
		mco_trans_rollback(t);
		return FALSE;
	}
	return 0;
}

int eXtrDBI::GetData(LPCTSTR name, double * pv)
{	
	float fpv;
	GetData(name, &fpv);
	*pv = fpv; 
	return 0;
	
}

int eXtrDBI::GetData(LPCTSTR name, bool * pv)
{
	float fpv;
	GetData(name,&fpv);
	if (fpv - 0.00>0.001)
	{
		*pv = TRUE;
	}
	else
	{
		*pv = FALSE;
	}
	
	return 0;


}

int eXtrDBI::SetData(LPCTSTR name, float pv)
{	

	MCO_RET rc;
	mco_trans_h t;
	mco_trans_start(dbh,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&t);
	AIO aio;
	rc=AIO_idxTree_find(t,name,wcslen(name),&aio);
	if (rc)
	{
		mco_trans_rollback(t);
		return FALSE;
	}
	rc=AIO_PV_put(&aio,pv);
	mco_trans_commit(t);


	//g_pPCAUTO->putpv(name,pv);


	if (rc)
	{
		mco_trans_rollback(t);
		return FALSE;
	}
	return 0;
}

int eXtrDBI::SetData(LPCTSTR name, double pv)
{
	return SetData(name,(float)pv);
}

int eXtrDBI::SetData(LPCTSTR name, bool pv)
{
	float fpv=(float)pv;
	return SetData(name,fpv);
}

int eXtrDBI::addrecord(LPCTSTR name,float pv)
{
	mco_trans_h t=0;
	MCO_RET rc;
	AIO aio;
	mco_trans_start(dbh, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
	
	AIO_new(t,&aio);
	AIO_NAME_put(&aio,(wchar_t *)name,(uint2)wcslen(name));
	AIO_PV_put(&aio,pv);	
	rc=mco_trans_commit(t);
	if(rc==MCO_S_OK)
		return 0;
	else
		return -1;

	
}

MCO_RET eXtrDBI::AIO_upd_handler(mco_trans_h t, AIO* obj, MCO_EVENT_TYPE et,  /*INOUT*/void* param)
{
	((eXtrDBI*)param)->AIO_updata(t, obj,  et);
	return MCO_S_OK;
}

int eXtrDBI::AIO_updata(mco_trans_h t,AIO* obj,MCO_EVENT_TYPE et)
{//AIO改变,自动更新力控

	float pv;
	TCHAR name[64];
	uint2 len ;
	mco_trans_start(dbh,MCO_READ_ONLY,MCO_TRANS_FOREGROUND,&t);
	AIO_PV_get(obj,&pv);
	AIO_NAME_get(obj,name,64,&len);
	mco_trans_commit(t);
	g_pPCAUTO->putpv(name,pv);

	return 0;
}

MCO_RET eXtrDBI::DIO_upd_handler(mco_trans_h t,DIO* obj,MCO_EVENT_TYPE et,/*INOUT*/void* param)
{
	((eXtrDBI*)param)->DIO_updata(t, obj,  et);
	return MCO_S_OK;
}
int eXtrDBI::DIO_updata(mco_trans_h t,DIO* obj,MCO_EVENT_TYPE et)
{//DIO改变,自动更新力控

	return 0;

}

int eXtrDBI::register_upd_events(void)
{
	MCO_RET rc;
	mco_trans_h t;
	mco_trans_start(dbh, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
	mco_register_upd_AIO_handler(t, &eXtrDBI::AIO_upd_handler,(void*)this,MCO_AFTER_UPDATE);
	mco_register_upd_DIO_handler(t, &eXtrDBI::DIO_upd_handler, (void*)this, MCO_AFTER_UPDATE);
	rc = mco_trans_commit(t);
	return TRUE;
}


BOOL eXtrDBI::init(BOOL bMaster)
{
	MCO_RET rc;
	mco_runtime_start();
	if (bMaster)
	{
		rc=mco_db_open(DB_NAME,IeXtrDB_get_dictionary(),(void*)MAP_ADDRESS,SEGSZ,(uint2)PAGESZ);
		if (rc)
		{
			return FALSE;
		}
	}
	rc=mco_db_connect(DB_NAME,&dbh);	
	if (rc)
	{
		return FALSE;
	}
	register_upd_events();

	bIsMaster=bMaster;
	return 0;
}

BOOL eXtrDBI::close(void)
{
	if (dbh)
	{
		mco_db_disconnect(dbh);
		mco_db_close(DB_NAME);
		mco_runtime_stop();
		dbh=NULL;
	}
	return 0;
}

⌨️ 快捷键说明

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