下面介绍Unit4系统设置界面的实现。
form4主要实现的就是系统的设置,系统的设置主要包含:1.设置串口,2.增、删、改负载特征矩阵,3.下传负载特征矩阵,4.设置数据库路径。
其中第2点再后续的form6,form7,form8中讲解。
1.下传负载特征矩阵
先来展示所有源码:
procedure TForm4.TeButton1Click(Sender: TObject);
var
i,j,flag,k : integer; //改maxIndex为全局变量了
tempVal : single;
hex,strHex : string;
begin
form1.IBdatabase1.Connected:=true;
form1.IBquery1.Close;
form1.ibquery1.SQL.Clear;
form1.ibquery1.SQL.Add('select max(loadIndex) from loadmatrix');
form1.ibquery1.Open; //这时值已经放到IBQuery中了
maxIndex := form1.IBQuery1.FieldByName('max').AsInteger ;//取出最大的矩阵行号
teprogressbar1.Position := 0;
teprogressbar1.Min :=0;
teprogressbar1.Max :=maxIndex * 6 * 10 * 3;//计算最大量
teprogressbar1.Step := 1;
form1.comport1.Port := ckCombo.Items[ckCombo.ItemIndex];//由unit4选择串口号
form1.comport1.BaudRate := br9600;
if form1.ComPort1.Connected = false then
begin
flag := 0;//记录串口的初始状态 0表示初始串口关着呢
form1.ComPort1.Open;
end
else
flag := 1;//1表示初始串口开着呢
for k := 0 to 2 do //为了保险,矩阵数据下传3遍
begin
for i := 1 to maxIndex do //i代表矩阵行号
begin
form1.ibquery1.SQL.Clear;
form1.IBQuery1.SQL.Add('select * from loadMatrix where loadIndex = :A');
Form1.IBQuery1.Params.ParamByName('A').Value := i;
form1.ibquery1.Open; //这时值已经放到IBQuery中了
//发相位
tempVal := form1.ibquery1.FieldByName('phase').AsFloat ;//取得相位
hex := FloatToHex(tempVal);//将float数据转成4字节十六进制字符串
for j := 0 to 9 do//j代表表号0~9
begin
strHex := '68 0'+inttostr(j)+' 30 00 00 00 00 68 04 08 fe fd '+inttostr(i-1)+'0'+hex+' 13 16';
form1.comport1.WriteStr(Hexstrtostr(strHex));//发送数据 调用Hexstrtostr函数
tememo1.Text := tememo1.Text + strHex + #13#10;//#13 #10 memo换行
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text ); //一直让memo显示最后一行
teprogressbar1.StepIt;//进度条加1
Delay(500);
end;
//发谐波1
tempVal := form1.ibquery1.FieldByName('har1').AsFloat ;//取得相位
hex := FloatToHex(tempVal);//将float数据转成4字节十六进制字符串
for j := 0 to 9 do//j代表表号0~9
begin
strHex := '68 0'+inttostr(j)+' 30 00 00 00 00 68 04 08 fe fd '+inttostr(i-1)+'1'+hex+' 13 16';
form1.comport1.WriteStr(Hexstrtostr(strHex));//发送数据
tememo1.Text := tememo1.Text + strHex+ #13#10;
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text );
teprogressbar1.StepIt;//进度条加1
Delay(500);
end;
//发谐波3
tempVal := form1.ibquery1.FieldByName('phase').AsFloat ;//取得相位
hex := FloatToHex(tempVal);//将float数据转成4字节十六进制字符串
for j := 0 to 9 do//j代表表号0~9
begin
strHex := '68 0'+inttostr(j)+' 30 00 00 00 00 68 04 08 fe fd '+inttostr(i-1)+'2'+hex+' 13 16';
form1.comport1.WriteStr(Hexstrtostr(strHex));//发送数据
tememo1.Text := tememo1.Text + strHex+ #13#10;
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text );
teprogressbar1.StepIt;//进度条加1
Delay(500);
end;
//发谐波5
tempVal := form1.ibquery1.FieldByName('har1').AsFloat ;//取得相位
hex := FloatToHex(tempVal);//将float数据转成4字节十六进制字符串
for j := 0 to 9 do//j代表表号0~9
begin
strHex := '68 0'+inttostr(j)+' 30 00 00 00 00 68 04 08 fe fd '+inttostr(i-1)+'3'+hex+' 13 16';
form1.comport1.WriteStr(Hexstrtostr(strHex));//发送数据
tememo1.Text := tememo1.Text + strHex+ #13#10;
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text );
teprogressbar1.StepIt;//进度条加1
Delay(500);
end;
//发谐波7
tempVal := form1.ibquery1.FieldByName('phase').AsFloat ;//取得相位
hex := FloatToHex(tempVal);//将float数据转成4字节十六进制字符串
for j := 0 to 9 do//j代表表号0~9
begin
strHex := '68 0'+inttostr(j)+' 30 00 00 00 00 68 04 08 fe fd '+inttostr(i-1)+'4'+hex+' 13 16';
form1.comport1.WriteStr(Hexstrtostr(strHex));//发送数据
tememo1.Text := tememo1.Text + strHex+ #13#10;
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text );
teprogressbar1.StepIt;//进度条加1
Delay(500);
end;
//发谐波9
tempVal := form1.ibquery1.FieldByName('har1').AsFloat ;//取得相位
hex := FloatToHex(tempVal);//将float数据转成4字节十六进制字符串
for j := 0 to 9 do//j代表表号0~9
begin
strHex := '68 0'+inttostr(j)+' 30 00 00 00 00 68 04 08 fe fd '+inttostr(i-1)+'5'+hex+' 13 16';
form1.comport1.WriteStr(Hexstrtostr(strHex));//发送数据
tememo1.Text := tememo1.Text + strHex+ #13#10;
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text );
teprogressbar1.StepIt;//进度条加1
Delay(500);
end;
end;
end;
ShowMessage('下载完成');
if flag = 0 then
form1.ComPort1.Connected := false; //恢复串口的初始状态
end;
上面的结构大体如下:
for k//传3遍
for i//矩阵的行号
1.发相位
for j 0~9//代表表号
2.发谐波1
for j 0~9//代表表号
3.发谐波3
for j 0~9//代表表号
4.发谐波5
for j 0~9//代表表号
5.发谐波7
for j 0~9//代表表号
6.发谐波9
for j 0~9//代表表号
以发送相位为例详细讲解:
//发相位
tempVal := form1.ibquery1.FieldByName('phase').AsFloat ;//取得相位
hex := FloatToHex(tempVal);//将float数据转成4字节十六进制字符串
for j := 0 to 9 do//j代表表号0~9
begin
strHex := '68 0'+inttostr(j)+' 30 00 00 00 00 68 04 08 fe fd '+inttostr(i-1)+'0'+hex+' 13 16';
form1.comport1.WriteStr(Hexstrtostr(strHex));//发送数据 调用Hexstrtostr函数
tememo1.Text := tememo1.Text + strHex + #13#10;//#13 #10 memo换行
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text ); //一直让memo显示最后一行
teprogressbar1.StepIt;//进度条加1
Delay(500);
end;
同样使用 ibquery1.FieldByName('phase').AsFloat 得到数据库中字段名为“phase”的数据内容,使用FloatToHex函数将float数据转为4字节十六进制。
根据645规约,将传输帧补齐,即strHex字符串,使用函数Hexstrtostr将字符串转为16进制,最后使用语句form1.comport1.WriteStr(Hexstrtostr(strHex));将命令帧下传。
最后,按一般习惯,显示窗口要一直显示当前发送的最后一帧数据,那么就要使用下面两句,使显示保持在最后一行:
tememo1.SelStart := length(tememo1.Text );
tememo1.SelLength := length(tememo1.Text ); //一直让memo显示最后一行
2.设置数据库路径
使用openDialog控件来打开文件。
使用如下语句即可得到文件的完整路径,其返回值是包含文件名的完整路径:
if opendialog1.Execute then
begin
tememo2.Text := opendialog1.FileName ;
end;