?? dlmeter.~pas
字號:
unit DLMeter;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
VaSystem, myconlib,DL645lib;
const RepeatCount=1;
type
TOnWriteLog = Procedure(sender:Tobject;var msg:string) of object;
TOnPaserkWh = Procedure(sender:Tobject;aJH:TJH;
aYUE :TYUE;
aBKSet :TBKSet;
aFL :TFL;
aTime:TDateTime;
aV: TkWh_BKS) of object;
TOnPaserPm = Procedure(sender:Tobject; aJH:TJH;
aYUE :TYUE;
aBKSet :TBKSet;
aFL :TFL;
aTime:TDateTime;
aV:TPm_BKS ) of object;
TOnPaserPmTime = Procedure(sender:Tobject; aJH:TJH;
aYUE :TYUE;
aBKSet :TBKSet;
aFL :TFL;
aTime:TDateTime;
aV:TPmTime_BKS ) of object;
TOnPaserBL = Procedure(sender:Tobject; aJH:TJH;
aBLSet:TBLSet;
aBLX :TBLX;
aTime:TDateTime ;
aV:TBL_BKS ) of object;
TDLMeter = class(TVaCapture)
private
FADR:string;
FID: string;
FCom:TReadCMD;
FN:Byte;
FonStop: TnotifyEvent;
FOnWriteLog: TOnWriteLog;
FOnDebug: TOnWriteLog;
FGoing: Boolean;
FOnPaserkWh: TOnPaserkWh;
FOnPaserPm: TOnPaserPm;
FOnPaserPmTime: TOnPaserPmTime;
FOnPaserBL: TOnPaserBL;
procedure onDL_ExpTime(sender:Tobject);
procedure onDL_Message(Sender: TObject; const Data: string);
protected
// STX:string;
// CS0:Byte;
procedure DologEvent(aMsg:string);
procedure DoDebugEvent(aMsg:string);
procedure DoStopEvent;
procedure Execute;
public
STX:string;
CS0:Byte;
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
procedure Go;
procedure stop;
property Going:Boolean read FGoing;
published
property ID:string read FID write FID;
property ADR:string read FADR write FADR;
property OnWriteLog: TOnWriteLog read FOnWriteLog write FOnWriteLog;
property OnDebug: TOnWriteLog read FOnDebug write FOnDebug;
property onStop:TnotifyEvent read FonStop write FonStop;
property OnPaserkWh:TOnPaserkWh read FOnPaserkWh write FOnPaserkWh;
property OnPaserPm:TOnPaserPm read FOnPaserPm write FOnPaserPm;
property OnPaserPmTime:TOnPaserPmTime read FOnPaserPmTime write FOnPaserPmTime;
property OnPaserBL:TOnPaserBL read FOnPaserBL write FOnPaserBL;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('TMS Async32', [TDLMeter]);
end;
{ TDLMeter }
constructor TDLMeter.Create(Owner: TComponent);
begin
inherited;
Active:=false;
DataFinish:=#22;
OnExpTime := OnDL_ExpTime ;
OnMessage := onDL_Message ;
end;
destructor TDLMeter.Destroy;
begin
inherited;
end;
procedure TDLMeter.DoLogEvent(aMsg:string);
begin
if assigned(Fonwritelog) then Fonwritelog(self, Amsg );
end;
procedure TDLMeter.DoStopEvent;
begin
if assigned(FOnStop) then FOnStop(self);
end;
procedure TDLMeter.DoDebugEvent(aMsg: string);
begin
if assigned(FOnDebug) then FOnDebug(self, Amsg );
end;
/////////////////////////////////////////////////////////////////////////
procedure TDLMeter.Execute;
begin
if not FGoing then begin
DoStopEvent; exit;
end;
if FN > RepeatCount then begin
DoLogEvent('* 執行'+ID+':第'+inttostr(FN)+'次;放棄!');
DoStopEvent;
end else begin
DoLogEvent('* 執行'+ID+':第'+inttostr(FN)+'次;....');
Active:=True;
self.
WriteBuf(FCom,sizeof(FCom) );
end;
end;
procedure TDLMeter.onDL_ExpTime(sender: Tobject);
begin
DoLogEvent('* 執行'+ID+':超時' );
inc(FN);
execute;
end;
procedure TDLMeter.onDL_Message(Sender: TObject; const Data: string);
var Err:TCheckErr; B4:Byte;
i:Integer; S,tmp:string; ID1_3:Dword; s4:char;
aJH:TJH; aTime:TDateTime;
aYUE:TYUE; aBK:TBK; aBKSet:TBKSet; aFL:TFL;
aV1:TkWh_BKS; aV2:TPm_BKS; aV3: TPmTime_BKS;
aBL:TBL; aBLSet:TBLSet; aX:TBLX;
aV4:TBL_BKS;
aC01:TC01_; aC02:TC02_; aC03:TC03_;
aC11:TC11_; aC21:TC21_; aC31:TC31_;
aC32:TC32_; aC33:TC33_; aC41:TC41_;
begin
Active:=False;
DoDebugEvent(data ) ;
////////////////////////////////////////////////
////// 檢驗的處理 //////////
///////////////////////////////////////////////
Err:=CheckData(data,CS0,B4);
DoLogEvent(CheckErr2Str(err));
if Err<>ckOK then begin
case Err of
ckOKErr: begin
DoLogEvent(PaserB4(B4));
DoStopEvent; exit;
end;
else begin
inc(FN); execute; exit;
end;
end;
end;
aBLSet:=[];
aBKSet:=[];
case GetID1(ID) of
////////////////////////////////////////////////
////// 電能量的處理 //////////
///////////////////////////////////////////////
ID1_kWh:
begin //電能量
aBKSet:=[];
aJH:=GetJH(ID);
aYUE:=GetYUE(ID);
aBK:=GetBK(ID);
aFL:=GetFL(ID);
//////////////有功電能量集合//////////////////////////////////
if aJH=JH_P2 then begin // 有功集合,
S:=data;
tmp:=StrToken(S);
if length(tmp) = (4+20) then begin
try
aV1[ZP]:= PaserkWh_Block(aFL,tmp,5); //正向有功,
aBKSet:=aBKSet+[ZP];
except
DoLogEvent('正向有功數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (20) then begin
try
aV1[FP]:= PaserkWh_Block(aFL,tmp,1); //反向有功,
aBKSet:=aBKSet+[FP];
except
DoLogEvent('反向有功數據格式錯!');
end;
end;
if assigned(FOnPaserkWh) then
FOnPaserkWh(self,aJH, aYUE,aBKSet,aFL,aTime,aV1);
DoStopEvent;
exit;
end; //有功集合,
//////////////無功電能量集合//////////////////////////////////
if aJH=JH_Q6 then begin // 無功集合,
S:=data;
tmp:=StrToken(S);
if length(tmp) = (4+20) then begin
try
aV1[ZQ]:= PaserkWh_Block(aFL,tmp,5); //正向無功,
aBKSet:=aBKSet+[ZQ];
except
DoLogEvent('正向無功數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (20) then begin
try
aV1[FQ]:= PaserkWh_Block(aFL,tmp,1); //反向無功,
aBKSet:=aBKSet+[FQ];
except
DoLogEvent('反向無功數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (20) then begin
try
aV1[ZQL1]:= PaserkWh_Block(aFL,tmp,1); //一象限無功(+RL),
aBKSet:=aBKSet+[ZQL1];
except
DoLogEvent('一象限無功(+RL)數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (20) then begin
try
aV1[FQC4]:= PaserkWh_Block(aFL,tmp,1); //四象限無功(-RC)
aBKSet:=aBKSet+[FQC4];
except
DoLogEvent('四象限無功(-RC)數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (20) then begin
try
aV1[ZQC2]:= PaserkWh_Block(aFL,tmp,1); //二象限無功(+RC),
aBKSet:=aBKSet+[ZQC2];
except
DoLogEvent('二象限無功(+RC)數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (20) then begin
try
aV1[FQL3]:= PaserkWh_Block(aFL,tmp,1); //三象限無功(-RL)
aBKSet:=aBKSet+[FQL3];
except
DoLogEvent('三象限無功(-RL)數據格式錯!');
end;
end;
if assigned(FOnPaserkWh) then
FOnPaserkWh(self,aJH, aYUE,aBKSet,aFL,aTime,aV1);
DoStopEvent;
exit;
end; //無功集合
//////////////電能量塊 或 項//////////////////////////////////
try
aV1[aBK]:=PaserkWh_Block(aFL,Data,5);
except
DoLogEvent('數據格式錯!');
inc(FN); execute; exit;
end;
aBKSet:=[aBK];
if assigned(FOnPaserkWh) then
FOnPaserkWh(self,aJH, aYUE,aBKSet,aFL,aTime,aV1);
end; //電能量
//////////////////////////////
//電能量結束
//////////////////////////////////////
// /////////最大需量開始////
///////////////////////////////////////
ID1_Pm:
begin //最大需量
aBKSet:=[];
aJH:=GetJH(ID);
aYUE:=GetYUE(ID);
aBK:=GetBK(ID);
aFL:=GetFL(ID);
//////////////有功最大需量集合//////////////////////////////////
if aJH=JH_P2 then begin // 有功最大需量集合,
S:=data;
tmp:=StrToken(S);
if length(tmp) = (4+15) then begin
try
aV2[ZP]:= PaserPm_Block(aFL,tmp,5); //正向有功最大需量,
aBKSet:=aBKSet+[ZP];
except
DoLogEvent('正向有功最大需量數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (15) then begin
try
aV2[FP]:= PaserPm_Block(aFL,tmp,1); //反向有功,
aBKSet:=aBKSet+[FP];
except
DoLogEvent('反向有功最大需量數據格式錯!');
end;
end;
if assigned(FOnPaserPm) then
FOnPaserPm(self,aJH, aYUE,aBKSet,aFL,aTime,aV2);
DoStopEvent;
exit;
end; //有功最大需量集合,
//////////////無功最大需量集合//////////////////////////////////
if aJH=JH_Q6 then begin // 無功最大需量集合,
S:=data;
tmp:=StrToken(S);
if length(tmp) = (4+15) then begin
try
aV2[ZQ]:= PaserPm_Block(aFL,tmp,5); //正向無功最大需量,
aBKSet:=aBKSet+[ZQ];
except
DoLogEvent('正向無功最大需量數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (15) then begin
try
aV2[FQ]:= PaserPm_Block(aFL,tmp,1); //反向最大需量無功,
aBKSet:=aBKSet+[FQ];
except
DoLogEvent('反向無功最大需量數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (15) then begin
try
aV2[ZQL1]:= PaserPm_Block(aFL,tmp,1); //一象限無功最大需量(+RL),
aBKSet:=aBKSet+[ZQL1];
except
DoLogEvent('一象限無功最大需量(+RL)數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (15) then begin
try
aV2[FQC4]:= PaserPm_Block(aFL,tmp,1); //四象限無功最大需量(-RC)
aBKSet:=aBKSet+[FQC4];
except
DoLogEvent('四象限無功最大需量(-RC)數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (15) then begin
try
aV2[ZQC2]:= PaserPm_Block(aFL,tmp,1); //二象限無功最大需量(+RC),
aBKSet:=aBKSet+[ZQC2];
except
DoLogEvent('二象限無功最大需量(+RC)數據格式錯!');
end;
end;
tmp:=StrToken(S);
if length(tmp) = (15) then begin
try
aV2[FQL3]:= PaserPm_Block(aFL,tmp,1); //三象限無功最大需量(-RL)
aBKSet:=aBKSet+[FQL3];
except
DoLogEvent('三象限無功最大需量(-RL)數據格式錯!');
end;
end;
if assigned(FOnPaserPm) then
FOnPaserPm(self,aJH, aYUE,aBKSet,aFL,aTime,aV2);
DoStopEvent;
exit;
end; //無功集合
//////////////最大需量塊 或 項//////////////////////////////////
aJH:=JH_NO;
aYUE:=GetYUE(ID);
aBK:=GetBK(ID);
aBKSet:=[aBK];
aFL:=GetFL(ID);
try
aV2[aBK]:=PaserPm_Block(aFL,Data,5);
except
DoLogEvent('數據格式錯!');
inc(FN); execute; exit;
end;
if assigned(FOnPaserPm) then
FOnPaserPm(self,aJH, aYUE,aBKSet,aFL,aTime,aV2);
end; //最大需量
//////////////////////////////
//最大需量結束
//////////////////////////////////////
// /////////最大需量發生時間開始////
///////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -