TiaCommander

Servidor MCP para Siemens TIA Portal: programación de PLC asistida por IA, configuración de hardware, referencias cruzadas e implementación a través de la API Openness. 16 herramientas, 166 acciones.

Documentación

TiaCommander — Servidor MCP para Siemens TIA Portal

Versión3.42.0
ProtocoloMCP 2024-11-05 (stdio)
Runtime.NET Framework 4.8
TIA PortalV17 – V20 (API Openness, probado en V19)
LicenciaPropietaria (beta gratuita)

Novedades en esta versión: una nueva herramienta technology_objects — 15 acciones para listar y leer objetos tecnológicos, cambiar parámetros, ediciones estructurales, exportar/importar y conectar un objeto a su hardware; credenciales PLC por proyecto con una nueva pestaña de Credenciales en el Administrador — la contraseña propia del proyecto se prueba primero, y una global es el respaldo; sobrescrituras transaccionales de bloques — el bloque se exporta antes de la importación y se restaura si la importación falla, y las sobrescrituras ya no pierden atributos, números de bloque ni ubicación en carpetas; y resultados del compilador que listan solo diagnósticos reales, por lo que los totales siempre coinciden con el conteo del propio compilador. Docenas de correcciones y mejoras desde v3.15.2 — consulte CHANGELOG.md para la lista completa.

*V17 a V20 son compatibles para trabajo con proyectos. V16 y versiones anteriores se detectan y se rechazan con un mensaje claro. Solo V19 está completamente probado; se espera que los demás funcionen, ya que TIA Portal mantiene APIs Openness compatibles con versiones anteriores.


Descripción general

TiaCommander es un servidor MCP que conecta asistentes de IA a Siemens TIA Portal mediante la API Openness. Permite programación de PLC asistida por IA, gestión de proyectos, operaciones con bibliotecas, configuración de hardware, análisis de referencias cruzadas y despliegue, todo a través de lenguaje natural.

Clientes de IA probados: Claude Desktop, Claude Code, VS Code (Copilot), Cursor, Windsurf, Codex CLI, Gemini CLI.

19 herramientas, 230 acciones que cubren todo el ciclo de vida del proyecto en TIA Portal.

HerramientaQué hace
adminAdministración del servidor, estadísticas de uso, almacenamiento de exportaciones
alarm_textTextos de alarma y listas de textos, importación / exportación XLSX
blocks_readLeer, inspeccionar y exportar bloques FB / FC / OB / DB (XML, SCL)
blocks_writeCrear e importar bloques (SCL, LAD, FBD, STL)
dbMiembros y valores de bloques de datos globales y de instancia
diagnosticsConfiguración de conexión, comparación online / offline, estado del PLC
download_uploadDescarga al / carga desde el PLC con verificación de compilación
foldersNavegar y organizar los grupos del árbol del proyecto
get_infoCapacidades y versión del servidor
hardwareConfiguración de dispositivos, rack / slot, red y E/S
libraryCopias maestras, tipos de biblioteca, instanciación versionada
live_dataValores en vivo y diagnósticos de CPU desde el controlador en ejecución
open_managerAbrir la ventana del Administrador de TiaCommander
sessionAbrir, guardar, archivar y cambiar de proyecto; ciclo de vida de la conexión
tagTablas de etiquetas PLC: crear, editar, buscar, asignación de direcciones
technology_objectsEjes y otros objetos tecnológicos: leer, ajustar, conectar al hardware
udtTipos definidos por el usuario: crear, editar miembros, importar / exportar
watchTablas de observación y forzado
xrefReferencias cruzadas: llamadores, bloques no utilizados, DB de instancia huérfanos

¿Qué incluye la descarga?

TiaCommander-v3.42.0-portable/
├── bridge/                              ← Live PLC data helper (S7CommPlus / TLS)
│   ├── libcrypto-3-x64.dll
│   ├── libssl-3-x64.dll
│   ├── S7CommPlusDriver.dll
│   ├── TiaCommander.S7Bridge.exe
│   ├── TiaCommander.S7Classic.dll
│   └── zlib.net.dll
├── data/
│   └── exports/                         ← Export output folders
│       ├── alarm_text/
│       ├── hardware/
│       ├── tag/
│       └── watch/
├── docs/
│   ├── configs/
│   │   ├── claude_code.txt
│   │   ├── claude_desktop_config.json
│   │   ├── codex_cli_config.toml
│   │   ├── cursor_mcp.json
│   │   ├── gemini_cli_settings.json
│   │   ├── generic_stdio.json
│   │   ├── vscode_copilot_mcp.json
│   │   └── windsurf_mcp_config.json
│   ├── 1-QUICKSTART.md
│   ├── KNOWN_LIMITATIONS.md
│   ├── LICENSE.txt
│   ├── README.md
│   └── THIRD-PARTY.md
├── help/
│   ├── github-offline.html
│   └── readme-offline.html
├── licenses/                            ← Full third-party licence texts
│   ├── Apache-2.0.txt
│   ├── BSD-3-Clause.txt
│   ├── GPL-3.0.txt
│   ├── LGPL-3.0.txt
│   ├── Microsoft-WebView2-SDK.txt
│   ├── MIT.txt
│   └── Polyform-Noncommercial-1.0.0.txt
├── Resources/
│   ├── logoBlack.png
│   └── tiacommander.png
├── runtimes/                            ← WebView2 native loaders
│   ├── win-x64/native/WebView2Loader.dll
│   ├── win-x86/native/WebView2Loader.dll
│   └── win-arm64/native/WebView2Loader.dll
├── Templates/                           ← Block XML, alarm & diagnostics templates
│   ├── diagnostics/
│   │   ├── TC_Diag_1200.xml
│   │   └── TC_DiagOB.xml
│   ├── Fb.xml
│   ├── Fc.xml
│   ├── GlobalDb.xml
│   ├── Ob.xml
│   ├── Ob_FBD.xml
│   ├── Ob_LAD.xml
│   ├── Ob_SCL.xml
│   └── TextListTemplate.xlsx
├── x64/                                 ← SQLite native library (64-bit)
│   └── SQLite.Interop.dll
├── x86/                                 ← SQLite native library (32-bit)
│   └── SQLite.Interop.dll
├── CHANGELOG.md
├── EPPlus.dll
├── EPPlus.Interfaces.dll
├── icon.png
├── manifest.json
├── Microsoft.Bcl.AsyncInterfaces.dll
├── Microsoft.IO.RecyclableMemoryStream.dll
├── Microsoft.Web.WebView2.Core.dll
├── Microsoft.Web.WebView2.WinForms.dll
├── System.Buffers.dll
├── System.ComponentModel.Annotations.dll
├── System.Data.SQLite.dll
├── System.IO.Pipelines.dll
├── System.Memory.dll
├── System.Numerics.Vectors.dll
├── System.Runtime.CompilerServices.Unsafe.dll
├── System.Security.Cryptography.Xml.dll
├── System.Text.Encodings.Web.dll
├── System.Text.Json.dll
├── System.Threading.Tasks.Extensions.dll
├── THIRD-PARTY-NOTICES.md
├── TiaCommander.exe                     ← MCP server + Manager GUI
└── TiaCommander.exe.config

Sin instalador, sin cambios en el registro, sin modificaciones del sistema. Extraiga, configure y ejecute. Descargue la última versión de .zip desde GitHub Releases.

Usuarios de Claude Desktop: Descargue el paquete .mcpb desde Releases e instálelo mediante Configuración → Extensiones → Configuración avanzada → Instalar extensión. No es necesario editar archivos de configuración. Consulte la Guía de inicio rápido para más detalles.

Requisito previo: Siemens TIA Portal V17 o posterior debe estar instalado en su máquina con el componente Openness habilitado. TiaCommander carga las bibliotecas Openness de Siemens directamente desde su instalación de TIA Portal en tiempo de ejecución. Sin TIA Portal, el servidor se inicia en modo degradado con funcionalidad limitada y le guía a través de la configuración.


¿Por qué existe esta herramienta?

Primero lo primero: somos desarrolladores de software e ingenieros de automatización que usamos productos Siemens a diario, en nuestras propias instalaciones, en sitios de clientes y en cada proyecto que necesita automatización industrial. Nos encanta. Con Siemens es simple: simplemente funciona. Siempre. Todo el tiempo.

Durante años de programación práctica, cableado, pruebas, depuración y haciendo que las cosas funcionen con PLC Siemens, hemos construido TiaCommander solo para nuestras propias necesidades internas. Esa es la razón honesta de su existencia: lo construimos para nosotros mismos y nos parece increíble. Acelera las cosas diez veces, a veces veinte veces, y a veces más, hasta que te preguntas: ¿cómo demonios hacíamos las cosas antes?

Puede obtener el contexto completo del proyecto a través de su asistente de IA en menos de un minuto. Cree cualquier bloque en segundos (SCL, LAD, FBD, DB), obtenga estructuras de interfaz, construya DB de múltiples instancias, ejecute referencias cruzadas, compile, depure, recupere errores y mucho más.

Cada herramienta que ve en el mapa de herramientas a continuación está construida a partir de lo que realmente necesitamos o usamos en nuestras operaciones diarias con PLC Siemens. Ya sea que trabaje con la serie S7-1200 o S7-1500, no importa. Si Siemens TIA Portal lo soporta, puede usar TiaCommander para gestionarlo.

Ahora que hacemos pública esta herramienta, estamos genuinamente interesados en saber qué funciones le faltan para su flujo de trabajo de desarrollo. No sea tímido: envíe una solicitud de función, reporte un error o simplemente díganos qué piensa. De ingeniero a ingeniero: leemos cada línea de comentarios.

Disfrute de TiaCommander.


Arquitectura

AI Clients
  Claude Desktop / Code · Cursor · VS Code / Copilot · Windsurf · Codex CLI · Gemini CLI
    │
    │  JSON-RPC 2.0 · stdio
    ▼
TiaCommander MCP Server
  19 tools · 230 actions · standalone I/O · .NET Framework 4.8
    │
    │  Siemens Openness API
    ▼
TIA Portal  (V17 – V20*, tested on V19)
    │
    ▼
S7-1200 · S7-1500 · S7-300 · S7-400 · ET 200

Mapa de herramientas

Herramienta / Acción#Descripción
admin13Administración del servidor
    clear_exports(opcional olderThanHours=24) Eliminar exportaciones caducadas.
    delete_export(exportId) Eliminar una exportación individual.
    get_device_profilesTodos los dispositivos únicos vistos por el servidor.
    get_export(exportId; opcional offset, length, raw=false) Recuperar contenido de exportación con paginación. raw=true devuelve solo contenido, sin encabezado de metadatos.
    get_recent_errors(opcional count=10) Últimas N llamadas a herramientas fallidas con contexto de dispositivo/firmware.
    get_system_infoSO, versión de .NET, versión de TIA Portal, tiempo de actividad del proceso.
    get_stats(opcional top_n=20) Estadísticas de llamadas por herramienta+acción, ordenadas por total de llamadas.
    get_versionVersión del servidor, ruta de la base de datos, tamaño de la base de datos.
    list_exports(opcional tool, limit=20) Resultados de exportación recientes almacenados en la base de datos de exportaciones.
    open_file(filePath) Abrir un archivo usando la aplicación predeterminada de Windows (Excel para .xlsx, navegador para .html, etc.). Usar después de cualquier acción de exportación para que el usuario inspeccione los resultados de inmediato.
    reset_device_catalogLimpiar el catálogo de dispositivos local y volver a volcarlo desde TIA Portal si está conectado.
    save_export(exportId, outputPath) Guardar contenido de exportación en un archivo. Decodifica automáticamente base64 para formatos binarios (XLSX). Después de guardar, preguntar al usuario si desea abrir el archivo (usar acción de administración open_file).
    search_device_catalog(opcional filter, limit=50) Buscar en el catálogo de hardware TIA instalado desde la base de datos local. No se necesita TIA Portal. Usar para consultas de referencia de hardware (números de pedido, modelos de CPU, módulos compatibles).
alarm_text15Textos de alarma y listas de textos
    add_entries(deviceName, textlistName, entries[]) Agregar entradas a una lista de textos. Cada entrada: {from, to, text}.
    create_textlist(deviceName, textlistName; opcional listRange=Decimal, comment, entries[]) Crear nueva lista de textos. Funciona en dispositivos vacíos (auto-siembra mediante plantilla). Opcionalmente, poblar con entradas en una sola llamada.
    delete_entries(deviceName, textlistName, fromValues[]) Eliminar entradas por valor From.
    delete_textlist(deviceName, textlistName) Eliminar una lista de textos de usuario. Las listas de textos del sistema son rechazadas.
    export_alarm_classes(deviceName, outputPath) Exportar definiciones de clases de alarma. Después de exportar, preguntar al usuario si desea abrir el archivo (usar acción de administración open_file).
    export_alarm_data(deviceName, format:csv|xlsx; opcional scope:alarm_texts|textlists|alarm_classes, outputPath, includeInfoText) Exportar datos de alarma a CSV o XLSX para documentación. Por defecto en exports_root\alarm_text. Después de exportar, preguntar al usuario si desea abrir el archivo (usar acción de administración open_file).
    export_alarm_texts(deviceName, outputPath; opcional includeInfoText) Exportar textos de instancias de alarma a XLSX. Después de exportar, preguntar al usuario si desea abrir el archivo (usar acción de administración open_file).
    export_textlists(deviceName, outputPath; opcional textListNames[]) Exportar listas de textos a XLSX. Todas si no hay filtro. Después de exportar, preguntar al usuario si desea abrir el archivo (usar acción de administración open_file).
    get_entries(deviceName, textlistName) Leer todas las entradas de una lista de textos.
    import_alarm_classes(deviceName, filePath) Importar definiciones de clases de alarma.
    import_alarm_texts(deviceName, filePath) Importar textos de instancias de alarma desde XLSX.
    import_textlists(deviceName, filePath; opcional overwrite) Importar listas de textos desde XLSX.
    list_textlists(deviceName) Listar listas de textos del sistema y de usuario con nombre, ID, rango.
    update_entries(deviceName, textlistName, entries[]) Actualizar entradas por valor From. Cada entrada: {from, to?, text?}.
    update_textlist_comment(deviceName, textlistName, newComment) Actualizar comentario de lista de textos directamente.
blocks_read17Leer y exportar bloques
    check_consistency(deviceName) M10: El indicador IsConsistent puede retrasarse respecto a la compilación — usar la salida de compile_all en su lugar.
    compile_all(deviceName) Compilar todo. Ejecutar temprano para resolver F6. Primera ejecución lenta (~30-60s).
    compile_block(deviceName, blockName) Compilar un bloque.
    export_all_xml(deviceName, outputDirectory) Todos los bloques como archivos .xml. M5: el argumento es 'outputDirectory' no 'outputPath'. Después de exportar, preguntar al usuario si desea abrir el directorio de salida (usar acción de administración open_file).
    export_source(deviceName, blockName; opcional outputPath, returnInline, outputDirectory) Código fuente SCL/STL. Con outputPath va a disco (M3: debe ser un DIRECTORIO); omitirlo y returnInline se aplica. LAD/FBD devuelven vacío. Después de exportar, preguntar al usuario si desea abrir el archivo (usar acción de administración open_file).
    export_xml_file(deviceName, blockName; opcional outputPath, returnInline, outputDirectory) XML de bloque. Con outputPath va a disco; omitirlo y returnInline se aplica. Después de exportar, preguntar al usuario si desea abrir el archivo (usar acción de administración open_file).
    export_xml_inline(deviceName, blockName) Resumen XML analizado. F6 se aplica.
    get_all_interfaces_summary(deviceName) Conteos de miembros por sección para todos los bloques.
    get_compiler_errors(deviceName) Filtro solo de errores. Mismo problema de recompilación M8.
    get_compiler_messages(deviceName) M8: dispara una compilación fresca. Preferir salida de compile_all si se acaba de compilar.
    get_details(deviceName, blockName) Tipo, número, lenguaje, tamaño de interfaz, consistencia.
    get_edit_capabilities(deviceName, blockName; opcional networkIndex) #232 P0: LA LLAMADA DE DESCUBRIMIENTO. Por red: su PROPIO lenguaje de unidad de compilación (el de nivel de bloque es engañoso en bloques de lenguaje mixto), si el modelo de escalera hace round-trip, qué acciones de escritura se aplican, y la ruta de respaldo cuando ninguna se aplica. Una llamada en lugar de docenas de pistas dispersas. Cuesta UNA exportación - medido: no hay re... por red en el modelo de objetos.
    get_element_pins(deviceName, blockName, networkIndex; opcional elementUId o elementIndex) La tarjeta 'mira antes de cablear': para una Parte de llamada o instrucción, cada pin con sección, tipo de datos ESPERADO (leído en vivo desde la interfaz del destinatario / estructura de instancia) y cableado actual (operando + su tipo resuelto, o OpenCon sin cablear). Sin selector: lista los elementos de la red con UIds. Usar ANTES de blocks_write u...
    get_interface(deviceName, blockName) Secciones de interfaz completas. F6: falla en bloques inconsistentes — compile_all primero.
    get_network(deviceName, blockName, networkIndex; opcional includeUIds) #171 lado LECTURA del editor de escalera: reconstruye el gráfico plano de Partes+Cables de la red en un modelo JSON de escalera - EXACTAMENTE el vocabulario que acepta create_block networks[].rungs (contacts/parallelBranches/box/output/call, más enFrom para cadenas de llamadas en cascada ENO). Salida: {title, comment, editable, rungs[], unmodelled[]}. editable=true significa que el mod...
    get_xml_raw(deviceName, blockName) Cadena XML cruda. F6 se aplica.
    list(deviceName; opcional typeFilter:all|code|OB|FB|FC|DB|GlobalDB|InstanceDB, includeInstanceDbs) Tabla compacta de bloques.
