亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? opcserver.cpp

?? opc client 工業自動化控制過程的客戶端
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include "stdafx.h"
#include "opcserver.h"
#include "opcclientdoc.h"

#define FULL_TEST

extern OPCClientDoc* theDoc;
// The OPC data formats
UINT OPCSTMFORMATDATA = RegisterClipboardFormat(_T("OPCSTMFORMATDATA"));
UINT OPCSTMFORMATDATATIME = RegisterClipboardFormat(_T("OPCSTMFORMATDATATIME"));
UINT OPCSTMFORMATWRITECOMPLETE = RegisterClipboardFormat(_T("OPCSTMFORMATWRITECOMPLETE"));

IMPLEMENT_SERIAL(Item, CObject,0)
IMPLEMENT_SERIAL(COPCGroup, CObject, 0)
IMPLEMENT_SERIAL(COPCServer, CObject, 0)

//************************************************************
//************************************************************
//************************************************************
//class Item

void Item::Serialize(CArchive& ar)
{
	if(ar.IsStoring())
	{
		ar<<name;		//名稱
		ar<<access_path;	//訪問路徑
		ar<<description;
	}
	else
	{
		ar>>name;
		ar>>access_path;
		ar>>description;
	}
}
//************************************************************
//默認構造函數
COPCGroup::COPCGroup(COPCServer* server)
	:group_name(_T("Group1")), 
	update_rate(1000),
	dead_band(0.0),
	time_bias(0),
	active(false),
	local_id(0),
	group_handle(0),
	parent(server)
{
	connection1 = 0;
	connection2 = 0;
	call_back_connection = 0;
	use_cp = false;
	
	tree_item = 0;

	advise_sink = new CAdviseSink;
	ASSERT(advise_sink);
	advise_sink->AddRef();
	
	call_back = new OPCCallbackObject;
	call_back->AddRef();

	current_item = NULL;
	while(!items.IsEmpty())
		delete items.RemoveHead();
}

//拷貝構造函數
COPCGroup::COPCGroup(COPCServer* server, COPCGroup& group)
{
	group_name = group.get_name();
	update_rate = group.get_update_rate();
	dead_band = group.get_dead_band();
	time_bias = group.get_time_bias();
	active = group.get_active();
	local_id = group.get_local_id();
	group_handle = 0;
	
	parent = group.parent;
	tree_item = 0;

	connection1 = 0;
	connection2 = 0;
	call_back_connection = 0;
	use_cp = false;
	
	advise_sink = new CAdviseSink;
	ASSERT(advise_sink);
	advise_sink->AddRef();
	
	call_back = new OPCCallbackObject;
	call_back->AddRef();
	
	current_item = NULL;
	while(!items.IsEmpty())
		delete items.RemoveHead();
	
	ItemList& item_list = group.get_items();
	POSITION item_pos = item_list.GetHeadPosition();
	while(item_pos){
		Item* item = item_list.GetNext(item_pos);
		Item* new_item = new Item;
		
		if(!new_item || !item)
			continue;
		
		CoFileTimeNow(&new_item->timestamp);
		new_item->name = item->name;
		new_item->access_path = item->access_path;
		new_item->description = item->description;
		new_item->hServerHandle = item->hServerHandle;
		new_item->quality = item->quality;
		new_item->access_rights = item->access_rights;
		new_item->active = item->active;
		new_item->native_type = item->native_type;
		new_item->value = item->value;
		new_item->server = parent;
		new_item->group = this;
		
		items.AddTail(new_item);
	}
}

COPCGroup::~COPCGroup(){

	//刪除每個點
	HRESULT hr = S_OK;
	if(opc_group.IsOk()){
		if(use_cp)
			hr = AtlUnadvise(opc_group, IID_IOPCDataCallback, call_back_connection);
		else{
			DataObject data_object;
			hr = data_object.Attach(opc_group);
			if(SUCCEEDED(hr)){
				if(connection1)
					hr = data_object.DUnadvise(connection1);
				if(connection2)
					hr = data_object.DUnadvise(connection2);

				data_object.Detach();
			}
		}
		
		int count = items.GetCount();
		if(count > 0){
			OPCItemMgt item_mgt;
			hr = item_mgt.Attach(opc_group);
			if(SUCCEEDED(hr)){
				HRESULT* errors = NULL;
				OPCHANDLE* handles = new OPCHANDLE[count];
				ASSERT(handles);

				POSITION item_pos = items.GetHeadPosition();
				for(int index = 0; item_pos; index++){
					Item* item = items.GetNext(item_pos);
					ASSERT(item);

					handles[index] = item->hServerHandle;
				}
				hr = item_mgt.RemoveItems(count, handles, &errors);
				if(SUCCEEDED(hr))
					CoTaskMemFree(errors);

				delete[] handles;

				item_mgt.Detach();
			}
		}
	}	
	if(parent && parent->is_connected()){
		hr = parent->opc_server.RemoveGroup(group_handle, FALSE);
		if(FAILED(hr))
			theDoc->ReportError(_T("Remove Group Failed: "), hr);
	}
		

	current_item = NULL;
	while(!items.IsEmpty())
		delete items.RemoveHead();

	call_back->Release();
	advise_sink->Release();

	opc_group.Detach();
}

void COPCGroup::Serialize(CArchive& ar){
	if(ar.IsStoring()){
		ar << group_name;
		ar << update_rate;
		ar << dead_band;
		ar << time_bias;
		ar << local_id;
		ar << active;

		int item_count = items.GetCount();
		ar << item_count;
		POSITION item_pos = items.GetHeadPosition();
		while(item_pos){
			Item* item = items.GetNext(item_pos);
			if(item)
				item->Serialize(ar);
		}
	}
	else{
		ar >> group_name;
		ar >> update_rate;
		ar >> dead_band;
		ar >> time_bias;
		ar >> local_id;
		ar >> active;
		
		active = TRUE;

		
		if(parent && parent->is_connected())
			parent->add_group(this);
		else{
			delete this;
			return;
		}

		while(!items.IsEmpty())
			delete items.RemoveHead();

		int item_count = 0;
		ar >> item_count;
		while(item_count --){
			Item* item = new Item;
			if(item){
				item->Serialize(ar);
				item->active = TRUE;

				//items.AddTail(item);
				add_item(item);
			}
		}
	}
}

Item* COPCGroup::add_item(Item *item)
{
	USES_CONVERSION;
	CWaitCursor wait;

	if(!(item && parent)){
		delete item;
		return 0;
	}
	
	OPCItemMgt item_mgt;
	HRESULT hr = item_mgt.Attach(opc_group);
	if(FAILED(hr)){
		delete item;
		return 0;
	}
	
	current_item = item;		//當前點

	OPCITEMDEF	item_def;
	item_def.szItemID = T2OLE(item->name.GetBuffer(0));
	item_def.szAccessPath = T2OLE(item->access_path.GetBuffer(0));
	item_def.pBlob = NULL;
	item_def.dwBlobSize = 0;
	item_def.bActive = item->active;
	item_def.hClient = (OPCHANDLE)item;
	item_def.vtRequestedDataType = item->native_type;
	
	//添加點
	OPCITEMRESULT*	results;
	HRESULT*	errors;
	hr = item_mgt.AddItems(1, &item_def, &results, &errors);
	if(FAILED(hr)){
		theDoc->ReportError(_T("Add Items: "), hr);
		delete item;

		return 0;
	}
	item->hServerHandle = results->hServer;
	item->native_type = results->vtCanonicalDataType;
	
	HRESULT item_result = errors[0];
	if(results->pBlob != NULL)
		CoTaskMemFree(results->pBlob);
	
	CoTaskMemFree(results);
	CoTaskMemFree(errors);
	
	if(FAILED(item_result)){
		theDoc->ReportError(_T("Add Items: "), hr);
		delete item;
		return 0;
	}

	items.AddTail(item);		//保存點
	
	//讀取初始值
	OPCSyncIO sync_io;
	hr = sync_io.Attach(opc_group);
	if(SUCCEEDED(hr)){
		OPCITEMSTATE* item_state = NULL;
		hr = sync_io.Read(
			OPC_DS_CACHE,
			1,
			&item->hServerHandle,
			&item_state,
			&errors);
		if(SUCCEEDED(hr)){
			ASSERT(item_state->hClient == (OPCHANDLE)item);
			item->quality = item_state->wQuality;
			item->value = item_state->vDataValue;
			
			VariantClear(&item_state->vDataValue);
			CoTaskMemFree(item_state);
			CoTaskMemFree(errors);
		}
		else{
			theDoc->ReportError(_T("SysncIO Read: "), hr);
			return 0;
		}

		sync_io.Detach();
	}
	
	return item;
}


DWORD COPCGroup::add_items(DWORD item_count, Item *item_arr)
{
	USES_CONVERSION;
	CWaitCursor wait;

	DWORD dwCount = 0;

	for(DWORD i = 0; i < item_count; i++){
		Item* item = item_arr + i;
		
		if(!(item && parent)){
			delete item;
			item = 0;
			continue;
		}
		
		OPCItemMgt item_mgt;
		HRESULT hr = item_mgt.Attach(opc_group);
		if(FAILED(hr)){
			delete item;
			item = 0;
			continue;
		}
		
		current_item = item;		//當前點
		
		OPCITEMDEF	item_def;
		item_def.szItemID = T2OLE(item->name.GetBuffer(0));
		item_def.szAccessPath = T2OLE(item->access_path.GetBuffer(0));
		item_def.pBlob = NULL;
		item_def.dwBlobSize = 0;
		item_def.bActive = item->active;
		item_def.hClient = (OPCHANDLE)item;
		item_def.vtRequestedDataType = item->native_type;
		
		//添加點
		OPCITEMRESULT*	results;
		HRESULT*	errors;
		hr = item_mgt.AddItems(1, &item_def, &results, &errors);
		if(FAILED(hr)){
			theDoc->ReportError(_T("Add Items: "), hr);
			delete item;
			item = 0;
			continue;
		}
		item->hServerHandle = results->hServer;
		item->native_type = results->vtCanonicalDataType;
		
		HRESULT item_result = errors[0];
		if(results->pBlob != NULL)
			CoTaskMemFree(results->pBlob);
		
		CoTaskMemFree(results);
		CoTaskMemFree(errors);
		
		if(FAILED(item_result)){
			theDoc->ReportError(_T("Add Items: "), hr);
			delete item;
			item = 0;
			continue;
		}
		
		items.AddTail(item);		//保存點
		
		//讀取初始值
		OPCSyncIO sync_io;
		hr = sync_io.Attach(opc_group);
		if(SUCCEEDED(hr)){
			OPCITEMSTATE* item_state = NULL;
			hr = sync_io.Read(
				OPC_DS_CACHE,
				1,
				&item->hServerHandle,
				&item_state,
				&errors);
			if(SUCCEEDED(hr)){
				ASSERT(item_state->hClient == (OPCHANDLE)item);
				item->quality = item_state->wQuality;
				item->value = item_state->vDataValue;
				
				VariantClear(&item_state->vDataValue);
				CoTaskMemFree(item_state);
				CoTaskMemFree(errors);
			}
			else{
				theDoc->ReportError(_T("SysncIO Read: "), hr);
				continue;
			}
			
			sync_io.Detach();
		}

		dwCount++;
	}

	return dwCount;
}
//****************************************************
COPCServer::COPCServer(){
	current_group = 0;
	server_info = 0;

	shut_down = new OPCShutdownObject;
	shut_down->AddRef();
	shut_down_connection = 0;

	tree_item = 0;
}

COPCServer::~COPCServer(){
	if(is_connected())
		disconnect();
	
	shut_down->Release();

	current_group = NULL;
	while(!groups.IsEmpty())
		delete groups.RemoveHead();

	if(server_info){
		delete server_info;
		server_info = 0;
	}
}


OPCServerInfo* COPCServer::SetServerInfo(OPCServerInfo *info)
{
	if(is_connected()){
		delete info;
		info = 0;
		
		return 0;
	}

	if(info){
		if(server_info)
			delete server_info;

		server_info = info;
	}

	return info;
}

//連接OPCServer
bool COPCServer::connect(OPCServerInfo *info)
{
	USES_CONVERSION;

	if(is_connected())
		return true;
	
	CWaitCursor wait_cursor;

	if(info)
		server_info = info;
	else
		info = server_info;
	
	bool use_node = true;
	if(info->m_NodeName.IsEmpty()
		|| _tcsicmp(_T(""), info->m_NodeName) == 0
		|| _tcsicmp(_T("localhost"), info->m_NodeName) == 0
		|| _tcsicmp(_T("127.0.0.1"), info->m_NodeName) ==0 ){
			use_node = false;
		}
	if(use_node){	//是否同為本機
		TCHAR sz_local_host[MAX_COMPUTERNAME_LENGTH + 1];
		DWORD dw_host_size = sizeof(sz_local_host);
		if(GetComputerName(sz_local_host, &dw_host_size)){
			if(_tcsicmp(sz_local_host, info->m_NodeName) == 0)
				use_node = false;
		}
	}
	
	//建立OPC對象
	HRESULT hr = S_OK;
	LPUNKNOWN punknown = NULL;
	
	if(!use_node){	//本地OPCServer
		hr = CoCreateInstance(

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美a级理论片| 91黄色免费观看| gogogo免费视频观看亚洲一| 欧美综合欧美视频| 久久久久99精品一区| 亚洲成人在线网站| 处破女av一区二区| 欧美一卡二卡三卡四卡| 亚洲欧美日韩电影| 黑人巨大精品欧美一区| 欧美日韩在线综合| 日韩一区中文字幕| 国产在线一区二区| 在线电影国产精品| 亚洲日本va午夜在线影院| 精品一区免费av| 精品视频在线看| 一区二区三区在线观看动漫| 国产传媒久久文化传媒| 亚洲欧美日韩小说| 狠狠狠色丁香婷婷综合激情| 欧美电影在线免费观看| 亚洲人午夜精品天堂一二香蕉| 国产麻豆一精品一av一免费| 4hu四虎永久在线影院成人| 亚洲精品乱码久久久久久黑人| 国产成人免费网站| 亚洲精品一区二区精华| 美女视频黄a大片欧美| 欧美日韩一卡二卡三卡| 一区二区三区精品在线观看| 97久久超碰国产精品| 国产精品不卡一区二区三区| 成人av在线资源网站| 国产日韩影视精品| 国产成人av资源| 中文字幕va一区二区三区| 国产精品伊人色| 国产三级一区二区| 国产激情91久久精品导航| 久久嫩草精品久久久精品一| 国产精一区二区三区| 精品国产伦一区二区三区免费 | 国产91精品欧美| 久久综合久久综合久久综合| 国产一区二区三区在线观看精品| 久久综合色鬼综合色| 国产精品一区二区三区四区| 久久综合九色欧美综合狠狠| 大桥未久av一区二区三区中文| 国产农村妇女精品| 91视频观看免费| 亚洲一区二区三区视频在线播放| 欧美在线视频全部完| 日韩国产欧美视频| 精品国产一二三| 成人激情视频网站| 亚洲黄色在线视频| 欧美一区午夜精品| 国产一区二区成人久久免费影院| 国产色一区二区| 在线免费观看日本一区| 三级在线观看一区二区| 精品国精品国产| 99视频超级精品| 天天亚洲美女在线视频| 久久看人人爽人人| 91黄色激情网站| 激情欧美日韩一区二区| 中文字幕在线观看一区| 欧美日韩一级大片网址| 国内精品在线播放| 亚洲最新在线观看| 精品国产sm最大网站| 91蜜桃在线免费视频| 蜜桃一区二区三区四区| 中文字幕在线一区| 91精品国产91久久久久久一区二区| 国产精品1区2区| 亚洲国产va精品久久久不卡综合| 日韩免费成人网| 91在线视频播放地址| 久久成人久久爱| 亚洲伊人色欲综合网| 国产日韩欧美高清| 欧美另类高清zo欧美| www.日韩精品| 久久99精品久久久久婷婷| 日韩美女精品在线| 亚洲精品一区二区三区精华液| 91丨porny丨国产入口| 韩国在线一区二区| 亚洲综合丁香婷婷六月香| 国产性天天综合网| 91精品一区二区三区久久久久久| 91视频在线观看| 国产伦精品一区二区三区视频青涩| 婷婷久久综合九色国产成人 | 一本久久a久久精品亚洲| 久久97超碰色| 日本vs亚洲vs韩国一区三区 | 亚洲综合色视频| 国产精品国产三级国产普通话99| 精品国精品国产| 日韩丝袜美女视频| 欧美另类变人与禽xxxxx| 在线精品视频小说1| 懂色av一区二区三区免费观看| 麻豆一区二区三| 五月激情丁香一区二区三区| 一区二区三区高清不卡| 中文字幕在线观看不卡视频| 国产女同性恋一区二区| 亚洲精品一线二线三线| 欧美一级免费大片| 欧美日本一区二区三区四区| 欧亚洲嫩模精品一区三区| 91亚洲国产成人精品一区二三| 国产a精品视频| 国产成人av电影在线观看| 国产福利一区二区三区视频| 国产在线国偷精品产拍免费yy| 久久精品国产免费| 久久9热精品视频| 久久国产婷婷国产香蕉| 久久国产乱子精品免费女| 蜜桃av噜噜一区二区三区小说| 日日欢夜夜爽一区| 男女男精品视频| 久久电影网电视剧免费观看| 国产一区二区剧情av在线| 国产高清视频一区| 丰满白嫩尤物一区二区| 91香蕉视频mp4| 欧美在线视频全部完| 在线播放视频一区| 日韩一级免费观看| 久久久一区二区三区捆绑**| 久久在线观看免费| 国产精品久久久久久久久免费丝袜 | 不卡一二三区首页| 在线观看区一区二| 91麻豆精品91久久久久久清纯| 精品免费视频.| 欧美激情资源网| 一区二区三区在线视频免费观看| 午夜av一区二区三区| 国产最新精品免费| 91亚洲资源网| 欧美一区三区四区| 国产欧美日韩三级| 亚洲乱码中文字幕综合| 日本中文字幕不卡| 国产成人在线色| 欧美中文字幕一区二区三区亚洲| 欧美一级久久久| 亚洲欧洲av一区二区三区久久| 亚洲地区一二三色| 国产精品2024| 欧美精品久久99久久在免费线| 欧美精品一区男女天堂| 一区二区三区日韩在线观看| 麻豆一区二区三| 一本久道久久综合中文字幕| 亚洲码国产岛国毛片在线| 免费观看日韩av| 成人av第一页| 精品国产免费人成电影在线观看四季 | 精品日产卡一卡二卡麻豆| 国产精品乱子久久久久| 日本少妇一区二区| 99视频精品在线| 久久久综合九色合综国产精品| 亚洲精品欧美激情| 国产jizzjizz一区二区| 欧美一区二区三区视频免费播放 | 国产精品日日摸夜夜摸av| 亚洲成人激情av| av电影天堂一区二区在线| 欧美电视剧免费全集观看| 亚洲黄色免费电影| 国产a久久麻豆| 久久嫩草精品久久久精品| 日韩av不卡在线观看| 一本久道久久综合中文字幕| 国产精品网曝门| 国产乱子伦视频一区二区三区| 欧美日韩二区三区| 一区二区三区日韩精品| 成人美女视频在线观看18| 久久综合999| 男女激情视频一区| 91麻豆精品国产自产在线| 一区二区三区四区激情| 99视频国产精品| 国产精品久久综合| 国产成人精品www牛牛影视| 2023国产精品视频| 久久99精品国产| 精品国产三级a在线观看|