Manual de Ayuda
IOTA PLC Arduino Studio
Guía pensada para aprender automatización desde cero usando Arduino como plataforma de control y una forma de trabajo inspirada en los entornos PLC industriales.
La meta es que puedas crear lógica Ladder, usar Structured Text, clasificar variables, mapear entradas y salidas, compilar, cargar, observar ONLINE y diagnosticar sin necesitar conocimientos avanzados de programación.
Guía de producción · basada en v0.5.5.21. Conceptos básicos antes de programar
Un PLC puede imaginarse como un pequeño controlador que repite el mismo ciclo muchas veces por segundo.
Áreas de variables
| Área | Qué significa | Ejemplo | ¿Mueve hardware? |
|---|---|---|---|
| I | Entrada digital | Start, FinCarrera | Sí, lee un pin |
| Q | Salida digital | Motor, Rele1 | Sí, escribe un pin |
| M | Memoria interna | Permiso, Paso_1 | No |
| AI | Entrada analógica | Nivel_pct | Lee A0/A1… |
| AQ | Salida analógica/PWM | Velocidad_PWM | Escribe PWM/analogWrite |
| DB | Dato lógico del proyecto | Setpoint, contador de producción | No directamente |
Motor no acciona por sí sola un relé. Para mover una salida real, el tag debe estar clasificado como Q y tener un Pin válido.2. Conocer la interfaz
Las siguientes capturas corresponden al entorno real del programa. Los números naranjos identifican zonas que conviene aprender primero.
- 1. Menú tradicional: Archivo, Editar, Programa, PLC / Arduino, Herramientas, Ver y Ayuda.
- 2. Barra rápida: Nuevo, Abrir, Guardar, ONLINE, Compilar, Cargar, Recuperar, Networks, Subrutinas, Tags y más.
- 3. Selector de CPU/FQBN y puerto COM del Arduino.
- 4. Árbol del proyecto: OB1, subrutinas, tags, referencias, adaptador Arduino y librerías.
- 5. Zona de trabajo. Aquí se dibuja y edita la lógica Ladder.
- 6. Paleta de instrucciones: contactos, bobinas, timers, contadores, comparadores, matemática y analógicas.
- 7. Consola de diagnóstico y barra de estado. Úsala para ver detección de hardware, compilación y errores.
- 1. Selecciona el bloque ST que quieres editar.
- 2. Tipo de bloque. En esta versión se usa principalmente FC/FB como organización lógica.
- 3. Comentario del bloque: describe su objetivo con palabras simples.
- 4. Editor ST. Escribe IF, ELSIF, ELSE, FOR, WHILE y asignaciones con :=.
- 1. Leer tags de la lógica: analiza Ladder/ST y crea los símbolos que faltan.
- 2. Botones rápidos para crear memoria M, entrada digital DI, salida digital DO, entrada analógica AI y salida PWM.
- 3. Mapear seleccionado → DO: convierte una variable/bobina en salida física y permite asignar pin/polaridad.
- 4. Tabla principal de variables: nombre, tipo, área, dirección PLC, pin, valor inicial, alias, HMI, escalado y comentario.
- 1. CPU / FQBN: identifica la placa para Arduino CLI.
- 2. Puerto: el COM real del Arduino.
- 3. Tiempo de scan: intervalo de ejecución del ciclo PLC.
- 4. Lista de puertos serie detectados con fabricante, VID/PID y HWID.
- 1. Activa la integración IOTA HMI + ONLINE en el firmware generado.
- 2. Conectar ONLINE abre el canal de ingeniería con el Arduino.
- 3. Estado del firmware: antes de FORCE/WRITE el Studio comprueba que los tags del proyecto existan en el firmware.
- 4. Tabla ONLINE: valor actual, área, acceso HMI y estado FORCE.
- 5. Controles de ingeniería: Escribir valor, FORCE 1, FORCE 0, FORCE valor, Quitar FORCE y Quitar TODOS.
- 1. Importar .ino carga un sketch desde el disco.
- 2. Adaptar e integrar analiza el sketch y lo incorpora al proyecto.
- 3. Editor donde puedes pegar el código Arduino completo.
- 4. Área de reporte: muestra advertencias y decisiones del adaptador.
- 1. Headers / librerías: por ejemplo Servo.h o Wire.h.
- 2. Objetos, funciones y variables globales C++.
- 3. Código adicional que se ejecuta en setup().
- 4. Código adicional que se ejecuta en loop() antes del scan PLC.
- 1. Encabezado del sketch: proyecto, placa, tiempo de scan e integración HMI.
- 2. Mapa de salidas físicas. Si aparece “Sin salidas Q físicas mapeadas”, ninguna bobina moverá hardware hasta asignar Área=Q y Pin.
- 3. IOTA_syncPhysicalOutputs(): función que escribe las Q físicas mediante digitalWrite() en cada scan.
3. Primer proyecto: un botón enciende una salida
Esta es la práctica recomendada para comprobar que el entorno, la placa y el mapeo físico están correctos.
- Crea un proyecto nuevo. El programa parte con OB1 y Network 1 vacío.
- Desde la paleta de la derecha inserta Contacto NO. Escribe
Start. - Inserta una Bobina y nómbrala
Motor. La bobina se coloca como salida del rung. - Abre Tags / Variables y pulsa Leer tags de la lógica. Deben aparecer Start y Motor.
- Configura
Startcomo área I, tipo BOOL, pin 2. Si el pulsador conecta el pin a GND usando INPUT_PULLUP, marca la inversión correspondiente. - Selecciona
Motory usa ⚡ Mapear seleccionado → DO. Por ejemplo, pin 13 para el LED integrado de un Arduino Uno o pin 4 para un relé. - Presiona F7 para Compilar y luego F8 para Cargar Arduino.
- Prueba físicamente. Luego entra ONLINE con F5 para observar la lógica.
4. Programación Ladder
Ladder representa la lógica como si fuera un circuito eléctrico. Se lee principalmente de izquierda a derecha y de arriba hacia abajo.
Ejemplo de enclavamiento Start/Stop
Al pulsar Start, la bobina Motor se activa. Su propio contacto paralelo mantiene el camino aunque se suelte Start. Al pulsar Stop, el contacto NC abre la condición y Motor se apaga.
Editar elementos
- Doble clic sobre un símbolo: editar directamente encima.
- F2: editar el elemento seleccionado.
- Ctrl+Enter: propiedades avanzadas.
- Ctrl+C, Ctrl+X, Ctrl+V: copiar, cortar y pegar.
- Supr: eliminar.
- Arrastrar: mover a otra celda válida.
Comentarios
Documentar es parte del programa. Puedes agregar título y comentario de Network, comentario local de un elemento y comentario global del tag. Usa nombres que expliquen la función, por ejemplo Bomba_Recirculacion en vez de M1 cuando sea posible.
6. Temporizadores y contadores
TON: retardo a la conexión
El TON tiene un nombre de instancia, por ejemplo T_Arranque. Esa instancia guarda su propio tiempo y permite reutilizar sus miembros en otros Networks.
| Miembro | Significado sencillo |
|---|---|
| T_Arranque.Q | Salida del temporizador: se activa al cumplirse el tiempo. |
| T_Arranque.ET | Tiempo transcurrido. |
| T_Arranque.PT | Tiempo programado. |
| DN / TT / EN | Indicadores de diagnóstico familiares para usuarios de PLC. |
TOF y TP
TOF retrasa la desconexión. TP genera un pulso de duración definida cuando se activa.
CTU / CTD
CTU cuenta hacia arriba y CTD hacia abajo. Sus instancias exponen valores como CV (conteo actual), PV (preset) y Q.
7. Señales analógicas y escalamiento
Una entrada analógica no es solamente ON/OFF: puede representar temperatura, nivel, presión, luz, potenciómetro, etc.
Ejemplo A0 → 0…100 %
En un Arduino Uno, analogRead(A0) entrega normalmente un valor entero entre 0 y 1023. El bloque SCALE puede convertirlo a una unidad fácil de leer:
Entrada cruda: 0 ... 1023
Salida escala: 0 ... 100 %
0 -> 0 %
512 -> ~50 %
1023 -> 100 %También puedes crear un tag de área AI, asignar pin A0 y activar el auto-escalado en la tabla de Tags.
8. Subrutinas Ladder
Una subrutina sirve para separar el programa en partes. Por ejemplo: FC_Bombas, FC_Alarmas, FC_Nivel.
OB1
Network 1
------------------------[ CALL FC_Entradas ]
Network 2
------------------------[ CALL FC_Proceso ]
Network 3
------------------------[ CALL FC_Alarmas ]Si antepones un contacto al CALL, la rutina solo se ejecuta cuando esa condición sea verdadera.
9. Structured Text (ST)
- 1. Selecciona el bloque ST que quieres editar.
- 2. Tipo de bloque. En esta versión se usa principalmente FC/FB como organización lógica.
- 3. Comentario del bloque: describe su objetivo con palabras simples.
- 4. Editor ST. Escribe IF, ELSIF, ELSE, FOR, WHILE y asignaciones con :=.
ST es útil cuando la operación sería incómoda de dibujar en Ladder, por ejemplo cálculos, condiciones múltiples o algoritmos cortos.
// Ejemplo: alarma simple de nivel
IF Nivel_pct > 95.0 THEN
Permiso := FALSE;
ELSIF Nivel_pct < 80.0 THEN
Permiso := TRUE;
END_IF;Para ejecutar un bloque ST desde Ladder usa la instrucción CALL bloque ST. Mantén los ejemplos escolares pequeños y claros: una función debe hacer una tarea fácil de describir.
10. Integrar código Arduino / C++
Adaptar .INO
- 1. Importar .ino carga un sketch desde el disco.
- 2. Adaptar e integrar analiza el sketch y lo incorpora al proyecto.
- 3. Editor donde puedes pegar el código Arduino completo.
- 4. Área de reporte: muestra advertencias y decisiones del adaptador.
Esta opción es útil cuando ya tienes un sketch Arduino. El adaptador conserva librerías, integra setup()/loop() y detecta variables globales simples para enlazarlas al proyecto.
// Sketch de ejemplo para importar
int sensorRaw = 0;
bool alarma = false;
void setup() {
pinMode(8, OUTPUT);
}
void loop() {
sensorRaw = analogRead(A0);
alarma = sensorRaw > 800;
digitalWrite(8, alarma ? HIGH : LOW);
}Arduino / C++ avanzado
- 1. Headers / librerías: por ejemplo Servo.h o Wire.h.
- 2. Objetos, funciones y variables globales C++.
- 3. Código adicional que se ejecuta en setup().
- 4. Código adicional que se ejecuta en loop() antes del scan PLC.
Usa esta pestaña cuando solo necesitas agregar una librería, objeto o función concreta. Ejemplo:
// Headers / librerías
Servo.h
// Objetos/globales
Servo valvula;
// setup adicional
valvula.attach(9);
// loop adicional antes del scan
// valvula.write(90);11. ONLINE, WRITE y FORCE
- 1. Activa la integración IOTA HMI + ONLINE en el firmware generado.
- 2. Conectar ONLINE abre el canal de ingeniería con el Arduino.
- 3. Estado del firmware: antes de FORCE/WRITE el Studio comprueba que los tags del proyecto existan en el firmware.
- 4. Tabla ONLINE: valor actual, área, acceso HMI y estado FORCE.
- 5. Controles de ingeniería: Escribir valor, FORCE 1, FORCE 0, FORCE valor, Quitar FORCE y Quitar TODOS.
ONLINE permite observar y modificar variables mientras el Arduino ejecuta el firmware.
| Acción | Qué hace | Cuándo usarla |
|---|---|---|
| Escribir valor (WRITE) | Cambia el dato una vez. La lógica puede modificarlo de nuevo en el siguiente scan. | Probar setpoints o memorias sin bloquear la lógica. |
| FORCE | Mantiene el valor forzado en cada scan. | Diagnóstico temporal. |
| Quitar FORCE | Restaura el valor que existía antes del primer FORCE y luego devuelve el control al programa. | Finalizar la prueba. |
Ejemplos del protocolo (avanzado)
Normalmente no necesitas escribir estos comandos manualmente; la interfaz los genera.
IOTA|WRITE|Setpoint|75
IOTA|FORCE|Motor|1
IOTA|FORCE|Motor|0
IOTA|UNFORCE|Motor
IOTA|UNFORCEALL12. Compilar y cargar al Arduino
IOTA PLC Arduino Studio utiliza Arduino CLI como backend de placas, cores, librerías, compilación y upload.
- Conecta el Arduino por USB.
- Selecciona la CPU / FQBN. Para Arduino Uno:
arduino:avr:uno. - Selecciona el Puerto COM correcto.
- Revisa Tags. Toda salida física debe ser Q con pin válido.
- Presiona F7 Compilar.
- Si no hay errores, presiona F8 Cargar.
- Revisa la consola. Un upload correcto termina sin error.
- 1. CPU / FQBN: identifica la placa para Arduino CLI.
- 2. Puerto: el COM real del Arduino.
- 3. Tiempo de scan: intervalo de ejecución del ciclo PLC.
- 4. Lista de puertos serie detectados con fabricante, VID/PID y HWID.
13. Recuperar un proyecto desde el Arduino
El programa puede recuperar el proyecto editable si el firmware fue generado por IOTA y se guardó una copia recuperable dentro de él.
- Antes de compilar, abre IOTA HMI Online.
- Marca Guardar copia recuperable del proyecto dentro del firmware.
- Compila y carga normalmente.
- Más adelante conecta ese Arduino y usa Recuperar o Recuperar proyecto del PLC.
- Guarda el proyecto recuperado como archivo
.iotaplc.
14. Referencias cruzadas (XREF)
XREF responde preguntas como: “¿Dónde se usa Motor?”, “¿Quién escribe esta memoria?” o “¿Dónde se llama esta subrutina?”.
Abre Referencias cruzadas con Ctrl+Shift+F. La herramienta puede mostrar lecturas, escrituras, instancias, llamadas y múltiples escrituras.
Símbolo Acceso Bloque Network Instrucción
Motor W OB1 Network 3 COIL
Motor R FC_Alarmas Network 2 CONTACT
T_Arranque.Q R OB1 Network 2 CONTACT
FC_ControlNivel CALL OB1 Network 2 CALL_SUB15. Código generado y diagnóstico de salidas
- 1. Encabezado del sketch: proyecto, placa, tiempo de scan e integración HMI.
- 2. Mapa de salidas físicas. Si aparece “Sin salidas Q físicas mapeadas”, ninguna bobina moverá hardware hasta asignar Área=Q y Pin.
- 3. IOTA_syncPhysicalOutputs(): función que escribe las Q físicas mediante digitalWrite() en cada scan.
Normalmente no necesitas editar el código generado. Esta pestaña es excelente para aprender qué ocurre “debajo” y para diagnosticar.
Salida física
// Ejemplo conceptual para Motor -> pin 4 activo HIGH
void IOTA_syncPhysicalOutputs() {
digitalWrite(4, Motor ? HIGH : LOW);
}Para un relé activo LOW el sentido eléctrico se invierte:
digitalWrite(4, Motor ? LOW : HIGH);Si el mapa dice Sin salidas Q físicas mapeadas, vuelve a Tags y asigna Área Q + Pin.
16. Prácticas guiadas para estudiantes
Práctica A · LED controlado por pulsador
Objetivo: aprender Contacto NO, Bobina, I y Q. Usa el paso a paso del capítulo “Primer proyecto”.
Práctica B · Marcha / Paro con enclavamiento
- Crea Start (I), Stop (I) y Motor (Q).
- Agrega Start en la línea principal.
- Crea una rama paralela y coloca un contacto Motor para el enclavamiento.
- Después de la unión, coloca Stop como contacto NC.
- Finaliza con la bobina Motor.
- Prueba primero con LED/relé sin carga.
Práctica C · Arranque retardado 2 segundos
Crea T_Arranque con PT=2000 ms. En otro Network usa T_Arranque.Q para activar Motor.
Práctica D · Potenciómetro como nivel 0…100 %
- Conecta un potenciómetro a A0 (con alimentación segura de 5 V/3.3 V según tu placa).
- Crea un AI o utiliza ANALOG READ.
- Escala 0…1023 a 0…100.
- Observa
Nivel_pctONLINE. - Agrega un comparador
Nivel_pct > 80para una alarma.
Práctica E · Separar el programa en subrutinas
Crea FC_Entradas, FC_Proceso y FC_Salidas. Llama cada una desde OB1. Luego usa XREF para verificar dónde se llama cada rutina.
Práctica F · Diagnóstico ONLINE
Usa una memoria M. Haz WRITE 1 y observa que la lógica puede cambiarla en otro scan. Luego usa FORCE 1 y observa que permanece hasta Quitar FORCE.
17. Solución de problemas
| Problema | Qué revisar |
|---|---|
| La bobina se ve activa pero el Arduino no conmuta. | El tag debe ser Área Q, tener Pin válido y aparecer en Physical output map. Recompila y vuelve a cargar. |
| El relé funciona al revés. | Probablemente es activo LOW. Cambia la polaridad del mapeo DO. |
| ONLINE muestra UNKNOWN_VAR. | El firmware cargado no contiene ese tag. Sincroniza tags, F7 Compilar, F8 Cargar y reconecta ONLINE. |
| Quitar FORCE deja un comportamiento extraño. | La versión actual restaura el valor previo y luego el scan vuelve a gobernar. Revisa si la lógica normal vuelve a poner el bit en 1. |
| Una subrutina no hace nada. | Confirma que exista un CALL subrutina LAD desde OB1 o desde una rutina ejecutada. |
| El valor WRITE “se devuelve”. | WRITE es una escritura única. Si Ladder escribe el tag cada scan, lo reemplazará. Usa FORCE solo para diagnóstico. |
| No compila una librería Arduino. | Abre Librerías, instala la librería necesaria y verifica el nombre del #include. |
| El puerto COM aparece, pero no carga. | Revisa FQBN, puerto, cable USB de datos, drivers CH340 y que otro programa no tenga abierto el puerto. |
| Arduino CLI indica 0 placas identificadas. | Selecciona manualmente la placa si el puerto serie sí está presente. |
18. Glosario
19. Atajos principales
| Atajo | Acción |
|---|---|
| F2 | Editar símbolo seleccionado |
| Ctrl+Enter | Propiedades avanzadas |
| Ctrl+C / Ctrl+X / Ctrl+V | Copiar / Cortar / Pegar |
| Supr | Eliminar elemento |
| Ctrl+Z / Ctrl+Y | Deshacer / Rehacer |
| Ctrl+B | Crear rama paralela |
| Ctrl+Shift+F | Referencias cruzadas |
| F5 | ONLINE |
| F7 | Compilar |
| F8 | Cargar Arduino |
| Ctrl+S | Guardar proyecto |
20. Recomendaciones para trabajar bien
- Usa nombres claros:
Start_Bomba,Nivel_Tanque,Alarma_Temperatura. - Un Network debe tener un objetivo fácil de explicar en una frase.
- Agrega comentarios antes de olvidar por qué hiciste una lógica.
- Prueba primero con LED y señales de baja potencia.
- Usa XREF antes de cambiar un tag usado en muchas partes.
- Guarda versiones del proyecto antes de modificaciones grandes.
- Antes de cargar, revisa siempre CPU, COM y mapa de E/S.