跳到主要内容

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_RInputBOOLEN_R为true则启用接收功能,若EN_R保持为true,则持续开启接收功能;
CONTInputBOOL控制UDP通信资源:
● false:回收释放通信资源。
● true:创建通信资源。
LENInputUDINTLEN表示最大支持接收的数据的字节数。
● 当LEN=0时,此时若Data大小>2048,报错0x80A5,否则默认按照将Data大小进行接收;
● 当LEN不为0时,则根据LEN的大小进行接收,若LEN的长度 > 2048或者 > DATA 的大小,会报错0x80A5。
CONFIGInOutUDP_CONFIG配置UDP通信的函数块实例。
DATAInOutANY_TYPE待接收的数据,ANY _TYP类型,支持基础类型、String以及UDT,注意:该接口赋值的变量仅能使用具有全局属性的变量(包含:GVS中定义的变量、PRG中定义的变量、FB实例的INPUT区、OUTPUT区、STATIC区定义的变量)
ADDRInOutADDR_PARAM用于记录当前所接收到数据的源IP地址和端口信息
DONEOuputBOOL状态参数,可具有以下值:
● false:接收作业尚未启动或仍在进行;
● true:接收作业已成功执行。此状态将仅显示一个周期。
BUSYOuputBOOL状态参数,可具有以下值:
●false:接收作业尚未启动或已完成。
● true:接收作业尚未完成。
ERROROuputBOOL状态参数,可具有以下值:
●false:无错误 ;
●true:创建通信资源或接收数据出错。
STATUSOuputWORD当前函数执行过程的状态;
RCVD_LENOutputUDINT实际接收到的数据长度,只有当done = true时,会更新一次,并保持一个周期

状态码说明

STATUS(WORD 16#)说明
0000未调用
0001当前正在创建套接字
7000未激活任何任务,REQ检测到上升沿,但是CONT为false
7001创建套接字成功
7006接收数据中
7007主动回收通信资源成功
7008接收数据成功
以下为异常情况状态码说明
8080创建套接字失败,系统套接字资源不足
8081IP地址错误,原因有以下几种:
LocalAddress对应的IP地址不存在,即LocalAddress与PLC所有网口的IP均不匹配;
当前使用的LocalAddress对应的PLC网口协议不为以太网协议;
当前LocalAddress的值为0.0.0.0;
8082设置IP地址和端口号可复用错误
8083bind地址和端口号与socket失败,主要原因是当前端口已经被其他服务占用
80A1cont = 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下则不受影响。

示例

  • 示例如下动图所示:

alt text