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