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图形
参数说明
接口变量 | 声明 | 数据类型 | 说明 |
---|---|---|---|
EN_R | Input | BOOL | EN_R为True则启用接收功能,若EN_R保持为true,则持续开启接收功能 |
CONT | Input | BOOL | 控制通信连接: 0:断开通信连接 1:建立并保持通信连接 |
LEN | Input | UDINT | 要接收的数据的字节数 若=0,则默认接收Data大小的数据 若不为0,则根据LEN的大小进行接收 若LEN的长度 > 65535或者 > DATA 的大小,会报错 实际接收大小还取决于ADHOC的值 |
ADHOC | Input | BOOL | 接收模式: 0:表示启用的是静态接收模式,只有当接收到指定大小的数据时,done才会置为true并保持一个周期 1:表示启用的是动态接收模式,只要接收到数据,哪怕是1个字节,done也会置为true并保持一个周期 |
CONNECT | InOut | TCP_ConnectConfig | 配置连接参数的函数块实例,具体参见TCP_Connectconfig |
DATA | InOut | ANY_TYPE | 需要发送的数据,ANY _TYP类型,支持基础类型、String以及UDT |
COM_RST | InOut | BOOL | 重置连接参数,若为true则重置现有连接,当且仅当连接建立成功才会生效 |
DONE | Output | BOOL | 状态参数,可具有以下值: 0:接收作业尚未启动或仍在进行 1:接收作业已成功执行 此状态将仅显示一个周期 |
BUSY | Output | BOOL | 状态参数,可具有以下值: 0:接收作业尚未启动或已完成 1:接收作业尚未完成 |
ERROR | Output | BOOL | 状态参数,可具有以下值: 0:无错误 1:建立连接、传送数据或终止连接时出错 |
STATUS | Output | WORD | 当前函数执行过程的状态 |
RCVD_LEN | Output | UDINT | 实际接收到的数据长度,只有当done = true时,会更新一次,并保持一个周期 |
BUSY、DONE 和 ERROR 参数补充说明
-
使用 BUSY、DONE、ERROR 和 STATUS 参数可以检查作业的状态。参数 BUSY 表示接收函数正在执行
-
使用 DONE 参数可检查接收任务是否已成功执行
- 如果“ERROR”为1,表示连接/断连/重置/接收过程中出错
- 错误信息通过参数 STATUS 输出
-
其中Done和Busy在建立连接过程中不会置位
- 下表列出了参数 BUSY、DONE 和 ERROR 之间的关系
BUSY | DONE | ERROR | 说明 |
---|---|---|---|
1 | 0 | 0 | 发送作业正在处理 |
0 | 1 | 0 | 发送作业已成功完成 |
0 | 0 | 1 | 由于出错,导致作业结束 错误原因通过参数 STATUS 输出 |
0 | 0 | 0 | 未分配新作业 |
状态码说明
STATUS(WORD 16#) | 说明 |
---|---|
0000 | 未调用 |
0001 | 当前正在创建套接字 |
7000 | 未激活任何任务,REQ检测到上升沿,但是CONT为false |
7001 | 创建套接字成功 |
7002 | 正在建立通信连接 |
7003 | 通信建立正在关闭中 |
7004 | 成功建立连接 |
7006 | 接收数据中 |
7007 | 主动断开连接 |
7008 | 接收数据成功 |
8000 | 正在重置连接 |
以下为异常情况状态码 | 说明 |
---|---|
8080 | 创建套接字失败,系统套接字资源不足 |
8081 | IP地址错误,原因有以下几种: LocalAddress对应的IP地址不存在,即LocalAddress与PLC所有网口的IP均不匹配; 当前使用的LocalAddress对应的PLC网口协议不为以太网协议; 当前LocalAddress的值为0.0.0.0; |
8082 | 设置IP地址和端口号可复用错误 |
8083 | bind地址和端口号与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 | 接收数据失败 |
80AB | KeepAlive机制检测到物理层网络断开,保持一个周期,后续会保持在7002状态 |
80AC | 异步函数入队失败 |
80C3 | 当前TConnectConfig对应的连接已经被其他TRCV_C块使用 |
80C5 | 接收数据过程中,对端主动断开连接 |
注意事项
-
EN_R为True时,开启接收功能,若ADHOC = false时,接收数据函数只有在接收到指定大小的数据时,才会将接收到的数据同步到DATA中;若在接收到指定大小数据之前,将EN_R置为false关闭接收功能,此时会将已经接收到的部分数据清空,若发送方一直处于发送中,重新开启接收功能会导致收到的数据与发送端不一致;此时需要断开连接或者重置连接才可恢复。
-
发送/接收过程中,修改DATA块的大小时,可能会导致收发数据不一致,需要保证在修改DATA大小前,先停止当前收发动作;或者在修改DATA块大小之后,发现收发数据不一致,此时可以重置一下连接解决