LabWindows/CVI(二):基本代码框架函数说明
1、主函数
主函数是程序的入口
包含:初始化运行库、装载用户面板、显示用户面板、删除面板、关闭运行时库等操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cvirte.h> #include <userint.h> #include "温度2.h" static int panelHandle; //主函数 int main (int argc, char *argv[]) { // 初始化CVI运行时库 /** * InitCVIRTE函数:初始化CVI运行时库 * 函数原型为:int InitCVIRTE(void *HInstance,char *Argv[],void *Reserved); * *HInstance:如果采用main作为主函数,则输入值必须为0 * *Argv[]:指向调试时生成的可执行文件的文件名 * *Reserved:保留参数,一般设置为0 * int:返回值,返回程序初始化运行时库的状态,该数据类型为整型; 1:运行成功 0:运行失败,可能出现的问题是内存溢出 **/ if (InitCVIRTE (0, argv, 0) == 0) return -1; /* 若内存溢出,返回-1 */ // 装载面板,返回面板句柄 /** * LoadPanel函数:将用户界面文件载入内存中 * 函数原型为:int LoadPanel(int Parent_Panel_Handle,char Filename[],int Panel_Resource_ID) * Parent_Panel_Handle:父面板句柄,此参数是面板常量名所指代的父面板。如果设置为0,则说明 该面板就是处在最顶层的面板。 * Filename[]:文件名,此参数设置的是被载入的用户界面文件的文件名 * Panel_Resource_ID:面板常量名,此参数是在用户编辑界面文件中定义的常量名 * int:返回值为面板句柄。设置了这个参数,在以后的函数调用中使用该面板句柄可以指代该面板。 如果返回正值代表运行成功,返回负值代表运行失败。每个负值代表产生的一个错误类型码。 **/ if ((panelHandle = LoadPanel (0, "温度2.uir", PANEL)) < 0) return -1; //在屏幕上显示面板 函数原型为:int DisplayPanel(int Panel_Handle); DisplayPanel (panelHandle); //运行用户界面 函数原型为:int RunUserInterface(void); RunUserInterface (); //从内存中删除面板及其子面板,并在屏幕中清除 /** * 函数原型为:int DiscardPanel(int Panel_Handle); * Panel_Handle:面板句柄,此参数是设置所要删除的面板句柄 **/ DiscardPanel (panelHandle); //若程序成功退出,返回0 return 0; }
2、回调函数
回调函数(1)
//回调函数,函数功能:当按下该按钮时,退出用户界面 int CVICALLBACK Quit (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { //控件响应的事件 case EVENT_COMMIT: //在运行用户界面时,执行该函数会退出用户界面 /** * 函数原型为:int QuitUserInterface(int Return_Code); * Return_Code:返回代码,一般设置为0 **/ QuitUserInterface(0); break; } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//回调函数,函数功能:开关控件处于ON时,使LED点亮 int CVICALLBACK Acquire (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static double max,min; static int max_index,min_index; int i,j,value; //定义信号采样数据点数组 double datapoints[100]; switch (event) { //控件响应的事件 case EVENT_COMMIT: /** * 获得控件的值 GetCtrlVal * 函数原型为:int GetCtrlVal(int Panel_Handle,int Control_ID,void *Value); * Panel_Handle:面板句柄,该项是在函数LoadPanel里设置的 * Control_ID:控件ID (面板名 + 控件名) * *Value:控件的值,该数据类型与控件本身的数据类型一致 **/ //获得开关控件的状态 GetCtrlVal(panelHandle,PANEL_BINARYSWITCH,&value); //判断开头是否为"开" if(value == 1){ /** * 设置控件的属性值 SetCtrlVal * 函数原型为:int SetCtrlVal(int Panel_Handle,int Control_ID,any type Value); * GetCtrlVal函数Value填写的是变量的地址(需要加上取地址符"&");SetCtrlVal函数Value需要填写的是变量 **/ //点亮LED,即为状态1 SetCtrlVal(panelHandle,PANEL_LED,1); /** * 设置控件属性 SetCtrlAttribute * 函数原型为:int SetCtrlAttribute(int Panel_Handle,int Control_ID,int Control_Attribute,any type Attribute); **/ //设置LED的标题变为"开" SetCtrlAttribute(panelHandle,PANEL_LED,ATTR_LABEL_TEXT,"开"); /** * 获取控件属性值 GetCtrlAttribute * 函数原型为:int GetCtrlAttribute(int Panel_Handle,int Control_ID,int Control_Attribute,void *Attribute_Value); **/ for(i = 0 ; i < 100 ; i++) { //编写随机函数 datapoints[i] = 100*rand()/32767.0; //延时0.01s Delay(0.01); //设置温度计控件的值 SetCtrlVal(panelHandle,PANEL_NUMERICTHERM,datapoints[i]); /** * 逐点绘图 PlotStripChartPoint * 函数原型为:int PlotStripChartPoint(int Panel_Handle,int Control_ID,double Y); * Panel_Handle:控件所在的面板句柄 * Control_ID:控件ID * double Y:Y轴上的数值 **/ //在控件 Strip Chart 中滚动显示数据 PlotStripChartPoint(panelHandle,PANEL_STRIPCHART,datapoints[i]); } /** * 输入数值的最大值和最小值 MaxMin1D * 函数原型为:AnalysisLibErrType MaxMin1D(const double Input_Array[],int Number_of_Elements, double *Maximum_Value,int *Maximum_Index, double *Minimum_Value,int *Minimum_Index); * Input_Array[]:输入数组名 Number_of_Elements:输入数组元素的个数 * *Maximum_Value:输入数组的最大值 *Minimum_Value:输入数组中的最小值 * *Maximum_Index:输入数组中的最大值索引 *Minimum_Index:输入数组中的最小值索引 **/ //找出100个随机数中最大值和最小值 MaxMin1D(datapoints,100,&max,&max_index,&min,&min_index); //将最大值最小值设置到控件中 SetCtrlVal(panelHandle,PANEL_NUMERIC,max); SetCtrlVal(panelHandle,PANEL_NUMERIC_2,min); //当数据产生完毕后,关闭"开始采样按钮" SetCtrlVal(panelHandle,PANEL_BINARYSWITCH,0); //当数据产生完毕后,关闭LED SetCtrlVal(panelHandle,PANEL_LED,0); //当数据产生完毕后,温度计控件归零 SetCtrlVal(panelHandle,PANEL_NUMERICTHERM,0.00); //当数据产生完毕后,设置LED的标题为"关" SetCtrlAttribute(panelHandle,PANEL_LED,ATTR_LABEL_TEXT,"关"); } else{ //关闭LED,即设置其值为0 SetCtrlVal(panelHandle,PANEL_LED,0); //温度计控件值归零 SetCtrlVal(panelHandle,PANEL_NUMERICTHERM,0.00); //设置LED的标题为“关” SetCtrlAttribute(panelHandle,PANEL_LED,ATTR_LABEL_TEXT,"关"); } break; } return 0; }
我驰骋天下,守你盛世繁华