SendData

Transmisión de datos por el puerto de comunicación o la conexión de usuario Ethernet

Esta instrucción envía datos utilizando un buffer de envío cuando se conecta un dispositivo externo (un PC, un instrumento de medida, un lector de códigos de barras) al puerto RS232C especificado o por la conexión de usuario Ethernet. Si se trata del puerto COM de la CPU, también borra el buffer de recepción, resetea la "bandera de recepción completa" y permite recibir el siguiente boque de datos.

Parámetros

Entrada

Port (WORD, INT, UINT)

Especificar los puertos de comunicación (dependiendo del tipo de PLC):

  • Puerto COM, por ejemplo SYS_COM0_PORT

  • Puerto Ethernet, por ejemplo SYS_ETHERNET_USER_CONNECTION_1

  • MCU/SCU por ejemplo 16#xx01 (xx = número de slot) en COM01

Start (WORD, INT, UINT)

Buffer de envío

NumberOfBytes (WORD, INT, UINT)

N º de bytes que faltan por transmitir:

  • Valor negativo: El código de fin de trama seleccionado en los registros del sistema no se añade a la cadena a enviar.

  • 0 (cero bytes): Preparar el sistema para la recepción de los siguientes datos

  • 16#8000: Conmuta el modo de comunicación

Observaciones

  • Cuando se ha enviado el número de bytes especificado, la bandera de "transmisión completa" pasa a TRUE. Se pueden enviar o recibir nuevos datos. Cualquier instrucción de envío pone la bandera "transmisión completa" a FALSE y no se pueden recibir datos. La evaluación de la bandera de "transmisión completa" puede ser útil en los casos en los que no se espera respuesta, por ejemplo, en los mensajes de difusión (broadcast).

  • SendData está encapsulado en las siguientes instrucciones:

    • SendCharacters

    • SendCharactersAndClearString

    • ClearReceiveBuffer

    • SetCommunicationMode

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)
  • si el área especificada utilizando el modificador índice supera el límite.

  • si se envía el número de bytes especificados en 'NumberOfBytes' al área especificada.

  • Banderas solo para la MCU:

    • si no se ha encontrado ninguna unidad MCU en el slot especificado o se deben enviar cero bytes.

    • Se ha especificado 16#8000 en el MEWTOCOL-COM Maestro/Esclavo.

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)
  • si el área especificada utilizando el modificador índice supera el límite.

  • si se envía el número de bytes especificados en 'NumberOfBytes' al área especificada.

  • Banderas solo para la MCU:

    • si no se ha encontrado ninguna unidad MCU en el slot especificado o se deben enviar cero bytes.

    • Se ha especificado 16#8000 en el MEWTOCOL-COM Maestro/Esclavo.

Ejemplo

En este ejemplo se transmiten los caracteres de la cadena sSendData. Definir un buffer de envío para 30 bytes, (ARRAY [0...15] OF WORD) y copiar 8 caracteres de una cadena (""ABCDEFGH"") en el buffer.

Buffer de envío:

La primera palabra del buffer de envío (offset 0) está reservada para el número de bytes a enviar. Por lo tanto, copiar los datos a partir de offset 1 (SendBuffer[1]).

Cuando comienza el envío (la condición de ejecución de la instrucción de envío pasa a TRUE), el valor en offset 0 se pone a 8. Al final de la transmisión, el valor en offset 0 se pone a 0 automáticamente. Se envían los datos almacenados desde offset 1 a offset 4 empezando por el byte de menor peso.

Transmitir los caracteres "ABCDEFGH" a un dispositivo externo conectado al puerto COM 1. El carácter de inicio de trama y el código de fin de trama por defecto son "No-STX" y "CR" respectivamente.

  1.  (1)  Bandera de "transmisión completa"
  2.  (2) Condición de ejecución
  3.  (3) Ejecución de la instrucción de envío
  4.  (4) Transmisión

Cabecera de la POU

Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU. Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.

	VAR
		bSend: BOOL:=FALSE;
			(*activates function*)
		sSendData: STRING[30]:='ABCDEFGH';
			(*up to 30 chars*)
		awSendBuffer: ARRAY [0..15] OF WORD:=[16(0)];
			(*for 30 chars + 1 word*)
	END_VAR

Cuerpo de la POU

Cuando bSend pasa a TRUE, F10_BKMV copia los caracteres de la cadena almacenada en sSendData al buffer awSendBuffer comenzando en awSendBuffer[1]. Las dos primeras palabras de una cadena de caracteres contienen la información de la cabecera (número máximo de caracteres y el número actual de caracteres). La cabecera no se copia en el buffer. Por lo tanto, introducir un offset de 2 en la dirección de inicio de la cadena antes de copiar los datos. Comprobar que el tamaño del buffer es suficiente para todos los datos a enviar. Cada elemento del array SendBuffer puede almacenar dos caracteres de SendString. SendBuffer[0] está reservado para el número total de bytes a enviar.

SendData envía los datos desde el primer elemento del buffer de envío awSendBuffer[0]) especificado por Start. La longitud de la cadena a enviar (8 bytes) se establece en NumberOfBytes. Utilizar la función LEN para calcular el número de bytes. Los datos se envían desde el puerto adicional COM1, especificado por Port.

Cuerpo LD

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 10 ;
        NETWORK_BODY
B(B_COMMENT,,Creating the send buffer,1,0,14,1,);
B(B_CONTACT,,bSend,3,2,5,4,R);
B(B_VAROUT,,awSendBuffer[1],26,4,28,6,);
B(B_F,F10_BKMV,,18,2,26,7,,?DEN?D@'s1'?Ds2?AENO?Cd);
B(B_F,Adr_Of_VarOffs_I!,,9,3,18,7,,?D@'Var'?DOffs?CAdr);
B(B_VARIN,,sSendData,7,4,9,6,);
B(B_F,AdrLast_Of_Var_I!,,9,7,18,9,,?D?C);
B(B_VARIN,,sSendData,7,7,9,9,);
B(B_VARIN,,2,7,5,9,7,);
L(5,3,18,3);
L(1,3,3,3);
L(18,3,18,4);
L(1,0,1,10);
L(18,6,18,8);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 7 ;
        NETWORK_BODY
B(B_COMMENT,,bSend sign of the bSend buffer via the serial interface,1,0,25,1,);
B(B_CONTACT,,bSend,3,2,5,4,R);
B(B_VARIN,,awSendBuffer[0],14,4,16,6,);
B(B_F,LEN!,,9,4,14,7,,?DIN?C);
B(B_VARIN,,sSendData,7,5,9,7,);
B(B_F,E_SendData!,,16,1,26,7,,?DEN?DPort?DStart?DNumberOfBytes?AENO);
B(B_VARIN,,1,14,3,16,5,);
L(1,3,3,3);
L(5,3,16,3);
L(14,6,16,6);
L(1,0,1,7);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Cuerpo en ST

if (DF(bSend)) then
    (* Copy all characters of the SendString to the SendBuffer from position 1 *)
    F10_BKMV(s1_Start := Adr_Of_VarOffs(Var := sSendData, Offs :=2), 
         s2_End := AdrLast_Of_Var(sSendData), 
         d_Start => awSendBuffer[1]);
    (* Send the data of the SendBuffer via the COM Port 2 of the MCU unit in slot 3 *)
    (* In SendBuffer[0] the number of bytes not yet transmitted is stored *)         
    SendData(Port :=1, start := awSendBuffer[0], NumberOfBytes := LEN(sSendData));
end_if;

IsTransmissionDone

Modificado el: 2022-04-19Comentarios sobre esta páginaLínea directa de Panasonic