📄 electromotordlg.cpp
字号:
if (!m_line)
{
if (m_Precord!=NULL)
{
m_Precord.Release();
}
return;
}
if (!m_hisRecord)
{
return;
}
CString vol="",cur="",fre="",tpq="",taw="",trw="",act="",no="";
if(!m_Precord->adoEOF)
{
no=m_Precord->GetCollect("电机号码").bstrVal;
vol=m_Precord->GetCollect("电压B").bstrVal;
cur=m_Precord->GetCollect("电流B").bstrVal;
fre=m_Precord->GetCollect("频率").bstrVal;
tpq=m_Precord->GetCollect("功率因数").bstrVal;
taw=m_Precord->GetCollect("有用功").bstrVal;
trw=m_Precord->GetCollect("无用功").bstrVal;
// act=m_Precord->GetCollect("正向总有功电度").bstrVal;
// float volVal,curVal,freVal,tpqVal,tawVal;
m_addr=atoi(no);
// m_value.volBVal=(float)atof(vol)*1.732;
// m_value.curBVal=(float)atof(cur)*10*0.666667;
// m_value.freVal=(float)atof(fre);
// m_value.tpqVal=(float)atof(tpq);
// m_value.tawVal=(float)atof(taw)*100;
// m_value.trwVal=(float)atof(trw)*100;
m_value.volBVal=(float)atof(vol);
m_value.curBVal=(float)atof(cur);
m_value.freVal=(float)atof(fre);
m_value.tpqVal=(float)atof(tpq);
m_value.tawVal=(float)atof(taw);
m_value.trwVal=(float)atof(trw);
// m_value.TacVal=(float)atof(act);
DrawChart();
m_Precord->MoveNext();
SetTimer(0, 100, NULL);
}
else
{
if (m_Precord!=NULL)
{
KillTimer(0);
m_addr=m_addrTemp;
m_Precord.Release();
OnButtonHisRec();
// m_Precord->Close();
}
}
}
break;
case 1:
{
CTime time=CTime::GetCurrentTime();
CString nowTime="";
nowTime.Format("当前时间:%s",time.Format("%y-%m-%d %H:%M:%S"));
SetDlgItemText(IDC_STATIC_SYSTIM,nowTime);
break;
}
case 2:
{
KillTimer(2);
if (m_communicationSign)
{
m_offtimes++;
Sleep(1000);
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
}
if (!m_communicationSign)
{
m_offtimes=0;
m_communicationSign=TRUE;//用于标志SendOrder是否成功
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
}
if (m_offtimes==3)
{
m_offtimes=0;
OnBtnSto();
Sleep(1000);
OnBtnSta();
}
SetTimer(2,200,NULL);
break;
}
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
void CElectromotorDlg::OnBtnSta()
{
// TODO: Add your control notification handler code here
// SetTimer(0,100,NULL);
m_start=TRUE;
AddLine();
// if (!InitDataSource())
// {
// return;
// }
if (!CreatTable())
{
return;
}
if (!m_bOpenPort)//打开串口
{
if (m_Port.InitPort(this, m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512))
{
m_Port.StartMonitoring();
m_bOpenPort=TRUE;
}
else
{
AfxMessageBox("没有发现此串口或被占用");
m_start=FALSE;
return;
}
}
// SendOrder();
// m_addr=3;
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
SetTimer(2,200,NULL);
}
void CElectromotorDlg::SendOrder()
{
if(m_readAddrCode==VOLADDR)
{
// m_readAddrCode=CURADDR;
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
return ;
}
if(m_readAddrCode==CURADDR)
{
// m_readAddrCode=FREADDR;
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
return ;
}
if(m_readAddrCode==FREADDR)
{
// m_readAddrCode=TPQADDR;
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
return ;
}
if(m_readAddrCode==TPQADDR)
{
// m_readAddrCode=TAWADDR;
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
return ;
}
if(m_readAddrCode==TRWADDR)
{
// m_readAddrCode=TAWADDR;
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
return ;
}
if(m_readAddrCode==TAWADDR)
{
// m_readAddrCode=VOLADDR;
// m_addr++;
// if (m_addr==4)
// {
// m_addr=1;
// }
SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
}
}
void CElectromotorDlg::OnBtnSto()
{
// TODO: Add your control notification handler code here
// KillTimer(0);
m_start=FALSE;
KillTimer(2);
if (m_bOpenPort)
{
m_bOpenPort=FALSE;
m_Port.ClosePort();//关闭串口
}
}
char CElectromotorDlg::HexChar(char c)
{
if((c>='0')&&(c<='9'))
return c-0x30;
else if((c>='A')&&(c<='F'))
return c-'A'+10;
else if((c>='a')&&(c<='f'))
return c-'a'+10;
else
return 0x10;
}
USHORT CElectromotorDlg::MBCRC16( UCHAR * pucFrame, USHORT usLen )
{
UCHAR ucCRCHi = 0xFF;
UCHAR ucCRCLo = 0xFF;
int iIndex;
while( usLen-- )
{
iIndex = ucCRCLo ^ *( pucFrame++ );
ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] );
ucCRCHi = aucCRCLo[iIndex];
}
return ( USHORT )( ucCRCHi << 8 | ucCRCLo );
}
/*--------------------------------------
与RZ102的通信数据存于ACCESS数据库中,并图形显示之
----------------------------------------*/
LONG CElectromotorDlg::OnCommunication(WPARAM ch, LPARAM port)
{
if (port <= 0 || port > 4)
return -1;
if (!m_start)
{
return -1;
}
// m_communicationSign=TRUE;
//如果选择了"十六进制显示",则显示十六进制值
CString str="";
str.Format("%02x",ch);
// str.Format("%c",ch);
m_strReceiveData+=str;
if (m_strReceiveData.GetLength()==4)
{
if (m_strReceiveData.Mid(2,2)=="FF"||m_strReceiveData.Mid(2,2)=="ff")
{
AfxMessageBox("wrong!");
}
}
if (m_strReceiveData.GetLength()==110)
{
m_communicationSign=FALSE;
CString strRecMidData=m_strReceiveData.Mid(0,106);
char buf[53];
Str2Hex(strRecMidData,buf);
USHORT CRC=MBCRC16((UCHAR *)buf,53);
// char crc[2]={'\0'};
// crc[0]=(CHAR)(CRC & 0xFF);
// crc[1]=(CHAR)((CRC & 0xFF00)>>8);
int dataCrc=4096*HexChar(m_strReceiveData[108])+256*HexChar(m_strReceiveData[109])+16*HexChar(m_strReceiveData[106])+HexChar(m_strReceiveData[107]);
if (CRC!=dataCrc)
{
m_strReceiveData.Empty();
// SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
return 0;
}
float inter=0.00,deci=0.00;
m_value.volAVal=(float)(Hex2Dec(m_strReceiveData.Mid(6,4))*0.1);
m_value.volBVal=(float)(Hex2Dec(m_strReceiveData.Mid(10,4))*0.1);
m_value.volCVal=(float)(Hex2Dec(m_strReceiveData.Mid(14,4))*0.1);
m_value.curAVal=(float)(Hex2Dec(m_strReceiveData.Mid(34,4))*0.01);
m_value.curBVal=(float)(Hex2Dec(m_strReceiveData.Mid(38,4))*0.01);
m_value.curCVal=(float)(Hex2Dec(m_strReceiveData.Mid(42,4))*0.01);
m_value.freVal=(float)(Hex2Dec(m_strReceiveData.Mid(66,4))*0.1);
m_value.tpqVal=((float)(Hex2Dec(m_strReceiveData.Mid(62,4)))*0.0001);
m_value.tawVal=(float)(Hex2Dec(m_strReceiveData.Mid(50,4))*0.0001);
m_value.trwVal=(float)(Hex2Dec(m_strReceiveData.Mid(54,4))*0.0001);
inter=(float)(Hex2Dec(m_strReceiveData.Mid(74,4)));
deci=(float)(Hex2Dec(m_strReceiveData.Mid(78,4))*0.0001);
m_value.TacVal=inter+deci;
inter=0.00;
deci=0.00;
inter=(float)(Hex2Dec(m_strReceiveData.Mid(82,4)));
deci=(float)(Hex2Dec(m_strReceiveData.Mid(86,4))*0.0001);
m_value.TracVal=inter+deci;
inter=0.00;
deci=0.00;
inter=(float)(Hex2Dec(m_strReceiveData.Mid(90,4)));
deci=(float)(Hex2Dec(m_strReceiveData.Mid(94,4))*0.0001);
m_value.TfacVal=inter+deci;
inter=0.00;
deci=0.00;
inter=(float)(Hex2Dec(m_strReceiveData.Mid(98,4)));
deci=(float)(Hex2Dec(m_strReceiveData.Mid(102,4))*0.0001);
m_value.TfracVal=inter+deci;
inter=0.00;
deci=0.00;
SaveData(m_value.volAVal,m_value.volBVal,m_value.volCVal,m_value.curAVal,m_value.curBVal,m_value.curCVal,m_value.tpqVal,m_value.freVal,m_value.tawVal,m_value.trwVal,m_value.TacVal,m_value.TracVal,m_value.TfacVal,m_value.TfracVal,m_addr);//将读取的实时数据保存在数据库中
DrawChart();//更新显示
m_value.volAVal=0;
m_value.curAVal=0;
m_value.volBVal=0;
m_value.curBVal=0;
m_value.volCVal=0;
m_value.curCVal=0;
m_value.freVal=0;
m_value.tpqVal=0;
m_value.trwVal=0;
m_value.TacVal=0;
m_value.TracVal=0;
m_value.TfacVal=0;
m_value.TfracVal=0;
if (m_addr==m_deviceCount)
{
m_addr=0;
}
m_addr++; //读下一个站的实时数据
m_strReceiveData="";
// SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
m_communicationSign=FALSE;
}
return 0;
}
//发送获取电流数据的命令
void CElectromotorDlg::SendOrder(int Address,int FunCode,int StartAddress,int Length)
{
// char data[10];
char Buf[8]={'\0'};
Buf[0]=(CHAR)Address;
Buf[1]=(CHAR)FunCode;
Buf[2]=(CHAR)((StartAddress & 0xFF00)>>8);
Buf[3]=(CHAR)(StartAddress & 0xFF);
Buf[4]=(CHAR)((Length & 0xFF00)>>8);
Buf[5]=(CHAR)(Length & 0xFF);
USHORT CRC=MBCRC16((UCHAR *)Buf,6);
Buf[6]=(CHAR)(CRC & 0xFF);
Buf[7]=(CHAR)((CRC & 0xFF00)>>8);
/*
CString strTemp="";
for(int i=0;i<8;i++)
{
strTemp.Format("%d",Buf[i]);
m_strSendData+=strTemp;
}
int len=Str2Hex(m_strSendData,data);
*/ m_Port.WriteToPort((char*)Buf,8);
// m_Port.WriteToPort((LPCTSTR)m_strSendData); //发送数据
}
//将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,
//返回转换后的字节数组长度,同时字节数组长度自动设置。
int CElectromotorDlg::Str2Hex(CString str, char* data)
{
int t,t1;
int rlen=0,len=str.GetLength();
//data.SetSize(len/2);
for(int i=0;i<len;)
{
char l, h=str[i];
if(h==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
l=str[i];
t=HexChar(h);
t1=HexChar(l);
if((t==16)||(t1==16))
break;
else
t=t*16+t1;
i++;
data[rlen]=(char)t;
rlen++;
}
return rlen;
}
void CElectromotorDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if (m_Pconn!=NULL)
{
m_Pconn.Release();
// m_Pconn->Close();
CoUninitialize();
}
OnBtnSto();
CDialog::OnClose();
}
void CElectromotorDlg::InitChart()
{
//1号机画图初始化
m_curPushGraph.CreateFromStatic(IDC_STATIC_CUR, this);
m_curPushGraph.ModifyStyle(0, WS_THICKFRAME);
// m_no1CurPushGraph.AddLine( 0, RGB(0, 255, 0));
m_curPushGraph.SetLabelForMax( "150/A" );
m_curPushGraph.SetLabelForMin( "0" );
m_curPushGraph.ShowGrid( TRUE );
m_curPushGraph.ShowLabels( TRUE );
m_curPushGraph.ShowAsBar(0, false );
m_curPushGraph.SetInterval( 4 );
m_curPushGraph.SetGridSize( (USHORT)12 );
m_curPushGraph.SetPeekRange( 0, 100 );
m_volPushGraph.CreateFromStatic(IDC_STATIC_VOL, this);
m_volPushGraph.ModifyStyle(0, WS_THICKFRAME);
// m_no1VolPushGraph.AddLine( 0, RGB(0, 255, 0));
m_volPushGraph.SetLabelForMax( "10/kV" );
m_volPushGraph.SetLabelForMin( "0" );
m_volPushGraph.ShowGrid( TRUE );
m_volPushGraph.ShowLabels( TRUE );
m_volPushGraph.ShowAsBar(0, false );
m_volPushGraph.SetInterval( 4 );
m_volPushGraph.SetGridSize( (USHORT)12 );
m_volPushGraph.SetPeekRange( 0, 100 );
m_tawPushGraph.CreateFromStatic(IDC_STATIC_TAW, this);
m_tawPushGraph.ModifyStyle(0, WS_THICKFRAME);
// m_no1VolPushGraph.AddLine( 0, RGB(0, 255, 0));
m_tawPushGraph.SetLabelForMax( "200/KW" );
m_tawPushGraph.SetLabelForMin( "0" );
m_tawPushGraph.ShowGrid( TRUE );
m_tawPushGraph.ShowLabels( TRUE );
m_tawPushGraph.ShowAsBar(0, false );
m_tawPushGraph.SetInterval( 4 );
m_tawPushGraph.SetGridSize( (USHORT)12 );
m_tawPushGraph.SetPeekRange( 0, 100 );
m_trwPushGraph.CreateFromStatic(IDC_STATIC_TRW, this);
m_trwPushGraph.ModifyStyle(0, WS_THICKFRAME);
// m_no1VolPushGraph.AddLine( 0, RGB(0, 255, 0));
m_trwPushGraph.SetLabelForMax( "200/KVAR" );
m_trwPushGraph.SetLabelForMin( "0" );
m_trwPushGraph.ShowGrid( TRUE );
m_trwPushGraph.ShowLabels( TRUE );
m_trwPushGraph.ShowAsBar(0, false );
m_trwPushGraph.SetInterval( 4 );
m_trwPushGraph.SetGridSize( (USHORT)12 );
m_trwPushGraph.SetPeekRange( 0, 100 );
m_no1.SetBkColor(m_color1);
m_no2.SetBkColor(m_color2);
m_no3.SetBkColor(m_color3);
// AddLine();
}
void CElectromotorDlg::SendOrder(CString strSendData)
{
char data[10];
int len=Str2Hex(strSendData,data);
m_Port.WriteToPort(data,len);
}
void CElectromotorDlg::SaveData(float volA,float volB,float volC,float curA,float curB,float curC,float tpq,float fre,float taw,float trw,float tac,float trac,float tfac,float tfrac,int no)
{
CString sqlQuery="";
// sqlQuery.Format(_T("insert into hjpok(电压A,电压B,电压C,电流A,电流B,电流C,功率因数,频率,有用功,无用功,正向总有功电度,正向总无功电度,反向总有功电度,反向总无功电度,电机号码,时间) values('%0.1f','%0.2f','%0.4f','%0.1f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%d',now())"),volA,volB,volC,curA,curB,curC,tpq,fre,taw,trw,tac,trac,tfac,tfrac,no);
sqlQuery.Format(_T("insert into %s(电压A,电压B,电压C,电流A,电流B,电流C,功率因数,频率,有用功,无用功,正向总有功电度,正向总无功电度,反向总有功电度,反向总无功电度,电机号码,时间) values('%0.1f','%0.2f','%0.4f','%0.1f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%0.4f','%d',now())"),m_tableWrit,volA,volB,volC,curA,curB,curC,tpq,fre,taw,trw,tac,trac,tfac,tfrac,no);
try
{
m_Pconn->Execute(_bstr_t(sqlQuery),NULL,adCmdText);
}
catch(_com_error e)
{
CString strComError;
strComError.Format("错误编号: %08lx\n错误信息: %s\n错误源: %s\n错误描述: %s",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -