📄 rsu.pas
字号:
unit RSU;
interface
uses
Messages, SysUtils, Variants, Classes, Dialogs, Controls,StrUtils,
IDF,IDInfo,Line ,LineInfo ;
type TRSU = class
protected
strReBuffer:string;
Len:Integer;
strError:string;
strInfo:string;
public
LineR:TLine;
IDFR:TIDF;
LineInfoR:TLineInfo;
IDInfoR:TIDInfo;
constructor create(s:string);
function ChkData(strChk:string):Boolean ;
function BCC(strBCC:string):string;
function GetErrorInfo():string;
function GetSuccessInfo():string;
//function GetCOmmand():string;
procedure CutCommu; //000 回路切断要求
procedure ReadRAM; //0E0 RAM读出
procedure WriteRAM; //0F0 RAM记入
procedure IDId(); //100 接口ID确认
procedure PassWordID; //110 PASSWORD确认
procedure SetPassWord; //210 pw设定
procedure SetCenterTELNo; //220 中心一tel.no
procedure SetID; //230 接口ID
procedure SetNowTime; //240 现在时刻
procedure SetTimingSendPaperTime; // 250定时发报时刻
procedure SetDialingNum; //280 连通为止的拨号次数
procedure SetReDialingNum; //2A0 重拨次数
procedure SetAutoMachine; //2B0 自动备机有无
procedure SetAutoRunTime; //2c0 自动交替运作时间
procedure SetMinRunGuranteeNum; //2D0 最低运转保证台数
procedure SetDiagling; //根据需要对接口发报的许可/禁止设定
procedure StateConManagerNum; //300 从接口读出各遥控器回路所连接的室内机台数 300
procedure StateConUNITNO; //310 从接口读出任意室内机的UNIT.NO 310
procedure StateConLimitInte;//320 从接口读出任意回路的限制情报
procedure CollCumulativeInte; //400 读出任意室内机的积累信息
procedure CollTransmittersResult; //410 从接口读出发报原因
procedure ACDataInit; //500 接口内部存储数据的初始化。希望从室内机的最初存储数据开始实行时发行
procedure ACCTRun; //600 对接口的任意LINE运转。停止指令
procedure ACCTCleaning; //610 对接口的任意LINE发出过滤清洗重置指令
procedure ACCTRunModel; //620 改变接口任意line的运转模式
procedure ACCTSetTemp;//630 改变接口任意line的设定温度
procedure ACCTVAV; // 640 改变接口任意Line的风量
procedure IDReadCenterTELNO; // 720 读出同接口相连的上位机的TEL.NO
procedure IDReadID; //730 读出接口设定的ID
procedure IDReadNowTime; //740 读出接口累计的现在时刻
procedure IDReadTimingSendPaperTime; //750 读出接口设定的定时发表时刻
procedure IDReadDialingNum; //780 读出接口设定的连通为止的响应次数
procedure IDReadReDialingNum; //7A0 读出接口设定的连通为止的重拨为止
procedure IDReadAutoMachine; //7B0 读出接口设定的自动备机功能有无
procedure IDReadAutoRunTime; //7C0 读出接口设定的自动交替运转时间
procedure IDReadMinRunGurNum; //7DO 读出接口设定的最低运转保证台数
procedure IDReadDiagling; //7E0 读出接口设定的各种情况下的发报有无
end;
implementation
{ TRSU }
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;
function TRSU.GetErrorInfo():string;
begin
Result := strError;
end;
function TRSU.GetSuccessInfo():string;
begin
Result := strInfo;
end;
constructor TRSU.create(s: string);
begin
Len := Length(s);
strReBuffer := s;
strError :='通信正常';
strInfo :='';
IDFR := TIDF.Create;
IDInfoR := TIDInfo.Create;
LineInfoR := TLineInfo.Create;
LineR := TLine.Create;
end;
function TRSU.BCC(strBCC: string): string;
var
i,strSum:Integer;
strResult:string;
begin
strSum := 0;
for i := 1 to Length(strBCC) do
begin
strSum := strSum + Ord(strBCC[i]);
end;
strResult := IntToHex((strSum and $0F),1);
Result := strResult;
end;
function BinToHave(ss:string):string ;
begin
if ss[1] = '0' then
Result :='无'
else
if ss[1] = '1' then
Result :='有';
end;
function TRSU.ChkData(strChk:string):Boolean ;
var
strTemp:string;
iLen:Integer;
begin
iLen := Length(strChk);
if (strChk[1] <> #02) or (strChk[iLen-1] <> #03) then
begin
strError := '结束符和起始符号不对,起始:'+strChk[1]+'结束:'+strChk[ iLen-1];
Result := False;
Exit;
end;
strTemp := BCC(Copy(strChk,1,iLen - 1 ) ) ;
if strTemp <> strChk[iLen ]then
begin
StrError :='BCC错误!';
Result := False;
Exit;
end;
strError := '通信正常';
Result := True ;
end;
procedure TRSU.CutCommu;
var
bb:Boolean ;
begin
if Length(strReBuffer) <> 6 then
begin
strError :='CutCommu数据长度6不对,为:'+ IntToStr(Length (strReBuffer));
Exit;
end;
bb :=ChkData(strReBuffer);
if bb then
strInfo :='要求接口切断回线通信成功!' ;
//else strError := '要求接口切断回线通信失败';
end;
procedure TRSU.IDId;
var
bb:Boolean ;
begin
if Len <> 22 then
begin
strError := '数据长度不正确!收到的是:'+ IntToStr(Len)+'位, 应该是:22位!';
Exit;
end;
bb := ChkData(strReBuffer);
if bb then
begin
IDFR.ID := Copy(strReBuffer,5,16);
IDInfoR.ID := IDFR.ID;//Copy(strReBuffer,5,16);
strInfo := '接口ID确认——成功!';
end;
end;
procedure TRSU.PassWordID;
var
bb:Boolean ;
begin
if Len <> 22 then
begin
strError := '数据长度不正确!收到的是:'+ IntToStr(Len)+'位, 应该是:22!';
Exit;
end;
bb := ChkData(strReBuffer);
if bb then
begin
if strReBuffer[5] = '0' then
strInfo := '必须项目未设定(登入成功)'
else
if strReBuffer[5] = '1' then
strInfo := '登入成功'
else
if strReBuffer[5] = '0' then
strInfo := 'PW异常,登入失败'
else
strInfo := '数据错误';
end;
end;
procedure TRSU.SetPassWord;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='密码设置——成功!';
end;
procedure TRSU.SetCenterTELNo; //220
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置中心TEL NO——成功!';
end;
procedure TRSU.SetNowTime;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口现在时刻——成功!';
end;
procedure TRSU.SetID;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口ID——成功!';
end;
procedure TRSU.SetTimingSendPaperTime;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置定时发报时刻——成功!';
end;
procedure TRSU.SetDialingNum;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口连通为止的拨号次数——成功!';
end;
procedure TRSU.SetReDialingNum;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口连通为止的重拨次数——成功!';
end;
procedure TRSU.SetAutoMachine;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口自动备机有无——成功!';
end;
procedure TRSU.SetAutoRunTime;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口自动交替运转时间——成功!';
end;
procedure TRSU.SetMinRunGuranteeNum;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口最低运转保证台数——成功!';
end;
procedure TRSU.SetDiagling;
var
bb:Boolean ;
begin
bb := ChkData(strReBuffer);
if bb then
strInfo :='设置接口发报的许可/禁止——成功!';
end;
procedure TRSU.StateConManagerNum; //300
var
bb:Boolean ;
begin
if Len <> 12 then
begin
strError := '数据长度不正确!收到的是:'+ IntToStr(Len)+'位, 应该是:12 位!';
Exit;
end;
bb := ChkData(strReBuffer);
if bb then
begin
IDFR.LINE0 := Copy(strReBuffer,5,2 );
IDFR.LINE1 := Copy(strReBuffer,7,2 );
IDFR.LINE2 := Copy(strReBuffer,9,2 );
strInfo := '从接口读出遥控器回路所连接的室内机台数——成功!';
end;
end;
procedure TRSU.StateConUNITNO;
var
bb:Boolean ;
begin
if Len <> 8 then
begin
strError := '数据长度不正确!收到的是:'+ IntToStr(Len)+'位, 应该是:8位!';
Exit;
end;
bb := ChkData(strReBuffer);
if bb then
begin
LineR.UNITNO := Copy (strReBuffer,5,2 );
strInfo := '从接口读出室内机的UNIT NO ——成功!';
end;
end;
procedure TRSU.StateConLimitInte;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -