⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample21.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <ansi_c.h>
#include <cvirte.h>		
#include <userint.h>
#include "sample21.h"
#include "bearing.h"

//定义变量
static int panelHandle;
BFDATA bfData;

//函数声明
void BFAnlysis(void);

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)	
		return -1;
    if ((panelHandle = LoadPanel (0, "sample21.uir", PANEL)) < 0)
		return -1;
	
	//变量初始化
	bfData.data_flag=-1;
	bfData.data_length=0;
	bfData.data_samplerate=0;
	bfData.data=NULL;
	bfData.ar_flag=-1;
	bfData.ar_rank=0;
	bfData.ar_para=NULL;
	bfData.ar_var=0;
	
	DisplayPanel (panelHandle);
	RunUserInterface ();
	return 0;
}

int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_CLOSE:
			QuitUserInterface (0);
			break;
		}
	return 0;
}

int CVICALLBACK GraphCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	//定义变量
	double x,y;
	switch (event)
		{
		case EVENT_LEFT_CLICK:
			//获取光标坐标
			GetGraphCursor (panel, PANEL_GRAPH, 1, &x, &y);
			
			//设置控件XCOORDINATE和YCOORDINATE的值
			SetCtrlVal (panel, PANEL_XCOORDINATE, x);
			SetCtrlVal (panel, PANEL_YCOORDINATE, y);
			break;
		}
	return 0;
}

int CVICALLBACK StyleCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	//定义变量
	int i;
	switch (event)
		{
		case EVENT_COMMIT:
			//获取控件STYLE的值
			GetCtrlVal(panel,control,&i);

			//如果STYLE控件值不为1,设置KURTOSIS控件的DIMMED属性为1
			if(i==0)
			  SetCtrlAttribute (panel, PANEL_KURTOSIS, ATTR_DIMMED, 0);
			else
			  SetCtrlAttribute (panel, PANEL_KURTOSIS, ATTR_DIMMED, 1);

			//如果STYLE控件值不为2,设置CURSTDDEV控件的DIMMED属性为1
			if(i==2)
			  SetCtrlAttribute (panel, PANEL_CURSTDDEV, ATTR_DIMMED, 0);
			else
			  SetCtrlAttribute (panel, PANEL_CURSTDDEV, ATTR_DIMMED, 1);
			
			//调用BFAnlysis函数
			BFAnlysis();
			break;
		}
	return 0;
}

int CVICALLBACK ReadDataCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
    //定义变量
    int status,i;
    char filename[MAX_PATHNAME_LEN];
	FILE* fp;
    
	switch (event)
		{
		case EVENT_COMMIT:
		   //打开文件选择框
		   status = FileSelectPopup ("", "*.bfd", "*.bfd",
									 "Open file", VAL_LOAD_BUTTON, 0, 0, 1, 0,
									 filename);
	       if ((status <0)||(status==0))  
	             return -1;
	       
           //打开轴承故障数据文件并读取数据
           fp = fopen (filename, "rt");
           if(fp==NULL) break;
           bfData.data_flag=1;
		   fread (&bfData.data_length, sizeof(int), 1, fp);
		   fread (&bfData.data_samplerate, sizeof(int), 1, fp);
		   if(bfData.data==NULL)
		      bfData.data=malloc(sizeof(double)*bfData.data_length);
		   else
			  bfData.data = realloc (bfData.data, sizeof(double)*bfData.data_length);
		   fread (bfData.data, sizeof(double), bfData.data_length, fp);
		   fclose (fp);
			
           //调用STYLE控件的回调函数
           StyleCallback (panel, PANEL_STYLE, EVENT_COMMIT,
		                 NULL,  0, 0 );
		break;
		}
	return 0;
}

int CVICALLBACK ReadParameterCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
    //定义变量
    int status,i;
    char filename[MAX_PATHNAME_LEN];
	FILE* fp;
    
	switch (event)
		{
		case EVENT_COMMIT:
		   //打开文件选择框
		   status = FileSelectPopup ("", "*.arp", "*.arp",
									 "Open file", VAL_LOAD_BUTTON, 0, 0, 1, 0,
									 filename);
	       if ((status <0)||(status==0))  
	             return -1;
	       
           //读取时序模型参数文件并读取数据
           fp = fopen (filename, "rt");
           if(fp==NULL) break;
           
           bfData.ar_flag=1;
           
		   fread (&bfData.ar_rank, sizeof(int), 1, fp);
		   
		   if(bfData.data==NULL)
		      bfData.ar_para=malloc(sizeof(double)*bfData.ar_rank);
		   else
			  bfData.ar_para = realloc (bfData.ar_para, sizeof(double)*bfData.ar_rank);
			  
		   fread (bfData.ar_para, sizeof(double), bfData.ar_rank, fp);
		   
		   fread (&bfData.ar_var, sizeof(double), 1, fp);
		   
		   fclose (fp);
			
		   //设置控件ORISTDDEV的值
		   SetCtrlVal (panel, PANEL_ORISTDDEV, bfData.ar_var);
			break;
		}
	return 0;
}

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

void BFAnlysis()
{
  //定义变量
  int i;
  double *temp,k,var;
  
  //如果没有读取轴承故障数据,返回
  if(bfData.data_flag==-1) return;
  
  //获取空间STYLE控件的值
  GetCtrlVal (panelHandle, PANEL_STYLE, &i);
  
  //分配内存空间
  temp=malloc(sizeof(double)*bfData.data_length);
  
  switch(i)
  {
    case 0:
      //计算峭度
      CalculateKurtosis(bfData.data,bfData.data_length,&k);
	  
	  //设置控件KURTOSIS控件的值
	  SetCtrlVal (panelHandle, PANEL_KURTOSIS, k);
	  
	  DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
	  PlotWaveform (panelHandle, PANEL_GRAPH, bfData.data,
					bfData.data_length, VAL_DOUBLE, 1.0, 0.0, 0.0,
					1.0/bfData.data_samplerate, VAL_THIN_LINE,
					VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_GREEN);
					
    break;
    case 1:
      //计算频谱幅度
      CalculateSpectrum(bfData.data,bfData.data_length,temp);

	  DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
	  PlotWaveform (panelHandle, PANEL_GRAPH, temp, bfData.data_length/2,
					VAL_DOUBLE, 1.0, 0.0, 0.0,
					(double)bfData.data_samplerate/bfData.data_length,
					VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1,
					VAL_GREEN);
    break;
    case 2:
	  //如果没有读取时序模型参数
	  if(bfData.ar_flag==-1) 
	  {	   MessagePopup ("出错", "未读取参数!");
	       break;
	  }
      
      //计算AR模型的残差
      CalculateARVar(bfData.data,bfData.data_length,
                     bfData.ar_para,bfData.ar_rank,&var,temp);
	  
	  DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
	  PlotWaveform (panelHandle, PANEL_GRAPH, temp, bfData.data_length/2,
					VAL_DOUBLE, 1.0, 0.0, 0.0, 1.0/bfData.data_samplerate,
					VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1,
					VAL_GREEN);
					
	  //设置控件CURSTDDEV的值
	  SetCtrlVal (panelHandle, PANEL_CURSTDDEV, var);
    break;
    case 3:
      //希尔伯特变换
      HilbertTran(bfData.data, temp, bfData.data_length);
	  
	  DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
	  PlotWaveform (panelHandle, PANEL_GRAPH, temp, bfData.data_length,
					VAL_DOUBLE, 1.0, 0.0, 0.0,
					(double)bfData.data_samplerate/bfData.data_length,
					VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1,
					VAL_GREEN);
    break;
  }
  free(temp);
  return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -