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

📄 rs3calccfg.pas

📁 最小二乘相关介绍,最小二乘相关介绍,及其原程序!仔细整理收获不少!
💻 PAS
📖 第 1 页 / 共 3 页
字号:
{***************************************************************************}
{                                                                           }
{                 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 + -