# Reported issues for TiaCommander

Pod holds 19 of 22 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [TiaCommander](/mcp/tiacommander).

## Most discussed

### blocks_read/db ignore blocks inside Program-blocks user groups (subfolders); xref recurses correctly - asymmetric traversal + undercounted compile

Thanks again for the tool. Reporting a second, unrelated issue.

**Environment:** TiaCommander v2.30.3 (portable), TIA Portal V18, S7-1200 project.

**Problem:** `blocks_read` (`list`, `get_details`, `get_interface`) and `db` (`list`, `get_structure`) only see blocks sitting **directly at the Program-blocks root.** Any block moved into a user group (subfolder) becomes invisible: `get_details`/`get_interface` on its exact name returns *"Block not found"* (tried plain name, `Group/Block`, and…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/10) · 2026-07-16 · closed · external user · 2 comments

### No way to target a specific TIA Portal version on multi-version machines - always binds V18 (V17/V18/V21 installed)

Hi -- first off, thanks for TiaCommander; setup and licensing were smooth and the tool itself works well. I've hit a wall on version selection, though.

**Environment:** TiaCommander v2.30.3 (portable), Windows 11 Pro, TIA Portal **V17, V18, and V21** installed side by side. All Openness prerequisites in place (Openness user group, .NET 4.8).

**Problem:** My work is in a V17 project, but TiaCommander always binds the **V18** engine, no matter which project path I pass to `session open`.…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/9) · 2026-07-16 · closed · external user · 2 comments

### NullReferenceException on every project with TIA Portal V16

TiaCommander cannot perform any project operation on TIA Portal V16. session open, create, connect, and get_project all fail with a NullReferenceException.
The Openness layer itself works fine, the project file is physically created on disk and opens in the TIA Portal GUI, and Openness correctly rejects a second open with "Another project is already open." The exception is thrown afterwards, inside TiaCommander's own code, so the project is never registered and every downstream tool…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/8) · 2026-06-12 · closed · external user · 1 comment

### [Bug] udt move of a UDT makes every UDT that uses it inconsistent (moving the same UDT in the TIA UI does not)

## Description

`udt move` is emulated as export → delete → import. When the moved UDT is used by another UDT, the using UDT becomes inconsistent after the move and has to be recompiled before it can be exported or moved. Moving the same UDT by drag and drop in the TIA project tree keeps the using UDT consistent – so this is caused by the emulation, not by TIA.

## Steps to Reproduce

1. UDT `UDT_Repro_Pos` (root) is used by `UDT_Repro_Params` (root, member `AxisX : Struct` with `Home`/`Work :…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/31) · 2026-10-01 · open · external user · 0 comments

### [Feature] Usability improvements: export overwrite, safer imports, compile hints, debug logging, project languages, catalog on empty project

## Problem

Several small gaps make automated workflows (AI client driving TiaCommander) fragile or hard to diagnose:

1. **Exports never overwrite.** `blocks_read export_xml_file` / `export_source` fail with `... already exists` when the target file exists, and there is no `overwrite` option. In an export → patch → import loop the old file stays in place; when the error is overlooked, the old code is re-imported (this happened in practice).
2. **Import overwrite without a backup is silent.**…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/30) · 2026-10-01 · open · external user · 0 comments

### [Bug] LAD create_block: absolute operands (%I0.2, %M101.0) are emitted as symbolic tags ("%I0"."2") – compile error

## Description

In `blocks_write create_block language=LAD`, an absolute address used as operand of a contact or coil is written to the network as a symbolic access to a tag named `"%I0"` with member `"2"`. The import succeeds, the compile fails. This happens also when a tag exists at that address. The tool description lists memory addresses as valid operands ("global tags or memory addresses").

## Steps to Reproduce

1. `blocks_write action=create_block blockName="OB_Repro_LAD" blockType=OB…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/28) · 2026-10-01 · open · external user · 0 comments

### [Bug] udt get_structure shows a nested Struct incorrectly – first sub-member missing, second shown at top level

## Description

For a UDT with a `Struct` member that contains sub-members, `udt get_structure` drops the first sub-member and shows the second one as a top-level member. The UDT itself is correct (verified with `udt export_xml`). Only the read-out is wrong, but it is misleading for anyone (or any AI client) relying on it to build code or documentation.

## Steps to Reproduce

1. `udt action=create udtName="UDT_Repro_Pos"…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/27) · 2026-10-01 · open · external user · 0 comments

### [Bug] Bulk modes still require the single-item parameters; members[] key name mismatch (memberName vs name)

## Description

1. The bulk variants (`tags[]`, `members[]`, `memberNames[]`) are rejected with `MissingArgument` unless the single-item parameters are also passed (for `delete_member` the parameter description explicitly says the single-item `memberName` is ignored when `memberNames` is present). Dummy single-item values are indeed ignored (no extra object is created), so the check is only a validation issue.
2. `udt create members[]` requires the key `name`, while its description refers to…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/26) · 2026-10-01 · open · external user · 0 comments

## Most recent

### [Bug] OB numbers 30–38 (cyclic interrupt) refused by create_block; create_ob silently changes OB number and type; wrong default OB title

## Description

1. `create_block` with `blockType=OB` and `secondaryType=CyclicInterrupt` works, but any `blockNumber` from 2 to 122 is refused as "reserved for system OBs". On S7-1500, OB30–OB38 are the standard numbers for cyclic interrupt OBs (likewise OB10–17 time-of-day, OB20–23 time-delay, OB40–47 hardware interrupt, OB100 startup …). TIA itself accepts OB30 – verified by XML import.
2. `create_ob` has no OB type parameter; `obNumber=30` is silently replaced (here by 124) and the OB is…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/25) · 2026-10-01 · open · external user · 0 comments

### [Bug] Block names containing "/" cannot be addressed – even right after the tool created the block

## Description

`/` is a valid character in TIA block names (real project: cyclic interrupt OB30 "EtherNet/IP" that calls an EtherNet/IP scanner FB). TiaCommander cannot address such a block by name – apparently `/` is treated as a folder separator. The resolver does find the block, it even offers it in "Did you mean", but refuses to use it. This also breaks the tool's own post-import verification.

## Steps to Reproduce

1. `blocks_write action=import_xml_inline` with an `SW.Blocks.OB`:…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/24) · 2026-10-01 · open · external user · 0 comments

### [Bug] udt update_member_comment fails on a UDT that contains a Struct member – generated SCL source has a syntax error

## Description

`udt update_member_comment` goes through a generated SCL source. For a UDT that contains a member of type `Struct` (with nested UDT members), the generated source is invalid and `GenerateBlocksFromSource` fails. The UDT itself is not damaged.

## Steps to Reproduce

1. `udt action=create udtName="UDT_Repro_Pos" members=[{"name":"Pos","dataType":"Real"},{"name":"Vel","dataType":"Real"}]`
2. `udt action=create udtName="UDT_Repro_Params" members=[{"name":"AxisX","dataType":"Struct…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/23) · 2026-10-01 · open · external user · 0 comments

### [Bug] UDT import with overwrite fails for a UDT in a subfolder ("fully qualified name already exists"); import_xml_file targetFolder looks in Program blocks

## Description

1. `udt import_xml overwrite=true` fails for a UDT located in a subfolder of PLC data types: TIA reports that an element with the same fully qualified name already exists. The same file imports fine when the UDT is at the root.
2. `blocks_write import_xml_file` with a UDT XML and `targetFolder` reports `FolderNotFound` for an existing PLC data types folder – the folder is apparently looked up in Program blocks.

## Steps to Reproduce

1. UDT `UDT_Repro_Params` at root. `folders…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/22) · 2026-10-01 · open · external user · 0 comments

### [Bug] Devices in "Ungrouped devices" are invisible to all device-based tools; devices only addressable by the internal Device object name

## Description

PROFINET IO devices that TIA places in **Project tree → Ungrouped devices** (the default when an IO device is added or pasted in the network view) are not enumerated by TiaCommander. They are missing from `session list_devices` and `hardware get_full_config`, cannot be addressed by `deviceName`, and `hardware get_network` shows their network node without a device. After moving the device to the top level of the project tree it becomes visible.

Related: devices can only be…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/21) · 2026-10-01 · open · external user · 0 comments

### [Bug] hardware: I/O addresses of all modules (local, PROFINET IO devices, GSDML devices) are reported on the CPU; modules show no addresses

## Description

The `hardware` read actions report every I/O address range of the project on the CPU (`PLC_1`) – for modules in the CPU station, for modules of a PROFINET IO device and for a GSDML device. The modules themselves are listed without addresses. Start addresses and lengths are correct; only the owner (device/module) is wrong.

Impact: tags for a specific module cannot be created from the tool output (the original use case: "create tags for the addresses of the newly added module").…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/20) · 2026-10-01 · open · external user · 0 comments

### [Bug] instantiate_library_type of an FB fails with a misleading "F-A-5 already instantiated" message after its UDTs were instantiated separately

## Description

Instantiating an FB library type from a global library fails if the FB's UDT dependencies were instantiated from the same library first (separate `instantiate_library_type` calls). The tool reports the "V19 F-A-5 rule" (version already instantiated on the device), but the FB does not exist on the device. Instantiating the FB directly – without the UDTs first – works and brings the UDTs automatically.

## Steps to Reproduce

Global library `Libraries_Comm_Controller` (Siemens,…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/19) · 2026-10-01 · open · external user · 0 comments

### [Bug] Post-import verification attributes compile errors of OTHER blocks to the edited block → false rollback, valid change lost

## Description

After an edit (here `blocks_write add_network`) the tool verifies the change by compiling. The compile result contains errors of other blocks in the program; the tool treats them as errors of the edited block, reports `VERIFY FAILED`, restores the backup and the change is lost – although the edited block itself compiled successfully. It also reports `RESTORE INCOMPLETE`, because the unrelated error is still there after the restore.

## Steps to Reproduce

1. Project contains an…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/18) · 2026-10-01 · open · external user · 0 comments

### [Bug] move_block on a know-how protected block deletes it – re-import of the exported XML fails, restore fails the same way

## Description

`blocks_write move_block` emulates a move as export → delete → import. For a know-how protected FB the export succeeds, but the exported XML cannot be imported back – neither into the target folder nor as the restore. The block is removed from the project.

The tool reports this correctly (`MoveFailedRestoreFailed`, block MISSING, backup path, "do not save"), so data loss can be avoided by closing the project without saving – but the operation should not delete the original in…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/17) · 2026-10-01 · open · external user · 0 comments

### [Bug] Non-ASCII text passed in tool parameters is corrupted (UTF-8 read as Windows-1250) – comments, titles in blocks, DBs, tags, UDTs

## Description

Every text with non-ASCII characters (here Polish: ą ć ę ł ń ó ś ź ż) that is passed to TiaCommander in a tool parameter arrives corrupted in TIA. The pattern is exactly UTF-8 bytes decoded as Windows-1250 (e.g. `ś` → `Ĺ›`, `ę` → `Ä™`, `ł` → `Ĺ‚`).

It affects all tested paths, including ones that do not go through External Source or XML import (e.g. `tag add_tag` writes the comment directly via the API, into the correct culture, but already corrupted). The text is therefore…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/16) · 2026-10-01 · open · external user · 0 comments

### [Bug] create_block language=SCL drops member attributes (Retain, ExternalAccessible/Visible/Writable), also on overwrite

## Description

`blocks_write create_block` with `language=SCL` (External Source route) does not apply member attributes and resets them on every `overwrite=true`:

- `remanence: "Retain"` in `interface` is not applied. The tool says SCL source cannot express remanence, but TIA's own SCL source does (`VAR RETAIN`).
- `ExternalAccessible` / `ExternalVisible` / `ExternalWritable` set to `false` (in TIA or via XML import) are reset to `true` by the next `create_block` overwrite. There is no…

[Read the thread](https://github.com/a4webdev/tiacommander-mcp/issues/15) · 2026-10-01 · open · external user · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/a4webdev/tiacommander-mcp/issues).
