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