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/testThread.pas |  202 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 202 insertions(+), 0 deletions(-)

diff --git a/src/thread/testThread.pas b/src/thread/testThread.pas
new file mode 100644
index 0000000..8e72dc3
--- /dev/null
+++ b/src/thread/testThread.pas
@@ -0,0 +1,202 @@
+{------------------------------------------------------------------------------}
+{单元名称:testThread.pas                                                      }
+{模块名称:自动检测线程                                                        }
+{模块说明:线程创建后自动启动                                                  }
+{          自动检测线程根据plc指令,控制水分仪自动完成含水率检测,自动上报结果 }
+{建立日期:2023-10-27                                                          }
+{修改修改:2025-05-07                                                          }
+{版权所有:李良庭 liangtingli@outlook.com                                      }
+{------------------------------------------------------------------------------}
+//2025-05-07 自动模式下,testThread()线程改为阻塞模式,使用回调函数处理所有指令。
+
+unit testThread;
+
+interface
+
+uses
+  Windows, Classes, SysUtils, PubUtils, DateUtils, ActuatorLib;
+
+type
+  TTestThread = class(TThread)
+  private
+    { Private declarations }
+    t_ret : Integer;
+  protected
+    procedure UpdateError;
+    procedure Execute; override;
+  public
+    constructor Create(param: Boolean=false);
+    procedure Terminate;
+  end;
+
+implementation
+
+uses
+  uMain, uDM, uInit, uSaveData, Global, log4me;
+
+{ TTestThread }
+//--------线程初始化----------------------------------------
+//线程初始化
+constructor TTestThread.Create(param: Boolean=false);
+begin
+  //线程停止后自动释放
+  inherited Create(param);        //设置线程运行, False-自动运行, True-手动启动
+  FreeOnTerminate := True;        //设置线程退出自动销
+  t_ret := 0;
+  gl_log_old := '';
+  gl_log_new := '';
+  gl_t_cod := 0;
+  gl_t_val := 0;
+  gl_t_mos := 0;
+end;
+
+//线程销毁事件
+procedure TTestThread.Terminate;
+begin
+  inherited;
+  m_TestThread := 0;             //清理线程句柄
+end;
+
+//--------CallBack函数----------------------------------------------------------
+//粮库系统通讯回调函数
+procedure OnMessageCallBack(Data: PWord; Size: Integer); stdcall;
+var
+  x0,x1,x2,x3,x4,x5 : double;   //校准系数
+  Words: PWordArray;
+begin
+  //从回调函数读取Data命令
+  case Data^ of
+    //0x01-粮食品种改了
+    PLC_READY_GRAIN: begin
+      frmMain.lblAutoInfo.Caption := '收到修改粮种指令.';
+      frmMain.lblAutoRet.Caption := '';
+      frmMain.lblAutoRet_error.Caption := '';
+    end;
+    //0x02-返回准备完成
+    PLC_READY_FINISH: begin
+      frmMain.lblAutoInfo.Caption := '修改粮种完成.';
+      frmMain.lblAutoRet.Caption := '';
+      frmMain.lblAutoRet_error.Caption := '';
+    end;
+    //0x03-开始测试
+    PLC_DETECT_START: begin
+      frmMain.lblAutoInfo.Caption := '水分仪正在检测,请稍候......';
+      frmMain.lblAutoRet.Caption := '';
+      frmMain.lblAutoRet_error.Caption := '';
+
+      //粮种代码-data[1], 原始含水率-data[3]
+      Words := PWordArray(Data);
+      gl_t_cod := Words[1];
+      gl_t_val := Words[3];
+      //使用cod查询一条grain数据
+      Grain := queryGrainSql1(t_Grain, gl_t_cod);
+      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);//新增截距
+
+      //计算含水率并回写
+      if gl_t_val>0 then begin
+        gl_t_mos := x0 +
+                 x1 * gl_t_val +
+                 x2 * gl_t_val * gl_t_val +
+                 x3 * gl_t_val * gl_t_val * gl_t_val +
+                 x4 * gl_t_val * gl_t_val * gl_t_val * gl_t_val + x5;
+        PWordArray(Data)^[3] := Word(Trunc(gl_t_mos * 100));
+      end;
+      //输出水分仪原始值
+      if gl_t_val<>0 then
+        log4Info(Format('自动:从水分仪Data结构中读取数据-[%d].',[gl_t_val]));
+    end;
+    //0x04-检测完毕
+    PLC_DETECT_FINISH: begin
+      //故障代码-data[9]
+      Words := PWordArray(Data);
+      gl_t_err := Words[9];
+      //刷新设备故障码
+      RefashFaultCode(gl_t_err);
+
+      frmMain.lblAutoInfo.Caption := '检测完成.';
+      frmMain.lblAutoRet.Caption := Format('粮种代码: %d, 粮种名称: %s, 含水率: %.2f',
+                                          [gl_t_cod, Grain.Name, Trunc(gl_t_mos*100)/100])+'%';
+      frmMain.lblAutoRet_error.Caption := '';
+      //记录数据库和日志
+      gl_log_new := Format('自动:检测结果-含水率[%f], 截距[%s], 粮种代码[%d], 粮种名称[%s].',
+                          [Trunc(gl_t_mos*100)/100, Grain.Intercept, gl_t_cod, Grain.Name]);
+      if gl_log_new<>gl_log_old then begin
+        log4Info(gl_log_new);
+        gl_log_old := gl_log_new;
+      end;
+    end;
+    //0xFE-水分仪复位
+    PLC_DEVICE_WR_RESET: begin
+      frmMain.lblAutoInfo.Caption := '收到复位指令.';
+      frmMain.lblAutoRet.Caption := '';
+      frmMain.lblAutoRet_error.Caption := '';
+      //记录复位
+      log4info('自动:收到复位指令.');
+    end;
+    //0xFF-水分仪故障
+    PLC_DEVICE_WR_FAULT: begin
+      //故障代码-data[9]
+      Words := PWordArray(Data);
+      gl_t_err := Words[9];
+      frmMain.lblAutoInfo.Caption := '水分仪故障!';
+      frmMain.lblAutoRet.Caption := '';
+      frmMain.lblAutoRet_error.Caption := Format('水分仪出现 [%d]-故障码, 原因: %s!', [gl_t_err, AutoFaultCode(gl_t_err)]);
+      //记录故障信息
+      gl_log_new := Format('自动:水分仪出现 [%d]-故障码, 原因: %s!', [gl_t_err, AutoFaultCode(gl_t_err)]);
+      if gl_log_new<>gl_log_old then begin
+        log4Info(gl_log_new);
+        gl_log_old := gl_log_new;
+      end;
+    end;
+    //0x00-正常
+    else begin
+      Words := PWordArray(Data);
+      gl_t_err := Words[9];
+      RefashFaultCode(gl_t_err);
+    end;
+  end;
+end;
+
+//出错显示
+procedure TTestThread.UpdateError;
+begin
+  if t_ret>=0 then begin
+    frmMain.lblAutoRet.Caption := '扦捡系统连接成功!';
+    log4info(Format('自动:扦捡系统连接成功,返回值=[%d].',[t_ret]));
+  end
+  else begin
+    frmMain.lblAutoRet_error.Caption := '扦捡系统连接失败!';
+    log4error(Format('自动:扦捡系统连接失败, 返回值=[%d].',[t_ret]));
+  end;
+end;
+
+//------- 线程入口 ----------------------------------------
+procedure TTestThread.Execute;
+begin
+  { Place thread code here }
+  try
+    //启动侦听服务端
+    {t_ret := StartTcpSlave(PlcConn.port,
+                           PChar(WrConn.SerialPort),
+                           WrConn.baud,
+                           WrConn.parity,
+                           WrConn.data_bit,
+                           WrConn.stop_bit,
+                           60, 10,
+                           @OnMessageCallBack);  }
+    t_ret := StartTcpSlaveEx(hWrDev, PlcConn.port, 60, 10, @OnMessageCallBack);
+    Synchronize(UpdateError);
+    //防止线程阻塞CPU
+    Sleep(1000);
+  finally
+    //销毁线程
+    Terminate;
+  end;
+end;
+
+end.

--
Gitblit v1.9.3