# Mitsubishi MC

> Conecte CLPs Mitsubishi MELSEC pelo protocolo MC (quadro 3E): códigos de dispositivo, numeração decimal e hexadecimal, e comprimentos de leitura.

O driver **Mitsubishi MC** conversa com CLPs Mitsubishi MELSEC pelo protocolo
MC, usando o quadro 3E binário sobre TCP, o quadro que as séries Q, L e iQ
falam. Você endereça valores com a notação MELSEC de dispositivo que já conhece:
um código de dispositivo mais um número, como `D100` ou `M50`. Adicione um dispositivo sob o
driver Mitsubishi MC no [Connector](connector); o painel mostra só os
campos que este protocolo usa.

## Conexão {#connection}

| Campo | Significado | Padrão |
| --- | --- | --- |
| **Host ou IP** | Endereço IP ou nome de host da interface Ethernet do CLP. | vazio |
| **Porta** | Porta TCP da conexão do protocolo MC, de 1 a 65535. Um campo vazio mostra 5007 em cinza e o dispositivo é chamado nela, que é também como se lê um dispositivo salvo com 0. | 5007 |

O cabeçalho do dispositivo mostra o endpoint montado, por exemplo
`mcp://192.168.0.20:5007`. Não há campos de intervalo de leitura neste driver:
as tags dele são lidas uma vez por segundo. O lado do CLP precisa de uma conexão do
protocolo MC (SLMP), TCP e binária, na porta escolhida: [Preparar o CLP](#prepare-the-plc)
diz onde ela é criada.

## Preparar o CLP {#prepare-the-plc}

Uma CPU MELSEC só serve o protocolo MC numa conexão que o projeto dela cria, e recusa uma escrita
enquanto está em RUN, a não ser que a porta Ethernet dela permita. As definições são feitas na
ferramenta de engenharia e gravadas na CPU com os parâmetros dela (**Online > Write to PLC**); a
CPU lê essas definições quando parte, então depois reinicie a CPU ou desligue e ligue de novo.

| Definição | GX Works3 (iQ-R, iQ-F) | GX Works2 (Q, L) | Sem ela |
| --- | --- | --- | --- |
| Uma conexão MC, TCP, na **Porta** do dispositivo | **Module Parameter > Ethernet Port > Basic Settings > External Device Configuration**: arraste um **SLMP Connection Module** para a tabela, com Protocol TCP e a porta do dispositivo em **Port No.** | **PLC Parameter > Built-in Ethernet Port Setting > Open Setting**: uma linha com Protocol TCP, **Open System** MC Protocol e a porta do dispositivo em **Host Station Port No.** | A CPU recusa a conexão nessa porta, e o dispositivo fica offline. |
| **Communication Data Code** em binário | **Module Parameter > Ethernet Port > Basic Settings**: **Binary**. | **PLC Parameter > Built-in Ethernet Port Setting**: **Binary Code**. | A CPU responde em caracteres ASCII, ou não responde, e nenhuma tag lê. |
| Escrita em RUN permitida | iQ-R: **Module Parameter > Ethernet Port > Basic Settings**, **Enable/Disable Online Change** em **Enable All (SLMP)**. | **PLC Parameter > Built-in Ethernet Port Setting**, **Enable online change (FTP, MC Protocol)** marcado. | A CPU lê normalmente e recusa toda escrita enquanto está em RUN, com o código de fim 0x0055. |

Uma CPU Q ou L reserva para si as portas 5000 a 5009, então a conexão MC dela não pode ficar com a
5007, o padrão do dispositivo: dê a ela outra porta, a 5010 por exemplo, e digite essa na
**Porta** do dispositivo. O GX Works2 pode mostrar **Host Station Port No.** em hexadecimal, onde
5010 é 1392. O código de dados é um só para toda a porta Ethernet: outro programa que fale com a
CPU em ASCII nessa porta também precisa passar para binário.

Quando a CPU recusa a porta, responde em ASCII ou recusa uma escrita em RUN, a página do
dispositivo diz qual definição é, com estes passos e a porta que o dispositivo disca, num aviso
que some sozinho assim que a CPU aceita. Para uma escrita recusada em RUN ele nomeia as tags cujas
escritas foram recusadas. O diário e o agente leem os mesmos passos.

## Endereçamento {#addressing}

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

| Campo | Significado | Valores aceitos | Padrão |
| --- | --- | --- | --- |
| **Endereço do dispositivo** | Código de dispositivo MELSEC mais número, por exemplo `D100`. Obrigatório. | texto livre | vazio |
| **Comprimento de leitura (bytes, vazio = automático)** | Quantos bytes transferir por leitura. Em branco, o tamanho da leitura vem do tipo de dado. | 1 ou mais, em branco | em branco |

O endereço não diferencia maiúsculas de minúsculas e o código mais longo que casar vence, então
`SD100` é o registrador especial 100, e não o relé de passo `S`. O número
é **hexadecimal** nos dispositivos que a Mitsubishi numera em hexadecimal (X, Y, B, W,
SB, SW, DX, DY) e decimal em todo o resto (`X1F` é a entrada 0x1F).
Códigos de dispositivo aceitos:

| Código | Dispositivo | Numeração |
| --- | --- | --- |
| `M` | relé interno | decimal |
| `SM` | relé especial | decimal |
| `L` | relé de retenção | decimal |
| `F` | anunciador | decimal |
| `V` | relé de borda | decimal |
| `S` | relé de passo | decimal |
| `X` | entrada | hexadecimal |
| `Y` | saída | hexadecimal |
| `B` | relé de enlace | hexadecimal |
| `SB` | relé de enlace especial | hexadecimal |
| `DX` | entrada direta | hexadecimal |
| `DY` | saída direta | hexadecimal |
| `D` | registrador de dados | decimal |
| `SD` | registrador especial | decimal |
| `R` | registrador de arquivo | decimal |
| `ZR` | registrador de arquivo estendido | decimal |
| `W` | registrador de enlace | hexadecimal |
| `SW` | registrador de enlace especial | hexadecimal |
| `Z` | registrador de índice | decimal |
| `TC` / `TS` / `TN` | bobina / contato / valor atual do timer | decimal |
| `SC` / `SS` / `SN` | bobina / contato / valor atual do timer retentivo | decimal |
| `CC` / `CS` / `CN` | bobina / contato / valor atual do contador | decimal |

A biblioteca MC por baixo também aceita os códigos `TT`, `TM`, `CT`, `CM` e
`A`. A linha somente leitura **Endereço de origem (barramento)** do cartão Origem mostra o
endereço montado enquanto você edita.

## Tipos de dado {#data-types}

O seletor de **Tipo de dado** oferece os quatro tipos que o driver empacota:

| Tipo de dado | Comprimento de leitura automático | Notas |
| --- | --- | --- |
| Boolean | 1 byte | num dispositivo de bit, o único relé nomeado; num dispositivo de palavra, qualquer palavra diferente de zero |
| Int32 | 4 bytes | duas palavras consecutivas de 16 bits, por exemplo `D100`+`D101` |
| Float | 4 bytes | duas palavras consecutivas guardando um IEEE de precisão simples |
| String | 16 bytes | texto até o primeiro NUL do buffer de leitura |

Os dados de palavra chegam na ordem little-endian nativa do MELSEC e são decodificados
automaticamente; não existe opção de ordem de bytes. Um valor de 32 bits ocupa dois
dispositivos de palavra consecutivos. Para um String com mais de 16 caracteres, eleve o
**Comprimento de leitura** para cobrir o texto guardado. O **Comprimento de leitura** é uma
contagem de bytes e o protocolo transfere palavras inteiras de 16 bits, então um comprimento
ímpar é arredondado para cima, até a palavra que carrega o último byte dele.

Os dispositivos de bit, os que o driver lê um relé por vez, são `X`, `Y`, `M`, `L`, `F`,
`V`, `B`, `S`, `TS`, `TC`, `SS`, `SC`, `CS`, `CC`, `SB`, `DX` e `DY`. Neles uma tag
booleana responde pelo endereço que você digitou e por mais nada. Todo outro código é um
dispositivo de palavra, inclusive o valor atual de um timer ou de um contador (`TN`, `SN`,
`CN`) e os registradores de enlace (`W`, `SW`), e ali a palavra inteira decide: `D100`
guardando `0x0100` lê como verdadeiro.

Uma leitura que o CLP recusa, como a de um endereço além do fim da sua faixa,
deixa aquela tag sem valor, e o erro dela nomeia o código de fim e o que o manual
diz que ele significa, por exemplo
`end code 0xC056 (the request goes past the last address of the device)`. Todas as
outras tags do dispositivo continuam lendo.

## Escritas {#writes}

Tags cujo **Acesso** é Leitura e escrita ou Somente escrita podem ser escritas, no
mesmo endereço de dispositivo que a leitura usa. Uma escrita booleana num dispositivo de bit
liga ou desliga o único relé nomeado e não toca em nenhum vizinho dele. Todo o
resto é escrito como palavras inteiras de 16 bits: duas palavras em Int32 e Float, uma palavra
para uma booleana num dispositivo de palavra e, em String, o **Comprimento de leitura**
inteiro da tag, com os bytes UTF-8 do texto na frente e zeros atrás, arredondado até a
última palavra. Um texto mais curto escrito sobre um mais longo, portanto, substitui o
valor inteiro e nada do antigo sobrevive. Um texto que não cabe no comprimento
declarado é recusado, com o comprimento nomeado no diário, nunca cortado
para caber. Uma tag nova nasce como Somente leitura.

Uma escrita que o CLP recusa volta recusada e nomeia o código de fim e o
significado dele da mesma forma. Uma escrita recusada porque a CPU está em RUN (código de fim
0x0055) também aparece na página do dispositivo, com a definição que a permite (veja
[Preparar o CLP](#prepare-the-plc)).

## Descoberta {#discovery}

O protocolo MC não tem descoberta por difusão neste driver, então o Connector
não mostra botão Descobrir. Adicione o dispositivo e os endereços dele à mão.

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

- A leitura cíclica é fixa em um segundo para toda tag deste driver; os campos usuais de
  intervalo de leitura não são mostrados.
- O driver só fala o quadro 3E binário, nunca ASCII: uma conexão configurada em código ASCII
  não lê nada (veja [Preparar o CLP](#prepare-the-plc)).
- Um CLP inalcançável não custa nada na inicialização: o dispositivo segue tentando em
  segundo plano e as tags dele leem qualidade ruim até a conexão acontecer.
- A conexão TCP tem 5 segundos para abrir, e cada pedido 10 segundos para ser respondido. Um
  CLP que aceita a conexão e não responde a tempo é desconectado e tentado de novo como um
  inalcançável; o erro dele nomeia a porta e os dois motivos comuns: uma CPU Q ou L com a porta
  em código ASCII, que não responde nada a um pedido binário, ou um equipamento que não fala o
  protocolo MC nessa porta.
