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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? item.cpp

?? OPC客戶(hù)端源代碼
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
// **************************************************************************
// item.cpp
//
// Description:
//	Implements the CKItem class.  On object of this class is associated with
//	each OPC item we wish to exchange data with.
//
// DISCLAIMER:
//	This programming example is provided "AS IS".  As such Kepware, Inc.
//	makes no claims to the worthiness of the code and does not warranty
//	the code to be error free.  It is provided freely and can be used in
//	your own projects.  If you do find this code useful, place a little
//	marketing plug for Kepware in your code.  While we would love to help
//	every one who is trying to write a great OPC client application, the 
//	uniqueness of every project and the limited number of hours in a day 
//	simply prevents us from doing so.  If you really find yourself in a
//	bind, please contact Kepware's technical support.  We will not be able
//	to assist you with server related problems unless you are using KepServer
//	or KepServerEx.
// **************************************************************************


#include "stdafx.h"
#include "opctestclient.h"
#include "item.h"
#include "group.h"

#pragma comment (lib, "ole32.lib")
#pragma comment (lib, "oleaut32.lib") 

#define VERSION_1			1
#define CURRENT_VERSION		VERSION_1


// **************************************************************************
// String container object for items
// **************************************************************************
class CStringContainer
	{
	public:
		// Constructor:
		CStringContainer ()
			{
			LPCTSTR lpszDefault = _T("");

			// Initialize member variables.  Strings set to NULL string.
			m_lpszQualityBad = lpszDefault;
			m_lpszQualityBadConfigError = lpszDefault;
			m_lpszQualityBadNotConnected = lpszDefault;
			m_lpszQualityBadDeviceFailure = lpszDefault;
			m_lpszQualityBadSensorFailure = lpszDefault;
			m_lpszQualityBadLastKnownValue = lpszDefault;
			m_lpszQualityBadCommFailure = lpszDefault;
			m_lpszQualityBadOutOfService = lpszDefault;
			m_lpszQualityUncertain = lpszDefault;
			m_lpszQualityUncertainLastUsableValue = lpszDefault;
			m_lpszQualityUncertainSensorNotAccurate = lpszDefault;
			m_lpszQualityUncertainEUExceeded = lpszDefault;
			m_lpszQualityUncertainSubnormal = lpszDefault;
			m_lpszQualityGood = lpszDefault;
			m_lpszQualityGoodLocalOverride = lpszDefault;
			m_lpszQualityNoValue = lpszDefault;

			m_lpszUnknown = lpszDefault;
			m_lpszNonApplicable = lpszDefault;

			m_bInitialized = false;
			}

		// Initialize container object.
		void Initialize ()
			{
			// Load string resources and assign public pointers if we haven't
			// already done so:
			if (!m_bInitialized)
				{
				// Load quality string resources:
				m_strQualityBad.LoadString (IDS_QUALITY_BAD);
				m_strQualityBadConfigError.LoadString (IDS_QUALITY_BAD_CONFIGERROR);
				m_strQualityBadNotConnected.LoadString (IDS_QUALITY_BAD_NOTCONNECTED);
				m_strQualityBadDeviceFailure.LoadString (IDS_QUALITY_BAD_DEVICEFAILURE);
				m_strQualityBadSensorFailure.LoadString (IDS_QUALITY_BAD_SENSORFAILURE);
				m_strQualityBadLastKnownValue.LoadString (IDS_QUALITY_BAD_LASTKNOWNVALUE);
				m_strQualityBadCommFailure.LoadString (IDS_QUALITY_BAD_COMMFAILURE);
				m_strQualityBadOutOfService.LoadString (IDS_QUALITY_BAD_OUTOFSERVICE);
				m_strQualityUncertain.LoadString (IDS_QUALITY_UNCERTAIN);
				m_strQualityUncertainLastUsableValue.LoadString (IDS_QUALITY_UNCERTAIN_LASTUSEABLEVALUE);
				m_strQualityUncertainSensorNotAccurate.LoadString (IDS_QUALITY_UNCERTAIN_SENSORNOTACCURATE);
				m_strQualityUncertainEUExceeded.LoadString (IDS_QUALITY_UNCERTAIN_EUEXCEEDED);
				m_strQualityUncertainSubnormal.LoadString (IDS_QUALITY_UNCERTAIN_SUBNORMAL);
				m_strQualityGood.LoadString (IDS_QUALITY_GOOD);
				m_strQualityGoodLocalOverride.LoadString (IDS_QUALITY_GOOD_LOCALOVERRIDE);
				m_strQualityNoValue.LoadString (IDS_QUALITY_NOVALUE);

				// Assign to public pointers:
				m_lpszQualityBad = m_strQualityBad;
				m_lpszQualityBadConfigError = m_strQualityBadConfigError;
				m_lpszQualityBadNotConnected = m_strQualityBadNotConnected;
				m_lpszQualityBadDeviceFailure = m_strQualityBadDeviceFailure;
				m_lpszQualityBadSensorFailure = m_strQualityBadSensorFailure;
				m_lpszQualityBadLastKnownValue = m_strQualityBadLastKnownValue;
				m_lpszQualityBadCommFailure = m_strQualityBadCommFailure;
				m_lpszQualityBadOutOfService = m_strQualityBadOutOfService;
				m_lpszQualityUncertain = m_strQualityUncertain;
				m_lpszQualityUncertainLastUsableValue = m_strQualityUncertainLastUsableValue;
				m_lpszQualityUncertainSensorNotAccurate = m_strQualityUncertainSensorNotAccurate;
				m_lpszQualityUncertainEUExceeded = m_strQualityUncertainEUExceeded;
				m_lpszQualityUncertainSubnormal = m_strQualityUncertainSubnormal;
				m_lpszQualityGood = m_strQualityGood;
				m_lpszQualityGoodLocalOverride = m_strQualityGoodLocalOverride;
				m_lpszQualityNoValue = m_strQualityNoValue;

				// Load unknown string resource:
				m_strUnknown.LoadString (IDS_UNKNOWN);
				m_lpszUnknown = m_strUnknown;

				// Load non-applicable string resource:
				m_strNonApplicable.LoadString (IDS_NONAPPLICABLE);
				m_lpszNonApplicable = m_strNonApplicable;
				
				// Set initialized flag so we don't waste time loading string 
				// resources if called again.
				m_bInitialized = true;
				}
			}

	public:
		// Quality strings:
		LPCTSTR m_lpszQualityBad;
		LPCTSTR m_lpszQualityBadConfigError;
		LPCTSTR m_lpszQualityBadNotConnected;
		LPCTSTR m_lpszQualityBadDeviceFailure;
		LPCTSTR m_lpszQualityBadSensorFailure;
		LPCTSTR m_lpszQualityBadLastKnownValue;
		LPCTSTR m_lpszQualityBadCommFailure;
		LPCTSTR m_lpszQualityBadOutOfService;
		LPCTSTR m_lpszQualityUncertain;
		LPCTSTR m_lpszQualityUncertainLastUsableValue;
		LPCTSTR m_lpszQualityUncertainSensorNotAccurate;
		LPCTSTR m_lpszQualityUncertainEUExceeded;
		LPCTSTR m_lpszQualityUncertainSubnormal;
		LPCTSTR m_lpszQualityGood;
		LPCTSTR m_lpszQualityGoodLocalOverride;
		LPCTSTR m_lpszQualityNoValue;

		LPCTSTR m_lpszUnknown;
		LPCTSTR m_lpszNonApplicable;

	private:
		// Quality strings:
		CString m_strQualityBad;
		CString m_strQualityBadConfigError;
		CString m_strQualityBadNotConnected;
		CString m_strQualityBadDeviceFailure;
		CString m_strQualityBadSensorFailure;
		CString m_strQualityBadLastKnownValue;
		CString m_strQualityBadCommFailure;
		CString m_strQualityBadOutOfService;
		CString m_strQualityUncertain;
		CString m_strQualityUncertainLastUsableValue;
		CString m_strQualityUncertainSensorNotAccurate;
		CString m_strQualityUncertainEUExceeded;
		CString m_strQualityUncertainSubnormal;
		CString m_strQualityGood;
		CString m_strQualityGoodLocalOverride;
		CString m_strQualityNoValue;
		
		// Unknown:
		CString m_strUnknown;
		CString m_strNonApplicable;

		bool m_bInitialized;
	
	} cStringContainer;


