【乌拉喵.教程】“多负载识别监控平台(上位机)”技术细节 之Unit4-Form4系统设置界面

下面介绍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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值