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.
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
|
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
|
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.
|
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.
|
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.
Responses