📄 waterctrl.~pas
字号:
+MB_DEFBUTTON2) = IDOK then
FormWaterControl.Close;
end;
procedure TFormWaterControl.TimerRedoTimer(Sender: TObject);
begin
//实验过程重放,绘制水箱水面高度变化情况,绘制水面控制曲线
WaterHeightLeft := DataSource1.DataSet.Fields[1].AsInteger;
Shape_A.Top := Shape3Top - WaterHeightLeft;
Shape_A.Height := WaterHeightLeft;
Shape_A.Repaint;
Edit_A_Position.Text := DataSource1.DataSet.Fields[1].AsString;
Chart1.Series[0].AddXY(DataSource1.DataSet.Fields[0].AsInteger,
DataSource1.DataSet.Fields[1].AsInteger/10, '', clRed);
DataSource1.DataSet.next;
end;
procedure TFormWaterControl.TimerControlTimer(Sender: TObject);
var
ac,au,E, ek, uk, h2_real,h2_hope: Real;
Elist : array[0..6] of Integer;
i, k : Integer;
Ulist : array[0..6] of Real;
ring2_value : Boolean;
begin
//以下代码省略了保存到数据库的部分
ring2_value := False;//
h2_hope := SEdit_A_HP.Value / 12; //将期望水位值转换为相对值,10.0
ac := 1.0/3.0; //根据实际误差量范围e=-1~1
au := 5.0/3.0; //实际控制量范围u=-5~5
Ulist[0] := 2.59;
Ulist[1] := 2.0;
Ulist[2] := 1.26;
Ulist[3] := 0;
Ulist[4] := -1.26;
Ulist[5] := -2.0;
Ulist[6] := -2.56; //中位数法
Elist[0] := -3;
Elist[1] := -2;
Elist[2] := -1;
Elist[3] := 0;
Elist[4] := 1;
Elist[5] := 2;
Elist[6] := 3;
k := 0;
if (ring2_value = True) then
begin
h2_real := readadc(1);//读入参数
//变换
h2_real_real :=(h2_real-1.0)*30.0/4.0;
ek := h2_real_real - h2_hope;
//模糊化
E := ek/ac;
//查表
if (E < Elist[0]) then k := 0
else if (E >= Elist[6]) then k := 6
else
begin
for i := 0 to 5 do
begin
if (E >= Elist[i]) and (E < Elist[i+1]) then
begin
if (E - Elist[i] <= Elist[i+1]-E) then k := i
else
begin k := i+1; end;
end;
end;
end;
//控制量化值到实际输出
uk := 5 + Ulist[k] * au;
if (uk < 0) then uk := 0.0
else if (uk > 10) then uk := 9.9;
//实际输出
senddac(uk);
end;
end;
procedure TFormWaterControl.Action_SettingExecute(Sender: TObject);
begin
FormSetting.Show;
end;
procedure TFormWaterControl.Action_DataViewExecute(Sender: TObject);
begin
FormDataView.Show;
end;
procedure TFormWaterControl.Action_AboutExecute(Sender: TObject);
begin
FormAbout.Show;
end;
procedure TFormWaterControl.Action_HelpExecute(Sender: TObject);
begin
FormHelp.Show;
end;
procedure TFormWaterControl.Action_ClearExecute(Sender: TObject);
begin
if Application.MessageBox('你确定要清除实验结果吗?',
'水箱水位模糊控制系统',MB_OKCANCEL+MB_ICONINFORMATION+MB_SYSTEMMODAL
+MB_DEFBUTTON2) = IDOK then
begin
DataSource1.DataSet.Edit;
DataSource1.DataSet.Refresh;
if DataSource1.DataSet.RecordCount <=0 then
begin
DataSource1.DataSet.First;
while not DataSource1.DataSet.Eof do
begin
DataSource1.DataSet.Delete;
DataSource1.DataSet.Next;
end;
end;
DataSource1.DataSet.Post;
DataSource1.DataSet.Close;
end;
end;
procedure TFormWaterControl.Action_ReDoExecute(Sender: TObject);
begin
if TimerRedo.Enabled = False then
begin
TimerRedo.Enabled := True;
DataSource1.DataSet.First;
Chart1.Series[0].Clear;
BTN_ReDo.Caption := '暂停(&R)';
Menu_Redo.Caption := '暂停(&R)';
end
else
begin
TimerRedo.Enabled := False;
BTN_ReDo.Caption := '重放(&R)';
Menu_Redo.Caption := '重放(&R)';
end;
end;
procedure TFormWaterControl.Action_StartExecute(Sender: TObject);
begin
DataSource1.DataSet.Edit;
DataSource1.DataSet.Refresh;
if DataSource1.DataSet.RecordCount <=0 then
begin
DataSource1.DataSet.First;
while not DataSource1.DataSet.Eof do
begin
DataSource1.DataSet.Delete;
DataSource1.DataSet.Next;
end;
end;
DataSource1.DataSet.Post;
DataSource1.DataSet.Refresh;
if TimerControl.Enabled = True then exit
else
begin
TimerControl.Enabled := True;
Timer_MaxTime.Enabled := True;
Timer_Stable.Enabled := True;
end;
end;
procedure TFormWaterControl.Action_StopExecute(Sender: TObject);
begin
if TimerControl.Enabled = False then exit
else
begin
TimerControl.Enabled := False;
Timer_MaxTime.Enabled := False;
Timer_Stable.Enabled := False;
end;
end;
procedure TFormWaterControl.Timer_MaxTimeTimer(Sender: TObject);
begin
if Application.MessageBox('达到设定最长时间,但系统未稳定,要终止实验?',
'水箱水位模糊控制系统',MB_OKCANCEL+MB_ICONINFORMATION+MB_SYSTEMMODAL
+MB_DEFBUTTON2) = IDOK then
Action_Stop.Execute;
end;
procedure TFormWaterControl.Timer_StableTimer(Sender: TObject);
begin
//判断是否在稳定范围
if ((h2_real_real - StableValue2) <= StableValue2 * (1 - ErrorValue2))
or ((h2_real_real - StableValue2) >= StableValue2 * (1 + ErrorValue2))
then Stable_tmp := GetTickCount; //没有的话,重新刷新稳定时间
if ((GetTickCount - Stable_tmp) / 1000 > StableTime_HP) then
//判断是否处于稳定状态
begin
if Application.MessageBox('已经满足设定要求了,要终止实验?',
'水箱水位模糊控制系统',MB_OKCANCEL+MB_ICONINFORMATION+MB_SYSTEMMODAL
+MB_DEFBUTTON2) = IDOK then
Action_Stop.Execute;
end;
end;
procedure TFormWaterControl.Menu_SaveAsClick(Sender: TObject);
var FromMDB, DesMDB : String;
begin
SaveDialog1.Title := '请输入新的文件名!';
SaveDialog1.Filter := 'Microsoft Access数据库文件(*.mdb)|*.mdb';
SaveDialog1.DefaultExt:= 'MDB';
if SaveDialog1.Execute then
begin
DesMDB := ChangeFileExt(SaveDialog1.FileName,'.MDB');
if FileExists(DesMDB) then
Begin
showmessage('数据库已存在!请重新设定文件名。');
Menu_SaveAsClick(Sender);
end
else
begin
FromMDB := ExtractFilePath(ParamStr(0)) + 'water.mdb';
copyfile(PChar(FromMDB), PChar(DesMDB), False);
end;
end;
end;
procedure TFormWaterControl.Menu_OpenClick(Sender: TObject);
var FileTemp, DesMDB : String;
begin
if Application.MessageBox('要打开新的实验结果,将清除当前的实验结果,继续?',
'水箱水位模糊控制系统',MB_OKCANCEL+MB_ICONINFORMATION+MB_SYSTEMMODAL
+MB_DEFBUTTON2) = IDOK then
begin
OpenDialog1.Title := '请选择原数据库文件!';
OpenDialog1.Filter := 'Microsoft Access数据库文件(*.mdb)|*.mdb';
OpenDialog1.DefaultExt:= 'MDB';
if OpenDialog1.Execute then
begin
FileTemp := ChangeFileExt(OpenDialog1.FileName,'.MDB');
DesMDB := ExtractFilePath(ParamStr(0)) + 'water.MDB';
DeleteFile(DesMDB);
copyfile(PChar(FileTemp), PChar(DesMDB), False);
end;
end;
end;
procedure TFormWaterControl.Menu_ChartSaveClick(Sender: TObject);
var FileTemp : String;
begin
SaveDialog1.Title := '请输入图像文件名!';
SaveDialog1.Filter := '位图格式图像文件(*.bmp)|*.bmp';
SaveDialog1.DefaultExt:= 'BMP';
if SaveDialog1.Execute then
begin
FileTemp := ChangeFileExt(SaveDialog1.FileName,'.BMP');
Chart1.SaveToBitmapFile(FileTemp);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -