Este documento tem como objetivo orientar desenvolvedores de sistemas a utilizar adequadamente o recurso de retentividade de dados oferecido pelas UCPs das Séries Nexto e Hadron Xtorm, possibilitando que o usuário compreenda as suas características, vantagens e limitações.
É recomendado que os documentos Manual de Usuário UCPs Série Nexto (MU214100), Manual de Utilização Hadron Xtorm (MU223000) e Manual de Utilização MasterTool IEC XE (MU299048) estejam disponíveis para consulta.
1. Introdução
As Séries Nexto e Hadron Xtorm possuem características exclusivas e inovadoras, oferecendo alto poder de processamento e grande capacidade de memória, além de contar com diversos protocolos de comunicação e com um excelente conjunto de recursos de programação. Devido a sua flexibilidade, design funcional, recursos de diagnóstico avançado e arquitetura modular, podem ser utilizadas nos mais diversos tipos de sistemas de controle, atendendo aplicações de pequeno, médio ou grande porte.
As UCPs destas Séries possuem essencialmente dois tipos de memória: a memória de programa (FLASH), onde é armazenado o código da aplicação desenvolvida pelo usuário, e a memória de dados (RAM), onde são armazenadas as variáveis utilizadas pela aplicação.
A memória de dados é, por padrão, uma memória do tipo volátil, isto é, as variáveis alocadas nesta área retornam ao seu valor inicial após um evento de reinicialização da UCP (interrupção da alimentação, por exemplo). Contudo, em diversos casos, é necessário que algumas variáveis mantenham o seu valor mesmo após a inicialização da UCP. Isto ocorre, por exemplo, para variáveis que armazenam algum tipo de ajuste, como um setpoint de controle ou parâmetros de uma máquina ou processo. Para atender a esta necessidade, as UCPs possuem o recurso de retentividade de dados, o qual permite que um determinado conjunto de variáveis torne-se não volátil (isto é, os valores são mantidos mesmo após um evento de reinicialização da UCP).
2. Tipos de Variáveis Não Voláteis
Nestas UCPs, existem dois tipos distintos de variáveis não voláteis: Retentivas e Persistentes. Elas diferem-se, principalmente, pelo comportamento ao realizar a carga do programa (download). A tabela a seguir descreve o comportamento destes dois tipos de memória, onde "û" significa que a variável é reinicializada e "ü" significa que o seu valor é mantido.
Ação |
Variáveis Retentivas | Variáveis Persistentes |
Reset a Quente (reinicialização da UCP) |
ü | ü |
Reset a Frio | û | ü |
Reset Origem | û | û |
Remover UCP ou Fonte de Alimentação do Bastidor enquanto energizado | û | û |
Download | û | ü |
Alteração Online | ü | ü |
Reiniciar CP | ü | ü |
Clean All seguido de download | û | ü |
Tabela 1. Comportamento das Variáveis não Voláteis
3. Distribuição das Áreas de Memória
Para que seja possível compreender adequadamente o funcionamento do recurso de retentividade de dados, é importante entender como a memória é distribuída na UCP. A memória de dados divide-se basicamente em 6 áreas, conforme mostra a figura a seguir:
Figura 1 – Tipos de Memória
Nota:
A UCP da Série Xtorm oferece apenas memória de dados não volátil do tipo simbólica. Quaisquer referências futuras a variáveis %Q Retentivas ou Persistentes neste documento são aplicáveis somente às UCPs da Série Nexto.
As áreas claras representam as áreas de memória voláteis, onde as variáveis retornam ao seu valor inicial após um evento de reinicialização da UCP. As áreas escuras representam as áreas de memória não voláteis, as quais mantêm o valor das variáveis mesmo após a reinicialização da UCP. Como mostra a figura, as variáveis simbólicas definidas como Retentivas e Persistentes são alocadas em áreas de memória dedicadas e individuais. Já as variáveis %Q definidas como Retentivas e Persistentes são alocadas em uma faixa de endereços dentro da área de memória %Q.
4. Tamanhos das Áreas de Memória
Os tamanhos das áreas de memória não voláteis para cada modelo de UCP são apresentados na tabela abaixo, destacados em negrito.
NX3004 | NX3010 | NX3020 | NX3030 | HX3040 | |
Memória de variáveis de entrada de representação direta (%I) | 32 Kbytes | 32 Kbytes | 64 Kbytes | 96 Kbytes | 96 Kbytes |
Memória de variáveis de saída de representação direta (%Q) total Memória de variáveis de saída de representação direta retentivas (%Q) Memória de variáveis de saída de representação direta persistentes (%Q) |
32 Kbytes 2 Kbytes 2 Kbytes |
32 Kbytes 8 Kbytes 8 Kbytes |
64 Kbytes 16 Kbytes 16 Kbytes |
96 Kbytes 16 Kbytes 48 Kbytes |
96 Kbytes - - |
Memória de variáveis de representação direta (%M) | 16 Kbytes | 16 Kbytes | 32 Kbytes | 64 Kbytes | 64 Kbytes |
Memória de variáveis simbólicas | 2 Mbytes | 4 Mbytes | 5 Mbytes | 6 Mbytes | 6 Mbytes |
Memória de variáveis simbólicas retentivas | 2 Kbytes | 32 Kbytes | 48 Kbytes | 32 Kbytes | 8 Kbytes |
Memória de variáveis simbólicas persistentes | 1,5 Kbytes | 16 Kbytes | 32 Kbytes | 16 Kbytes | 4 Kbytes |
Tabela 2 – Tamanhos das Áreas de Memória não Voláteis para cada Modelo de UCP
5. Definição da Arquitetura de Referência
O acompanhamento desta nota de aplicação exige uma arquitetura simples, composta apenas de barramento, fonte e UCP (qualquer modelo disponível).
6. Configuração
Nesta seção, serão abordadas as formas de configuração e declaração das áreas de memória de variáveis Retentivas e Persistentes.
7. Memória de Variáveis de Saída de Representação Direta (%Q)
A configuração do tamanho das áreas de memória das Variáveis de Saída de Representação Direta (%Q) Retentivas e Persistentes é feita na aba "Parâmetros Gerais" das UCPs Nexto, conforme indicado na imagem abaixo:
Figura 2 – Configuração da Área %Q Retentiva e Persistente
É importante observar os limites de cada modelo de UCP para tais áreas. Eventuais configurações em sobreposição ou maiores que o permitido resultarão em erro no momento da compilação.
O usuário pode marcar a checkbox indicada na imagem abaixo para consistências adicionais de declaração no programa. Esta opção faz gerar um aviso de erro de compilação caso o usuário declare uma variável %Q não volátil em área volátil, ou vice-versa.
Figura 3 – Consistência das Áreas de Memória %Q não Voláteis
Uma vez que as áreas de memória %Q Retentivas e Persistentes estão definidas, elas podem ser utilizadas pela aplicação de usuário através da diretiva AT. No exemplo a seguir, declararemos uma variável de cada tipo na POU MainPrg.
Utiliza-se a declaração "VAR RETAIN" e "END_VAR" para declarar as variáveis %Q do tipo Retentivas, e a declaração "VAR PERSISTENT" e "END_VAR" para declarar as variáveis %Q do tipo Persistentes, conforme demonstrado abaixo:
VAR RETAIN
VariavelRetentiva AT %QB4096: BYTE;
END_VAR
VAR PERSISTENT
VariavelPersistente AT %QB20480: BYTE;
END_VAR
Neste exemplo, foi declarada uma variável retentiva do tipo BYTE com o nome "VariavelRetentiva" no endereço %QB4096 (pertencente à área configurada como retentiva nos parâmetros da UCP) e uma variável persistente do tipo BYTE com o nome "VariavelPersistente" no endereço % QB20480 (pertencente à área configurada como persistente nos parâmetros da UCP)
A área de declaração das POUs permite múltiplas seções de declaração de variáveis, conforme o exemplo acima. É possível ainda criar uma terceira seção de declaração "VAR" "END_VAR" para variáveis simbólicas padrão (voláteis).
Qualquer incoerência entre o tipo da área de memória utilizado e o tipo de declaração gerará aviso de erro na compilação, pois marcamos a checkbox da Figura 3.
Alternativamente, pode-se utilizar o mapeamento %Q diretamente no código de usuário, sem uma declaração com a diretiva AT. Esta diretiva é uma conveniência para que o usuário possa lidar com um nome simbólico (tag) ao invés de um endereço de memória, no entanto, nada impede sua utilização direta, como no exemplo abaixo:
%QB4096:= %QB4096+1;
IF %QB4096 > 10 THEN
%QB4096:= 0;
END_IF
8. Memória de Variáveis Simbólicas
O processo de configuração e declaração de variáveis simbólicas Retentivas e Persistentes possui algumas diferenças em relação ao processo para variáveis de saída de representação direta (%Q) visto na seção anterior. Estas peculiaridades serão abordadas nas próximas seções.
9. Memória de Variáveis Simbólicas Retentivas
Variáveis simbólicas retentivas podem ser declaradas como locais ou globais.
Para criar uma variável simbólica retentiva local, basta colocá-la em uma seção "VAR RETAIN" "END_VAR" na área de declarações da POU em questão conforme abaixo:
VAR RETAIN
VariavelRetentiva: BYTE;
END_VAR
Neste exemplo, foi declarada uma variável simbólica retentiva do tipo BYTE com o nome "VariavelRetentiva". Note que neste caso não é necessário especificar o endereço de memória %Q onde a variável deve ser alocada, pois trata-se de uma variável puramente simbólica.
Já para criar uma variável simbólica retentiva global, primeiro é necessário criar uma Lista de Variáveis Globais (GVL) clicando com o botão direito em Application, em seguida "Acrescentar Objeto > Lista de Variáveis Globais..." conforme apresentado na imagem abaixo:
Figura 4 – Criar uma GVL
Uma vez criada a GVL, ela aparecerá na árvore de dispositivos:
Figura 5– Objeto Lista de Variáveis Globais na Árvore de Dispositivos
Em seguida, é necessário editar a GVL e acrescentar o termo "RETAIN" na declaração, de forma que ela fique "VAR_GLOBAL RETAIN". Após realizado este passo, basta incluir as variáveis dentro desta declaração e elas serão retentivas e globais conforme mostra o exemplo abaixo:
VAR_GLOBAL RETAIN
VariavelRetentiva01: BYTE;
VariavelRetentiva02: BYTE;
END_VAR
De forma semelhante ao exemplo anterior, foram declaradas duas variáveis simbólicas retentivas do tipo BYTE, porém, neste caso, globais. Uma variável global pode ser acessada em qualquer POU simplesmente utilizando o nome declarado, não é necessário indicar o seu caminho.
10. Memória de Variáveis Simbólicas Persistentes
Variáveis simbólicas Persistentes devem ser declaradas única e exclusivamente em uma lista especial chamada "Variáveis Persistentes", onde todas as variáveis declaradas são globais por definição. Esta lista é disponibilizada pelo objeto "Variáveis Persistentes", que é adicionado clicando com o botão direito em Application, em seguida "Acrescentar Objeto > Variáveis Persistentes...", conforme a figura abaixo:
Figura 6 – Adicionando o Objeto Variáveis Persistentes
Uma vez incluída, a lista aparecerá na árvore de dispositivos conforme a figura abaixo:
Figura 7 – Objeto Variáveis Persistentes na Árvore de Dispositivos
Note que, ao editar este objeto, é possível observar a declaração "VAR_GLOBAL PERSISTENT RETAIN", confirmando que se trata de uma lista de variáveis globais. A sintaxe desta declaração não deve ser alterada pelo usuário. Para adicionar variáveis, basta incluí-las logo abaixo da declaração conforme abaixo:
VAR_GLOBAL PERSISTENT RETAIN
VariavelPersistente01: BYTE;
VariavelPersistente02: BYTE;
END_VAR
Neste exemplo, são declaradas duas variáveis simbólicas persistentes do tipo BYTE. Conforme citado anteriormente, estas variáveis são globais, desta forma podem ser acessadas em qualquer POU simplesmente utilizando o nome declarado, não sendo necessário indicar o seu caminho completo.
11. Boas Práticas, Características e Restrições
Para que o recurso de retentividade de dados das UCPs seja utilizado da melhor forma possível, é importante que algumas boas práticas de utilização sejam seguidas, assim como é essencial compreender as restrições inerentes a esta funcionalidade. As próximas seções abordam estes aspectos.
12. Lista de Variáveis Persistentes
A lista de variáveis persistentes foi desenvolvida para armazenar um conjunto específico e limitado de variáveis. Em função de algumas características intrínsecas ao seu mecanismo de funcionamento, esta lista possui certas restrições relacionadas à alteração de tipos de variáveis conforme descrito na seção Alteração de Tipo em Variáveis Retentivas e Persistentes. Adicionalmente, esta lista necessita que as variáveis nela declaradas sejam alocadas de forma sequencial e ordenada na memória.
Caso uma variável seja incluída no início ou no meio da lista, o compilador alocará esta variável no primeiro endereço de memória livre (no final da lista), garantindo que as outras variáveis não serão afetadas. De forma semelhante, quando o tipo de uma variável, estrutura ou Function Block já declarado é alterado, o compilador desloca esta variável para o primeiro endereço de memória livre (final da lista). Como se pode observar, estas ações acabam criando "buracos" na área de memória, consequentemente causando a sua fragmentação, o que pode levar ao esgotamento prematuro desta área de memória. Desta forma, recomenda-se que, durante o desenvolvimento da aplicação, novas variáveis sejam incluídas no final da lista, assim como se deve evitar a alteração do tipo de variáveis já declaradas, sob a pena de causar fragmentação da área de memória.
Adicionalmente, o comando Compilar -> Limpar Tudo realiza a desfragmentação desta área. Contudo, a execução desta operação implicará na reinicialização de todas as variáveis da lista no próximo download.
ATENÇÃO:
Não é recomendado realizar a declaração de todas as variáveis do projeto de forma indiscriminada na lista de Variáveis Persistentes. Recomenda-se realizar uma análise da aplicação e declarar nesta lista somente aquelas variáveis que realmente precisam manter o seu valor em caso de reinicialização da UCP.
13. Variáveis Retentivas dentro de Function Blocks
A utilização de Variáveis Retentivas dentro de Function Blocks possui uma característica importante e que deve ser considerada no projeto da aplicação conforme descrito abaixo.
ATENÇÃO:
Caso o Function Block possua Variáveis Retentivas declaradas (VAR RETAIN), todas as outras variáveis do bloco também se tornam Retentivas (VAR, VAR_INPUT e VAR_OUTPUT).
14. Alteração de Tipo em Variáveis Retentivas e Persistentes
Alterações de tipo em variáveis, estruturas de dados e blocos de função já existentes na aplicação requerem um cuidado especial. A tabela a seguir descreve o comportamento das variáveis Retentivas e Persistentes ao realizar alteração do seu tipo, onde "û" significa que a variável é reinicializada e "ü" significa que o seu valor é mantido.
Alteração Online |
Variáveis Retentivas | Variáveis Persistentes |
Alterar tipo de uma variável para um tipo maior (BYTE para WORD, por exemplo)
|
ü | û |
Alterar tipo de uma variável para um tipo menor (WORD para BYTE, por exemplo)
|
û | û |
Alterar tipo de um ou mais elementos de uma DUT ou FunctionBlock
|
ü (Nota) |
û |
Tabela 3 – Alteração de Tipo em Variáveis Retentivas e Persistentes
Nota:
Os elementos que não foram modificados têm o seu valor mantido. Para os elementos cujo tipo está sendo modificado, o comportamento depende se o tipo é maior ou menor conforme descrito nos outros casos da tabela.
15. VÍDEOS
Nesse vídeo você poderá entender mais sobre a diferença entre essas variáveis.
No vídeo abaixo você poderá entender melhor as diferenças entre os Resets
Comentários
0 comentário
Por favor, entre para comentar.