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

📄 hurcoopcsvrview.cpp

📁 学习开发opcserver和opcclient的好例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// HurcoOPCSvrView.cpp : implementation of the CHurcoOPCSvrView class
//

#include "stdafx.h"
#include <math.h>

#include <stdlib.h>
#include <time.h>
/*
#include "opcda.h"
#include "opc_ae.h"
#include "opcerror.h"
#include "wtopcsvrapi.h"

#include "58ioApi.h"
#include "ErrorCodeDef.h"
*/
#include "HurcoOPCSvr.h"

#include "HurcoOPCSvrDoc.h"
#include "HurcoOPCSvrView.h"

#include "IPAddressDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//// {F6C07E13-637E-4c61-888D-A15C2481C513}
const GUID CLSID_HurcoOPCSvr =
{ 0xf6c07e13, 0x637e, 0x4c61, { 0x88, 0x8d, 0xa1, 0x5c, 0x24, 0x81, 0xc5, 0x13 } };

void CALLBACK EXPORT DisconnectCallback(DWORD nConnects)
{
	//AfxMessageBox("byebye");
	//((CHurcoOPCSvrApp*)AfxGetApp())->m_pMainWnd->SendMessage(WM_CLOSE);
	if(nConnects==0)
	{
       exit(0);
	}
	else
	{
       RequestDisconnect();
	}
}

void CALLBACK EXPORT WriteNotifyCallback(HANDLE Handle, VARIANT *pNewValue, DWORD *pDeviceError)
{
	CHurcoOPCSvrApp	*pApp;
    
	pApp = (CHurcoOPCSvrApp	*)AfxGetApp();
	if (pApp->pView != NULL)
	{
		ASSERT(pApp->pView != NULL);
		pApp->pView->WriteNotificationHandler(Handle, pNewValue, pDeviceError);
    }
}

//////////////////////////////////////////
void CALLBACK EXPORT UnknownItemCallback(LPSTR Path, LPSTR Name)
{
	CHurcoOPCSvrApp	*pApp;

	pApp = (CHurcoOPCSvrApp	*)AfxGetApp();
	pApp->pView->UnknownTagHandler(Path, Name);
}

void CALLBACK EXPORT TagRemovedProc (HANDLE TagHandle, LPSTR Path, LPSTR Name)
{
	CHurcoOPCSvrApp	*pApp;

	pApp = (CHurcoOPCSvrApp *)AfxGetApp();
	pApp->pView->RemovedTagHandler (TagHandle, Path, Name);

}
/////////////////////////////////////////////////////////////////////////////
// CHurcoOPCSvrView

IMPLEMENT_DYNCREATE(CHurcoOPCSvrView, CFormView)

BEGIN_MESSAGE_MAP(CHurcoOPCSvrView, CFormView)
	//{{AFX_MSG_MAP(CHurcoOPCSvrView)
	ON_WM_TIMER()
	ON_COMMAND(ID_VIEW_MONITOR, OnViewMonitor)
	ON_UPDATE_COMMAND_UI(ID_VIEW_MONITOR, OnUpdateViewMonitor)
	ON_COMMAND(ID_ADD_IP, OnAddIPAddress)
	ON_WM_CREATE()
	ON_NOTIFY(TVN_SELCHANGED, IDC_TAGTREE, OnSelchangedTree)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHurcoOPCSvrView construction/destruction

CHurcoOPCSvrView::CHurcoOPCSvrView()
	: CFormView(CHurcoOPCSvrView::IDD)
{
	//{{AFX_DATA_INIT(CHurcoOPCSvrView)
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	CHurcoOPCSvrApp *pApp;

	pApp = (CHurcoOPCSvrApp *)AfxGetApp();
	pApp->pView = this;

	pTagList = NULL;
	m_hSession = NULL;
	m_bConnectFlag = FALSE;
	m_dwRet = 0;
    m_bMonitor = FALSE;
    m_WriteCallBack = FALSE;

    SelectedIndex = -1;
	m_bSimulate=FALSE;
}

CHurcoOPCSvrView::~CHurcoOPCSvrView()
{
	int	i;
	CTag	*pTag;

	if (pTagList != NULL)
		{
		for (i=0; i<TagCount; i++)
			{
			pTag = &pTagList[i];
			RemoveTag(pTag->Handle);
			VariantClear (&(pTag->Value));
			}
		delete [] pTagList;
		}

//    DisconnectI5815();
	UninitWTOPCsvr();
}

void CHurcoOPCSvrView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CHurcoOPCSvrView)
	DDX_Control(pDX, IDC_TAGTREE, m_Tree);
	DDX_Control(pDX, IDC_LIST, m_List);
	//}}AFX_DATA_MAP
}

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

	return CFormView::PreCreateWindow(cs);
}

void CHurcoOPCSvrView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

	if (InitOPCOK )
	{
		CreateTags();
        m_List.InsertColumn(0, "ID", LVCFMT_LEFT, 150); 
        m_List.InsertColumn(1, "VALUE", LVCFMT_LEFT, 80); 
	}
    
}

/////////////////////////////////////////////////////////////////////////////
// CHurcoOPCSvrView diagnostics

#ifdef _DEBUG
void CHurcoOPCSvrView::AssertValid() const
{
	CFormView::AssertValid();
}

void CHurcoOPCSvrView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CHurcoOPCSvrView message handlers

void CHurcoOPCSvrView::ServerRegister()
{
	CString	SvrName, SvrDescr, HelpPath;
	int	i;

	// get path to executable by parsing the help path
	// contained in CWinApp
	HelpPath = AfxGetApp()->m_pszHelpFilePath;
	i = HelpPath.ReverseFind('\\');
	HelpPath = HelpPath.Left(i+1);
	HelpPath += "HurcoOPCSvr.exe"; 
	
	SvrName = "HurcoOPC.Svr";
	SvrDescr = "Ether IO Module OPC Server";
	UpdateRegistry ((BYTE *)&CLSID_HurcoOPCSvr, SvrName, SvrDescr, HelpPath);
}

void CHurcoOPCSvrView::CreateTags()
{
	int	I;
	char	buf1[100];
    char	buf2[100];
	VARIANT	var;
	CTag	*pTag;
	//CTime	now;
	CString	TmpStr1;
    CString	TmpStr2;



	SetCapture();
	AfxGetApp()->DoWaitCursor(1);
	

    //////////////////////////////////////////////////
    _TREEITEM *rti;

	rti=m_Tree.InsertItem("EthernetIO",TVI_ROOT,TVI_LAST);
	m_Tree.InsertItem("DI",rti,TVI_LAST);
	m_Tree.InsertItem("DO",rti,TVI_LAST);
    m_Tree.Expand(rti,TVE_EXPAND);

    VariantInit(&var);
    TagCount=-1;
    CString str=CString("DI");
	
	pTagList = new CTag[32];
	if (pTagList == NULL)
	{
		AfxMessageBox ("Memory Allocation Error", MB_OK);
		return;
	}
	
	for (I=0; I<32; I++)
	{
		VariantInit (&pTagList[I].Value);
	}

    TmpStr1 = "EthernetIO";
	TmpStr1 += ".";

    TmpStr2 = "EthernetIO";
	//TmpStr2 += SetWtOPCsvrQualifier(0);

	for(I=0;I<16;I++)
	{
        //TmpStr1 += "DI";
	    //TmpStr1 += SetWtOPCsvrQualifier(0);
        TagCount++;
        sprintf (buf1, "EthernetIO.Channel%d", I);
		pTag = &pTagList[TagCount];
		pTag->Name = buf1 ;
		var.vt = VT_BOOL;
		var.boolVal =1;
		VariantCopy (&(pTag->Value), &var);
		pTag->Handle = CreateTag(pTag->Name, var, OPC_QUALITY_GOOD, FALSE );	
		//TmpStr1="EthernetIO";
	}

	for(I=0;I<16;I++)
	{
        //TmpStr2 += "DO";
	    //TmpStr2 += SetWtOPCsvrQualifier(0);
        TagCount++;
        sprintf (buf2, "EthernetIO.Channel%d", I);
		pTag = &pTagList[TagCount];
		pTag->Name = buf2 ;
		var.vt = VT_BOOL;
		var.boolVal =1;
		VariantCopy (&(pTag->Value), &var);
		pTag->Handle = CreateTag(pTag->Name, var, OPC_QUALITY_GOOD, TRUE );	
	}
	
 	AfxGetApp()->DoWaitCursor(0);
	ReleaseCapture();
}

void CHurcoOPCSvrView::UpdateList()
{
	int I;
	int J=-1;
	int Index;
	_TREEITEM *pi;

	pi=m_Tree.GetSelectedItem();
	CString cs=m_Tree.GetItemText(pi);
	
	if(cs=="DI") 
	{
		J=0;
	}
	if(cs=="DO") 
	{
		J=16;
	}
	if(J==-1) 
	{
		return;
	}

	m_List.DeleteAllItems();
	
	

	for(I=0; I<16;I++)
	{	
       Index=m_List.InsertItem(I,pTagList[I+J].Name);
	   if(pTagList[I+J].Value.boolVal) 
			{
				m_List.SetItemText(Index,1,"TRUE");
			}
			else 
			{
				m_List.SetItemText(Index,1,"FALSE");
			}
	}

}

void CHurcoOPCSvrView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
    Monitor();
	CFormView::OnTimer(nIDEvent);
}

/*
void CHurcoOPCSvrView::DisconnectI5815()
{
	if (m_hSession != NULL)
	{
		I5815IO_Close(m_hSession);
		m_hSession = NULL;
		m_bConnectFlag = FALSE;
		m_bMonitor=FALSE;
	}
}

void CHurcoOPCSvrView::ReadSlot0()
{
	WORD wVal = 0;
	if (m_bConnectFlag)
	{
		m_dwRet = I5815IO_ReadRegister(m_hSession,  0, &wVal);
		if (ERR_OK(m_dwRet))
		{
			m_DIValue.Format("%04X",wVal);//%04X
		}
	}
}
void CHurcoOPCSvrView::ReadSlot1()
{
	WORD wVal = 0;
	if (m_bConnectFlag)
	{
		m_dwRet = I5815IO_ReadRegister(m_hSession,  9, &wVal);
		if (ERR_OK(m_dwRet))
		{
			m_DOValue.Format("%04X",wVal);//%04X
		}

⌨️ 快捷键说明

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