cyberjok 发表于 2008-2-1 12:10:08

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

NON-FATAL RUN-TIME ERROR:   "MBX.c", line 62, col 5, thread id 0x000005B0:   Library function error (return value == -13 ). 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;
        float fv,cppm,cgm3,cwt,Lv;
        int i;
        static unsigned int cnt = 0;

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

        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 > 0.0001)&&(fv > 0.0001)&&(fv > 0.0001))
        {
                cppm = 272.0*(fv/10+273.0)*log(fv/fv)*1000000.0/308.0/-Lv/fv/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 /= 1000;
        fv /= 1000;
        fv /= 1000;
        fv /= 1000;
        fv /= 10;
        fv /= 1000;
        fv /= 1000;
        fv /= 1000;
        fv /= 1000;
        fv /= 1000;
        fv /= 100;
        fv /= 100;
        fv /= 100;

        SetCtrlVal(panelHandle,PANEL_NUMERIC,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_2,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_3,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_4,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_5,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_7,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_8,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_9,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_10,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_11,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_12,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_13,fv);
        SetCtrlVal(panelHandle,PANEL_NUMERIC_14,fv);

        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 编辑 ]

cpubbs 发表于 2008-2-1 14:29:24

感觉可能是这时候它已经将这个面板给DISCARD了,然后它就会提示控件不存在了!要不在退出前给一个标志位,比如给某一个全局变量赋个值,然后您那个出错之前做个判断,看是否处于退出状态,如果是,就不进行后续操作,直接RETURN,否则就执行,这样应该就不会出错了!

cpubbs 发表于 2008-2-1 14:30:09

另外兄弟发贴可以将标题写得跟内容较相近,这样易于资料整理和问题的解决,谢谢!

http://www.cpubbs.com/bbs/thread-2068-1-1.html

cyberjok 发表于 2008-2-2 12:20:50

谢谢!现在把它改过来!!!

kevin_2009 发表于 2008-2-21 14:46:39

回复 2# 的帖子

赞成CPUBBS的意见。我试过了,将界面初始化时的DiscardPanel(panelHandle)注释掉就可以了
页: [1]
查看完整版本: 产生Library function error .Invalid control ID 出错!如何解决!