📄 listdialog.cpp
字号:
//初始化表
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 + -