cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1987|回复: 6

cvi中opc的例子

[复制链接]
发表于 2009-3-11 23:10:17 | 显示全部楼层 |阅读模式
想用cvi做一个opc的客户端,现在苦于无法下手
看了cvi自带的opc的例子,一头雾水,哪位大哥能够讲解一下?

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

谢谢
 楼主| 发表于 2009-3-12 09:36:11 | 显示全部楼层
还有
static int OPCToURL(char** url);

中的char** url
是什么意思?
发表于 2009-3-12 12:59:37 | 显示全部楼层
你count选了5。还是先查一下口上有多少再读。

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

你多次重复安装事件,不知道这个有没有影响。也请版主指点,谢谢。
发表于 2009-3-13 08:45:51 | 显示全部楼层
1、“HRESULT函数需要什么头文件”——它只是定义的一个变量。我怀疑它根本就是在C文件中定义的!
2、“为什么自己变得时候无法通过编译?”——不明白你说的是什么意思!
3、“char** url“是表示网址的字符串!

如果不提供源码,这种没头没尾的问题我是无法回答的!·
 楼主| 发表于 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[1000];

    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[500];
    char server[500];
    char itemName[100];
   
    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] = '\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;
    char  url[500];
   
    GetCtrlVal(panelHandle, PANEL_URL, url);
   
    indexMachineName = FindPattern (url, 0, -1, "//", 0, 0);
    if (indexMachineName >= 0){
        hostName = strtok(&url[indexMachineName+2], "/");
        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;
}
 楼主| 发表于 2009-3-14 12:43:56 | 显示全部楼层
上面的是源码,请教版主了,另外例子在cvi安装文件夹下面ds里面的opc client
发表于 2009-3-16 08:37:12 | 显示全部楼层
typedef long HRESULT;
我运行了一下你所说的程序,并没有出现什么问题!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-21 07:58 , Processed in 1.430605 second(s), 7 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表