sdfdn 发表于 2009-3-11 23:10:17

cvi中opc的例子

想用cvi做一个opc的客户端,现在苦于无法下手
看了cvi自带的opc的例子,一头雾水,哪位大哥能够讲解一下?

先提几个问题
1 HRESULT函数需要什么头文件?为什么自己变得时候无法通过编译?
2 好象没有看见对于opc server中数据的读写,要是想读写的话应该怎样做?
另外就是请高人讲解一下

谢谢

sdfdn 发表于 2009-3-12 09:36:11

还有
static int OPCToURL(char** url);

中的char** url
是什么意思?

tester 发表于 2009-3-12 12:59:37

你count选了5。还是先查一下口上有多少再读。

void CVICALLBACK ComCallback (int portNumber, int eventMask, void *callbackData)   
最后加上return 0

你多次重复安装事件,不知道这个有没有影响。也请版主指点,谢谢。

netcreature 发表于 2009-3-13 08:45:51

1、“HRESULT函数需要什么头文件”——它只是定义的一个变量。我怀疑它根本就是在C文件中定义的!
2、“为什么自己变得时候无法通过编译?”——不明白你说的是什么意思!
3、“char** url“是表示网址的字符串!

如果不提供源码,这种没头没尾的问题我是无法回答的!·

sdfdn 发表于 2009-3-14 12:41:23

#include <cvirte.h>   /* Needed if linking in external compiler; harmless otherwise */
#include <userint.h>
#include <ansi_c.h>
#include <cviauto.h>
#include "dataskt.h"
#include <formatio.h>
#include "OpcClient.h"

static int panelHandle;
static int connectedFlag = 0;
static DSHandle dsHandle = 0;

static int OPCToURL(char** url);
static void URLToOPC(void);

static void ShowDataSocketError(HRESULT errorCode);

static double sMax = 1.0, sMin = 0.0;

/* This is the callback function for the DataSocket */
void CVICALLBACK DSCallback (DSHandle dsHandle, int event, void *callbackData);

int main (int argc, char *argv[])
{
    if (InitCVIRTE (0, argv, 0) == 0)   /* Needed if linking in external compiler; harmless otherwise */
      return -1;/* out of memory */                     

    /* Making this thread Apartment-threaded so that the panel gets repainted
       when the DS_SelectURL dialog box is active */
    CA_InitActiveXThreadStyleForCurrentThread (0,
                                             COINIT_APARTMENTTHREADED);
   
    if ((panelHandle = LoadPanel (0, "OpcClient.uir", PANEL)) < 0)
      return -1;
    DisplayPanel (panelHandle);
    RunUserInterface ();
    return 0;
}

int CVICALLBACK StartCB (int panel, int control, int event,
      void *callbackData, int eventData1, int eventData2)
{
    HRESULT hr = S_OK;
    char* url;
    short selected;
   
    switch (event) {
      case EVENT_COMMIT:
            if (dsHandle == 0) {
                OPCToURL(&url);
                hr = DS_Open (url, DSConst_ReadAutoUpdate, DSCallback,
                              NULL, &dsHandle);
                SetCtrlVal(panelHandle, PANEL_URL, url);
                SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, TRUE);
                free(url);
            }
            break;
    }
    return 0;
}

int CVICALLBACK SelectCB (int panel, int control, int event,
      void *callbackData, int eventData1, int eventData2)
{
    HRESULT hr = S_OK;
    char* startURL;
    char* url;
    short selected;
   
    switch (event) {
      case EVENT_COMMIT:
            OPCToURL(&startURL);
            SetCtrlVal(panelHandle, PANEL_URL, startURL);
            hr = DS_SelectURL ("Select URL", startURL,
                               0, "", &selected, &url);
            if (selected) {
                SetCtrlVal(panelHandle, PANEL_URL, url);
                DS_FreeMemory(url);
                URLToOPC();
            }
            free(startURL);
            break;
    }
    return 0;
}

int CVICALLBACK StopCB (int panel, int control, int event,
      void *callbackData, int eventData1, int eventData2)
{
    HRESULT hr = S_OK;

    switch (event) {
      case EVENT_COMMIT:
            if ((dsHandle != 0) && connectedFlag) {
                SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, FALSE);
                hr = DS_DiscardObjHandle (dsHandle);
                dsHandle = 0;
                SetCtrlVal (panelHandle, PANEL_STATUS, "Disconnected");
                connectedFlag = 0;
            }
            break;
    }
    return 0;
}

