⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recvthread.~pas

📁 使用Delphi 6.0开发用于控制空调的程序
💻 ~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 + -