FP_WRITE_TO_SLAVE_AREA_OFFS

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.

Parámetros

Entrada

Port (INT)

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

StationNumber (WORD, INT, UINT)

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

Source (WORD, INT, UINT)

Área de palabras o registro en la unidad maestra donde se encuentran los datos que se van a escribir en el esclavo.

Words_Bits (WORD, INT, UINT)

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).

SlaveMemoryArea (WORD, INT, UINT)

Área de memoria en el esclavo donde almacenar los datos (destino = SlaveMemoryArea + SlaveMemoryOffset).

Tipo de área de memoria

Variable del Sistema

Relés internos

SYS_MEMORY_AREA_R

Relés de enlace

SYS_MEMORY_AREA_L

Entradas externas

SYS_MEMORY_AREA_X

Salidas externas

SYS_MEMORY_AREA_Y

Relés internos

SYS_MEMORY_AREA_WR

Valor de preselección de temporizadores/contadores

SYS_MEMORY_AREA_SV

Valor actual de temporizadores/contadores

SYS_MEMORY_AREA_EV

Registros de datos

SYS_MEMORY_AREA_DT

Relés de enlace

SYS_MEMORY_AREA_WL

Registros de enlace

SYS_MEMORY_AREA_LD

Registros de fichero

SYS_MEMORY_AREA_FL

Registros de entrada

SYS_MEMORY_AREA_WX

Registros de salida

SYS_MEMORY_AREA_WY

SlaveMemoryOffset (WORD, INT, UINT)

Offset del área de memoria donde almacenar los datos en el esclavo (destino = SlaveMemoryArea + SlaveMemoryOffset).

Salida

Result (WORD, INT, UINT)

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

Diagrama de tiempos

  1.  (1) Bandera "clear-to-send" (listo para envío) de la comunicación maestra, p. ej., sys_bIsEthernetUserConnection1MasterCommunication
  2.  (2) Comprobar que la bandera "clear-to-send (listo para envío) de la comunicación maestra es TRUE y verificar que la bandera de envío de la comunicación maestra es FALSE
  3.  (3) Bandera de envío de la comunicación maestra, p. ej., sys_bIsEthernetUserConnection1MasterCommunicationActive

    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

  4.  (4) Ejecutar esta instrucción
  5.  (5) Bandera de envío realizado de la comunicación maestra, p. ej., sys_bIsEthernetUserConnection1CommunicationError

    Finalización normal: FALSE

    Finalización anormal: TRUE

  6.  (6) Envío de datos
  7.  (7) Procesamiento de la respuesta recibida

Banderas de error

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

  • Si los datos del esclavo o del maestro exceden el rango de direcciones disponibles.
  • si el número de datos enviados especificado por Words_Bits es incorrecto.

  • Si el modo de comunicación no está configurado como MEWTOCOL-COM Maestro/Esclavo o Modbus RTU Maestro/Esclavo.
  • Si no esta instalado el casete de comunicaciones necesario para el puerto adicional (COM) seleccionado.
sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)
  • si el área especificada utilizando el modificador índice supera el límite.

  • Si los datos del esclavo o del maestro exceden el rango de direcciones disponibles.
  • si el número de datos enviados especificado por Words_Bits es incorrecto.

  • Si el modo de comunicación no está configurado como MEWTOCOL-COM Maestro/Esclavo o Modbus RTU Maestro/Esclavo.
  • Si no esta instalado el casete de comunicaciones necesario para el puerto adicional (COM) seleccionado.

Ejemplo

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
		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

Cuerpo de la POU

Cuerpo LD

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

Cuerpo en ST

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;

Modificado el: 2024-12-18Comentarios sobre esta páginaLínea directa de Panasonic