/////////////////////////////////////////////////////////////////////////////
// CKItem construction/destruction
/////////////////////////////////////////////////////////////////////////////

// **************************************************************************
// CKItem ()
//
// Description:
//	Constructor
//
// Parameters:
//  CKGroup		*pParent	Pointer to parent group.
//
// Returns:
//  none
// **************************************************************************
CKItem::CKItem (CKGroup *pParent)
	{
	// Initialize string container so we can return strings:
	cStringContainer.Initialize ();

	// Initialize other member variables:
	ASSERT (pParent != NULL);
	m_pGroup = pParent;

	m_bActive			= FALSE;
	m_vtDataType		= VT_EMPTY;
	m_dwAccessRights	= OPC_READABLE;

	m_bValid			= FALSE;
	m_bTimeStamped		= FALSE;

	ZeroMemory (&m_bfFlags, sizeof (m_bfFlags));
	
	GetSystemTimeAsFileTime (&m_ftTimeStamp);
	VariantInit (&m_vtValue);

	m_wQuality	= OPC_QUALITY_BAD_OUT_OF_SERVICE;
	m_cdwUpdates = 0;

	m_hServer	= NULL;
	m_pPrev		= NULL;
	m_pNext		= NULL;

	m_wParam	= 0;
	}

// **************************************************************************
// ~CKItem ()
//
// Description:
//	Destructor
//
// Parameters:
//  none
//
// Returns:
//  none
// **************************************************************************
CKItem::~CKItem ()
	{
	// Make sure our variant members get cleaned up properly:
	VariantClear (&m_vtValue);
	}


/////////////////////////////////////////////////////////////////////////////
// CKItem manipulators
/////////////////////////////////////////////////////////////////////////////

// **************************************************************************
// UpdateData ()
//
// Description:
//	Called to update the item's data and quality.
//
// Parameters:
//  VARIANT		&vtVal		Item's data.
//	WORD		wQuality	Item's quality.
//
// Returns:
//  void
// **************************************************************************
void CKItem::UpdateData (VARIANT &vtVal, WORD wQuality)
	{
	// Create a CSafeLock to make this object thread safe.  Our critical
	// section gets locked here, and will automatically be unlocked when the
	// CSafeLock goes out of scope.
	CSafeLock cs (&m_csDataLock);

	// Update item value:
	VariantCopy (&m_vtValue, &vtVal);

	// Update item quality:
	m_wQuality = wQuality;

	// This function is used for non-timestamped data:
	m_bTimeStamped = FALSE;

	// Increment update count:
	++m_cdwUpdates;
	}

// **************************************************************************
// UpdateData ()
//
// Description:
//	Called to update the item's data, quality and timestamp.
//
// Parameters:
//  VARIANT		&vtVal			Item's data.
//	WORD		wQuality		Item's quality.
//	FILETIME	&ftTimeStamp	Item's timestap.
//
// Returns:
//  void
// **************************************************************************
void CKItem::UpdateData (VARIANT &vtVal, WORD wQuality, FILETIME &ftTimeStamp)
	{
	// Create a CSafeLock to make this object thread safe.  Our critical
	// section gets locked here, and will automatically be unlocked when the
	// CSafeLock goes out of scope.
	CSafeLock cs (&m_csDataLock);

	// Update item value:
	VariantCopy (&m_vtValue, &vtVal);

	// Update item quality:
	m_wQuality = wQuality;

	// Update item timestamp:
	m_bTimeStamped = TRUE;
	m_ftTimeStamp = ftTimeStamp;

	// Increment update count:
	++m_cdwUpdates;
	}

