下面介绍Unit4系统设置界面的实现。
orm4主要实现的就是系统的设置,系统的设置主要包含: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;