跳到主要内容

7.15.2 建立TCP连接并发送数据

TSEND_C(建立TCP连接并发送数据)

功能

  • 支持双工模式,PLC作为主动连接方(客户端)和被动连接方(服务端)均可进行发送数据工作

  • TSEND_C系统库用于异步建立TCP连接并发送数据。(建立TCP连接并发送数据),其中所实现的功能项包含以下三部分:

    • 设置并将建立通信连接

      • 用户在connect块中配置好正确的IP地址和端口之后,通过将CONT参数置为true,开始启用连接功能建立通信连接
    • 通过现有的通信连接发送数据

      • 在成功建立连接后,参数REQ检测到上升沿时辉执行一次发送数据请求。用户需要在DATA块绑定需发送的数据变量并指定发送的长度,若未指定发送长度,即LEN=0,即默认将DATA全部发送
      • 若DATA为STRING类型,当LEN = 0时,则默认发送82个字节的数据(String类型变量默认大小为82个字节。)
      • 若DATA为UDT类型,当0 < LEN < DATA的大小,此时会根据LEN的值进行指定长度的数据发送;
      • 参数REQ检测到上升沿时会执行一次发送数据请求,在连接正常的情况下,会保证发送指定长度的数据完全才可进行下一次发送,若当前处于发送过程中,REQ检测到上升沿,此时不会再触发新的发送动作。
      • 若发送过程中连接断开,则会在缓冲区清空当前已发送的字节数,等待连接恢复后,需要再次识别到上升沿才会重新进行新数据的发送。
    • 终止或重置通信连接

      • 参数CONT由true置位为false时,将使用TDISCON函数块终止通信连接
      • 当连接成功建立后,可将参数COM_RST置为true来重置当前连接;若当前连接尚未建立或者CONT置位为false时,将COM_RST置为true时将不会重置连接
信息

指令TSEND_C 内部使用了通信指令"TCON"、"TSEND"、"T_RESET"和"TDISCON"

LD图形

alt text

参数说明

接口变量声明类型说明
REQInputBOOL在上升沿启动发送作业
CONTInputBOOL在控制通信连接:
0:断开通信连接
1:建立并保持通信连接
LENInputUDINT要发送的数据的字节数
若LEN等于0,则默认将Data区域中的数据全部发送
若LEN不等于0,则根据LEN的大小发送,若LEN的长度大于65535或者大于DATA的大小会报错
CONNECTInOutTCP_ConnectConfig配置连接参数的函数块实例,具体参见TCP_Connectconfig
DATAInOutANY_TYPE需要发送的数据,ANY_TYPE类型,支持基础类型,String以及UDT
COM_RSTInOutBOOL重置连接参数,若为true则重置现有连接,当且仅当连接成功才会生效
DONEOutputBOOL状态参数,可具有以下值
0:发送作业尚未启动或仍在进行;
1:发送作业已成功执行
此状态将仅显示一个周期
BUSYOutputBOOL状态参数,可具有以下值
0:发送作业尚未启动或已完成;
1:发送作业尚未完成。无法启动新发送作业
ERROROutputBOOL状态参数,可具有以下值
0:无错误;
1:建立连接、传送数据或终止连接时错误
STATUSOutputWORD当前函数执行过程的状态。当ERROR=1时,可根据STATUS的值,判断当前出错的原因
BUSY、DONE 和 ERROR 参数补充说明
  • 使用 BUSY、DONE、ERROR 和 STATUS 参数可以检查作业的状态。参数 BUSY 表示发送函数正在执行

  • 使用 DONE 参数可检查发送任务是否已成功执行

    • 如果“ERROR”为1,表示连接/断连/重置/发送过程中出错
    • 错误信息通过参数 STATUS 输出
  • 其中Done和Busy在建立连接过程中不会置位

  • 下表列出了参数 BUSY、DONE 和 ERROR 之间的关系
BUSYDONEERROR说明
100发送作业正在处理
010发送作业已成功完成,将保持一个周期
001由于出错,导致作业结束。错误原因通过参数 STATUS 输出
000未分配新作业

状态码说明

