Bloque que ejecuta una escritura de hasta 16 registradores de 16 bits (vía Write Single Register o Write Multiple Registers) de un servidor en red Modbus TCP.
Representación Ladder

Estructura del Bloque
Tipo de Variable |
Nombre |
Tipo de Dato |
Descripción |
VAR_INPUT |
Execute |
BOOL |
Habilitación del bloque |
ServerAddress |
DWORD |
Dirección IP del servidor (Ej: 192.168.0.1) |
|
ServerPort |
WORD |
Puerta Modbus TCP del servidor (Estándar: 502) |
|
UnitID |
BYTE |
UnitID del servidor (Estándar: 255) |
|
Function# |
BYTE |
Código de la función de escritura |
|
InitialDataAddress |
WORD |
Dirección del registrador inicial a ser escrito |
|
NumberOfData |
BYTE |
Número de registradores a ser escritos (1 a 16) |
|
Timeout# |
WORD |
Tiempo máximo de espera por la respuesta del servidor [ms] |
|
Offset# |
BOOL |
Indicación de offset en InitialDataAddress, o sea, necesidad de sustraer 1 de este número |
|
Value |
BYTE SINT USINT WORD UINT INT DWORD UDINT DINT REAL |
Variable que almacena los datos a ser escritos |
|
VAR_OUTPUT |
Done |
BOOL |
Habilitación de salida |
Active |
BOOL |
Señalizador de espera de respuesta |
|
Busy |
BOOL |
Señalizador de que la conexión está ocupada con otra solicitud |
|
Error |
BOOL |
Señalizador de error en la ejecución |
|
ErrorID |
BYTE |
Identificador del error ocurrido |
|
VAR |
MB_TCPWRITEREGISTER_INST_0 |
MB_TCPWRITEREGISTER |
Instancia de acceso a la estructura del bloque |
Operación
Este bloque, cuando detecta un flanco de subida en Execute, verifica si el servidor Modbus TCP, en la dirección especificada en ServerAddress, está libre para envío de datos (variable Busy en nivel FALSE). En caso que lo esté, enviará la solicitud de escritura de los valores de Value, en un número de registradores indicado por NumberOfData, a la dirección InitialDataAddress, utilizando la función escogida en Function#, y ajustará la salida Active, reseteándola al recibir la respuesta del servidor. En caso de que el servidor no esté libre, el bloque aguardará que Busy pase a nivel FALSE para reenviar la solicitud.
|
¡NOTA! En caso de Execute pase a nivel FALSE y Busy aún esté en nivel TRUE, la solicitud será cancelada. |
|
¡NOTA! Value es un array del número de bits de NumberOfData multiplicado por 16. O sea, en caso de que NumberOfData sea 16, Value podrá ser un array de 32 posiciones BYTE, 16 posiciones WORD u 8 posiciones DWORD. Es importante verificar esta compatibilidad para no generar errores en el bloque. |
Cuando Execute tiene valor FALSE, Done permanece FALSE. La salida Done sólo es activada cuando el bloque termina la ejecución exitosamente, permaneciendo en nivel TRUE hasta que Execute reciba FALSE.
En caso de que haya algún error en la ejecución, la salida Error será activada y ErrorID exhibirá el código del error según la tabla de abajo.
Código |
Descripción |
0 |
Ejecutado exitosamente |
1 |
Algún dato de entrada inválido |
2 |
Cliente no habilitado |
4 |
Timeout en la respuesta del servidor |
5 |
Servidor retornó error |
6 |
Falla al conectarse con el servidor |
7 |
Conexión TCP/IP terminada prematuramente |
Compatibilidad
Equipo |
Versión |
PLC300 |
1.30 o superior |
Diagrama de Flujo del Bloque

Ejemplo en Ladder

El ejemplo de arriba solicita la escritura del dato contenido en VALUE, de tamaño descrito por DATA_COUNT, en las direcciones posicionados a partir de INIT, en el servidor Modbus TCP de dirección SERVER:PORT, a través de la función Write Multiple Registers. Finalizado exitosamente el bloque, será activada la salida Done.
Ejemplo en ST
El siguiente ejemplo muestra las instrucciones para aplicar el ejemplo anterior en el lenguaje ST.
VAR SERVER : DWORD := 16#C0A8000A; // 192.168.0.10 = 3232235530 PORT : WORD := 502; UNITID : BYTE := 255; INIT : WORD; DATA_COUNT : BYTE; VALUE : ARRAY [0..4] OF WORD; MBTCP_WRITEREGISTER_INST_0 : FB_MBTCP_WriteRegister; END_VAR
MBTCP_WRITEREGISTER_INST_0.Execute := DI1; MBTCP_WRITEREGISTER_INST_0( ServerAddress:=SERVER, ServerPort:=PORT, UnitID:=UNITID, Function:=16, InitialDataAddress:=INIT, NumberOfData:=DATA_COUNT, Timeout:=50, Offset:=0, Value := VALUE); DO1 := MBTCP_WRITEREGISTER_INST_0.Done;
|
|---|