Método Send

Descripción general

Tipo:

Método

Disponible desde:

V1.0.4.0

G-SE-0045952.1.gif-high.gif

 

 

Tarea

Transmite los datos al interlocutor.

Descripción funcional

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.

Interfaz

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.

Utilizado por

oFB_TCPClient/FB_TCPClient2

Métodos de envío

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.

Ejemplo de llamada de función

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.

G-SE-0058217.1.gif-high.gif

 

 

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.

G-SE-0058218.1.gif-high.gif

 

 

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.

G-SE-0058219.1.gif-high.gif

 

 

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