📄 electromotordlg.cpp
字号:
m_trwPushGraph.Update();
CString strNo2CurValue="",strNo2VolValue="",strNo2TqpValue="",strNo2FreValue="",strNo2TawValue="",strNo2TrwValue="";
strNo2CurValue.Format("%0.2f",m_value.curVal);
strNo2VolValue.Format("%0.1f",m_value.volVal);
strNo2TqpValue.Format("%0.4f",m_value.tpqVal);
strNo2FreValue.Format("%0.2f",m_value.freVal);
strNo2TawValue.Format("%0.4f",m_value.tawVal);
strNo2TrwValue.Format("%0.4f",m_value.trwVal);
SetDlgItemText(IDC_EDIT_CUR2,strNo2CurValue);
SetDlgItemText(IDC_EDIT_VOL2,strNo2VolValue);
SetDlgItemText(IDC_EDIT_FRE2,strNo2FreValue);
SetDlgItemText(IDC_EDIT_CUR_TOP2,strNo2TqpValue);
SetDlgItemText(IDC_EDIT_VOL_TOP2,strNo2TawValue);
}
if (m_addr==3&&m_checkNo3.GetCheck())
{
m_curPushGraph.Push(m_value.curVal, 2);
m_volPushGraph.Push(m_value.volVal, 2);
m_tawPushGraph.Push(m_value.tawVal, 2);
m_trwPushGraph.Push(m_value.trwVal, 2);
m_curPushGraph.Update();
m_volPushGraph.Update();
m_tawPushGraph.Update();
m_trwPushGraph.Update();
CString strNo3CurValue="",strNo3VolValue="",strNo3TqpValue="",strNo3FreValue="",strNo3TawValue="",strNo3TrwValue="";
strNo3CurValue.Format("%0.2f",m_value.curVal);
strNo3VolValue.Format("%0.1f",m_value.volVal);
strNo3TqpValue.Format("%0.4f",m_value.tpqVal);
strNo3FreValue.Format("%0.2f",m_value.freVal);
strNo3TawValue.Format("%0.4f",m_value.tawVal);
strNo3TrwValue.Format("%0.4f",m_value.trwVal);
SetDlgItemText(IDC_EDIT_CUR3,strNo3CurValue);
SetDlgItemText(IDC_EDIT_VOL3,strNo3VolValue);
SetDlgItemText(IDC_EDIT_FRE3,strNo3FreValue);
SetDlgItemText(IDC_EDIT_CUR_TOP3,strNo3TqpValue);
SetDlgItemText(IDC_EDIT_VOL_TOP3,strNo3TawValue);
}
UpdateData(FALSE);
}
void CElectromotorDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch (nIDEvent)
{
case 0:
if (m_Pconn!=NULL&&m_Precord!=NULL)
{
KillTimer(0);
if (!m_line)
{
if (m_Precord!=NULL)
{
m_Precord.Release();
}
return;
}
if (!m_hisRecord)
{
return;
}
CString vol="",cur="",fre="",tpq="",taw="",trw="",no="";
if(!m_Precord->adoEOF)
{
no=m_Precord->GetCollect("电机号码").bstrVal;
vol=m_Precord->GetCollect("电压A").bstrVal;
cur=m_Precord->GetCollect("电流A").bstrVal;
fre=m_Precord->GetCollect("频率").bstrVal;
tpq=m_Precord->GetCollect("功率因数").bstrVal;
taw=m_Precord->GetCollect("有用功").bstrVal;
trw=m_Precord->GetCollect("无用功").bstrVal;
// float volVal,curVal,freVal,tpqVal,tawVal;
m_addr=atoi(no);
m_value.volVal=(float)atof(vol)*1.732;
m_value.curVal=(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;
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 (!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 );
}
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()==74)
{
m_communicationSign=FALSE;
CString strRecMidData=m_strReceiveData.Mid(0,70);
char buf[35];
Str2Hex(strRecMidData,buf);
USHORT CRC=MBCRC16((UCHAR *)buf,35);
// char crc[2]={'\0'};
// crc[0]=(CHAR)(CRC & 0xFF);
// crc[1]=(CHAR)((CRC & 0xFF00)>>8);
int dataCrc=4096*HexChar(m_strReceiveData[72])+256*HexChar(m_strReceiveData[73])+16*HexChar(m_strReceiveData[70])+HexChar(m_strReceiveData[71]);
if (CRC!=dataCrc)
{
m_strReceiveData.Empty();
// SendOrder(m_addr,m_fnCode,m_readAddrCode,m_lenCode);
return 0;
}
m_value.volVal=(float)(Hex2Dec(m_strReceiveData.Mid(6,4))*0.1);
m_value.curVal=(float)(Hex2Dec(m_strReceiveData.Mid(34,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);
SaveData(m_value.volVal,m_value.curVal,m_value.tpqVal,m_value.freVal,m_value.tawVal,m_value.trwVal,m_addr);//将读取的实时数据保存在数据库中
DrawChart();//更新显示
m_value.volVal=0;
m_value.curVal=0;
m_value.freVal=0;
m_value.tpqVal=0;
m_value.trwVal=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));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -