FP_MC_PROTOCOL_WRITE

Escritura de datos en dispositivos externos mediante el protocolo MC

El PLC tiene el derecho de transmisión en la comunicación maestra. La comunicación se realiza enviando comandos a los dispositivos compatibles con el protocolo MC y recibiendo respuestas. Al especificar una dirección de memoria y ejecutar una instrucción de escritura en un programa de usuario, el PLC genera un mensaje conforme al protocolo automáticamente.

Parámetros

Entrada

Port (WORD, INT, UINT)

Puerto Ethernet, por ejemplo SYS_ETHERNET_USER_CONNECTION_1

Source (ANY)

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

El método de transferencia varía según el tipo de datos de Source.

Área de memoria especificada en Source

Método de transferencia

Nº de datos transmitidos

Observaciones

Área de memoria de 16 bits

WX, WY, WR, WL, DT, LD

Transmisión de palabras

1–960 palabras

Área de memoria de 1 bits

X,Y,R,L,DT,n,LD,n

Transmisión de bits

1–7168 bits

Cuando el número de datos transmitidos es impar, se añade el código ficticio de 4 bits 16#0.

DestMemoryArea (WORD, INT, UINT)

Área de memoria en el esclavo donde se escriben los datos.

Unidad

Tipo de área de memoria

Variable del Sistema

Bit

Entrada

X

Hexadecimal

SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X

Salida

Y

Hexadecimal

SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y

Relé de enlace

B

Hexadecimal

SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B

Relé interno

M

Decimal

SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M

Relé de retención

L

Decimal

SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L

Palabra

Registro de datos

D

Decimal

SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D

Registro de fichero

R

Decimal

SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R
ZR

Hexadecimal

SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR

Registro de enlace

W

Hexadecimal

SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W
DestMemoryOffset (DWORD, DINT, UDINT)

Offset del área de memoria del esclavo donde se escriben los datos.

Rango: 16#016#F7FFFF (0–16252927)

Salida

Result (WORD, INT, UINT)

Para FP7 solamente:

  • 0: Finalización normal

  • 1: El puerto de comunicación se utiliza para la comunicación maestra

  • 2: El puerto de comunicación se utiliza para la comunicación esclava

  • 3: Se excede el número de instrucciones de comunicación maestra que se pueden utilizar al mismo tiempo

  • 4: Tiempo de espera para transmisión

  • 5: Tiempo de espera de una respuesta

  • 6: Error en los datos recibidos

    Este error se produce cuando se recibe un telegrama anormal, p. ej. cuando hay un error de formato en la cabecera. En este caso, se descartan los datos recibidos.

  • 7: Área reservada insuficiente en el mapa de E/S

    Este error se produce cuando el número de conexiones Ethernet es superior a 16 (comunicación Ethernet avanzada). Comprobar si el área de palabras reservada para las banderas de control de comunicación es lo suficientemente grande para el número de conexiones Ethernet.

  • 8: Búfer de envío actualmente en uso

    Este error puede producirse en PLCs FP7 con versión de firmware 4.57 o posterior.

En caso de errores de comunicación, pueden establecerse otros códigos de error específicos del protocolo MC. Para más detalles, consultar la documentación del PLC utilizado.

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 puerto Ethernet es incorrecto o la conexión Ethernet está cerrada.

  • si el número de datos enviados especificado por Words_Bits es incorrecto.

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 puerto Ethernet es incorrecto o la conexión Ethernet está cerrada.

  • si el número de datos enviados especificado por Words_Bits es incorrecto.

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
		bEnable: BOOL:=FALSE;
		awValues: ARRAY [0..2] OF WORD:=[3(0)];
		diMemoryOffset: DINT:=0;
		iResult: INT:=0;
		abValues: ARRAY [0..2] OF BOOL:=[3(FALSE)];
		iPort: INT:=0;
	END_VAR

Cuerpo LD

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 6 ;
        NETWORK_BODY
B(B_COMMENT,,Bit transfer,2,0,10,1,);
B(B_COMMENT,,Memory Areas:	SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X ^SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B ^SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M ^SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L,13,0,39,6,);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 8 ;
        NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,abValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_COMMENT,,Memory Areas:	 ^SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W,13,0,39,5,);
B(B_COMMENT,,Word Transfer,2,0,10,1,);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 8 ;
        NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,awValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_COMMENT,,only valid for ethernet ports! ^--> Valid Ports:	SYS_ETHERNET_USER_CONNECTION_1 - SYS_ETHERNET_USER_CONNECTION_216,3,1,52,4,);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Cuerpo en ST

(*Bit transfer*)
If (bEnable) then
    FP_MC_PROTOCOL_WRITE(Port := iPort,
                         Source := abValues,
                         Words_Bits := Size_Of_Var(abValues), 
                         DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,
                         DestMemoryOffset := diMemoryOffset,
                         Result => iResult);
End_if;
(*Word transfer*)
If (bEnable) then
    FP_MC_PROTOCOL_WRITE(Port := iPort,
                         Source := awValues,
                         Words_Bits := Size_Of_Var(awValues), 
                         DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,
                         DestMemoryOffset := diMemoryOffset,
                         Result => iResult);
End_if;

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