目的:10秒采集一次过程变量的值,求一天的最大值、最小值和平均值,加上变量描述、单位、采集日期和时间后,并保存为(日期.CSV)。
思路:在一个周期为10秒的动作中采集并处理数据,程序如下:
#include "apdefap.h"
int gscAction( void )
{
#pragma code ("kernel32.dll")
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code ()
/*存放变量的值*/
typedef struct data {
double var1;
double var2;
double var3;
double var4;
}Data;
char varName[4][20] = {"hj1","hj2","hj3","hj4"}; /* 变量的名称 */
char varDes cription[4][100]={"des cription1","des cription2","des cription3","des cription4"}; /* 变量描述 */
char varPer[4][10] = {"km/h","km/h","km/h","km/h"}; /* 单位名称 */
char fileName1[100] = "d:\\records.txt"; /* 存放变量记录的文件名称 */
char fileName2[100] = ""; /* 要保存的excel文件名称 */
char total[100] = "";
char col[10] = "";
char fix[3][10] = {"_AVG","_MAX","_MIN"};
Data data;
double varValue[4]; /* 变量值 */
double varSum[4]; /* 变量值的和 */
double varMin[4]; /* */
double varMax[4];
double varAvg[4];
FILE * fd = NULL;
int nCount ;//一个变量采集的次数
int i;
int dataLen = sizeof(Data);
SYSTEMTIME sysTime;
__object* pExcel = NULL;
GetLocalTime(&sysTime);
pExcel = __object_create("Excel.Application"); //打开excel文件
pExcel->Visible = 0; /* 隐藏 */
pExcel->Workbooks ->Open("d:\\book1.xls"); /* 打开excel文件模板 */
/** Get Var Value **/
/* */
for (i=0;i<4;i++)
{
varValue [i] =GetTagFloat (varName[i]);
}
nCount++;
/** Get Var Min **/
for ( i = 0 ; i < 4 ; i++ )
{
varMin[i] = varValue[i];
}
/** Get Var Max **/
for ( i = 0 ; i < 4 ; i++ )
{
varMax[i] = varValue[i];
}
/** Get Var Sum **/
for ( i = 0 ; i < 4 ; i++ )
{
varSum[i] = varValue[i];
}
/* open records file */
if ( (fd = fopen ( fileName1 , "a" )) == NULL )
{
printf ("open file %s failed\n" , fileName1);
}
/* read records */
while ( (fread ( &data , dataLen , 1 , fd )) )
{
nCount++;
varSum[0] = varSum[0] + data.var1;
varSum[1] = varSum[1] + data.var2;
varSum[2] = varSum[2] + data.var3;
varSum[3] = varSum[3] + data.var4;
if ( data.var1 > varMax[0] )
{
varMax[0] = data.var1;
}
if ( data.var2 > varMax[1] )
{
varMax[1] = data.var2;
}
if ( data.var3 > varMax[2] )
{
varMax[2] = data.var3;
}
if ( data.var4 > varMax[3] )
{
varMax[3] = data.var4;
}
if ( data.var1 < varMin[0] )
{
varMin[0] = data.var1;
}
if ( data.var2 < varMin[1] )
{
varMin[1] = data.var2;
}
if ( data.var3 < varMin[2] )
{
varMin[2] = data.var3;
}
if ( data.var4 < varMin[3] )
{
varMin[3] = data.var4;
}
}
varAvg[0] = varSum[0] / nCount;//取平均值
varAvg[1] = varSum[1] / nCount;
varAvg[2] = varSum[2] / nCount;
varAvg[3] = varSum[3] / nCount;
/* store record to file */
data.var1 = varValue[0];
data.var2 = varValue[1];
data.var3 = varValue[2];
data.var4 = varValue[3];
if ( !(fwrite ( &data , dataLen , 1 , fd)) )
{
printf ("write data to file %s failed\n" , fileName1);
}
fclose ( fd );
/* write data to excel file */
/* 输出变量名称 */
for ( i = 0 ; i < 4 ; i++ )
{
strcpy ( total , "" );
strcat ( total , varName[i]);
strcat ( total, fix[0] );
sprintf ( col , "A%d" , i * 3 + 1 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
strcat ( total , varName[i]);
strcat ( total, fix[1] );
sprintf ( col , "A%d" , i * 3 + 2 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
strcat ( total , varName[i]);
strcat ( total, fix[2] );
sprintf ( col , "A%d" , i * 3 + 3 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
}
/* 输出日期 */
for ( i = 0 ; i < 4 ; i++ )
{
strcpy ( total , "" );
sprintf(total,"%04d-%02d-%02d %02d:%02d:%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
sprintf ( col , "B%d" , i * 3 + 1 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
sprintf(total,"%04d-%02d-%02d %02d:%02d:%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
sprintf ( col , "B%d" , i * 3 + 2 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
sprintf(total,"%04d-%02d-%02d %02d:%02d:%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
sprintf ( col , "B%d" , i * 3 + 3 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
}
/* 输出三种值 */
for ( i = 0 ; i < 4 ; i++ )
{
strcpy ( total , "" );
sprintf( total , "%f" , varAvg[i]);
sprintf ( col , "C%d" , i * 3 + 1 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
sprintf( total , "%f" , varMax[i]);
sprintf ( col , "C%d" , i * 3 + 2 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
sprintf( total , "%f" , varMin[i]);
sprintf ( col , "C%d" , i * 3 + 3 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
}
/* 输出描述 */
for ( i = 0 ; i < 4 ; i++ )
{
strcpy ( total , "" );
strcat ( total , varDes cription[i]);
sprintf ( col , "D%d" , i * 3 + 1 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
strcat ( total , varDes cription[i]);
sprintf ( col , "D%d" , i * 3 + 2 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
strcat ( total , varDes cription[i]);
sprintf ( col , "D%d" , i * 3 + 3 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
}
/* 输出单位 */
for ( i = 0 ; i < 4 ; i++ )
{
strcpy ( total , "" );
strcat ( total , varPer[i]);
sprintf ( col , "E%d" , i * 3 + 1 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
strcat ( total , varPer[i]);
sprintf ( col , "E%d" , i * 3 + 2 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
strcpy ( total , "" );
strcat ( total , varPer[i]);
sprintf ( col , "E%d" , i * 3 + 3 );
pExcel->Worksheets("sheet1")->Range(col)->Value=total;
}
sprintf(fileName2,"d:\\%04d-%02d-%02d.csv",sysTime.wYear,sysTime.wMonth,sysTime.wDay);/* 产生文件名 */
printf ("fileName2 is %s" , fileName2);
pExcel->ActiveWorkbook->Delete(fileName2); /* 删除之前保存的文件 */
pExcel->ActiveWorkbook->Save(fileName2);/* 保存成日期名 */
pExcel->Workbooks->Close( "d:\\book1.xls" );/* 关闭文件 */
pExcel->Quit(); /* 退出 */
__object_delete(pExcel);
return 0;
问题: 1、 程序运行过程中10秒增加一个EXCEL进程,进程越来越多,估计运行几小时系统就会死机
2、为什么无法保存(日期.CSV)文件?
请斑竹大侠们帮忙指点一下。