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/thread/mantestThread.pas | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 220 insertions(+), 0 deletions(-) diff --git a/src/thread/mantestThread.pas b/src/thread/mantestThread.pas new file mode 100644 index 0000000..71ce3b7 --- /dev/null +++ b/src/thread/mantestThread.pas @@ -0,0 +1,220 @@ +{------------------------------------------------------------------------------} +{单元名称:mantestThread.pas } +{模块名称:手动检测线程 } +{模块说明:线程创建后自动运行,完成一次粮种下发和检测 } +{建立日期:2023-11-01 } +{修改修改:2024-07-08 } +{版权所有:李良庭 liangtingli@outlook.com } +{------------------------------------------------------------------------------} +unit mantestThread; + +interface + +uses + Windows, Classes, SysUtils, PubUtils, DateUtils, ActuatorLib; + +type + TManTestThread = class(TThread) + private + { Private declarations } + t_ret : Integer; //返回值 + t_nDatas : array[0..3] of Word; //暂存水分仪数据 + t_faultCode : Word; //水分仪故障码 + + procedure UpdateStartClock; + procedure UpdateStopClock; + procedure UpdateTest; + procedure UpdateTestError; + procedure UpdateFaultCode; + procedure UpdateCaption; + protected + procedure startTest(); + procedure Execute; override; + public + constructor Create(param: Boolean=false); + procedure Terminate; + end; + +implementation + +uses + uMain, uDM, uInit, uSaveData, Global, log4me; + +{ TManTestThread } + +//--------线程初始化---------------------------------------- +//线程初始化 +constructor TManTestThread.Create(param: Boolean=false); +begin + //线程停止后自动释放 + inherited Create(param); //设置线程运行, False-自动运行, True-手动启动 + FreeOnTerminate := True; //设置线程退出自动销 + t_ret := 0; //返回值 + t_nDatas[0] := 0; //初始化水分仪数组 + t_nDatas[1] := 0; + t_nDatas[2] := 0; + t_nDatas[3] := 0; +end; + +//线程销毁事件 +procedure TManTestThread.Terminate; +begin + inherited; + m_ManTestThread := 0; //清理线程句柄 +end; + +//--------界面处理函数-------------------------------------- +//计数器开始 +procedure TManTestThread.UpdateStartClock; +begin + //启动检测计时器动画 + glStartTest := GetMillisecondTimeStamp; + dm.tmManTest.Enabled := true; +end; + +//计数器结束 +procedure TManTestThread.UpdateStopClock; +begin + dm.tmManTest.Enabled := false; + frmMain.mtManClock.Value := 0; +end; + +//正常显示--执行检测 +procedure TManTestThread.UpdateTest; +begin + //更新界面信息 + if glIsDebug then + frmMain.lblManTest.Caption := Format('粮种[%s], 系数[%s,%s,%s,%s,%s]', + [Grain.Name, + Grain.Coef[0], + Grain.Coef[1], + Grain.Coef[2], + Grain.Coef[3], + Grain.Coef[4]]) + else + frmMain.lblManTest.Caption := '含水率检测成功!'; +end; + +//出错显示--执行检测出错 +procedure TManTestThread.UpdateTestError; +begin + frmMain.lblManTest.Caption := '手动执行检测失败,水分仪故障!' +end; + +//解析故障码 +procedure TManTestThread.UpdateFaultCode; +begin + RefashFaultCode(t_faultCode); +end; + +//更新手动检测界面 +procedure TManTestThread.UpdateCaption; +var + nMois,nRatio,nWeight,nTemp,nWater : double; + y : double; //用公式计算重量 y=kx+b + x0,x1,x2,x3,x4,x5 : double; + //ff : boolean; + nam : string; +begin + //初始化系数 + x0 := StrToFloat(Grain.coef[0]); + x1 := StrToFloat(Grain.coef[1]); + x2 := StrToFloat(Grain.coef[2]); + x3 := StrToFloat(Grain.coef[3]); + x4 := StrToFloat(Grain.coef[4]); + x5 := StrToFloat(Grain.Intercept); //新增截距参数 + //ff := Grain.flag; //新增是否大类标志 + //保存csv数据样本信息 + if smp.info<>'' then nam := smp.info + else nam := Grain.Name; + + //更新界面信息 + with frmMain do begin + //计算含水率, 容重比 + {nMois := (x0 + + (x1 * t_nDatas[0]) + + (x2 * t_nDatas[0] * t_nDatas[0]) + + (x3 * t_nDatas[0] * t_nDatas[0] * t_nDatas[0]) ); + (x4 * t_nDatas[0] * t_nDatas[0] * t_nDatas[0] * t_nDatas[0])); } + //if ff then + // nMois := CalcValue(t_nDatas[0], x0,x1,x2,x3,x4) //大类不增加截距 + //else + nMois := CalcValue(t_nDatas[0], x0,x1,x2,x3,x4) + x5; //将截距加进去 + log4Info(Format('手动:ReadDatas() 从水分仪读取数据-[%d].',[t_nDatas[0]])); + //---------------------------------------------- + //用公式 y=kx+b 计算重量,重量-去皮 + y := Wg.k * (SmallInt(t_nDatas[1])-SysConfig.Tare) + Wg.b; + //---------------------------------------------- + //计算容重比 + //0-电压、1-重量、2-温度、3-湿度 + if SysConfig.Volume=0 then SysConfig.Volume:=1; + nRatio := y / SysConfig.Volume; //注意这里用新公式计算容重比 + nWeight:= y; + nTemp := t_nDatas[2]/10; + nWater := t_nDatas[3]/10; + //nTemp := SwapHighLowWord(t_nDatas[2])/10; //对温度高低位交换 + //nWater := SwapHighLowWord(t_nDatas[3])/10; //对湿度高低位交换 + + //更新到界面 + edtMoisture.Text := Format('%.2f',[Trunc(nMois*100)/100]); + edtWeightRatio.Text := Format('%.1f',[Trunc(nRatio*10)/10]); + edtWeight.Text := Format('%.2f',[nWeight]); + edtTemp.Text := Format('%.2f',[nTemp]); + edtWater.Text := Format('%.2f',[nWater]); + + //记录数据库和日志 + log4Info(Format('手动:检测结果-含水率[%f], 截距[%f], 温度[%f], 湿度[%f].',[Trunc(nMois*100)/100, x5, nTemp, nWater])); + try + insertTestSql(t_Data,Ord(rmManual),Integer(smp.flag),DateTimeToUnix(Now), + Grain.Code,Grain.Name,smp.info, + Trunc(nMois*100)/100, nTemp, nWater); + //保存csv文件 + if smp.flag then + WriteCsvFile(nam, nMois, nTemp, nWater); + except + on E: Exception do begin + log4error(Format('存储:手动检测异常--[%s].',[e.Message])); + end; + end; + end; +end; + +//------- 执行线程 ---------------------------------------- +procedure TManTestThread.StartTest(); +begin + //下发水分仪启动指令 + Synchronize(UpdateStartClock); + t_ret := SendCommands(hWrDev, WR_DETECT, 0, glTime2); + Synchronize(UpdateStopClock); + + //处理数据和输出 + if t_ret<>0 then + Synchronize(UpdateTestError) + else begin + //从水分仪读取数据 + //0-电压、1-重量、2-温度、3-湿度 + ReadDatas(hWrDev, @t_nDatas); + Synchronize(UpdateTest); + Synchronize(UpdateCaption); + end; + + //检查水分仪故障码 + ReadFaultCode(hWrDev, @t_faultCode); + Synchronize(UpdateFaultCode); +end; + +//------- 线程入口 ---------------------------------------- +procedure TManTestThread.Execute; +begin + { Place thread code here } + try + //执行检测代码 + StartTest(); + //防止线程阻塞CPU + Sleep(1000); + finally + Terminate; + end; +end; + +end. -- Gitblit v1.9.3