我有几个使用带有Indy组件的Delphi 6编写的程序,并试图找到一种方法来保持TCP连接,以防意外断开连接。
我们通过TCP连接到我们工厂车间的PLC,无论出于何种原因(操作员弄乱他们不应该做的事情,开关暂时停机,电线故障或任何情况),连接都会结束。
这导致我们的程序难以锁定。一旦PLC和PC之间发生断开连接,程序将停留很短的时间并最终锁定。
有没有办法在PLC和PC断开连接时保持连接,并重新建立连接而不锁定程序?
也许也有办法用TIdTCPClient
做到这一点?
如果我需要更具描述性,请说出来,我会尽力。
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
i : Integer;
begin
begin
if NOT IdTCPServer1.Active then exit;
try
Comm_Status := True;
{************************************************
Clear PC Buffer before Read
************************************************}
for i := 0 to giBufferSize -1 do begin
gabToPCBuffer[i] := 0;
end;
{************************************************
Recieve the buffer from PLC
************************************************}
// WE READ
AThread.Connection.ReadBuffer(gabToPCBuffer, giBufferSize);
StateMachineLogic; //Sort Through buffer and copy to server buffer
// WE SEND back to PLC
AThread.Connection.WriteBuffer(gabToPLCBuffer, giBufferToPLC );
except
//;
end;
end;
end;
答案 0 :(得分:0)
如果与客户端的TCP服务器连接正常与客户端断开连接,则会触发OnDisconnect事件。您的线程也会被标记为已终止,因此您应该在循环中检查这一点。
但是,对于非正常断开连接,TCP服务器将在下次读取或写入时立即出错。您已将读取和写入包装在空的try...except
块中。相反,你应该处理错误并摆脱循环。
对于Delphi 6,您应该将Indy组件更新到最新的Indy v9版本。