⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 econv230p.pas

📁 Delphi编写的ModBus协议上位机软件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
       testrptmemo.Lines.Add(s);
       testrptmemo.Lines.Add(' ');

       s := '序号';
       AppendBlank(s,8);
       s := s + '名称';
       AppendBlank(s,40);
       s := s + '结果';
       testrptmemo.Lines.Add(s);

       for i:=1 to coilstategrid.RowCount-1 do
       begin
         s := coilstategrid.Cells[0,i];
         AppendBlank(s,8);
         s := s + coilstategrid.Cells[1,i];
         AppendBlank(s,40);
         s := s + 'OK';
         testrptmemo.Lines.Add(s);
       end;
     end;


  if econfile.inputstatetotal>0 then
     begin
       testrptmemo.Lines.Add(' ');
       s := '开关量输入测试结果';
       testrptmemo.Lines.Add(s);
       testrptmemo.Lines.Add(' ');

       s := '序号';
       AppendBlank(s,8);
       s := s + '名称';
       AppendBlank(s,40);
       s := s + '结果';
       testrptmemo.Lines.Add(s);

       for i:=1 to inputstategrid.RowCount-1 do
       begin
         s := inputstategrid.Cells[0,i];
         AppendBlank(s,8);
         s := s + inputstategrid.Cells[1,i];
         AppendBlank(s,40);
         s := s + 'OK';
         testrptmemo.Lines.Add(s);
       end;
     end;

  if econfile.inputregistertotal>0 then
     begin
       testrptmemo.Lines.Add(' ');
       s := '输入寄存器值';
       testrptmemo.Lines.Add(s);
       testrptmemo.Lines.Add(' ');

       s := '地址';
       AppendBlank(s,8);
       s := s + '名称';
       AppendBlank(s,40);
       s := s + '值';
       testrptmemo.Lines.Add(s);

       for i:=1 to inputregistergrid.RowCount-1 do
       begin
         s := inputregistergrid.Cells[0,i];
         AppendBlank(s,8);
         s := s + inputregistergrid.Cells[1,i];
         AppendBlank(s,40);
         s := s + inputregistergrid.Cells[2,i];
         testrptmemo.Lines.Add(s);
       end;
     end;

   if econfile.holdregistertotal>0 then
     begin
       testrptmemo.Lines.Add(' ');
       s := '保存寄存器值';
       testrptmemo.Lines.Add(s);
       testrptmemo.Lines.Add(' ');

       s := '地址';
       AppendBlank(s,8);
       s := s + '名称';
       AppendBlank(s,40);
       s := s + '值';
       testrptmemo.Lines.Add(s);

       for i:=1 to holdregistergrid.RowCount-1 do
       begin
         s := holdregistergrid.Cells[0,i];
         AppendBlank(s,8);
         s := s + holdregistergrid.Cells[1,i];
         AppendBlank(s,40);
         s := s + holdregistergrid.Cells[2,i];
         testrptmemo.Lines.Add(s);
       end;
     end;

  testrptmemo.Lines.Add('');
  testrptmemo.Lines.Add('       ============================================');
  testrptmemo.Lines.Add('');
  testrptmemo.Lines.Add('');
end;

//-----------------------清除测试报告------------------------
procedure TMainForm.ClrRptBtnClick(Sender: TObject);
begin
  testrptmemo.Lines.Clear;
end;

//-----------------------画相量图----------------------------
procedure drawxiangliang;
const
  X0 = 350; //原点座标
  Y0 = 200;
var
  UA_R, UA_I, UA_MODEL: integer;
  UB_R, UB_I: integer;
  UC_R, UC_I: integer;
  IA_R, IA_I: integer;
  IB_R, IB_I: integer;
  IC_R, IC_I: integer;
  TEM_R, TEM_I: integer;
begin
  mainform.image1.Canvas.brush.Color := CLBLACK;
//  mainform.image1.Canvas.brush.Color := clInfoBk;
  mainform.image1.Canvas.FillRect(mainform.image1.Canvas.ClipRect);
  UA_R := strtointdef(econfile.xiangliangarray[1].address2,0) div 60;
  UA_R := UA_R * strtointdef(econfile.xiangliangarray[1].address3,1);

  UA_I := strtointdef(econfile.xiangliangarray[2].address2,0) div 60;
  UA_I := UA_I * strtointdef(econfile.xiangliangarray[1].address3,1);

  UB_R := strtointdef(econfile.xiangliangarray[3].address2,0) div 60;
  UB_R := UB_R * strtointdef(econfile.xiangliangarray[3].address3,1);

  UB_I := strtointdef(econfile.xiangliangarray[4].address2,0) div 60;
  UB_I := UB_I * strtointdef(econfile.xiangliangarray[3].address3,1);

  UC_R := strtointdef(econfile.xiangliangarray[5].address2,0) div 60;
  UC_R := UC_R * strtointdef(econfile.xiangliangarray[5].address3,1);

  UC_I := strtointdef(econfile.xiangliangarray[6].address2,0) div 60;
  UC_I := UC_I * strtointdef(econfile.xiangliangarray[5].address3,1);

  IA_R := strtointdef(econfile.xiangliangarray[7].address2,0) div 60;
  IA_R := IA_R * strtointdef(econfile.xiangliangarray[7].address3,1);

  IA_I := strtointdef(econfile.xiangliangarray[8].address2,0) div 60;
  IA_I := IA_I * strtointdef(econfile.xiangliangarray[7].address3,1);

  IB_R := strtointdef(econfile.xiangliangarray[9].address2,0) div 60;
  IB_R := IB_R*strtointdef(econfile.xiangliangarray[9].address3,1);

  IB_I := strtointdef(econfile.xiangliangarray[10].address2,0) div 60;
  IB_I := IB_I * strtointdef(econfile.xiangliangarray[9].address3,1);

  IC_R := strtointdef(econfile.xiangliangarray[11].address2,0) div 60;
  IC_R := IC_R * strtointdef(econfile.xiangliangarray[11].address3,1);

  IC_I := strtointdef(econfile.xiangliangarray[12].address2,0)div 60;
  IC_I := IC_I * strtointdef(econfile.xiangliangarray[11].address3,1);

  UA_MODEL := TRUNC(SQRT((UA_R * UA_R) + (UA_I * UA_I)));
  if UA_MODEL=0 then exit;
//  UB_MODEL:=TRUNC(SQRT(UB_R*UB_R+UB_I*UB_I));
//  UC_MODEL:=TRUNC(SQRT(UC_R*UC_R+UC_I*UC_I));

//  IA_MODEL:=TRUNC(SQRT(IA_R*IA_R+IA_I*IA_I));
//  IB_MODEL:=TRUNC(SQRT(IB_R*IB_R+IB_I*IB_I));
//  IC_MODEL:=TRUNC(SQRT(IC_R*IC_R+IC_I*IC_I));

  mainform.image1.Canvas.pen.Width := 6;
  mainform.image1.Canvas.pen.Color := $1BDDD6;
  mainform.image1.Canvas.MoveTo(X0,Y0);
  mainform.image1.Canvas.lineto(X0,Y0-(UA_MODEL));
  mainform.image1.Canvas.Font.Color := mainform.image1.Canvas.pen.Color;
  mainform.image1.Canvas.TextOut((X0 + 5),(Y0 - (UA_MODEL) - 5), 'UA');

  mainform.image1.Canvas.pen.Color := clLime;
  mainform.image1.Canvas.MoveTo(X0,Y0);
  tem_R := TRUNC(((UB_R * UA_I) - (UA_R * UB_I))/UA_MODEL);
  tem_I := TRUNC(((UB_R * UA_R) + (UA_I * UB_I))/UA_MODEL);
  mainform.image1.Canvas.lineto(X0 + tem_R, Y0 - tem_I);
  mainform.image1.Canvas.Font.Color := mainform.image1.Canvas.pen.Color;
  mainform.image1.Canvas.TextOut((X0 + tem_R + 5),(Y0 - tem_I - 5), 'UB');

  mainform.image1.Canvas.pen.Color := clRED;
  mainform.image1.Canvas.MoveTo(X0,Y0);
  tem_R := TRUNC((UC_R*UA_I - UA_R*UC_I)/UA_MODEL);
  tem_I := TRUNC((UC_R*UA_R + UA_I*UC_I)/UA_MODEL);
  mainform.image1.Canvas.lineto(X0+tem_R,Y0-tem_I);
  mainform.image1.Canvas.Font.Color := mainform.image1.Canvas.pen.Color;
  mainform.image1.Canvas.TextOut((X0+tem_R-5),(Y0-tem_I+5),'UC');


  mainform.image1.Canvas.pen.Color := 14080000;
  mainform.image1.Canvas.MoveTo(X0,Y0);
  tem_R := TRUNC((IA_R*UA_I - UA_R*IA_I)/UA_MODEL);
  tem_I := TRUNC((IA_R*UA_R + UA_I*IA_I)/UA_MODEL);
  mainform.image1.Canvas.lineto(X0+tem_R,Y0-tem_I);
  mainform.image1.Canvas.Font.Color := mainform.image1.Canvas.pen.Color;
  mainform.image1.Canvas.TextOut((X0+tem_R-15),(Y0-tem_I-15),'IA');

  mainform.image1.Canvas.pen.Color := clGREEN;
  mainform.image1.Canvas.MoveTo(X0,Y0);
  tem_R := TRUNC((IB_R*UA_I - UA_R*IB_I)/UA_MODEL);
  tem_I := TRUNC((IB_R*UA_R + UA_I*IB_I)/UA_MODEL);
  mainform.image1.Canvas.lineto(X0+tem_R,Y0-tem_I);
  mainform.image1.Canvas.Font.Color := mainform.image1.Canvas.pen.Color;
  mainform.image1.Canvas.TextOut((X0+tem_R+5),(Y0-tem_I-5),'IB');

  mainform.image1.Canvas.pen.Color := clFuchsia;
  mainform.image1.Canvas.MoveTo(X0,Y0);
  tem_R := TRUNC((IC_R*UA_I - UA_R*IC_I)/UA_MODEL);
  tem_I := TRUNC((IC_R*UA_R + UA_I*IC_I)/UA_MODEL);
  mainform.image1.Canvas.lineto(X0+tem_R,Y0-tem_I);
  mainform.image1.Canvas.Font.Color := mainform.image1.Canvas.pen.Color;
  mainform.image1.Canvas.TextOut((X0+tem_R-5),(Y0-tem_I+5),'IC');
end;

//----------------------启动通讯-----------------------------
procedure start_comm;
begin
  with mainform do
  begin
    m_comcontrol.Caption := '结束通讯';
    statusbar1.Panels[0].Text := '正在通讯';

    vacomm1.open;

    sendtimer.Enabled := true;
    poll_count := 0;
    revtimer.Enabled := false;
    timerout1.Interval := econfile.comm.timeout;
    readholdtimer.Enabled := true;
    readfifotimer.Enabled := true;
    readholdregister(econfile);
    readfifo(econfile);
    settime(econfile);
    sendflag := true;
  end; //end with
end;

//----------------------结束通讯-----------------------------
procedure stop_comm;
begin
  with mainform do
  begin
    m_comcontrol.Caption := '开始通讯';
    statusbar1.Panels[0].Text := '通讯已停止';

    vacomm1.close;
    sendflag := false;
    sendtimer.Enabled := false;
    timerout1.Enabled := false;
    revtimer.Enabled := false;
    readholdtimer.Enabled := false;
    readfifotimer.Enabled := false;
  end;//end with
end;


procedure TMainForm.XieBoGridSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  case acol of
    0: begin
        coilstategrid.Options :=
                [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine];
        CanSelect := false;
       end
       else
       begin
         coilstategrid.Options:=
                [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine];
         CanSelect := true;
         smindex := arow;
         tempform.showmodal;
         tempform.UpDown1.Position := strtointdef(econfile.xieboarray[smindex].address2, 0);
         tempform.tempedit.text := econfile.xieboarray[smindex].address2;
         tempform.Caption := '更改基数';
       end;
  end;
end;

procedure TMainForm.N1Click(Sender: TObject);
begin
  if (comm_status) then exit;
  tempform.Caption := '两帧间隔时间';
  tempform.show;
  tempform.tempedit.text := inttostr(econfile.comm.timepoll);
end;

procedure TMainForm.TimerOut1Timer(Sender: TObject);
begin
  sendtimer.Enabled := TRUE;
  //eventmemo.Lines.Add('time out');
  if eventmemo.lines.count>10 then
  begin
    eventmemo.lines.clear;
    eventmemo.Lines.Add('time out');
  end;
end;

procedure TMainForm.N2Click(Sender: TObject);
begin
  if (comm_status) then exit;
  tempform.Caption := '超时时间';
  tempform.show;
  tempform.tempedit.text := inttostr(timerout1.interval);
end;

procedure TMainForm.VaComm1RxChar(Sender: TObject; Count: Integer);
var
   a, b:integer;
   j:char;
   FirstString:String; //':'数据包头标识
   SecondString:String;//两字节板地址
   TemStr:String;
begin
  timeoutcount := 0;
  timerout1.Enabled := False;

  if (Uppercase(econfile.comm.mode)='RTU') then
  begin
    b := vacomm1.ReadBufUsed;
    for a := read_index to read_index+b-1 do
    begin
      if vacomm1.readchar(j) then
      begin
        revbuff[read_index] := integer(j);
        revmemo.Lines.Text := revmemo.Lines.Text+inttohex(revbuff[read_index], 2);
        read_index := read_index+1;
      end
      else exit;
    end;
  end;//if rtu mode
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -