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/uMain.~pas | 1521 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,521 insertions(+), 0 deletions(-) diff --git a/src/uMain.~pas b/src/uMain.~pas new file mode 100644 index 0000000..e9ae4db --- /dev/null +++ b/src/uMain.~pas @@ -0,0 +1,1521 @@ +{------------------------------------------------------------------------------} +{单元名称:uMain.pas } +{模块名称:主进程,负责人机交互界面 } +{模块功能:包含自动检验和手动检验两种模式。 } +{ 1.自动检验时,切换自动界面,锁定手动操作,接受PLC指令,反馈检验结果 } +{ 2.手动检验时,分为检验、分析、校准、设置四个功能模块 } +{建立日期:2023-10-24 } +{修改修改:2024-11-22 } +{版权所有:李良庭 liangtingli@outlook.com } +{------------------------------------------------------------------------------} +//2024-07-08 开启主窗体刷新模式,防止PageControl切换时Image闪烁 +//2024-10-14 增加gmmdata数据库,用来存储自动检测和手动检测的所有数据。 +//2024-11-22 临时去掉License授权,供测试用。 + +unit uMain; + +interface + +{$WARN UNIT_PLATFORM OFF} +{$WARN SYMBOL_PLATFORM OFF} + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, jpeg, ExtCtrls, ComCtrls, XPMan, StdCtrls, Buttons, sBitBtn, + pngimage, sLabel, iComponent, iVCLComponent, iCustomComponent, StrUtils, + iSevenSegmentDisplay, iSevenSegmentClock, iSevenSegmentCharacter, + iSevenSegmentInteger, acImage, iOdometer, sEdit, sListBox, + iPlotComponent, iPlot, sComboBox, acPNG, acArcControls, + DateUtils, PubUtils, ActuatorLib, + // Unit 'FileCtrl' is specific to platform (Windows) + FileCtrl; + +type + TfrmMain = class(TForm) + pc: TPageControl; + tsAuto: TTabSheet; + tsManual: TTabSheet; + tsAnalyse: TTabSheet; + tsStandard: TTabSheet; + tsSetting: TTabSheet; + tsSystem: TTabSheet; + imgBG: TImage; + imgBG1: TImage; + btnAuto: TsBitBtn; + btnManual: TsBitBtn; + sLabel1: TsLabel; + imgLogo: TImage; + ssClock: TiSevenSegmentClock; + ssYear: TiSevenSegmentInteger; + iSevenSegmentCharacter1: TiSevenSegmentCharacter; + ssMonth: TiSevenSegmentInteger; + iSevenSegmentCharacter2: TiSevenSegmentCharacter; + ssDay: TiSevenSegmentInteger; + sBitBtn1: TsBitBtn; + sBitBtn2: TsBitBtn; + ssYear1: TiSevenSegmentInteger; + iSevenSegmentCharacter3: TiSevenSegmentCharacter; + ssMonth1: TiSevenSegmentInteger; + iSevenSegmentCharacter4: TiSevenSegmentCharacter; + ssDay1: TiSevenSegmentInteger; + ssClock1: TiSevenSegmentClock; + imgLogo1: TImage; + sLabel2: TsLabel; + lblAutoInfo: TsLabel; + btnTest: TsBitBtn; + sBitBtn4: TsBitBtn; + sBitBtn5: TsBitBtn; + sBitBtn6: TsBitBtn; + tsTest: TTabSheet; + imgBar1: TImage; + imgBar2: TImage; + imgBar3: TImage; + imgBar4: TImage; + btnReturn: TsBitBtn; + imgInfo: TsImage; + sLabel4: TsLabel; + edtMoisture: TsEdit; + sLabel5: TsLabel; + edtWeightRatio: TsEdit; + edtWeight: TsEdit; + sLabel10: TsLabel; + edtTemp: TsEdit; + sLabel11: TsLabel; + sLabel12: TsLabel; + edtWater: TsEdit; + sLabel13: TsLabel; + sLabel14: TsLabel; + mtManClock: TiOdometer; + sLabel15: TsLabel; + lbType: TsListBox; + btnManTest: TsBitBtn; + sLabel16: TsLabel; + sLabel17: TsLabel; + sLabel18: TsLabel; + sLabel19: TsLabel; + plDisplay: TPanel; + iPlot1: TiPlot; + sLabel20: TsLabel; + edtTest1: TsEdit; + sLabel22: TsLabel; + sLabel23: TsLabel; + edtAutoCoef1: TsEdit; + sLabel24: TsLabel; + btnComp: TsBitBtn; + btnSave: TsBitBtn; + btnSwitchCoef: TsBitBtn; + btnVerify1: TsBitBtn; + sLabel25: TsLabel; + edtMois2: TsEdit; + edtAutoCoef2: TsEdit; + btnVerify2: TsBitBtn; + edtTest2: TsEdit; + sLabel26: TsLabel; + edtMois3: TsEdit; + edtAutoCoef3: TsEdit; + btnVerify3: TsBitBtn; + edtTest3: TsEdit; + sLabel27: TsLabel; + edtMois4: TsEdit; + edtAutoCoef4: TsEdit; + btnVerify4: TsBitBtn; + edtTest4: TsEdit; + sLabel28: TsLabel; + edtMois5: TsEdit; + edtAutoCoef5: TsEdit; + btnVerify5: TsBitBtn; + edtTest5: TsEdit; + sLabel29: TsLabel; + sLabel30: TsLabel; + edtVolume: TsEdit; + sLabel31: TsLabel; + sLabel32: TsLabel; + edtTare: TsEdit; + sLabel33: TsLabel; + btnSetting: TsBitBtn; + edtFreq: TsEdit; + edtDecay: TsEdit; + sLabel36: TsLabel; + sLabel37: TsLabel; + sLabel38: TsLabel; + edtStartFreq: TsEdit; + sLabel39: TsLabel; + sLabel40: TsLabel; + edtStopFreq: TsEdit; + sLabel41: TsLabel; + sLabel42: TsLabel; + edtStep: TsEdit; + sLabel43: TsLabel; + sLabel34: TsLabel; + sBitBtn7: TsBitBtn; + sBitBtn8: TsBitBtn; + sBitBtn9: TsBitBtn; + lbASK: TsListBox; + imgBottom1: TImage; + imgBottom2: TImage; + imgBottom3: TImage; + imgBottom4: TImage; + sLabel3: TsLabel; + lbType1: TsListBox; + edtManCoef1: TsEdit; + edtManCoef2: TsEdit; + edtManCoef3: TsEdit; + edtManCoef4: TsEdit; + edtManCoef5: TsEdit; + Bevel1: TBevel; + imgQuit: TsImage; + sBitBtn3: TsBitBtn; + imgBarSystem: TImage; + sLabel35: TsLabel; + sImage1: TsImage; + sImage2: TsImage; + edtMois1: TsEdit; + lblAutoRet: TsLabel; + lblAutoRet_error: TsLabel; + mtAutoClock: TiOdometer; + sLabel44: TsLabel; + lblManTest: TsLabel; + GroupBox1: TGroupBox; + GroupBox2: TGroupBox; + sLabel45: TsLabel; + edtIP: TsEdit; + edtPort: TsEdit; + sLabel47: TsLabel; + edtBaud: TsEdit; + cbSerialPort: TsComboBox; + sLabel48: TsLabel; + edtParity: TsEdit; + sLabel49: TsLabel; + sLabel50: TsLabel; + edtData_bit: TsEdit; + sLabel51: TsLabel; + edtStop_bit: TsEdit; + btnSaveInfo: TsBitBtn; + mtVerifyClock: TiOdometer; + lblVerify: TsLabel; + sLabel21: TsLabel; + Bevel2: TBevel; + GroupBox3: TGroupBox; + cbAutoRun: TCheckBox; + btnReset: TsBitBtn; + GroupBox4: TGroupBox; + sLabel52: TsLabel; + sLabel53: TsLabel; + edtTime1: TsEdit; + edtTime2: TsEdit; + sLabel54: TsLabel; + tsWeight: TTabSheet; + sBitBtn10: TsBitBtn; + Image1: TImage; + sLabel55: TsLabel; + sBitBtn11: TsBitBtn; + sBitBtn12: TsBitBtn; + Image2: TImage; + sLabel56: TsLabel; + sLabel57: TsLabel; + sLabel58: TsLabel; + sLabel59: TsLabel; + edtWTest1: TsEdit; + edtWTest2: TsEdit; + edtWTest3: TsEdit; + btnWeightCoef1: TsBitBtn; + btnWeightCoef2: TsBitBtn; + btnWeightCoef3: TsBitBtn; + sLabel60: TsLabel; + edtWeight1: TsEdit; + edtWeight2: TsEdit; + edtWeight3: TsEdit; + Bevel3: TBevel; + lblWeightCoef: TsLabel; + sLabel63: TsLabel; + sBitBtn13: TsBitBtn; + GroupBox5: TGroupBox; + sLabel61: TsLabel; + edtWTare: TsEdit; + sLabel62: TsLabel; + edtRange: TsEdit; + btnTareSet: TsBitBtn; + sLabel64: TsLabel; + edtWTest: TsEdit; + sBitBtn14: TsBitBtn; + cbDebug: TCheckBox; + lblAutoInfo1: TsLabel; + imgLink: TsImage; + sImage3: TsImage; + GroupBox6: TGroupBox; + sLabel65: TsLabel; + edtPassword: TsEdit; + sLabel66: TsLabel; + edtDelay: TsEdit; + sLabel67: TsLabel; + lblVersion: TsLabel; + sBitBtn15: TsBitBtn; + tsMaintain: TTabSheet; + Image3: TImage; + sLabel68: TsLabel; + sBitBtn16: TsBitBtn; + lblMaintain: TsLabel; + Bevel4: TBevel; + sBitBtn18: TsBitBtn; + sBitBtn19: TsBitBtn; + sBitBtn20: TsBitBtn; + sBitBtn21: TsBitBtn; + sBitBtn22: TsBitBtn; + sBitBtn23: TsBitBtn; + sBitBtn24: TsBitBtn; + sBitBtn25: TsBitBtn; + sBitBtn26: TsBitBtn; + Bevel5: TBevel; + cbTestAutoSave: TCheckBox; + sLabel6: TsLabel; + edtSampleName: TsEdit; + cbAutoSave: TCheckBox; + sLabel7: TsLabel; + edtPrefix: TEdit; + edtDir: TEdit; + btnDir: TsBitBtn; + btnOSK: TsBitBtn; + sBitBtn28: TsBitBtn; + sImage4: TsImage; + sImage5: TsImage; + sBitBtn17: TsBitBtn; + sBitBtn27: TsBitBtn; + tsIntercept: TTabSheet; + Image4: TImage; + sLabel8: TsLabel; + sBitBtn29: TsBitBtn; + Image5: TImage; + sLabel9: TsLabel; + edtInter1: TsEdit; + edtInter2: TsEdit; + edtInter3: TsEdit; + btnInter1: TsBitBtn; + btnInter2: TsBitBtn; + btnInter3: TsBitBtn; + sLabel46: TsLabel; + edtManVal: TsEdit; + sLabel69: TsLabel; + edtIntercept: TsEdit; + btnCopm1: TsBitBtn; + btnSave1: TsBitBtn; + sLabel70: TsLabel; + lbType2: TsListBox; + sLabel71: TsLabel; + mtInterClock: TiOdometer; + Bevel6: TBevel; + lblInter: TsLabel; + btnAdd: TsBitBtn; + btnDel: TsBitBtn; + sBitBtn30: TsBitBtn; + btnModfy: TsBitBtn; + sLabel72: TsLabel; + sLabel73: TsLabel; + sLabel74: TsLabel; + sLabel75: TsLabel; + sLabel76: TsLabel; + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure btnAutoClick(Sender: TObject); + procedure btnTestClick(Sender: TObject); + procedure btnReturnClick(Sender: TObject); + procedure edtMois1Click(Sender: TObject); + procedure imgInfoClick(Sender: TObject); + procedure imgQuitClick(Sender: TObject); + procedure edtMoistureKeyPress(Sender: TObject; var Key: Char); + procedure btnManTestClick(Sender: TObject); + procedure btnSettingClick(Sender: TObject); + procedure btnVerify1Click(Sender: TObject); + procedure btnCompClick(Sender: TObject); + procedure lbTypeClick(Sender: TObject); + procedure lbType1Click(Sender: TObject); + procedure btnSaveInfoClick(Sender: TObject); + procedure btnSaveClick(Sender: TObject); + procedure btnSwitchCoefClick(Sender: TObject); + procedure btnResetClick(Sender: TObject); + procedure btnWeightCoef1Click(Sender: TObject); + procedure btnTareSetClick(Sender: TObject); + procedure sBitBtn11Click(Sender: TObject); + procedure sBitBtn12Click(Sender: TObject); + procedure sBitBtn13Click(Sender: TObject); + procedure sBitBtn10Click(Sender: TObject); + procedure sBitBtn14Click(Sender: TObject); + procedure imgLinkClick(Sender: TObject); + procedure sBitBtn3Click(Sender: TObject); + procedure sBitBtn15Click(Sender: TObject); + procedure sBitBtn18Click(Sender: TObject); + procedure sBitBtn19Click(Sender: TObject); + procedure btnOSKClick(Sender: TObject); + procedure btnDirClick(Sender: TObject); + procedure sImage4Click(Sender: TObject); + procedure sBitBtn17Click(Sender: TObject); + procedure sBitBtn27Click(Sender: TObject); + procedure btnInter1Click(Sender: TObject); + procedure lbType2Click(Sender: TObject); + procedure btnCopm1Click(Sender: TObject); + procedure btnSave1Click(Sender: TObject); + procedure btnAddClick(Sender: TObject); + procedure btnDelClick(Sender: TObject); + procedure btnModfyClick(Sender: TObject); + protected + procedure CreateParams(var Params: TCreateParams); override; + private + { Private declarations } + public + { Public declarations } + sLoginPwd : String; //手动模式返回口令 + function ConnPlcAndWr():Integer; //连接设备,返回连接状态 + procedure DisconnPlcAndWr(); //断开设备 + procedure StartTest(flag:Boolean); //自动/手动检测 + procedure ShowCalc(edt:TsEdit; index:Integer); //动态创建计算器 + procedure ManLogin_ShowCalc(x,y:Integer); //手动模式专用口令框 + procedure SetResetUI(flag:boolean); + end; + +var + frmMain: TfrmMain; + +implementation + +uses + Global, MsgVar, log4me, uDM, uInit, uCalc, uSaveData, uTablet, + testThread, mantestThread, verifyThread, grainThread, interceptThread, + resetThread; + +var + TestThread : TTestThread; //自动检测线程 + ManTestThread : TManTestThread; //手动检测线程 + VerifyThread : TVerifyThread; //校准检测线程 + GrainThread : TGrainThread; //下发粮种线程 + InterceptThread : TInterceptThread; //调整截距线程 + ResetThread : TResetThread; //仪器复位线程 + +{$R *.dfm} +//------- 专用函数 ------------------------------------------------------------- +//开启主窗体刷新模式,防止PageControl切换时Image闪烁 +procedure TfrmMain.CreateParams(var Params: TCreateParams); +begin + inherited; + Params.ExStyle := 33554432; //0x 02 00 00 00 +end; + +//------- 自定义函数 ----------------------------------------------------------- +//连接水分仪和PLC设备 +//返回值:0-连接成功 +// 1-PLC连接失败 +// 2-Wr 连接失败 +// 3-PLC和Wr 连接失败 +function TfrmMain.ConnPlcAndWr():Integer; +begin + //连接水分仪和PLC设备 + hPlcDev := CreatePlcDevice(PChar(PlcConn.ip), PlcConn.port); + hWrDev := CreateWrDevice(PChar(WrConn.SerialPort), WrConn.baud, WrConn.parity, WrConn.data_bit, WrConn.stop_bit); + //连接设备并显示 + result := 0; + if ConnectDevice(hPlcDev)<0 then result := 1; + if ConnectDevice(hWrDev)<0 then result := result + 2; + //更新界面,记录日志 + if result=0 then begin + lblAutoRet_error.Caption := ''; + log4info(Format('连接:PLC和水分仪设备连接成功,返回值=[%d].',[result])); + end + else begin + if result=1 then + lblAutoRet_error.Caption := 'PLC连接失败!' + else if result=2 then + lblAutoRet_error.Caption := '水分仪连接失败!' + else + lblAutoRet_error.Caption := 'PLC、水分仪连接失败!'; + log4error(Format('错误:%s 返回值=[%d].',[lblAutoRet_error.Caption, result])); + end; +end; + +//断开水分仪和PLC设备 +procedure TfrmMain.DisconnPlcAndWr(); +begin + //断开设备 + Disconnect(hPlcDev); + Disconnect(hWrDev); + //销毁设备 + DestroyDevice(hPlcDev); + DestroyDevice(hWrDev); + log4info('销毁:关闭 PLC和水分仪设备句柄!'); +end; + +//自定义函数:自动/手动连接设备 +//自动检测时,启动线程AutoTest() +//手动检测时,销毁线程,等待操作 +//注意:连接设备放在主进程初始化时完成!!! +procedure TfrmMain.StartTest(flag:Boolean); +begin + //开启自动检测模式 + if flag then begin + //更新信息 + lblAutoInfo.Caption := '设备已就绪,请等待......'; + log4info('模式:切换自动检测模式!'); + //启动检测 + if m_TestThread=0 then begin + TestThread := TTestThread.Create(); + m_TestThread := TestThread.Handle; + log4info('模式:自动检测模式,启动 TestThread()线程!'); + end; + end + //切换到手动模式,销毁线程 + else begin + log4info('模式:切换手动检测模式!'); + if m_TestThread<>0 then begin + TestThread.Terminate; + log4info('模式:手动检测模式,停止 TestThread()线程,准备手动操作!'); + end; + end; +end; + +//------- 界面初始化 ----------------------------------------------------------- +procedure TfrmMain.FormCreate(Sender: TObject); +begin + InitGlobal(); //初始化全局变量 + InitSystemDir(); //建立系统文件夹 + InitDatas(); //初始化采集数据结构 + InitConfig(); //创建config参数数据库 + InitConn(); //创建conn通讯数据库 + InitGrain(); //创建grain粮种数据库 + InitTestDB(); //创建test存储数据库 + InitWeight(); //创建weight重量校准数据 + InitManager(); //创建manager管理口令数据库 + LoadParam(); //装载config、conn、grain、wiehgit、manager参数 + LoadSystemInfo(); //装载system参数 + + //获取软件版权信息 + GetVersionInfo(Application.ExeName); + + //调整人机界面最大化 + if (Screen.Width<=1024)and(Screen.Height<=768) then begin + frmMain.BorderStyle := bsNone; + frmMain.WindowState := wsmaximized; + end; +end; + +procedure TfrmMain.FormShow(Sender: TObject); +var + i : Integer; +begin + //根据启动延时参数,推迟启动时间 + Sleep(SysConfig.delay * 1000); + + //初始化pc页面,默认显示扫描页面 + for i := 0 to pc.PageCount - 1 do + pc.Pages[i].TabVisible := False; + pc.ActivePage := tsAuto; + //加载授权检查模块 + //测试版本,注释软件授权功能 + //RegCheckMode(); + + //加载参数到界面 + LoadOptions(); + //连接水分仪和PLC设备 + log4info('模式:开启自动检测模式!'); + glConn_err := ConnPlcAndWr(); + //连接成功时,开启自动模式 + //不管plc和wr连接是否失败,都开启自动检测线程,liliangting2025.1.17 + //if glConn_err = 0 then + StartTest(true); +end; + +procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); +begin + //销毁设备 + DisconnPlcAndWr(); +end; + +//------- 切换自动--手动模式---------------------------------------------------- +//切换自动模式 +procedure TfrmMain.btnAutoClick(Sender: TObject); +begin + case TsBitBtn(Sender).Tag of + 1:begin//自动模式 + pc.ActivePage := tsAuto; + //开启自动线程 + if glConn_err = 0 then + StartTest(true); + end; + 2:begin//手动模式 + //先验证口令,正确才允许切换 + ManLogin_ShowCalc(300,250); + //销毁自动检测线程 + if sLoginPwd=SysConfig.password then begin + pc.ActivePage := tsManual; + StartTest(false); + end; + end; + end; +end; + +//手动模式导航按钮 +procedure TfrmMain.btnTestClick(Sender: TObject); +begin + case TsBitBtn(Sender).Tag of + 3:begin//检测 + pc.ActivePage := tsTest; + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType); + end; + 4:begin//分析 + pc.ActivePage := tsAnalyse; + end; + 5:begin//校准 + pc.ActivePage := tsStandard; + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType1); + end; + 6:begin//设置 + pc.ActivePage := tsSetting; + end; + end; +end; + +//返回手动模式--首页 +procedure TfrmMain.btnReturnClick(Sender: TObject); +begin + pc.ActivePage := tsManual; +end; + +//返回自动模式--首页 +procedure TfrmMain.sBitBtn3Click(Sender: TObject); +begin + pc.ActivePage := tsTest; +end; + +//切换到系统页面 +procedure TfrmMain.imgInfoClick(Sender: TObject); +begin + //先验证口令,正确才允许进入 + ManLogin_ShowCalc(300,250); + //销毁自动检测线程 + if sLoginPwd=SysConfig.password then + pc.ActivePage := tsSystem; +end; + +//手动连接设备 +procedure TfrmMain.imgLinkClick(Sender: TObject); +begin + //提示信息 + lblAutoInfo.Caption := '设备正在重连,请等待......'; + log4info('模式:手动重连 PLC和水分仪设备......'); + //销毁设备 + DisconnPlcAndWr(); + //连接水分仪和PLC设备 + glConn_err := ConnPlcAndWr(); + //连接成功时,开启自动模式 + if glConn_err = 0 then + StartTest(true); +end; + +//退出上位机 +procedure TfrmMain.imgQuitClick(Sender: TObject); +begin + close(); +end; + +//------- 校准功能 ------------------------------------------------------------- +//从仪器校准跳转到重量校准 +procedure TfrmMain.sBitBtn13Click(Sender: TObject); +begin + pc.ActivePage := tsWeight; + //更新当前公式 + if Wg.b>0 then + lblWeightCoef.Caption := Format('校准公式 Y = %.4fX + %.4f,误差±%.4f !', [Wg.k,Wg.b,Wg.range]) + else + lblWeightCoef.Caption := Format('校准公式 Y = %.4fX - %.4f,误差±%.4f !', [Wg.k,Abs(Wg.b),Wg.range]); + //更新界面 + edtWTare.Text := FloatToStr(Wg.tare); + edtRange.Text := FloatToStr(Wg.range); +end; + +//计算截距 +procedure TfrmMain.sBitBtn27Click(Sender: TObject); +begin + pc.ActivePage := tsIntercept; + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType2); +end; + +//返回仪器校准 +procedure TfrmMain.sBitBtn10Click(Sender: TObject); +begin + pc.ActivePage := tsStandard; + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType1); + sLabel3.Caption := '粮食种类'; +end; + +//------- Edit输入区 ----------------------------------------------------------- +//公共函数:动态创建计算器 +procedure TfrmMain.ShowCalc(edt:TsEdit; index:Integer); +var + p : TPoint; +begin + frmCalc := TfrmCalc.Create(Application); //创建动态窗体 + frmCalc.strParam := edt.Text; //传入修改值 + p := GetCurrMsgPos(index); //计算输入框坐标 + frmCalc.Left := p.x; //修改计算器坐标 + frmCalc.Top := p.y; + frmCalc.ShowModal; //模态窗口显示calc +end; + +//手动登录专用输入框 +procedure TfrmMain.ManLogin_ShowCalc(x,y:Integer); +begin + frmCalc := TfrmCalc.Create(Application); //创建动态窗体 + frmCalc.strParam := ''; //传入修改值 + frmCalc.Left := frmMain.Left + x; //修改计算器坐标 + frmCalc.Top := frmMain.Top + y; + glCurrFocus := 0; //焦点编号-->frmMain.sLoginPwd + frmCalc.ShowModal; //模态窗口显示calc +end; + +//确定输入Edit编号,定位键盘显示位置,弹出小键盘 +procedure TfrmMain.edtMois1Click(Sender: TObject); +begin + case TsEdit(Sender).Tag of + 1:begin + glCurrFocus := 1; //设置Edit焦点编号 + ShowCalc(edtMois1, glCurrFocus); //显示小键盘 + end; + 2:begin + glCurrFocus := 2; + ShowCalc(edtMois2, glCurrFocus); + end; + 3:begin + glCurrFocus := 3; + ShowCalc(edtMois3, glCurrFocus); + end; + 4:begin + glCurrFocus := 4; + ShowCalc(edtMois4, glCurrFocus); + end; + 5:begin + glCurrFocus := 5; + ShowCalc(edtMois5, glCurrFocus); + end; + 6:begin + glCurrFocus := 6; + ShowCalc(edtManCoef1, glCurrFocus); + end; + 7:begin + glCurrFocus := 7; + ShowCalc(edtManCoef2, glCurrFocus); + end; + 8:begin + glCurrFocus := 8; + ShowCalc(edtManCoef3, glCurrFocus); + end; + 9:begin + glCurrFocus := 9; + ShowCalc(edtManCoef4, glCurrFocus); + end; + 10:begin + glCurrFocus := 10; + ShowCalc(edtManCoef5, glCurrFocus); + end; + 11:begin + glCurrFocus := 11; + ShowCalc(edtIp, glCurrFocus); + end; + 12:begin + glCurrFocus := 12; + ShowCalc(edtPort, glCurrFocus); + end; + 13:begin + glCurrFocus := 13; + ShowCalc(edtTime1, glCurrFocus); + end; + 14:begin + glCurrFocus := 14; + ShowCalc(edtTime2, glCurrFocus); + end; + 15:begin + glCurrFocus := 15; + ShowCalc(edtWeight1, glCurrFocus); + end; + 16:begin + glCurrFocus := 16; + ShowCalc(edtWeight2, glCurrFocus); + end; + 17:begin + glCurrFocus := 17; + ShowCalc(edtWeight3, glCurrFocus); + end; + 18:begin + glCurrFocus := 18; + ShowCalc(edtWTare, glCurrFocus); + end; + 19:begin + glCurrFocus := 19; + ShowCalc(edtRange, glCurrFocus); + end; + 20:begin + glCurrFocus := 20; + ShowCalc(edtVolume, glCurrFocus); + end; + 21:begin + glCurrFocus := 21; + ShowCalc(edtTare, glCurrFocus); + end; + 22:begin + glCurrFocus := 22; + ShowCalc(edtDelay, glCurrFocus); + end; + 23:begin + glCurrFocus := 23; + ShowCalc(edtPassword, glCurrFocus); + end; + 24:begin//调整截距-人工含水率 + glCurrFocus := 24; //设置Edit焦点编号 + ShowCalc(edtManVal, glCurrFocus);//显示小键盘 + end; + 25:begin//调整截距-手动输入截距 + glCurrFocus := 25; + ShowCalc(edtIntercept, glCurrFocus); + end; + end; +end; + +//其他Edit设置只读,防止输入数值 +procedure TfrmMain.edtMoistureKeyPress(Sender: TObject; var Key: Char); +begin + Key := Chr(0); +end; + +//------- 手动检测 -------------------------------------- +//手动--检测,选择粮种 +procedure TfrmMain.lbTypeClick(Sender: TObject); +var + ss : string; +begin + //容错处理 + if lbType.ItemIndex<0 then exit; + + //设置线程标志 + s_Grain := 1; //1-手动检测;2-手动校准;3-调整截距 + + //检查是否在手动测试中 + if m_ManTestThread<>0 then begin + MessageBox(handle,'提示:当前正在进行含水率检测,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + lbType.ItemIndex := glCurrIndex; + exit; + end; + + //检查线程是否启动 + if m_GrainThread=0 then begin + glCurrIndex := lbType.ItemIndex; + ss := lbType.Items[glCurrIndex]; + //加载粮种校准系数 + Grain := queryGrainSql(t_Grain, ss); + //初始化界面 + edtMoisture.Clear; + edtWeightRatio.Clear; + edtWeight.Clear; + edtTemp.Clear; + edtWater.Clear; + //启动下发粮种线程 + GrainThread := TGrainThread.Create(); + m_GrainThread := GrainThread.Handle; + end + else begin + //如果线程未结束,不能强行终止,仅提示!!! + //GrainThread.Terminate; + MessageBox(handle,'提示:当前粮种下发指令尚未结束,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + lbType.ItemIndex := glCurrIndex; + end; +end; + +//手动检测含水率 +procedure TfrmMain.btnManTestClick(Sender: TObject); +begin + //先保存临时参数 + smp.flag := cbTestAutoSave.Checked; + smp.info := edtSampleName.Text; + cbAutoSave.Checked := cbTestAutoSave.Checked;//同步更新系统界面 + if FileExists(glConn_db) then begin + //增加数据存储参数 + updateConfigSql(t_Conn,'AutoSave',BoolToString(smp.flag)); + updateConfigSql(t_Conn,'SampleName', smp.info); + //记录日志 + log4info(Format('提示:手动检测时,更新 %s-样本存储参数.',[t_Conn])); + end; + + //启动手动检测线程,优化界面显示 + if (m_ManTestThread=0)and(m_VerifyThread=0)and(m_InterceptThread=0) then begin + //初始化界面 + lblManTest.Caption := '开始含水率检测.'; + edtMoisture.Clear; + edtWeightRatio.Clear; + edtWeight.Clear; + edtTemp.Clear; + edtWater.Clear; + //启动手动检测线程 + ManTestThread := TManTestThread.Create(); + m_ManTestThread := ManTestThread.Handle; + end + else begin + if m_ManTestThread<>0 then + MessageBox(handle,'提示:当前检测过程尚未结束,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + if m_VerifyThread<>0 then + MessageBox(handle,'提示:手动校准过程尚未结束,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + if m_InterceptThread<>0 then + MessageBox(handle,'提示:调整截距过程尚未结束,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + end; +end; + +//------- 手动校准 ------------------------------------------------------ +//仪器校准--选择粮种 +procedure TfrmMain.lbType1Click(Sender: TObject); +var + ss : string; +begin + //容错处理 + if lbType1.ItemIndex<0 then exit; + + //设置线程标志 + s_Grain := 2; //1-手动检测;2-手动校准;3-调整截距 + + //检查是否在手动测试中 + if m_VerifyThread<>0 then begin + MessageBox(handle,'提示:当前正在进行校准检测,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + lbType1.ItemIndex := glCurrIndex; + exit; + end; + + //检查线程是否启动 + if m_GrainThread=0 then begin + //返回值 + glCurrIndex := lbType1.ItemIndex; + ss := lbType1.Items[glCurrIndex]; + //加载粮种校准系数 + Grain := queryGrainSql(t_Grain, ss); + //启动下发粮种线程 + GrainThread := TGrainThread.Create(); + m_GrainThread := GrainThread.Handle; + end + else begin + //如果线程未结束,仅提示!!! + MessageBox(handle,'提示:当前粮种下发指令尚未结束,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + lbType1.ItemIndex := glCurrIndex; + end; +end; + +//手动检测一组电平 +procedure TfrmMain.btnVerify1Click(Sender: TObject); +begin + glBtnTag := TsBitBtn(Sender).Tag; + + //启动校准线程,优化界面显示 + if (m_VerifyThread=0)and(m_ManTestThread=0)and(m_InterceptThread=0) then begin + //初始化界面 + lblVerify.Caption := '开始校准检测.'; + //启动手动检测线程 + VerifyThread := TVerifyThread.Create(); + m_VerifyThread := VerifyThread.Handle; + end + else begin + if m_VerifyThread<>0 then + lblVerify.Caption := '当前校准过程尚未结束,请稍后再试!'; + if m_ManTestThread<>0 then + lblVerify.Caption := '手动检测过程尚未结束,请稍后再试!'; + if m_InterceptThread<>0 then + lblInter.Caption := '调整截距过程尚未结束,请稍后再试!'; + end; +end; + +//手动计算校准系数 +procedure TfrmMain.btnCompClick(Sender: TObject); +var + vccval,inputval,coef : array [0..4] of double; +begin + //填充计算条件 + vccval[0] := StrToFloat(edtTest1.Text); + vccval[1] := StrToFloat(edtTest2.Text); + vccval[2] := StrToFloat(edtTest3.Text); + vccval[3] := StrToFloat(edtTest4.Text); + vccval[4] := StrToFloat(edtTest5.Text); + inputval[0] := StrToFloat(edtMois1.Text); + inputval[1] := StrToFloat(edtMois2.Text); + inputval[2] := StrToFloat(edtMois3.Text); + inputval[3] := StrToFloat(edtMois4.Text); + inputval[4] := StrToFloat(edtMois5.Text); + //开始计算 + //Linearize(@vccval, @inputval, @coef, 3, 5); + PolyNomialFit(@vccval, @inputval, @coef, 3, 5); + //输出结果 + Grain.Coef[0] := FloatToStr(coef[0]); + Grain.Coef[1] := FloatToStr(coef[1]); + Grain.Coef[2] := FloatToStr(coef[2]); + Grain.Coef[3] := FloatToStr(coef[3]); + Grain.Coef[4] := FloatToStr(coef[4]); + edtAutoCoef1.Text := Grain.coef[0]; + edtAutoCoef2.Text := Grain.coef[1]; + edtAutoCoef3.Text := Grain.coef[2]; + edtAutoCoef4.Text := Grain.coef[3]; + edtAutoCoef5.Text := Grain.coef[4]; + //界面显示计算结束 + lblVerify.Caption := '完成仪器校准,结果输出至[自动校准系数].'; +end; + +//仪器校准--切换系数 +procedure TfrmMain.btnSwitchCoefClick(Sender: TObject); +var + s1,s2,s3,s4,s5 : string; +begin + s1 := edtManCoef1.Text; + s2 := edtManCoef2.Text; + s3 := edtManCoef3.Text; + s4 := edtManCoef4.Text; + s5 := edtManCoef5.Text; + edtManCoef1.Text := edtAutoCoef1.Text; + edtManCoef2.Text := edtAutoCoef2.Text; + edtManCoef3.Text := edtAutoCoef3.Text; + edtManCoef4.Text := edtAutoCoef4.Text; + edtManCoef5.Text := edtAutoCoef5.Text; + edtAutoCoef1.Text := s1; + edtAutoCoef2.Text := s2; + edtAutoCoef3.Text := s3; + edtAutoCoef4.Text := s4; + edtAutoCoef5.Text := s5; +end; + +//仪器校准--保存校准系数 +procedure TfrmMain.btnSaveClick(Sender: TObject); +begin + //更新Grain数据结构 + Grain.Coef[0] := edtAutoCoef1.Text; + Grain.Coef[1] := edtAutoCoef2.Text; + Grain.Coef[2] := edtAutoCoef3.Text; + Grain.Coef[3] := edtAutoCoef4.Text; + Grain.Coef[4] := edtAutoCoef5.Text; + + //保存系数 + SaveVerifyParam(); + //记录日志并弹框提示 + lblVerify.Caption := Format('保存新的校准系数到 [%s]粮种信息!',[Grain.Name]); + log4Info(Format('粮种:保存[%s]粮种信息, 代码[%d], 校准系数[%s,%s,%s,%s,%s]', + [Grain.Name, + Grain.Code, + Grain.Coef[0], + Grain.Coef[1], + Grain.Coef[2], + Grain.Coef[3], + Grain.Coef[4]])); +end; + +//------- 调整截距功能模块 ----------------------------------------------------- +//调整截距--选择粮种 +procedure TfrmMain.lbType2Click(Sender: TObject); +var + ss : string; +begin + //容错处理 + if lbType2.ItemIndex<0 then exit; + + //设置线程标志 + s_Grain := 3; //1-手动检测;2-手动校准;3-调整截距 + + //检查是否在手动测试中 + if m_InterceptThread<>0 then begin + MessageBox(handle,'提示:当前正在调整截距,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + lbType2.ItemIndex := glCurrIndex; + exit; + end; + + //检查线程是否启动 + if m_GrainThread=0 then begin + //返回值 + glCurrIndex := lbType2.ItemIndex; + ss := lbType2.Items[glCurrIndex]; + //加载粮种校准系数 + Grain := queryGrainSql(t_Grain, ss); + //启动下发粮种线程 + GrainThread := TGrainThread.Create(); + m_GrainThread := GrainThread.Handle; + end + else begin + //如果线程未结束,仅提示!!! + MessageBox(handle,'提示:当前粮种下发指令尚未结束,请稍后再试!','警告对话框',MB_OK+MB_ICONWARNING); + lbType2.ItemIndex := glCurrIndex; + end; +end; + +//调整截距--检测含水率 +procedure TfrmMain.btnInter1Click(Sender: TObject); +begin + glBtnTag1 := TsBitBtn(Sender).Tag; + + //启动调整截距线程 + if (m_VerifyThread=0)and(m_ManTestThread=0)and(m_InterceptThread=0) then begin + //初始化界面 + lblInter.Caption := Format('开始调整第 [%d] 组截距.', [glBtnTag1]); + //启动线程 + InterceptThread := TInterceptThread.Create(); + m_InterceptThread := InterceptThread.Handle; + end + else begin + if m_VerifyThread<>0 then + lblVerify.Caption := '当前校准过程尚未结束,请稍后再试!'; + if m_ManTestThread<>0 then + lblVerify.Caption := '手动检测过程尚未结束,请稍后再试!'; + if m_InterceptThread<>0 then + lblInter.Caption := '调整截距过程尚未结束,请稍后再试!'; + end; +end; + +//根据三组检测值+人工输入含水率,计算当前截距 +//计算公式:Intercept = RealMois - (M1+M2+M3)/3 +procedure TfrmMain.btnCopm1Click(Sender: TObject); +var + moisval : array [0..2] of double; + interval : double; +begin + //填充计算条件 + moisval[0] := StrToFloat(edtInter1.Text); + moisval[1] := StrToFloat(edtInter2.Text); + moisval[2] := StrToFloat(edtInter3.Text); + + //开始计算 + interval := StrToFloatDef(edtManVal.Text, 0) - ((moisval[0]+moisval[1]+moisval[2])/3); + //输出结果 + edtIntercept.Text := FloatToStr(interval); + //界面显示计算结束 + lblInter.Caption := '完成截距评估,结果为['+edtIntercept.Text+'%].'; +end; + +//保存当前截距 +procedure TfrmMain.btnSave1Click(Sender: TObject); +begin + //保存系数 + Grain.Intercept := edtIntercept.Text; + SaveInterceptParam(edtIntercept.Text); + //记录日志并弹框提示 + lblInter.Caption := Format('提示:保存新的截距参数到 [%s]粮种信息!',[Grain.Name]); + MessageBox(handle,PChar(lblInter.Caption),'保存对话框',MB_OK+MB_ICONINFORMATION); + log4Info(Format('粮种:保存 [%s] 粮种信息, 代码-[%d], 截距-[%s]', + [Grain.Name, Grain.Code, Grain.Intercept])); +end; + +//新增粮种 +procedure TfrmMain.btnAddClick(Sender: TObject); +var + nam : string; +begin +{ //创建输入对话框 + if InputQuery('新增对话框', '请输入粮种名称:.', nam) then begin + if Trim(nam)<>'' then begin + //新增粮种 + AddGrainRecord(Trim(nam)); + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType2); + end; + end; } + //启动手写输入框 + frmTablet := TfrmTablet.Create(Application); //创建动态窗体 + frmTablet.ShowModal; //模态窗口显示Tablet + nam := glInkOutput; + + //判断是否重名,是否未改名 + if Trim(nam)='' then exit; + if queryGrainNumSql(t_Grain, nam)>0 then begin + MessageBox(handle,'错误:您新增的粮种重名,请检查后重新提交!','错误对话框',MB_OK+MB_ICONERROR); + exit; + end; + + //新增粮种 + AddGrainRecord(Trim(nam)); + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType2); +end; + +//修改粮种 +procedure TfrmMain.btnModfyClick(Sender: TObject); +var + new,nam : string; +begin + //确定选中的粮种名称 + glCurrIndex := lbType2.ItemIndex; + if glCurrIndex<0 then exit; + nam := lbType2.Items[glCurrIndex]; + new := nam; + // 显示输入对话框,提示用户输入新字符串 + {if InputQuery('修改对话框', '请输入新的粮种名称:.', new) then + begin + //判断是否重名,是否未改名 + if new=nam then exit; + if Trim(new)='' then exit; + if queryGrainNumSql(t_Grain, new)>0 then begin + MessageBox(handle,'错误:您提交的粮种重名,请检查后重新提交!','错误对话框',MB_OK+MB_ICONERROR); + exit; + end; + //更新原始字符串 + updateNameSql(t_Grain, new, nam); + Grain.Name := new; + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType2); + //更新标签 + sLabel70.Caption := Format('粮食种类 - [%s]',[Grain.Name]); + end; } + //启动手写输入框 + frmTablet := TfrmTablet.Create(Application); //创建动态窗体 + frmTablet.strParam := nam; //传入修改值 + frmTablet.ShowModal; //模态窗口显示Tablet + new := glInkOutput; + //判断是否重名,是否未改名 + if new=nam then exit; + if Trim(new)='' then exit; + if queryGrainNumSql(t_Grain, new)>0 then begin + MessageBox(handle,'错误:您提交的粮种重名,请检查后重新提交!','错误对话框',MB_OK+MB_ICONERROR); + exit; + end; + //更新原始字符串 + updateNameSql(t_Grain, new, nam); + Grain.Name := new; + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType2); + //更新标签 + sLabel70.Caption := Format('粮食种类 - [%s]',[Grain.Name]); +end; + +//删除粮种 +procedure TfrmMain.btnDelClick(Sender: TObject); +var + ss,nam : string; +begin + //确定选中的粮种名称 + glCurrIndex := lbType2.ItemIndex; + if glCurrIndex<0 then exit; + nam := lbType2.Items[glCurrIndex]; + ss := Format('提示:您确定要删除 [%s] 粮种参数吗?',[nam]); + if MessageBox(handle,PChar(ss),'删除对话框',MB_YESNO+MB_ICONQUESTION)=IDYES then begin + //删除粮种 + deleteGrainSql(t_Grain, nam); + //加载粮种列表 + queryGrainlistSql(t_Grain, lbType2); + //更新标签 + sLabel70.Caption := '粮食种类'; + end; +end; + +//------- 重量校准 ------------------------------------------------------------- +//手动测试一组数据 +procedure TfrmMain.btnWeightCoef1Click(Sender: TObject); + //读取数据 + {function ReadWeight(p:Pointer; ind:Integer):double; + begin + result := 0; + if ind=1 then result := 1.12; + if ind=2 then result := 10.19; + if ind=3 then result := 100.28; + end; } +var + index : Integer; + nWeight : Word; + nWeight1: SmallInt; +begin + //获取当前Index + index := TsBitBtn(Sender).Tag; + //调用指令读取重量,强转为int + ReadWeight(hWrDev, @nWeight); + nWeight1 := SmallInt(nWeight); + //输出重量到界面 + case TsBitBtn(Sender).Tag of + 1: edtWTest1.Text := FloatToStr(nWeight1-StrToFloatDef(edtWTare.Text,0)); //去皮 + 2: edtWTest2.Text := FloatToStr(nWeight1-StrToFloatDef(edtWTare.Text,0)); + 3: edtWTest3.Text := FloatToStr(nWeight1-StrToFloatDef(edtWTare.Text,0)); + end; + //显示结果 + lblWeightCoef.Caption := Format('当前进行第 %d 组称重校准!', [index]); +end; + +//校准后测试一次重量 +procedure TfrmMain.sBitBtn14Click(Sender: TObject); +var + nWeight : Word; + nWeight1: SmallInt; + y : double; +begin + //调用指令读取重量,强转为int + ReadWeight(hWrDev, @nWeight); + nWeight1 := SmallInt(nWeight); + //按公式计算y值 + y := Wg.k * (nWeight1 - Wg.tare) + Wg.b; + edtWTest.Text := FloatToStr(y); + //显示结果 + //提示保存成功! + if Wg.b>0 then + lblWeightCoef.Caption := Format('公式 Y = %.4fX + %.4f,校准后测试 %.4fg !', [Wg.k,Wg.b,y]) + else + lblWeightCoef.Caption := Format('公式 Y = %.4fX - %.4f,校准后测试 %.4fg !', [Wg.k,Abs(Wg.b),y]); +end; + +//设置手动去皮参数 +procedure TfrmMain.btnTareSetClick(Sender: TObject); +begin + //将去皮重量存在全局重量参数中 + Wg.tare := StrToFloatDef(edtWTare.Text,0); + Wg.range:= StrToFloatDef(edtRange.Text,0); + lblWeightCoef.Caption := Format('设置校准参数--去皮 %.4fg,误差范围 ±%.2f', [Wg.tare,Wg.range]); +end; + +//计算重量校准系数 +procedure TfrmMain.sBitBtn11Click(Sender: TObject); +var + std1,std2,std3 : double; + test1,test2,test3 : double; + y3, nK, nB : double; + range : double; //误差范围 +begin + //设置误差范围 + range := StrToFloatDef(edtRange.Text,0); + //保存实际重量 + std1 := StrToFloatDef(edtWeight1.Text,0); + std2 := StrToFloatDef(edtWeight2.Text,0); + std3 := StrToFloatDef(edtWeight3.Text,0); + test1 := StrToFloatDef(edtWTest1.Text,0); + test2 := StrToFloatDef(edtWTest2.Text,0); + test3 := StrToFloatDef(edtWTest3.Text,0); + //计算校准系数k、b,校验误差范围 + //公式 y=kx+b + nK := (std2 - std1)/(test2 - test1); + nB := std1 - nK * test1; + y3 := nK * test3 + nB; + //将k、b写入临时变量,验证偏差 + glWg_k := nK; + glWg_b := nB; + if ((y3>=std3-range) and (y3<=std3+range)) then begin + if glWg_b>0 then + lblWeightCoef.Caption := Format('Y = %.4fX + %.4f,误差±%.2f,验证通过!', [glWg_k,glWg_b,range]) + else + lblWeightCoef.Caption := Format('Y = %.4fX - %.4f,误差±%.2f,验证通过!', [glWg_k,Abs(glWg_b),range]); + end + else begin + if glWg_b>0 then + lblWeightCoef.Caption := Format('Y = %.4fX + %.4f 验证失败,未更新系数!', [glWg_k, glWg_b]) + else + lblWeightCoef.Caption := Format('Y = %.4fX - %.4f 验证失败,未更新系数!', [glWg_k, Abs(glWg_b)]); + end; +end; + +//保存重量系数 +procedure TfrmMain.sBitBtn12Click(Sender: TObject); +begin + //更新重量校准参数 + Wg.k := glWg_k; + Wg.b := glWg_b; + Wg.tare := StrToFloatDef(edtWTare.Text,0); + Wg.range:= StrToFloatDef(edtRange.Text,0); + Wg.test1 := StrToFloatDef(edtWTest1.Text,0); + Wg.test2 := StrToFloatDef(edtWTest2.Text,0); + Wg.test3 := StrToFloatDef(edtWTest3.Text,0); + Wg.std1 := StrToFloatDef(edtWeight1.Text,0); + Wg.std2 := StrToFloatDef(edtWeight2.Text,0); + Wg.std3 := StrToFloatDef(edtWeight3.Text,0); + //保存重量数据至数据库 + SaveWgParam(); + //提示保存成功! + if Wg.b>0 then + lblWeightCoef.Caption := Format('校准公式 Y = %.4fX + %.4f,误差±%.4f !', [Wg.k,Wg.b,Wg.range]) + else + lblWeightCoef.Caption := Format('校准公式 Y = %.4fX - %.4f,误差±%.4f !', [Wg.k,Abs(Wg.b),Wg.range]); +end; + +//------ 手动设置参数 --------------------------------------------------------- +//手动写参数到水分仪 +procedure TfrmMain.btnSettingClick(Sender: TObject); +var + ret : Integer; +begin + //不用初始化连接设备,直接写参数 + ret := WriteParams(hWrDev, + StrToInt(edtStartFreq.Text), + StrToInt(edtStopFreq.Text), + StrToInt(edtStep.Text), + StrToInt(edtDecay.Text), + lbASK.ItemIndex); + if ret<0 then + MessageBox(handle,'提示:向水分仪下发参数失败,请检查后重新下发!','对话框',MB_OK+MB_ICONERROR) + else begin + //保存参数到数据库 + SysConfig.StartFreq := StrToFloatDef(edtStartFreq.Text, 10500); + SysConfig.StopFreq := StrToFloatDef(edtStopFreq.Text, 12000); + SysConfig.Step := StrToIntDef(edtStep.Text, 50); + SysConfig.Freq := StrToFloatDef(edtFreq.Text, 0); + SysConfig.Decay := StrToFloatDef(edtDecay.Text, 1); + SysConfig.ASK := lbASK.ItemIndex; + SysConfig.Volume := StrToFloatDef(edtVolume.Text, 0); + SysConfig.Tare := StrToFloatDef(edtTare.Text, 1000); + //调用数据库存储函数 + SaveParam(); + //弹框提示 + MessageBox(handle, '提示:水分仪系统参数保存成功!', '保存对话框',MB_OK+MB_ICONINFORMATION); + end; +end; + +//------- 系统信息设置 --------------------------------------------------------- +//调用OSK屏幕键盘 +procedure TfrmMain.btnOSKClick(Sender: TObject); +begin + //调用osk键盘 + OpenOnScreenKeyboard(); +end; + +//选择数据保存的文件夹 +procedure TfrmMain.btnDirClick(Sender: TObject); +var + dir: string; +begin + if SelectDirectory('请选择存储文件夹','',dir) then begin + if RightStr(dir,1)='\' then + edtDir.Text := dir + else + edtDir.Text := dir + '\'; + end; +end; + +//------- 系统信息 ------------------------------------------------------------- +//保存系统信息 +procedure TfrmMain.btnSaveInfoClick(Sender: TObject); +var + c : Char; + ss : string; +begin + //把系统信息更新至全局数据结构 + PlcConn.ip := edtIP.Text; + PlcConn.port := StrToIntDef(edtPort.Text,1502); + WrConn.SerialPort := cbSerialPort.Text; + WrConn.baud := StrToIntDef(edtBaud.Text,115200); + //单独处理char类型 + CopyMemory(@c, PChar(edtParity.Text), 1); + WrConn.parity := c; + WrConn.data_bit := StrToIntDef(edtData_bit.Text,8); + WrConn.stop_bit := StrToIntDef(edtStop_bit.Text,1); + glTime1 := StrToIntDef(edtTime1.Text,2); + glTime2 := StrToIntDef(edtTime2.Text,20); + + //更新启动选项 + ss := '"'+ glAppPath + Application.ExeName +'"'; + if cbAutoRun.Checked then glAutoRun := true + else glAutoRun := false; + AutoRun(glAutoRun, 'GmmSoft'); + + //增加调试开关 + glIsDebug := cbDebug.Checked; + //更新存储参数 + smp.flag := cbAutoSave.Checked; + smp.prefix := edtPrefix.Text; + smp.dir := edtDir.Text; + cbTestAutoSave.Checked := cbAutoSave.Checked; //同步手动检测界面 + + //增加登录口令 + SysConfig.password := edtPassword.Text; + SysConfig.delay := StrToIntDef(edtDelay.Text,0); + + //调用数据库存储函数 + SaveParam(); + //弹框提示 + MessageBox(handle, '提示:PLC、水分仪、检测参数保存成功!', '保存对话框',MB_OK+MB_ICONINFORMATION); +end; + +//复位 +procedure TfrmMain.btnResetClick(Sender: TObject); +var + ret : Integer; +begin + ret := SendCommands(hWrDev, WR_RESET, 0, glTime1); + if ret<0 then begin + ResponseState(hPlcDev, PLC_DEVICE_WR_FAULT); + //弹框提示 + MessageBox(handle, '提示:执行水分仪复位操作成功!', '对话框',MB_OK+MB_ICONINFORMATION); + end; +end; + +//------- 仪器维护 ---------------------------------------- +//仪器复位功能子函数 +procedure TfrmMain.SetResetUI(flag:boolean); +begin + sBitBtn16.Enabled := flag; + sBitBtn17.Enabled := flag; + sBitBtn18.Enabled := flag; + sBitBtn19.Enabled := flag; + sBitBtn20.Enabled := flag; + sBitBtn21.Enabled := flag; + sBitBtn22.Enabled := flag; + sBitBtn23.Enabled := flag; + sBitBtn24.Enabled := flag; + sBitBtn25.Enabled := flag; + sBitBtn26.Enabled := flag; +end; + +//进入仪器维护界面 +procedure TfrmMain.sBitBtn15Click(Sender: TObject); +begin + pc.ActivePage := tsMaintain; +end; + +//仪器复位 +procedure TfrmMain.sBitBtn18Click(Sender: TObject); +begin + //启动仪器复位线程 + if m_ResetThread=0 then begin + //设置按钮不可用 + SetResetUI(false); + //启动线程 + resetThread := TResetThread.Create(); + m_resetThread := resetThread.Handle; + end + else + lblMaintain.Caption := '仪器复位尚未结束,请稍后再试!'; +end; + +//显示固件版本 +procedure TfrmMain.sBitBtn17Click(Sender: TObject); +var + ver : array[0..1] of Word; //暂存版本号 + ret : Integer; +begin + //初始化版本数组 + ver[0] := 0; + ver[1] := 0; + + ret := ReadVersion(hWrDev, @ver); + if ret>0 then + lblMaintain.Caption := Format('提示:水分仪硬件版本 [%d], 软件版本 [%d].', [ver[0],ver[1]]) + else + lblMaintain.Caption := '提示:读取水分仪固件版本号失败!'; +end; + +//检修按钮 +procedure TfrmMain.sBitBtn19Click(Sender: TObject); +var + ret : Integer; +begin + ret := 0; + case TsBitBtn(Sender).Tag of + 1: ret := SendCommands(hWrDev, WR_VALV01,0,1,500000); //上阀门开 + 2: ret := SendCommands(hWrDev, WR_VALV02,0,1,500000); //上阀门关 + 3: ret := SendCommands(hWrDev, WR_VALV03,0,1,500000); //下阀门开 + 4: ret := SendCommands(hWrDev, WR_VALV04,0,1,500000); //下阀门关 + 5: ret := SendCommands(hWrDev, WR_VALV05,0,1,500000); //双阀门开 + 6: ret := SendCommands(hWrDev, WR_VALV06,0,1,500000); //双阀门关 + 7: ret := SendCommands(hWrDev, WR_VIBRATE_01,0,1,500000); //振动开 + 8: ret := SendCommands(hWrDev, WR_VIBRATE_02,0,1,500000); //振动关 + end; + //显示结果 + if ret>0 then + lblMaintain.Caption := '提示:执行水分仪 ['+TsBitBtn(Sender).Caption+'] 操作成功!' + else + lblMaintain.Caption := '提示:执行水分仪 ['+TsBitBtn(Sender).Caption+'] 操作失败!'; +end; + +procedure TfrmMain.sImage4Click(Sender: TObject); +begin + // 使窗体在任务栏上可见 + Application.Minimize; +end; + +end. -- Gitblit v1.9.3