📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "YbCommDevice"
#pragma link "LMDBaseControl"
#pragma link "LMDBaseGraphicControl"
#pragma link "LMDControl"
#pragma link "LMDGraphicControl"
#pragma link "LMDLEDCustomLabel"
#pragma link "LMDLEDLabel"
#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]);
//FIsClearBuf = true;
}
//---------------------------------------------------------------------------
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;
SpeedButton1->Enabled = true; //自动调试按钮
SpeedButton2->Enabled = false; //结束自动调试按钮
SBAddrSET->Enabled = true; //地址设置按钮
UpDown2->Enabled = true; //调整系统按钮
if (ComboBoxCOM->ItemIndex == 0)
{ //串口连接
YbCommDevice1->Active = true;
}
else //TCP连接
{
ClientSocket1->Active= true;
}
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;
SpeedButton1->Enabled = false; //自动调试按钮
SpeedButton2->Enabled = false; //结束自动调试按钮
SBAddrSET->Enabled = false; //地址设置按钮
UpDown2->Enabled = false; //调整系统按钮
FAuto48VSet = false; //停止自动调试标志
if (ComboBoxCOM->ItemIndex == 0)
{ //串口连接
YbCommDevice1->Active = false;
}
else //TCP连接
{
ClientSocket1->Active= false;
}
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 = 11; //命令返回字节数
PCommandList->Add(CommandNode);
++CircleIndex;
break;
case 1: //48V直流电压系数采集命令
CommandNode = new TADSLCommand;
CommandNode->CommandCode = 3; //命令代号
CommandNode->AnswerLen = 10; //命令返回字节数
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);
}
//---------------------------------------------------------------------------
int __fastcall TFrmADSLmain::MakeCommand(void) //具体命令建立
{
int ADD1,ADD2;
WBuf[0] = char(0x7C); //包头
//设备地址
ADD1 = DevAdd & 0x0F; //低四位
ADD2 = (DevAdd >> 4); //高四位
WBuf[1] = char(0x30+ADD2); //设备地址高四位
WBuf[2] = char(0x30+ADD1); //设备地址低四位
switch(CurrentCommand.CommandCode)
{
case 0 : //全部采集命令:特征码:0301
/* 序号 1 2 3 4 5 6
字节数 1 2 1 2 1 1
格式 7CH ADDR 02H 0301H CRC 0DH
*/
WBuf[3] = char(0x02); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x01);
WBuf[6] = CheckSum(WBuf,6); //校验
WBuf[7] = char(0x0D); //包尾
return 8;
case 2 : //48V直流电压系数设置命令:特征码:0302
/* 序号 1 2 3 4 5 6 7
字节数 1 2 1 2 2 1 1
格式 7CH ADDR 04H 0302H X CRC 0DH
X系数 电压系数(高位在前,地位在后)
*/
WBuf[3] = char(0x04); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x02);
WBuf[6] = char(int(CurrentCommand.Value) / 256); //X系数-电压系数
WBuf[7] = char(int(CurrentCommand.Value) % 256);
WBuf[8] = CheckSum(WBuf,8); //校验
WBuf[9] = char(0x0D); //包尾
return 10;
case 3 : //48V直流电压系数查寻命令:特征码:0303
/* 序号 1 2 3 4 5 6
字节数 1 2 1 2 1 1
格式 7CH ADDR 02H 0303H CRC 0DH
*/
WBuf[3] = char(0x02); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x03);
WBuf[6] = CheckSum(WBuf,6); //校验
WBuf[7] = char(0x0D); //包尾
return 8;
case 4 : //48V直流电压系数设置登陆命令:特征码:0304
/*
序号 1 2 3 4 5 6 7
字节数 1 2 1 2 2 1 1
格式 7CH ADDR 04H 0304H X CRC 0DH
X登陆命令(BCD码) (高位在前,地位在后)
*/
WBuf[3] = char(0x04); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x04);
WBuf[6] = BCDToChar(CurrentCommand.Value1,1); //X系数-登陆命令
WBuf[7] = BCDToChar(CurrentCommand.Value1,2);
WBuf[8] = CheckSum(WBuf,8); //校验
WBuf[9] = char(0x0D); //包尾
return 10;
case 5 : //48V直流电压撤消登陆命令:特征码:0305
/*
序号 1 2 3 4 5 6 7
字节数 1 2 1 2 2 1 1
格式 7CH ADDR 04H 0305H X CRC 0DH
X登陆命令(BCD码) (高位在前,地位在后)
*/
WBuf[3] = char(0x04); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x05);
WBuf[6] = BCDToChar(CurrentCommand.Value1,1); //X系数-登陆命令
WBuf[7] = BCDToChar(CurrentCommand.Value1,2);
WBuf[8] = CheckSum(WBuf,8); //校验
WBuf[9] = char(0x0D); //包尾
return 10;
case 6 : //设备地址设置命令:特征码:0306
/*
序号 1 2 3 4 5 6 7 8
字节数 1 2 1 2 1 4 1 1
格式 7CH 3F3FH 07H 0306H X 31323334H CRC 0DH
X设备地址
*/
WBuf[1] = char(0x3F); //表示所有地址有效
WBuf[2] = char(0x3F); //
WBuf[3] = char(0x07); //数据长度
WBuf[4] = char(0x03); //命令代码
WBuf[5] = char(0x06);
WBuf[6] = char(Byte(CurrentCommand.Value)); //设备地址高四位
WBuf[7] = char(0x31);
WBuf[8] = char(0x32);
WBuf[9] = char(0x33);
WBuf[10] = char(0x34);
WBuf[11] = CheckSum(WBuf,12); //校验
WBuf[12] = char(0x0D); //包尾
return 13;
}
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,strtmp;
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) + " 发送:"+ArrayCMDName[CurrentCommand.CommandCode]; //显示时间与标题
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);
}
}
else //接收命令
{
if (ComboBoxCOM->ItemIndex == 0) //串口连接
{
num = YbCommDevice1->ReadPackage(RBuf1,BufSize); //接收数据包
}
else //TCP连接
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -