📄 recemsg.~pas
字号:
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 + -