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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? item.cpp

?? OPC客戶端源代碼
?? 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(", ");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色先锋久久av资源部| 国产精品久久久久久久久搜平片| 性做久久久久久免费观看| 91精品国产综合久久久久久漫画| 久久精品国产精品亚洲红杏 | 亚洲欧美一区二区三区孕妇| 欧美日本视频在线| 国产一区二区福利视频| 精品不卡在线视频| 色婷婷综合久色| 国产成人啪免费观看软件| 亚洲免费观看高清完整版在线观看 | 日韩一级片在线播放| 成人黄色国产精品网站大全在线免费观看 | 国产一二精品视频| 亚洲一区二区三区视频在线| 久久久久国产一区二区三区四区| 精品一区二区三区影院在线午夜 | 精品视频一区三区九区| 成人av资源在线观看| 日韩中文字幕av电影| 亚洲区小说区图片区qvod| 日韩视频在线一区二区| 亚洲欧洲日韩av| 久久精品一区八戒影视| 欧美日韩免费一区二区三区视频| 中文字幕五月欧美| 国产女主播视频一区二区| 日韩视频一区二区三区 | 国产三级精品在线| 日韩一区二区三区精品视频 | 国产欧美日韩综合精品一区二区| 欧美高清www午色夜在线视频| 在线观看不卡视频| 91精品福利视频| av午夜一区麻豆| av男人天堂一区| 不卡高清视频专区| 日韩精品欧美成人高清一区二区| 亚洲麻豆国产自偷在线| 亚洲综合久久久| 国产亚洲欧美在线| 2020国产精品久久精品美国| 日韩欧美一区二区久久婷婷| 在线播放国产精品二区一二区四区 | 国产精品人妖ts系列视频 | 中文字幕一区二区三区四区不卡| 日韩一级片在线观看| 亚洲色大成网站www久久九九| 日韩中文字幕麻豆| 99久久er热在这里只有精品66| 91精品国产高清一区二区三区| 国产精品久久一卡二卡| 国产最新精品精品你懂的| 欧美日韩在线一区二区| 亚洲欧美一区二区在线观看| 日韩高清在线观看| 欧美亚男人的天堂| 国产精品福利一区| 国产精品亚洲视频| 日韩欧美在线1卡| 午夜精品福利一区二区三区蜜桃| jvid福利写真一区二区三区| 久久久久久久久久久久久久久99 | 中文字幕一区av| 国产一区 二区 三区一级| 日韩免费福利电影在线观看| 日韩中文欧美在线| 欧美日韩国产综合一区二区| 一区二区在线观看av| 99久久99久久久精品齐齐| 中文字幕亚洲欧美在线不卡| 国产91富婆露脸刺激对白| 久久九九久久九九| 国产一区二区在线视频| 久久影音资源网| 国产一二精品视频| 国产精品―色哟哟| av资源网一区| 亚洲卡通欧美制服中文| 色婷婷香蕉在线一区二区| 亚洲人成精品久久久久久| 99re成人精品视频| 亚洲精品乱码久久久久久黑人| 91国偷自产一区二区使用方法| 亚洲丝袜另类动漫二区| 91免费版在线| 亚洲国产视频一区二区| 69堂亚洲精品首页| 精品一区二区成人精品| 久久精品视频一区二区三区| 高清在线观看日韩| 亚洲素人一区二区| 欧美日韩精品欧美日韩精品一综合| 亚洲在线中文字幕| 91精品国产综合久久久蜜臀图片| 麻豆视频观看网址久久| 久久你懂得1024| 色琪琪一区二区三区亚洲区| 午夜影院久久久| 久久亚洲私人国产精品va媚药| 成人黄色在线视频| 亚洲成av人片www| 日韩精品一区二区三区中文不卡 | 日韩无一区二区| 国产成人综合视频| 一区二区三区**美女毛片| 9191精品国产综合久久久久久| 国产一区二区调教| 亚洲另类在线视频| 日韩情涩欧美日韩视频| 成人免费高清视频在线观看| 亚洲午夜精品17c| 久久久亚洲精华液精华液精华液| www..com久久爱| 激情成人午夜视频| 亚洲曰韩产成在线| 久久久国产精品麻豆| 欧美婷婷六月丁香综合色| 国产精品资源网站| 午夜激情一区二区| 亚洲欧美在线观看| 精品国产污污免费网站入口| 欧美亚洲一区二区在线观看| 高清国产一区二区| 日本亚洲最大的色成网站www| 国产精品视频你懂的| 日韩免费高清视频| 欧美精品丝袜中出| 91香蕉视频mp4| 高清久久久久久| 久草在线在线精品观看| 亚洲 欧美综合在线网络| 国产精品国产三级国产aⅴ入口| 日韩美女一区二区三区| av在线一区二区三区| 国产一区二区视频在线播放| 天天做天天摸天天爽国产一区| 国产女同性恋一区二区| 91精品在线观看入口| 一本大道久久a久久精二百| 国产乱子伦视频一区二区三区 | 亚洲综合视频在线观看| 欧美激情一二三区| 久久久国际精品| 精品久久久网站| 日韩一区二区三区视频| 欧美精选一区二区| 欧美色偷偷大香| 欧美午夜寂寞影院| 欧美影院精品一区| 欧美性一级生活| 欧美亚洲综合另类| 欧美性大战久久久久久久蜜臀| 91啦中文在线观看| 色呦呦国产精品| 在线观看日韩av先锋影音电影院| 色婷婷综合激情| 欧美日韩国产美| 欧美丰满一区二区免费视频| 91精品国产综合久久精品app| 欧美群妇大交群中文字幕| 5566中文字幕一区二区电影| 欧美一级夜夜爽| 久久日韩粉嫩一区二区三区| 久久久99精品免费观看| 国产精品久久久一本精品| 1000精品久久久久久久久| 亚洲激情成人在线| 视频一区国产视频| 狠狠色丁香婷婷综合| 成人精品国产福利| 色八戒一区二区三区| 在线播放中文一区| 国产亚洲一二三区| 亚洲色图第一区| 日本不卡的三区四区五区| 国产在线不卡一区| 91国内精品野花午夜精品| 777欧美精品| 国产欧美视频在线观看| 亚洲综合免费观看高清完整版在线| 日韩和欧美一区二区三区| 国产伦精品一区二区三区免费迷| av一本久道久久综合久久鬼色| 色香蕉成人二区免费| 欧美不卡一二三| 亚洲欧洲制服丝袜| 久久99精品久久久久久国产越南| 成人污视频在线观看| 欧美日韩一区 二区 三区 久久精品| 欧美sm美女调教| 一区二区国产视频| 国产剧情av麻豆香蕉精品| 欧洲国产伦久久久久久久| 欧美成人综合网站| 一区二区三区在线观看动漫| 韩国女主播成人在线| 欧美日韩专区在线| 国产欧美一区二区精品仙草咪|