类型: |
功能块 |
适用的版本: |
V1.0.4.0 |
继承: |
- |
执行: |
- |
连接到 TCP 服务器以便能够进行数据交换。
库提供两种版本的 FB_TCPClient 功能块。FB_TCPClient2 是增强版本,支持使用 TLS(传输层安全)的连接。
是否支持使用 TLS 建立连接取决于使用 FB_TcpClient2 的控制器。请参阅控制器的相应手册,确认是否支持使用 TLS 开展 TCP 通讯。
两种功能块的工作原理相同。它们在所提供的属性和方法上有一定区别,详见相应章节。
通常的命令顺序是首先调用 ConnectConnectTls 方法指定要连接的服务器 IP 和 TCP 端口。然后循环地检索 State 属性值,直至属性值不同于 Connecting。如果状态不是 Connected,则不能建立连接。验证 Result 属性值以确定原因。必须先调用 Close 方法,然后才能再开始另一次连接尝试。
一旦状态为 Connected,并且属性 IsWritable 的值为 TRUE,便可使用 Send 和 Receive 方法交换数据。
要验证是否有数据处于读取就绪状态,可使用属性 IsReadable。
Peek 方法在使用方法上与 Receive 方法相同。差别在于,Peek 调用将数据保留在 TCP 栈的接收缓冲区,数据可以读取多次。当在实际有数据可用之前无法确定长度时,这可以用来确定是否已到达足够的数据以用于处理。如果到达的数据足够进行正确处理,则使用 Receive 方法从接收缓冲区中移除数据,以便为更多的传入数据腾出空间。
要检测远程站点是否断开,读取 PeerHasDisconnected 属性的值。如果连接已被服务器关闭,则 State 的值自动更改为 Shutdown。如果发生这种情况,虽然仍可读取剩余未处理的数据,但再也不可发送数据。
要正确地关闭连接,请调用 Shutdown 方法。连接的状态更改为 Shutdown,在这种状态下虽然可以读取传入数据,但不能发送更多的数据。如果传入数据已经被读取、处理或者不重要,可调用 Close 方法终止连接。
如果方法的处理不成功,Result 属性的值中会指出。每次调用方法后必须验证 Result 的值。结果可使用 ResetResult 方法重置为 Ok。
注意: 只要属性 Result 的值不等于 Ok,便会阻止所有方法。在这种情况下,会在不影响 Result 属性信息的情形下中止方法调用。
功能块没有输入和输出。其功能通过方法和属性来实现。您无需在您的应用中直接调用功能块。
PROGRAM LibDocu_TcpClient2
VAR
xConnect: BOOL;
xConnectTls: BOOL;
xClose: BOOL;
etResult: TCPUDP.ET_Result;
etState: TCPUDP.ET_State;
iState: INT;
fbTcpClient : TCPUDP.FB_TCPClient2;
stTlsSettings : TCPUDP.ST_TlsSettingsClient;
sIp: STRING(15) := '192.168.1.2';
uiPort : UINT := 12345;
END_VAR
CASE iState OF
0: // idle
IF xConnect OR xConnectTls THEN
IF xConnect AND_THEN fbtcpclient.Connect(sIp, uiPort) THEN
iState := 10;
ELSIF xConnectTls AND_THEN fbtcpclient.ConnectTls(sIp, uiPort, stTlsSettings) THEN
iState := 10;
ELSE
iState := 100; // error state
END_IF
xConnect := xConnectTls := FALSE;
END_IF
10: // connecting
CASE fbtcpclient.State OF
TCPUDP.ET_State.Connecting:
iState := 10; // stay in connecting
TCPUDP.ET_State.Connected:
iState := 20; // connected
ELSE
iState := 100; // unexpected state
END_CASE
20: // connected
IF xClose OR fbTcpClient.State = TCPUDP.ET_State.Shutdown THEN
xClose := FALSE;
fbTcpClient.Close();
END_IF
IF fbTcpClient.State = TCPUDP.ET_State.Closing THEN
;
ELSIF fbTcpClient.State = TCPUDP.ET_State.Idle THEN
iState := 0;
ELSIF fbTcpClient.State <> TCPUDP.ET_State.Connected THEN
iState := 100;
END_IF
(* your code comes here, e.g send data to the connected server *)
100: // error state
(* your code comes here*)
END_CASE
etResult := fbTcpClient.Result;
etState := fbTcpClient.State;