📄 selfcheck.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 + -