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

📄 recemsg.~pas

📁 使用Delphi 6.0开发用于控制空调的程序
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
unit ReceMsg;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,DB, ADODB,mxOutlookBarPro, Menus,AC,Installed_Simu,Data;
type TReceMsg = class

protected
  strReceBuffer:string;
  LenBuffer:Integer;
  b4,b3,b2,b1:Byte;
  strChk4,strChk3,strChk2,strChk1:string;
  function GetValue(strData:string):Integer;
  function GetValueRunState(strData:string;Flag:string):string;
  function GetValueWaringState(strData:string):string;
  function GetRTNError(strRTN:string):BOOL;
   procedure CHKSUM();


  public
    strError:string;
    strChkSun:string;
    iData :array[1..12] of  Integer;
    bRunState:array[1..10] of Byte;
    ACTemp:TAC;
    ado:TADOConnection;
    qry : TADOQuery;
    
    constructor Create(strBuffer:string;tempADO:TADOConnection);
    procedure HandingMsg();
    procedure CORP();     //收集数据的代表数据
    procedure COOPS();    //收集运转状态数据
    procedure COWS();     //收集警告状态数据
    procedure RC();       //远程控制运转、停止操作
    procedure GAP();     // 取得设定参数
    procedure AP();      //设定参数

    procedure GCPVI();   //取得通信协议版本情报
    procedure GSMAI();   //取得SM地址情报
    procedure GEFI();    //取得设备情报和厂家情报

    procedure ReadInfo();  //读取任意室内机的累积信息
    procedure ReadTransResult();//410 读出接口发报原因



 END;

implementation

{ TReceMsg }


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: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
    Result:=-1;
end;

function mod_num(n1,n2:integer):integer;//取余数
begin
   result:=n1-n1 div n2*n2
end;
function reverse(s:String):String;//取反串
Var
i,num:Integer;
st:String;
begin
   num:=Length(s);
   st:='';
   For i:=num DownTo 1 do
   Begin
     st:=st+s[i];
   End;
   Result:=st;
end;

Function DecTobin(Value :Integer) : string;//十进制转化二进制
Var
  ST:String;
  N:Integer;
Begin
   ST:='';
   N:=value;
   While N >= 2 Do
   Begin
     st:=st+IntToStr(mod_num(n,2));
     N := N div 2;
   End;
   ST:=ST + IntToStr(n);
   ST:=reverse(ST);
   if Length(ST) <> 8 then
   begin
     case Length(ST) of
       7: ST :='0'+st;
       6: ST :='00' + st;
       5: ST :='000' + st;
       4: ST :='0000' + st;
       3: ST :='00000' + st;
       2: ST :='000000' + st;
       1: sT :='0000000' + st;
       0: ST :='00000000' + st; 
     end;
     Result := ST;
   end
   else
      Result :=ST;  
End;

function StrToBin(ss:string):string;
begin
  Result := DecTobin(HexToInt(ss));
end;

procedure TReceMsg.AP;   //设定参数   AP
begin
        if strReceBuffer  = '' then
          exit;
         if not GetRTNError(Copy(strReceBuffer,8,2))then
         begin
            if  Setting.Showing then
               Setting.statSetting.SimpleText := strError;
         end    //到这里
         else
         begin
            if  Setting.Showing then
               Setting.statSetting.SimpleText := '命令发送成功!';
         end;
end;

procedure TReceMsg.CHKSUM;
var
  i:Integer;
  sum,WLen:Word;
  strSum:string;
begin
     sum := 0;
     for i := 2 to LenBuffer - 5 do
     begin
        sum := sum + Ord(strReceBuffer[i]);
     end;

     sum := sum xor $FFFF + 1;
     strSum := IntToHex(sum,2);
     WLen := Length(strSum);
     if WLen = 1 then
     begin
         strSum := '000'+strSum ;
     end
     else
     if WLen = 2 then
     begin
        strSum := '00'+strSum
     end
     else
     if WLen = 3 then
     begin
         strSum := '000'+strSum
     end
     else
     if WLen = 4 then
     begin
       strSum := strSum;
     end;
   strChkSun := strSum;
   //ShowMessage(strReceBuffer+'     '+strChkSun);

end;
function GetValueFan(ch:char):string ;
begin
   if ch = '0' then
      Result := '自动'
   else
   if ch = '1' then
      Result := '风量1'
   else
   if ch = '2' then
      Result := '风量2'
   else
   if ch = '3' then
      Result := '风量3'
   else
   if ch = '4' then
      Result := '风量4'
   else
   if ch = '5' then
      Result := '风量5'
   else

end;

procedure TReceMsg.ReadTransResult();
var
   strSBB:string;
   strRTN:string;
   strBin,strTemp:string;
   strBin2,strTemp2:string;
   i:Integer;
   tempStr:string;
begin
   strError := '正常';
    if strReceBuffer[1] <>'~' then //Ord(strReceBuffer[70]) <> 13 then
   begin
     strError := '读出接口发报原因,起始位:'+strReceBuffer[1];
     Exit;
   end;
   if LenBuffer <> 25 then
   begin
       strError :='';
       strError := '读出接口发报原因,应该为 :25,而不是'+ IntToStr(LenBuffer);
       Exit;
   end;
   strRTN := strReceBuffer[8] + strReceBuffer[9];
   if not GetRTNError(strRTN) then
      Exit;
   strSBB := strReceBuffer[14]+ strReceBuffer[15]+strReceBuffer[16];
   if strSBB <> '410' then
   begin
     strError := '读出接口发报原因时,识别部不正确!';
     Exit;
   end;
   strSBB := strReceBuffer[10]+ strReceBuffer[11]+strReceBuffer[12] +strReceBuffer[13];
   if strSBB <> '9007' then
   begin
      strError := '读出接口发报原因时,LCHKSUM和LENID错误!!';
      Exit;
   end;
   CHKSUM;
   if  strChkSun <> Copy(strReceBuffer,21,4) then
   begin
      strError :='校验错误!';
      Exit;
   end;
   ACTemp.strAddress := Copy(strReceBuffer,4,2);
   strTemp := Copy(strReceBuffer,17,2);
   strBin := StrToBin(strTemp);
   ACTemp.SRS485 :=  strBin[2];
   ACTemp.SRunModul := strBin[3];
   ACTemp.SHouJieAbal := strBin[4];
   ACTemp.SCommuAbal := strBin[5];
   ACTemp.SFilterAbal := strBin[6];
   ACTemp.SAbnormal := strBin[7];
   ACTemp.STimerAbal := strBin[8];

   strTemp2 := Copy(strReceBuffer,7,2);
   strBin2 := StrToBin(strTemp2);

   ACTemp.SLine2Abal := strBin2[2];
   ACTemp.SLine1Abal := strBin2[3];
   ACTemp.SLine0Abal := strBin2[4];

   ACTemp.SLine2HJAbal := strBin2[6];
   ACTemp.SLine1HJAbal := strBin2[7];
   ACTemp.SLine0HJAbal := strBin2[8];
   //
    
end;  
procedure TReceMsg.ReadInfo();
var
   strSBB:string;
   strRTN:string;
begin
   strError := '正常';
    if strReceBuffer[1] <>'~' then //Ord(strReceBuffer[70]) <> 13 then
   begin
     strError := '读取任意室内机的累积信息,起始位:'+strReceBuffer[1];
     Exit;
   end;
   if LenBuffer <> 47 then
   begin
       strError :='';
       strError := '读取任意室内机的累积信息,应该为 :47,而不是'+ IntToStr(LenBuffer);
       Exit;
   end;
   strRTN := strReceBuffer[8] + strReceBuffer[9];
   if not GetRTNError(strRTN) then
      Exit;
   strSBB := strReceBuffer[14]+ strReceBuffer[15]+strReceBuffer[16];
   if strSBB <> '400' then
   begin
     strError := '读取任意室内机的累积信息时,识别部不正确!';
     Exit;
   end;
   strSBB := strReceBuffer[10]+ strReceBuffer[11]+strReceBuffer[12] +strReceBuffer[13];
   if strSBB <> '201D' then
   begin
      strError := '读取任意室内机的累积信息时,LCHKSUM和LENID错误!!';
      Exit;
   end;
    CHKSUM;
   if  strChkSun <> Copy(strReceBuffer,43,4) then
   begin
      strError :='校验错误!';
      Exit;
   end;
   ACTemp.strAddress := Copy(strReceBuffer,4,2);
   ACTemp.iSetTemp := StrToInt(Copy(strReceBuffer,35,3));
   ACTemp.iRTTemp := StrToInt(Copy(strReceBuffer,38,3));
   ACTemp.strFan1 := GetValueFan(strReceBuffer[41]);
   ACTemp.strFan2 := GetValueFan(strReceBuffer[42]);

end;



procedure TReceMsg.COOPS;
var      // 收集运转状态数据
//  i:Integer;
  strRTN:string;
  iEnd:Integer;
 // qry:TADOQuery;
  //strTime:string;
begin
   strError := '正常';
   if strReceBuffer[1] <>'~' then //Ord(strReceBuffer[70]) <> 13 then
   begin
     strError := 'COOPS,起始位:'+strReceBuffer[1];
     Exit;
   end;
//   iEnd := Ord(strReceBuffer[42]);
//   if iEnd <>13 then //Ord(strReceBuffer[70]) <> 13 then
//   begin
//     strError := 'COOPS,这个数据的结束符:为'+strRecebuffer[42]+'ord:'+IntToStr(iEnd);;
//     Exit;
//   end;
   if LenBuffer <> 42 then
   begin
       strError :='';
       strError := 'COOPS,数据长度不是收集装置的代表数据,应该为 :42,而不是'+ IntToStr(LenBuffer);
       Exit;
   end;
   strRTN := strReceBuffer[8] + strReceBuffer[9];
   if not GetRTNError(strRTN) then
      Exit;
//   CHKSUM;
//   if  strChkSun <> Copy(strReceBuffer,38,4) then
//   begin
//      strError :='校验错误!';
//      Exit;
//   end;
   ACTemp.strAddress := Copy(strReceBuffer,4,2);
   ACTemp.strRunState[1] := GetValueRunState(Copy(strReceBuffer,16,2),'1');
   ACTemp.strRunState[2] := GetValueRunState(Copy(strReceBuffer,20,2),'1');
   ACTemp.strRunState[3] := GetValueRunState(Copy(strReceBuffer,22,2),'1');
   ACTemp.strRunState[4] := GetValueRunState(Copy(strReceBuffer,24,2),'1');
   ACTemp.strRunState[5] := GetValueRunState(Copy(strReceBuffer,26,2),'1');

   ACTemp.strRunState[6] := GetValueRunState(Copy(strReceBuffer,28,2),'2');
   ACTemp.strRunState[7] := GetValueRunState(Copy(strReceBuffer,30,2),'2');
   ACTemp.strRunState[8] := GetValueRunState(Copy(strReceBuffer,32,2),'2');
   ACTemp.strRunState[9] := GetValueRunState(Copy(strReceBuffer,34,2),'2');
   ACTemp.strRunState[10] := GetValueRunState(Copy(strReceBuffer,36,2),'3');

end;

procedure TReceMsg.CORP;
var      //收集数据的代表数据
  i:Integer;
  strRTN:string;
  iEnd:Integer;
  //strTime :string;
begin
   strError := '正常';
   if strReceBuffer[1] <>'~' then //Ord(strReceBuffer[70]) <> 13 then
   begin
     strError := 'CORP,起始位:'+strReceBuffer[1];
     Exit;
   end;
//   iEnd := Ord(strReceBuffer[70]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -