HP\李良庭
2025-07-08 868daf94f29ce1ffdd799a68c07bb668cd373bcd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
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.