{------------------------------------------------------------------------------}
|
{µ¥ÔªÃû³Æ£º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.
|