Comunicação EtherNet/IP Explícita – M580 (Schneider Electric) e ControlLogix (Rockwell Automation)

EtherNet/IP Simbólico Explícito

Ler/Escrever para a Rockwell Automation

Controladores Logix

 

 

Resumo

Este white paper trata de leituras explícitas e grava para um controlador Rockwell Logix usando endereçamento de segmento simbólico; em outras palavras, usando nomes de tags variáveis. A gravação explícita é o único mecanismo disponível para um controlador Modicon escrever para um controlador Logix. Aqui discutimos como funciona o EtherNet/IP de mensagens explícitas e como usar o bloco de funções DATA_EXCH para implementá-lo. Um par de Blocos de Função Derivadas (DFB) são anexados para simplificar o processo.

 

 

 

Introdução

Referências

Usado

Introdução a

EtherNet/IP

Não é incomum para um usuário Modicon receber equipamentos de pacote de um Original

Fabricante de equipamentos (OEM) que usou OEM CompactLogix rockwell ou CONTROLLogix PLCs. Invariavelmente, esses pacotes devem ser integrados à rede de plantas. Se eles só precisam se conectar ao sistema SCADA, isso não é um grande problema; a maioria dos sistemas SCADA sabem como lidar com isso. Há casos, no entanto, em que há um requisito para ler e/ou gravar dados entre um controlador de planta Modicon e um controlador de sistema de pacote Logix. Na pior das hipóteses, o sistema Logix é inacessível e não pode ser alterado, portanto, não pode ser configurado para usar mensagens implícitas ou mensagens de produtor/consumidor. Desde que as variáveis às quais o Modicon deve ter acesso sejam conhecidas e sejam configuradas como leitura/gravação, podemos usar mensagens explícitas para ler e escrever para eles usando o bloco de função de comunicação DATA_EXCH.

 

 

  1. ODVA; A Biblioteca de Redes CIP Volume 1, Protocolo Industrial Comum, Edição 3.3
  2. ODVA; A Biblioteca de Redes CIP Volume 2, Adaptação EtherNet/IP da CIP, Edição 1.4
  3. Rockwell Automation; Comunicando-se com produtos RA usando mensagens explícitas EtherNet/IP, Revisão 1.2
  4. Rockwell Automation; Logix 5000 Controllers Data Access, janeiro de 2019
  5. Behnaz Champey, Schneider Electric, Communication Exchange, ControlLogix & M580

Uma apreciação especial deve ser dada ao Ref. 5 e ao seu autor por dar um exemplo de trabalho que me leve a um caminho para entender a extensa e enigmática documentação EtherNet/IP.

 

 

O EtherNet/IP é um dos vários protocolos originalmente desenvolvidos pela Rockwell, mas colocados na arena pública, estabelecendo a Open DeviceNet Vendor Association (ODVA). A Schneider Electric tem sido um membro principal da ODVA por muitos anos e estabeleceu o EtherNet/IP como um protocolo central ao lado do Modbus TCP.

O EtherNet/IP é baseado em CIP ou Common Industrial Protocol. Outros protocolos ODVA CIP incluem DeviceNet, ControlNet e CompoNet. A CIP estabelece uma base para protocolos orientados a objetos com diretrizes rigorosas. O EtherNet/IP é um protocolo muito flexível (também muito complicado), suportando objetos de dados como variáveis, mas também muitos objetos do sistema que são específicos de hardware ou sistema. Cada objeto é membro de uma classe, e as instâncias desses objetos são instantâneas. Cada instância tem um conjunto de atributos definidos por sua classe, mas os valores dos atributos em cada instância podem ser diferentes.

Cada classe de objeto suporta um conjunto de funções chamadas serviços. Esses serviços e os atributos da instância do objeto definem o comportamento de cada instância. Ao lidar com objetos CIP, o ID de classe e o ID de instância devem ser conhecidos, e possivelmente o ID de atributo que você está acessando também. Para invocar um serviço dentro de uma instância de objeto, o Código de Serviço também deve ser conhecido.

Neste white paper, estaremos lidando com objetos e serviços de comunicação.

Existem dois tipos de comunicações definidas pelo padrão CIP: Conexões de I/O, também conhecidas como Mensagens Implícitas, e Conexões de Mensagens Explícitas.

 

 

 

 

Mensagens Implícitas

 

Mensagens implícitas é um serviço que usa o modelo Produtor/Consumidor pelo qual se estabelece uma conexão CIP entre o consumidor de dados, também conhecido como scanner ou cliente, e o produtor desses dados, também conhecido como adaptador ou servidor. Esta pode ser uma conexão de um a um entre dois dispositivos, ou uma conexão de um para muitos (multicast), onde um único produtor envia dados recebidos por vários consumidores. Uma vez estabelecida a conexão, os dados são produzidos periodicamente, pelo adaptador, a uma taxa solicitada pelo scanner. Esta mensagem se repete até que a conexão seja fechada pelo criador/scanner.

As mensagens implícitas são usadas para mensagens periódicas que são gerenciadas através da configuração e não sob controle do programa. A partir de um dispositivo externo, um controlador Logix aceitará solicitações de leitura através de mensagens implícitas, mas não solicitações de gravação. No EcoStruxure Control Expert, as mensagens implícitas são configuradas através do uso de DTMs. Como os controladores M340 e M580 podem atuar como um adaptador EtherNet/IP, um controlador Logix pode escrever para um controlador Modicon e o M340 ou M580 pode publicar dados para o controlador Logix.

 

Mensagens explícitas

 

As mensagens explícitas não exigem uma conexão CIP entre os dois participantes. O dispositivo que envia a mensagem é o criador, ou cliente, e o dispositivo que a recebe é o alvo ou servidor. Mensagens explícitas sem conexão usa o UCMM (Unconnected Message Manager, gerenciador de mensagens não conectadas) nos dispositivos para gerenciar a comunicação. O UCMM define um caminho para o Gerenciador de Conexões e roteador de mensagens dentro do dispositivo.

Os dados dentro de um controlador de plataforma Logix podem ser acessados usando a instância simbólica ou o endereçamento do Segmento Simbólico. Em Instância Simbólica, você precisa conhecer a montagem, instância e atributo de cada variável que você está acessando. Esta é a maneira usual de comunicar dados entre dispositivos EtherNet/IP que é documentado por muitas fontes e ferramentas encontradas na Internet. Este documento se concentra na abordagem do Segmento Simbólico que usa os nomes de tags variáveis no controlador. Existem inúmeras classes e instâncias de objetos usadas pelos controladores Logix nas comunicações. Para comunicações explícitas, usaremos um conjunto específico.

 

Classes e Instâncias de Objetos

 

Pedido de serviço do gerente de conexão (cabeçalho CIP) Esses parâmetros são sempre os mesmos para nossos propósitos.

Código de Serviço – 16#52 – Envio não conectado. Este código de serviço permite que um dispositivo envie uma mensagem sem antes estabelecer uma conexão CIP.

Tipo de segmento de caminho – 16#20 – caminho do segmento de lógica de 8 bits para o Gerenciador de Conexões. Classe objeto – 16#06 – Solicitar caminho para gerente de conexão. O Gerenciador de Conexão é usado para alocar os recursos para mensagens implícitas e explícitas.

Tipo de segmento de exemplo – 16#24 – instância de 8 bits

ID de ocorrência – 16#01 – A instância do Roteador de Mensagens

Solicitação de serviço de roteador de mensagens Esta solicitação define o que estamos fazendo e como estamos fazendo.

Códigos de serviço de instância – 16#4C (Leitura) ou 16#4D (Gravação)

Solicitação de Caminho: 16#91 – Dados por segmento simbólico ou nome de tag

Dados de solicitação – Este é um bloco de dados que define o endereço de destino, no nosso caso um nome de etiqueta, quantos dados e os dados estão sendo gravados (se uma gravação estiver sendo realizada). Rota do Caminho – Varia dependendo do caminho da mensagem física no dispositivo de destino.

Cada serviço tem um caminho associado a ele que define o próximo passo na transação. Em vários lugares, o comprimento do caminho deve ser especificado para que o dispositivo receptor analise corretamente a sequência do protocolo. Esses comprimentos são variáveis dependendo dos serviços específicos que estão sendo prestados, do comprimento do nome da tag e assim por diante. Há também outros itens para incluir, como informações de tempo limite de mensagens e os dados para escrever, por exemplo.

 

Introdução a

DATA_EXCH EFB

A instrução DATA_EXCH é usada para executar comunicações explícitas para controladores Modbus TCP, Modbus Serial, EtherNet/IP ou outros protocolos nos controladores M340 e M580.

É normalmente usado para enviar mensagens não suportadas pelas instruções READ_VAR e WRITE_VAR. Para efeitos deste white paper, vamos usá-lo para Leituras e Gravações Explícitas para um controlador de plataforma Rockwell Logix usando nomes de tags.

 

Insumos DATA_EXCH

 

  • EN – Habilitar – Usaremos essa entrada para acionar uma transação, mas somente quando a última transação estiver concluída. Usamos o bit 0 da primeira palavra dos parâmetros de gestão para mostrar isso (veja abaixo para mais informações). Se uma única transação for desejada, use uma entrada de um tiro. Se for realizada verdadeira, assim que uma transação for concluída, outra seguirá imediatamente de forma rápida de fogo. Normalmente gerenciamos o gatilho para que possamos cronometrar as transações para gerenciar o uso de largura de banda de comunicações.
  • ADR – Sequência de endereços provenientes de um bloco ADDM – Esta entrada define a porta usada pelo controlador para enviar a mensagem, o endereço de destino para o tipo de protocolo e arquitetura usado e o tipo de protocolo. ADR Como uma sequência, ele é sempre fechado em cotações únicas (‘) na entrada do