// **************************************************************************
// GetValue ()
//
// Description:
//	Returns a string representation of the current value.
//
// Parameters:
//  CString		&strValue	Output string.
//
// Returns:
//  void
// **************************************************************************
void CKItem::GetValue (CString &strValue)
	{
	// Create a CSafeLock to make this object thread safe.  Our critical
	// section gets locked here, and will automatically be unlocked when the
	// CSafeLock goes out of scope.
	CSafeLock cs (&m_csDataLock);

	// If item is active and valid, we can rely on server's data:
	if (IsValid ())
		{
		TCHAR szNum [32];

		// If data item is an array:
		if (m_vtValue.vt & VT_ARRAY)
			{
			// Format output string:
			switch (m_vtValue.vt)
				{
				// Supported types:
				case VT_UI1	| VT_ARRAY:
				case VT_I1	| VT_ARRAY:
				case VT_UI2	| VT_ARRAY:
				case VT_I2	| VT_ARRAY:
				case VT_UI4	| VT_ARRAY:
				case VT_I4	| VT_ARRAY:
				case VT_R4	| VT_ARRAY:
				case VT_R8	| VT_ARRAY:
					{
					// Get pointer to array data:
					CSafeArray *pSafeArr = (CSafeArray *) m_vtValue.parray;

					// Process array data if pointer appears to be good:
					if (pSafeArr)
						{
						// Get the array dimensions:
						DWORD dwCols = pSafeArr->GetNumCols ();
						DWORD dwSize = pSafeArr->GetByteLength ();
						ULONG cbElements = pSafeArr->cbElements;
						LPBYTE lpByte = (LPBYTE)pSafeArr->pvData;
						DWORD dwCol = 0;

						// Start delimiter out putput string:
						strValue = _T("[ ");

						// Cycle through the elements:
						for (DWORD i = 0; i < dwSize; i += cbElements, lpByte += cbElements)
							{
							// Format a string for each element according to data type:

							// Single-byte types:
							if (cbElements == 1)
								{
								if (m_vtValue.vt ==	(VT_UI1 | VT_ARRAY))
									_stprintf (szNum, _T("%u"), *lpByte);
								else
									_stprintf (szNum, _T("%d"), *(char *)lpByte);
								}
							
							// Two-byte types:
							else if (cbElements == 2)
								{
								if (m_vtValue.vt ==	(VT_UI2 | VT_ARRAY))
									_stprintf (szNum, _T("%u"), *(WORD *)lpByte);
								else 
									_stprintf (szNum, _T("%d"), *(short *)lpByte);
								}
							
							// Four-byte types:
							else if (cbElements == 4)
								{
								if (m_vtValue.vt ==	(VT_R4	| VT_ARRAY))
									_stprintf (szNum, _T("%G"), *(float *)lpByte);
								else if (m_vtValue.vt ==	(VT_UI4	| VT_ARRAY))
									_stprintf (szNum, _T("%u"), *(DWORD *)lpByte);
								else if (m_vtValue.vt ==	(VT_I4	| VT_ARRAY))
									_stprintf (szNum, _T("%d"), *(DWORD *)lpByte);
								}

							// Eight-byte types:
							else if (cbElements == 8)
								_stprintf (szNum, _T("%G"), *(double *)lpByte);

							// Else something is foobar!
							else
								{
								ASSERT (FALSE);
								}

							// Delimit each element within the row:
							if (dwCol != 0)
								strValue += _T(", ");

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区视频在线播放 | 国产婷婷一区二区| 欧美高清视频一二三区 | 国产无一区二区| 久久久久久久综合色一本| 欧美一区二区三区视频免费播放| 日本高清成人免费播放| 97se狠狠狠综合亚洲狠狠| 99久久精品99国产精品| 色综合久久综合网欧美综合网| 成人av资源在线观看| 国产成人免费视频网站高清观看视频| 国产一区二区视频在线播放| 精品中文字幕一区二区小辣椒| 裸体在线国模精品偷拍| 久久国产精品99精品国产| 激情深爱一区二区| 国产成人精品亚洲日本在线桃色 | 99国产精品久| 色诱视频网站一区| 欧美日韩另类国产亚洲欧美一级| 欧美天堂一区二区三区| 91麻豆精品国产自产在线观看一区 | 欧美国产精品一区二区| 国产精品看片你懂得| 亚洲色图色小说| 亚洲高清视频的网址| 日本中文一区二区三区| 国产一区二区三区电影在线观看| 成人性生交大片免费看中文| 91免费观看国产| 51精品国自产在线| 国产亚洲欧美在线| 一级女性全黄久久生活片免费| 日本大胆欧美人术艺术动态 | 国产精品看片你懂得| 悠悠色在线精品| 日韩高清国产一区在线| 韩国女主播一区| 色综合一区二区| 日韩欧美一级特黄在线播放| 国产亚洲精品7777| 午夜在线成人av| 国产传媒欧美日韩成人| 在线视频观看一区| xf在线a精品一区二区视频网站| 中文无字幕一区二区三区| 亚洲蜜臀av乱码久久精品蜜桃| 日本在线播放一区二区三区| 粉嫩av一区二区三区在线播放| 色婷婷亚洲精品| www久久精品| 亚洲午夜免费视频| 国产酒店精品激情| 欧美猛男gaygay网站| 久久久亚洲午夜电影| 亚洲一区二区三区不卡国产欧美 | 日韩精品一区二区三区视频播放| 国产精品乱码一区二三区小蝌蚪| 午夜视频在线观看一区二区| 成人黄色小视频| 日韩欧美综合一区| 亚洲三级在线看| 国产一区二区三区不卡在线观看 | 国产成人丝袜美腿| 欧美一区二区三区色| 亚洲精品中文在线影院| 国产精品一品二品| 日韩欧美国产麻豆| 亚洲国产一区在线观看| www.性欧美| 国产亚洲欧洲997久久综合 | 精品国产露脸精彩对白| 成人午夜在线播放| 亚洲人吸女人奶水| 国产精品天天摸av网| 亚洲主播在线观看| 粉嫩av一区二区三区| 欧美一级国产精品| 亚洲va欧美va天堂v国产综合| 国产a级毛片一区| 久久综合狠狠综合久久激情| 日韩精品电影一区亚洲| 欧洲av在线精品| 亚洲人成在线观看一区二区| 国产麻豆欧美日韩一区| 欧美一区二区三区视频免费| 亚洲午夜免费福利视频| 欧美最新大片在线看| 国产精品乱码一区二区三区软件| 狠狠狠色丁香婷婷综合久久五月| 51精品视频一区二区三区| 一区二区视频在线看| 99免费精品视频| 亚洲图片欧美视频| 91毛片在线观看| 国产精品电影院| 成人av先锋影音| 国产精品久久久久久久久免费樱桃| 国产精品一区二区免费不卡 | 大桥未久av一区二区三区中文| 日韩欧美一区二区三区在线| 日本不卡在线视频| 日韩一区二区三区免费观看| 免费成人在线视频观看| 91精品国产91久久综合桃花| 日韩中文字幕不卡| 777亚洲妇女| 日本91福利区| 欧美videos中文字幕| 蜜桃精品视频在线| 欧美精品一区二区久久久 | 精品欧美一区二区在线观看| 美女网站一区二区| 精品999在线播放| 国产乱码字幕精品高清av| 久久久国产精华| www.日韩av| 亚洲成人1区2区| 日韩视频在线你懂得| 精品系列免费在线观看| 日本一区二区视频在线| 91年精品国产| 亚洲成人自拍网| 精品久久国产字幕高潮| 国产成人av网站| 亚洲男人天堂av网| 欧美人体做爰大胆视频| 久久精品国产99| 欧美韩日一区二区三区四区| 91在线免费看| 日韩和欧美一区二区三区| 亚洲精品一区二区三区在线观看| 成人妖精视频yjsp地址| 一区二区三区 在线观看视频| 制服丝袜中文字幕一区| 国产成人激情av| 一区二区国产视频| 日韩欧美电影在线| 成人av免费网站| 日韩精品视频网站| 国产欧美日韩在线观看| 欧美亚洲国产一区在线观看网站| 老司机免费视频一区二区 | 99久久精品国产精品久久| 亚洲成a人v欧美综合天堂下载| 精品欧美一区二区三区精品久久| caoporen国产精品视频| 不卡一区中文字幕| 亚洲一区在线视频观看| 欧美精品一区二区三区在线播放| 色婷婷av一区二区三区之一色屋| 免费久久99精品国产| 亚洲人成网站色在线观看 | 美日韩黄色大片| 中文字幕一区二区三区乱码在线| 欧美美女直播网站| av电影在线观看完整版一区二区| 日韩av不卡一区二区| 国产精品丝袜一区| 777奇米成人网| 色偷偷88欧美精品久久久| 久久99精品一区二区三区| 亚洲综合成人网| 欧美经典一区二区| 日韩一区二区三区在线视频| 91亚洲永久精品| 国产馆精品极品| 日本中文字幕不卡| 亚洲一卡二卡三卡四卡五卡| 久久久久久亚洲综合| 91麻豆精品国产91久久久久久 | 成人午夜视频在线观看| 秋霞午夜av一区二区三区| 亚洲欧美日韩久久| 久久精品一区二区三区不卡| 欧美精品三级日韩久久| 91蜜桃网址入口| 波多野结衣精品在线| 国产一区二区福利视频| 日韩精品久久久久久| 亚洲已满18点击进入久久| 中文字幕永久在线不卡| 国产三级精品在线| 精品国产伦一区二区三区观看方式| 欧美剧情片在线观看| 91久久精品一区二区三区| 成人国产精品免费观看视频| 国产精品资源在线观看| 卡一卡二国产精品 | 蜜桃视频第一区免费观看| 亚洲午夜日本在线观看| 亚洲精品国产成人久久av盗摄 | 国产成人免费视频精品含羞草妖精| 日本不卡高清视频| 丝袜美腿亚洲综合| 亚洲成人在线观看视频| 亚洲午夜一区二区| 亚洲国产中文字幕| 成人av在线看|