int CVICALLBACK QuitCB (int panel, int control, int event,
      void *callbackData, int eventData1, int eventData2)
{
    HRESULT hr = S_OK;

    switch (event) {
      case EVENT_COMMIT:
            if ((dsHandle != 0) && connectedFlag) {
                SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, FALSE);
                hr = DS_DiscardObjHandle (dsHandle);
                dsHandle = 0;
                connectedFlag = 0;
            }
            QuitUserInterface (0);
            break;
    }
    return 0;
}

int CVICALLBACK TimerCB (int panel, int control, int event,
      void *callbackData, int eventData1, int eventData2)
{
    HRESULT hr = S_OK;
    double theValue;
    unsigned type;

    switch (event) {
      case EVENT_TIMER_TICK:
            if (dsHandle != 0) {
                hr = DS_GetDataType (dsHandle, &type, NULL, NULL);
                if (!SUCCEEDED(hr)) {
                  ShowDataSocketError(hr);
                  goto Error;
                }
                hr = DS_GetDataValue (dsHandle, CAVT_DOUBLE, &theValue, 1, NULL, NULL);
                if (!SUCCEEDED(hr)) {
                  ShowDataSocketError(hr);
                  goto Error;
                }
                if (theValue <= sMin) {
                  sMin = theValue - sMax * 0.5;
                  SetAxisScalingMode (panelHandle, PANEL_STRIPCHART,
                                        VAL_LEFT_YAXIS, VAL_MANUAL,
                                        sMin, sMax);
                }
                if (theValue >= sMax) {
                  sMax = theValue + sMax * 0.5;
                  SetAxisScalingMode (panelHandle, PANEL_STRIPCHART,
                                        VAL_LEFT_YAXIS, VAL_MANUAL,
                                        sMin, sMax);
                }
                PlotStripChartPoint (panelHandle, PANEL_STRIPCHART, theValue);
            }

            break;
    }

Error:      
    return 0;
}

void DSCallback (DSHandle localDSHandle, int event, void *pUserData)
{
    HRESULT hr = S_OK;
    char message;

    switch (event) {
      case DS_EVENT_DATAUPDATED:
            connectedFlag = 1;
            break;
      case DS_EVENT_STATUSUPDATED:
            if (dsHandle != 0) {
                hr = DS_GetLastMessage (localDSHandle, message, 1000);
                if (SUCCEEDED(hr))
                  SetCtrlVal (panelHandle, PANEL_STATUS, message);
            }
            break;
    }
   
Error:
    return;
}

static int OPCToURL(char** url)
{
    char hostName;
    char server;
    char itemName;
   
    GetCtrlVal(panelHandle, PANEL_HOSTNAME, hostName);
    GetCtrlVal(panelHandle, PANEL_SERVER, server);
    GetCtrlVal(panelHandle, PANEL_ITEM, itemName);

    *url = malloc(strlen(hostName) + strlen(server) + strlen(itemName) + 50);
    if ((*url) == NULL)
      return -1;
    (*url) = '\0';
    if (strlen(hostName) == 0 || (strcmp(hostName, "localhost") == 0)) {
      strcat(*url, "opc:");
    }
    else {
      strcat(*url, "opc://");
      strcat(*url, hostName);
    }
    strcat(*url, "/");
    strcat(*url, server);
    strcat(*url, "/");
    strcat(*url, itemName);
    return 0;   
}

static void URLToOPC()
{
    char* hostName;
    char* server;
    char* itemName;
    int   indexMachineName;
    charurl;
   
    GetCtrlVal(panelHandle, PANEL_URL, url);
   
    indexMachineName = FindPattern (url, 0, -1, "//", 0, 0);
    if (indexMachineName >= 0){
      hostName = strtok(&url, "/");
      if (strcmp(hostName, "localHost") == 0)
            SetCtrlVal(panelHandle, PANEL_HOSTNAME, "");
      else
            SetCtrlVal(panelHandle, PANEL_HOSTNAME, hostName);
    }
    else{
      strtok(url, "/");
      SetCtrlVal(panelHandle, PANEL_HOSTNAME, "");
    }
   
    if ((server = strtok(NULL, "/")) != NULL)
      SetCtrlVal(panelHandle, PANEL_SERVER, server);
   
    if ((itemName = strtok(NULL, "\0"))!= NULL)
      SetCtrlVal(panelHandle, PANEL_ITEM, itemName);
   
}

static void ShowDataSocketError(HRESULT errorCode)
{
    CA_DisplayErrorInfo(dsHandle, "DataSocket Error", errorCode, NULL);
    return;
}

sdfdn 发表于 2009-3-14 12:43:56

上面的是源码,请教版主了,另外例子在cvi安装文件夹下面ds里面的opc client

netcreature 发表于 2009-3-16 08:37:12

typedef long HRESULT;
我运行了一下你所说的程序,并没有出现什么问题!
页: [1]
查看完整版本: cvi中opc的例子