Guías prácticas HMIx
Cómo crear un SVG dinámico (SVGHMI) para WinCC Unified y V8: guía paso a paso, manual o con IA
Un SVG dinámico (archivo .svghmi) es un dibujo vectorial que cambia de aspecto según un valor de la pantalla: un tanque que se llena, una válvula que cambia de color… En esta guía adaptarás un tanque horizontal real, lo importarás en TIA Portal y verás subir y bajar el líquido en Runtime, sin PLC. Al final verás cómo crear tus propios SVG dinámicos con el generador de IA de HMIx.
- Siemens
- SVG dinámico
- SVGHMI
- Dynamic widgets
- WinCC Unified
- WinCC V8
- TIA Portal
- IA
- Generador AI

La ruta completa de un vistazo
- Descarga
HmixHorizontalTank.svghmiy ábrelo en un editor de texto - Cambia el nivel inicial de
FillLevel - Cópialo en
UserFiles\SVGControlsdel proyecto - Arrástralo desde Widgets dinámicos a la pantalla
- Enlaza
FillLevela la variableTankLevely pruébalo en Runtime
Qué necesitas
- TIA Portal con WinCC Unified (aquí, V21.1) y su simulación o Unified PC Runtime
- Un editor de texto, como Visual Studio Code o Notepad++
- Nada más: ni PLC, ni JavaScript, ni programas de dibujo
La preparación de los archivos es común a WinCC Unified y WinCC V8. Los pasos de importación y prueba se muestran en TIA Portal / WinCC Unified V21.1 (los nombres de menú en inglés van entre paréntesis). En WinCC V8 se trabaja con Graphics Designer: comprueba las funciones disponibles en tu instalación.
Qué es un SVG dinámico (SVGHMI) y para qué sirve
Piensa en el dibujo de un tanque en la pantalla de una máquina. Una imagen normal siempre muestra el mismo nivel. Un SVG dinámico permite que el líquido suba y baje según un número, con el mismo dibujo. También sirve para indicar si una válvula está abierta, cambiar el color de un motor o mostrar una pieza solo cuando hace falta.
SVG es un formato de imagen hecho de formas y líneas, por eso se puede ampliar sin pixelarse. Para que WinCC Unified pueda cambiar partes del dibujo, el archivo declara unas entradas llamadas parámetros y se guarda con la extensión .svghmi. En TIA Portal aparece en la paleta Widgets dinámicos (Dynamic widgets).
Un parámetro es un ajuste que el autor deja disponible. En este tanque se llama FillLevel y acepta un número de 0 a 100: con 50, el líquido llega a media altura. Más adelante lo conectarás a TankLevel, una variable HMI: el lugar donde el proyecto guardará el número que escribas. Son dos nombres distintos porque uno pertenece al dibujo y el otro al proyecto.
Un mismo dibujo puede mostrar distintos estados
Cambiar el nivel
Un número de 0 a 100 decide hasta qué altura se dibuja el líquido.
FillLevel = 25
FillLevel = 75
Cambiar un color
Un parámetro de color puede cambiar el relleno, por ejemplo, para distinguir dos líquidos.
Color de líquido A
Color de líquido B
Mostrar u ocultar una pieza
Un parámetro de visibilidad puede enseñar u ocultar las conexiones del tanque.
Con conexiones
Sin conexiones
Cada recurso tiene sus propios parámetros. La descarga de esta guía incluye solo FillLevel. Los ejemplos de color y visibilidad del esquema muestran otras posibilidades de los SVG dinámicos; no son ajustes de este archivo.
En HMIx puedes descargar cientos de recursos HMI gratuitos. Empieza con un control del catálogo o describe tu idea al generador de IA de HMIx para crear un recurso que puedas adaptar a tu proyecto.

Siemens · Creación de gráficos SVG dinámicos (109782045)Siemens · Gestión de gráficos SVG dinámicosSiemens · Gráficos SVGHMI en WinCC V8
Prepara el archivo y una pantalla de prueba (5 minutos)
Necesitas TIA Portal con WinCC Unified (los pasos se muestran en V21.1) y su simulación o Unified PC Runtime, el programa que ejecuta la pantalla. Usarás una variable interna, que vive dentro de la HMI, así que no hace falta un PLC.
Activa en Windows la opción de ver las extensiones de archivo (Explorador → Vista → Mostrar → Extensiones de nombre de archivo). Así verás si el archivo termina realmente en .svghmi y no en .svghmi.txt, el error más habitual al guardarlo.
El archivo que usaremos
Descarga esta base para seguir la guía con los mismos nombres y valores.
Descargar el tanque para seguir la guíaUn único archivo HmixHorizontalTank.svghmi, con FillLevel de 0 a 100 y valor inicial 50. Estructura y cálculos revisados; la importación y ejecución en WinCC Unified V21.1 deben comprobarse en tu entorno.
Dónde · Explorador de archivos → carpeta de trabajo
Descarga el tanque y guarda una copia de trabajo
Descarga
HmixHorizontalTank.svghmicon el botón de este apartado. Es un único archivo: no hay que descomprimir nada. Guarda el original y copia el archivo en una carpeta llamadaMiTanque. Abre la copia con un editor de texto, como Visual Studio Code o Notepad++ (clic derecho → Abrir con). Verás texto porque el dibujo se describe con instrucciones que se pueden editar.Comprueba: Tienes abierto
MiTanque\HmixHorizontalTank.svghmien el editor.Dónde · TIA Portal → dispositivo Unified → Imágenes (Screens)
Deja preparada la pantalla donde lo vas a colocar
Abre o crea un proyecto de prueba con un dispositivo WinCC Unified. Crea una pantalla vacía llamada
PruebaTanquey guarda el proyecto. Anota dónde está su carpeta: por defecto,Documentos\Automation\<NombreDelProyecto>.Comprueba: Tienes el archivo del dibujo en el editor y la pantalla
PruebaTanqueen TIA Portal, y sabes dónde está la carpeta del proyecto.
Antes de continuar
Localizas el archivo descargado, la pantalla vacía y la carpeta del proyecto. Todavía no hace falta crear variables.
Crea tu variante: entiende el dibujo y cambia su nivel inicial
El tanque tiene tres partes: un cuerpo fijo, un rectángulo azul que representa el líquido y un recorte con la forma interior del tanque. El recorte funciona como una plantilla: oculta lo que sobresale. Al cambiar el nivel, solo cambia la parte visible del líquido.
Si dibujas un recurso desde cero, crea primero las piezas en un editor vectorial y guárdalo como SVG; después añade la parte HMI (parámetros y enlaces) con un editor de texto, como en este ejemplo. Renombrar un .svg a .svghmi no lo hace dinámico. Aquí ya tienes las piezas dibujadas y vas a adaptar su comportamiento.
Dónde · Editor de texto → buscar (Ctrl+F)
id="liquid"Localiza la parte que va a cambiar
Busca
id="liquid": es el rectángulo que representa el líquido. El cuerpo y los soportes están en otras líneas y no cambian. El grupo que lo contiene usaclip-path, el recorte que impide que el azul salga del contorno redondeado.Cómo se construye el tanque por capas
Dibujo fijo
El cuerpo, los soportes y las conexiones no cambian cuando sube el nivel.
Rectángulo de líquido
Cambian su altura y la posición de su borde superior. La base permanece abajo.
Recorte interior
Solo deja ver el líquido dentro del contorno redondeado del tanque.
Las capas forman un solo gráfico
FillLevel = 50
El líquido llega a media altura y queda recortado en los extremos. El cuerpo y los soportes conservan su forma.
FillLevel representa la altura del líquido: 50 significa la mitad de la altura interior. En un tanque horizontal, altura y volumen no tienen una relación lineal. Comprueba: Sabes qué parte es el líquido y por qué puede crecer sin salirse del tanque.
Dónde · Editor de texto → buscar
hmi:paramDefEncuentra el parámetro y cambia su valor inicial
Cerca del principio, dentro de
<hmi:self>, está la línea que declaraFillLevel.type="number"indica que recibe un número ydefault="50"fija su valor inicial. Cambia solodefault="50"pordefault="25". No cambies el nombreFillLevel: es el que verás en TIA Portal.Comprueba: Tu variante hará que cada tanque nuevo empiece al 25 % de altura, en lugar del 50 % original.
Dónde · Editor de texto → volver a
id="liquid"Sigue la conexión entre el número y el líquido
En el rectángulo hay dos enlaces:
hmi-bind:heightcambia la altura del líquido yhmi-bind:ymueve su borde superior; juntos mantienen el fondo fijo. Ambos usanSafeLevel, un valor calculado enhmi:localDefconConverter.Bounds, que limitaFillLevelentre 0 y 100. Así, aunque llegue 140 o −20, el líquido nunca se sale del tanque. No toques estas líneas.Comprueba: Entiendes el recorrido completo: el parámetro recibe un número y los enlaces lo convierten en una altura visible.
Dónde · Editor de texto → Guardar
Guarda el archivo con su extensión completa
Guarda los cambios (Ctrl+S) con codificación UTF-8, conservando el nombre
HmixHorizontalTank.svghmi. Comprueba en el Explorador que no termina en.svghmi.txt. No abras ni guardes este archivo con un programa de dibujo genérico: podría eliminar los atributoshmi:yhmi-bind:que lo hacen dinámico.Comprueba: Tienes un
.svghmicon el dibujo, su parámetro y los enlaces entre ambos, listo para TIA Portal.
En este ejemplo el porcentaje expresa la altura del líquido. En un tanque horizontal, un 25 % de altura no equivale a un 25 % de volumen: para mostrar litros haría falta una conversión según la geometría del depósito.
Ver el código del ejemplo
Opcional: la descarga contiene el ejemplo completo. No necesitas escribir este código para seguir la prueba.
HmixHorizontalTank.svghmi
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//SIEMENS//DTD SVG 1.0 TIA-HMI//EN" "http://tia.siemens.com/graphics/svg/1.8/dtd/svg18-hmi.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:hmi-bind--xlink="http://svg.siemens.com/hmi/bind/xlink/"
xmlns:hmi="http://svg.siemens.com/hmi/"
xmlns:hmi-bind="http://svg.siemens.com/hmi/bind/"
xmlns:hmi-element="http://svg.siemens.com/hmi/element/"
xmlns:hmi-feature="http://svg.siemens.com/hmi/feature/"
xmlns:hmi-event="http://svg.siemens.com/hmi/event/"
width="400" height="250" viewBox="0 0 400 250" preserveAspectRatio="xMidYMid meet">
<hmi:self type="widget" displayName="HMIx Horizontal Tank"
name="extended.HmixHorizontalTank" version="1.0.0">
<hmi:paramDef name="FillLevel" type="number" default="50" />
</hmi:self>
<defs>
<hmi:localDef name="SafeLevel" type="number"
hmi-bind:value="{{ Converter.Bounds(ParamProps.FillLevel, 0, 100) }}" />
<linearGradient id="steel" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#7f949f" />
<stop offset="0.28" stop-color="#edf3f5" />
<stop offset="0.52" stop-color="#bdcbd1" />
<stop offset="1" stop-color="#667d88" />
</linearGradient>
<linearGradient id="water" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#4cc4df" />
<stop offset="1" stop-color="#176184" />
</linearGradient>
<clipPath id="inside"><rect x="40" y="60" width="320" height="120" rx="60" /></clipPath>
</defs>
<!-- One parameter changes liquid height, not volume percentage. -->
<path d="M100 170L90 220H130L120 170M280 170L270 220H310L300 170" fill="#405866" stroke="#273d49" stroke-width="2" />
<path d="M86 224H134M266 224H314" stroke="#607987" stroke-width="8" />
<rect x="180" y="43" width="40" height="17" rx="3" fill="url(#steel)" stroke="#546e7a" />
<rect x="175" y="54" width="50" height="8" rx="2" fill="#adbec7" stroke="#546e7a" />
<rect x="40" y="60" width="320" height="120" rx="60" fill="url(#steel)" />
<g clip-path="url(#inside)">
<rect id="liquid" x="40" y="120" width="320" height="60" fill="url(#water)"
hmi-bind:height="{{ LocalProps.SafeLevel * 1.2 }}"
hmi-bind:y="{{ 180 - LocalProps.SafeLevel * 1.2 }}" />
<path d="M120 60V180M280 60V180" stroke="#254b60" stroke-opacity="0.22" stroke-width="2" />
<path d="M55 78H345" stroke="#ffffff" stroke-opacity="0.28" stroke-width="8" />
</g>
<rect x="40" y="60" width="320" height="120" rx="60" fill="none" stroke="#546e7a" stroke-width="2" />
<rect x="354" y="109" width="14" height="28" rx="2" fill="url(#steel)" stroke="#546e7a" />
<path d="M369 115V131" stroke="#8ea5b1" stroke-width="6" />
</svg>
Antes de continuar
Has cambiado una sola cosa: el valor inicial de FillLevel, de 50 a 25. El nombre del archivo y el del parámetro siguen siendo los mismos.
Importa el SVG dinámico en TIA Portal
TIA Portal busca los SVG dinámicos de cada proyecto en una carpeta concreta y los muestra en la paleta Widgets dinámicos, desde donde se arrastran a la pantalla.
Dónde · Explorador de archivos → carpeta de tu proyecto TIA
Copia el archivo en la carpeta del proyecto
En la carpeta del proyecto, entra en
UserFiles(créala si no existe). Dentro, creaSVGControlssi todavía no existe y copia allí tu archivo modificado. El destino es la carpeta del proyecto, no la de instalación de Siemens.Dónde guardar el archivo del tanque
Dentro de la carpeta de tu proyecto
Tu proyecto/UserFiles/SVGControls/HmixHorizontalTank.svghmi
Crea SVGControls si todavía no existe y copia aquí el archivo.
Después, en el editor de pantallas
Actualiza la paleta Widgets dinámicos de la task card Herramientas y arrastra el tanque a una pantalla del dispositivo Unified.
Conserva el nombre y la extensión completos: HmixHorizontalTank.svghmi. Un SVG dinámico se copia como archivo suelto, sin ZIP. Comprueba: La ruta termina en
UserFiles\SVGControls\HmixHorizontalTank.svghmi.Dónde · TIA Portal →
PruebaTanque→ Herramientas (Tools) → Widgets dinámicos (Dynamic widgets)Actualiza la paleta y arrastra el tanque
Con la pantalla abierta, despliega Widgets dinámicos en la task card Herramientas y pulsa su botón de actualizar. Busca el tanque —se identifica como HMIx Horizontal Tank o por el nombre del archivo, HmixHorizontalTank— y arrástralo a la pantalla. Si no aparece, revisa la ruta del paso anterior antes de continuar.
Comprueba: Tienes una instancia del tanque en
PruebaTanque.Dónde · Tanque seleccionado → ventana de inspección → Propiedades
Comprueba el parámetro antes de conectarlo
Con el tanque seleccionado, busca
FillLevelen sus propiedades (puedes escribirlo en el buscador de la ventana de inspección). Su valor inicial debe ser 25 si hiciste el cambio, o 50 si importaste el original. Escribe un valor fijo de 50 y confirma: el líquido debe quedar a media altura en el editor de pantallas.Comprueba: El dibujo responde a un valor fijo: el archivo funciona antes de añadir ninguna variable.
Antes de continuar
Ves el tanque y encuentras FillLevel en sus propiedades. Si falta ese parámetro, revisa el archivo antes de pasar a la prueba dinámica.
Siemens · Gestión de gráficos SVG dinámicosSiemens · Actualización de SVG dinámicos
Conecta una variable y haz que el tanque se llene en Runtime
Hasta ahora el nivel era un valor fijo. Ahora lo conectarás a una variable que podrás cambiar con la pantalla en marcha: un campo E/S (entrada/salida) escribirá en TankLevel y el tanque leerá esa misma variable a través de FillLevel. No necesitas JavaScript.
Primero, observa qué debería ocurrir
Prueba el nivel aquí antes de configurarlo en TIA Portal: mueve el deslizador y observa cómo cambia solo la altura del líquido.
Dónde · TIA Portal → dispositivo Unified → Variables HMI (HMI tags)
Crea la variable que guardará el nivel
Abre la tabla de variables estándar y añade
TankLevel. En la columna Conexión (Connection) elige «Variable interna» (Internal tag) y como tipo de datos uno numérico, por ejemploReal.Comprueba: Tu proyecto tiene la variable
TankLevel; el archivo SVG sigue teniendo el parámetroFillLevel.Dónde ·
PruebaTanque→ tanque seleccionado → propiedadFillLevelEnlaza el parámetro del tanque a esa variable
En la columna Dinamización (Dynamization) de
FillLevel, elige Variable (Tag) y seleccionaTankLevel. Con esto sustituyes el valor fijo de 50 por el valor actual de la variable.Del número que escribes al nivel que ves
Escribes 50 en el campo E/S
- Valor
- 50
El campo de entrada/salida sirve para introducir un número durante la prueba.
La variable HMI guarda 50
- TankLevel
- 50
TankLevel es una variable interna. Puedes probarla sin conectar un PLC.
El parámetro FillLevel recibe 50
- FillLevel
- 50
En las propiedades del tanque, enlaza FillLevel a TankLevel.
El líquido llega a media altura
50%
Prueba después con 0 y con 100 para comprobar los dos extremos.
El campo E/S y FillLevel comparten la variable TankLevel. Al cambiar el campo en Runtime, el tanque recibe el nuevo valor y cambia la altura del líquido. Comprueba:
FillLevelobtiene su valor deTankLevel.Dónde · Herramientas → Elementos (Elements) → Campo E/S (I/O field)
Añade un campo donde escribir el nivel
Arrastra un campo E/S junto al tanque. Elige el modo Entrada/salida (Input/output) y enlaza su Valor de proceso (Process value) a
TankLevel, la misma variable. Si quieres, añade al lado el texto «Nivel, 0–100 %».Comprueba: El tanque y el campo numérico usan
TankLevel, así que el número que escribas se reflejará en el dibujo.Dónde · TIA Portal → árbol del proyecto → dispositivo HMI
Compila, abre Runtime y prueba 0, 50 y 100
Haz clic derecho en
PruebaTanquey elige Definir como imagen inicial. Compila el dispositivo HMI (clic derecho → Compilar → Software), corrige los errores y pulsa Iniciar simulación o carga tu Unified PC Runtime. Inicia sesión en el cliente web con un usuario del proyecto (si no tienes ninguno, créalo en Ajustes de seguridad → Usuarios y roles con un rol HMI y vuelve a compilar). Escribe 0 en el campo E/S y pulsa Intro; repite con 50 y con 100.Comprueba: Con 0 no se ve líquido, con 50 llega a media altura y con 100 llena el interior. El contorno y los soportes no se mueven.
El deslizador de esta página solo ilustra el comportamiento esperado. No controla tu proyecto de TIA Portal ni sustituye la prueba en Runtime.
Antes de continuar
El campo E/S y el tanque muestran el mismo nivel. Recarga la página del cliente (F5) y comprueba que el dibujo sigue reflejando el valor actual de TankLevel.
Si algo no coincide: síntomas y soluciones
- No aparece en Widgets dinámicos: comprueba que el archivo está en
UserFiles\SVGControlsdel proyecto abierto y que termina en.svghmi(no en.svghmi.txt). Pulsa actualizar en la paleta; si sigue sin aparecer, compara el principio del archivo con la descarga original. - El tanque aparece, pero no encuentras
FillLevel: comprueba que lo insertaste desde Widgets dinámicos. Un SVG importado como gráfico normal no tiene parámetros. - El valor fijo funciona, pero el campo E/S no mueve el líquido: revisa que el campo y
FillLevelusan la misma variableTankLevely que el campo está en modo Entrada/salida. Confirma cada número con Intro. - No puedes entrar en Runtime: el cliente pide un usuario del proyecto. Créalo en Ajustes de seguridad → Usuarios y roles con un rol HMI, compila y vuelve a cargar.
- No ves tu cambio de 50 a 25: revisa qué copia guardaste en
SVGControls. Actualiza la paleta y prueba con una instancia nueva: una instancia existente conserva el valor que ya tenía configurado. - Se ve distinto que en el navegador: WinCC Unified admite un subconjunto de SVG. Usa formas y efectos admitidos y revisa el resultado en el dispositivo de destino.
Cuando esta prueba funcione, puedes ampliar tu SVG con parámetros de color (HmiColor) o de visibilidad (boolean). Para reutilizarlo en faceplates, consulta el procedimiento de Siemens para crear un tipo de SVG dinámico en una biblioteca.
Siemens · Actualización de SVG dinámicosSiemens · Formato SVG admitido y restriccionesSiemens · SVG dinámicos como tipos de biblioteca
Atajo: crea tus SVG dinámicos con IA
Dibujar un equipo industrial y escribir a mano sus enlaces hmi-bind lleva tiempo. El generador de IA de HMIx (ai.hmix.tech) crea SVG dinámicos para WinCC Unified y V8 a partir de una descripción o de una imagen de referencia: dibuja el símbolo o el equipo, propone los parámetros (nivel, colores, visibilidad, giro) y genera el archivo .svghmi. Puedes empezar gratis con el plan Community.
Lo aprendido aquí sigue siendo útil: la importación desde UserFiles\SVGControls, el enlace de parámetros a variables y la prueba en Runtime son idénticos.
Dónde · ai.hmix.tech → SVG dinámico
Describe el gráfico que necesitas
Indica el equipo, la vista y los estados, por ejemplo: «Tanque horizontal de acero inoxidable, vista frontal, nivel de líquido 0–100 % y color del líquido configurable». Elige si quieres un símbolo esquemático (P&ID) o un equipo detallado.
Comprueba: La IA dibuja una primera versión que puedes retocar por chat o en el editor vectorial.
Dónde · Generador → pasos de definición y simulación
Revisa los parámetros y la simulación
Comprueba los parámetros propuestos (por ejemplo, un nivel como
FillLevel) y muévelos en la simulación para confirmar que el líquido sube desde el fondo y no se sale del contorno.Comprueba: El dibujo responde en la simulación como esperas.
Dónde · Generador → paso de generación e instalación
Descarga el archivo .svghmi
Descarga el
.svghmigenerado. Es un único archivo, igual que el de esta guía.Comprueba: Tienes un
.svghmilisto para copiar enUserFiles\SVGControls.Dónde · TIA Portal → Widgets dinámicos
Impórtalo y pruébalo como aquí
Sigue los apartados «Importa el SVG dinámico en TIA Portal» y «Conecta una variable» con los nombres de tus parámetros.
Comprueba: Tu SVG generado con IA cambia en Runtime con tus variables.
En el plan gratuito los recursos generados se publican en el catálogo de HMIx para que otros usuarios también puedan usarlos; los planes de pago permiten mantenerlos privados.
Antes de continuar
La IA acelera el dibujo y los enlaces, no sustituye la prueba: valida siempre el resultado en Runtime y en el dispositivo de destino.
Preguntas frecuentes
¿Qué diferencia hay entre FillLevel y TankLevel?
FillLevel es el parámetro definido dentro del dibujo (hmi:paramDef). TankLevel es la variable que guarda el número en tu proyecto HMI. Al enlazarlas en TIA Portal, el dibujo recibe ese número y cambia la altura del líquido.
¿Puedo cambiar el color desde las propiedades de este ejemplo?
Esta descarga solo expone FillLevel; sus colores están fijados dentro del archivo. Para cambiarlos desde TIA Portal habría que añadir un parámetro de tipo HmiColor y enlazarlo al relleno con Converter.RGBA, elegir un recurso del catálogo que ya lo incluya o generarlo con la IA de HMIx.
¿Basta con cambiar la extensión de un SVG a .svghmi?
No. El archivo debe declarar los parámetros (hmi:paramDef dentro de hmi:self) y los enlaces hmi-bind que los relacionan con el dibujo. El ejemplo descargable ya contiene ambas partes.
¿Puedo crear un SVG dinámico con IA?
Sí. El generador de IA de HMIx (ai.hmix.tech) crea SVG dinámicos (.svghmi) para WinCC Unified y V8 a partir de una descripción o una imagen: dibujo, parámetros y enlaces. Después lo importas y lo pruebas como explica esta guía.
¿Necesito un PLC o programar JavaScript?
No para esta prueba. El nivel se guarda en una variable interna de la HMI y las expresiones incluidas en el SVG cambian el dibujo. Sí necesitas TIA Portal con WinCC Unified y su simulación o Unified PC Runtime.