Escribir datos en el esclavo con offset
Utilizar esta instrucción para escribir datos desde un maestro en un esclavo a través del puerto de comunicación utilizando el protocolo MEWTOCOL o Modbus RTU, según se haya definido en la configuración de los registros del sistema del puerto utilizado. Asegurarse de que el protocolo es el mismo para el maestro y el esclavo. Deben coincidir las áreas de memoria del maestro y del esclavo.
Para la transmisión de datos utilizando Modbus, el compilador genera comandos Modbus basados en las direcciones Modbus.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
Número de estación del esclavo (MEWTOCOL: 1–99,MODBUS: 1–247)
Ajustar a 1, si se aplica una SYS_ETHERNET_USER_CONNECTION_xx al Port de entrada
Área de palabras o registro en la unidad maestra donde se encuentran los datos que se van a escribir en el esclavo.
Número de palabras (bits) a enviar.
Opción 1:
Número de palabras
para Modbus RTU: 16#001–16#07F
para MEWTOCOL-COM: 16#001–16#1FD o 16#001–16#1B (FP0, FP-e)
Opción 2:
Palabra de control para la transferencia de bits: 16#8T0F con T para transferencia de bits al maestro y F para transferencia de bits al esclavo (excepto para FP7).
Área de memoria en el esclavo donde almacenar los datos (destino = SlaveMemoryArea + SlaveMemoryOffset).
Tipo de área de memoria |
Variable del Sistema |
---|---|
Relés internos |
|
Relés de enlace |
|
Entradas externas |
|
Salidas externas |
|
Relés internos |
|
Valor de preselección de temporizadores/contadores |
|
Valor actual de temporizadores/contadores |
|
Registros de datos |
|
Relés de enlace |
|
Registros de enlace |
|
Registros de fichero |
|
Registros de entrada |
|
Registros de salida |
Offset del área de memoria donde almacenar los datos en el esclavo (destino = SlaveMemoryArea + SlaveMemoryOffset).
Salida
Para FP7 solamente: Para obtener una descripción de todos los códigos de error, consultar la tabla de códigos de error de comunicación Modbus/MEWTOCOL.
Para otros PLCs: ajustar a 0
Durante el envío: Bandera de envío de la comunicación maestra es TRUE
Envío realizado: Bandera de envío de la comunicación maestra es FALSE
Finalización normal: FALSE
Finalización anormal: TRUE
si el área especificada utilizando el modificador índice supera el límite.
si el número de datos enviados especificado por Words_Bits es incorrecto.
si el área especificada utilizando el modificador índice supera el límite.
si el número de datos enviados especificado por Words_Bits es incorrecto.
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
bSetParameters: BOOL:=FALSE;
wWriteToSlaveResult: WORD:=0;
(*result of write to slave instruction*)
iSlaveStationNumber: INT:=0;
(*slave station number*)
arrParameters: ARRAY [0..15] OF DINT;
(*Array of parameters to be send to slave station*)
iSlaveMemoryOffset: INT:=100;
bBool: BOOL:=FALSE;
END_VAR
VAR CONSTANT
iSlaveMemoryArea_Bool: INT:=10000;
(*memory Area in slave station*)
iSlaveMemoryArea_Word: INT:=5;
(*memory Area in slave station*)
END_VAR
VAR
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_VARIN,,SYS_COM1_PORT,18,2,20,4,);
B(B_VARIN,,iSlaveStationNumber,18,3,20,5,);
B(B_VARIN,,arrParameters,11,4,13,6,);
B(B_CONTACT,,bSetParameters,4,1,6,3,);
B(B_VAROUT,,wWriteToSlaveResult,36,2,38,4,);
B(B_F,Size_Of_Var!,,13,5,20,7,,?D?C);
B(B_F,FP_WRITE_TO_SLAVE_AREA_OFFS!,,20,0,36,9,,?DEN?DnPort?DStationNumber?DSource?DWords_Bits?HSlaveMemoryArea?DSlaveMemoryOffset?AENO?CResult);
B(B_VARIN,,SYS_MEMORY_AREA_DT,18,6,20,8,);
B(B_VARIN,,iSlaveMemoryOffset,18,7,20,9,);
L(13,5,13,6);
L(1,2,4,2);
L(13,5,20,5);
L(6,2,20,2);
L(1,0,1,9);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bSetParameters) then
FP_WRITE_TO_SLAVE_AREA_OFFS(Port := SYS_COM1_PORT,
StationNumber := iSlaveStationNumber,
Source := arrParameters[0],
Words_Bits := Size_Of_Var(arrParameters[0]),
SlaveMemoryArea := SYS_MEMORY_AREA_DT,
SlaveMemoryOffset := iSlaveMemoryOffset,
Result => wWriteToSlaveResult);
end_if;