# Programación Siemens — contenido completo para LLMs > Las 60 guías más completas del blog de programación de PLC Siemens (TIA Portal, Step 7, > SCL, AWL, LADDER, WinCC, PROFINET, HMI), en Markdown y con su URL canónica. Índice > resumido en https://programacionsiemens.com/llms.txt · Autor: Iñigo Gútiez. --- # Leer y escribir datos de un S7 con Python y Snap7 > Cómo leer y escribir datos de un PLC Siemens S7 desde Python con Snap7: configuración en TIA Portal, DBs no optimizados y registro a CSV. Fuente: https://programacionsiemens.com/leer-y-escribir-datos-de-un-s7-con-python-y-snap7 · Autor: Iñigo Gútiez · Publicado: 2026-08-05 · Actualizado: 2026-08-27 · Categoría: Comunicaciones «Leer un S7 desde Python» es una consulta que recientemente me ha llegado, así que vamos a ver el método que usa mucha gente cuando quiere hablar con el PLC sin montar un servidor OPC: **Snap7**. Snap7 es una librería que implementa el protocolo S7 (el mismo que usa el propio TIA Portal para comunicar con la CPU). Con su binding para Python, `python-snap7`, te conectas directo a la CPU por Ethernet y lees o escribes bytes de un DB. Sin servidor intermedio, sin licencias. Para un script rápido de registro de datos o una prueba de laboratorio va de lujo. ### Qué es Snap7 y cuándo usarlo (y cuándo no) Snap7 habla el protocolo S7comm a través de la comunicación PUT/GET, la misma que se usa entre PLCs con los bloques `PUT` y `GET`. Eso tiene consecuencias importantes que conviene tener claras antes de escribir una línea: - Solo accede a DBs no optimizados. Los DBs con "Acceso optimizado al bloque" activado no exponen direcciones absolutas de byte, y Snap7 trabaja con direcciones absolutas. Esto es lo que más gente pilla por sorpresa. - No hay cifrado ni autenticación de verdad. PUT/GET es comunicación de PLC legacy. Para producción con requisitos de seguridad, OPC UA es el camino correcto. - Es cómodo para prototipos, data logging y pruebas. Si necesitas algo robusto, auditable y con tipos de datos autodescritos, tira de OPC UA. ** Regla rápida: script de fin de semana, registro de valores, banco de pruebas, Snap7. Sistema de producción que va a auditar el cliente, OPC UA. ### Instalar python-snap7 Con Python 3 instalado, desde la terminal: ``` pip install python-snap7 ``` Las versiones recientes de `python-snap7` ya incluyen la librería nativa `snap7` compilada dentro del paquete, así que en Windows no necesitas copiar la DLL a mano como pasaba antaño. Si te da un error de librería no encontrada, revisa la documentación del paquete en PyPI para tu sistema operativo. ### Configurar el S7-1200 / S7-1500 en TIA Portal Aquí está el 90% del trabajo. Si no habilitas los permisos correctos en la CPU, el script conectará pero no leerá nada, o directamente te rechazará la conexión. #### 1. Permitir el acceso PUT/GET En las propiedades de la CPU, ve a Protección y seguridad** y marca la casilla **"Permitir acceso vía comunicación PUT/GET del interlocutor remoto"**. Sin esto, olvídate. #### 2. Crear un DB con acceso no optimizado Crea un bloque de datos global, botón derecho sobre él, **Propiedades**, pestaña **Atributos** y **desmarca "Acceso al bloque optimizado"**. Al desmarcarlo el DB pasa a direccionamiento absoluto por offset de byte, que es lo que Snap7 necesita. Para el ejemplo voy a montar un `DB10` con esta estructura: - `Temperatura` : REAL en offset 0.0 (ocupa 4 bytes, 0.0 a 3.0) - `Contador` : INT en offset 4.0 (2 bytes) - `Marcha` : BOOL en offset 6.0 Anota bien los offsets de la columna "Offset" del editor de DB. Son la clave para leer y escribir después. #### 3. Nivel de acceso y firewall Comprueba que el nivel de acceso de la CPU permite HMI/lectura-escritura y que la red entre tu PC y el PLC deja pasar el puerto TCP 102 (ISO on TCP). Un antivirus corporativo o un firewall bloqueando el 102 es un clásico de tarde perdida. ### Conectar y leer un DB desde Python La conexión necesita la IP de la CPU, el número de rack y el número de slot. Para un S7-1200 y S7-1500 con CPU integrada, lo habitual es **rack 0, slot 1**. Confirma tu configuración concreta si tienes dudas. ``` import snap7 from snap7.util import get_real, get_int, get_bool IP = "192.168.0.1" RACK = 0 SLOT = 1 plc = snap7.client.Client() plc.connect(IP, RACK, SLOT) print("Conectado:", plc.get_connected()) # Leemos 7 bytes del DB10 empezando en el offset 0 data = plc.db_read(10, 0, 7) temperatura = get_real(data, 0) # REAL en offset 0.0 contador = get_int(data, 4) # INT en offset 4.0 marcha = get_bool(data, 6, 0) # BOOL en offset 6.0, bit 0 print(f"Temperatura: {temperatura:.2f}") print(f"Contador: {contador}") print(f"Marcha: {marcha}") plc.disconnect() ``` El método `db_read(db_number, start, size)` te devuelve un `bytearray` con los bytes crudos. Las funciones de `snap7.util` interpretan ese buffer según el tipo y el offset. Fíjate que para el BOOL hay que indicar byte y bit. ### Escribir un valor en el DB Para escribir haces lo inverso: lees el buffer, modificas los bytes con las funciones `set_*` y lo devuelves con `db_write`. ``` import snap7 from snap7.util import set_int, set_bool plc = snap7.client.Client() plc.connect("192.168.0.1", 0, 1) # Leemos primero para no pisar el resto del DB data = plc.db_read(10, 0, 7) set_int(data, 4, 1234) # Contador = 1234 set_bool(data, 6, 0, True) # Marcha = True plc.db_write(10, 0, data) plc.disconnect() ``` Truco: escribe siempre sobre el buffer que acabas de leer. Si construyes un `bytearray` nuevo con solo los bytes que te interesan y lo escribes entero, machacas el resto del DB con ceros. Lee, modifica lo tuyo, escribe. ### Ejemplo práctico: registrar valores a CSV El caso de uso estrella de Snap7. Un script que lee la temperatura cada segundo y la va apilando en un CSV con marca de tiempo. Perfecto para un banco de pruebas o para caracterizar un proceso sin tocar el HMI. ``` import snap7 from snap7.util import get_real, get_int import csv import time from datetime import datetime IP = "192.168.0.1" INTERVALO = 1.0 # segundos plc = snap7.client.Client() plc.connect(IP, 0, 1) with open("registro.csv", "w", newline="") as f: writer = csv.writer(f, delimiter=";") writer.writerow(["timestamp", "temperatura", "contador"]) try: while True: data = plc.db_read(10, 0, 7) temperatura = get_real(data, 0) contador = get_int(data, 4) ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S") writer.writerow([ts, f"{temperatura:.2f}", contador]) f.flush() print(ts, temperatura, contador) time.sleep(INTERVALO) except KeyboardInterrupt: print("Registro detenido por el usuario") finally: plc.disconnect() ``` Uso el separador punto y coma para que Excel en español lo abra en columnas sin pelearte con las comas de los decimales. El `f.flush()` fuerza el guardado en disco en cada iteración, así si el script se corta no pierdes lo registrado hasta ese momento. #### Buena práctica: comprueba la conexión En un script de larga duración, la conexión se puede caer. Envuelve la lectura en un control de excepciones y reconecta con `plc.connect()` si `plc.get_connected()` devuelve `False`. Un PLC no espera a tu script, y una reprogramación o un corte de red te tira la sesión. ### Límites de Snap7 y cuándo preferir OPC UA Snap7 es directo y rápido de montar, pero tiene techo: - DBs optimizados fuera. Si tu proyecto trabaja con acceso optimizado (lo recomendable en muchos casos), tendrías que crear DBs no optimizados solo para exponerlos, lo cual ensucia el programa. - Offsets a mano. Cualquier cambio en la estructura del DB descoloca los offsets de tu script. Es frágil. - Seguridad. PUT/GET no cifra nada. En una red industrial expuesta es un riesgo. Cuando quieras algo mantenible, con nombres de variables en lugar de offsets, tipos autodescritos, cifrado y autenticación, el servidor OPC UA integrado en el S7-1500 (y en el S7-1200 con firmware compatible) es la opción seria. Ahí te remito al post de OPC UA con Qt Designer del blog. Snap7 para lo rápido, OPC UA para lo que va a durar. ### ¿Más información? Si te parece interesante y lo quieres ver en marcha, puedes acceder al [curso de Python con Qt-Designer.](https://programacionsiemens.com/cursos/curso-hmi-con-python-y-qt-designer) Ahí tienes las primeras lecciones de forma gratuita donde se ve cómo implementar lo visto en esta entrada. --- # 100 Retos de LADDER: aprende a programar PLC en tu navegador > Presento 100 Retos de LADDER: practica programación de PLC en el navegador con editor, simulador de planta real y corrección automática. Fuente: https://programacionsiemens.com/100-retos-de-ladder-un-cuaderno-de-practicas-para-programar-plc-en-el-navegador · Autor: Iñigo Gútiez · Publicado: 2026-07-13 · Actualizado: 2026-07-26 · Categoría: Programación PLC Después de tantos años programando y enseñando PLC he visto un patrón que se repite: un automatismo grande casi nunca es un problema grande. Es la suma de veinte pequeños: - Hacer parpadear una baliza - Enclavar la marcha de una bomba con su realimentación - Generar un pulso - Contar piezas - O montar un manual/automático como toca. Quien tiene esas piezas sueltas bien metidas en los dedos, cuando llega la máquina de verdad solo tiene que juntarlas. Y para entrenar esas piezas una a una, lo que hacía falta era un sitio donde resolverlas rápido, con corrección al momento. Pues esto se llama [100 Retos de LADDER](https://programacionsiemens.com/cursos/100-retos-ladder). Es un cuaderno de prácticas para programar en contactos (KOP) dentro del navegador, sin instalar nada y con corrección automática. Cien ejercicios, del primer contacto a ejercicios más complejos, cada uno con su simulador y su planta funcionando. Te lo presento en el siguiente vídeo donde vas a ver que es un cuaderno Rubio de toda la vida... pero de automatización en escalera y con los medios de hoy en día. ### Qué es (y qué no es) respecto a los cursos en vídeo Que quede claro desde el principio: los cursos de la plataforma son el camino completo (y correcto): Teoría, práctica, muchos ejercicios, el hardware, el entorno real de TIA Portal y yo acompañándote paso a paso. Eso no cambia y no hay nada que sustituir. Los 100 retos son otra cosa: **solo ejercicios con unas mínimas anotaciones teóricas**, cortos y al grano, cada uno para entrenar un automatismo concreto. Piénsalos como crucigramas de automatización: te sientas, resuelves uno en diez minutos, y sin darte cuenta has entrenado justo la pieza que luego aparece dentro de cualquier máquina grande. Para quien empieza, es soltura antes de meterse en harina; para quien ya programa, un rato entretenido que mantiene la mano caliente. Por eso está gamificado. ### Un editor de LADDER pensado para practicar rápido El editor no es una rejilla rígida. Tocas un punto del esquema y eliges qué insertar ahí: contacto normalmente abierto, normalmente cerrado, flanco de subida o de bajada, bobina, SET, RESET, temporizador TON o TOF, contador CTU o CTD, o un contacto de comparación. Puedes abrir ramas en paralelo, anidarlas, poner comentarios en cada segmento como en TIA Portal, reordenar segmentos arrastrando y deshacer con Ctrl+Z. La idea es que montar un circuito te cueste segundos y dediques el tiempo a pensar la lógica, no a pelearte con la herramienta. ### Un simulador con una planta que se comporta como la de verdad Aquí está la diferencia con resolver ejercicios en papel. Cuando pulsas Simular, tu programa ejecuta el ciclo de scan del PLC y mueve una planta real: motores que arrancan e invierten, cintas con cajas y botellas que se atascan, depósitos con sondas de nivel, cilindros, fotocélulas y setas de emergencia. Cada reto tiene su escena, y los mandos (pulsadores, selectores, setas) escriben las entradas igual que en un armario. Puedes ejecutar a velocidad normal, **pausar la CPU y avanzar paso a paso** para depurar, y tienes una **tabla de variables** que muestra en vivo el valor de entradas, salidas, marcas, temporizadores y contadores. Si te dejas un operando sin asignar o metes dos bobinas iguales, el panel de verificación te lo dice con un código y un enlace para saltar a la red que falla. ### Corrección por comportamiento, no por plantilla El corrector no compara tu circuito con una solución única letra a letra. Comprueba que la planta **se comporta** como pide el enunciado. Si tu lógica cumple, pasa, aunque la hayas resuelto distinta a como lo haría yo. Esto es importante: en automatización casi nunca hay una sola forma correcta, y penalizar por no clavar una estructura concreta enseña mal. Por eso, por ejemplo, un enclavamiento con SET y RESET vale igual que uno con realimentación si el resultado es el mismo. ### Chari, la tutora que te dice qué falla Cuando un reto se te resiste, tienes un botón de **"¿Qué falla?"**. Chari, la asistente del curso, lee tu circuito, lo compara con la solución del ejercicio y te responde al grano, en tres frases: qué elemento sobra o falta, qué pasa por eso en la máquina y una pista para arreglarlo. No te da la solución hecha, te empuja a encontrarla. Por debajo tiene indexado todo el curso, así que entiende el contexto de cada reto, no solo el que tienes abierto. ### Una pestaña de juego para repasar sin darte cuenta Tienes además un modo **Juego**: un tablero de arrastrar y soltar donde el circuito aparece con huecos y tienes que colocar las piezas que faltan, con señuelos de por medio para que no vayas en automático. Hay cronómetro, combos y estrellas según lo limpio que lo resuelvas. Es una forma de repasar la lógica de otra manera y de picarte con tu propio mejor tiempo. Y hay un mapa de campaña con los diez mundos, uno por módulo. ### De encender un motor a montar una aplicación más compleja Los cien retos están ordenados por dificultad, en un módulo de introducción más diez módulos temáticos: - El circuito y el contacto: arrancas por lo básico, marcha y paro. - Memoria: realimentación y enclavamientos: que una salida se quede enganchada. - Temporizadores TON, TOF, flancos y SET/RESET. - Contadores: contar piezas, palets, ciclos. - Modos de mando y seguridad: manual/automático, setas, fail-safe. - Valores y comparadores, secuencias por tiempo y por eventos (etapas al estilo GRAFCET). - Proyectos: los diez últimos retos son aplicaciones más completas donde juntas todo. La seguridad se trata como toca. Las setas de emergencia y los relés térmicos entran como contacto normalmente cerrado (fail-safe: la señal vale 1 en reposo y cae a 0 cuando actúa o se rompe un cable), que es como se cablea en una máquina de verdad. Al terminar el curso tienes un certificado en PDF firmado con tu nombre y un identificador único. ### Pruébalo y luego decides. Los **primeros retos están abiertos gratis** para que lo toques ahora mismo. El completo sale muy pronto pero ahora lo tienes de lanzamiento a un precio especial, con acceso vitalicio, actualizaciones incluidas y catorce días de garantía. ### --- # Control PID de temperatura con S7-1200 (PID_Compact) > Controlador de temperatura PID con S7-1200 y PID_Compact: escalado de PV, autoajuste que funciona, salida analógica o PWM y OB cíclico paso a paso. Fuente: https://programacionsiemens.com/control-pid-de-temperatura-con-s7-1200-pid-compact · Autor: Iñigo Gútiez · Publicado: 2026-07-12 · Actualizado: 2026-09-07 · Categoría: Analógicas y regulación El PID de temperatura es de esos temas que todo el mundo cree que domina hasta que le toca poner en marcha un horno de verdad y ve que la temperatura oscila como un balancín. Aquí vamos al grano con un lazo de temperatura real en el S7-1200 usando **PID_Compact**, que es la instrucción que Siemens te da hecha y que, bien configurada, funciona muy bien. No es lo mismo un PID genérico que un **controlador de temperatura PID**. La temperatura tiene inercia térmica, tiempos muertos y respuesta lenta, así que hay detalles del escalado de la PV, del autoajuste y de la salida que conviene tener claros antes de tocar nada. ### El lazo, de un vistazo Antes de la fórmula, conviene tener claro por dónde va cada señal. El PID no mide la temperatura: mide el **error**, que es lo que sale de restar la temperatura real a la consigna. [Imagen: Diagrama de bloques del lazo: la consigna de 80 grados entra en un comparador; la sonda PT100 devuelve la temperatura medida a la entrada negativa; de esa resta sale el error e(t), que entra en PID_Compact; el PID saca u(t) como PWM de 0 a 100 por ciento, que gobierna la resistencia y el horno.] Realimentación negativa: la medida vuelve al comparador con signo menos. Ahí nace el error, y es lo único que el regulador ve. ### Fórmula de referencia En la forma estándar (la que usa Siemens en PID_Compact, y la mayoría de fabricantes): [Imagen: u(t) igual a Kp por el corchete de: e(t), más uno partido por Ti multiplicado por la integral entre 0 y t de e(tau) d-tau, más Td por la derivada de e(t) respecto de t. El primer término es la acción proporcional, el segundo la integral y el tercero la derivativa.] Los tres términos, en colores: el proporcional mira el error de ahora, el integral el que se ha ido acumulando y el derivativo hacia dónde va. Ojo a la variable de integración: se integra en *τ*, porque la *t* ya es el límite superior. Ambas, **Ti y Td, son tiempos** (segundos), no ganancias. Ahí está la trampa de la intuición. #### Ti — tiempo integral (tiempo de acción integral) Es el tiempo que tarda la acción integral en aportar lo mismo que ha aportado la proporcional ante un escalón de error. También se le llama "tiempo de reajuste" o "repetición". Como aparece **dividiendo**, la relación es inversa: **Ti pequeño = integral fuerte**. Ti Efecto **Más pequeño** Elimina el error estacionario rápido, pero sobreoscila, tiende a oscilar y desestabiliza. Aumenta el riesgo de *windup* (que la integral siga acumulando error mientras el actuador ya está al máximo: cuando por fin hay que bajar, el regulador tarda un mundo en reaccionar y se pasa de largo) si el actuador satura. **Más grande** Respuesta más suave y estable, pero el *offset* (el error que queda fijo entre consigna y temperatura real) tarda en desaparecer; el lazo "arrastra" el error mucho tiempo. **Ti → ∞** (o desactivado) Control puramente P/PD: queda error permanente. #### Td — tiempo derivativo (tiempo de anticipación) Es el tiempo que el PID "se adelanta" al futuro, extrapolando la pendiente actual del error. Actúa sobre la **velocidad de cambio**, no sobre la magnitud. Td Efecto **Más grande** Amortigua, frena la sobreoscilación, acelera la estabilización de procesos con inercia. Pero **amplifica el ruido** de la medida: la salida empieza a bailar y castiga la válvula o el variador. **Más pequeño / 0** Sin anticipación. Es lo habitual en procesos rápidos y ruidosos. #### Criterio práctico - Temperatura, nivel con inercia, hornos: procesos lentos y con retardo → Td aporta, merece la pena. - Caudal, presión, par de motor: rápidos y ruidosos → PI puro, Td = 0. Casi todos los lazos industriales son PI. - En PID_Compact, la derivada actúa por defecto sobre la variable de proceso y no sobre el error (ponderación `c`), justo para evitar el derivative kick (el salto brusco de salida que suelta la derivada cuando cambias la consigna de golpe: ve un escalón enorme y responde como si el proceso se hubiera disparado) al cambiar la consigna. Además hay filtro derivativo (`Td/a`, con `a ≈ 3…5`) que te salva del ruido — no lo pongas a 0. **Ojo con las unidades entre fabricantes**: algunos no dan Ti sino Ki en *repeticiones por minuto* (Ki = 1/Ti). Si copias parámetros de un lazo a otro sin mirar esto, el comportamiento se invierte. ### Qué es PID_Compact y por qué usarlo para temperatura PID_Compact es una instrucción tecnológica del S7-1200 (y del S7-1500) que implementa un regulador PID con autoajuste incorporado. Te ahorra programar el algoritmo a mano, que es lo que hacíamos antaño en Step 7 clásico. Si vienes de aquello, recuerda cómo se montaba el PID en Step 7 clásico, porque el concepto de fondo es el mismo, solo que ahora está encapsulado. Para un lazo de temperatura te interesa por tres cosas: - Trae autotuning (autoajuste: el propio bloque lanza una prueba sobre tu proceso y calcula Kp, Ti y Td por ti, en vez de que los tantees a mano) que funciona razonablemente bien con procesos lentos. - Puede sacar la salida como valor analógico (0.0 a 100.0) o como PWM para gobernar un relé de estado sólido de una resistencia. - Escala la PV internamente, así que no tienes que pelearte tanto con las cuentas de la entrada analógica. ### El lazo de temperatura que vamos a montar Planteamos algo típico: un depósito o un horno pequeño con una **sonda PT100** (o un termopar con transmisor) que entra por una entrada analógica, y una **resistencia calefactora** gobernada por un relé de estado sólido con señal PWM (modulación por ancho de pulso: se enciende y se apaga muy rápido, y regulas la potencia cambiando cuánto tiempo está encendido). El objetivo: mantener 80 °C estables. - Setpoint: 80.0 °C. - PV (process variable, la variable de proceso): temperatura medida por la sonda, en °C. - Salida: PWM sobre una salida digital que enciende y apaga el SSR (solid state relay, el relé de estado sólido). #### Datos que necesitas de tu módulo analógico Antes de nada, cómo llega la señal de temperatura. Si usas un módulo con entrada directa de RTD o termopar (por ejemplo un SM 1231 RTD/TC), ese módulo ya te entrega la temperatura escalada en su propio formato y no tienes que escalar tú. Si en cambio metes un transmisor 4-20 mA por una entrada analógica estándar, tendrás que convertir la palabra cruda a grados. De eso hablo en detalle en el artículo de [escalado de señales analógicas](https://programacionsiemens.com/escalado-de-una-senal-analogica-en-tia-portal). ### Escalado de la PV (temperatura medida) PID_Compact tiene dos formas de leer la PV: - `Input`: le pasas ya la temperatura en unidades físicas (REAL, en °C). Es lo cómodo si tu módulo RTD ya te da grados o si escalas tú antes. - `Input_PER`: le pasas directamente el valor periférico (WORD) de la entrada analógica y él lo escala internamente con los parámetros `Config.InputLowerLimit` e `InputUpperLimit`. Si vas por `Input` y tienes un transmisor 4-20 mA que representa 0 a 150 °C, el escalado clásico con **NORM_X** y **SCALE_X** queda así: ``` // Escalado de entrada analógica 4-20 mA a temperatura en REAL // Rango PLC 4-20 mA: 5530 (4 mA) ... 27648 (20 mA) // Rango físico: 0.0 ... 150.0 grados C "Temp_norm" := NORM_X(MIN := 5530, VALUE := "IW_Temperatura", // WORD de la entrada analogica MAX := 27648); "Temp_grados" := SCALE_X(MIN := 0.0, VALUE := "Temp_norm", MAX := 150.0); // REAL en grados C ``` Ese `"Temp_grados"` es lo que le pasarás al parámetro `Input` del PID_Compact. ** Ojo con el rango 4-20 mA. En el S7-1200, 4 mA no es 0, es 5530 en el rango de tensión/corriente. Si pones MIN := 0 te saldrán las cuentas mal por debajo. Consulta el rango exacto de tu módulo en el manual. ### Insertar PID_Compact en un OB cíclico (importante) Este es el error más repetido. PID_Compact tiene que llamarse en un OB de interrupción cíclica con tiempo constante**, no en el OB1. El regulador necesita un tiempo de muestreo fijo y estable para calcular bien los términos I y D. Si lo metes en OB1, el ciclo varía y el autotuning y la regulación se degradan. - Añade un OB de interrupción cíclica (en TIA Portal lo verás como Cyclic interrupt) en el árbol del proyecto. - Para temperatura, un tiempo de muestreo del orden de 100 a 500 ms es más que suficiente. La temperatura es lenta. No necesitas 10 ms. - Arrastra PID_Compact dentro de ese OB. TIA Portal creará automáticamente su DB de instancia tecnológico. PID_Compact detecta él solo el ciclo del OB donde está insertado y lo usa como tiempo de muestreo. Por eso es tan crítico que sea un OB cíclico. #### Llamada básica en SCL ``` // Dentro del OB de interrupcion ciclica (p.ej. OB30, 200 ms) "PID_Temp"(Setpoint := "Consigna_temp", // REAL, 80.0 Input := "Temp_grados", // REAL, PV escalada ManualEnable := FALSE, ManualValue := 0.0); // La salida del lazo esta en "PID_Temp".Output (0.0 ... 100.0) // y la salida PWM en "PID_Temp".OutputPWM (BOOL) ``` ### Salida: analógica o PWM para la resistencia PID_Compact ofrece tres salidas a la vez y tú eliges cuál cableas: - `Output`: valor REAL de 0.0 a 100.0 %. Útil si quieres mandarlo a una salida analógica que gobierne un actuador proporcional. - `Output_PER`: el valor de salida ya en formato periférico (WORD), listo para volcar directo a una salida analógica. - `OutputPWM`: salida booleana modulada en ancho de pulso, pensada exactamente para tu caso de la resistencia con SSR. Para calefacción con resistencia y relé de estado sólido, lo natural es **OutputPWM**. Se configura la salida en la ventana de parámetros de PID_Compact eligiendo "PWM" como tipo de salida, y ajustas el tiempo mínimo de conexión/desconexión para no machacar el actuador. Luego mapeas el bit a una salida física: ``` // Volcado del PWM del PID a la salida fisica del SSR "Q_Resistencia" := "PID_Temp".OutputPWM; ``` Si en cambio usas una salida analógica proporcional (por ejemplo controlando la potencia por 4-20 mA), usa `Output_PER`: ``` "QW_Potencia" := "PID_Temp".Output_PER; // directo a la salida analogica ``` ### Autoajuste (autotuning) que funciona Aquí está la parte que a la gente le suele fallar. PID_Compact tiene dos modos de ajuste: - Puesta en marcha inicial (en TIA Portal, Pretuning): identifica el proceso arrancándolo desde una temperatura estable. Para lanzarlo, el proceso debe estar en reposo y estable, y la consigna debe estar suficientemente lejos de la PV actual. - Ajuste fino (en TIA Portal, Fine tuning): refina los parámetros haciendo oscilar controladamente alrededor de la consigna una vez ya estás cerca. El procedimiento que a mí me funciona en temperatura: - Abre la puesta en marcha del regulador (el botón Commissioning) en TIA Portal, con el PLC online. - Arranca con el proceso frío y estable. Pon la consigna real (80 °C). - Lanza la puesta en marcha inicial. El PID meterá potencia y medirá la respuesta térmica. En un horno esto puede tardar bastante, ten paciencia. - Cuando termine sin errores, lanza el ajuste fino. - Guarda los parámetros calculados en el proyecto para que no se pierdan al reiniciar. El estado del ajuste lo ves en `"PID_Temp".State` y los errores en `"PID_Temp".ErrorBits`. Si el pretuning aborta, casi siempre es porque el proceso no estaba estable al empezar o porque la consigna estaba demasiado cerca de la PV. Consulta la ayuda de TIA Portal para el significado exacto de cada bit de `ErrorBits`. ** Consejo de fábrica: no lances el autotuning con producto dentro si una sobreoscilación puede estropearlo. La identificación empuja el proceso a propósito. #### Lanzar el ajuste por código (opcional) Normalmente el tuning se dispara desde la ventana de puesta en marcha, pero puedes forzar el modo por el parámetro `Mode`: - `Mode = 0`: inactivo. - `Mode = 1`: puesta en marcha inicial (pretuning). - `Mode = 2`: ajuste fino (fine tuning). - `Mode = 3`: modo automático (regulación normal). ``` // Forzar modo automatico tras un arranque en frio "PID_Temp".Mode := 3; "PID_Temp".ModeActivate := TRUE; // flanco para activar el modo elegido ``` El cambio de modo se aplica con un flanco de subida en `ModeActivate`, así que gestiona ese bit con un flanco, no lo dejes fijo en TRUE. ### Límites y arranque seguro Configura los límites de la PV en los parámetros del bloque. Si la temperatura medida sale del rango `Config.InputLowerLimit` / `InputUpperLimit`, PID_Compact pasa a estado de error y detiene la salida, que es justo lo que quieres si se te rompe la sonda. Aprovecha esto como seguridad básica frente a rotura de sensor. En el primer arranque, con parámetros aún sin ajustar, el regulador puede comportarse fatal. Por eso el flujo correcto es: cargar programa, comprobar que la PV lee bien la temperatura, y solo entonces lanzar el pretuning. ### Resumen del montaje - Lee y escala la temperatura a °C (REAL), o usa un módulo RTD que ya te la dé. - Inserta PID_Compact en un OB de interrupción cíclica (100 a 500 ms para temperatura). - Conecta `Setpoint`, `Input` y elige la salida (PWM para SSR de resistencia). - Con el proceso frío y estable, lanza pretuning y luego fine tuning desde la puesta en marcha. - Guarda parámetros y deja el bloque en modo automático. Con esto tienes un controlador de temperatura PID** serio, sin programar el algoritmo a mano y con un autoajuste que, si respetas el proceso de puesta en marcha, deja el lazo estable de verdad. ### Pruébalo tú mismo: laboratorio de ajuste PID Ajusta los parámetros y observa la respuesta del sistema en directo: ### ¿Qué te ha parecido? Espero que te haya parecido interesante. Como siempre te invito a que comentes y propongas si te apetece nuevos objetos que se puedan desarrollar y compartir en la plataforma --- # Alarmas y diagnóstico en TIA Portal: guía práctica > Learn how to manage alarms and diagnostics in Siemens TIA Portal like a pro. Step-by-step guide with practical examples and Program_Alarm code. Fuente: https://programacionsiemens.com/gestion-de-alarmas-en-tia-portal-de-forma-profesional · Autor: Iñigo Gútiez · Publicado: 2024-05-29 · Actualizado: 2026-09-07 · Categoría: HMI y WinCC Hoy vamos a ver cómo gestionar las alarmas en TIA Portal de una forma profesional. Y ya que estamos, vamos a meternos también en el diagnóstico del sistema, porque una cosa sin la otra se queda coja. Digo de forma profesional, porque veo que hay muchos programadores que no conocen la forma de gestionar correctamente el tema de las alarmas. Esto les lleva a hacer cosas rocambolescas como declarar bits en un DB para lanzar las alarmas y luego copiar ese DB a otro DB para pasarlo a words que luego usan en el HMI. Una locura. Y esto pasa solo por no saber cómo hacerlo correctamente. O al menos, de una forma muchísimo más profesional y infinitamente menos enrevesada. La forma que te voy a enseñar es una de las que explico en los cursos de [Guorker.com](https://guorker.com), en el **[curso de TIA Portal](https://programacionsiemens.com/cursos/tia-portal-cpu-1200-completo)** o en el curso extensísimo de **[WinCC Flexible 2008](https://programacionsiemens.com/cursos/wincc-flexible-completo)**. Que sí, que es del 2008, pero todo es aplicable en TIA Portal con pequeñas diferencias. Además, en TIA Portal tienes más herramientas, pero digamos que haber mamado WinCC Flexible 2008 hace que no cometas errores claros como los que veo en muchas aplicaciones a la hora de tratar alarmas y diagnósticos. ### How to handle alarms and diagnostics in TIA Portal? La respuesta corta: separas bien el concepto de **alarma de proceso** (la que enlazas tú a mano con un array de bits o words) del concepto de **diagnóstico del sistema** (el que TIA Portal ya trae integrado y que muchos ni tocan). Ambos conviven en el mismo proyecto y ambos acaban, si quieres, en el mismo HMI. La idea de lo que te voy a contar es poder enlazar de forma coherente, sencilla y mantenible las alarmas en el lado del PLC y del HMI. Nada de bits sueltos aquí y allá que luego nadie sabe de dónde salen cuando llega un compañero nuevo al mantenimiento. ### Cómo configurar alarmas y diagnósticos en TIA Portal paso a paso Vamos al lío. Este es el procedimiento que sigo yo, y que enseño en los cursos, para que las alarmas del PLC lleguen limpias al HMI sin trucos raros: - Declara un DB (puede ser optimizado o no, según lo que necesites) con un array de bool del tamaño que vayas a necesitar. Da igual que sean 16 alarmas o 1024, el mecanismo es el mismo. - En el programa, activas cada bit del array cuando se cumple la condición de fallo correspondiente (falta de aire, motor en térmico, guarda abierta, lo que sea). - En el HMI, en vez de generar una alarma discreta por cada bit y tener que mantener cien objetos sueltos, usas alarmas indexadas apuntando al array. Así, con una sola definición de alarma en el HMI, cubres las 1024 si hace falta. - El texto de cada alarma lo parametrizas con el índice, para que en el HMI se vea el texto correcto según qué bit del array se ha activado. Puede que lo hagas así, o de una forma similar, pero si lo estás haciendo word a word, comparando bit a bit contra un DB intermedio, se te va a abrir un mundo nuevo con este método. Ya verás. ### TIA Portal Program_Alarm function: ejemplo de código Cuando necesitas algo más que un simple bit, por ejemplo, alarmas de usuario con valores asociados (una temperatura, un contador, un texto variable), TIA Portal trae la instrucción **Program_Alarm** (y su hermana **Program_Alarm_8** con hasta 8 valores asociados). Es la forma nativa de generar diagnósticos de programa sin montar tú el cableado de bits a mano. Un ejemplo típico en SCL, dentro de un bloque de función que controla, por ejemplo, una estación de un transportador: ``` FUNCTION_BLOCK \"FB_Alarma_Estacion\" VAR Program_Alarm_Instance : Program_Alarm; END_VAR VAR_INPUT Fallo_Motor : Bool; Temperatura_Motor : Real; END_VAR BEGIN // Llamada a la instrucción Program_Alarm #Program_Alarm_Instance(SIG_ID := 1, SIG := #Fallo_Motor, MSG_EVENTS := TRUE, EN_ID := 1); END_FUNCTION_BLOCK ``` Con `SIG` defines la condición que dispara la alarma (el flanco del fallo), y con `SIG_ID` el identificador único de esa alarma dentro del proyecto. Si necesitas asociar valores como la temperatura del motor en el momento del disparo, usas **Program_Alarm_8**, que admite hasta ocho parámetros asociados (ASSOC_VALUES) que luego puedes mostrar en el texto de la alarma en el HMI. La ventaja de usar Program_Alarm frente al método del array a pelo es que el propio sistema de diagnóstico de TIA Portal se entera de estas alarmas y las integra en la vista de diagnósticos del PLC, no solo en el HMI. Eso te da doble visibilidad: la del operario en planta y la tuya cuando te conectas en remoto para ver qué ha pasado. ### System Diagnostics en TIA Portal Aquí es donde mucha gente se pierde. TIA Portal trae un sistema de **diagnóstico integrado** que va más allá de las alarmas que tú programas a mano. Este diagnóstico recoge: - Errores de hardware (módulos en fallo, caída de un nodo PROFINET, fusible fundido en una tarjeta de salidas). - Errores de programa (por ejemplo, un acceso a un puntero nulo o una división por cero si tienes activados los bloques de organización de error correspondientes). - Las alarmas de usuario que generas tú con Program_Alarm, que se integran en la misma vista. Para verlo, en el árbol del proyecto tienes la carpeta de **Diagnósticos online y offline** del PLC. Ahí ves el estado general del sistema, y si entras en el detalle de cada módulo, el histórico de eventos con fecha y hora. Esto te ahorra horas cuando llegas a una máquina que lleva fallando toda la noche y el turno de noche no te ha dejado ni una nota. Lo interesante es que puedes volcar este mismo diagnóstico del sistema en el HMI, usando el objeto de **vista de alarmas del sistema** que trae WinCC. Así el operario ve en la misma pantalla tanto tus alarmas de proceso como los fallos de hardware del PLC, sin tener que conectarse con el portátil cada vez que salta un piloto rojo. ### Manage HMI alarms in TIA Portal efficiently Para que la gestión de alarmas en el HMI sea de verdad eficiente, y no un cajón de sastre, ten en cuenta estos puntos que suelo remarcar en los cursos: - Agrupa por clases de alarma: error, advertencia, información. No metas todo en el mismo saco o el operario dejará de hacer caso a las alarmas, que es lo peor que puede pasar. - Usa alarmas indexadas siempre que puedas, como hemos visto arriba con el array. Menos objetos que mantener, menos probabilidad de despiste al añadir una alarma nueva. - Da contexto en el texto: no pongas solo \"Fallo motor\", pon \"Fallo motor cinta 3, térmico disparado\". El operario te lo agradecerá y tú también, cuando te llame a las tres de la mañana y te lo lea por teléfono. - Revisa el histórico periódicamente. Una alarma que salta 200 veces al día no es una alarma, es un síntoma de que algo en el proceso no funciona bien y nadie lo ha mirado. Si además quieres ver cómo se hace esto mismo pero directamente en WinCC, sin pasar por TIA Portal, tengo un post específico sobre [guía de alarmas en TIA Portal](https://programacionsiemens.com/alarmas-en-tia-portal) que complementa justo lo que hemos visto aquí. #### Vídeo explicativo Te dejo con el vídeo donde lo explico todo sobre la marcha, con el proyecto abierto en TIA Portal: [https://youtu.be/m2Yz0T-J9Pg](https://youtu.be/m2Yz0T-J9Pg) ### Qué te ha parecido Espero que te haya servido de verdad esta guía sobre alarmas y diagnósticos en TIA Portal, y que a partir de ahora dejes atrás los DB intermedios y los bits sueltos que nadie entiende. Si quieres profundizar más en el tema, con proyectos reales y ejercicios paso a paso, todo esto lo puedes aprender en [Guorker.com](https://guorker.com) en todas sus vertientes o adquiriendo el [curso de TIA Portal](https://programacionsiemens.com/cursos/tia-portal-cpu-1200-completo) aquí en el blog. Espero tus comentarios. --- # ¿Qué PLC elijo? > PLC Siemens S7-1200: cómo elegir el autómata adecuado para tu proyecto y qué hacer cuando la CPU se queda corta. Caso real de una máquina farmacéutica. Fuente: https://programacionsiemens.com/que-plc-elijo · Autor: Iñigo Gútiez · Publicado: 2024-02-07 · Actualizado: 2024-02-07 · Categoría: S7-1200 y S7-1500 Una de las dudas que se suele tener a la hora de programar es ¿qué PLC elijo? Evidentemente hay veces en la que puedes ir sobrado en el sentido que estás seguro que con el PLC que vas a elegir, no vas a tener ningún problema. Pero ¿y si la cosa no está tan clara? ### Cuando el PLC no alcanza Resulta que ahora estamos terminando un proyecto de un prototipo de máquina de secado para el sector farmacéutico. Por cómo es el sistema y debido a que el programa como tal no es muy complejo pensé que inicialmente con un S7-1214 iba a ser suficiente ya que el sistema consite de: - Una CPU - 5 periferias con 4 entradas analógicas, un par de salidas analógicas y dos o tres entradas y salidas digitales por periferia. En proceso se trata de acondicionar un aire por lo que hay que manejas un ventilador, una resistencia, una bomba que recircula agua y una válvula de 3 vías. Vamos, que no parece que necesites un programa muy potente para mover todo el tinglado. Comprobamos que no habría problemas por el número de periferias que colgaran del S7-1214 y el número de señales no es para asustar. Por otro lado, consideramos que el programa en sí, no iba a tener problemas a la hora de ejecutarse con la capacidad del S7-1214. #### Cosa de memoria La cosa es que según fuimos avanzando en el proyecto y hablando con nuestros clientes, la cosa se empezó a torcer. La razón fundamental fue la memoria remanente... sí, la memoria remanente... ¿quién lo iba a decir eh? La cuestión es que las recetas, por su complejidad, necesitan estar en el PLC ya que los HMI de Siemens no están preparados para realizar lo que necesitamos en este caso. Por tanto, aunque usamos el HMI para hacer las recetas, la información reside completamente en el PLC. Así que hubo un momento en el que hubo que aumentar el número de recetas y etapas dentro de la receta y pasó esto: Como puedes ver, la memoria de trabajo estaba muy lejos de estar en un punto crítico mientras que la memoria remanente la teníamos en un 87%. Teniendo en cuenta que aún no habíamos terminado con el programa, hubo que cambiar el PLC, ya que no hay forma de ampliar dicha memoria. Podemos ampliar la memoria de carga solamente. Total, que cambiamos la CPU a un S7-1510SP obteniendo esto una vez modificado y cargado el programa: Como vez, en el apartado de memoria remanente estamos usando unos 12,5KB pero claro, en el caso del [S7-1200](https://programacionsiemens.com/s7-1200) tenemos un máximo de 14KB y en el S7-1500 90KB. Por tanto, una de las cosas que tienes que tener en cuenta es.. .¿cómo de grande va a ser tu programa? ¿Te va a alcanzar con 100KB?  ¿Y su memoria remanente? La vedad es que para "llenar" 100KB hay que picar mucho código. De hecho, aunque en la imagen no se ve, después de haber terminado el proyecto he ocupado sobre 40KB... pero he usado unos 69KB de memoria retentiva. #### Velocidad de procesamiento Por otro lado, de las últimas veces que miré el ciclo de scan con el 1510SP rondaba los  7-8 ms aproximadamente. No es fácil saber cuánto tardaría en realizar lo mismo con un S7-1214, pero podemos hacernos una idea. Sabemos por las especificaciones de Siemens, que estas CPU tienen estas características: **CPU processing times** ** S7-1214** **S7-1510SP** for bit operations, typ. 0.08 µs; / instruction 25 ns/ instruction for word operations, typ. 1.7 µs; / instruction 32 ns/ instruction for floating point arithmetic, typ. 2.3 µs; / instruction 170ns/ instruction Por tanto, vemos que en cálculos de bit es unas 3,2 veces más lento un S7-1214 respecto a un S7-1510SP. La cosa se dispara si además los cálculos matemáticos tienen mucho peso en el programa. Si básicamente tienes que el 90% de tu programa es código booleano, el ciclo de scan no se te irá a valores muy altos con un 1200 vs 1510SP ya que hay que tener en cuenta que en los 7-8ms están incluidos todo l que hace la CPU, incluida las comunicaciones. Pero si tienes que hacer muchos cálculos matemáticos, la diferencia será grande. Luego, piensa que tipo de programa vas a necesitar, porque de primeras ya sabrás si va a ser más de lógica booleana o va a tener una fuerte componente matemática. #### Número de entradas y salidas El número de entradas y salidas puede ser un buen indicativo de cómo de grande te va a salir el programa. Quiero decir que si tiene muchas entradas o salidas, salvo excepciones, tendrá asocidado en principio mucho código, ya que si tienes señales, serán para hacer algo con ellas, y por tanto, vas a tener que aporrear el teclado bastante. No hay un número mágico para decir "hasta aquí", pero cuando veas que vas a tener muchas tarjetas en el rack o muchas periferias, piensa que tal vez merezca la pena rascarse el bolsillo. #### Precio Lógicamente está el precio del hardware. Si tienes duda, plantéate si merece la pena elegir un 1510, ya que la diferencia entre un S7-1214 a un S7-1510SP no es gigantesca. Podemos estar hablando de unos 400€ entre ambos. Hay diferencia, pero no estamos hablando de miles de euros de diferencia. ### ¿Más cosas que mirar? Claro, siempre hay cosas que mirar como compatibilidad o expansiones futuras. ¿Vas a querer programar en AWL, por ejemplo? Esto descartará usar un S7-1214... o si quieres comunicar O si vas a aumentar el número de tarjetas o periferias que vas a tener colgado del sistema... y los que se prevén que pueda haber en el futuro. ### Y tú ¿en qué cosas te fijas? Te invito a que comentes en qué cosas te sueles fijar para elegir tal o cual CPU. Siempre se aprenden cosas nuevas de la experiencia de los demás. En mi caso, por ejemplo, no había tenido nunca problemas con la memoria remanente hasta este proyecto. Pero como para casi todo, siempre hay una primera vez. --- # Descatalogación de los S7-300 > SIMATIC S7-300: Siemens inicia la descatalogación de esta familia y la periferia ET200M. Conoce los hitos PM400 y PM410 y cómo afecta a tus instalaciones. Fuente: https://programacionsiemens.com/descatalogacion-de-los-s7-300 · Autor: Iñigo Gútiez · Publicado: 2023-10-25 · Actualizado: 2023-10-25 · Categoría: S7-1200 y S7-1500 SIEMENS ha comenzado la descatalogación de la familia de productos de automatización SIMATIC S7-300, incluyendo la gama de periferia ET200M. Estos productos, que han sido muy populares en el mercado desde su lanzamiento en 1994, han comenzado a ser retirados del catálogo a desde el pasado 1 de octubre de 2023. ### Hitos de descatalogación SIEMENS ha establecido tres hitos en el proceso de descatalogación para la familia SIMATIC S7-300. El primer hito, PM400, implica que las referencias seguirán disponibles para su suministro como piezas nuevas, pero se retirarán del catálogo y su precio puede incrementarse. El segundo hito, PM410, indica la interrupción del suministro como pieza nueva, por lo que ya no se podrán pedir como piezas nuevas, pero estarán disponibles como piezas de recambio y será posible su reparación. El tercer y último hito, PM490, marca la interrupción total del suministro, lo que significa que las piezas ya no se podrán solicitar. ### Fechas y plazos establecidos SIEMENS ha establecido fechas concretas para los hitos de descatalogación de la familia SIMATIC S7-300. El primer hito, PM400,tuvo lugar el pasado 1 de octubre de 2023. El segundo hito, PM410, está programado para el 1 de octubre de 2025. Finalmente, el tercer hito, PM490, se dará el 1 de octubre de 2033. Estas fechas permiten a los usuarios disponer de tiempo suficiente para planificar su migración a nuevas soluciones o acumular los repuestos necesarios para garantizar el funcionamiento de las máquinas y procesos. [Imagen: Descatalogación de los S7-300] ### Migración hacia la solución S7-1500 La migración hacia la solución S7-1500 es un paso importante para aquellos usuarios que hayan utilizado los productos de automatización SIMATIC S7-300. Con el fin de facilitar este proceso, **[SIEMENS ha desarrollado una guía de migración](https://support.industry.siemens.com/cs/document/109478811/gu%C3%ADa-para-la-migraci%C3%B3n-de-simatic-s7-300-s7-400-a-simatic-s7-1500?dti=0&lc=es-ES) **que proporciona instrucciones detalladas y recomendaciones para realizar una transición exitosa. #### Guía de migración La guía de migración elaborada por SIEMENS ofrece una visión general de los pasos necesarios para migrar de los controladores S7-300 a los controladores S7-1500. En esta guía se detallan los aspectos clave que deben tenerse en cuenta, como la planificación, el análisis de la infraestructura existente, la selección de los nuevos controladores y la programación de la migración. Además, la guía de migración proporciona ejemplos prácticos y recomendaciones basadas en las experiencias previas de otros usuarios que ya han realizado con éxito esta migración. Esta guía se ha diseñado para ser una herramienta útil y accesible para ayudar a los usuarios a comprender y realizar el proceso de migración de manera eficiente y sin problemas. #### Compatibilidad entre sistemas Uno de los aspectos importantes a considerar durante la migración es la compatibilidad entre los sistemas existentes y los nuevos controladores S7-1500. SIEMENS ha asegurado que hay una integración fluida entre ambos sistemas, lo que permite una transición suave sin interrupciones significativas en los procesos de automatización existentes. Los nuevos controladores S7-1500 son compatibles con los módulos de periferia ET200M utilizados en la familia SIMATIC S7-300, lo que facilita aún más la migración. Esto significa que los usuarios no tendrán que reemplazar por completo todos los componentes de su sistema de automatización, sino que podrán realizar una actualización parcial y mantener gran parte de su infraestructura existente. Los lenguajes con los que se han podido programas los S7-300 se pueden programar con los S7-1500, lo cual facilita a los usuarios el uso de sus conocimientos y experiencia previa en programación. Esto simplifica el proceso de migración y reduce el tiempo y los recursos necesarios para aprender una nueva plataforma de programación. En cambio, un cambio de los S7-300 a los [S7-1200](https://programacionsiemens.com/s7-1200) no es posible debido a que, por ejemplo, los S7-1200 no disponen de AWL, indispensable en la programación de los S7-300. ### Soporte y repuestos para los productos S7-300 La descatalogación de la familia SIMATIC S7-300 no significa que los usuarios queden sin soporte. SIEMENS ha establecido un período de transición para asegurar la continuidad de los sistemas basados en estos productos. #### Disponibilidad de piezas nuevas A partir del primer hito de descatalogación, PM400, las referencias de productos S7-300 estarán retiradas del catálogo, lo que implica que ya no estarán disponibles como piezas nuevas. Sin embargo, SIEMENS se compromete a suministrar estas piezas mientras estén disponibles en su inventario. Es importante tener en cuenta que el precio de estas piezas puede incrementarse durante este período. #### Piezas de recambio y posibilidad de reparación Si bien las piezas del S7-300 ya no estarán disponibles como nuevas, SIEMENS garantiza que seguirán disponibles como piezas de recambio para su adquisición. Asimismo, será posible reparar estas piezas en caso de avería o falla. Esto permitirá a los usuarios mantener funcionando sus sistemas basados en S7-300, incluso después de la interrupción total del suministro establecido en el tercer hito, PM490. La disponibilidad de piezas de recambio y la posibilidad de reparación hasta el año 2033 brinda a los usuarios el tiempo necesario para planificar la migración o acumular los repuestos necesarios para garantizar el funcionamiento de las máquinas y procesos donde estén instalados los productos S7-300. ### ¿Lo vamos a echar de menos? Pues... un poco sí. A nivel personal no entiendo mi carrera profesional sin la serie S7-300. Han sido mi caballo de batalla durante 20 años, que no es poco. Pero no solamente por un tema puramente nostálgico, sino porque realmente con su desaparición perdemos a día de hoy algunas cosas buenas que con los S7-1200 y S7-1500 hemos perdido. Por ejemplo, hemos perdido cosas como: - Poder descargar parte del programa, eligiendo quirúrgicamente los bloques que quieres ir cargando para poner los cambios en funcionamiento poco a poco de una forma sencilla. - Hacer un backup o upload sin pensar en qué versión se cargó. Con estar actualizado a la última versión de S7, sabías que ibas a poder cargar todo el hardware y código para realizar un backup. - Poder pasar entre lenguajes (KOP-FUP-AWL) con un par de clicks. Para mi lo peor que tenía Step 7 para la serie 300/400 era el que no se cargaran los nombres de variables y  comentarios. Por otro lado, la mayoría de las aplicaciones industriales podrían realizarse tranquilamente con los S7-300. Porque salvo aplicaciones que necesiten grandes velocidades de procesamiento sólo alcanzables a CPU modernas, para la mayoría de industrias, estas CPU serían hoy perfectamente válidas. Otro cantar el la capacidad de comunicación que cada vez es más necesaria y que las nuevas CPU vienen con ello *out of the box*. Pero no hay nada que no pudiera solucionar una tarjeta adicional o un nuevo firmware. #### Larga vida al rey... aunque sea emérito. Ahora bien... ¿Cuánta vida real le queda aún a la serie S7-300? Pues se me antoja, que bastante aún. Porque desde 1994 se han instalado unos pocos a lo largo y ancho del Mapamundi. Por otro lado, el nivel que se logró con los S7-300 hace que en muchos casos la maquinaria pueda estar trabajando durante décadas sin problemas. Si hay todavía S5 por ahí pululando con sus deficiencias, imagina lo que que puede ser la vida aún que le queda a los S7-300. Es por ello, que si no has aprendido a programar AWL y te quieres dedicar a mantener maquinaria, te guste o no, vas a tener que aprenderlo si no lo has hecho ya. De hecho aún me siguen preguntando si tengo curso para S7 v5.x, por lo que parece aún está muy vivo ahí fuera. ### ¿Y tú? ¿Los echarás de menos? Si peinas alguna cana, y has tenido que lidiar con ellos, te invito a que nos cuentes tus experiencias con la serie S7-300. Si por el contrario eres nuevo en esto, y solo has manejado hasta ahora [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) ¿Cómo llevarías enfrentarte a los vetustos S7-300? --- # Servidor OPC UA en TIA Portal: configuración paso a paso > OPC UA en TIA Portal: qué es y cómo comunica tus PLC Siemens S7-1200 y S7-1500 con cualquier fabricante, IoT e incluso Linux o Android. Una guía completa. Fuente: https://programacionsiemens.com/servidor-opc-ua-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2023-08-24 · Actualizado: 2023-08-24 · Categoría: Comunicaciones ### ¿Qué es OPC UA en TIA Portal ? OPC UA es una tecnología de comunicación para la automatización industrial que ha evolucionado a partir de OPC Classic. Ya hablamos en su día [en este enlace](https://programacionsiemens.com/el-camino-hacia-opc-ua/). Imagina un mundo donde todas las máquinas y sistemas industriales pudieran hablar entre sí como si fueran amigos que comparten secretos. Esto es posible gracias a OPC UA,  ya que permite la comunicación entre todas las aplicaciones de la empresa, los PLC de Siemens [S7-1200](https://programacionsiemens.com/s7-1200) o S7-1500 en [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) , cualquier otro fabricante o incluso a través de Internet de las Cosas (IoT). Es un marco extensible y compatible con diversas plataformas, es decir, ya no depende de Windows y puedes usarlo con Linux, Android o Mac también. Ofrece capacidades adicionales como el descubrimiento de servidores OPC, acceso a datos jerárquicos, monitoreo de datos y más. Lamentablemente es una tecnología que no puedes usar de forma directa con los PLC de Siemens S7-300 o S7-400 ya que no se pueden usar ni como servidor opc ua, ni como cliente. ### Servidor OPC UA #### ¿Qué función tiene un servidor OPC UA? La función de cualquier servidor, sea OPC o no, es la de servir datos a los clientes que lo soliciten. En una comunicación cliente-servidor, el cliente (un navegador web por ejemplo) realiza una petición al servidor (la web del tiempo.es) y este tras realizar las operaciones pertinentes, responde (mostrando la página web en el navegador). En el caso de los PLC de Siemens, estos funcionan todos al menos como servidor. Por tanto, ¿se puede usar como servidor opc ua los S7 1200? La respuesta es SÍ. Digo esto porque los S7-1500 se pueden usar además como cliente OPC UA. A lo que estamos acostumbrados, en cualquier caso, es que los PLC de Siemens funcionen como servidor y que luego haya clientes que se conecten a ellos. Así por ejemplo funciona el enlace S7 con el que creamos[HMI con Snap7](https://programacionsiemens.com/curso-de-creacion-de-hmi-con-python-y-qt-designer/), por ejemplo, o usamos las pantallas HMI de Siemens. En cualquier caso, la forma de trabajar con los PLC van a ser significativamente diferente entre los S7-1200 y S7-1500. Así, mientras que con los S7 1200 hay que crear específicamente un interfaz para usar OPC UA en TIA Portal, en el caso de los S7-1500 podrías acceder directamente al dato ya que todas las variables tendrán su propio nodo, o creando como se realiza en los S7-1200 los inferfaces específicos. ##### Licencias de servidor OPC UA en TIA Portal Lamentablemente, si bien crear un cliente y conectarte por OPC UA en TIA Portal puede ser sencillo, el PLC tiene que funcionar con una licencia. A diferencia de otros sistemas en los que la licencia van por número de tags o variables, en este caso no. La licencia depende del hardware utilizado como se muestra en el siguiente cuadro en perfecto alemán pero que se entiende sin problemas: [Imagen: licencias servidor opc ua] Además debido a la diferencia entre los PLC, las capacidades de comunicación son muy diferentes entre lo que puede dar de si un S7-1200 vs diferentes S7-1500. Así, las variables supervisadas pueden ir desde los 1000 a los 10000 en función del PLC. Tienes [más información de Siemens aquí.](https://support.industry.siemens.com/cs/document/109755846/%C2%BFqu%C3%A9-l%C3%ADmites-del-sistema-debe-cumplir-el-opc-ua-server-en-equipos-s7-1500-y-s7-120-?dti=0&lc=es-WW) #### Pruebas realizadas. Como sabrás en casa tengo un S7-1212 para programar y hacer pruebas. El bicho se comporta razonablemente bien. No le he metido mucha caña y desconozco qué pasará si se pretende monitorizar el máximo de variables además de todo el trabajo que tenga que realizar el PLC de por sí. Para aligerar el servidor, puedes aumentar el porcentaje dedicado a las comunicaciones en detrimento del tiempo de ciclo. Todo no puede ser en esta vida. Por otro lado, como no tengo un S7-1500 tan solo he podido probar con PLCSIM Advanced qué tal van las comunicaciones SIN cifrar ya que el simulador no funciona con certificados aunque se los programes. Seguridad La configuración de certificados tienen su pequeña miga cuando quieres firmar y encriptar las comunicaciones y solo quieres permitir la comunicación cliente-servidor con determinados clientes para darle la capa mayor de seguridad. Si el PLC está asilado de internet, o para hacer los primeros test o comunicaciones, la verdad que ponerlo en marcha es cuestión de un par de clics en la configuración de hardware del PLC. Por tanto, en el tema de seguridades podemos decir que tenemos diferentes niveles: - Ninguna seguridad, en la que cualquiera puedes conectarse al servidor - Encriptar y firmar la comunicación permitiendo que cualquier cliente se conecte pero evitando the man in the middle - Encriptar y firmar la comunicación permitiendo que solo ciertos clientes se puedan conectar al servidor opc ua. Adicionalmente se puede darle mayor seguridad configurando parejas usuario/contraseña con los que vas a poder dar diferentes roles de tal forma que no todo el mundo pueda acceder a todo, por muy asegurada que esté la conexión. De tal manera que puedas crear un usuario, por ejemplo, de solo lectura de los tags. ### ¿Ponemos el marcha el servidor OPC UA en TIA Portal? En el siguiente vídeo vamos a ver un poco por encima cómo podemos poner en marcha el servidor OPC UA con un PLC S7-1200 y la configuración básica que tienes que tener en cuenta. https://www.youtube.com/watch?v=_40pwcvtovA ### ¿Qué te ha parecido? Espero que te haya parecido interesante. Como verás, nos hemos conectado con UA Expert para hacer esta pequeña demo. Lo interesante sería poder hacer tus propios HMI usando esta tecnología de tal forma que te pudieras conectar a diferentes servidores, sean PLC o fuentes externas que tengan dicho servicio ¿verdad? Pero de eso hablaremos pronto. --- # 4 formas de calcular el amanecer y anochecer > TIA Portal y eficiencia energética: 4 formas de calcular el amanecer y el anochecer para automatizar el encendido y apagado de luces en naves industriales. Fuente: https://programacionsiemens.com/4-formas-calcular-el-amanecer-y-anochecer · Autor: Iñigo Gútiez · Publicado: 2023-08-16 · Actualizado: 2023-08-16 · Categoría: Programación PLC Uno de los grandes dolores de cabeza que suele haber en los talleres y fábricas es el consumo energético. Porque sí, la electricidad tiene un precio muy alto como para estarla malgastando. Es por ello que en muchas naves industriales el encendido y apagado de las luces van aparejadas con la salida y puesta del sol, y por tanto hay que calcular cuándo se produce el amanecer y anochecer para activar o desactivar las luces. Lógicamente queremos que este encendido y apagado de luces en función del amanecer o anochecer se haga de forma automática, por lo que vamos a ver 4 formas de amanecer o anochecer... en TIA Portal! - Mediante un reloj astronómico - Mediante un reloj astronómico de software en TIA Portal - Usando nodos específicos en Node-Red - Consultando páginas oficiales que nos darán más información ### Mediante un reloj astronómico Esta es la primera y más clásica forma de encender las luces: usando un reloj astronómico mecánico. Tiene la ventaja de que no necesitas un PLC para hacer la maniobra de las luces. Pero tiene la desventaja de no hacerlo pasar por un PLC. Te dejo un esquemilla tipo que he encontrado en la red: [Imagen: reloj astronómico para cálculo de amanecer y anochecer] La ventaja de hacer pasar todo por un PLC te va a permitir controlar mejor cuándo se han encendido o apagado realmente, manejar el encendido o apagado los fines de semana, de forma remonta, en días especiales por calendario local o vacacional... en general vas a poder realizar cualquier operación que quieras sobre las luces que un reloj astronómico sencillo no te va a permitir. Además, el PLC puede encargarse de estas tareas, y de otras muchas que puedan ser necesarias de servicios generales del taller, por ejemplo. Así que sí, un reloj astronómico sencillo más o menos valdría, pero con sus limitaciones claras de calendario y peculiaridades que puedas tener, por lo que vamos a lo nuestro de usar la potencia de los **PLC de Siemens.** ### Mediante un reloj astronómico en TIA Portal Sobre esta forma de calcular a qué hora amanece en España o la hora de anochecer ya lo hicimos en su día. Tienes toda la información en la entrada [Cómo crear un reloj astronómico en TIA Portal](https://programacionsiemens.com/como-crear-un-reloj-astronomico-en-tia-portal/) en el que se calcula el amanecer y anochecer. Básicamente se trata de usar la biblioteca de Siemens [Librería con funciones generales](https://support.industry.siemens.com/cs/document/109479728/librer%C3%ADa-con-funciones-generales-(lgf)-para-simatic-step-7-(tia-portal)-y-s7-1200-s7-1500?dti=0&lc=es-WW), y dentro de estas, la biblioteca LGF_Astro. En la entrada que hice te enseño cómo utilizarla. ### Usando nodos específicos en Node-red Si además de las horas de salida y puesta de sol en España (o cualquier punto del mundo) necesitas otros eventos astronómicos (mediodía, atardecer.. y no solo amanecer y anochecer), puedes usar nodos específicos que te proporciona Node-red. Además, puede que tengas que usar un IOT ya que puede que le quieras usar esta información con PLC de la serie S7-300 o S7-400, y uses [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) o S7 clásico, no estará disponible la biblioteca LGF_Astro. La ventaja como veremos en el vídeo posterior es clara: - Simple de usar - Mayor número de eventos - Apto para todos los PLC El mayor inconveniente es que necesitas tener un equipo IOT que haga este servicio. Claro que el IOT te va a permitir muchas más cosas como sacar datos del PLC y mandarlos por Telegram o a la nube como vemos en el **[curso de iniciación a Industria 4.0](https://programacionsiemens.com/cursos/curso-de-iniciacion-a-la-industria-4-0).** Como digo, lo vemos en el vídeo más abajo. ### Amanecer y anochecer usando API Rest Si tenemos un IOT conectado a internet, podemos darle una vuelta de tuerca a esto de amanecer y anochecer. Uno de los problemas que hemos sufrido en mi empresa es que los días nublados el reloj astronómico no es suficiente. Y es evidente. Si el día está muy nubado (donde yo vivo es más habitual de lo deseable) puede que a las 9 de la mañana especialmente en invierno tengas poca luz. Si bien es verdad que esto lo puedes compaginar con fotocélulas, podrías darle una vueltilla usando páginas oficiales donde te dan bastane información sobre el tiempo: desde la salida o puesta de sol, hasta la temperatura, humedad, etc de donde estás. La cosa es tener diferentes alternativas y soluciones para casos concretos. Esta solución es similar a la anterior en el sentido que necesitamos un IOT como digo conectado a internet, pero tiene la ventaja que nos va a proporcionar mucha información que puede ser valiosa. Además, así practicamos un poco de [API Rest](https://blog.hubspot.es/website/que-es-api-rest#:~:text=Una%20API%20REST%20es%20una,pueden%20ser%20XML%20o%20JSON.) en Node-Red. ### Calcular amanecer y anochecer en vídeo En el siguiente vídeo vas a ver cómo calcular el amanecer y anochecer usando Node-red usando un nodo que te puedes descargar o haciendo una petición API REST. Verás que la ventaja de usar API-REST es que obtienes más información que con el bloque. El mayor inconveniente que le veo es que el IOT tendrá que estar conectado a internet, y eso siempre no es posible ni deseable en un entorno industrial. A cambio, tienes más información y controlas todo sin depender de nodos de terceros que a veces pueden quedarse cortos, dar problemas o que no nos ofrezcan exactamente lo que vamos buscando. ¿Vemos como calcular el amanecer y anochecer en node-red? [Vídeo: https://www.youtube.com/embed/fyMMG1G-J5w] ### ¿Qué te ha parecido? Espero que te haya parecido interesante que hay varias soluciones para calcular cuándo encender o apagar las luces de una nave industrial. A partir de estos rudimentos ¡¡imaginación al poder!! Yo por ejemplo uso en casa el amanecer y anochecer para subir y bajar las persianas eléctricas. Bien es verdad que no lo uso con un PLC sino que uso Home Assitant que ya me dar el sunset y sunrise para ejecutar los comandos de subida y bajada a los motores de las persianas. Recuerda que puedes encontrar muchas cosas más se ven en el [curso de iniciación a industria 4.0](https://programacionsiemens.com/cursos/curso-de-iniciacion-a-la-industria-4-0) --- # Array en TIA Portal con 4 ejemplos > Array en TIA Portal con 4 ejemplos prácticos: qué es, cómo declararlo y cómo acceder a sus valores mediante índices. Domina esta estructura clave en tu PLC. Fuente: https://programacionsiemens.com/array-en-tia-portal-con-4-ejemplos · Autor: Iñigo Gútiez · Publicado: 2023-08-05 · Actualizado: 2023-08-05 · Categoría: Programación PLC Hoy vamos a hablar de un concepto muy utilizado en la programación como son los array en TIA Portal. No es algo que uses siempre, el 100% del tiempo, pero sí es algo habitual que hay que dominar. ### ¿Qué es un array en TIA Portal? Bueno, más que en [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/), en general. En una definición de andar por casa de array en plc podríamos decir que un array es una variable que es un listado de valores o variables a los que le asignamos un índice para poder acceder al contenido. [Imagen: array en tia portal] Como ves, es como un conjunto de cajitas numeradas (0,1, 2...) donde cada cajita contiene el valor o información para dicha posición de la cajita. Luego la forma de acceder a dicha información será haciendo referencia al número de cajita. El uso de arrays en programación PLC es fundamental para almacenar datos que requieren cierta estructura y organización, como datos de sensores, actuadores o cualquier información que se necesite manipular de forma conjunta. Los arrays permiten un acceso eficiente a los elementos almacenados, lo que facilita el desarrollo de lógicas más complejas y la optimización del código. Una [definición más académica de array](https://en.wikipedia.org/wiki/Array_(data_structure)) (matriz) de datos es la siguiente: **En informática, una matriz es una estructura de datos** que consiste en una** colección de elementos (valores o variables)**, del **mismo tipo y tamaño de memoria**, cada uno **identificado por al menos un índice o clave de matriz**. Es una frase sencilla, pero que tiene su miga: - es una estructura de datos, es decir, siempre hablamos sobre datos y no sobre flujo de programa y el hecho de que sea una estructura hace que no sea sea lo que podríamos denominar una variable compleja, que a diferencia de una variable simple va a tener partes diferenciadas dentro de su contenido. - colección de elementos, es decir, vamos a tener un listado de valores (o variables) dentro de él. Lo que hemos llamado cajitas en la definición de andar por casa. - del mismo tipo y tamaño de memoria, es decir, todos tienen que se de la misma tipología (enteros, bool, timers...) y por tanto, cada uno de ellos tienen el mismo tamaño dentro de la memoria. Esto es importante porque no vamos a poder mezclar tipologías dentro del array. Ojo, sí podremos crear un array de Struct TIA Portal, donde cada estructura tenga enteros y reales, por ejemplo. Pero el array sería de tipo estructura, por lo que mantiene la coherencia. - cada uno identificado por al menos un índice o clave de matriz, es decir, están indexados y vamos a poder referirnos a cada posición del array mediante un número, o varios números, lo que implica que una matriz podrá ser de diferentes dimensiones: matrices de doble entrada, en 3D... [Imagen: array en TIA Portal ] ### ¿Cómo hacer un array en TIA Portal? La idea fundamental es almacenar información en cada cajita para posteriormente recuperar la información de dicha cajita mediante lo que denominaríamos recorrer un array en TIA Portal. Los array solo se pueden declarar dentro de un DB. No es posible realizarlo con marcas. A la hora de declarar el array, tan solo deberás usar la palabra reservada ARRAY dentro de la declaración de la variable. Luego tendremos que dar el rango del array. Por ejemplo declararemos: - Array[1..10] para índices entre 1 y 10 - Arrau[3..18] para índices que vayan entre 3 y 18 - Array[-10..10] para índices que vayan entre -10 y 10 Pero también podrás declarar array en TIA Portal que tengan más de una dimensión: - Array[1..10, 30..45] para crear matrices TIA Portal con índice1 entre 1 y 10 y indice2 entre 30 y 45 - Array[1..3,1..10,1..100] para índice1 entre 1 y 3, índice2 entre 1 y 10 e índice3 entre 1 y 100 Posteriormente haremos referencia a una posición de dicho array simplemente haciendo referencia a la posición de la cajita: - NombreDB.NombreVariableArray[5] - NombreDB.NombreVariableArray[5,6] También vas a poder acceder a la información de forma indirecta usando variables: - NombreDB.NombreVariableArray[#indice] siendo #indice la que contendrá la posición a leer del array. ### Ejemplos de array TIA Portal #### Uso de arrays en domótica, automatización y robótica - Control de iluminación: Mediante el uso de un array, es posible almacenar y controlar el estado de múltiples luces en un sistema de domótica. Cada elemento del array puede representar una luz específica y su estado (encendido/apagado). - Monitoreo de sensores: En sistemas de automatización, se pueden utilizar arrays para almacenar lecturas de sensores, por ejemplo, temperatura, presión o nivel. Cada posición del array guarda la información correspondiente a un sensor específico. - Control de movimientos: En aplicaciones robóticas, los arrays son útiles para almacenar coordenadas de movimiento, velocidades o estados de actuadores. Esto permite realizar secuencias de movimientos precisos y controlados. #### Ejemplos de uso de array en TIA Portal en la industria - Sistema de gestión de inventario: Un array puede utilizarse para almacenar y rastrear la cantidad de productos en un almacén, asignando una posición del array a cada producto y controlando su stock. - Control de procesos industriales: En aplicaciones industriales, los arrays pueden ser utilizados para monitorear y controlar múltiples variables de un proceso, como presiones, temperaturas, velocidades, entre otros. - Manejo de recetas en la industria alimentaria: Con el uso de arrays, es posible almacenar recetas de productos alimentarios y acceder a la información necesaria para la producción de cada producto en particular. Estos son solo ejemplos de las infinitas posibilidades de uso de los arrays en TIA Portal. La flexibilidad y versatilidad de esta herramienta ofrece soluciones eficientes a una amplia variedad de aplicaciones en el ámbito de la automatización industrial. #### Ejemplos de uso de arrays en TIA Portal en el blog Durante estos años hemos hecho innumerables ejemplos en los que hemos usado un array en TIA Portal, pero vamos a repasar algunos de ellos como ejemplo. - Arranque de motores en el que mediante un array de multi instancias, programamos el arranque de los motores. - FIFO y LIFO en TIA Portal en el que introducimos datos y los recuperamos del FIFO/LIFO en función de las necesidades. - El caso de los caracteres booleanos en el que usamos un array de arrays para resolver el problema. - Deshacer y rehacer en TIA Portal para usarlo en tus HMI de Siemens emulando lo que puedes hacer con las aplicaciones de Windows. Te puede ser útil en editores como en el que se muestra en el ejemplo. Ni que decir tiene que hay más ejemplo de **arrays en TIA Portal** dentro del blog, pero estos solo son unos ejemplos muy diferentes unos respecto a otros ya que nada tiene que ver el arranque de motores con un FIFO o con usarlo con el hacer/rehacer para un HMI. Como verás en los ejemplos, el uso de arrays es muy útil cuando tienes información homogénea y que puedes indexar para que de una forma sencilla puedas referirte a dichos valores simplemente con un índice. El uso como digo es independiente del proyecto. Lo vas a ver en cualquier tipo de máquina o línea. La única característica es que quieres guardar información que posteriormente vas a recorrer. ### ¿Qué te parecen los array en TIA Portal? Supongo que lo tienes claro, pero he creído que podía ser importante darle un pequeño barniz nuevamente. Siempre está bien echar un vistazo a conceptos básicos en el blog, porque a veces hay lectores que no tienen las cosas demasiado claras. Espero que con esta entrada quede un poco más claro lo que es un array, independientemente de que sea para TIA Portal o para Step 7 clásico, ya que se comportan básicamente igual. Recuerda que todos los ejemplos resueltos, y muchos más los tienes a tu disposición en el **[curso TIA Portal de la serie S7-1200](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/).** --- # Termopar: qué es, cómo funciona y conexión a un PLC > Qué es un termopar, cómo funciona y cómo conectarlo y leerlo en un PLC Siemens con TIA Portal. La guía clara para medir temperatura en la industria. Fuente: https://programacionsiemens.com/termopar-que-es-y-para-que-sirve · Autor: Iñigo Gútiez · Publicado: 2023-05-09 · Actualizado: 2026-07-26 · Categoría: Analógicas y regulación ### Introducción. La temperatura es una de las variables más importantes a controlar y conocer en un proceso industrial. Aunque no hace falta pensar en entornos específicamente industriales. En nuestro día a día nos encontramos con multitud de situaciones en las que se realizan mediciones de temperatura. En nuestros coches, tanto la temperatura del motor como la del habitáculo. En los electrodomésticos de nuestras casas: lavadora, frigorífico, lavaplatos, etc. En las oficinas donde trabajamos. Conocer la temperatura nos permite poder realizar acciones que nos aseguren que los procesos son repetibles y que transcurren en óptimas condiciones. Aunque uno de los mayores beneficios de conocer la temperatura de un proceso es poder prevenir accidentes. Si en un sistema la temperatura comienza a ascender por encima de unos niveles, nos avisa con antelación que algo no está funcionando como debe y nos permite parar con seguridad. Por ello, en un proceso industrial, la temperatura es una de las variables más utilizadas para prevenir riesgos y accidentes. Hay muchos métodos para conocer la temperatura. Dependiendo de las características y del rango de temperaturas se usa un método u otro. No se puede usar lo mismo para medir la temperatura de una habitación que la temperatura de una colada de acero. Pero hay dos tipos de instrumentos que suelen ser los más utilizados en la industria. - Los termopares o termocuplas. - Los RTD (PT100) Los anteriores instrumentos te los encontrarás con total seguridad en la mayoría de las instalaciones de procesos. En este post nos centraremos en los **termopares:** En que se basa su principio de funcionamiento, como se realiza el montaje, su cableado, cómo se conectan a las cartas de los PLC y su configuración en[Tia Portal](https://programacionsiemens.com/que-es-tia-portal/). ### Termopar #### Principios básicos de funcionamiento. Una termocupla está formado por la unión de dos metales diferentes unidos eléctricamente. Esa unión (junta caliente) genera una tensión que es proporcional a la temperatura. En los puntos donde se mide la diferencia de tensión se le llama junta fría. [Imagen: termopar] La tensión que se genera es muy baja, del orden de microvoltios. Pero suficiente para poder medirla y relacionarla con la temperatura. [Imagen: termopar] #### Tipos de termopares. Los tipos de termopares se basan en los diferentes pares de metales que lo componen. Para cada combinación, para cada par de metales, se ha normalizado y estandarizado la designación de un tipo de termopar con una letra. Que cada tipo esté normalizado nos permite conocer las características o prestaciones de cada uno de ellos (rangos de medida, exactitud, tolerancias, etc.) así como el código de los colores para sus cables y conectores. En la siguiente tabla vemos diferentes tipos de termopares y su combinación de metales. **Tipo** **Cable Positivo** **Cable Negativo** T Cobre Constatan J Hierro Constatan E Cromel Constatan K Cromel Alumel N Nicrosil Nisil S Platino-10% rodio Platino Cada uno de estos tipos presenta unas cualidades y características diferentes: - Rango de temperaturas de medida. - Precisión. - Linealidad de la medida. - Resistencia a la corrosión en el ambiente de la instalación. - Coste Por tanto, la elección de un tipo u otro depende directamente de los requerimientos de la instalación o servicio que se quiera medir su temperatura. En la siguiente tabla se vemos más detalles de las características de tres tipos de termopares. **Tipo** **Rango Temperatura** **F.em (mV)** **Límites de Error Estándar** K -270-1372ºC -6.458-54.886 Más 2.2 ºC o 0.75% T -270-400ºC -6.258-20.872 Más de 1.0ºC o 0.75% S -50-1768ºC -0.236-18.639 Más de 1.5ºC o 2.5% *Norma europea IEC 60584.1 (BS EN 60584.1) Para cada uno de los tipos anteriores, el rango de temperaturas es diferente, así como la tensión que se genera en ambos límites. El error en la medida también difiere según la combinación de metales. En la siguiente gráfica se representa las curvas de tensión generada entre los metales (mV) respecto la temperatura para diferentes tipos de termopares. Son en estás gráficas donde se puede conocer si el termopar se va a comportar de una forma lineal en el punto de operación. [Imagen: curva termopar] Aunque hay multitud de tipos el más usado en industria es el **termopar Tipo K.** Su gran rango de temperaturas, linealidad, resistencia a la corrosión y bajo coste, hacen que sea ahora mismo (siempre que las condiciones lo permitan) el termopar por excelencia. #### Montaje de Termopares. Ya sabemos cómo funcionan los termopares, pero aún no hemos visto como se montan para poder ser usados en las aplicaciones. La unión de los metales (junta o unión caliente) no suele estar expuesta al medio. Se introduce el termopar en un tubo (vaina) para resguardar la sonda del medio y evitar deterioros y roturas prematuras. [Imagen: montaje termopar] Los terminales de los termopares, lo que hasta ahora hemos visto como cable rojo (positivo) y cable azul(negativo), les podemos encontrar como cables sueltos o en un conector. **Importante** Es muy importante que sepas que para cada tipo hay un modelo de conector. Estos conectores están también estandarizados. Por ejemplo, no se puede usar un conector tipo S para uno tipo K**.** [Imagen: conector tipo K termopar] Lo mismo sucede con los cables extensores que tengamos que usar para ir desde el instrumento hasta la tarjeta de entradas analógicas del PLC. **El cable tiene que ser del mismo tipo del termopar o al menos compatible.** Esto es así porque el material del cable, debe ser el mismo que el que usa el termopar. Si fueran cables de diferentes materiales se generación juntas calientes en cada conexión. Si se usa un cable cualquiera para llegar al PLC, las medidas de temperatura serán incorrectas. #### Cableado de un Termopar al PLC Si queremos conectar un termopar a una tarjeta de entradas analógicas lo primero que hay que hacer es asegurarse que la tarjeta es capaz de medir la temperatura a través de los dos cables que salen directamente del termopar. Esto es muy importante, ya que no todas las tarjetas analógicas de entradas son capaces de hacerlo. Las hay que solo miden señales de intensidad 4-20mA o voltaje 0-10V, así como otro tipo de sensores como una PT-100. En el manual u hoja de datos de la tarjeta siempre viene detallado que tipo de sondas es capaz de admitir. Ante cualquier duda siempre hay que consultar el manual. Pero sólo con la descripción de la tarjeta y el esquema de conexionado podremos saber si la tarjeta admite entradas de termopares. En el ejemplo de la imagen siguiente, solo leyendo la descripción de la tarjeta y el esquema del conexionado, podemos saber que la tarjeta está preparada para recibir los cables de un termopar. AI = Entrada Analógica. TC = Thermocouple (Termopares) #### Conexión del Termopar a la Tarjeta de Entradas Analógicas TC El conexionado es muy sencillo al ser solo dos hilos. Hay que tener la precaución de **respetar la polaridad** de los cables. Es decir, no confundir el positivo con el negativo. Para saber que cable es cada uno (positivo o negativo) basta con consultar el código de colores para cada tipo de termopar. Recuerda que vimos que era sumamente importante usar el mismo cable extensor que el tipo de termopar. Estos cables están normalizados y responden a un código de colores. En la siguiente imagen puedes ver un ejemplo de los códigos de los colores y su polaridad respecto al tipo de termopar. **Atención** Cómo puedes ver en la tabla anterior, hay varias normativas con códigos de colores diferentes. El uso de una norma u otra depende del país donde se vaya a realizar el uso del termopar. Por lo general, el uso de la norma IEC es la que más se está extendiendo, pero no es de extrañar que en una instalación antigua encuentres el código de colores propio del país. Por ejemplo, en América, el uso de la norma ANSI sigue siendo muy empleado. Ejemplo: Conexionado Termopar Tipo K en Tarjeta de Entradas Analógica TC. [Imagen: termopar conector extensor carta AI tipo K] ### Configuración un termopar en TIA Portal Realizado el correcto conexionado del termopar a la tarjeta, hay que configurar el módulo. El objetivo principal es indicar al programa que tipo de sensor tiene conectado para que ajuste sus parámetros y de una medida correcta de temperatura. Tomaremos de ejemplo la tarjeta de entradas analógicas TC de Siemens siguiente: #### SIMATIC S7-1200, Analog input, SM 1231 TC, 4 AI thermocouples **(6ES7 231-5QD30-0XB0)** Es una tarjeta de entradas analógicas de 4 canales preparada para conectar termopares para los [PLC S7-1200](https://programacionsiemens.com/s7-1200/). El esquema de conexionado de la tarjeta es el siguiente: [Imagen: tarjeta entrada AI TC esquema eléctrico] Una vez agregada como dispositivo en el [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) hay que configurar los parámetros básicos de la tarjeta. El primer paso es seleccionar el canal donde tenemos conectado los terminales del termopar que queremos configurar. Hay que asegurarse que el tipo de medición sea “Termopar” y seguidamente elegir el tipo de termocupla que tenemos conectado. **Este paso es muy importante. Si elegimos un TC que no coincide con lo que está instalado en campo la medición no será correcta.** En el menú desplegable “Termopar”, podrás elegir entre todos los tipos de termopares que la tarjeta es capaz de soportar. [Imagen: configuracion termopar TIA Portal] Con estos simples pasos la tarjeta ya estaría configurada para leer la temperatura de la sonda. Se pueden configurar otros parámetros: **Escala de temperatura:** Elegir si queremos visualizar la temperatura en grados Celsius o Fahrenheit. **Filtrado:** Si tenemos una señal de medida que fluctúa mucho podemos realizar un filtrado fuerte (32 ciclos) para que la visualización de la señal sea más estable. **Origen temperatura de referencia:** Este parámetro es mejor dejarle por defecto como “Referencia interna”. De esta manera la tarjeta hace sus cálculos internos para compensar el error de la medida por la segunda junta caliente al unir los cables del termopar con el propio bornero de la carta. [Imagen: configuración termopar tipo K Tia Portal] Finalmente, solo quedaría activar si lo necesitas, **y no lo haces por programa**, los avisos de rotura de hilo y los rebases de límite superior e inferior. **Atención.** Usando este tipo de tarjetas no sería necesario realizar escalados de señal. La variable de entrada ya viene escalada y en la unidad que hayas seleccionado (Celsius o Fahrenheit). Pero debes tener en cuenta que la medida viene con un decimal más. Por ejemplo, si la temperatura son 20ºC, la variable EW del autómata será 200. Da ese decimal más para tener mayor exactitud en la medida. Para finalizar, recordarte de nuevo que es importante que si el termopar es de un tipo lo sean también sus conectores y cable extensor. Si se usa un cable de diferente tipo o una manguera que haya sobrado de la obra, la medida no va a ser correcta. También ten en cuenta que, si por algún motivo tienen que sustituir la  termocupla (avería, rotura, calibrado, etc.), es fundamental que el nuevo sea del mismo tipo. Si tienes el programa configurado un Tipo K y te lo cambian por un Tipo S, por ejemplo, a parte de que el cable y conectores ya no servirían, la medida va a ser mala. Y si no estás atento vas a pensar que es por el programa y vas a dar mil vueltas buscando el error. No serías al primero que le pasa. ### ¿Quieres saber más? Si te ha gustado y crees que esto te puede servir como ayuda, he preparado una guía muy sencilla sobre termopares. Es una guía en pdf que te puedes descargar gratis. Solo tienes que suscribirte en mi newsletter. Es aquí abajo. Solo si te interesa. [>> Pulsa aquí para descargar la guía](https://juanyague.com/termopares/) **Relacionado:** una vez que mides la temperatura, el siguiente paso es regularla. Aquí tienes cómo montar un [control PID de temperatura con S7-1200 y PID_Compact](https://programacionsiemens.com/control-pid-de-temperatura-con-s7-1200-pid-compact), paso a paso. --- # Machines Simulator: características principales > Machine Simulator es el software para crear el gemelo digital de tus líneas. Conoce sus claves y consigue un 15% de descuento con el código PSIEMENS. Fuente: https://programacionsiemens.com/machines-simulator · Autor: Iñigo Gútiez · Publicado: 2023-04-21 · Actualizado: 2023-04-21 · Categoría: Simulación **Machines Simulator** es un software de simulación que nos permite realizar el gemelo digital de nuestras líneas de producción. La verdad es que tenía pendiente desde hace mucho tiempo esta entrevista con [Rafael Izquierdo de Nirtec](https://nirtec.com), el creador de este software y de EasyPLC. En esta entrevista Rafa me ha contado la historia desde que nació el proyecto hasta hoy de Machines Simulator. La verdad, es que tiene un mérito gigantesco haber llevado este proyecto personal al nivel que tiene hoy el software. No sólamente eso, sino que en caso de que estés interesado en comprar el software, **tienes un descuento del 15% **usando el código de descuento** PSIEMENS.** ### ¿Qué es Machine Simulator? Machine Simulator es el **producto estrella de Nirtec**, como bien apunta Rafa en la charla. Se trata de un **software de simulación 3D** orientado a poder aprender a programar los **PLC de Siemens**, Rockell o del fabricante que sea usando un entorno virtual que represente una línea de producción física. Esto da pie a que no solamente lo usen estudiantes sino que puedan usarlo también industrias para crear un gemelo digital usando Machines Simulator. [Imagen: machines simulator gemelo digital] Como reza en la própia descripción de la web de Nirtec: **El editor EasyPLC Machines Simulator es una herramienta fácil de usar** que te **permite crear sistemas mecánicos simples, medios o complejos** con componentes mecánicos, eléctricos y electrónicos ensamblados que se pueden programar más tarde con EasyPLC. Esto te **permite comprobar qué tan bueno eres** en la programación de PLC. También **puedes replicar sistemas físicos reales para ser programados de manera virtual** y evitar dañar el sistema real. Alternativamente, puedes empezar a programar y verificar tu programa antes de que se cree el sistema. Si los componentes que necesitas no están disponibles en la biblioteca, puedes usar el editor de componentes para crear tus propios mecanismos y dispositivos. ### El vídeo donde Rafa nos habla de Machines Simulator En el siguiente vídeo te muestro parte de la conversación mantenida con Rafa sobre Machines Simulator donde nos cuenta su historia y las características de este software. https://www.youtube.com/watch?v=x0ZcEVX5XnI Por si no puedes ver el vídeo, he querido transcribir las ideas más importantes sacadas de la conversación con Rafael. ### La historia de Rafa La historia de EasyPLC y Machines Simulator se remonta a hace 20 años de forma extraoficial y oficialmente como tal unos 15 años. La aventura personal de Rafael comienza con la necesidad de no poder aprender automatización que no fuera pegándote directamente con las máquinas trabajando ya dentro de una empresa. Te tenías que formar en muchos casos en casa del cliente dentro de la puesta en marcha. Así que la formación de los técnicos era muy complicado. Así que los primeros antepasados de Machines Simulator comenzó allá por el año 1995 con los PLC S5 de Siemens y en MSDOS. Como la conectividad con el PLC era casi inexistente, realizó un software básico en C con el que mediante contactos y bobinas podías realizar una secuencias básicas. Tras eso, y viendo su utilidad realizó un interfaz con el puerto paralelo para poder tener actuadores físicos externos al PC con el que dar señales de entradas y tener leds de salida. Así es como nació EasyPLC. Posteriormente ya nació Machines Simulator en un entorno 2D para poder colocar actuadores y sensores muy sencillos. A pesar de que la empresa no mostró interés en este simulador, Rafa continuó trabajando en su tiempo libre hasta hacerlo funcional de forma que tenías EasyPLC y Machines Simulator. Creo una página web y comenzó la historia que nos va llevando poco a poco hasta hoy. Estamos hablando que corría el año 2005 con las primeras iteraciones de Machines Simulator en 3D. Ya era un producto comercial en el que desde el primer momento se pudo crear tus propios objetos 3D para integrarlos en el simulador. Tras trabajar mucho sobre ello y tras diferentes iteraciones, llegamos a las versiones actuales. ### Machines Simulator: características #### EasyPLC y Drivers de fabricantes Además de poderte conectar con los PLC de los principales fabricantes de PLC como Siemens o Rockwell tienes multitud de drivers por si necesitaras algo más especial o concreto. Así, el listado completo de drivers es este: - OPC DA/UA Driver - CodeSys - Siemens PLC - Siemens Logo - Siemens PLCSIM Driver (versión antigua) - Virtual Interface - TwinCat V3 Driver - Modbus Driver - Ethernet - TCP/IP Drivers - EASYPLC Software Development Kit (S.D.K) Si necesitas más información sobre cualquiera de estos apartados tienes[la página de interfaces soportados por Machines Simulator](https://www.nirtec.com/interfaces-i-o/). Como puedes ver, puedes usar el software EasyPLC para practicar y aprender en caso de que no tengas un software de ningún fabricante. En nuestro caso podrás usar [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) por ejemplo para programar y conectar Machines Simulator al PLCSIM usando NetToPLCSim, un PLC de Siemens físico, o bien usar PLCSIM Advanced con el que no necesitarás NetToPLCSIM. Ni que decir tiene que también puedes usar Step 7 para hacer las programación del autómata. #### Requisitos del Sistema Los **requisitos mínimos **para correr el programa son: - Windows 7 o superior  de 64 bits - 8 Gb de RAM La calidad gráfica la podrás adaptar a las características de tu PC o portátil. Así podrás cambiar el número de FPS, la calidad de las sobras etc para adaptar el software a lo que la tarjeta gráfica de tu PC puede ofrecer. #### Creación de componentes Una de las características y fortalezas que distingue este simulador de otras alternativas como puede ser Factory I/O es que puedes crear tus propios objetos 3D para usarlos en el software. Para ello, debes exportar tu objeto 3D en el formato abierto OBJ importarlo en el editor de componentes. Posteriormente en dicho Editor puedes darle el comportamiento que necesite dicho objeto o submáquina de tres formas diferentes: - Controladores parametrizables (no se programa, sino que se configura). - Lenguaje de nodos (estilo Node-Red). - Scripts (mediante código) Además, los componentes ya existentes podrás modificarlos en sus dimensiones para adaptarlos mejor a tus creaciones. A cámara rápida, puedes verlo en el [canal de Youtube de Nirtec](https://www.youtube.com/@Nirtec): https://www.youtube.com/watch?v=WChcpCPj7mU&t=59s #### Las Demo de Machines Simulator Una de las características que tiene Machines Simulator es la posibilidad de abrir escenas preconfiguras. Puedes abrirla y comenzar a trabajar sobre ella para hacerla funcionar o bien puedes arrancar la demo con la que podemos ver qué se pretende que haga dicha escena. No es un vídeo, ya que es una escena en la que puedes interactuar pulsando botones, por ejemplo. #### Licencia de Machines Simulator La licencia que puedes adquirir en Nirtec te sirve para todo los softwares siguientes: - EasyPLC Editor - Virtual PLC CPU - Machines Simulator - Machines Simulator Lite (Android systems) - HMI System - Visual Control - Machines Simulator VR ##### EasyPLC Editor Es el editor por si no puedes usar TIA Portal o cualquier software de fabricante. Con él podrás practicar y conectarlo a Machines Simulator. ##### Virtual PLC CPU Se trata del simulador de PLC de EasyPLC para hacer correr el programa que realices con él. ##### Machines Simulator El software del que estamos hablando para crear tu simulación en 3D ##### Machines Simulator Lite Solo para teléfonos y tablet Android con la que tendrás una versión más pequeña de Machine Simulator en caso de no disponer de un PC. ##### HMI System Con ello podrás crear tus HMI para interactuar con Machines Simulator en caso de que no puedas crear tus pantallas con WinCC Flexible, por ejemplo ##### Visual Control Se trata de un plugin para EasyPLC. Sirve para usar una cámara web y usarla para el reconocimiento de piezas. ##### Machines Simulator VR Si tienes unas gafas de realidad virtual podrás usarlas con Machines Simulator VR ya que podrás gestionar el ambiente generado en 3D con la inmersión que te da este tipo de tecnología. #### Precios de Machines Simulator Como hemos comentado, la licencia incluye todos los programas anteriores, pero hay dos versiones de licencia: - Standalone License - USB License ##### Standalone License La licencia Standalone permite a EasyPLC + Machines Simulator acceder a un ordenador a la vez. Podrás activar/desactivar la licencia tantas veces como sea necesario, permitiendo moverla entre ordenadores. IMPORTANTE: Con este tipo de licencia es necesario tener conexión a Internet mientras se utiliza el software. Su coste actual es de 85€ ##### USB License A mi juicio, la mejor de las dos: una licencia que va en formato físico en USB. Esto te permite trabajar en un único PC a la vez como en el caso anterior, pero puedes cambiar de PC. Si cambias de PC o quieres trabajar en otro, simplemente enchufas la licencia USB en ese PC y podrás funcionar con él. El coste actual es de 95€ Al ser en formato físico hay que añadirle los gastos de envío, que en el caso de la Península Ibérica puede rondar los 5-6€ adicionales. ### Descuento del 15% en Machines Simulator Como te he comentado, Rafa nos hace un descuento del 15% en el precio de cualquiera de las licencias. Y sí, yo me llevo una pequeña comisión por comprarlo usando el código promocional. Esto hace que los precios de las licencias queden así: - Standalone: 85€ --> 72,25€ (12,75€ menos) Para adquirirlo, sigue este link: https://www.nirtec.com/product/single-pc-license/ - USB License: 95€ --> 80,75€ (14,75€ menos. Gastos de envío a parte. Para adquirilo, sigue este link: https://www.nirtec.com/product/usb-license/ Así que si quieres tener este 15% de descuento en la licencia de Machines Simulator, tan solo tienes que introducir **PSIEMENS** en el carrito de la compra para que te quede algo así: [Imagen: Machines simulator descuento 15%] ### ¿Qué te ha parecido? Espero que te parezca interesante el simulador 3D Machines Simulator. Yo ya estoy trabajando con ello y mi idea es hacer ejemplos con este software en breve. Cualquier duda que puedas tener sobre el software, puedes contactar con Rafa a través de [la página de contacto de Nirtec](https://www.nirtec.com/contact-us/) --- # Grafcet en TIA Portal: qué es y 5 formas de crearlo > Grafcet en TIA Portal: te enseño 5 formas de crearlo, desde el lenguaje Grafcet de Siemens hasta los métodos más usados para tu programación secuencial. Fuente: https://programacionsiemens.com/grafcet-en-tia-portal-5-formas-de-crearlo · Autor: Iñigo Gútiez · Publicado: 2023-04-18 · Actualizado: 2026-09-07 · Categoría: Programación PLC Vamos a ver las diferentes formas de hacer un Grafcet en TIA Portal, desde usando el propio lenguaje Grafcet de Siemens, pasando por los que más se suelen utilizar. ### ¿Que es Grafcet? Grafcet es un acrónimo de "GRAphe Fonctionnel de Commande Etapes/Transitions"  o Diagrama funcional de etapas/transiciones de control, en la lengua de Cervantes. Seguramente si no lo conoces, te has quedado igual. Grafcet es una **herramienta gráfica** que permite **modelar el comportamiento de un sistema de control secuencial mediante una serie de etapas, transiciones y acciones**. Cada etapa representa un estado del sistema, cada transición indica la condición para pasar de una etapa a otra y cada acción indica la tarea que se debe realizar cuando se llega a una determinada etapa. Aqui el punto: es una herramienta gráfica de modelado. Por tanto, Grafcet no es un lenguaje de programación, sino una forma de modelar la forma en la que quieres que trabaje tu máquina. Si miramos [lo que dice Wikipedia sobre Grafcet](https://es.wikipedia.org/wiki/GRAFCET), nos encontramos con que tiene esta pinta: [Imagen: Grafcet en TIA Portal - secuencia] Básicamente en lo que se basa Grafcet es en dos cosas: - Etapas: donde se ejecutan acciones  (poner en marcha motores, EV, lo que sea) - Transiciones: condiciones que se tienen que cumplir de la etapa corriente para avanzar a la etapa siguiente. Así tenemos el Grafcet de la parte superior en la que se arranca en la etapa 1 en la cual seguramente no haya que hacer nada, ya que una etapa puede estar vacía de acciones. Una vez se cumpla la condición 1, se pasará a la etapa 2 anulando la etapa 1. En esta etapa 2 se realizarán las acciones que se hayan programado para esa etapa. Una vez se cumpla la condición 2, se pasará a la etapa 3, y así sucesivamente. Al final, cuando se cumpla la condición 4 se retornará a la etapa 1 haciendo un bucle cerrado de acciones-transiciones. ### 5 formas de hacer un Grafcet en TIA Portal La cuestión ahora es ¿cómo se puede llevar la programación de un Grafcet en TIA Portal en la práctica? Recuerda que Grafcet no es mas que un modelado, no un lenguaje en sí mismo aunque también lo haya en TIA Portal para la serie S7-1500. Por tanto, tendrás que usar las herramientas disponibles para poder llevar ese modelado a un [lenguaje KOP](https://programacionsiemens.com/lenguaje-kop-o-ladder) o en AWL, o como lo quieras programar. Así que yo haya visto, el concepto de etapa-transición se puede hacer de las siguientes 5 formas: - Usando el lenguaje Grafcet en TIA Portal (no disponible para los S7-1200) - Usando Set y Reset - Mediante un índice (número) de etapa - Moviendo un bit  a lo largo de un word - Usando Case en AWL o SCL Puede que haya más formas, pero al menos estas son las que yo he visto a lo largo de estos años. #### Usando el lenguaje Grafcet La primera forma es la más obvia: usar el propio lenguaje Grafcet que ofrece Siemens. Curiosamente no es la forma más habitual (ni mucho menos) de ver desplegado un Grafcet porque la forma en la que ha estado y está implementado no es muy amigable. Anteriormente con Step 7 si querías programar en Grafcet necesitabas una licencia aparte ya que no venía con el Simatic Step 7. Esto ya de por sí, es algo que no anima a su uso. Pero además trae otros problemas como: - Todos los bloques en Grafcet tienen que estar realizados en FB, con lo que las modificaciones en línea se hacen más complejas al tener que recargar el DB de instancia y por tanto poniendo a valores iniciales cada variable de este DB. - La visualización del Grafcet en portátiles de aquella época se hacía complicado cuando el programa es complejo y hay muchas ramas en paralelo. - Las referencias cruzadas de los saltos entre etapas complejos de seguir. Tras lo que yo he vivido, no me gusta la implementación de Grafcet en TIA Portal ni en Step7. Tal vez sea una manía personal. Porque sobre el papel está muy bien cuando la secuencia es sencilla y limpia. Cuando empiezas con bifurcaciones, saltos de una rama a otra etc, se hace ingobernable ante una avería. Puede que no sea tanto culpa del lenguaje en sí, con la mala implementación de este, pero lo cierto es que no debo ser el único ya que para realizar secuencias pocas veces he visto que se use este lenguaje. #### Usando Set y Reset Junto con la siguiente forma de generar un Grafcet el TIA Portal mediante un contador o índice de paso, es de los más utilizados. Para programar de esta manera básicamente lo que vas a usar son Set de una señal booleana (marca o de un DB) para fijar la etapa activa y Reset para desactivar la anterior etapa. De esta forma, tendrás dos partes del programa: - La secuencia de pasos con las transiciones - Una parte de activación de las salidas en función de la etapa activa. En el siguiente  post hablamos de [Cómo programar las etapas en TIA Portal usando Set y Reset.](https://programacionsiemens.com/como-programar-las-etapas-en-tia-portal/) #### Mediante un índice (número) de etapa La idea de usar un índice es usar básicamente un entero que contenga el paso. Vas a programar todo en [lenguaje KOP](https://programacionsiemens.com/lenguaje-kop-o-ladder) salvo que en vez de hacerlo con Set y Reset como en el caso anterior lo que irás cambiando es el valor del índice de paso. Este caso lo vemos aplicado en [el ejemplo de estructuración de un programa en TIA Portal](https://programacionsiemens.com/ejemplo-de-estructuracion-de-un-programa-en-tia-portal/) #### Moviendo un bit  a lo largo de un word Dentro de las operaciones que se pueden hacer sobre un word o doble word está el mover los bits hacia la izquierda. Por tanto, se puede usar estas instrucciones para ir moviendo un bit cada vez que queramos cambiar de etapa. Este ejemplo lo puedes ver en Step 7 en el [desplazamiento de bits para crear secuencias,](https://programacionsiemens.com/como-usar-el-desplazamiento-de-bits-para-crear-secuencias/) pero verás que es completamente aplicable a TIA Portal. #### Usando Case en AWL o SCL La forma de programar un Grafcet en TIA Portal con AWL o SCL es bastante similar. La idea es tener un índice de etapa numérico. Luego hacer un salto en función de este valor al punto del programa que aplica. En esa zona, se evalúa la transición y en caso de que se cumpla la condición se le asigna el nuevo valor al índice de tal forma que en la siguiente ejecución del programa el salto se hará a la nueva zona donde esté asignado el valor del índice. Personalmente no lo he usado nunca si bien sí lo he visto usar. No me parece que tenga ninguna ventaja respecto a otras formas y me parece bastante engorroso. ### ¿Qué forma elijo para hacer un Grafet en TIA Portal? Decididamente las que más me gustan a mi son hacerlo con Set/Reset o bien  con un índice, pero siempre en lenguaje ladder para realizar los grafcet en TIA Portal. En los últimos proyectos he estado trabajando más con el índice, y es una buena forma de trabajar siempre y cuando lo hagas en TIA Portal ya que te permite declarar constantes que faciliten la referencia cruzada para ver dónde se está aplicando o dando valor a un paso en concreto. Te animo a que comentes cuál es el método que más te gusta o usas, y si quieres que haga alguna entrada más en concreto con alguno de los métodos. --- # PLC Siemens S7-1200: modelos y cómo elegir > Cómo elegir un PLC Siemens S7-1200: referencias, entradas y salidas, diferencias con G2 y primeros pasos en TIA Portal. Ejemplos y fichas oficiales. Fuente: https://programacionsiemens.com/s7-1200 · Autor: Iñigo Gútiez · Publicado: 2023-04-17 · Actualizado: 2026-09-07 · Categoría: S7-1200 y S7-1500 **El PLC Siemens S7-1200 es el autómata compacto de gama de entrada de Siemens**, dentro de la familia SIMATIC S7. Es el más usado para aprender y para máquinas pequeñas y medianas, se programa con [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) y ya cuenta con una nueva generación, el S7-1200 G2. Vamos a ver las características de los PLC S7-1200 de Siemens ya que hay que conocer estos autómatas que son la gama de entrada. ### ¿Qué es un PLC S7-1200 de Siemens? Empezaremos por la definición canónica: Un PLC S7-1200 es un controlador lógico programable fabricado por Siemens AG,  una empresa alemana líder en tecnología. Este PLC forma parte de la familia de productos SIMATIC S7 y se utiliza en aplicaciones de automatización industrial para controlar y supervisar procesos. Vamos, nada que no sepamos a esta altura. Es un PLC que Siemens introdujo en el mercado en 2009. Con él también apareció la primera versión de [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) (la versión V10). En sus primeros años parecía que los S7-1200 eran los sustitutos naturales de los S7-200. De hecho, así aparecían en los diagramas de migración: [Imagen: migración S7-1200] Es decir, el planteamiento es que los S7-1200 sustituían a los S7-200 y los S7-1500 (sacados al mercado 3 años después, en 2012) serían los sustitutos de los S7-300 y S7-400. Por tanto, parecía como que los S7-1200 irían dirigidos a cosas pequeñitas, y que no estaban destinados a suplir los S7-300. Parece que ese planteamiento en realidad no ha sido así, ya que la potencia que tiene un PLC S7-1200 hace que muchas automatizaciones que anteriormente se realizaban con los S7-300 ahora se estén haciendo con los S7-1200 y no con los S7-1500, que se supone que debería ser su sustituto natural. Y es que el S7-1200 ha solapado gran parte de las automatizaciones que se realizaban con los S7-300. En muchos casos, automatizaciones que se hacían con un S7-300 por comodidad, homogeneidad, versatilidad que no te daban los S7-200 y ni que decir de los Logo! Pero no necesariamente muchas automatizaciones realizadas con los S7-300 son de mucho código y calado. Es por eso que en estos casos los S7-1200 encajan como anillo al dedo. Ni que decir tiene que tras la aparición de las [CPU S7-1217](https://programacionsiemens.com/siemens-1217c-david-contra-goliat/) en 2015 la cosa se puso muy seria debido a su potencia y versatilidad. #### ¿Dónde englobamos a los S7-1200? Hoy en día Siemens engloba los S7-1200 pisándose con la parte baja de los S7-1500: [Imagen: Posicionamiento S7-1200] Por tanto, habrá automatizaciones que bien podrán ser realizadas con un S7-1200 o con un S7-1500 de bajas prestaciones. ### Modelos S7-1200: compara referencias, no solo nombres «CPU 1214C» no identifica por sí solo un equipo. La referencia completa distingue generación, alimentación y tipo de salida. Anota también el firmware: es lo que necesitas para comprobar el catálogo de hardware de TIA Portal y las funciones disponibles. Ejemplo de CPUReferenciaE/S digitales integradasDato que conviene comprobar S7-1200 CPU 1214C DC/DC/DC6ES7214-1AG40-0XB014 entradas / 10 salidasLa ficha consultada declara 150 KB de memoria de programa/datos y 2 entradas analógicas de 0–10 V S7-1200 G2 CPU 1214C DC/DC/DC6ES7214-1AH50-0XB014 entradas / 10 salidasEs otra generación: consulta sus módulos y prestaciones; no reutilices las especificaciones del modelo anterior Fuentes de esta comparación: [ficha Siemens de 6ES7214-1AG40-0XB0](https://support.industry.siemens.com/teddatasheet/?caller=SIOS&format=pdf&language=en&mlfbs=6ES7214-1AG40-0XB0), [referencias G2 del manual V20](https://docs.tia.siemens.cloud/r/simatic_s7_1200_g2_manual_collection_eses_20/ordering-information/cpus) y [E/S digitales de la CPU 1214C G2](https://docs.tia.siemens.cloud/r/simatic_s7_1200_g2_manual_collection_eses_20/technical-specifications/cpu-1214c/digital-inputs-and-outputs). Son ejemplos concretos, no una tabla de toda la gama ni de todos los firmwares. ### Cómo elegir CPU y módulos para tu proyecto - Cuenta las señales: entradas y salidas digitales, analógicas y señales rápidas. Reserva ampliación para cambios previsibles. - Identifica cada señal: una entrada de 0–10 V no equivale a una de 4–20 mA ni a una entrada para termopar. Revisa el módulo y la conexión adecuados. - Define las comunicaciones: HMI, variadores, dispositivos remotos y aplicaciones de PC. Comprueba protocolos y conexiones admitidas por la referencia elegida. - Revisa el programa: memoria, tiempos y funciones tecnológicas necesarias. Una lista de E/S no describe por sí sola toda la carga de la CPU. - Comprueba el conjunto: alimentación, módulos, versión de TIA Portal y firmware. No compres un repuesto solo porque la carcasa diga «1214C». Para las señales del proceso, empieza por [escalado en TIA Portal](https://programacionsiemens.com/escalado-de-una-senal-analogica-en-tia-portal). Si el problema es temperatura, consulta [termopares y conexión al PLC](https://programacionsiemens.com/termopar-que-es-y-para-que-sirve) y el ejemplo de [PID_Compact con S7-1200](https://programacionsiemens.com/control-pid-de-temperatura-con-s7-1200-pid-compact). ### S7-1200 clásico y G2 G2 tiene documentación y referencias propias. Antes de migrar, compara módulos, cableado, funciones utilizadas y compatibilidad del proyecto. Que ambos se programen desde TIA Portal no convierte el cambio en una sustitución directa de hardware. Utiliza el [manual de S7-1200 G2](https://docs.tia.siemens.cloud/r/simatic_s7_1200_g2_manual_collection_enus_20) correspondiente a tu versión. La elección para una máquina existente debe tener en cuenta repuestos, programa y puesta en marcha. Para un proyecto nuevo, compara las prestaciones necesarias con las referencias disponibles, sin asumir que la opción con más memoria resuelve cualquier necesidad. ### Primeros pasos para programar un S7-1200 Empieza identificando la CPU en TIA Portal, definiendo variables y comprobando un programa pequeño. Para practicar la lógica puedes utilizar simulación cuando tu configuración sea compatible. Después añade temporizadores y una secuencia sencilla, verificando cada estado antes de ampliar el programa. Tienes una ruta práctica en [introducción a LADDER](https://programacionsiemens.com/programacion-en-ladder-1), [temporizadores en TIA Portal](https://programacionsiemens.com/temporizadores-en-tia-portal) y [conexión con Factory I/O](https://programacionsiemens.com/como-conectar-un-plc-1200-factory-io). ### Formación en S7-1200 Para empezar con una ruta guiada, revisa el [Curso Express de TIA Portal](https://programacionsiemens.com/cursos/curso-express-de-tia-portal). Si buscas el temario amplio, compara sus contenidos con el [curso completo de TIA Portal para S7-1200](https://programacionsiemens.com/cursos/tia-portal-cpu-1200-completo) y elige según tu punto de partida. --- # Lenguaje KOP o Ladder: el más usado para programar PLC > Lenguaje KOP o Ladder: descubre por qué es el más usado para programar los PLC de Siemens, sus orígenes y las razones reales de su dominio absoluto. Fuente: https://programacionsiemens.com/lenguaje-kop-o-ladder · Autor: Iñigo Gútiez · Publicado: 2023-04-14 · Actualizado: 2023-04-14 · Categoría: Programación PLC El **Lenguaje KOP** es el más usado cuando programas los PLC de Siemens. Ya está, no hay discusión. Si en tu caso particular no es así, eres la rara avis dentro de la automatización industrial ya que fuera de tu entorno y mayoritariamente no verás un proyecto realizado con Step7 o con TIA Portal en el que el lenguaje KOP (o ladder) no sea el rey. Sí, puede haber excepciones como todo en esta vida, pero de media, y por mucho, es el vencedor. ### Lenguaje KOP en TIA Portal El lenguaje KOP (Kontaktplan) no deja de ser el lenguaje de escalera o lenguaje ladder dicho en perfecto alemán. Las razones por las que el lenguaje ladder es el más usado podemos encontrarlas en: - Su antigüedad - Su disponibilidad - Su mantenibilidad - Facilidad de uso y comprensión. #### La antigüedad del lenguaje KOP El lenguaje Ladder (o lenguaje de contactos) fue inventado a mediados del siglo XX, en la década de 1960. En aquellos días, la programación de controladores lógicos programables (PLC) se realizaba mediante interruptores y relés, y se requería una gran cantidad de trabajo manual para configurar y conectar los componentes. La idea de crear un lenguaje de programación para PLC se originó para simplificar y automatizar el proceso de programación. El lenguaje Ladder[se diseñó para parecerse a un diagrama eléctrico](https://es.wikipedia.org/wiki/Lenguaje_ladder), con contactos y bobinas representados como líneas horizontales y verticales que se interconectan en una forma similar a una escalera. Los programadores podían entonces dibujar y conectar los componentes de su programa de la misma manera que harían con un diagrama eléctrico. El lenguaje KOP se expandió rápidamente en popularidad y se convirtió en el lenguaje de programación estándar para los controladores lógicos programables (PLC). Según la industria de la automatización crecía, los fabricantes de PLC adoptaron el lenguaje Ladder y lo incorporaron en sus productos, lo que permitió a los programadores escribir programas más fácilmente y con mayor eficiencia. A medida que la tecnología evolucionaba, el lenguaje Ladder también se expandió, con la incorporación de nuevas funciones y características para facilitar la programación. #### El lenguaje KOP de Siemens Siemens introdujo el lenguaje KOP en sus controladores lógicos programables (PLC) por primera vez en 1979, con la presentación de la serie Simatic S5. En ese momento, el lenguaje Ladder se convirtió en uno de los lenguajes de programación estándar para los PLC de Siemens, junto con otros lenguajes como el lenguaje de lista de instrucciones (AWL) y el lenguaje de bloques de funciones (FUP). Desde entonces, Siemens ha seguido mejorando y actualizando su soporte para el lenguaje Ladder en sus productos PLC. La serie Simatic S7, que se lanzó en 1995, por ejemplo, incorporó mejoras significativas en la capacidad de programación de Ladder, incluyendo la posibilidad de usar saltos y subrutinas. Para que lo pongamos en contexto, el lenguaje SCL (Structured Control Language) fue introducido por Siemens en el año 1998 para ser utilizado en sus controladores programables (PLC) de la serie Simatic S7-300 y S7-400. Es decir, el lenguaje KOP o ladder lleva ahí toda la vida, y eso siempre es una razón para que se use mucho. #### Disponibilidad El lenguaje KOP (ladder) es uno de los lenguajes de programación más utilizados en la programación de controladores lógicos programables (PLC) y es soportado por la mayoría de los fabricantes de PLC en el mercado. Algunos de los fabricantes de PLC que usan el lenguaje Ladder incluyen: - Siemens - Allen-Bradley (Rockwell Automation) - Mitsubishi Electric - Omron - Schneider Electric - ABB - Panasonic - Delta Electronics - Hitachi - Keyence Es decir, todas las grandes compañías tienen disponible este lenguaje de programación en sus autómatas, lo cual hace que pasar de trabajar con un fabricante a otro sea sencillo al tener lenguajes en común. Por otro lado, como sabes, hay varios lenguajes de programación para los autómatas de Siemens cuando programas en TIA Portal. Hoy en día, para la serie [S7-1200](https://programacionsiemens.com/s7-1200) tenemos los siguientes lenguajes - KOP o ladder - FUP o diagrama de contactos - SCL o texto estructurado Para la serie S7-1500 el abanico se abre un poco más ampliando el catálogo con: - AWL o lista de instrucciones - Grafcet o diagrama de control de etapas - CEM o matriz de causa y efecto. Bien, la cosa como ves es que con los PLC de Siemens más sencillos, tienes tres lenguajes mientras que con los más potentes la cosa llega hasta los 6 a día de hoy. El lenguaje KOP para empezar lo puedes usar en todas las gamas de productos SIMATIC de Siemens, cosa que no puedes hacer con todos los lenguajes. Y como hemos visto, el lenguaje KOP está presente en todos los fabricantes de PLC importantes. Pero sí pasa con otros lenguajes en los que de saque no posea lenguajes como pueda ser SCL , Grafcet, CEM etc. #### Mantenibilidad del lenguaje KOP El lenguaje KOP es un lenguaje gráfico, y por lo tango visual. Utiliza símbolos de contactos y bobinas, lo que hace que sea fácil de leer y comprender la lógica de programación. Esto puede ayudar a simplificar el proceso de mantenimiento y resolución de problemas. Cuando te enfrentas a una avería, el poder ver qué condición falta o sobra porque se ve a simple vista, es un gran aliado de mantenimiento. Porque en general vas a ver que la máquina se ha parado en un punto del programa y aislándote de cuáles son el resto de condiciones, vas a ver cuál no y de ahí poder tirar hasta dar con la solución al problema. Esto en otros lenguajes como AWL o SCL se hace mucho más complejo al no ser lenguajes visuales y no ver en cuestión de un segundo qué condición no se está cumpliendo. #### Facilidad de uso y comprensión Como hemos visto hasta ahora, el lenguaje KOP es un lenguaje que nació para transcribir los esquemas eléctricos a un formato electrónico que fuera sencillo de entender por todo el mundo. Es decir, es un lenguaje específicamente diseñado para el entendimiento de cualquier técnico eléctrico. No disponemos de ningún lenguaje de PLC de Siemens cuyo foco haya sido este. Muchas empresas prefieren y obligan por contrato usar el lenguaje KOP o ladder por defecto, y que sólo si no se puede realizar en ladder, entonces puedes usar otros lenguajes como AWL o SCL con su debida justificación que deberá ser aprobada por el responsable pertinente del proyecto de automatización. Es normal: cualquier técnico que sepa interpretar un esquema eléctrico sabrá interpretar la mayoría de las instrucciones del lenguaje KOP, y con una mínima formación en comparación con otros lenguajes se hará con él. ### Conclusión sobre el uso del lenguaje KOP En definitiva, al lenguaje KOP le queda mucha vida y es lógico que sea el más utilizado. Si bien es cierto que el uso de lenguajes de alto nivel poco a poco van ganando terreno, no olvidemos que no todo a día de hoy debe ser programado con SLC por el simple hecho de que se puede programar. Tal y como yo lo veo, los lenguajes de alto nivel se deben usar para lo que están concebidos. No hay nada como bajarse el manual de SCL de Siemens, leerse los primeros párrafos y ver para qué está pensado: cálculos matemáticos, manejo de datos, arrays... pero no para realizar un paso a paso, aunque puedas. ### ¿Qué te ha parecido? Espero tus comentarios respecto al uso del lenguaje KOP. No quiero crear controversia con este artículo, solo exponer las razones por las que hoy por hoy, el lenguaje KOP es el rey. Recuerda que si quieres formarte en este lenguaje y en otros, tienes el **[curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/)** --- # POO en TIA Portal: qué puedes aplicar y qué no en un PLC > ¿Se puede programar orientado a objetos en un PLC Siemens? Herencia, encapsulación y polimorfismo: qué ofrece TIA Portal hoy y qué queda fuera. Fuente: https://programacionsiemens.com/programacion-orientada-a-objetos-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2023-04-11 · Actualizado: 2023-04-11 · Categoría: Programación PLC Antes de comenzar, es importante destacar que la **programación orientada a objetos en TIA Portal ** es incompleta y rudimentaria si bien tiene algunas características de este paradigma de programación. En este artículo, nos centraremos en la implementación de la Programación Orientada a Objetos (OOP en inglés) en los PLC y analizaremos qué partes están disponibles en TIA Portal y cuáles no. Es importante señalar que nos enfocaremos exclusivamente en los PLC, ya que la aproximación a la POO puede variar en otros componentes y dispositivos. ### ¿Qué es la Programación Orientada a Objetos? La POO, en términos generales, es un paradigma de programación que se basa en la creación y manipulación de objetos y clases. La idea detrás de este paradigma es que la programación se asemeje a la realidad, donde existen objetos y entidades con características y propiedades únicas, como por ejemplo coches, personas o gatitos adorables. #### ¿Qué es un objeto? Un objeto será un ente con identidad propia que se distingue del resto de objetos por sus características y métodos. Cada objeto, tendrá una serie de características o atributos (color de pelo, altura, peso, nombre..) y una serie de métodos (funciones) que pueden realizar (andar, correr, mirar, hablar, saltar...) Así, si tienes dos gatos y un perro en casa, cada uno de ellos tendrá su propia identidad y serán un objeto dentro de este paradigma. Llevándolo a las personas, podremos tener dos gemelos  y decir ¡¡pero si son iguales!! Son casi iguales, porque habrá pequeñas diferencias entre ellos, y en cualquier caso, siempre tendrán un atributo que será diferente y que los distinga entre sí como es el nombre de cada gemelo. Hasta ahí, espero que todo el mundo entienda el concepto de objeto. Ahora bien... #### ¿Qué es una clase? Una clase será la *plantilla* que define un tipo de objeto. Así, tendremos la clase gato, donde podremos meter todas los atributos y métodos que tienen estos animalillos que a veces dejan que vivas con ellos. Pero sería solo la descripción genérica de lo que es un gato, no de uno en particular. Es decir, tendrá atributo peso o raza, pero sin entrar en el valor de dichos atributos. Con esta plantilla se obtendrán todos los objetos de la clase gato, independientemente de sus atributos y diferencias en los métodos. Para crear los objetos en POO lo que haces es crear una **instancia** de la clase para obtener un nuevo objeto. Esto casi lo vemos mejor aplicado a TIA Portal. ### ¿Y cómo se traslada las clases y objetos a TIA Portal? Dentro de Siemens, tienes el bloque FB. Este bloque como bien sabes trae consigo un DB donde se almacena los valores de las variables estáticas que se necesitan para un buen funcionamiento del programa. Bien, pues si usas bien los FB, este FB será la clase, y cada llamada que hagas al FB será la instancia de esa clase, y por tanto un nuevo objeto que vendrá diferenciado por un DB diferente. Por ejemplo, en TIA Portal tienes FB que usas normalmente tal vez sin caen en la cuenta que son FB y por tanto clases. Por ejemplo: los temporizadores IEC. Así, cuando arrastras el bloque de un TON no estás mas que usando la clase TON para crear un nuevo temporizador con retardo a la conexión. Pero cada vez que lo arrastras, usas un nuevo DB o en el caso de estar dentro de otro FB de un área diferente dentro de las estáticas para cara TON que uses (lo que se llama multiinstancia). Bien, esto es el concepto de clase (la caja de TON que arrastras) y cada objeto es el TON que programas con su tiempo de disparo y su DB asociado . Luego por este lado, está claro que TIA Portal y Siemens en general sí cumple con una parte de lo necesario para una POO más o menos completa. Ahora bien ¿Qué hay del resto de los pilares de la POO? ### Los pilares de la programación orientada a objetos en TIA Portal Además de las clases y objetos, podemos hablar que hay cuatro pilares fundamentales en la programación orientada a objetos como son: - Abstracción - Encapsulamiento - Polimorfismo - Herencia ### Abstracción La abstracción podríamos definirlo como quedarse con lo esencial dejando el restos de detalles que no son necesarios. En programación cuando generes una clase para generar objetos, estos seguramente tendrán un montón de características que para ti no son necesarias, y por tanto, tan solo te quedas con lo esencial de ello con lo que vas a trabajar. #### Abstacción en TIA Portal En el caso de TIA Portal, podremos crear un FB que represente la clase transportador en la que programemos una tipología de transportador sin tener en cuenta cosas como de qué material está realizado o qué altura tiene, si esto no es relevante para el manejo de este. Luego la abstracción sí podemos usarla en la programación de autómatas de Siemens a la hora de crear clases sin mayores problemas. ### Encapsulamiento El encapsulamiento trata de que la forma de modificar los datos de nuestras clases y objetos sea de una forma determinada. Que no se pueda acceder a ellos de cualquier forma, sino haciendo una petición mediante métodos determinados. Esto en TIA Portal empieza a ser un poco más rebuscado, ya que no es aplicable tan sencillo como lo puedes hacer en lenguajes de alto nivel modernos y orientados a objetos como puedan ser cualquier .net o Python, por ejemplo. En estos lenguajes la forma de trabajar con encapsulamiento sería la siguiente. Imagina que tienes una propiedad llamada "altura". Bien, esta propiedad al ser encapsulada no sería pública ni accesible desde fuera de la clase. Solo mediante dos métodos podrías recuperar su valor y por otro lado, fijar uno nuevo. De esta forma, al hacer un get_altura() recuperarías el valor de dicha altura e invocando set_altura(200) podrías fijar la altura en 200mm  (por ejemplo). Podrías decir, ¿y que diferencia hay con leer o escribir sobre la propiedad altura directamente ? Pues muy sencillo: el control de lo que se está haciendo. Al invocar los métodos, lo que estamos haciendo es ejecutar una función que nos devolverá la atura o fijará esta. En el caso de fijar la altura directamente no podemos controlar que el valor no supere los 250 o que no tenga valores negativos que harían por ejemplo que el programa dejara de funcionar. Por tanto, al hacer un set_altura(200) podemos controlar el valor pasado como parámetro para comprobar si está dentro de estos límites antes de fijar el nuevo valor, limitarlo en caso de que los supere, ignoralo, etc. También cabría la posibilidad de realizar otras operaciones como refresco o actualizaciones de otras propiedades que a su vez, tienen que cambiar al hacerlo la altura o ejecutar ciertos métodos. En definitiva da control sobre la interacción de la clase y por tanto sobre los objetos. #### Encapsulamiento en TIA Portal Lo que más se acerca a acceder a los datos de una forma ordenada conocida es el uso de los UDT ya que te obliga y facilita a la vez, el acceso a los datos de una instancia en concreto. Así, si dentro de un FB que representa un variador, y dentro de este creamos un UDT con todos los fallos posibles que puede tener, podemos acceder desde fuera a su estado mediante algo similar a "Variador 1".Alarmas.Sobrecorriente. Lo mismo si quisiéramos darle un valor a uno de los atributos de una forma externa. Lo suyo sería usar UDT en la medida de lo posible para juntar las características que se puedan aunar bajo un mismo grupo lógico. Esto facilitará el que tengamos nombres de variables que puedan ser parecidas o iguales, pero que no signifique lo mismo y por tanto, no lleven a equivocación, que es de lo que se trata. Así por ejemplo podremos tener: - "Variador 1".Mando.Marcha - "Variador 1".Alarmas.Marcha De esta forma, a pesar de poderse llamar igual, queda claro que al pertenecer a UDT diferentes (mando y alarmas),  cada una significará una cosa diferente y quedará claro a la hora de acceder a la que necesites, el grupo al que debes hacer referencia. Pero como digo, eso no es encapsulamiento, si bien tiene la característica de acceder de forma ordenada y clara a los datos de un objeto. Pero hasta ahí. ### Herencia La herencia es otra de las características de POO que en TIA Portal podemos decir que no existe como tal. En los lenguajes orientados a objetos la herencia de una clase es crear una clase derivada de la primera donde hereda todas los atributos y métodos de la clase base. Por ejemplo, tenemos la "clase animales de 4 patas", y de ahí podemos crear una clase perro que herede de la clase "animales de 4 patas" y la clase elefante, que también hereda de la misma clase base, pero que va a tener otras características y métodos diferentes a la clase perro. Otro ejemplo podría ser la clase vehículo, y de ahí que hereden la clase coche o la clase bicicleta. Así pues, la clase vehículo puede tener atributos como color, número de ruedas, o peso, y métodos como correr que compartirá con sus clases heredadas. Por su parte la clase coche tendrá atributos como cilindrada o tipo de combustible que no tendrá la bicicleta, y esta tendrá características como número de piñones o de platos que no tendrá el coche, pero ambas compartirán como digo, características como el número de ruedas o el peso. #### Herencia en TIA Portal En TIA Portal esto no existe como tal. No puedes crear un FB y crear otro FB que beba del FB anterior. El concepto no es lo mismo que la multiinstancia que es crear una clase (FB) que contenga otras clases (otros FB). Se parece en algunos aspectos, pero no es el concepto de herencia. En el caso de los UDT, tampoco puedes heredar como tal. Es decir, no puedes crear un UDT que sea hijo de otro UDT al que le añadas atributos. Lo que sí puedes hacer es crear un UDT que contengan otros UDT, pero eso no es el concepto de herencia. La forma de trabajar en estos casos será dividir el programa en diferentes FB y UDT de tal forma que crees tus clases uniendo diferentes UDT/FB bajo un mismo paraguas. Es lo más cercano que vamos a tener a la herencia, pero sin serlo. ### Polimorfismo En la programación orientada a objetos, el polimorfismo se refiere a la capacidad de los objetos de una misma clase para tomar formas diferentes y ejecutar diferentes comportamientos en función del contexto en el que se encuentren. Esto significa que, aunque dos objetos pueden ser de la misma clase, pueden actuar de manera diferente según el método que se esté llamando y los parámetros que se le pasen. El polimorfismo es una herramienta poderosa en la POO porque permite escribir código más genérico y reutilizable, lo que a su vez hace que el desarrollo de software sea más eficiente y escalable. #### Polimorfismo en TIA Portal Esto sí puedes hacerlo en TIA Portal en parte. Por ejemplo, podrás hacer que en función de la longitud de una pieza, esta sea centrada en mitad de una mesa, o que si supera determinado tamaño, el centrado no es necesario y por tanto, una vez entre, se de por centrada, sin realmente estarlo. O que dos transportadores iguales, se comporten en cuanto a velocidades de forma diferente en función de la posición dentro de la línea: ambos echaran a andar, pero las aceleraciones y velocidades pueden ser diferentes en función de su posición en la línea o la tipología de la pieza que llevan encima. Eso es polimorfismo: tener un método común que se comporta de forma diferente en función del contexto del objeto. Por tanto, sí es aplicable en gran medida. Lo que no es aplicable dentro del polimorfismo que los lenguajes orientados a objetos permiten es la sobrecarga para lograr este polimorfismo. Es decir, dentro del ejemplo vehículos, podemos tener el método "mover" en el que tanto el coche como la bici andan hacia delante. Pero ese método mover descrito en la clase vehículo puede ser "sobrescrito" si fuera necesario por la clase hijo para que cada uno de estas clases heredadas hagan cosas diferentes ante la petición de andar. Debido a que no existe la herencia, tampoco podemos pedir la sobrecarga de métodos en TIA Portal. Pero sí podemos programar para que los objetos de una clase se comporten de forma diferente, por lo que se cumple parcialmente. ### Resumen de la programación Orientada a Objetos No, TIA Portal no tiene ningún lenguaje orientado a objetos. Incluido SCL que no deja de ser Pascal, un lenguaje estructurado, no orientado a objetos. Pero hay que decir, que la aproximación existente es más que suficiente para una buena programación de las líneas de producción. Un PLC y una máquina, no es una página web o una aplicación de móvil. Tiene sus características y realidades que superan con mucho a lo que te puedes encontrar en una aplicación de escritorio por lo que no se puede pretender trabajar igual que si estuvieras desarrollando la web de la empresa. Las cosas no funcionan como quisiéramos. No he conocido a nadie de mantenimiento que se queje de la falta de POO en los PLC de Siemens.  Estos son quienes pone en marcha de nuevo la máquina cuando se avería o para y están día tras día con las máquinas cuando los programadores han vuelto a su país hace varios años. No cabe duda que la industria tiende a que cada vez haya más datos en los procesos de las máquinas. Aquí es donde sí puede crecer y desarrollarse mejor la programación orientada a objetos, pero en el tema de lógica de programa, tal vez con lo que se tiene hoy en día, y por mucho tiempo, sea más que suficiente. Y con esto no quiero decir que esté en contra de la programación orientada a objetos, ni mucho menos, sino que las líneas de producción son otra cosa, donde los datos no son lo más importante sino parte del invento, y que la lógica del programa es la que hace funcionar todo, y esto, no siempre es instanciable. Si quieres saber más sobre este paradigma de programación tienes referencias como estas: - https://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos - https://www.ibm.com/docs/es/spss-modeler/saas?topic=language-object-oriented-programming ### ¿Qué te ha parecido? ¿Te interesa darle un enfoque de programación orientada a objetos a tus creaciones con los PLC de Siemens? ¿Ya se lo das? ¿Te gustaría aprender más sobre ello y que creara algún pequeño curso sobre ello que añadir al [catálogo de cursos](https://programacionsiemens.com/catalogo-de-cursos/)? Espero tus cometarios. --- # Qué es TIA Portal y para qué sirve: guía para empezar > Qué es TIA Portal de Siemens y para qué sirve: el entorno que unifica PLC (STEP 7), HMI (WinCC) y variadores. Versiones, gamas S7-1200/1500 y cómo empezar. Fuente: https://programacionsiemens.com/que-es-tia-portal · Autor: Iñigo Gútiez · Publicado: 2023-04-03 · Actualizado: 2026-07-14 · Categoría: TIA Portal **TIA Portal (Totally Integrated Automation Portal) es el entorno de ingeniería de Siemens** que reúne en un solo programa todo lo necesario para automatizar una máquina: programar el PLC, diseñar las pantallas HMI y configurar los variadores. En vez de una herramienta distinta para cada cosa, TIA Portal lo unifica con datos compartidos y una interfaz común. Es, hoy, el software de referencia para trabajar con autómatas Siemens. Vamos a ver qué es exactamente, cómo está organizado, qué hardware maneja y por dónde empezar. ### ¿Qué es TIA Portal? TIA Portal es la plataforma de ingeniería con la que Siemens sustituyó a las herramientas clásicas (el antiguo STEP 7 v5.x / SIMATIC Manager, WinCC flexible…). «Totally Integrated Automation» resume su idea: un único proyecto integra el PLC, la visualización y los accionamientos, de modo que una variable que declaras en el PLC la usas directamente en la pantalla sin volver a definirla. Dentro de TIA Portal conviven varios productos: - STEP 7 — la programación de los PLC (SIMATIC S7). - WinCC — las pantallas HMI y los sistemas SCADA. - SINAMICS Startdrive — la puesta en marcha de variadores. - STEP 7 Safety — la programación de seguridad (F). - S7-PLCSIM — el simulador de PLC para probar sin hardware. ### ¿Para qué sirve TIA Portal? Sirve para el ciclo completo de un proyecto de automatización: configurar el hardware, programar la lógica del PLC, crear la interfaz de operador, ajustar los variadores, simular, cargar en el equipo y diagnosticar averías. Todo desde un mismo sitio y con un mismo lenguaje de datos, lo que reduce errores y tiempo. ### Las dos vistas: portal y proyecto Cuando abres TIA Portal te encuentras con dos formas de trabajar, y conviene conocerlas desde el principio: - Vista del portal: organizada por tareas («Crear PLC», «Programar», «Visualización»…). Es la puerta de entrada, cómoda cuando empiezas. - Vista del proyecto: el árbol completo del proyecto con todos los editores. Es donde se trabaja de verdad en el día a día, con acceso directo a la configuración de dispositivos, bloques, tablas de variables, trazas, etc. ### Cómo se organiza un programa: OB, FB, FC y DB El programa de un S7 no es un bloque monolítico: se estructura en **bloques**, y entender los cuatro tipos básicos es clave para programar bien: - OB (bloques de organización): el punto de entrada que llama el sistema operativo del PLC. El OB1 es el ciclo principal; hay otros para arranque, interrupciones o gestión de fallos. - FC (funciones): bloques de código sin memoria propia, para lógica reutilizable. - FB (bloques de función): como las FC pero con memoria (un DB de instancia), ideales para objetos que guardan estado (un motor, una válvula…). - DB (bloques de datos): donde viven los datos del programa (variables, estructuras, recetas…). Estructurar el programa en FB/FC reutilizables es lo que separa un código de aficionado de uno profesional. ### Qué PLC y hardware soporta Con la edición adecuada de STEP 7, TIA Portal programa toda la familia SIMATIC: - S7-1200 — la gama compacta, ideal para empezar y para máquinas pequeñas/medianas. Ya existe la nueva generación S7-1200 G2. - S7-1500 — la gama de altas prestaciones, incluidas las CPU tecnológicas 1500T (motion), las Software Controller y las redundantes R/H. - S7-300 y S7-400 — gamas antiguas (legacy), aún soportadas. - ET 200 — periferia descentralizada, con sus propias CPU. - SINAMICS — variadores (G120, S210, los nuevos G220/S220…) vía Startdrive. ### Los lenguajes de programación TIA Portal admite los lenguajes de la norma IEC 61131-3 más los propios de Siemens: **KOP** (esquema de contactos, LAD), **FUP** (funciones, FBD), **AWL** (lista de instrucciones, STL), **SCL** (texto estructurado, tipo Pascal) y **GRAPH** (secuencias tipo GRAFCET). Puedes mezclar lenguajes en un mismo proyecto según lo que mejor encaje en cada bloque: KOP para lógica de contactos, SCL para cálculos y bucles, GRAPH para secuencias… ### Diagnóstico y puesta en marcha Una de las grandes ventajas de TIA Portal es lo integrado que está el **diagnóstico**. Puedes ponerte «online» con el PLC y ver el programa ejecutándose en directo, forzar y observar variables con las **tablas de observación**, y consultar el **búfer de diagnóstico** cuando algo va mal (por qué la CPU se ha ido a STOP, qué módulo falla…). Es la herramienta que más usarás en planta. ### TIA Portal frente al STEP 7 clásico Si vienes del STEP 7 v5.x (SIMATIC Manager), el cambio grande es la **integración**: PLC, HMI y drives en un mismo proyecto y con datos compartidos, direccionamiento simbólico por defecto y bloques optimizados. El clásico sigue vivo solo para mantener instalaciones antiguas de S7-300/400; todo lo nuevo se hace en TIA Portal. ### Versiones de TIA Portal Siemens saca una versión mayor al año, normalmente en noviembre (feria SPS de Núremberg). La **versión actual es TIA Portal V21**, presentada en noviembre de 2025. Entre sus novedades destacan: - Control de versiones tipo Git («SIMATIC Source Documents»): por primera vez puedes exportar bloques (KOP/FUP/SCL, DB, UDT…) a un formato de texto legible y compararlos/versionarlos con Git y herramientas de diff. - WinCC Unified mejorado (nuevo editor de pantallas, servidores redundantes). - Engineering Copilot, un asistente de IA generativa para TIA Portal — importante: es un producto de pago aparte (en la nube), no viene incluido en la instalación. Una licencia de una versión te habilita también las anteriores, así que trabajar con V21 no te obliga a dejar proyectos hechos en V17-V20. ### Cómo empezar con TIA Portal Puedes probarlo sin gastar nada: Siemens ofrece una versión de prueba de 21 días. Te cuento cómo conseguirla, legal, en [cómo descargar TIA Portal gratis](https://programacionsiemens.com/como-descargar-tia-portal-y-gratis/), y qué licencia necesitas después en [qué licencia comprar](https://programacionsiemens.com/que-licencia-comprar-para-programar-en-tia-portal/). Para practicar sin PLC físico, combina PLCSIM con un simulador de planta. ### Preguntas frecuentes **¿TIA Portal es lo mismo que STEP 7?****No exactamente: STEP 7 es la parte de programación del PLC *dentro* de TIA Portal. TIA Portal es la plataforma completa (STEP 7 + WinCC + Startdrive…). ¿Qué necesito para empezar?****Un PC con Windows que cumpla los requisitos, el Trial de TIA Portal y ganas de practicar. Con PLCSIM ni siquiera necesitas un PLC físico al principio. ¿Qué versión uso para aprender?** La actual (V21) o cualquier reciente; los fundamentos son los mismos. Usa la que te pida tu curso o tu máquina. --- # Modos de trabajo de una máquina > TIA Portal: descubre los modos de trabajo de una máquina (automático, manual, homing, paso a paso) y cómo decidir cuáles necesita tu proyecto de control. Fuente: https://programacionsiemens.com/modos-de-trabajo-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2023-02-17 · Actualizado: 2026-07-14 · Categoría: Programación PLC Una de las cosas que tenemos que decidir a la hora de confeccionar nuestra futura máquina son los modos de trabajo en TIA Portal con los que va a contar. Normalmente solo son necesarios dos, manual y automático, pero en función de la tipología, y sobre todo de la complejidad de la máquina puede tener alguno más. Así, podemos programar unos cuantos en nuestra máquina: - Automático - Homing - Paso a paso - Manual - Paro - Servicio /Mantenimiento Al margen de que tú puedas llamar a uno u otro de diferente forma, vamos a echar un vistazo qué implica cada uno de ellos. De lo que se trata, es no tanto de cómo se llame (seguramente tú los llames de otra manera) sino de cómo de automático y protegida está la máquina de cara a errores humanos por parte del operario de producción o de mantenimiento. ### Los modos de trabajo en TIA Portal #### Modo automático Es el modo habitual en la que nos encontraremos las máquinas cuando están funcionando. La máquina funciona sin intervención humana, siguiendo un programa o un ciclo preestablecido. El riesgo de error de operación del usuario es mínimo en este modo, siempre que el programa o el ciclo estén bien diseñados y verificados. El usuario solo debe supervisar el funcionamiento de la máquina y actuar en caso de emergencia o anomalía. De cara a las velocidades de actuación en el modo automático se usan todas las velocidades necesarias para hacer el ciclo lo más eficiente posible. Derivaciones del modo automático habrá muchos, pero dos de ellos son: - Auto Continuo: en el que la máquina ejecuta un ciclo completo, y al terminar, comienza uno nuevo sin intervención del operario. - Auto un ciclo: en el que la máquina ejecuta un ciclo completo, y al terminar, queda a la espera de la confirmación del operario para ejecutar un nuevo ciclo, o pasar a auto continuo u otro modo. #### Modo homing Es un modo automático previo a la puesta en ciclo continuo. Lo que hace la máquina de forma automática es realizar los movimientos de forma que se coloque en una posición básica de arranque. Los movimientos en general serán en velocidad lenta para que en caso de problemas de tiempo a parar la máquina sin generar problemas. #### Modo paso a paso Este modo es un modo automático degradado. En general se usará por parte del operario en la puesta en servicio tras una parada o avería en la que la máquina no ha quedado en posición básica de arranque. En general, la máquina realizará movimientos completos del paso activo en el que esté. Es decir, si no se cumplen las condiciones para ejecutar dicho movimiento no lo hará. Pero una vez que cumpla los requisitos, la máquina podrá ejecutar un paso completo que puede conllevar el movimiento de varios actuadores de forma conjunta. Una vez terminado el paso en cuestión queda a la espera de que el operario ejecute el siguiente paso permitido. Normalmente se indica en pantalla el paso o pasos siguientes que están permitido ya que puede haber pasos que se puedan ejecutar en un orden diferente sin poner el riesgo la integridad de la máquina. De cara a las velocidades, depende un poco de cada caso. Se puede hacer que el movimiento se realice con las mismas velocidades del modo automático o bien en velocidades reducidas. #### Modo manual Este modo es un modo en el que ningún movimiento se hace de forma autónoma por parte de la máquina. La diferencia fundamental respecto a servicio/mantenimiento es que en este modo los movimientos están protegidos frente a incorrectas manipulaciones. Es decir, el movimiento para poder ejecutarse tiene que estar permitido por la lógica establecida en el PLC. De esa forma, evitamos que ante un error de pulsación no se pueda dañar la máquina. Los movimientos en este caso siempre serán en modo lento habida cuenta de que se están haciendo de forma manual. #### Modo servicio/mantenimiento Es el modo más peligroso de cara a una mala maniobra. En este modo todos los actuadores pueden ser movidos sin restricción. Está pensado para trabajos de mantenimiento en el que es necesario mover actuadores a pesar de las restricciones o porque tras una avería la máquina se ha quedado en un estado en el que la única forma de sacarla de él es moviendo individualmente actuadores. Es un modo en el que el conocimiento del estado de la máquina y su funcionamiento es clave para evitar que se puedan dañar partes de la máquina en la manipulación. En este caso las velocidades pueden ser incluso más lentas que en modo manual. Depende de la tipología de la máquina y de lo que conlleve cada uno de los movimientos. #### Modo paro Este es el más sencillo. Es el modo en el que ninguna de los movimientos, de la índole que sean, están permitidos. Se usa para parar la máquina y que no pueda hacer ningún tipo de movimiento ### La seguridad es lo primero La seguridad de las personas queda fuera de toda duda que está por encima de cualquiera de los modos de trabajo. Es decir, la supervisión y control de la seguridad tiene que estar independientemente del modo de trabajo en funcionamiento y por tanto, la máquina siempre tiene que trabajar de forma segura en todos los modos, incluyendo los modos de mantenimiento o servicio. En caso de que el operario de mantenimiento deba entrar en zonas valladas en las que es necesario acercarse a la máquina, siempre deberá de disponer de elementos de seguridad como pueden ser pulsadores hombre muerto o similar para asegurar su integridad física. Y siempre que se usen estos elementos para acceder a la zona peligrosa, los movimientos tienen que ser especialmente lentos para que el operario pueda reaccionar a tiempo. Es por ello necesario (y obligatorio) realizar la evaluación de riesgos y los AMFE de diseño para determinar los riesgos para las personas y los modo potenciales de fallo y erradicarlos o minimizarlos al máximo posible. ### Diséñalos en papel antes de programar Un consejo antes de abrir TIA Portal: pon los modos de trabajo por escrito (o en un esquema visual). Cuando tienes experiencia puede parecer innecesario, pero ayuda a tres cosas: - Pasar muy rápido de lo escrito al programa real. - Compartir el planteamiento con compañeros y colaboradores antes de picar código. - Detectar si te dejas algo o si algún modo no tiene sentido como lo estás planteando. Este diseño previo pertenece a las primeras [fases de un proyecto de automatización](https://programacionsiemens.com/fases-de-un-proyecto-de-automatizacion-en-tia-portal), cuando cambiar de idea todavía no cuesta dinero. En este vídeo te enseño el diseño de modos que preparé para una instalación real, tal cual lo haría en un proyecto: ### ¿Qué te ha parecido? ¿Qué modos de trabajo sueles usar en tus máquinas y  por qué? Este tipo de modos los vemos en los [cursos de TIA Portal que tenemos en la plataforma.](https://programacionsiemens.com) Dejadme comentarios si os interesaría alguna temática en concreto. --- # Variables en TIA Portal > Variables en TIA Portal: entiende qué son, qué tipos de datos existen y cómo usar esos trozos de memoria para leer y escribir valores en tus PLC Siemens. Fuente: https://programacionsiemens.com/variables-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2020-05-22 · Actualizado: 2020-05-22 · Categoría: Programación PLC De vez en cuando recibo alguna duda respecto del concepto de lo que son las variables en TIA Portal. La verdad es que no tiene mucho misterio si te lo cuentan, pero si se da por supuesto este concepto informático (no solamente de los PLC), puedes tener ciertas dudas que vamos a intentar solucionar hoy. A grandes rasgos, y sin entrar en terminología exacta, una variable no es mas que un trocito de memoria donde puedes almacenar valores de tal forma que puedas leer su contenido o escribir sobre él. Hasta ahí seguramente no haya mucha duda. Lo mismo que un vector, para ser un vector, tiene módulo, dirección y sentido, una variable en TIA Portal (o en cualquier otro sistema) tiene una serie de características: - Nombre o etiqueta para identificar a la variable - Tipo, ya que, por ejemplo, no será lo mismo un valor numérico entero, que un carácter. - Ancho de la variable, es decir, su tamaño. - Ámbito, que será el terreno de juego donde pueda aplicarse y trabajar con la variable. ### Nombre de las variables en TIA Portal El nombre de la variable no es más que eso, una etiqueta que identifique el área de memoria que contiene cierto valor. A la hora de nombrar las variables, puede ser que no tengas una forma estándar de nombrarlas, o puede que sí.  A lo mejor tu organización (o cliente) tiene su propia forma de nombrar las variables. De forma genérica, hay una serie de notaciones internacionales que son las más habituales que puedes ver en la programación de alto nivel. Ahora bien, el nombre tiene que ser adecuado y significativo. Puede parecer baladí, pero no lo es. Por ejemplo, podrías ver una línea de código en SCL que diga: c := a * b; Como ves, a pesar de que cada variable tiene nombre, no está para nada claro qué es cada cosa. Solo ves la operación de multiplicación. Pero podría significar infinidad de cosas. En cambio, si vieras algo así como: Espacio := Velocidad * Tiempo; ¿A que ahora está mucho más claro? Pues de esto, va el tema de la notación de variables que es bastante interesante. ### Tipo de las variables El tipo de la variable no es mas que cómo categorizar el dato que contiene la variable. Al final, la memoria no son mas que ceros y unos, y en función de cómo los leamos , la misma ristra de ceros y unos significan cosas diferentes. Esa forma de interpretar los ceros y los unos que contiene la variable, es el tipo de la variable. Como vemos en la imagen destacada del post, hay muchos tipos de variable. Pueden ser valores enteros, o dobles enteros, reales, caracteres... Pueden ser simples como un número o un valor booleano, o variables complejas o estructuradas como puede ser un array. Hay muchos tipos de variables que se pueden usar con los PLC de Siemens. Pero ademas, en los [S7-1200](https://programacionsiemens.com/s7-1200) y S7-1500 tienes muchos tipos de variables que en la serie 300 y 400, no existen. Así, por ejemplo podrás tener diferentes tipos de valores enteros: enteros y dobles enteros como tenías en la serie 300 o 400, pero tendrás también enteros pequeños, con y sin signo.. o enteros largos. Es decir, un abanico mucho más grande de lo que has podido disfrutar y sufrir en Step 7 tradicional. No voy a entrar a enumerar cada uno de los tipos, porque no es el objetivo de la entrada, y lo vemos en el** [Curso Express de TIA Portal](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/) **o en el **[Curso Completo](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200)**, pero digamos que hay todos los necesarios y más. #### UDT Un caso especial son los User-defined Data Types más conocidos como UDT. La traducción desde la lengua de Shakespeare a la de Cervantes es "Tipos de Datos definidos por el Usuario". Exacto, con los PLC de Siemens (tanto en clásico como en TIA Portal) puedes definir nuevos tipos de datos además de los que traen *de saque.* En general serán tipos complejos que bajo una estructura, contienen otros tipos más simples. Por ejemplo, podremos definir el tipo "Variador" y dentro de este tipo contenga tipos más simples como Velocidad y Aceleración de tipo real. ### Ancho de la variable Hemos comentado que la variable es un trozo de memoria donde contener un dato. Pero, ¿cuán grande es? Ahí es donde no es lo mismo un SINT que un INT o un DINT, ya que siendo todos tipos enteros, SINT (small int) ocupará solo un byte, INT dos bytes, y DINT (doble int) 4 bytes... y así con todos los tipos, claro. Esto delimita el valor máximo y mínimo que puede tomar la variable, ya que un SINT, solo podrá valer entre -128 a 127 mientras que un INT podrá valer desde -32768 a 32767 al ocupar dos bytes, y por tanto, poder contener más información diferente. Ni que decir tiene que un DINT será capaz de almacenar un valor muchísimo más grande que un INT por contener 4 bytes. Pero ojo, porque como ves, estamos empezando a ligar lo que es el ancho (una palabra o dos bytes) con el tipo. Quiero decir con esto, que un Real, al igual que un DINT ocupan ambos tipos de variable 4 bytes. Pero no tiene nada que ver leer 4 bytes  de memoria e interpretarlos como un DINT, que interpretarlo como un REAL ya que no se parece en nada como vemos en el **[Curso de TIA Portal Express](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/)** o en el **[Curso Completo de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200)**. Los ceros y los unos serán los que sean, pero para que tenga algún sentido hay que interpretarlos según un tipo de variable. Si no se pasa por el tamiz de un tipo, 1 byte solo son 8 bits y punto. Un "10000011" no significa nada. Y alguno dirá, sí que significa algo, eso es 131. ¿Estás seguro? Será 131 si lo interpretas como un USINT, es decir, como un entero pequeño sin signo, que va desde 0 a 255, y por tanto sí, es 131. Pero si lo interpretas como un SINT cuyos límites son de -128 a 127 será un valor negativo, concretamente -125. ¿Cómo te has quedado? El mismo ancho, 1 byte, con los mismos bits a cero o a 1,  puede tomar dos valores enteros completamente diferentes en función del tipo de variable que sea. Y es muy importante el concepto de anchura, porque existen las variables de tipo byte, de tipo word y de tipo dword que tienen de ancho lógicamente, lo mismo que el nombre del tipo. El tipo byte ocupará un byte, el tipo word ocupará un word, palabra o dos bytes, y el tipo dword ocupará un dword, doble word o doble palabra o 4 bytes. Por tanto, no es lo mismo que un INT ocupe un Word con que el tipo INT sea lo mismo que el tipo Word, porque no lo es. ### Ámbito de las variables en TIA Portal El ámbito de la variable no es mas que el contexto en el que se puede usar dicha variable. Así, hay dos grandes grupos de variables en TIA Portal: - Variables locales - Variables globales #### Variables locales Las variables locales son aquellas que se declaran dentro de un bloque (OB, FC o FB) y solo son usadas dentro de ese bloque. No se puede acceder a ellas desde fuera. El ejemplo más claro son las variables temporales que se pueden declarar dentro de los bloques citados. Se usan dentro de un FC, OB o FB, pero no son accesibles desde fuera de dicho bloque. #### Variables globales Las variables globales son aquellas variables que puedes usarlas en cualquier parte del programa, y desde diferentes bloques si lo deseas. Las variables globales pueden ser las entradas, salidas, marcas, variables declaradas en los DB, temporizadores S7, contadores... #### Estaticidad de las variables Las variables pueden ser estáticas  o no, es decir, pueden recordar su valor entre llamadas del programa principal, o olvidar su valor una vez que se ejecute el bloque donde ha sido declarada y ejecutada. Es decir, si yo a una variable le doy valor así: Velocidad := Velocidad +1; y dicha variable es global (una marca MW, por ejemplo), cada vez que se ejecute, Velocidad irá incrementándose en una unidad, porque recuerda su último valor... no se resetea. Es estática. Las variables temporales, en cambio, no son estáticas, y por tanto, este mismo caso haría que la variable Velocidad no se fuera incrementando, y al leer el valor después de ejecutar la sentencia, siempre valdría 1. ### ¿Qué te ha parecido? Imagino que todo lo que te he contado sobre las variables en TIA Portal, lo sabías, bien porque ya llevas mucho tiempo programando y esto no te pilla de nuevo o porque lo has visto en alguno de los**[cursos de la plataforma](https://programacionsiemens.com/listado-cursos/) **o en cualquier otro sitio. Pero si estás comenzando en la programación, estos conceptos puede que no los tengas del todo claro, y espero que te haya ayudado a entender mejor qué es una variable en TIA Portal. Ni que decir tiene, que si necesitas formarte porque estás muy pez, puedes tomar el **[Curso Express de TIA Portal](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/)** con el que comenzar a crear tus proyectos con los PLC  y pantallas de Siemens. --- # Fases de un proyecto de automatización en TIA Portal > Fases de un proyecto de automatización en TIA Portal: una guía orientativa con los pasos clave para abordar tu instalación o máquina con PLC Siemens. Fuente: https://programacionsiemens.com/fases-de-un-proyecto-de-automatizacion-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2020-01-22 · Actualizado: 2020-01-22 · Categoría: TIA Portal Hoy vamos a hablar sobre fases de un proyecto de automatización en [TIA Portal](https://programacionsiemens.com/que-es-tia-portal/) que puede ser muy interesante para los que empiezan, y no tanto para los que llevan mucho tiempo programando. Además, esto no es la guía definitiva, sino una orientación de las fases que puedes tener a la hora de realizar un proyecto de automatización. Ni que decir tiene que puede que tú lo hagas de otra forma, en otro orden, o que tenga más pasos de los que yo te voy a mostrar aquí. Venga, al tema. ### 1. Entender qué es parte del proyecto y qué no es Puede parecer una perogrullada, pero no lo es. Conocer muy bien la instalación o máquina que queremos automatizar es muy importante. Para ello debemos exigir a nuestro cliente (interno o externo) que nos describan qué debe hacer la máquina, y por tanto, qué no está pensado que haga. Esto es importante porque te encontrarás con clientes que por no haber definido correctamente qué debe hacer la instalación o aplicación, una vez terminada es cuando empiezan a pedir cosas. Si es un cliente interno, además de un dolor de cabeza y algún mosqueo, no pasará nada. Pero si el cliente es externo, es un problema ya que se habrá presupuestado sobre lo que se ha pedido, y por tanto, si las cosas no quedan por escrito y claras, luego llegan los malos entendidos, enfados, y los yo creí que, yo pensé que. Todo lo que esté escrito, escrito queda y así no hay confusión alguna. Además, también te puede pasar al revés, es decir, que diseñes y programes algo que el cliente, simplemente no te ha pedido. Que no va a usar, y que por tanto, no va a pagarte por ello. Aún con todo bien aclarado seguro que en la puesta en marcha habrá cosas que cambiar, modificar y añadir. Es normal. La cosa es si lo que hay que cambiar lo resuelves en una mañana o en dos semanas porque lo que se pide te rompe todos los esquemas respecto a cómo has planteado la automatización. ### 2. Lista de entradas y salidas. Una vez tengas claro qué debe hacer, tendrás que empezar a definir el cómo. El primer paso para definir este cómo es hacer un listado de todos los elementos que vas a necesitar. Con ello, tendrás una idea global del número de tarjetas de entradas y salidas que vas a necesitar, el tipo de tarjetas y como no, qué PLC necesitas. El elegir el PLC es un poco la mezcla de muchas cosas: - Interfaces necesarias (2PN, PN-DP, 3PNDP etc) - Tipo de automatización, y por tanto de rapidez de cálculo. - Cantidad de I/O - Tamaño de la memoria de trabajo necesaria - Presupuesto disponible (siempre es cuestión de dinero) La lista de entradas y salidas es importante tenerla clara. Esto ayudará a que luego no haya sorpresas, que no haya espacio en el PLC o tengas que hacer pequeñas chapucillas. El nombre que debes dar a las etiquetas de las I/O lo tienes que elegir tú. Puede que tengáis una forma específica de nombrarlo. Si no tienes una forma específica de darle nombre a las señales, una buena forma de identificarlo es asignarle además de un nombre descriptivo, el identificador que tenga en los esquemas eléctricos. Así luego tienes más facilidad para mantenerlo todo. ### 3. HMI En muchas ocasiones suelo comentar de la importancia del HMI. En general se le da mucho menos importancia de la que realmente tiene. Recuerda que es el Human-Machine Interface, o en la lengua de Cervantes, el modo (interfaz)  en el que el operario puede comunicarse con la máquina. ¿No te parece que es muy importante? Por ello, en una fase inicial, sería conveniente que hagas una especie de Mockups, bien en el propio TIA Portal, o simplemente en papel. Y pásale los dibujos a tu cliente. Que te de feed-back de si le parece bien el número de controles, su disposición etc. Simplemente el hecho de colocar todos los controles en las imágenes sin darle inteligencia, te va a ayudar a organizar mentalmente cómo tiene que funcionar el programa. Luego ya le darás inteligencia y le darás aspecto más profesional, pero al menos, sabrás que no te estás dejando nada. ### 4. Descripción funcional Si te has fijado, las fases de la automatización van de más genérico, a más concreto. Ahora toca aterrizar todas las ideas que has ido recopilando en las fases 1 a la 3 y dar una descripción de cómo va a funcionar todo el conjunto. Realmente este paso debería ir un poco conjunto con la fase 3. Y sí, deberías hacerla. Porque así, obligas a tu cliente a que revise a como tienes pensado que va a trabajar la máquina. Y habrá cambios, o cosas que no estaban pensadas y se enciendan algunas bombillas. No se trata de escribir un libro, pero sí de describir cada zona, qué hace y cómo lo hace. Deberás describir los modos de trabajo (manual, auto, mantenimiento..) y todo lo que tengas pensado realizar. Esto hará que todas las ideas se aterricen, que se llegue a acuerdos de cómo va a funcionar la máquina y que luego no haya sustos. ### 5. Diseño A partir de aquí, empieza la caja negra de cara al cliente en el sentido que seguramente vas a tener más manga ancha en cómo realizar el programa. Más allá de las posibles normas de programación, como ya tienes qué debe hacer la máquina, te toca diseñar los módulos FB o FC que van a intervenir en el programa. Si vas a tener transportadores, centradores, robots, comunicaciones etc, es ahora cuando definirás en detalle  de qué variables se intercambiarán entre los equipos o zonas,  de qué tipo etc. Esta parte está muy ligada al apartado anterior, ya que al hacer la descripción funcional te fuerzas a pensar cómo funciona y te darás cuenta si hay bloques que vas a poder reutilizar, cómo dividir la línea, y por tanto su programación posterior. ### 5. Aporrear las teclas. Una vez hecho todos los pasos anteriores, solo queda la programación en sí. Más o menos, como en la secuencia de la película Amadeus: **“Mozart**, ¿dónde está mi música?”. «Aquí, la tengo aquí -contesta él señalando a su cabeza-. Todo lo demás es garabatear, garabatear, garabatear…”. Bueno, como ni tú ni yo somos Mozart, lo mejor es haberlo dejado todo por escrito además de tenerlo en la cabeza. Ahora se trata de programar. Lo primero que suelo hacer es definir las formas de trabajo: manual, automático... esas cosas. Posteriormente tendrás que decidir a qué le hincas el diente. Dependerá de cada caso, por lo que no hay un orden en concreto. Lo que si te recomiendo que vayas programando el PLC a la vez que vas completando el HMI. No tanto en su estética, pero sí ir poniendo las indicaciones y las variables de los botones, sensores que haya que mostrar, esas cosas. Además, podrás usar el simulador del PLC para comprobar, que al menos, las órdenes en manual funcionan correctamente hasta la bobina o lo que corresponda. Luego tocará hacer las secuencias automáticas. ### 6. Puesta en marcha Cuando llegue el día, tocará ser metódico a la hora de probar todo, y estar seguro de que todo está en su sitio: - Probar las seguridades. Es importante que lo primero que se compruebe (dentro de lo que sea posible) es que todas las seguridades funcionan correctamente. - Comprobar las entradas y asegurarse que cada sensor funciona, y llega al PLC a la entrada que le corresponde. Puede que haya alguna entrada bailada en el cableado, o que simplemente no funcione correctamente, por lo que hay que comprobar esto, lo primero. - Comprobar los actuadores: al igual que con las salidas, comprobar que todas las salidas van donde tienen que ir, y funcionan correctamente. - Realizar los movimientos en modo manual y a velocidad controlada. Así aseguramos que los recorridos son los adecuados, que las posiciones de parada funcionan y que todo está ok en ese aspecto. - Comenzar a probar los movimientos y secuencias automáticas. Poco a poco, a baja velocidad para ver que todo funciona como debe. También comprobar que el HMI funciona correctamente, que todo está representado como debe y que en general, no hay fallos. Y poco más. poco a poco hasta que todo quede funcionando correctamente. Seguramente en la puesta en marcha saldrán cosas para modificar. Es normal, y no debería ser un problema si todo ha estado bastante atado previamente. Es inevitable que haya pequeños cambios o ideas que mejoren el programa cuando lo pones en marcha. La cuestión es no esperar al último momento para compartir con los clientes qué es lo que tienes pensado hacer, para que cuando llegue la puesta en servicio todo vaya mucho más fluido. ### ¿Qué te ha parecido? No sé si es más o menos como los sueles hacer tú. Estaría bien que te animaras a comentar cómo lo haces. Este post lo dejaré dirigido desde el **[curso Express de TIA Portal](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/)** para que los alumnos puedan revisar el listado de pasos para crear sus primeras creaciones. Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Preguntas y respuestas III > Programación PLC Siemens: resolvemos dudas reales de lectores sobre memoria volátil y no volátil, los cursos y otras cuestiones prácticas del día a día. Fuente: https://programacionsiemens.com/preguntas-y-respuestas-iii · Autor: Iñigo Gútiez · Publicado: 2019-11-13 · Actualizado: 2019-11-13 Una nueva semana, intento responder algunas preguntas que me habéis realizado durante estas últimas semanas. Algunas referentes a los PLC de Siemens, otras respecto a los cursos y otras de diferentes índoles. Tengo bastantes preguntas, así que tendré que irlas respondiendo en diferentes tandas. Vamos a ello: ### Preguntas y respuestas IV Roberto, lector del blog, me pregunta un par de cuestiones bastante básicas: #### ¿Qué es la memoria volátil y no volátil en un PLC? Hay que decir que esto no solamente es aplicable a los PLC, sino a cualquier equipo electrónico. La memoria volatil es aquella que se pierde cuando el equipo deja de ser alimentado, mientras que la memoria no volátil, es la que es remanente a pesar de que el equipo se quede sin alimentación. #### ¿Qué es una variable temporal en un programa de PLC? Una variable temporal, como vemos en cualquiera de los cursos, es una variable de ámbito local al bloque en la cual se declara (en la interface del bloque) y que solo se tiene acceso desde el propio bloque (de ahí que sea local). Además, no guarda la información entre los ciclos de scan del PLC. Espero que a Roberto le hayan quedado estos dos conceptos básicos aclarados. Si tú tienes este mismo tipo de dudas, tal vez te pueda ayudar un curso de iniciación como el **[Curso Express de TIA Portal](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/).** #### ¿Qué Raspberry me compro? Humberto, también lector del blog me escribe desde Argentina para comentarme lo siguiente: **[..] tengo la intención de comprarme un kit completo  Raspberry , ¿qué me recomienda.., con que micro?. Lo que veo es mucho PI 3 B, poco muestran de PI 4 Bueno, aquí depende un poco para qué lo quieras. Si lo quieres para crear un IOT como usamos en el Curso de Industria 4.0 con la raspberry 3 es suficiente. Ahora bien, yo tengo tanto la Pi3 y la Pi4 con 4GB, y las prestaciones se notan, por lo que si el presupuesto lo permite, sin duda me iría a por una Raspi 4 con al menos 2GB de RAM. Pero como le comenté a Humberto, depende un poco lo que quieras hacer y para qué, cosa que no me comentaba en el email. La Raspi 4 la puedes encontrar ya en Amazon en este enlace. Como verás con la direrencia que tiene respecto a la Raspberry 3+ (enlace aquí), creo que merece la pena irse a por la 4. Pero es una cosa que tiene que decidir Humberto. Eso sí, la raspi 4 se calienta bastante por lo que yo le pondría un disipador con un ventilador. En mi caso, compré este que va bastante bien. #### ¿Qué hace el BEA? Adrián, también lector del blog, pregunta lo siguiente: Buenas,tengo una pregunta. Cuando el programa de dentro del salto se ejecuta y llega al BEA, el programa vuelve a la primera linea,o vuelve a la linea en la que se llamó al salto? Gracias de antemano. Y la respuesta es, ni una cosa ni la otra. BEA es una instrucción que lo que hace es terminar la ejecución del bloque en curso de forma incondicional y devuelve el control al bloque *padre* desde donde fue llamado, no tiene nada que ver con los saltos. #### ¿Potencia para un servidor Mosquitto? Luis, lector y alumno del [Curso de iniciación a Industria 4.0](https://programacionsiemens.com/cursos/curso-de-iniciacion-a-la-industria-4-0) me escribe diciendo: Hola Iñigo, una pregunta rápida. Estoy pensando levantar un servidor Mosquitto dentro de la empresa para estas labores. La idea es centralizar en este servidor unas cuantas señales de diversos autómatas. Como no tengo muchas experiencias con estos dispositivos no sé que rendimiento me puede dar una raspberry, un IOT2040,etc.  para ser un servidor Mosquitto. Pregunto: -¿Puede llegar un momento que estos pequeños dispositivos no sean capaces de gestionar todas las peticiones? Lo digo por los recursos hardware limitados. -¿Será mejor levantar un Mosquitto en una VM con un Ubuntu y sobrado de recursos? Ram, cpu…etc. Espero tus comentarios.  Sin liarse. Gracias Depende un poco del volumen de datos, pero teniendo en cuenta que MQTT es un protocolo muy liviano, con un equipo estilo IOT2040 de Siemens o una Raspberry debería ser suficiente. Eso sí, hay que tener en cuenta que la raspberry no está pensada para un entorno industrial, si bien existen alternativas que están basadas en raspberry que sí lo son. Ahora bien, debido al precio que tiene una raspberry, es una buena alternativa para validar la idea, ver que funciona y luego, puedes pensar en instalar equipos más industriales que hagan básicamente lo mismo, pero que estén mejor preparados para CEM, alimentación con 24VDC y ese tipo de cosas. Si la idea es registrar datos en una base de datos, yo me iría directamente a un servidor como comenta Luis, ya que tendrás todo junto, la recogida de los datos, y el almacenamiento. Pero como en otras ocasiones, no deja de ser una opinión por mi parte, y Luis tendrá que verlo todo más en detalle para ver cuál es la mejor solución, pero por potencia de Mosquitto, no creo que tenga problemas. #### ¿Se puede simular un Put-Get en TIA Portal? Uno de mis alumnos del [curso de comunicaciones industriales con IE y Profinet](https://programacionsiemens.com/curso-de-comuniaciones-industriales-ie-y-pn/) **(nombre en clave moodyblues) me pregunta si es posible realizar uno de los ejercicios de PUT-GET con el simulador de TIA Portal. La respuesta es depende: si lo quieres hacer mediante dos PLC [S7-1200](https://programacionsiemens.com/s7-1200) sí. En cambio, el PLCSIM clásico no está preparado para ello. No obstante, para practicar, haciéndolo con los S7-1200 es suficiente, ya que con los S7-300 se comporta básicamente igual. #### ¿Qué es Sinema Remote Connect? Finalmente por hoy, Jorge comenta: **Hola Iñigo, una consulta, para que sirven específicamente los módulos SCALANCE M de Siemens y el sistema SINEMA Remote Connect. Justo la semana pasada he estado en una presentación de Siemens referente a las soluciones de ciberseguridad que aporta Siemens. Los routers Scalance son los equipos Siemens para resolver los problemas que pueden derivarse al exponer las líneas de producción a Internet o redes superiores ya que disponen de enrutado, nateado y firewall, todo en el mismo equipo. Para exponer los PLC a Internet de forma segura, la solución completa que ofrece Siemens es estos Scalance junto con el software Sinema, que está compuesto por un servidor (que puede estar en las instalaciones propias) y el cliente con el que se accede desde el exterior, todo ello basado en OpenVPN. No se mucho mas que lo que nos presentaron en la jornada, pero la verdad es que personalmente me pareció muy sencillo de usar, y muy completo. Me gustó mucho, y os invito a que le echéis un vistazo [a la web de Siemens respecto a Sinema](https://new.siemens.com/global/en/products/automation/industrial-communication/industrial-remote-communication/remote-networks/sinema-remote-connect-access-service.html) #### ¿Hay límite para completar los cursos? Finalmente, termino con Jesús, alumno del Curso de iniciación de Industria 4.0. Hola Iñigo, con el curso voy bien. Me está pareciendo muy interesante y estoy aprendiendo muchas cosas que me van a servir. [...] También decirte que en cuanto pueda sacar un poco más de tiempo quiero matricularme también en el curso "Comunicaciones en IE y Profinet". Imagino que no habrá problema en simultanear dos cursos. Otra cosa,...¿Hay tiempo límite para terminarlos? Lo digo por que  por mi trabajo, hay veces que tengo mas tiempo para dedicar a cursos y otras un poco menos. Esta es una pregunta que se repite mucho, ya que en general todos mis alumnos andan justos de tiempo. De ahí que los cursos intenten adaptarse lo mejor posible a este mundo de locos: - No hay problema de simultanear los cursos. Puedes ser alumno de varios cursos a la vez porque quieras ir avanzando poco a poco que diferentes ramas. - No hay límite para terminar los cursos comprados. Están disponibles 24x7x365 y puedes acceder a los contenidos las veces que quieras y cuando quieras. ### ¿Que te ha parecido? Como ves, hay preguntas de todo tipo, y tengo unas cuántas más que no he respondido hoy para que no se haga demasiado largo el post. Pero ya sabes, que si tienes cualquier duda en la que te pueda ayudar, seas lector del blog o [alumno de los cursos,](https://programacionsiemens.com/listado-cursos/)** solo tienes que ponerte en contacto conmigo, y si es una pregunta que pueda responder, lo haré con gusto. --- # Cómo equilibrar cargas con un PLC de Siemens > PLC Siemens S7-1200: descubre cómo equilibrar cargas resistivas controladas con contactores estáticos cuando manejas muchos lazos en un horno eléctrico. Fuente: https://programacionsiemens.com/como-equilibrar-cargas-con-un-plc-de-siemens · Autor: Iñigo Gútiez · Publicado: 2019-10-29 · Actualizado: 2019-10-29 · Categoría: Programación PLC Hoy vamos a ver cómo trabajar con cargas que se controles mediante contactores estáticos. Esta forma de trabajar es típica cuando tienes muchas resistencias eléctricas que manejen un horno eléctrico, por ejemplo. Un relé estático básico (o contactor estático) solo puede manejar la potencia de las resistencias mediante el encendido/apagado de la resistencia ya que no controlas la intensidad o voltaje. Es un todo o nada. Cuando hay pocas resistencias, se pueden aplicar otros tipos de controles, pero cuando hablamos de muchos lazos de control, por temas puramente económicos, los contactores son una buena alternativa. ### Equilibrado de las cargas #### Equilibrado eléctrico Lo primero que hay que hacer, siempre siempre, es equilibrar las cargas de forma eléctrica. Es decir, si tememos 3 resistencias de 1Kw, lo suyo es que cada resistencia dependa de una de las fases, suponiendo que la carga esté conectada entre fase y neutro. De esa manera, estaremos equilibrando todo lo posible la potencia instalada de tal forma que no sobrecarguemos excesivamente una fase respecto a las otras. Eso es lo normal, y no tiene una complicación especial más alla de tenerlo en cuenta a la hora de realizar los esquemas eléctricos y su posterior conexionado. Así, cuando las resistencias están equilibradas y las resistencias se encienden o se apagan de forma continua durante mucho tiempo, no hace falta mucho más. El problema radica cuando quieres que la potencia eléctrica varie de forma *analógica, *es decir, que puedas definir cuanta potencia quieres aplicar respecto de la potencia instalada. Así, si tienes por ejemplo 3 resistencias de 1Kw, puedes equilibrarlas respecto a la potencia instalada, pero ¿qué pasa cuando quieres aplicar el 50% de esa potencia instalada? #### Equilibro con un PLC de Siemens Como estamos usando relés estáticos, y una resistencia por cada fase, si queremos aplicar el 50% lo que se hace es que la mitad del tiempo esté la resistencia encendida, y la mitad del tiempo apagada. ¿Y ya está? Podría parecer que sí, pero no. Piénsalo bien. Imaginemos que el ciclo de encendido/apagado sea de 1 segundo. Entonces, si queremos aplicar el 50% lo haremos encendiendo medio segundo las resistencias y apagándolas otro medio segundo. Eso es así, y funcionar, funciona. Realmente si la potencia instalada es pequeña respecto al consumo total, no notarás la diferencia si no haces nada más. El problema comienza cuando tienes muchos lazos de control individuales para aplicar diferentes potencias en cada zona de un horno. Para simplificar y se entiendan los conceptos, digamos que tienes una matriz de 30x30 resistencias de 1Kw, y quieres que cada resistencia aplique el 50% de su potencia. Es decir, de los 900KW de potencia instalada, quieres poner el horno a 450KW pero con la condición de que la potencia sea uniforme. Es decir, no vale con apagar la mitad de las resistencias y tener el resto encendidas de continuo, sino tener todas encendidas, pero aplicando el 50% de su carga. La cosa sería igual ¿no? Medio segundo encendida, medio segundo apagada para cada una de las Sí, pero los picos que estarás metiendo en la subestación serán enormes ya que todas las resistencias entran a la vez y salen a la vez, es decir, metes 900Kw durante medio segundo, y pones a 0 todo durante medio segundo. Eso, como entenderás, muy bueno no es para toda la instalación eléctrica aguas arriba donde el interruptor general está sufriendo esos picos de consumo. Si nos centramos solamente en una fase (el resto serían similares), tendríamos algo como esto: Como se ve, metiendo y sacando todas las resistencias a la vez, tienes picos del 100% durante la mitad del tiempo. Para hacer algo mas homogéneo, lo que podrías hacer es coger las 300 resistencias conectadas en la fase R y decalarlas 300ms entre ellas, es decir, que cada una de las resistencias entren y salgan medio segundo, pero el anclaje temporal no sea el mismo. Es decir, haya 100 resistencias que arranquen a los 0ms de cada ciclo de 1s, otras 100 arranquen a los 330ms, y las 100 últimas arranquen a los 660ms de tal forma que quede algo como esto: Pero es que esto, lo puedes aún suavizar más. Si en vez de 3 divisiones, tienes 5 con 60 resistencias, la cosa aún se suaviza mucho más: #### ¿Ves como se suaviza la cosa? Así, las resistencias están decaladas entre sí 200ms, y pasas de tener sobre impulsos del 100% de la potencia, a tener una potencia constante del 40% y tener sobre impulsos del 20%. En principio, cuantas más divisiones hagas, más suave podrás realizar, pero tendrás que valorar un poco el número de índices a usar, ya que esto lleva un coste a la hora de ejecutar el programa. La forma de ejecutar esto de forma escalonada es crear un OB cíclico que se ejecute cada 10ms y que en ese OB, tengas las variables índice que vayan de 1 a100, pero eso sí, cada uno va contando de 1 en 1 pero decalados entre sí. Luego, en función de la potencia que se quiera, y el índice, encenderás o apagarás cada resistencia. ### El vídeo de la semana Te cuento de palabra, toda la parrafada que te he metido hasta ahora. ### ¿Qué te ha parecido? Ahora, te toca pensar cómo continuarías y me lo cuentes en los comentario. La semana que viene te cuento una forma que creo que es bastante elegante. Y sí, la pista es que está programado **[en SCL como vemos en el bloque 4 del curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/)** Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # ¿Qué alternativas hay para comunicar los PLC de Siemens? > Comunicaciones en PLC Siemens: descubre las alternativas para comunicar CPUs, periferias descentralizadas y otros PLC entre sí, de Profibus en adelante. Fuente: https://programacionsiemens.com/que-alternativas-hay-para-comunicar-los-plc-de-siemens · Autor: Iñigo Gútiez · Publicado: 2019-10-01 · Actualizado: 2019-10-01 · Categoría: Comunicaciones Cuando empecé a programar, la verdad es que bastante tenía con aprender a manejar la programación en ladder y hacerme con Protool (predecesor de WinCC Flexible) como para preocuparme de comunicar los PLC de Siemens. Pero enseguida hubo que afrontar que los PLC no solamente tienen una CPU y unas tarjetas asociadas, sino que habitualmente tienen periferias descentralizadas con las que trabajar. Eso, salvo excepciones, suele ser sencillo de configurar a poca experiencia que tengas. Por eso no tuve demasiado problema con ello. Ahora bien, la cosa empezó a ponerse interesante cuando te das cuenta que los PLC, no solamente tiene periferias, sino que además en general se comunican con otros PLC, a poco compleja que sea la línea. Porque cuando las líneas son un poco grandes, suele haber varios PLC para manejarlas, y lógicamente los autómatas se tienen que comunicar entre ellos. Y ahí empiezan los problemas. Por muchos motivos. Lo primero, porque no tenia ni idea de comunicaciones. Era normal... no lo había hecho nunca, y al menos en mi familia, nadie ha nacido sabiendo. Lo segundo... porque las comunicaciones que puedes hacer con dos PLC de Siemens, son  muy variadas y algo confusas si no tienes experiencia con ellos. Lamentablemente, no te queda más remedio a medio plazo que conocerlas bien, saber qué alternativas tienes en cada momento, y sobre todo, perderle el miedo a estas cosas, que no muerden. Y sí, yo también me agobiaba con ello. Pero por un problema claro de desconocimiento sobre lo que me traía entre manos.. ### ¿Qué alternativas hay para comunicar los PLC de Siemens? Hay varias formas de hacerlo: - Mediante enlaces S7 - Usando comunicación abierta - Usando una comunicación Profinet (PN) controlador-dispositivo #### Comunicación de los PLC usando enlaces S7 Es una comunicación muy típica en los proyectos en los que solamente tienes equipos de Siemens. Porque sí, Siemens tiene su propia forma de comunicar los PLC: mediante enlaces S7. Para poder usarla, eso sí, necesitas que todos los equipos intervinientes sean de Siemens. Esta forma de comunicar tiene la curiosidad de que se configura básicamente igual tanto usando Profibus como usando una red Profinet. Es una configuración de hardware, es decir, se configura y se carga el hardware  en la CPU, y luego la programación es igual tanto en Profinet como en Profibus. La complejidad proviene de que no siempre puedes hacer la misma comunicación. Porque en función del hardware, podrás usar unos bloques de comunicación u otros. Así no será lo mismo si tienes un PLC 300, o un [S7-1200](https://programacionsiemens.com/s7-1200/), o si la tarjeta de comunicaciones el externa a la CPU, o usas una la CP interna de la CPU. Sí, lo sé. Eso es bastante confuso para el programador novato. Ni que decir que para mi también lo era. #### Comunicación Abierta Luego está la comunicación abierta. Esta comunicación, bien TCP o UDP, tiene la ventaja de comunicar entre los PLC de Siemens, pero también con equipos que no son de Siemens. A diferencia de los enlaces S7, la configuración y comunicación es puro software, es decir, no hay que cargar ningún enlace al hardware de las CPU, solo crear los bloques pertinentes y realizar la comunicación. Podrías pensar que entonces ¿por qué no usar siempre la comunicación abierta? Bueno, creo que la razón principal es que configurarlo cuesta más que configurar un enlace S7, sobre todo en la serie 300 y 400 con Step 7 clásico si no tienes claro cómo se hace. Pero claro, no siempre se puede usar los enlaces S7, bien porque no todos los equipos intervinientes sean de Siemens, o porque no puedes parar los PLC para cargar los enlaces a las CPU. Entonces, para estos casos (y para otros), la comunicación abierta es una gran alternativa. #### Profinet mediante una relación controlador-dispositivo La última forma de comunicar entre dos PLC, es usando una relación controlador-dispositivo. Esto es básicamente como una comunicación maestro-esclavo cuando hablamos de Profibus. Tal vez sea la forma menos común de intercambiar datos entre dos CPU,  pero digamos que técnicamente es posible. Te ayuda a entender también como se realizar la comunicación controlador-dispositivo cuando realizas una comunicación entre un PLC y un variador, por ejemplo. Porque la idea básicamente, es la misma: un intercambio de entradas y salidas. ### Qué pasa cuando manejas las diferentes opciones ¿Sabes lo que siento al conocer las diferentes alternativas tras estos años de aprendizaje? Liberación y confianza. Porque una vez que tienes todas las herramientas y las conoces, solo se trata de un día más en la oficina. El problema es cuando no sabes ni qué posibilidades tienes de comunicar una CPU S7-300 con una tarjeta Lean con un [S7-1200](https://programacionsiemens.com/s7-1200), por ejemplo. Por eso creé el curso de**[Comunicaciones usando Industrial Ethernet y Profinet](https://programacionsiemens.com/curso-de-comuniaciones-industriales-ie-y-pn/) ** Porque muchos de vosotros teníais muchas dudas (o lagunas en algunos casos) de cómo hacer las comunicaciones. La verdad es que tuve muy buen feedback del curso. Porque una de las cosas que he observado es que muy pocos programadores tienen soltura con el tema de las comunicaciones y las maneja con solvencia. Así que ya sabes, si quieres aprender a manejas las comunicaciones entre CPU de Siemens, con todas las alternativas que hay, échale un vistazo al** [curso de Comunicaciones Industriales](https://programacionsiemens.com/curso-de-comuniaciones-industriales-ie-y-pn/)** ### ¿Y tú, cómo lo llevas? Me gustaría saber cómo llevas este tema y qué dudas tienes con las comunicaciones, si es que tienes alguna. Si has hecho el curso, me gustaría saber si te ha sido útil y has podido poner en práctica lo aprendido con él. ¡¡Te espero en los comentarios!! --- # Cómo conectar un dashboard o web local a Internet > Dashboard local a Internet: aprende a exponer una web de fábrica para consultar producción, OEE y tiempos desde el móvil a cientos de kilómetros. Fuente: https://programacionsiemens.com/como-conectar-un-dashboard-o-web-local-a-internet · Autor: Iñigo Gútiez · Publicado: 2019-09-17 · Actualizado: 2019-09-17 · Categoría: Comunicaciones Hoy vamos a hablar de cómo podemos exponer nuestros dashboard o web local a Internet. Durante el [curso de IOT e Industria 4.0](https://programacionsiemens.com/cursos/curso-de-iniciacion-a-la-industria-4-0) hemos visto cómo crear dashboard  de forma local o directamente en la nube. En el caso de que el dashboard esté creado directamente en un servicio de Internet, no hay problema, ya que...¡¡ya está en Internet!! Solo tendrás que conectar con el servicio y ya está. Por otro lado, muchas veces las páginas web o dashboards que crees en local no las necesitarás ver fuera de la fábrica porque será para ver valores de producción, OEE, tiempos.. ese tipo de cosas. Pero ¿qué pasa si quiero ver estos datos desde un móvil a cientos de kilómetros de la fábrica? Ahí la cosa se complica. ### La forma más segura: una VPN Lo mejor, es crear una VPN de tal forma que te conectes a la web como si estuvieras dentro de la oficina. Eso implicará que hables con los chicos de IT para que creen el túnel y se pueda acceder desde el exterior a dicho dashboard. Ahora bien. Te puedes estar preguntando... ¿hay otras formas? Pues sí, se puede exponer a Internet una web local de una forma bastante sencilla usando servicios externos. ### Disclaimer - Descargo de responsabilidad Lo siguiente que te voy a contar, al igual que todo lo que te cuento en otras ocasiones, está bajo tu responsabilidad. Porque si tienes que tener cuidado al programar los PLC, el exponer cualquier dato a Internet tiene muchos riesgos ya que hay mucha gente ahí fuera queriendo hacer el mal, por el simple hecho de hacer el mal. Por tanto, analiza los servicios que te voy a enseñar, y si no te convence su seguridad, es mejor que no los uses. Ni que decir tiene que los datos sensibles no deberían estar expuestos a Internet, pero como digo, eso ya es cosa tuya. Además, dependiendo de tu empresa, puede que no funcione porque el acceso este restringido por los cortafuegos que han puesto los chicos de IT que impiden el acceso desde el exterior. Ahí, como comprenderás tampoco te puedo ayudar. Dicho esto, al lío. ### Servicios para exponer servidores locales a Internet Lo primero que hay que decir que estos servicios los usaría para una exposición temporal a Internet (al menos en su versión gratuita).  Para pruebas de funcionamiento, o situaciones puntuales, puede estar bien. Para algo a largo plazo, creo que lo suyo es servicios directos en la nube como vemos en el curso. He probado [Ngrok](https://ngrok.com/), [Serveo](https://serveo.net/) y [Localtunnel,](https://localtunnel.github.io/www/) aunque hay más como luego te comentaré. #### Ngrok.com Es estable, y funciona bastante bien. Tan solo tienes que crearte una cuenta, bajar la versión de ngrok de tu sistema operativo y seguir las instrucciones que son bastantes sencillas. Puedes trabajar con él con la cuenta gratuita, con la que te genera una url del estilo: https://f8ah5j78.ngrok.io Como ves, te crea una url poco sencilla de recordar, pero para realizar pruebas, es más que suficiente. Puedes también dar autenticación de tal forma que pida usuario y contraseña para poder acceder a la web. Pero ojo, porque tiene otra parte negativa: cada vez que lances el servicio, te creará una url diferente, por lo que se vuelve un poco insostenible usando solamente la versión gratuita. La versión de pago (y ahí es donde esta la gracia y de lo que viven) tiene la posibilidad de crear tu subdominio que sea fijo, es decir, que siempre sea un https://programacionsiemens.ngrok.io por ejemplo. Incluso puedes añadir tu dominio quitando el ngrok.io y usando tu propio dominio del estilo tudominio.com Todo depende de la versión de pago que elijas. Pero como ves,  la cosa cambia bastante ¿verdad? Como digo, lo he probado con una Raspberry, y sin mayores problemas. Tiene otra ventaja, que puedes exponer un equipo de forma remota, es decir, puede lanzar el servicio en un PC, pero que el equipo que quieras exponer esté en otra IP dentro del subdominio. Actualmente tiene la opción en fase beta de levantar el servicio vía SSH como hace Serveo. Siguiendo un par de pasos sencillos, lo tienes funcionando usando SSH en vez de la aplicación propia de Ngrok. #### Serveo.net Serveo es una aplicación gratuita que según ellos, es la alternativa a Ngrok. La verdad, es que la he probado, y funcionar, funciona... al menos por un rato. Porque lo he encontrado muy inestable y se ha caído el servicio en varias ocasiones. ¿Lo bueno? ¡No hay que instalar nada! Trabaja usando SSH, por lo que no tienes que instalar nada adicional si tienes SSH en el equipo. Con un simple comando del estilo: ssh -R 80:localhost:3000 serveo.net pones la web que tengas en el puerto 3000. Tendrás algo así: **root@odroidxu4:~# ssh -R 80:localhost:1880 serveo.net Forwarding HTTP traffic from https://pyga.serveo.net Press g to start a GUI session and ctrl-c to quit. Como ves, te crea la url por https, que además, no cambia cada vez que reinicies #### Localtunnel.me Finalmente tenemos otra alternativa gratuita, que puedes encontrar en el repositorio de GitHub. Tiene la ventaja de ser muy fácil de instalar: npm install -g localtunnel Además, puedes crear tu subdominio estilo https://programacionsiemens.localtunnel.me lo cual está muy bien respecto a ngrok o Serveo, ya que seleccionas tú mismo el subdominio a usar. Lo he probado, y aparentemente funciona bastante bien. Además, puedes usar certificados y otras opciones que puedes ver en la ayuda: root@odroidxu4:~# lt --help Usage: lt --port [num] Options: -p, --port Internal HTTP server port [required] -h, --host Upstream server providing forwarding [default: "https://localtunnel.me"] -s, --subdomain Request this subdomain -l, --local-host Tunnel traffic to this host instead of localhost, override Host header to this host --local-https Tunnel traffic to a local HTTPS server [boolean] --local-cert Path to certificate PEM file for local HTTPS server --local-key Path to certificate key file for local HTTPS server --local-ca Path to certificate authority file for self-signed certificates --allow-invalid-cert Disable certificate checks for your local HTTPS server (ignore cert/key/ca options) [boolean] -o, --open Opens the tunnel URL in your browser --print-requests Print basic request info [boolean] --help Show this help and exit [boolean] --version Show version number [boolean] ### ¿Hay más opciones? Pues parece que sí. He estado buscando un poco, y he encontrado [este post](https://www.chenhuijing.com/blog/tunnelling-services-for-exposing-localhost-to-the-web/) en el que hablan de otras alternativas como : - localhost.run (gratuita) - Telebit (gratuita) - pagekite.net (pago) ### ¿Cual elegir? Lo primero que he de decir es que como ya he comentado, solo he probado Ngrok, Localtunnel y Serveo. Tendrás que probarlos, y comprobarlo por ti mismo. Porque por lo que he leido, ngrok parece la más robusta, pero si no coges la opción de pago  tal vez no sea la mejor alternativa. Por otro lado con serveo no hay que instalar absolutamente nada, pero no parece demasiado estable. Al menos a mi me ha fallado bastante durante las pruebas. Localhost, muy fácil de instalar, admite subdominios, y he de decir, que no he tenido problemas el poco tiempo que he jugueteado con ello. #### ¿Con cual me quedo yo? A mi la que más confianza me da, es Ngrok. Edito: **Estoy probando Remote.it que ha comentado uno de los alumnos del curso de IOT e Industria 4.0, y ciertamente, tiene muy buena pinta. En cuanto vea con detenimiento como funciona, tal vez haga una entrada, porque parece realmente potente. #### ¿Y tú, conocías estos servicios? Si has usado alguno de estos servicios y tienes buena o mala experiencia, estaría genial que la compartieras en los comentarios, para que así, todos tengamos referencia de otros usuarios. --- # Alarmas en TIA Portal > Alarmas en TIA Portal: descubre las distintas filosofías para gestionar avisos, crearlas en cada FC o centralizarlas en bloques específicos del programa. Fuente: https://programacionsiemens.com/alarmas-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2019-09-11 · Actualizado: 2026-07-14 · Categoría: HMI y WinCC Estamos en la fase final del [Curso Express de TIA Portal](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/), y pronto comenzaremos a trabajar en proyectos completos en los que veremos la parte de programación del PLC además de crear las pantallas del HMI. Una de las cosas más importantes que tienes que hacer cuando desarrollas un programa es la gestión de las alarmas. En función de cual sea la filosofía, se pueden aplicar diferentes formas de trabajo. A algunos programadores les gusta crear las alarmas en cada FC, de tal forma que en el mismo bloque veas las alarmas que lleva asociada. Otros, en cambio, usamos en general bloques específicos para las alarmas de tal forma que están todas centralizadas en un único lugar. Cada maestrillo, tiene su librillo, que dice la sabiduría popular. Con cualquiera de los métodos que uses, lo suyo es que la máquina tenga también una baliza de alarma. Esta baliza normalmente es luminosa y sonora, de tal forma que cuando hay una nueva alarma, suena y parpadea a la vez, y cuando reconoces la alarma, se apaga la bocina, y la luz se queda fija. En alguna ocasión ya hemos hablado de este tipo de gestiones [en Step 7 clásico](https://programacionsiemens.com/gestion-de-alarmas-en-s7/). Y en TIA Portal, este es el montaje clásico en vídeo: - Si hay una alarma nueva, la baliza parpadea y suena la bocina. - Al pulsar reconocimiento, si la alarma sigue activa, la luz queda fija y la bocina se calla. - Las alarmas críticas silenciadas vuelven a hacer sonar la bocina si no se soluciona el problema. ### Vídeo: baliza y bocina en TIA Portal En esos dos casos, lo que hacemos es contar el número de alarmas en un ciclo de scan del OB1. Con ello, por un lado sabemos cuántas alarmas tenemos activas, y por otro, si hay una nueva alarma. Este método, tiene un pequeño problema técnico que es que podría darse el caso de que en un ciclo de scan del OB1 podría aparecer una nueva alarma y desaparecer otra, haciendo el balance de alarmas activas igual que en ciclo anterior. Esto se solventa simplemente haciendo que las alarmas hagan un SET, y no una igualación, de tal forma que la alarma no desaparece si el operario no resetea las alarmas, y por tanto, está delante de la pantalla y no cabe la posibilidad de que desaparezca una alarma y aparezca otra sin que este operario se entere. Pero ¿se puede hacer de otra forma? ### Alarmas en TIA Portal usando XOR y AND ¡Pues claro! Se puede hacer de muchas formas. Entre otras, una que solucione el pequeño problemilla descrito de que aparezca una alarma y desparezca otra en el mismo ciclo de scan, que puede ser interesante si lo que queremos es usar la igualación en vez del Set con las alarmas. Así que, esta vez, usaremos diferentes técnicas para lograrlo: - AND y XOR - AT ¿What....WHAT? ¡¡De qué hablas!! Empecemos por el final. Cómo usar [AT en TIA portal lo comentamos en su día en este post](https://programacionsiemens.com/at-en-tia-portal/). Básicamente lo que haces es sobre un área de memoria X, crear una especie de plantilla para acceder a estos datos de una forma más cómoda para ti. De momento, quédate con la idea de que nos va a hacer falta, ya verás porqué. Y con AND y XOR, ¿qué hacemos? Bueno, la idea es la siguiente: imagina que tenemos un array de alarmas booleanas. Para simplificarlo de momento, imagina algo así como Array[1..8] of Boolean Solo 8 booleanas, pero normalmente serán muchas más. Pero como digo, para el ejemplo, solo con 8. Núm. Alarma 7 6 5 4 3 2 1 0 Ciclo Anterior **1** 1 **0** 1 1 0 1 0 Ciclo Actual **0** 1 **1** 1 1 0 1 0 XOR 1 0 1 0 0 0 0 0 AND 0 0 **1** 0 0 0 0 0 Así, los pasos a realizar, son los siguientes: - Hacemos un XOR entre el estado de las alarmas en el ciclo anterior, y el ciclo actual. Como vemos, han cambiado la alarma 5, pasando de 0 a 1, y la alarma 7, pasando de 1 a 0. El resto, permanecen invariables, y por tanto, el XOR da 0. - Luego, hacemos un AND del resultado obtenido en el paso anterior, con el estado actual, y por tanto, tendremos como resultado que todo está a cero salvo en el bit 5, que como ves estará a 1. Y ya está, como ves, tenemos el resultado, que si lo comparamos con 0, vemos que efectivamente hay una alarma nueva. Luego, hay que hacer un pequeño bucle para recorrer todas las alarmas, porque si en vez de 8 alarmas, tenemos 800, la cosa se puede poner interesante. ¿Lo vemos en un vídeo? ### Vídeo de alarmas en TIA Portal #### Actualización: Me han comentado con buen criterio, que una vez encontrada una alarma nueva, se puede salir del bucle, marcando tanto la variable de nueva alarma como la de alarma activa. Es totalmente cierto, y es más elegante hacerlo así. Pero también es verdad, que el bucle lo tienes que recorrer siempre buscando nuevas alarmas, y solamente en el ciclo de scan que tenga una nueva alarma, podrás ahorrar unas pocas iteraciones debido a que te puedes salir antes del bucle. El resto del tiempo, que es prácticamente todo el tiempo, tienes que recorrer el bucle completo, ya que tienes que estar constantemente buscando nuevas alarmas hasta el último ciclo. Lo de salirse del bucle es muy típico cuando buscas una información que sabes que siempre va a estar, y que una vez encontrada, sales fuera. Pero no es este caso. Piensa que en el trabajo normal de la máquina, hará millones y millones de ciclos completos, sin que aparezca una alarma, y solo cuando aparezca una, ahorrarás unas pocas iteraciones. En cambio, si buscaras una información que sabes que siempre tiene que estar, sería lógico salir del bucle, porque en cada ciclo de scan, siempre ahorrarías unas pocas iteraciones salvo que el dato estuviera justo en la última iteración, pero no es el caso. Por tanto, es una optimización más de planteamiento que realmente práctica, porque no ahorras apenas nada en cuanto a la carga de la CPU. ### ¿Qué te ha parecido las alarmas en TIA Portal? Espero que te haya gustado esta forma de darle uso al XOR, AND y AT. Recuerda que si eres integrante del [curso de TIA Portal Express](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/), tendrás el proyecto disponible para su descarga cuando lo integremos en los ejemplos finales. Si no estás apuntado, y crees que aprender este tipo de cosas, ya sabes que puede que el curso pueda ayudarte. También puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # ¡Tengo nuevo portátil para programar en TIA Portal! > TIA Portal y portátil: te cuento qué Lenovo Legion he elegido para programar con soltura y qué tener en cuenta en potencia y resolución al comprar el tuyo. Fuente: https://programacionsiemens.com/tengo-nuevo-portatil-para-programar-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2019-08-21 · Actualizado: 2019-08-21 · Categoría: TIA Portal Pues sí, ya era hora de dar un retiro merecido al portátil que he estado usando estos últimos años. La verdad que trabajar en TIA Portal con el portátil viejo cuando no estaba delante del PC de sobremesa, era un dolor de muelas. Su poca potencia y su baja resolución (1360x768) hacía que se trabajara muy mal. Así que he aprovechado este agosto para lanzarme a la busca y captura del portátil BBB (bueno bonito y barato) para poder trabajar medianamente bien. Aún no sé si he acertado, o he fallado con la elección, ya que no hay portátil que lo tenga todo. Te cuento un poco cuál he comprado, y porqué. ¿Te parece? ### Lenovo Legion Y730 Ese es el modelo elegido. El Lenovo Legion Y730, un portátil que se vende ¡para gaming! Pues sí, porque además de tener un potente micro (el i7-8750H de 8.ª generación), tiene 16GB de RAM DDR4 y viene con dos discos duros, uno de estado sólido de 256GB y otro mecánico de 1TB. Además, tiene 15,6" de pantalla que es Full HD. Es fácilmente actualizable, y con el tiempo seguramente acabe sustituyendo el disco duro mecánico por un SSD e incluso le ponga otros 16GB de RAM para tener 32 que me permita virtualizar sin problemas. Como ya [hablamos en su momento,](https://programacionsiemens.com/que-portatil-comprar-para-tia-portal/) TIA Portal tiene una serie de requerimientos que debemos cumplir: - Procesador: CoreTM i5-3320M 3.3 GHz o similar - Memoria principal: 16 GB de memoria (recomendado) o más - Disco duro: 300 GB SSD - Gráficos: Mín. 1920 x 1080 - Pantalla: 15,6″ display de pantalla ancha (1920 x 1080) El micro de la CPU CoreTM i5-3320M  obtiene una puntuación en[CPU Benchmark de 4131 puntos](https://www.cpubenchmark.net/cpu.php?cpu=Intel+Core+i5-3320M+%40+2.60GHz&id=817) frente a los [12447 del i7-8750H](https://www.cpubenchmark.net/cpu.php?cpu=Intel+Core+i7-8750H+%40+2.20GHz&id=3237). Vamos, que por potencia no va a ser. El resto de requerimientos se cumplen, si bien el SSD es un poco escaso. Pero de momento, no es un problema ya que tras instalar todo lo que necesito, me sobran unos 100GB del SSD y el disco de 1TB completo. #### Otras cosas que iba buscando Además de los requisitos para poder ejecutar sin problemas TIA Portal, también iba buscando algunos pequeños detalles: - Teclado retro iluminado. En este caso además es en RGB, aunque con que fuera en blanco, sería suficiente. - Tarjeta gráfica potente por si quisiera editar los videos para cursos o el blog con el portátil. - Tiene Thunderbolt 3, con lo que le podré poner un dockstation moderno sin problemas. De esta forma podría incluso prescindir si fuera necesario del PC de escritorio. - No tiene teclado numérico, por lo que las teclas son más grandes. - Que fuera medianamente bonito. - Que no costara un Potosí Y bueno, más o menos, es lo que he comprado. [Lo he comprado en Amazon](https://amzn.to/2YSYJ5n) ya que el servicio post venta es impecable. A decir verdad, yo lo he comprado más barato de lo que se vende ahora, y hay otros modelos de características similares como[es el modelo Legion Y530](https://amzn.to/2TzqcTx), que en vez de ser de aluminio, es en plástico. La verdad es que he pagado casi lo mismo que por el Y530, si bien ha subido bastante desde que lo he comprado (yo lo compré por 999€). #### Las cosas que me están gustando Es un portátil muy muy bonito y con un acabado muy fino. Elegí este, porque es complicado encontrar un portátil potente y que el precio no se dispare enormemente. Estos portátiles potentes y a precios contenidos, suelen ser los de gaming, pero que suelen ser demasiado llamativos. Parece que no puedes jugar si no tienes un portátil que tenga más colores que el arcoiris. Pues el [Lenovo Legion Y530](https://amzn.to/2TzqcTx) o el que yo he comprado, [el Y730](https://amzn.to/2YSYJ5n), son potentes, y sobrios. Muy bonito, en serio. El portátil va como la seda. Realmente va todo muy fluido, y mueve TIA Portal con mucha solvencia. Diría que incluso mejor que el ordenador de sobremesa. Se ve de maravilla. Se nota el pasar de 13,3" a 15,6".  Ni que decir que con la pantalla más grande, y el cambio de resolución es como jugar en otra liga. Nada que ver. Suena realmente alto. No sé si con mucha calidad (eso no lo sé valorar), pero sí suena alto, y a mi modo de ver, suficientemente bien para el propósito encomendado. Los ventiladores, una vez actualizado todo, y retocado algunas opciones, no parece muy ruidoso. No es una tumba, pero ningún portátil que tenga potencia lo es a poca caña que le metas. Las conexiones son traseras, lo cual está bastante bien para trabajar en una mesa. Todos los cables puedes quedar por la parte trasera haciendo que sea más cómodo y limpio. Además, como un detalle que se agradece, en el disco duro mecánico, viene un directorio con todos los drivers del bicho. De esa forma, siempre tienes unos drivers con los que hacer una instalación limpia. Además, la página de Lenovo está bastante cuidada, y los drivers los tienen actualizados. Puedes actualizar la Bios, chipset y los diferentes componentes. Nada que objetar en este punto, sino más bien decir que hacen un buen trabajo en este aspecto. #### Las cosas no tan buenas El teclado tiene a su izquierda una serie de botones extra que puedes personalizar con una macro. Puedes hacer que te lance un programa o que te abra una página web en concreto, por ejemplo el [curso de TIA Portal Express](https://programacionsiemens.com/cursos/curso-express-de-tia-portal/) que estoy haciendo ahora jeje. Que claro, es práctico porque es un atajo de hardware. Pero tiene su cruz. Al tener estos botones ahí, hace que todo el teclado normal, esté desplazado hacia la derecha, y me está costando un poco hacerme con él. Ya le estoy cogiendo el *tranquillo* y estoy poniendo las manos de tal forma que es bastante cómodo y escribo bastante rápido. Pero al principio se hace raro que la tecla ESC no sea la tecla que más a la izquierda y arriba esté, e instintivamente, te equivocas. La batería es bastante escasa. Bien es cierto que mi idea no es estar desconectado de la luz por mucho tiempo, pero claro, el portátil viejo tenía una buena batería, y este es muy limitada. Tengo que hacer más pruebas, pero no sé si podré sobrepasar las 3 horas trabajando. Ahora bien, estoy en los primeros días, por lo que aún tengo que hacer más pruebas para ver cuánta es la verdadera autonomía del bicho. Iremos viendo qué tal se comporta con el paso del tiempo. Pero desde luego, no tiene una super capacidad, y no es un equipo pensado para trabajar con él si no vas a estar normalmente conectado a la red eléctrica. Para el uso que yo le quiero dar, me sirve perfectamente ya que básicamente lo voy a usar en casa, y ahí siempre tengo un enchufe cerca. #### ¿Qué tal con Windows 10? Como imaginarás, al ser un equipo nuevo, viene con Windows 10. He de decir, que de momento, no tengo queja y he podido instalar todo sin mayores complicaciones, por lo que nada que objetar. Eso sí, tienes que instalar las versiones compatibles con este SO. Por lo demás, sin problemas. ### Veredicto De momento, no me puedo quejar. Va todo bastante bien, y de las pegas que tiene, son más cosas a las que te tienes que acostumbrar que problemas reales del aparato. Lo que sí está claro es que si quieres un portátil para TIA Portal, tiene que ser un equipo bastante potente para que vaya alegre. Que no tengas que esperar a que se abran los proyectos, cargar o simular y que todo vaya bien, sin cosas raras. Tras haber instalado el software y probado unos días, de momento, estoy bastante contento y es una buena alternativa si la autonomía no es un problema. Con esto lo único que te quería contar es mi experiencia y que antes de comprar un nuevo portátil, pienses para qué lo vas a usar y en qué condiciones de trabajo. Porque no es lo mismo que lo vayas a usar básicamente en una oficina donde siempre tienes un enchufe, que lo vayas a usar para puestas en marcha donde normalmente necesitarás tener tensión debido a las largas jornadas de programación, o para reparaciones en una fábrica, donde el enchufe no siempre está cerca. Quien dice esta característica, dice que el teclado sea iluminado o que el disco duro sea de 256GB SSD o de 1TB. ¿Has comprado recientemente un portátil o PC? ¿Nos cuentas tus experiencia para que veamos direrentes alternativas? --- # 3 usos del desplazamiento a la izquierda de bits en Step 7 > Step 7: 3 usos prácticos del desplazamiento a la izquierda de bits (SHL_W) para que entiendas la instrucción y le saques partido en tus programas. Fuente: https://programacionsiemens.com/3-usos-del-desplazamiento-a-la-izquierda-de-bits-en-step-7 · Autor: Iñigo Gútiez · Publicado: 2019-07-04 · Actualizado: 2019-07-04 · Categoría: Programación PLC Vamos a ver algunos usos que se le puede dar a las instrucciones de desplazamiento de bits. Concretamente del desplazamiento a la izquierda, y no a la derecha, porque verás que es más útil, en general. Esta entrada viene respondiendo a una pregunta que me hicieron ya hace un tiempo, porque el que me la hizo, no tenía muy claro para qué sirve, o qué uso se le puede dar. Seguramente habrá muchos otros de los que te voy a mostrar aquí. Esto es solamente una pequeña idea, de cara a comprender la instrucción, y así que en el futuro, cuentes con ella porque sepas usarla. Empecemos por lo que dice Siemens que hace esta instrucción. ### Descripción de desplazamiento a la izquierda **SHL_W** (Desplazar 16 bits a la izquierda) se activa si la entrada de habilitación (EN) tiene el estado de señal "1". Con la operación SHL_W se desplazan los bits 0 a 15 de la entrada IN bit a bit a la izquierda. A los bits 16 a 31 no les afecta la operación de desplazamiento. La entrada N indica el número de posiciones de bit en que se va a efectuar un desplazamiento. Si N es mayor que 16, la instrucción en la salida OUT escribe un "0" y pone los bits A0 y OV de la palabra de estado a "0". Desde la derecha se desplaza el mismo número (N) de ceros para ocupar las posiciones que quedaron libres. El resultado de la operación de desplazamiento queda depositado en la salida OUT. La operación SHL_W pone a "0" al bit A0 y al bit OV si N es diferente de 0. El estado de señal de ENO es igual al de de EN. Es decir, y en cristiano: El acumulador contiene como sabes 4 bytes. Bueno, pues esta instrucción es solamente para los dos primeros bytes (los que están más a la izquierda). Una vez teniendo claro que solo jugamos con 16 bits, lo que hacemos es, una vez habilitado el movimiento, desplazar los bits que están más a la derecha (los menos significativos) hacia la izquierda X posiciones, metiendo ceros en las posiciones libres que se generan en la derecha, y despreciando los bits más altos  que *se salen* por la izquierda Lógicamente, esta instrucción no tiene mucho sentido si desplazas más de 16 bits, ya que el desplazamiento sería demasiado grande para los dos bytes con los que estamos jugando. En el dibujo se entiende creo que mejor que en el texto de la ayuda. Bueno, espero que más o menos, se tenga la idea. Ahora bien ¿para qué diantre vale esto? Pues vamos a ver tres aplicaciones, aunque alguna de ellas, no me guste demasiado: ### Crear punteros rápidamente Esta sin duda, es la aplicación que más me gusta. [Como vemos en el curso de Step 7](https://programacionsiemens.com/como-programar-step-7/), los punteros se construyen indicando cuántos bits tiene el puntero. Es decir, el puntero P#0.0 contiene 0 bits, mientras que el puntero P#1.0 contiene 8 bits. Bien. Pues si cargo 16 como entero, y se lo transfiero a un puntero, la dirección que le cargo es la P#2.0 Si le cargo 24 como entero, tendré el P#3.0 Si le cargo un 32, tendré el P#4.0 ¿hasta ahí está claro, no? Como ves, en el fondo, si quiero obtener el puntero P#3.0 es lo mismo que cargarle 24 como entero (el número de bits). Pero 24 se puede descomponer como 3x8 ¿no? Pues si te fijas, y coges un 3 en binario: 00000000 00000011 Y desplazamos 3 unidades hacia la izquierda... 00000000 00011000 ¿qué número obtenemos? ¡Exacto! ¡Un bonito 24! Por eso verás muchas veces cuando estás leyendo un programa creado con punteros algo de esta guisa: L 3 SLW 3 LAR1 L 5 +AR1 ¿Qué puntero ha creado? Pues sí, el P#3.5 Así que para crear punteros, es muy típico coger la dirección entera del puntero, desplazarla hacia la izquierda 3 bit y cargarlo en el AR1. Así obtienes la dirección del byte en forma de puntero. Posteriormente, si es necesario, le sumas el número de bits de la dirección ### Pequeños tracking Si ahora, en vez de desplazar varios bits, solo desplazamos 1, podemos hacer pequeños tracking de piezas. Así, cargaremos siempre la pieza en el bit más a la derecha: 00000000 00000001 Y posteriormente desplazaremos una unidad cuando se produzca el movimiento: 00000000 00000010 Si por ejemplo hemos movido tres posiciones, y entra una nueva pieza, solo tendremos que poner a 1 el bit más a la derecha (el menos significativo) para seguir con el tracking, quedando algo como esto más o menos: 00000000 00001001 De esto ya hablamos en su día en un post, por lo que le puedes echar un [vistazo al ejemplo que lo ilustra bastante bien](https://programacionsiemens.com/desplazamiento-y-giro-de-bits-en-step7/) ### Crear secuencias de movimientos Este es un método que te desaconsejo usar. Yo lo he visto en algún programa, y sinceramente no me parece la mejor forma de hacer una secuencia de movimientos por la dificultad innecesaria que le estás añadiendo cuando quieras mantener el programa. Pero yo te lo cuento, al menos para que no te sorprenda si lo ves. Como hemos visto, podemos mover un bit hacia la izquierda cuando deseemos. Por tanto, para realizar una secuencia, *está chupao*. Cuando se generen las condiciones de arranque en automático y todo esté Ok, simplemente cargarás un 1 en el word que forma la palabra que vas a mover, teniendo en binario: 00000000 00000001 Por tanto, el bit de la derecha, será el bit que arranque la secuencia, y la máquina se pone a trabajar en la fase 1. Cuando la fase 1 llegue a su fin, lo único que tendrás que hacer, es mover una unidad para que pase a la fase 2: 00000000 00000010 Posteriormente, la fase 3: 00000000 00000100 Y así sucesivamente. ##### ¿Y qué tiene de malo esto? Pues un par de ellas, que me vienen a la cabeza. La primera es que a la hora de usar la secuencia, lógicamente usas el bit en concreto. Quiero decir, que imaginemos que la secuencia la almacenamos en MW100. Bien, el paso 1 será la M101.0, el paso 2 la M101.1 y así, sucesivamente. Vale. El primer problema que te encuentras es que quieres saber dónde se le da valor a la M101.4 Buscas referencias cruzadas... y no está dándose valor a esta variable en ningún sitio. Podrías pensar que buscas la MW100 y ya está. Pues tampoco. Porque si el programa es suficientemente grande y complejo, el movimiento del word MW100 no se hará solamente en un sitio (como sería deseable), sino que se le estará dando en varios sitios, uno por fase. Entonces, de las 15 referencias cruzadas, ¿cuál es? No te queda mas que buscar una por una hasta encontrar la M101.4 y ver que tras X condiciones, entonces se mueve un bit la MW100 y por tanto, se está activando la M101.5 Bueno, podrías buscar la M101.4 y ver donde se hace el desplazamiento. Estás igual, o peor. Puede que la M101.4 esté aplicada en 20 sitios diferentes, así que te toca buscar en cuál de ellos, has movido la palabra. La única solución aceptable, es poner todas las condiciones de movimiento en un unico segmento si son condiciones sencillas, o bien, si tienes que hacerlo a trozos, poner todos los pasos, uno detrás de otro. Pero para hacer esto... ¿no es más sencillo hacer un set/reset de cada bit, y ya está? Yo, al menos, lo veo así. Ojo, el programa, si está bien hecho, funciona igual de bien. Pero a la hora de encontrar un problema, se me antoja más farragoso salvo que seas muy ordenado y cuidadoso. Para gustos. Pero para mi, no es una buena práctica por las complicaciones innecesarias que conlleva. ##### ¿Y el desplazamiento a la derecha? El desplazamiento a la derecha, tiene aplicaciones similares, si bien es menos intuitivo debido a la disposición de los bits. Pero también se puede usar, como puedes intuir ### ¿Cómo lo ves? ¿Has usado alguna vez alguna de estas opciones? Estoy seguro que sí. Incluso de otras formas ¡que espero que nos lo cuentes en los comentarios! Recuerda que**[si necesitas formarte en TIA Portal tienes un super curso completo](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/)**, y si es Step 7 clásico lo que necesitas, **[también tienes cómo formarte](https://programacionsiemens.com/como-programar-step-7/)** --- # OPC y OPC UA: diferencias y uso con PLC Siemens > Qué es OPC UA, diferencias frente a OPC clásico y cómo preparar una conexión con PLC Siemens: variables, certificados, permisos y diagnóstico. Fuente: https://programacionsiemens.com/el-camino-hacia-opc-ua · Autor: Iñigo Gútiez · Publicado: 2019-05-15 · Actualizado: 2026-09-07 · Categoría: Comunicaciones **OPC UA es un estándar de comunicación que permite intercambiar datos entre PLC, HMI, SCADA y aplicaciones de otros fabricantes.** Frente a OPC clásico, incorpora independencia de plataforma, un modelo de información y mecanismos de seguridad configurables. Para conectar un equipo, hay que comprobar qué funciones admite su implementación. ### OPC clásico y OPC UA: diferencias prácticas AspectoOPC clásicoOPC UA PlataformaBasado en COM/DCOM de WindowsIndependiente del sistema operativo DatosEspecificaciones separadas para datos, alarmas e históricosServicios y modelo de información integrados ConexiónLa configuración DCOM condiciona el acceso remotoEndpoints y políticas de seguridad anunciados por el servidor Equipos existentesPuede seguir siendo necesario para sistemas heredadosLa conexión con OPC clásico requiere un adaptador o pasarela Fuente: [descripción de OPC UA de OPC Foundation](https://opcfoundation.org/about/opc-technologies/opc-ua/). No confundas «admite OPC UA» con «todas sus funciones están habilitadas»: revisa CPU, firmware, licencia y software cliente. Si ya conoces la diferencia y quieres configurarlo, ve directamente al [tutorial del servidor OPC UA en TIA Portal](https://programacionsiemens.com/servidor-opc-ua-en-tia-portal). A continuación puedes leer cómo se llegó a este estándar. ### ¿Qué había antes de los OPC? Antes de que existiera OPC no existía ningún tipo de estándar de comunicación entre los diferentes PLC (u otras fuentes de datos) y las aplicaciones que recogían los datos (montandos en un PC por ejemplo). Esto hacía que las compañías hicieran cada una la guerra por su cuenta y las herramientas fueran desarrolladas de forma propietaria por cada una de ellas, haciendo muy complicada la relación entre los diferentes tipos de equipos (hardware) con las diferentes herramientas ofimáticas (software). Ni que decir que la potencia de comunicación estaba muy limitada y combinar diferentes fabricantes, casi imposible. ### Llega el OPC En 1995 se funda la **[OPC Foundation](https://opcfoundation.org/) **con 5 empresas (Rockwell, Opto 22, Intellution, Intuctive Technology y Fisher-Rosemount). La fundación mantiene las especificaciones y coordina su evolución. #### Pero ¿ qué es OPC? OPC es un estándar de comunicaciones cuya misión es poner en contacto los equipos industriales y las aplicaciones HMI y Scada. Esto permite, por ser un estándar común, que la integración entre el software y el hardware se haga de una manera más sencilla. Según la propia fundación su misión es la siguiente: **La misión de la Fundación OPC es gestionar una organización global en la que los usuarios, proveedores y consorcios colaboren para crear estándares de transferencia de datos para la interoperabilidad multiplataforma,  segura y confiable en la automatización industrial. Para apoyar esta misión, la Fundación OPC: - Crea y mantiene especificaciones. - Asegura el cumplimiento de las especificaciones OPC a través de pruebas de certificación. - Colabora con organizaciones de estándares líderes en la industria Fuente:[https://opcfoundation.org/about/opc-foundation/mission-statement/](https://opcfoundation.org/about/opc-foundation/mission-statement/) Pero claro, el tema de la multi plataforma, no siempre estuvo ahí. En un principio, OPC no era OPC, sino más bien OLE. Se trataba de un desarrollo de Microsoft para permitir la incrustación de documentos y objetos, derivado del intercambio de datos dinámicos (DDE). Con el tiempo, Microsoft OLE deriva en OLE for Process Control... u OPC. Posteriormente este acrónimo se transforma en Open Platform Communication Y así, va avanzando poco a poco hasta lo que conocemos hoy en día. Puedes chequear toda su evolución en la web de OPC Foundation si tienes más curiosidad: [https://opcfoundation.org/about/opc-foundation/history/](https://opcfoundation.org/about/opc-foundation/history/) #### ¿Cómo funciona la arquitectura OPC? En el modelo cliente/servidor, el servidor expone datos y servicios y el cliente los utiliza según sus permisos. Además de lecturas y escrituras, OPC UA admite suscripciones para recibir notificaciones de cambios. Es el cliente quien pide la información al servidor,  a qué velocidad, y este a su vez, lo obtiene del PLC, en nuestro caso. ### OPC Clásico El OPC *clásico* (OPC DA) depende de Microsoft. Concretamente del componente DCOM ([https://es.wikipedia.org/wiki/Modelo_de_Objetos_de_Componentes_Distribuidos](https://es.wikipedia.org/wiki/Modelo_de_Objetos_de_Componentes_Distribuidos)) Hay varios *sabores* de OPC, si bien el más habitual es OPC DA cuyas características son: - Intercambio de datos entre cliente y servidor en tiempo real en forma de valor, calidad y tiempo (VQT) - Permite navegar y acceder a la información del servidor - La velocidad de recolección de datos puede ir hasta los 10ms. - Permite lectura y escritura Si el servidor OPC DA y la aplicación está ubicado en la misma máquina (mismo PC), realmente es sencillo de operar con él. El tema se complica si el servidor OPC DA está en un equipo, y el cliente en otro debido: - Solo soporta Microsoft windows - La configuración de acceso remoto debe considerar DCOM y la red utilizada. - Es necesario configurar los permisos y puertos del firewall. - La autenticación se realiza a través de los servicios de componentes de Windows Vamos, lo dicho. Siempre que se pueda, que el servidor OPC DA y la aplicación HMI o Scada, ahorra muchos dolores de cabeza. A lo largo del tiempo se han ido realizando diferentes variantes de OPC para solventar parcialmente las dificultades presentadas, hasta llegar al OPC-UA, que resuelve para la industria las complicaciones del OPC DA ### ¿Qué es OPC UA? Las siglas UA ya nos dice bastante sobre él ya que significa  Arquitectura Unificada (Unified Architecture) y tiene unas características bien definidas: - No depende del sistema operativo. Puedes encontrarlo en Windows, Linux, Mac.. - No depende por tanto del DCOM de Windows haciendo que sea más amigable con los Firewall. - Incluye todas las características clásicas, en una sola interfaz. La conectividad entre el cliente y el servidor es a través de un puerto TCP dedicado. Además, se puede securizar de una forma sencilla mediante cifrado y certificados. Tienes una pequeña descripción por la propia OPC Foundation en Youtube: https://youtu.be/-tDGzwsBokY #### OPC UA en Siemens Los equipos 1500 de siemens, así como los HMI Comfort disponen de este tipo de protocolo para realizar comunicaciones de forma segura. Tienes información suministrada por Siemens[siguiendo este enlace.](https://support.industry.siemens.com/cs/document/63481236/comunicaci%C3%B3n-a-trav%C3%A9s-de-opc-ua-con-los-sistemas-simatic-hmi-(comfort-panels-runtime-advanced-runtime-professional)?dti=0&lc=es-WW)** La idea es poder comunicar los PLC o los HMI con dispositivos fuera de la red que montas con los PLC de una forma segura y razonablemente sencilla. ### Cómo plantear una primera conexión con un PLC Siemens Un ejercicio útil consiste en leer desde un cliente una variable de prueba del PLC. Antes de escribir sobre una variable del proceso, comprueba la lectura, su tipo y el estado de calidad. La configuración concreta depende del equipo y de su firmware: utiliza el [ejemplo de configuración en TIA Portal](https://programacionsiemens.com/servidor-opc-ua-en-tia-portal) y contrástalo con la documentación de tu CPU. - Identifica la referencia completa del PLC y su firmware. Comprueba que incorpora el servidor y qué licencia necesita. - Define las variables que quieres exponer y los permisos que necesita el cliente. - Configura el endpoint y una política de seguridad compatible en ambos extremos. - Establece la confianza entre los certificados y configura la autenticación de usuario cuando proceda. - Comprueba la lectura y el estado de calidad; después, verifica una suscripción para observar cambios. ### Qué revisar cuando el cliente no conecta Separa el diagnóstico en tres partes: acceso al endpoint, confianza de certificados y permisos. Que el equipo responda a ping no confirma que el servicio OPC UA esté accesible. Que la sesión se abra tampoco implica permiso de escritura sobre todos los nodos. OPC UA ofrece autenticación, integridad y confidencialidad, pero hay que seleccionar y configurar sus mecanismos según la instalación. Fuente: [modelo de seguridad de OPC Foundation](https://reference.opcfoundation.org/specs/OPC-10000-1/4.4.1). Para continuar, tienes el [servidor OPC UA en TIA Portal](https://programacionsiemens.com/servidor-opc-ua-en-tia-portal) y un enfoque con [Node-RED](https://programacionsiemens.com/como-montar-un-servidor-opc-ua-con-node-red-i). Si buscas otra forma de intercambiar datos con un S7, revisa el ejemplo de [Python y Snap7](https://programacionsiemens.com/leer-y-escribir-datos-de-un-s7-con-python-y-snap7); utiliza otro mecanismo de comunicación y no sustituye automáticamente a OPC UA. ### ¿Ya has practicado? ¿Qué PLC y cliente estás utilizando? Cuéntalo en los comentarios: la referencia, el firmware y el mensaje de error ayudan mucho más que decir solamente «no conecta». --- # Un pequeño Roadmap del IOT para la Industria 4.0. > Industria 4.0 e IoT: un pequeño roadmap para empezar a digitalizar tu planta, captar datos y elegir por dónde arrancar sin perderte entre tecnologías. Fuente: https://programacionsiemens.com/un-pequeno-roadmap-del-iot-para-la-industria-4-0 · Autor: Iñigo Gútiez · Publicado: 2019-03-03 · Actualizado: 2019-03-03 · Categoría: Actualidad y profesión Hace unos días [te exponía mi opinión sobre lo que la industria 4.0 nos va a traer consigo](https://programacionsiemens.com/la-industria-4-0-te-afecta-como-programador-industrial/) de cara a nuestro trabajo. La cuestión ahora es cómo aterrizar estos temas en algo más tangible y por dónde arrancar. A continuación, solo te expongo una pequeña parte. Ni que decir tiene que hay más vertientes que desconozco, y  que habrá muchas más tecnologías que vendrán en el futuro. Es tan solo un pequeño roadmap para empezar por algo conocido para que con el tiempo, puedas ir abriendo más caminos. ### El Roadmap Para empezar, hemos de tener en cuenta que la mayoría de las industrias existentes actualmente no están preparadas para lo que conlleva la industria 4.0 respecto a la obtención de datos. No es así con el nuevo hardware, pero seamos sinceros: las líneas de producción no se cambian todos los años, ni siquiera todos los lustros, sino que hablamos de décadas de trabajo sin descanso hasta que la tecnología se queda completamente obsoleta, y ya no hay nada más que exprimir. Al menos, en las industrias convencionales. Por tanto, están saliendo al mercado diferentes soluciones a esta problemática: cómo poder obtener los datos de las instalaciones productivas sin tener que cambiar lo que ya tenemos. #### Las pasarelas industriales Las pasarelas industriales no son mas que pequeños añadidos de hardware y software orientados a conectar las líneas de producción con el exterior. Siemens, por ejemplo, sacó al mercado en su día el IOT2020 y posteriormente el IOT2040 para solucionar este pequeño problema [(del que ya hablamos en su momento)](https://programacionsiemens.com/simatic-iot2040-la-pasarela-inteligente-de-siemens/). Pero hay muchos más fabricantes que están trabajando en estas soluciones, cada uno con un enfoque, o sabor diferente. #### Equipos IOT Seguro que en algún momento tendrás que extraer datos de este estilo: temperatura ambiente, humedad, vibraciones de una máquina, presión.. Pueden ser valores que no necesariamente tengan un PLC detrás al que ser conectados. Para este tipo de situaciones, hay infinidad de equipos  que te permiten interactuar y obtener datos de ellos. A nivel doméstico, por ejemplo, se pueden tener enchufes inteligentes que controlen la conexión y desconexión de un termo eléctrico o bombillas inteligentes. Estas las puedes encender o apagar con un simple "Ok, Google" o una llamada a Alexa. También tienes cosas tan simple como útiles como encender la calefacción de casa una hora antes de llegar a casa simplemente pulsando un botón en la pantalla de un móvil. Esto que en el ámbito doméstico nos parece cada vez más normal, va en paralelo con la industria. A grandes rascos, la idea es la misma. Muchas empresas están desarrollando pequeñas aplicaciones que resuelven problemáticas hasta ahora complejas o costosas, y que mediante hardware muy barato y una conexión a Internet, son posibles de solventar. Desde crear sistemas de hombre muerto a distancia con un par de Arduino con LoRa, cosas más comunes como la gestión de iluminación, cámaras, apertura y cierre de puertas, asistencia remota... y todo de forma remota sin cables de por medio. #### Almacenamiento de los datos en la nube No vamos a entrar en hablar del big data y el machine learning, pero toda esta recogida de datos, tiene que servir para algo. Los datos en sí no valen nada si no son tratados posteriormente y se convierten en información valiosa. Estos datos, podrán ser almacenado como digo para ser tratados por máquinas o simplemente, para ser visualizados por humanos para que estos puedan tomar decisiones en tiempo real. Así, el sacar alarmas, gráficas de tendencias etc será muy útil para el diagnóstico y toma de decisiones de alguien que no tenga que estar en la planta en esos momentos. Recientemente nos presentaron cómo se puede implementar la realidad aumentada en una planta para la gestión de mantenimiento, alarmas, procedimientos... que lógicamente necesita comunicación con las máquinas y almacenamiento de datos en la nube. ### El hardware y el software Tendrás que atacar a modo de resumen, dos vertientes: - El hardware, bien con nuevos equipos o pasarelas para adecuar las líneas existentes a los nuevos tiempos además de crear dispositivos IOT - El software que maneje las pasarelas, almacenamiento en la nube y que lo muestre en dispositivos móviles. Lo que yo te propongo es que comiences a quitarle el miedo. Para ello no hace falta comprar super costosos aparatos de miles de euros, sino un equipo como el el IOT2040 de Siemens, conocer plataforma como Arduino y lo que te puede ofrecer, [o una simple Raspberry,](https://amzn.to/2NxQ6nK) que por poco más de 35 euros, te va a servir como plataforma de aprendizaje. En el fondo, y para que te hagas una idea, podrás hacer casi lo mismo con un IOT2040 de Siemens que con una Raspberry. Lógicamente a la hora de implementarlo en una línea de producción lo suyo es una pasarela industrial y no una plaquita de aprendizaje. Pero para aprender, ver cómo funciona,  y quitarle el miedo, es más que suficiente. Ni que decir tiene que los equipos arduino son verdaderas maravillas con las que comenzar a trabajar en el mundo de los equipos IOT. Por muy muy poco dinero, puedes montar equipos que registren datos de todo tipo además de poder interactuar con ellos. Respecto al software, tendrás que aprender a manejar los diferentes sabores que hay para manejar el Arduino (aunque solo sea el IDE de Arduino), Node Red etc además de manejar los protocolos más extendidos en IOT como pueden ser MQTT o REST Además, deberás conocer el OPC-UA, que se está convirtiendo el estándar en la industria para obtener datos de los equipos y sacarlos a servidores debido a ser un protocolo seguro (firmado y encriptado) y mucho más fácil de manejar que los OPC tradicionales como OPC DA Como ves, mucho trabajo por hacer y aprender. No te queda otra que ponerte manos a la obra, ya que son temas en los que no te puedes quedar atrás, porque quieras o no, vas a tener que lidiar con ellos en mayor o menor medida en el futuro próximo, si es que no lo estás haciendo ya. ¿En qué punto te encuentras tú? --- # Cómo hacer un filtro EMA en TIA Portal (SCL) > Aprende a implementar un filtro EMA (media móvil exponencial) en TIA Portal con SCL. Incluye código completo, fórmula y ejemplo práctico paso a paso. Fuente: https://programacionsiemens.com/filtro-ema-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2018-10-10 · Actualizado: 2018-10-10 · Categoría: Analógicas y regulación Hoy vamos a ver cómo crear un **filtro EMA en TIA Portal** usando SCL, con la fórmula, un bloque de función completo y un ejemplo paso a paso para que lo tengas funcionando en tu autómata. Ya veo que te has quedado con las cejas arqueadas pensando... ¿soy el único que no sé qué es un filtro EMA? Pues no, no lo eres. Seguro. El filtro exponencial EMA (Exponential Moving Average), o en castellano media móvil exponencial, tiene varias características muy chulas para nuestros PLC: - Es muy sencillo de implementar. - Carga muy poco la CPU. - Puedes configurar fácilmente si quieres un filtrado paso bajo o paso alto. - No necesita guardar un array de muestras, solo el valor anterior. Normalmente realizamos filtrados del ruido mediante filtros por muestreo, [como ya vimos en el post del filtro definitivo en TIA Portal](https://programacionsiemens.com/como-crear-filtro-definitivo-tia-portal-definitvo/). Tomamos el valor de la señal, hacemos una media, o similar, y ya está. Funciona, y funciona muy bien. Pero hoy damos un pasito más, ¿te parece? ### ¿Qué es el filtro EMA y para qué sirve en un PLC? El filtro EMA es una media móvil que da más peso a las muestras recientes y menos a las antiguas, de forma exponencial. En vez de guardar las últimas N lecturas y promediarlas, solo necesitas el valor filtrado del ciclo anterior. Eso lo hace ideal para el PLC, porque apenas ocupa memoria y no carga la CPU. La fórmula que vamos a aplicar es la siguiente: ``` An = Alpha * Señal + (1 - Alpha) * An-1 ``` Donde: - An: señal filtrada del ciclo actual. - Alpha: un valor entre 0 y 1 que ajusta la agresividad del filtro. - An-1: señal filtrada del ciclo anterior. De la fórmula se desprenden varias cosas: - Con Alpha = 0, no obtendremos señal alguna, ya que no tendríamos en cuenta la señal actual (el filtro se queda congelado en el valor anterior). - Con Alpha = 1, no habría filtrado, y el valor filtrado sería igual a la señal sin tratar. - Es tremendamente sencilla de aplicar, porque se trata de realizar dos multiplicaciones y una suma. **Regla práctica: cuanto más pequeño el Alpha, más suave (y más lento) el filtrado. Cuanto más grande, más rápido responde pero deja pasar más ruido. ### ¿Cómo implementar el filtro EMA en TIA Portal? Yo lo voy a hacer en SCL bajo TIA Portal, pero es aplicable a Step 7 tradicional sin ningún problema, y en FUP (KOP también, aunque queda más engorroso). La idea es crear un bloque de función (FB) con memoria propia para guardar el valor filtrado anterior, y luego llamarlo desde el OB1 con la señal que queramos filtrar. Estos son los pasos: - Crea un bloque de función nuevo, por ejemplo FB_FiltroEMA, y márcalo como lenguaje SCL. - Define la interfaz: una entrada para la señal cruda, una entrada para el Alpha, una salida para la señal filtrada y una variable estática (Static) para guardar el valor anterior. - Escribe la fórmula dentro del bloque. - Llama al FB desde el OB1 con su DB de instancia. #### Interfaz del bloque FB_FiltroEMA Configura la interfaz del FB así: - Input: `Senal_In : Real` (la señal a filtrar). - Input: `Alpha : Real` (valor entre 0 y 1). - Output: `Senal_Filtrada : Real` (la salida filtrada). - Static: `An_1 : Real` (memoria del valor filtrado anterior). #### Código SCL completo del filtro EMA Este es el cuerpo del bloque FB_FiltroEMA**: ``` // FB_FiltroEMA // Filtro de media movil exponencial (EMA) // An = Alpha * Senal + (1 - Alpha) * An-1 // Limitamos Alpha entre 0 y 1 por seguridad IF #Alpha > 1.0 THEN #Alpha := 1.0; END_IF; IF #Alpha "Temperatura_Filtrada"); ``` Con `Alpha := 0.2` tendrás un filtrado suave (paso bajo), que elimina bien el ruido pero responde con cierto retardo. Si necesitas que reaccione más rápido, sube el Alpha. #### Cómo elegir el valor de Alpha (paso bajo o paso alto) Este es el punto donde la gente se atasca. Te dejo una orientación práctica: - Filtrado paso bajo (señal suave): Alpha en torno a 0,6 o más alto. Deja pasar los cambios lentos y respeta bastante la señal. - Filtrado más agresivo contra ruido: Alpha en torno a 0,2. Suaviza mucho, pero introduce retardo. Lo mejor es que dejes el Alpha en una variable y lo ajustes en caliente desde el HMI mientras miras la señal filtrada en una curva. En dos minutos encuentras el valor que te encaja para tu proceso. ### El vídeo del ejemplo paso a paso Para realizar el ejemplo, he usado: - El generador de señales de temperatura en SCL que ya vimos aquí, perfecto para meterle ruido y ver cómo trabaja el filtro. - El Bloque 4 del curso de TIA Portal dedicado a SCL, donde vemos a fondo los FB y las variables Static. - El curso de crear HMI con Snap7 para visualizar la señal filtrada. Let's go! ### ¿Qué te ha parecido? Espero que te haya parecido interesante. Como ves, con un FB de cuatro líneas de SCL ya tienes un filtro EMA que carga poquísimo la CPU y que puedes ajustar entre paso bajo y una respuesta más rápida solo tocando el Alpha. Si vienes de filtrar por muestreo, te recomiendo que compares este método con el del [filtro definitivo en TIA Portal](https://programacionsiemens.com/como-crear-filtro-definitivo-tia-portal-definitvo/). Verás que el EMA te ahorra memoria y código. Y si quieres soltarte del todo con SCL para hacerte tus propios bloques, en el [curso de SCL en TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) montamos bloques como este paso a paso. ¡¡Espero tus comentarios!! Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com)** donde, por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # El caso del tracking de las napolitanas > Programación PLC Siemens en la práctica: un caso real de tracking de napolitanas resuelto por un alumno con lo aprendido en los cursos de Step 7. Fuente: https://programacionsiemens.com/el-caso-del-tracking-de-las-napolitanas · Autor: Iñigo Gútiez · Publicado: 2018-07-04 · Actualizado: 2018-07-04 · Categoría: Programación PLC Recientemente he recibido una consulta de Jorge,**[alumno de los cursos Step 7 tradicional y TIA Portal](https://programacionsiemens.com/catalogo-de-cursos/)**, el cual ya implanta en su vida profesional ya que como me dice en su consulta: **Gracias a lo que he aprendido con tus cursos he conseguido desarrollar más de un proyecto de automatización en la empresa donde trabajo actualmente. Creo que he crecido un par de centímetros al leerlo. Es genial que lo que van aprendiendo mis alumnos de la plataforma, lo puedan ir aplicando en la industria, que es de lo que se trata. Ni que decir tiene, que el 99% del mérito es de Jorge, por haber tomado la decisión de formarse, y de ponerse en serio con ello y meter las horas necesarias para lograrlo. Yo solo pongo el grano de arena de enseñar, lo poco o mucho que sé, a través de los cursos que voy sacando. Mi enhorabuena desde aquí para él. Al tema. Me ha pedido si podía darle otro enfoque a un problema que ya ha resuelto. Se trata de realizar un tracking en el proceso de fabricación de napolitanas**. Las napolitanas van pasando por una banda a velocidad constante y medido con un encóder. Todo ello está gobernado con un S7-1214 y una KTP 700. La idea es que tras ser detectadas por un sensor, un poco más adelante (320mm), tienen que ser pulverizadas con huevo. Sí, para los que no se acercan a la cocina ni a coger un vaso de agua (que ya sé que no eres tú), el brillo de las napolitanas, empanadas etc, se hace con huevo, no con barniz de pintar las puertas. ### ¿Se puede mejorar el programa? Jorge lo ha planteado, a mi juicio, bien: cada 10mm de avance, pongo un cero o un 1 en un bit de una doble palabra en función de si hay detectado la napolitana, y desplazo hacia la izquierda todo el doble word. Posteriormente, leo el bit correspondiente a los 320mm que coincide con la pulverización: si está a uno, pulverizo. Si está a cero, pues no. La pregunta que me hace es si cree que está bien así, y si se podría mejorar. La respuesta es SÍ rotundo si la precisión es suficiente, y SÍ, se puede mejorar. Una cosa que nos tiene que quedar claro cuando programamos es que no hay una única solución válida. Cada programador que se enfrente  a un mismo problema, encontrará seguramente una solución diferente. Unas se parecerán más entre sí que otras, pero cada uno, lo habrá planteado de forma diferente. Si funciona, es estable, y no tiene errores de concepto graves, el programa está bien. Otra cosa es que sea mejorable. Pero es que siempre lo son. Siempre habrá una forma de mejorar en algo lo que has hecho. ¿Pero merece la pena el esfuerzo frente a la mejora? Esa es la cuestión. Si el programa cumple con las expectativas del cliente, es entendible por un programador extraño, y no hace cosas extravagantes, no deberías preocuparte por no haber dado con la solución óptima. Si es una buena solución, ¡ya está! Bien es suficiente. O al menos, así lo veo yo. Con el tiempo, irás mejorando, y cada vez los programas serán más completos y mejores en todos sus aspectos. Habrás programado mucho, habrás visto como lo hacen otros, y te quedarás con las prácticas que te gusten y descartarás las que no. Lo que se dice [Reid Hoffman](https://es.wikipedia.org/wiki/Reid_Hoffman), cofundador de LinkedIn, es aplicable aquí: si no te avergüenza la primera versión de tu producto, lo lanzaste muy tarde. Aquí es igual: ¡claro que me avergüenzo de la forma de programar en mis primeros proyectos! ¡Han pasado 15 años desde mi primer programa con un PLC de Siemens! Estaría bueno que no hubiera aprendido nada desde entonces. ### ¿Qué otra opción se podría haber usado? Apoyándome en su idea, le he propuesto otra forma de hacerlo. Marcar un bit dentro de una cadena de bits como ha hecho Jorge, y mover el conjunto es una buena idea. El problema que le encuentro es que puede que la precisión de 10mm no sea suficiente. O puede que mañana la distancia sea mayor, y 32 bits sean realmente pocos. Por tanto, le he propuesto una solución un poco más definitiva. Yo lo que haría es un array de bits y mover este array. Imaginemos que tenemos 1000 bits, y cada bit, es un milímetro. Solo haciendo esto, hemos aumentado la precisión 10 veces, y la longitud que podemos controlar por 3. Ni que decir tiene, que si fuera necesario, podrían ser más bits, por lo que aumentaríamos la precisión y la longitud a nuestra conveniencia. Pero supongamos que así, está bien. La idea, como digo es la siguiente: - Crear un array de 1000 posiciones de bit - Poner en el bit 1 del array, el estado del sensor: 0 o 1 en función si hay napolitana o no - Copiar el array completo a un dummy de iguales dimensiones - Devolver las posiciones del dummy desde la 1 a la 999 a las posiciones 2 a la 1000 - Poner a cero la posición 1 a la espera del siguiente ciclo. Para facilitar este trabajo, que es realmente sencillo en TIA Portal, lo vamos a hacer en SCL. Tendremos en el bloque la siguiente información como entrada: - Estado del sensor (0 o 1) - Distancia desde el sensor hasta la dosificación Como salida tendremos - Dosificación activa (1) o inactiva (0) That's all folks! ¿Lo vemos? ### Vídeo del tracking de las napolitanas En el siguiente vídeo te muestro qué solución le propongo a Jorge: Let's go! ### ¿Qué hay de ti? ¿Como mejorarías tú el problema de Jorge? ¿Se te ocurre una forma de hacerlo diferente en TIA Portal? Como ves, en SCL se pueden hacer cosas super interesantes en cuatro líneas de código. Si quieres profundizar en la programación de SCL, y hacer este tipo de cosas como Jorge, recuerda que el** [curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) **tiene incluido la programación desde cero de SCL. #### Actualizado: Pues me han propuesto hacerlo sin el array dummy. Y es verdad, no es necesario. Con hacer: #Datos[1] := #Detector_Fotocelula; MOVE_BLK(IN:=#Datos[1], COUNT:=999, OUT=>#Datos[2]); #Datos[1] := FALSE; #Activar_Pistolas := #Datos[#Distancia_mm_Pistolas]; Es suficiente. Con un solo array. Por otros temas, me puse las orejeras con el dummy. Pero no hace falta ¿Veis? Siempre hay alguien que tiene una idea mejor jeje. --- # Requisitos TIA Portal: ¿Qué portátil comprar? > Requisitos de TIA Portal: descubre qué portátil comprar para programar autómatas, con procesador, memoria, disco y pantalla recomendados para la V18. Fuente: https://programacionsiemens.com/que-portatil-comprar-para-tia-portal · Autor: Iñigo Gútiez · Publicado: 2018-03-17 · Actualizado: 2018-03-17 · Categoría: TIA Portal Una de las posesiones más valiosas como ingeniero de automatización o programador de autómatas va a ser tu PC y/o portátil con el que trabajar todos los días. La cuestión es ¿qué portátil comprar para TIA Portal? ### Requisitos TIA Portal En su día [ya hablé sobre los requerimientos de TIA Portal V13.](https://programacionsiemens.com/requisitos-de-tia-portal-v13/) Los requerimientos de TIA Portal V18 han subido hasta los siguientes: - Procesador: Intel ® Core ™ i3-6100U, 2.3Ghz o similar - Memoria principal: 16 GB de memoria (8GB mínimo ; 32GB para proyectos grandes) - Disco duro: 50 GB SSD libres de disco duro - Gráficos: Mín. 1920 x 1080 - Pantalla: 15,6" display de pantalla ancha (1920 x 1080) En cuanto al Sistema Operativo en principio de Windows 10 para delante parece que no hay grandes problemas para las últimas versiones de TIA Portal V17 y TIA Portal V18 Esto es lo que dice[la propia Siemens para TIA Portal V17:](https://support.industry.siemens.com/forum/es/en/posts/tia-portal-simatic-manager-requirements/276405) Esto lo que indica es que es un auténtico glotón de memoria. He de decir, que he probado desde TIA Portal con 4Gb, pasando por mi portátil de casa con 12GB, portátil de la empresa, máquina virtuales, y mi PC de sobremesa con 16GB. ¿Resultado? Bastante dispar en función del rendimiento del equipo. Y es que no debes montar TIA Portal con 4GB de RAM y discos duros mecánicos porque es tremendamente lento, especialmente en el arranque del  programa que se vuelve exasperante. Una vez cargado, lo cierto es que no va tan mal, pero las velocidades de acceso a ciertos menús, compilado y conexionado con el PLC, se hacen eternos a veces. Avisado estás. Mi portátil personal, va regular, tirando a lento. Esto es debido principalmente a que el microprocesador es un i5 que tiene muy bajo consumo, pero poca potencia. Es como un 25% más lento de lo que propone Siemens. Pero no es la peor característica que tiene como luego te contaré. Claro que cuando lo compré, no necesitaba tener TIA Portal en él. Finalmente está mi joya de la corona que es el PC desde el que te escribo. Es un PC que compré en el 2015 y que unos años después está en plena forma debido a que elegí unos buenos componente, y lógicamente, invertí un buen dinero en él. Sobre él, hablamos si te parece en otro post más adelante ya que hoy vamos a hablar sobre portátiles. ### ¿Qué portátil comprar para TIA Portal? La cosa está clara: un portátil que cumpla como mínimo las recomendaciones de Siemens. Digo que tiene que cumplir mínimo las recomendaciones de Siemens porque lo suyo es que las aumentes al menos un 25% si es posible. En el tema de la memoria la cosa va a estar complicado, ya que no hay muchos portátiles que vengan con 16GB preinstalados, por lo que es casi imposible de superar este número. Pero no escatimes en el micro, por ejemplo. Vayamos por partes. #### Microprocesador para mover bien TIA Portal Siemens propone un Intel ® Core ™ i3-6100U, 2.3Ghz como potencia mínima para mover TIA Portal. Lo primero que tienes que saber es que no todos los i3, i5 o i7 son iguales. Esas son las series de Intel para que el usuario asocie un poco el nivel de prestaciones de la gama (i3=baja, i5=media, i7=alta). Pero no serán iguales los i7 de sobremesa con los de portátil, ni serán lo mismo los microprocesadores de octava generación con los microprocesadores de la segunda. Por tanto habrá i5 que pueden tener mejor desempeño que i7 en función del modelo y año. Así que cuando alguien te diga... tengo un i5, no está indicando gran cosa si no sabemos nada más: los hay bastante potentes, y con rendimiento bastante discreto. Una página que está genial para realizar comparativas es [cpubenchmark.net:](https://www.cpubenchmark.net/) ahí puedes comparar todas las CPU del mercado, ver sus características, precios, consumos etc. Para lo que nos ocupa,  elegir un portátil, necesitamos saber qué prestaciones necesitamos. El desempeño necesario lo obtendremos introduciendo la CPU de Siemens en el buscador. El resultado para el modelo Core i5-3320M, 3,3 GHznos es de 2627 puntos. O sea, muy muy bajita. En cambio, si tomamos la SIMATIC PG M6 Comfort monta un Intel® Core™ i5-8400H (2,5 - 4,2 GHz que tiene una puntuación de 7915 puntos. Esta puntuación es más adecuada a los portátiles modernos que podemos encontrar. Esa puntuación la tomaremos como referencia para saber si la CPU  del portátil que estas mirando, cumple las especificaciones habida cuenta que es la que monta la propia Siemens en su Simatic PG. Como hemos dicho que no queremos andar muy justos, elegiremos por tanto una CPU que tenga más de 8000 puntos en cpubenchmark.net, que tampoco es una barbaridad hoy en día.. #### RAM Aquí poco hay que decir: necesitamos cuanta más memoria, mejor. Y si es DDR4, mejor que DDR3 ya que es más rápida. A la hora de elegir el portátil, tendremos dos alternativas: - Que el portátil venga con 16GB directamente - Que el portátil tenga 8GB en un solo banco de memoria, y tenga dos bancos. He puesto en negrita lo de los 8GB en un solo banco de memoria, porque luego lo que haremos será ampliar el portátil con otros 8GB más. Pero ojo: si bien normalmente suelen tener dos bancos de memoria, puede que el portátil venga con una configuración 4+4GB. Esto es malo para nuestros intereses porque nos dejaría ante la disyuntiva de quedarnos con 12 GB (4+8GB) o bien tener que comprar dos módulos de memoria de 8GB y deshacernos de los 4+4GB con el desaprovechamiento económico que ello supone. Lo malo, es que costará averiguar en muchos casos la distribución de la memoria en caso de tener 8GB. En principio, si no logramos averiguarlo, debemos pensar que es 4+4,  para no llevarnos sorpresas. Normalmente si hacen el esfuerzo de poner un banco de 8GB, está indicado. #### Disco duro SSD Ni que decir tiene que el disco duro tiene que ser SSD. Por tres motivos: - Rapidez - Fiabilidad - Duración de la batería La primera característica está clara:** un disco duro SSD es muchísimo más rápido que un disco duro mecánico**, especialmente uno de portátil que gira a 5600rpm. No hay color. Punto. Es una verdad tan absoluta como que todos los días sale el sol, aunque aquí en Bilbao, comenzamos a dudar si está ahí, tras las nubes. Respecto a la fiabilidad, los SSD tienen una característica para los programadores a pie de máquina que solo ellos pueden apreciar como un vaso de agua en el  desierto: **no tiene partes móviles**. Esto, que puede parecer un poco chorra, es de importancia capital. Al estar en campo, el portátil lo mueves muchísimo. No es lo mismo tener el portátil plácidamente colocado en una mesa de oficina, que estar moviéndote todo el día con el de un lado para otro. No será el primer disco duro de portátil mecánico que juega malas pasadas por moverlo encendido. Esto no pasa con un SSD que no tiene partes móviles. Además, al no tener partes móviles, alargará la vida de tu batería cuando no tengas un enchufe cerca, que en algunos casos, puede ser bastante importante tener ese extra de tiempo sin tener que conectarte. Por tanto, SSD de cabeza. En cuanto a la capacidad, creo que bajar de 256GB es una auténtica temeridad en los tiempos que corren y con lo que ocupa TIA Portal y los Windows actuales. No quiero pensar si tienes que llevar máquinas virtuales encima, que entonces, *es un must* que tu disco duro sea de no menos de 512GB. Hoy en día, hay SSD de formato disco duro de 2,5" o bien memorias M.2 que se pinchan además del disco duro normal de 2.5. Para mi PC de sobremesa, como ya te he comentado, [me compré un SSD Samsung de 512GB en Amazon](http://amzn.to/2Imb0TJ) que va como un tiro. Y es compatible para ponerlo en la mayoría de los portátiles sustituyendo su disco mecánico. Si lo cambias, créeme que parecerá que has comprado un ordenador nuevo. Es una pasada el aumento de rendimiento. Si no tienes uno, no sé a qué estas esperando a ponerle uno. #### Resolución de pantalla. Este es un punto, que muchos podéis pasar por alto, y que luego os arrepentiréis amargamente. Muchos portátiles aún hoy en día se venden con resoluciones tan tacañas para nuestros intereses como 1366x768. Podrías pensar que no es un factor relevante. ¡Já! ¿Tu has visto la cantidad de menús y ventanas que tiene TIA Portal? En una resolución de 1366x768 te será un suplicio trabajar. Lo sé, porque mi portátil tiene esta resolución. Me sirve para realizar pequeñas tareas o programar pequeñas cosas. Es decir, para salir del paso. Pero no programaría un proyecto entero en él ni loco. Por el bien de mi salud. Por tanto, la resolución de la pantalla es más importante que el tamaño de la pantalla en sí, aunque pueda parecer lo contrario. Necesitas sí o sí, una resolución mínima de 1920x1080 (HD) si quieres trabajar como Dios manda. Si te dicen que se puede programar bien TIA Portal en 1366x768, una de dos: o te están mintiendo como un bellaco, o no saben de qué están hablando. Respecto al tamaño de la pantalla (no confundir con resolución), ya dependerá de tus gustos y necesidades... si vas a viajar mucho con él, si es más para tenerlo en la oficina... Cuanto más grande sea, pues se verá todo más grande y será mas pesado. Por el contrario, un tamaño de 13,3" por ejemplo será muy portable y ligero, pero tendrás que tener una mejor vista. *Up to you*, que dicen los ingleses. #### Tarjeta gráfica La gráfica no es un limitante para TIA Potal. Cualquier gráfica integrada en los portátiles que nos vamos a mover va a cumplir de sobra ya que no es un requerimiento para que vaya bien, por lo que no nos vamos a preocupar por ella. Tendrás que tener en cuenta el tema gráfico si además de TIA Portal necesitas el Portátil para otros menesteres como son programas de CAD. Pero eso ya queda fuera del alcance de este post porque el tema de las gráficas es un mundo en si mismo. #### Sistema operativo Una cosa que no es baladí es el tema del sistema operativo. Siemens no acepta las versiones Home de Windows salvo para las versiones Basic de TIA Portal V15. Si quieres programar pantallas Comfort o CPU de las series 300 hacia arriba, tendrás que ceñirte a estas versiones de Windows: Supported Operating Systems **Windows 7 (64-bit)** Windows 7 Professional SP1 Windows 7 Enterprise SP1 Windows 7 Ultimate SP1 **Windows 10 (64-bit)** Windows 10 Professional Version 1703 Windows 10 Enterprise Version 1703 Windows 10 Enterprise 2016 LTSB Windows 10 IoT Enterprise 2015 LTSB Windows 10 IoT Enterprise 2016 LTSB **Windows Server (64-bit)** Windows Server 2012 R2 StdE (full installation) Windows Server 2016 Standard (full installation) **Ojo, porque muchos portátiles vienen con versiones Home, que te obligara a reformatear el PC y meter una licencia Professional de Windows.** ¡¡Avisado estás!! ### Dónde puedes comprar un portátil TIA Portal Aquí ya la cosa va por experiencias personales. Además de los sitios físicos que te podrán aconsejar, yo te recomiendo algunos sitios online en España donde previamente he comprado hardware con buenos precios y buen servicio: - Amazon - PCComponentes - Mercadoactual Ni que decir tiene que hay infinidad de otras buenas tiendas que yo no conozco, o que no tengo referencia por no haber comprado nunca en ellas o cuyo catálogo de portátiles es pequeño. Si vives fuera de España, lógicamente no puedo orientarte ya que esto, más allá de Amazon, va por países. #### Marca de los portátiles Esto es una decisión muy personal. MI experiencia ha sido muy buena con HP, por dos motivos: - La estabilidad del portátil. - Acceso a los componentes La estabilidad del portátil personal que tengo que tengo es bestial. Más allá de las características técnicas, es que es como una roca. Le metí cuando lo compré un SSD (hablamos de finales del 2014) y desde entonces puedo decir con orgullo que no lo he formateado nunca. No puedo decir nada semejante de ningún otro ordenador que haya tenido con anterioridad, ni posterioridad. Tengo buen recuerdo de un Acer que tuve hace muchos años, y un pésimo recuerdo de un Asus que aún poseo: el peor portátil que he tenido jamás. Y me gusta la marca Asus porque me ha dado buenos resultados con otros cacharros. Pero este  portátil en particular no fue nunca bien. En el trabajo hubo muchos problemas con los Toshiba en su día... y ni que decir tiene que tener una PG de Siemens es una garantía si quieres programar en TIA Portal. Eso sí, prepara la cartera si quieres uno. Así que esto es como los coches. Si te va bien, es genial. Si tiene muchas averías, maldices el coche y la marca. En definitiva, no hay una marca buena o mala *per se*. Dependerá del modelo y sus componentes, o de la unidad en sí que te salga mejor/peor que la media. En general, te tendrás que mover en gamas profesionales que te permitirán, en algunos casos, incluso realizar un downgrade hacia Windows 7 si lo prefieres porque haya drivers para ello. También es cierto que hay gamas de Gaming que da un repaso en cuanto a prestaciones a algunas gamas profesionales. Pero su aspecto suele ser poco profesional. #### No es un portátil para jugar Lamentablemente un buen portátil para programar en TIA Portal, no va a ser barato. Lamento decirte que si crees que con poco dinero vas a tener grandes resultados. Te podrá valer si lo quieres para ir aprendiendo y  lo usas a nivel particular. Si lo que quieres es un portátil para trabajar, todo tiene que ir rápido y estable. Por tanto, como dice el dicho castizo... *compre caro majestad, que la Corte no está para gastos.* Dicho esto, vamos a ver qué nos encontramos por ahí y... ### Busquemos algún modelo para programar en TIA Portal #### Aclaraciones previas Antes de nada, y para que quede claro, estos enlaces que te pongo, son de afiliado. Es decir, si compraras el producto a través de este enlace, a ti te cuesta exactamente lo mismo, y yo me llevo una pequeña comisión. Digo esto, porque quiero ser completamente transparente contigo en este aspecto. Otra cosa que debes tener en cuenta es que los precios de Amazon varían en el tiempo, por lo que no te extrañe que si visitas los enlaces, los precios hayan cambiado ligeramente. #### Los modelos No es fácil encontrar portátiles que cumplan todas las características que no superen ampliamente los 2000 y 3000 euros (por ejemplo las maletas de Siemens) A casi todos les falta alguna de ellas: o no tiene 16GB, o no tiene SSD, el teclado no está en español o viene con windows 10 Home... o es para gaming y su aspecto es de todo, menos profesional. Rebuscando, y para el que lo quiere todo, todo y todo de una tacada te puedes ir a modelos de este estilo: ##### Amazon (1.723,89€ IVA Incluido): Gigabyte Aero 14K - Ordenador portátil de 14" Cumple todas las características: un i7 potente (8878 puntos), 16GB DDR4, 256GB SSD, 14", 2560x1440... Con este, tendrías todas las características en un par de clicks. Pero como ves, barato, lo que se dice barato... no es. Como puedes comprobar por ti mismo, hay unas cuantas alternativas en el mercado de este estilo que lo cumplen todo. Te encantan... hasta que ves el precio: - Lenovo ThinkPad P70 2.7 GHz i7 - 6820hq 39.6 cm/15.6 "3840 x 2160pixeles Negro - Hp - Zbook studio g3 mobile workstation - Dell Precision 7520 - Ordenador portátil de 15.6" - Y un largo etcétera... Todos los portátiles que he visto, que tengan todo sacado de la caja (incluyendo teclado español y que no tenga Windows 10 Home), superan ampliamente los 1500€ #### Do it yourself Ahora bien, podemos hacer un poco de bricolaje sencillo, añadiendo memoria y cambiando el disco duro... y nos ahorramos unos cuantos euros por el camino. Tenemos dos muy buenas opciones: ##### A) HP Pavilion Power 15-cb033ns - Ordenador portátil de 15.6" 8GB, 128SSD+1TBHD (899€ IVA Inc) Es un portátil que tiene un i7-7700HQ (8878 como en el caso del Gigabyte), con 1 módulo de 8GB DDR4, 1920 x 1080, un SSD de 128GB y 1HD de 1TB ##### B) HP Pavilion Power 15-cb036ns - Ordenador portátil de 15.6" 4GB, 1TBHD (699€ IVA Inc) Es un portátil que tiene un i7-7700HQ (8878 como en el caso del Gigabyte), con 1 módulo de 4GB DDR4, 1920 x 1080  y 1HD de 1TB . Es decir, la diferencia entre el A y B está en la memoria de 128GB SSD y que tiene 4GB más. En ambos casos, podemos complementar el portátil con: - ###### Samsung 960 EVO NVMe M.2 250GB - Disco duro sólido de 250 GB(109€ IVA Inc) - ###### Samsung 850 EVO - Disco duro sólido 500GB (128€) - ###### Samsung 850 EVO - Disco duro sólido 1TB (299€ IVA Inc) - ###### Crucial CT8G4SFS824A - Memoria RAM de 8 GB DDR4 (77,21€ IVA Inc) - ###### Microsoft Windows 10 Pro 32/64 Bits Clave Licencia 100% Genuina (29€ IVA Inc) Eligiendo la opcion B, y añadiendo 8GB de RAM y el SO, tenemos un buen portátil, por unos 1000€ (IVA inc). Con la opción A, podemos sustituir el HD mecánico por un SSD de 1TB y sumarle los 8GB (obteniendo 12GB) por unos 1100€ con el SO. Si nos vamos al tope de gama, elegimos la opción B sustituyendo el HD mecánico por un SSD de 1TB, poniéndonos en unos 1300€. Si nos vamos a la opción más comedida, podemos optar por la opción A sumándole un SSD M.2 de 256GB, añadiendo 8GB de memoria RAM, obteniendo 12GB, en vez de 16, pero por poco más de 900€. Puede parecer mucho, pero si quieres unas altas prestaciones, no queda otra que pasar por caja. Revisa los enlaces si estás interesado y comprueba bien que todo sea compatible (que creo que sí), ya que la última decisión y responsabilidad de compra lógicamente es tuya. Como ves en la imagen obtenida de [notebookcheck.com](https://www.notebookcheck.net/HP-Pavilion-Power-15t-cb2000-i7-7700HQ-Radeon-RX-550-Laptop-Review.232768.0.html), la tapa trasera se puede retirar y acceder a las memorias y disco duro. Luego, eso sí, tendrás que instalar Windows 10 Pro ya que como el procesador es de la séptima generación, ya no hay soporte para Windows 7 y puede que te de muchos más quebraderos de cabeza que simplemente irte a Windows 10. Seguramente haya otras configuraciones validas, pero si es de marca reconocida como HP, si pones un buen micro, 1920x1080,  SSD y 12/16 GB de RAM, no creo que lo puedas encontrar por mucho menos. A partir de ahi, puedes ir limando características y precio. Pero eso ya te lo dejo a ti. #### Mi opción personal Yo me decantaría sin duda por el HP, instalando el SO y añadiendo el hardware necesario. Mi opción personal sería esta: - B) HP Pavilion Power 15-cb036ns - Ordenador portátil de 15.6" 4GB, 1TBHD (699€ IVA Inc) - Crucial CT8G4SFS824A - Memoria RAM de 8 GB DDR4 (77,21€ IVA Inc) x 2 bancos de memoria - Samsung 850 EVO - Disco duro sólido 500GB (128€) - Microsoft Windows 10 Pro 32/64 Bits Clave Licencia 100% Genuina (29€ IVA Inc) - Inateck Caja con USB 3.0 para Disco Duro Externo HDD de 2.5'' (11,99€ IVA Inc) Total: 699+ 77,21x2 + 128 + 29+11,99 = 1022,41€ Lógicamente me sobra los 4GB  y el disco mecánico que vienen con el portátil, pero por 1000 euros tengo todo y un disco duro externo de 1TB para realizar copias de seguridad: - Procesador i7-7700HQ mucho mejor que el Core i5-3320M, 3,3 GHz - 16GB de RAM DDR4 (mejor que DDR3 que aún existen en muchos modelos) - 500GB de SSD (más que suficiente para trabajar con holgura en el portátil) - 1920x1080 ( - Una gráfica (GTX 1050 con 2GB de RAM) que ya es una señora tarjeta para mover Autocad. - Teclado retroiluminado... Sería una muy muy buena combinación bajo mi punto de vista a un precio muy razonable teniendo en cuenta las prestaciones. #### Otras opciones Puedes irte a otras configuraciones menos drásticas, eligiendo un portátil que tal vez lo que le falte sea cambiar el disco duro mecánico por uno SSD o simplemente cambiar el Windows 10 Home por el profesional. Te pongo un par de ejemplos, aunque hay muchos más: - MSI PE62 7RD-1814XES - Ordenador portátil de 15.6" FHD (1.132,00€ IVA Inc)-> Tendrás que añadirle el SO porque viene sin Windows o con Windows Home. - Lenovo Yoga 720-13IKB- Portátil táctil convertible de 13.3"Full HD (1315,45€ IVA Inc)->Tendrás que añadirle el SO porque viene sin Windows o con Windows Home. - Lenovo Ideapad 520S-14IKB - Ordenador portátil de 14" FHD (799,00 IVA Inc) -> Solo 8GB, i5 suficiente pero justo, y con SO Windows Home ### Conclusión Como comprenderás, he realizado un ejercicio simplemente de chequear un poco lo que hay en Amazon (que no es poco) y ver de qué estamos hablando. No se trata de realizar un estudio exhaustivo y encontrar el cojo-portátil, y que encima sea casi regalado. Eso no existe. Al final, verás que hagas lo que hagas, si quieres cumplir las especificaciones de TIA Portal con cierta solvencia, no encontrarás gran cosa si no inviertes unos 1000€ mínimo, y metiendole mano para completar especificaciones. No creo que puedas encontrar todas las características por 800€ (incluyendo IVA). Mi consejo, es que montes tu propia solución customizada. Si no eliges la combinación que te he propuesto, algo que se le parezca. Te va a salir más barato y además, si no lo has hecho nunca, vas a aprender bastante. De ahí para arriba, lo que quieras. De ahi para abajo, tendrás que ir limando especificaciones, que antes o después, acabarás pagando en incomodidades. Si ahora no puedes pagar todo el montante, elige un portátil al que le puedas ampliar sus componentes fácilmente en el futuro. Tal vez tengas que elegir un portátil más básico con 8GB de RAM (menos no te lo aconsejo bajo ningún concepto), y que tenga un HD mecánico. Pero asegúrate de que sea FullHD (1980x1080) y que su micro cumpla que tiene más de 5000 puntos en el benchmark. Porque la memoria y el disco duro lo podrás ampliar, pero no le vas a poder cambiar el micro ni la pantalla, por lo que esto lo debe tener desde el principio. Finalmente, me gustaría saber tu opinión. ¿Conoces alguna alternativa que lo tenga todo y que esté por debajo de los 1000€? ¿Cuánto te has gastado en tu portátil para cumplir las especificaciones? ¿Tienes un portátil que no las cumple todas y que va realmente bien? ¡Quiero ver tus opiniones! Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Cómo crear tareas a tiempo fijo con solo un OB cíclico > OB cíclico en Step 7: aprende a crear tareas a tiempo fijo con un solo OB en las series S7-300 y 400, donde la CPU define los OB de interrupción. Fuente: https://programacionsiemens.com/como-crear-tareas-con-un-ob-ciclico · Autor: Iñigo Gútiez · Publicado: 2017-12-14 · Actualizado: 2017-12-14 · Categoría: Programación PLC Hace unas semanas desde Italia (¡ciao Alessandro!) me preguntaban si su CPU 318 además del OB 35 y el OB32, podía activar otro OB cíclico. Nos estamos mal acostumbrado (en el buen sentido) con TIA Portal y los nuevos PLC, pero en la serie 300 y 400 los OB cíclicos vienen definidos por la CPU. ¿Comooor? Pues sí, es lo que hay. Así como en TIA Portal con los [S7-1200](https://programacionsiemens.com/s7-1200) y S7-1500 puedes crear diferentes OB cíclicos en función de necesidades y eligiendo el numero de OB cíclico, con las series 300 y 400, esto no es así. Los OB cíclicos en estas series quedan definidas por el modelo de CPU que estés usando. No solamente eso, ya que el número de cada OB cíclico está pre determinado. Para modelos actuales, no es un gran problema ya que típicamente tienen cuatro OB ciclico: desde el OB32 al OB35 Pero los modelos más antiguos o modestos pueden tener solamente 1 ó 2 OB cíclicos. Por ejemplo, el caso de Alessandro: solo tiene disponible el OB32 y el OB35 como se muestra en la imagen: La cuestión es que si tienes diferentes tareas a realizar a tiempo fijo ¿cómo lo haces si solamente tienes 1 o 2 OB ciclico? Vamos a suponer que tienes una CPU un poco viejita que solo tiene 1 OB cíclico para que sea todo más claro. Ni que decir tiene que esto que te voy a contar es exportable si tienes un número mayor y lo puedes aplicar parcial o totalmente si fuera necesario. ### Crear tareas a tiempo fijo con solo un OB cíclico La idea es tan sencilla que seguro que se te ha ocurrido, pero quiero compartir esta idea tan básica con personas que igual no han caido en ello como tú y yo. Imagina que quieres que el PLC de Siemens realice 4 tareas a tiempo fijo: 50, 60, 100,  500 ms. He puesto 50 y 60 aunque sea muy raro, para que veas la pequeña limitación. Como ves, con el OB35 *out of the box* que dicen los ingleses tendrías la opción 3: cada 100ms. Pero ¿y el resto? Pues muy sencillo. Lo que vas a hacer es buscar el **MCD o Máximo Común Divisor**... ¡tóma! ¡tóma! y ¡tóma! ...lo que estudiaste en primaria, ¡resulta que te va a servir cuando tienes unas cuantas canas ya! Ahora ya en serio: vamos a buscar el ciclo más alto que hagan que se puedan ejecutar todos los intervalos. En este caso, nuestro MCD es 10ms. ¿Por qué? Porque si ponemos el OB35 a 10ms, nos aseguramos que cada 5 veces podemos ejecutar la tarea de 50ms, cada 6 veces la de 60ms, cada 10 veces la de 100ms y cada 50 veces la de 500ms. ¿Sí, verdad? Vale. ¿Cómo hacemos para que solo se ejecute cuando nosotros queramos como si tuviéramos un OB cíclico para cada periodo? La forma más sencilla es con una marca a modo de contador que vaya de 1 a 50 y que en función del valor de éste, ejecute una u otra tarea. Cuando el contador llegue a 50, lo pones a cero, de tal forma que va a pasar por todas los ciclos al menos una vez. ### ¿Como hacemos con las tareas de 50, 60 y 100ms? Como ves, si lo ponemos de 1 a 50, como idea está bien para ejecutar el de 500ms, ya que así nos aseguramos que ejecutamos este ciclo cada 500ms. Pero en el caso de 50ms, tendrá que ejecutarse en el ciclo 5, en el 10, 15.. etc. Podrías hacer que el contador cuando valga 5 o 10, o 15 o 20... ejecute la tarea. Pues sí. Pero sería poco elegante ¿no crees? La forma *PRO *de hacerlo es usando el comando MOD. #### ¿Qué es el comando MOD? El comando MOD nos devuelve el resto de una división. Por tanto, si cogemos ese contador y hacemos MOD con 5 y su resto es cero significa que es 5, o múltiplo de 5, con lo que tienes que ejecutar la tarea de 50ms. ¿Mola o no mola? #### Houston, tenemos un problema... Antes de que empieces a llorar de la emoción, igual has detectado un pequeñísimo problema. Si hacemos de 1 a 50 el contador, y cuando llegue a 50 lo ponemos a cero... funcionará genial para 50, 100 y 500... pero ¿y con 60? También... ¿o no? Pues no. No funcionará del todo bien. La razón es muy sencilla: 50 no es múltiplo de 6 y por tanto, en el primer ciclo, genial hasta que el contador vale 48... pero es que el siguiente debería ser 54... es decir... ¡el 4 de la siguiente vuelta! ¡Maldita sea! El MOD no nos valdría. Pero tranquilo, porque tus estudios de primaria, vienen al rescate: #### Mínimo Común Múltiplo ¡No me digas que esto no es una fiesta! Si hemos usado el Máximo Común Divisor para determinar el periodo de nuestro OB cíclico... el Mínimo Común Divisor se tenía que apuntar a la juerga ¿no crees? Pues va a ser que sí. Así pues, nuestro contador o índice, no irá de 1 a 50, sino de 1 a ... redoble de tambor... ¡150! Ahora sí, haciendo MOD, todos las tareas se ejecutarán cuando deben ya que cerramos de forma perfecta los ciclos del contador. Estoy viendo cómo se resbalan las lágrimas por las mejillas y te tiembla el labio inferior de pura emoción... #### ¿Es un problema bajar mucho el tiempo de ciclo del OB cíclico? La respuesta es un depende de libro. Si las tareas son muy básicas, podrás bajarlo muchísimo. Si las tareas son muy complejas y largas, entonces lógicamente la cosa se complica más. La idea es que la suma de las tareas no superen los 10ms. Pero si no tienen los tiempos iguales... ¡*melón*! Ya, pero cada 1500ms, se van a ejecutar todas: la de 50, 60, 100 y 500... porque todas tendran MOD igual a cero cuando el contador valga 150. Por tanto, ojo con esto... ¡*listo*! El sistema no es perfecto, pero vale para salir airoso del envite. ### El vídeo En el siguiente vídeo te dejo con un pequeño ejemplo ilustrativo de lo que estamos tratando de poner un OB cíclico a trabajar de esta manera ### ¿Qué te ha parecido? Espero que te haya gustado y te haya abierto alguna puerta en el futuro. Como otras veces, este ejemplo con el proyecto lo colgaré en los anexos del bloque 2 del  [Curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) para que los alumnos lo tengáis siempre a mano. Como imaginarás, esto es más aplicable en las CPU antiguas que solo tenían un OB cíclico. Hoy en día, ya no es necesario porque puedes programar muchos más aunque sea de la serie 300. Pero como nunca se sabe con qué vas a tener que lidiar, está bien saber estas cosillas ¿no crees? --- # HMI de Siemens o una aplicación de PC ¿Qué es mejor? > HMI de Siemens o una aplicacion de PC: compara ventajas e inconvenientes de los paneles basic y comfort frente a un software propio para tu PLC. Fuente: https://programacionsiemens.com/hmi-de-siemens-o-una-aplicacion-de-pc-que-es-mejor · Autor: Iñigo Gútiez · Publicado: 2017-09-27 · Actualizado: 2017-09-27 · Categoría: HMI y WinCC Una de las preguntas que me soléis hacer es ¿Una pantalla HMI de Siemens o una aplicación de PC que conecte con el PLC? ¿Qué es mejor? La respuesta, como casi siempre es... depende. ### HMI de Siemens o una aplicación de PC Elaborando un poco más la respuesta podemos ver las ventajas e inconvenientes de cada una. #### HMI de Siemens: paneles basic y comfort Las pantallas HMI de Siemens están pensadas fundamentalmente como HMI, es decir, como interface entre el hombre y la máquina para poder visualizar estados e introducción de mando y ciertos datos. Además, las HMI de Siemens están pensadas para un entorno industrial. Son táctiles, con botones físicos en algunos casos con un alto grado de protección contra lo que nos podemos encontrar en la industria (típicamente IP65). Son robustas, y en general, suelen dar *poca guerra. * Además  necesitan prácticamente cero mantenimiento más allá de mantener la pantalla limpia. La conexión de estas pantallas con los PLC de Siemens es casi trivial. Su programación mediante WinCC Flexible está pensada para que sea lo más intuitiva posible. Tienes [WinCC Flexible  2008](https://programacionsiemens.com/presentacion-curso-de-wincc-flexible-2008/) para pantallas existentes más antiguas, como en [TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) para la modernas. Finalmente, las pantallas mobile que te permitirán tener controles sin cables, que, en algunos casos, puede serte útil. #### ¿Qué contras tienen los HMI de Siemens? Si bien es cierto que cada vez se pueden hacer más cosas con las pantallas (las comfort tienen más capacidades que las de la serie Basic), están relativamente encorsetadas a lo que Siemens entiende que es necesario para manejar las líneas. En otras palabras: a cambio de tener una interface de desarrollo razonablemente sencillo, estas pantallas no permiten realizar tareas que puede que sean necesarias en tu proceso. Al menos de una forma sencilla. En cuento al precio, pues en general no son elementos económicos. Dependiendo de las dimensiones y prestaciones, pueden ir desde unos pocos cientos de euros a varios miles. Pero por poner una referencia, una pantalla básica pequeña y en B/N son unos cientos de euros. Es pequeña, en B/N y con no mucha resolución. Si nos vamos a las pantallas más grandes, de 15" comfort, estamos hablando de varios miles de euros. Como ves, no son elementos económicos. #### Aplicación en un PC Por otro lado, tienes la posibilidad de montar un PC y crear una aplicación que corra sobre este y que se comunique con el PLC. Ahí tienes un mayor abanico de posibilidades ya que puedes comprar software comercial (como puede ser WinCC, iFIX etc) o crear tu propia aplicación con una suite gratuita como pueda ser Visual Studio Express y comunicar mediante TCP, OPC , etc. La ventaja de estas alternativas frente a los paneles HMI de Siemens es fundamentalmente en cuanto a su versatilidad. No hay límites ya que en un PC podrás programar lo que quieras (especialmente usando entornos estilo Visual Studio). Las pantallas podrán ser mucho más grandes sin que por ello el coste aumente enormemente y la comunicación con otros equipos en general será mucho más sencillo (impresoras, escáner, servidores, bases de datos ect). #### Desventajas de montar una aplicación de PC La principal desventaja de montar una aplicación de PC para comunicar con un PLC es que los paneles de Siemes es mucho más adecuado para aplicaciones sencillas y medianas. Un PC ofrece muchísimas posibilidades, pero no siempre es lo más adecuado. Primero porque un PC da más problemas de estabilidad. Vamos, que de vez en cuando se cuelga (¡gracias Microsoft!). Los PC, aún siendo industriales llevan un mayor mantenimiento en cuanto a limpieza, tienen que estar en sitios más refrigerados que los paneles, necesitas un teclaro y ratón para manejarlos de forma cómoda... en definitiva no son tan robustos y sencillos como lo son los paneles. Además, la programación va a ser en general más compleja. Incluso en WinCC no será tan amigable y sencillo de entender como lo es en WinCC Flexible. Por otro lado, las licencias de software de desarrollo de WinCC, iFIX, Wonderware tampoco es que las regalen precisamente. En general son bastante caras llegando a muchos miles de euros en función del número de variables a manejar y el fabricante. Una combinación muy extendida es un servidor OPC (del fabricante que sea) y añadir una aplicación realizada en Visual Studio (en VB.NET, C# etc). Es una buena opción desde el momento que tienes plena versatilidad y el coste de la licencia es contenido (en general por debajo de los 1000€). La desventaja de este caso es que hay que programarlo absolutamente todo. ### ¿Entonces, qué elijo?¿HMI de Siemens o una aplicación de PC? Después de esta pequeña exposición, la pregunta es clara. Vale. Tenemos mil posibilidades entre elegir un HMI de Siemes o una aplicación de PC: Pero, ¿qué hay de lo mio? Lamentablemente no hay una respuesta genérica y volvemos al punto de partida: depende. Si vas a manejar una máquina en la cual el HMI no deba aportar nada más que los mandos de la máquina, visualizar alarmas, graficar alguna temperatura o presión y poco más... yo me iría a por un panel de Siemens de cabeza. Por el contrario, el PC será tu amigo, si tu aplicación va a necesitar la creación de pautas muy complejas, con muchas tomas de decisión en función de un montón de condicionantes, con grandes registros de datos, comunicaciones con otros equipos... En definitiva, que la propia aplicación te va a chivar lo que necesitas. Piensa los requerimientos antes de hacer nada y evalúa si con un panel de Siemens es suficiente. Si lo es, y no prevés que se necesite más en un futuro, no te compliques. Si desde el principio ya ves que la cosa va a tener mucha tela que cortar, seguramente no solamente necesites algún panel de Siemens, sino que tendrás que aderezarlo con un buen PC --- # Comunicación TCP y UDP en TIA Portal > Comunicacion TCP y UDP en TIA Portal: entiende que son estos protocolos Ethernet y como usarlos para enviar y recibir datos con tus PLC Siemens. Fuente: https://programacionsiemens.com/comunicacion-tcp-y-udp-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2017-07-24 · Actualizado: 2017-07-24 · Categoría: Comunicaciones Usando Ethernet, dos de los protocolos más usados a lo largo y ancho de internet  son TCP y UDP. Se usan para multitud de otros protocolos: - TCP se usan en HTTP o Telnet entre otros. - UDP se usan en DHCP o VoIP, entre otros también. Y cómo no, ambos los podemos usar con nuestros PLC Siemens. Pero empecemos por el principio con algunas definiciones y aclaraciones. ### ¿Qué es TCP? TCP es el acrónimo de *Transmission Control Protocol.  * *S*e usa para enviar y recibir mensajes entre dos equipos en una red. Como bien dice [en la wikipedia](https://es.wikipedia.org/wiki/Transmission_Control_Protocol): [..] *El protocolo garantiza que los datos serán entregados en su destino sin errores y en el mismo orden en que se transmitieron*[..] Esto es una grandísima diferencia entre TCP y UDP como luego veremos. A grandes rasgos, la conexión TCP necesita el establecimiento de una conexión entre ambas máquinas. El solicitante de la comunicación será el cliente y el receptor de dicha comunicación el servidor. Por eso se le suele llamar entorno Cliente-Servidor. La comunicación se realiza en ambas direcciones enviando datos desde el cliente al servidor y del servidor al cliente. Cuando visitas este blog, tu PC sería el cliente, y la máquina donde está alojado el blog, el servidor (por eso se le llama servidor). Es decir, tú, a través del navegador del PC, solicitas una conexión con el servidor donde está alojada la web, y esta responde enviándote la página que estás leyendo en estos momentos. Esto es una tremenda simplificación que se aleja bastante de la realidad. Hay muchísimos más equipos que juegan en esta comunicación, conectados entre sí haciendo de intermediarios. Vamos, que no te conectas directamente, pero para el ejemplo, nos vale. Espero que se entienda el concepto. Nos es válido porque cuando realices una comunicación TCP y UDP en TIA Portal, normalmente será entre dos equipos directamente. A lo sumo, colocarás un switch donde concentrar todas las conexiones. Así, todos los equipos podrán comunicar entre sí, si fuera necesario. Si quieres tener información más técnica sobre TCP, puedes consultar la documentación especializada sobre el protocolo TCP. ### ¿Qué es UDP? Tomando la wikipedia como referencia: *User Datagram Protocol (UDP) es un protocolo del nivel de transporte basado en el intercambio de datagramas (Encapsulado de capa 4 o de Transporte del Modelo OSI). Permite el envío de datagramas a través de la red sin que se haya establecido previamente una conexión, ya que el propio datagrama incorpora suficiente información de direccionamiento en su cabecera. Tampoco tiene confirmación ni control de flujo, por lo que los paquetes pueden adelantarse unos a otros; y tampoco se sabe si ha llegado correctamente, ya que no hay confirmación de entrega o recepción.* Es decir, un poco más en cristiano: - Es un lujo de datos unidireccional. - El envío de los datos de una máquina a la otra, se hace sin que haya habido una conexión previa entre ambas máquinas. - La máquina receptora de la información, no dará cuenta sobre esta recepción al emisor. - El emisor no tiene ni idea si los datos están llegando,  o si llegan correctamente. Podrías pensar que menuda joyita de comunicación. El emisor lanza los datos, y literalmente se desentiende de si llegan o no al receptor. Luego veremos que puede tener múltiples aplicaciones para nuestros autómatas Siemens. ### Comunicación TCP y UDP en TIA Portal Vale. Todo esto está muy bien, pero ¿qué hay de mis PLC? ¿Para qué me va a servir la comuniación TCP y UDP en TIA Portal? Imagino que el TCP lo tienes claro: comunicación entre dos PLC que se envían datos entre ellos. Guay. Puedes comunicar dos autómatas [S7-1200](https://programacionsiemens.com/s7-1200) (por ejemplo) sin más que tirar un cable de ethernet entre ellos. Ojo porque no es una comunicación maestro-esclavo, sino una simple comunicación entre dos iguales. ¿Es genial o no? Las aplicaciones son las típicas de comunicar dos máquinas que estén en la misma línea y se tengan que mandar datos de producción, por ejemplo. Pero ojo, porque puedes realizar una comunicación TCP con un PC perfectamente creando una aplicación en .Net. Para mi gusto es mucho más engorroso que hacerlo a través de un OPC, pero puedes hacerlo con tiempo y una caña. Y te ahorras una licencia de OPC. Eso sí, con el coste de oportunidad que supone, creo que usar el OPC es la mejor opción. Por algo lo inventaron. Volviendo a la comunicación entre dos PLC, esta será usando una serie de bloques para crear esta comunicación. Podrás usar las librerías Open User Comunication de TIA Portal para intercambiar datos. Hay muchas funciones, cada una con sus peculiaridades (TSEND_C, TSEND, TUSEND...) unas que necesitan del bloque TCONT para establecer la comunicación, y otras no. Además, podrás realizar en función del bloque usado, multicast o broadcast si tu PLC o tarjeta lo soportan. #### ¿Qué es broadcast? El broadcast no es más que un método de transmisión de datos de uno a muchos. En este caso de uno a todos los participantes de la red. #### ¿Y el multicast? El multicast, es un método de comunicación de uno a varios. Tienes más información sobre ambos métodos [en esta página de métodos de transmisión](https://delfirosales.blogspot.com.es/2009/06/metodos-de-transmision-unicast.html) ### ¿Para qué usamos UDP en TIA Portal? Hemos visto más arriba que UDP es una comunicación peculiar. Pero muy útil en algunos casos para nuestras automatizaciones. Por ejemplo, podemos usarla en registros (temperaturas, presiones etc) entre el PC y un Scada. No hace falta que nuestro PC esté encendido o no para que el PLC envíe los datos de una temperatura. Si la aplicación del PC está activa, pues registraremos la temperatura, y si no, pues el PLC seguirá enviando este dato de forma continua, le estén oyendo o no. Otra posible aplicación es si no tienes un servidor de hora. Puedes usar una comunicación UDP para que uno de los PLC haga este servicio, mandando en broadcast la hora cada minuto por ejemplo. De esta forma, los PLC que estén escuchando, podrán actualizar su hora. De tal forma que cambiando la hora de un PLC, actualizas la de todos. Como ves, no vas a usar UDP para información super sensible. Si ambas máquinas tienen que saber lo que la otra está haciendo, usarás TCP u otros métodos de comunicación. Pero para cosas más sencillas y menos trascendentes, UDP puede ser una buena y simple solución. ### ¿Qué te ha parecido? Espero que si no estás muy puesto en comunicaciones esta breve introducción te haya servido de aperitivo. Recuerda que todos estos conceptos son tratados en [el bloque 7 del curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/). Si necesitas que alguien te eche una mano, puede que este bloque sea lo que estás buscando. Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Cable PROFIBUS: 3 normas de cableado para evitar fallos > Cómo cablear PROFIBUS bien a la primera: resistencias de terminación, apantallado y tendido. Las 3 normas que evitan casi todos los fallos de red. Fuente: https://programacionsiemens.com/3-normas-basicas-para-realizar-un-cableado-profibus · Autor: Iñigo Gútiez · Publicado: 2017-06-14 · Actualizado: 2017-06-14 · Categoría: Comunicaciones Aunque cada vez haya más equipos que se gobiernan mediante Profinet, sigue habiendo muchísimos equipos gobernados por profibus en la industria. Aprovechando que en el último bloque del curso de TIA Portal tocaremos las comunicaciones, he pensado que es también interesante el tocar las **normas básicas para realizar un cableado Profibus**. ### Uso correcto de terminaciones. Si trabajas habitualmente con Profibus esta norma te va a resultar de lo más básica. Si no has cableado nunca una red, es básico que lo sepas. Para el trabajo sin perturbaciones en el PROFIBUS-DP, el cable del bus debe ser finalizado en ambos extremos con unas resistencias de finalización. El cable de bus desde la primera estación hasta la última estación debería ser tratado como un único cable de bus. Los finalizadores del bus deben conectarse en la primera (p.e. en el maestro) y en la última estación (esclavo) Esto en la práctica se consigue con los terminales que puedes comprar a Siemens o a otros fabricantes: Es decir, lo que harás es salir desde el PLC con tu cable e irás conectando todas las estaciones remotas o esclavos, realizando una serie entre ellas. Como ves, en el conector hay un ON/OFF. Sirve para conectar o desconectar la resistencia de finalización del bus. Por tanto, en los extremos (típicamente el PLC y una de las remotas) pondremos el selector en ON. El cable en los extremos tendrán que entrar por la boca de entrada. Esto puede estar marcado mediante una flecha o bien con un IN/OUT o similar. Tienes que tener en cuenta que al poner la resistencia de terminación en ON, la boca de salida queda aislada. Esto implica que si hubiera una remota conectada a la salida, y se pone la resistencia en ON, esa parte del ramal queda totalmente aislada. Ojo con esto. Por tanto, las remotas que queden en medio llevarán este terminal en OFF. Ni que decir tiene que si solo hay dos elementos en la red, el PLC y una remota, ambos equipos deberán llevar la terminación igualmente en ON al ser los extremos de la red. #### Alimentación del bus El bus tiene que estar alimentado desde al menos uno de los extremos. Esto obliga a que uno de los extremos (si no ambos) tienen que ser activos en este aspecto y alimenten por tanto la red. En general no te das cuenta de este detalle ya que normalmente el PLC está en uno de los extremos. Por tanto la situación queda solucionada. Pero ojo, porque a mi ya me ha sucedido tener varios PLC en una red y haber desconectado ambos PLC de los extremos y caerse la red completamente (cosas que pasan). Así que ten siempre esto en mente: uno de los extremos tiene que estar activo para que la red no caiga. Existen unos terminadores de red que hacen esta función en caso de tener que desconectar los extremos por la razón que sea. Son unos aparatos cuyo fundamento es solamente ese, el alimentar la red de tal forma que puedas desconectar elementos de la red sin que esta caiga. Puedes encontrar la [ficha de los terminadores de red Profibus aquí.](https://programacionsiemens.com/assets/uploads/external/cache.industry.siemens.com/dl/files/444/19102444/att_111899/v1/3B_812_6727-10a_Terminator_6b608b7f.pdf) #### Cableado de las terminaciones. En la siguiente imagen se detalla cómo se ha de pelar el cable para realizar un correcto conexionado del terminal. Nada más que añadir salvo que es importante el tema de respetar la pantalla y conectarla correctamente en el terminal como luego veremos. #### ¿Qué conector elegir? Hay muchos tipos de conectores: rectos, acodados, con conexión de PC, pinchados, atornillados... La experiencia de todos estos años me ha decantado por los conectores, acodados, conexión atornillada y con salida para PC. Puedes discrepar en cada uno de los puntos anteriores. Yo solamente te doy mi punto de vista de cada una de las características: ##### Acodado En general, la salida me es más cómoda acodada para poder meter el cable de Profibus por las canaletas de una forma más natural que no saliendo recto. Habrá excepciones en los que será más práctico salir recto, pero por norma general, creo que es la mejor elección. ##### Conexión atornillada Podrás pensar que el modo de pinzado como el del dibujo más arriba es una conexión mucho mas rápida que no necesita destornillador para realizar la conexión. Bueno, la experiencia me ha hecho decantarme por los atornillados. En una de las máquinas que construimos hace ya unos años con 3 redes Profibus, la red se caía cada dos por tres. Todos los conectores eran pinzados y tuvimos que cablear nuevamente las terminaciones, facilitar el pinzado. Ni aún así se solucionó. Cambiamos a conectores atornillados (una pasta en conectores) y voilà. Se solucionó para siempre el problema. Los técnicos de Siemens que vinieron no daban crédito, pero así fue. Desde entonces, ni con un palo. ##### Salida para PC Esto es una necesidad si usas la conexión MPI y Profibus (en un PLC Siemens 2DP). Si no tienen conexión con el PC, tendrás que desconectar la pantalla que tengas en MPI (que es lo normal) para poder realizar los cambios. Así que al menos necesitarás uno (normalmente en el lado del PLC). Pero puede venirte bien tenerlo en ambos extremos de la red. En los puntos intermedios es verdad que puede ser mejor poner los que no llevan nada. Además de por ser un poco más baratos, porque pueden llenarse de porquería. ### Distancias máximas y mínimas El lazo completo de la red no puede ser tan largo como te apetezca. Si te pasas, puedes tener problemas en la comunicación. Hay una relación estrecha como puedes imaginar entre la longitud del lazo y la velocidad del bus. En este cuadro puedes ver algunas de las velocidades disponibles, aunque no todas como puede ser la de 3 ó 6 Mbits/s. Lo importante es que tengas en cuenta que en función de a qué velocidad vayas a comunicar (por defecto a 1,5Mb/s) la tirada de cable no debe superar cierta longitud. Por norma, si vas a comunicar a 1,5 o superior, te marques los 100 metros como límite del lazo sin repetidores. Como distancia mínima, Siemens recomienda un mínimo de 1m ya que con menos longitud puede dar problemas también. #### Apantallado del cableado. Hay empresas que no tienen en cuenta como normas básicas para realizar un cableado Profibus es el CEM. CEM = Compatibilidad Electro Magnética. Las altas frecuencias emitidas por equipos de potencia como los variadores de velocidad te pueden dar muchos quebraderos de cabeza si no tienes en cuenta ciertas normas básicas: - Los conductores de los cables del bus deben ser apantallados. Deben ir instalados separadamente de los cables de potencia con una distancia mínima de 20 cm. Por tanto, los cables del Bus ( o cables de señal) no pueden ser instalados adyacentes a los cables de potencia. Lo suyo es que vayan por bandejas separadas. - La pantalla del cable del bus debe ser conectada a la tierra de protección en ambos extremos. - Los cables de potencia y de bus deben instalarse en ángulo de 90º para que la influencia sea la mínima posible. - Los cables de señal (y la superficie equipotencial) deben conectarse a tierra por el camino más corto posible. - Las pantallas deberían tener conexiones de baja impedancia (área de conexión amplia). Como ves son normas muy básicas que seguro que ya conocías. #### Conexionado del la pantalla a tierra Pues sí, el conexionado de la malla también es una de las normas básicas para realizar un cableado Profibus. Aclarar que con las mallas, no se debe hacer una trencita y conectarlas a tierra. ¿Y por qué? Porque el cometido de la malla no es derivar a tierra en caso de una falta. Para eso ya están los cables de tierra específicamente puestos para ese menester. El objetivo de la malla es derivar las corrientes inducidas por  las altas frecuencias a tierra. Es por ello que cuanto mayor se la superficie de contacto, mucho mejor será el apantallado. La razón es que cuanto mayor es la frecuencia de una corriente, más querencia tiene esta corriente a circular por la superficie del conductor. Este efecto, es el [efecto pelicular](https://es.wikipedia.org/wiki/Efecto_pelicular). Por tanto, cuanto mayor superficie de contacto tengas, mejor será su evacuación a tierra. ### Bonus track: Repetidores Como tal, no es una de las normas básicas para realizar un cableado Profibus. Pero es interesante que lo tengas en cuenta. A veces la red de Profibus conecta diferentes máquinas que tienen sus diferentes cuadros y que pueden estar a bastantes metros unos de otros. En estos casos es conveniente la instalación en cada cuadro de un repetidor ya que nos ofrece una serie de características muy útiles: - Permiten aumentar el número de nodos - Amplifica la señal en tiradas largas - Aisla galvánicamente unos elementos de otros. - Permite crear estrellas y bifurcaciones de la red Como ves, tienen una serie de características muy interesantes si vas a crear una red compleja en Profibus. ### ¿Qué te ha parecido las normas básicas para realizar un cableado Profibus? Espero que te haya sido útil esta entrada de  normas básicas para realizar un cableado Profibus. Sí, es todo chapa teórica. Pero que es necesario que sepas estas cosillas si no las sabías ya. Algunas las podrás aplicar para otras instalaciones (no solo de Profibus vive el hombre). En cualquier caso, es una buena introducción para el bloque 7 del [Curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) ¿no? Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Mis comienzos en la automatización industrial > Mis comienzos en la automatizacion industrial: te cuento como pase de la informatica y los ordenadores al mundo de los PLC y la automatizacion de maquinas. Fuente: https://programacionsiemens.com/comienzos-en-automatizacion-industrial · Autor: Iñigo Gútiez · Publicado: 2017-05-18 · Actualizado: 2017-05-18 · Categoría: Actualidad y profesión Todo el mundo tiene un comienzo. Lógicamente, yo también. Decía el fallecido Steve Jobs que con el paso del tiempo, serás capaz de unir los puntos de los momentos de tu vida que te han llevado a lo que eres en estos momentos. No le faltaba razón. El cúmulo de circunstancias que te han tocado vivir, junto con las decisiones que has ido tomando en la vida, te llevan a la situación actual. ### Mis años mozos pre automatización industrial Echando la vista atrás para ver cómo he acabado en el mundo de la automatización, comienza mucho antes de saber lo que era un PLC, ni para qué servía. Me encantan los ordenadores, la tecnología, y la informática en general, desde muy pequeño. Cuando era un niño me flipaban los ordenadores: los juegos (arcaicos), esos primitivos gráficos, o simplemente el poder conectarlo a la tele y poder cacharrear... alucinaba en colores. Entonces, tras ser muy, pero que muy pesado, mis padres accedieron a inscribirme en un curso de BASIC que se daba en el colegio tras las clases: 4 horas a la semana, martes y jueves de 5.30 a 19.30 si lo recuerdo bien. Así durante dos años. En séptimo y octavo de la extinta EGB. Las primeras clases fueron horrorosas.. ¿qué demonios tenían que ver los diagramas de flujo con saber programar y hacer juegos? Pero así empezamos: con el ordenador apagado (un MSX con disquetera de baja densidad como añadido), papel, boli y un montón de figuras como entradas de datos, salidas, if  etc, todas ellas dibujadas en una pizarra blanca. La primera pizarra blanca que veía. ¡no se usaba tiza sino un rotulador que se borraba! ¿Había algo más flipante que eso? Tras esas clases, un par de años después, heredé de mi primo su MSX de 16KB. Sí, 16 KB. Agoté su memoria realizando un pequeño juego de fútbol. Daba al *Enter *y el retorno de carro tardaba como 10-15 segundos en devolverme el control de todas las líneas de código que tenía. Que no serían muchas, pero con 16KB tampoco daba para mucho más. Siguieron los años, y aprendí a manejar LOGO en bachillerato. No el de Siemens, sino el de avanza tortuga, gira derecha 90. Ese. El que valía para dibujar. Una verdadera pérdida de tiempo a mi juicio ya que no era lo que me esperaba como siguiente paso dentro de la programación. #### Los años de la carrera Mi hermano, también ingeniero industrial, me animó a realizar su misma carrera. Yo quería hacer informática en la Universidad de Deusto, pero la economía familiar no se podía permitir esas alegrías. Por otro lado, mi padre había sido jefe de taller de una empresa de bombas de agua, y digamos que los chicos en mi casa tenían un poso claramente industrial. Además, soy de Barakaldo, una zona muy industrial cuando era crio. Hoy no es ni la sombra de lo que era cuando existía Altos Hornos de Vizcaya. La cuestión es que ese regustillo industrial, quieras que no, te va marcando. En la carrera de ingenieros, nos impartieron clases de Pascal (sí, sí, ese que se parece tanto a SCL). Si bien es cierto que era ya un lenguaje superado ampliamente por C, VB, etc, me sirvió de mucho para entender los lenguajes estructurados y adquirir más nivel como programador. Por aquel entonces programé mucho en Pascal. Realicé varios programas alguno de los cuales me los publicaron el las revistas de la época como PC Actual. Uno de ellos los publiqué bajo licencia cardware. Es decir, si querías la licencia final, el usuario tenía que escribirme una carta con un sobre y un sello para devolverle la misiva con la licencia. Así recibí cartas de muchas partes de España, pero también alguna de latino américa. La minoría, eso sí. Seguí programando, y realizando mis pinitos en otros campos como Photoshop o 3DStudio. Todo lo que tenía que ver con un teclado y un ratón me interesaba. Eran los primeros años de internet y cómo no, todo aquello me volvía loco. Siempre que podía me escapaba al centro de cálculo donde poder navegar y chatear con unas arcaicas consolas de Unix. Lo de navegar era un decir, porque eran monitores CGA y era imposible ver una web. Posteriormente ya pusieron unos flamantes 386 con los que al menos, se podía navegar de una forma lenta, pero segura. Me interesé por aprender HTML y posteriormente PHP. Aquello me gustaba muchísimo. Hice mi primera página web (estática) sobre las II Guerra Mundial. Tenía incluso un foro. También hice programas para mi HP-48 que se sacó a medias la carrera conmigo. Bendita calculadora. Qué fácil se hacían los cálculos con este cacharro. #### El PLC, ese gran desconocido. Durante la carrera, había una asignatura en la que fuimos al laboratorio para manejar nuestro primer PLC. Un S5 con el que realizar el programa de un semáforo. Pues ¿sabes qué? Ni lo hice bien, ni me gustó. No entendía ni jota. Mi cabeza no estaba hecha aún para ese software en MS-DOS y salidas que hacían que se iluminaran lucecitas. Claro que fueron un par de horas nada más, por lo que poco o nada pude aprender por aquel entonces. Realmente mi primer contacto con un PLC fue bastante frustrante. ### Epoca profesional: llega la automatización industrial Cuando estaba terminando la carrera, tuve la oportunidad de realizar mi proyecto de fin de carrera en Guardian Llodio, donde aún sigo trabajando. Al final de los 9 meses me ofrecieron quedarme, y así lo hice. Comencé un 1 de julio de 2003 como supervisor de producción, sin haber defendido el título aún y sin saber qué era el vidrio prácticamente. Pero pronto me ofrecieron pasar al departamento de ingeniería y accedí sin pensarlo dos veces. Era para lo que había estudiado. Lo que me gustaba. Ahí es donde comencé a programar PLC. No sin antes tener una pequeña formación interna para comenzar a desenvolverme por mi mismo. ¿Sabes con qué empecé a programar? Sí. Efectivamente. Con un S5 nuevamente. Pero esta vez fue diferente. Me gustaba porque veía para que servían en las líneas de producción. Podías dar vida a las máquinas con ese aparatito.. ¿no es genial? Claro que me costó cambiar mucho mi chip. Estaba acostumbrado a lenguajes de más alto nivel, que se ejecutaban línea a línea y que el programa del PLC se estuviera ejecutando todo el tiempo, ciclo tras ciclo, me jugó más de una mala pasada. Pero esta vez, logré que funcionara el semáforo. Me hicieron responsable eléctrico de un par de instalaciones para comenzar donde había mucho S5-95U fundamentalmente. Poco a poco le fui cogiendo el gustillo. Y cuando ya empezaba a manejarlo con cierta soltura... S7-300. ¿Qué demonios era aquello? ¿Por qué había tanta ventana? Por el amor de Dios, había que meter hasta el bastidor para declarar el hardware. He de reconocer, que me costo un poco al principio. Pero me hice con él rápidamente. Aquello era mucho más potente que el S5. Se podían hacer muchas cosas... realizar una multiplicación ¡no era una función específica! Allá por abril o mayo de 2004 me encargaron la programación de mi primera línea completa: una línea de inspección de parabrisas. Había entrado en ingeniería en septiembre y ya estaba preparado (más o menos) para el primer reto serio. Hice mi programa de modo Offline, con sus pantallas en Protool, los esquemas eléctricos... todo desde cero. Disfrute como un gocho en un barrizal. Pero metí más horas que el reloj de la torre, también hay que decirlo. La cuestión es que una vez cargué el programa... nada funcionaba correctamente. Una cosa era el papel, y otra cosa era que la máquina aceptara mis órdenes como estaban en mi cabeza. El baño de realidad fue grande. No tenía NPI de cómo programar un PLC con garantías. Visto con perspectiva, fue normal lo que me pasó. No había tenido una formación específica de programar autómatas, y todo lo que había aprendido había sido de lo que me habían enseñado mi jefe y compañeros. Poca cosa para lo que necesitaba. Así que a base de horas, pruebas, errores, y mucha mala leche (más de un juramento ya salió de mi garganta), logramos arrancar la línea con éxito. A partir de ahí, la cosa cambió. Digamos que me había bautizado en esto de la automatización. Luego llegaron más proyectos, de diferentes índoles. Nuevas máquinas completas, modificaciones de todo tipo sobre maquinaria existente, programación de robots Fanuc, programas HMI en entornos de Siemens o VB... hasta hoy. Paralelamente he seguido programando a nivel particular, creando un blog sobre linux  que mantuve durante varios años (Ubuntu concretamente), e interesándome por cualquier cosa que tenga relación con la tecnología e internet. He instalado y jugueteado con muchas distribuciones de Linux. Arch-Linux y Debian las mejores para mi sin discusión. Las he disfrutado muchísimo. Lamentablemente para trabajar todo está pensado para Windows y no me ha quedado más remedio que agachar las orejas y claudicar. He realizado algunos pinitos programando sin mucho fuste en Android por el simple hecho de saber si era capaz de realizar una aplicación. ¡Ah! y como no, tengo no una, sino dos raspberry pi con las que juguetear y cacharrear con el cada vez menos tiempo que tengo. ### ¿Qué lecciones aprendidas saco de estos años? He aprendido mucho durante estos años. También es cierto, que le he dedicado muchas, muchas, muchas horas fuera del horario laboral a aprender, a hacer pruebas, a leer, documentarme por mi cuenta... Cuando aquello no tenía esposa, y podía dedicarle mucho más tiempo que hoy. Creo que todo hubiera ido mucho más rápido y eficiente si hubiera tenido una mejor formación en mis inicios. Claramente aprendí por el camino largo. Muy largo. Gracias a mis conocimientos previos en programación pude lograr los diferentes hitos que me fueron marcando, pero de otra forma hubiera sido mucho más duro. O no posible en los tiempos marcados. Por eso, si estas en la situación de empezar a programar autómatas y no tienes tiempo para ir con prueba y error, te recomiendo que te formes. No te digo que te formes con los cursos que yo dispongo como [el curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) Hazlo con otro si crees que va a ser **mejor para ti**. Pero hazlo. Invierte en ti, en tu formación. Será bueno para ti, y para tu futuro. Te hará crecer como profesional y como persona. Yo sigo aprendiendo. Documentándome cada día. Realizando cursos de pago por mi cuenta de temas que me interesan. No con la misma prisa que entonces, pero cada día le dedico un poco de mi tiempo libre. Esto, con el paso de los años, marca una gran diferencia. Somos muy optimistas en lo relativo a lo que somos capaces de hacer a corto plazo, en una semana o en un mes. En cambio somos poco ambiciosos en lo que somos capaces de hacer a medio o largo plazo, en dos o cinco años, si te lo propones. Y que te quede claro: nadie lo va a hacer por ti, sea lo que sea que quieras conseguir. Todo depende de las ganas y determinación que tengamos para lograr nuestros objetivos (yo también me incluyo). Como reza en la imagen de esta entrada, y lo has escuchado miles de veces, un viaje de mil millas empieza dando un primer paso. ¿A qué estás esperando? Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Ejemplo de páginas de usuario para S7-1200 > Ejemplo de paginas de usuario para S7-1200: crea una web en tu automata Siemens leyendo y escribiendo variables del PLC con HTML, JavaScript y jQuery. Fuente: https://programacionsiemens.com/ejemplo-de-paginas-de-usuario-para-s7-1200 · Autor: Iñigo Gútiez · Publicado: 2017-05-02 · Actualizado: 2017-05-02 · Categoría: Comunicaciones Con este ejemplo de páginas de usuario para [S7-1200](https://programacionsiemens.com/s7-1200/) vamos a repasar todo lo necesario para crear una web en tu autómata Siemens paso a paso. Tras los dos post anteriores en los que veíamos[los conceptos fundamentales de creación de webs](https://programacionsiemens.com/como-crear-paginas-de-usuario-s7-1200/) y [la teoría de creación de páginas web con los PLC de Siemens](https://programacionsiemens.com/ejemplo-de-paginas-de-usuario-para-s7-1200/), toca ahora realizar un ejemplo que aune todos estos conceptos en algo tangible. ### Ejemplo de páginas de usuario para S7-1200 El ejemplo que te propongo es un ejemplo sencillo que nos permita usar los diferentes aspectos vistos en los post anteriores: - Leer valores del PLC - Escribir en variables del PLC - Representar valores de una lista - Uso de HTML y Javascript - Uso de jQuery. El uso de jQuery es algo nuevo que he añadido como extra para este ejemplo para realizar la actualización de los valores de una forma más profesional que usando HTML o Javascript que es lo que propone la documentación de Siemens. Por tanto, tendrás una alternativa más a cómo refrescar los datos leidos del PLC. A mi juicio esta es la más compleja, pero también es la más profesional. La ventaja fundamental que vamos a ver es que la página no se va a refrescar y recargar como usando el meta de HTML o Javascript, sino que refrescaremos exclusivamente las partes que nos interesen. #### ¿Qué es jQuery? Antes de continuar, tan solo comentar un poco qué es jQuery. Según Wikipedia: *jQuery es una biblioteca multiplataforma de JavaScript, creada inicialmente por John Resig, que permite simplificar la manera de interactuar con los documentos HTML, manipular el árbol DOM, manejar eventos, desarrollar animaciones y agregar interacción con la técnica AJAX a páginas web.* Vamos, que nos va a permitir manejar casi a nuestro antojo todo lo que es la web. #### ¿Y que hay de Ajax? Como ves, es un no parar, porque también aparece AJAX, que según la wikipedia: AJAX, acrónimo de ***A**synchronous **J**avaScript **A**nd **X**ML* (JavaScript asíncrono y XML), es una técnica de desarrollo web para crear aplicaciones interactivas o RIA (*Rich Internet Applications*). Estas aplicaciones se ejecutan en el cliente, es decir, en el navegador de los usuarios mientras se mantiene la comunicación asíncrona con el servidor en segundo plano. De esta forma es posible realizar cambios sobre las páginas sin necesidad de recargarlas, mejorando la interactividad, velocidad y usabilidad en las aplicaciones. Luego verás para qué he usado Ajax. #### Enunciado del ejemplo de de páginas de usuario para S7-1200 Como te propuse en la entrada anterior, se trata de hacer un sencillo ejemplo que tuviera las siguientes características: - Insertar una imagen - Crear un cronómetro con START/STOP/RESET - Que haya un texto indicando el estado del cronómetro - Se actualicen los valores de forma automática El resultado tiene esta pinta: Como ves, no me he complicado en el aspecto gráfico, ni era mi intención porque quiero que el ejemplo sea lo más didáctico posible, y para ello, el código cuanto menos recargado, mejor. ### Desglose del código de la página de usuario #### Enlace con el PLC Para la escritura en las booleanas de los botones, realizamos la conexión con el PLC como ya vimos en el post anterior: ``` ``` Como ves, hemos definido simplemente las tres variables que usamos en el programa del PLC: start, stop y reset. Además, incluimos un listado de estados del cronómetro para que se muestre en pantalla simplemente si el cronómetro está contando, está parado o si se ha hecho una puesta a cero. #### Cabecera del documento ``` - $(document).ready(function() { //Actualizamos el contador a tiempos fijos setInterval(actualizar,500); // Enviar la información de los botones sin recargar la página. $().ajaxStart(function() { $('#loading').show(); $('#result').hide();o }).ajaxStop(function() { $('#loading').hide(); $('#result').fadeIn('fast'); }); $('#arranca, #para, #reinicia').submit(function() { $.ajax({ type: 'POST', url: $(this).attr('action'), data: $(this).serialize(), success: function(data) { $('#result').html(data); } }) return false; }); }) function actualizar(){ $("#tiempos").load("tiempos.htm"); $("#textos").load("texto.htm"); } ``` No vamos a entrar en mucho detalle por el momento en este código ya que lo veremos un poco más en detalle en el vídeo más adelante. Tan solo comentar que he incluido los típicos META de las páginas web además de incluir el link de: Estilos (estilos.css) - El archivo de jQuery (jquery.min.js) que me lo he descargado de internet y lo he adjuntado para no depender de una conexión externa. Las funciones de javascript para lo que valen es básicamente: - Actualizar los valores de minutos, segundos y milisegundos - Actualizar el texto del listado ya comentado - Mandar la información de los formularios que tienen los botones sin tener que recargar la página Para actualizar los valores, nos apoyaremos en las etiquetas DIV  y en dos archivos llamados tiempos.htm (para actualizar el crono) y texto.htm para actualizar el texto del listado. Como verás luego en el vídeo son archivos sencillos de usar: El código de **texto.htm** será: ``` :="Cronometro": ``` El código de **tiempos.htm:** ``` ## :="Minutos": : :="Segundos": : :="Milisegundos": ``` En el primer caso, enlazamos la variable Cronómetro con el listado definido en la cabecera para posteriormente recuperar su valor según la sintáxis que demanda Siemens En el caso de tiempos.htm, como ves solo lo he puesto entre un meta H1 y he recuperado el valor de las tres variables. #### El cuerpo del documento ``` Cronometro ** ``` Como ves el código del documento es sencillo con los 3 botones y los DIV que luego veremos cómo usarlos. Para dar valor a las variables booleanas simplemente usamos unos input de tipo hidden para que no se vea nada, y lo que hacemos es dar valor a las variables. Chupado. ¿o no? ### El vídeo Para ver funcionar el ejemplo de páginas de usuario para [S7-1200](https://programacionsiemens.com/s7-1200) qué mejor que un vídeo donde repase contigo todo lo que te he enseñado hasta ahora. [Vídeo: https://www.youtube.com/embed/jpWXXEAdC54] ### ¿Qué te ha parecido? Espero que con este ejemplo de páginas de usuario para S7-1200 te animes a programar tus propios proyectos dando rienda suelta a tu imaginación. Como ves, usando las bibliotecas de JavaScript se pueden hacer cosas muy curiosas y de aspecto más profesional. Para que veas que se pueden hacer cosas muy chulas, échale un vistazo a JustGage, donde puedes encontrar una biblioteca javascript con la que realizar indicadores analógicos muy chulos. Para dar una apariencia más sofisticada a la web puedes usar herramientas como Bootstrap [http://getbootstrap.com/](http://getbootstrap.com/) #### Descarga el ejemplo de páginas de usuario Te dejo el [enlace con el ejemplo de TIA Portal y los archivos HTML](https://programacionsiemens.com/descargas/userweb.zip)para que puedas juguetear con ello. Recuerda que puedes apuntarte en [Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Páginas de usuario para un S7-1200: Configuración > Web server TIA Portal: configura el programa del S7-1200 paso a paso para ejecutar tus páginas de usuario y publicarlas correctamente en el PLC. Fuente: https://programacionsiemens.com/crear-paginas-usuario-s7-1200-configurando-entorno · Autor: Iñigo Gútiez · Publicado: 2017-04-26 · Actualizado: 2017-04-26 · Categoría: Comunicaciones Segunda entrega para configurar y programar tus páginas de usuario para un [S7-1200](https://programacionsiemens.com/s7-1200). Cómo configurar desde TIA Portal el programa del PLC S7-1200 para que se pueda ejecutar las paginas de usuario. ### Páginas de usuario para un S7-1200 Hemos visto hasta ahora dos entradas: - Configuración del webserver - Herramientas y conocimientos previos necesarios. Con el primer post, configuraremos y activaremos el servidor web del S7-1200 ya que sin este paso previo, no funcionará absolutamente nada de lo que hagamos. Además, tendremos que configurar la parte de las páginas de usuario como veremos más tarde. Los conocimientos de programación serán necesarios para poder realizar las páginas web que queramos realizar. Pero solamente con esto es suficiente, ya que tendremos que dar una serie de pasos adicionales para que la pelota empiece a rodar. Deberás crear los archivos HTML, CSS.. además de añadir las imágenes que quieras añadir (jpg, png, etc). La parte importante de este punto es que se deben añadir en los HTML las variables sobre las que quieras leer o  escribir en el PLC. #### Mostrar datos del PLC en las páginas de usuario La forma de mostrar el valor elegido en la web, es el siguiente: ``` :="Nombre_Variable": ``` Y claro, insertado entre tags del HTML como un párrafo sería: ``` :="Velocidad_Transportador": ``` ¿Y ya está? Pues básicamente sí. Así es como se representa. Ni que decir tiene que Nombre_Variable tiene que ser la etiqueta de la variable simbólica en el PLC. Tiene que estar definida en el PLC por tanto, y luego ya puede ser usada en la web. #### Escribir en variables del PLC Para escribir en el PLC, vamos a necesitar poner en la cabecera de los archivos HML una sintaxis como la siguiente: ``` ``` Al igual que en el caso de la lectura, la etiqueta tiene que estar definida en el PLC para poder usarse. Posteriormente, ya podrás integrarla en formularios donde se le de valor. #### Enlazar textos a valores de una variable Puede que en algunos casos, el valor de la variable para un desconocido del programa tan chulo que has realizado le suene a chino. Por poner un ejemplo, puede que tengas una variable que valga desde 0 a 2 con el estado de la máquina (Manual, Automático, Paro, Emergencia...). Bueno, pues para asociar una variable llamada digamos "Modo" que toma valores enteros, y que en la web se vea el texto que quiere representar el valor numérico, se hace algo de este estilo: ``` ``` Es decir, listaremos los diferentes valores que puede tomar la variable con los textos asociado que queramos asignarle. Como ves, es un listado de textos asociado a una variable (Listado_Modos) que no existe en el PLC. Es digamos una variable en el webserver. Luego,  para enlazar la variable con el listado de textos,  debemos referenciar este enlace cuando lo queramos usar: ``` :="Modo": ``` Como ves, hay que hacerlo en dos pasos, pero tampoco parece que esto vaya a ser un reto para nosotros¿verdad? Pero aunque podría parecer que ya está todo preparado, aún no lo está. ### Configurar y programar el PLC para que funcionen las páginas de usuario Aunque hayamos creado las páginas web, por un lado tendremos que cargar estas páginas en el PLC y arrancar el servidor web que hace que los datos fluyan entre las páginas de usuario para un S7-1200 y el propio autómata de Siemens. #### Configurar el web server para cargar las páginas de usuario. Este paso es muy sencillo. Tan solo tendrás que indicar una serie de datos como son directorio, página de inicio y unos DB. Como puede intuir tras ver la imagen los pasos como digo son:: - Seleccionas el directorio HTML donde estan los archivos - Indicas la página de inicio - Pulsas generar bloques Lo normal es que la página de inicio de tu web se llame index.html, index.htm, start.htm o similar. Al generar los bloques, generará unos bloques necesarios para realizar el intercambio de datos. Estos bloques son configurables en el apartado *Avanzado*, pero si no tocas nada, por defecto tomará los bloques 333 para el número de DB web  y 334 el número de inicio de DB de fragmento. Mi recomendación es que no te compliques, y lo dejes tal y como está. Son DB que son necesarios para la web, y tampoco sinceramente necesitamos saber mucho más. Vaaale, que eres más curioso que mi gato y quieres saber un poco más de estos DB. Lo capto. El DB de control (el 333) contiene la siguiente información: - Variables de control y estado de la página web - Estado de la comunicación - Información de errores Además, existen los DB de fragmento que comienzan en el 334 si no lo cambias.  Ojo, que comienza en el 334 pero pueden ser varios de forma consecutiva. Es decir, 334, 335 etc. Estos DB contienen el código de las páginas web y los ficheros multimedia (las fotos y esas cosas). Estos DB los puedes encontrar en el directorio de *Bloques de Sistema*, en la subcarpeta *Servidor Web* como puedes apreciar en la imagen. Después de todo esto, a lo importante: solo quédate que el número de DB web es el 333 en este caso. #### Realizar la llamada desde el PLC a las páginas de usuario Finalmente, tenemos que arrancar el servidor web para que todo funcione. Para ello, realizaremos la llamada mágica al bloque SFC99 denominado WWW donde nos pedirá que le indiquemos: - CTRL_DB: es el número del DB. Si no tocas nada, es nuestro 333. - RET_VAL: aquí meterás una variable entera que nos devolverá el estado del bloque ### Refresco de los datos de las páginas de usuario Hemos dicho en capítulos anteriores que cuando se realiza la llamada, el servidor manda el código HTML al navegador y este lo representa. Pero ahí falla algo. Si tenemos datos que van variando en el tiempo ¿quién es el que los va a actualizar? La forma más básica de actualizar los datos es refrescar la web manualmente pulsando F5. Esto tiene un pequeño problema, ya que puedes coger tendinitis en los dedos y acabar quitando hasta el dibujo a la tecla de tanto darle. No parece una solución aceptable para tios como tú y yo. Para este tipo de situaciones, puedes hacerlo de dos maneras: - Mediante código HTML - Mediante programación en JAVASCRIPT La primera forma, en HTML, tan solo tienes que añadir esta sentencia en la cabecera: ``` ``` Lo que hace básicamente es que una vez transcurridos 5 segundos desde que se cargó la página, se llame a la página index.htm. Pero claro, si la página que has cargado es index.htm y llamas a ella misma ¿qué logras? Exacto. Actualizar los valores que puedan haber cambiado dentro de la web. Si quieres ser aún más chulo, puedes hacerlo con Javascript. Para ello, usa este código: ``` setInterval("document.location.reload()",5000); ``` En este caso, el intervalo de refresco será en milisegundos pero con el mismo resultado ### ¿Y ahora qué? Pues ahora, querido *padawan*, comienza a realizar tus pinitos. No, no voy a realizar un ejemplo esta semana. Lo reservo para cerrar esta trilogía, que después de la de El Padrino, no se ha visto cosa igual. Para la semana que viene, te propongo el siguiente ejercicio: - Insertar una imagen - Crear un cronómetro con START/STOP/RESET - Que haya un texto indicando el estado del cronómetro - Se actualicen los valores de forma automática Por tanto, ya tienes deberes para esta semana. Yo ya tengo realizado el ejemplo de forma muy sencilla, usando estilos pero de una forma casi grotesca en cuanto a colores y formas. Pero de lo que se trata es de que se vea lo más claro posible. No buscamos en estos momentos el *jogo bonito*. La explicación, la semana que viene. No te lo pierdas porque te voy a contar alguna cosilla chula para darle un estilo más profesional. Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. Espero tus comentarios y cuéntanos cómo llevas el ejercicio,  y si  te funciona. #### --- # Páginas de usuario del S7-1200: conocimientos previos > Web server TIA Portal: conocimientos previos de HTML, CSS y JavaScript que necesitas para crear las páginas de usuario de tu PLC Siemens S7-1200. Fuente: https://programacionsiemens.com/como-crear-paginas-de-usuario-s7-1200 · Autor: Iñigo Gútiez · Publicado: 2017-04-20 · Actualizado: 2017-04-20 · Categoría: Comunicaciones Para **crear páginas de usuario** en un autómata Siemens [S7-1200](https://programacionsiemens.com/s7-1200) vas a necesitar una serie de conocimientos mínimos en la creación de páginas web. En la entrada de hoy vamos a ver los conceptos básicos de creación de páginas disponibles en los PLC Siemens. ### ¿Qué se usa para crear las páginas de usuario? Dentro de las herramientas que podrás usar están: - HTML - CSS - JAVASCRIPT A decir verdad, en la creación de páginas web potentes hay lenguajes de mucha mayor potencia como pueden ser PHP, Asp.net, Python, Rubi, entre otros. Digamos que las web que podemos crear en nuestro PLC son *clásicas *(por no llamarlo viejunas). El hecho de que no podamos crear webs con lenguajes potentes como PHP no quiere decir que no vayamos poder realizar páginas muy dignas y funcionales, por lo que no te me vengas abajo. Ahora bien, repasemos cada uno de los puntos que hemos listado más arriba. ### Uso de HTML en las páginas de usuario Si tomamos como referencia lo que nos cuenta Wikipedia: **HTML**, sigla en inglés de ***HyperText Markup Language*** (lenguaje de marcas de hipertexto), hace referencia al lenguaje de marcado para la elaboración de páginas web. Esta frase tan chula que seguramente te ha dejado exáctamente igual, lo que viene a decir es que es un lenguaje en el que cada elemento está definido mediante unas etiquetas que indican qué es y qué queremos que haga. Así por ejemplo, si queremos definir un párrafo de texto, etiquetaremos este texto que forma el párrafo entre dos etiquetas o tags: -

Indicando que arranca el texto del párrafo -

Indicando que termina el texto del párrafo. Realmente todas las páginas web independientemente del lenguaje usado, están traducidas a HTML. La explicación que te voy a dar, es de andar por casa, pero para que se entienda el concepto, creo que puede valer. Una página web puede estar programada en PHP (por ejemplo programacionsiemens.com). Si vieras el código serían cientos de líneas sin un solo meta HTML. Lo que hace el servidor cuando se realiza la petición de llamada, es ejecutar ese código. Como resultado, el servidor lo que construye es la página web con los metas HTML que es enviada al navegador cliente. Luego, el navegador lo que hace es interpretar estas etiquetas para mostrar la web que ves cuando navegas por internet. #### La estructura básica de una pagina web en HTML La estructura mínima que suele tener una web es la que sigue: ``` Ejemplo1 ** Párrafo de ejemplo ``` Como ves, la estructura con etiquetas de apertura y cierre es muy marcado si bien hay también etiquetas que no llevan apertura y cierre. #### Dónde encontrar información Como entenderás no puedo realizar una explicación de cómo usar el HTML para crear las páginas de usuario ya que son muchas etiquetas y sería muy largo de explicar. Bien es cierto que no vamos a usar todas las etiquetas en nuestras páginas de usuario, pero sí unas cuantas que deberás conocer. Para que te formes mínimamente en HTML, puedo darte algunos enlaces al respecto: - Crear una página web desde cero (vídeos en Youtube) - W3schools.com - Aulaclic.es - Curso de HTML Hay más sitios y si googleas un poco, seguro que encuentras sitios chulos que te invito a que compartas con el resto de lectores. ### Uso de CSS en las páginas de usuario Si nos vamos nuevamente a la definición de la wikipedia: Hojas de estilo en cascada** (o CSS, siglas en inglés de *Cascading Stylesheets*) es un lenguaje de diseño gráfico para definir y crear la presentación de un documento estructurado escrito en un lenguaje de marcado2 . Vamos, que los archivos CSS son archivos donde se definen los estilos de la web. Es decir, cosas como qué fuente tipográfica vas a usar, el tamaño de la letra, colores, etc. #### ¿Cómo funciona? CSS funciona a base de reglas, es decir, declaraciones sobre el estilo de uno o más elementos. Las hojas de estilo están compuestas por una o más de esas reglas aplicadas a un documento HTML o XML. La regla tiene dos partes: un selector y la declaración. A su vez la declaración está compuesta por una propiedad y el valor que se le asigne. ``` h1 {color: red;} h1 es el selector {color: red;} es la declaración ``` Con este pequeño ejemplo, lo que definimos es que el color de la letra de los títulos enmarcados con H1 sean de color rojo. #### Más información Este pequeño ejemplo lo he sacado de w3c.es. Échale un vistazo porque es una buena guía resumen y vas a pillar el mecanismo rápidamente. Pero puedes encontrar muchas más fuentes de información para crear tus CSS para crear las páginas de usuario de los PLC de Siemens: - W3schools.com - Curso básico de CSS (Vídeos en Youtube) ### Uso de Javascript en las páginas de usuario Volvamos nuevamente a lo que dice la wiki: **JavaScript** (abreviado comúnmente **JS**) es un lenguaje de programación interpretado, dialecto del estándar ECMAScript. Se define como orientado a objetos,3 basado en prototipos, imperativo, débilmente tipado y dinámico. Se utiliza principalmente en su forma del lado del cliente (*client-side*), implementado como parte de un navegador web permitiendo mejoras en la interfaz de usuario y páginas web dinámicas4 aunque existe una forma de JavaScript del lado del servidor(Server-side JavaScript o SSJS). Su uso en aplicaciones externas a la web, por ejemplo en documentos PDF, aplicaciones de escritorio (mayoritariamente widgets) es también significativo. Vale. Traducido, lo que viene a decir es que Javascript es un lenguaje de programación que se ejecuta en el lado del cliente. Deciamos que las webs son creadas del lado del servidor y que este manda la web con sus etiquetas HTML a tu navegador y este interpreta el archivo. Bien, esto es cierto en general, pero hay la posibilidad de ejecutar código del lado del cliente. Es decir, que hay código que se puede ejecutar del lado del navegador. Consecuentemente, vamos a lograr que la web sea mucho más dinámica y que no necesite comunicarse con el servidor para realizar ciertas acciones como ya veremos más adelante. #### Ejemplo En la propia [página web de la wiki](https://es.wikipedia.org/wiki/JavaScript), viene un ejemplo para que veas qué pinta coge: ``` Ejemplo sencillo ## Esto es JavaScript document.body.appendChild(document.createTextNode('Hola Mundo!')); var h1 = document.getElementById('header'); // contiene la referencia al tag h1 = document.getElementsByTagName('h1')[0]; // accediendo al mismo elemento Tu navegador no admite JavaScript, o JavaScript está deshabilitado. **/*...*/ ``` #### ¿Dónde encontrar información? Lo primero que te he de decir es que programar en javascript no es tan sencillo como HTML, y si no sabes programar ningún lenguaje de programación de alto nivel, puede hacerse un poco cuesta arriba. Es un lenguaje con todas las letra y se pueden hacer un montón de cosas. Esto implica que su aprendizaje no es cosa de una tarde. La parte positiva es que para realizar tus primeras páginas de usuario no vas a necesitar en absoluto conocer nada de Javascript. Ahora bien, conociendo Javascript y aplicándolo debidamente puedes lograr cosas super chulas y potentes. Por tanto aquí te dejo unas cuantas referencias: - Curso básico de Javascript (en vídeos de Youtube) - Guía de Javacript ### Herramientas #### Editores de código Para escribir el código HTML, CSS o Javascript lo puedes escribir directamente con el Notepad, pero puedes descargarte algún programa gratuito que te ayude a formatear de una forma más sencillo el código: - Notepad++ (sirve para esto y para muchas cosas. Yo es el que uso) - Sublime Text - Atom #### Servidor donde hacer tus pruebas Estas nuevas habilidades que vas a adquirir no solamente te van a valer para realizar páginas de usuario para tus autómatas Siemens. También podrás usarlo en cualquier tipo de páginas web que quieras hacer. Por tanto montar tu servidor local para realizar pruebas te puede venir bien: - XAMPP El servidor que te montará es Apache y podrás programar en PHP y jugar con Bases de datos. Pero no te quiero agobiar. Con que crees tus primeras páginas estáticas en html y las hagas correr en él, será suficiente. ### ¿Y ahora qué? Ahora de momento, empápate bien de todo lo que hemos visto, que no es moco de pavo y realizar las páginas de usuario lleva tiempo y dedicación. Desenvolverse bien con HTML es fundamental para poder realizarlas con solvencia y no es cosa de 10 minutos si no tienes estos conocimientos previos. La semana que viene comenzaremos con la parte del PLC. Pero verás que si has jugueteado un poco. luego todo será mucho más sencillo de seguir y de entender. Siguiente parte de la serie: [configurar el entorno para crear las páginas de usuario](https://programacionsiemens.com/crear-paginas-usuario-s7-1200-configurando-entorno). Recuerda que puedes apuntarte en [Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Direccionamiento simbólico en TIA Portal > Direccionamiento simbólico en TIA Portal: entiende las etiquetas globales, locales y de DB, y la gran diferencia frente a Step 7 al referenciar datos. Fuente: https://programacionsiemens.com/direccionamiento-simbolico-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2017-03-15 · Actualizado: 2017-03-15 · Categoría: Programación PLC El direccionamiento simbólico en TIA Portal es una de los puntos más diferenciales que podemos encontrar entre Step 7 tradicional y el que nos encontramos en TIA. Esto se debe no a cómo damos nombres a las etiquetas, pero sí cómo nos vamos a referir a la información contenida en ella. Pero iniciemos repasando cómo se direcciona simbólicamente. ### Direccionamiento simbólico en TIA Portal El direccionamiento simbólico en TIA Portal se realiza como puedes imaginar a través de etiquetas definidas en este caso por ti. Podemos englobar este direccionamiento en tres grandes grupos de etiquetas: - Globales - Locales de bloques - Etiquetas en los DB Esta forma de dar nombres, es similar a como se hacía en Step 7 tradicional. Repasemos estos conceptos. #### Uso de etiquetas globales Las etiquetas globales hacen referencia a las variables globales del programa del PLC. Por tanto tendrá las siguientes características: - Pueden ser llamadas desde cualquier bloque del programa: OB, FC o FB. - Pueden etiquetarse Entradas, salidas, periferia y marcas - No puede haber dos etiquetas con el mismo nombre. La idea es clara: todas las variables globales las puedes usar a lo largo y ancho del programa. Por tanto, puedes etiquetar, o lo que es lo mismo, dar nombre, a entradas, salidas etc. Lógicamente, como son variables globales, no puede haber dos etiquetas con el mismo nombre. #### Uso de etiquetas locales de bloques Las etiquetas locales son las que se usan en los bloques como FC y FB. - Son declaradas en la interface del bloque - No puede haber dos etiquetas con el mismo nombre en el mismo bloque pero sí con el mismo nombre en diferentes bloques - Pueden etiquetarse temporales, parámetros de FC y FB, estáticas de FB y operandos de los DB. - Son indicados con el símbolo “#”. Esto es simplemente para indicar que son locales. Esta claro ¿no? Se trata de etiquetas que se usan de forma exclusiva en el interior de los bloques, por lo que hay que declararlas dentro de estos, y poco o nada importa que se repitan los nombres en otros bloques, ya que no interfieren entre sí como en el caso de las globales. #### Direccionamiento simbólico de las etiquetas de los DB Finalmente, vayamos con las etiquetas definidas en los DB: - Se direcciona junto con el bloque donde ha sido definida. Por ejemplo, si tenemos un DB llamado “Motor 1” donde hemos definido la “Velocidad”, el direccionamiento sería: “Motor 1”.Velocidad - Si la etiqueta lleva caracteres especiales, como un espacio en blanco, el nombre irá entrecomillado. Por ejemplo, si fuera “Velocidad nominal”, el direccionamiento sería: “Motor 1”.”Velocidad nominal” Ojo porque en el caso de los DB tendrás que tener en cuenta si son optimizados o no. En el caso de que sean optimizados (posible solamente en el los PLC 1200 y 1500), no podrás usar el direccionamiento absoluto ya que la dirección como tal, se pierde. Por tanto, no podrás realizar un DB1.DBW0 porque realmente no sabes dónde estás apuntando. En cambio, si el bloque no está optimizado, el direccionamiento directo sí será posible. Todo esto lo vemos con mucha mayor profundidad [en el curso de TIA Portal.](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) ### Direccionamiento parcial en TIA Portal Lo visto hasta ahora, no difiere mucho con lo que nos podemos encontrar en Step 7. Pero en esto sí. En step 7 tradicional, para dirigirnos a un bit en concreto de una variable por ejemplo entera, solo se podía hacer de forma absoluta. Es decir, si por ejemplo yo tenía definido una etiqueta "Velocidad" de tipo entero cuya direccion de memoria era la MW100, solo podía acceder a los bits o bytes de la variable de forma absoluta (M100.1 por ejemplo). Bien es cierto, que en Step 7 tradicional se puede dar nombre al bit M100.1 aunque esté solapándose con la MW100 a la que le hemos denominado "Velocidad" Esto ha sido superado por el direccionamiento parcial en TIA Poral. Ahora, podemos acceder a la información de cada bit, byte o word de una etiqueta de una forma más sencilla y elegante. Para direccionarlo solo tendremos que usar estas reglas: - “Nombre”.xN para direccionar el bit N de la variable “Nombre” - “Nombre”.bN para direccionar el byte N de la variable “Nombre” - “Nombre”.wN para direccionar el Word N de la variable “Nombre” El aspecto que tiene, es como en la siguiente imagen: Ni que decir tiene, que el direccionamiento parcial será posible cuando la variable sea más grande que el direccionamiento parcial. Es decir, no podremos hacer un direccionamiento parcial de un Word de una variable que tenga tamaño byte. ### ¿Qué equivalencia hay entre el direccionamiento directo y el simbólico? Para aclarar la equivalencia entre el direccionamiento directo y el simbólico, te dejo este cuadro: Y para dejarlo aún más claro, te invito a que veas este vídeo donde efectivamente comprobamos que la equivalencia es como la indicada en el cuadro: ### ¿Te ha quedado más claro ahora el direccionamiento simbólico en TIA Portal? La idea de esta entrada era clarificar el uso potenciado que tiene ahora el direccionamiento simbólico en TIA Portal. El direccionamiento absoluto comienza a ser menos importante ya que puedes referirte de una forma mucho más sencilla al poseer la herramienta del direccionamiento parcial. Si necesitas ayuda para comprender bien cómo funciona TIA Portal te invito a que [eches un vistazo al curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/)porque todo está explicado detenidamente para que conozcas al detalle cómo funcionan los autómatas, cómo se divide la memoria, tipos de datos, programación en escalera, en SCL, la programación de pantallas... Recuerda que puedes apuntarte en **[Guorker.com](https://guorker.com) **donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma. --- # Quiero dedicarme a la automatización con Siemens ¿y ahora qué? > Automatización con Siemens: por dónde empezar si quieres dedicarte a ello, qué series de PLC dominar primero y cómo avanzar poco a poco sin agobiarte. Fuente: https://programacionsiemens.com/automatizacion-con-siemens · Autor: Iñigo Gútiez · Publicado: 2017-02-02 · Actualizado: 2017-02-02 · Categoría: Actualidad y profesión Si comienzas en el mundo de la **automatización con Siemens** puede ser que te surjan dudas de por dónde empezar. Es normal, este mundillo se te hace complicado y quieres centrar al máximo tu tiro. Pero como todo en esta vida, las cosas no son ni blanco ni negro, sino hay una gran escalas de grises. Para empezar, tienes que tener en cuenta que deberás ir adquiriendo conocimientos poco a poco de varias series de Siemens. Puede que con la serie 1200 y 300 tengas el 90% de tus proyectos cubiertos, pero puede que tengas que lidiar con la serie 400 o 1500, y cómo no, con los pequeños LOGO! No, no empieces a hiperventilar aún. En el fondo, pasar de unos a otros son pasos naturales y no te costará grandes esfuerzos hacerte con una nueva serie si conoces bien una serie como la 300 o 1200, a pesar de que puedas encontrártela en plataformas diferentes : Step 7 V5.x o TIA Portal. Porque ten claro que a pesar de que TIA Portal está cada vez más extendido y que las series 1200 y 1500 ya no son programables en Step 7 V5. Antes o después te encontrarás con PLC programados con S7 clásico si te dedicas a la automatización con Siemens, y si me apuras, igual te efrentas con los viejos S5. ### ¿Por dónde empiezo la automatización con Siemens? Pues depende. Vas a tener que acabar trabajando posiblemente con todas las configuraciones, pero como va a llevarte tiempo, es mejor centrar un poco el tiro en los primeros compases de este partido sin fin. Si trabajas en una empresa y vas a mantener básicamente CPU de la serie 300 programadas en Step 7 V5 con sus pantallas programadas en WinCC Flexible 2008 o anteriores, no tiene mucho sentido que empieces a trastear con TIA Portal en una primera instancia. Tendrás que darle duro a Step 7 y con el tiempo, TIA Portal irá llegando a tu empresa y ya tendrás tiempo de hacerte con él. Si por el contrario vas a dedicarte a programar nuevas instalaciones, especialmente si no son muy grandes, lo más probable es que acabes programando [S7-1200](https://programacionsiemens.com/s7-1200), por lo que no te quedará más remedio que hacerte con TIA Portal y dejar un poco al lado la versión tradicional de S7. ¿Eso quierde decir que son excluyentes? Decididamente no. Vas a tener que trabajar con ambos al dedicarte a la automatización con Siemens. Solo digo, que depende del trabajo al que te vayas a dedicar, es más práctico empezar por uno en vez de otro. Coste de oportunidad, nada más. Pero acabarás teniendo que trabajar en ambos casi seguro. Más adelante, puede incluso que tengas que realizar no solamente programas de PLC y pantallas de Siemens, sino que tengas que realizar proyectos de mayor envergadura creando [tus propios HMI en VB.NET](https://programacionsiemens.com/crear-en-hmi-vb-net/) y conectarlos mediante un OPC a tu PLC. Pero como digo, es cuestión de ir dando los pasos poco a poco. ### ¿Y que software voy a necesitar? Como en el caso anterior... depende. Si estás trabajando con PLC de hace unos años, lo normal es tener Step 7 Professional en su versión V5.X. Con este software podrás programar los autómatas de la serie 300 y 400 sin problemas. En cuanto a los HMI, dependerá un poco del tipo de pantallas que uses, pero variará desde Protool (si los equipos son anteriores a digamos 2005) pasando por los diferentes WinCC Flexible hasta la versión 2008 SP3. Si por el contrario te vas a dedicar a realizar pequeñas automatizaciones, con TIA Portal Basic tendrás acceso a la gama de los 1200 y las pantallas Basic en el caso de WinCC en TIA Portal. Suficiente para realizar automatizaciones pequeñas y medianas que no requieran de CPU de la serie 300 o superior. ### ¿Y qué hay del ordenador? En el caso del PC de sobremesa o portátil que vayas a usar, pues nuevamente dependerá del uso. Para todo software de Siemens anterior a TIA Portal, no vas a necesitar un PC especialmente potente. Cualquier PC de hoy moverá con soltura los programas. Para TIA Portal, la cosa cambia, y mucho. Es un auténtico devorador de recursos. Como puedes ver[en la web de Siemens,](https://support.industry.siemens.com/cs/document/50204569/%C2%BFcu%C3%A1les-son-los-requisitos-para-la-instalaci%C3%B3n-de-step-7-(tia-portal)-v13-?dti=0&lc=es-ES) ya no vale cualquier cosa para programar en TIA Portal V13: - Procesador: CoreTM i5-3320M 3.3 GHz o superior - Memoria principal: 8 GB de memoria (recomendado) o más - Disco duro: 300 GB SSD - Gráficos: Mín. 1920 x 1080 - Pantalla: 15,6" display de pantalla ancha (1920 x 1080) Vale. Hoy en día no son unos requerimientos altísimos, pero ya te digo, que con un i7-4790K (3 veces más potente que el recomendado) con 16GB de memoria, disco duro SSD,  hay veces que rasca, y bastante. Lo digo, porque es lo que tengo, y hay veces que parece que no tira. Vamos, que el un peso pesado. Intenta hacerte con el PC más potente que puedas. Especial comentario es lo de la pantalla. Fíjate que dice que sea Full HD. Sí, y no se te ocurra trabajar con menos porque con la cantidad de menús que tiene TIA Potal, como te pongas con tu portátil de 1366x768 no vas a ver casi nada y va a ser muy incómodo trabajar. Avisado quedas. ### ¿Y el Sistema Operativo? Bueno, podrías pensar que con tener un PC con Windows, ya está para realizar una buena automatización con Siemens. Pues no, *hamijo*, no. Necesario, pero no suficiente. Ya que lamentablemente Siemens tiene sus versiones compatibles de Windows. Tendrás que chequear en función del software, qué compatibilidad tiene. ### ¿Por dónde crees que debes empezar? Ahora, si estás o has estado en la tesitura de elegir, ¿por dónde vas a empezar la automatización con Siemens? Recuerda que si necesitas empezar a programar los nuevos PLC de Siemens, tienes este [curso de TIA Portal](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) en el que se ve todo lo necesario para alcanzar un buen nivel en la programación de la serie S7-1200 que te servirá para posteriormente hacerte sin problemas con los S7-1500 --- # Contador ascendente y descendente en TIA Portal > Contador ascendente y descendente en TIA Portal: aprende a usarlo con un ejemplo real de parking que suma entradas y resta salidas de vehículos. Fuente: https://programacionsiemens.com/contador-ascendente-y-descendente-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2016-04-02 · Actualizado: 2016-04-02 · Categoría: Programación PLC Vamos a conocer la utilización de un **contador ascendente y descendente en TIA Portal**, de mano de un ejemplo real consistente en un parking con entrada y salida de vehículos, de manera que los vehículos que salen restarán el valor al contador. ### Cómo insertar un contador ascendente y descendente en TIA Portal. Del mismo modo que hemos visto en la utilización de contadores en el pasado artículo, el contador ascendente y descendente sigue la misma metodología. Hay que seleccionar el tipo de contador e insertarlo en el segmento a trabajar. Imagen Contador ascendente y descendente en TIA Portal El modo de utilización de este tipo de contador es idéntico a un contador ascendente pero añadiendo una nueva entrada que servirá para descontar elementos guardados en el contador. Para ver un claro ejemplo, lo utilizaremos en un proyecto de parking de vehículos de manera que, al entrar los vehículos aumentará el contador y cuando salga un vehículo, descontará un valor al contador. ### Ejemplo de un garaje con entrada y salida de vehículos. #### Entrada del vehículo. En la entrada dispondremos de una fotocélula de detección de vehículo, que permitirá abrir la puerta de entrada solo si el parking no está lleno. Tendremos un máximo de 5 plazas. Imagen Permitir acceso con barrera de entrada. Además tendremos otra fotocélula que contará el vehículo cuando sobrepase la entrada. Si se detecta esta fotocélula significa que la puerta se ha abierto, porque todavía existe alguna plaza libre dentro del garaje. Esta entrada aumentará en uno nuestro contador ascendente y descendente en TIA Portal. Imagen Entrada de vehículo añadida al contador ascendente. #### Salida del vehículo. En la salida tendremos prácticamente el mismo procedimiento: una primera fotocélula que detecta que existe vehículo en la salida, la cual me permitirá abrir la puerta de salida: Imagen Control de la puerta de salida con la detección de vehículo. Y ahora lo más importante, que será colocar una fotocélula después de la puierta de salida, de manera que, cuando salga un vehículo descontará una unidad al contador ascendente y descendente en TIA Portal de nuestro proyecto. Imagen Salida de vehículo añadida al contador descendente. #### Implementación del sistema en la pantalla táctil. En la pantalla vamos a representar en tiempo real el estado del garaje, con las posiciones libres y ocupadas y unos leds indicadores de que las plazas están libres u ocupadas. La representación gráfica del garaje quedará como muestra la siguiente figura. Imagen Representación gráfica del garaje en pantalla táctil. #### Detectores de plaza de garaje ocupada. Para cada plaza existirá un detector que si está verde nos indica que está libre y si está ocupado lucirá de color rojo. Para ello, utilizaremos una entrada y una salida para cada plaza de garaje, tal y como representamos en los siguientes segmentos del programa: Imagen Plazas de garaje ocupadas o vacías mediante detectores en cada plaza. Después de tener las variables creadas en el Step 7 de TIA Portal, debemos asignar estas variables en la pantalla, de manera que, cuando una plaza esté libre, se verá el piloto de color verde, mientras que si está ocupada, se verá de color rojo. Para ello vamos a jugar con la visibilidad de objetos en la pantalla. #### Visibilidad piloto verde: plaza libre. Pongamos como ejemplo la plaza de garaje 1: si la salida Q1.0 está desactivada (Q1.0=0) el piloto debe ser verde. La visibilidad la asignaremos mediante la animación de visibilidad como muestra la figura: Imagen Agregar animación para el piloto verde. Ahora le asignaremos la variable del PLC que utilizamos para esa plaza de garaje, colocando que en el rango de “0” a “0”, este objeto será visible. Es decir, que siempre que la salida Q1.0 sea “0” significa que la plaza está libre, y por tanto, debe estar en color verde, el objeto será visible. Imagen Seleccionamos visibilidad para el piloto verde. #### Visibilidad piloto rojo: plaza ocupada. Al mismo tiempo, para el piloto rojo debemos hacer la operación de animación inversa, es decir, que cuando tenga el rango de “1” a “1”, el piloto rojo será visible. Imagen Seleccionamos visibilidad para el piloto rojo. #### Visibilidad coche en cada plaza: plaza ocupada. Idéntico a la visibilidad del piloto rojo, establecemos una visibilidad para cada vehículo en su plaza de garaje. Siguiendo los mismos pasos que para el piloto rojo, ya que, el vehículo en cada plaza será visible cuando la plaza en cuestión esté ocupada. Imagen Seleccionamos visibilidad para el vehículo en cada plaza **Contador ascendente y descendente en la pantalla.** Para visualizar el valor actual del contador insertaremos un campo de salida, de manera que podamos ver el valor del contador. Para ello, debemos crear una variable en la pantalla, de tipo INT y relacionarla con el dato “.CV” del contador ascendente y descendente que hemos creado en el programa. Imagen Crear variable en pantalla para visualizar el contador. #### Asignar variable del contador al campo de salida. Seguidamente definimos un campo en entrada / salida y vamos a declararlo como “Modo salida”, ya que solamente necesitamos visualizar el valor del contador, no necesitamos modificar ese valor. Le asignamos la variable del contador que hemos creado previamente, y de esta manera ya tenemos configurado el visualizador de número de plazas ocupadas en el garaje. Imagen Asignar la variable al campo de salida en la pantalla. #### Visualización final del proyecto. En las siguientes imágenes comprobamos como, a cada vez que un vehículo ocupa la plaza, se ilumina el led correspondiente, el contador muestra el número correcto de plazas ocupadas y cómo va incrementando y restando el valor del contador. Un ejemplo simple de garaje con la utilización de contadores. ### ### ### ¿Necesitas más formación en TIA Portal? Si estás en la necesidad de seguir formándote en TIA Portal, te invito a que le eches un vistazo al Curso de TIA Portal para CPU 1200 que está en marcha. Tienes toda la información sobre el contenido y lo que puedes lograr con este curso en**[este enlace.](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/)** --- # Contadores en TIA Portal > Contadores en TIA Portal: aprende a seleccionar el tipo adecuado para tu proceso y a contar elementos con un ejemplo práctico en la serie S7-1200. Fuente: https://programacionsiemens.com/contadores-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2016-03-13 · Actualizado: 2016-03-13 · Categoría: Programación PLC Utilización de los **contadores en TIA Portal** desde cómo seleccionar el tipo de contador necesario para el proceso en el que estamos trabajando hasta un ejemplo práctico para contar elementos dentro de un proyecto de automatización. Toda esta información está incluida en el [curso de programación en TIA Portal para la serie 1200 de Siemens](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/). Si necesitas formación en los nuevos PLC de Siemens, no dudes en consultar la información y ver si encaja con tus necesidades formativas. ### Uso de contadores en TIA Portal **Cómo seleccionar un contador en TIA Portal.** Los contadores en TIA Portal los vamos a poder seleccionar de la barra de herramientas donde se encuentran todos los elementos que podemos utilizar en el proyecto, al igual que los temporizadores u otras funciones. Imagen Barra de herramientas y contadores en TIA Portal. En la imagen se pueden observar varios tipos de contadores a utilizar, cada cual válido para un determinado proceso de contar o descontar elementos dentro de nuestro proyecto. La propia imagen define exactamente el comportamiento del contador, es decir, si es contador ascendente solamente contará positivamente los elementos, o contador descendente que descontará elementos o contador que incluye ambas opciones a la vez, con lo cual, contará ascendentemente con una condición previa y descontará con otra condición distinta. Imagen Tipos de contadores. ***Cómo insertar y definir contadores en TIA Portal.*** Vamos a empezar a trabajar con un temporizador ascendente CTU. Para utilizarlo, el primer paso es seleccionarlo  de la barra de herramientas y desplazarlo hasta el segmento donde lo queramos utilizar, con el simple gesto de seleccionar y arrastrar. Imagen Seleccionar contador y arrastrar al segmento del programa. Inmediatamente nos aparece la ventana de definición del contador, donde habrá que establecer el DB de datos al que irá asociado nuestro contador, ya que en TIA Portal los contadores guardan sus datos en un bloque de datos (DB) de instancia propio. Así pues, nombramos el contador con el nombre identificativo que mejor se adapte al proceso que vamos a programar, por ejemplo, llamándolo “Contador Vehículos”. Este contador se añadirá a la carpeta de sistema de nuestro proyecto: Imagen Contador guardado en la carpeta de Bloque de Sistema del proyecto. Ahora simplemente nos quedaría colocar una condición de contaje y el número máximo de veces que va a contar este contador, tal y como se hace en el antiguo Step 7. Paralelamente también podemos definir el tipo de datos con los que va a trabajar el contador, mediante la pestaña que desplegará un campo de selección de datos, dentro del cuerpo del contador. Imagen Selección del tipo de datos para el contador. **Pero vamos a utilizar el contador con un ejemplo: Contador de vehículos de entrada a un parking.** Vamos a definir un ejemplo donde vamos a contar los vehículos que van a entrar en un parking o recinto cerrado. En este primer ejemplo, solamente vamos a contar la entrada de vehículos, con un máximo número de entrada de vehículos establecido, de manera que cuando se llegue al máximo, la barrera de entrada ya no se podrá abrir. Por pantalla podremos observar la cantidad de vehículos que han entrado. *Primer paso: establecer el contador en el Step 7 en TIA Portal.* Ya sabemos crear un contador, por lo que, en este caso, vamos a utilizar uno de ellos, de contaje de manera ascendente, ya que queremos contar e incrementar el valor cada vez que pase un vehículo, por tanto seleccionamos el contador CTU. El tipo de datos será INT ya que vamos a contar número s decimales, y tendrá una condición de entrada que será una fotocélula que será la que ejecute el contaje, indicando que el vehículo va a pasar al parking. Imagen Definir el contador de vehículos con la cantidad máxima. *Segundo paso: control de la barrera de acceso.* Tenemos una fotocélula que realizará el contaje ascendente, pero a la vez, de otra manera se va a controlar la apertura de la barrera de entrada, por tanto vamos a poner otra condición para la barrera, ya que, una vez el parking esté lleno, ya no se puede dar orden de subir la barrera, y tampoco se podrá contar ningún vehículo más. Es decir, que tendremos una fotocélula  al a entrada que permitirá abrir la barrera solamente si el parking no está lleno, y esto lo conseguiremos con una comparación del contador y el valor máximo establecido. La barrera solo abrirá si esa comparación es positiva. imagen  Control de la barrera de entrada al parking. *Tercer paso: representación en pantalla táctil.* De forma gráfica vamos a conseguir ver el estado de la instalación, mediante la pantalla táctil. Por tanto, hay que definir todos los elementos de la instalación en la pantalla. En este caso vamos a representar solamente el contaje de vehículos para, en un ejemplo posterior, en otro documento, lo veremos más extendido. Quedará algo como sigue: Imagen Pantalla representación del parking de vehículos. *Definir las variables en la pantalla.* En este ejemplo simple, vamos a representar el contaje de nuestro contador en pantalla, de manera que veremos cada vez que entra un vehículo como va aumentando el número. Así pues, para representar el contador escogeremos un elemento de “Campo de E/S”. Imagen Introducir Campo de ES en la pantalla. Ahora vamos a definir este elemento como un campo de salida, ya que solo necesitamos ver el valor en pantalla, ese valor no se debe modificar, por tanto solo es un valor de “Salida”. Imagen Establecer modo Salida para el campo del contador. Seguidamente vamos a seleccionar la variable para este campo de salida, esto es, nuestro contador. Al seleccionar la variable se abre un campo desplegable donde podemos buscar la variable dentro del proyecto del PLC, para así, encontrar el valor “CV” de nuestro contador de vehículos. Imagen Seleccionar el valor CV del contador de vehículos. Por último, hay que establecer el formato de representación en la pantalla para el valor del contador. En este caso, le pondremos un valor decimal, con un formato de dos dígitos, que será suficiente para representar como máximo el valor número 5 que tiene como límite el contador. Imagen Establecer formato para el contador de vehículos. *Representación gráfica.* En estas imágenes siguientes podremos ver como se representaría el contaje y la utilización de los contadores en TIA Portal para el ejemplo de parking. En un próximo documento realizaremos un contaje de vehículos y un decontaje de vehículos de este parking, para que quede representada la entrada y salida de los mismos. Imagen 1 Pantalla representación de Parking sin vehículos. Imagen 2 Pantalla representación de Parking con 1 vehículo. Imagen 3 Pantalla representación de Parking con 4 vehículos. --- # Cómo filtrar una entrada en TIA Portal > Filtrar una entrada en TIA Portal con un temporizador: evita detecciones falsas de una fotocélula y trata solo las señales que de verdad te interesan. Fuente: https://programacionsiemens.com/como-filtrar-una-entrada-en-tia-portal · Autor: Iñigo Gútiez · Publicado: 2016-02-25 · Actualizado: 2016-02-25 · Categoría: Analógicas y regulación En esta entrada vamos a ver** cómo filtrar una entrada en TIA Portal** mediante la utilización de temporizadores para que en un proceso de programación no nos afecten las pequeñas detecciones de dicha entrada que no las queremos considerar como una señal de activación. El uso de este tipo de técnicas, y muchísimas más puedes encontrarlo en**[el curso sobre TIA Portal que puedes encontrar aquí.](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/)** ### Definición de cómo filtrar una entrada en TIA Portal mediante un temporizador. Vamos a centrarnos en un caso concreto para filtrar una entrada en TIA Portal: Una fotocélula que tenemos en nuestra instalación de una puerta de garaje, donde queremos que cuando se active esta señal de entrada, comience el proceso de contaje de un tiempo para la apertura o cierre de la puerta de garaje. *Imagen Fotocélula para la entrada a la instalación.* #### ¿Pero, de qué nos sirve filtrar una entrada en TIA Portal mediante un tiempo? El objetivo es que mediante este filtrado vamos a evitar falsas detecciones, esto es, que si la fotocélula detecta la caída de una hoja de un árbol, o si se ha detectado debido al polvo de la instalación, nos va a detectar durante un periodo tan corto de tiempo que sí que nos va a dar señal al autómata, pero que esta señal no es la que nosotros queremos que inicie nuestro proceso. **Utilización de un temporizador TON para filtrar una entrada.** Queremos que la activación de la entrada tenga un retardo de 2 segundos, de manera que, cuando la fotocélula esté tapada durante 2 segundos, nos inicie el proceso de apertura de la puerta del garaje. Es un claro ejemplo de un temporizador con retardo a la conexión TON. En TIA Portal seleccionaremos el tipo de temporizador necesario: *Imagen Insertar el temporizador TON en TIA Portal.* Posteriormente colocamos la condición previa a la activación del temporizador, que en nuestro caso será la entrada de la fotocélula: *Imagen Asignar la entrada de la fotocélula al temporizador TON.* Con estos simples pasos ya tenemos la entrada filtrada a 2 segundos, para que, de esta manera, evitamos una falsa detección de milisegundos, que haría activar la salida que controlamos (en nuestro caso la puerta) de forma errónea. Es decir, solamente queremos controlar la salida cuando la fotocélula esté tapada un mínimo de 2 segundos, que nos asegura que está detectando un coche. *Imagen Control de la subida de la puerta con el temporizador.* **Utilización de un temporizador TOFF para filtrar la entrada.** Centrémonos ahora en la puerta de salida del garaje, donde vamos a tener una fotocélula que controle la puerta, pero no nos sirve la temporización que hemos utilizado para la entrada, ya que ahora lo que necesitamos es que cuando la fotocélula deje de detectar, siga contando un tiempo. Lo que haremos será, después de utilizar el filtrado de la fotocélula con 2 segundos, utilizar otro temporizador, el cual contará desde que se desactive la fotocélula, utilizando así un tiempo a la desconexión, TOFF. *Imagen Filtrar la fotocélula de la salida del garaje.* Una vez filtrada la fotocélula, lo que hacemos es utilizar el temporizador TOFF para determinar que, una vez el coche deje de detectar la fotocélula, nos asegure que la salida seguirá activada durante un tiempo, en este caso, 4 segundos del temporizador TOFF. *Imagen Control de la puerta de salida con retardo del temporizador TOFF.* **Representación del sistema en la pantalla táctil.** Vamos a realizar la representación del proyecto mediante WinCC Flexible, para poder tener configurables los tiempos de retardo que queremos para cada cosa. El primer paso será definir una tabla de variables en TIA Portal que serán las variables que leerá el WinCC Flexible posteriormente. *Imagen Crear tabla de variables para el filtrado de entradas.* Se observa que hemos creado unos datos de tipo Time, que serán los tipo de datos que sí que aceptan los temporizadores. De esta manera, el tiempo del temporizador lo vamos a controlar con estas variables, en lugar de utilizar un tiempo directamente. *Imagen Tiempo del temporizador mediante una variable.* La ventaja que conseguimos con esto es que, ahora, desde el proyecto WinCC Flexible podemos parametrizar el tiempo a nuestra conveniencia, sin necesidad de cambiar el tiempo mediante programación, sino que, el propio usuario sea quien determine el tiempo. #### ¿Cómo asignamos el tiempo del temporizador desde pantalla? En el proyecto de WinC Flexible, para determinar el tiempo para filtrar una entrada, utilizaremos un campo de entradas salidas, al cual le asignaremos una de las variables que hemos creado en el PLC. Como previamente ya hemos creado las variables en el PLC, solamente tendremos que seleccionar una de ellas. *Imagen Seleccionar variable del PLC para el proyecto de WinCC Flexible.* Ahora, configurando este campo como entrada / salida, conseguimos que el usuario pueda introducir y cambiar el valor del temporizador para filtrar una entrada, con las variables de la tabla de variables que hemos creado más arriba. Imagen Filtrar una entrada mediante la asignación de una variable del PLC. #### Y por último, el tiempo de control de las puertas. Siguiendo el mismo procedimiento, queremos asignar también el tiempo de control de los temporizadores para la puerta de entrada y salida del garaje que hemos descrito anteriormente. Del mismo modo que antes, seleccionaremos varios campos de entrada y salida en el WinCC Flexible y le asignaremos las variables creadas en la tabla de variables del PLC. *Imagen Asignar la variable de la tabla de variables del PLC.* Ahora solamente nos queda cambiar en nuestro proyecto de TIA los tiempos en los temporizadores, seleccionando esas mismas variables. *Imagen Utilización de las variables de entrada manual desde pantalla táctil para puerta de entrada.* *Imagen Utilización de las variables de entrada manual desde pantalla táctil para puerta de salida.* --- # Seguimiento solar con Siemens 1200 TIA Portal > Seguimiento solar con Siemens 1200 en TIA Portal: ejemplo real traducido al castellano para programar un tracker solar paso a paso en tu PLC. Fuente: https://programacionsiemens.com/seguimiento-solar-con-siemens-1200-y-tia-portal · Autor: Iñigo Gútiez · Publicado: 2016-02-14 · Actualizado: 2016-02-14 · Categoría: Programación PLC Recientemente, y debido al proceso de documentación que estoy realizando para [el curso de TIA Portal sobre la serie 1200 de Siemens](https://programacionsiemens.com/curso-de-tia-portal-cpu-1200/) (en el cual veremos ejemplos también en SCL), me he topado con este ejemplo de **Seguimiento solar con Siemens 1200 realizado en TIA Portal.** Es un ejemplo publicado en inglés de la empresa **Bytex Automation**, en Italia. Me he puesto en contacto con ellos para pedirles la oportunidad de traducir el ejemplo a castellano y compartirlo contigo. Su contacto Massimo me ha dado permiso, por lo que aquí te lo traigo para que lo conozcas si no lo habías visto o bien si la lengua de Shakespeare se te resiste un poco. La traducción es lo más literal posible para ser fiel a la entrada original. ### Seguimiento solar con Siemens 1200 y TIA Portal Este artículo explica como construir un sistema de seguimiento solar con usando un PLC Simatic [S7-1200](https://programacionsiemens.com/s7-1200). La función astronómica estças desarrollada en lenguaje SCL. El objetivo principal es desarrollar una función capaz de retornar la elevación del Sol (ángulo de altitud solar), y su ángulo con el norte (ángulo azimutal). La función retornará también el tiempo que falta para el amanecer y el ocaso, la duración total de horas de sol, el momento en el que se hace de día y cuándo se hace de noche. Puedes usar esta  característica para encender una lámpara en tu jardín cuando el sol se pone o dirigir uno o varios paneles, manejados por ejes motorizados,  siguiendo el sol para conseguir el máximo de energía. [Imagen: Seguimiento solar con Siemens 1200] [Imagen: Seguimiento solar con Siemens 1200] [Imagen: Seguimiento solar con Siemens 1200] Ejemplos de paneles solares usando uno o dos ejes motorizados La función necesita algunos parámetros de entrada, como la latitud, longitud y elevación local, la zona horaria, ajuste de luz de día, y finalmente la hora actual dada desde el reloj del PLC. #### Función astronómica - Parámetros de entrada - LocalLatitude Número decimal representando la latitud local. Asigna números positivos para el hemisferio norte y negativos para el hemisferio sur. Por ejemplo 45.838073 - LocalLongitude Número decimal que representa la longitud local. Asigna números positivos para meridianos del Este y negativos para el Oeste de Greenwich. Por ejemplo -13.406095) - Elevation Número decimal que representa la elevación local sobre el mar medido en metros. - TimeZone (Número decimal que representa la zona horaria respecto a Greenwich. - DayLightAdjustement Fija DayLightAdjustement = 1  en verano y  DayLightAdjustement = 0 para invierno - ActualDateAndTime Fecha y hora actual #### Función astronómica - Parámetros de salida - AltitudeAngle Número decimal que representa el ángulo entre la posición del sol y el horizonte del observador local. - AzimuthAngle Número decimal que representa el ángulo entre una dirección de referencia (Norte) y una línea desde el observador hasta la posición del sol proyectada en el mismo plano como la dirección de referencia. - SunRiseTime Amanecer en tipo de datos DTL - SunSetTime Puesta del Sol en tipo de datos DTL - SunDurationTime Duración total de sol en tipo de datos Time - IsDay  Booleana que indica el el evento del amanecer - IsNight Booleana que indica el evento del anochecer #### Cómo funciona: Ajuste de luz solar Si tu país tiene un sistema de ahorro de luz solar (como por ejemplo España), tienes que ajustar el parámetro DayLightAdjustement=1 en verano, y DayLightAdjustement=0 en invierno. Si no lo tiene, el parámetro tiene que estar siempre a 0. ##### ¿Cómo hacerlo? Usando la función RD_LOC_T puedes leer la fecha y hora actual del PLC Simatic S7-1200 y leyendo el valor RET_VAL de la función, puedes leer el estado del tiempo de luz solar actual (W#16#0001) [Imagen: Seguimiento solar con Siemens 1200] #### Cómo funciona: Sincronizar el relos del PLC con la hora de internet ##### ¿Cómo hacerlo? Si tienes una conexión de internet para el PLC es bastante simple. Ve a la configuración del dispositivo en el panel izquierdo del TIA Portal; pica y haz click en el interface PROFINET y selecciona Activar sincronización horaria via servidor NTP y añade una dirección de servidor de hora de internet. Por ejemplo 192.204.114.232. [Imagen: Seguimiento solar con Siemens 1200] #### Cómo funciona: Función astronómica de un sistema de seguimiento solar con Siemens 1200 **Lenguaje SCL - **Esta es la lista de declaración de variables ``` // Input parameters //------------------------------- // LocalLatitude: Real // LocalLongitude: Real // Elevation: Real // TimeZone: Int // DayLightAdjustement: Int // ActualDateAndTime: DTL // Output parameters //------------------------------- // AltitudeAngle: Real // AzimuthAngle: Real // SunRiseTime: DTL // SunSetTime: DTL // SunDurationTime: Time // IsDay: Bool // IsNight: Bool // PreSet: Bool // Static declarations //------------------------------- // #RadiansToDegrees Real // #DegreesToRadians Real // #Meridian Real // #HoursAfterMidnight Real // #MinutesAfterMidnight Real // #UT Real // #CorrectedYear UInt // #CorrectedMonth USInt // #t Real // #g Real // #gn Real // #C Real // #L Real // #Alpha Real // #GHA Real // #GHAn Real // #Obliquity Real // #Declination Real // #EotAdjustment Real // #ClockTimeToLSOTAdjustment Real // #SolarHourAngle Real // #ApparentSolarTime Real // #SolarMinutesAfterMidnight Real // #whichDay Int // #HourAngle Real // #PreAzimuthAngle Real // #x Bool // #SunRiseSetLSoTMinutes Real // #SunRiseTime_R Real // #SunSetTime_R Real // #SunDurationTime_R Real // #RHour Real // #RMin Real // #RSec Real // #IHOUR Int // #IMIN Int // #ISEC Int ``` **Lenguaje SCL** -  Código ejemplo de seguimiento solar ``` //****************************************************** // THIS CODE MUST BE COMPILED AS FUNCTION_BLOCK //****************************************************** // Define Radians and Degrees conversion // ------------------------------------- #RadiansToDegrees := 57.295779513082323; #DegreesToRadians := 0.017453292519943295; #Meridian := -15.0 * INT_TO_REAL(#TimeZone); // Calculate Hours after midnight // ------------------------------ #HoursAfterMidnight := INT_TO_REAL(#ActualDateAndTime.HOUR) + INT_TO_REAL(#ActualDateAndTime.MINUTE) / 60.0 + INT_TO_REAL(#ActualDateAndTime.SECOND) / 3600.0; // Calculate Minutes after midnight // -------------------------------- #MinutesAfterMidnight := INT_TO_REAL(#ActualDateAndTime.HOUR) * 60.0 + INT_TO_REAL(#ActualDateAndTime.MINUTE) + INT_TO_REAL(#ActualDateAndTime.SECOND) / 60.0; // calculate Universal Time // ------------------------ #UT := #HoursAfterMidnight - INT_TO_REAL(#TimeZone) - INT_TO_REAL(#DayLightAdjustment); IF #ActualDateAndTime.MONTH > 2 THEN #CorrectedYear := #ActualDateAndTime.YEAR; #CorrectedMonth := #ActualDateAndTime.MONTH - 3; ELSE #CorrectedYear := #ActualDateAndTime.YEAR -1; #CorrectedMonth := #ActualDateAndTime.MONTH + 9; END_IF; #t := ((#UT / 24.0) + USINT_TO_REAL(#ActualDateAndTime.DAY) + DINT_TO_REAL(FLOOR(30.6 * USINT_TO_REAL(#CorrectedMonth) + 0.5)) + DINT_TO_REAL(FLOOR(365.25 * (UINT_TO_REAL(#CorrectedYear) - 1976.0))) - 8707.5) / 36525.0; #g := 357.528 + 35999.05 * #t; #gn := "NormalizeTo360"(#g); #C := (1.915 * SIN(#gn * #DegreesToRadians)) + (0.02 * SIN((2.0 * #gn) * #DegreesToRadians)); #L := 280.46 + (36000.77 * #t) + #C; #Alpha := #L - 2.466 * SIN((2.0 * #L) * #DegreesToRadians) + 0.053 * SIN((4.0 * #L) * #DegreesToRadians); #GHAn := #UT * 15.0 - 180.0 - #C + #L - #Alpha; #GHA := "NormalizeTo360"(#GHAn); #Obliquity := 23.4393 - 0.013 * #t; #Declination := ATAN(TAN(#Obliquity * #DegreesToRadians) * SIN(#Alpha * #DegreesToRadians)); #Declination := #Declination * #RadiansToDegrees; #EotAdjustment := (#L - #C - #Alpha) / 15.0; // EOT adjustment in hours #ClockTimeToLSOTAdjustment := ((#LocalLongitude - #Meridian) / 15.0) - #EotAdjustment + #DayLightAdjustment; #SolarHourAngle := 0.0; #SolarHourAngle := #GHA - #LocalLongitude; #TempReal := "NormalizeTo180"(#SolarHourAngle); #SolarHourAngle := #TempReal; #ApparentSolarTime := 0.0; #TempReal := 12.0 + #SolarHourAngle / 15.0; #ApparentSolarTime := "NormalizeTo24"(#TempReal); #SolarMinutesAfterMidnight := #MinutesAfterMidnight - (#ClockTimeToLSOTAdjustment * 60.0); #whichDay := 0; #HourAngle := (#SolarMinutesAfterMidnight - 720.0) / 4.0 * -1.0; #AltitudeAngle := #RadiansToDegrees * (ASIN((SIN(#LocalLatitude * #DegreesToRadians) * SIN(#Declination * #DegreesToRadians)) - (COS(#LocalLatitude * #DegreesToRadians) * COS(#Declination * #DegreesToRadians) * COS((#SolarHourAngle + 180.0) * #DegreesToRadians)))); #PreAzimuthAngle := #RadiansToDegrees * ACOS((COS(#Declination * #DegreesToRadians) * ((COS(#LocalLatitude * #DegreesToRadians) * TAN(#Declination * #DegreesToRadians)) + (SIN(#LocalLatitude * #DegreesToRadians) * COS((#SolarHourAngle + 180.0) * #DegreesToRadians)))) / COS(#AltitudeAngle * #DegreesToRadians)); #x := False; IF (#HourAngle > 0.0) THEN IF (#HourAngle = 30.0 AND #RMin = 30.0 AND #RMin = #SunRiseTime AND #ActualDateAndTime = (#SunSetTime - 1) THEN #PreSet := true; ELSE #PreSet := false; END_IF; ``` **Lenguaje SCL** - Código de la función NormalizeTo24 ``` //*********************************************** // Assign to the FUNCTION the name=NormalizeTo24 //*********************************************** // Input parameters //------------------------- // aTime: Real // Return variable //------------------------- // Ret_Val Real #NormalizeTo24 := (#aTime - DINT_TO_REAL(FLOOR(#aTime / 24.0)) * 24.0); ``` **Lenguaje SCL **- Código de la función NormalizeTo180 ``` //************************************************ // Assign to the FUNCTION the name=NormalizeTo180 //************************************************ // Input parameters //------------------------- // Angle: Real // Temporary variables //------------------------- // TempAngle: Real // Return variable //------------------------- // Ret_Val Real #TempAngle := "NormalizeTo360"(#Angle); IF "NormalizeTo360"(#Angle) > 180.0 THEN #TempAngle := "NormalizeTo360"(#Angle) - 360.0; END_IF; #NormalizeTo180 := #TempAngle; ``` **Lenguaje SCL** - Código de la función NormalizeTo360 ``` //************************************************ // Assign to the FUNCTION the name=NormalizeTo360 //************************************************ // Input parameters //------------------------- // Angle: Real // Return variable //------------------------- // Ret_Val Real #NormalizeTo360 := (#Angle - DINT_TO_REAL(FLOOR(#Angle / 360.0)) * 360.0); ``` ##### Últimas recomendaciones sobre esta función para el Seguimiento solar con Siemens 1200 y TIA Portal. Recuerda llamar al bloque principal dentro de un OB de interrupción fijando el tiempo de interrupción a 1000 milisegundos o 10000 milisegundos. Esta entrada de Seguimiento solar con Siemens 1200 es original de: Autor:Bytex Automation  es una compañía italiana con muchos años de experiencia internacional en automatización industrial (especialmente en el sector de acero), webs en tiempo real para análisis y manejo de procesos industriales como manufactura y logistica. Su fortaleza radica en la capacidad de desarrollar sistemas que comunican PLC y bases de datos EPR para producir plataformas web integradas y amigables. --- # Domina los punteros con formato ANY > Punteros con formato ANY en STEP 7: aprende a crearlos a mano y a darles una aplicacion practica para leer y copiar informacion dinamica entre bloques. Fuente: https://programacionsiemens.com/domina-los-punteros-con-formato-any · Autor: Iñigo Gútiez · Publicado: 2015-11-04 · Actualizado: 2015-11-04 · Categoría: Programación PLC Una forma de leer y copiar información dinámica es realizarlo mediante **punteros con formato ANY.** Lo que vamos a ver es por un lado cómo se crean a mano los punteros, y luego darle una aplicación práctica. Pero antes de eso, tenemos que ver un poco (o refrescar) qué es el formato ANY. Según la documantación de Siemens,  *[..] se utiliza cuando el tipo de datos del parámetro actual no se conoce o cuando se  puede utilizar cualquier tipo de datos. [..]* *STEP 7 almacena los datos del tipo de parámetro ANY en 10 bytes. Al estructurar un parámetro del tipo ANY, los 10 bytes deben quedar ocupados, ya que el bloque llamado evalúa todo el contenido del parámetro. Si, por ejemplo, especifica un número de DB en el byte 4, deberá indicar también explícitamente el área de la memoria en el byte 6. * *STEP 7 gestiona los datos de los tipos de datos simples y compuestos de forma diferente a la de los tipos de parámetros.[..]* ¿A que ahora ya te has quedado más tranquilo? Bueno, pues en cristiano, lo que quiere venir a decir es que con un ANY lo que defines es un área de la memoria (marcas, entradas, db..) y defines la longitud de ese área.  Además, el puntero con formato ANY tiene obligatoriamente 10 bytes de longitud y tienes que rellenar los 10 bytes sean necesarios o no. Así por ejemplo, puedes definir el área definido en un DB en concreto y que sea de un ancho de 24 bytes... por poner un ejemplo. ### ¿Cómo creamos un puntero con formato ANY? Bueno, vayamos por partes para entenderlo bien. En la siguiente figura tienes un resumen de cómo hay que rellenar los 10 bytes que forman un ANY en el caso de los tipos de datos simples y compuestos. Vayamos por tanto a repasar cada byte: **Byte 0:** Hay que cargar siempre un **10H**. Una constante que le sirve a Step 7 para indicar que es un ANY. **Byte 1:** Tipo de datos . Tendrás que cargar en hexadecimal en el byte 1 el número según la tabla para indicar qué tipo de datos quieres usar. **Word 2 (Byte 2 y 3):** Factor de repetición, es decir, la cantidad de items **Word 4 (Byte 4 y 5):** número de DB. Si no es de un DB el área de memoria, pones un bonito 0. **Byte 6:** Área de memoria. Es decir, el tipo. Lo indicamos en la siguiente tabla: **Byte 7, 8 y 9:** La dirección se almacena en formato byte.bit. La dirección de byte se deposita en los bits 0 a 2 del byte 7, en los bits 0 a 7 del byte 8 y en los bits 3 a 7 del byte 9, mientras que la dirección de bit se deposita en los bits 0 a 2 del byte 9. En el puntero nulo del tipo de datos NIL, todos los bytes estarán ocupados con 0 a partir del byte 1. Pero también se puede crear un puntero ANY  con informacion sobre un temporizador, contador o bloque.  Es parecido pero no es del todo igual. Veámoslo. ### Formato ANY en los tipos de parámetros En el caso de los tipos de parámetros, STEP 7 almacena el tipo de datos y la dirección de los parámetros. El factor de repetición es siempre 1. Los bytes 4, 5 y 7 son siempre 0. Los bytes 8 y 9 indican el número del temporizador, del contador o del bloque. La tabla siguiente muestra la codificación de los tipos de datos para el formato ANY en el caso de los tipos de parámetros. ### ### ¿Y para qué usamos un puntero con formato ANY? Bueno, pues después de todo* este rollo *(que está bien saber por otro lado) vamos a ver si podemos darle una utilidad. Lo que nos va a permitir esto es poder leer áreas de los diferentes tipos de memoria y poder escribirla en otro área de memoria de forma dinámica. **¿Una aplicación práctica para esto?** Pues por ejemplo, en los hornos de curvar parabrisas con los que trabajo, la información de la pauta hay que volcarla en diferentes momentos sobre la zona donde se está curvando. Es decir, en cada zona del horno, se lee la información de potencias de esa potencia para un determinado cajón el cual va cambiando. Es decir, tienes una zona que es dinámica y un carro que es dinámico. Como ves, aunque no lo vayas a aplicar todos los días, es bastante útil cuando toca. ### Copiar áreas de memoria usando los puntero con formato ANY Como ejemplo vamos a analizar un bloque para copiar dos áreas de memoria. De un DB a otro DB. Te dejo la fuente AWL  comentada para su mejor entendimiento y estudio: FUNCTION "Copiar areas MB-->DB" : VOID TITLE =TRANSFER MB -> DB VERSION : 0.0 VAR_INPUT MBSOURCE : INT ; //DB ORIGEN DBTARGET : INT ; //DB DESTINO DBWTARGET : INT ; //DBW DESTINO NBBYTE : INT ; //NUMBERO DE BYTES A TRANSFERIREND_VAR VAR_TEMP SOURCE : ANY ; //ANY ORIGEN TARGET : ANY ; //ANY DESTINO RET : INT ; //TEMPÒRAL RETURN END_VAR BEGIN NETWORK TITLE =COMPUTE ANY POINTER FOR SOURCE LAR1 P##SOURCE; // CARGAMOS EN EL AR1 LA DIRECCION DEL ORIGEN L B#16#10; // SYNTAXIS PARA S7 (SIEMPRE ES IGUAL) T LB [AR1,P#0.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 0 L B#16#2; // CARGAMOS EL TIPO DE DATO: BYTE T LB [AR1,P#1.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 1 L #NBBYTE; // NUMBERO DE BYTES A TRANSFERIR T LW [AR1,P#2.0]; // -> SE LO CARGAMOS AL ANY EN SU WORD 2 L 0; // COMO NO ES UN DB, CARGAMOS UN CERO T LW [AR1,P#4.0]; // -> SE LO TRANSFERIMOS AL ANY EN EL WORD 4 L B#16#83; // CODIGO DE TIPO DE MEMORIA PARA MB T LB [AR1,P#6.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 6 L B#16#0; // LA DIRECCION DE LOS 3 BITS SUPERIORES T LB [AR1,P#7.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 7 L #MBSOURCE; // LEEMOS EL NÚMRO DE MB ORIGEN SLW 3; // DESPLAZAMOS 3 POSICIONES A LA IZQUIERDA T LW [AR1,P#8.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU WORD 8 NETWORK TITLE =COMPUTE ANY POINTER FOR TARGET LAR1 P##TARGET; // CARGAMOS EL DESTINO EN EL AR1 L B#16#10; // SYNTAXIS PARA S7 (SIEMPRE ES IGUAL) T LB [AR1,P#0.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 0 L B#16#2; // CARGAMOS EL TIPO DE DATO: BYTE T LB [AR1,P#1.0]; // -> SE LO CARGAMOS AL ANY EN SU BYTE 1 L #NBBYTE; // NUMERO DE BYTES A TRANSFERIR T LW [AR1,P#2.0]; // -> SE LO CARGAMOS AL ANY EN SU WORD 2 L #DBTARGET; // NUMERO DE DB DESTINO T LW [AR1,P#4.0]; // -> SE LO TRANSFERIMOS AL ANY EN EL WORD 4 L B#16#85; // CODIGO DE TIPO DE MEMORIA PARA DB T LB [AR1,P#6.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 6 L B#16#0; // LA DIRECCION DE LOS 3 BITS SUPERIORES T LB [AR1,P#7.0]; // -> SE LO TRANSFERIMOS AL ANY EN SU BYTE 7 L #DBWTARGET; // DBW TARGET SLW 3; // DESPLAZAMOS 3 POSICIONES A LA IZQUIERDA T LW [AR1,P#8.0]; // -> ANY POINTER NETWORK TITLE =EXECUTE TRANSFER CALL "BLKMOV" (// BLOCK MOVE SRCBLK := #SOURCE,// ORIGEN RET_VAL := #RET,// ERROR DSTBLK := #TARGET);// DESTINO NETWORK TITLE =END OF BLOCK BEA ; END_FUNCTION ### ¿Qué te ha parecido? Ya sé que este tipo de cosas no se usa todos los días, pero no está demás conocerlas, saber que existe, y que es realmente potente dependiendo de lo que necesites hacer. ¿lo has usado alguna vez? --- # Comparación de cadenas de caracteres en Step 7 > Step 7: ejercicio práctico para comparar cadenas de caracteres y strings, usando el FC10 EQ_STRNG o comparando bytes de dos DB para ver si son iguales. Fuente: https://programacionsiemens.com/cadenas-de-caracteres-en-step-7 · Autor: Iñigo Gútiez · Publicado: 2014-05-23 · Actualizado: 2014-05-23 · Categoría: Programación PLC Esta semana vamos a realizar un ejercicio práctico de cómo **comparar** dos **cadenas de caracteres en Step 7** bien que sean alfanuméricos o dos cadenas cualesquiera de datos. Si lo que queremos comparar son dos strings como tal, Step 7 proporciona de origen un FC con el que poder comparar cadenas de caracteres en forma de string. Se trata del bloque **FC 10 EQ_STRNG** que puedes encontrar desde el editor en *Librerias-> Standard Library -> IEC Function Blocks*. Bien. Lo lógico es usar esta función o cualquier otra de las que te ofrece Step 7 si se ajusta a tus necesidades. Pero lo que vamos a realizar hoy es poder comparar cualquier cadena de bytes de dos DB y ver si son iguales o no. Da igual el tipo de datos que tengamos en ese área de memoria. ## Comparar dos cadenas de caracteres en Step 7 La idea es simple: poder comparar dos areas de memoria consecutiva de dos DB (o del mismo) y saber si ambas áreas son iguales. #### ¿Para qué sirve eso? Pues por ejemplo si tienes una comunicación en la cual envias X bytes a otro PLC, Scada o lo que sea y quieres saber que realmente lo que envias y lo que el interlocutor está leyendo es lo mismo por ejemplo para activar una orden de actuación. Entonces, la forma de operar es que un PLC escribe en un DB digamos DB1 y el interlocutor copia ese DB a un DB2 que te lo envía de vuelta. La forma de saber que lo que uno escribe, el otro lo recibe es comparando ambos DB, cosa que puede ser muy simple si intercambias digamos un DW, pero bastante engorrosa si estás intercambiando 100 bytes. #### ¿Qué necesitaremos para comparar las cadenas de caracteres en Step 7? Pues vamos a necesitar tener ciertos conocimientos de: - Punteros y direccionamiento en Step 7, que ya vimos en esta parte del curso y en esta otra - Hacer un FOR - NEXT en Step 7 - Saltos condicionales estudiados aquí. - Un poco de XOR  que nos servirá para la comparación - Usar los acumuladores AR1 y AR2 Como ves, nada que no hayamos visto con anterioridad en el blog. #### ¿Y cómo vamos a hacer la comparación de las cadenas de caracteres en step7? Básicamente vamos a realizar un FC donde pasaremos como variables de entrada: - Los números de los DB - Los números de byte de origen de los datos de ambos DB - La longitud a comparar en bytes Por otra parte, y como salida del FC, obtendremos una salida booleana indicativa de si ambas cadenas son iguales o no. En cuanto a el programa en sí, y como referencia, la idea sería la siguiente: - Poner una marca booeana a cero indicando inicialmente que ambas cadenas originalmente son iguales - Hacer un FOR-NEXT con el número de bytes a comparar - Crear los punteros correspondientes a cada posición - Comparar cada byte entre ambos DB haciendo un XOR - Si el resultado se mayor que cero, hacer un SET de la booleana indicando que no son iguales - Si el resultado es cero, no hacemos nada. - Continuamos con el FOR - Finalmente igualamos la booleana a la salida del bloque. Seguidamente te dejo con el código fuente del FC para que le vayas echando un vistazo: FUNCTION "Comparador de cadenas" : VOID TITLE = VERSION : 0.1 VAR_INPUT NumDB1 : INT ; //Número del primer DB a comparar NumDB2 : INT ; //Número del segundo DB a comparar Byte1 : INT ; //Número del primer byte de la cadena del DB1 Byte2 : INT ; //Número del primer byte de la cadena el DB2 Longitud : INT ; //Longitud de bytes a comparar END_VAR VAR_OUTPUT Resultado : BOOL ; //Resultado final de la comparación. END_VAR VAR_TEMP Comparacion : BOOL ; //Resultado temporal de la comparación IndiceForNext : INT ; PunteroOffSet : DWORD ; DBNum1 : INT ; DBNum2 : INT ; ResultadoXOW : INT ; END_VAR BEGIN NETWORK TITLE = //Inicializamos la variable Comparacion SET ; R #Comparacion; // Transferimos los valores de los DB a las variables. // Hay que hacerlo así porque no se puede leer directamente como IN L #NumDB1; T #DBNum1; L #NumDB2; T #DBNum2; NETWORK TITLE = //Hacemos un for-next con el número de bytes de longitud ya que vamos a comparar //byte a byte. L #Longitud; NEXT: T #IndiceForNext; // Generamos un puntero OffSet L #IndiceForNext; // Cargamos el indice ITD ; // Lo pasamos a doble L P#1.0; // Cargamos un puntero de un byte *D ; // Multiplicamos en doble para general el puntero origen T #PunteroOffSet; // Obtenemos el OffSet // Generamos el puntero del DB1 L #Byte1; // Cargamos el byte de inicio ITD ; // Pasamos a doble (como los punteros) L P#1.0; // Cargamos un puntero de un byte *D ; // Multiplicamos en doble para generar el puntero origen LAR1 ; // Lo cargamos en el AR1 L #PunteroOffSet; //Cargamos el offset de este loop +AR1 ; // Se lo sumamos al AR1 // Generamos el puntero del DB2 L #Byte2; // Cargamos el byte de inicio ITD ; // Pasamos a doble (como los punteros) L P#1.0; // Cargamos un puntero de un byte *D ; // Multiplicamos en doble para generar el puntero origen LAR2 ; // Lo cargamos en el AR2 L #PunteroOffSet; //Cargamos el offset de este loop +AR2 ; // Se lo sumamos al AR2 AUF DB [#DBNum1]; // Abrimos el DB1 AUF DI [#DBNum2]; // Abrimos el DB2 L DBB [AR1,P#0.0]; //Cargamos el valor del primer puntero L DIB [AR2,P#0.0]; //Cargaos el vaor del segundo puntero XOW ; //Hacemos un XOR de palabra T #ResultadoXOW; // Toma de decisión L #ResultadoXOW; // Si el resultado es cero, no hacemos nada porque de momento son iguales L 0; // Comparamos con cero, si son iguales, saltamos sin hacer nada ==I ; SPB EXIT; SET ; // Si no son iguales, continuamos y ponemos a uno la variable S #Comparacion; EXIT: NOP 0; L #IndiceForNext; // Hacemos el next cargando el valor del indice LOOP NEXT; UN #Comparacion; // tomamos el valor de la comparación y le cambiamos el signo = #Resultado; // Igualamos a la salida END_FUNCTION Todo esto, será llamado desde el OB1: CALL "Comparador de cadenas" NumDB1 :=1 NumDB2 :=2 Byte1 :=0 Byte2 :=0 Longitud :=10 Resultado:=M100.0 Bien, no quiero que te agobies porque tengo preparado como siempre el... ### Video de cómo comparar dos cadenas de caracteres en Step 7 Pues eso, que te dejo con la explicación de cómo funciona además de lo arriba expuesto. [Vídeo: https://www.youtube.com/embed/ZTxHLUQm3Lw] ### ¿Qué te ha parecido? Espero que te haya sido de utilidad lo que te he contado hoy. En cualquier caso, aunque no lo uses para lo que está pensado, piensa que esta comparación de cadenas de caracteres en Step 7 está compuesta como hemos visto de operaciones interesantes. Esta entrada entre otras están incluidas en el curso “[Cómo programar Step 7 y no morir en el intento](https://programacionsiemens.com/como-programar-step-7/)” --- # Siemens 1217C: David contra Goliat > PLC Siemens S7-1200 y sus características: la nueva CPU 1217C, la más potente de la serie 1200, se compara con la serie 300 en prestaciones y posibilidades. Fuente: https://programacionsiemens.com/siemens-1217c-david-contra-goliat · Autor: Iñigo Gútiez · Publicado: 2014-05-03 · Actualizado: 2014-05-03 · Categoría: S7-1200 y S7-1500 [Imagen: Siemens 1217C] El pasado mes de marzo, ha empezado la comercialización de la **CPU** más musculada de la serie 1200: La **Siemens 1217C**. Por tanto siguen saliendo nuevas CPU de la nueva serie 1200 de **PLC Siemens**. Esta vez, al igual que existe el 315 o el 317, tenemos entre nosotros la misma numeración con el **1217C**. ### Siemens 1217C: El David de la serie 1200. Puede paracer que la serie 1200 es el hermano pequeño de la serie 300, y que poco o nada tienen que ver y hacer contra cualquiera de sus hermanos mayores de la serie 300. Evidentemente si miramos las prestaciones de las CPU más modestas (**1211C **y **1212C**), pues sí. Poco o nada tienen que ver. Pero si tomamos estas nueva **CPU 1217C** y la comparamos con los que hasta ahora sacan pecho de la serie 300, veremos que por un precio bastante inferior  comparándolas con las **CPU compactas** en algunos apartados le llega a pasar la mano por la cara. Veamos en la siguiente tabla algunos datos comparativos: Como puedes ver,  las características son dispares, pero digamos que las prestaciones que la **CPU** **Siemens 1217C** no desentona en absoluto con la gama media/baja de la serie 300. Donde más sufre nuestro invitado de hoy la **Siemens 1217C** es sin duda en el tiempo de cálculo con valores word o en coma flotante donde los tiempos si son notablemente superiores a la de la gama superior. Pero ojo, en operaciones con bits puede competir de tu a tu, e incluso dando que algún susto. La pregunta ahora entonces es... ### ¿Cuándo debo elegir una CPU Siemens 1217C? Para empezar, cuando la instalación sea de un tamaño pequeño. No me imagino una **CPU** como la **Siemens 1217C** en una aplicación de grandes dimensiones. Pero sí en una con digamos 32 -48 entradas digitales y 16 -24 salidas con una pantalla táctil de tamaño medio. También puede ser para una aplicación de más entradas y salidas digitales cuando se trate de aplicaciones que no necesiten grandes cálculos matemáticos ya que en operaciones con bit, la velocidad de proceso es **equivalente** a una **CPU 314**, lo cual no está nada mal. Incluso puede mejorar los registros de ciertas 315.  Para ejemplo, esta : Tiempos de ejecución de la CPU 6ES7315-2AG10-0AB0 CPU315-2DP, 128KB para operaciones a bits, típ. 0,1 µs para operaciones a palabras, típ. 0,2 µs para artitmética de coma fija, típ. 2 µs para artitmética de coma flotante, típ. 3 µs #### #### ¿Sorprendente eh? Vale. He hecho un poco de trampa. Es una CPU ya descatalogada en el 2010. Pero si miras en esta página verás que es una CPU que puedes haber visto funcionando en muchas instalaciones no muy viejas con unos requerimientos notables. Como ves, hasta hace pocos años era casi el estándar de la **serie 300**. Quiero decir con ello, que si comparamos nuestra **CPU Siemens 1217C** con las actuales 315 sale perdiendo, pero no con las que hasta hace bien poco, eran las habituales (y muchas de ellas siguen siéndolo). ### ¿Es necesario la Siemens 1217C para competir? ¿Sinceramente? Pues seguramente no. Porque incluso con un 1215 puede ser más que suficiente. Básicamente son iguales con un poco menos de memoria. Pero en cuanto a velocidad son todas iguales desde la 1211C a la **Siemens 1217C**. Lo que aquí debes valorar es la memoria y no racanear con ella. Si quieres equipararte con las 315 recien descatalogadas, no bajaría de la **1215C** que tiene 100KB de memoria interna. Como el invitado del día es el **Siemens 1217C**, sigamos con él ¿no? ### Ya ya, pero y ¿diferencias de precio? Vale. Vamos a poner las siguientes características para nuestra aplicación: - 48 entradas - 24 salidas - Profibus y profinet ¿Hacemos  la cesta de la compra? Para ayudarnos con la lista de elementos necesarios, nos vamos a servir de**l TIA Selection Tool**. Los pasos que vamos a seguir va a ser los siguientes: - Crear la lista de elementos necesarios - Ver presupuestos online de los conjuntos - Sacar algunas conclusiones. Vamos a iniciar viendo un poco cómo se usa el **TIA Selection Tool** de **Siemens**: http://www.youtube.com/v/bb13f-0796U?fs=1 Bueno, como véis no es muy complicado que se diga de manejar. Lo siguiente es pedir precio de ambas soluciones. La del  **Siemens 1217C** y la del **Siemens 314.** Para ello, vamos a pedir presupuesto de ambas soluciones. Ya puestos, he realizado un video donde se muestra cómo solicitar el presupuesto en la tienda y ver lo sumamente fácil que es. http://www.youtube.com/v/h_qvqG9gt_s?fs=1 Una vez que nos han devuelto ambos montantes, tenemos los siguientes valores: **Sie****mens 1217C** [Imagen: Siemens 1217C] Por otro lado, **Siemens 3142PN/DP** ### Consclusiones Como hemos podido observar, el pequeño David, la **CPU Siemens 1217C** puede competir en muchos casos en prestaciones a ciertos Goliat de la **serie 300**. Además, tenemos que añadir que: - Trae de serie entradas rápidas para conectar hasta 6 encoders. - Salidas rápidas - 2 entradas analógicas - Profinet de serie - Firmware actualizable - Programado ya en TIA portal Si quieres saber más sobre esta **CPU Siemens 1217C**,[pincha aquí](http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6ES7217-1AG40-0XB0&caller=view). Finalmente, para redondear el conjunto, para una aplicación de similares características, es en el caso de la CPU (exclusivamente)  menos de la mitad de precio. Si sólo vas a usar PN desde luego la diferencia es abrumadora. ### ¿Cómo ves este nuevo Siemens 1217C? Como siempre me gustaría saber tu opinión de qué te parece en este caso la nueva CPU de **PLC Siemens**. Por otro lado recordarte que en el panel derecho hay una encuesta para que los lectores del Programación Siemens opinéis sobre qué es lo que os gustaría leer en el blog. Periódicamente iré publicando nuevas encuestas para que con un simple click des tu opinicón. ¡Ah! Y si quieres ayudar a que el blog se encuentre entre los favoritos de Google, ayúdame dando clic a los me gusta de Facebook, Google + etc que tienes a tu izquierda. --- # Buenas prácticas de programación en S7 > Programación de PLC Siemens: buenas prácticas para estructurar tus proyectos en S7 desde la hoja en blanco, con pautas y recomendaciones claras y prácticas. Fuente: https://programacionsiemens.com/buenas-practicas-de-programacion-en-s7 · Autor: Iñigo Gútiez · Publicado: 2014-04-25 · Actualizado: 2014-04-25 · Categoría: Programación PLC Siempre que comenzamos a programar, tenemos la incertidumbre de si la forma en la que trabajamos es la más adecuada o no. En la entrada que recupero del ostracismo (y que añado alguna cosa nueva) te voy a contar unas pequeñas pautas que puedes seguir, aunque estas buenas prácticas de programación en S7 no  son palabra de Dios, y por supuesto, pueden ser discutibles y/o matizables. Son unas recomendaciones que te doy, y puede que a lo mejor te encajen en tu forma de estructurar un proyecto o al menos que te sirva para reflexionar sobre cómo has de afrontar los primeros proyectos que desarrolles. ### Tengo una hoja en blanco ¿Por dónde empiezo para realizar buenas prácticas de programación en S7? Lo primero que tienes que hacer cuando comienzas un proyecto es respirar hondo y no agobiarte. Te puede pasar que si miras el proyecto en su conjunto pueda ser un tanto mareante al principio... y lo es. Supongo que todos hemos pasado por ello. Lo bueno que tiene la automatización seguramente junto con otro tipo de programas y software es que es muy modulable ya que la instalación está siempre dividida en máquinas, y estas a su vez en sub-máquinas y estas finalmente en un conjunto de señales y actuadores. Por tanto, podemos abstraernos a la hora de programar del resto de la máquina y centrarnos en muchos casos solamente en una pequeña parte de la máquina. Pero ojo, no estoy diciendo que comiences a programar con una pequeña porción de la máquina sin pensar en el resto. Estoy diciendo que el problema global que es que la dichosa instalación funcione, la vas a poder cortar en cachitos y que cada cachito por separado no es tan fiero. Por tanto lo primero que tienes que pensar es en qué máquinas se divide tu instalación y cómo interactuan entre ellas. Lo que deberías hacer en un primer estadio del proyecto es: - Comprender muy bien la instalación. Qué debe hacer (y qué no). - Hacer un listado con las posibles divisiones de la instalación o máquina, como máquinas( o submáquinas) independientes. - De cada máquina y submáquina qué detectores vas a necesitar y qué actuadores. Una vez comprendas que es lo que debe hacer, podrás dividir la instalación (o máquina) en trozos más pequeños e independientes. Esto nos va a ser útil a la hora de definir los bloques en los que se va a dividir nuestro proyecto. Por otro lado, la enumeración parcial de cada señal y cada actuador, nos va a dar una idea global del volumen de entradas y salidas del proyecto. Esto te va a ayudar a su vez a valorar entre otras cosas si merece la pena centralizar todo en el armario eléctrico, o si va a ser mejor colocar por la instalación diferentes armarios remotos, por ejemplo. ### Vale, ya tengo más o menos claro qué hace y qué necesito... ¿y ahora? Ya tienes el qué, vayamos ahora en el cómo: - Estructura tus bloques - Asigna rangos de I/O - Da nombres a las cosas - Un buen listado de alarmas - Bocetos de las pantallas del HMI Cuando digo que estructures los bloques quiero decir que des rangos a tus FC, FB y DB. Imaginate que tienes 3 zonas bien diferenciadas de la máquina, pues una forma de estructurar tus bloques podría ser: - Del 0 al 99 para bloques genéricos - Del 100 al 199 a la zona 1 - Del 200 al 299 a la zona 2 - Del 300 al 399 a la zona 3 Así, por poner un ejemplo: imagina que dentro de las zona 1 tienes un transportador. Pues puedes hacer: - FC110 "Transportador 1" para la lógica booleana que maneje todo lo que haya sobre ese transportador, sus marchas y paros, manual, automático etc. - FB110 "Motor Transportador 1" Para el manejo del variador de dicho transportador, la gestión de las consignas que puede que le mandes por profibus, alarmas etc. - DB110 "DB Motor Transportador 1", pues como DB de instancia del FB110 Esto como digo es un ejemplo. La idea que quiero que pienses es que todo lo referente al transportador 1, estará asociado con el concepto numérico "110" como *cosa* global. Si tienes un segundo transportador, dentro de la zona 1, pues le asignas el 120. #### ¿Por qué no el 111? Dependerá de cada proyecto, pero siempre que puedas, y para mi gusto, separa los bloques. Imagina que encima del transportador 1 tienes un par actuadores neumático que hacen algo, lo que sea. Yo le daría en ese caso: - FC 111 "Actuador #1 Transp. 1" - FC 112 "Actuador #2 Transp. 1" Todo esto suponiendo que tengan suficiente entidad como para que tengan su propio FC y no puedan ser agrupados en un único *FC 111 "Actuadores Trans. 1"*. Espero que cojas el concepto. #### ¿Qué nos va a permitir esto? Pues básicamente, un poco de orden. Porque como te acostumbres a poner todos los bloques seguidos, va a ser un caos. Por el simple hecho es que la vida del proyecto es larga, y seguro que vas a tener que insertar nuevos actuadores sobre partes de las máquinas. Como hayas puesto: - FC 110 Transportador 1 - FC 111 Transportador 2 - FC 112 Transportador 3 - FC 113 Transportador 4 Ahora imagina que los actuadores de los que hablamos, no estaban contemplados en el proyecto inicialmente, y ahora hay que añadirlos... tú lo has dicho, vaya mierd.. Además de eso, en nuestro ejemplo, puede que unos transportadores lleven unos actuadores tipo A, otros transportadores no lleven, otros sean tipo B.. etc. En cambio, si divides a espaciado fijo, sabes que todo lo que hay en los FC 11x pertenecen a la misma parte de la máquina, el transportador 1 en nuestro caso. Creo que la idea queda suficientemente clara. ### Asigna rangos a las I/O Al igual que has hecho con los bloques, la idea sería la misma para las entradas y salidas. Intenta dar rangos a las zonas de las máquinas. De tal forma y siguiendo con nuestro ejemplo, imagina que has decidido poner 3 remotas, una por cada zona de tu instalación. Asigna rangos a las I/O: - EB100 - EB199 para la zona 1 - EB200 -EB299 para la zona 2 - EB300 - EB399 para la zona 3 #### ¿Qué ganamos con ello? Como antes, claridad y orden. Pero algo más... orden de cara a futuro. Si vas a montar 3 periferias remotas y asignas las direcciones de I/O según te las asigna Step7 de forma automática, vas a tener todas las entradas y salidas seguidas como un paso doble Hasta ahí no habría mucho problema más allá de que como digo, queda más limpio saber que si te digo E 212.0 automáticamente sabes que te estoy hablando de una entrada de la zona 2 sin mirar absolutamente nada. Pero no solamente eso. En un futuro, puede que tengas que ampliar una de las periferias con una nueva tarjeta... pues como no hayas pensado en espaciarlas, no sólamente no tendrás coherencia entre la numeración entre zonas, sino que dentro del mismo rack tendrás numeraciones altas y bajas ya que al añadir una nueva tarjeta, tendrás forzosamente que asignar un número más alto que el último que Step7 le asignó a la zona 3... que si es esta zona, no pasa nada, pero si es la zona 1 queda horrible. #### ¿Pero habría algún problema por ello? Ninguno, pero hombre, ya que estamos, además de que funcione, que parezca que le hemos dedicado 10 minutos a pensar cómo asignar las entradas y salidas ¿no? #### ¿Qué pasa con las marcas, temporizadores etc? Análogamente, asigna rangos para el resto de elementos. Por ejemplo: Si estas en el tranportador 1, que es el FC 110, pues asigna las marcas 110.0 - 119.7 para dicho transportador, si con ello te va a ser suficiente. Puedes dar un rango de marcas para las palabras, otro para las dobles palabras... etc. Dale al coco y haz tu propio esquema. ### Asigna nombres a las cosas Y donde digo cosas, me refiero a FC, FB, DB, Entradas, salidas, marcas, temporizadores... Si no pones nombre a las marcas e I/O va a ser muy complicado el  mantener el programa, por no decir imposible. Es una locura encontrarte programas que no están comentados... pero nada comentados. Es para echarse a llorar cuando el programa es complejo. No hay forma de seguirlo muchas veces con comentarios, como para seguirlo sin una triste indicación de qué hace qué. Lleva mucho tiempo, y no siempre es fácil mantener la tensión de comentar todo, pero hay que intentar que todo esté razonablemente comentado. Una forma que yo suelo usar ( y aquí cada maestrillo tiene su librillo) es la siguiente: - Para las entradas y salidas, como nombre simbólico suelo poner el nombre del elemento de campo que es, por ejemplo el "25B3" y como comentario qué es con palabras. Puedes poner el IME completo por ejemplo "+ZonaA-25B3"  mientras que te entre en el campo de descripcion de la variable. - Las marcas/temporizadores etc auxiliares las marco con su propia dirección "M17.5"  y en la descripción pongo "auxiliar". Así indico que la marca es necesaria como un auxiliar pero que no sale de ese bloque y que no está usada de forma global en el programa. -  Buenas prácticas de programación en S7 Ya hemos visto las cosas que tenemos que tener en cuenta a la hora de organizar el programa, pero aún no hemos programado ni un segmento. Ahora van las propiamente dichas de qué hábitos debes adquirir. Apunta esta, grábala en letras de oro o haz lo que estimes oportuno pero: Sólo da valor a una variable/salida en un sitio Hacer un =A1.0 en dos sitios diferentes del programa es de cárcel. Jamás lo hagas. Si tienes que declarar 8 marcas y hacer la lógica que sea, la haces, pero nunca, nunca nunca nunca nunca, asignes dos veces una salida. Y quien dice una salida, dice una marca. ¿Por qué? Porque siempre tomará el valor de la última vez que le diste valor. Si cambias el orden de ejecución, cambiará la forma de ejecutarse. Imagina que has puesto en una parte del programa (FC1) un *U M0.0 * *S A1.0* Y en otro bloque (FC2) *U M1.0* *S A 1.0* Y en otro, pues un reset (FC3) *U M2.0* *R A1.0* Vale. ¿Cuánto valdrá A 1.0? Pues mas menos npi. Dependerá de cómo estén las marcas que los hacen un Set o Reset y en qué orden han sido llamados los bloques... y eso, siempre y cuando dentro de un año, no se te ocurra que en el bloque FC2, en vez de un set, es mejor un *U M1.0* *= A1.o* Que entonces la fiesta ya es completa. Si hay varias condiciones que activan y desactivan la A1.0, las asignas una marca, y luego agrupas todas para hacer un set, y por otro lado las que tenga que hacer un reset, o un igual o lo que haya que hacer... pero UNA ÚNICA ASIGNACIÓN ¿Está claro? Repite conmigo: Sólo asignaré una salida en un sitio #### Asigna una marca de ciclo al principio del proyecto Como ya [te conté anteriormente](https://programacionsiemens.com/3-formas-de-crear-marcas-ciclicas-en-s7/), es bastante práctico seleccionar la marca de ciclo al principio del proyecto de cara a que si en la puesta en marcha, o con la máquina ya funcionando te hace falta un tren de pulsos, dispongas de una forma sencilla de estos, sin tener que volver a compilar el proyecto y mandárselo al PLC pasando la CPU a stop, cosa que siempre no es posible en el momento que lo quieres hacer. #### Crear un Always_On y un Always_Off Esto más que una buena práctica, es un truquillo: si tienes una marca que esté siempre a cero y otra que esté siempre a uno, te ayudará a la hora de hacer pruebas, y desarrollar el programa en la línea ya que podrás hacer un bypass fácilmente a alguna condición, evitar que un segmento no se ejecute etc. También puedes coger el byte entero lleno de ceros, que te servirá para borrar datos usando el Sfc21 FILL. Para ello, simplemente tendrás que hacer un *L 0* T Mb0 O M1.0 ON M1.0 = M1.0 De tal forma que el byte 0 contendrás siempre ceros y el bit 1.0 estará siempre a 1. Tonto, pero útil. #### Deja espacio, sé generoso con el que venga detrás... Que muy probablemente puedas ser tú. Si vas a crear un DB donde almacenar datos para registro o intercambio con otros PLC por ejemplo, deja espacio libre para que en una eventual ampliación no haya que replantear nada ni hacer grandes modificaciones, sino que con tomar parte del espacio que este libre, sea suficiente. Lo mismo digo a la hora de asignar las entradas y las salidas, deja espacio para posibles nuevos actuadores o señales, de tal forma que una futura ampliación no provoque la ampliación de un bastidor porque en su día las entradas estaban usadas. Todo cuesta dinero, pero es necesario hacer ese esfuerzo porque a la larga, es más barato si luego no hay que echar nuevas mangueras, instalar más tarjetas etc. ### No seas un talibán de ningún lenguaje. Usa todos a tu antojo, pero con orden. Una de las entradas que más consultas recibe el blog es la de [qué lenguaje elegir](https://programacionsiemens.com/step-7-awl-fup-kop-cual-elijo/) a la a hora de programar en Step 7. Lo que no saben, es que no hay respuesta absoluta para esa pregunta... pues depende. Acostúmbrate a usar todos los que quieras, cuando quieras. Personalmente no mezclaría en un bloque FUP con KOP, aunque sí cualquiera de ellos con AWL. No los mezclaría porque muchas veces no son traducibles entre sí, y al pasar de uno al otro, puede que el que dejas no sea traducible y se quede en un AWL difícil de digerir así de repente, obligándote a pasar de uno al otro para seguir fácilmente el programa. Pero por lo demás, cambia cuando quieras, prueba y disfruta de la variedad que ofrece Siemens en ese sentido. ### Alarmas Una de las cosas más importantes en una buena automatización es la colección de alarmas. Puede parecer trivial, pero para nada lo es. Crear un listado de alarmas relevantes, que aporten facilmente qué es lo que está fallando y sobre todo no dejarte nada en el tintero, es casi imposible. Pero puedes seguir una serie de pautas: - Puedes usar marcas o un DB sólo para alarmas. A mi juicio mejor usar un DB con BOOL ya que las verás todas juntas además de poder comentar cada una dando mayor información a simple vista. - Enumerar los pasos automáticos y coloca timeouts  con los que saber en qué paso se ha parado la línea. - Lista los finales de carrera de seguridad, presostatos, temperaturas etc y decide qué valores son extremos para que salte una alarma. - Establece dos grupos: los que pararán la máquina (si las hay) y las que simplemente serán indicativas de un malfuncionamiento. Reserva memoria en el DB para ambos grupos de cara a su ampliación. - Piensa cada texto que va a acompañar a cada alarma. Intenta pensar que cuando salte, lo va a leer alguien que no tiene  ni idea de cómo esta programado el PLC. Sé todo lo user friendly que puedas. ### Pantallas del HMI Decía Albert Einstein algo así como "*si no puedo dibujarlo, es que no lo entiendo".  *Además de una cita genial, me da pie a comentarte una cosa fundamental y que por ello lo he dejado para el final. A ver si me queda lo más claro posible: - No programas para ti - Las normas son para cumplirlas - Intenta tener un poco de gusto - ¡No programas para ti! No. No es un error. He puesto que ¡No programas para ti! dos veces. Con esta tres. #### ¿Qué quiero decir con esto? Pues eso, que el tipo que va a usar tu máquina probablemente no haya visto un programa en su vida (más que probable) y sinceramente, ni es relevante, ni le importa. Lo importante es lo que puede ver y hacer desde la pantalla. - Mandos claros - Información clara y completa, pero no excesiva - Fácil de entender la navegación entre pantallas. - Estéticamente agradable a la vista (dentro de lo que se pueda) Piensa que la persona que va a manejar la máquina, en general un operario de producción, no le importa ni cuantos motores tiene tu máquina, ni detectores, ni las filigranas que hayas hecho en el código. Hablando groseramente... *se la pela.* Lo que le importa, sin duda, es lo que puede hacer desde su pantalla, desde sus mandos y qué información devuelve para que él esté informado. Por eso es importante que los mandos sean claros, que no haya que leerse mil  páginas de manual para entender cómo funciona la máquina y que sea lo más intuitiva posible. La navegación entre páginas ha de ser lo más coherente posible: los botones y el comportamiento de estos sean previsibles. Es decir, que si los botones de las páginas están abajo, estén siempre abajo, del mismo tamaño, si son con dibujos sean todos coherentes etc. Por otra parte, las normas especialemente a los colores y modos de trabajo, han de cumplirse. Es pecado capital poner un botón verde como reset o rojo como *cycle start.* Finalmente, un cojo-programa con unas pantallas poco cuidadas parecerá que está cogido con pinzas. Ten un poco de gusto, que tampoco cuesta tanto. ### ¿Cuáles son tus buenas prácticas? Y de momento, creo que son todos los consejos de la abuela que me han pasado por la cabeza.  Puede que en alguna o muchas discrepes o tengas mejores formas de plantearlo. Si quieres compartirlo con el resto, comentalo y con gusto puedo ir actualizando la entrada con nuevas aportaciones. --- # Direccionamiento indirecto en Step 7 (II) - Registros y áreas > Step 7: segunda parte del direccionamiento indirecto con los registros AR1 y AR2 para recorrer zonas de memoria de forma recursiva y automática en S7. Fuente: https://programacionsiemens.com/direccionamiento-indirecto-en-step-7-ii · Autor: Iñigo Gútiez · Publicado: 2014-03-11 · Actualizado: 2014-03-11 · Categoría: Programación PLC En esta nueva entrada sobre direccionamiento indirecto es con la que terminamos el curso. En ella vamos a ver la segunda parte de cómo automatizar y recorrer zonas de memoria para trabajar con ellas de forma indirecta y recursiva. Lo primero que has de hacer es leer el **[direccionamiento indirecto en Step 7 (I)](https://programacionsiemens.com/direccionamiento-indirecto-step-7-i/) ** si no lo has hecho ya. ### Registro de direcciones Como sabes, cuando se carga un valor, hay dos registros, el ACU1 y el ACU2. Pues también existen dos registros de direcciones, el AR1 y el AR2 para usarlos en el direccionamiento indirecto. La forma de cargar y transferir los valores a los registros son de la siguientes 3 maneras: - Cargar directamente el puntero en el AR1 - Cargar el puntero y transferirselo al AR1 - Cargar el valor numérico de bits y transferirselo al AR1 #### Cargar directamente el puntero Es el más rápido si se sabe qué hay que cargar: *LAR1 P#1.0* Lo que cargará en el AR1 el puntero 1.0 #### #### Cargar el puntero y transferirlo al AR1 *L P#1.0* *LAR1* Al igual que el anterior, cargamos el puntero P#1.0 en el AR1 #### #### Cargar el valor numérico de bits y transferirlo al AR1 o, como dijimos en**[direccionamiento indirecto (I)](https://programacionsiemens.com/direccionamiento-indirecto-step-7-i/)**, podemos crear al puntero diciendo cuántos bits tiene la dirección *L 8* *LAR1* Hará exactamente lo mismo que los casos anteriores. Hay que puntualizar que si queremos acceder a una dirección que tenga más de 32768 bits (16 bits) la carga debería ser del estilo: *L  L#80000* *TAR1* De tal forma que cargaremos la dirección 10000.0 Un poco altita la dirección aunque esa sería la forma. A decir verdad, lo suyo es jugar siempre con números en doble palabra como ya veremos más adelante aunque hacerlo como enteros también es válido aunque limitado a la capacidad de una palabra frente a la doble. ### Direccionamiento Indirecto por Registro e Intraárea/Interárea La diferencia fundamental entre el registro e Intraárea y registro e Interárea es: - Intraárea: No se especifica el área de memoria - Interárea: Vamos a especificar el área de memoria (el tipo, por así decirlo) ¿Y esto qué significa en cristiano? Pues a la hora de la verdad, y para nosotros, no mucha cosa. En resumen, y que permitan los puristas, lo que vamos a hacer es o bien: *LAR1 P#50.0 // Cargar el puntero* *L MW [AR1, P#10.0]  // Decir el operando (en este caso de carga), el tipo de área (marcas) y  la dirección.* O también podemos hacer: *LAR1 P#M50.0 // Cargar el puntero CON la zona de memoria* *L W [AR1, P#10.0]  // Decir el operando   y  la dirección.* #### ¿Resultado? Pues básicamente el mismo. La diferencia es que en el direccionamiento de tipo intraárea, el contenido del AR1 va a tener la misma pinta que el direccionamiento por memoria que veíamos en el capítulo I. No tiene el área de memoria asignado (marcas en nuestro caso). #### ¿Qué se usa más? Personalmente intraárea, pero supongo que es cuestión de gustos. Además imaginemos que mezclamos las cosas y hacemos lo siguiente: *LAR1 P#E50.0* *L MW[AR1,P#10.0]* Como veis  hemos indicado el área en la carga del registro AR1 y luego hacemos una carga de MW... ¿vamos a mandar la CPU a Stop o crearemos un agujero espacio-tiempo? Pues no. No sé si lamentablemente, pero no. Simplemente del AR1 tomaremos la dirección, pero no la zona de memoria y ejecutaremos el operando de carga MW. Por tanto, y a mi juicio, es mejor siempre usar el intraárea. Me parece más metódico ya que siempre vas a construir los punteros de la misma forma, independientemente del uso que le vayas a dar posteriormente. #### Muy bien, me parece estupendo... pero me he perdido en el L MW [AR1, P#10.0]... ¿qué significa? Muy sencillo. Lo que hay entre corchetes es la dirección inicial más un desplazamiento. De tal forma que en nuestro ejemplo, realmente estamos leyendo la MW60 (50 del AR1 +10 del *offset* por así decirlo). #### ¿Es obligatorio poner ese offset siempre? Si. Siempre. Sin excepción. Pones un P#0.0 si no lo quieres y listo. #### ¿Qué pasa si cargo un P#50.0 en el AR1, cargo un offset P#0.1 y hago una lectura MB, MW o MD? Pues que estarías provocando un bonito error de runtime. Ya que para hacer una lectura de byte, word o doble word, necesitas que el bit del puntero sea 0 (ojo, el bit, no el byte). No puedes crear un MW50.1 como puedes imaginar. Así que cuidadín con eso. ### ¿Qué más puedo hacer con los registros? Como no sólamente del AR1 vive el hombre, existe también un segundo registro, el AR2 . Con esta pareja, podemos jugar indistintamente para cargar nuestros punteros e incluso combinarlos en las operaciones. Así, para seguir con el ejemplo anterior, podríamos hacer: *LAR1 P#50.0* *LAR2 P#10.0* *L MW[AR1,AR2] :* No se puede usar ambos AR para hacer este tipo de direccionamiento L MW[AR1,p#0.0] T MW[AR2,P#10.0] #### ¿Qué operaciones puedo hacer con los registros? LARn : Cargar el contenido del ACU1 en el registro ARn, siendo n=1 o 2. *Offtopic: Y no, no es un 102, es un 1 O 2. A la RAE le ha parecido buena idea no tener que acentuar desde hace un tiempo la O entre números. Qué país.* TARn: Transferir desde el registro n, su contenido al ACU1. +ARn: Sumar al contenido del ARn, el contenido del ACU1. Pero como hemos visto, podemos hacer cargas y transferencias directas: *LARn *: Cargamos la dirección al ARn. Por ejemolo LAR1 P#50.0 *TARn *: Cargamos el contenido del ARn en la dirección. Por ejemplo TAR1 MD50 *+ARn *: Añadimos al ARn el puntero que queramos. Por ejemplo, +AR1 P#10.0 Para rizar el rizo, podemos copiar la información entre los AR haciendo: *LAR1 AR2*, con lo que cargaremos en el AR1 el contenido del AR2 *TAR1 AR2*, con lo que recuperamos el contenido del AR1 y se lo cargamos en el AR2. Como ves las combinaciones son unas cuantas si bien se pueden resumir en asignación y suma. ### ¿Y todo esto, ya sirve para algo? Pues aunque pueda parecer lo contrario, el direccionamiento indirecto sirve para muchas cosas, pero sobre todo para recorrer información y tratarla. En el siguiente video os voy a mostrar cómo se usa el direccionamiento indirecto, especialmente con bucles[LOOP (for-next)](https://programacionsiemens.com/loop-en-step-7-bucle-for-next/), como ya vimos. https://youtu.be/1vf1sqhGgN8?list=PLbAcu6rShM1_u60COwyd9TG1Kvj-p2UNr Recordarte finalmente que si estás interesado en formarte en Step 7, puede que te interese adquirir el libro *"Cómo programar en Step 7 y no morir en el intento"* donde puedes encontrar no sólamente el curso completo gratuito, sino muchas más entradas del blog que como sabes [se irán actualizando para los que lo adquieran de forma gratuita](https://programacionsiemens.com/curso-en-pdf-de-step-7-v5-x/). Si estás interesado,[puedes echarle un vistazo a este enlac](https://programacionsiemens.com/como-programar-step-7/)e donde se explica qué es lo que contiene el libro, el precio y los métodos de pago. Referencias: - Direccionamiento indirecto con Step 7 - Direccionamiento indirecto - bi.ehu.es --- # Filtrado y enmascarado de bits en Step 7 > Filtrado y enmascarado de bits en Step 7: aprende a resumir muchas alarmas en una sola senal booleana con operaciones OR de palabras, de forma limpia. Fuente: https://programacionsiemens.com/filtrado-y-enmascarado-de-bits · Autor: Iñigo Gútiez · Publicado: 2013-11-28 · Actualizado: 2013-11-28 · Categoría: Programación PLC Esta semana la entrada va a ser corta pero espero que interesante sobre el filtrado y enmascarado de bits. Recientemente me he visto en la necesidad de realizar lo siguiente: tengo una serie de alarmas de una máquina A, y quiero pasar una única señal booleana a otra máquina  B por profibus que indique que hay una alarma activa en la máquina A. Podríamos hacer un OR bit a bit, pero sería un poco hacerlo a lo burro. Porque si son unas pocas bien, pero como sean unas cuantas el OR va a ser como[la torre de Iberdrola de Bilbao](http://www.torreiberdrola.es/) (hay que tirar para casa). Hasta ahí ningún problema. Las alarmas comienzan imaginemos en la M32.0 y terminan en la M37.7. Con ir haciendo OR de palabras seria suficiente. ### Cómo saber si hay una alarma activa (usando todas las alarmas) ***SET* **--> Pongo a uno el RLO ***R M100.0*** --> Resteo el valor de la marca M100.0 que es la que voy a mandar a la máquina B. Inicialmente no hay alarma. ***L MW32*  **--> Leo los primeros 16 bits ***L MW34*** --> Leo los siguientes 16 bits ***OW*** --> Hago un OR de palabra con lo cual el resultado cargará en el ACU1 todos los bits que estén a uno haciendo OR bit a bit ***L MW36*** --> Cargo los útimos 16 bits ***OW* **--> Hago un OR entre el contenido del ACU1 y la MW36 y lo transfiero nuevamente al ACU1 ***L 0* **--> Cargo un cero en el ACU1 y por tanto el resultado del OR pasa al ACU2 ***==I*** --> Hago una comparación entre el cero del ACU1 y el contenido del ACU2 ***SPB EXIT* **--> Si es cero (el RLO está a 1), salto y no hago nada ***SET* **--> Pongo el RLO a uno ***S M100.0*** --> Pongo a uno la marca M100.0 que será la que envíe a la máquina B ***EXIT: NOP 0** * ### ¿No valdría con sumar y ya está? Otra aparente fácil solución sería usando la misma estructura: ***SET*** ***R M100.0*** ***L MW32*** ***L Mw34*** ***+I*** ***L MW36*** ***+I*** ***L 0*** ***<>0*** ***SPB EXIT*** ***SET*** ***S M100.0*** ***EXIT NOP 0*** Tanto rollo con low OW... una suma y listo... #### Ummmm en general sí.... en particular... no. Este último ejemplo funcionará CASI siempre. #### ¿Descubres la razón? Es realmente sencillo. Estamos sumando valores enteros...pero pueden ser positivos o negativos. Por tanto, en general funcionaría pero al hacer la suma, puede haber valores que hagan que MW32+MW34+MW36 = 0 ya que estos valores pueden tomar valores positivos o negativos. El ejemplo de comparar con cero valdría si por ejemplo son 16 alarmas. Ahí no habría problema ya que no hay sumas, ni restas ni comparaciones ni nada de nada. Lo comparas con cero, y si no es cero, es que hay una alarma tocando los coj.. que hay una alarma activa. ### Filtrado y enmascarado de bits Vale. Ya hemos visto como podríamos saber si hay una alarma activa teniendo en cuenta todas las alarmas. Pero imaginemos que no es el caso. Quiero pasar todas las alarmas salvo media docena que son alarmas que no interfieren con el proceso de la máquina B y por tanto no las quiero enviar. #### Vale. ahora sí que sí hago un cojo-OR  eligiendo los bits. Hombre... no. Son unas cuantas. Imaginemos que no queremos tener en cuentas los bits: 32.1, 35.7, 36.0, 36.1, 36.2 y 37.3 (por poner un ejemplo). El primer método está claro que no me sirve. Las sumas, mucho menos... hacer un OR de cada bit dejando estas sin meter es un poco remedio básico... y aquí queremos ser los más chulos del barrio programando S7. #### ¿Cómo lo hacemos? Pues creando máscaras... a que ahora entiendes que pinta Dar Vader en todo esto ¿eh? Pero son máscaras de otro tipo: **enmascarado de bits.** Vale, la idea es sencilla: crear un grupo de bits que sean los bits que nos queremos quedar y hacer un AND con las señales de tal forma, que el AND resultante, si es distinto de cero, es porque hay alarma. Ejemplo: Imagina que tienes la M32.1 y la  M32.3 a uno y el  resto del byte está a cero ¿Ok? Tendríamos que ***MB32 = 0 0 0 0 1 0 1 0*** ¿sí? Sólamente el bit 1 y 4 empezando por la derecha sería unos (los 0.1 y  .3 ya que empezamos en .0), y se lee de derecha a izquierda. Vale. **¿Cómo podemos saber que hay una alarma descartando el M32.1 como queremos?** Pues haciendo un AND con el siguiente byte: **MB32       = 0 0 0 0 1 0 1 0 ** **Mascara  = 1 1 1 1 1 1 0 1 ** **Resutado = 0 0 0 0 1 0 0 0** ¿No se te eriza el bello? Ya claro... pero ¿cómo cargo el enmascarado de bits? porque si tengo que calcular cuanto es el el resultado de cada máscara en decimal pasándolo de binario, me dan las uvas... pero está claro que no del 2013. Muy fácil. Así: ***L MB32 ***--> Cargo el primer byte ***L 2#1 1 1 1 1 1 0 1  -->*** Cargo en binario mi número usando base 2. Vale. Deja ya de aplaudir y prosigamos... que ahora estarás conmigo que es trivial: ***SET*** ***R M100.0 ***--> Como antes empezamos reseteando la señal ***L MB32*** --> Cargamos el primer byte ***L 2#1 1 1 1 1 1 0 1***  --> Cargamos el enmascarado de bits para el byte 32 ***UW -***-> Hacemos el AND ***L MB33*** --> Cargamos el Byte 33 ***OW ***--> Hacemos un OR entre el resultado y el byte 33 que no hay que filtrar ***L MB34 ***--> Cargamos el byte 34 ***OW ***--> Hacemos un OR entre el resultado del OR  y el byte 34 que no hay que filtrar ***T MW20*** --> Una marca intermedia ya que vamos a necesitar almacenar el resultado ***L MB33*** --> Cargamos el byte 35 ***L 2#0 1 1 1 1 1 1 1*** --> Cargamos la máscara para despreciar el 35.7 ***UW ***--> Hacemos el AND para quedarme con todo menos con el 35.7 ***L MW20 ***--> Cargamos el resultado hasta ahora ***OW ***--> Hacemos un OR con el resultado ***T MW20*** --> Lo transferimos a la marca intermedia nuevamente ***L MB36 ***--> Cargamos el Byte 36 ***L 2#1 1 1 1 1 0 0 0 ***--> Cargamos la máscara para el 36.0, 36.1 y 36.2 ***UW ***-->Realizamos el enmascarado de bits ***L MW20*** --> Cargamos lo que tenemos hasta ahora ***OW ***--> Hacemos un OR ***L MB 37*** --> Cargamos el último byte ***L 2#1 1 1 1 0 1 1 1 ***--> Cargamos la máscara del 37.3 ***UW*** --> Realizamos el enmascarado de bits ***L MW20*** --> Cargamos el temporal ***OW ***--> Hacemos un OR ***T MW20 ***--> Hacemos la última transferencia al MW20 ***L MW20 ***--> Cargamos el temporal con el resultado ***L0*** --> Cargamos un cero ***==I ***--> Los comparamos ***SPB EXIT*** -> Si el MW20 = 0, saltamos al final ya que no hay alarmas. ***SET*** ***S M100.0*** --> Si no es cero, ponemos la señal de alarma a 1. ***EXIT: NOP 0*** #### ¿Se podría hacer con words en vez de con bytes? La respuesta es sí, pero no te lo recomiendo ya que vas a tener que manejar 16 cero o unos y además recuerda que hay que poner de derecha a izquierda los bits y primero el byte bajo y luego el byte alto ... igual te lias un rato. Son más instrucciones que con words, pero mucho más claro y mantenible sin llegar a tener que poner un OR de todos los bits cada uno por separado. En racimos de 8 creo que es razonable. ### ¿Y el vídeo del enmascarado de bits? Esta semana, no hay vídeo. Quiero que repases esta teoría y lo practiques. Te va a ser útil el que le des unas cuantas vueltas al tema de los bits. ### ¿Qué te ha parecido? Espero que lo hayas visto útil. Si no es para esta aplicación seguro que tendrás en algún momento hacer un enmascaramiento como ya vimos por ejemplo con el [display de 7 segmentos](https://programacionsiemens.com/display-de-7-segmentos-step-7/) Por otro lado voy dejando caer el tema de los saltos. En este caso sólo uno de los casos, que es el SPB que es el saltar hasta una meta dada si el RLO = 1. Vermos todos en su momento. --- # Cómo usar los acumuladores en AWL > Acumuladores en AWL: aprende que son ACU 1 y ACU 2, como leer y transferir datos con L y T y como usarlos para calculos y mover informacion entre memorias. Fuente: https://programacionsiemens.com/como-usar-los-acumuladores-en-awl · Autor: Iñigo Gútiez · Publicado: 2013-10-17 · Actualizado: 2013-10-17 · Categoría: Programación PLC Lo primero que vamos a ver en este capítulo es lógicamente, qué son los acumuladores en AWL. ### Acumuladores en AWL Los acumuladores son dos: - ACU 1 - ACU 2 Ambos son dos áreas de memoria de 4 bytes (doble palabra) cada uno. Se usan fundamentalmente para realizar cálculos matemáticos y para transferir información de una área de memoria a otra (por ejemplo de marcas a zonas de DB, entradas, salidas...) La forma de trabajar básica con ellos son la lectura y la transferencia - Lectura (L): Lees la marca, dw, pew o lo que sea y lo transfieres a el ACU 1 - Transferencia (T): Lees lo que tiene el ACU 1 y lo copias en la marca, paw, etc. Como ejemplo: ***L 67* **-> Leemos el valor 67 y lo transferimos al ACU1 ***T MW 10** -*> Leemos lo que tenga el ACU1 (en este caso un 67) y se lo transferimos a la marca MW10. ¿Sencillo no? ### Pero si los acumuladores en AWL son dos, ¿qué pasa con el ACU2? Bien. La idea de tener dos acumuladores es básicamente para realizar operaciones matemáticas (entre otras cosas que veremos a continuación). La forma en la que trabaja es en forma de pila, es decir: Cuando leemos algo y se lo transferimos al ACU1, previamente el PLC ha realizado la operación de transferir el ACU1 al ACU2. Posteriormente transfiere lo leido al ACU1. Imaginemos que queremos sumar dos valores enteros. Para ello actuaríamos de la siguiente manera: ***L 8** *-> Cargamos el ACU1 en el ACU2  (nos da igual qué tenga), y cargamos el 8 en el ACU1 ***L 7** *-> Copiamos el ACU1 al ACU2 (el 8) y cargamos el 7 en el ACU1. ***+I** *-> Hace la suma entera entre el ACU1 y el ACU2 y el resultado lo transfiere al ACU 1 ***T MW 10*** -> Copiamos el valor del ACU1 a la marca MW10 (15) ¿Qué tendrían entonces el ACU1 y el ACU2? ACU1 = 15 ACU2 = 8 Sí. 8. No 7 que es el último valor leído. Tras hacer la suma, ha transferido el valor  de la suma al ACU1 (ha machacado el 7 con el 15). El acumulador 2 como veremos en el vídeo se pone a cero (aunque realmente poco o nada importa tenga ya que no lo vas a utilizar). ### ¿Qué más operaciones se pueden hacer? Como puedes intuir, además de sumar enteros, podrás restar, multiplicar, dividir, entre otras muchas operaciones  en todas sus variantes: - Enteros - Dobles enteros - Reales #### ¿Qué seguridades hay a la hora de realizar operaciones matemáticas? Pues así, como resumen, y para no alargarme demasiado: **NINGUNA** Como bien sabes en FUP o KOP, el editor del PLC no te deja realizar ideas felices como sumar un entero con un real, por mucho que te guste y lo intentes. En AWL sí vas a poder. #### Guay. Pues lo sumo en AWL. Pequeño saltamontes, he dicho que deja, no que el resultado sea el esperado. Es más, te daría resultados interesantes y variopintos para que estés entretenido durante unas cuantas horas como no te percates en el momento de la chapuza realizada. Imagina que sumas, haciendo ya el burro del todo: ***L L#50000*** ***L 50000.0*** ***+I*** ***T MW10*** **¿Valor de MW10?** Chupado: 50 mil más 50 mil, cien mil. Sí. Sí por lo coj... No sé ni lo que daría. Para empezar, porque 100 mil no se puede cargar en 16 bits. Como bien sabes, los enteros van desde -32767 a 32768. Para continuar, porque mezclar reales con doble enteros no pega ni con cola. #### Forma en que carga y se transfiere al ACU1 Para dejarlo aún más claro: el ACU1 tiene 4 bytes, lo que viene siendo dos palabras. Cuando tú transfieres un número entero positivo inferior a 256 (un byte), este se carga en el **byte bajo ****de la palabra baja**. Es decir, en el byte 3 del ACU1. El resto de los bytes se ponen a cero. Cuando transfieres un entero más grande que no entra en 8 bits, (imaginemos 12345), este valor se carga en la palabra baja(bytes 3 y 4). Los bytes 1 y dos se ponen a cero. Finalmente cuando cargo un número real (el -1234,5), se usan los 4 bytes (si es pertinente) ##### ¿Qué ocurre cuando lees el ACU1? Pues que depende de la variable sobre la que escribas. Si haces un T MB 8, pues estarás cogiendo **el byte bajo, de la palabra baja. **Tenga lo que tenga el resto, sólo leeras el byte 3 del ACU1 y se lo transferirás al MB8. Si haces un T MW8, pues cogerás la **palabra baja**y se la transferirás a el MW8. Finalmente si haces un T MD10, tomarás el valor completo del ACU1 y se lo transferirás al MD10. #### ¿Menudo lío no? Pues en realidad, no tanto. Si simplemente haces operaciones con variables coherentes entre sí (reales con reales, enteros con enteros), no te deberás preocupar qué es lo que se está cargando o transfiriendo en el ACU1, porque simplemente estará bien. Simplemente ten cuidado y no [mezcles churras con merinas](http://cvc.cervantes.es/lengua/refranero/ficha.aspx?Par=59214&Lng=0) y todo irá bien. Pero quiero que entiendás qué es lo que estás haciendo y porqué funciona (o no). Como ves, en ningún momento he hablado de nuestro nuevo mejor amigo el **RLO. **Hasta ahora. ### Operaciones con los acumuladores que afectan al RLO Hasta ahora sólo hemos hablado de operaciones que son aritméticas. Estas no afectan al [RLO](https://programacionsiemens.com/awl-en-step-7-algebra-booleana/). Ahora bien, hay operaciones en las cuales el resultado sí cambia el RLO como son las de comparación, por ejemplo. Así, por poner un ejemplo: ***L MW 10*** ***L MW20*** ***==I*** ***= A1.0*** Lo que estaremos será cargar el contenido del MW 10 y MW20 en los ACU2 y ACU1 respectivamente y ejecutar la operación de comparación de igualdad. El resultado es booleano (sí o no) y se carga en el RLO. Por tanto, si ambos números son iguales, activaremos el A1.0 y si son diferentes, apagaremos la A1.0 ### ¿Cuántas operaciones con los acumuladores hay? Imagino que querrás sabes qué operaciones puedes realizar. Bien, en el blog [tenemos un listado](https://programacionsiemens.com/listado-de-instrucciones-en-awl/) que encontré en su día con todas las operaciones que se pueden realizar en AWL. Échale un vistazo y verás que el abanico es bastante amplio. En esos listados hay instrucciones que aún no hemos visto, pero que veremos más adelante. Que te vayan sonando. ### ¿Y el vídeo de esta semana? En el vídeo de esta semana vamos a ver todo esto con el simulador del PLC. http://www.youtube.com/v/WBt2EimjNmU?fs=1 ### ¿Qué te parece esto de los acumuladores en AWL? Como has podido ver, no es muy compicado si se tiene cuidado con lo que se hace. En futuros ejemplos iremos viendo cómo se aplica todo lo expuesto y podrás comprobar que es más fácil de lo que parece a primera vista esto de enredar con acumuladores en AWL. --- # SET y RESET en AWL y alguna cosilla más. > SET y RESET en AWL: domina la logica binaria de Siemens entendiendo a fondo que es el RLO, para que sirve y como se usa al programar PLC Siemens en AWL. Fuente: https://programacionsiemens.com/set-y-reset-en-awl-y-alguna-cosilla-mas · Autor: Iñigo Gútiez · Publicado: 2013-10-10 · Actualizado: 2013-10-10 · Categoría: Programación PLC ### ¿Ya sólo nos queda ver SET y RESET en AWL en lógica binaria? Bueno, a decir verdad... no. Queda también ver los pulsos o flancos, además de cosas que afectan al RLO. Pero a decir verdad, poco más vamos a ver de momento. Tampoco se trata de pegarse un atracón de lógica booleana en AWL. Se trata fundamentalmente de entender muy bien **[que es el RLO](https://programacionsiemens.com/awl-en-step-7-algebra-booleana/), **para qué sirve y cómo se utiliza. Si en estas dos lecciones aprendes a entenderlo podemos darnos por satisfecho. La destreza del uso de la lógica booleana la cogeras programando nuevos PLC de Siemens, por eso no te preocupes. ### ¿Qué es un set y reset en AWL? Buceando con el amigo Google, he encontrado la imagen dinámica de la derecha. La verdad es que está muy bien para explicar lo que hace si no lo tienes aún claro. Un **SET** no es mas que fijar a uno una variable booleana. Como la has fijado, esta variable seguirá a uno aun cuando las condiciones de ponerla a uno desaparezcan. Se diferencia de una igualación en que en esta,  el resultado final es dependiente en todo momento de las condiciones para estar a uno o a cero. Mientras que las condiciones se cumplen la variable está  a uno. Cuando una de las condiciones falla, la señal cae. Aquí no. Una vez dadas las condiciones la señal estará a uno indefinidamente... o hasta que se le haga un **RESET**. Y es que el RESET lo que hace es fijar a cero la variable. Como en el caso anterior, aunque las condiciones de reset desaparezcan, la señal seguirá a cero y no recobrará su estado de uno hasta un nuevo SET. #### ¿Qué pasa si se dan ambas condiciones, SET y RESET en AWL? Pues lo primero que habría que darte un capón por hacer un programa en el que el set y reset se de simultáneamente. ##### ¿Puede darse ese caso? Porsupuestísimo que sí. ##### ¿Es grave? No conozco a nadie que haya enfermado de ello, pero mejor evitarlo. ##### ¿Qué pasa si se da? La respuesta seguro que la sabes. Depende. ##### ¿De qué depende ? De según como se ejecute todo depende... (léase a lo [Pau Donés](http://www.youtube.com/watch?v=GtujUCURgtM)). Como bien sabes, si ambas condiciones se dan simultáneamente y seguidas una de otra, la que sobrevivirá del envite será la segunda. Ahora bien, si hay distancia en el programa, imaginemos el SET al principio del programa, el RESET a eso de la mitad, la cosa puede hacer cosas pintorescas ya que la variable entre el SET y el RESET estará a uno con lo que ello pueda conllevar en lo que haya en el programa entre estos dos puntos. A partir del RESET se pondrá a cero hasta el siguiente ciclo de scan que se volverá a poner a uno si las condiciones se mantienen. Tendríamos por tanto la variable la mitad del ciclo a uno y la otra mitad a cero... una fiesta. Por tanto, mejor evitar estas circunstancias y a ser posible, el set y el reset que estén seguidos siempre que sea posible. Por este posible problema y porque será más fácil de seguir el programa. ##### ¿Esto sólo se puede dar en AWL? No. Ahora vamos a ver cómo se activan y se desactivan, pero lo dicho anteriormente vale para todos los lenguajes disponibles. Por tanto tendrás que tener cuidado con el Set y Reset en AWL, en FUP o en KOP ##### ¿Qué pasa si mezco Set, Reset e igualaciones? Espero que esto no se te haya pasado siquiera por la cabeza... cárcel directamente. Punto. Y sin galletas en el desayuno hasta nuevo aviso. ### Vale, vale... pero ¿qué hay del SET y RESET en AWL? Bien. Te lo voy a explicar con un ejemplo sencillo: *O E0.0* *O E0.1* *S A 1.0* *U E0.2* *U E0.3* *R A1.0* ##### ¿Chupado no? Como bien imaginarás, la señal A1.0 se pondrá a uno, cuando el OR formado por la E0.0 y E0.1 de como resultado un uno poniendo el RLO a uno. Igualmente, la A1.0 se podrá a cero, cuando el AND de la E0.2 y E0.3 se ponga a uno poniendo el RLO también a uno haciendo por tanto el reset. En definitiva, el Set y el Reset se ejecutarán forzando la marca o salida en una dirección u otra, cuando el RLO esté a uno y pasando olímpicamente del Set o Reset cuando el RLO esté a cero. ¿Fácil no? ### Forzado del RLO - SET y CLR Unas instrucciones muy interesantes son las de forzar el RLO, es decir, cargar en el RLO un cero o un uno de forma incondicional hasta que haya una nueva operación de combinatoria booleana: - SET: Fijaremos con ello el RLO a uno - CLR: Fijaremos con ello el RLO a cero Por ejemplo: *U E0.1* *U E0.2* *SET* *= A1.0* ##### ¿Cuánto valdrá A1.0? Pues efectivamente, la salida A1.0 estará forzada a uno ya que da igual lo que pase con la combinación de las dos entradas ya que luego se fuerza el RLO a uno y se iguala su valor a la A1.0 ### Flancos en AWL Finalmente vamos a ver los pulsos. Hay dos: - Positivo (FP) - Negativo (FN) Los pulsos como bien sabes son instrucciones que ponen el RLO a uno cuando se cumple el escalon de subida de cero a uno (el positivo) o que el RLO previo pase de uno a cero (el negativo). Necesitan una marca auxiliar que es la que almacena la información de cómo estaba el RLO en el ciclo anterior. Mejor con un ejemplo: *U E0.0* *FP M1.0* *= A1.0* Lo que hará este mini ejemplo será: Mientras que la marca E0.0 esté a cero, la el RLO tras el pulso estará a cero. Cuando la entrada pase a uno, entonces en ese ciclo de scan el pulso pondrá el RLO a 1 haciendo que la salida A1.0 se active en ese ciclo de scan. En el ciclo siguiente aún estando la entrada a uno, la salida volverá a cero ya que el RLO a la salida del pulso estará a cero. Si hicieramos un ejemplo similar con el flanco negativo: *U E0.0* *FN M1.0* *= A1.0* El comportamiento sería igual salvo que esta vez, el RLO después del FN se pondrá a uno cuando la señal de la E0.0 pase de estar a uno a estar a cero. Análogamente al caso anterior sólo estará a uno en ese ciclo de scan, volviendo a cero en los sucesivos con independencia de que la salida siga a cero en este caso. Como siempre, te dejo con un vídeo donde vamos a ver una forma más gráfica lo que acabas de leer: https://www.youtube.com/watch?v=foXFCERPmOA ### ¿Qué te ha parecido? Como siempre me gustaría saber tu opinión. Como siempre, si te ha gustado la entrada, te pido que la compartas a través de tus redes sociales para que llegue al máximo de gente posible. --- # Algebra booleana (II) - AWL en Step 7 > AWL en Step 7: descubre el lenguaje madre de Siemens y aprende logica binaria con algebra booleana antes de meterte con los temporizadores. La base del AWL. Fuente: https://programacionsiemens.com/awl-en-step-7-algebra-booleana · Autor: Iñigo Gútiez · Publicado: 2013-10-03 · Actualizado: 2013-10-03 · Categoría: Programación PLC ¿Recuerdas al señor de la derecha? [Lo vimos en el primer capítulo de álgebra de Boole](https://programacionsiemens.com/algebra-booleana-en-step-7/). Hoy vamos a ver un poco de lógica binaria de **AWL en Step 7**. Si estás buscando en TIA Portal, tienes el[curso de AWL en TIA Portal](https://programacionsiemens.com/curso-de-awl-en-tia-portal/) Sí. Antes de ver los temporizadores. ¿Por qué antes? Pues porque cuando veamos los temporizadores, habrá que verlos también en **AWL** y hombre, no quiero que te de un derrame cerebral así de primeras. Pero lo veremos enseguida. ### AWL en Step 7 Deberíamos empezar por ver** qué es el AWL**. El AWL no es mas que  uno de los tres lenguajes básicos de Step 7. En la entrada [AWL, FUP, KOP... ¿cuál elijo?](https://programacionsiemens.com/step-7-awl-fup-kop-cual-elijo/) definíamos un poco de qué se trata cada uno. Es la mamá de todos los lenguajes en Step 7. Todos finalmente se van a traducir a AWL y t**odo aquello que no se pueda** **programar en AWL** **es que simplemente no lo vas a poder programar**. Otra cosa es los sudores que te costaría hacer directamente en AWL tareas complejas, pero por poder, se podría. Con **AWL en Step 7** se pueden hacer auténticas filigranas ahorrando código a más no poder. Digamos que es la forma de programar más compacta de todas (en general). Si hiciéramos una comparación con otros lenguajes, tendríamos lenguajes de alto nivel como el Pascal (SCL en nuestro caso) y luego tendríamos lenguajes de bajo nivel como Ensamblador, que en nuestro caso sería el AWL. Puede que la comparación no sea lo más acertada del mundo, pero suficientemente buena a mi juicio para que te hagas una idea. ### ¿Ensamblador? Ya me estas acojon... No te asustes, que no es para tanto. Digo que es similar a ensamblador en el sentido de que es un lenguaje básico, con instrucciones primarias que se ejecutan "a pelo" le pongas lo que le pongas por delante. Por poner un ejemplo. Ya hemos dicho con anterioridad que no puedes comparar en FUP y en KOP valores enteros con reales, por poner un ejemplo. En AWL sí se puede. ¿Tiene sentido? Ninguno. Pero AWL no entiende de variables enteras, entiende de bits. Y si tu le indicas que haga una suma entera de dos variables, la hará. Si el formato de estas variables está correcto todo irá bien. Si está mal pues el PLC hará cosas muy pintorescas y divertidas... los primeros dos minutos. Después de 15 minutos sin tener ni pajolera idea de qué pasa, deja de tenerla. Con el tiempo te darás cuenta de que no tiene ni p.. gracia ya desde el principio. Frustraciones personales a parte, con todo esto quiero que te quedes con dos cosas: - El AWL es el lenguaje base del resto. - Todo es traducible a AWL, pero no al revés. La primera parte creo que ha quedado clara. La segunda, la vas a ver clara enseguida. Los lenguajes FUP y KOP cuando lo traduces a AWL crean instrucciones que a veces son inservibles de cara a la ejecución del programa pero necesarios para la propia integridad del lenguaje FUP y KOP. Necesitan de esas instrucciones para dar consistencia a lo que estás dibujando y de ahí que creen lineas que en principio no serían necesarias para un funcionamiento idéntico realizando el programa directamente en AWL. El problema está que si realizas el programa en AWL directamente, si quieres traducirlo a KOP, por decir uno, el editor no va a tener la capacidad de entender qué diantre quieres hacer. Y por tanto, no podrá traducirlo. Por tanto siempre podrás traducir FUP y KOP a AWL (más o menos depurado) pero en general, no podrás traducir código AWL a FUP y a KOP. Es así. Asúmelo. Así que empecemos con las cosas básicas que debes tener claras antes de empezar a programar en AWL. ### Instrucciones básicas para programar AWL en Step 7 Las instrucciones básicas van a ser: - U para hacer un AND - O para hacer un OR - X para hacer una O exclusiva - = para igualación #### ¿No hay negadas? Veo que estás despierto. Efectivamente. También tendremos: - UN para hacer un AND negado - ON para hacer un OR negado - XN para hacer una O exclusiva negada. Luego lógicamente tendremos paréntesis **()**. Pero eso más tarde. #### ¿No hay más? Sí que hay más. El Set, Reset, flancos... pero de momento, quédate con los básicos que son los de ahí arriba. ### Operaciones de Y lógica. Esto lo vas a pillar enseguida verás. Imagina que tienes dos entradas que cuando están las dos a true (1), tenemos que activar una salida. La logica sería así: ***U E 0.0*** ***U E 0.1*** ***= A 1.0*** Es decir, iniciamos el segmento leyendo lo que hay en el E0.0 y le hacemos un AND con el E0.1 y su resultado se lo asignamos a la salida A1.0. O de otra forma, cargamos el E0.0 en el RLO y luego hacemos un AND de la E0.1 con el RLO y se lo asignamos a la A1.0 ### Ya bien, pero estooo, una cosita que te quería comentar...¿Qué es el RLO? ¿Siglas chulas eh? ¿De alguna organización? Pues no. **El RLO no es mas que una variable que almacena el valor de una operación binaria**. Es especialmente relevante en la programación de AWL en Step 7. #### La definición ha quedado chulísima pero no he entendido ni papa. A ver. En el ejemplo de la Y lógica hemos visto primero una ***U E0.0*** Bien. Como hemos dicho que la U es un AND con lo que tenga el RLO (V ó F). Como no hay operación previa, entonces lo que hace es leer el el valor de la E0.0 y la transfiere al RLO. Imaginemos que tiene un cero. Luego el RLO valdrá cero. Luego imaginemos que la E0.1 está a uno y hace un **U E0.1** Es decir, hace un AND con lo que tenga el RLO tras haber ejecutado la operación anterior. La E0.1 está a uno, pero el RLO está a cero, luego el resultado nuevo será cero y se lo cargará nuevamente al RLO. ***= A1.0*** Finalmente, toma el valor del RLO y se lo transfiere a la A1.0 Imaginemos que ambas señales estuvieran a uno. Entonces, inicialmente al leer la E0.0 el RLO pasaría a valer uno. Luego haría un AND entre el RLO y la E0.1. Como ambas están a uno, el resultado lógico sería uno, que sería nuevamente almacenado en el RLO. Finalmente, cargaría ese uno en la salida A1.0 ¿Capito? ### Operación O lógica En buena lógica (nunca mejor dicho), podrías pensar que la forma correcta de hacer un OR sería: ***U E0.0*** ***O E0.1*** ***= A1.0*** Y eso estaría bien. Pero la forma *más mejó *sería haciendo: ***O E0.0*** ***O E0.1*** ***= A1.0*** #### ¿Por qué? Lógicamente hacen lo mismo. Pero me gusta más hacerlo así porque de hecho, cuando traduces un OR de KOP a AWL así lo representa. Mejor que escribamos todos de la misma manera ¿no? Bueno, al grano. ¿Adivinas como actuaría no? Inicialmente haría un: ***U E0.0 // O E0.0*** Como en el caso anterior leería el estado del E0.0 y lo volcaría en el RLO (imaginemos un cero). Luego un: ***O E0.1*** Y aquí haría un OR con el RLO. Imaginemos que el E0.1 estuviera a uno. El resultado del OR sería un bonito uno. ***= A1.0*** E igualamos el uno a la salida A1.0. ¿Sencilo no? Vayamos ahora con los paréntesis. ### Paréntesis en AWL en Step 7 Como puedes imaginar, en cuanto queramos realizar combinaciones un poco más elaboradas necesitaremos paréntesis para poder realizar estas lógicas. Así, dispondremos de las siguientes operaciones: - U( ..) //UN(..) que valdrá para realizar un (N)AND con el contenido interior al paréntesis - O(..) // ON(..) que valdrá para realizar un (N)OR con el contenido interior del paréntesis. - X(..) // XN(..) que valdrá para realizar una (N)XOR con el contenido interior del paréntesis En definitiva en lo que se basa es en realizar la combinatoria interior del paréntesis y luego ejecutar la operación asociada al paréntesis. Los paréntesis pueden anidarse metiendo paréntesis dentro de otros paréntesis. Así, odríamos hacer algo similar a lo anteriores ejemplos: ***U(*** ***U E0.0*** ***O E0.1*** ***)*** ***O(*** ***U E0.2*** ***U E0.3*** ***)*** ***= A1.0*** En este caso primero resolvería la combinatoia interior de los paréntesis por separado y luego realizaría el OR entre el resultado de los paréntesis. Hay que añadir que el caso del OR es un poco especial ya que si dentro del paréntesis del OR la combinatoria es de AND exclusivamente, el paréntesis se podría haber obviado quedando esa parte así: ***O*** ***U E0.2*** ***U E0.3*** Y funcionaría exáctamente igual. ### Operandos de cierre de consulta A estas alturas de la película te estarás preguntando... si los resultados de la combinatoria se van almacenando en el RLO, ¿qué pasa después de una igualación si quiero empezar a realizar una nueva combinatoria? Pues efectivamente después de los operandos: - Igualación (=) - Set (S) - Reset (R) Con esos operandos, se cierra la consulta actual y se abre una nueva (además del inicio del programa) Da igual por tanto lo siguiente que hagas (U,O, UN...) porque lo que se hará es una lectura del operando en el RLO. Es decir, si la siguiente a una igualación es *...* *= A1.0* ***UN E1.0*** *U E1.1* *= A1.2* Lo que hará es leer el estado de la E1.0, le cambiará el signo y lo cargará en el RLO. No hará un NAND con nadie. Simplemente realizará la carga en el RLO. Ojo. Un cambio de segmento no es un inicio de programa. Por tanto si la última instrucción de un segmento es la lectura de un bit haciendo un U E0.7, este afecta al siguiente segmento. A efectos prácticos es como si lo hubieras escrito al principio del nuevo segmento. Finalmente vamos a ver un vídeo como siempre, explicando lo visto hasta ahora. https://www.youtube.com/watch?v=KuB0ANk_tAU ### ¿Necesitas más? Como siempre, espero tus comentarios. Recuerda que si quieres profundizar más, tienes disponible el curso completo  de [AWL en TIA Portal](https://programacionsiemens.com/curso-de-awl-en-tia-portal/) --- # 1. Introducción a la programación en Step 7 > Programacion en Step 7 desde cero: introduccion a los conceptos basicos del automata Simatic S7, el hardware, el software y el SO antes de escribir codigo. Fuente: https://programacionsiemens.com/1-introduccion-la-programacion-en-step-7 · Autor: Iñigo Gútiez · Publicado: 2013-09-04 · Actualizado: 2013-09-04 · Categoría: Programación PLC Vamos a repasar una serie de conceptos generales de programación aplicados en un entorno de Simatic S7. Lamento que la primera lección sea una pequeña chapa teórica y que no vayas a ver ni una línea de código, pero por muchas vueltas que le he dado, es que es necesario unos mínimos. Pero míralo de una forma positiva, así ya lo damos por zanjado y pronto comenzaremos a escribir líneas y líneas de código (el que no se conforma es porque no quiere). Los elementos de un autómata como bien sabes son dos: el hardware (el aparato en sí con sus tarjetas, cableado etc) y el software (los programas). Dentro de los programas tendremos dos partes a su vez: - El SO del autómata - El programa de usuario que tú vas a desarrollar y que desempeñará las funciones para las cuales se ha ideado. El SO del autómata será el que se encargue por un lado de interpretar y ejecutar el programa que has diseñado además de otras funcionalidades como pueden ser el diagnóstico de alarmas y errores, administrar la memoria, comunicación con otros elementos, exploración de las entradas y la transmisión de órdenes a las salidas entre otras muchas que sabemos que hace, pero poco nos importa ahora el saber cómo. ## Programacion en Step 7 El programa de usuario es sobre lo que versa este curso. En este programa vas a poder determinar las condiciones con las que arrancará el autómata, tratará datos y señales del proceso para finalmente dar unas órdenes de actuación sobre los diferentes actuadores y elementos de la instalación. ## Estructura de la memoria. A grandes rasgos la memoria del autómata va a ser dividida en las siguientes partes: - Imagen de las E/S. - E/S de la periferia - Marcas - Valor y estado de temporizadores y contadores - Módulos de datos (DB) - Datos temporales que se pierden al final de cada ciclo. ### Imagen de E/S Las imagenes de las entradas y las salidas no son mas que las señales E o A que se usan en el programa. Son eso, imágenes, ya que no leemos el valor instantáneo de la entrada o forzamos instantáneamente la salida, sino que leemos en el caso de las entradas el valor de la entrada física cuando se refrescó la imagen de las entradas antes de comenzar el nuevo ciclo del OB1 (programa principal). Igualmente en el caso de las salidas, cuando el programa pone a uno o a cero una salida no lo está haciendo inmediatamente, sino que está dando valor a la imagen de la salida, y esta imagen de la salida será volcada a las salidas reales antes de comenzar un nuevo ciclo del OB1. ### E/S de la periferia. A diferencia del caso anterior, se puede leer directamente el valor actual de cualquier sensor. Para ello debemos leerlos en bytes (PEB), word (PEW) o doble word (PED) ya que el acceso no puede ser directo a un bit en concreto (a diferencia de las imagenes de E/S). Igualmente pasa con las salidas, que podemos forzar el estado de las salidas de forma inmediata accediendo a las salidas de periferia (PAB,PAW,PAD) ### Marcas Las marcas son variables indexadas y globales, por tanto no hay que declararlas, pero si es conveniente darles un nombre y tipo (entero, doble,real..). Se les puede dar valor dentro de cualquier parte del programa. Dependiendo de la CPU este área es mayor o menor. Los valores pueden ser remanentes tras el apagado del PLC o volátiles (se pierden tras apagar el PLC). Su acceso puede ser desde bit hasta un áncho indeterminado si se usan punteros de área. ### Temporizadores y contadores. La programacion en Step7 tiene la peculiaridad de tener temporizadores de dos tipos: por software (IEC) y temporizadores S7 (o llamados también de S5 ya que existían ya en la versión anterior). Estos últimos son temporizadores hardware y son limitados dependiendo de la CPU (por ser hardware), no así los IEC que por ser creados por software, la limitación es la propia memoria disponible, pero no hay un número determinado de ellos. Los contadores pues son eso, elementos usados para contar o decontar cantidades. ### Módulos de datos (DB). Son áreas de memoria que a diferencia de las marcas, está definidas por el usuario. Pueden ser de longitudes dispares y con contenidos de todo tipo. Las variables contenidas en los DB son remanentes por defecto al apagado del PLC. ### Variables temporales. Son variables que se declaran dentro de los módulos  que sirven para realizar cálculos intermedios y locales que no necesitan ser usados más allá del módulo en cuestión y en el ciclo en el que son llamadas o tratadas. Te dejo con el primer vídeo del curso... https://www.youtube.com/watch?v=MA0fqHOi8uY&list=PL6OtOHA4hApwLHt3mnh3NwIXdEu3tk6wX **Actualización (23/09/13)**: Como bien han apuntado en los comentarios, las variables temporales no se re-inicializan como yo he comentado en el vídeo. El valor inicial de la variable temporal es el valor último que tomo esa variable, lo cual no deja de ser tremendamente peligroso ya que si no le das valor antes de leerla el contenido de dicha variable es indeterminado, especialmente si la función es llamada varias veces a lo largo del programa y la variable va tomando valores dispares. ## Módulos Para acceder y tratar los datos almacenados en las áreas de memoria, existen diferentes tipos de módulos cuyas caracteristicas serán diferentes para cada requerimiento que sea necesario: - Módulos de organización (OB) - Funciones (FC). - Bloques de función (FB). - Bloques de memoria (DB) - Módulos de sistema (SFC,SFB,SDB) ### Módulos de organización Lo primero que has de saber de estos módulos es su especifidad, sólo sirven para lo que han sido diseñados y no se llamarán desde otros bloques sino que será el propio autómata quien gestiona las llamadas a estos módulos en función de sus características. Hay varios tipos de módulos de organización: - OB de arranque (OB100-102): Son bloques con los que se arranca el PLC en función del tipo de arranque y depende del tipo de CPU para que tenga todos los tipos o sólamente el OB100, que es el arranque completo. Sólo se ejecuta una vez, en el arranque. Una vez terminado pasa al principal. - El OB1: Es un tipo es sí mismo y es el principal. Se ejecuta de forma recurrente y desde él se hace llamadas a los FC y FB del programa - OB cíclicos: También se pueden hacer llamadas a otros FC o ejecutar código desde estos OB. Tienen la peculiaridad frente al OB1 que se ejecutan a tiempo fijo (por ejemplo el OB35). - OB Horarios: Son OB que dependen de la fecha y hora. Se pueden realizar tareas desde en un momento concreto a ser cíclicos cada x tiempo (desde minutos a todos los años en un momento concreto) - OB de fallo (OB85, OB86, OB121 etc). Son OB predefinidos para cada tipo de fallo y son llamados cuando el fallo es detectado. Dentro de cada OB se puede tratar el fallo y tomar las decisiones pertinentes en cada caso. Todos los OB tienen la peculiaridad de tener reservados 20bytes de memoria local donde podrás hallar variables específicas de cada OB. Así podrás tener información de en qué momento ha sido llamado o la frecuencia de llamada en el caso del OB35 por poner un ejemplo. Los más usados con una diferencia notable con el resto: - OB100: Arranque desde cero. En el daremos las condiciones y valores iniciales (si procede) en el arranque. - OB1: Programa principal (lógico) - OB35: Programa cíclico por excelencia ya que hay otros pero que no están disponibles en todas las CPU. Puedes programar tareas a tiempo fijo facilitando contajes y mediciones que sean necesarias conocer su periodicidad. Luego están los de fallo que dependiendo de la aplicación usarás unos u otros o ninguno. Pero con estos 3 tienes el 80% de las necesidades de los OB cubiertos. https://www.youtube.com/watch?v=phtNQmp0x6Y ### Funciones (FC) Las funciones son bloques que pueden ser llamados desde OB, FC o FB y se usan fundamentalmente para: - Estructurar el código de tal forma que no esté todo metido en el OB1 sino que se hace de forma arbórea e inteligible dividiendo el programa por zonas, máquinas, submáquinas... - Usarlos como funciones que traten unos valores de entrada y den como resultado unos valores de salida. Lógicamente la idea de esto es por un lado dar claridad y por otro lado permite la reutilización de la función. Tienen la peculiaridad de poder definir de forma interna variables temporales con las que jugar dentro del bloque pero que no tienen remanencia y el valor de estas variables se pierde de ciclo de ejecución a ciclo de ejecución, es decir, al inicio de la ejecución del FC valdrá cero, y aunque al final de la ejecución del FC la variable valga 100, en el siguiente ciclo de scan, la variable volverá a valer cero por esta falta de remanencia. Por ejemplo, podemos crear un FC1 y un FC2. En el FC1 desarrollar un programa que sume a +b y nos de c. En el FC2, hacer varias llamadas al FC1 para que nos haga varias sumas. El bloque FC1 denominado "sumar" lo reutilizamos y contendrá variables de entrada y salida mientras que el FC2 simplemente lo usaremos llamándolo desde el OB1 y lo denominaremos "todas_las_sumas" haciendo una única llamada desde el OB1 a este bloque. No tiene ninguna importancia la falta de remanencia de las posibles variables intermedias ya que lo que realiza es un cálculo matemático en cada ciclo. https://www.youtube.com/watch?v=s6YEl0OvgcU ### Bloques de función (FB) Los bloques de función son parecidos a los anteriores con la particularidad que tienen variables internas llamadas estáticas que dan remanencia de ciclo a ciclo. Para lograr esta remanencia tendrán asociado un bloque de memoria (DB) llamados para estos casos de instancia. Los FB pueden ser llamados desde los OB, FC o FB además de poder ser usados dentro de las estáticas de otros FB (multiinstancias). En definitiva son los módulos que usaremos para una programación orientada a objetos de otros lenguajes ya que podremos realizar un módulo que nos gestione por ejemplo un transportador y podremos crear tantos transportadores como queramos pudiendo desentendernos de cómo funcionan internamente una vez sepamos depurado el código del FB. https://www.youtube.com/watch?v=pi2sPW1vLms ### Módulos de datos(DB) Los módulos de datos pueden ser der de tipo global o de instancia. Los de instancia los hemos visto que son necesarios para la ejecución de los FB y toman la estructura de la declaración de las variables del propio FB. Los DB globales son módulos declarados por el usuario y pueden contener variables de todo tipo definiendo estructuras complejas. En ambos casos el acceso a la información es global ya que incluso se puede acceder a la información de un DB de instancia desde otro bloque. https://www.youtube.com/watch?v=ePsWY_zml9k ### Módulos de sistema. Al igual que en los casos anteriores existen una serie de FC y FB que están integrados en el propio sistema operativo del PLC. Pueden ser llamados y consultados para obtener o tratar información. Al igual que pasa con los FB, los SFB necesitan de su correspondiente SDB. Por ejemplo con el SFC0 podrás consultar la hora del reloj del PLC. https://www.youtube.com/watch?v=gWjIofvO1pw ## CICLO DEL PROGRAMA Como ya he ido adelantando existen unos módulos que son los encargados de ejecutar los programas de usuario. En el siguiente esquema puedes ver de forma gráfica cómo es la ejecución cíclico del programa ([ya visto anteriormente aquí](https://programacionsiemens.com/procesamiento-ciclico-de-un-programa/)) Procesamiento cíclico Como puedes imaginar, ejecutar todas las instrucciones conllevará un tiempo denominado tiempo de ciclo: El tiempo de ciclo es el tiempo medido en ms que se necesita para ejecutar completamente todas las instrucciones y llamadas realizadade desde el OB1, la ejecución de otros OB llamados (si fuera el caso) y actividades del SO (actualizar las imágenes de E/S por ejemplo). El tiempo no es constante ya que no todos los ciclos tienen la misma carga de trabajo bien porque no siembre se hacen las llamadas de OB cíclicos o porque no se hacen llamadas a todos los bloques en función de las circunstancias y valores de las diferentes variables. Este tiempo está vigilado por un watchdog (típicamente fijado en 150ms fijado en la configuración del hardware) y si se supera, el PLC se irá a estado de STOP. ### ¿Cómo se puede superar este tiempo? Pueden ser por varias causas, pero una típica es programar mal un bloque haciéndolo sin salida (un lazo infinito) con lo que irremediablemente se va a STOP aunque hay otras como pueden ser un programa eXcesivamente largo. También se puede ir el PLC a STOP debido a los tiempos de ejecución por llamadas a OB cíclicos en tiempos muy cortos con cargas de trabajo muy altas. Por ejemplo, programando el OB35 a 2ms y si su carga de trabajo es muy alta, puede que con la siguiente llamada aún no haya terminado las operaciones del ciclo anterior, y el PLC se coja la baja. Bromas a parte, veamos más en concreto en qué orden ejecuta las diferentes tareas durante este tiempo de scan. En primer lugar cuando arranca el PLC ejecuta los OB de arranque. El más habitual es el OB100. https://www.youtube.com/watch?v=XdtWgSbB5ME --- # Temporizadores en Step7: manejo y creación > Temporizadores en Step 7: aprende a manejar y crear temporizadores S5 hardware y temporizadores IEC en bloques FB para contar el tiempo en tu autómata. Fuente: https://programacionsiemens.com/temporizadores-en-step7 · Autor: Iñigo Gútiez · Publicado: 2013-04-25 · Actualizado: 2013-04-25 · Categoría: Programación PLC Uno de los motivos por los que los internautas acaban visitando el blog es porque buscan información sobre los temporizadores en Step7. [Imagen: temporizadores en Step7] Te recuerdo que este tema ya lo tocamos con anterioridad en la entrada [Temporizadores Operaciones en Step7 (II)](https://programacionsiemens.com/temporizadores-tipos-step-7/). Pero la forma de contar el tiempo en nuestro autómata puede ser muy diversa como veremos a continuación: - Uso de los temporizadores S5 (lo ya comentado) - Uso de temporizadores IEC en los FB - Creación de temporizadores ### Temporizadores en Step7 - Temporizadores S5 Los temporizadores de S5 son una reminiscencia del anterior Step5 y tienen como características principales: - Son temporizadores Hardware, esto implica en sí mismo que por cada CPU hay un número finito de ellos (dependiendo de la CPU habrá más o menos) - La ejecución y disparo no depende del ciclo de scan. - Hay una mayor variedad que los que podemos encontrar en los temporizadores IEC #### ¿La ejecución no depende del ciclo de scan? ¿Qué significa esto? Para que lo entiendas mejor, imagina un temporizador impulso prolongado S_VIMP. Este temporizador arranca con un flanco y la salida está a 1 durante un periodo T independiente de si el pulso que lo generó está a true o a false. Bien. Pues el temporizador caerá independientemente de en qué fase de del OB1 estemos, esto es: si hacemos una lectura de este temporizador al principio del OB1 y otra al final, el temporizador cambiará de estado en cualquier momento de la ejecución del OB1 (cuando se agote el tiempo lógicamente). Esto implica que dichas lecturas pueden ser diferentes al principio y al final, dependiendo de en qué momento el temporizador cambie de estado. Digo esto porque como bien sabes las imágenes de entradas y de las salidas se refrescan al principio del OB1 y se mantienen en su estado durante todo el ciclo OB1. El temporizador S5 no. Es hardware. Corre en paralelo al OB1. Cuando acaba el tiempo se acabó, y cambia el estado allí donde pille. En principio esto no es ningún problema, pero podría llegar a serlo dependiendo de las circunstancias y la aplicación. Simplemente tenlo en cuenta. La explicación de todos los que hay y cómo se usan, lo tienes [en la entrada ya comentada.](https://programacionsiemens.com/temporizadores-tipos-step-7/)  ### Temporizadores en Step7 - Temporizadores IEC Los temporizadores IEC  tienen unas características diferentes a los S5: - Son temporizadores Software. Esto hace que no haya un límite definido en su cantidad más allá de la memoria disponible. - Por ser software sí dependen del ciclo de ejecución (está controlado cuándo pueden cambiar de estado). - Tenemos una menor variedad debido principalmente a que siguen los estándares IEC centrándose básicamente en los TON y TOF. #### Si son software... ¿Cómo se llaman? Pues mediante unos SFB existentes en las bibiotecas estándar. - SFB4 para el TON (Retardo a la conexión) - SFB5 para el TOF (Retardo a la desconexión) Apreciarás que es un SFB, esto implica en sí mismo la necesidad de un DB. En el caso de un FC, necesitarás obligatoriamente un DB, pero la ventaja de usarlos en los FB es incluirlo como variable STAT haciendo una multiinstancia no teniendo que declarar el DB ya que la memoria necesaria será reservada en el propio DB del FB en el que se usa. Luego lo veremos con más detenimiento en el vídeo. ### Temporizadores en Step7 - Creando tus propios temporizadores Hay multitud de ocasiones en que no te van a convencer los temporizadores existentes y vas a necesitar tus propios contadores de tiempo. Así podrás hacerlos de diversas maneras: - Usando un OB cíclico para contar tiempo - Usando el tiempo de ciclo del OB1 para contar tiempo. - Usando la marca de ciclo. - Usando TIME_TCK para contar Como ves hay muchas opciones. #### OB cíclico para contar tiempo La idea es simple: Poner una marca o contador en el OB35 por ejemplo que se incremente en 1 cada vez que se ejecuta. Si está programado cada 100ms tendrás una resolución de décimas de segundo que para muchos casos será más que suficiente. Luego dicho contador o marca podrás tratarlo en el propio OB35 o en cualquier otro punto del programa para su lectura y/o puesta a cero. #### Tiempo de ciclo del OB1 Una de las variables temporales que tiene por defecto el OB1 es los milisegundos que ha tardado en ejecutarse el ciclo anterior. Para contar tiempo no tendremos más que sumar los tiempos de los ciclos teniendo el tiempo transcurrido hasta que lo pongamos a cero. La precisión la dará el ciclo de scan, que en general será de unos pocos milisegundos haciendo que esta sea suficiente para la mayoría de los casos. También puedes hacer una cuenta atrás. Eso ya a gusto del consumidor. #### Marca de ciclo Como bien sabrás en la CPU puedes programar la marca de ciclo. Por tanto puedes usar los flancos de la marca de ciclo para sumar o restar tiempo. La precisión te la dará qué bit de la marca uses para contar el tiempo. #### TIME_TCK En este punto no voy a inventar. [La ayuda online de Siemen](http://support.automation.siemens.com/AR/llisapi.dll?func=cslib.csinfo&objId=8736822&objAction=csOpen&nodeid0=10805384&lang=es&siteid=cseus&aktprim=4&extranet=standard&viewreg=AR)s lo explica muy bien, aunque aquí lo copio y pego  como resumen: Para implementar este tipo de temporizadores en S7 se puede utilizar la función del sistema SFC64 "TIME_TCK" y el módulo de función FB103 "IMPULS". El temporizador creado funciona como un impulso prolongado. Se pueden utilizar todos los temporizadores que se quieran sin consumir recursos de "TIMER" en la "CPU". El principio para crear estos temporizadores es muy simple. Si se debe empezar a contar un tiempo, se lee el valor actual con ayuda del módulo "TIME_TCK" desde la "CPU" y se guarda su valor. Si, pasado un tiempo, hay que consultar el valor contado hasta entonces, la función FC111 "GET_TIME" recoge este valor desde que se ha comenzado a contar. La base para crear el temporizador es el registro "TIMETICK" de la "CPU". Para los temporizadores con exactitud de ciclo es suficiente con leer el "TIMETICK" una vez por ciclo, archivar su valor y hacerlo accesible al resto de aplicaciones (FB, FC). Una lectura cíclica y central ahorra tiempo de ciclo. Con ello, el "SFC64" no tiene porqué llamarse para cada temporizador en cada ciclo. Si se necesita un temporizador más exacto, hay que realizar la lectura directa del tiempo del sistema antes de llamar al temporizador. Como ves, no podrás decir que no hay formas de controlar el tiempo. ¡Ya hubieran querido los [hombres grises de Momo](http://es.wikipedia.org/wiki/Momo_(novela))tener esta tecnogía! Para finalizar, y como siempre, te dejo con un vídeo explicativo de todo lo comentado. https://www.youtube.com/watch?v=dGkSz_IhHjI ### ¿Te ha sido útil esta entrada? Ahora te toca a ti, te invito a que participes del blog comentando si tienes una forma adicional de contar el tiempo, y que si te ha parecido interesante des publiciad a la entrada mediante tus redes sociales. Te lo agradezco de antemano enormemente. Por otro lado recordarte que esta y mucha más información está recopilada en el libro [Cómo programar Step 7 y no morir en el intento](https://programacionsiemens.com/como-programar-step-7/). En él a lo largo de más de 40 capítulos descubrirás todos los entresijos de la programación en Step 7 de forma amena y a base de ejemplos, que es como mejor se aprende. --- # Cómo realizar un tracking de datos en Step7 > Tracking de datos en Step 7: aprende a arrastrar la información del producto por tu línea con las funciones SFC20 y SFC21 para una buena trazabilidad. Fuente: https://programacionsiemens.com/como-hacer-un-tracking-de-datos-en-step7 · Autor: Iñigo Gútiez · Publicado: 2013-04-18 · Actualizado: 2013-04-18 · Categoría: Programación PLC Esta semana vamos a ver como realizar un tracking de datos en step7 usando dos funciones integradas: SFC20 y SFC21. El tracking de datos no va a ser nada más que arrastrar a lo largo de las posiciones de nuestra línea la información del objeto que está circulando por ella, desde la receta (o pauta) que sea, recorrido que ha de llevar, y cualquier característica o información que sea deseable que arrastre desde el principio hasta el final (o que se vaya añadiendo por el camino). Una cosa importante que has de tener en cuenta a la hora de realizar tu automatización es el grado de importancia que va a tener el arrastrar esta información. Digo esto porque para realizar una buena trazabilidad y saber qué información lleva qué pieza, has de saber en todo momento donde está qué, de tal forma que no haya posibilidad de error a la hora de arrastrar la información. Normalmente esto lo vas a realizar mediante la detección y transporte de las piezas, posicionamiento por encóder etc. Pero de alguna forma has de saber cómo detectar o calcular dónde esta cada pieza de tal forma que no cometas errores a la hora de arrastrar la información. ### Tracking de datos en Step7 A la hora de realizar nuestra trazabilidad, puede ser que sólo necesitemos un bit de estado (lleno/vacío, bueno/malo). En tal caso puede que te sirva las operaciones de desplazamiento [como ya hemos visto con anterioridad.](https://programacionsiemens.com/desplazamiento-y-giro-de-bits-en-step7/) Pero lo que vamos a descubrir juntos hoy es como arrastrar una cantidad ingente de información (ingente, es relativo, pero más de un byte vaya). Para ello vamos a necesitar conocer las siguientes herramientas: - SFC20: Block Move con el que vamos a poder copiar bloques completos de información. - SFC21: Fill. Con el que podremos rellenar zonas de memoria con la información que queramos (por ejemplo ceros). - UDT: ¿te acuerdas de esta entrada? Esta vez le vamos a dar un uso práctico. ### El "conceto" Como decía el gran [Manquiñas en Air Bag , lo importante es el conceto.](http://www.youtube.com/watch?v=vcfKwK05oS4) #### ¿Qué es lo que vamos a hacer? Pues básicamente, pasar la información de una posición a la siguiente y borraremos la que tenemos en la estación anterior. #### Bien, vale... ¿pero cómo? Vamos a usar las funciones SFC20 y 21. La primera, SFC20 nos va a permitir copiar volúmenes de datos grandes de un origen A a un destino B. Por ejemplo, podemos copiar el contenido completo de un DB a otro DB ¿entiendes por dónde voy? #### Y el SFC21 ¿para qué lo quieres? Una vez que hayamos copiado la información, lo suyo es que borremos la información de la estación origen. Para ello usaremos la función llenar SFC21 "Fill". Tomaremos una zona de memoria que tenga todo ceros y con ella rellenaremos el DB origen (o el área que sea). #### Y claro, vamos a usar DB.. Correcto. Si el volumen de datos es importante y/o tenemos diferentes estaciones, tenemos varias opciones: - Usar un único DB de tracking. - Usar un DB de tracking por posición. Si usamos un único DB de tracking crearemos típicamente un array de posiciones (por ejemplo con números de transpotador). Cada array contendrá la información de cada uno de los transportadores ( o lo que sea) y pasaremos los datos de una zona a la siguiente. En el segundo caso, cada transportador tendrá su propio DB pasando la información de un DB a otro. #### ¿Cuál es mejor? Pues ni uno ni el otro, ni todo lo contrario. Dependerá de cada caso. Contener todo en un DB tiene una gran ventaja, que es mucho más compacto y fácil de saber dónde encontrar toda la información ya que sólo hay un sitio que la contenga. Pero tiene un gran pero... que más te vale que hayas hecho bien los deberes y tengas claro qué información vas a intercambiar y que hayas dejado suficiente espacio libre de no tenerlo muy claro. #### ¿Por qué dices eso? Porque si después de haber estado muchas horas trabajando sobre el proyecto llegan nuevos requerimientos y has de aumentar el volumen en el tracking y no has dejado espacio suficiente te vas a cag.. en lo más barrido. Tendrás toda la información del tracking difuminada y usada por medio programa y a la hora de elegir los datos, ya no coincidirán los punteros porque tienes que añadir nuevos datos  y por tanto, has de cambiar los índices de las lecturas y/o escrituras. Por ejemplo. Imagina que has reservado exclusivamente el código de la pieza que tiene 8 caracteres en un string (10 bytes en total) de tal forma que la posición 1 empieza en la 0.0 la dos en la 10.0 la tres en la 20.0 etcétera... Has programado, leído el código donde has querido o lo que sea que hayas hecho a lo largo del programa... y ahora no sólamente has de arrastrar ese código sino también el número de pieza desde el inicio de turno... ¿entiendes el tamaño melocotón que van a coger las lágrimas que van a recorrer tus mejillas? Ahora, suponiendo que el número de pieza sea un entero, el índice del código de la pieza dos no empieza en el 10.0 sino en el 12.0, la tres en la 24.0... ¿entiendes la broma de mal gusto? #### ¿Solución? Pues dejar más espacio o si es una cantidad importante de datos (o porque el tracking no sea muy largo) hacer para cada posición, un DB. Si has dejado suficiente espacio, fin del problema. Acomodas los nuevos valores a transferir y listo. Ojo, porque cuando hagas el tracking, arrastra la información completa, sea espacio libre o no. Es decir, si para cada posición tienes 20  bytes aunque sólo uses 12, arrastra los 20. Esto hará que las futuras ampliaciones sean triviales ya que se estará arrastrando todo siempre, lo usado y el espacio libre. Es obvio, pero mejor dejarlo claro. Por otro lado, como te comento, puedes asignar un DB para cada posición. #### ¿Qué ventaja tiene usar un DB por posición? Pues que básicamente el ampliar los DB es simplemente añadir la información nueva al final y volver a cargar los DB en caso de que hayas superado la longitud máxima. También te recomiendo que aún usando los DB así, dejes espacio libre al final. Esto evitará que en una ampliación tengas que cambiar los valores de cuántos bytes arrastras. Un 20%-25% puede estar bien (más o menos dependiendo del tamaño que coja y previsión de necesidades). Así por ejemplo si mis datos son 80 bytes, pues sin duda yo dejaría libre hasta completar los 100 bytes. Otro motivo por el que usar los DB separados puede ser porque sean pocas posiciones de tracking con un volumen algo elevado. Digamos que porque cada posición tiene entidad suficiente como para tener sus propios DB. #### Pues siempre uso DB separados y ya está... Pues puede ser un gran error... Porque si tu línea va a tener muchas estaciones y vas a arrastrar poca información, generas mucho ruido en el proyecto. Imagina que tienes 30 estaciones para arrastrar poco más que un par de bytes. Siempre será mejor crear un DB más grande, dejando 20 bytes para cada posición (por decir algo) que no generar un DB para cada uno. Vamos, que uses la pelota que tienes encima de los hombros antes de decidir uno u otro. ### Vayamos con un ejemplo práctico Como casi siempre, vamos a poner todo esto en práctica mediante un ejemplo. En este caso vamos a hacer algo un tanto abstracto, pero que lo que va a querer simular es una línea con 5 posiciones. En el ejemplo vamos a tener dos botones. - Uno para cargar los nuevos datos - Un botón para generar el tracking Lógicamente en la vida real no se produce como en el ejemplo, pero con lo que quiero que te quedes es con cómo se mueve la información de un sitio a otro. En una automatización de verdad, habrá condiciones para pasar la información de un lado a otro y no se hará completamente en cascada. Para darle una pequeña gracia lo que vamos a hacer es que la información se arrastre siempre que la siguiente posición esté libre, pudiendo moverse siempre la última para dar por finalizado sumando uno a un contador de piezas buenas. Además le vamos a poner una salida intermedia en la cual, si la información dice que la pieza es mala, salga lateralmente y desaparezca del tracking sumando una al contador de piezas malas. Como siempre, es más fácil de ver que de explicar con palabras, así que te dejo con el siguiente vídeo donde puedes ver el pequeño ejemplo. https://www.youtube.com/watch?v=Bh5XEUCztow ### ¿Te ha sido útil esta entrada? Ahora te toca a ti, te invito a que participes del blog comentando si tienes una forma diferente de hacer los backups, y que si te ha parecido interesante des publiciad a la entrada mediante tus redes sociales. Te lo agradezco de antemano enormemente. También comentarte que este capítulo junto con otros muchos forman parte del libro [Cómo programar Step 7 y no morir en el intento](https://programacionsiemens.com/como-programar-step-7/). En este libro podrás encontrar muchos ejemplos además de los proyectos que se describen en los vídeos. --- # Ejemplo de codificación de un display de 7 segmentos > Display de 7 segmentos en S7: ejemplo de codificación con AND entre bytes, desplazamiento de bits y la función SEG, explicado en S7 y en MicroWin. Fuente: https://programacionsiemens.com/display-de-7-segmentos-step-7 · Autor: Iñigo Gútiez · Publicado: 2013-02-13 · Actualizado: 2013-02-13 · Categoría: Programación PLC Recientemente he recibido un email pidiendo ayuda para comprender un programa sobre un display de 7 segmentos realizado en Micro-Win. He de decir, que yo en MicroWin no he programado nunca ya que todos los PLC con los que he trabajado siempre han sido de la serie 300 y 400 y nunca del 200. Es así. Pero bueno, le he echado un vistazo, y al final conociendo S7, es fácil de comprender. Vamos a intentar resolver las dudas que pueda haber en el ejemplo. Para ello vamos a tocar una serie de conceptos y funciones, como hacer un AND entre bytes y palabras, mover bits a la derecha y la función SEG tanto en S7 como en Microwin. Vamos a ver los conceptos teóricos necesarios y como siempre terminaremos viendo un vídeo explicativo de la solución, en este caso tanto en Step 7 como en Microwin. Pero para eso, hagamos por un momento de profesor y redactemos el enunciado del problema: Realizar un programa que dado un número de 3 cifras, obtengamos cada segundo las centenas, decenas y unidades en un único display de 7 segmentos. Bien, para ir paso a paso, enumeremos los ingredientes necesarios: - Saber qué es un display de 7 segmentos y cómo funciona - Tratar el número de 3 cifras y poder obtener cada una de ellas por separado - Tomar esa cifra y sacarla de tal forma que el display lo entienda. ### ¿Qué es un display de  7 segmentos ? Haciendo una una copia descarada de la [wikipedia](http://es.wikipedia.org/wiki/Visualizador_de_siete_segmentos): **El visualizador de siete segmentos** (llamado también *display*) es una forma de representar números en equipos [eléctronicos](http://es.wikipedia.org/wiki/Electr%C3%B3nica). Está compuesto de siete segmentos que se pueden encender o apagar individualmente. Cada segmento tiene la forma de una pequeña línea. Se podría comparar a escribir números con [cerillas](http://es.wikipedia.org/wiki/Cerilla) o fósforos de madera. Sigamos leyendo: A cada uno de los segmentos que forman el display se les denomina a, b, c, d, e, f y g y están ensamblados de forma que se permita activar cada segmento por separado consiguiendo formar cualquier dígito numérico. A continuación se muestran algunos ejemplos: - Si se activan o encienden todos los segmentos se forma el número "8". - Si se activan sólo los segmentos: "a, b, c, d, e, f," se forma el número "0". - Si se activan sólo los segmentos: "a, b, g, e, d," se forma el número "2". - Si se activan sólo los segmentos: "b, c, f, g," se forma el número "4". - Bien, nos hacemos una idea ¿verdad? ### ¿Cómo tratamos los datos? Inicialmente vamos a disponer de un número de 3 cifras como dice el enunciado, lo que viene siendo un entero de 0 a 999. Ahora bien, para poderlo tratar va a ser pasar este número entero a BCD. He elegido un número de 3 cifras porque la conversión de entero a BCD (operación ITB) sólo es válida para números entre +- 999. #### ¿Qué es un número BCD? Hoy es el día de la [wikipedia](http://es.wikipedia.org/wiki/Decimal_codificado_en_binario): **En sistemas de computación, Binary-Coded Decimal** (**BCD**) o **Decimal codificado en binario** es un estándar para representar [números decimales](http://es.wikipedia.org/wiki/Sistema_de_numeraci%C3%B3n_decimal) en el [sistema binario](http://es.wikipedia.org/wiki/Sistema_binario), en donde cada dígito decimal es codificado con una secuencia de 4 [bits](http://es.wikipedia.org/wiki/Bit). Esto en cristiano, y para lo que nos interesa,  es que con un byte vamos a poder representar dos dígitos, desde 00 a 99. Usaremos por tanto 4 bits para cada dígito. Es decir, y poniendo ejemplos para los primeros 4 bits: - El 0 en binario se representa con 0 0 0 0 - El 1 en binario se representa con 0 0 0 1 - el 2 en binario se representa con 0 0 1 0 - el 3 en binario se representa con 0 0 1 1 y así sucesivamente hasta.. - el 8 en binario se representa con 1 0 0 0 - el 9 en binario se representa con 1 0 0 1 #### ¿ y el 10? Pues pasaremos el testigo (a llevada) a los siguientes 4 bits, poniendo a cero los primeros 4 bits. Puedes comprobar que no existe el número BCD 1 1 1 1  por poner un ejemplo. No se usan todos los que se podrían usar para codificar un número (como puede ser en un entero donde  1 1 1 1 es 127). En definitiva, se codifica en binario normal con esos 4 bits  hasta llegar al 9, a partir del cual ya no hay más. Para construir un número de 2 dígitos necesitamos otros 4 bits. Y así sucesivamente claro.  Espero que no te hayas quedado dormido, así que sigamos. ### Tratar y filtrar un número de 3 cifras Una vez  comprendido qué es un display de 7 segmentos, y qué es un número en BCD (gracias de nuevo a la wikipedia), vamos a tratar el siguiente punto, que es filtrar nuestro número para ir quedándonos con cada cifra. Para ello vamos a usar una operación AND. Pero no una cualquiera, sino una operación con palabra (WAND) #### Perdona, pero.. que ¿qué? Bien sabes lo que es hacer un AND entre dos bits: si ambos están a 1, el resultado es 1. Si no lo son, un rosco. Pues hacer un filtrado con un WAND no es mas que hacer lo mismo, pero en vez de con un bit, con 16. En AWL la operación WAND se llama UW. #### Vale. Más o menos lo pillo... pero ¿para qué? Aquí viene lo interesante: puedo filtrar (quedarme) con la parte de un WORD que yo quiera. ¿Cómo? Pues haciendo un WAND de mi palabra con una palabra donde los bits que me quiero quedar, son 1. #### Ya si eso, igual con un ejemplo... Imagina que tenemos una palabra, la MW0 cuyo valor en bits es: 0101 1101 1000 1101 Y quiero quedarme sólamente con los 4 primeros bits, los marcados en [azul Bilbao](http://debilbaodetodalavida.blogspot.com.es/2012/03/azul-bilbao.html)(la tierra tira). ¿Cómo lo hago? Pues muy sencillo. Hago un WAND de mi MWO con un 0000 0000 0000 1111 es decir, en [hexadecimal](http://es.wikipedia.org/wiki/Sistema_hexadecimal)W#16#000F o simplemente W#16#F Haciéndolo, lo que nos da como resultado es curiosamente todo ceros, salvo lo que queremos filtrar: 0000 0000 0000 1101 ¿Cómo se te ha quedado el cuerpo? Ahora viene lo mejor: como nuestro número está en BCD y cada 4 bits es un dígito, haciendo este tipo de filtrado, obtenemos nuestras unidades, decenas... en función de dónde pongamos el filtro.. ¿si? Pero hay una pega a solventar: después de nuestro éxito sin parangón filtrando las unidades queremos filtrar además las decenas, te vas a decir a ti mismo.. esto está chupado... el filtro será W#16#00F0 o W#16#F0 y mi resultado serán las decena... Pues lamentablemente, no. Si hacemos ese filtro, ojito lo que tendríamos: MW0          = 0000 0101 1000 0101 W#16#F0 = 0000 0000 1111 0000 WAND        = 0000 0000 1000 0000 Correcto, pero eso no es un 8, sino un 80 en BCD. #### Mmmmm y ¿cómo lo soluciono yo ahora? Tampoco es que estemos muy lejos de la solución ¿no? Sólo son unos cuantos ceros que nos sobran. Para eliminar esos ceros,y pasar nuesto 80 a un 8, que es lo que nos interesa, necesitamos... ### Desplazar los bits a la derecha Existen varias funciones de desplazamiento y rotación en Step 7. Hoy vamos a tocar sólamente 1, que es la de rotar X bits a la derecha. Otro día veremos más en profundidad tanto las rotaciones como el tema de las operaciones lógicas con palabras. Pero al grano: Tenemos nuestro 80 en BCD del cual nos queremos cepillar el cero... si fueramos capaces de eliminar los 4 bits iniciales, la cosa estaba hecha.. y como estos alemanes piensan en CASI todo, tenemos la operación SHR_W.. #### ¿Que es lo que hace la operación SHR_W? Pues resumiendo, desplazar los N bits que le indiquemos hacia la derecha (eliminando los que estaban) y metiendo O por la izquierda para completar la palabra. En nuestro caso, lo que va a hacer: Nuestra palabra sin rotar:  0000 0000 1000 0000 Nuestra palabra rotada    : 0000 0000 0000 1000 0000 Es decir, elimina los 4 bits que teníamos en marrón, desplazando el resto, introduciendo 4 flamantes y nuevecitos bits a cero por la izquierda. Pues ¡tachán! ya tenemos nuestro 80 en BCD convertido en  un 8 bien chulo (como no podía ser menos). #### ¿Y las centenas ? Estoy convencido que ahora ya sabrias hacer el resto. Como bien imaginas: - Filtrar con W#16#F00 - Girar 8 bits en vez de 4 para obtener las centenas.  Tú que estás al loro, seguro que te has dado cuenta de un pequeño detalle: Las centenas no hace falta filtrarlas, con girar los 8 bits es suficiente puesto que no hay cifras a la izquierda... pues sí. No hace falta porque es un número positivo ya que en caso de un número negativo los 4 bits más altos son todo unos . Por tanto, digamos que para estandarizar el procedimiento sería como lo comentado. ### Representación en un display de 7 segmentos  Una vez que tengamos cada dígito, tenemos que sacarlo en un display de 7 segmentos... ¿cómo? Habría dos formas: - Un codificador hardware de BCD a 7 segmentos (por ejemplo el 7447) - Codificar por software y dar la salida de los 7 segmentos. Lógicamente, y ya que estamos, pues lo codificamos nosotros ¿no? Para eso S7 disponone una función de codificación de un display de 7 segmentos , el FC93 "SEG" dentro de *Standard Library /TI-S7 Converting blocks* La descripción de la ayuda de Step 7 dice lo siguiente: La función "Crear el patrón de bits para el display de siete segmentos" (SEG) convierte los cuatro dígitos hexadecimales de una determinada palabra fuente (IN) en cuatro códigos equivalentes para hacer posible el display de siete segmentos, y escribe el resultado en la palabra doble de salida (OUT). #### ¿Una palabra a una doble? Piénsalo bien. Introducimos un word (16 bits), es decir, 4 dígitos en BCD. Si lo queremos sacar en 7 segmentos, necesitamos una doble palabra, o sea, 4 bytes, un byte por cada número de tal forma que cada bit ilumine una patita del display de 7 segmentos (sobrandonos un bit, que es de regalo). [Imagen: display 7 segmentos] El cuadro sería el siguiente: Como puedes ver, además de números como es el caso, podríamos representar caracteres en función de la activación de unos u otros bits según la codificación indicada. ### Un momento, ¡¡ tú me has estado tomando el pelo todo el rato !!... Un poco sí. Perdón. Me he equivocado. No volverá a suced... ejem. Como hemos dicho, la función SEG toma un valor en BCD de 16 bits y lo transforma en su salida binaria, volcándolo en 4 bytes, y por tanto, no hacía falta filtrar ni rotar absolutamente nada, simplemente con elegir el byte de las unidades, decenas, centenas y millares, hubiera bastado ¿no? Pues sí. Imaginemos que volcamos la información en el MD0, así tendremos MB0: Signo del número MB1: Centenas MB2:Decenas MB3: Unidades Ya. Pero no hubieras aprendido: - A usar en WAND - A desplazar bits. ...por no decir lo bien que lo hemos pasado... o ¿no? Mientras te baja la inflamación del cuello, si te apetece, puedes ver el resultado en el siguiente vídeo https://www.youtube.com/watch?v=MgU-x_s3Kpo Recuerda que el proyecto está disponible en exclusiva para todos aquellos que adquieren el libro [cómo programar Step 7 y no morir en el intento](https://programacionsiemens.com/como-programar-step-7/) además de muchos otros ejemplos. Referencias: - Wikipedia: Visualizador de  7 segmentos - Wikipedia: Decimal codificado en binario - Azul Bilbao --- # Periferia descentralizada por PROFIBUS: guía con ET200 > Periferia descentralizada por Profibus: aprende a configurar el hardware, las entradas y salidas remotas y cuándo conviene descentralizar tu máquina. Fuente: https://programacionsiemens.com/como-crear-un-proyecto-con-periferia-descentralizada · Autor: Iñigo Gútiez · Publicado: 2013-02-07 · Actualizado: 2013-02-07 · Categoría: Comunicaciones En la entrada de hoy vamos a ver cómo configurar el hardware en un proyecto en el que queramos instalar periferia descentralizada, sus entradas y salidas y ver algunas alternativas. Y antes de tirar un solo metro de cable, repasa las [3 normas del cableado PROFIBUS](https://programacionsiemens.com/3-normas-basicas-para-realizar-un-cableado-profibus): casi todos los fallos de red vienen de ahí. ### ¿Qué es descentralizar ? Normalmente, en proyectos donde la máquina no es excesivamente grande, el control de los actuadores y la lectura de los sensores se hacen desde un único PLC y todas las entradas llegan al cuadro eléctrico y las señales a los actuadores salen desde este. Cuando la máquina es más grande, no tanto en cuanto a las entradas y salidas sino físicamente, cobra sentido la descentralización, que consiste en leer o actuar en el mismo sitio (o cercano) de donde esta el sensor o el actuador. La idea es usar un bus de datos que comunique esta parte descentralizada con el núcleo, que será nuestro PLC. #### ¿Qué ganamos? Pues en primer lugar, ahorrarnos costes de instalación. Si los sensores están muy lejos, habrá que concentrarlos en armarios remotos, y de ahí tirar mangueras multihilos hasta el armario. El volumen de mangueras dentro del armario puede volver muy grande y confuso amén de tener un número ingente de bornas de conexión, que habrá que cablear doblemente: en campo y en el armario. El instalar periferia ahorra costes de instalación ya que hasta la zona donde se recolectan las señales sólo habrá que echar un cable de bus  (en nuestro caso Profibus, pero podría ser cualquier otro) y una manguera para las alimentaciones. ### ¿Qué podemos instalar como periferia? El listado de elementos es enorme y dudo mucho que nadie pueda realizar un listado completo de tooodos los elementos susceptibles de colocarlos como periferia, y tampoco es objeto de esta entrada listarlos. Pero aquí te dejo unos pocos: - Entradas y salidas digitales o analógicas - Encoders y potenciómetros - Variadores y arrancadores con motor - Grupos de electroválvulas - Elementos de medición de todo tipo (termómetros, polímetros, flujómetros, scanners ...) - Etc... Obviando elementos de campo más específicos, me voy a centrar en algunas alternativas que tenemos para poner en campo como entradas y salidas del entorno que nos ofrece Siemens... pero que quede muy muy muy, pero que muy claro: Siemens no me da un duro por esto, pero es con lo que suelo trabajar, así que te lo cuento.  Tampoco trato de que sea muy extenso ni en profundidad, sino dar un pequeño barniz de las alternativas que tenemos para conectar nuestras entradas y salidas. - ET200M - ET200S(P) - ET200eco/pro Son 3 estilos diferentes, cada una con sus particulariades. ### Periferia descentralizada ET200M Las ET200M son las periferias, que para entendernos, del estilo a la serie 300. De hecho las tarjetas de entradas y salidas de la serie 300 son las usadas en esta periferia. Tienen la ventaja de admitir, como todas las de la serie 300 muchas entradas y salidas en una misma tarjeta. Tiene la desventaja de ser bastante voluminosas si se quieren pocas señales además de tener que instalar bornas intermedias entre la periferia y el campo. Fastconnect Las características generales son: - Siseño modular con grado de protección IP20 - Necesitan una placa de montaje como todos los de la serie 300. - Máximo de 12 módulos de perfieria (con las interfaz denominada high feature,  de lo contrario son 8) - Admiten E/S hasta 64 digitales en una tarjeta, módulos de función y procesadores de comunicación de la gama S-300 - Admiten comunicación por profibus y profinet a través del módulo de interfaz - Admite sistema de conexión por tornillo o resorte, conectores pre-cableados o el sistema fast-connect No voy a entrar en muchas más cartacterísticas. Simplemente que te quedes con la idea de que son periferias conectadas por profibus/profinet con la pinta de la serie 300. Si quieres más información te dejo en las referencias  con la información de Siemens. ### Periferia descentralizada ET200S et200s Las periferias ET200S son periferias bastante diferentes a las anteriores, con sus pros y contras, como todo. Sus principales características son: - Tamaño muy pequeño comparativamente hablando con la ET200M - Se instalar sobre carril DIN. - No hacen falta bornas porque se pueden cablear directamente las mangueras de las señales a la periferia - Los módulos tecnológicos permiten realizar tareas de contaje y posicionamiento, así como de control por levas o regulación - Admite arrancadores de motores - Admite conexiones neumáticas - Admite seguridad positiva  a base de Simatic Safety Integrated Como podéis ver, la diferencia es sustancial. Como mayor desventaja está que si necesitas un número importante de E/S, el bastidor puede ser muyyy largo ya que el número de E/S que admite cada tarjeta es de 8,  nada tiene que ver con la típica tarjeta de 32 E/S de la serie 300. ### ET200eco/Pro ET200eco Para finalizar, vamos a ver el estilo ET200eco o ET200Pro. Estas si que son para campo... - IP65/66/67 - Módulos de 16 señales (8E+8S, 16E, 16S) - Compactos con conexión directa del sensor mediante conector M12 - Uso de conectores en T para conectar 2 E ó S en el mismo conector. - Admiten Profisafe Como veis la gran ventaja es que se emchufan los sensores y que tienen una protección IP elevada. Una cosa que a mi personalmente no me gusta es el tema de tener que conectar dos entradas a la misma boca usando una T, pero es cuestión de gustos supongo. ### ¿Cómo configuro todos estos módulos? Para  indicar qué módulos vamos a usar, como imaginarás vamos a usar el configurador de hardware. Algunas de las periferias de Siemens están instaladas pero otras deberemos instalarlas con paquetes adicionales como pueda ser por ejemplo el Drive ES para los variadores Micromaster. En el caso de tener equipos que no son de Siemens pero que los vamos a conectar por Profibus, necesitaremos el archivo GSD. #### ¿Qué es un archivo GSD? Un archivo GSD es un archivo de texto que contiene las características y las opciones de configuración del dispositivo al que representan. #### ¿Cómo se instalan? Para explicarlo sencillo: tenemos que importarlo en nuestra biblioteca de hardware. Para ello hay dos formas: - Importarlo desde un fichero suministrado por el fabricante (o sea, el archivo GSD) - Importarlo desde un proyecto que ya contenga la periferia en cuestión Para ello, desde el configuración de hardware iremos a la opción del menú *Herramientas -> Instalar archivos GSD. *Imaginativos estos alemanes, ¿eh? Se abrirá un diálogo con un desplegable del que puedes elegir entre instalarlo desde un archivo o desde un proyecto existente. Seleccionamos el GSD que deseemos y lo instalamos. Luego será cuestión de localizarlo en la biblioteca. Lo mejor es probar a buscarlo por su nombre (o parte) desde la parte superior donde pone buscar. Una vez instalado, ya podremos usarlo en nuestro proyecto dentro de las especificaciones de cada equipo en cuanto a las entradas y salidas. Para finalizar, os dejo con un pequeño video de cómo configurar nuestro proyecto importando y usando los archivos GSD. http://www.youtube.com/v/XG4CkY2HqEY?fs=1 Referencias: - Catálogo/brochure de la gama SIMATIC ET200 de Siemens. --- # DB en Step 7 - Operaciones (III) > DB en Step 7 al detalle: diferencias entre bloques de datos globales y de instancia, tipos de datos simples y compuestos y cómo almacenar valores. Fuente: https://programacionsiemens.com/db-en-step-7-operaciones-iii · Autor: Iñigo Gútiez · Publicado: 2012-12-31 · Actualizado: 2012-12-31 · Categoría: Programación PLC Los DB en Step 7  son unas herramientas muy potentes para el almacenamiento y tratamiento de datos, de ahí que tengas que aprender una serie de conceptos que te serán útiles a la hora de realizar tus proyectos. [Imagen: Trabajar con DB en Step 7] Los DB (Data Block)  pueden ser: - Globales - De instancia El acceso a los DB globales está pensado para que puedan ser usados desde cualquier parte del programa (desde un OB, FC o FB). En cambio, los DB de instancia están asociados a los Bloques de función FB y almacenan los valores de las variables estáticas usadas en estos FB. ### Tipos de datos de los DB en Step 7 Los tipos de datos que nos podemos encontrar y definir en los DB en STEP son de dos tipos: - Simples - Compuestos Los datos simples son los siguientes (con un ejemplo en su formato): - Bool:  True/False - Byte: B#16#A - Word: W#16#432 - DWord: DW#16#12300 - INT: 124 - DINT:  L#130000 - REAL:  0.45e+1 - S5TIME: S5T#2s - TIME:  T#1D5H - DATE: D#2012-12-24 - TIME_OF_DAY:TOD#11:34:15 - CHAR: 'B' Hay que decir que la asignación de memoria se hace por palabras. Esto implica que si definimos 3 bools se ocuparan 2 bytes. Si usamos un byte se ocuparan igualmente 2 bytes. Por tanto, si se van a definir bools es conveniente definir hasta completar la palabra dejando los que no vayamos a usar como libres para futuros posibles usos. Los datos compuestos son: - DATE_AND_TIME: DT#12-12-24-11:34:1.0 - STRING: 'Hola mundo' - ARRAY: Array[1..20] - STRUCT - UDT: UDT1 El uso de los datos simples es inmediato, pero en el caso de los compuestos, hay que hacer alguna consideración: - En el caso de los Strings habrá que definir su longitud de tal forma que la memoria reservada será mayor o menor según definamos cómo queremos que sea de largo. - Los arrays se usarán definiendo a posteriori de decir la longitud qué tipo de datos albergarán. Pueden ser datos simples o compuestos como por ejemplo otras estructuras. - Las estructuras no son un tipo propiamente ya que no almacenan información. Simplemente se indica la forma en la que se van a almacenar. Por ejemplo podremos crear un array de 10 posiciones de STRUCT y dentro de esta, almacenar un entero y un String[18] por poner un ejemplo de forma que cada posición del array tenga un número y un string. - Se pueden insertar UDT ya definidos con las precauciones que ya hemos comentado arriba. En la parte de definición al introducir un UDT sólo veremos que en el DB se reserva la memoria que ocupa el UDT. Si queremos ver las variables deberemos ponernos en modo visualizar datos. ### DB en Step 7 usando UDT Los archivos UDT (*User-defined  Data Type*) son unas plantillas que usaremos en los DB con los tipos de datos que vamos a usar. Y me explico: Imagina que tienes que realizar un proyecto en el cual vas a tener varias recetas cuyos datos los vas a almacenar en DB. La solución que  se te puede estar pasando por la cabeza es... bueno, hago el primero, lo copio y pego tantas veces como sea necesario o los genero a mano uno a uno (trabajo de chinos). Sería una solución aceptable si estás muy convencido de que esos datos van tener el mismo nombre dentro del DB. Imagina que has dejado algo de espacio con variables libres para futuros usos. Tendrías que ir cambiando a cada DB el nombre de la variable que acabas de modificar. Como ves no parece una solución fácil de mantener ni especialmente elegante. Para solventar este inconveniente existen los UDT. En los archivos UDT definiremos la estructura que queremos que tenga el DB. Luego, a la hora de añadir un DB, dentro de la pestaña de tipo, tendremos Globales, Instancia... y de tipo. Elegiremos el UDT que acabamos de crear. Igualmente podremos insertar dentro de un FB como parte de sus variables estáticas (y por tanto parte de su DB asociado) un UDT predefinido. A la hora de mantener los DB con el mismo UDT sólo tendremos que cambiar el UDT. Pero ojo, has de tener claro lo siguiente ya que conlleva un inconveniente grave: - El cambio de nombre en las variables de un UDT no afectará al funcionamiento de los DB creados. Asumiran los nuevos nombres y listo. - El cambio de la estructura (Una variable definida como Word pasarla a INT) sí afecta a los DB creados. Al cambiar la estructura, la estructura de los DB creados con los UDT no sólamente no se actualizan sino que además se pierde el valor simbólico de cada variable. Para solucionarlo has de destruir cada DB global y volverlo a generar. En el caso de los FB habrá que actualizar los accesos. Este grave problema hace que se deba saber muy bien de antemano cuál va a ser la estructura del DB. La forma de mitigar los efectos tan nocivos que puede acarrear el cambio de estructura es la siguiente: - En el UDT dejar variables que creas que pueden ser útiles en el futuro como libres de reserva. Esto implica que el DB va a ser más grande de lo necesario de forma artificial para posibles problemas en el futuro. A decir verdad, no suele ser un gran problema por dejar espacio sobrante de cara al futuro. - Incrustar el UDT dentro del DB. Es decir, en vez de declarar el DB de tipo, lo usas de forma global y dentro de el declaras una variable de tipo UDT1 (suponiendo que tu UDT sea el UDT1). De esa forma, el DB reserva el espacio al UDT y al cambiar la estructura del UDT, el DB no se ve afectado. ### Abrir y hacer llamadas a los  DB en Step 7 Dentro de cualquiera de los bloques que usemos podemos realizar llamadas al contenido de los DB. Así podemos cargar cualquier valor haciendo una llamada absoluta del tipo: - U DB100.dbx0.0 para cargar el valor del bit 0.0 del DB100 - L DB100.dbb0 para cargar el byte 0 del DB100 - L DB100.dbw0 para cargar la palabra 0 del DB100 - L db100.dbd0 para cargar la doble palabra 0 del db100 Hay otra foma de hacer las lecturas que es mediante la apertura del DB y luego hacer las llamadas, así podríamos hacer como en el caso anterior: - AUF DB100 - U dbx0.0 para leer el bit 0.0 del DB abierto. Esto nos será muy útil para cuando veamos el direccionamiento indirecto. Hay una segunda forma de abrir un DB que es, haciendo la analogía: - AUF DI100 - U dix0.0 para leer el bit 0.0 del DB abierto. - L DIB0 para cargar el byte 0 del DB abierto - L DIW0 para cargar la palabra 0 del DB abierto - L DID0 para cargar la doble palabra 0 del DB abierto  Se pueden combinar las llamadas de la apertura DB y DI de tal forma que podemos tener 2 DB abiertos. Pero ojo, debes tener en cuenta una cosa. Si abres un DB y luego haces una llamada de forma absoluta a otro DB, el que queda abierto ya no es el DB que inicialmente habías abierto con el AUF sino el último del que has hecho una llamada absoluta. Me explico: imaginate que tienes dos DB, el DB1 y el DB2. El primero contiene un entero con valor 5 y el DB9 un entero de valor 9. Si haces esto: - AUF DB1 - L DBW0 - T MW 0 - L DB2.DBW0 - TMW2 El valor de la MW0 será 5 y el valor de MW2 será 9. Ahora bien, si haces esto: - AUF DB1 - L DB2.DBW0 - T MW2 - L DBW0 - T MW 0 Ahora, tanto MW0 como MW2 valdrán 9 ya que cuando haces la llamada L DBW0 último DB abierto no es el DB1, sino el DB2. Ojo con esto. Igualmente puedes tener problemas si haces un AUF y antes de tomar y asignar valores, se hace una llamada a un FC el cual hace una consulta a otro DB. Por tanto, entre las aperturas mediante AUF y su consulta no debe haber ninguna llamada a un DB. Lo que sí podrás hacer, siguiendo con el ejemplo anterior será algo de este estilo: - AUF DB1 - AUF DI2 - L DIW0 - T MW2 - L DBW0 - T MW 0 Ahora sí MW0 = 5 y MW2 = 9 ya que estás abriendo  un DB mediante AUF DB y AUF DI respectivamente y por tanto no se mezclarán entre sí. En próximas entradas veremos cómo usar los DB mediante el direccionamiento indirecto y los punteros. Con ello podremos realizar acciones muy potentes dentro de lo que son los tratamientos de datos y DB en Step 7. Finalmente he realizado un video (un poco largo, así que con paciencia) donde repaso todos estos conceptos. https://www.youtube.com/watch?v=rHFaMRc4iCo Recordarte finalmente que si estás interesado en formarte en Step 7, puede que te interese adquirir el libro *"Cómo programar en Step 7 y no morir en el intento"* donde puedes encontrar no sólamente el curso completo gratuito, sino muchas más entradas del blog que como sabes [se irán actualizando para los que lo adquieran de forma gratuita](https://programacionsiemens.com/curso-en-pdf-de-step-7-v5-x/). Si estás interesado,[puedes echarle un vistazo a este enlac](https://programacionsiemens.com/como-programar-step-7/)e donde se explica qué es lo que contiene el libro, el precio y los métodos de pago.  Referencias: - Bloques de datos - Programación avanzada en infoplc.net