Instrução ADDM. Para nossos propósitos aqui, usaremos o formulário ‘r.m.c{IP4, IP3, IP2, IP1}UNC. EIP’ onde o r.m.c é o rack, módulo e canal da porta que estamos usando.

    • IP4, IP3, IP2, IP1 representa os quatro octetos do endereço IP para o dispositivo de destino. o UNC. O EIP denota que esta será uma mensagem EtherNet/IP não conectada (explícita).
  • TYP – Esta é a ação que está ocorrendo: ou envia uma mensagem, recebe uma mensagem ou envia uma mensagem e recebe uma resposta. Esta última é a única opção para nós e tem um valor de 1.
  • EMIS – Este é o pacote de dados que será enviado para o dispositivo de destino. Como não há instruções EtherNet/IP disponíveis para nós, devemos construir a sequência de protocolo que será enviada ao controlador Logix. Esta é uma matriz INT que terá um tamanho variável dependendo se estamos lendo ou escrevendo, o tamanho do nome da tag e a quantidade de dados enviados para uma gravação.
  • GEST – Parâmetros de gerenciamento que são utilizados para todas as instruções de comunicação explícitas M340 e M580. Ele toma a forma de uma matriz de quatro INTs.
  • INT[0] – Dois bytes para controle da transação o Low Byte – Bits de Status e Controle
      • Bit 0 é o Bit de Atividade. Ele é definido para 1 durante a transação ativa e vai para 0 quando a transação é concluída.
      • Bit 1 é o Cancel Bit. Defina este bit para 1 para cancelar a transação atual.
    • High Byte – Número de transação. Você verá esse valor mudar a cada nova transação. Este número pode ser usado para cancelar a transação atual antes da conclusão.
  • INT[1] – Código de erro composto por dois bytes. Um valor de zero indica sucesso. Consulte Control Expert Help para obter detalhes sobre os valores encontrados aqui.
    • Low Byte – Relatório de Comunicação, falha geral
    • Alto Byte – Relatório de Operação, falha independente da função
  • INT[2] – Timeout – Em incrementos de 100 ms, defina um valor aqui para encerrar a transação com um relatório de erro se ele ainda não tiver concluído. Com um valor de zero, não há tempo limite.
  • INT[3] – Comprimento – O bloco DATA_EXCH deve ser informado do tamanho do pacote de dados em bytes que deve enviar. O tamanho do array na entrada EMIS pode ser muito maior do que os dados que qualquer transação precisa, de modo que o parâmetro Length deve ser inserido antes que a transação seja acionada. Ao término da transação, a duração da resposta em bytes é mostrada nesta palavra.

 

saídas DATA_EXCH

 

RECP – Este é um array INT que contém os dados na resposta à transação. Para uma Leitura Explícita EtherNet/IP, isso terá informações de status e os dados solicitados lidos a partir da variável destino. Para uma Gravação Explícita EtherNet/IP, apenas as informações de status serão apresentadas.

 

Lógica DATA_EXCH

 

Agora que temos os dados da mensagem definidos, resta apenas construir a lógica.

Para este exemplo, usaremos um bit de um segundo do sistema para acionar a operação de leitura. No momento do acionamento, definiremos o tempo limite e o tempo de dados da mensagem antes de ativar o bloco DATA_EXCH. Ele só funcionará se não houver uma transação atual aberta e o comprimento tiver sido definido. Observe que sua lógica pode precisar ser ligeiramente diferente para qualquer caso.

As chaves para o sucesso são a construção adequada do pacote de dados para a entrada EMIS e seu comprimento. A aplicação adequada do DATA_EXCH requer uma compreensão completa do protocolo que está sendo utilizado. As duas seções a seguir descrevem a construção dos pacotes de leitura e gravação. Tenha em mente que o EtherNet/IP, como o Modbus TCP, é pouco acabado, ou seja, o byte baixo é enviado primeiro.

 

 

Leia tag

Serviço

O Serviço de Tag de Leitura é o serviço de mensagens explícita que usaremos para nossa mensagem de leitura. Ele usa um serviço de Envio Não Conectado que tem uma forma específica.

 

Vamos usar um exemplo. Exemplos adicionais são dados no Apêndice A. Queremos ler um valor inteiro de uma tag chamada SCADA_READ. O alvo é um controlador CompactLogix com uma porta Ethernet no endereço IP 192.168.1.123. Vamos nos conectar à rede com uma porta em um módulo NOC no slot 2 do nosso backplane. A sequência de entrada para a instrução ADDM será ‘0.2.0{192.168.1.123}UNC. CIP’ . Usaremos um array INT chamado DataSent.

 

Primeiro, temos que definir nossa mensagem como um Envio Não Conectado e definir seu caminho para o objeto Gerenciador de conexão no alvo. O Gerenciador de Conexão usa um segmento de caminho lógico de 8 bits, com uma instância de 8 bits número 1. Isso compreende a parte CIP Header da transação e é o mesmo para todas as mensagens explícitas que enviaremos. Esta estrutura está definida na Seção 2-4 do Ref. 1 e na Tabela 5 do Ref. 3.

 

 

Cabeçalho CIP

 

Elemento de matriz

High Byte

Baixa Byte

DataSent[0] = 16#0252

16#02 – Desconectado Enviar tempo de caminho em palavras.

16#52 – Desconectado

Enviar solicitação de serviço

DataSent[1] = 16#0620

16#06 – Código de classe, caminho para o Gerenciador de Conexões

16#20 – tipo de segmento de lógica de 8 bits para classe

DataSent[2] = 16#0124

16#01 – Número de ocorrência dentro da classe Gerenciador de Conexão

16#24 – tipo de segmento de instância de 8 bits

 

 

Agora que está definido, o Gerenciador de Conexões envia a mensagem para o Serviço de Roteador de Mensagens no controlador de destino. O seguinte bloco de dados define as especificidades para a função de leitura. As informações de tempo limite são encontradas na seção 3-5.5.1.3 do Ref. 1. O tempo limite mostrado é um exemplo e pode variar para sua aplicação. A Solicitação de Mensagem está definida na Tabela 3-5.22 do Ref. 1.

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0010

16#0010 – Tamanho do serviço de solicitação de mensagem em bytes

(16 decimal). Inclui DataSent[5] para DataSent[12].

DataSent[5] = 16#064C

16#06 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[11]

16#4C – Serviço de tag de leitura

DataSent[6] = 16#0A91

16#0A – Número de bytes no caminho (nome da tag de 10 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4353

16#43 – ASCII para ‘C’

16#53 – ASCII para ‘S’

DataSent[8] = 16#4441

16#44 – ASCII para ‘D’

16#41 – ASCII para ‘A’

DataSent[9] = 16#5F41

16#5F – ASCII para ‘_’

16#41 – ASCII para ‘A’

DataSent[10] = 16#4552

16#45 – ASCII para ‘E’

16#52 – ASCII para ‘R’

DataSent[11] = 16#4441

16#44 – ASCII para ‘D’

16#41 – ASCII para ‘A’

DataSent[12] = 16#0001

16#0001 – Número de elementos para ler. O tamanho do array retornado dos elementos dependerá do tipo de dados de tag que está sendo lido.

 

A última parte que precisamos explicar é o caminho de roteamento físico no próprio alvo.

 

 

Caminho da rota

 

Elemento de matriz

High Byte

Baixa Byte

DataSent[13] = 16#0001

16#00 – Reservado

16#01 – Tamanho do Caminho da Rota em palavras. Inclui DataSent[14]

DataSent[14] = 16#0001

16#00 – Endereço do Caminho da Rota, neste contexto o slot em que reside a CPU de destino, neste caso a CPU CompactLogix.

16#01 – Porto ao que estamos conectando. A porta 1 é definida como o backplane e será usada por qualquer interface Ethernet no alvo.

 

Como há 15 palavras no array DataSent, o valor em bytes da palavra ReadMgmt[3] precisa ser definido para 30 antes que a mensagem seja acionada.

 

Leia a resposta do Serviço de Tag

 

Neste exemplo, a variável DataReceived terá a seguinte resposta se a transação tiver sido bem sucedida. As estruturas de resposta são encontradas nas Tabelas 3-5.23 e 35.24 no Ref. 1.

 

Resposta bem-sucedida do serviço de tag de leitura

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

DataReceived[2] = 16#00C3

16#00C3 – Tipo de dados INT recebido

DataReceived[3]

Valor da LEITURA INT a partir do alvo

 

Se a transação não tiver sido bem sucedida, a resposta tomará a seguinte forma.

 

Resposta de serviço de tag de leitura mal sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0]

16#00 se a resposta recebida do alvo. 16#01 se nenhuma conexão puder ser feita.

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80, somente se a resposta recebida do alvo.

16#00 se nenhuma conexão pode ser feita.

DataReceived[1]

Número de palavras de status estendidas

Código de Status Geral

DataReceived[2]

Primeira Palavra de Status Estendido, se presente

 

O Código de Status Geral pode ser encontrado no Ref. 1, Apêndice B. Algumas informações de erro de roteamento podem ser encontradas na Tabela 3-5-25 do Ref. 1.

 

No exemplo acima, o DataReceived[2] continha o tipo de dados da variável recebida. Há uma lista de tipos de dados na página 15 do Ref. 4 que é replicada aqui.

Esta tabela se aplicará a todas as operações de leitura e gravação.

 

Tipo de dado

Valor do tipo de tag

Tamanho

BOOL

16#00C1

1 Byte, FF se verdadeiro

SANTO

16#00C2

1 Byte

INT

16#00C3

2 Bytes

FORÇA

16#00C4

4 Bytes

REAL

16#00CA

4 Bytes

DWORD

16#00D3

4 Bytes

FITA

16#00C5

8 Bytes

 

 

Gravar Tag O serviço de tag de gravação é o serviço de mensagens explícita que usaremos para nossa mensagem de gravação. Ele usa um serviço de Envio Não Conectado que tem uma forma específica.

Serviço

Vamos usar um exemplo para demonstrar essa forma. Exemplos adicionais são dados no Apêndice A. Queremos escrever um único valor inteiro para uma tag chamada SCADA_WRITE. Neste caso, vamos enviá-lo para uma CPU ControlLogix no slot 5 de um backplane, conectando-se a uma porta Ethernet de um módulo ENT com um endereço IP de 172.16.23.145. A sequência de entrada para a instrução ADDM será ‘0.2.0{172.16.23.145}UNC. CIP’ .

 

