> For the complete documentation index, see [llms.txt](https://docs.augelab.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.augelab.com/spanish/function-blocks/blocks-reference/data-logic/flow-control/subsystem.md).

# Subsystem

Este bloque de función actúa como un contenedor de flujo de trabajo autocontenido. Úsalo para agrupar pasos de procesamiento relacionados dentro de un espacio de trabajo separado y editable, de modo que los escenarios complejos se mantengan organizados y sean más fáciles de gestionar.

## 📥 Entradas <a href="#inputs" id="inputs"></a>

`No default inputs`\
Este bloque no declara entradas por sí mismo. Las entradas se crean añadiendo sockets de entrada dentro del espacio de trabajo del subsistema y exponiéndolas en el borde del bloque.

## 📤 Salidas <a href="#outputs" id="outputs"></a>

`No default outputs`\
Este bloque no declara salidas por sí mismo. Las salidas se definen a través de los bloques hijos colocados dentro del subsistema y se exponen como salidas del subsistema.

## 🕹️ Controles <a href="#controls" id="controls"></a>

`Open Subsystem Editor`\
Abre el espacio de trabajo del subsistema para añadir o editar el flujo contenido. (Normalmente disponible con doble clic en el bloque o desde el menú contextual del bloque.)

`Expose Input`\
Crea un socket de entrada dentro del subsistema y expónlo en el borde del bloque para que el flujo padre pueda enviar datos.

`Expose Output`\
Crea un socket de salida dentro del subsistema y expónlo en el borde del bloque para devolver resultados al flujo principal.

`Run / Debug Inside`\
Ejecuta y depura el flujo contenido de forma independiente del escenario principal para validar su comportamiento.

## 🎯 Características clave <a href="#features" id="features"></a>

* Encapsulación: Agrupa pasos de preprocesamiento, detección, seguimiento y exportación en una única unidad reutilizable.
* Espacio de trabajo local: El subsistema tiene su propio lienzo editable para diseñar comportamientos complejos sin ensuciar el flujo principal.
* Límites claros: Expón solo las entradas y salidas necesarias, manteniendo el grafo principal simple.
* Pruebas aisladas: Abre y ejecuta el espacio de trabajo del subsistema para depurar o validar sub‑flujos de forma independiente.
* Reutilización: Construye un subsistema probado una vez y reutilízalo en varios proyectos.

## ⚙️ Cómo se ejecuta <a href="#running-mechanism" id="running-mechanism"></a>

* Cuando se ejecuta el escenario, el subsistema ejecuta su flujo interno.
* Los datos entran en el subsistema a través de los sockets de entrada que hayas expuesto dentro de él.
* Los bloques hijos dentro del subsistema calculan sus resultados en secuencia.
* Las salidas que expusiste dentro del subsistema se recopilan y se devuelven al flujo padre como salidas del bloque.
* Si un bloque hijo dentro del subsistema informa un error o un estado inválido, el subsistema reflejará ese estado para que puedas localizar y corregir el problema dentro del espacio de trabajo.

## 📝 Guía de uso <a href="#usage" id="usage"></a>

1. Añade un bloque `Subsystem` a tu flujo principal para contener una secuencia compleja (adquisición → procesamiento → exportación).
2. Abre el espacio de trabajo del subsistema (`Open Subsystem Editor`) y añade los bloques necesarios.
3. Dentro del subsistema, expón solo las entradas y salidas que requiera el flujo padre.
4. Prueba el subsistema de forma independiente usando los controles internos de ejecución/depuración antes de integrarlo en el escenario principal.
5. Reutiliza y duplica subsistemas para tareas similares y así acelerar el desarrollo.

## 💡 Consejos y buenas prácticas <a href="#tips-and-tricks" id="tips-and-tricks"></a>

* Agrupa una canalización completa de cámara dentro de un subsistema: usa `Camera USB` o `Camera IP (ONVIF)` → bloques de preprocesado como `Image Resize` / `Blur` → detectores como `Object Detection` o `Find Object` → visualización con `Draw Detections` → almacenamiento con `Image Logger` o `Image Write`.
* Para flujos de seguimiento, coloca `Object Detection` (o `Object Detection - Custom`) y `Object_Detection_Tracker` dentro de un mismo subsistema para mantener la lógica de tracking y el post‑procesado juntos.
* Encapsula pasos de IA pesados como `Super Resolution`, `Depth Estimation (DepthAny. V2)` o `Background Removal (RMBG-1.4)` dentro de subsistemas para poder activarlos/desactivarlos o cambiar modelos sin afectar el flujo principal.
* Usa subsistemas para implementar análisis en varias etapas: p. ej., selección ROI con `Image ROI Select` → análisis de forma con `Find Contour` / `Measure Position Distance` → formateo de resultados con `Data to JSON`.
* Para análisis de intersecciones o tráfico, mantén detección y tracking en un subsistema y agregación/exportación (por ejemplo `Traffic Intersection Analysis` o `CSV Export`) en otro para separar responsabilidades.
* Para paso de datos y estado local, combina subsistemas con `Data Write Local` y `Data Read Local` para mantener memoria local sin contaminar el flujo global.
* Al depurar, abre el subsistema y ejecuta solo su contenido para identificar rápidamente qué bloque interno causa salidas inválidas o inesperadas.

## 🛠️ Solución de problemas <a href="#troubleshooting" id="troubleshooting"></a>

* `No outputs appearing`\
  Confirma que has expuesto salidas dentro del subsistema. Si no hay salidas expuestas, el bloque no devolverá datos al flujo padre.
* `Inputs not received`\
  Asegúrate de haber creado y expuesto sockets de entrada dentro del subsistema y que el flujo padre esté conectado a esas entradas expuestas.
* `Child block reports invalid`\
  Abre el espacio de trabajo del subsistema e inspecciona los bloques hijos. Los errores internos aparecerán allí: corrige la configuración del bloque hijo o reemplaza el bloque problemático.
* `Performance issues`\
  Si el subsistema contiene procesamiento pesado (modelos de IA, super‑resolución, operaciones de gran volumen), considera perfilar dentro del subsistema y mover procesos no esenciales a subsistemas separados y bajo demanda.
* `Need to reuse or version`\
  Duplica el subsistema y conserva una copia de prueba. Así podrás probar parámetros o modelos distintos sin afectar el flujo en producción.
