Operações de Movimentação
Transferência & Gestão de Dados
A transferência de dados é o sistema circulatório do seu programa PLC. Gira eficientemente as cópias de variáveis, a serialização de estruturas e as manipulações de blocos de memória.
O que são operações de movimentação no TIA Portal?
As operações de movimentação permitem copiar dados de um local de memória para outro. Vão desde a simples cópia de uma variável (MOVE) até à manipulação complexa de estruturas inteiras para comunicação (Serialize/Deserialize) ou gestão de áreas de dados contíguas (MOVE_BLK).
O TIA Portal oferece instruções modernas para acesso simbólico, gestão dinâmica via tipos Variant e funções otimizadas para Array DBs, mantendo simultaneamente instruções Legacy para compatibilidade com sistemas S7-300 antigos.
Transferência Básica
Instruções fundamentais de cópia e formatação
MOVE — Copiar valor
MOVEO que faz
Copia o conteúdo da entrada IN para a saída OUT. Se o tipo de dados diferir, pode ocorrer uma conversão implícita se for segura.
Quando usar
Inicializar variáveis, copiar setpoints de HMI ou transferir resultados de cálculos.
Dicas Pro
Pode adicionar várias saídas (OUT1, OUT2...) para copiar um valor para vários destinos em simultâneo.
Em SCL, utilize simplesmente a atribuição: destination := source;
Funciona com quase todos os tipos de dados (Bool, Int, Real, Struct, String).
Serialize / Deserialize
SERO que fazem
Serialize converte uma estrutura complexa num fluxo de bytes sequenciais (Array of Byte). Deserialize faz o inverso.
Quando usar
Preparação de dados para envio via protocolos de comunicação (TCP/IP, UDP) ou armazenamento compacto.
Dicas Pro
Utilize o parâmetro POS para seguir o índice de preenchimento no buffer de destino.
Essencial para trocas com sistemas de terceiros que não compreendem os UDTs da Siemens.
Certifique-se de que o tamanho do buffer é suficiente para evitar erros de execução.
SWAP — Inverter
SWAPO que faz
Inverte a ordem dos bytes (Endianness) no operando IN.
Quando usar
Comunicação com dispositivos que utilizam o formato 'Little-Endian' enquanto o PLC utiliza 'Big-Endian'.
Dicas Pro
Geralmente utilizado em tipos Word ou DWord.
Útil para o processamento de dados de certos sensores Modbus.
Pode ser utilizado para reorganizar códigos ASCII recebidos ao contrário.
Movimentação de Blocos
Manipulação de áreas de memória massivas e contíguas
MOVE_BLK / UMOVE_BLK
MOVE_BLKO que faz
Copia um número definido de elementos de um Array de origem para um Array de destino. UMOVE_BLK é a versão não interrompível (atómica).
Quando usar
Gestão de buffers, arquivo de dados históricos ou duplicação de receitas de fabrico.
Dicas Pro
O índice de início (COUNT) define o número de elementos a copiar.
UMOVE_BLK garante que os dados não são modificados por um OB de alarme durante a cópia.
Os tipos de dados de origem e destino devem ser idênticos.
MOVE_BLK_VARIANT
O que faz
Versão avançada de MOVE_BLK que suporta tipos de dados Variant para um endereçamento flexível.
Quando usar
Desenvolvimento de blocos de biblioteca reutilizáveis que trabalham com arrays de tamanhos ou tipos diferentes.
Dicas Pro
Permite copiar entre arrays cujos tipos são determinados em tempo de execução.
Utilize CountOfElements para automatizar o parâmetro COUNT.
Muito potente no S7-1500 para programação genérica.
Preenchimento de Área
Inicialização rápida de intervalos de memória
FILL_BLK / UFILL_BLK
FILLO que faz
Preenche uma área de memória (Array) com um valor único especificado na entrada IN.
Quando usar
Repor um array de medidas a zero, ou inicializar um buffer com um valor por defeito.
Dicas Pro
UFILL_BLK é preferível para áreas críticas partilhadas com interrupções.
Muito mais performante do que um ciclo FOR para inicializar um array grande.
COUNT especifica o número de elementos a preencher a partir do ponteiro especificado.
Scatter / Gather
Decomposição e composição de bits
SCATTER / GATHER
O que fazem
SCATTER decompõe uma palavra (Word, DWord...) em bits individuais para uma estrutura ou array. GATHER faz o inverso.
Quando usar
Extração de bits de estado de uma palavra de diagnóstico ou composição de uma palavra de comando a partir de bits de controlo.
Dicas Pro
Substitui vantajosamente uma infinidade de acessos a bits (ex: %X0).
Disponível no S7-1200 e S7-1500.
Garante um código mais limpo e fácil de manter.
Acesso a Array DB
Leitura e escrita em blocos de dados do tipo array
ReadFromArrayDB / WriteToArrayDB
O que fazem
Permitem ler ou escrever um elemento específico num bloco de dados configurado como 'Array DB'.
Quando usar
Gestão de grandes listas de dados onde a indexação deve ser dinâmica e rápida.
Dicas Pro
As versões 'L' (ex: ReadFromArrayDBL) acedem à memória de carregamento (Load Memory) para dados pouco frequentes.
A utilização de Array DB é frequentemente mais performante do que o acesso indexado clássico.
Verifique se o índice está dentro dos limites para evitar erros de acesso.
Manipulação de Variant
Ferramentas para programação dinâmica
VariantGet / VariantPut
O que fazem
VariantGet extrai o valor de uma variável Variant para uma variável tipificada. VariantPut escreve um valor tipificado numa variável Variant.
Quando usar
Tratamento de dados cujo tipo exato só é conhecido no momento da chamada do bloco.
Dicas Pro
Utilize EQ_Type para verificar o tipo antes de extrair o valor.
Fundamental para criar funções de comunicação genéricas.
CountOfElements devolve o número de elementos se o Variant apontar para um Array.
Limites de Arrays
Determinação dinâmica de limites
LOWER_BOUND / UPPER_BOUND
O que faz
Devolve o limite inferior (LOWER) ou superior (UPPER) de um array passado como parâmetro Variant.
Quando usar
Iterar sobre um array de tamanho desconhecido (ex: Array[*] of MyUDT).
Dicas Pro
Indispensável para a escrita de ciclos FOR robustos: FOR i := LOWER_BOUND(...) TO UPPER_BOUND(...) DO
Funciona tanto em arrays unidimensionais como multidimensionais.
O parâmetro DIM especifica a dimensão desejada (1 por defeito).
Instruções Legacy
Compatibilidade com sistemas S7-300/400 antigos
Instruções como BLKMOV, FILL e FieldRead/FieldWrite são mantidas por compatibilidade. Para novos projetos S7-1200/1500, prefira MOVE_BLK, FILL_BLK e acessos simbólicos diretos.
Comparação de métodos de cópia
Escolher a instrução de transferência correta
| Você deve... | Instrução recomendada | Exemplo |
|---|---|---|
| Copiar uma variável simples | MOVE | Setpoint -> Atual |
| Copiar uma zona de memória | MOVE_BLK | Buffer FIFO |
| Inicializar um array | FILL_BLK | Reset de falhas |
| Preparar uma mensagem TCP | Serialize | Estrutura -> Fluxo de bytes |
| Dividir uma palavra em bits | SCATTER | Diagnóstico palavra -> estrutura |
| Acesso dinâmico | VARIANT | Bloco de biblioteca universal |
Perguntas Frequentes
Qual é a diferença entre MOVE e MOVE_BLK?
MOVE destina-se a copiar um único valor ou uma estrutura completa de uma só vez. MOVE_BLK está otimizado para copiar uma parte de um array (um certo número de elementos consecutivos).
Porquê utilizar UMOVE_BLK em vez de MOVE_BLK?
O 'U' significa Uninterruptible (não interrompível). Esta instrução garante que a operação de cópia não será interrompida por um ciclo de alarme (OBs prioritários), assegurando a total consistência dos dados copiados.
Quando utilizar Serialize e Deserialize?
Estas instruções são vitais quando precisa de enviar dados estruturados via protocolos 'brutos' como TSEND/TRCV ou para equipamentos de terceiros. Elas gerem o alinhamento de bytes de forma padronizada.
O MOVE_BLK funciona com endereços absolutos (P#DB1.DBX0.0...)?
Sim, mas o TIA Portal encoraja a utilização de acessos simbólicos. Para o endereçamento absoluto complexo, o BLKMOV (Legacy) ainda é utilizado, embora o MOVE_BLK_VARIANT seja a solução moderna recomendada.