# Rockwell EtherNet/IP

> Conectar controladores Allen-Bradley sobre EtherNet/IP: ControlLogix, CompactLogix, PLC-5, SLC 500, MicroLogix y Micro800, sus direcciones de tag, tipos de dato y descubrimiento por red.

El driver **Rockwell EtherNet/IP** habla con controladores Allen-Bradley / Rockwell
sobre EtherNet/IP. Los controladores ControlLogix y CompactLogix se direccionan por el
nombre de tag del controlador declarado en el proyecto de Logix, un Micro800 por el
nombre de su variable global, y un PLC-5, SLC 500 o MicroLogix por dirección de
archivo de datos, sin ningún mapa de registros de por medio. Agregue un dispositivo
bajo el driver Rockwell EtherNet/IP en el [Connector](connector) y elija su **Familia
del controlador**; el panel muestra solo los campos que usa esa familia.

## Familias de controlador {#controller-families}

La **Familia del controlador** del dispositivo decide cómo se alcanza el controlador y
cómo se direccionan sus tags:

| Familia del controlador | Controladores | Los tags se direccionan por | Ranura |
| --- | --- | --- | --- |
| **ControlLogix / CompactLogix** | ControlLogix, CompactLogix | **Tag del controlador**, el nombre del tag | sí |
| **PLC-5** | PLC-5 con puerto Ethernet (PLC-5/20E, /40E, /80E) | **Dirección de archivo de datos**, como `N7:0` | no |
| **SLC 500** | SLC 5/05 | **Dirección de archivo de datos** | no |
| **MicroLogix** | MicroLogix 1100 y 1400, y los demás a través de un 1761-NET-ENI | **Dirección de archivo de datos** | no |
| **Micro800** | Micro820, Micro850, Micro870 | **Tag del controlador**, el nombre de una variable global | no |

ControlLogix / CompactLogix es el valor inicial, y un dispositivo creado antes de que
existiera el campo es uno de ellos, así que lee exactamente como siempre. Solo un
controlador ControlLogix o CompactLogix se alcanza por el backplane en una ranura:
cualquier otra familia responde en su propio puerto Ethernet, y su dispositivo no tiene
el campo **Ranura**. Un descubrimiento lee la familia en la identidad del controlador,
así que un controlador encontrado llega con su familia ya elegida.

## Conexión {#connection}

| Campo | Significado | Valor inicial |
| --- | --- | --- |
| **Host o IP** | Dirección IP o nombre de host del puerto Ethernet del controlador. | vacío |
| **Familia del controlador** | A qué familia pertenece el controlador; decide los campos de abajo y cómo se direccionan los tags. | ControlLogix / CompactLogix |
| **Ranura** | Solo ControlLogix / CompactLogix: en qué posición del chasis está montado el controlador, contada desde 0. | 0 |
| **Intervalo de sondeo (ms)** | El periodo de lectura de todo el dispositivo, para los tags que no lo invaliden. | 1,000 |

No hay campo de puerto: EtherNet/IP usa su puerto TCP estándar, el 44818. La ruta CIP
es el backplane más la **Ranura**, así que un controlador montado en cualquier lugar del
chasis es alcanzable; un controlador descubierto arranca en el slot 0 y el campo es
donde usted lo corrige. No hay campo de rack: una ruta CIP no lleva número de rack. Las
peticiones agotan su tiempo de espera a los 10 segundos. El encabezado del dispositivo
muestra el endpoint armado, por ejemplo `eip://192.168.0.10:0`, donde el número
que sigue a la dirección es el slot.

Un controlador de cualquier otra familia no lleva slot, y su encabezado nombra la
familia en su lugar, por ejemplo `eip://192.168.0.20?family=slc500`.

Cada tag puede poner su propio **Intervalo de sondeo (ms)**; un valor de 0 en el tag cae
en el intervalo del dispositivo.

## El direccionamiento {#addressing}

Un tag de Rockwell se direcciona con dos campos de la tarjeta Fuente del tag:

| Campo | Significado | Valores aceptados | Valor inicial |
| --- | --- | --- | --- |
| **Tag del controlador** | El nombre del tag tal como está declarado en el controlador. Obligatorio. | texto libre | vacío |
| **Desplazamiento en el tag (bytes, bits para BOOL)** | Dónde queda el valor dentro de los datos de ese tag: un desplazamiento en bytes, o un desplazamiento en bits para los tags booleanos. | de 0 a 255 | 0 |

El driver abre el tag del controlador que se nombra y saca el valor de su búfer de datos
en el desplazamiento. Para un tag atómico simple, el desplazamiento se queda en 0. El
desplazamiento es lo que permite que un solo tag del controlador sirva a varios canales:
un DINT al inicio de una estructura es el desplazamiento 0, el REAL cuatro bytes después
es el desplazamiento 4, y para un tag booleano el desplazamiento cuenta bits en lugar de
bytes.

| Para leer | Tag del controlador | Desplazamiento | Tipo de dato |
| --- | --- | --- | --- |
| Un DINT `Counter` de alcance de controlador | `Counter` | 0 | Int32 |
| Un DINT de alcance de programa en `Main` | `Program:Main.Counter` | 0 | Int32 |
| Un elemento de arreglo REAL `Temps[2]` | `Temps[2]` | 0 | Float |
| Un elemento de arreglo BOOL `Flags[5]` | `Flags[5]` | 0 | Boolean |
| El segundo DINT dentro de la estructura `Recipe` | `Recipe` | 4 | Int32 |
| El bit 3 de los datos de `Flags` | `Flags` | 3 | Boolean |

En un arreglo BOOL el índice nombra el BOOL, no la palabra de 32 bits del
controlador: `Flags[5]` es el BOOL 5, y un desplazamiento en bits cuenta a partir
del BOOL nombrado, así que `Flags[5]` con desplazamiento 2 es el BOOL 7.

El nombre llega entero al controlador, con puntos y todo, y una lectura y una escritura
del mismo tag aterrizan en el mismo lugar. Eso es lo que hace funcionar un nombre de
alcance de programa como `Program:Main.Counter`. Una ruta de miembro con puntos
(`MyUdt.Member`) la resuelve el controlador cuando el controlador publica ese miembro
por su nombre; donde no lo hace, nombre el tag base de alcance de controlador y llegue
dentro de él con el desplazamiento en bytes, que siempre funciona. La línea de solo
lectura **Dirección de origen (bus)** de la tarjeta Fuente muestra la dirección armada
conforme usted edita.

Un Micro800 se direcciona igual, por el nombre de una variable global como `Level`:
no tiene tags de alcance de programa que nombrar.

### Direcciones de archivo de datos {#data-file-addresses}

Un tag de PLC-5, SLC 500 o MicroLogix se direcciona con un solo campo, **Dirección de
archivo de datos**: la letra y el número del archivo, dos puntos y el elemento, y
después un miembro tras un punto o un bit tras una barra. No hay campo de
desplazamiento, porque la dirección nombra su propio elemento, miembro y bit, y el
campo rechaza mientras usted escribe una dirección que el driver no puede leer,
diciendo por qué.

| Archivo | Ejemplos | Lee | Tipo de dato |
| --- | --- | --- | --- |
| Entero (N) | `N7:0`, `N7:0/15` | una palabra de 16 bits, o uno de sus bits | Int16 o UInt16; Boolean para un bit |
| Bit (B) | `B3:0`, `B3:0/2` | una palabra de 16 bits, o uno de sus bits | Int16 o UInt16; Boolean para un bit |
| Punto flotante (F) | `F8:1` | un valor de punto flotante de 32 bits | Float |
| Entero largo (L) | `L9:0` | un entero de 32 bits | Int32 o UInt32 |
| Temporizador (T) | `T4:0.ACC`, `T4:0.PRE`, `T4:0.DN` | ACC o PRE, o el bit EN, TT o DN | Int16 o UInt16; Boolean para un bit |
| Contador (C) | `C5:0.ACC`, `C5:0.PRE`, `C5:0.DN` | ACC o PRE, o el bit CU, CD, DN, OV o UN | Int16 o UInt16; Boolean para un bit |
| Control (R) | `R6:0.LEN`, `R6:0.POS` | LEN o POS | Int16 o UInt16 |
| Estado (S) | `S:1`, `S:1/15` | una palabra del archivo de estado, o uno de sus bits | Int16 o UInt16; Boolean para un bit |
| Entrada (I), salida (O) | `I:0`, `I:0/1`, `O:0/1` | una palabra de la imagen de entradas o de salidas, o uno de sus bits | Int16 o UInt16; Boolean para un bit |

El **Tipo de dato** que se ofrece sigue al archivo, y escribir una dirección cuyo
archivo no guarda el tipo del tag lo cambia al del archivo. Los archivos de estado, de
entradas y de salidas pueden escribirse sin su número, como los escribe el software de
programación; el driver los envía como `S2:1`, `I1:0/1` y `O0:0/1`, y la línea
**Dirección de origen (bus)** lo muestra. En una dirección de entrada o de salida, el
elemento es la posición de la palabra en la imagen: las entradas integradas de un
MicroLogix van de `I:0/0` en adelante. Un elemento de temporizador, contador o
control se lee a través de uno de sus miembros, nunca entero, y los archivos de cadena,
ASCII, BCD, mensaje y PID no se leen. Un PLC-5 numera sus entradas y salidas en octal,
y el driver no lee esa numeración, así que sus archivos I y O se rechazan: lea ese
valor a través de un archivo de datos al que el programa lo copie. Si un archivo existe
solo se sabe al leerlo: un archivo que el controlador no tiene (`N9:0` sin N9) se lee
como error desde la primera lectura de ese tag, y todos los demás tags del dispositivo
siguen leyendo.

## Los tipos de dato {#data-types}

Todos los tipos atómicos de CIP están disponibles como **Tipo de dato** de un tag:

| Tipo de dato | Tipo de CIP | Tamaño |
| --- | --- | --- |
| Boolean | BOOL | 1 bit en el desplazamiento de bit |
| SByte | SINT | 1 byte |
| Byte | USINT | 1 byte |
| Int16 | INT | 2 bytes |
| UInt16 | UINT | 2 bytes |
| Int32 | DINT | 4 bytes |
| UInt32 | UDINT | 4 bytes |
| Int64 | LINT | 8 bytes |
| UInt64 | ULINT | 8 bytes |
| Float | REAL | 4 bytes |
| Double | LREAL | 8 bytes |

Las estructuras y los UDT no se admiten: solo se pueden leer o escribir los tipos
atómicos de arriba, que es para lo que existe el desplazamiento en bytes, para llegar a
los miembros que hay dentro de ellos. String falta a propósito en el selector: un STRING
de Logix no es un tipo atómico, sino una estructura con una longitud y un arreglo de 82
bytes, y el driver no lo sabe ni leer ni escribir. El orden de bytes en el bus es el
little-endian propio de CIP y se maneja automáticamente; no hay opción de orden de
bytes.

En un PLC-5, SLC 500 o MicroLogix, el tipo sigue en cambio al archivo de datos, como
muestra la tabla de direcciones de archivo de datos de arriba.

## Las escrituras {#writes}

Los tags cuyo **Acceso** es Lectura y escritura o Solo escritura se pueden escribir.
Una escritura manda el valor que se le pidió y nada más, así que un bit o un miembro
que cambia en el controlador en ese mismo instante nunca regresa a lo que era un
momento antes:

| El tag direcciona | Lo que manda la escritura |
| --- | --- |
| Un tag atómico completo (desplazamiento 0 y el tamaño del propio tag), o un tag BOOL | El valor, a ese tag |
| Un bit de un tag de tipo entero (`Flags`, desplazamiento 3, Boolean) | Nada más ese bit, como `Flags.3`: el controlador lo cambia ahí mismo y deja los demás bits como están |
| Un elemento de un arreglo BOOL (`Flags[5]`, Boolean) | Nada más ese BOOL, como el bit 5 de la primera palabra del arreglo (`Flags[0].5`): el controlador lo cambia ahí mismo y deja los demás BOOL de la palabra como están |
| Un valor dentro de una estructura (`Recipe`, desplazamiento 4) | Nada más ese miembro, por su nombre (`Recipe.Speed`), que se encuentra en la definición de la estructura que publica el controlador |

Una escritura que solo se podría hacer mandando de regreso el resto del tag se
rechaza, y el motivo menciona la dirección: una parte de un tag atómico (un Int16 en
el desplazamiento 2 de un DINT), un bit de un REAL, o un desplazamiento donde ningún
miembro de la estructura empieza con el tamaño del valor. En ese caso, direccione el
valor por su propio nombre, por ejemplo `Recipe.Speed` con desplazamiento 0. El
driver averigua a dónde van las escrituras de un tag en su primera escritura y lo
guarda mientras el dispositivo sigue conectado. Un tag nuevo arranca como Solo
lectura.

Una dirección de archivo de datos se escribe tal como se nombra: una palabra, un valor
de punto flotante o un miembro enteros, y un bit (`B3:0/2`, `T4:0.DN`) solo, que el
controlador cambia en el lugar, dejando los demás bits de su palabra como están.

## El descubrimiento {#discovery}

El botón Descubrir del Connector difunde una petición CIP List Identity en **todas las
redes en las que está esta computadora** y sigue escuchando hasta que pasen 10 segundos
sin ninguna respuesta nueva. El escaneo nombra esas redes mientras corre, así que un
resultado de cero dice a dónde fue realmente la pregunta: una estación con adaptadores
virtuales para máquinas, para WSL o para una VPN a menudo tiene más redes de las que el
operador espera, y los candidatos pueden llegar por cualquiera de ellas.

Las interfaces que no pueden llevar la petición se saltan: todo lo que no está arriba,
los adaptadores de loopback y de túnel, y una dirección que la interfaz se dio a sí
misma porque nadie contestó DHCP (169.254.x.x). Solo una respuesta que sea la respuesta
de identidad propia de un controlador se convierte en un dispositivo candidato,
nombrado con `eip://` más su dirección; cualquier otra cosa que conteste en el puerto de
EtherNet/IP se ignora y se dice en el diario técnico. Un controlador Omron contesta a la
misma petición y también se deja fuera, con una línea propia en el diario técnico: a un
controlador NJ, NX o NY lo ofrece el escaneo del driver [Omron](driver-omron#discovery).
Para cada candidato, el escaneo lee
después la lista de tags de alcance de controlador y ofrece sus tags atómicos como
canales candidatos, cada uno con el desplazamiento 0.
Un arreglo de un tipo atómico se ofrece como su primer elemento, en ese tipo
(`Temps[0]`, o `Grid[0,0]` con dos dimensiones), y un arreglo BOOL como un Boolean
sobre su primer BOOL (`Flags[0]`).

El descubrimiento descarta lo que el driver no puede sondear: los tags de estructura y
los UDT (los STRING de Logix incluidos) se tiran, y las entradas `Program:`, `Task:` y
`Map:` se saltan. Un controlador que está en una red en la que esta computadora no está
no contesta la difusión; agréguelo a mano.
Un tag de cualquier otro tipo, como un tipo de sistema, tampoco se ofrece, y el
diario técnico lo dice.

La identidad con la que responde un controlador lleva su número de catálogo, que nombra
su familia: un PLC-5, SLC 500, MicroLogix o Micro800 llega con su familia elegida y con
su dirección nombrándola (`eip://192.168.0.20?family=micrologix`). Un PLC-5, SLC 500
o MicroLogix no publica ninguna lista de tags, así que llega sin canales candidatos y
sus tags se escriben por dirección de archivo de datos; la lista de tags de un Micro800
se lee como la de un Logix.

Un controlador Logix o Micro800 que ya tiene vuelve a leer su lista de tags desde su propia página: **Descubrir tags**, en el encabezado de su tarjeta de tags, ofrece solo los tags del controlador para los que todavía no tiene tag, comparados por el nombre sin distinguir mayúsculas de minúsculas. Un controlador de archivos de datos no tiene lista que leer y no muestra Descubrir tags (vea [Descubrir los tags de un dispositivo](connector-discovery#discovering-a-devices-tags)).

## Bueno saber {#good-to-know}

- Cada petición al controlador agota su tiempo de espera a los 10 segundos, y la ventana
  de escucha del descubrimiento se cierra después de 10 segundos de silencio.
- El driver abre cada tag del controlador una sola vez y lo deja abierto mientras el
  equipo siga conectado, de modo que un controlador con decenas de tags se lee sobre las
  sesiones que ya tiene, en vez de abrir y cerrar una por cada lectura. Una lectura que
  falla suelta su tag, y la siguiente lo vuelve a abrir por el nombre.
- Renombrar un tag en el proyecto de Logix rompe el canal en silencio; el tag se lee
  entonces con mala calidad hasta que el nombre configurado vuelva a coincidir.
