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

📄 readmeterdlg.cpp

📁 ABB AIN电表通讯测试程序.ABB电能表品种较多
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	  CRCCode = CRCVerify(chrKey,9);
      CRCL = CRCCode & 0x00ff;
      CRCH = (CRCCode >> 8);
      chrKey[9] = CRCH;
      chrKey[10] = CRCL;
	  for(i=0;i<11;i++)
	   byteKey.Add(chrKey[i]);
//	  for(i=0; i<11; i++)
//	{
//		US_TXSEM.ucBuf[i] = chrKey[i];
//	  }
//	  	US_TXSEM.lDataLen = 11;
//	for(i = nTryNum; i>0; i--)
//	{
//	   OSSemPost(US_TXSEM);    //发送密码校验指令
//       OSSemPend(US_RXSEM, 500, &err);	 //等待串口的数据,等待的时间和握手中的填充数有关系
        m_msComm.SetOutput(COleVariant(byteKey));
    
		delay();
		UpdateTXT(chrKey,11);
//		if (err == OS_NO_ERR) // 在规定时间内收到数据
//    		{
//        break;  //退出循环,对接收的数据进行处理
//	   }
//      else   //在规定时间内没有收到数据
//	  {
 //       if(i == 1) //如果已经尝试了足够次数,则放弃尝试,认为连接失败 
 //      {
 //    if(m_msComm.GetCommEvent()!=2)
//		return false;
//		}
//	  }	
//	 }
	variant_inp=m_msComm.GetInput();   //读缓冲区
	safearray_inp=variant_inp;           //VARIANT型变量转换为ColeSafeArray型变量
	len=safearray_inp.GetOneDimSize(); //得到有效数据长度
	for(k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
	for(k=0;k<len;k++)             //将数组转换为Cstring型变量
		{
			BYTE bt=*(char*)(rxdata+k);      //字符型
			strtemp.Format("%c",bt);         //将字符送入临时变量strtemp存放
		//	m_strRXData+=strtemp;    //加入接收编辑框对应字符串    
		}
	UpdateTXT(rxdata,len);

     //判断返回是否ACK,否则认为无法连接(也可以更改程序,重试9次
  /*  i=0;
	do{
	// if(US_RXSEM.ucBuf[i]!=chrACK[i])
	 if(*(char*)(rxdata+i)!=chrACK[i])
		 return false;
	   i++;
	 }while(i<7);*/
	 return true; //说明收到了ACK,握手成功.   

}
//读class
bool CReadMeterDlg::ReadClass(unsigned char lengthH, unsigned char lengthL, unsigned char addrH, unsigned char addrL, unsigned char classnumb)
{

	//chrRead[2]为填充数,chrRead[3]数据长度高字节,chrRead[4]数据长度低字节
	//chrRead[5]地址偏移高字节,chrRead[6]地址偏移低字节,
	//chrRead[7]类,chrRead[8]CRCH, chrRead[9] CRCL;
	unsigned char chrRead[] = {0x02,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01};
    unsigned int CRCCode;
    unsigned char CRCH,CRCL;
//    unsigned char err;

    chrRead[3] = lengthH;
	chrRead[4] = lengthL;
	chrRead[5] = addrH;
	chrRead[6] = addrL;
	chrRead[7] = classnumb;
	CRCCode = CRCVerify(chrRead,8);
    CRCL = CRCCode & 0x00ff;
    CRCH = (CRCCode >> 8);
	chrRead[8] = CRCH;
	chrRead[9] = CRCL;
/*	  for(int i=0; i<10; i++)
	{
		US_TXSEM.ucBuf[i] = chrRead[i];
	  }
	  	US_TXSEM.lDataLen = 10;
    OSSemPost(US_TXSEM); 
	OSSemPend(US_RXSEM, 500, &err);
	if (err == OS_NO_ERR)
		return true;
	else */
		return false;
}

//断开连接
void CReadMeterDlg::Disconnected()
{
	unsigned char  chrDisconnect[] = {0x02,0x80, 0xf7,0xea};
	CByteArray byteDisconnect;
	int i=0;
	for(i=0;i<4;i++)
		byteDisconnect.Add(chrDisconnect[i]);
//	for(int i=0; i<4; i++)
//	{
//		US_TXSEM.ucBuf[i] = chrDisconnect[i];
//	}
//		US_TXSEM.lDataLen = 4;
   //  OSSemPost(US_TXSEM);
	m_msComm.SetOutput(COleVariant(byteDisconnect));
	UpdateTXT(chrDisconnect,4);
	 	
}

//传入的重试次数超过255,则认为等同于0,被认为一直重试
//unsigned char TransferTryNum(int nTryNum)
//{
//	unsigned char chrTryNum;
//	if(nTryNum >= 255)
//		chrTryNum = 0x00;
//   //nTryNum 为0-255,
//	else
//		chrTryNum = nTryNum;
//	return chrTryNum;

//}


//CRC校验
unsigned int CReadMeterDlg::CRCVerify(unsigned char CRCByte[], int len)
{
  unsigned int iTemp=0;	 
  int i=0,j=0;
  for (i=0; i<len; i++)
  {
	 iTemp^=(CRCByte[i]<<8);
	   for(j=0; j<8; j++)
	   { 
		   int flag=iTemp & 0x8000;
		   iTemp <<=1;
		   if(flag)
		   {
			   iTemp^=0x1021;
		   }
	   }
  }
  return iTemp;
}

//假设表的地址从低到高开始填充,比如表地址为112200,
//则ucMeterAdd[0]=0x00 (BCD)
//  ucMeterAdd[1]=0x22 (BCD)
//  ucMeterAdd[2]=0x11 (BCD)
// 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]);
//	int nn=m_ctrlComm.GetCommEvent();
//	str.Format("%d",nn);
//	AfxMessageBox(str); 
	bool success = HandShake(nPtrlCode, nTryNum, ucMeterAdd);
//	if(!HandShake(nPtrlCode, nTryNum, ucMeterAdd)) //握手不成功
    if(!success)
		return false;
    m_msComm.SetOutput(COleVariant(byteReadClass11));
	delay();
    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;
		}
        UpdateTXT(data,length);

    for(totaltimes=7; totaltimes>0; totaltimes--)
	{ 

    m_msComm.SetOutput(COleVariant(byteContinRead));
   	delay();
    UpdateTXT(chrContinRead,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;
		}
        UpdateTXT(data,length);
	}

    m_msComm.SetOutput(COleVariant(byteContinRead));
   	delay();
    UpdateTXT(chrContinRead,10);
//	 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;
		}
        UpdateTXT(data,length);

	Disconnected();
	return true;
 }
 void CReadMeterDlg::delay()
 {
	long i=0,j=0;
	for(i=0;i<10000;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) > 9)
		tempdataH = (char)((temphexdata>>4)-10 +'a');
	  else 
		tempdataH =(char)((temphexdata >>4)+'0');

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

	  m_strRXData +=tempdataH;
	  m_strRXData +=tempdataL;
	  }
   UpdateData(FALSE);
   
 }


⌨️ 快捷键说明

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