Primeiro, definiremos nossa mensagem como um Envio Desconectado e definiremos seu caminho para o objeto Gerenciador de conexão no alvo. O Gerenciador de Conexão usa um segmento de caminho lógico de 8 bits, com uma instância de 8 bits número 1. Isso compreende a parte CIP Header da transação e é o mesmo para todas as mensagens explícitas que enviaremos. Esta estrutura está definida na Seção 2-4 do Ref. 1 e na Tabela 5 do Ref. 3.

 

 

Cabeçalho CIP

 

Elemento de matriz

High Byte

Baixa Byte

DataSent[0] = 16#0252

16#02 – Desconectado Enviar tempo de caminho em palavras.

16#52 – Desconectado

Enviar solicitação de serviço

DataSent[1] = 16#0620

16#06 – Código de classe, caminho para o Gerenciador de Conexões

16#20 – tipo de segmento de lógica de 8 bits para classe

DataSent[2] = 16#0124

16#01 – Número de ocorrência dentro da classe Gerenciador de Conexão

16#24 – tipo de segmento de instância de 8 bits

Sim, isso foi o mesmo que no Serviço de Etiquetas de Leitura. É sempre o mesmo para nossos propósitos.

 

Agora que está definido, o Gerenciador de Conexões envia a mensagem para o Serviço de Roteador de Mensagens no controlador de destino. O seguinte bloco de dados define as especificidades para a função de gravação. As informações de tempo limite são encontradas na seção 3-5.5.1.3 do Ref. 1. O tempo limite mostrado é um exemplo e pode variar para sua aplicação. A Solicitação de Mensagem está definida na Tabela 3-5.22 do Ref. 1.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0014

16#0014 – Tamanho do serviço de solicitação de mensagem em bytes. Inclui DataSent[5] para DataSent[14].

DataSent[5] = 16#074D

16#07 – Solicitar o tamanho do caminho em palavras, inclui

16#4D – Serviço de tag de gravação

 

DataSent[6] para DataSent[12]

 

DataSent[6] = 16#0B91

16#0B – Número de bytes no caminho (nome da tag)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4353

16#43 – ASCII para ‘C’

16#53 – ASCII para ‘S’

DataSent[8] = 16#4441

16#44 – ASCII para ‘D’

16#41 – ASCII para ‘A’

DataSent[9] = 16#5F41

16#5F – ASCII para ‘_’

16#41 – ASCII para ‘A’

DataSent[10] = 16#5257

16#52 – ASCII para ‘R’

16#57 – ASCII para ‘W’

DataSent[11] = 16#5449

16#54 – ASCII para ‘T’

16#49 – ASCII para ‘I’

DataSent[12] = 16#4441

16#00 – nulo – estofamento

16#45 – ASCII para ‘E’

DataSent[13] = 16#00C3

16#00C3 – Tipo de dados INT (veja tabela abaixo para tipos de dados)

DataSent[14] = 16#0001

16#0001, ou 1 Decimal – Número de elementos para escrever

DataSent[15]

Uma palavra contendo os dados INT para gravar

 

A última parte que precisamos explicar é o caminho de roteamento físico no próprio alvo.

 

 

Caminho da rota

 

Elemento de matriz

High Byte

Baixa Byte

DataSent[15] = 16#0001

16#00 – Reservado

16#01 – Tamanho da Rota

Caminho em palavras. Inclui DataSent[14]

DataSent[16] = 16#0501

16#05 – Endereço do Caminho da Rota, neste contexto o slot em que a CPU reside

16#01 – Porto ao que estamos conectando. A porta 1 é definida como o backplane e será usada por qualquer interface Ethernet no alvo.

 

Como há 17 palavras no array DataSent, o valor em bytes da palavra ReadMgmt[3] precisa ser definido para 34.

 

Resposta do serviço de marca de gravação

 

Neste exemplo, a saída do bloco DATA_EXCH (DataReceived) terá a seguinte resposta se a transação tiver sido bem sucedida. As estruturas de resposta são encontradas nas Tabelas 3-5.23 e 3-5.24 no Ref. 1.

Resposta bem-sucedida do serviço de tag de gravação

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0]

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1]

16#00 – Número de palavras de falha estendida

16#00 – Sem dados de falha geral

 

Se a transação não tiver sido bem sucedida, a resposta tomará a seguinte forma.

Resposta de serviço de marca de gravação mal sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0]

16#00 se a resposta recebida do alvo. 16#01 se nenhuma conexão pode ser feita.

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80, somente se a resposta recebida do alvo. 16#00 se nenhuma conexão pode ser feita.

DataReceived[1]

Número de palavras de status estendidas

Código de Status Geral

DataReceived[2]

Primeira Palavra de Status Estendido, se presente

 

O Código de Status Geral pode ser encontrado no Ref. 1, Apêndice B. Algumas informações de erro de roteamento podem ser encontradas na Tabela 3-5-25 do Ref. 1.

No exemplo acima, o DataSent[13] continha o tipo de dados da variável escrita. Há uma lista de tipos de dados na página 15 do Ref. 4 que é replicada aqui. Esta tabela se aplicará a todas as operações de leitura e gravação.

 

Tipo de dado

Valor do tipo de tag

Tamanho

BOOL

16#00C1

1 Byte, qualquer valor não-zero se verdadeiro

SANTO

16#00C2

1 Byte

INT

16#00C3

2 Bytes

FORÇA

16#00C4

4 Bytes

REAL

16#00CA

4 Bytes

DWORD

16#00D3

4 Bytes, como EDT ou BOOL Array

FITA

16#00C5

8 Bytes

 

 

 

 

 

 

 

 

 

 

Conclusão A menos que o programador do controlador Rockwell tenha documentado a montagem

e, por exemplo, informações para as variáveis no controlador, é muito difícil se comunicar com ele usando um controlador não-Rockwell. É o objetivo deste white paper simplificar as comunicações explícitas entre um controlador de arquitetura Modicon Unity e um controlador de plataforma Rockwell Logix usando nomes de tags variáveis. Esta capacidade será muito útil quando confrontado com um controlador Rockwell que deve ser integrado e não é possível reconfigurá-lo para iniciar comunicações com o Modicon.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Sobre o autor

 

Jerry Bartlemay é especialista em Sistemas e Arquitetura da Schneider Electric em Portland, Oregon. A

Graduado pela Oregon State University, Jerry é bacharel em Engenharia Elétrica com ênfase em energia. Ele é certificado como um MESTRE SAE, é um Engenheiro Certificado Citect SCADA, e possui certificações em EcoStruxure e DCS híbridos.

 

   

Agradecimentos

 

Agradecimentos especiais a Behnaz Champey por seu trabalho anterior na apresentação “Communication Exchange, ControlLogix & M580” que me deu esperança e direção na busca de soluções para este white paper.

Agradecimentos especiais também a Nathan Schiavo da Graybar Electric em Portland, e Brad Hite da Intertech, por seu apoio em me ajudar a testar meu código de comunicação com controladores ao vivo da Rockwell.

 

   

 

 

 

 

 

Apêndice

O apêndice A tem uma série de cenários e estruturas de dados associadas a eles.

  • Revisão geral da estrutura de mensagens
  • Leia a variável EDT
  • Escrever variável EDT
  • Leia EDT Array
  • Escrever EDT Array
  • Leia o elemento ou subconjunto do EDT Array
  • Escreva o elemento ou subdefinição do EDT Array
  • Leia o elemento ou subconjunto de matriz multidimensional EDT
  • Escreva o elemento ou subconjunto de matriz multidimensional EDT
  • Ler estrutura
  • Estrutura de gravação
  • Ler elemento estrutura
  • Elemento de estrutura de gravação

 

O apêndice B descreve um Bloco de Função Derivado para leitura de variáveis, matrizes e estruturas EDT

 

O apêndice C descreve um Bloco de Função Derivado para escrever variáveis e matrizes EDT.

Apêndice A1: Ethernet/IP é um protocolo muito sofisticado com muitas variações. A tarefa de Mensagens Ex-plicit para tags em um controlador de plataforma Logix é um pequeno subconjunto do proto-

Message col e tem uma estrutura definida: CIP Header, depois Solicitação de Mensagem, e, finalmente, Caminho de Rota de Estrutura para o controlador de destino. Eles estão resumidos aqui.

Review Observe que nos controladores Logix, os nomes das tags não são sensíveis a maiúsões.

 

 

Cabeçalho CIP

 

Elemento de matriz

High Byte

Baixa Byte

Solicitar serviço e comprimento do caminho

16#02 – Desconectado Enviar tempo de caminho em palavras.

16#52 – Desconectado

Enviar solicitação de serviço

Código de classe e tipo de segmento

16#06 – Código de classe, caminho para o Gerenciador de Conexões

16#20 – tipo de segmento de lógica de 8 bits para classe

Instância de classe e tipo de segmento

16#01 – Número de ocorrência dentro da classe Gerenciador de Conexão

16#24 – tipo de segmento de instância de 8 bits

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

Valor e prioridade do tempo limite

Número de carrapatos de tempo limite

Tempo em ms por tempo limite

carrapato

Solicitar tamanho em bytes

O tamanho do serviço de solicitação de mensagem em bytes, até e incluindo o número de elementos e dados escritos.

Tipo de serviço e tamanho do caminho em palavras

Solicitar o tamanho do caminho em palavras, até e incluindo o fim do nome da tag

16#4C – Serviço de tag de leitura

16#4D – Serviço de tag de gravação

Definir segmento simbólico (nome de tagname) e tamanho

Número de bytes no nome da tag

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

Tag Name and Elements, (Low Endian) ASCII Hex. Pad com caráter nulo, se necessário. Várias palavras, se necessário. Até 40 caracteres em um nome de etiqueta.

