【发布时间】:2013-12-02 19:31:26
【问题描述】:
我有几个使用带有 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;
【问题讨论】:
-
请显示一些代码。 TIdTCPClient 代码“徘徊”在哪里,它是否在循环中运行读/写套接字操作?您的代码是否抑制了 Indy 套接字操作的异常(使用空的 except 块)?
-
目前我遇到的最大问题是 IdTCPServer 在发生断开连接时出现故障。使用 IdTCPClient,我只是在寻找信息,因为我们不经常使用它,但有计划。据我所知,连接不断在 PLC 和 PC 之间来回传递缓冲区,没有抑制异常。我可以提取的代码非常基本,但它几乎与我们在任何地方所做的相同。
-
您确实将 indy 组件更新为最新的 indy9(或更好,10)? D6 附带的组件不是 SMP 安全的。
-
没有这个版本的delphi除了一些串行组件外几乎是骨干。我们确实有 Delphi 7(也有骨库)和 XE3,但是对于我们目前遇到的问题,它是在 Delphi 6 中制作的。我相信我们可能可以在 delphi 7 或 XE3 中重新编译(希望不必)