跳到主要内容

7.15.1 建立TCP连接并接收数据

TRCV_C(建立TCP连接并接收数据)

功能

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

TRCV_C系统库用于异步建立TCP连接并接收数据(建立TCP连接并接收数据),该指令异步执行且具有以下功能:

  • 设置并建立通信连接

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

    • 在成功建立连接后,参数ENR若为true时,即会开启接收数据功能。用户需要在DATA块绑定用于接收数据的数据变量并指定接收的长度和接收模式;若未指定接收长度,即LEN = 0,则默认将按照DATA的大小进行接收
  • 终止和重置连接

    • 参数 CONT=0 时,将终止通信连接。当连接成功建立后,可将参数COM_RST置为true来重置当前连接;若当前连接尚未建立或者CONT置位为0时,将COM _RST置为True时将不会重置连接
信息

指令TRCV_C 内部使用了通信指令"TCON","TRCV","T_RESET"和"TDISCON"

ADHOC模式说明

  • ADHOC模式又称“动态接收模式”

    • 使用 Ad-hoc 模式可接收动态长度的数据。 将值1赋给参数 ADHOC,可以将当前接收函数设置为 Ad-hoc 模式。 开启ADHOC模式后,TRCV _C函数块接收到一个数据块之后,哪怕该数据块只有一个字节大小,“TRCV_C”指令会立即将该数据块传送至接收区,并置位 done = true。RCVD_LEN 表示当前实际接收到的数据大小。RCVD_LEN 的最小值为 1
  • 静态接收模式,接收指定长度的数据

    • 将值“0”赋给参数 ADHOC,可将当前接收函数设置为静态接收模式,来接收指定长度的数据。如果禁用 Ad-hoc 模式,在接收完 LEN 参数指定的数据长度后,才能完成数据接收。此后接收区中便有数据了(DATA 参数)。接收完成后,RCVD_LEN 参数中实际接收的数据长度(以字节为单位)与 LEN 参数中的数据长度一致。 开启静态接收模式,若LEN = 0,则所需接收的数据大小由DATA块的大小决定,只有当接收到DATA大小的数据才会置位Done一个周期

LD图形

alt text

参数说明

接口变量声明数据类型说明
EN_RInputBOOLEN_R为True则启用接收功能,若EN_R保持为true,则持续开启接收功能
CONTInputBOOL控制通信连接:
0:断开通信连接
1:建立并保持通信连接
LENInputUDINT要接收的数据的字节数
若=0,则默认接收Data大小的数据
若不为0,则根据LEN的大小进行接收
若LEN的长度 > 65535或者 > DATA 的大小,会报错
实际接收大小还取决于ADHOC的值
ADHOCInputBOOL接收模式:
0:表示启用的是静态接收模式,只有当接收到指定大小的数据时,done才会置为true并保持一个周期
1:表示启用的是动态接收模式,只要接收到数据,哪怕是1个字节,done也会置为true并保持一个周期
CONNECTInOutTCP_ConnectConfig配置连接参数的函数块实例,具体参见TCP_Connectconfig
DATAInOutANY_TYPE需要发送的数据,ANY _TYP类型,支持基础类型、String以及UDT
COM_RSTInOutBOOL重置连接参数,若为true则重置现有连接,当且仅当连接建立成功才会生效
DONEOutputBOOL状态参数,可具有以下值:
0:接收作业尚未启动或仍在进行
1:接收作业已成功执行
此状态将仅显示一个周期
BUSYOutputBOOL状态参数,可具有以下值:
0:接收作业尚未启动或已完成
1:接收作业尚未完成
ERROROutputBOOL状态参数,可具有以下值:
0:无错误
1:建立连接、传送数据或终止连接时出错
STATUSOutputWORD当前函数执行过程的状态
RCVD_LENOutputUDINT实际接收到的数据长度,只有当done = true时,会更新一次,并保持一个周期
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成功建立连接
7006接收数据中
7007主动断开连接
7008接收数据成功
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,但连接尚未建立
80A2主动断开连接失败
80A3重置连接失败
80A4数据块为空
80A5出现80A5,原因有以下三种:参数LEN大于65536
LEN的值大于数据块的大小
LEN为0,数据块大小大于65536
80A6接收到的长度小于预期,仅用于静态接收模式
80A7获取发送/接收缓冲BUF出错
80AA接收数据失败
80ABKeepAlive机制检测到物理层网络断开,保持一个周期,后续会保持在7002状态
80AC异步函数入队失败
80C3当前TConnectConfig对应的连接已经被其他TRCV_C块使用
80C5接收数据过程中,对端主动断开连接

注意事项

  • EN_R为True时,开启接收功能,若ADHOC = false时,接收数据函数只有在接收到指定大小的数据时,才会将接收到的数据同步到DATA中;若在接收到指定大小数据之前,将EN_R置为false关闭接收功能,此时会将已经接收到的部分数据清空,若发送方一直处于发送中,重新开启接收功能会导致收到的数据与发送端不一致;此时需要断开连接或者重置连接才可恢复。

  • 发送/接收过程中,修改DATA块的大小时,可能会导致收发数据不一致,需要保证在修改DATA大小前,先停止当前收发动作;或者在修改DATA块大小之后,发现收发数据不一致,此时可以重置一下连接解决

  • 当前TRCV_C使用TCP_Connectconfig_1连接块进行接收动作时,若当前处于接收过程中尚未接收完指定长度数据时,将该TRCV_C函数块删除,后续新建一个TRCV_C_2同样使用TCP_ConnectConfig_1连接块进行接收动作,此时会报错0x80C3,这是由于当前连接块TCP_ConnectConfig_1仍被之前的TRCV_C函数块占用未能释放,此时需要断开连接或者重置连接可以恢复正常;或者避免在接收过程中,删除TRCV_C实例。

  • 当前TRCV_C使用TCP_Connectconfig_1连接块进行接收动作时,若当前处于接收过程中尚未接收完指定长度数据时,修改GVS表中TRCV_C的初始值并进行增量下载,后续仍使用该连接块TRCV_C进行接收动作,此时会报错0x80C3,这是由于修改初始值增量下载相当于新建了一个TRCV_C接收块,此时需要断开连接或者重置连接可以恢复正常;或者避免在接收过程中修改TRCV_C实例的初始值。

  • 使用UDT作为数据块进行接收时,要注意UDT默认4字节对齐,UDT中不足四字节的部分数据可能会在编译阶段进行补0直到满足4字节对齐的排布;若使用TCP通信块在天行PLC内部之间进行通信,不用关心UDT4字节对齐的事,若和L2或者第三方PLC厂家进行通信时,需要注意该问题。

  • 天行PLC数据存储是按照小端存储,使用TCP函数块进行数据发送时,同样时采用的小端字节序进行发送的,若与第三方PLC厂家及逆行网络通讯时,需要根据实际场景进行大小端转换

  • 当多个TRCV_C函数块使用同一个TCP_ConnectConfig连接块时,同时只能有一个TRCV_C函数块在接收数据,故而此时只能有一个接收函数块正常工作,其他的会报错80C3;在该场景下,避免使用不同优先级的TASK绑定不同的TRCV_C函数块(这些TRCV_C函数块使用同一个TCP_ConnectConfig连接块),否则会出现接收数据紊乱的情况。若上述TRCV_C函数块不使用同一个TCP_ConnectConfig连接块的情况下,将其绑定在不同优先级的TASK下则不受影响。

示例

  • LD示例如下动图所示:

alt text

  • ST示例如下代码所示:
TRCV_C_1(
EN_R:=bVar,
CONT:=Switch,
LEN:=0,
ADHOC:=true,
CONNECT:=TCP_CONNECTCONFIG_1,
DATA:=iVar,
COM_RST:=RESET,
DONE=>OUT,
BUSY=>OUT2,
ERROR=>OUT3,
STATUS=>OUT4,
RCVD_LEN=>OUT5
);