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