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

📄 selfcheck.pas

📁 合成实验的上位机程序
💻 PAS
字号:
unit SelfCheck;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, Buttons, StdCtrls, Spin, ComCtrls;

type
  TSelfCheckFrm = class(TForm)
    Bevel2: TBevel;
    ClsSpdBtn: TSpeedButton;
    Label1: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    Label2: TLabel;
    UpDown1: TUpDown;
    Edit1: TEdit;
    Image1: TImage;
    ChannelSpd: TSpeedButton;
    CheckBox5: TCheckBox;
    Label3: TLabel;
    TimerResetSpd: TSpeedButton;
    TimerCheckSpd: TSpeedButton;
    IconImg: TImage;
    CaptionLbl: TLabel;
    ChannelResetSpd: TSpeedButton;
    procedure ClsSpdBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure CheckBox3Click(Sender: TObject);
    procedure CheckBox4Click(Sender: TObject);
    procedure ChannelSpdClick(Sender: TObject);
    procedure CheckBox5Click(Sender: TObject);
    procedure TimerResetSpdClick(Sender: TObject);
    procedure TimerCheckSpdClick(Sender: TObject);
    procedure ChannelResetSpdClick(Sender: TObject);
  private        
    procedure CMMOUSEENTER(var msg: TMessage); message CM_MOUSEENTER;
    procedure CMMOUSELEAVE(var msg: TMessage); message CM_MOUSELEAVE;
  public
  
  end;

var
  SelfCheckFrm: TSelfCheckFrm;
  CtrlChannel: array of TLabeledEdit;
  VerifyChannel: array of TLabeledEdit;
  Timer: array of TLabeledEdit;

implementation
uses TestCtrl;

{$R *.dfm}

procedure TSelfCheckFrm.CMMOUSEENTER(var msg: TMessage);
begin
  //如果鼠标进入关闭主窗体按钮
  if Integer(ClsSpdBtn)=msg.LParam then
  begin
    Bevel2.Visible:=True;
    ClsSpdBtn.BringToFront;
  end
end;

procedure TSelfCheckFrm.CMMOUSELEAVE(var msg: TMessage);
begin
  //如果鼠标离开关闭主窗体按钮
  if Integer(ClsSpdBtn)=msg.LParam then
    Bevel2.Visible:=False;
end;

procedure TSelfCheckFrm.ClsSpdBtnClick(Sender: TObject);
begin
  Close;
end;

procedure TSelfCheckFrm.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  SetLength(CtrlChannel,41);
  SetLength(VerifyChannel,41);
  SetLength(Timer,13);
  for I:=1 to 40 do
  begin
    CtrlChannel[I]:=TLabeledEdit.Create(Self);
    with CtrlChannel[I] do
    begin
      Parent:=SelfCheckFrm;
      AutoSize:=True;
      Width:=40;
      ReadOnly:=True;
      Font.Name:='宋体';
      Font.Size:=11;
      with EditLabel do
      begin
        Transparent:=True;
        Font.Name:='宋体';
        Font.Size:=10;
      end;
      case I of
          1..8: begin
                  EditLabel.Caption:='控制0'+IntToStr(I);
                  Top:=85;
                  Left:=32+(I-1)*75;
                  Text:='√';
                end;
         9..16: begin
                  if I=9 then
                    EditLabel.Caption:='控制09'
                  else
                    EditLabel.Caption:='控制'+IntToStr(I);
                  Top:=125;
                  Left:=32+(I-9)*75;
                  Text:='√';
                end;
        17..24: begin
                  EditLabel.Caption:='控制'+IntToStr(I);
                  Top:=165;
                  Left:=32+(I-17)*75;
                  Text:='√';
                end;
        25..32: begin
                  EditLabel.Caption:='控制'+IntToStr(I);
                  Top:=205;
                  Left:=32+(I-25)*75;
                  Text:='√';
                end;
        33..40: begin
                  EditLabel.Caption:='控制'+IntToStr(I);
                  Top:=245;
                  Left:=32+(I-33)*75;
                  Text:='√';
                end;
      end;
    end;
  end;
  for I:=1 to 40 do
  begin
    VerifyChannel[I]:=TLabeledEdit.Create(Self);
    with VerifyChannel[I] do
    begin
      Parent:=SelfCheckFrm;
      AutoSize:=True;
      Width:=40;
      ReadOnly:=True;
      Font.Name:='宋体';
      Font.Size:=11;
      with EditLabel do
      begin
        Transparent:=True;
        Font.Name:='宋体';
        Font.Size:=10;
      end;
      case I of
          1..8: begin
                  EditLabel.Caption:='校验0'+IntToStr(I);
                  Top:=320;
                  Left:=32+(I-1)*75;
                  Text:='';
                end;
         9..16: begin
                  if I=9 then
                    EditLabel.Caption:='校验09'
                  else
                    EditLabel.Caption:='校验'+IntToStr(I);
                  Top:=360;
                  Left:=32+(I-9)*75;
                  Text:='';
                end;
        17..24: begin
                  EditLabel.Caption:='校验'+IntToStr(I);
                  Top:=400;
                  Left:=32+(I-17)*75;
                  Text:='';
                end;
        25..32: begin
                  EditLabel.Caption:='校验'+IntToStr(I);
                  Top:=440;
                  Left:=32+(I-25)*75;
                  Text:='';
                end;
        33..40: begin
                  EditLabel.Caption:='校验'+IntToStr(I);
                  Top:=480;
                  Left:=32+(I-33)*75;
                  Text:='';
                end;
      end;
    end;
  end;
  for I:=1 to 12 do
  begin
    Timer[I]:=TLabeledEdit.Create(Self);
    with Timer[I] do
    begin
      Parent:=SelfCheckFrm;
      AutoSize:=True;
      Width:=50;
      ReadOnly:=True;
      Font.Name:='宋体';
      Font.Size:=11;
      with EditLabel do
      begin
        Transparent:=True;
        Font.Name:='宋体';
        Font.Size:=10;
      end;
      case I of
          1..9: EditLabel.Caption:='定时器0'+IntToStr(I);
        10..12: EditLabel.Caption:='定时器'+IntToStr(I);
      end;
      Top:=550;
      Left:=32+(I-1)*59;
      Text:='';
    end;
  end;