STATUS(WORD 16#)说明
0000未调用
0001当前正在创建套接字
7000未激活任何任务,REQ检测到上升沿,但是CONT为false
7001创建套接字成功
7002正在建立通信连接
7003通信建立正在关闭中
7004成功建立连接
7005发送数据中
7007主动断开连接
7009发送数据成功
8000正在重置连接
以下为异常情况状态码说明
8080创建套接字失败,系统套接字资源不足
8081IP地址错误,原因有以下几种:
LocalAddress对应的IP地址不存在,即LocalAddress与PLC所有网口的IP均不匹配;
当前使用的LocalAddress对应的PLC网口协议不为以太网协议;
当前LocalAddress的值为0.0.0.0;
8082设置IP地址和端口号可复用错误
8083bind地址和端口号与socket失败,主要是前端口已经被占用
8084将服务端套接字加至EPOLL侦听队列失败
8086接收新连接失败
8087移除客户端对应的Epoll event失败
80A0客户端连接服务端失败
80A1连接尚未建立,当Cont置为TRUE,REQ收到上升沿,用户激活了发送功能但此时尚未建立指定连接,报错80A1
80A2主动断开连接失败
80A3重置连接失败
80A4数据块为空
80A5出现80A5,原因有以下三种:参数LEN大于65536
LEN的值大于数据块的大小
LEN为0,数据块大小大于65536
80A7获取TCP对应的发送/接收缓冲BUF出错
80A8socket对应的发送缓冲区已满
80A9发送数据失败
80ABkeep-alive机制识别到物理层网络断开,只保留一个周期
80AC异步函数入队失败
80C3当前TConnectConfig对应的连接已经被其他TSEND_C块使用
80C5发送数据过程中,对端主动断开连接

注意事项

  • req接收到上升沿才能触发一次发送动作,发送数据函数只有在全部发送成功后,req识别到新的上升沿后才会触发新的发送动作并发送新的数据;
  • 发送/接收过程中,修改DATA块的大小时,可能会导致收发数据不一致,需要保证在修改DATA大小前,先停止当前收发动作; 或者在修改DATA块大小之后,发现收发数据不一致,此时可以重置一下连接解决
  • 当前TSEND_C使用TCP_Connectconfig_1连接块进行发送动作时,若当前处于发送过程中尚未完成一次发送动作时,将该TSEND_C函数块删除,后续新建一个TSEND_C_2同样使用TCP_ConnectConfig_1连接块进行发送动作,此时会报错0x80C3,这是由于当前连接块TCP_ConnectConfig_1仍被之前的TSEND_C函数块占用未能释放,此时需要断开连接或者重置连接可以恢复正常;或者避免在发送过程中,删除TSEND_C实例。
  • 当前TSEND_C使用TCP_Connectconfig_1连接块进行发送动作时,若当前处于发送过程中尚未完成一次发送动作时,修改GVS表中TSEND_C的初始值并进行增量下载,后续仍使用该发送块TSEND_C进行接收动作,此时会报错0x80C3,这是由于修改初始值增量下载相当于新建了一个TSEND_C发送块,此时需要断开连接或者重置连接可以恢复正常;或者避免在发送过程中,修改TSEND_C实例的初始值。
  • 使用UDT作为数据块进行发送时,要注意 UDT默认4字节对齐,UDT中不足四字节的部分数据可能会在编译阶段进行补0直到满足4字节对齐的排布;若使用TCP通信块在天行PLC内部之间进行通信,不用关心UDT4字节对齐的事,若和L2或者第三方PLC厂家进行通信时,需要注意该问题。
  • 天行PLC数据存储是按照小端存储,使用TCP函数块进行数据发送时,同样时采用的小端字节序进行发送的,若与第三方PLC厂家及逆行网络通讯时,需要根据实际场景进行大小端转换
  • 当多个TSEND_C函数块使用同一个TCP_ConnectConfig连接块时,同时只能有一个TSEND_C函数块在发送数据,此时只能有一个发送函数块正常工作,其他的会报错80C3; 在该场景下,避免使用不同优先级的TASK绑定不同的TSEND_C函数块(这些TSEND_C函数块使用用一个TCP_ConnectConfig连接块),否则会出现发送数据紊乱的情况。 若上述TSEND_C函数块不使用同一个TCP_ConnectConfig连接块的情况下,将其绑定在不同优先级的TASK下则不受影响

示例

  • LD示例如下动图所示:

alt text

  • ST示例如下代码所示:
TSEND_C_1(
REQ:=bVar,
CONT:=Switch,
LEN:=0,
CONNECT:=TCP_CONNECTCONFIG_1,
DATA:=iVar,
COM_RST:=RESET,
DONE=>OUT,
BUSY=>OUT2,
ERROR=>OUT3,
STATUS=>OUT4
);
bVar:=not bvar;
iVar:= iVar+1;