From 868daf94f29ce1ffdd799a68c07bb668cd373bcd Mon Sep 17 00:00:00 2001 From: HP\李良庭 <liliangting@lanpucloud.cn:1111> Date: 星期二, 08 七月 2025 11:49:03 +0800 Subject: [PATCH] 提交分辨率自适应版本V3.1.0.1500 --- src/uSaveData.pas | 924 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 924 insertions(+), 0 deletions(-) diff --git a/src/uSaveData.pas b/src/uSaveData.pas new file mode 100644 index 0000000..cb2d659 --- /dev/null +++ b/src/uSaveData.pas @@ -0,0 +1,924 @@ +{------------------------------------------------------------------------------} +{单元名称:uSaveData.pas } +{模块名称:过程数据存储模块 } +{功能描述:将系统参数存储到本地SQLite数据库 } +{建立日期:2023-10-31 } +{修改日期:2023-10-31 } +{版权所有:李良庭 liangtingli@outlook.com } +{------------------------------------------------------------------------------} +unit uSaveData; + +interface + +uses + Windows, Classes, SysUtils, Dialogs, StrUtils, DateUtils, Variants, Grids, Math, + StdCtrls, SQLite3, SQLiteTable3, sListBox, Global, log4me, PubUtils; + + {申明内部调用函数} + procedure createConfigSql(table:string); + procedure insertConfigSql(table:string; no:Integer; nam,val:String); + procedure updateConfigSql(table:string; nam,val:String); + function queryConfigSql(table,nam:string):string; + function queryConfigCnt(table,nam:string):integer; + + procedure createGrainSql(table:string); + procedure insertGrainSql(table:string; cod:Integer; no,nam:String;coef1,coef2,coef3,coef4,coef5,intercept:String; flag:Integer=0); + function queryGrainSql(table,nam:string):TGrainRec; + function queryGrainSql1(table:string; cod:Integer):TGrainRec; + procedure queryGrainlistSql(table:string; lb:TsListBox; flag:Integer=2); + + procedure createTestSql(table:string); + procedure insertTestSql(table:string; mode,is_auto,tim,cod:Integer; nam,info:String; mois,temp,water:double); + + {申明外部调用函数} + procedure InitConfig(); + procedure InitConn(); + procedure InitGrain(); + procedure InitTestDB(); + procedure InitWeight(); + procedure InitManager(); + procedure AddGrainRecord(nam:string; rec:TGrainRec); + procedure deleteGrainSql(table,nam: string); + procedure updateNameSql(table,new,nam: string; newcod,cod: Integer); + function queryGrainNumSql(table:string; nam:string; cod:Integer):Integer; + procedure queryGrainTypeSql(table:string; typ:Integer; cb:TComboBox); + + procedure LoadParam(); + procedure SaveParam(); + procedure SaveWgParam(); + procedure SaveVerifyParam(); + procedure SaveInterceptParam(val:string); + +implementation + +//--------config配置数据库函数-------------------------------------------- +//创建config数据库 +procedure createConfigSql(table:string); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + //建 config数据表 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + if not sqldb.TableExists(table) then begin + sql := 'CREATE TABLE [' + table + '] (' + +'[id] INTEGER PRIMARY KEY,' + +'[nam] VARCHAR(20) NULL,' + +'[val] VARCHAR(200) NULL );'; + sqldb.ExecSQL(sql); + //新建索引 + sql := 'CREATE INDEX index_'+table+' ON ['+table+']([id]);'; + sqldb.ExecSQL(sql); + end; + finally + FreeAndNil(sqldb); + end; +end; + +//插入一条config数据 +procedure insertConfigSql(table:string; no:Integer; nam,val:String); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + //开启事务,插入数据 + sqldb.BeginTransaction; + sql := Format('INSERT INTO [%s](id,nam,val) VALUES(%d,"%s","%s");', + [table,no,nam,String(AnsiToUtf8(val))]); + sqldb.ExecSQL(sql); + sqldb.Commit; //执行事务 + finally + FreeAndNil(sqldb); + end; +end; + +//更新一条config数据 +procedure updateConfigSql(table:string; nam,val:String); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('UPDATE [%s] SET val="%s" WHERE nam="%s";', + [table,String(AnsiToUtf8(val)),nam]); + sqldb.ExecSQL(sql); + finally + FreeAndNil(sqldb); + end; +end; + +//查询一条config数据(指定name) +function queryConfigSql(table,nam:string):string; +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //初始化返回值 + Result := ''; + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('SELECT * FROM [%s] WHERE nam="%s"',[table,nam]); + sqltb := sqldb.GetTable(sql); + if sqltb.Count>0 then + Result := Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['val'])); + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + +//查询config数据数量 +function queryConfigCnt(table,nam:string):integer; +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //初始化返回值 + //Result := 0; + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('SELECT * FROM [%s] WHERE nam="%s"',[table,nam]); + sqltb := sqldb.GetTable(sql); + Result := sqltb.Count; + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + +//-------- Grain数据库函数-------------------------------------------- +//创建 grain数据库,增加截距字段 +procedure createGrainSql(table:string); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + //建 config数据表 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + if not sqldb.TableExists(table) then begin + sql := 'CREATE TABLE [' + table + '] (' + +'[id] INTEGER PRIMARY KEY,' //id编号 + +'[cod] INTEGER NULL,' //一级分类代码 + +'[no] VARCHAR(10) NULL,' //粮种编号 + +'[nam] VARCHAR(20) NULL,' //粮种名称 + +'[coef1] VARCHAR(32) NULL,' //校准系数 + +'[coef2] VARCHAR(32) NULL,' + +'[coef3] VARCHAR(32) NULL,' + +'[coef4] VARCHAR(32) NULL,' + +'[coef5] VARCHAR(32) NULL,' + +'[intercept] VARCHAR(32) NULL,' //截距 + +'[flag] INTEGER NULL );'; //是否一级分类 + sqldb.ExecSQL(sql); + //新建索引 + sql := 'CREATE INDEX index_'+table+' ON ['+table+']([id]);'; + sqldb.ExecSQL(sql); + end; + finally + FreeAndNil(sqldb); + end; +end; + +//插入一条config数据,增加截距 +procedure insertGrainSql(table:string; cod:Integer; no,nam:String;coef1,coef2,coef3,coef4,coef5,intercept:String; flag:Integer=0); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + //开启事务,插入数据 + sqldb.BeginTransaction; + sql := Format('INSERT INTO [%s](cod,no,nam,coef1,coef2,coef3,coef4,coef5,intercept,flag) '+ + 'VALUES(%d,"%s","%s","%s","%s","%s","%s","%s","%s",%d);', + [table, + cod, + no, + String(AnsiToUtf8(nam)), + coef1, + coef2, + coef3, + coef4, + coef5, + intercept, + flag]); + sqldb.ExecSQL(sql); + sqldb.Commit; //执行事务 + finally + FreeAndNil(sqldb); + end; +end; + +//--------------------------------------------------------------------- +//通过大类nam,查询大类Cod +function queryGrainMainCodSql(table:string; nam:string):Integer; +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('select cod from [%s] where flag=1 and nam="%s";',[table,AnsiToUtf8(nam)]); + sqltb := sqldb.GetTable(sql); + Result := sqltb.FieldAsInteger(sqltb.FieldIndex['cod']); + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + +//使用nam查询一条grain数据 +//扩充一个截距参数,liliangting 2025.1.16 +function queryGrainSql(table,nam:string):TGrainRec; +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql,scod : String; + cod : Integer; +begin + //初始化返回值 + Result.Code := 0; + Result.No := ''; + Result.Name := ''; + Result.Coef[0] := '0'; + Result.Coef[1] := '0'; + Result.Coef[2] := '0'; + Result.Coef[3] := '0'; + Result.Coef[4] := '0'; + Result.Intercept := '0'; + Result.flag := false; + + //如果nam是:玉米-东北-->拆分为东北,传入真实nam + if Pos('-', nam)>0 then begin + scod:= SplitStr(nam, '-', 0); + nam := SplitStr(nam, '-', 1); + //通过大类名称查cod + cod := queryGrainMainCodSql(t_Grain, scod); + end + else begin//如果nam是:玉米,通过名称查cod + cod := queryGrainMainCodSql(t_Grain, nam); + end; + + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('SELECT * FROM [%s] WHERE nam="%s" and cod=%d;',[table,AnsiToUtf8(nam),cod]); + sqltb := sqldb.GetTable(sql); + if sqltb.Count>0 then begin + Result.Code := sqltb.FieldAsInteger(sqltb.FieldIndex['cod']); + Result.No := sqltb.FieldAsString(sqltb.FieldIndex['no']); //增加粮种编码 + Result.Name := Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam'])); + Result.Coef[0] := sqltb.FieldAsString(sqltb.FieldIndex['coef1']); + Result.Coef[1] := sqltb.FieldAsString(sqltb.FieldIndex['coef2']); + Result.Coef[2] := sqltb.FieldAsString(sqltb.FieldIndex['coef3']); + Result.Coef[3] := sqltb.FieldAsString(sqltb.FieldIndex['coef4']); + Result.Coef[4] := sqltb.FieldAsString(sqltb.FieldIndex['coef5']); + Result.Intercept := sqltb.FieldAsString(sqltb.FieldIndex['intercept']); //增加截距 + Result.flag := IntToBool(sqltb.FieldAsInteger(sqltb.FieldIndex['flag'])); //增加大类标志 + end; + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + +////////////////////////////////////////////////////////////////////////// +//使用cod查询一条grain数据 +//注意:从Cod查询粮种信息会重复,增加flag=1,仅查大类信息!!! +function queryGrainSql1(table:string; cod:Integer):TGrainRec; +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //初始化返回值 + Result.Code := 0; + Result.No := ''; + Result.Name := ''; + Result.Coef[0] := '0'; + Result.Coef[1] := '0'; + Result.Coef[2] := '0'; + Result.Coef[3] := '0'; + Result.Coef[4] := '0'; + Result.Intercept := '0'; + Result.flag := false; + + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + /////////////////////////////////////////////////////////////// + //这里的查询条件过少,查询结果大于1!!! + sql := Format('SELECT * FROM [%s] WHERE cod=%d and flag=1;',[table,cod]); + /////////////////////////////////////////////////////////////// + sqltb := sqldb.GetTable(sql); + if sqltb.Count>0 then begin + Result.Code := sqltb.FieldAsInteger(sqltb.FieldIndex['cod']); + Result.No := sqltb.FieldAsString(sqltb.FieldIndex['no']); //增加粮种编码 + Result.Name := Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam'])); + Result.Coef[0] := sqltb.FieldAsString(sqltb.FieldIndex['coef1']); + Result.Coef[1] := sqltb.FieldAsString(sqltb.FieldIndex['coef2']); + Result.Coef[2] := sqltb.FieldAsString(sqltb.FieldIndex['coef3']); + Result.Coef[3] := sqltb.FieldAsString(sqltb.FieldIndex['coef4']); + Result.Coef[4] := sqltb.FieldAsString(sqltb.FieldIndex['coef5']); + Result.Intercept := sqltb.FieldAsString(sqltb.FieldIndex['intercept']); //增加截距 + Result.flag := IntToBool(sqltb.FieldAsInteger(sqltb.FieldIndex['flag'])); //增加大类标志 + end; + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; +///////////////////////////////////////////////////////////////////////// + +//查询粮种清单 +procedure queryGrainlistSql(table:string; lb:TsListBox; flag:Integer=2); +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + if (flag=0)or(flag=1) then + sql := Format('select a.*,b.nam as codnam from [%s] a left join grain b on a.cod = b.no where a.flag=%d;',[table,flag]) + else + sql := Format('select a.*,b.nam as codnam from [%s] a left join grain b on a.cod = b.no ;',[table]); + sqltb := sqldb.GetTable(sql); + lb.Items.Clear; + while not sqltb.EOF do begin + if sqltb.FieldAsInteger(sqltb.FieldIndex['flag'])=1 then + lb.Items.Add(Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam']))) + else + lb.Items.Add(Format('%s-%s', [Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['codnam'])), + Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam']))])); + sqltb.Next; + end; + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + + +//查询最新的粮种编号no +function queryGrainCodSql(table:string):String; +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('SELECT MAX(no)+1 max_no FROM [%s];',[table]); + sqltb := sqldb.GetTable(sql); + Result := sqltb.FieldAsString(sqltb.FieldIndex['max_no']); + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + +//按粮种nam查询记录数量 +function queryGrainNumSql(table:string; nam:string; cod:Integer):Integer; +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('SELECT * FROM [%s] WHERE [nam]="%s" and [cod]=%d;',[table ,AnsiToUtf8(nam), cod]); + sqltb := sqldb.GetTable(sql); + Result := sqltb.Count; + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + +//查询粮种大类,加载到ComboBox +procedure queryGrainTypeSql(table:string; typ:Integer; cb:TComboBox); +var + sqldb : TSQLiteDatabase; + sqltb : TSQLiteTable; + sql : String; +begin + //查询table表val列 + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('SELECT nam FROM [%s] WHERE [flag]=%d order by cod asc;',[table, typ]); + sqltb := sqldb.GetTable(sql); + cb.Items.Clear; + while not sqltb.EOF do begin + cb.Items.Add(Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam']))); + sqltb.Next; + end; + cb.ItemIndex :=0; + finally + FreeAndNil(sqltb); + FreeAndNil(sqldb); + end; +end; + + +//更新一条grain数据(按名称和大类代码) +procedure updateGrainSql(table:string; rec:TGrainRec); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('UPDATE [%s] SET no="%s",coef1="%s",coef2="%s",coef3="%s",coef4="%s",coef5="%s",flag=%d WHERE nam="%s" and cod=%d;', + [table, + rec.No, + rec.Coef[0], + rec.Coef[1], + rec.Coef[2], + rec.Coef[3], + rec.Coef[4], + Integer(rec.flag), + AnsiToUtf8(rec.Name), rec.Code]); + sqldb.ExecSQL(sql); + finally + FreeAndNil(sqldb); + end; +end; + +//更新一条grain数据(按大类代码) +procedure updateGrainSql1(table:string; rec:TGrainRec); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('UPDATE [%s] SET coef1="%s",coef2="%s",coef3="%s",coef4="%s",coef5="%s" WHERE cod=%d;', + [table, + rec.Coef[0], + rec.Coef[1], + rec.Coef[2], + rec.Coef[3], + rec.Coef[4], + rec.Code]); + sqldb.ExecSQL(sql); + finally + FreeAndNil(sqldb); + end; +end; + +//更新截距参数 +procedure updateInterceptSql(table,val,name: string; cod: Integer); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('UPDATE [%s] SET intercept="%s" WHERE nam="%s" and cod=%d;', + [table, val, AnsiToUtf8(name), cod]); + sqldb.ExecSQL(sql); + finally + FreeAndNil(sqldb); + end; +end; + +//更新粮种名称 +procedure updateNameSql(table,new,nam: string; newcod,cod: Integer); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('UPDATE [%s] SET nam="%s",cod=%d WHERE nam="%s" and cod=%d;', + [table, AnsiToUtf8(new), newcod, AnsiToUtf8(nam), cod]); + sqldb.ExecSQL(sql); + finally + FreeAndNil(sqldb); + end; +end; + +//删除粮种信息--根据nam和cod删除 +procedure deleteGrainSql(table, nam: string); +var + sqldb : TSQLiteDatabase; + sql,scod : String; + cod : Integer; +begin + //如果nam是:玉米-东北-->拆分为东北,传入真实nam + if Pos('-', nam)>0 then begin + scod:= SplitStr(nam, '-', 0); + nam := SplitStr(nam, '-', 1); + //通过大类名称查cod + cod := queryGrainMainCodSql(t_Grain, scod); + end + else begin//如果nam是:玉米,通过名称查cod + cod := queryGrainMainCodSql(t_Grain, nam); + end; + + sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db'); + try + sql := Format('DELETE FROM [%s] WHERE [nam]="%s" and [cod]=%d;', [table, AnsiToUtf8(nam), cod]); + sqldb.ExecSQL(sql); + finally + FreeAndNil(sqldb); + end; +end; + +//-------- Test数据库函数-------------------------------------------- +//创建 test数据库 +procedure createTestSql(table:string); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + //建 config数据表 + sqldb := TSQLiteDatabase.Create(glAppPath + DATA_DIR + table + '.db'); + try + if not sqldb.TableExists(table) then begin + sql := 'CREATE TABLE [' + table + '] (' + +'[id] INTEGER PRIMARY KEY,' //自动编号 + +'[mod] INTEGER NULL,' //自动模式=0,手动模式=1 + +'[is_auto] INTEGER CHECK ([is_auto] IN (0, 1)),' //增加自动保存标志 + +'[tim] INTEGER NULL,' //日期时间 + +'[cod] INTEGER NULL,' //粮种代码 + +'[nam] VARCHAR(20) NULL,' //粮种名称 + +'[info] VARCHAR(50) NULL,' //样本信息 + +'[mois] FLOAT NULL,' //含水率 + //+'[ratio] FLOAT NULL,' + //+'[weight] FLOAT NULL,' + +'[temp] FLOAT NULL,' //温度 + +'[water] FLOAT NULL );'; //湿度 + sqldb.ExecSQL(sql); + //新建索引 + sql := 'CREATE INDEX index_'+table+' ON ['+table+']([id]);'; + sqldb.ExecSQL(sql); + end; + finally + FreeAndNil(sqldb); + end; +end; + +//插入一条 test数据 +procedure insertTestSql(table:string; mode,is_auto,tim,cod:Integer; nam,info:String; mois,temp,water:double); +var + sql : String; + sqldb : TSQLiteDatabase; +begin + sqldb := TSQLiteDatabase.Create(glAppPath + DATA_DIR + table + '.db'); + try + //开启事务,插入数据 + sqldb.BeginTransaction; + sql := Format('INSERT INTO [%s](mod,is_auto,tim,cod,nam,info,mois,temp,water) VALUES(%d,%d,%d,%d,"%s","%s",%.6f,%.6f,%.6f);', + [table,mode,is_auto,tim,cod,String(AnsiToUtf8(nam)),String(AnsiToUtf8(info)),mois,temp,water]); + sqldb.ExecSQL(sql); + sqldb.Commit; //执行事务 + finally + FreeAndNil(sqldb); + end; +end; + +//-------第一种全新创建config数据库的方法--------------------------------------- +//创建新的 config数据库 +procedure InitConfig(); +begin + if not FileExists(glConfig_db) then begin + //建 config数据库表 + createConfigSql(t_Config); + //初始化数据行 + insertConfigSql(t_Config,1,'StartFreq','10500'); + insertConfigSql(t_Config,2,'StopFreq','12000'); + insertConfigSql(t_Config,3,'Step','50'); + insertConfigSql(t_Config,4,'Freq','0'); + insertConfigSql(t_Config,5,'Decay','1'); + insertConfigSql(t_Config,6,'ASK','1'); + insertConfigSql(t_Config,7,'Volume','0.52'); + insertConfigSql(t_Config,8,'Tare','1040'); + //新增开机启动延时时间 + insertConfigSql(t_Config,9,'Delay','10'); + //记录日志 + log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Config])); + end; +end; + +//创建新的 conn数据库 +procedure InitConn(); +begin + if not FileExists(glConn_db) then begin + //建 config数据库表 + createConfigSql(t_Conn); + //初始化数据行 + insertConfigSql(t_Conn,1,'Ip','127.0.0.1'); + insertConfigSql(t_Conn,2,'Port','1502'); + insertConfigSql(t_Conn,3,'SerialPort','COM8'); + insertConfigSql(t_Conn,4,'Baud','115200'); + insertConfigSql(t_Conn,5,'Parity','N'); + insertConfigSql(t_Conn,6,'Data_bit','8'); + insertConfigSql(t_Conn,7,'Stop_bit','1'); + insertConfigSql(t_Conn,8,'AutoRun','false'); + insertConfigSql(t_Conn,9,'Time1','20'); + insertConfigSql(t_Conn,10,'Time2','30'); + //记录日志 + log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Conn])); + end; +end; + +//创建新的 grain数据库,增加截距 +procedure InitGrain(); +begin + if not FileExists(glGrain_db) then begin + //建 config数据库表 + createGrainSql(t_Grain); + //初始化数据行 + {insertGrainSql(t_Grain,1,'1','小麦','65.160129655062','-0.107375833331','0.000063694808','-0.000000011576','0','0',1); + insertGrainSql(t_Grain,2,'2','稻谷','-8.443205789262','0.021404282111','-0.000008683206','0.000000001917','0','0',1); + insertGrainSql(t_Grain,3,'3','黄豆','-6.204673384923','0.025161776479','0.000014765722','0.000000003440','0','0',1); + insertGrainSql(t_Grain,4,'4','玉米','-16.278037347152','0.033766686581','-0.000015923042','0.000000002881','0','0',1); } + insertGrainSql(t_Grain,1,'1','稻谷','0','0.01','0','0','0','0',1); + insertGrainSql(t_Grain,2,'2','玉米','0','0.01','0','0','0','0',1); + insertGrainSql(t_Grain,3,'3','大豆','0','0.01','0','0','0','0',1); + insertGrainSql(t_Grain,4,'4','小麦','0','0.01','0','0','0','0',1); + //记录日志 + log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Grain])); + end; +end; + +//创建新的 test数据库 +procedure InitTestDB(); +begin + if not FileExists(glData_db) then begin + //建 config数据库表 + createTestSql(t_Data); + //记录日志 + log4info(Format('系统:初始化创建 %s-存储数据库.',[t_Data])); + end; +end; + +//创建新的 重量校准数据库 +procedure InitWeight(); +begin + if not FileExists(glWeight_db) then begin + //建 weight数据库表 + createConfigSql(t_Weight); + //初始化数据行 + insertConfigSql(t_Weight,1,'k','1'); + insertConfigSql(t_Weight,2,'b','1'); + insertConfigSql(t_Weight,3,'tare','0'); + insertConfigSql(t_Weight,4,'range','0'); //误差范围 + insertConfigSql(t_Weight,5,'test1','0'); + insertConfigSql(t_Weight,6,'test2','0'); + insertConfigSql(t_Weight,7,'test3','0'); + insertConfigSql(t_Weight,8,'std1','0'); + insertConfigSql(t_Weight,9,'std2','0'); + insertConfigSql(t_Weight,10,'std3','0'); + //记录日志 + log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Weight])); + end; +end; + +//创建新的 manager 数据库 +procedure InitManager(); +begin + if not FileExists(glManager_db) then begin + //建 config数据库表 + createConfigSql(t_Manager); + //初始化数据行 + insertConfigSql(t_Manager,1,'Admin','123456'); + //记录日志 + log4info(Format('系统:初始化创建 %s-数据库.',[t_Manager])); + end; +end; + +//新建一条 grain数据 +procedure AddGrainRecord(nam:string; rec:TGrainRec); +var + no : String; +begin + if FileExists(glGrain_db) then begin + //先查询最新的cod + no := queryGrainCodSql(t_Grain); + //新增粮种数据行 + insertGrainSql(t_Grain, + GrainType_rec.Code, + no,nam, + GrainType_rec.Coef[0], + GrainType_rec.Coef[1], + GrainType_rec.Coef[2], + GrainType_rec.Coef[3], + GrainType_rec.Coef[4], + '0',0); + //记录日志 + log4info(Format('系统:数据库 [%s] 新增一条粮种信息.',[t_Grain])); + end; +end; +//------- 加载和保存各类Config配置信息----------------------------------------- +//加载各类参数结构 +procedure LoadParam(); +var + c : Char; +begin + //加载系统参数 + if FileExists(glConfig_db) then begin + SysConfig.StartFreq := StrToFloatDef(queryConfigSql(t_Config,'StartFreq'), 10500); + SysConfig.StopFreq := StrToFloatDef(queryConfigSql(t_Config,'StopFreq'), 12000); + SysConfig.Step := StrToIntDef(queryConfigSql(t_Config,'Step'), 50); + SysConfig.Freq := StrToFloatDef(queryConfigSql(t_Config,'Freq'), 0); + SysConfig.Decay := StrToFloatDef(queryConfigSql(t_Config,'Decay'), 1); + SysConfig.ASK := StrToIntDef(queryConfigSql(t_Config,'ASK'), 1); + SysConfig.Volume := StrToFloatDef(queryConfigSql(t_Config,'Volume'), 0); + SysConfig.Tare := StrToFloatDef(queryConfigSql(t_Config,'Tare'), 1000); + + //新增开机启动延时时间 + if queryConfigSql(t_Config,'Delay')='' then + insertConfigSql(t_Config,9,'Delay','10'); + SysConfig.delay := StrToIntDef(queryConfigSql(t_Config,'Delay'), 0); + + //记录日志 + log4info(Format('系统:载入 %s-系统参数 (设备参数).',[t_Config])); + end; + + //加载通讯参数 + if FileExists(glConn_db) then begin + PlcConn.ip := queryConfigSql(t_Conn,'Ip'); + PlcConn.port := StrToIntDef(queryConfigSql(t_Conn,'Port'), 1502); + WrConn.SerialPort := queryConfigSql(t_Conn,'SerialPort'); + WrConn.baud := StrToIntDef(queryConfigSql(t_Conn,'Baud'), 115200); + WrConn.data_bit := StrToIntDef(queryConfigSql(t_Conn,'Data_bit'), 8); + WrConn.stop_bit := StrToIntDef(queryConfigSql(t_Conn,'Stop_bit'), 1); + glAutoRun := StrToBoolDef(queryConfigSql(t_Conn,'AutoRun'), False); + glTime1 := StrToIntDef(queryConfigSql(t_Conn,'Time1'), 20); + glTime2 := StrToIntDef(queryConfigSql(t_Conn,'Time2'), 30); + //单独处理char类型 + CopyMemory(@c, PChar(queryConfigSql(t_Conn,'Parity')), 1); + WrConn.parity := c; + + //新增数据存储参数 + if queryConfigCnt(t_Conn, 'AutoSave')=0 then + insertConfigSql(t_Conn, 11, 'AutoSave', '0'); + if queryConfigCnt(t_Conn, 'SamplePrefix')=0 then + insertConfigSql(t_Conn, 12, 'SamplePrefix', ''); + if queryConfigCnt(t_Conn, 'SampleDir')=0 then + insertConfigSql(t_Conn, 13, 'SampleDir', ''); + if queryConfigCnt(t_Conn, 'SampleName')=0 then + insertConfigSql(t_Conn, 14, 'SampleName', ''); + smp.flag := StrToBoolDef(queryConfigSql(t_Conn,'AutoSave'), False); + smp.prefix := queryConfigSql(t_Conn,'SamplePrefix'); + smp.dir := queryConfigSql(t_Conn,'SampleDir'); + smp.info := queryConfigSql(t_Conn,'SampleName'); + + //新增心跳参数 + if queryConfigCnt(t_Conn, 'HeartIp')=0 then + insertConfigSql(t_Conn, 15, 'HeartIp', '192.168.0.200'); + PlcConn.heart_ip := queryConfigSql(t_Conn,'HeartIp'); + if queryConfigCnt(t_Conn, 'HeartPort')=0 then + insertConfigSql(t_Conn, 16, 'HeartPort', '8868'); + PlcConn.heart_port := StrToIntDef(queryConfigSql(t_Conn,'HeartPort'), 8868); + + //记录日志 + log4info(Format('系统:载入 %s-系统参数 (扦捡系统、水分仪、存储参数).',[t_Conn])); + end; + + //加载粮种校准系数 + if FileExists(glGrain_db) then begin + Grain := queryGrainSql(t_Grain,'小麦'); + log4info(Format('系统:载入 %s-粮种参数 (粮种代码、名称、校准系数).',[t_Grain])); + end; + + //加载重量校准系数 + if FileExists(glWeight_db) then begin + Wg.k := StrToFloatDef(queryConfigSql(t_Weight,'k'), 1); + Wg.b := StrToFloatDef(queryConfigSql(t_Weight,'b'), 1); + Wg.tare := StrToFloatDef(queryConfigSql(t_Weight,'tare'), 0); + Wg.range := StrToFloatDef(queryConfigSql(t_Weight,'range'), 0); + Wg.test1 := StrToFloatDef(queryConfigSql(t_Weight,'test1'),0); + Wg.test2 := StrToFloatDef(queryConfigSql(t_Weight,'test2'),0); + Wg.test3 := StrToFloatDef(queryConfigSql(t_Weight,'test3'),0); + Wg.std1 := StrToFloatDef(queryConfigSql(t_Weight,'std1'), 0); + Wg.std2 := StrToFloatDef(queryConfigSql(t_Weight,'std2'), 0); + Wg.std3 := StrToFloatDef(queryConfigSql(t_Weight,'std3'), 0); + //记录日志 + log4info(Format('系统:载入 %s-系统参数 (y=kx+b).',[t_Weight])); + end; + + //加载登录口令 + if FileExists(glManager_db) then begin + SysConfig.password := queryConfigSql(t_Manager,'Admin'); + //记录日志 + log4info(Format('系统:载入 %s-管理参数 (手动模式口令).',[t_Manager])); + end; + //调试参数 + //showmessage(Format('PLC IP: %s:%d',[plcconn.ip, plcconn.prot])); + //showmessage(Format('Wr :%s,%d,%s,%d,%d',[wrconn.SerialPort,wrconn.baud,wrconn.parity,wrconn.data_bit,wrconn.stop_bit])); +end; + +//保存各类参数结构 +procedure SaveParam(); +begin + //保存系统参数 + if FileExists(glConfig_db) then begin + updateConfigSql(t_Config,'StartFreq',FloatToStr(SysConfig.StartFreq)); + updateConfigSql(t_Config,'StopFreq',FloatToStr(SysConfig.StopFreq)); + updateConfigSql(t_Config,'Step', IntToStr(SysConfig.Step)); + updateConfigSql(t_Config,'Freq',FloatToStr(SysConfig.Freq)); + updateConfigSql(t_Config,'Decay',FloatToStr(SysConfig.Decay)); + updateConfigSql(t_Config,'ASK', IntToStr(SysConfig.ASK)); + updateConfigSql(t_Config,'Volume',FloatToStr(SysConfig.Volume)); + updateConfigSql(t_Config,'Tare',FloatToStr(SysConfig.Tare)); + updateConfigSql(t_Config,'Delay', IntToStr(SysConfig.delay)); + //记录日志 + log4info(Format('系统:保存 %s-系统参数 (设备参数).',[t_Config])); + end; + //保存通讯参数 + if FileExists(glConn_db) then begin + updateConfigSql(t_Conn,'Ip',PlcConn.ip); + updateConfigSql(t_Conn,'Port',IntToStr(PlcConn.port)); + updateConfigSql(t_Conn,'HeartIp',PlcConn.heart_ip); + updateConfigSql(t_Conn,'HeartPort',IntToStr(PlcConn.heart_port)); + updateConfigSql(t_Conn,'SerialPort',WrConn.SerialPort); + updateConfigSql(t_Conn,'Baud',IntToStr(WrConn.baud)); + updateConfigSql(t_Conn,'Parity',WrConn.Parity); + updateConfigSql(t_Conn,'Data_bit',IntToStr(WrConn.Data_bit)); + updateConfigSql(t_Conn,'Stop_bit',IntToStr(WrConn.Stop_bit)); + updateConfigSql(t_Conn,'AutoRun',BoolToString(glAutoRun)); + updateConfigSql(t_Conn,'Time1',IntToStr(glTime1)); + updateConfigSql(t_Conn,'Time2',IntToStr(glTime2)); + //增加数据存储参数 + updateConfigSql(t_Conn,'AutoSave',BoolToString(smp.flag)); + updateConfigSql(t_Conn,'SamplePrefix',smp.prefix); + updateConfigSql(t_Conn,'SampleDir', smp.dir); + updateConfigSql(t_Conn,'SampleName', smp.info); + //记录日志 + log4info(Format('系统:保存 %s-系统参数 (扦捡系统、水分仪、存储参数).',[t_Conn])); + end; + + //保存登录口令 + if FileExists(glManager_db) then begin + updateConfigSql(t_Manager,'Admin',SysConfig.password); + //记录日志 + log4info(Format('系统:保存 %s-管理参数 (手动模式口令).',[t_Manager])); + end; + + //保存重量系数 + SaveWgParam(); +end; + +//保存重量参数 +procedure SaveWgParam(); +begin + //保存重量系数 + if FileExists(glWeight_db) then begin + updateConfigSql(t_Weight,'k',FloatToStr(Wg.k)); + updateConfigSql(t_Weight,'b',FloatToStr(Wg.b)); + updateConfigSql(t_Weight,'tare',FloatToStr(Wg.tare)); + updateConfigSql(t_Weight,'range',FloatToStr(Wg.range)); + updateConfigSql(t_Weight,'test1',FloatToStr(Wg.test1)); + updateConfigSql(t_Weight,'test2',FloatToStr(Wg.test2)); + updateConfigSql(t_Weight,'test3',FloatToStr(Wg.test3)); + updateConfigSql(t_Weight,'std1',FloatToStr(Wg.std1)); + updateConfigSql(t_Weight,'std2',FloatToStr(Wg.std2)); + updateConfigSql(t_Weight,'std3',FloatToStr(Wg.std3)); + + //记录日志 + log4info(Format('系统:保存 %s-参数 (y=kx+b).',[t_Weight])); + end; +end; + +//保存校准参数到数据库 +procedure SaveVerifyParam(); +begin + //保存粮种关联的校准系数 + if FileExists(glGrain_db) then begin + //修改大类时,小类同步刷新,反之不改! + if Grain.flag then + updateGrainSql1(t_Grain, Grain) + else + updateGrainSql(t_Grain, Grain); + log4info(Format('系统:保存 %s-粮种参数 (五个校准系数).',[t_Grain])); + end; +end; + +//保存截距参数到数据库 +procedure SaveInterceptParam(val:string); +begin + //grain.db新增一列,用于保存截距参数 + if FileExists(glGrain_db) then begin + updateInterceptSql(t_Grain,val,Grain.Name,Grain.Code); + log4info(Format('系统:保存截距参数-[%s] 到 [%s]粮种信息.',[val, Grain.Name])); + end; +end; + +end. -- Gitblit v1.9.3