我现在要利用wincc作为服务器,vc作为客户端,通过opc实现两者的通讯,要求vc端能够读写wincc变量的数据,在vc客户端程序中用OPCITEMDEF结构数组给变量条目做初始化,我的问题是该结构数组中szItemID该如何设置?我的wincc工程名字是MyProject,wincc中定义的用于通信的两个变量名是id,name.
下面是源程序,现在就是读不回wincc中的数据,wincc项目已经激活了,不知问题出在哪?请各位大师指教!
if(CoInitialize(NULL) != S_OK)
{
AfxMessageBox("COM初始化失败");
}
else
{
AfxMessageBox("COM已经初始化",MB_OK MB_ICONINFORMATION,0);
}
typedef HRESULT (STDAPICALLTYPE *INTERFACE_FINDER)(void *pThis, DWORD dwData, REFIID riid, void **ppv);
INTERFACE_FINDER a=INTERFACE_FINDER(-1);
HRESULT hRet=ConnectToServer(L"OPCServer.Wincc",FALSE,&ppUnknown);
if(hRet!=S_OK)
{
MessageBox("您可能没启动Wincc!您必须首先启动Wincc!");
}
//初始化组的参数
fTemp = 0.0f;
lTimeBias = 0;
dwActualRate = 0;
ppUnknown->QueryInterface(IID_IOPCServer,(void **)&pServer);
hRet=pServer->AddGroup(L"",TRUE,500,1235,&lTimeBias,&fTemp,0,&hOPCServerGroup,
&dwActualRate,IID_IOPCItemMgt,(LPUNKNOWN*)&pOPCItemMgt);
ItemNumber=2;//数据项的个数
USES_CONVERSION;//使用T2OLE()
for(int i=0;i {
ItemArray[i].dwBlobSize = 0;
ItemArray[i].pBlob = NULL;
ItemArray[i].bActive = TRUE;
ItemArray[i].hClient =i; // pointer to item is its "handle"
ItemArray[i].szAccessPath =T2OLE("MyProject");
ItemArray[i].vtRequestedDataType=VT_I2;
}
ItemArray[0].szItemID =T2OLE("id");
ItemArray[1].szItemID =T2OLE("name");
if(hRet==S_OK)
hRet=pOPCItemMgt->AddItems(ItemNumber,ItemArray,
(OPCITEMRESULT**)&pItemResult,(HRESULT **)&pErrors);
if(hRet==S_OK) MessageBox("AddItemsSuccess");
for(i=0;i<2;i++)
hServer[i]=pItemResult[i].hServer;
hRet=ppUnknown->QueryInterface(IID_IOPCSyncIO,(void **)&pOPCSync);
void COPCClientDlg::OnRead()
{
// TODO: Add your control notification handler code here
int ItemNumber=2;
int id,name;
HRESULT hRet=pOPCSync->Read(OPC_DS_CACHE,ItemNumber,/*hServerAI*/hServer,&pItemValue,&pErrors);
id=V_I2(&pItemValue[0].vDataValue);//V_BSTR(&pItemValue[0].vDataValue);//VT_R4;V_BSTR
name=V_I2(&pItemValue[1].vDataValue);//V_BSTR(&pItemValue[1].vDataValue);
m_id.Format("%d",id);
m_name.Format("%d",name);
UpdateData(false);
}