Operaciones de Movimiento
Transferencia y Gestión de Datos
La transferencia de datos es el sistema circulatorio de su programa PLC. Gestione eficientemente las copias de variables, la serialización de estructuras y la manipulación de bloques de memoria.
¿Qué son las operaciones de movimiento en TIA Portal?
Las operaciones de movimiento permiten copiar datos de una ubicación de memoria a otra. Van desde la simple copia de una variable (MOVE) hasta la manipulación compleja de estructuras completas para la comunicación (Serialize/Deserialize) o la gestión de áreas de datos contiguas (MOVE_BLK).
TIA Portal ofrece instrucciones modernas para el acceso simbólico, gestión dinámica mediante tipos Variant y funciones optimizadas para Array DB, manteniendo instrucciones Legacy para la compatibilidad con sistemas S7-300.
Transferencia Básica
Instrucciones fundamentales de copia y formateo
MOVE — Copiar valor
MOVEQué hace
Copia el contenido de la entrada IN a la salida OUT. Si el tipo de datos difiere, puede ocurrir una conversión implícita si es segura.
Cuándo usarlo
Inicializar variables, copiar consignas HMI o transferir resultados de cálculos.
Consejos Pro
Puede añadir varias salidas (OUT1, OUT2...) para copiar un valor a varios destinos simultáneamente.
En SCL, use simplemente la asignación: destino := fuente;
Funciona con casi todos los tipos de datos (Bool, Int, Real, Struct, String).
Serialize / Deserialize
SERQué hacen
Serialize convierte una estructura compleja en un flujo de bytes secuencial (Array of Byte). Deserialize hace lo contrario.
Cuándo usarlo
Preparación de datos para envío mediante protocolos de comunicación (TCP/IP, UDP) o almacenamiento compacto.
Consejos Pro
Use el parámetro POS para seguir el índice de llenado en el buffer de destino.
Esencial para intercambios con sistemas de terceros que no entienden los UDT de Siemens.
Asegúrese de que el tamaño del buffer sea suficiente para evitar errores de ejecución.
SWAP — Intercambiar
SWAPQué hace
Invierte el orden de los bytes (Endianness) en el operando IN.
Cuándo usarlo
Comunicación con dispositivos que usan el formato 'Little-Endian' mientras que el PLC usa 'Big-Endian'.
Consejos Pro
Generalmente se usa en tipos Word o DWord.
Útil para procesar datos de ciertos sensores Modbus.
Puede usarse para reorganizar códigos ASCII recibidos al revés.
Movimiento de Bloques
Manipulación de zonas de memoria masivas y contiguas
MOVE_BLK / UMOVE_BLK
MOVE_BLKQué hace
Copia un número definido de elementos de un Array origen a un Array destino. UMOVE_BLK es la versión no interrumpible (atómica).
Cuándo usarlo
Gestión de buffers, archivado de datos históricos o duplicación de recetas de fabricación.
Consejos Pro
El índice de inicio (COUNT) define el número de elementos a copiar.
UMOVE_BLK garantiza que los datos no sean modificados por un OB de alarma durante la copia.
Los tipos de datos de origen y destino deben ser idénticos.
MOVE_BLK_VARIANT
Qué hace
Versión avanzada de MOVE_BLK que admite tipos de datos Variant para un direccionamiento flexible.
Cuándo usarlo
Desarrollo de bloques de biblioteca reutilizables que trabajan con arrays de diferentes tamaños o tipos.
Consejos Pro
Permite copiar entre arrays cuyos tipos se determinan en tiempo de ejecución.
Use CountOfElements para automatizar el parámetro COUNT.
Muy potente en S7-1500 para programación genérica.
Llenado de Zona
Inicialización rápida de rangos de memoria
FILL_BLK / UFILL_BLK
FILLQué hace
Llena una zona de memoria (Array) con un valor único especificado en la entrada IN.
Cuándo usarlo
Reiniciar un array de medidas a cero o inicializar un buffer con un valor por defecto.
Consejos Pro
UFILL_BLK es preferible para zonas críticas compartidas con interrupciones.
Mucho más eficiente que un bucle FOR para inicializar un array grande.
COUNT especifica el número de elementos a llenar a partir del puntero especificado.
Scatter / Gather
Descomposición y composición de bits
SCATTER / GATHER
Qué hacen
SCATTER descompone una palabra (Word, DWord...) en bits individuales hacia una estructura o array. GATHER hace lo contrario.
Cuándo usarlo
Extracción de bits de estado de una palabra de diagnóstico o composición de una palabra de mando desde bits de control.
Consejos Pro
Reemplaza ventajosamente a multitud de accesos a bits (ej: %X0).
Disponible en S7-1200 y S7-1500.
Garantiza un código más limpio y fácil de mantener.
Acceso a Array DB
Lectura y escritura en bloques de datos tipo array
ReadFromArrayDB / WriteToArrayDB
Qué hacen
Permiten leer o escribir un elemento específico en un bloque de datos configurado como 'Array DB'.
Cuándo usarlo
Gestión de grandes listas de datos donde la indexación debe ser dinámica y rápida.
Consejos Pro
Las versiones 'L' (ej: ReadFromArrayDBL) acceden a la memoria de carga (Load Memory) para datos poco frecuentes.
El uso de Array DB suele ser más eficiente que el acceso indexado clásico.
Verifique que el índice esté dentro de los límites para evitar errores de acceso.
Manipulación de Variant
Herramientas para programación dinámica
VariantGet / VariantPut
Qué hacen
VariantGet extrae el valor de una variable Variant a una variable tipada. VariantPut escribe un valor tipado en una variable Variant.
Cuándo usarlo
Procesamiento de datos cuyo tipo exacto solo se conoce en el momento de la llamada al bloque.
Consejos Pro
Use EQ_Type para verificar el tipo antes de extraer el valor.
Fundamental para crear funciones de comunicación genéricas.
CountOfElements devuelve el número de elementos si el Variant apunta a un Array.
Límites de Array
Determinación dinámica de límites
LOWER_BOUND / UPPER_BOUND
Qué hace
Devuelve el límite inferior (LOWER) o superior (UPPER) de un array pasado como parámetro Variant.
Cuándo usarlo
Recorrer un array de tamaño desconocido (ej: Array[*] of MyUDT).
Consejos Pro
Indispensable para escribir bucles FOR robustos: FOR i := LOWER_BOUND(...) TO UPPER_BOUND(...) DO
Funciona tanto en arrays unidimensionales como multidimensionales.
El parámetro DIM especifica la dimensión deseada (1 por defecto).
Instrucciones Legacy
Compatibilidad con sistemas antiguos S7-300/400
Instrucciones como BLKMOV, FILL y FieldRead/FieldWrite se mantienen por compatibilidad. Para nuevos proyectos S7-1200/1500, prefiera MOVE_BLK, FILL_BLK y accesos simbólicos directos.
Comparación de métodos de copia
Elegir la instrucción de transferencia adecuada
| Usted debe... | Instrucción recomendada | Ejemplo |
|---|---|---|
| Copiar una variable simple | MOVE | Consigna -> Actual |
| Copiar una zona de memoria | MOVE_BLK | Buffer FIFO |
| Inicializar un array | FILL_BLK | Reset fallos |
| Preparar un mensaje TCP | Serialize | Estructura -> Flujo bytes |
| Dividir palabra en bits | SCATTER | Diagnóstico palabra -> estructura |
| Acceso dinámico | VARIANT | Bloque librería universal |
Preguntas Frecuentes
¿Cuál es la diferencia entre MOVE y MOVE_BLK?
MOVE está destinado a copiar un solo valor o una estructura completa de una vez. MOVE_BLK está optimizado para copiar una parte de un array (un cierto número de elementos consecutivos).
¿Por qué usar UMOVE_BLK en lugar de MOVE_BLK?
La 'U' significa Uninterruptible (no interrumpible). Esta instrucción garantiza que la operación de copia no sea interrumpida por un ciclo de alarma (OB prioritarios), asegurando la coherencia total de los datos copiados.
¿Cuándo usar Serialize y Deserialize?
Estas instrucciones son vitales cuando necesita enviar datos estructurados mediante protocolos 'brutos' como TSEND/TRCV o hacia equipos de terceros. Gestionan la alineación de bytes de forma estandarizada.
¿MOVE_BLK funciona con direcciones absolutas (P#DB1.DBX0.0...)?
Sí, pero TIA Portal fomenta el uso de accesos simbólicos. Para direccionamiento absoluto complejo, todavía se usa BLKMOV (Legacy), aunque MOVE_BLK_VARIANT es la solución moderna recomendada.