📄 unit1.~cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "YbCommDevice"
#pragma resource "*.dfm"
TFrmADSLmain *FrmADSLmain;
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SBPortSetClick(TObject *Sender) //打开端口配置界面
{
YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::N1Click(TObject *Sender) //打开端口配置界面
{
YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::ComboBoxTimerChange(TObject *Sender) //设置系统采集时钟
{
Timer1->Interval = StrToInt(ComboBoxTimer->Items->Strings[ComboBoxTimer->ItemIndex]);
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::E1Click(TObject *Sender) //关闭主程序界面
{
FrmADSLmain->Close();
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::N5Click(TObject *Sender) //打开版本号界面
{
FormVersion->Show();
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::ComboBoxCOMChange(TObject *Sender)
{
if (ComboBoxCOM->ItemIndex == 0)
{ //串口连接
N1->Enabled = true;
SBPortSet->Enabled = true;
EditTCP->Enabled = false;
TCP1->Enabled = false;
PortIsOpen = true;
ShowPortSetInfo(); //显示端口配置信息
}
else
{ //TCP连接
try
{
ClientSocket1->Active = false;
AnsiString StrIP = EditTCP->Text.Trim();
ClientSocket1->Address = StrIP.SubString(1,StrIP.Pos(":")-1); //IP
ClientSocket1->Port = StrToInt((StrIP.SubString(StrIP.Pos(":")+1,StrIP.Length())).Trim()); //端口号
//ShowMessage(ClientSocket1->Address+ClientSocket1->Port);
ClientSocket1->Active = true;
PortIsOpen = false;
EditTCP->Enabled = true;
TCP1->Enabled = true;
N1->Enabled = false;
SBPortSet->Enabled = false;
StatusBar1->Panels->Items[1]->Text = "当前连接方式:TCP "+StrIP;
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::DisplayData(AnsiString strDisplay)
{
Memo1->Lines->Add(strDisplay);
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SBStartTaskClick(TObject *Sender) //开始采集命令
{
DisplayData("");
DisplayData("|++++++开始采集参数++++++|");
SBStartTask->Enabled = false;
SBStopTask->Enabled = true;
Timer1->Enabled = true; //开始时钟
IsTransmit = true;
EditTCP->Enabled = false;
if (CB_Save->Checked) // 若需要保存通讯记录
{
FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
AnsiString strdata = "****************开始采集参数********************\n";
fputs(strdata.c_str(),LogFile); //写入通讯数据
fclose(LogFile);
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SBStopTaskClick(TObject *Sender)
{
DisplayData("");
DisplayData("|++++++停止采集参数++++++|");
SBStartTask->Enabled = true;
SBStopTask->Enabled = false;
Timer1->Enabled = false; //停止时钟
IsTransmit = false;
FIsClearBuf = true;
ShowMessage(ShowDetail());
EditTCP->Enabled = true;
if (CB_Save->Checked) // 若需要保存通讯记录
{
FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
AnsiString strdata = "\n****************停止采集参数********************\n";
fputs(strdata.c_str(),LogFile); //写入通讯数据
fclose(LogFile);
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::BuildCommand(void)
{
PADSLCommand CommandNode;
switch (CircleIndex)
{
case 0: //全部采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 0; //命令代号
CommandNode->AnswerLen = 94; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
++CircleIndex;
break;
case 1: //数字量采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 1; //命令代号
CommandNode->AnswerLen = 10; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 2: //A相电压采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 2; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 3: //B相电压采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 3; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 4: //C相电压采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 4; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 5: //A相电流采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 5; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 6: //B相电流采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 6; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 7: //C相电流采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 7; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 8: //A相功率采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 8; //命令代号
CommandNode->AnswerLen = 17; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 9: //B相功率采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 9; //命令代号
CommandNode->AnswerLen = 17; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 10: //C相功率采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 10; //命令代号
CommandNode->AnswerLen = 17; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 11: //A相功率因数采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 11; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 12: //B相功率因数采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 12; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 13: //C相功率因数采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 13; //命令代号
CommandNode->AnswerLen = 16; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 14: //电度采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 14; //命令代号
CommandNode->AnswerLen = 18; //命令返回字节数
PCommandList->Add(CommandNode);
CircleIndex = 0;
break;
default:
CircleIndex = 0;
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::BuildCmd(void) //建立命令列表
{
int Index;
PADSLCommand tmpCmd;
if (PCommandList->Count == 0)
{
BuildCommand();
}
tmpCmd = (struct TADSLCommand *)PCommandList->Items[0];
CurrentCommand = * tmpCmd;
PCommandList->Delete(0);
delete tmpCmd;
CmdNum = MakeCommand();
strCmd ="";
for (Index =0 ; Index<=CmdNum -1 ;++Index)
{
strCmd = strCmd +IntToHex(Byte(WBuf[Index]),2);
}
SendCmd();
}
//---------------------------------------------------------------------------
char __fastcall TFrmADSLmain::CheckSum(char *P ,int PCount) //数据校验
{
int Index;
Byte Crc;
Crc =0;
for (Index = 3 ; Index <= PCount -1 ;++Index)
{
Crc =Crc + Byte(P[Index]);
}
return Char(Crc);
}
//---------------------------------------------------------------------------
char __fastcall TFrmADSLmain::CheckSum2(char *P ,int PCount) //数据校验
{
int Index;
Byte Crc;
Crc =0;
for (Index = 1 ; Index <= PCount -1 ;++Index)
{
Crc =Crc + Byte(P[Index]);
}
return Char(Crc);
}
//---------------------------------------------------------------------------
unsigned char __fastcall TFrmADSLmain::CheckSum1(unsigned char *P ,int PCount) //数据校验1
{
int Index;
Byte Crc;
Crc =0;
AnsiString tmp = "";
for (Index = 0 ; Index <= PCount -1 ;++Index)
{
Crc =Crc + Byte(P[Index]);
tmp = tmp + IntToHex( P[Index],2);
}
//ShowMessage(tmp);
return Char(Crc);
}
//---------------------------------------------------------------------------
int __fastcall TFrmADSLmain::MakeCommand(void) //具体命令建立
{
int ADD1,ADD2;
WBuf[0] = char(0x7B); //包头
//设备地址
ADD1 = DevAdd & 0x0F; //低四位
ADD2 = (DevAdd >> 4); //高四位
WBuf[1] = char(0x30+ADD2); //设备地址高四位
WBuf[2] = char(0x30+ADD1); //设备地址低四位
switch(CurrentCommand.CommandCode)
{
case 0 : //全部采集命令:特征码:0302
/* 序号 1 2 3 4 5 6
字节数 1 2 1 2 1 1
格式 7BH ADDR 02H 0302H CRC 0DH
*/
WBuf[3] = char(0x02); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x06);
WBuf[6] = CheckSum(WBuf,6); //校验
WBuf[7] = char(0x0D); //包尾
return 8;
case 1 : //数字量采集命令:特征码:0303
/* 序号 1 2 3 4 5 6 7
字节数 1 2 1 2 2 1 1
格式 7CH ADDR 04H 0303H X CRC 0DH
X系数 电压系数(高位在前,低位在后)
*/
WBuf[3] = char(0x02); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x03);
WBuf[6] = CheckSum(WBuf,6); //校验
WBuf[7] = char(0x0D); //包尾
return 8;
case 2 : //A相电压采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 44E9H 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(0x44);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 3 : //B相电压采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 45E9H 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(0x45);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 4 : //C相电压采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 46E9H 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(0x46);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 5 : //A相电流采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 54E9H 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(0x54);
WBuf[12] = char(0xE9);
WBuf[13] = CheckSum2(WBuf,13); //校验
WBuf[14] = char(0x16); //包尾
return 15;
case 6 : //B相电流采集命令:
/* 序号 1 2 3 4 5 6 7 8
字节数 1 6 1 1 1 2 1 1
格式 68H ADDR 68H 01H 02H 55E9H 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); //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -