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

📄 democlientview.cpp

📁 modbus编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DemoClientView.cpp : implementation of the CDemoClientView class
//

#include "stdafx.h"
#include "DemoClient.h"

#include "DemoClientDoc.h"
#include "DemoClientView.h"

#include "MainFrm.h"

#include "Item.h"
#include "ConnectDlg.h"
#include "GroupAddDlg.h"
#include "ItemAddDlg.h"
#include "ItemWriteDlg.h"

#include "opcda.h"
#include ".\democlientview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define OPCSHUTDOWN_MSG	WM_USER+1
#define DISPLAY_TICK	1

void CALLBACK EXPORT ShutdownProc(HANDLE hConnect)
{
	CDemoClientApp *pApp = (CDemoClientApp*)AfxGetApp();
	
	//PostMessage(pWnd->m_pView->m_hWnd, OPCSHUTDOWN_MSG, 0, 0);
	PostMessage(pApp->m_pFrm->m_hWnd, OPCSHUTDOWN_MSG, 0, 0);
}

void CALLBACK EXPORT DataChangeProc(HANDLE hServer, 
									HANDLE hGroup, 
									HANDLE hItem, 
									VARIANT *pVar, 
									FILETIME timestamp, 
									DWORD quality)
{
	CDemoClientApp *pApp = (CDemoClientApp*)AfxGetApp();
	CMainFrame *pWnd;
	pWnd = pApp->m_pFrm;
	CItem *pItem;
	int i;
	for (i=0;i<pWnd->m_pView->ItemList.GetSize();i++)
	{
		pItem = (CItem *)pWnd->m_pView->ItemList.GetAt(i);
		if (pItem->hItem == hItem)
		{
			VariantClear(&(pItem->Value));
			VariantCopy (&(pItem->Value), pVar);
			pItem->TimeStamp = timestamp;
			pItem->Quality = quality;
			return;
		}
	}
}


void FormatOpcQuality(int nQuality, char *buf)
{
	switch (nQuality)
	{
	case OPC_QUALITY_UNCERTAIN:
		sprintf (buf, "%s", "OPC_QUALITY_UNCERTAIN" );
		break;
	case OPC_QUALITY_BAD:
		sprintf (buf, "%s", "OPC_QUALITY_BAD" );
		break;
	case OPC_QUALITY_GOOD:
		sprintf (buf, "%s", "OPC_QUALITY_GOOD" );
		break;
	default:
		sprintf (buf, "%s", "Unknow" );
		break;
	}
}
	
void FormatVariant(VARIANT *pValue, char *buf)
{

	switch(pValue->vt)
		{
		case VT_I1:
		case VT_UI1:		// BYTE
			sprintf (buf, "%d", pValue->bVal );
			break;
		case VT_I2:			// SHORT
			sprintf	(buf, "%d", pValue->iVal );
			break;
		case VT_UI2:		// UNSIGNED SHORT
			sprintf	(buf, "%d", pValue->uiVal );
			break;
		case VT_I4:			// LONG
			sprintf	(buf, "%ld", pValue->lVal );
			break;
		case VT_UI4:		// UNSIGNED LONG
			sprintf	(buf, "%ld", pValue->ulVal );
			break;
		case VT_INT:		// INTEGER
			sprintf	(buf, "%ld", pValue->intVal );
			break;
		case VT_UINT:		// UNSIGNED INTEGER
			sprintf	(buf, "%u", pValue->uintVal );
			break;
		case VT_R4:			// FLOAT
			sprintf	(buf, "%5.2f", pValue->fltVal );
			break;
		case VT_R8:			// DOUBLE
			sprintf	(buf, "%9.4f", pValue->dblVal );
			break;
		case VT_BSTR:		//BSTR
			sprintf	(buf, "%ls", pValue->bstrVal );
			break;
		case VT_BOOL:
			if (pValue->boolVal)
				strcpy (buf, "TRUE");
			else
				strcpy (buf, "FALSE");
			break;
		default:
			sprintf	(buf, "unknown type:%d", pValue->vt );
			break;
		}
}


void FormatDataType(VARIANT *pValue, char *buf)
{

	switch(pValue->vt)
		{
		case VT_I1:
		case VT_UI1:		// BYTE
				sprintf (buf, "BYTE");
			break;
		case VT_I2:			// SHORT
			sprintf	(buf, "Short");
			break;
		case VT_UI2:		// UNSIGNED SHORT / WORD
			sprintf	(buf, "Word");
			break;
		case VT_I4:			// LONG
			sprintf	(buf, "Long");
			break;
		case VT_UI4:		// UNSIGNED LONG
			sprintf	(buf, "DWord");
			break;
		case VT_INT:		// INTEGER
			sprintf	(buf, "Int");
			break;
		case VT_UINT:		// UNSIGNED INTEGER
			sprintf	(buf, "UINT");
			break;
		case VT_R4:			// FLOAT
			sprintf	(buf, "Float");
			break;
		case VT_R8:			// DOUBLE
			sprintf	(buf, "Double");
			break;
		case VT_BSTR:		//BSTR
			sprintf	(buf, "String");
			break;
		case VT_BOOL:
			strcpy (buf, "BOOL");
			break;
		default:
			sprintf	(buf, "Unknow");
			break;
		}
}
/////////////////////////////////////////////////////////////////////////////
// CDemoClientView

IMPLEMENT_DYNCREATE(CDemoClientView, CListView)

