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.
Entrada
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
Buffer de envío
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
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
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.
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.
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.
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
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.
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
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;