procedure TMeterForm.WMStartReadProc(var Mas:TMessage);
var
SendStr : string;
begin
Screen.Cursor := crHourGlass;
if(ProIndex>=ProtocolNum) then
begin
Cycle1Index := Cycle1Index +1;
ProIndex :=0;
if(Cycle1Index>Cycle1) then
begin
Cycle1Index :=1;
MeterIndex := MeterIndex+1;
if(MeterIndex>=MeterCount) then
begin
MeterIndex :=0;
Cycle2Index := Cycle2Index+1;
if(Cycle2Index>Cycle2) then
begin
PostMessage(Handle,WM_STOPREAD,0,0);
exit;
end;
end;
end;
end;
shqDl645.ComAddr := IntToStr(MeterAddr+MeterIndex);
if(protocols[ProIndex].checked='t') then
begin
shqDl645.MarkCode := protocols[ProIndex].IDCode;
shqDl645.DataLen := protocols[ProIndex].DataLength;
shqDl645.DecimalDigit := protocols[ProIndex].Demical;
SendStr := shqDl645.OutPutStr;
SendFrame(SendStr);
end
else begin
ProIndex := ProIndex+1;
PostMessage(Handle,WM_STARTREAD,0,0);
end;
end;
procedure TMeterForm.SendFrame(SendStr :string);
var //发送帧
i,DataLen:integer;
commflg:boolean;
sbuf:array[1..50] of byte;
str:string;
begin
Memo_Info.Lines.Add('发:'+shqDl645.StrToHex2(SendStr));
DataLen:=Length(SendStr);
for i:=1 to DataLen do
sbuf[i]:=byte(SendStr[i]);
commflg:=true;
RecieveStr:='';
str:='';
for i:=1 to DataLen do
begin
//commflg:=true;
commflg:= Comm.writecommdata(@sbuf[i],1);
if not commflg then
begin
str := shqDl645.ComAddr+ ' 发送失败----------'+DateTimeToStr(Now()) ;
Memo_Info.Lines.add(str);
ProIndex := ProIndex+1;
PostMessage(Handle,WM_STARTREAD,0,0);
exit;
end;
sleep(FWordDelay);
end;
delay(FWaitTime);
if(RecieveStr='') then
begin
str := shqDl645.ComAddr+ ' 无应答-----------'+DateTimeToStr(Now()) ;
Memo_Info.Lines.add(str);
ProIndex := ProIndex+1;
PostMessage(Handle,WM_STARTREAD,0,0);
end;
end;
procedure TMeterForm.CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
rbuf:array[1..255] of byte;
RecStr,TmpStr : string;
MessStr : string;
begin
move(buffer^,rbuf,bufferlength);
RecieveStr:='';
for i:=1 to bufferlength do
begin
TmpStr := inttohex(rbuf[i],2);
RecieveStr:=RecieveStr+ TmpStr;
RecStr := RecStr + TmpStr+ ' ';
end;
Memo_Info.Lines.Add('收:'+RecStr+'-------'+DateTimeToStr(Now()));
MessStr := shqdl645.AnalyseData(RecieveStr);
if((MessStr='操作成功' ) and (Cycle2Index=1) and (Cycle1Index=1)) then
begin
with dxTL_Data.Add do
begin
Strings[0] := shqdl645.ComAddr;
Strings[1] := protocols[ProIndex].Name ;
Strings[2] := shqdl645.Data;
Strings[3] := protocols[ProIndex].DataUnit;
Strings[4] := DateTimeToStr(Now());
end;
dxTL_Data.Refresh;
end
else
Memo_Info.Lines.Add(MessStr);
delay(FOrderDelay);
ProIndex := ProIndex+1;
PostMessage(Handle,WM_STARTREAD,0,0);