F145_WRITE_DATA

Escribir datos en el esclavo

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. Si los datos del esclavo no están disponibles en el área de usuario del maestro, utilizar F145_WRITE_DATA_TYPE_OFFS o F145F146_MODBUS_MASTER.

Para la transmisión de datos utilizando Modbus, el compilador genera comandos Modbus basados en las direcciones Modbus.

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

SlaveAddress (WORD, INT, UINT)

Número de estación del esclavo (MEWTOCOL: 0–99, MODBUS: 0–255, 0: Difusión)

Ajustar a 1, si se aplica una SYS_ETHERNET_USER_CONNECTION_xx al Port de entrada

MasterData (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

Dirección de origen en el maestro para los datos que se escribirán en el esclavo.

Salida

SlaveData (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)
  • Dirección destino en el esclavo donde se escriben los datos.

  • MasterData y SlaveData deben ser del mismo tipo de datos.

  • Para establecer el acceso a datos desde el maestro al esclavo se deben asignar direcciones de usuario fijas (las mismas direcciones que los datos del esclavo) en la lista de variables globales.

Observaciones

  • En lugar de utilizar esta instrucción F, se recomienda utilizar la instrucción más flexible:FP_WRITE_TO_SLAVE_AREA_OFFS.

  • Las instrucciones F145 o F146 solo se pueden ejecutar si no está activa ninguna de las dos instrucciones. Evaluar la bandera "F145/F146 no activa" para comprobar el estado de las instrucciones.

  • La instrucción F145 solicita que se envíen datos al esclavo. El proceso real se lleva a cabo al final del ciclo de scan.

  • Evaluar la bandera "F145/F146 error" para comprobar si la transmisión se ha completado sin errores.

  • Cuando se realiza una difusión (SlaveAddress a 0), comprobar que se la transmisión solamente se ejecuta una vez alcanzado el máximo tiempo de ciclo de scan.

  • Las instrucciones F145 o F146 no se pueden ejecutar si la dirección destino es un relé interno especial (desde R9000), un registro de datos especial (desde DT9000/DT90000), o un fichero de datos FL.

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)
  • Si los datos del esclavo o del maestro exceden el rango de direcciones disponibles.

  • 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 los datos del esclavo o del maestro exceden el rango de direcciones disponibles.

  • 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

Variables Globales

En la Lista de Variables Globales, se definen las variables a las que pueden acceder todas las POUs del proyecto.

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
		bBool1: BOOL:=FALSE;
		bRead1: BOOL:=FALSE;
		bWrite1: BOOL:=FALSE;
	END_VAR
	VAR_EXTERNAL
		Slave2_g_bY38: BOOL:=FALSE;
	END_VAR

Cuerpo de la POU

La variable del sistema sys_bPulse1s se copia en bBool1. Si bWrite1 y sys_bIsComPort1F145F146NotActive pasan a TRUE, bBool1 se escribe en la salida Y38 del esclavo 2.

Cuerpo LD

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_CONTACT,,sys_bPulse1s,3,1,5,3,);
B(B_COIL,,bBool1,24,1,26,3,);
L(5,2,24,2);
L(1,2,3,2);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 6 ;
        NETWORK_BODY
B(B_CONTACT,,sys_bIsComPort1F145F146NotActive,8,1,10,3,);
B(B_CONTACT,,bWrite1,18,1,20,3,);
B(B_VARIN,,SYS_COM1_PORT,21,2,23,4,);
B(B_VARIN,,2,21,3,23,5,);
B(B_VARIN,,bBool1,21,4,23,6,);
B(B_F,F145_WRITE_DATA!,Instance,23,0,33,6,,?DEN?DPort?DSlaveAddress?DMasterData?AENO?CSlaveData);
B(B_VAROUT,,Slave2_g_bY38,33,2,35,4,);
B(B_COIL,,bWrite1,36,1,38,3,E);
B(B_COIL,,bRead1,42,1,44,3,S);
L(1,2,8,2);
L(10,2,18,2);
L(20,2,23,2);
L(33,2,36,2);
L(38,2,42,2);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Cuerpo en ST

bBool1 := sys_bPulse1s;
if (bWrite1 and sys_bIsComPort1F145F146NotActive) then
    F145_WRITE_DATA(Port := SYS_COM1_PORT, 
                    SlaveAddress := 2, 
                    MasterData := bBool1, 
                    SlaveData => Slave2_g_bY38);    
    bRead1 := true;
    bWrite1 := false;
end_if;

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