📄 recvthread.~pas
字号:
unit RecvThread;
interface
uses
Classes,SysUtils,DB,ADODB;
type
TRecvThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Update();
procedure Fengli(ss:string);
public
strDeal:string;
strRecv:array [1..64] of string;
qry:TADOQuery;
constructor Create(bSupend:Boolean;strRe: string);
end;
implementation
{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TRecvThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TRecvThread }
uses
Installed_Simu,IDShow,ACC,IDPaperAbalInfo, ACCShow,comm,Login,Pass_Pope_Modify,
URegister,Data,TempChart,ADDAC,ControlClass,ACRM,qry,Main,ReceMsg;
procedure TRecvThread.Execute;
begin
{ Place thread code here }
FreeOnTerminate := True;
Synchronize(Update);
end;
constructor TRecvThread.Create(bSupend:Boolean;strRe: string);
begin
inherited Create(bSupend);
FreeOnTerminate := True;
strDeal := strRe;
end;
function hex(c:char):Integer;
var
x:integer;
begin
if c='' then
x:=0
else if(Ord(c)>=ord('0'))and (Ord(c)<=ord('9')) then
x:=Ord(c)-Ord('0')
else if(Ord(c)>=ord('a'))and (Ord(c)<=ord('f')) then
x:=Ord(c)-Ord('a')+10
else if(Ord(c)>=ord('A'))and (Ord(c)<=ord('F')) then
x:=Ord(c)-Ord('A')+10
else
x:=-1;
Result:=x;
end;
//该函数结束1~2个字符,转换成功,输出对应十六进制的值,转换失败,输出-1
function HexToInt(S:String):Integer;
var
tmpInt1,tmpInt2,tmpInt3:integer;
begin
if Length(S)=1 then
begin
Result:=hex(S[1]);
end
else if Length(S)=2 then
begin
tmpInt1:=hex(S[1]);
tmpInt2:=hex(S[2]);
if(tmpInt1=-1) or (tmpInt2=-1) then
Result:=-1
else
Result:=tmpInt1*16+tmpInt2;
end
else if Length(S)=3 then
begin
tmpInt1:=hex(S[1]);
tmpInt2:=hex(S[2]);
tmpInt3:=hex(S[3]);
if(tmpInt1=-1) or (tmpInt2=-1) or (tmpInt3=-1) then
Result:=-1
else
Result:=tmpInt1*16*16 + tmpInt2*16 + tmpInt3;
end
else
Result:=-1;
end;
procedure TRecvThread.FengLi(ss:string);
var //将字符串存在字符串数组中
i,j,
icount,
ilen,
iStart,
iEnd:Integer;
iData:Integer;
str:string;
begin
ilen := Length(ss);
icount := 1;
iStart := 1;
iEnd := 1;
// ShowMessage('分离后的字符串:'+ss);
// for i := 1 to 64 do
// begin
// strRecv[i] := '';
// end;
for i:= 1 to ilen do
begin
if ss[i] = #126then //起始符
iStart := i
else
if ss[i] = #13 then //结束符
begin
iEnd := i;
strRecv[ icount ] := Copy(ss,iStart,iEnd - iStart + 1 );
Inc(icount);
end;
end;
// for j := 1 to ilen do
// //while j <= ilen do
// begin
// if ss[j] = #126 then
// begin
// if ss[j + 1] = '2' then
// begin
// if ss[j + 2] = '0' then
// begin
// iStart := j;
// str := Copy( ss, j+ 10 ,3);
// iData := HexToInt(str);
// strRecv[ icount ] := Copy(ss,iStart,iData + 13 +5 );
// frmain. mmo2.Lines.Add('kkkk线程中,FENGLi字符串为:'+strRecv[ icount ]);
// Inc(icount);
// //j := iData + 13 + 4;
// end;
// end;
// end ;
// else
// Inc(j);
// end; //while
end;
procedure TRecvThread.Update;
var
tempStr:string;
j:Integer;
ReMsg:TReceMsg;
// qry:TADOQuery;
strRecv:array [1..64] of string;
strSBB,strLenID:string;
begin
strSBB := Copy(strdeal,14,3);
strLenID := Copy(strdeal,10,4);
if (strSBB = '400') and (strLenID = '201D') then
begin
tempStr :=copy(strdeal,1,47);//strDeal;
ReMsg := TReceMsg.Create(tempStr,frmain.conAir);
ReMsg.ReadInfo;
if ReMsg.strError <> '正常' then
begin
frmain.statMain.Panels[1].Text := '接收到的数据出错:'+ReMsg.strError ;
Exit;
end;
if ReMsg.ACTemp.strAddress = '01' then
begin
frmain.edtSetTemp1.text := IntToStr(ReMsg.ACTemp.iSetTemp);
frmain.edtRTTemp1.text := IntToStr(ReMsg.ACTemp.iRTTemp);
frmain.edtFan1.Text := ReMsg.ACTemp.strFan1;
end;
if ReMsg.ACTemp.strAddress = '02' then
begin
frmain.edtSetTemp2.text := IntToStr(ReMsg.ACTemp.iSetTemp);
frmain.edtRTTemp2.text := IntToStr(ReMsg.ACTemp.iRTTemp);
frmain.edtFan2.Text := ReMsg.ACTemp.strFan1;
end;
if ReMsg.ACTemp.strAddress = '03' then
begin
frmain.edtSetTemp3.text := IntToStr(ReMsg.ACTemp.iSetTemp);
frmain.edtRTTemp3.text := IntToStr(ReMsg.ACTemp.iRTTemp);
frmain.edtFan3.Text := ReMsg.ACTemp.strFan1;
end;
if iSaveReadInfo = 1 then
begin
try
qry := TADOQuery.Create(qry);
qry.Connection := frmain.conAir;
with qry do
begin
Close;
SQL.Clear;
SQL.Add('insert into ACData(时间,id,ACAddress,回风温度,设定温度,风扇1风量,风扇2风量)');
SQL.Add('VALUES(:sj,:IID,:ADD,:RTTemp,:ST,:F1,:F2)');
Parameters.ParamByName('sj').Value := Now;
Parameters.ParamByName('IID').Value := '00';
Parameters.ParamByName('ADD').Value := ReMsg.ACTemp.strAddress;
Parameters.ParamByName('RTTemp').Value := ReMsg.ACTemp.iRTTemp;
Parameters.ParamByName('ST').Value := ReMsg.ACTemp.iSetTemp;
Parameters.ParamByName('F1').Value := ReMsg.ACTemp.strFan1;
Parameters.ParamByName('F2').Value := ReMsg.ACTemp.strFan2;
ExecSQL;
end;
iSaveReadInfo := 0;
finally
qry.Free;
end;
end;
end;
///////********异常**************************///////
strLenID := Copy(strdeal,10,4);
strSBB := Copy(strdeal,14,3);
if (strLenID = '9007') and (strSBB = '410') then
begin
tempStr :=Copy(strdeal,1,25);//strDeal;
ReMsg := TReceMsg.Create(tempStr,frmain.conAir);
ReMsg.ReadTransResult;
if ReMsg.strError <> '正常' then
begin
frmain.statMain.Panels[1].Text := '接收到的数据出错:'+ReMsg.strError ;
Exit;
end;
if (ReMsg.ACTemp.SCommuAbal = '1') or (ReMsg.ACTemp.SFilterAbal = '1')
or (ReMsg.ACTemp.SAbnormal = '1') or (ReMsg.ACTemp.SLine0Abal = '1') then
begin
iAbal := 99;
end;
if (iAbal = 99 ) or ( iSaveReadTransResult = 1) then
begin
try
qry := TADOQuery.Create(qry);
qry.Connection := frmain.conAir;
with qry do
begin
Close;
SQL.Clear;
SQL.Add('insert into IDFInfo(DT,Address,SCommuAbal,SFilterAbal,SAbnormal,SLine0Abal)');
SQL.Add('VALUES(:sj,:ADD,:SC,:SF,:SA,:SL)');
Parameters.ParamByName('sj').Value := Now;
//Parameters.ParamByName('IID').Value := '00';
Parameters.ParamByName('ADD').Value := ReMsg.ACTemp.strAddress;
Parameters.ParamByName('SC').Value := ReMsg.ACTemp.SCommuAbal ;
Parameters.ParamByName('SF').Value := ReMsg.ACTemp.SFilterAbal;
Parameters.ParamByName('SA').Value := ReMsg.ACTemp.SAbnormal;
Parameters.ParamByName('SL').Value := ReMsg.ACTemp.SLine0Abal;
ExecSQL;
end;
iSaveReadTransResult := 0;
iAbal := 0;
finally
qry.Free;
end;
end;
end;
///////********异常**************************///////
//**************运转数据状态****************************/
// if Data.frmData.iCOOP = 1 then
strLenID := Copy(strdeal,10,4);
if strLenID = '7018' then
begin
tempStr :=Copy(strdeal,1,42);//strDeal;
ReMsg := TReceMsg.Create(tempStr,frmain.conAir);
ReMsg.COOPS;
if ReMsg.strError <> '正常' then
begin
frmain.statMain.Panels[2].Text := '接收到的数据出错:'+ReMsg.strError ;
Exit;
end;
if frmData.Showing then
begin
//Data.frmData.iCORP := 0;
frmData.edtACState.Text := ReMsg.ACTemp.strRunState[1];
frmData.edtJSQState.Text := ReMsg.ACTemp.strRunState[2];
frmData.edtDJRState.Text := ReMsg.ACTemp.strRunState[3];
frmData.edtFansState.Text := ReMsg.ACTemp.strRunState[4];
frmData.edtCompState.Text := ReMsg.ACTemp.strRunState[5];
frmData.edtFilterState.Text := ReMsg.ACTemp.strRunState[6];
frmData.edtAttentionstate.Text := ReMsg.ACTemp.strRunState[7];
frmData.edtWaringState.Text := ReMsg.ACTemp.strRunState[8];
frmData.edtAbalState.Text := ReMsg.ACTemp.strRunState[9];
frmData.edtRunState.Text := ReMsg.ACTemp.strRunState[10];
end;
// mmo2.Lines.Add('运转数据状态已经成功的将数据显示在数据窗口!');
/////////主窗体
if ReMsg.ACTemp.strAddress = '01' then
begin
frmain.edtRunState1.Text := ReMsg.ACTemp.strRunState[10];
frmain.edtAirState1.Text := ReMsg.ACTemp.strRunState[1];
frmain.edtFanState1.Text := ReMsg.ACTemp.strRunState[4];
frmain.edtWaringState1.Text := ReMsg.ACTemp.strRunState[8];
end;
if ReMsg.ACTemp.strAddress = '02' then
begin
frmain.edtRunState2.Text := ReMsg.ACTemp.strRunState[10];
frmain.edtAirState2.Text := ReMsg.ACTemp.strRunState[1];
frmain.edtFanState2.Text := ReMsg.ACTemp.strRunState[4];
frmain.edtWaringState2.Text := ReMsg.ACTemp.strRunState[8];
end;
if ReMsg.ACTemp.strAddress = '03' then
begin
frmain.edtRunState3.Text := ReMsg.ACTemp.strRunState[10];
frmain.edtAirState3.Text := ReMsg.ACTemp.strRunState[1];
frmain.edtFanState3.Text := ReMsg.ACTemp.strRunState[4];
frmain.edtWaringState3.Text := ReMsg.ACTemp.strRunState[8];
end;
///////// 主窗体
if iSaveCOOPS = 1 then
begin
try
qry := TADOQuery.Create(qry);
qry.Connection := frmain.conAir;
with qry do
begin
Close;
SQL.Clear;
SQL.Add('insert into RunState(时间,id,空调地址,空调状态,加湿器状态,电加热器状态,');
SQL.Add('风扇状态,压缩机状态,过滤网状态,注意报状态,警报状态,异常状态,运转状态)');
SQL.Add('VALUES(:sj,:IID,:ADD,:AC,:JSQ,:DJR,:FANS,:COMP,:FILTER,:ATT,');
SQL.Add(':WAR,:ABL,:RUN)');
Parameters.ParamByName('sj').Value := Now;
Parameters.ParamByName('IID').Value := '00';
Parameters.ParamByName('ADD').Value := ReMsg.ACTemp.strAddress;
Parameters.ParamByName('AC').Value := ReMsg.ACTemp.strRunState[1];
Parameters.ParamByName('JSQ').Value := ReMsg.ACTemp.strRunState[2];
Parameters.ParamByName('DJR').Value := ReMsg.ACTemp.strRunState[3];
Parameters.ParamByName('FANS').Value := ReMsg.ACTemp.strRunState[4];
Parameters.ParamByName('COMP').Value := ReMsg.ACTemp.strRunState[5];
Parameters.ParamByName('FILTER').Value := ReMsg.ACTemp.strRunState[6];
Parameters.ParamByName('ATT').Value := ReMsg.ACTemp.strRunState[7];
Parameters.ParamByName('WAR').Value := ReMsg.ACTemp.strRunState[8];
Parameters.ParamByName('ABL').Value := ReMsg.ACTemp.strRunState[9];
Parameters.ParamByName('RUN').Value := ReMsg.ACTemp.strRunState[10];
ExecSQL;
// mmo2.Lines.Add('运转数据状态数据已经成功的将数据插入数据库中!');
end;
iSaveCOOPS := 0;
finally
qry.Free;
end;
end;
Data.frmData.iCOOP := 0;
end;
//**************运转数据状态****************************/
ReMsg.Free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -