Transmite los datos al interlocutor.
Transmite los datos al interlocutor. Los datos se leen desde un búfer que proporciona la aplicación. Devuelve el número de bytes enviados al sitio remoto como UDINT.
Para obtener información adicional sobre los métodos de envío, consulte la sección Método de envío.
Entrada |
Tipo de datos |
Rango válido |
Descripción |
---|---|---|---|
i_pbySendBuffer |
POINTER TO BYTE |
- |
Dirección de inicio del búfer que contiene los datos a enviar. |
In_Out |
Tipo de datos |
Rango válido |
Descripción |
---|---|---|---|
iq_udiFillLevel |
UDINT |
De 1 a 2147483647 |
Indica el nivel de llenado del búfer. Antes de la llamada de función: Número de bytes que se enviarán a partir de la dirección de inicio del búfer. Tras la llamada de función: Número de bytes en el búfer que no se han podido enviar. |
oFB_TCPClient/FB_TCPClient2
Los métodos de envío de datos, proporcionados por los bloques de funciones FB_TCPClient/FB_TCPClient2 y FB_TCPServer/FB_TCPServer2 de esta biblioteca, ofrecen el parámetro de entrada/salida iq_udiFillLevel. Este parámetro determina el número de bytes del búfer que aún no se han enviado. En cada ejecución de la función el valor se actualiza quitando del valor original el número de bytes enviados. Además, los bytes que quedan en el búfer se copian en el área superior de este (los datos se envían a partir de la dirección de inicio i_pbySendBuffer).
Si el nivel de llenado es 0 tras la llamada de función, todos los datos se han enviado y el contenido del búfer permanece inalterado.
En los casos en que los datos no se han podido copiar por completo a la pila TCP del controlador en una llamada de función, se puede volver a llamar una y otra vez a la función de enviar correspondiente sin modificar el parámetro iq_udiFillLevel desde la última llamada de función y sin tener que mover datos dentro del búfer.
En los gráficos siguientes se indica el contenido del búfer y la modificación del parámetro iq_udiFillLevel para dos llamadas de función, donde la función se ejecutó correctamente cada vez.
Fase |
Descripción |
Ilustración |
---|---|---|
1 |
Antes de la primera llamada de la función, el puntero se establece en el primer índice del búfer. El nivel de llenado se establece al número de bytes que enviar. En este ejemplo ilustrado, el búfer de la pila TCP está vacío y su tamaño es menor que el búfer de envío de la aplicación. |
![]()
|
2 |
Durante la primera llamada de función, se ha copiado la cantidad máxima de datos (tamaño de la pila TCP) del búfer de envío de la aplicación en la pila TCP. La función ha copiado los datos que quedan en el búfer de envío de la aplicación en el área superior del búfer. La función ha actualizado el parámetro iq_udiFillLevel e indica el número de bytes que no se han podido enviar. Se ejecuta la segunda llamada de función sin modificaciones de los parámetros. Mientras tanto, la pila TCP ha enviado los datos al sitio remoto por lo que ya hay espacio disponible de nuevo en el búfer de pila TCP. |
![]()
|
3 |
Durante la segunda llamada de función, los datos que quedaban en el búfer de envío de la aplicación se han copiado a la pila TCP. La función ha actualizado el parámetro iq_udiFillLevel e indica 0. El contenido del búfer de envío permanece inalterado. Cualquier llamada de función posterior se cancelará con el resultado FillLevelOutOfRange. |
![]()
|
Aunque la función le permite enviar datos en varias llamadas de función, ha de tener cuidado de mantener una relación equilibrada entre:
oEl búfer de envío de la aplicación y el búfer de envío del socket TCP
oEl búfer de envío local y el búfer de recepción del sitio remoto.
oEl intervalo de envío de la aplicación y el tiempo de procesamiento del sitio remoto.
Para modificar el tamaño del búfer de envío, utilice las propiedades correspondientes del bloque de funciones o ajuste la configuración predeterminada a través de las variables globales de TCPUDP.GVL (consulte GVL).
Límites de datos por llamada de función
En función del controlador, la cantidad de datos que se han de copiar en una llamada de función de uno de los métodos Receive, Send o Peek es limitada.
Controlador |
Número de bytes que se pueden copiar cada vez* |
---|---|
M258, LMC058, M241, M251 |
2048 bytes |
PacDrive LMC, M262 |
>10 000 000 bytes (limitado por la memoria de la aplicación) |
*Este es el valor máximo de la diferencia entre el tamaño del búfer y el nivel de llenado. |
Caso especial - Sin envío de datos
Si el valor de retorno del método indica 0, no se han enviado datos y el resultado del bloque de funciones asociado es distinto de Ok. Por lo tanto, compruebe el resultado utilizando el método Result de la instancia del bloque de funciones después de cada llamada de función. Si el resultado indica BufferFull, debe restablecer el resultado e intentar volver a enviar los datos durante el siguiente ciclo de programa como está previsto en el caso de que no se hayan enviado todos los datos.
Si sigue apareciendo el resultado BufferFull, optimice el parámetro de la aplicación:
oAumentar el tamaño del búfer de envío del socket
oAumentar el tamaño del búfer de recepción del socket en el sitio remoto
oAdaptar el ciclo de envío al tiempo de procesamiento del sitio remoto