end;

procedure TSelfCheckFrm.CheckBox1Click(Sender: TObject);
var
  I: Integer;
begin
  if CheckBox1.Checked=True then
    for I:=1 to 8 do
      CtrlChannel[I].Text:='√'
  else
    for I:=1 to 8 do
      CtrlChannel[I].Text:='';
  for I:=1 to 8 do
    VerifyChannel[I].Text:='';
end;

procedure TSelfCheckFrm.CheckBox2Click(Sender: TObject);
var
  I: Integer;
begin
  if CheckBox2.Checked=True then
    for I:=9 to 16 do
      CtrlChannel[I].Text:='√'
  else
    for I:=9 to 16 do
      CtrlChannel[I].Text:='';  
  for I:=1 to 8 do
    VerifyChannel[I].Text:='';
end;

procedure TSelfCheckFrm.CheckBox3Click(Sender: TObject);
var
  I: Integer;
begin
  if CheckBox3.Checked=True then
    for I:=17 to 24 do
      CtrlChannel[I].Text:='√'
  else
    for I:=17 to 24 do
      CtrlChannel[I].Text:=''; 
  for I:=1 to 8 do
    VerifyChannel[I].Text:='';
end;

procedure TSelfCheckFrm.CheckBox4Click(Sender: TObject);
var
  I: Integer;
begin
  if CheckBox4.Checked=True then
    for I:=25 to 32 do
      CtrlChannel[I].Text:='√'
  else
    for I:=25 to 32 do
      CtrlChannel[I].Text:='';  
  for I:=1 to 8 do
    VerifyChannel[I].Text:='';
end;    

procedure TSelfCheckFrm.CheckBox5Click(Sender: TObject);
var
  I: Integer;
begin
  if CheckBox5.Checked=True then
    for I:=33 to 40 do
      CtrlChannel[I].Text:='√'
  else
    for I:=33 to 40 do
      CtrlChannel[I].Text:='';  
  for I:=1 to 8 do
    VerifyChannel[I].Text:='';
end;

procedure TSelfCheckFrm.ChannelSpdClick(Sender: TObject);
var
  I: Integer;
  Port,Bit: Byte;
  SelectFlag: Boolean;
begin
  ChannelSpd.Enabled:=False;
  SelectFlag:=False;
  for I:=1 to 32 do
    if CtrlChannel[I].Text='√' then
    begin
      SelectFlag:=True;
      Break;
    end;
  if SelectFlag=False then
  begin
    MessageBox(SelfCheckFrm.Handle,'请至少选择一个自检通道!',
      '警告',MB_ICONWARNING+MB_OK+MB_DEFBUTTON1);
    Exit;
  end;
  ChannelSpd.Enabled:=False;
  Screen.Cursor:=crHourGlass;
  PIO_D144_Reset;      //初始化PIO_D144
  PIO_D144_IO_Select(PIO_IO_Select1,$38); //Port0~2输出,Port3~5输入
  PIO_D144_IO_Select(PIO_IO_Select2,$38); //Port6~8输出,Port9~11输入
  PIO_D144_IO_Select(PIO_IO_Select3,$3E); //Port12输出,Port13~17输入
  for I:=0 to 17 do
    case I of
      0..2,6..8,12: begin
                      PIO_D144_Active_IO_Port(I);
                      PIO_D144_RW_8BitData(0,$0); //输出清零
                    end;
    end;
  for I:=1 to 40 do
    if CtrlChannel[I].Text='√' then
    begin
      Port:=PIO_D144_Port(I);
      PIO_D144_Active_IO_Port(Port);
      Bit:=PIO_D144_Bit(I);
      PIO_D144_RW_8BitData(0,Bit);
      Sleep(UpDown1.Position);      //检测频率即IO口高电平持续时间
      if Bit=PIO_D144_RW_8BitData(1,0) then
        CtrlChannel[I].Text:='OK'
      else
        CtrlChannel[I].Text:='×';  //以上为控制端口的检测
      Port:=PIO_D144_Port(I)+3;
      PIO_D144_Active_IO_Port(Port);
      if Bit=PIO_D144_RW_8BitData(1,0) then
        VerifyChannel[I].Text:='OK'
      else
        VerifyChannel[I].Text:='×'; //以上为校验端口的检测
      Port:=PIO_D144_Port(I);
      PIO_D144_Active_IO_Port(Port);
      Bit:=PIO_D144_Bit(I);
      PIO_D144_RW_8BitData(0,0);     //以上代码用来把检测后的控制端口清零
    end;
  Screen.Cursor:=crDefault;
  ChannelResetSpd.Enabled:=True;
end;      

procedure TSelfCheckFrm.TimerResetSpdClick(Sender: TObject);
var
  I: Integer;
begin
  for I:=1 to 12 do
    Timer[I].Text:='√';
  TimerCheckSpd.Enabled:=True;
  TimerResetSpd.Enabled:=False;
end;

procedure TSelfCheckFrm.TimerCheckSpdClick(Sender: TObject);
var
  I: Integer;
  Bit: Word;
begin
  TimerCheckSpd.Enabled:=False;
  TimerResetSpd.Enabled:=True;
  Screen.Cursor:=crHourGlass;
  TMC12_Reset;             //初始化TMC12
  for I:=1 to 12 do
  begin
    TMC12_ActiveChip(I);   //激活定时器I所在的Chip
    TMC12_SetCtrlWord(I);  //设定定时器I对应的控制字
    TMC12_ActiveCounter(I,$FF,$FF); //往定时器I送计数值,大概为80ms多一点
    Bit:=TMC12_StartBit(I);
    TMC12_StartCount(Bit); //启动定时器I,计数开始
    Sleep(100);            //延时100ms,正常情况下定时器I延时应该结束
    Bit:=Bit and TMC12_IsCountOver; //判断定时器I是否正常
    if Bit<>0 then
      Timer[I].Text:='OK'           //定时器I正常指示
    else
      Timer[I].Text:='×';          //定时器I异常指示
  end;                     
  Screen.Cursor:=crDefault;
end;

procedure TSelfCheckFrm.ChannelResetSpdClick(Sender: TObject);
var
  I,J: Integer;
begin
  if CheckBox1.Checked=True then
    for I:=1 to 8 do
    begin
      CtrlChannel[I].Text:='√';
      VerifyChannel[I].Text:='';
    end;
  if CheckBox2.Checked=True then
    for I:=9 to 16 do
    begin
      CtrlChannel[I].Text:='√';
      VerifyChannel[I].Text:='';
    end;
  if CheckBox3.Checked=True then
    for I:=17 to 24 do
    begin
      CtrlChannel[I].Text:='√';
      VerifyChannel[I].Text:='';
    end;
  if CheckBox4.Checked=True then
    for I:=25 to 32 do
    begin
      CtrlChannel[I].Text:='√';
      VerifyChannel[I].Text:='';
    end;
  if CheckBox5.Checked=True then
    for I:=33 to 40 do
    begin
      CtrlChannel[I].Text:='√';
      VerifyChannel[I].Text:='';
    end;
  ChannelResetSpd.Enabled:=False;
  ChannelSpd.Enabled:=True;
end;

end.

⌨️ 快捷键说明

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