Changelog

Changes in each release of the extension and plccheck.

2.18.0

  • Set cpuFamily in .plc.json (S7-1200, S7-1200 G2, S7-1500 or S7-300/400) to enable CPU-specific checks. tia export writes it.
  • Report IEC timer calls without the time_type template that S7-1500 and S7-1200 G2 require, with a quick fix that adds it.
  • Report FBD/LAD boxes with a missing or wrong S7_Templates type, matching what TIA Portal accepts, with quick fixes. S7_Templates must now be written the way TIA exports it.
  • Report constructs TIA Portal refuses to import or compile: MOVE with Bool operands, Mux and Demux without an ELSE pin, RUNG NOT, SCL function names used as boxes (USINT_TO_REAL, Norm_X, In_Range), comments inside rungs and repeated metadata blocks.
  • Support BCD16 and BCD32 Convert boxes.
  • Fix DWORD_TO_REAL, REAL_TO_DWORD, LWORD_TO_LREAL and LREAL_TO_LWORD converting the value instead of copying the bit pattern.

2.17.2

  • Install TIA bridge versions in parallel with separate Siemens trust entries, preventing repeated administrator prompts when different plccheck or VS Code versions run together.
  • Prevent background TIA status checks from installing or repairing the bridge and requesting administrator access.

2.17.1

  • Fix TIA bridge trust install issue

2.17.0

Graphical editor

  • Add graphical LAD editing with continuous rungs, parallel branches, shared instruction and network tools, monitoring, and graphical comparisons.
  • Add a PLC Monitoring sidebar that reads live DB and symbolic I/Q/M values from a Siemens CPU over S7CommPlus and shows them in FBD, LAD and source editors. Choose an FB instance to resolve its locals through instance DBs, multi-instances and array instances. Monitoring is read-only and currently requires a CPU that permits reads without a password.
  • Edit SCL networks inside the graphical editor with a full embedded SCL editor, including highlighting, completion, hover, go to definition and diagnostics.
  • Add editable .s7dcl interface tables with validation, type suggestions, spreadsheet paste, and collapsible sections and networks.
  • Add find and replace to the graphical block editor, covering collapsed networks and interface declarations.
  • Add an Open block action to graphical calls. Instance calls open the function block instead of the instance declaration.
  • Keep the graphical editor's scroll position, zoom and collapsed networks when switching to the text editor and back, or after reloading VS Code.
  • Open graphical blocks faster.
  • Draw FBD Boolean logic feeding a call input as one connected circuit at that input.
  • Add a file icon for TIA metadata sidecars (*.meta.json).

TIA Portal

  • Add plccheck hmi and a stdio MCP server for WinCC Unified inspection, checked property/event edits, global JavaScript import/export, creation, compilation and explicit saving.
  • Deploy full and delta HMI builds to a local Unified simulation and test browser interactions with runtime tag-value and quality assertions. Initial deployment support covers TIA V21, V20 Unified panels and one registered simulation.
  • Configure Siemens access-point routing and WinCC PLC certificate trust through HMI commands without desktop automation.
  • Fix TIA downloads failing with "The configuration provided is invalid" when a changed data block requires reinitialization. Actual values are kept when TIA offers that option; otherwise affected DBs are reset to their start values.
  • Surface native TIA Openness warnings from PLC block and project-library document exports while preserving the documents those exports produced.
  • Include system instance DBs under Program resources in TIA Openness exports.
  • Record assigned block numbers, including automatically assigned ones, in TIA export metadata.

Diagnostics and parsing

  • Diagnose absolute DB addresses such as %DB110.DBX8.1 that refer to optimized, ambiguous or unverified DBs in SCL, FBD, LAD and PLC tests. Hover shows the DB's identity and access settings, and Go to Definition opens the verified declaration.
  • Report FBD branches that rejoin at two inputs of the same block (S7DCL_FBD_ALTERNATIVE_PATH), which TIA Portal rejects.
  • Accept more native TIA export forms: nested comments and free-text REGION titles, numeric separators such as 1_000_000.0, classic global tag names split around reserved words, calls on array elements selected by expressions, and comment-only DB member values.
  • Fix typed literals absorbing a following .., + or -, which made compact forms such as BYTE#3..INT#4 and INT#32767+INT#1 evaluate incorrectly.
  • Validate block number and optimized-access attributes in block headers.

PLC simulation and testing

  • Execute LAD control flow and bit logic: JumpCoil/I_JumpCoil, labels, Switch dispatch, edge contacts and triggers, latches, count-up counters and timer reset coils, including FBD networks retained inside LAD blocks.
  • Execute SIMATIC timers (S_ODT, S_ODTS, S_OFFDT, S_PEXT) and their LAD coil and box forms, with symbolic TIMER tags and S5TIME presets.
  • Follow Siemens S7-1500 semantics for TIME/LTIME, IEC timers (including TONR), counters and SR/RS flip-flops.
  • Implement more instructions: MOVE_BLK, FILL_BLK, SCATTER_BLK/GATHER_BLK, GATHER/SCATTER, HTA, POKE, DPRD_DAT/DPWR_DAT, word logic, LIMIT, and the selection, math, rounding and numeric conversion instructions.
  • Model PLC memory like the CPU: absolute %I/%Q/%M/%DB operands work on any pin, overlapping I/Q/M tags share one process image, AT overlays and non-optimized DB members share one byte layout, and STRING/WSTRING use Siemens storage and semantics.
  • Pass FB IN_OUT and other block parameters by the S7-1200/1500 copy and pointer rules. IN_OUT values are now copied back to the caller.
  • Fix DB start-value overrides being skipped when a global DB starts with a structure, exported system constants falling back to zero, and multi-output MOVE re-evaluating its input.
  • Serve OPC UA values with their declared scalar types, and expose typed arrays and individual array elements.
  • Add an optional read-only S7CommPlus server to generated runtimes (--s7-listen) for Siemens clients and monitoring.
  • Reuse one compiled builtin library across generated PLC programs, so rebuilding after a program change is faster.

2.16.0

  • Export PLC tag tables through both TIA software export engines and import edited tables through Openness, including their folders, constants, comments, and access settings.
  • Include PLC tag tables in the extension's TIA comparison and import workflow.

2.15.0

  • Rewrite FBD viewer to be a full FBD editor
  • Add graphical FBD diff rendering, like the TIA compare feature
  • Add a TIA Portal integration to the VS Code extension: link an exported PLC folder to its TIA project through a tia section in .plc.json, compare and import through a TIA Portal source control provider with per-file diff editors, publish TIA compile errors and warnings in the Problems panel, and run download, online, offline, and retain-snapshot actions from a status bar menu.
  • Speed up generated-code handling for inline structs by using isolated type state during parallel SCL export.

2.14.0

  • Add a fast direct TIA V21 software exporter that reads .zap21 and .ap21 projects without launching TIA Portal and reproduces editable SCL, S7DCL, AWL, DB/type, project-library, resource, and system-constant artifacts.
  • Split plccheck tia export into tia export software <project> and tia export hardware <project>. Software export defaults to an auto engine that tries the direct reader before falling back to Openness, while hardware export remains Openness-only; use --engine direct or --engine openness to force one software engine.
  • Report direct-export warnings, skipped items, and failures before an automatic Openness fallback.
  • Transpile mixed SCL, FBD, and LAD networks from one .s7dcl file in source order. The transpile command now determines the source format from the file extension and no longer accepts --from.
  • Use the language server's S7DCL network structure in the graphical preview and show mixed-language files with an MX decoration instead of guessing one language in the extension.
  • Make generated PLC runtimes and .scltest executions honor Siemens initialization semantics for function defaults, FB instances, DB start values, arrays, structs, repeated values, and omitted call parameters. Also fix edge-detector outputs and unresolved composite FB pins in generated code.
  • Diagnose comparison contacts placed after Boolean elements or chained in one FBD rung, preventing shapes that TIA cannot reopen graphically.
  • Make plccheck version print the CLI name and actual package version.

2.13.0

  • Add DTL types and literals to SCL and .scltest, including syntax highlighting, completions, semantic validation, and precise diagnostics for invalid fields and ranges.
  • Add project constants to the graphical tag table editor and treat them as read-only PLC symbols in completions, navigation, type checking, and generated programs.
  • Show tag table errors and warnings directly in the graphical editor, including duplicate names and cross-file conflicts between tags, project constants, and data blocks.
  • Improve FBD and S7DCL validation by reporting missing END_RUNG markers, rejecting chained comparison contacts, and preventing unclosed SCL block comments such as (* from expanding into neighboring networks in .s7dcl files.
  • Parse unquoted multi-word TITLE metadata in Siemens source exports.
  • Fix retained values in nested DB members not being copied to start values during TIA snapshots.
  • Handle empty TIA project-library metadata placeholders by falling back to the matching exported source files.

2.12.0

  • Add a persistent plccheck tia rpc JSON-RPC host with reusable TIA sessions, bounded object handles, reflection discovery/invocation, event subscriptions, audit reads, cancellation, and explicit write/device/private/filesystem policy gates designed for use by LLMs and other tools.
  • Add managed TIA host status, install, upgrade, and uninstall commands, a stable Program Files installation, candidate manifests, automatic lockstep upgrade/re-trust, transactional rollback, and interrupted-update recovery.
  • Export hardware.aml, PLC system constants, and deterministic project, network, and per-device YAML views alongside TIA software exports.

2.11.2

  • Add Wine/Linux container support for the existing plccheck tia list and tia export workflows.
  • Make the existing SCL and document-based FBD/LAD export paths work under Wine through TIA Openness, without reading project storage.
  • Add Wine-focused project-open and PLC traversal diagnostics, plus reliable bridge process cleanup for automation.

2.11.0

  • Add Siemens PLC file icons and file decorations for common PLC source, resource, database, library, and test files.
  • Replace the generated-project go-gen workflow with compile and run commands, including matching VS Code task/debug/test wiring and plccheck wrapper support.
  • Validate SCL-backed function and function block call pins in .scl, .st, and .s7dcl networks
  • Add a quick fix action to update inline FBD block calls.
  • Add shared SCL builtin definitions for editor tooling and generation, including PID_Compact interface validation, hover/definition support, and generated runtime replacement support.
  • Improve TIA Openness setup and attach behavior by ensuring trust setup also covers windows group membership, fixing running-project enumeration, and surfacing missing Siemens product/add-on errors more clearly.
  • Add --overwrite-remote-changes flag to plccheck tia import to allow overwriting changes done in TIA since the last export

2.10.0

  • Add TIA openness integration to plccheck
  • Make OPC server siemens compatible - can now connect ignition directly to the debugger runtime
  • Fix bug where PLC memory for some builtins was shared between parallel unit tests
  • Update docs

2.9.0

  • Add syntax aware colde folding to editor and outline
  • Add references (cross-references) with right click -> go to references or shift+F12
  • Add right click -> show call hierarchy or shift+alt+H
  • Renamed diagnostics codes to be more descriptive

2.8.0

  • Add SCL_DUPLICATE_INSTANCE_CALL and S7DCL_FBD_DUPLICATE_INSTANCE_CALL warnings for calling the same function block instance twice in the same file

2.7.0

  • Add outline panel with support for showing symbols in .s7dcl and .scl files
  • Show interface comments on hover, including comments resolved from .s7res files
  • Show VAR CONSTANT values on hover

2.6.2

  • Fix checking PLC folders with shared top-level Types files and mixed rootless files
  • Validate FBD boolean operator shapes more strictly
  • Allow valid TIA-exported FBD compare, timer, and boolean-operator chains

2.6.0

  • Add project library support
  • Allow using constants for array bounds
  • Support ARRAY[*] syntax for variable-length arrays
  • Expand go-gen builtin/runtime support and call lowering for existing Siemens builtins supported by the LSP, including timers, record I/O, safety blocks, time reads, and communication helpers.
  • Support additional Siemens syntax forms including **, *=, /=, MOD, multilingual (/* ... */) comments, aggregate/repetition initializers, overlay selectors like %B0/%W1, and improve quoted function result handling in .s7dcl diagnostics.

2.5.0

  • Add code coverage reporting
  • Much improved .scltest language support
    • Context aware completions
    • Better assertions
    • WAIT_UNTIL xx TIMEOUT T#100ms;
    • HOLD xx to write a variable every cycle
    • RELEASE and RELEASE_ALL to release held variables
    • ASSERT_NEAR left := right TOLERANCE 10.0; - Assert that two values are within a certain distance of each other, useful for floating point comparisons

2.4.0

  • Add PLC debugging in VS Code with plc launch configs, breakpoints, stopOnEntry, and custom entryOb selection.
  • Add PLC Debug Dashboard and PLC Live Watch views with live values while the PLC keeps running.
  • Add inline live-value overlays in SCL and support editing watched values during debug sessions.
  • Add .scltest language support, Test Explorer integration, and npx plccheck test for CLI and CI runs.
  • Support whole-program tests via TEST_ENTRY and isolated FC/FB tests via TEST_TARGET.
  • Improve .scltest completions, generated runners, builtin state isolation, runtime builtin coverage, and lowering for VAR_GLOBAL, FOR ... BY, LEN, MOD, multiline sourcemaps, and stateful builtin arguments.

2.3.2

  • Switch README screenshots to externally hosted images for more reliable rendering on extension marketplaces and package viewers.

2.3.1

  • Fix bundled README screenshot paths so the extension listing and documentation previews render correctly.

2.3.0

  • Add siemens-lsp transpile command to convert .s7dcl diagram networks (FBD/LAD) to SCL with diagnostics.
  • Add siemens-lsp go-gen command to generate a runnable Go PLC project from SCL and .s7dcl sources.
  • Add graphical tag table XML editor

2.2.0

  • Add preview FBD view to show function block networks graphically in .s7dcl files
  • 20% overall speedup, 10x speedup on hover diagnostics

2.1.0

  • Add full support for .s7dcl files with FBD and SCL networks.
  • Show .s7res comment overlays in more places
  • Show function block interface comments when hovering over function block pins

2.0.1

  • Re-add support for AT syntax
  • Re-add support for legacy .udt files
  • Re-add support for header keywords NON_RETAIN, STANDARD, KNOW_HOW_PROTECT, UNLINKED, READ_ONLY, CODE_VERSION
  • Fix AWL function block network end terminator detection

2.0.0

This release contains a full rewrite of the LSP in Go, targeting improved maintainability, performance, and more dynamic language parsing.

  • VS Code extension now runs on the Go backend for diagnostics, hover, completion, and go-to-definition.
  • Improved editor UX and navigation:
    • Go-to-definition for function/FB calls and types in variable declarations.
    • Better support for quoted identifiers (including spaces and dotted segments) in hover, completion, and go-to-definition.
    • Completion filtering by scope; local variable completions now automatically insert the required # prefix.
    • Inlay hints for .s7res titles in .s7dcl, plus Cmd/Ctrl+Click to jump from .s7dcl references to the corresponding .s7res entry.
    • Fix Windows file URI normalization for more reliable cross-platform navigation.
  • Expanded language and file support:
    • Partial .s7dcl parsing (container-aware) to support .s7res linkage.
    • .s7res parsing and validation, including resource ID and localization ID checks.
    • .awl parsing and diagnostics (plus better mixed-content file handling).
    • Resolve globals from PLC tag-table XML for fewer "undefined" diagnostics.
  • More semantic diagnostics:
    • Type-coercion matrix checks (including warnings) and improved numeric range/precision diagnostics.
    • Stronger array indexing support (partial multidimensional indexing) and validation (types, dimensions, and static bounds).
    • Added parsing/checking for WHILE, EXIT, CONTINUE, pointer literals with BYTE length, and MOD.
    • Improved type inference for logical and bitwise operators.
  • Faster analysis on larger projects, about 300k lines/second on M3 Pro
    • CLI siemens-lsp check supports folder inputs, parallel jobs (--jobs), optional warnings output (--show-warnings), and prints a metrics summary.
  • Removed with the legacy TypeScript backend:
    • Types explorer tree view.
    • FBD XML → SCL conversion command.
    • Legacy rescan/index progress notifications.

1.14.0

  • Enable go-to-definition (Ctrl/Cmd+Click) for DBs, user types, and nested struct fields, including quoted identifiers and cross-file references.
  • Resolve built-in structs on hover
  • Show source file path in type hover preview
  • Add "Compound part of instruction expected" error for CASE conditions without any statements
  • Validate function call parameter names
  • Validate function call parameter datatypes
  • Validate length of string when assigning string literals (does not support string length defined by constants)

1.13.0

  • When having a dangling comma in SCL function calls, point out the comma instead of the unexpected parenthesis
  • Control-click variables to go to definition
  • Allow unquoted TITLE fields for blocks
  • Add support for built-in types VARIANT, IP_V4, TCON_IP_v4, TADDR_Param, TSEND_C, TDISCON, TSEND, TUSEND, T_RESET, TDIAG, TDiag_Status, TCON, CONN_OUC

1.12.0

  • Flag access to local variables without # sign as separate linter error
  • Check access of SCL function calls
  • Use .plc.json files to separate multiple PLC workspaces in a single VS Code workspace to not mix types between them
  • Fix quoted struct members being handled case-sensitively

1.11.0

  • Add support for .udt files

1.10.0

  • Rewrote hover type hint to handle
    • Local and external references to DBs, instanceDBs, local structs, local instanceDBs
    • Quoted tags with spaces in them
  • Fix type lookups being case-sensitive (Siemens auto-converts to correct case)
  • Add a command palette entry to generate .scl files from FBD XML using the transpiler
  • Support hashtags in properties (#localVar.#element was failing previously)
  • Fix type inference on hovering arrays

1.9.0

  • Parsing of .db files (previously DBs were only parsed in .s7dcl files)
  • Fix not erroring on invalid member access of global DB

1.8.0

  • Pointer support in parser
  • Parsing and interpreting of SCL networks in FBD xml blocks
  • Basic FBD parser
  • Highlight invalid types in .xml files
  • Error on undefined variables in .xml files (missing sourcemap support)
  • Maintain variable capitalization, making types and debug outputs a lot easier to read
  • XML to SCL transpiler
  • SCL to Go transpiler (WIP)
  • Support chained assignments (#a := #b := 1;)
  • Ignore control flow keywords in VAR blocks
  • Do highlighting for .st files
  • Base integer literals (SINT#16#FF)

1.7.0

  • Interpreter: Fix case statements with multiple labels and range labels
  • Much improved test coverage
  • Add cyclic execution to CLI
  • Handle type coercion to booleans and alert on errors
  • Fix bitstring w#16#0001 in interpreter being interpreted as strings in certain cases
  • Error on multiple attribute blocks on a single variable
  • Fix handling of % to match MOD
  • Give lints on return types from built-in functions in expressions
  • Fix not universally allowing 1/0 as a placeholder for TRUE/FALSE

1.6.0

  • Add type indexing visualization panel
  • Fix not exposing local variables parsed from SCL FBs
  • Show external type definitions when hovering types in SCL variable definition sections
  • Add rudimentary SCL interpreter

1.5.0

  • Parse .s7dcl type files
  • Parse .s7dcl datablock files
  • Resolve datatypes across files
  • Error on invalid global variables
  • Support for custom length string and wstring (String[20])

1.4.0

  • Add exponent operator support
  • Multidimensional arrays

1.3.0

  • Add support for LTIME
  • Add support for compound units in time literals (T#1h_30m)
  • Don't error on VAR CONSTANT in FC
  • Don't allow assignment to local constants
  • Show local variable type on hover

1.2.0

  • Extended YAML parser for .s7res files
  • Error on access to undefined local variables, including struct support

1.1.0

  • Add support for FC return values
  • Verify no static variables in FC

1.0.0

  • Add most commonly used language features to new parser

0.1.0

  • Add language server
  • Check missing semicolons
  • Check unclosed blocks

0.0.1

  • Initial release with basic syntax highlighting and language configuration.