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

📄 readmeterdlg.cpp

📁 ABB AIN电表读多类数据通讯测试程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ABB表只有0-255,超过255,则只看十位和个位
unsigned char CReadMeterDlg::TransferMeterAdd(unsigned char * ucMeterAdd)
{
	unsigned char MeterAddH;
	unsigned char MeterAddL;
	unsigned char MeterAddNum;
	MeterAddH = ucMeterAdd[1];
	MeterAddL = ucMeterAdd[0];
	if(((MeterAddH & 0x0f) * 100 + (MeterAddL & 0x0f) + ((MeterAddL>>4) & 0x0f) * 10) > 255)
	{
	 MeterAddNum = (MeterAddL & 0x0f) + ((MeterAddL>>4) & 0x0f) * 10;
	}
	else
	 MeterAddNum = (MeterAddH & 0x0f) * 100 + (MeterAddL & 0x0f) + ((MeterAddL>>4) & 0x0f) * 10;
	return MeterAddNum;
}

//加密口令字计算
unsigned long CReadMeterDlg::CalculateKey(unsigned long key, unsigned long remotepwd)
{
	int i,j,k=0;
	union 
	{
		unsigned long tempkey;
		struct {
			unsigned char bytea,byteb,bytec,byted;
		}tempparts;
	}tempval;
	unsigned long temppwd = remotepwd;
	
	tempval.tempkey = key;

//	tempval.tempkey = 0x4b7eddc1; 

	tempval.tempkey += 0xab41;
	i= tempval.tempparts.bytea +tempval.tempparts.byteb +tempval.tempparts.bytec+tempval.tempparts.byted;
	i = i & 0x0f;
	while(i>=0) {
		if(tempval.tempparts.byted >= 0x80)  j=1;
		else j=0;
		tempval.tempkey = tempval.tempkey<<1 ;
		tempval.tempkey += k;
		k=j;
		temppwd ^= tempval.tempkey;
		i--;
	}
   return temppwd;
}

 bool CReadMeterDlg::Read_Class_11()
 {
	unsigned char chrReadClass11[] = {0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x0B,0x47,0x6a};
	unsigned char ucMeterAdd[] = {0x00,0x00,0x00};
	unsigned char chrContinRead[] = {0x02,0x81,0xe7,0xcb};
	CByteArray byteReadClass11, byteContinRead;
	int nTryNum =10;
	int nPtrlCode = 2;	
    VARIANT m_input1;
	COleSafeArray m_input2;
	long length,i;
	BYTE data[1024];
	CString str;
	int totaltimes =1;
	int k;
	for(k=0;k<10;k++)
		byteReadClass11.Add(chrReadClass11[k]);
	for(k=0;k<4;k++)
		byteContinRead.Add(chrContinRead[k]);
	m_strRXData += "********** Read Class11 **********\r\n";
	UpdateData(FALSE);
//	int nn=m_ctrlComm.GetCommEvent();
//	str.Format("%d",nn);
//	AfxMessageBox(str); 
	bool success = HandShake(nPtrlCode, nTryNum, ucMeterAdd);
//	if(!HandShake(nPtrlCode, nTryNum, ucMeterAdd)) //握手不成功
    if(!success)
	{ 
		Disconnected();
		return false;
	}
    m_strRXData += "===Send===\r\n"; 
    m_msComm.SetOutput(COleVariant(byteReadClass11));
	delay(4000);
    UpdateTXT(chrReadClass11,10);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<42);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
	    m_strRXData += "===Receive===\r\n"; 
    	UpdateTXT(data,length);

    for(totaltimes=7; totaltimes>0; totaltimes--)
	{ 
  
    m_msComm.SetOutput(COleVariant(byteContinRead));
   	delay(4000);
	m_strRXData += "===Send===\r\n";
    UpdateTXT(chrContinRead,4);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<42);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
	    m_strRXData += "===Receive===\r\n";
        UpdateTXT(data,length);
	}
    m_strRXData += "===Send===\r\n";
    m_msComm.SetOutput(COleVariant(byteContinRead));
   	delay(4000);
    UpdateTXT(chrContinRead,4);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<30);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
		m_strRXData += "===Receive===\r\n";
        UpdateTXT(data,length);

	Disconnected();
	return true;
 }
 void CReadMeterDlg::delay(long waittime)
 {
	long i=waittime,j=0;
	for(i=0;i<5000;i++)
	{
	 for(j=0;j<10000;j++)
	 {;
	 }
	}
 }
 
 void CReadMeterDlg::UpdateTXT(unsigned char* hexdata, int idatalen)
 { 
   int i;
   unsigned char temphexdata;
   unsigned char tempdataH;
   unsigned char tempdataL;
   for(i=0; i<idatalen; i++)
   {
	  temphexdata = *(hexdata + i);
	  if(((temphexdata>>4) & 0x0f)  > 9)
		tempdataH = (char)(((temphexdata>>4) & 0x0f)-10 +'a');
	  else 
		tempdataH =(char)(((temphexdata >>4) & 0x0f)+'0');

	  if((temphexdata & 0x0f) > 9)
		tempdataL = (char)((temphexdata & 0x0f)-10 +'a');
	  else 
		tempdataL =(char)((temphexdata & 0x0f)+'0');

	  m_strRXData +=tempdataH;
	  m_strRXData +=tempdataL;
	  m_strRXData +=" ";
	  }
   m_strRXData +="\r\n";
   UpdateData(FALSE);
   
 }

//read_class_0
 bool CReadMeterDlg::Read_Class_0()
 {
	unsigned char chrReadClass0[] = {0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01};
	unsigned char ucMeterAdd[] = {0x00,0x00,0x00};
	CByteArray byteReadClass0;
	int nTryNum =10;
	int nPtrlCode = 2;	
    VARIANT m_input1;
	COleSafeArray m_input2;
	long length,i;
	BYTE data[1024];
	CString str;
	int totaltimes =1;
	int k;
	for(k=0;k<10;k++)
		byteReadClass0.Add(chrReadClass0[k]);
	m_strRXData += "********** Read Class0 **********\r\n";
	UpdateData(FALSE);
//	int nn=m_ctrlComm.GetCommEvent();
//	str.Format("%d",nn);
//	AfxMessageBox(str); 
	bool success = HandShake(nPtrlCode, nTryNum, ucMeterAdd);
//	if(!HandShake(nPtrlCode, nTryNum, ucMeterAdd)) //握手不成功
    if(!success)
	{
	    Disconnected();
	    return false;
	}
    m_strRXData += "===Send===\r\n"; 
    m_msComm.SetOutput(COleVariant(byteReadClass0));
	delay(8000);
    UpdateTXT(chrReadClass0,10);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);

		}
	    m_strRXData += "===Receive===\r\n"; 
    	UpdateTXT(data,length);
    Disconnected();
	return true;
 }


void CReadMeterDlg::OnButton0() 
{
	// TODO: Add your control notification handler code here
	Read_Class_0();
	m_strRXData += "\r\n\r\n";
	UpdateData(FALSE);
}

void CReadMeterDlg::OnButton12() 
{
	// TODO: Add your control notification handler code here
	Read_Class_12();
	m_strRXData += "\r\n\r\n";
	UpdateData(FALSE);
	
}

void CReadMeterDlg::OnButton14() 
{
	// TODO: Add your control notification handler code here
    Read_Class_14();
	m_strRXData += "\r\n\r\n";
	UpdateData(FALSE);
}

void CReadMeterDlg::OnButton17() 
{
	// TODO: Add your control notification handler code here
	
}

void CReadMeterDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	Read_Class_2();
	m_strRXData += "\r\n\r\n";
	UpdateData(FALSE);	
} 

//read class2
 bool CReadMeterDlg::Read_Class_2()
 {
	unsigned char chrReadClass2[] = {0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0xd6,0x43};
	unsigned char ucMeterAdd[] = {0x00,0x00,0x00};
	unsigned char chrContinRead[] = {0x02,0x81,0xe7,0xcb};
	CByteArray byteReadClass2, byteContinRead;
	int nTryNum =10;
	int nPtrlCode = 2;	
    VARIANT m_input1;
	COleSafeArray m_input2;
	long length,i;
	BYTE data[1024];
	CString str;
	int totaltimes =1;
	int k;
	for(k=0;k<10;k++)
		byteReadClass2.Add(chrReadClass2[k]);
	for(k=0;k<4;k++)
		byteContinRead.Add(chrContinRead[k]);
	m_strRXData += "********** Read Class2 **********\r\n";
	UpdateData(FALSE);
//	int nn=m_ctrlComm.GetCommEvent();
//	str.Format("%d",nn);
//	AfxMessageBox(str); 
	bool success = HandShake(nPtrlCode, nTryNum, ucMeterAdd);
//	if(!HandShake(nPtrlCode, nTryNum, ucMeterAdd)) //握手不成功
    if(!success)
	{   
		Disconnected();
		return false;
	}
    m_strRXData += "===Send===\r\n"; 
    m_msComm.SetOutput(COleVariant(byteReadClass2));
	delay(8000);
    UpdateTXT(chrReadClass2,10);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<42);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
	    m_strRXData += "===Receive===\r\n"; 
    	UpdateTXT(data,length);
      m_strRXData += "===Send===\r\n";
      m_msComm.SetOutput(COleVariant(byteContinRead));
    	delay(8000);
     UpdateTXT(chrContinRead,4);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<30);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
		m_strRXData += "===Receive===\r\n";
        UpdateTXT(data,length);

	Disconnected();
	return true;
 }
 bool CReadMeterDlg::Read_Class_12()
 {
	unsigned char chrReadClass12[] = {0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x0c,0x37,0x8d};
	unsigned char ucMeterAdd[] = {0x00,0x00,0x00};
	unsigned char chrContinRead[] = {0x02,0x81,0xe7,0xcb};
	CByteArray byteReadClass12, byteContinRead;
	int nTryNum =10;
	int nPtrlCode = 2;	
    VARIANT m_input1;
	COleSafeArray m_input2;
	long length,i;
	BYTE data[1024];
	CString str;
	int totaltimes =1;
	int k;
	for(k=0;k<10;k++)
		byteReadClass12.Add(chrReadClass12[k]);
	for(k=0;k<4;k++)
		byteContinRead.Add(chrContinRead[k]);
	m_strRXData += "********** Read Class12 **********\r\n";
	UpdateData(FALSE);
//	int nn=m_ctrlComm.GetCommEvent();
//	str.Format("%d",nn);
//	AfxMessageBox(str); 
	bool success = HandShake(nPtrlCode, nTryNum, ucMeterAdd);
//	if(!HandShake(nPtrlCode, nTryNum, ucMeterAdd)) //握手不成功
    if(!success)
	{
		Disconnected();
		return false;
	}
    m_strRXData += "===Send===\r\n"; 
    m_msComm.SetOutput(COleVariant(byteReadClass12));
	delay(5000);
    UpdateTXT(chrReadClass12,10);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<42);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
	    m_strRXData += "===Receive===\r\n"; 
    	UpdateTXT(data,length);

    for(totaltimes=4; totaltimes>0; totaltimes--)
	{ 
  
    m_msComm.SetOutput(COleVariant(byteContinRead));
   	delay(5000);
	m_strRXData += "===Send===\r\n";
    UpdateTXT(chrContinRead,4);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<42);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
	    m_strRXData += "===Receive===\r\n";
        UpdateTXT(data,length);
	}
    m_strRXData += "===Send===\r\n";
    m_msComm.SetOutput(COleVariant(byteContinRead));
   	delay(5000);
    UpdateTXT(chrContinRead,4);
//	 do{
//		;
//	 }while(m_msComm.GetCommEvent()<30);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);
	//		m_strRXData+=str;
		}
		m_strRXData += "===Receive===\r\n";
        UpdateTXT(data,length);

	Disconnected();
	return true;
 }
//read_class_14
 bool CReadMeterDlg::Read_Class_14()
 {
	unsigned char chrReadClass14[] = {0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x0e,0xe7,0xcf};
	unsigned char ucMeterAdd[] = {0x00,0x00,0x00};
	CByteArray byteReadClass14;
	int nTryNum =10;
	int nPtrlCode = 2;	
    VARIANT m_input1;
	COleSafeArray m_input2;
	long length,i;
	BYTE data[1024];
	CString str;
	int totaltimes =1;
	int k;
	for(k=0;k<10;k++)
		byteReadClass14.Add(chrReadClass14[k]);
	m_strRXData += "********** Read Class14 **********\r\n";
	UpdateData(FALSE);
//	int nn=m_ctrlComm.GetCommEvent();
//	str.Format("%d",nn);
//	AfxMessageBox(str); 
	bool success = HandShake(nPtrlCode, nTryNum, ucMeterAdd);
//	if(!HandShake(nPtrlCode, nTryNum, ucMeterAdd)) //握手不成功
    if(!success)
	{ 
		Disconnected();
		return false;
	}
    m_strRXData += "===Send===\r\n"; 
    m_msComm.SetOutput(COleVariant(byteReadClass14));
	delay(10000);
    UpdateTXT(chrReadClass14,10);
		m_input1=m_msComm.GetInput();//读取缓冲区内的数据
		m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
		length=m_input2.GetOneDimSize();//确定数据长度
		for(i=0;i<length;i++)
			m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

		for(i=0;i<length;i++)//将数组转换为Cstring型变量
		{
			BYTE a=* (char *)(data+i);
			str.Format("%c",a);

		}
	    m_strRXData += "===Receive===\r\n"; 
    	UpdateTXT(data,length);
    Disconnected();
	return true;
 }

⌨️ 快捷键说明

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