LabWindow文件读写与回放

本文介绍了一个基于多线程的数据采集系统实现方案,包括实时数据采集、数据存储及数据回放等功能。系统能够通过设置不同的参数来调整采集频率和电压范围,并且支持多通道数据的同时采集与显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "windows.h"
#include "stdio.h"
#include "toolbox.h"
#include <utility.h>
#include <cvirte.h>
#include <userint.h>
#include "ADaquire.h"

#include "DAME3000N.h" // 驱动程序头文件,在您的工程代码中包含此文件即可使用驱动函数

static char proj_dir[MAX_PATHNAME_LEN];
static char file_name[MAX_PATHNAME_LEN];
//--------------------------------------------------------
static int panelHandle;
static int panelHandle2;

//线程开始标记,值为1时开始多线程
int threadID;

//标志设置,0表示没有开始,1表示正在进行中
static int  startAquireflag = 0;
static int  startReplayflag = 0;
static int  startSaveflag = 0;
//----------------------------
//系统参数
static LONG ADMode=9;   //电压范围
static int VoltType=9;  //电压范围类型
static int VoltMax=10;  //电压最大值
static int VoltMin=-10; //电压最小值

static int AquireDataTPS=2;                   //数据每秒采集的次数
static char ARTe3058nIP[20]= "192.168.1.150"; //采集卡的IP地址
//传递所创建线程的callbackData参数
static void   *threadfunctiondata = "这是一个多线程的示例!";
//声明多线程回调函数
int CVICALLBACK ThreadFunction (void *functionData);

//数据采集多线程
int CVICALLBACK ThreadDataAquire(void *functionData)
{

	double curVal[8]= {0,0,0,0,0,0,0,0};

	//先画一次,再清屏
	PlotStripChart( panelHandle,PANEL_STRIPCHART,curVal,2,0,0,VAL_DOUBLE);
	ClearStripChart(panelHandle,PANEL_STRIPCHART);

	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 1, ATTR_TRACE_LG_VISIBLE, 1);
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 2, ATTR_TRACE_LG_VISIBLE, 1);
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 3, ATTR_TRACE_LG_VISIBLE, 1);
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 4, ATTR_TRACE_LG_VISIBLE, 1);

	SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,1,ATTR_TRACE_LG_TEXT,"通道1");
	SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,2,ATTR_TRACE_LG_TEXT,"通道2");
	SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,3,ATTR_TRACE_LG_TEXT,"通道3");
	SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,4,ATTR_TRACE_LG_TEXT,"通道4");

	static long iCount=0;
	char result[40];
	double d_currenttime=0;
	int hour=0,minute=0;
	double second=0;
	int month=0,day=0,year=0;
	FILE  *fp;

	//获取时间
	GetCurrentDateTime(&d_currenttime);
	GetDateTimeElements(d_currenttime,&hour,&minute,&second,&month,&day,&year);
	sprintf(result,"appData\\D%04d%02d%02d%02d%02d%02.0f.dat",year,month,day,hour,minute,second);
	fp=fopen(result,"a");

	while(startAquireflag==1)
	{ 
		//	result=(double)(ADBuffer[0] * 20.0 / 65536.0  - 10.0);//±10V
		for(int i=0; i<8; i++)
			curVal[i]=(double)(rand()%10);//±10V

		PlotStripChart(panelHandle,PANEL_STRIPCHART,curVal,8,0,0,VAL_DOUBLE);

		//写文件
		iCount++;
		for(int i=0; i<8; i++)
			fprintf(fp,"%f  ",curVal[i]);
		fprintf(fp,"%s \n"," ");

		if( iCount>50-1)
		{
			fclose(fp);
			iCount=0;

			GetCurrentDateTime(&d_currenttime);
			GetDateTimeElements(d_currenttime,&hour,&minute,&second,&month,&day,&year);
			sprintf(result,"appData\\D%04d%02d%02d%02d%02d%02.0f.dat",year,month,day,hour,minute,second);
			fp=fopen(result,"a");
		}

		Sleep(1000);
	}

	fclose(fp);

	startAquireflag=0;
	return 0;
}

//数据回放线程
int CVICALLBACK ThreadReplaydata(void *functionData)
{
	ClearStripChart(panelHandle,PANEL_STRIPCHART);
	FILE  *fp;
	fp=fopen(file_name,"r");

	char tt[50];
	double curVal[8]= {0,0};
	double result=0;

	//先画一次,再清屏
	PlotStripChart( panelHandle,PANEL_STRIPCHART,curVal,8,0,0,VAL_DOUBLE);
	ClearStripChart(panelHandle,PANEL_STRIPCHART);
	//读文件
	while( fscanf(fp,"%s",tt)>0)
	{
		if(startReplayflag==1)
		{
			result=atof(tt);
			SetCtrlVal(panelHandle,PANEL_curVal,result);
			curVal[0]=result;
			
			//读取剩余7个数据
			for(int i=1;i<8;i++)
			{
				fscanf(fp,"%s",tt);
				result=atof(tt);
				curVal[i]=result;
			}
				
			PlotStripChart( panelHandle,PANEL_STRIPCHART,curVal,8,0,0,VAL_DOUBLE);
			Sleep(500);
		}
		else
			break;
	}
	fclose(fp);
	startReplayflag=0;
	MessagePopup("消息","回放结束");
	return 0;
}

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "ADaquire.uir", PANEL)) < 0)
		return -1;
	DisplayPanel (panelHandle);

	SetCtrlAttribute(panelHandle,PANEL_STRIPCHART,ATTR_POINTS_PER_SCREEN,100); //设置每屏数据显示的数目
	SetCtrlAttribute (panelHandle, PANEL_STRIPCHART, ATTR_SCROLL_MODE, VAL_BLOCK); //设置Strip Chart显示模式
	SetCtrlAttribute (panelHandle, PANEL_STRIPCHART, ATTR_NUM_TRACES, 4);//设置显示的波形数目
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 1, ATTR_TRACE_COLOR, VAL_RED);//设置波形颜色
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 2, ATTR_TRACE_COLOR, VAL_GREEN);
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 1, ATTR_TRACE_VISIBLE, 1);//设置波形是否可见
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 2, ATTR_TRACE_VISIBLE, 1);
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 1, ATTR_TRACE_LG_VISIBLE, 1);//设置波形说明是否可见
	SetTraceAttribute (panelHandle, PANEL_STRIPCHART, 2, ATTR_TRACE_LG_VISIBLE, 1);
	SetTraceAttributeEx (panelHandle, PANEL_STRIPCHART, 1, ATTR_TRACE_LG_TEXT,"Line1");//设置波形说明字符
	SetTraceAttributeEx (panelHandle, PANEL_STRIPCHART, 2, ATTR_TRACE_LG_TEXT,"Line2");

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

int CVICALLBACK BeginGetdata (int panel, int control, int event,
							  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:


			if(startAquireflag==1)
			{
				//已经开始采集
				MessagePopup("消息","采集已经开始!");
				return 0;
			}
			if(startReplayflag==1)
			{
				//正在回放
				MessagePopup("消息","正在回放数据,如果需要采集请先停止当前回放");
				return 0;
			}

			SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,1,ATTR_TRACE_LG_TEXT,"通道1");
			SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,2,ATTR_TRACE_LG_TEXT,"通道2");
			SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,3,ATTR_TRACE_LG_TEXT,"通道3");
			SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,4,ATTR_TRACE_LG_TEXT,"通道4");



			startAquireflag=1;
			//创建一个线程函数
			CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadDataAquire, threadfunctiondata, &threadID);


			break;
	}
	return 0;
}

int CVICALLBACK StopGetData (int panel, int control, int event,
							 void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			if(startAquireflag==0)
			{
				//没有开始采集
				MessagePopup("消息","没有采集数据!");
				return 0;
			}
			startAquireflag=0;
			//	QuitUserInterface(0);
			break;
	}
	return 0;
}

int CVICALLBACK mainPanel (int panel, int event, void *callbackData,
						   int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_GOT_FOCUS:

			break;
		case EVENT_LOST_FOCUS:

			break;
		case EVENT_CLOSE:

			startAquireflag=0;
			QuitUserInterface(0);

			break;
	}
	return 0;
}

int CVICALLBACK SaveData (int panel, int control, int event,
						  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			if(startAquireflag==0)
			{
				//没有开始采集
				MessagePopup("消息","没有采集数据,无法存储");
				return 0;
			}
			startSaveflag=1;
			MessagePopup("消息","开始存储");
			break;
	}
	return 0;
}

int CVICALLBACK ReplayData (int panel, int control, int event,
							void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			if(startAquireflag==1)
			{
				//正在采集
				MessagePopup("消息","正在采集数据,如果需要回放请先停止采集");
				return 0;
			}

			if(startReplayflag==1)
			{
				//正在回放
				MessagePopup("消息","正在回放数据,如果需要新的回放请先停止当前回放");
				return 0;
			}
			
			GetProjectDir (proj_dir); 
			sprintf(proj_dir,"%s\\%s",proj_dir,"appData");
	        if (FileSelectPopupEx (proj_dir, "*.dat", "*.dat","File to history data", VAL_OK_BUTTON, 0, 1, file_name) > 0) 
			{
				startReplayflag=1;
			  //创回放线程函数
			   CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadReplaydata, threadfunctiondata, &threadID);
			}

			else
			    MessagePopup("提示信息","文件获取失败,不能回放");	
		
			break;
	}
	return 0;
}

int CVICALLBACK DealData (int panel, int control, int event,
						  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			break;
	}
	return 0;
}

int CVICALLBACK SettingParam (int panel, int control, int event,
							  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			if(startAquireflag==1)
			{
				//正在采集
				MessagePopup("消息","正在采集数据,如果需要设置参数请先停止采集");
				return 0;
			}

			if ((panelHandle2 = LoadPanel (0, "ADaquire.uir", PANEL2)) < 0)
				return -1;
			DisplayPanel (panelHandle2);

			break;
	}
	return 0;
}

int CVICALLBACK SettingPara (int panel, int event, void *callbackData,
							 int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_GOT_FOCUS:

			break;
		case EVENT_LOST_FOCUS:

			break;
		case EVENT_CLOSE:
			DiscardPanel (panelHandle2);
			break;
	}
	return 0;
}

int CVICALLBACK SetParaVal (int panel, int control, int event,
							void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			GetCtrlVal(panelHandle2,PANEL2_ARTe3058nIPstr,ARTe3058nIP);
			GetCtrlVal(panelHandle2,PANEL2_AquireDataTPS,&AquireDataTPS);

			GetCtrlVal(panelHandle2,PANEL2_VoltVal,&VoltType);

			if(VoltType==9)
				VoltMax=10,VoltMin=-10,ADMode=9;

			if(VoltType==8)
				VoltMax=5,VoltMin=-5,ADMode=8;

			MessagePopup("消息","参数设置成功");

			break;
	}
	return 0;
}

int CVICALLBACK StopReplayData (int panel, int control, int event,
								void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			startReplayflag=0;

			break;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值