当前位置:编程学习 > C#/ASP.NET >>

VC.net 设计的OPCserver只能读,不能写

用VC.net 设计的OPC程序,用OPC Power Tool只能读取,不能向OPC写数据。
而且只有在先运行OPC程序的时候Tool才能连接到OPC,先运行Tool就不行。
OPC程序的注册函数如下
void CVSKOSSerialDlg::OnRegister()
{
// TODO: 在此添加命令处理程序代码
int i;
BOOL bRet = FALSE;
CString strFile;
strFile = AfxGetApp()->m_pszHelpFilePath;
i = strFile.ReverseFind('\\');
strFile = strFile.Left(i+1);
strFile += "SHDQLGH.exe";
bRet = KOS_Register( CLSID_Svr,
m_strSvrName,
m_strSvrDesc,
strFile);
if (bRet) AfxMessageBox("Register OK");
}
ClientWrite函数如下

void CALLBACK EXPORT ClientWriteProc(HANDLE Handle,VARIANT *pVar)
{
TRACE("Client Write Data, Item Handle=%d, float value = %f\n",Handle,pVar->fltVal);
CVSKOSSerialDlg *pWnd = (CVSKOSSerialDlg *)AfxGetMainWnd();
pWnd->ClientWrite(Handle,pVar);
}

void CVSKOSSerialDlg::ClientWrite(HANDLE Handle, VARIANT *pVar)
{
// OPC client write something to our item of OPC server
// We need to write this value to special hardware.
//AfxMessageBox("OK");

CItem *pItem;
CString strtmp,m_str;
BOOL bReturn;
SYSTEMTIME sysTime;
VARIANT ZH1;
int i;

Lock();
for (i=0;i<m_ItemList.GetSize();i++)
{
pItem = (CItem *)m_ItemList.GetAt(i);
if ( pItem->Handle == Handle )
{
i=m_ItemList.GetSize();

if (pItem->Value.vt == VT_BSTR)
{
ZH1.vt = VT_BSTR;
ZH1=*pVar;
pItem->Value.bstrVal = ZH1.bstrVal;
}
else
{
VariantClear(&(pItem->Value));
VariantCopy(&(pItem->Value),pVar);
}
//setting quality
pItem->Quality = OPC_QUALITY_GOOD;

//setting timestamp
// SYSTEMTIME sysTime;
GetSystemTime(&sysTime);
SystemTimeToFileTime(&sysTime,&pItem->TimeStamp);
  bReturn = KOS_UpdateItem(pItem->Handle,pItem->Value,pItem->Quality);
  if (!bReturn) TRACE("UpdateItem %s failure!\n",pItem->Name);
}
}
UnLock();
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,