cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

产生Library function error .Invalid control ID 出错!如何解决!

[复制链接]
发表于 2008-2-1 12:10:08 | 显示全部楼层 |阅读模式
NON-FATAL RUN-TIME ERROR:   "MBX.c", line 62, col 5, thread id 0x000005B0:   Library function error (return value == -13 [0xfffffff3]). Invalid control ID


#include "mbaxp.h"
#include <ansi_c.h>
#include <cvirte.h>               
#include <userint.h>
#include "MBX.h"

static CAObjHandle objecthandle;
static int panelHandle;
static VBOOL Bok;
static short int Error;
static short int rhandle;

int main (int argc, char *argv[])
{
        if (InitCVIRTE (0, argv, 0) == 0)
                return -1;        /* out of memory */
        if ((panelHandle = LoadPanel (0, "MBX.uir", PANEL)) < 0)
                return -1;
       
        GetObjHandleFromActiveXCtrl(panelHandle,PANEL_MBAXP,&objecthandle);       
        MBAXPLib__DMbaxpSetConnection (objecthandle, NULL, MBAXPLibConst_Port1);
        MBAXPLib__DMbaxpSetBaudRate (objecthandle, NULL, MBAXPLibConst_B9600);
        MBAXPLib__DMbaxpSetDataBits (objecthandle, NULL, MBAXPLibConst_Eight);
        MBAXPLib__DMbaxpSetParity (objecthandle, NULL, MBAXPLibConst_NONE);
        MBAXPLib__DMbaxpSetStopBits (objecthandle, NULL, MBAXPLibConst_One);
        MBAXPLib__DMbaxpSetProtocolMode (objecthandle, NULL, MBAXPLibConst_RTU);
        MBAXPLib__DMbaxpSetTimeout (objecthandle, NULL, 1000);
        MBAXPLib__DMbaxpOpenConnection (objecthandle, NULL, &Bok);
        MBAXPLib__DMbaxpReadHoldingRegisters (objecthandle, NULL, 1, 1, 0, 14, 1000, &Bok);
        MBAXPLib__DMbaxpUpdateEnable (objecthandle, NULL, 1, &Bok);

        DisplayPanel (panelHandle);
        RunUserInterface ();
        DiscardPanel (panelHandle);
        return 0;
}

int CVICALLBACK TimerCB (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        short value[13];
        float fv[13],cppm,cgm3,cwt,Lv;
        int i;
        static unsigned int cnt = 0;

        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 0, &value[0]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 1, &value[1]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 2, &value[2]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 3, &value[3]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 4, &value[4]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 5, &value[5]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 6, &value[6]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 7, &value[7]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 8, &value[8]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 9, &value[9]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 10, &value[10]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 11, &value[11]);
        MBAXPLib__DMbaxpGetRegister (objecthandle, NULL, 1, 12, &value[12]);

        MBAXPLib__DMbaxpGetLastError (objecthandle, NULL, &Error);

       
        SetCtrlVal(panelHandle,PANEL_NUMERIC_17,Error); //这个语句出错~~~ 运行的时候,很正常;在我按EXIT时,已经正常调用了ExitCB
                                                         //PANEL_NUMERIC_17 这个控件是存在的,
       
        for(i=0; i<13; i++)
        {
                fv = (float)value;
        }
//                ctmp = UP0*(Ut/10 + 273.0)*log((float)v1/v2)*1000000.0/308.0/(C_L2 - C_L1)/Up/273.0;
        GetCtrlVal(panelHandle,PANEL_NUMERIC_15,&Lv);
       
        if((fv[8] > 0.0001)&&(fv[9] > 0.0001)&&(fv[3] > 0.0001))
        {
                cppm = 272.0*(fv[4]/10+273.0)*log(fv[8]/fv[9])*1000000.0/308.0/-Lv/fv[3]/273.0;
                cgm3 = 48*cppm/22414;
                cwt  = 100*cgm3/(cgm3+(1-cgm3*22.414/48000)*1429);
        }
        else
        {
                cppm = 0.0f;
                cgm3 = 0.0f;
                cwt  = 0.0f;
        }
        SetCtrlVal(panelHandle,PANEL_NUMERIC_16,cppm);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_18,cgm3);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_19,cwt);
       
        fv[0] /= 1000;
        fv[1] /= 1000;
        fv[2] /= 1000;
        fv[3] /= 1000;
        fv[4] /= 10;
        fv[5] /= 1000;
        fv[6] /= 1000;
        fv[7] /= 1000;
        fv[8] /= 1000;
        fv[9] /= 1000;
        fv[10] /= 100;
        fv[11] /= 100;
        fv[12] /= 100;

        SetCtrlVal(panelHandle,PANEL_NUMERIC,fv[0]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_2,fv[1]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_3,fv[2]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_4,fv[3]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_5,fv[4]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_7,fv[5]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_8,fv[6]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_9,fv[7]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_10,fv[8]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_11,fv[9]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_12,fv[10]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_13,fv[11]);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_14,fv[12]);

        SetCtrlVal(panelHandle,PANEL_NUMERIC_6,++cnt);

        return 0;
}

int CVICALLBACK ExitCB (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
        {
                case EVENT_COMMIT:
                        MBAXPLib__DMbaxpCloseConnection (objecthandle, NULL);
                        QuitUserInterface(0);
                        break;
        }
        return 0;
}

[ 本帖最后由 cyberjok 于 2008-2-2 12:23 编辑 ]
发表于 2008-2-1 14:29:24 | 显示全部楼层
感觉可能是这时候它已经将这个面板给DISCARD了,然后它就会提示控件不存在了!要不在退出前给一个标志位,比如给某一个全局变量赋个值,然后您那个出错之前做个判断,看是否处于退出状态,如果是,就不进行后续操作,直接RETURN,否则就执行,这样应该就不会出错了!
发表于 2008-2-1 14:30:09 | 显示全部楼层
另外兄弟发贴可以将标题写得跟内容较相近,这样易于资料整理和问题的解决,谢谢!

http://www.cpubbs.com/bbs/thread-2068-1-1.html
 楼主| 发表于 2008-2-2 12:20:50 | 显示全部楼层
谢谢!现在把它改过来!!!
发表于 2008-2-21 14:46:39 | 显示全部楼层

回复 2# 的帖子

赞成CPUBBS的意见。我试过了,将界面初始化时的DiscardPanel(panelHandle)注释掉就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-22 07:04 , Processed in 0.636722 second(s), 7 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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