BEGIN_MESSAGE_MAP(CDemoClientView, CListView)
	//{{AFX_MSG_MAP(CDemoClientView)
	ON_UPDATE_COMMAND_UI(IDM_OPC_CONNECT, OnUpdateOpcConnect)
	ON_UPDATE_COMMAND_UI(IDM_OPC_DISCONNECT, OnUpdateOpcDisconnect)
	ON_COMMAND(IDM_OPC_DISCONNECT, OnOpcDisconnect)
	ON_COMMAND(IDM_OPC_CONNECT, OnOpcConnect)
	ON_COMMAND(IDM_OPC_GROUP_ADD, OnOpcGroupAdd)
	ON_COMMAND(IDM_OPC_GROUP_Remove, OnOPCGROUPRemove)
	ON_COMMAND(IDM_OPC_ITEM_ADD, OnOpcItemAdd)
	ON_COMMAND(IDM_OPC_ITEM_REMOVE, OnOpcItemRemove)
	ON_UPDATE_COMMAND_UI(IDM_OPC_GROUP_ADD, OnUpdateOpcGroupAdd)
	ON_UPDATE_COMMAND_UI(IDM_OPC_GROUP_Remove, OnUpdateOPCGROUPRemove)
	ON_UPDATE_COMMAND_UI(IDM_OPC_ITEM_ADD, OnUpdateOpcItemAdd)
	ON_UPDATE_COMMAND_UI(IDM_OPC_ITEM_REMOVE, OnUpdateOpcItemRemove)
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(IDM_ITEM_READ, OnItemRead)
	ON_COMMAND(IDM_ITEMWRITE, OnItemWrite)
	ON_COMMAND(IDM_OPC_ITEM_ACTIVE, OnOpcItemActive)
	ON_UPDATE_COMMAND_UI(IDM_OPC_ITEM_ACTIVE, OnUpdateOpcItemActive)
	//}}AFX_MSG_MAP
	//ON_MESSAGE(OPCSHUTDOWN_MSG, OnServerShutdown)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemoClientView construction/destruction

CDemoClientView::CDemoClientView()
{
	// TODO: add construction code here
	m_hGroup = NULL;
	m_hConnect = NULL;
	m_nSelectedIndex = -1;
	m_pListImageList = NULL;

	m_pListImageList = new CImageList();
	ASSERT(m_pListImageList);
	//m_pListImageList->Create(16, 16, NULL, 1, 1);
	m_pListImageList->Create(IDB_ITEM,16,1,RGB(255,255,255) );

	//HICON hItemIcon = AfxGetApp()->LoadIcon(IDI_ITEM);
	
	//m_pListImageList->Add(hItemIcon);
}

CDemoClientView::~CDemoClientView()
{
	if(NULL != m_pListImageList)
	{
		m_pListImageList->DeleteImageList();
		delete m_pListImageList;
		m_pListImageList = NULL;
	}
}

BOOL CDemoClientView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CListView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDemoClientView drawing

void CDemoClientView::OnDraw(CDC* pDC)
{
	CDemoClientDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

void CDemoClientView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();

	CMainFrame *pWnd;
	pWnd = (CMainFrame *)AfxGetMainWnd();
	pWnd->m_pView = this;

	CListCtrl& list = GetListCtrl();

	list.ModifyStyle(NULL, LVS_REPORT | LVS_SORTASCENDING ,0);
	list.SetExtendedStyle(LVS_EX_FULLROWSELECT);

//	if(NULL == list.GetImageList(LVSIL_SMALL))
//		VERIFY(list.SetImageList(m_pListImageList, LVSIL_SMALL) == NULL);
	if(NULL == list.GetImageList(TVSIL_STATE ))
		VERIFY(list.SetImageList(m_pListImageList, TVSIL_STATE ) == NULL);

	while( list.DeleteColumn( 0 ) );

	list.InsertColumn( 0,  _T("Tag"), LVCFMT_LEFT , 140, 0 );
	list.InsertColumn( 1,  _T("DataType"), LVCFMT_LEFT, 70, 1 );
	list.InsertColumn( 2,  _T("Value"), LVCFMT_LEFT, 90, 1 );
	list.InsertColumn( 3,  _T("Time"), LVCFMT_LEFT, 120, 1 );
	list.InsertColumn( 4,  _T("Quality"), LVCFMT_LEFT, 150, 1 );

	::SetTimer(this->m_hWnd,DISPLAY_TICK,250,NULL);

}

/////////////////////////////////////////////////////////////////////////////
// CDemoClientView diagnostics

#ifdef _DEBUG
void CDemoClientView::AssertValid() const
{
	CListView::AssertValid();
}

void CDemoClientView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}

CDemoClientDoc* CDemoClientView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDemoClientDoc)));
	return (CDemoClientDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDemoClientView message handlers

void CDemoClientView::OnOpcDisconnect() 
{
	Disconnect();

}
void CDemoClientView::Disconnect(void)
{
	if (m_hConnect == NULL) return;

	KOC_Disconnect(m_hConnect);	
	CItem *pItem;
	for (int i=0;i<ItemList.GetSize();i++)
	{
		pItem = (CItem *)ItemList.GetAt(i);
		delete pItem;
	}
	ItemList.RemoveAll();
	GetListCtrl().DeleteAllItems();
	m_hGroup = NULL;
	m_hConnect = NULL;
	m_nSelectedIndex = -1;
	AfxMessageBox("Disconnected from OPC Server!");
}

void CDemoClientView::OnOpcConnect() 
{
	// TODO: Add your command handler code here
	CConnectDlg dlg;

	if(dlg.DoModal() != IDOK) return;

	CWaitCursor wait;

	HANDLE hConnect;

	hConnect = KOC_Connect(	dlg.m_strNodeName,
							dlg.m_strServerName,
							!dlg.m_bVer1,
							dlg.m_bUseRegistry);


	//hConnect = KOC_Connect("192.168.1.2", "DllTestSvr", TRUE, TRUE);

	if (hConnect==INVALID_HANDLE_VALUE)

⌨️ 快捷键说明

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