📄 readmeterdlg.cpp
字号:
// 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 + -