blocks_write26Crear e importar bloques
    add_interface_member(deviceName, blockName, section, memberName, dataType; opcional startValue, comment, confirm) #171 editor de interfaz: agregar un miembro a una sección de interfaz de FB/FC/OB (Input, Output, InOut, Static, Temp, Constant). El RADIO DE EXPLOSIÓN se calcula PRIMERO (xref llamadores cuyos sitios de llamada quedan desactualizados + los DBs de instancia del FB + la advertencia #183 reinitializeDataBlocks: la descarga restablece valores reales de afectados...
    add_multi_instance_member(deviceName, parentFB, memberName, innerType; opcional onCollision=fail|replace) Agregar miembro estático tipado a FB. innerType debe existir en el dispositivo o en project.ProjectLibrary.
    add_network(deviceName, blockName; opcional position, title, comment) Insertar red vacía en posición (predeterminado: final). Solo LAD/FBD — los bloques SCL tienen una sola unidad de compilación y no admiten múltiples redes. Usar populate_network / insert_rung para agregar lógica después.
    copy_block(deviceName, blockName, newName; opcional targetFolder, createParents=false) Duplicar un bloque bajo un nuevo nombre (los nombres de bloque son ÚNICOS en todo el PLC, por lo que newName es obligatorio y se verifica recursivamente). targetFolder omitido = la copia se coloca junto al bloque fuente. La copia obtiene el siguiente número libre de su tipo. El bloque fuente nunca se modifica. OFFLINE requerido.
    create_block(deviceName, blockName, blockType:FB|FC|OB, language; opcional blockNumber, interface, sclCode, networks, blockTitle, blockComment, author, version, memoryLayout, secondaryType, overwrite, targetFolder, createParents) Creación completa de bloque con interfaz y lógica personalizadas. blockNumber auto-asignado si se omite — SOLO para bloques genuinamente nuevos. Al usar overwrite=true para actualizar un bloque existente (e...
    create_fb(deviceName, fbName; opcional fbNumber, language:LAD|SCL|FBD (STL no soportado - limitación de Openness), author, version, autoCompile=true, targetFolder, createParents=false) Nuevo FB. Número auto-asignado si se omite. Auto-compila y devuelve errores. targetFolder (sintaxis 'Motors/Drives') crea el bloque directamente dentro de esa carpeta; las carpetas faltantes son un ERROR a menos que createParents=true.
    create_fc(deviceName, fcName; opcional fcNumber, language, returnType=Void, author, version, autoCompile=true, targetFolder, createParents=false) Nuevo FC. Número auto-asignado si se omite. Auto-compila y devuelve errores. targetFolder como en create_fb.
    create_ob(deviceName, obName; opcional obNumber, language, author, version, autoCompile=true, targetFolder, createParents=false) Nuevo OB. Número auto-asignado si se omite (comienza en 123). obNumber=1 permitido; 2-122 reservados. Auto-compila y devuelve errores. targetFolder como en create_fb.
    delete_block(deviceName, blockName; opcional force=false) Eliminar cualquier bloque. Los DBs de instancia son rechazados a menos que force=true (útil para DBs de instancia huérfanos).
    delete_interface_member(deviceName, blockName, memberName; opcional section, confirm) Eliminar un miembro de interfaz. Misma puerta de confirmación de radio de explosión. La lógica que aún referencia el miembro fallará en compilación - verificar primero con xref get_references.
    delete_network(deviceName, blockName, networkIndex) Eliminar red por índice basado en 0. Rechaza si es la última red. Solo LAD/FBD.
    delete_rung(deviceName, blockName, networkIndex, rungIndex; opcional expectTitle) Eliminar escalón rungIndex. Rechaza cuando el SIGUIENTE escalón se encadena (enFrom) desde el eliminado - redirigir o eliminar la cola primero.
    delete_scl_statement(deviceName, blockName, networkIndex, statementIndex, matchText) #232 P0: elimina UNA declaración de una red SCL, en una sola llamada. Lee primero las declaraciones con blocks_read action=get_network, que las lista con base 0 y texto normalizado en espacios en blanco. matchText es OBLIGATORIO y se compara contra la declaración EN statementIndex antes de modificar cualquier cosa: los índices se desplazan con cada edición, por lo que un ...
    import_xml_file(deviceName, filePath; opcional overwrite, autoCompile=true, targetFolder, createParents=false) Importar desde archivo XML. Auto-compila y devuelve errores. Preferido para cargas grandes. targetFolder como en import_xml_inline. SOBRESCRIBIR ES UN REEMPLAZO DE OBJETO COMPLETO, NO UNA FUSIÓN: con overwrite=true, cualquier elemento AUSENTE de tu documento se RESTABLECE a su valor predeterminado en lugar de conservarse (ImportOptions.Overrid...
    import_xml_inline(deviceName, xmlContent; opcional overwrite, autoCompile=true, targetFolder, createParents=false) Importar bloque desde cadena XML. Auto-compila y devuelve errores. Cargas grandes (12KB+) verificadas. targetFolder importa dentro de esa carpeta; sin él, overwrite=true apunta automáticamente a la carpeta donde ya vive el bloque existente (importación de grupo propietario). SOBRESCRIBIR ES UN REEMPLAZO DE OBJETO COMPLETO, NO UNA FUSIÓN: co...
    insert_rung(deviceName, blockName, networkIndex, rung; opcional position, expectTitle) #171 editor de rungs: insertar UNA rung (vocabulario de create_block rung: contacts/parallelBranches/box/output O call{blockName,blockType,instanceDB,scope,pins}, opcional enFrom para encadenamiento eno) en una red LAD EXISTENTE en position (predeterminado: agregar al final). La red debe estar completamente modelada (get_network editable=true) - rechazado ...
    move_block(deviceName, blockName, targetFolder; opcional createParents=false) Mover un bloque a otra carpeta ('' o '/' = raíz del contenedor). Openness V19 NO tiene movimiento nativo: esto es exportar -> eliminar -> importar al grupo de destino, con restauración automática a la carpeta original si la importación falla. Verificado por re-resolución y recompilado después. OFFLINE requerido.
    populate_network(deviceName, blockName, networkIndex, rungs; opcional overwriteExisting, expectTitle) Llenar una red con un arreglo rungs[] (vocabulario de create_block networks[].rungs incl. cadenas enFrom). Las redes vacías (add_network recién creadas) se pueblan directamente; las redes no vacías requieren overwriteExisting=true Y modelado completo (get_network primero para preservar contenido). Validación previa a la importación estilo #164 con JSON-path...
    remove_multi_instance_member(deviceName, parentFB, memberName) Eliminar miembro estático de multi-instancia.
    rename_block(deviceName, blockName; opcional newName, newNumber) Renombrar/renumerar. NO se propaga automáticamente a los llamadores.
    replace_network(deviceName, blockName, networkIndex; opcional title, comment) Reemplazar título/comentario de red. Solo LAD/FBD: sclCode no soportado (el XML de SCL está tokenizado; usa create_block con overwrite=true para reconstruir bloques SCL).
    split_network(deviceName, blockName, networkIndex, splitBefore[], titles[]) #232 P0: cortar UNA red SCL en varias en los límites de declaraciones, cada una con su propio título. splitBefore lista los índices de declaración en los que COMIENZA una nueva red: [2,4] en una red de 6 declaraciones da tres redes de 0-1, 2-3, 4-5. titles[] debe tener exactamente UNA entrada MÁS que splitBefore y nunca se predetermina. Una PARTICIÓN, no un...
    update_interface_member(deviceName, blockName, memberName; opcional section, newName, newDataType, newStartValue, newComment, confirm) Actualizar o RENOMBRAR (newName) un miembro de interfaz. section omitido = se busca en todas las secciones; si no se encuentra, lista miembros por sección. Misma puerta de confirmación de radio de explosión. newStartValue/newComment con cadena vacía elimina.
    update_network(deviceName, blockName, networkIndex; opcional title, comment) Actualizar título/comentario de red (índice con base 0).
    update_network_element(deviceName, blockName, networkIndex, elementUId o elementIndex; opcional newInstance, newTarget, pinWires) Edición quirúrgica de elementos Call en LAD/FBD. newInstance: intercambiar DB de instancia. newTarget: redirigir a un FB/FC diferente (regenera parámetros, conserva cables coincidentes). pinWires: objeto JSON que mapea nombres de pines a nuevos operandos: VERIFICADO POR TIPO antes de cualquier mutación contra el tipo declarado del pi...
    update_rung(deviceName, blockName, networkIndex, rungIndex, rung; opcional expectTitle) Reemplazar la rung rungIndex con el objeto rung dado. Mismo requisito de red modelada y advertencia de renumeración que insert_rung.
db11Gestión de bloques de datos
    add_member(deviceName, dbName, memberName, dataType; opcional comment, initialValue) Agregar miembro a DB global. Soporta todos los tipos, incluidos arreglos (p. ej., Array[0..9] of Int) y referencias UDT. Solo DB globales: se rechazan DB de instancia.
    create(deviceName, dbName; opcional dbNumber, author, version, memoryLayout, targetFolder, createParents) Nuevo DB global. Número autoasignado si se omite. targetFolder (sintaxis 'Motors/Drives') crea el DB directamente dentro de esa carpeta; las carpetas faltantes son un ERROR a menos que createParents=true. Para DB de instancia, usa create_instance_db en su lugar.
    create_instance_db(deviceName, dbName, instanceOfName; opcional dbNumber) Crear DB de instancia para un FB. TIA auto-puebla la interfaz desde el FB. instanceOfName debe ser un FB existente. Número autoasignado si se omite.
    delete(deviceName, dbName) Eliminar DB. Rechaza DB de instancia (elimina el FB propietario en su lugar).
    delete_member(deviceName, dbName, memberName) Eliminar miembro de DB global. Rechaza el último miembro.
    get_member(deviceName, dbName, path; opcional depth=2) #171 LECTURA de datos de instancia a CUALQUIER profundidad: ruta de miembro punteada en cadenas anidadas de multi-instancia, instancias de instrucciones, miembros UDT/struct (p. ej., 'modbus.BWTT-RR8_Instance.mb_addr'). La tarjeta muestra tipo, valor(es) inicial(es) incl. por elemento de arreglo, comentario, hijos hasta depth. Funciona en DB GLOBALES y DE INSTANCIA (excepción: los iDB de bloques de sistema no se pueden exportar). Miembro...
    get_structure(deviceName, dbName) Lista completa de miembros con tipos, valores iniciales, atributos mediante exportación XML. Lista plana (sin jerarquía de anidamiento).
    list(deviceName) Todos los DB globales y de instancia. Los nombres son rutas calificadas 'Folder/Sub/Name' (#185).
    set_start_value(deviceName, dbName, path, value | values{path:value,...}) #171 ESCRITURA de datos de instancia a CUALQUIER profundidad, en DB globales Y de instancia (solo valores iniciales, nunca estructura: la superficie de configuración de multi-instancia, p. ej., el mb_addr predeterminado de una llamada de estación dentro del DB de sondeo). Elementos de arreglo mediante [index] en el ÚLTIMO segmento ('Cfg_HwId[3]'). Los valores son literales TIA como cadenas ('33', 'TRUE', 'T#2S', '16#00FF'). TODOS los pa...
    update_member(deviceName, dbName, memberName; opcional newDataType, newStartValue, newComment) Actualizar propiedades de miembro. Se requiere al menos un campo. Los valores iniciales se conservan al cambiar el tipo a menos que newStartValue se proporcione explícitamente. Si TIA rechaza debido a un desajuste de tipo/valor, proporciona un newStartValue compatible. Las ediciones consecutivas de miembros pueden dejar el DB inconsistente para exportación: la herramienta auto-compila y reintenta UNA...
    update_member_comment(deviceName, dbName, memberName, newComment) Atajo para actualización solo de comentario. CRÍTICO: el argumento es 'newComment', NO 'comment'.
diagnostics7Diagnóstico de PLC y conexión
    compare_online_offline(deviceName) Comparar todos los objetos de software (bloques, etiquetas, UDT, objetos tecnológicos) entre el proyecto offline y el PLC online. Auto-conecta si está offline. Solo lectura. Devuelve estado por elemento: Idéntico/Diferente/Solo en PLC/Solo en proyecto.
    configure_connection(deviceName, pcInterfaceName, confirm; opcional targetIp, skipConfirm=false) Configura la conexión de descarga programáticamente. targetIp predeterminado a la IP configurada en el proyecto del dispositivo desde la configuración de hardware: omítelo en el caso normal; pásalo solo para apuntar a una dirección diferente (p. ej., de scan_devices). Crea una ConfigurationAddress dentro de la TargetInterface y luego aplica la configuración...
    get_device_ip(deviceName) Solo lectura. Informa la IP configurada en el proyecto del dispositivo (el destino predeterminado para configure_connection y download_to_device) más cada interfaz de red con IP/máscara/subred. Llama a esto para responder 'qué IP usa este PLC' desde el proyecto: no se necesita escaneo de red.
    get_plc_status(deviceName) Estado de CONEXIÓN (Online/Offline/NotReachable/Protected/...), si la conexión de descarga está configurada, Y el estado OPERATIVO REAL de la CPU, LEÍDO EN VIVO. RUN/STOP está ausente por completo de la API de ingeniería, por lo que el estado se obtiene mediante live_data: esta acción resuelve la IP del dispositivo que NOMBRASTE, abre una sesión de datos en vivo si hay una libre, confirma la identidad de la CPU contra t...
    go_offline(deviceName) Desconectar del PLC.
    go_online(deviceName) Conectar al PLC mediante OnlineProvider. Ejecuta download_check primero (silenciosamente) para verificar que la interfaz esté configurada.
    scan_devices(opcional deviceName) Escaneo de red de solo lectura. Descubre PLCs accesibles mediante GetAccessibleDevices(). Devuelve IP, DeviceSeries, MAC, Name por PcInterface, cada uno ANOTADO [IN PROJECT: ] o [NOT IN THIS PROJECT]. Con deviceName: escanea mediante DownloadProvider. Sin él: escanea mediante StationUploadProvider (alcance del proyecto). No se necesita confirmación. ALCANCE: esto es una difusión PROFINET DCP de capa 2: ...
download_upload4Descarga / carga al PLC
    download_check(deviceName) Pre-vuelo silencioso. Llama a esto ANTES de cualquier descarga o go_online. No emitas texto antes de llamar. Veredictos: READY (todas las compuertas verificadas incl. compilación), NOT READY (una compuerta FALLÓ: transmite el problema), COMPILE UNVERIFIED (la compuerta de compilación no pudo ejecutarse, p. ej., el dispositivo está online: NO es un pase; download_to_device aún compila offline por sí mismo, pero la verificación no lo comprobó).
    download_to_device(deviceName, confirm; opcional mode=software_changes, stopModules=false, startAfterDownload=true, reinitializeDataBlocks=false, pcInterfaceName) DESTRUCTIVO. Pre-verificación de compilación obligatoria. confirm='I understand this will modify the PLC'. mode: software_changes|software|hardware_software|hardware. pcInterfaceName selecciona qué adaptador de red usar para el enrutamiento (de resultados de scan_devices). hardware/...
    upload_checkPre-vuelo silencioso. Llama a esto ANTES de cualquier carga. No emitas texto antes de llamar. Si el resultado muestra READY, procede a upload_station. Si NOT READY, transmite el problema al usuario.
    upload_station(modeName, pcInterfaceName, confirm; opcional addressIndex=0, readPassword, writePassword) DESTRUCTIVO PARA EL PROYECTO (agrega dispositivo). confirm='I understand this will add a device to the project'.
folders5Carpetas del árbol del proyecto (grupos)
    create_folder(deviceName, container, path; opcional createParents=false) Crea la carpeta en la ruta. Las rutas anidadas usan '/' (p. ej., 'Motors/Drives'). Las carpetas intermedias faltantes son un ERROR a menos que createParents=true — nunca se crean silenciosamente.
    delete_folder(deviceName, container, path; opcional deleteContents=false, confirm) DESTRUCTIVO. La carpeta vacía se elimina de inmediato. La no vacía requiere TANTO deleteContents=true COMO confirm que contenga 'I understand' — la eliminación borra permanentemente TODOS los elementos contenidos y subcarpetas.
    find(deviceName, container, query; opcional path, typeFilter, caseSensitive=false) Búsqueda glob en TODO el contenedor: * coincide con cualquier secuencia, ? un carácter (p. ej., 'mb_*', 'HMI'). Devuelve Nombre [clave=valor, ...] (misma envoltura y claves por contenedor que get_tree) + ubicación de carpeta por coincidencia; limitado a 200 con truncamiento explícito. get_tree responde FORMA, find responde IDENTIDAD — usa find cuando y...
    get_tree(deviceName, container; opcional path, nested=true, includeItems=false, depth=0 ilimitado (1 = hijos inmediatos), typeFilter, limit) Vista de árbol en UNA llamada: carpetas con conteos de elementos/subcarpetas, más elementos contenidos cuando includeItems=true. Las líneas de elementos usan una envoltura ONE en cada contenedor: Nombre [clave=valor, clave=valor] con claves en minúsculas, separadas por coma y espacio, claves no aplicables omitidas. Claves por cont...
    rename_folder(deviceName, container, path, newName) Funciona solo en technology_objects. En los otros cinco contenedores (program_blocks, tag_tables, udts, watch_tables, external_sources) el Nombre de la carpeta es de solo lectura en Openness V19 y esto devuelve Error: RenameFailed con el AccessMode — renombra esos en la interfaz de TIA Portal. No hay API de movimiento en ninguno de ellos. (#231 corrección 14: el texto anterior llamaba a esto un...
get_info-Información del servidor
hardware14Configuración de hardware
    compile_allCompilar todo el HW. M4: 'Not compilable' = nada necesita recompilación (no es un error).
    compile_device(deviceName) F1: NullReferenceException — usa compile_all en su lugar.
    dump_catalogVolcar el catálogo completo de hardware de TIA Portal (~11K entradas) a la base de datos local. Se ejecuta automáticamente en la primera conexión TIA o cambio de versión de TIA. Disparo manual para actualizaciones de HSP.
    export_csv(outputPath) Lista de dispositivos a CSV. Después de la exportación, pregunta al usuario si quiere abrir el archivo (usa acción de administrador action=open_file).
    export_hardware_map(formato:csv|xlsx; opcional deviceName, outputPath) Exporta datos de hardware crudos CAx/AML para un dispositivo como tabla plana. Muestra todo lo que Siemens exporta: rack, CPU, subelementos, módulos de señal, canales, direcciones, etiquetas. Una sola hoja. Por defecto en exports_root/hardware/. Nombre de archivo: {ProjectName}_{PLCName}hardware_map{timestamp}.{ext}. Después de la exportación, pregunta al usuario si quiere abrir el archivo (usa acción de administrador ac...
    export_io_map(formato:csv|xlsx; opcional deviceName, outputPath) Exporta el mapa completo de E/S del dispositivo combinando topología de rack/ranura con asignaciones de etiquetas. XLSX: una hoja por ranura + resumen. CSV: plano combinado. Omite deviceName para exportar todos los dispositivos (un archivo cada uno). Por defecto en exports_root/hardware/. Nombre de archivo: {ProjectName}_{PLCName}io_map{timestamp}.{ext}. Después de la exportación, pregunta al usuario si quiere abrir el archivo...
    export_xlsx(outputPath) Lista de dispositivos a Excel. Después de la exportación, pregunta al usuario si quiere abrir el archivo (usa acción de administrador action=open_file).
    get_device(deviceName) Configuración detallada para un dispositivo.
    get_full_configConfiguración completa de hardware para todos los dispositivos.
    get_io_mapMapa completo de direcciones de E/S en todos los dispositivos/módulos.
    get_networkSubredes, nodos, sistemas de E/S en todo el proyecto.
    get_rack_slot_details(deviceName) Topología de rack/ranura con asignaciones de direcciones de E/S.
    search_catalog(filter) Búsqueda en vivo en tiempo real del catálogo de hardware de TIA Portal. Requiere TIA Portal en ejecución. Limitado a 50 resultados.
    set_network_config(deviceName, confirm; opcional ipAddress, subnetMask, useRouter, routerAddress, ipProtocolSelection, useIsoProtocol, pnDeviceNameAutoGeneration, stationName, pnDeviceName) Establece la configuración de red en la interfaz PROFINET de un dispositivo. pnDeviceName establece el nombre del dispositivo PROFINET directamente (desactiva automáticamente la autogeneración). stationName renombra el dispositivo. Modifica solo la configuración del proyecto — se requiere descarga al PLC...
library29Gestión de bibliotecas
    add_to_multi_instance_fb(deviceName, parentFB, memberName, path; opcional library='project', version, onCollision=fail|replace) Resuelve el tipo de biblioteca + delega a blocks_write add_multi_instance_member. El tipo debe sembrarse primero mediante instantiate_library_type.
    archive_global_library(libraryName; opcional targetDirectory, targetName, mode=Compressed) Crea un archivo .zal19. targetDirectory por defecto a la raíz de archivos configurada — NO pases targetDirectory a menos que el usuario especifique explícitamente una ruta diferente. Si la raíz de archivos no está configurada, dirige al usuario a open_manager → pestaña Paths para configurarla.
    close_global_library(libraryName) Cierra la biblioteca global cargada.
    compare_to_target(targetLibrary; opcional library='project', includeIdentical=false) Compara bibliotecas: only_in_source, only_in_target, differs, identical. Solo lectura.
    create_global_library(name; opcional targetDirectory) Crea un nuevo .al19 vacío. targetDirectory por defecto a la raíz de bibliotecas configurada — NO pases targetDirectory a menos que el usuario especifique explícitamente una ruta diferente. Si la raíz de bibliotecas no está configurada, dirige al usuario a open_manager → pestaña Paths para configurarla. Se abre en ReadWrite. Llama a save_global_library para persistir.
    create_library_folder(folderPath; opcional library='project', typeFilter=master_copies|types) Crea subcarpeta (idempotente, crea automáticamente intermedias). typeFilter selecciona la sección: master_copies (predeterminado) o types. Una biblioteca global de solo lectura se rechaza con ese motivo.
    delete_library_folder(folderPath; opcional library='project', recursive=false, typeFilter=master_copies|types) Elimina subcarpeta de la sección nombrada. No vacía rechazada a menos que recursive=true.
    delete_master_copy(path; opcional library='project') Elimina por ruta completa con barras.
    delete_unused_types(opcional library='project', path, mode=preserve_default|delete_all, dryRun=true, confirm) Elimina tipos con cero instancias. dryRun=true predeterminado; establece false + confirm para ejecutar.
    export_type_xml(library, path, outputPath; opcional version, overwrite=false) Exporta versión de tipo a archivo XML. Después de la exportación, pregunta al usuario si quiere abrir el archivo (usa acción de administrador action=open_file).
    find(library, query; opcional path, typeFilter:all|types|master_copies, caseSensitive=false, limit) Búsqueda glob (* y ?). Recorrido recursivo, límite de 500 coincidencias con NOTICE fuerte en truncamiento; las coincidencias llevan la misma envoltura que get_tree. Limita con path en bibliotecas enormes. section fue ELIMINADO (usa typeFilter).
    get_info(library) Metadatos: modo de edición, versión, autor, conteos de elementos, carpetas raíz.
    get_master_copy(library, path) Metadatos de copia maestra más un MANIFIESTO DE CONTENIDO: Contents (N) con una fila por objeto envuelto y un tipo amigable. Una copia maestra no lleva dependencias — publica bloques referenciados y UDTs por separado. No hay cuerpo XML disponible: MasterCopy no tiene método Export en Openness V19 (#231 H11).
    get_type(library, path; opcional version='latest_committed', includeXml=false) Metadatos de tipo + lista de versiones. includeXml=true inserta el cuerpo XML (límite ~30KB).
    get_tree(library; opcional path (raíz predeterminada), depth=0 ilimitado (1 = hijos inmediatos), nested=true, includeItems=false, typeFilter:all|types|master_copies, limit) Vista de subárbol recursiva — argumentos, valores predeterminados y regla de profundidad ahora IDÉNTICOS a folders get_tree (v3.0.0). nested=false = lista de rutas plana (el contrato de máquina). Límite de 1000 elementos, NOTICE fuerte en truncamiento. Las líneas de tipo llevan la envoltura uniforme [ve...
    instantiate_library_type(deviceName, path; opcional library='project', version='latest_committed') Instancia versión de tipo en bloques de dispositivo. Solo versiones Committed. Efecto secundario: siembra project.ProjectLibrary.
    instantiate_master_copy(deviceName, path; opcional library='project') Materializa copia maestra en bloques de dispositivo.
    list_librariesTodas las bibliotecas (proyecto + globales cargadas). Devuelve nombres para el argumento 'library'. Nombre reservado 'project' = biblioteca del proyecto.
    open_global_library(opcional path; opcional openMode=ReadOnly|ReadWrite) Carga archivo .al19. Sin path, lista bibliotecas disponibles desde la raíz de bibliotecas configurada.
    promote_to_global(targetLibraryName; opcional sourceLibrary='project', path, forceUpdateMode, structureConflictMode, deleteUnusedVersions) Copia tipos a biblioteca global escribible.
    publish_block_as_master_copy(deviceName, blockName; opcional library='project', folderPath='', onCollision=autoRename|replace|fail) Publica FB/FC/OB/GlobalDB como copia maestra. Funciona en bloques inconsistentes.
    publish_plc_type_as_master_copy(deviceName, udtName; opcional library, folderPath, onCollision) Igual que arriba para UDTs.
    reload_global_library(libraryName; opcional discardChanges=false) Relee una biblioteca global desde el disco después de que se cambió fuera de esta sesión. Openness no tiene actualización, así que esto es un cierre+apertura supervisado: se RECHAZA cuando la biblioteca tiene cambios sin guardar (IsModified) a menos que discardChanges=true. Cada ruta o identificador de antes de la recarga está obsoleto.
    rename_library_folder(folderPath, newName; opcional library='project', typeFilter=master_copies|types) Renombra una carpeta de usuario en cualquiera de las secciones. La raíz del sistema de la sección no es renombrable. (#231 H15)
    rename_master_copy(path, newName; opcional library='project') Renombra una copia maestra. El objeto ENVUELTO mantiene su propio nombre — ContentName es de solo lectura — y el resultado lo dice. (#231 H13)
    rename_type(path, newName; opcional library='project') Renombra un tipo de biblioteca. Las versiones y los bloques ya instanciados no se tocan. (#231 H15)
    save_global_library(libraryName) Persiste la biblioteca global abierta a .al19.
    update_check(opcional library='project', path, mode=ReportOutOfDateOnly) Vista previa de lo que update_project cambiaría. Solo lectura.
    update_project(opcional library='project', path, deleteUnusedVersions=false) DESTRUCTIVO: aplica actualizaciones de tipos de biblioteca a todos los bloques coincidentes. Ejecuta update_check primero.
live_data11Valores PLC en vivo + diagnósticos
    connect(host; contraseña opcional) Conectar a un PLC a través de una conexión cifrada (puerto TCP 102). host = IP del PLC. contraseña solo si el nivel de acceso de la CPU lo requiere (nunca se registra ni se muestra). Si se omite la contraseña y se almacenó una mediante set_credential para este host, se usa automáticamente.
    delete_credential(host; passwordClass opcional, scope) Eliminar credenciales almacenadas para un host. scope='project' elimina la credencial del proyecto abierto; scope='global' elimina la compartida por cualquier proyecto. La respuesta indica qué nivel se eliminó.
    disconnectLiberar la sesión de datos en vivo.
    get_statusDisponibilidad de datos en vivo, estado de conexión, identidad del PLC. Seguro en cualquier momento.
    list_credentialsListar credenciales almacenadas (host, SCOPE, clase, etiqueta, marcas de tiempo). NUNCA muestra el secreto. Cada fila indica scope=project o scope=global usando el mismo vocabulario que acepta el argumento scope, de modo que una fila leída aquí se puede pasar directamente a delete_credential; una fila de proyecto también nombra su ruta de proyecto y está marcada como [ABIERTO en TIA] cuando es la que scope=project afectaría.
    list_readable(root opcional, limit) Lo que el PLC realmente expone para lectura, por root. Sin argumento = una línea por root con recuentos de hojas; root=MArea (o un nombre de DB) lista las hojas de ese root. Use esto cuando una etiqueta vuelva sin resolver: separa 'no declarado' de 'área completa vacía'.
    read_db(dbName; members[] opcional) Valores en vivo de un bloque de datos (optimizado o estándar), simbólicos, con códigos de calidad. members[] limita a miembros específicos.
    read_diagnostics(kind=all|identity|protection|alarms|buffer opcional, maxEntries) Número de pedido de la CPU + firmware (en línea - Openness NO puede leer esto), nivel de protección, alarmas activas y configuradas, y el búfer de diagnóstico de la CPU (kind=buffer o all): el mismo registro de eventos que TIA Portal muestra bajo Online y Diagnostics, más reciente primero, con marca de tiempo del reloj de la CPU en UTC. El texto del evento se resuelve localmente desde un catálogo, s...
    read_tag_table(deviceName, tagTableName; tags[] opcional) Valores en vivo para una tabla de etiquetas de PLC. Las etiquetas pueden nombrarse simbólicamente o por dirección absoluta (%M1.0, %MB1, %MW20, %MD4, y los equivalentes %I/%Q). Se bloquea si el número de pedido del dispositivo nombrado difiere del de la CPU conectada.
    read_watch_tableO BIEN (symbols[]) para símbolos totalmente calificados, O (deviceName, watchTableName) para resolver una tabla de vigilancia del proyecto y leer sus entradas en vivo. Pasar ambos es un error.
    set_credential(host, password; passwordClass opcional, label, scope) Almacenar una contraseña de CPU CIFRADA en reposo (vinculada a la máquina), para que connect pueda usarla sin pasar la contraseña cada vez. El secreto nunca se muestra ni se registra. scope='project' la vincula al proyecto abierto; scope='global' se aplica a cualquier proyecto. connect prefiere la credencial del proyecto y recurre a la global.
open_manager-Abrir ventana del administrador
session16Gestión de sesión
    archive(outputDirectory opcional; archiveName opcional, timestamp, archivationMode, saveChanges) Crear archivo .zapXX. outputDirectory por defecto a la raíz de archivos configurada — NO pase outputDirectory a menos que el usuario especifique explícitamente una ruta diferente. Si la raíz de archivos no está configurada, dirija al usuario a open_manager → pestaña Paths. timestamp=true por defecto. archivationMode: None|Compressed|DiscardRestorabl...
    close_project(saveChanges opcional) Cerrar proyecto. saveChanges: prompt|save|discard|auto.
    configure(projectsRoot opcional, archivesRoot, exportsRoot, librariesRoot, httpEnabled) Establecer rutas de carpeta predeterminadas para crear/abrir/archivar/exportar/bibliotecas. Valida que el directorio exista (exportsRoot se auto-crea si falta). Use la GUI de open_manager como alternativa. TAMBIÉN (#168): preferredTiaBinding= es el SELECTOR de TIA Portal: en una PC con varios TIA Portals instalados, elija cuál TiaCommander bin...
    connect(withUI=true opcional) Adjuntar a TIA Portal en ejecución, carga automáticamente el primer proyecto. Libera cualquier handle obsoleto primero.
    create(name; parentDirectory opcional, withUI=true) Crear nuevo proyecto. Autónomo: inicia TIA Portal automáticamente o se adjunta a una instancia en ejecución, limpia handles obsoletos. Solo nombres ASCII (M12). parentDirectory por defecto a la raíz de proyectos configurada — NO pase parentDirectory a menos que el usuario especifique explícitamente una ruta diferente. Si la raíz de proyectos no está configurada, dirija al usuario a open_manager → Paths ...
    disconnect(saveChanges opcional, closeTia) Liberar el handle de Openness. closeTia=true también termina el proceso de TIA.
    get_projectNombre, ruta, versión, recuento de dispositivos del proyecto abierto.
    get_stateVerificación proactiva de estado. Devuelve el nivel de estado (0-4), estado de TIA/proyecto/dispositivo, información de licencia y bandera de reinicio. Llame al inicio de la sesión. Funciona en cualquier estado.
    infoVersión del servidor, recuento de herramientas, sugerencia de flujo de trabajo.
    is_dirtyDevuelve verdadero/falso para cambios no guardados.
    launch(withUI=true opcional) Iniciar nuevo TIA Portal (sin proyecto). Libera cualquier handle obsoleto primero. Prefiera create/open que se auto-inician.
    list_archives(archivesRoot opcional) Listar todos los archivos .zap* desde la raíz de archivos configurada o explícita. Muestra nombre de archivo, tamaño, fecha, versión de TIA.
    list_devicesTodos los dispositivos en el proyecto. Proporciona deviceName para otras herramientas.
    open(projectPath opcional; withUI=true opcional) Abrir proyecto, iniciar TIA automáticamente si es necesario. Idempotente. Sin projectPath, lista los proyectos disponibles desde la raíz de proyectos configurada.
    saveGuardar proyecto. REQUIERE OFFLINE: se niega con OnlineModeRestriction mientras cualquier dispositivo esté en línea — ejecute diagnostics go_offline primero.
    save_as(newName; newParentDirectory opcional) Guardar copia en la nueva ubicación. newParentDirectory por defecto a la raíz de proyectos configurada si está establecida.
tag16Gestión de etiquetas de PLC
    add_tag(deviceName, tagTableName, tagName, dataType; logicalAddress opcional, comment) Agregar etiqueta. dataType: Bool, Int, Real, etc. logicalAddress: %%M0.0, %%MW100.
    create_table(deviceName, tagTableName; targetFolder opcional, createParents=false) Nueva tabla vacía. targetFolder (sintaxis 'Motors/Drives') la crea directamente dentro de esa carpeta en el árbol de etiquetas de PLC; las carpetas faltantes son un ERROR a menos que createParents=true. La colisión de nombres se verifica recursivamente en todas las carpetas.
    delete_table(deviceName, tagTableName) Eliminar tabla y todas las etiquetas.
    delete_tag(deviceName, tagTableName, tagName; tagNames opcional, confirm) Eliminar una sola etiqueta. SE NIEGA cuando la etiqueta lleva un comentario o banderas de acceso no predeterminadas, porque add_tag no puede restaurarlas — pase confirm='I understand this destroys the comment and access flags' para anular, o use action=move para reubicarla sin pérdida. Nota: eliminar+agregar NO es un renombrado: crea un NUEVO objeto y cada referencia t...
    export_tag_table_data(deviceName, tagTableName, format:csv|xlsx|xml; outputPath opcional, returnInline=false) Exportar tabla de etiquetas a CSV o XLSX para documentación/análisis, o a XML TIA sin procesar (format=xml) para ida y vuelta mediante import_table. Columnas: Name, DataType, Address, Comment, ExternalAccessible, ExternalVisible, ExternalWritable. Por defecto a exports_root\tag\ si no hay outputPath, y el nombre auto-generado se des-dupl...
    find_next_free(deviceName; area:M|I|Q opcional, startByte:int, dataType:Bool|Byte|Word|DWord|Int|Real|etc., mode:declared|used) Encontrar la siguiente dirección libre. mode=declared (predeterminado, más seguro): omite todas las direcciones de etiquetas declaradas. mode=used: omite solo las direcciones referenciadas en el código. Alineación: Bool=cualquier bit, Byte=byte, Word=byte par, DWord=4 bytes.
    get_assignment_list(deviceName; area:M|I|Q|all opcional, mode:declared|used|conflicts) Ocupación de direcciones para áreas M/I/Q + E/S de hardware. mode=declared (predeterminado): todas las direcciones de etiquetas. mode=used: solo direcciones referenciadas en el código de bloques (refleja la Lista de asignación de TIA). mode=conflicts: direcciones usadas en 2+ bloques con detalle de Lectura/Escritura — detecta dobles asignaciones.
    get_table_details(deviceName, tagTableName) Todas las etiquetas con tipos, direcciones y comentarios.
    import_table(deviceName, filePath O xmlContent O exportId; overwrite=false opcional, targetFolder, createParents=false) REQUIERE OFFLINE. Importar una tabla de etiquetas desde XML TIA sin procesar — el documento que produce export_tag_table_data format=xml. overwrite=false CREA y se niega si ese nombre de tabla ya existe. overwrite=true reemplaza la tabla existente; es una importación de tabla completa, no una fusión a nivel de campo, por lo que las etiquetas...
    list_tables(deviceName) Todas las tablas de etiquetas, una línea cada una con la ruta calificada 'Folder/Sub/Name' y el sobre uniforme [type=PlcTagTable, tags=N]. Los totales se reconcilian con folders get_tree (container=tag_tables).
    move(deviceName, tagTableName, tagName, targetTable) Mover UNA etiqueta a otra tabla, preservando su comentario Y las tres banderas de acceso (ExternalAccessible/Visible/Writable). Use esto en lugar de delete_tag + add_tag: add_tag no puede llevar las banderas de acceso, por lo que la ruta manual las restablece silenciosamente. Verificado por lectura posterior; falla ruidosamente si alguna propiedad no sobrevivió.
    move_table(deviceName, tagTableName, targetFolder; createParents=false opcional) REQUIERE OFFLINE. Mover una tabla de etiquetas entre carpetas ('' = raíz del contenedor). Emulado como exportar -> eliminar -> importar en la carpeta de destino (fidelidad total probada); restauración en caso de fallo a la ubicación original. NOTA: las tablas de etiquetas NO se pueden COPIAR — los nombres de etiquetas de PLC son globales en todas las tablas.
    rename(deviceName, tagTableName, tagName, newName) SE NIEGA POR DISEÑO, siempre. Openness V19 no expone renombrado de etiquetas: PlcTag.Name es solo getter y SetAttribute('Name') se niega con AccessMode: Read. No emulado mediante exportación/reimportación tampoco — los nombres de etiquetas son GLOBALES al PLC y Openness no propaga nada, por lo que una etiqueta reconstruida deja cada operando LAD/FBD/STL/SCL nombrando el símbolo antiguo, y SCL no tiene programático...
    search(deviceName, tagName) Coincidencia de subcadena en todas las tablas.
    set_access(deviceName, tagTableName, tagName, accessible, visible, writable) CRÍTICO: los argumentos son accessible/visible/writable, NO externalAccessible etc.
    update_comment(deviceName, tagTableName, tagName, newComment) CRÍTICO: el argumento es 'newComment', NO 'comment'.
technology_objects15****
    capabilities(family opcional) La matriz documentada de familia/versión/firmware. NO NECESITA CONEXIÓN TIA.
    compile(deviceName, name; scope=group opcional) Se ejecuta inmediatamente; sin ejecución en seco. Informa cada versión de objeto antes y después.
    connect_hardware(deviceName, name, interface, target; confirm opcional) Reconfigura un canal. Los índices de sensores son basados en 1.
    create(deviceName, name, family, version; path, confirm opcionales) family y version son FIJOS en la creación y no pueden cambiarse después.
    create_from_master_copy(deviceName, masterCopy; path, confirm opcionales) La copia maestra debe crearse en la interfaz de usuario de TIA; ninguna llamada de Openness puede generarla.
    delete(deviceName, name; confirm opcional) NO reversible: un objeto recreado comienza con valores predeterminados.
    exportimport — (deviceName, name | file; confirm opcional) SimaticML. Controlado por versión según la familia; una negativa indica la versión requerida y su sección del manual.
    find_parameter(deviceName, name, parameter) Un parámetro: valor, tipo, acceso. La PRIMERA lectura de los parámetros de un objeto es lenta (~5.5-7.5 s medidos - el costo está dentro de Openness); las lecturas posteriores toman ~150 ms, y el enlace se enfría nuevamente después de inactividad.
    get_hardware_connection(deviceName, name) Informe de cableado de solo lectura. Un proveedor que no aplica a la familia se informa como tal, no como un error.
    get_parameters(deviceName, name; prefix, summary, limit opcionales) Los datos de puesta en marcha, tipados. prefix filtra un área; summary=true da solo áreas y conteos. Cada fila indica su acceso; un par simple/subrayado se pliega en una fila que nombra qué mitad acepta una escritura.
    import
    list(deviceName; limit opcional) Todos los objetos: Nombre [type=, version=<Vx.y>, parent=]. Los objetos de subnivel (cámaras de salida, pistas de cámara, entradas de medición) cuelgan de un eje padre y se incluyen.
    rename(deviceName, name, newName; confirm opcional) Los bloques de programa referencian el objeto POR NOMBRE y NO se actualizan.
    set_parameter(deviceName, name, parameter, value, expectedCurrentValue) ESCRIBE un parámetro. expectedCurrentValue es OBLIGATORIO y debe coincidir con el valor actual o la escritura se rechaza. Los parámetros de solo lectura se rechazan de antemano. Devuelve viejo -> nuevo con un deshacer copiable.
    show_in_editor(deviceName, name) Lo abre en la interfaz de usuario de TIA.
udt11Gestión de tipos definidos por el usuario
    add_member(deviceName, udtName, memberName, dataType; comment, initialValue opcionales) Agrega un miembro mediante ida y vuelta XML.
    create(deviceName, udtName) Nuevo UDT vacío. Se crea con un miembro de marcador de posición _placeholder (Bool) porque TIA rechaza un STRUCT vacío - elimínalo con delete_member, o pasa members[] (misma forma que el modo masivo de add_member) y no se crea ningún marcador de posición. targetFolder opcional (sintaxis 'Motors/Drives') + createParents lo crean directamente en esa carpeta. (usa el workaround de SCL ExternalSources internall...
    delete(deviceName, udtName) Elimina UDT. Rechaza si todavía está referenciado.
    delete_member(deviceName, udtName, memberName) Elimina un miembro mediante ida y vuelta XML.
    export_xml(deviceName, udtName; outputPath, returnInline, outputDirectory opcionales) Exporta UDT a XML. Con outputPath va a disco; omítelo y se aplica returnInline.
    get_structure(deviceName, udtName) Lista completa de miembros con tipos, comentarios, banderas de acceso mediante XML.
    import_xml(deviceName, filePath O xmlContent; overwrite opcional) Importa UDT desde XML. filePath lee desde disco; xmlContent acepta una cadena XML en línea (no se necesita herramienta de archivo). Confiable para idas y vueltas; puede fallar en XML sintetizado (usa create+add_member en su lugar). SOBRESCRIBIR ES UN REEMPLAZO DE TODO EL OBJETO, NO UNA FUSIÓN: con overwrite=true, cualquier elemento AUSENTE de tu documento se RESTABLECE a su valor predeterminado en lugar de p...
    list(deviceName) Todos los UDT, una línea cada uno con ruta calificada 'Folder/Sub/Name', el sobre uniforme [type=PlcStruct, num=N] y la fecha de modificación.
    move(deviceName, udtName, targetFolder; createParents=false opcional) SE REQUIERE OFFLINE. Mueve un UDT entre carpetas ('' = raíz del contenedor). Emulado como exportar -> eliminar -> importar en la carpeta de destino (probado con spike); restauración en caso de fallo a la ubicación original.
    update_member(deviceName, udtName, memberName; newDataType, newInitialValue, newComment opcionales) Actualiza propiedades de miembro. Se requiere al menos un campo. Usa ida y vuelta SCL.
    update_member_comment(deviceName, udtName, memberName, newComment) CRÍTICO: el argumento es 'newComment', NO 'comment'.
watch14Tablas de vigilancia y fuerza
    add_entry(deviceName, target, tableName, address; displayFormat, modifyValue[watch], forceValue[force], modifyTrigger[watch], monitorTrigger, comment opcionales). IMPORTANTE: siempre establece displayFormat para que coincida con el tipo de datos de la variable fuente — Bool→Bool, Int/Word→DEC_signed, DInt/DWord→DEC_signed, Real→Float, Time→Time, String→String. Nunca lo dejes como Hex predeterminado. Busca el tipo de datos en el bloc...
    clear_table(deviceName, watchTableName) Elimina todas las entradas, conserva la tabla.
    create_table(deviceName, watchTableName; targetFolder, createParents=false opcionales) Nueva tabla de vigilancia vacía. targetFolder la crea directamente dentro de esa carpeta en el árbol de tablas de vigilancia/fuerza; las carpetas faltantes son un ERROR a menos que createParents=true. Colisión de nombres verificada recursivamente (tablas de vigilancia Y fuerza).
    delete_entry(deviceName, target, watchTableName|forceTableName, address) Elimina entrada. FORMA DE DIRECCIÓN: pasa la dirección absoluta simple (%%M60.0) O el nombre simbólico exacto. TIA almacena una dirección propiedad de una etiqueta SIMBÓLICAMENTE, por lo que la forma simple se resuelve mediante las tablas de etiquetas cuando ninguna entrada coincide literalmente, y el resultado dice 'coincidido simbólicamente como ""TagName""'. Si la dirección simple es propiedad de más de una etiqueta t...
    delete_table(deviceName, watchTableName) Elimina tabla de vigilancia.
    export_force_data(deviceName, forceTableName, format:csv|xlsx; outputPath opcional) Exporta tabla de fuerza a CSV o XLSX para documentación. Predeterminado a exports_root\watch. Después de la exportación, pregunta al usuario si quiere abrir el archivo (usa admin action=open_file).
    export_table(deviceName, target, tableName, outputPath) Exporta a XML. Después de la exportación, pregunta al usuario si quiere abrir el archivo (usa admin action=open_file).
    export_watch_data(deviceName, watchTableName, format:csv|xlsx; outputPath opcional) Exporta tabla de vigilancia a CSV o XLSX para documentación. Predeterminado a exports_root\watch. Después de la exportación, pregunta al usuario si quiere abrir el archivo (usa admin action=open_file).
    get_entries(deviceName, target, watchTableName|forceTableName) Lista entradas.
    import_table(deviceName, filePath O xmlContent; overwrite opcional) Importa desde XML. filePath lee desde disco; xmlContent acepta una cadena XML en línea (no se necesita herramienta de archivo). SOBRESCRIBIR ES UN REEMPLAZO DE TODO EL OBJETO, NO UNA FUSIÓN: con overwrite=true, cualquier elemento AUSENTE de tu documento se RESTABLECE a su valor predeterminado en lugar de conservarse (ImportOptions.Override; medido #231 P1). Proporciona un documento COMPLETO - exporta fi...
    list_tables(deviceName) Todas las tablas de vigilancia y fuerza, una línea cada una con ruta calificada 'Folder/Sub/Name' y el sobre uniforme [type=PlcWatchTable|PlcForceTable, entries=N, force=true|false]. Los totales se reconcilian con folders get_tree (container=watch_tables).
    move_table(deviceName, watchTableName, targetFolder; createParents=false opcional) SE REQUIERE OFFLINE. Mueve una tabla de vigilancia/fuerza entre carpetas ('' = raíz del contenedor). Emulado como exportar -> eliminar -> importar en la carpeta de destino; restauración en caso de fallo a la ubicación original.
    rename_table(deviceName, watchTableName, newName) Renombra (ida y vuelta XML internamente).
    update_entryMismos parámetros que add_entry. No puede limpiar campos (elimina y vuelve a agregar en su lugar). Acepta cualquier forma de dirección — ver delete_entry.
xref6Análisis de referencias cruzadas
    find_call_paths(deviceName, blockName; maxDepth=10 opcional) Todas las rutas de llamada desde raíces OB hasta el bloque objetivo sobre bordes CALL, p. ej. Main [OB1] -> ModbusPoll [FB2] -> mb_query [FB8]. Complementa find_callers (find_callers = solo llamadores directos; esto = rutas calificadas completas desde los OB). blockName acepta un nombre simple (resuelto recursivamente en todas las carpetas) o una ruta calificada por carpeta.
    find_callers(deviceName, blockName) Búsqueda inversa: qué bloques referencian el objetivo nombrado. El objetivo puede ser un BLOQUE (sitios de llamada) o una ETIQUETA PLC — para una etiqueta obtienes los bloques de lectura y escritura con Access=Read/Write y la red, por lo que no se necesita una acción de etiqueta separada. Itera cada bloque. Un nombre que no coincide ni con un bloque ni con una etiqueta lo dice, en lugar de informar cero referencias.
    find_orphaned_instance_dbs(deviceName) DB de instancia cuyo FB propietario falta o no tiene referencia TypeInstance/InstanceType.
    find_unused(deviceName) Todos los bloques no llamados desde ninguna cadena OB. Itera cada bloque (~5-10ms cada uno).
    get_call_tree(deviceName; blockName, maxDepth=10 opcionales) Árbol de llamadas hacia adelante: qué llama una raíz, recursivamente a cualquier profundidad (raíces predeterminadas: todos los OB; blockName acepta nombre simple o calificado por carpeta). Cada nodo muestra nombre calificado por carpeta, número de bloque, red del sitio de llamada, DB de instancia; las instrucciones del sistema aparecen como hojas. Seguro contra ciclos; un subárbol ya mostrado se colapsa con un marcador.
    get_references(deviceName, blockName; filter:AllObjects|ObjectsWithReferences|ObjectsWithoutReferences|UnusedObjects opcional) Referencias cruzadas para un bloque. Muestra objetos referenciados con tipo de acceso (Read/Write/Call etc.) y ubicación.
Total: 19 herramientas, 230 acciones — las descripciones de acciones están abreviadas en esta tabla; el texto completo de cada acción está en la lista de herramientas legible por máquina (data/tool-list/tools.json).

Cada meta-herramienta agrupa acciones relacionadas detrás de un único parámetro action. get_info y open_manager son utilidades independientes que funcionan sin licencia. Comience con session para conectarse y luego use cualquier otra herramienta.


Hardware Probado

TiaCommander debería funcionar con cualquier PLC compatible con TIA Portal y la API de Openness. Los siguientes dispositivos han sido probados internamente con cobertura completa de herramientas:

DispositivoNúmero de pedidoFirmwareTIA Portal
S7-1200 CPU 1212C DC/DC/Rly6ES7 212-1BE31-0XB0V3.0V19
S7-1200 CPU 1214C DC/DC/DC6ES7 214-1AG31-0XB0V3.0V19
S7-1200 CPU 1214C DC/DC/DC6ES7 214-1HG40-0XB0V4.5V19
S7-1200 CPU 1215C DC/DC/DC6ES7 215-1AG31-0XB0V3.0V19
S7-1200 CPU 1215C DC/DC/Rly6ES7 215-1BG31-0XB0V3.0V19
S7-1200 CPU 1217C DC/DC/DC6ES7 217-1AG40-0XB0V4.2V19

Vea lo que la comunidad está usando realmente — tiacommander.com/stats. La lista de compatibilidad en vivo muestra cada dispositivo reportado como funcional entre todos los usuarios, con su número de pedido, firmware y las versiones de TIA Portal en las que se ha visto, junto con el uso de herramientas de la comunidad y la adopción de clientes de IA. Está construida a partir de telemetría anónima y agregada, y ofrece una imagen mucho más amplia que la tabla interna anterior.


Creación de Bloques

TiaCommander crea bloques PLC completos a partir de descripciones JSON estructuradas:

  • Bloques SCL — mediante la API de External Source (independiente del firmware)
  • Bloques LAD/FBD — mediante el constructor XML FlgNet con 69 tipos de instrucciones verificados:
    • Lógica de bits, temporizadores (TON/TOF/TP), contadores (CTU/CTD/CTUD)
    • Matemáticas (Add, Sub, Mul, Div, Mod, Abs, Sqrt, Sin, Cos, etc.)
    • Comparadores (EQ, NE, GT, GE, LT, LE)
    • Movimiento y conversión, lógica de palabras, desplazamiento y rotación, selección
    • Flujo de programa (llamadas FB/FC con cableado de parámetros, JMP/JMPN, RET, LABEL)
  • Números de bloque — asignados automáticamente si se omiten, o explícitos
  • Interfaces personalizadas — secciones Input, Output, InOut, Static, Temp, Constant

Datos en Vivo

La herramienta live_data lee valores reales directamente de una CPU en funcionamiento: bloques de datos, tablas de etiquetas, tablas de vigilancia y el buffer completo de diagnóstico de la CPU. Aquí es donde TiaCommander demuestra su valor para la depuración y para un ciclo de retroalimentación de desarrollo ágil: cambie un bloque, descárguelo y observe cómo se mueven los valores sin salir nunca de su cliente de IA.

  • Canal separado — las lecturas en vivo pasan por un proceso auxiliar dedicado (el puente S7) que se comunica con la CPU directamente a través del puerto TCP 102, independiente de la conexión de ingeniería de Openness, por lo que leer valores en vivo nunca interrumpe su sesión de TIA Portal.
  • Sin licencia, sin extras — la ruta de datos en vivo no necesita licencia de Openness ni software adicional de Siemens; habla el protocolo S7 por sí misma.
  • TLS y texto plano ambos soportados — S7-1200 V4.5+ y S7-1500 V2.9+ se conectan mediante TLS; las CPU más antiguas se conectan en texto plano. connect informa cuál se negoció realmente para la CPU que tiene delante.
  • Bloques optimizados y estándar — read_db devuelve valores simbólicos con códigos de calidad tanto de bloques de datos optimizados como no optimizados (estándar).
  • Consciente de contraseñas — se necesita una contraseña de CPU solo si el nivel de protección de la CPU lo requiere; puede almacenarse cifrada en reposo (por proyecto o global) para que connect la use automáticamente, y nunca se registra ni se muestra. Guarde una en la pestaña Credentials de la GUI del Manager, o simplemente pida a su asistente de IA que la almacene — globalmente para una dirección IP de PLC, o por proyecto.

Seguridad

El servidor MCP trata las operaciones de despliegue en PLC como destructivas. Estas acciones requieren cadenas de confirmación explícitas antes de ejecutarse:

AcciónQué hace
download_to_deviceDescarga software/hardware a un PLC en funcionamiento
upload_stationSube una estación PLC al proyecto
delete_unused_typesElimina tipos de librería con cero instancias

Todas las demás operaciones funcionan dentro del proyecto de TIA Portal y son reversibles antes de la descarga.


I/O Independiente

TiaCommander funciona completamente de forma independiente — no se requieren herramientas externas de gestión de archivos.

Tres modos de entrada para cada importación: ruta de archivo, contenido en línea o referencia de base de datos de exportación.

Tres modos de salida para cada exportación: en línea (predeterminado), base de datos de exportación o archivo.

Las exportaciones caducan automáticamente después de 24 horas. Gestione mediante las acciones de la herramienta admin.

Sin embargo, recomendamos encarecidamente combinar TiaCommander con Desktop Commander (GitHub) para su flujo de trabajo diario con agentes de IA. Desktop Commander le da a su asistente de IA acceso a la terminal, gestión de archivos y capacidades de edición de código en todo su sistema operativo. Esto no es una promoción pagada — usamos Desktop Commander todos los días en nuestro propio trabajo, y resulta que fue creado por nuestro colega letón, Eduards Ruzga. Es gratuito, de código abierto, y hace que todo sea mejor.


Datos y Privacidad

Todos los datos permanecen en su máquina. La base de datos SQLite local almacena estadísticas de uso de herramientas, perfiles de dispositivos, registro de errores y caché temporal de exportaciones.

TiaCommander recopila telemetría limitada para mejorar el producto:

  • Informes de errores — cuando falla una llamada de herramienta, se envía el tipo de error y el contexto para que podamos identificar y corregir problemas.
  • Estadísticas de uso de herramientas — qué herramientas y acciones se usan con más frecuencia, para entender qué es más valioso.
  • Información del cliente de IA — qué asistente de IA está conectado (nombre y versión del cliente), para garantizar la compatibilidad.

Ningún dato de programas PLC, archivos de proyecto o contenidos de bloques se transmite jamás.

Su información personal (nombre, apellido, correo electrónico) proporcionada durante el registro se rige por las normas GDPR de la Unión Europea. No compartimos, vendemos ni divulgamos sus datos a terceros. Nunca le enviaremos materiales de marketing ni nada que no esté directamente relacionado con su uso de TiaCommander — a menos que nos lo solicite explícitamente.


Lo Que Viene

TiaCommander se desarrolla activamente. Esto es en lo que estamos trabajando:

  • Integración HMI — acceso a pantallas HMI, etiquetas y vistas de alarmas
  • Mayor cobertura de datos en vivo — más de lo que expone un PLC en funcionamiento, en más familias de CPU
  • Soporte de simulación — manejar PLCSIM para desarrollo y pruebas sin conexión
  • Validación de hardware más amplia — más familias de dispositivos y firmware verificados internamente, guiados por el uso en el mundo real

¿Tiene una idea de funcionalidad? Envíela en GitHub.


Inicio Rápido

Claude Desktop (un clic): Descargue TiaCommander.mcpb desde Releases, luego instale mediante Settings -> Extensions -> Advanced Settings -> Install Extension. Listo.

Todos los demás clientes de IA: Descargue el ZIP portátil y consulte la Guía de Inicio Rápido — todo lo que necesita para ponerse en marcha en 5 minutos: extraer, configuración del grupo Openness, configuración del cliente de IA para los 7 clientes probados, activación de licencia y primeros comandos.

Los archivos de configuración listos para usar de cada cliente de IA están en la carpeta configs/.


Licencia y Comentarios

TiaCommander es un software propietario publicado por SIA A4 Studio. Durante el período beta, la herramienta es completamente gratuita con uso ilimitado y todas las herramientas disponibles — sin restricciones.

A cambio, contamos con usted para ayudarnos a mejorar TiaCommander. Si encuentra un error, tiene una idea para una nueva funcionalidad, o simplemente quiere compartir cómo usa la herramienta en su flujo de trabajo — queremos saber de usted:

Cada informe, cada sugerencia, cada comentario nos ayuda a construir una mejor herramienta para la comunidad de automatización de Siemens.

Consulte LICENSE.txt para conocer los términos completos. Visite tiacommander.com para más información.


Marcas Comerciales

TiaCommander™ es una marca comercial de SIA A4 Studio. Siemens, TIA Portal, SIMATIC, S7-1200, S7-1500 son marcas comerciales de Siemens AG. TiaCommander no está afiliado, respaldado ni patrocinado por Siemens AG.


Agradecimientos

Gracias a todos los que han abierto un issue o nos han enviado comentarios — realmente nos ayuda a mejorar TiaCommander, y leemos cada palabra. Y si su experiencia ha sido fluida y no hay nada que informar, le agradeceríamos que dejara una estrella en el repositorio — es algo pequeño, y ayuda a otros ingenieros de Siemens a encontrar la herramienta.