📄 rs3calccfg.pas
字号:
{***************************************************************************}
{ }
{ RS-3 供油机构高低温、高空性能试验测控系统 }
{ }
{ 版权所有 (c) 2002-2004 航天科技集团公司四川达宇特种车辆制造厂 }
{ }
{***************************************************************************}
unit RS3CalcCfg;
{****************************************************************************
项目: RS-3 供油机构高低温、高空性能试验测控系统
模块: RS3CfgAdmin.mpp
描述: 传感器输入-输出校准模块,可根据系统的传感器计量数据进行拟合,从而得出校
线系数,用以计算实际测量值。
版本: V1.0
日期: 2003-08-14
作者: 罗建
更新: 2004-01-19
todo:
****************************************************************************}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, DB, DBCtrls, ActnList, TeEngine, Series, TeeProcs,
Chart, DbChart, IBCustomDataSet, IBTable, ActnMan, ActnCtrls, Grids,
ExtCtrls, ToolWin, ComCtrls, StdCtrls, DBGrids, RS3DMUnit, dfsStatusBar,
HelpRouter, TFlatComboBoxUnit, TFlatHintUnit, Menus, StrUtils, ValEdit, Math,
DAODataset, DAOTable, DAODatabase, Buttons;
type
TCalcData = record
fDataIn: Double;
fDataOut: Double;
fCalcOut: Double;
fPerError: Double;
end;
TCalcCoef = record
sItemName: String;
sUnitIn: String;
sUnitOut: String;
bLoaded: Boolean;
nDataNums: Integer;
bModified: Boolean;
nPower: Integer;
fError: Double;
fCoef: array[0..9] of Double;
szCalcTime: String;
end;
TRS3CalcForm = class(TForm)
CoolBar1: TCoolBar;
cboxItemName: TComboBox;
ActionManager1: TActionManager;
actStart: TAction;
actSave: TAction;
actBack: TAction;
ImageList1: TImageList;
actHelpTopic: TAction;
Panel1: TPanel;
actClearTable: TAction;
RS3StringGrid: TStringGrid;
RS3Chart: TChart;
RS3SeriesAfter: TLineSeries;
RS3SeriesBefore: TPointSeries;
PopupMenuGrid: TPopupMenu;
PopupMenuChart: TPopupMenu;
popMenuDelete: TMenuItem;
popMenuInsert: TMenuItem;
popMenuClearCol: TMenuItem;
N1: TMenuItem;
popMenuClearRow: TMenuItem;
N2: TMenuItem;
popMenuPrintData: TMenuItem;
PrintDialog1: TPrintDialog;
popMenuSaveToFile: TMenuItem;
RS3ValueListEditor: TValueListEditor;
Panel3: TPanel;
Splitter3: TSplitter;
MainMenu1: TMainMenu;
O1: TMenuItem;
S1: TMenuItem;
D1: TMenuItem;
S2: TMenuItem;
N3: TMenuItem;
H1: TMenuItem;
B1: TMenuItem;
T1: TMenuItem;
A1: TMenuItem;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
ToolButton10: TToolButton;
T2: TMenuItem;
actInsertRow: TAction;
actDeleteRow: TAction;
actClearCol: TAction;
actClearRow: TAction;
actPrintData: TAction;
actSaveAsFile: TAction;
actHelpAbout: TAction;
R1: TMenuItem;
C1: TMenuItem;
N4: TMenuItem;
I2: TMenuItem;
D2: TMenuItem;
N5: TMenuItem;
P1: TMenuItem;
S3: TMenuItem;
ToolButton13: TToolButton;
ToolButton14: TToolButton;
ToolButton15: TToolButton;
ToolButton17: TToolButton;
ToolButton19: TToolButton;
ToolButton20: TToolButton;
D3: TMenuItem;
Panel4: TPanel;
ToolBar2: TToolBar;
EditItem: TEdit;
ToolButton18: TToolButton;
tbtnItemAdd: TToolButton;
ToolButton22: TToolButton;
ToolButton21: TToolButton;
ToolButton23: TToolButton;
M1: TMenuItem;
N6: TMenuItem;
O2: TMenuItem;
C2: TMenuItem;
actItemDelete: TAction;
actItemAdd: TAction;
DAODatabase1: TDAODatabase;
DAOTable1: TDAOTable;
DAOTable2: TDAOTable;
ToolButton11: TToolButton;
actSaveAll: TAction;
A2: TMenuItem;
Panel2: TPanel;
Label1: TLabel;
EditUnitIn: TEdit;
Label2: TLabel;
EditUnitOut: TEdit;
SpeedButton1: TSpeedButton;
DBMemo1: TDBMemo;
Splitter1: TSplitter;
DataSource1: TDataSource;
Label3: TLabel;
EditPower: TEdit;
UpDownPower: TUpDown;
PopupMenu1: TPopupMenu;
procedure actStartExecute(Sender: TObject);
procedure actSaveExecute(Sender: TObject);
procedure actHelpTopicExecute(Sender: TObject);
procedure actBackExecute(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure cboxItemNameSelect(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure actClearTableExecute(Sender: TObject);
procedure RS3StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure RS3StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure actSaveUpdate(Sender: TObject);
procedure RS3StringGridMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure actSaveAllExecute(Sender: TObject);
procedure actClearRowExecute(Sender: TObject);
procedure actClearColExecute(Sender: TObject);
procedure actInsertRowExecute(Sender: TObject);
procedure actDeleteRowExecute(Sender: TObject);
procedure actPrintDataExecute(Sender: TObject);
procedure actSaveAsFileExecute(Sender: TObject);
procedure actHelpAboutExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EditPowerKeyPress(Sender: TObject; var Key: Char);
procedure actItemDeleteExecute(Sender: TObject);
procedure actItemAddExecute(Sender: TObject);
procedure actItemDeleteUpdate(Sender: TObject);
procedure actItemAddUpdate(Sender: TObject);
procedure EditPowerChange(Sender: TObject);
private
{ Private declarations }
FRS3DM: TRS3DM;
FCalcCoef: array[0..1023] of TCalcCoef;
FCalcData: array[0..1023,0..255] of TCalcData;
FHTMLhelpRouter: THTMLhelpRouter;
FACol,FARow: Integer;
FstrFileName: String;
procedure SaveData(Index: Integer);
procedure ReadData(Index: Integer);
procedure DisplayData(Index: Integer);
function SaveDataToFile(Index: Integer): Boolean;
public
{ Public declarations }
end;
var
RS3CalcForm: TRS3CalcForm;
implementation
uses RS3SaveHintDlg, CurveFitUnit, AboutUnit;
{$R *.dfm}
{ 保存指定传感器的拟合数据 }
procedure TRS3CalcForm.SaveData(Index: Integer);
var
i: Integer;
begin
// 判断当前传感器的拟合数据是否已经修改
if FCalcCoef[Index].bModified then
begin
// 保存本次产生的拟合系数
with DAOTable1 do
begin
if not Active then Open;
Locate('ItemName',VarArrayOf([FCalcCoef[Index].sItemName]),[]);
Edit;
FieldByName('UnitIn').AsString := FCalcCoef[Index].sUnitIn;
FieldByName('UnitOut').AsString := FCalcCoef[Index].sUnitOut;
FieldByName('CalcTime').AsString := FCalcCoef[Index].szCalcTime;
FieldByName('Power').AsInteger := FCalcCoef[Index].nPower;
FieldByName('Error').AsFloat := FCalcCoef[Index].fError;
for i := 0 to FCalcCoef[Index].nPower do
FieldByName('COEF' + IntToStr(i)).AsFloat := FCalcCoef[Index].fCoef[i];
Post;
end;
FCalcCoef[Index].bModified := false;
// 保存用户输入的拟合数据
with DAOTable2 do
begin
if not Active then Open;
Filtered := false;
Filter := 'ItemName=' + FCalcCoef[Index].sItemName;
Filtered := true;
// 如果原来已经有此项目,则删除该项目的数据
if RecordCount > 0 then
begin
Last;
while not Bof do Delete;
end;
for i := 0 to FCalcCoef[Index].nDataNums-1 do
begin
Append;
FieldByName('ItemName').AsString := FCalcCoef[Index].sItemName;
FieldByName('DataIn').AsFloat := FCalcData[Index,i].fDataIn;
FieldByName('DataOut').AsFloat := FCalcData[Index,i].fDataOut;
FieldByName('CalcOut').AsFloat := FCalcData[Index,i].fCalcOut;
FieldByName('PerError').AsFloat := FCalcData[Index,i].fPerError; // 相对误差
Post;
end; // for
end; // with
if not DAOTable1.Active then DAOTable1.Open;
DAOTable1.Locate('ItemName',VarArrayOf([cboxItemName.Items.Strings[Index]]),[]);
end; // if
end;
procedure TRS3CalcForm.ReadData(Index: Integer);
var
i: Integer;
begin
if FCalcCoef[Index].bLoaded then Exit;
// 从拟合数据表中读取拟合数据
with DAOTable2 do
begin
if not Active then Open;
Filtered := false;
Filter := 'ItemName=' + '''' + cboxItemName.Items.Strings[Index] + '''';
Filtered := true;
First;
i := 0;
while not Eof do
begin
FCalcData[Index,i].fDataIn := FieldByName('DataIn').AsFloat; // 测量输入
FCalcData[Index,i].fDataOut := FieldByName('DataOut').AsFloat; // 测量输出
FCalcData[Index,i].fCalcOut := FieldByName('CalcOut').AsFloat; // 拟合输出
FCalcData[Index,i].fPerError:= FieldByName('PerError').AsFloat; // 相对误差
Inc(i);
Next;
end; // while
end; // with
FCalcCoef[Index].nDataNums := i;
FCalcCoef[Index].bLoaded := true;
end;
{ 显示拟合结果 }
procedure TRS3CalcForm.DisplayData(Index: Integer);
const
szTitleFix = '最小二乘曲线拟合';
var
i: Integer;
strTemp: String;
begin
// 清除、填充表格内容和曲线并显示
for i := 1 to RS3StringGrid.RowCount-1 do
RS3StringGrid.Rows[i].Clear;
// 表格标题
RS3StringGrid.Cells[0,0] := '测量输入(' + FCalcCoef[Index].sUnitIn + ')';
RS3StringGrid.Cells[1,0] := '测量输出(' + FCalcCoef[Index].sUnitOut + ')';
RS3StringGrid.Cells[2,0] := '拟合输出(' + FCalcCoef[Index].sUnitOut + ')';
RS3StringGrid.Cells[3,0] := '相对误差(%)';
// 曲线
RS3Chart.Title.Text.Clear;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -