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 |  226 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 226 insertions(+), 0 deletions(-)

diff --git a/src/thread/mantestThread.~pas b/src/thread/mantestThread.~pas
new file mode 100644
index 0000000..01e5846
--- /dev/null
+++ b/src/thread/mantestThread.~pas
@@ -0,0 +1,226 @@
+{------------------------------------------------------------------------------}
+{单元名称: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 UpdateReadDatasError;
+    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 := Format('手动执行检测失败,水分仪故障码 [%d]!',[t_faultCode]);
+end;
+
+//出错显示--ReadDatas()出错
+procedure TManTestThread.UpdateReadDatasError;
+begin
+  //更新界面信息
+  frmMain.lblManTest.Caption := '水分仪返回检测结果失败!';
+end;
+
+//更新手动检测界面
+procedure TManTestThread.UpdateCaption;
+var
+  nMois,nRatio,nWeight,nTemp,nWater : double;
+  y : double; //用公式计算重量 y=kx+b
+  x0,x1,x2,x3,x4,x5 : double;
+  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);    //新增截距参数
+  //保存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])); }
+    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].',[Trunc(nMois*100)/100, 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
+  //返回值
+  t_ret := 0;
+
+  //检查水分仪故障码
+  t_ret := ReadFaultCode(hWrDev, @t_faultCode);
+
+  //下发水分仪启动指令
+  if t_ret >=0 then begin
+    Synchronize(UpdateStartClock);
+    t_ret := SendCommands(hWrDev, WR_DETECT, 0, glTime2);
+    Synchronize(UpdateStopClock);
+  end;
+  if t_ret<0 then begin
+    Synchronize(UpdateTestError);
+    Exit;
+  end;
+
+   //从水分仪读取数据
+  t_ret := 0;
+  //0-电压、1-重量、2-温度、3-湿度
+  t_ret := ReadDatas(hWrDev, @t_nDatas);
+  Synchronize(UpdateTest);
+
+  //输出计算含水率
+  if t_ret<0 then
+    Synchronize(UpdateReadDatasError)
+  else
+    Synchronize(UpdateCaption);
+end;
+
+//------- 线程入口 ----------------------------------------
+procedure TManTestThread.Execute;
+begin
+  { Place thread code here }
+  try
+    //执行检测代码
+    StartTest();
+    //防止线程阻塞CPU
+    Sleep(1000);
+  finally
+    Terminate;
+  end;
+end;
+
+end.

--
Gitblit v1.9.3