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

📄 electromotordlg.cpp

📁 完成MOTOBUS通信
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -