📄 unit1.cpp
字号:
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x55);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 7 : //C相电流采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 56E9H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x56);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 8 : //A相功率采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 64E9H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x64);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 9 : //B相功率采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 65E9H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x65);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 10 : //C相功率采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 66E9H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x66);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 11 : //A相功率因数采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 84E9H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x84);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 12 : //B相功率因素采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 85E9H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x85);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 13 : //C相功率因数采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 86E9H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x86);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 14 : //电度采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 43C3H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,2); //
WBuf[4] = BCDToChar(AddressBCD,3); //
WBuf[5] = BCDToChar(AddressBCD,4); //地址
WBuf[6] = BCDToChar(AddressBCD,5); //
WBuf[7] = BCDToChar(AddressBCD,6); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x01);
WBuf[10] = char(0x02);
WBuf[11] = char(0x43);
WBuf[12] = char(0xC3);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 15 : //地址设置命令
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 6 1 1
格式 68H ADDR1 68H 0AH 06H ADDR CRC 16H
注:ADDR1 = 99 99 99 99 99 99H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = char(0x99); //地址
WBuf[3] = char(0x99); //
WBuf[4] = char(0x99); //
WBuf[5] = char(0x99); //地址
WBuf[6] = char(0x99); //
WBuf[7] = char(0x99); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x0A);
WBuf[10] = char(0x06);
WBuf[11] = BCDToChar(AddressBCD,1)+0x33; //地址
WBuf[12] = BCDToChar(AddressBCD,2)+0x33; //
WBuf[13] = BCDToChar(AddressBCD,3)+0x33; //
WBuf[14] = BCDToChar(AddressBCD,4)+0x33; //地址
WBuf[15] = BCDToChar(AddressBCD,5)+0x33; //
WBuf[16] = BCDToChar(AddressBCD,6)+0x33; //
WBuf[17] = CheckSum2(WBuf,17); //校验
WBuf[18] = char(0x16); //包尾
return 19;
case 16 : //电度清零命令
/* 序号 1 2 3 4 5 6 7
字节数 1 6 1 1 1 1 1
格式 68H ADDR 68H 04H 02H CRC 16H
*/
WBuf[0] = char(0xFE); //前导符
WBuf[1] = char(0x68); //包头
WBuf[2] = BCDToChar(AddressBCD,1); //地址
WBuf[3] = BCDToChar(AddressBCD,1); //
WBuf[4] = BCDToChar(AddressBCD,1); //
WBuf[5] = BCDToChar(AddressBCD,1); //地址
WBuf[6] = BCDToChar(AddressBCD,1); //
WBuf[7] = BCDToChar(AddressBCD,1); //
WBuf[8] = char(0x68);
WBuf[9] = char(0x04);
WBuf[10]= char(0x02);
WBuf[11]= char(0xB2);
WBuf[12]= char(0xC3);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
}
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SendCmd(void)
{
if (ComboBoxCOM->ItemIndex == 0) //串口连接
{
YbCommDevice1->WritePackage(WBuf,CmdNum); //发送数据包
}
else //TCP连接
{
ClientSocket1->Socket->SendBuf(WBuf,CmdNum);
}
FStatistics.SendCount++; //发送命令次数
FStatistics.SendByteCount += CmdNum; //累计发送字节数
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::Timer1Timer(TObject *Sender)
{
int num, i;
AnsiString timestr,str;
FILE *LogFile;
unsigned char RBuf1[BufSize];
bool FLGRecvOK = false;
try
{
//清空接收缓存
if (FIsClearBuf)
{
if (ComboBoxCOM->ItemIndex == 0) //串口连接
{
YbCommDevice1->ReadPackage(RBuf1,BufSize); //接收数据包
}
else //TCP连接
{
ClientSocket1->Socket->ReceiveBuf(RBuf1,BufSize);
}
FIsClearBuf = false;
}
if (IsTransmit) //发送命令
{
IsTransmit = false;
LastGetDataTime = Now();
RBufNum = 0;
BuildCmd();
DisplayData("");
timestr = TimeToStr(LastGetDataTime) + "发送:"; //显示时间与标题
DisplayData(timestr);
DisplayData(strCmd); //显示通讯数据
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
fputs(timestr.c_str(),LogFile); //写入时间与标题
fputs(strCmd.c_str(),LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
if (CurrentCommand.CommandCode == 16) //清除电量命令则返回
{
IsTransmit = true;
}
}
else //接收命令
{
if (ComboBoxCOM->ItemIndex == 0) //串口连接
{
num = YbCommDevice1->ReadPackage(RBuf1,BufSize); //接收数据包
}
else //TCP连接
{
num = ClientSocket1->Socket->ReceiveBuf(RBuf1,BufSize);
}
if (num == -1)
{
return;
}
//累计接收到数据字节数
if ((num == -1) || (num == 0)) //如果没有收到则退出
{
FStatistics.RecvByteCount = FStatistics.RecvByteCount;
}
else
{
FStatistics.RecvByteCount = FStatistics.RecvByteCount + num;
}
//显示数据
str = "";
for (i= 0 ; i<=num - 1;++i)
str = str + IntToHex(int(RBuf1[i]),2);
if(!str.IsEmpty())
{
timestr = TimeToStr(LastGetDataTime) + "接收:"; //显示时间与标题
DisplayData("");
DisplayData(timestr);
DisplayData(str);
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
fputs(timestr.c_str(),LogFile); //写入时间与标题
fputs(strCmd.c_str(),LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
}//end IsEmpty
if (RBufNum + num < 2000) //如果收到的字节数不溢出,则写入接收缓冲区
{
for(i = 0 ; i<=num - 1;++i)
RBuf[RBufNum+i] = RBuf1[i];
RBufNum = RBufNum + num;
RBuf[RBufNum] = char(0);
}
else
{
RBufNum = 0;
RBuf[0] = char(0);
}
//ReceiveOk 并且 接收数据解析与校验正常
if(!str.IsEmpty())
{
FLGRecvOK=ReceiveOk();
}
if ((!str.IsEmpty())&&FLGRecvOK&& (!FIsRecvError))
{
++FStatistics.RecvCount; //累计接收正常次数
FIsRecvError = false;
IsTransmit = True;
}
//not ReceiveOk 并且 接收数据解析与校验不正常
else if ((!str.IsEmpty())&&(!FLGRecvOK) && FIsRecvError)
{
//累计接收错误次数
++FStatistics.RecvCountError;
ClearShow(); //显示清零
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
fputs(timestr.c_str(),LogFile); //写入时间与标题
fputs("接收数据校验或解析错误!!!",LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
FIsRecvError = false;
IsTransmit = True;
}
//接收数据超时
else if (TimeOut())
{
//日志记录超时时间
//时间与标题
timestr = TimeToStr(LastGetDataTime) + " 接收:";
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
fputs(timestr.c_str(),LogFile); //写入时间与标题
fputs("接收超时!!!",LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
//累计接收超时次数
++FStatistics.RecvCountTimeOut;
ClearShow(); //显示清零
if(CurrentCommand.CommandCode != 16)
{
DisplayData("======接收超时======");
}
IsTransmit = True;
}
}
}
catch(Exception &E)
{
IsTransmit = True;
//ShowMessage(E.Message);
}
}
//---------------------------------------------------------------------------
char __fastcall TFrmADSLmain::BCDToChar(AnsiString StrBCD ,int Count) //BCD转换函数
{
Byte tmp1,tmp2;
Byte tmp = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -