?? dl645lib.~pas
字號(hào):
unit DL645lib;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
myconlib,DateUtils;
////////////////原始數(shù)據(jù)緩沖區(qū)/////////////////////////
type TBuf200=array[0..199] of byte;
Tbuf6=array[0..5] of byte;
Tbuf4=array[0..3] of byte;
Tbuf3=array[0..2] of byte;
Tbuf2=array[0..1] of byte;
/////////////////數(shù)據(jù)命令緩沖區(qū)///////////////////////
TReadCMD=array[0..13] of byte;
// 68H,A0,A1,A2,A3,A4,A5,68H,01,02,ID0+33H,ID1+33H,CS,16H
TCheckErr=(ckLenErr,ckCSErr,ckC,ckOtherErr,ckOKErr,ckOK);
//長(zhǎng)度錯(cuò),校驗(yàn)和錯(cuò), 控制碼錯(cuò), 未知錯(cuò), 返回異常, 無(wú)錯(cuò)
////////////////控制碼定義/////////////////////////
Const CtlRead=1; // 讀電表數(shù)據(jù)
CtlWriteCS=4;// 寫電表參數(shù)
CtlBrdTime=8; // 廣播校時(shí)
CtlWriteADR=10;//寫設(shè)備地址
CtlUpdateBPS=12; //寫通信速率
CtlUpdatePass=15;//寫密碼
CtlClearPm=16;//最大需量清零
//////////////////通信速率/////////
Type TBPS=(Bps300,Bps600,Bps2400,Bps4800,Bps9600);
////////////////數(shù)據(jù)標(biāo)識(shí)定義/////////////////////////
type TID1=(ID1_NO,ID1_kWh,ID1_Pm,ID1_PmTime,ID1_BL,ID1_FH,ID1_CS);//數(shù)據(jù)屬性
TID2=(ID2_NO,ID2_CurP,ID2_CurQ,ID2_Lst1P,ID2_Lst1Q,ID2_Lst2P,ID2_Lst2Q); //數(shù)據(jù)時(shí)間1
TID3=(ID3_NO,ID3_ZX,ID3_FX,ID3_RL1,ID3_RC2,ID3_RL3,ID3_RC4); //數(shù)據(jù)子屬性
TYUE=(YUE_NO,YUE0,YUE1,YUE2);
TBK=(BK_NO,ZP,FP,ZQ,FQ,ZQL1,FQC4,ZQC2,FQL3);
TBKSet= set of TBK;
TJH=(JH_NO,JH_P2,JH_Q6,JH_DX,JH_X);
TFL=(FL_NO,FL_Block,FL_Z,FL_P,FL_A,FL_B,FL_C);
////數(shù)據(jù)塊,數(shù)據(jù)時(shí)間2,費(fèi)率Z, 費(fèi)率P, 費(fèi)率A, 費(fèi)率B, 費(fèi)率C,
TBL=(BL_NO,DX_CNT,DX_T,DX_T1,DX_T2,X_V,X_I,X_P,X_Q,X_COS); // 變量類型
TBLSet= set of TBL;
//斷相次數(shù),時(shí)間,起始時(shí)間,結(jié)束時(shí)間,
//相電壓,電流,有功,無(wú)功,功率因數(shù)
TBLX=(X_NO,X_Block,X_Z,X_A, X_B ,X_C); // 變量類型
///////////////數(shù)據(jù)結(jié)構(gòu)定義/////////////////
type TBlock_kWh = Record //電能量數(shù)據(jù)結(jié)構(gòu)
kWh_Z:double; //XXXXXX.XX
kWh_P:double;
kWh_A:double;
kWh_B:double;
kWh_C:double;
end;
TBlock_Pm = Record //最大需量數(shù)據(jù)結(jié)構(gòu)
Pm_Z:double; //XXXX.XX
Pm_P:double;
Pm_A:double;
Pm_B:double;
Pm_C:double;
end;
TBlock_PmTime = Record //最大需量發(fā)生時(shí)間數(shù)據(jù)結(jié)構(gòu)
PmTime_Z:TDateTime; //MMDD HHmm
PmTime_P:TDateTime;
PmTime_A:TDateTime;
PmTime_B:TDateTime;
PmTime_C:TDateTime;
end;
type TBlock_DXCNT = Record //斷相發(fā)生次數(shù)數(shù)據(jù)結(jié)構(gòu)
DXCNT_Z:Word;
DXCNT_A:Word;
DXCNT_B:Word;
DXCNT_C:Word;
end;
TBlock_DXT = Record //斷相發(fā)生總時(shí)間數(shù)據(jù)結(jié)構(gòu)
DXT_Z:DWord;
DXT_A:DWord;
DXT_B:DWord;
DXT_C:DWord;
end;
TBlock_DXT1 = Record //斷相發(fā)生時(shí)間1數(shù)據(jù)結(jié)構(gòu)
DXT_Z:TDateTime; //MMDD HHmm
DXT_A:TDateTime;
DXT_B:TDateTime;
DXT_C:TDateTime;
end;
TBlock_DXT2 = TBlock_DXT1 ; //斷相發(fā)生時(shí)間2數(shù)據(jù)結(jié)構(gòu)
type TBlock_XV = Record //瞬時(shí)電壓 數(shù)據(jù)結(jié)構(gòu)
X_A:double;
X_B:double;
X_C:double;
end;
TBlock_XI = TBlock_XV ; //瞬時(shí)電流 數(shù)據(jù)結(jié)構(gòu)
TBlock_XP = Record //瞬時(shí)有功功率 數(shù)據(jù)結(jié)構(gòu)
X_Z:double;
X_A:double;
X_B:double;
X_C:double;
end;
TBlock_XQ = TBlock_XP ; //瞬時(shí)無(wú)功功率 數(shù)據(jù)結(jié)構(gòu)
TBlock_XCos = TBlock_XP ; //瞬時(shí)功率因數(shù) 數(shù)據(jù)結(jié)構(gòu)
type TBL_BKS = Record
aDXCNT_BK:TBlock_DXCNT;
aDXT_BK:TBlock_DXT;
aDXT1_BK:TBlock_DXT1;
aDXT2_BK:TBlock_DXT2;
aXV_BK:TBlock_XV;
aXI_BK:TBlock_XI;
aXP_BK:TBlock_XP;
aXQ_BK:TBlock_XQ;
aXCos_BK:TBlock_XCos ;
end;
type TkWh_BKS = array[ZP..FQL3] of TBlock_kWh;
TPm_BKS = array[ZP..FQL3] of TBlock_Pm;
TPmTime_BKS = array[ZP..FQL3] of TBlock_PmTime;
////////////////////////////////////////////////////
//電表參數(shù)數(shù)據(jù)結(jié)構(gòu)
type TC01_=record
D:TDate;
W:Byte;
T:TTime;
end;
TC02_ =record
B1,B2,B3:Byte;
end;
TC03_ =record
Pkwh,Qkwh:Dword;
BH,UseID,DEVID:string[12];
end;
TC11_ =record
PmT,DelayT,LoopT,DisT:Byte;
DLDot,PmDot:Byte;
ReadDDHH:string[8];
FHDay:Byte;
P_kWh0:double;
Q_kWh0:double;
end;
TC21_ =record
PWms:Word;
PA,P1,P2,P3:Byte;
end;
TC31_ =record
P,q,m,k,n :Byte;
end;
TC32_ = array[1..14] of string;
TC33_ = array[1..10] of string;
TC41_ = array[1..14] of string;
////////////////////////////////////////////////////////////////////////
function StrToken(var S: String): String;
Function HexToBCD(b:Byte):Byte;
Function STR2Hex(A:String):string;
Function Array2Str(A:array of byte):string;
Function GetReadCMD( ID,ADR:string;var STX:string;var CS0:Byte):TReadCMD;
Function CheckData( data:string;CS0:Byte;Var B4:Byte):TCheckErr;
Function CheckErr2Str(Err:TCheckErr):string;
//總 ,尖,峰 ,平,谷
Function GetID1( ID:string):TID1; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)屬性
Function GetID2( ID:string):TID2; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)時(shí)間1
Function GetID3( ID:string):TID3; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)子屬性
Function GetYUE( ID:string):TYUE; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)月份
Function GetBK( ID:string):TBK; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)塊定義
Function GetJH( ID:string):TJH; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)集合
Function GetFL( ID:string):TFL; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)時(shí)間2,費(fèi)率
Function GetBL( ID:string):TBL; //數(shù)據(jù)標(biāo)識(shí)到 變量類型
Function GetBLX( ID:string):TBLX; //數(shù)據(jù)標(biāo)識(shí)到 變量的相屬性
Function ID1ToStr(ID1:TID1):string;
Function ID2ToStr(ID2:TID2):string;
Function ID3ToStr( ID3:TID3):string;
Function YUEToStr(Y:TYUE):string;
Function BKToStr(BK:TBK):string;
Function JHToStr(JH:TJH):string;
Function FLtoStr( aFL:TFL):string;
Function BLtoStr(blX:TBLX;blT:TBL):string;
Function IDtoStr( ID:string):string;
Function PaserB1(B1:byte):string;
Function PaserB2(B2:byte):string;
Function PaserB3(B3:byte):string;
Function PaserB4(B4:byte):string;
Function PaserkWh_Block(aFL:TFL;Data:String; Idx:Integer):TBlock_kWh; //電能
Function PaserPm_Block( aFL:TFL;Data:String; Idx:Integer):TBlock_Pm; //最大需量
Function PaserPmTime_Block(aFL:TFL; Data:String; Idx:Integer):TBlock_PmTime; //最大需量發(fā)生時(shí)間
Function PaserDXCNT_Block(X:TBLX;Data:String; Idx:Integer):TBlock_DXCNT;
Function PaserDXT_Block(X:TBLX;Data:String; Idx:Integer):TBlock_DXT;
Function PaserDXT1_Block(X:TBLX;Data:String; Idx:Integer):TBlock_DXT1;
Function PaserDXT2_Block(X:TBLX;Data:String; Idx:Integer):TBlock_DXT2;
Function PaserXV_Block(X:TBLX;Data:String; Idx:Integer):TBlock_XV;
Function PaserXI_Block(X:TBLX;Data:String; Idx:Integer):TBlock_XI;
Function PaserXP_Block(X:TBLX;Data:String; Idx:Integer):TBlock_XP;
Function PaserXQ_Block(X:TBLX;Data:String; Idx:Integer):TBlock_XQ;
Function PaserXCos_Block(X:TBLX;Data:String; Idx:Integer):TBlock_XCos;
Function PaserC01_(DI0L:char;Data:String):TC01_;
Function PaserC02_(DI0L:char;Data:String):TC02_;
Function PaserC03_(DI0L:char;Data:String):TC03_;
Function PaserC11_(DI0L:char;Data:String):TC11_;
Function PaserC21_(DI0L:char;Data:String):TC21_;
Function PaserC31_(DI0L:char;Data:String):TC31_;
Function PaserC32_(DI0L:char;Data:String):TC32_;
Function PaserC33_(ID:string;DI0L:char;Data:String):TC33_;
Function PaserC41_(DI0L:char;Data:String):TC41_;
Function GetSTX(ADR:string;var CS0:Byte):string;
Function GetCmdC01( ADR:string;aC01:TC01_; PA,P1,P2,P3:Byte;
var STX:string;var CS0:Byte; var Size:Integer):TBuf200;
Function GetCmdBrdTime(t:TdateTime; var Size:Integer):TBuf200;
Function GetCmdWriteADR(NewADR:string; var STX:string;var CS0:Byte; var Size:Integer):TBuf200;
Function BpsToZ(bps:TBps;var BpsInt:Integer):Byte;
Function GetCmdUpdateBPS(ADR:string; Bps:TBps;
var STX:string; var CS0:Byte;var Size:Integer):TBuf200;
Function GetCmdUpdatePass(ADR:string;PA0,P10,P20,P30,PAN,P1N,P2N,P3N:Byte;
var STX:string; var CS0:Byte;var Size:Integer):TBuf200;
Function GetCmdBrdFrz(var Size:Integer):TBuf200;
implementation
////////////////////////////////////////
// 數(shù)據(jù)格式轉(zhuǎn)換 //
////////////////////////////////////////
function IIF(B: Boolean; const ATrue: string; AFalse: string = ''): string;
begin
if B then Result := ATrue
else Result := AFalse;
end;
function StrToken(var S: String): String;
var I: Integer;
begin
I := Pos( char($DD) ,S );
if I <> 0 then begin
Result := Copy(S, 1, I - 1);
Delete(S, 1, I);
end else begin
Result := S;
S := '';
end;
end;
Function STR2Hex(A:String):string;
var i:Integer;
begin
result:='';
for i:=1 to Length(A) do
result:=result+inttohex( ord( A[i] ) ,2)+' ';
end;
Function Array2Str(A:array of byte):string;
var i:Integer;
begin
result:='';
for i:=Low(A) to High(A) do
result:=result+inttohex(A[i],2)+' ';
end;
Function Bit1(B:byte;bit:byte):boolean;
begin
result:=(B and ($01 shl bit)) <>0;
end;
Function HexToBCD(b:Byte):Byte;
var BH,BL:Byte;
//var s:String;
begin
// s:=inttohex(b,2);
// result:=strtoInt(s);
BH:=b div 16; BL:=b mod 16;
result:=BH*10+BL;
end;
Function BCDToHex(b:Byte):Byte;
var BH,BL:Byte;
//var s:String;
begin
// s:=inttohex(b,2);
// result:=strtoInt(s);
BH:=b div 10; BL:=b mod 10;
result:=BH*16+BL;
end;
Function Buf4ToDword(buf4:Tbuf4):Dword;
var i:integer; s:string;
begin
For i:=0 to 3 do Buf4[i]:=Buf4[i]-$33;
s :=inttohex(buf4[3],2) + inttohex(buf4[2],2)
+ inttohex(buf4[1],2) +inttohex(buf4[0],2);
result:=strtoInt(s);
// result:=HexToBCD(buf4[3])*1000000 + HexToBCD(buf4[2])*10000 + HexToBCD(buf4[1])*100 + HexToBCD(buf4[0]);
end;
Function Buf3ToDword(buf3:Tbuf3):Dword;
var i:integer; s:string;
begin
For i:=0 to 2 do Buf3[i]:=Buf3[i]-$33;
s :=inttohex(buf3[2],2) + inttohex(buf3[1],2) + inttohex(buf3[0],2) ;
result:=strtoInt(s);
end;
Function Buf2ToWord(buf2:Tbuf2):Word;
var i:integer; s:string;
begin
For i:=0 to 1 do Buf2[i]:=Buf2[i]-$33;
s := inttohex(buf2[1],2) + inttohex(buf2[0],2) ;
result:=strtoInt(s);
end;
Function buf1ToByte(buf1:Char):Byte;
var s:string;
begin
// result:=HexToBCD( ord(buf1)- $33);
s:= InttoHex( ord(buf1)- $33 ,2) ;
result:=strtoInt(s);
end;
//buf: mm HH DD MM >>> DateTime
Function Buf4ToDT(buf4:Tbuf4):TDateTime;
var i:integer;
Y,M,D,H,F :Word;
begin
For i:=0 to 3 do Buf4[i]:=Buf4[i]-$33;
DecodeDate(Date,Y,M,D);
M:= HexToBCD(buf4[3]) ;
D:= HexToBCD(buf4[2]) ;
H:= HexToBCD(buf4[1]) ;
F:= HexToBCD(buf4[0]) ;
result:=EncodeDateTime(Y,M,D,H,F,0,0);
if result > now then result:=IncYear(result,-1);
end;
Function Buf6ToStr(buf6:Tbuf6):string;
var i:Integer;
begin
result:='';
for i:=5 downto 0 do
result:=result + IntToHex (buf6[i]-$33 ,2);
end;
////////////////////////////////////////////////////////////
// 數(shù)據(jù)標(biāo)識(shí)分析 //
///////////////////////////////////////////////////////////
Function GetID1( ID:string):TID1;
var s1,s2:char;
begin
s1:=ID[1]; result:=ID1_NO; //,,DL_PmTime,DL_BL
case S1 of
'9':result:=ID1_kWh ; //電能量
'A':result:=ID1_Pm ; //最大量
'B':begin
s2:=ID[2];
case s2 of
'2','3','6': result:=ID1_BL ; //變量
'0','1','4','5','8','9': result:=ID1_PmTime ; //最大量發(fā)生時(shí)間
end;
end;
'C': result:=ID1_CS;
end;
end;
Function GetID2( ID:string):TID2;
var s2:char;
begin
s2:=ID[2]; result:=ID2_NO;
case s2 of
'0': result:= ID2_curP;//當(dāng)前有功
'1': result:= ID2_CurQ;//當(dāng)前無(wú)功
'4': result:= ID2_Lst1P; //上月有功
'5': result:= ID2_Lst1Q; //上月無(wú)功
'8': result:= ID2_Lst2P; //上上月有功
'9': result:= ID2_Lst2Q; //上上月無(wú)功
end;
end;
Function GetID3( ID:string):TID3;
var s3:char;
begin //ID3_NO,ID3_ZX,ID3_FX,ID3_RL1,ID3_RC2,ID3_RL3,ID3_RC4
s3:=ID[3]; result:=ID3_NO;
case s3 of
'1': result:=ID3_ZX; //+A
'2': result:=ID3_FX; //-A
'3': result:=ID3_RL1; //+RL (1)
'4': result:=ID3_RC4; //-Rc (4)
'5': result:=ID3_RC2; //+Rc (2)
'6': result:=ID3_RL3; //-RL (3)
end;
end;
Function GetYUE( ID:string):TYUE; //數(shù)據(jù)標(biāo)識(shí)到 數(shù)據(jù)月份
var s2:char;
begin
result:=YUE_NO;
s2:=ID[2];
case s2 of
'0','1': result:= YUE0 ;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -