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

📄 listdialog.cpp

📁 用VC写的一个将串口数据用图形曲线的形式显示出来。这是一个项目中的一部分。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			//初始化表
			nItem=m_datalist.InsertItem(0xffff,(_bstr_t)m_time);
			m_datalist.SetItem(nItem,1,1,(_bstr_t)CT,NULL,0,0,0);
			m_datalist.SetItem(nItem,2,1,(_bstr_t)PT,NULL,0,0,0);
			m_datalist.SetItem(nItem,3,1,(_bstr_t)IA,NULL,0,0,0);
			m_datalist.SetItem(nItem,4,1,(_bstr_t)IB,NULL,0,0,0);
			m_datalist.SetItem(nItem,5,1,(_bstr_t)IC,NULL,0,0,0);
			m_datalist.SetItem(nItem,6,1,(_bstr_t)INN,NULL,0,0,0);
			m_datalist.SetItem(nItem,7,1,(_bstr_t)VAB,NULL,0,0,0);
			m_datalist.SetItem(nItem,8,1,(_bstr_t)VBC,NULL,0,0,0);
			m_datalist.SetItem(nItem,9,1,(_bstr_t)VCA,NULL,0,0,0);
			m_datalist.SetItem(nItem,10,1,(_bstr_t)VAN,NULL,0,0,0);
			m_datalist.SetItem(nItem,11,1,(_bstr_t)VBN,NULL,0,0,0);
			m_datalist.SetItem(nItem,12,1,(_bstr_t)VCN,NULL,0,0,0);
			m_datalist.SetItem(nItem,13,1,(_bstr_t)KW,NULL,0,0,0);
			m_datalist.SetItem(nItem,14,1,(_bstr_t)KVAR,NULL,0,0,0);
			m_datalist.SetItem(nItem,15,1,(_bstr_t)KWH,NULL,0,0,0);
			m_datalist.SetItem(nItem,16,1,(_bstr_t)KVARH,NULL,0,0,0);
			m_datalist.SetItem(nItem,17,1,(_bstr_t)KV,NULL,0,0,0);
			m_datalist.SetItem(nItem,18,1,(_bstr_t)PF,NULL,0,0,0);
			m_datalist.SetItem(nItem,19,1,(_bstr_t)HZ,NULL,0,0,0);
			m_pRecordset->MoveNext();
			
		}
		m_pRecordset->Close();
	}
	catch(_com_error e)///捕捉异常
	{
		AfxMessageBox("读取数据库失败!");///显示错误信息
	}
}

unsigned short CListDialog::CRC16(unsigned char *puchMsg, unsigned short usDataLen)
{
	unsigned char uchCRCHi = 0xFF ; 			/* 高CRC字节初始化 */
	unsigned char uchCRCLo = 0xFF ;			/* 低CRC 字节初始化 */
	unsigned uIndex ; 					/* CRC循环中的索引 */
	while (usDataLen--)					/* 传输消息缓冲区 */
	{
		uIndex=uchCRCHi^*puchMsg++;		/* 计算CRC */
		uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
		uchCRCLo=auchCRCLo[uIndex];
	}
	return (uchCRCHi<<8|uchCRCLo) ;

}

void CListDialog::DataProcessTemp(BYTE DataBuffer[])
{
	//数据处理
	float   IA,IB,IC;           		//相电流
    float   INN;                		//中线电流
    float   VAB,VBC,VCA;        	//线电压
    float   VAN,VBN,VCN;        	//相电压
    double  KW,KVAR;            	//有功、无功
    double  KWH;                	//电度数
    double KVARH  ;             	//无功电度
	double  KV;                 	//视在功率/
	float   PF,HZ;              		//功率因数,频率*/
	int CT,PT;						//CT比,PT比

	bool bkw=false,bkvar=false;		//有功,无功的符号位,如=true,为负

	CT=(float)(DataBuffer[3]*256+DataBuffer[4]);	//ct比
    PT=(float)(DataBuffer[5]*256+DataBuffer[6]);	//pt比

	//A相电流
    IA=((float)DataBuffer[7]*256+(float)DataBuffer[8]
		+(float)DataBuffer[9]/256+(float)DataBuffer[10]/65536);
    //B相电流
    IB=((float)DataBuffer[11]*256+(float)DataBuffer[12]
		+(float)DataBuffer[13]/256+(float)DataBuffer[14]/65536);
    //C相电流
    IC=((float)DataBuffer[15]*256+(float)DataBuffer[16]
		+(float)DataBuffer[17]/256+(float)DataBuffer[18]/65536);
    //N相电流
	INN=((float)DataBuffer[19]*256+(float)DataBuffer[20]
		+(float)DataBuffer[21]/256+(float)DataBuffer[22]/65536);
    //A相电压
    VAN=(float)DataBuffer[23]*256+(float)DataBuffer[24]
		+(float)DataBuffer[25]/256+(float)DataBuffer[26]/65536;
    //B相电压
    VBN=(float)DataBuffer[27]*256+(float)DataBuffer[28]
		+(float)DataBuffer[29]/256+(float)DataBuffer[30]/65536;
    //C相电压
    VCN=(float)DataBuffer[31]*256+(float)DataBuffer[32]
		+(float)DataBuffer[33]/256+(float)DataBuffer[34]/65536;
     //AB线电压
    VAB=(float)DataBuffer[35]*256+(float)DataBuffer[36]
		+(float)DataBuffer[37]/256+(float)DataBuffer[38]/65536;
    //BC线电压
    VBC=(float)DataBuffer[39]*256+(float)DataBuffer[40]
		+(float)DataBuffer[41]/256+(float)DataBuffer[42]/65536;
    //CA线电压
    VCA=(float)DataBuffer[43]*256+(float)DataBuffer[44]
		+(float)DataBuffer[45]/256+(float)DataBuffer[46]/65536;
    //频率
	HZ=(float)DataBuffer[47]*256+(float)DataBuffer[48];
    //功率因数
    PF=(float)DataBuffer[49]+(float)DataBuffer[50]/256;
    //功率为有符号位数,上传数据最高位为符号位
	if(DataBuffer[51]>=0x80)	                		//判断最高位是否为1,如为1,则为负值
	{
		DataBuffer[51]=DataBuffer[51]-0x80;			//将最高位去掉
		bkw=true;				                	//置符号标志位
	}
	KW=((double)DataBuffer[51]*256+(double)DataBuffer[52])*65536+
		(double)DataBuffer[53]*256+(double)DataBuffer[54];
	if(bkw)						              //为负值
		KW=0-KW;
	//功率为有符号位数,上传数据最高位为符号位
	if(DataBuffer[55]>=0x80)				    		//判断最高位是否为1,如为1,则为负值
	{
		DataBuffer[55]=DataBuffer[55]-0x80;	    		//将最高位去掉
		bkvar=true;			                   //置符号标志位
	}
	KVAR=((double)DataBuffer[55]*256+(double)DataBuffer[56])*65536+
		(double)DataBuffer[57]*256+(double)DataBuffer[58];
	if(bkvar)				                    	//为负值
		KVAR=0-KVAR;
	//视在功率
	KV=((double)DataBuffer[59]*256+(double)DataBuffer[60])*65536+
		(double)DataBuffer[61]*256+(double)DataBuffer[62];
    //有功电度
    KWH=(double)((DataBuffer[63]/16)*10+DataBuffer[63]%16)*10000000000
		+(double)((DataBuffer[64]/16)*10+DataBuffer[64]%16)*100000000
		+(double)((DataBuffer[65]/16)*10+DataBuffer[65]%16)*1000000
		+(double)((DataBuffer[66]/16)*10+DataBuffer[66]%16)*10000
		+(double)((DataBuffer[67]/16)*10+DataBuffer[67]%16)*100
		+(double)((DataBuffer[68]/16)*10+DataBuffer[68]%16);
     //无功电度
    KVARH=(double)((DataBuffer[69]/16)*10+DataBuffer[69]%16)*10000000000
		+(double)((DataBuffer[70]/16)*10+DataBuffer[70]%16)*100000000
		+(double)((DataBuffer[71]/16)*10+DataBuffer[71]%16)*1000000
		+(double)((DataBuffer[72]/16)*10+DataBuffer[72]%16)*10000
		+(double)((DataBuffer[73]/16)*10+DataBuffer[73]%16)*100
		+(double)((DataBuffer[74]/16)*10+DataBuffer[74]%16);
	//最终结果数组赋值

    ResultBuffer[0]=(float)DataBuffer[0];//ADDR
	ResultBuffer[1]=(float)DataBuffer[1];//FUN
	ResultBuffer[2]=(float)DataBuffer[2];//LEN  

	ResultBuffer[3]=CT;//ct
    ResultBuffer[4]=PT;//pt

    ResultBuffer[5]=IA*CT;	//*CT,转为一次侧电流值
    ResultBuffer[6]=IB*CT;
    ResultBuffer[7]=IC*CT;
    ResultBuffer[8]=INN*CT;

    ResultBuffer[9]=VAN;
    ResultBuffer[10]=VBN;
    ResultBuffer[11]=VCN;
    ResultBuffer[12]=VAB;
    ResultBuffer[13]=VBC;
    ResultBuffer[14]=VCA;

    HZ=HZ/100;
    ResultBuffer[15]=HZ;
	ResultBuffer[16]=PF;

    ResultBuffer[17]= KW/1000;
    ResultBuffer[18]= KVAR/1000;
    ResultBuffer[19]= KV/1000;
    ResultBuffer[20]= KWH/1000;
    ResultBuffer[21]= KVARH/1000;

	//完成写数据库
	/*流程:
	判断是否是新的一天,如果是那么创建数据库,数据库的名称以当前时间YYYYMMDD
	打开数据库
	写数据
	*/
	CString SqlCmd;
	CTime t=CTime::GetCurrentTime();
	int n=t.GetYear()*10000+t.GetMonth()*100+t.GetDay();
	if(NewDay!=OldDay)
	{
		//创建数据库
		//写入最新日期
		
		m_pRecordset->Open("SELECT * FROM LastTime",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		m_pRecordset->Delete(adAffectCurrent);
		m_pRecordset->Close();
		OldDay=NewDay;
		SqlCmd.Format("INSERT INTO LastTime(oldday)  VALUES ('%d')",NewDay);
		theApp.m_pConnection->Execute(_bstr_t(SqlCmd),NULL,adCmdText);

		SqlCmd.Format("CREATE TABLE %d(H_Time Datetime ,CT INTEGER,PT INTEGER,IA double,IB double,IC double,INN double,VAB double,VBC double,VCA double,VAN double,VBN double,VCN double,KW double,KVAR double,KWH double,KVARH double,KV double,PF double,HZ double)",NewDay);
		theApp.m_pConnection->Execute(_bstr_t(SqlCmd),NULL,adCmdText); 
		//更新列表现实
		m_datalist.DeleteAllItems();
	}
	CString str;
	str=t.Format("%y-%m-%d %H:%M:%S");
	nItem=m_datalist.InsertItem(0xffff,str);
	str.Format("%d",CT);
	m_datalist.SetItem(nItem,1,1,str,NULL,0,0,0);
	str.Format("%d",PT);
	m_datalist.SetItem(nItem,2,1,str,NULL,0,0,0);
	str.Format("%.3f",IA);
	m_datalist.SetItem(nItem,3,1,str,NULL,0,0,0);
	str.Format("%.3f",IB);
	m_datalist.SetItem(nItem,4,1,str,NULL,0,0,0);
	str.Format("%.3f",IC);
	m_datalist.SetItem(nItem,5,1,str,NULL,0,0,0);
	str.Format("%.3f",INN);
	m_datalist.SetItem(nItem,6,1,str,NULL,0,0,0);
	str.Format("%.3f",VAB);
	m_datalist.SetItem(nItem,7,1,str,NULL,0,0,0);
	str.Format("%.3f",VBC);
	m_datalist.SetItem(nItem,8,1,str,NULL,0,0,0);
	str.Format("%.3f",VCA);
	m_datalist.SetItem(nItem,9,1,str,NULL,0,0,0);
	str.Format("%.3f",VAN);
	m_datalist.SetItem(nItem,10,1,str,NULL,0,0,0);
	str.Format("%.3f",VBN);
	m_datalist.SetItem(nItem,11,1,str,NULL,0,0,0);
	str.Format("%.3f",VCN);
	m_datalist.SetItem(nItem,12,1,str,NULL,0,0,0);
	str.Format("%.3f",KW);
	m_datalist.SetItem(nItem,13,1,str,NULL,0,0,0);
	str.Format("%.3f",KVAR);
	m_datalist.SetItem(nItem,14,1,str,NULL,0,0,0);
	str.Format("%.3f",KWH);
	m_datalist.SetItem(nItem,15,1,str,NULL,0,0,0);
	str.Format("%.3f",KVARH);
	m_datalist.SetItem(nItem,16,1,str,NULL,0,0,0);
	str.Format("%.3f",KV);
	m_datalist.SetItem(nItem,17,1,str,NULL,0,0,0);
	str.Format("%.3f",PF);
	m_datalist.SetItem(nItem,18,1,str,NULL,0,0,0);
	str.Format("%.3f",HZ);
	m_datalist.SetItem(nItem,19,1,str,NULL,0,0,0);	

	//更新显示的功能(曲线和数据)
	g_van=VAN;//时间问题
//	将数据写入数据库
	CString str_time;
	str_time=t.Format("%y-%m-%d %H:%M:%S");
	SqlCmd.Format("INSERT INTO %d(H_Time ,CT ,PT,IA,IB,IC,INN,VAB,VBC,VCA,VAN,VBN,VCN,KW,KVAR,KWH,KVARH,KV,PF,HZ )",NewDay);
	str.Format("VALUES ('%s','%d','%d',",str_time,CT,PT);
	SqlCmd+=str;
	str.Format("'%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f','%.3f')",IA,IB,IC,INN,VAB,VBC,VCA,VAN,VBN,VCN,KW  ,KVAR  ,KWH  ,KVARH  ,KV  ,PF  ,HZ);
	SqlCmd+=str;
	theApp.m_pConnection->Execute(_bstr_t(SqlCmd),NULL,adCmdText);
	//15分钟处理一次,除去最大最小,13个数求平均数
	ave_15[n_ave]=VAN;
	n_ave++;
	if(n_ave>=15)
	{
		double d_sum=0,d_max,d_min;
		n_ave=0;
		d_max=d_min=ave_15[0];
		//求最大最小.和
		for(int i=0;i<15;i++)
		{
			d_sum+=ave_15[i];
			if(ave_15[i]>d_max)
				d_max=ave_15[i];
			if(ave_15[i]<d_min)
				d_min=ave_15[i];
		}
		ave_VAN=(d_sum-d_max-d_min)/13;
	}	

	
}

void CListDialog::ResetBuffVal()
{
	memset(&chRec,0x00,sizeof(BYTE));
}

⌨️ 快捷键说明

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