Segundo código de caractere ASCII

Primeiro código de caractere ASCII

Tipo de dado

  1. palavra para EDT
  2. palavras para estrutura

Se um serviço de gravação, o tipo de dados está sendo escrito.

BOOL (EDT) – 16#00C1

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

Se uma estrutura, duas palavras do Parâmetro de Serviço de Tipo de Etiqueta obtiveram a partir da leitura da estrutura.

Número de Elementos (INT)

Número de elementos para ler ou escrever. O tamanho do array retornado dos elementos dependerá do tipo de dados de tag que está sendo lido.

Dados escritos

Se um serviço de gravação, a palavra de dados está sendo escrita.

 

 

 

 

 

 

 

 

Caminho da rota

 

Elemento de matriz

High Byte

Baixa Byte

Tamanho do Caminho da Rota

16#00 – Reservado

16#01 – Tamanho da Rota

Caminho em palavras. Inclui DataSent[14]

Endereços de porta e slot do controlador de destino.

Endereço do Caminho da Rota, neste contexto o slot em que a CPU reside

16#01 – Porto ao que estamos conectando. A porta 1 é definida como o backplane e será usada por qualquer interface Ethernet no alvo.

 

Todas as mensagens incluirão todos esses três elementos. Neste apêndice, no entanto, só definiremos a Solicitação de Mensagem para cada variação. O Cabeçalho CIP e o Caminho da Rota seguem a mesma estrutura independente do tipo de mensagem.

 

 

 

As respostas para leituras e gravações bem-sucedidas são ligeiramente diferentes, como observado abaixo.

 

Resposta bem-sucedida do serviço de tag de leitura

Elemento de matriz

High Byte

Baixa Byte

Reconhecimento de código de envio não conectado

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

Palavra de Status Geral

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

Tipo de dado

  1. palavra para EDT
  2. palavras para estrutura

Tipo de dados recebidos

BOOL (EDT) – 16#00C1

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

Se uma estrutura, duas palavras denotando o parâmetro de serviço de tipo de etiqueta

Dados recebidos

Valor único ou matriz de dados recebidos. O tamanho depende do tipo de dados e do número de elementos lidos.

 

Resposta bem-sucedida do serviço de tag de gravação

Elemento de matriz

High Byte

Baixa Byte

Reconhecimento de código de envio não conectado

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

Palavra de Status Geral

16#00 – Número de palavras de falha estendida

16#00 – Sem dados de falha geral

 

 

 

 

 

 

 

 

 

 

Se a transação não tiver sido bem sucedida, a resposta tomará a seguinte forma.

 

Resposta de serviço de leitura ou gravação mal sucedida

Elemento de matriz

High Byte

Baixa Byte

Reconhecimento de código de envio não conectado

16#00 se a resposta recebida do alvo. 16#01 se nenhuma conexão pode ser feita.

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80, somente se a resposta recebida do alvo.

16#00 se nenhuma conexão pode ser feita.

Palavra de Status Geral

Número de palavras de status estendidas

Código de Status Geral

Palavra de status estendida

Primeira Palavra de Status Estendido, se presente

 

O Código de Status Geral pode ser encontrado no Ref. 1, Apêndice B. Algumas informações de erro de roteamento podem ser encontradas na Tabela 3-5-25 do Ref. 1.

 

 

 

 

 

Apêndice A2:

Leia EDT

Variável

Para ler qualquer variável EDT, nós realmente só precisamos do nome de tag. O número de elementos é sempre 1.

 

Exemplo: Leia uma variável REAL chamada ‘TANK_TEMP’.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0010

16#0010 – Tamanho do serviço de solicitação de mensagem em bytes

(16 decimal). Inclui DataSent[5] para DataSent[12].

DataSent[5] = 16#064C

16#06 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[11]

16#4C – Serviço de tag de leitura

DataSent[6] = 16#0991

16#09 – Número de bytes no caminho (nome da tag de 9 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4154

16#41 – ASCII para ‘A’

16#54 – ASCII para ‘T’

DataSent[8] = 16#4B4E

16#4B – ASCII para ‘K’

16#4E – ASCII para ‘N’

DataSent[9] = 16#545F

16#54 – ASCII para ‘T’

16#5F – ASCII para ‘_’

DataSent[10] = 16#4D45

16#4D – ASCII para ‘M’

16#45 – ASCII para ‘E’

DataSent[11] = 16#0050

16#00 – byte de almofada nula

16#50 – ASCII para ‘P’

DataSent[12] = 16#0001

16#0001 – Número de elementos para ler.

 

A mensagem total ocupa 15 palavras para um tamanho de mensagem de 30 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 10 palavras Message Request, 2 words Route Path).

 

 

Resposta de leitura bem-sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

DataReceived[2]

16#00CA – Tipo de dados REAIS recebido

DataReceived[3] para [4]

Valor da leitura real do alvo

 

O tamanho do campo de dados recebido dependerá do tipo de dados.

Se BOOL, o valor será 16#00 ou 16#FF no byte baixo.

Se sint, ele vai ocupar o byte baixo.

Se INT, ocupará uma palavra.

Se DINT, DWORD ou REAL, ele ocupará duas palavras. Se LINT, ocupará quatro palavras.

 

Os códigos do tipo de dados são os seguintes.

BOOL (EDT) – 16#00C1

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

Apêndice A3:

Escreva EDT

Variável

Como na leitura, para escrever para uma variável EDT, só precisamos do nome de tag. O número de elementos é sempre 1.

 

Exemplo: Escreva um valor BOOL para uma variável chamada ‘Start_Pump’.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0014

16#0014 – Tamanho do serviço de solicitação de mensagem em bytes

(20 decimal). Inclui DataSent[5] para DataSent[14].

DataSent[5] = 16#064D

16#06 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[11]

16#4D – Serviço de tag de gravação

DataSent[6] = 16#0A91

16#0A – Número de bytes no caminho (nome da tag)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#7453

16#74 – ASCII para ‘t’

16#53 – ASCII para ‘S’

DataSent[8] = 16#7261

16#72 – ASCII para ‘r’

16#61 – ASCII para ‘a’

DataSent[9] = 16#5F74

16#5F – ASCII para ‘_’

16#74 – ASCII para ‘t’

DataSent[10] = 16#7550

16#75 – ASCII para ‘u’

16#50 – ASCII para ‘P’

DataSent[11] = 16#706D

16#70 – ASCII para ‘p’

16#6D – ASCII para ‘m’

DataSent[12] = 16#00C1

16#00C1 – Tipo de dados BOOL

DataSent[13] = 16#0001

16#0001, ou 1 Decimal – Número de elementos para escrever

DataSent[14]

High Byte – não utilizado

Low Byte – 0 para falso, não-zero para verdade

 

O último campo terá um tamanho variado dependendo do tipo de dados.

BOOL, byte baixo, 16#00 se falso ou qualquer valor não-zero se verdadeiro

SINT, byte baixo

INT, uma palavra

DINT, REAL ou DWORD, duas palavras

LINT, quatro palavras

 

Os tipos de dados do DataSent[12] acima são os seguintes.

BOOL (EDT) – 16#00C1

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

 

A mensagem total ocupa 17 palavras para um tamanho de mensagem de 34 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 12 palavras Message Request, 2 words Route Path).

 

 

 

 

 

 

 

Resposta de gravação bem sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

 

 

Apêndice A4:

Leia EDT

Array

A leitura de uma variável de matriz EDT é idêntica à leitura de uma variável não-array, exceto pelo número de elementos solicitados.

 

Os arrays de plataforma Logix podem consistir em uma, duas ou três dimensões. Como as matrizes multidimensionais da plataforma Unity, elas são organizadas em baixa ordem de elementos. Por exemplo, ler uma matriz de três elementos de 10, 12 e 5 dimensões produziria dados na ordem:

Elemento [0][0][0]

Elemento [0][0][1]

Elemento [0][0][9]

Elemento [0][1][0]

Elemento [0][1][11]

Elemento [0][2][0] e assim por diante.

 

Haveria um total de 10 x 12 x 5 elementos, ou 600 elementos. Uma matriz deste tamanho exigiria várias operações de leitura. Consulte o Apêndice A8 para obter mais detalhes sobre como especificar o elemento inicial para uma operação de leitura deste tipo.

 

Exemplo: Leia uma variável de matriz DINT chamada ‘PM_Power’ com 8 elementos.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#000E

16#000E – Tamanho do serviço de solicitação de mensagem em bytes

(14 decimal). Inclui DataSent[5] para DataSent[11].

DataSent[5] = 16#054C

16#05 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[11]

16#4C – Serviço de tag de leitura

DataSent[6] = 16#0891

16#08 – Número de bytes no caminho (nome da tag de 8 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4D50

16#4D – ASCII para ‘M’

16#50 – ASCII para ‘P’

DataSent[8] = 16#505F

16#50 – ASCII para ‘P’

16#5F – ASCII para ‘_’

DataSent[9] = 16#776F

16#77 – ASCII para ‘w’

16#6F – ASCII para ‘o’

DataSent[10] = 16#7265

16#72 – ASCII para ‘r’

16#65 – ASCII para ‘e’

DataSent[11] = 16#0008

16#0008 – Número de elementos para ler.

 

A mensagem total ocupa 14 palavras para um tamanho de mensagem de 28 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 9 palavras Message Request, 2 words Route Path).

 

 

Resposta de leitura bem-sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

DataReceived[2]

16#00C4 – Tipo de dados DINT recebido

DataReceived[3] para [18]

Valores de DINTs lidos a partir do alvo

O tamanho do campo de dados recebido dependerá do tipo de dados.

Se bool, os elementos são organizados em DWORDs começando com o menor bit significativo.

Se SINT, ocupará bytes consecutivos começando com o byte baixo da primeira palavra.

Se INT, ocupará uma palavra por elemento.

Se DINT, DWORD ou REAL, ele ocupará duas palavras por elemento, palavra baixa primeiro. Se LINT, ocupará quatro palavras por elemento, palavra baixa.

 

Os códigos de tipo de dados dos dados devolvidos são os seguintes.

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

 

Se o Número de Elementos (DataSent[11]) for menor que o tamanho do array, o conjunto de dados retornado será o número especificado de elementos começando com o primeiro elemento na posição 0. Consulte o apêndice A6 para obter a sintaxe usada para ler um subconjunto de matriz a partir de um elemento inicial diferente.

 

Apêndice A5:

Escreva EDT

Array

Escrever para uma variável de matriz EDT é idêntico à leitura de uma variável não-array, exceto pelo número de elementos solicitados.

 

Os arrays de plataforma Logix podem consistir em uma, duas ou três dimensões. Como as matrizes multidimensionais da plataforma Unity, elas são organizadas em baixa ordem de elementos. Por exemplo, escrever uma matriz de três elementos de 10, 12 e 5 dimensões exigiria dados na ordem:

Elemento [0][0][0]

Elemento [0][0][1]

Elemento [0][0][9]

Elemento [0][1][0]

Elemento [0][1][11]

Elemento [0][2][0] e assim por diante.

 

Haveria um total de 10 x 12 x 5 elementos, ou 600 elementos. Uma matriz deste tamanho exigiria várias operações de gravação. Consulte o Apêndice A9 para obter mais detalhes sobre como especificar o elemento inicial para uma operação de leitura deste tipo.

 

Exemplo: Escreva uma matriz BOOL para uma variável chamada ‘Pump_Alarms’ contendo 40 elementos.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#001C

16#001C – Tamanho do serviço de solicitação de mensagem em bytes

(28 decimal). Inclui DataSent[5] para DataSent[18].

DataSent[5] = 16#074D

16#07 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[12]

16#4D – Serviço de tag de gravação

DataSent[6] = 16#0B91

16#0B – Número de bytes no caminho (nome da tag)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#7550

16#75 – ASCII para ‘u’

16#50 – ASCII para ‘P’

DataSent[8] = 16#706D

16#70 – ASCII para ‘p’

16#6D – ASCII para ‘m’

DataSent[9] = 16#415F

16#41 – ASCII para ‘A’

16#5F – ASCII para ‘_’

DataSent[10] = 16#616C

16#61 – ASCII para ‘a’

16#6C – ASCII para ‘l’

DataSent[11] = 16#6D72

16#6D – ASCII para ‘m’

16#72 – ASCII para ‘r’

DataSent[12] = 16#0073

16#00 – byte de almofada nula

16#73 – ASCII para ‘s’

DataSent[13] = 16#00D3

16#00D3 – Tipo de dados DWORD

DataSent[14] = 16#0002

16#0002, ou 2 Decimal – Número de elementos para escrever

DataSent[15] para [18]

Dois DWORDs de 32 bits cada. A matriz de bits começa na parte menos significativa do DataSent[15].

 

O último elemento terá um tamanho variado dependendo do tipo de dados.

 

BOOL, tamanho DWORD para cada incremento de até 32 bits

SINT, um byte por elemento, byte baixo primeiro

INT, uma palavra por elemento

DINT, REAL ou DWORD, duas palavras por elemento

LINT, quatro palavras por elemento

O tipo de dados enviado para DataSent[13] acima é o seguinte:

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

 

Se o Número de Elementos (DataSent[14]) for menor que o tamanho do array, os dados escritos serão o número especificado de elementos que começam com o elemento na posição 0. Consulte o apêndice A7 para obter a sintaxe usada para escrever um subconjunto de matriz para um elemento inicial diferente.

 

A mensagem total ocupa 21 palavras para um tamanho de mensagem de 42 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 16 palavras Message Request, 2 words Route Path).

 

 

Resposta de gravação bem sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

 

 

Apêndice A6:

Leia EDT

Array

Elemento ou

Subconjunto

Pode ser desejado ler apenas uma gama de elementos dentro de uma matriz. Por exemplo, se você quiser ler o terceiro através do décimo segundo elementos de uma matriz de 50 elementos, o número de elementos é 10 e o elemento inicial é 2. É importante que o valor do elemento inicial mais o número de elementos não exceda o tamanho da matriz.

 

Há uma sintaxe específica da especificação do nome do tag de caminho que denota o nome da tag e um elemento inicial. Essa forma de string é ‘tagname(**’, onde ** é um byte contendo o valor digital do elemento inicial (0 baseado). Se o nome da tag é um número ímpar de caracteres, pad-lo com um nulo, 16#00, no final do tagname para torná-lo uniforme. O caractere ‘(‘ é ASCII 16#28 e é usado aqui como um delimitador. Ele denota um elemento de 0-255 em valor armazenado em um byte. Se o número do elemento for superior a 255, o delimitador é o ‘)’ (ASCII 16#29) seguido por um byte de almofada nulo e, em seguida, um INT com o valor do número do elemento. Os comprimentos do caminho precisam ser calculados para o comprimento do personagem que você está usando.

 

Leia o terceiro e quarto elementos de uma variável de matriz INT chamada ‘FLOW_SP’ com quatro ou mais elementos.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0010

16#0010 – Tamanho do serviço de solicitação de mensagem em bytes

(16 decimal). Inclui DataSent[5] para DataSent[12].

DataSent[5] = 16#064C

16#06 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[11]

16#4C – Serviço de tag de leitura

DataSent[6] = 16#0791

16#07 – Número de bytes no caminho (nome da tag de 7 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4C46

16#4C – ASCII para ‘L’

16#46 – ASCII para ‘F’

DataSent[8] = 16#574F

16#57 – ASCII para ‘W’

16#4F – ASCII para ‘O’

DataSent[9] = 16#535F

16#53 – ASCII para ‘S’

16#5F – ASCII para ‘_’

DataSent[10] = 16#0050

16#00 – byte de almofada nula

16#50 – ASCII para ‘P’

DataSent[11] = 16#0228

16#02 – Elemento inicial

16#28 – ASCII para ‘(‘

DataSent[12] = 16#0002

16#0002 – Número de elementos para ler.

 

A mensagem total ocupa 15 palavras para um tamanho de mensagem de 30 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 10 palavras Message Request, 2 words Route Path).

 

 

 

 

 

 

 

 

Resposta de leitura bem-sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

DataReceived[2]

16#00C3 – Tipo de dados INT recebido

DataReceived[3] para [4]

Valores dos INTs lidos a partir do alvo

 

O tamanho do campo de dados recebido dependerá do tipo de dados.

 

Se bool, os elementos são organizados em DWORDs começando com o menor bit significativo.

Se SINT, ocupará bytes consecutivos começando com o byte baixo da primeira palavra.

Se INT, ocupará uma palavra por elemento.

Se DINT, DWORD ou REAL, ele ocupará duas palavras por elemento, palavra baixa primeiro. Se LINT, ocupará quatro palavras por elemento, palavra baixa.

 

O código de tipo de dados para DataReceived[2] acima é o seguinte:

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

 

 

Apêndice A7:

Escreva EDT

Array

Elemento ou

Subconjunto

Pode ser desejado escrever apenas uma gama de elementos dentro de uma matriz. Por exemplo, se você quiser ler o sexto ao oitavo elementos de uma matriz de 24 elementos, o número de elementos é 3 e o elemento inicial é 5. É importante que o valor do elemento inicial mais o número de elementos não exceda o tamanho da matriz.

 

Há uma sintaxe específica da especificação do nome do tag de caminho que denota o nome da tag e um elemento inicial. Essa forma de string é ‘tagname(**’, onde ** é um byte contendo o valor digital do elemento inicial (0 baseado). Se o nome da tag é um número ímpar de caracteres, pad-lo com um nulo, 16#00, no final do tagname para torná-lo uniforme. O caractere ‘(‘ é ASCII 16#28 e é usado aqui como um delimitador. Ele denota um elemento de 0-255 em valor armazenado em um byte. Se o número do elemento for superior a 255, o delimitador é o ‘)’ (ASCII 16#29) seguido por um byte de almofada nulo e, em seguida, um INT com o valor do número do elemento. Os comprimentos do caminho precisam ser calculados para o comprimento do personagem que você está usando.

 

 

Escreva o elemento 300 de uma matriz INT para uma variável chamada ‘Accum’ contendo 301 ou mais elementos.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0014

16#0014 – Tamanho do serviço de solicitação de mensagem em bytes

(20 decimal). Inclui DataSent[5] para DataSent[18].

DataSent[5] = 16#064D

16#06 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[12]

16#4D – Serviço de tag de gravação

DataSent[6] = 16#0591

16#05 – Número de bytes no caminho (nome da etiqueta)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#6341

16#63 – ASCII para ‘c’

16#41 – ASCII para ‘A’

DataSent[8] = 16#7563

16#75 – ASCII para ‘u’

16#63 – ASCII para ‘c’

DataSent[9] = 16#006D

16#00 – byte de almofada nula

16#6D – ASCII para ‘m’

DataSent[10] = 16#0029

16#00 – byte de almofada nula

16#29 – ASCII para ‘)’

DataSent[11] = 16#012C

16#012C – 300 Decimal, primeiro elemento a escrever

DataSent[12] = 16#00C3

16#00C3 – Tipo de dados INT

DataSent[13] = 16#0001

16#0001, ou 1 Decimal – Número de elementos para escrever

DataSent[14]

Valor da única palavra para escrever.

 

Os dados para escrever elemento terão um tamanho variado dependendo do tipo de dados.

BOOL, tamanho DWORD para cada incremento de até 32 bits

SINT, um byte por elemento, byte baixo primeiro

INT, uma palavra por elemento

DINT, REAL ou DWORD, duas palavras por elemento

LINT, quatro palavras por elemento

 

O código de tipo de dados para os dados enviados é o seguinte:

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

 

A mensagem total ocupa 17 palavras para um tamanho de mensagem de 34 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 12 palavras Message Request, 2 words Route Path).

 

 

 

Resposta de gravação bem sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

 

 

Apêndice A8:

Leia EDT Multidimensional Array

Elemento ou

Subconjunto

Os arrays de plataforma Logix podem ter até três dimensões de tamanho. A sintaxe para ler um elemento ou subconjunto de uma matriz é semelhante ao caso de dimensão única acima. A sequência de caminho consistiria em ‘tagname(dim1(dim2″ ou ‘tagname(dim1(dim2(dim3″. Como acima, o nome de tag é acolchodo com um caractere nulo, se necessário, para fazer a contagem de byte uniforme. Dim1, dim2 e dim3 são bytes seguindo o delimitador ‘(‘ delimitador (16#28) segurando o elemento inicial de cada dimensão de 0-255. Se um número de elemento exceder 255, use o delimitador ‘)’ (16#29), acolchoado com um caractere nulo e um valor INT para o número do elemento. Os comprimentos do caminho precisam ser calculados para o comprimento do personagem que você está usando.

 

Exemplo: Leia as cinco primeiras palavras na Área 2, treine 10 em uma matriz INT chamada ‘Motor_Stats’ com um tamanho de [4][25][12] (Área, trem, motor).

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0018

16#0018 – Tamanho do serviço de solicitação de mensagem em bytes

(24 decimal). Inclui DataSent[5] para DataSent[16].

DataSent[5] = 16#0A4C

16#0A – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[15]

16#4C – Serviço de tag de leitura

DataSent[6] = 16#0B91

16#0B – Número de bytes no caminho (nome da tag de 11 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#6F4D

16#6F – ASCII para ‘o’

16#4D – ASCII para ‘M’

DataSent[8] = 16#6F74

16#6F – ASCII para ‘o’

16#74 – ASCII para ‘t’

DataSent[9] = 16#5F72

16#5F – ASCII para ‘_’

16#72 – ASCII para ‘r’

DataSent[10] = 16#7453

16#74 – ASCII para ‘t’

16#53 – ASCII para ‘S’

DataSent[11] = 16#7461

16#74 – ASCII para ‘t’

16#61 – ASCII para ‘a’

DataSent[12] = 16#0073

16#00 – byte de almofada nula

16#73 – ASCII para ‘s’

DataSent[13] = 16#0128

16#01 – Elemento inicial dim 1

16#28 – ASCII para ‘(‘

DataSent[14] = 16#0928

16#09 – Elemento inicial Dim 2

16#28 – ASCII para ‘(‘

DataSent[15] = 16#0028

16#00 – Elemento inicial Dim 3

16#28 – ASCII para ‘(‘

DataSent[16] = 16#0005

16#0005 – Número de elementos para ler.

 

A mensagem total ocupa 19 palavras para um tamanho de mensagem de 38 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 13 palavras Message Request, 2 words Route Path).

 

 

 

 

 

 

 

 

Resposta de leitura bem-sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

DataReceived[2]

16#00C3 – Tipo de dados INT recebido

DataReceived[3] para [7]

Valores dos INTs lidos a partir do alvo

 

O tamanho do campo de dados recebido dependerá do tipo de dados.

 

Se bool, os elementos são organizados em DWORDs começando com o menor bit significativo.

Se SINT, ocupará bytes consecutivos começando com o byte baixo da primeira palavra.

Se INT, ocupará uma palavra por elemento.

Se DINT, DWORD ou REAL, ele ocupará duas palavras por elemento, palavra baixa primeiro. Se LINT, ocupará quatro palavras por elemento, palavra baixa.

 

O código de tipo de dados dos dados recebidos é o seguinte:

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

 

Apêndice A9:

Escreva EDT Multidimensional Array

Elemento ou

Subconjunto

Os arrays de plataforma Logix podem ter até três dimensões de tamanho. A sintaxe para escrever um elemento ou subconjunto de uma matriz é semelhante ao caso de dimensão única acima. A sequência de caminho consistiria em ‘tagname(dim1(dim2″ ou ‘tagname(dim1(dim2(dim3″. Como acima, o nome de tag é acolchodo com um caractere nulo, se necessário, para fazer a contagem de byte uniforme. Dim1, dim2 e dim3 são bytes seguindo o delimitador ‘(‘ delimitador (16#28) segurando o elemento inicial de cada dimensão de 0-255. Se um número de elemento exceder 255, use o delimitador ‘)’ (16#29), acolchoado com um caractere nulo e um valor INT para o número do elemento. Os comprimentos do caminho precisam ser calculados para o comprimento do personagem que você está usando.

 

Exemplo: Escreva o terceiro, quarto e quinto parâmetro de configuração para a Estação de Bomba 114. A variável é PS_Param com duas dimensões (PS#, parâmetro) do tipo DINT.

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0020

16#0020 – Tamanho do serviço de solicitação de mensagem em bytes

(32 decimal). Inclui DataSent[5] para DataSent[20].

DataSent[5] = 16#074D

16#07 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[12]

16#4D – Serviço de tag de gravação

DataSent[6] = 16#0891

16#08 – Número de bytes no caminho (nome da tag)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#5350

16#53 – ASCII para ‘S’

16#50 – ASCII para ‘P’

DataSent[8] = 16#505F

16#50 – ASCII para ‘P’

16#5F – ASCII para ‘_’

DataSent[9] = 16#7261

16#72 – ASCII para ‘r’

16#61 – ASCII para ‘a’

DataSent[10] = 16#6D61

16#6D – ASCII para ‘m’

16#61 – ASCII para ‘a’

DataSent[11] = 16#7128

16#71 – 113 Decimal,

Elemento inicial Dim 1

16#28 – ASCII para ‘(‘

DataSent[12] = 16#0228

16#02 – Elemento inicial Dim 2

16#28 – ASCII para ‘(‘

DataSent[13] = 16#00C4

16#00C4 – Tipo de dados DINT

DataSent[14] = 16#0003

16#0003, ou 3 Decimal – Número de elementos para escrever

DataSent[15] para [20]

Valor dos 3 DINTs para escrever.

 

Os dados para escrever elemento terão um tamanho variado dependendo do tipo de dados.

BOOL, tamanho DWORD para cada incremento de até 32 bits

SINT, um byte por elemento, byte baixo primeiro

INT, uma palavra por elemento

DINT, REAL ou DWORD, duas palavras por elemento

LINT, quatro palavras por elemento

 

O código de tipo de dados para os dados enviados é o seguinte:

BOOL (matriz) – 16#00D3

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

A mensagem total ocupa 23 palavras para um tamanho de mensagem de 46 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 18 palavras Message Request, 2 words Route Path).

 

 

 

Resposta de gravação bem sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

 

 

Apêndice A10:

Leia a íntegra

Estrutura

Para ler qualquer estrutura, só precisamos do nome da tagname. O número de elementos é sempre 1. A resposta voltará na forma da definição da estrutura.

 

Exemplo: Leia uma variável de estrutura chamada ‘VFD_Status’ que consiste nos seguintes elementos.

BOOL – Run_Status

BOOL – Falha

BOOL – Local_SS

INT – Speed_SP

INT – Speed_Feedback

REAL – KW_Power

 

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0010

16#0010 – Tamanho do serviço de solicitação de mensagem em bytes

(20 decimal). Inclui DataSent[5] para DataSent[12].

DataSent[5] = 16#064C

16#06 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[11]

16#4C – Serviço de tag de leitura

DataSent[6] = 16#0A91

16#0A – Número de bytes no caminho (nome da tag de 10 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4656

16#46 – ASCII para ‘F’

16#56 – ASCII para ‘V’

DataSent[8] = 16#5F44

16#5F – ASCII para ‘_’

16#44 – ASCII para ‘D’

DataSent[9] = 16#7453

16#74 – ASCII para ‘t’

16#53 – ASCII para ‘S’

DataSent[10] = 16#7461

16#74 – ASCII para ‘t’

16#61 – ASCII para ‘a’

DataSent[11] = 16#7375

16#73 – ASCII para ‘s’

16#75 – ASCII para ‘u’

DataSent[12] = 16#0001

16#0001 – Número de elementos para ler.

 

A mensagem total ocupa 15 palavras para um tamanho de mensagem de 30 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 10 palavras Message Request, 2 words Route Path).

 

Resposta de leitura bem-sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

DataReceived[2] para [3]

Duas palavras – Parâmetro de serviço de tipo de marca, a definição de tag e estrutura

DataReceived[4] para [7]

SINT contendo os BOOLs em ordem, começando pelo menos um pouco significativo, acolchoado com mais três bytes.

DataReceived[8]

Valor do elemento Speed_SP (INT)

DataReceived[9]

Valor do elemento Speed_Feedback (INT)

DataReceived[10] para [11]

Valor de KW_Power (REAL)

 

O tamanho do campo de dados recebido dependerá da definição da estrutura.

 

O BOOLS será embalado em SINTs (bytes) e depois acolchoado com bytes vazios para tornar o número total de bytes divisível por quatro. As plataformas Logix realmente gostam de espaços de memória do tamanho DINT. Neste caso, há os BOOLs que caberão no primeiro byte. Como o resto dos elementos (dois INTs e um REAL) se encaixam em dois quatro bytes espaços, os BOOLs são acolchoados com mais três bytes para fazer o total de oito bytes.

 

Apêndice A11:

Escreva inteiro

Estrutura

Escrever uma estrutura é ligeiramente diferente de escrever uma variável ou matriz. Referindo-se ao Serviço de Dados para Enviar para Gravação acima, substitua a palavra DataSent[14] contendo o tipo de dados por duas palavras contendo o Parâmetro de Serviço de Tipo de Etiqueta na seção anterior na Leitura de uma Estrutura.

 

Como conseguimos esse parâmetro? A maneira mais fácil é ler a estrutura primeiro. A terceira e quarta palavras da resposta contêm o Parâmetro de Serviço de Tipo de Etiqueta.

 

Depois disso, o campo seguinte é uma palavra contendo o número de elementos, neste caso será 1 para uma única instância da estrutura.

 

Finalmente, temos os dados para enviar, organizados em palavras. Como na leitura, os BOOLs serão organizados em dois ou mais bytes, dependendo de quantos existem e do tamanho da estrutura geral. O espaço BOOL será acolchoado com bytes para tornar o tamanho total da estrutura divisível por quatro bytes. Ints levarão uma palavra, DWORDS, DINTs e REALs levarão dois cada. Se a estrutura for definida para que DWORDS, DINTS e REALs possam começar com um endereço mesmo %MW, você pode mapear uma estrutura DDT para uma matriz INT através de endereços State Ram (%MW) para preparar o array para envio.

 

Exemplo: Escreva uma variável de estrutura chamada ‘VFD1001_Control’ consistindo nos seguintes elementos.

BOOL – Run_Command

BOOL – Reset

INT – Speed_SP_Command

 

Neste caso, os BOOLs serão embalados nos dois bytes mais baixos de um SINT e acolchoados com um byte adicional. Incluindo o elemento INT, a estrutura geral de dados ocupará quatro bytes.

 

Solicitação de mensagem

 

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#001E

16#001E – Tamanho do serviço de solicitação de mensagem em bytes

(30 decimal). Inclui DataSent[5] para DataSent[20].

DataSent[5] = 16#094D

16#09 – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[14]

16#4D – Serviço de tag de gravação

DataSent[6] = 16#0F91

16#0F – Número de bytes no caminho (nome da tag)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4656

16#46 – ASCII para ‘F’

16#56 – ASCII para ‘V’

DataSent[8] = 16#3144

16#31 – ASCII para ‘1’

16#44 – ASCII para ‘D’

DataSent[9] = 16#3030

16#30 – ASCII para ‘0’

16#30 – ASCII para ‘0’

DataSent[10] = 16#5F31

16#5F – ASCII para ‘_’

16#31 – ASCII para ‘1’

DataSent[11] = 16#6F43

16#6F– ASCII para ‘o’

16#43 – ASCII para ‘C’

DataSent[12] = 16#746E

16#74 – ASCII para ‘t’

16#6E – ASCII para ‘n’

DataSent[13] = 16#6F75

16#6F – ASCII para ‘o’

16#72 – ASCII para ‘r’

DataSent[14] = 16#006C

16#00 – byte de almofada nula

16#6C – ASCII para ‘l’

DataSent[15] para [16]

Duas palavras – Parâmetro de serviço de tipo de etiqueta, a definição de tag e estrutura. Leia a estrutura para obter esse valor.

DataSent[17] = 16#0001

16#0001, ou 1 Decimal – Número de elementos para escrever

DataSent[18]

SINT contendo os BOOLs em ordem, começando pelo menos um pouco significativo, acolchoado com um byte adicional.

DataSent[19]

Valor do elemento Speed_SP_Command (INT)

 

 

A mensagem total ocupa 22 palavras para um tamanho de mensagem de 46 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 17 palavras Message Request, 2 words Route Path).

 

 

Resposta de gravação bem sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

 

 

Apêndice A12:

Leia um

Elemento de um

Estrutura

Para ler qualquer estrutura, só precisamos do nome da tagname. Se queremos ler apenas um elemento, também precisamos do nome do elemento.

 

Exemplo: Variável de estrutura chamada ‘VFD_Status’ consistindo nos seguintes elementos.

BOOL – Run_Status

BOOL – Falha

BOOL – Local_SS

INT – Speed_SP

INT – Speed_Actual

REAL – KW_Power

 

Neste caso, queremos ler o elemento ‘VFD_Status.Speed_Feedback’, por isso cascatamos o nome do elemento por trás do nome da estrutura.

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0020

16#0020 – Tamanho do serviço de solicitação de mensagem em bytes

(32 decimal). Inclui DataSent[5] para DataSent[20].

DataSent[5] = 16#0E4C

16#0E – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[20]

16#4C – Serviço de tag de leitura

DataSent[6] = 16#0A91

16#0A – Número de bytes no caminho (nome da tag de 10 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4656

16#46 – ASCII para ‘F’

16#56 – ASCII para ‘V’

DataSent[8] = 16#5F44

16#5F – ASCII para ‘_’

16#44 – ASCII para ‘D’

DataSent[9] = 16#7453

16#74 – ASCII para ‘t’

16#53 – ASCII para ‘S’

DataSent[10] = 16#7461

16#74 – ASCII para ‘t’

16#61 – ASCII para ‘a’

DataSent[11] = 16#7375

16#73 – ASCII para ‘s’

16#75 – ASCII para ‘u’

DataSent[12] = 16#0E91

16#0E – Número de bytes no caminho (nome da tag de 14 caracteres)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[13] = 16#7053

16#70 – ASCII para ‘p’

16#53 – ASCII para ‘S’

DataSent[14] = 16#6565

16#65 – ASCII para ‘e’

16#65 – ASCII para ‘e’

DataSent[15] = 16#5F64

16#5F – ASCII para ‘_’

16#64 – ASCII para ‘d’

DataSent[16] = 16#6546

16#65 – ASCII para ‘e’

16#46 – ASCII para ‘F’

DataSent[17] = 16#6465

16#64 – ASCII para ‘d’

16#65 – ASCII para ‘e’

DataSent[18] = 16#6162

16#61 – ASCII para ‘a’

16#62 – ASCII para ‘b’

DataSent[19] = 16#6B63

16#6B – ASCII para ‘k’

16#63 – ASCII para ‘c’

DataSent[20] = 16#0001

16#0001 – Número de elementos para ler.

 

A mensagem total ocupa 23 palavras para um tamanho de mensagem de 46 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 18 palavras Message Request, 2 words Route Path).

 

 

 

 

 

 

Resposta de leitura bem-sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

DataReceived[2] = 16#00C3

Tipo de dados INT

DataReceived[3]

Uma palavra contendo o valor de

‘VFD1001_Status.Speed_Actual’

 

O tamanho do campo de dados recebido dependerá do tipo de dados.

Se BOOL, o valor será 16#00 ou 16#FF no byte baixo.

Se sint, ele vai ocupar o byte baixo.

Se INT, ocupará uma palavra.

Se DINT, DWORD ou REAL, ele ocupará duas palavras.

Se LINT, ocupará quatro palavras.

 

Os códigos do tipo de dados são os seguintes.

BOOL (EDT) – 16#00C1

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

Apêndice A13:

Escreva um

Elemento de um

Estrutura

Semelhante à leitura de um único elemento de uma estrutura, por escrito só precisamos saber o nome da estrutura e o nome do elemento ao qual estamos escrevendo.

 

Exemplo: Nossa variável Estrutura é chamada de ‘VFD1001_Control’, consistindo dos seguintes elementos.

BOOL – Run_CMD

BOOL – Reset

INT – Speed_SP_CMD

 

Queremos escrever o elemento ‘VFD1001_Control.Run_CMD’.

 

Solicitação de mensagem

Elemento de matriz

High Byte

Baixa Byte

DataSent[3] = 16#1007 (valor e prioridade do tempo limite)

16#10 – Número de

carrapatos de tempo limite (total de

2.048 segundos)

16#07 – 128 ms por relógio, prioridade normal

DataSent[4] = 16#0024

16#0024 – Tamanho do serviço de solicitação de mensagem em bytes

(36 decimal). Inclui DataSent[5] para DataSent[20].

DataSent[5] = 16#0E4D

16#0E – Solicitar o tamanho do caminho em palavras, inclui

DataSent[6] para

DataSent[14]

16#4D – Serviço de tag de gravação

DataSent[6] = 16#0F91

16#0F – Número de bytes no caminho (nome da tag)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[7] = 16#4656

16#46 – ASCII para ‘F’

16#56 – ASCII para ‘V’

DataSent[8] = 16#3144

16#31 – ASCII para ‘1’

16#44 – ASCII para ‘D’

DataSent[9] = 16#3030

16#30 – ASCII para ‘0’

16#30 – ASCII para ‘0’

DataSent[10] = 16#5F31

16#5F – ASCII para ‘_’

16#31 – ASCII para ‘1’

DataSent[11] = 16#6F43

16#6F– ASCII para ‘o’

16#43 – ASCII para ‘C’

DataSent[12] = 16#746E

16#74 – ASCII para ‘t’

16#6E – ASCII para ‘n’

DataSent[13] = 16#6F72

16#6F – ASCII para ‘o’

16#72 – ASCII para ‘r’

DataSent[14] = 16#006C

16#00 – byte de almofada nula

16#6C – ASCII para ‘l’

DataSent[15] = 16#0791

16#07 – Número de bytes no caminho (nome da tag)

16#91 – Estamos usando um endereço de segmento simbólico (nome da etiqueta)

DataSent[16] = 16#7552

16#75 – ASCII para ‘u’

16#52 – ASCII para ‘R’

DataSent[17] = 16#5F6E

16#5F – ASCII para ‘_’

16#6E – ASCII para ‘n’

DataSent[18] = 16#4D43

16#4D – ASCII para ‘M’

16#43 – ASCII para ‘C’

DataSent[19] = 16#0044

16#00 – byte de almofada nula

16#44 – ASCII para ‘D’

DataSent[20] = 16#00C1

Tipo de dados BOOL

DataSent[21] = 16#0001

16#0001, ou 1 Decimal – Número de elementos para escrever

DataSent[22] – 16#00xx

16#00

Dados para escrever: 16#00 se falso, não-zero se verdadeiro

 

O tamanho do campo de dados para gravação dependerá do tipo de dados.

Se BOOL, o valor será 16#00 se falso ou não-zero se verdadeiro no byte baixo.

Se sint, ele vai ocupar o byte baixo.

Se INT, ocupará uma palavra.

Se DINT, DWORD ou REAL, ele ocupará duas palavras. Se LINT, ocupará quatro palavras.

 

 

 

Os códigos do tipo de dados são os seguintes. BOOL (EDT) – 16#00C1

SAINT – 16#00C2

INT – 16#00C3

DINT – 16#00C4

REAL – 16#00CA

DWORD – 16#00D3

FITA – 16#00C5

 

A mensagem total ocupa 25 palavras para um tamanho de mensagem de 50 bytes para a entrada GEST[3] no bloco de função DATA_EXCH (3 palavras CIP Header, 20 palavras Message Request, 2 words Route Path).

 

 

Resposta de gravação bem sucedida

Elemento de matriz

High Byte

Baixa Byte

DataReceived[0] = 16#00D2

16#00

16#D2 – Código de envio não conectado de 16#52 compensado por 16#80

DataReceived[1] = 16#0000

16#00 – Número de palavras de falha estendida

16#00 – Não-Geral

Dados de falha

 

 

Apêndice B: Leia EDT De-

derivados

Bloco de função

Este DFB executa uma Leitura Explícita para um controlador de plataforma Logix usando um nome de tag variável no Ethernet/IP. O alvo é uma variável atômica (EDT) ou matriz de até 200 bytes de tamanho. Uma única variável EDT, uma matriz EDT ou um ou mais elementos dentro de uma matriz podem ser lidos com este DFB. Estruturas também podem ser lidas. Por favor, note que o EIP permite leituras de matriz de mais de 200 bytes. Esse limite foi escolhido com o consumo de memória em mente e pode ser modificado.

 

A ponte não é suportada por este DFB. Presume-se que o alvo da leitura é um PLC da plataforma Rockwell Logix no mesmo backplane que sua interface Ethernet.

 

 

Tipos de dados suportados

SINT Short Integer 1 Byte

Int Inteiro 2 Bytes

DINT Double Inteiro Inteiro 4 Bytes

Real Flutuante Ponto 4 Bytes

DWORD Double Word 4 Bytes

Lint Long Integer 8 bytes

Estruturas O comprimento dos dados depende do conteúdo da estrutura

 

 

Gatilho

BOOL

Habilita a função de leitura, seja como uma única transação ou repetidamente, dependendo da entrada One_Shot.

One_Shot

BOOL

Se for verdade, faz com que a entrada Trigger execute uma única leitura em sua borda ascendente.

Se for falso, faz com que a entrada Trigger execute leituras repetidas Rep_Rate momento.

Rep_Rate

HORA

Se One_Shot for falso, defina o tempo de repetição da função de leitura quando o gatilho for verdadeiro.

GEST_Timeout

INT

O tempo máximo de espera para a resposta. A base de tempo para este parâmetro é de 100 ms (o valor 0 corresponde a um valor de espera infinito). Localizado no terceiro elemento da matriz de gerenciamento da instrução DATA_EXCH dentro do DFB.

Símbolo

String[40]

O nome variável no dispositivo de destino, limitado a 40 caracteres. O nome do símbolo não é sensível ao caractere.

Qty_Elements

INT

Padrão 1 – Mínimo 1 com limite de 200 byte. Por exemplo, o tipo INT será limitado a 100 elementos, REAL será limitado a 50 elementos. As matrizes BOOL serão transmitidas em incrementos DWORD, de modo que o valor seria de 1 para 32 elementos e assim por diante.

Array_Item

BOOL

Torne-se realidade se você quiser selecionar um (s) elemento específico de uma matriz. Se selecionados, os dados retornados incluirão o número de elementos especificados por Qty_Elements começando no número do elemento especificado por Item_Num. O valor de Qty_Elements mais Array_Item não deve exceder o tamanho da matriz.

Item_Num

BYTE

Padrão 0, 0 baseado – O elemento inicial quando Array_Item é selecionado. Se não for utilizado, o primeiro elemento é selecionado (valor implícito de 0). Não usado se Array_Item for falso.

IP_String

String[30]

Use o formulário ‘r.m.c{b4,b3,b2,b1}’, onde r.m.c é rack, módulo, canal e b4 através de b1 representam o endereço IP do alvo.

Ranhura

INT

Padrão 0 – O slot no qual a CPU Logix de destino está instalada em seu backplane. Sempre 0 para CompactLogix.

Saídas de entradas

Data_Out

ANY_AR…

RAY_INT

O resultado da operação de leitura. Isso deve ser conectado a um ARRAY de qualquer tamanho de tipo

INT. Por design, os dados neste array são zero se a transação não for bem sucedida.

ED_Type

CORDA

Texto que descreve o tipo de dados atômico (elementar) da variável alvo.

Last_Read_OK

BOOL

A última operação de leitura não teve falhas.

Read_NOK

BOOL

A última operação de leitura teve uma falha. Consulte a matriz EIP_Response para obter informações.

EIP_Response

ANY_AR…

RAY_INT

Três INTs que mostram a resposta da transação Ethernet/IP.

  1. – 16#00D2 se uma resposta vier do alvo. Se 16#0100, nenhuma conexão Ethernet está presente ao alvo.
  2. – 16#0000 se uma boa transação. Se não zero, o byte baixo é o código geral de falha, o byte alto mostra o número de códigos de falha estendidos começando no elemento [3].
  3. – Se uma boa transação, um código mostrando o tipo de dados dos dados de leitura. Se não for uma boa transação e o byte alto do elemento [2] não for zero, o código de falha estendido está presente.

Gen_Fault

INT

Segundo elemento da matriz de gerenciamento na instrução DATA_EXCH mostrando falhas de transação.

 

Nota: em seu estado atual, a operação Read tem cerca de 45 segundos de tempo de recuperação, uma vez que a perda de comunicação é corrigida.

 

 

Apêndice C:

Escreva EDT

Derivada

Bloco de função

Este DFB executa uma gravação explícita para um controlador de plataforma Logix usando um nome de marca variável no Ethernet/IP. O alvo é uma variável atômica (Tipo de Dados Elementares ou EDT) ou matriz de até 200 bytes de tamanho. Uma variável EDT, uma matriz EDT ou uma gama de elementos dentro de uma matriz EDT podem ser escritos para. Assim como no Read DFB, o limite de 200 byte foi escolhido como um compromisso para o consumo de memória e pode ser modificado.

 

A ponte não é suportada por este DFB. Presume-se que o alvo da gravação é um PLC da plataforma Rockwell Logix no mesmo backplane que sua interface Ethernet.

 

 

Tipos de dados suportados

SINT Short Integer 1 Byte

Int Inteiro 2 Bytes

DINT Double Inteiro Inteiro 4 Bytes

Real Flutuante Ponto 4 Bytes

DWORD Double Word 4 Bytes

Lint Long Integer 8 bytes

 

 

 

Gatilho

BOOL

Habilita a função de leitura, seja como uma única transação ou repetidamente, dependendo da entrada OneShot.

One_Shot

BOOL

Se for verdade, faz com que a entrada Trigger execute uma única gravação em sua borda ascendente.

Se for falso, faz com que a entrada Trigger execute gravações repetidas no RepRate.

Rep_Rate

HORA

Se One_Shot for falso, defina o tempo de repetição da função de gravação quando o gatilho for verdadeiro.

GEST_Timeout

INT

O tempo máximo de espera para a resposta. A base de tempo para este parâmetro é de 100 ms (o valor 0 corresponde a um valor de espera infinito). Localizado

Entradas

   

no terceiro elemento da matriz de gestão da instrução DATA_EXCH dentro do DFB.

Símbolo

String[40]

O nome variável no dispositivo de destino, limitado a 40 caracteres. O nome do símbolo não é sensível ao caractere.

Qty_Elements

INT

Padrão 1 – Mínimo 1 com limite de 200 byte. Por exemplo, o tipo INT será limitado a 100 elementos, REAL será limitado a 50 elementos. Não é necessário se o ArrayItem for falso.

Data_In

ANY_AR…

RAY_INT

Uma matriz INT, os elementos dos quais serão escritos para a variável alvo. Mínimo 1 elemento. Tamanho total de 200 bytes (100 INTs, 50 REALs, etc.).

Array_Item

BOOL

Torne-se realidade se você quiser selecionar um (s) elemento específico em uma matriz. Se selecionados, os dados retornados incluirão o número de elementos especificados por Qty_Elements começando no número do elemento especificado por Item_Num. O valor de Qty_Elements mais Array_Item não deve exceder o tamanho da matriz.

Item_Num

BYTE

Padrão 0, 0 baseado – O elemento inicial quando Array_Item é selecionado. Se não for utilizado, o primeiro elemento é selecionado (valor implícito de 0). Não é necessário se Array_Item for falsa.

Data_Type

Corda

Para uma determinada variável ou matriz, esta entrada deve ser apropriada. Para todas as variáveis e matrizes, exceto as matrizes BOOL, use o EDT para os elementos. Para matrizes BOOL, use DWORD.

IP_String

String[30]

Use o formulário ‘r.m.c{b4,b3,b2,b1}’, onde r.m.c é rack, módulo, canal e b4 através de b1 representam o endereço IP do alvo.

Ranhura

INT

Padrão 0 – O slot no qual a CPU Logix de destino está instalada em seu backplane. Sempre 0 para CompactLogix.

 

 

Saídas

Last_Write_OK

BOOL

A última operação de gravação não teve defeitos.

Last_Write_NOK

BOOL

A última operação de gravação teve uma falha. Consulte a matriz EIP_Response para obter informações.

EIP_Response

ANY_AR…

RAY_INT

Três INTs que mostram a resposta da transação Ethernet/IP.

  1. – 16#00D2 se uma resposta vier do alvo. Se 16#0100, nenhuma conexão Ethernet está presente ao alvo.
  2. – 16#0000 se uma boa transação. Se não zero, o byte baixo é o código geral de falha, o byte alto mostra o número de códigos de falha estendidos começando no elemento [3].
  3. – Se uma boa transação, um código mostrando o tipo de dados dos dados de leitura. Se não for uma boa transação e o byte alto do elemento [2] não for zero, o código de falha estendido está presente.

Gen_Fault

INT

Segundo elemento da matriz de gerenciamento na instrução DATA_EXCH mostrando falhas de transação.

 

Nota: Em seu estado atual, a operação Write tem cerca de 45 segundos de tempo de recuperação após a correção da perda de comunicações.

 

 

Related Articles

Responses