# Rockwell EtherNet/IP

> Conecte controladores Allen-Bradley por EtherNet/IP: ControlLogix, CompactLogix, PLC-5, SLC 500, MicroLogix e Micro800, os endereços das tags, os tipos de dado e a descoberta na rede.

O driver **Rockwell EtherNet/IP** conversa com controladores Allen-Bradley / Rockwell
por EtherNet/IP. Controladores ControlLogix e CompactLogix são endereçados pelo nome
da tag do controlador declarado no projeto Logix, um Micro800 pelo nome da sua
variável global, e um PLC-5, SLC 500 ou MicroLogix pelo endereço de arquivo de
dados, sem nenhum mapa de registradores envolvido. Adicione um dispositivo sob o
driver Rockwell EtherNet/IP no [Connector](connector) e escolha a **Família do
controlador** dele; o painel mostra só os campos que essa família usa.

## Famílias de controlador {#controller-families}

A **Família do controlador** do dispositivo decide como o controlador é alcançado e
como as tags dele são endereçadas:

| Família do controlador | Controladores | As tags são endereçadas por | Slot |
| --- | --- | --- | --- |
| **ControlLogix / CompactLogix** | ControlLogix, CompactLogix | **Tag do controlador**, o nome da tag | sim |
| **PLC-5** | PLC-5 com porta Ethernet (PLC-5/20E, /40E, /80E) | **Endereço de arquivo de dados**, como `N7:0` | não |
| **SLC 500** | SLC 5/05 | **Endereço de arquivo de dados** | não |
| **MicroLogix** | MicroLogix 1100 e 1400, e os outros por um 1761-NET-ENI | **Endereço de arquivo de dados** | não |
| **Micro800** | Micro820, Micro850, Micro870 | **Tag do controlador**, o nome de uma variável global | não |

ControlLogix / CompactLogix é o padrão, e um dispositivo criado antes de o campo
existir é um deles, então ele lê exatamente como sempre leu. Só um controlador
ControlLogix ou CompactLogix é alcançado pelo barramento traseiro num slot: toda
outra família responde na própria porta Ethernet, e o dispositivo dela não tem o
campo **Slot**. Uma varredura lê a família na identidade do controlador, então um
controlador encontrado chega com a família já escolhida.

## Conexão {#connection}

| Campo | Significado | Padrão |
| --- | --- | --- |
| **Host ou IP** | Endereço IP ou nome de host da porta Ethernet do controlador. | vazio |
| **Família do controlador** | A família à qual o controlador pertence; ela decide os campos abaixo e como as tags são endereçadas. | ControlLogix / CompactLogix |
| **Slot** | Só ControlLogix / CompactLogix: em qual posição do chassi o controlador está encaixado, contada a partir de 0. | 0 |
| **Intervalo de leitura (ms)** | Período de leitura de todo o dispositivo, para as tags que não o sobrepõem. | 1.000 |

Não existe campo de porta: o EtherNet/IP usa a porta TCP padrão 44818 dele. A rota
CIP é o barramento traseiro mais o **Slot**, então um controlador encaixado em qualquer
lugar do chassi é alcançável; um controlador descoberto começa no slot 0 e o
campo é onde você corrige isso. Não existe campo de rack: uma rota CIP não carrega número
de rack. As requisições expiram depois de 10 segundos. O cabeçalho do dispositivo mostra o
endpoint montado, por exemplo `eip://192.168.0.10:0`, em que o número depois
do endereço é o slot.

Um controlador de qualquer outra família não leva slot, e o cabeçalho dele nomeia a
família no lugar, por exemplo `eip://192.168.0.20?family=slc500`.

Cada tag pode definir o próprio **Intervalo de leitura (ms)**; um valor 0 na tag recai
no intervalo do dispositivo.

## Endereçamento {#addressing}

Uma tag Rockwell é endereçada por dois campos no cartão Origem da tag:

| Campo | Significado | Valores aceitos | Padrão |
| --- | --- | --- | --- |
| **Tag do controlador** | O nome da tag como declarado no controlador. Obrigatório. | texto livre | vazio |
| **Deslocamento na tag (bytes, bits para BOOL)** | Onde, dentro dos dados daquela tag, o valor está: um deslocamento de byte, ou um deslocamento de bit em tags booleanas. | 0–255 | 0 |

O driver abre a tag de controlador nomeada e retira o valor do buffer de dados
dela no deslocamento. Numa tag atômica simples, o deslocamento fica em 0. O deslocamento é
o que deixa uma tag de controlador atender vários canais: um DINT no começo de uma
estrutura fica no deslocamento 0, o REAL quatro bytes depois fica no deslocamento 4, e numa
tag booleana o deslocamento conta bits em vez de bytes.

| Para ler | Tag do controlador | Deslocamento | Tipo de dado |
| --- | --- | --- | --- |
| Um DINT de escopo de controlador `Counter` | `Counter` | 0 | Int32 |
| Um DINT de escopo de programa em `Main` | `Program:Main.Counter` | 0 | Int32 |
| Um elemento de vetor REAL `Temps[2]` | `Temps[2]` | 0 | Float |
| Um elemento de vetor BOOL `Flags[5]` | `Flags[5]` | 0 | Boolean |
| O segundo DINT dentro da estrutura `Recipe` | `Recipe` | 4 | Int32 |
| O bit 3 dos dados em `Flags` | `Flags` | 3 | Boolean |

Num vetor BOOL o índice nomeia o BOOL, não a palavra de 32 bits do controlador:
`Flags[5]` é o BOOL 5, e um deslocamento em bits conta a partir do BOOL nomeado,
então `Flags[5]` com deslocamento 2 é o BOOL 7.

O nome chega inteiro ao controlador, pontos incluídos, e uma leitura e uma
escrita da mesma tag caem no mesmo lugar. É isso que faz um nome de
escopo de programa como `Program:Main.Counter` funcionar. Um caminho de membro com ponto
(`MyUdt.Member`) é resolvido pelo controlador quando o controlador publica
aquele membro por nome; onde ele não publica, nomeie a tag base de escopo de controlador e
alcance o interior dela com o deslocamento de byte, o que sempre funciona. A linha somente
leitura **Endereço de origem (barramento)** do cartão Origem mostra o endereço montado
enquanto você edita.

Um Micro800 é endereçado do mesmo jeito, pelo nome de uma variável global como
`Level`: ele não tem tags de escopo de programa para nomear.

### Endereços de arquivo de dados {#data-file-addresses}

Uma tag de PLC-5, SLC 500 ou MicroLogix é endereçada por um campo só, **Endereço de
arquivo de dados**: a letra e o número do arquivo, dois-pontos e o elemento, e
depois um membro após um ponto ou um bit após uma barra. Não existe campo de
deslocamento, porque o endereço nomeia o próprio elemento, membro e bit, e o campo
recusa enquanto você digita um endereço que o driver não consegue ler, dizendo o
porquê.

| Arquivo | Exemplos | Lê | Tipo de dado |
| --- | --- | --- | --- |
| Inteiro (N) | `N7:0`, `N7:0/15` | uma palavra de 16 bits, ou um dos bits dela | Int16 ou UInt16; Boolean para um bit |
| Bit (B) | `B3:0`, `B3:0/2` | uma palavra de 16 bits, ou um dos bits dela | Int16 ou UInt16; Boolean para um bit |
| Ponto flutuante (F) | `F8:1` | um valor de ponto flutuante de 32 bits | Float |
| Inteiro longo (L) | `L9:0` | um inteiro de 32 bits | Int32 ou UInt32 |
| Temporizador (T) | `T4:0.ACC`, `T4:0.PRE`, `T4:0.DN` | ACC ou PRE, ou o bit EN, TT ou DN | Int16 ou UInt16; Boolean para um bit |
| Contador (C) | `C5:0.ACC`, `C5:0.PRE`, `C5:0.DN` | ACC ou PRE, ou o bit CU, CD, DN, OV ou UN | Int16 ou UInt16; Boolean para um bit |
| Controle (R) | `R6:0.LEN`, `R6:0.POS` | LEN ou POS | Int16 ou UInt16 |
| Status (S) | `S:1`, `S:1/15` | uma palavra do arquivo de status, ou um dos bits dela | Int16 ou UInt16; Boolean para um bit |
| Entrada (I), saída (O) | `I:0`, `I:0/1`, `O:0/1` | uma palavra da imagem de entradas ou de saídas, ou um dos bits dela | Int16 ou UInt16; Boolean para um bit |

O **Tipo de dado** oferecido segue o arquivo, e digitar um endereço cujo arquivo não
guarda o tipo da tag troca o tipo pelo do arquivo. Os arquivos de status, de
entradas e de saídas podem ser escritos sem o número, como o software de
programação os escreve; o driver os envia como `S2:1`, `I1:0/1` e `O0:0/1`, e
a linha **Endereço de origem (barramento)** mostra isso. Num endereço de entrada ou
de saída, o elemento é a posição da palavra na imagem: as entradas embutidas de um
MicroLogix vão de `I:0/0` em diante. Um elemento de temporizador, contador ou
controle é lido por um dos seus membros, nunca inteiro, e arquivos de string, ASCII,
BCD, mensagem e PID não são lidos. Um PLC-5 numera as entradas e as saídas em
octal, e o driver não lê essa numeração, então os arquivos I e O dele são recusados:
leia esse valor por um arquivo de dados para onde o programa o copia. Se um arquivo
existe só se sabe ao lê-lo: um arquivo que o controlador não tem (`N9:0` sem N9)
lê como erro desde a primeira leitura daquela tag, e todas as outras tags do
dispositivo continuam lendo.

## Tipos de dado {#data-types}

Todo tipo atômico do CIP está disponível como **Tipo de dado** de uma tag:

| Tipo de dado | Tipo CIP | Tamanho |
| --- | --- | --- |
| Boolean | BOOL | 1 bit no deslocamento 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 |

Estruturas e UDTs não são suportados: só os tipos atômicos acima podem ser
lidos ou escritos, e é por isso que o deslocamento de byte existe, para alcançar membros
dentro deles. O String está deliberadamente ausente do seletor: um STRING do Logix não é um
tipo atômico, e sim uma estrutura com um comprimento e um vetor de 82 bytes, e o driver
não consegue ler nem escrever um. A ordem de bytes no barramento é o little-endian do
próprio CIP e é tratada automaticamente; não existe opção de ordem de bytes.

Num PLC-5, SLC 500 ou MicroLogix, o tipo segue o arquivo de dados, como mostra a
tabela de endereços de arquivo de dados acima.

## Escritas {#writes}

Tags cujo **Acesso** é Leitura e escrita ou Somente escrita podem ser escritas. Uma escrita
envia o valor pedido e nada além dele, de modo que um bit ou um membro que mude no
controlador no mesmo instante nunca volta ao que era um momento antes:

| A tag endereça | O que a escrita envia |
| --- | --- |
| Uma tag atômica completa (deslocamento 0 e o tamanho da própria tag), ou uma tag BOOL | O valor, para essa tag |
| Um bit de uma tag de número inteiro (`Flags`, deslocamento 3, Boolean) | Só esse bit, como `Flags.3`: o controlador o altera ali mesmo e deixa os outros bits como estão |
| Um elemento de vetor BOOL (`Flags[5]`, Boolean) | Só esse BOOL, como o bit 5 da primeira palavra do vetor (`Flags[0].5`): o controlador o altera ali mesmo e deixa os outros BOOLs da palavra como estão |
| Um valor dentro de uma estrutura (`Recipe`, deslocamento 4) | Só esse membro, pelo nome (`Recipe.Speed`), encontrado na definição da estrutura que o controlador publica |

Uma escrita que só poderia ser feita mandando de volta o resto da tag é recusada, e o
motivo cita o endereço: parte de uma tag atômica (um Int16 no deslocamento 2 de um
DINT), um bit de um REAL, ou um deslocamento onde nenhum membro da estrutura começa
com o tamanho do valor. Nesse caso, enderece o valor pelo próprio nome, por exemplo
`Recipe.Speed` com deslocamento 0. O driver descobre onde caem as escritas de uma tag
na primeira escrita e guarda isso enquanto o dispositivo continua conectado. Uma tag
nova nasce como Somente leitura.

Um endereço de arquivo de dados é escrito como é nomeado: uma palavra, um valor de
ponto flutuante ou um membro inteiro, e um bit (`B3:0/2`, `T4:0.DN`) sozinho,
que o controlador altera ali mesmo, deixando os outros bits da palavra como estão.

## Descoberta {#discovery}

O botão Descobrir do Connector faz difusão de uma requisição CIP List Identity em
**toda rede em que este computador está** e continua escutando até passarem 10 segundos
sem resposta nova. A varredura nomeia essas redes enquanto roda, então um resultado de
zero diz para onde a pergunta de fato foi: uma estação com adaptadores virtuais de
máquinas, WSL ou VPN costuma ter mais redes do que o operador espera, e
candidatos podem chegar de uma delas.

Interfaces que não conseguem levar a requisição são puladas: tudo que não está no ar, os
adaptadores de loopback e de túnel, e um endereço que a interface deu a si mesma porque nada
respondeu DHCP (169.254.x.x). Só uma resposta que seja a resposta de identidade do próprio
controlador vira um dispositivo candidato, nomeado `eip://` mais o endereço dele; qualquer
outra coisa que responda na porta EtherNet/IP é ignorada, e o diário diz isso.
Um controlador Omron responde à mesma requisição e também fica de fora, com uma linha própria no
diário: um controlador NJ, NX ou NY é oferecido pela varredura do driver
[Omron](driver-omron#discovery).
Para cada candidato, a varredura então lê a lista de tags de escopo de controlador e oferece
as tags atômicas dele como canais candidatos, cada uma com deslocamento 0.
Um vetor de tipo atômico é oferecido como o primeiro elemento, no tipo dele
(`Temps[0]`, ou `Grid[0,0]` com duas dimensões), e um vetor BOOL como um Boolean
no primeiro BOOL (`Flags[0]`).

A descoberta descarta o que o driver não consegue ler ciclicamente: tags de estrutura e de UDT
(STRINGs do Logix incluídos) são deixadas de fora, e entradas `Program:`, `Task:` e `Map:`
são puladas. Um controlador numa rede em que este computador não está não
responde à difusão; adicione-o à mão.
Uma tag de qualquer outro tipo, como um tipo de sistema, também não é
oferecida, e o diário diz isso.

A identidade com que um controlador responde traz o número de catálogo dele, que
nomeia a família: um PLC-5, SLC 500, MicroLogix ou Micro800 chega com a família
escolhida e com o endereço nomeando-a (`eip://192.168.0.20?family=micrologix`).
Um PLC-5, SLC 500 ou MicroLogix não publica lista de tags, então chega sem canais
candidatos e as tags dele são digitadas por endereço de arquivo de dados; a lista
de tags de um Micro800 é lida como a de um Logix.

Um controlador Logix ou Micro800 que você já tem relê a lista de tags dele pela própria página: **Descobrir tags**, no cabeçalho do cartão **Tags** dele, oferece só as tags do controlador para as quais ele ainda não tem tag, comparadas pelo nome sem diferenciar maiúsculas de minúsculas. Um controlador de arquivos de dados não tem lista para ler e não mostra Descobrir tags (veja [Descobrir as tags de um dispositivo](connector-discovery#discovering-a-devices-tags)).

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

- Toda requisição ao controlador expira depois de 10 segundos, e a
  janela de escuta da descoberta fecha depois de 10 segundos de silêncio.
- O driver abre cada tag do controlador uma vez e a mantém aberta enquanto o
  equipamento estiver conectado, então um controlador com dezenas de tags é lido
  pelas sessões que já tem, em vez de abrir e fechar uma por leitura. Uma leitura
  que falha solta a sua tag, e a seguinte abre a tag de novo pelo nome.
- Renomear uma tag no projeto Logix quebra o canal em silêncio; a tag passa a ler
  qualidade ruim até o nome configurado bater de novo.
