跳到主要内容

7.15.14 创建UDP通信资源并发送数据

USEND_C(创建UDP通信资源并发送数据)

功能

  • USEND_C系统库用于异步创建UDP通信资源并发送数据
  • 该指令异步执行且具有以下功能:
    • 设置并创建UDP通信资源
    • 通过现有的通信资源发送数据回收释放当前通信资源
  • 设置并创建UDP通信资源
    • 用户在UDP_CONFIG配置块中配置好当前UDP通信中的本地IP地址和端口号之后,通过将CONT参数置为true,开始创建UDP通信资源
  • 通过现有的通信资源发送数据
    • 在成功创建好UDP通信资源后,状态码更新为0x7001,此时参数REQ检测到上升沿时会执行一次发送数据请求。用户需要在DATA块绑定需发送的数据变量并指定发送的长度,若未指定发送长度,即LEN = 0,则默认将DATA全部发送
    • 若DATA为STRING类型,当LEN = 0时,则默认发送82个字节的数据(String类型变量默认大小为82个字节)
    • 若DATA为UDT类型,当0 < LEN < DATA的大小,此时会根据LEN的值进行指定长度的数据发送
    • 参数REQ检测到上升沿时会执行一次发送数据请求,在UDP资源创建正常的情况下,会保证发送指定长度的数据完全才可进行下一次发送,若当前处于发送过程中,REQ检测到上升沿,此时不会再触发新的发送动作
    • 若发送过程中UDP通信资源已经不存在,则会在缓冲区清空当前已发送的字节数,等待UDP通信资源重新创建后,需要再次识别到上升沿才会重新进行新数据的发送
  • 终止和重置连接
    • 参数 CONT 由"true"置位为"false"时,将回收并释放UDP通信资源

参数说明

参数声明数据类型说明
REQInputBOOL在上升沿启动发送作业
CONTInputBOOL控制UDP通信资源:
● false:释放UDP通信资源
● true:创建UDP通信资源
LENInputUDINT● LEN表示最大支持发送的数据的字节数。UDP一次发送最大支持2048字节大小的数据
● 当LEN=0时,此时若Data大小>2048,报错0x80A5,否则默认将Data区域中的数据全部发送
● 当LEN不为0时,则根据LEN的实际值进行发送,若LEN的长度>2048或者 LEN > DATA 的大小,会报错0x80A5
CONFIGInOutUDP_CONFIG配置连接参数的UDP_CONFIG函数块实例。
DATAInOutANY_TYPE需要发送的数据,ANY _TYP类型,支持基础类型、String以及UDT,注意:该接口赋值的变量仅能使用具有全局属性的变量(包含:GVS中定义的变量、PRG中定义的变量、FB实例的INPUT区、OUTPUT区、STATIC区定义的变量)
ADDRInOutADDR_PARAM用于设置UDP发送端的通信伙伴的IP地址和端口号信息。
DONEOutputBOOL状态参数,可具有以下值:
● false:发送作业尚未启动或仍在进行
● true:发送作业已成功执行。此状态将仅显示一个周期。
BUSYOutputBOOL状态参数,可具有以下值:
● false:发送作业尚未启动或已完成。
● true:发送作业尚未完成。无法启动新发送作业。
ERROROutputBOOL状态参数,可具有以下值:
● false:无错误。
● true:创建UDP通信资源、发送数据、回收UDP通信资源时出错
STATUSOutputWORD当前函数执行过程的状态,当ERROR = 1时,可根据STATUS的值,判断当前出错的原因;

状态码说明

STATUS(WORD 16#)说明
0000未调用
0001当前正在创建套接字
7000未激活任何任务,REQ检测到上升沿,但是CONT为false
7001创建套接字成功
7005正在发送数据中
7007主动释放连接资源成功
7009发送数据成功
以下为异常情况状态码说明
8080创建套接字失败,系统套接字资源不足
8081IP地址错误,原因有以下几种:
LocalAddress对应的IP地址不存在,即LocalAddress与PLC所有网口的IP均不匹配;
当前使用的LocalAddress对应的PLC网口协议不为以太网协议;
当前LocalAddress的值为0.0.0.0;
8082设置IP地址和端口号可复用错误
8083bind地址和端口号与socket失败,主要原因是当前端口已经被其他服务占用
80A1通信资源尚未创建成功,当Cont置为true,REQ收到上升沿,用户激活了发送功能但此时尚未建立指定连接,报错80A1
80A3当前USEND_C使用的ADDR_PARAM参数为空,即IP地址或者端口为0
80A4数据块为空
80A5出现80A5,原因有以下三种:参数LEN大于2048、LEN的值大于数据块的大小、LEN为0,数据块大小大于2048
80A9发送数据失败
80AC异步函数入队失败
80C3当前UDPConfig对应的UDP通信资源已经被其他USEND_C块使用
80C4当前UDP资源已经被回收
80C5对端不可达
80C6未设置广播模式,但是往广播地址发送数据

注意事项

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

示例

  • 示例如下动图所示:

alt text