7.15.15 创建UDP通信资源并接收数据
URECV_C(创建UDP通信资源并接收数据)
功能
- URECV_C系统库用于异步创建UDP通信资源并接收数据。
- 该指令异步执行且具有以下功能:
- 设置并创建通信资源
- 通过现有的通信资源接收数据
- 回收并释放当前通信资源
- 设置并创建通信资源
- 用户在UDP_CONFIG配置块中配置好当前UDP通信中的本地IP地址和端口号之后,通过将CONT参数置为true,开始创建UDP通信资源;
- 通过现有的通信资源接收数据
- 在UDP通信资源成功创建后,将参数EN_R置为true时,即会开启接收数据功能。用户需要在DATA块绑定用于接收数据的数据变量并指定接收的长度;
- 若未指定接收长度,即LEN = 0,则默认将按照DATA的大小进行接收;若LEN不为0,则根据LEN的值进行接收;LEN的值 > 2048或者DATA的大小会报错;
- 终止和重置连接
- 参数 CONT 由“true”置位为“false”时,将回收并释放当前通信资源;
参数说明
| 参数 | 声明 | 数据类型 | 说明 |
|---|---|---|---|
| EN_R | Input | BOOL | EN_R为true则启用接收功能,若EN_R保持为true,则持续开启接收功能; |
| CONT | Input | BOOL | 控制UDP通信资源: ● false:回收释放通信资源。 ● true:创建 通信资源。 |
| LEN | Input | UDINT | LEN表示最大支持接收的数据的字节数。 ● 当LEN=0时,此时若Data大小>2048,报错0x80A5,否则默认按照将Data大小进行接收; ● 当LEN不为0时,则根据LEN的大小进行接收,若LEN的长度 > 2048或者 > DATA 的大小,会报错0x80A5。 |
| CONFIG | InOut | UDP_CONFIG | 配置UDP通信的函数块实例。 |
| DATA | InOut | ANY_TYPE | 待接收的数据,ANY _TYP类型,支持基础类型、String以及UDT,注意:该接口赋值的变量仅能使用具有全局属性的变量(包含:GVS中定义的变量、PRG中定义的变量、FB实例的INPUT区、OUTPUT区、STATIC区定义的变量) |
| ADDR | InOut | ADDR_PARAM | 用于记录当前所接收到数据的源IP地址和端口信息 |
| DONE | Ouput | BOOL | 状态参数,可具有以下值: ● false:接收作业尚未启动或仍在进行; ● true:接收作业已成功执行。此状态将仅显示一个周期。 |
| BUSY | Ouput | BOOL | 状态参数,可具有以下值: ●false:接收作业尚未启动或已完成。 ● true:接收作业尚未完成。 |
| ERROR | Ouput | BOOL | 状态参数,可具有以下值: ●false:无错误 ; ●true:创建通信资源或接收数据出错。 |
| STATUS | Ouput | WORD | 当前函数执行过程的状态; |
| RCVD_LEN | Output | UDINT | 实际接收到的数据长度,只有当done = true时,会更新一次,并保持一个周期 |
状态码说明
| STATUS(WORD 16#) | 说明 |
|---|---|
| 0000 | 未调用 |
| 0001 | 当前正在创建套接字 |
| 7000 | 未激活任何任务,REQ检测到上升沿,但是CONT为false |
| 7001 | 创建套接字成功 |
| 7006 | 接收数据中 |
| 7007 | 主动回收通信资源成功 |
| 7008 | 接收数据成功 |
| 以下为异常情况状态码 | 说明 |
|---|---|
| 8080 | 创建套接字失败,系统套接字资源不足 |
| 8081 | IP地址错误,原因有以下几种: LocalAddress对应的IP地址不存在,即LocalAddress与PLC所有网口的IP均不匹配; 当前使用的LocalAddress对应的PLC网口协议不为以太网协议; 当前LocalAddress的值为0.0.0.0; |
| 8082 | 设置IP地址和端口号可复用错误 |
| 8083 | bind地址和端口号与socket失败,主要原因是当前端口已经被其他服务占用 |
| 80A1 | cont = true,UDP通信资源尚未创建成功,但当前接收功能已经被激活 |
| 80A4 | 数据块为空 |
| 80A5 | 出现80A5,原因有以下三种:参数LEN大于2048、LEN的值大于数据块的大小、LEN为0,数据块大小大于2048 |
| 80A6 | 实际接收到的数据大于预期接收接收的长度,或者接收到的数据大于2048 |
| 80AA | 接收数据失败 |
| 80AC | 异步函数入队失败 |
| 80C3 | 当前UDP_CONFIG对应的UDP通信资源已经被其他URECV_C块使用 |
| 80C4 | 当期UDP资源已经被回收 |
注意事项
- EN_R为True时,开启UDP接收功能,不同于TCP采用数据流方式通信,UDP通信采用的则是数据报通信方式。即UDP的接收端只能一次接收一个来自对方的数据报内容,无法按照特定长度接收到指定大小数据,一旦对方发送的数据超过DATA大小或者LEN的大小,则会报错0x80C9;
- 当前URECV_C使用UDP_Config_1连接块进行接收动作时,若当前处于接收过程中尚未接收到数据时,将该URECV_C函数块删除,后续新建一个URECV_C_2同样使用UDP_Config_1连接块进行接收动作,此时会报错0x80C3,这是由于当前UDP_Config_1仍被之前的URECV_C函数块占用未能释放,此时需要释放回收UDP通信资源可以恢复正常;或者避免在接收过程中,删除URECV_C实例。(该设计为保障数据一致性,避免多个接收块同时使用一个连接块进行接收数据,从而导致收到的数据未往预期的DATA上存储。)
- 当前URECV_C使用UDP_Config_1连接块进行接收动作时,若当前处于接收过程中尚未接收完指定长度数据时,修改GVS表中URECV_C的初始值并进行增量下载,后续仍使用该连接块URECV_C进行接收动作,此时会报错0x80C3,这是由于修改初始值增量下载相当于新建了一个URECV_C接收块,此时需要释放回收UDP通信资源可以恢复正常;或者避免在接收过程中修改URECV_C实例的初始值。(该设计为保障数据一致性,避免多个接收块同时使用一个连接块进行接收数据,从而导致收到的数据未往预期的DATA上存储。)
- 使用UDT作为数据块进行接收时,要注意UDT默认4字节对齐,UDT中不足四字节的部分数据可能会在编译阶段进行补0直到满足4字节对齐的排布;若使用UDP通信块在天行PLC内部之间进行通信,不用关心UDT4字节对齐的事,若和L2或者第三方PLC厂家进行通信时,需要注意该问题。
- 天行PLC数据存储是按照小端存储,使用UDP函数块进行接收数据时,同样是采用的小端字节序进行接收的,若与第三方PLC厂家进行网络通讯时,需要根据实际场景进行大小端转换;
- 当多个URECV_C函数块使用同一个UDP_Config连接块时,同时只能有一个URECV_C函数块在接收数据,故而此时只能有一个接收函数块正常工作,其他的会报错80C3;在该场景下,避免使用不同优先级的TASK绑定不同的URECV_C函数块(这些URECV_C函数块使用同一个UDP_Config连接块),否则会出现接收数据紊乱的情况。若上述URECV_C函数块不使用同一个UDP_Config连接块的情况下,将其绑定在不同优先级的TASK下则不受影响。
示例
- 示例如下动图所示:
