procedure TReadPLUS.saveCheckData(nrow,ncol:integer;s:string);
var
ip:integer;
nplus1:integer;
gw,dw:integer;
begin
//if WaitForSingleObject(Critical1,INFINITE)=Wait_Object_0 then
//begin
// inherited saveCheckData(nrow,ncol,s); // skip error code
if s[1]='E' then
else begin
gw:=ord(s[ckCOM_HEAD+2+1])-$33;
dw:=ord(s[ckCOM_HEAD+1+1])-$33;
if gw<0 then
gw:=gw+256;
if dw<0 then
dw:=dw+256;
nplus1 := 256*gw+dw;
end; ip:=fieldMatchArr[sysSetRecord.nCurFlow].svPOS[svREAD_PLUS_z];
if s[1]='E' then begin
pubclass.savethreadRecord(nRow*sysSetRecord.numCol+nCol,ip,'');
inherited saveCheckData(1+sysSetRecord.region+nRow*sysSetRecord.numCol+nCol,ip,'');
end
else begin
pubclass.savethreadRecord(nRow*sysSetRecord.numCol+nCol,ip,inttostr(nplus1));
inherited saveCheckData(1+sysSetRecord.region+nRow*sysSetRecord.numCol+nCol,ip,inttostr(nplus1));
end;
//end;
//ReleaseMutex(Critical1);
end;
var
ip:integer;
nplus1:integer;
gw,dw:integer;
begin
//if WaitForSingleObject(Critical1,INFINITE)=Wait_Object_0 then
//begin
// inherited saveCheckData(nrow,ncol,s); // skip error code
if s[1]='E' then
else begin
gw:=ord(s[ckCOM_HEAD+2+1])-$33;
dw:=ord(s[ckCOM_HEAD+1+1])-$33;
if gw<0 then
gw:=gw+256;
if dw<0 then
dw:=dw+256;
nplus1 := 256*gw+dw;
end; ip:=fieldMatchArr[sysSetRecord.nCurFlow].svPOS[svREAD_PLUS_z];
if s[1]='E' then begin
pubclass.savethreadRecord(nRow*sysSetRecord.numCol+nCol,ip,'');
inherited saveCheckData(1+sysSetRecord.region+nRow*sysSetRecord.numCol+nCol,ip,'');
end
else begin
pubclass.savethreadRecord(nRow*sysSetRecord.numCol+nCol,ip,inttostr(nplus1));
inherited saveCheckData(1+sysSetRecord.region+nRow*sysSetRecord.numCol+nCol,ip,inttostr(nplus1));
end;
//end;
//ReleaseMutex(Critical1);
end;
解决方案 »
- 怎样得到图片文件的大小?
- 如何让一个外部程序从任务栏恢复显示?
- 使用XMLDocument生成xml时,如果把一个本地文件转换成16进制字符当成一个node的值
- 怎样不用等待showmodal关闭就直接执行showmodal后的代码
- 怎么安装xp控件??
- 紧急求助:小第忘记自己win professional 2000的密码了,请各位老大帮忙有什么办法召回,多谢!急,在线等待!
- adoquery查询返回值
- 版本控制的序列号TeamSource1.10在线等待!
- 多层分布的问题(急用)
- 怎样在动态改变panel的尺寸?就好象我们改变窗体大小一样?
- 打包时,怎么样实现在安装的同时,也把后台数据库也建好?
- 急购一中学教务管理系统和图书管理系统,今年做课题设计,无法下手啊
protected
procedure reCalErrField;override;
procedure saveCheckData(nrow,ncol:integer;s:string); override;
end;
procedure TCheckComThread.saveCheckData(nrow,ncol:integer;s:string);
var
sr:string;
qTp:integer;
// rBk:rSaveCmd;
begin
// 1:Á÷³Ì, 2-4:¼Ç¼ºÅ,5-6:×Ö¶ÎÐòºÅ,7-23:ÌõÂë, 24-33:ʱ¼ä,>33: ÃüÁîÃû
// ´æÅÌÐÅÏ¢ if length(s)=0 then exit;
if s[1]<>'E' then begin
// ¼Ó 1+sysSetRecord.region ÒÔÇø·Ö ²»´æÅ̵ÄÇé¿ö
if nrow>sysSetRecord.region then
qTp :=nrow-(1+sysSetRecord.region)
else
qTp :=-1; with dmData.chkTable1 do begin ///A
append;
fieldbyname('nFlow').asinteger :=sysSetRecord.nCurFlow;
fieldbyname('nRec').asinteger :=qTp;
fieldbyname('nField').asinteger :=nCol;
fieldbyname('sMeterId').asstring :=sMeterId;
fieldbyname('sTime').AsFloat :=now;
fieldbyname('sCmdName').asstring :=sProcInfo;
fieldbyname('sSaveDisk').asstring :=s;
post;
end;
end;
end;procedure TCheckComThread.Execute;begin //lhf
//InitializeCriticalSection(cs); //EnterCriticalSection(cs); VisualSwap; //lhf
//LeaveCriticalSection(cs);
//DeleteCriticalSection(cs);
{for i:=1 to 2000000 do
begin
if terminated then
exit;
end;} //terminate;
//free;
//self:=nil;
end;
procedure TCheckComThread.VisualSwap;
begin
sCommInfo :='ÕýÔÚ'+sProcInfo+'...';
sCommInfo1 :='';
Synchronize(dispQYStatus);
DoComm;
//waitfor();
end;procedure TCheckComThread.DoComm;
var
i:integer;
s:string;
begin
for i:=0 to sysSetRecord.numCol-1 do begin
if Terminated then begin
sCommInfo := chr(idThread+ord('A'))+'Çø±»Óû§ÖжÏ...';
Synchronize(dispCommStatus);
bErrBw := bErrBw+1;
break;
end;
//' '=±í»µ
if sysSetRecord.meterNumArr[idThread][i][1]=' ' then begin
if sysSetRecord.sDefineReadWrite<> '' then begin
if i<> ord(sysSetRecord.sDefineReadWrite[2]) then
continue;
end;
sMeterId :=copy(sysSetRecord.meterNumArr[idThread][i],
sysSetRecord.meterAt+1,sysSetRecord.meterLen); // 񡧏
// nMeterRow :=
nMeterCol :=i;
if sMeterId='' then
continue;
s := sendCmdTo485(i);
//writeln(hSaveEvent,s);
//Flush(hSaveEvent);
if WaitForSingleObject(Critical1,INFINITE)=Wait_Object_0 then
begin
try
saveCheckData(idThread,i,s); // clear data if error
except
;
end;
end; ReleaseMutex(Critical1);
if s[1]='E' then
bErrBw := bErrBw+1;
end;
end;
end;
begin
sCommInfo :='ÕýÔÚ'+sProcInfo+'...';
sCommInfo1 :='';
Synchronize(dispQYStatus);
DoComm;
//waitfor();
end;
procedure TCheckComThread.dispQYStatus;
begin
if WaitForSingleObject(Critical1,INFINITE)=Wait_Object_0 then
begin
frmInfo.InfoListView.Items[idThread].SubItems[0] :=sCommInfo;
frmInfo.InfoListView.Items[idThread].SubItems[1] :=sCommInfo1;
end;
releasemutex(Critical1);
end;
var
j:integer;
s:string;
begin
// sCmdIndex : integer; // ÃüÁîÐòºÅ
// sMeterId : shortstring; // 񡧏
//Ecount:=0;
if sMeterId='' then begin
result := 'E';
exit;
end;
if frmcommand.errCkkBox1.Checked then begin
sCommInfo := 'ÕýÔÚÓë±í'+sMeterId+'ͨÐÅ';
Synchronize(dispCommStatus);
end;
dispRunTimeInfo; for j:=1 to sysSetRecord.retry do begin
s := DoComWith485;
if s[1]<>'E' then begin break;
end
else begin
//Ecount:=Ecount+1;
dispRunTimeInfo;
sCommInfo := '['+char(idThread+ord('A'))+','+inttostr(nMCol+1)+
']±í'+sMeterId+copy(s,2,20);
if frmcommand.errCkkBox1.Checked then
Synchronize(dispCommStatus)
else begin
if j=sysSetRecord.retry then
Synchronize(dispCommStatus);
end;
if j=sysSetRecord.retry then
if WaitForSingleObject(Critical1,INFINITE)=Wait_Object_0 then
begin
try
pubclass.saveErrorInfo(sProcInfo+' '+sCommInfo);
except
;
end;
end;
ReleaseMutex(Critical1);
end;
end;
//sysSetRecord.Errcount:=Ecount;
result := s;
end;
function TCheckComThread.DoComWith485:shortstring;
procedure minuFEFE(iL:integer);
var
i:integer;
begin
for i:=1 to iL do
if CheckComClass.comRecvBuffer[idThread][i]=#$68 then begin// ¼ÓFEFE 2bytes
CheckComClass.comRecvBuffer[idThread] :=
copy(CheckComClass.comRecvBuffer[idThread],i,iL); break;
end;
end;
function checkRecvValid(sr:string):shortstring;
var
iL:integer;
begin
result :='';
if sr[1] <> #$68 then begin
result :='ÎÞ68HÍ·ÐÅÏ¢';
exit;
end;
if sr[9] <> cHeadCommand[sCmdIndex][3] then begin
result :='Ó¦´ðÃüÁîÐÅÏ¢´íÎó';
exit;
end;
iL:= ord(sr[10]);
if sr[11+iL]<>pubclass.checkSum(copy(sr,1,10+iL)) then begin
result :='УÑé´íÎó£¡';
exit;
end;
if sr[12+iL]<>#$16 then begin
result :='½áÊø·û´íÎó£¡';
exit;
end;
end;
var
sCmd,sErr:string;
f,iHZP,i,iRecvL:integer;
stB:tdatetime;
// {$IFDEF COM_DEBUG}
stB11:tdatetime;
sE:string;
// {$ENDIF}
begin iRecvL := 12+ord(cHeadCommand[sCmdIndex][4]);
if iRecvL>cComBufferSize then
iRecvL := cComBufferSize; commId.PurgeOut;
commId.Purgein;
pubclass.CommWait(sysSetRecord.SzhenDelay,false);
sCmd :={#$fe+#$fe+}CheckComClass.CreateCommandStr(sCmdIndex,sMeterId,sGetSendData);
// {$IFDEF COM_DEBUG}
stB11 := Now;
// {$ENDIF}// ver1.32 OLD:
if WaitForSingleObject(CriticalW,INFINITE)=Wait_Object_0 then
begin
for iHZP:=0 to length(sCmd)-1 do begin // 2001.11.29
commId.Write(sCmd[1+iHZP],1);
sleep(sysSetRecord.FDelayTime);
end;
end;
ReleaseMutex(CriticalW);
// ver1.33 NEW: 2002.2.5
stB := Now;// {$IFDEF COM_DEBUG}
//DEBUG_ROW := 5;
sE:=inttostr(trunc(abs(24*60*60*1000*(now-stB11))));// {$ENDIF} // ÓÃÓÚ¼ì²éʱÖÓ
CheckComClass.getTimeOfRecvStr(idThread); // ½µµÍʱ¼äÎó²î{$IFDEF COM_DEBUG} DEBUG_ROW := 6;
DEBUG_XXML('send...',sCmd);
{$ENDIF}
if CommDelay(sysSetRecord.type1,sysSetRecord.SDelayTime,iRecvL) then begin
// commId.read(CheckComClass.comRecvBuffer[idThread][1],iRecvL); // ¼ÓFEFE 2bytes
// minuFEFE(iRecvL); // ¼ÓFEFE 2bytes 2001.11.29
{$IFDEF COM_DEBUG}
DEBUG_ROW :=7;
DEBUG_XXML('recv...',copy(CheckComClass.comRecvBuffer[idThread],1,iRecvL));
{$ENDIF}
sErr := checkRecvValid(CheckComClass.comRecvBuffer[idThread]);
if sErr<>'' then
result :='E'+sErr
else begin
pubclass.CommWait(1500,false);
result :=' '+copy(CheckComClass.comRecvBuffer[idThread],1,12+ord(cHeadCommand[sCmdIndex][4]));
end;
end
else begin
{$IFDEF COM_DEBUG}
DEBUG_ROW :=7;
iRecvL := commId.InQueCount;
if iRecvL>0 then begin
commId.read(CheckComClass.comRecvBuffer[idThread][1],iRecvL);
DEBUG_XXML('rev='+inttostr(iRecvL),copy(CheckComClass.comRecvBuffer[idThread],1,iRecvL));
end
else
DEBUG_XXML('recv=0',' ');
{$ENDIF}
if frmcommand.errCkkBox1.Checked then begin
sCommInfo :=sMeterId+' esc:'+sE;
Synchronize(dispCommStatus);
end;
result :='EÎÞÓ¦´ð';
end;
end;
TCheckComThread = class(TThread)
private
bErrBw:integer;
sCommInfo :shortstring;
sCommInfo1 :shortstring;
sProcInfo:shortstring;
sCmdIndex : integer; // ÃüÁîÐòºÅ
sMeterId : shortstring; // 񡧏
nMeterCol:integer; // ±íλ
commId:TComm32;
// iRunIndex :integer; // ÔËÐÐÌáʾ·ûÐòºÅ// {$DEFINE COM_DEBUG}
{$IFDEF COM_DEBUG}
DEBUG_ROW :integer;
procedure DEBUG_XXML(sL,sCmd:shortstring);
procedure DEBUG_dispQYStatus;
{$ENDIF}
procedure dispRunTimeInfo;
function CommDelay(nDelay,bDelay,nRecvNum:integer):boolean;
procedure DoVisualSwap;
procedure dispCommStatus;
procedure dispQYStatus;
procedure threadDone(Sender: TObject);
function DoComWith485:shortstring;
function sendCmdTo485(nMCol:integer):shortstring;
procedure refreshParaInfo;
// procedure saveWriteInfo(nrow,ncol:integer;s:shortstring);
protected
procedure reCalErrField; virtual;
procedure Execute; override;
procedure VisualSwap;
function sGetSendData:shortstring ;virtual;
procedure DoComm; virtual;
// s:shortstring -> string
// s:shortstring -> string
// s:shortstring -> string
procedure saveCheckData(nrow,ncol:integer;s:string); virtual;
public
idThread:integer;
constructor Create(comm32:TComm32;Index,nCmd:integer;sCmdInfo:string);
end; TReadTime = class(TCheckComThread)
protected
// function sGetSendData:shortstring; override;
procedure saveCheckData(nrow,ncol:integer;s:string); override;
end; TSetTime = class(TCheckComThread)
protected
function sGetSendData:shortstring; override;
end; TReadPreiod = class(TCheckComThread)
protected
// function sGetSendData:shortstring; override;
procedure saveCheckData(nrow,ncol:integer;s:string); override;
end; TWritePreiod= class(TCheckComThread)
protected
function sGetSendData:shortstring; override;
end; TReadPower= class(TCheckComThread)
protected
procedure reCalErrField;override;
procedure saveCheckData(nrow,ncol:integer;s:string); override;
end; TWriteZERO= class(TCheckComThread)
protected
function sGetSendData:shortstring; override;
end; TWriteRESV= class(TCheckComThread)
protected
function sGetSendData:shortstring; override;
end; TWritePOWER= class(TCheckComThread)
protected
function sGetSendData:shortstring; override;
end; TReadPLUS= class(TCheckComThread)
protected
procedure reCalErrField;override;
procedure saveCheckData(nrow,ncol:integer;s:string); override;
end;
可以用一个子程序,处理发送一个数据包,在规定时间内等待读取应答数据包
这个子程序,必须是不能重入的,即多个线程不能同时调用,用同步对象控制
读取应答数据包应该用异步读取(重叠操作),或在循环读取中加入Sleep()适当延时,
不要不停读取,否则会造成系统负荷过重我想你的错误可能是发送后没有等待应答,这样可能发送了多个数据包,多个下位机同时应答数据,造成应答数据错误,而你的检测读取数据没有正确处理这种异常造成的。