未在服务器中创建OPC项目

时间:2013-09-02 08:39:24

标签: opc

我正在尝试创建一个连接到opc服务器的opc客户端。

客户的代码如下。

此代码在服务器中成功创建了一个组,但无法创建任何项目并且没有错误。

// OPC.cpp:定义控制台应用程序的入口点。 //

#include "stdafx.h"
#include "opcda.h"

#define ITEM_ID L"cr02.ch00.V0"
#define VT VT_R4
#define XVAL fltVal

int _tmain(int argc, _TCHAR* argv[])
{

IOPCServer* pIOPCServer = NULL;   //pointer to IOPServer interface
IOPCItemMgt* pIOPCItemMgt = NULL; //pointer to IOPCItemMgt interface

OPCHANDLE hServerGroup; // server handle to the group
OPCHANDLE hServerItem;  // server handle to the item

HRESULT hr;
CLSID clsid;
IUnknown *pUnkn;
IOPCServer *m_pOpcServer;
IOPCBrowseServerAddressSpace *m_pOpcBrowse;
IConnectionPointContainer *pCPC;
IOPCItemMgt* pInterface;
IUnknown *pNewGroup;


CoInitialize(NULL);
hr = CLSIDFromProgID(L"Schneider-Aut.OFS.2", &clsid);

if(SUCCEEDED(hr))
{
    hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IUnknown, (LPVOID*)&pUnkn);

    if(SUCCEEDED(hr))
    {
        hr = pUnkn->QueryInterface(IID_IOPCServer, (LPVOID*)&m_pOpcServer);
        hr = pUnkn->QueryInterface(IID_IOPCBrowseServerAddressSpace,       (LPVOID*)&m_pOpcBrowse);   
        hr = m_pOpcServer->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);

        OPCHANDLE hClientGroup = 0;
        DWORD dwUpdateRate = 0;
        hr = m_pOpcServer->AddGroup(L"Group1", true, dwUpdateRate, hClientGroup, 0,0, 0, &hClientGroup, &dwUpdateRate, IID_IOPCGroupStateMgt, (IUnknown**)&pInterface);


        OPCITEMDEF idef[1] = {{ /*szAccessPath*/ L"",
                                /*szItemID*/ ITEM_ID,
                                /*bActive*/ FALSE,
                                /*hClient*/ 1,
                                /*dwBlobSize*/ 0,
                                /*pBlob*/ NULL,
                                /*vtRequestedDataType*/ VT,
                                /*wReserved*/0
                             }};



        CComPtr<IOPCItemMgt> ptrItMgm;
        OPCITEMRESULT* pResults=NULL;
        HRESULT* pErrors = NULL;
        IOPCSyncIO *pOPCSync;

        hr=0;
        hr = pInterface->QueryInterface(IID_IOPCItemMgt,  reinterpret_cast<LPVOID*>(&ptrItMgm));
        if(SUCCEEDED(hr))
        {
            hr = ptrItMgm->AddItems(1, idef, &pResults, &pErrors);
        }
        /////////////////////////////////////////////////////////

        VARIANT varValue;
        VariantInit(&varValue);


        OPCITEMSTATE* pValue = NULL;
        IOPCSyncIO* pIOPCSyncIO;
        ptrItMgm->QueryInterface(__uuidof(pIOPCSyncIO), (void**) &pIOPCSyncIO);
        HRESULT hr = pIOPCSyncIO->Read(OPC_DS_DEVICE, 1, &hServerItem, &pValue, &pErrors);
        varValue = pValue[0].vDataValue;

        //////////////////////////////////////////////////////////

        hr = pOPCSync->Write(1, &hServerItem, &varValue, &pErrors);






        if(SUCCEEDED(hr))
        {
          hr = CLSIDFromProgID(L"Schneider-Aut.OFS.2", &clsid);
        }

    }

}

return 0;
}

2 个答案:

答案 0 :(得分:1)

您是否为Schnider OPC Factory服务器配置了包含别名信息的符号表文件?如果您尝试添加未在服务器上配置的项目,则会出现错误(如果您检查它们)。如果您没有检查错误,您将看不到任何事情发生。确保您的别名定义与您尝试添加的项目相匹配。

答案 1 :(得分:0)

有三种方法可以在OPC服务器中创建项目:

1.使用Dll

2.使用数据记录

3.在C#,VB.NET中使用编程

必须使用Dll :(使用任何一个) 1.opcdaauto.dll 2.来自Kepware Technologies的ClientAce 3.使用硬件OPC供应商提供的dll

请提供OPC服务器名称。我将为您提供详细的解决方案。

相关问题