All notable changes are recorded here. The format follows Keep a Changelog, and versions follow Semantic Versioning.
- A Windows source path no longer breaks the generated module. The path is
embedded in the module docstring, where a backslash is an escape sequence, so
D:\a\plant\Motor.sclproduced Python that would not parse. Paths and comments are now escaped wherever they land in a docstring, and a source path containing*)can no longer close a Structured Text comment early.
0.4.0 - 2026-02-27
plcforge scaffold: generates a complete, installable Python repository with a vendored runtime, an entry point that runs the scan cycle, tests and packaging metadata. The result has no dependency on plcforge.- Python frontend: lifts Python control code back into the IR, so a project can go SCL to Python and back and still be recognisable.
- Implicit Python locals are declared in a
VAR_TEMPblock with the type the resolver derived, rather than being dropped. plcforge liftas a direct route from Python to Structured Text.
- A
return <value>inside a lifted function is assigned to the function result instead of being lost. - The section markers that group variables (
# VAR_INPUT) are read from the source that was handed in, not re-read from disk, so lifting a string works.
0.3.0 - 2026-02-21
- C++17 backend with a header-only runtime: types, standard blocks, bounds checked arrays and a scan engine.
CASEover single labels becomes aswitch; ranges become a branch chain.--namespaceand--no-runtimefor the C++ target.
LIMIT,MIN,MAXandSELdeduce a common type, so mixingREALand adoubleliteral compiles.- A negated literal loop step (
BY -1) is folded at translation time, so the loop comparison is chosen statically rather than at run time. - An undeclared
FORcounter is declared in the generated C++, which Structured Text permits and C++ does not.
0.2.0 - 2026-02-14
- PLCopen XML frontend for Ladder Diagram and Function Block Diagram: contacts,
coils, set/reset and negated coils, parallel branches, operator blocks,
function block instances and
executionOrderId. - Edge sensitive contacts create an implicit
R_TRIG/F_TRIGinstance. - Structured Text backend, which is what makes a ladder rung reviewable as text.
- Diagnostics carry a code and a hint.
- A block whose outputs nothing reads is still called, instead of being skipped.
- Dangling connections and unsupported body languages are reported rather than producing an empty POU with no explanation.
0.1.0 - 2026-02-07
- Structured Text / SCL frontend: full statement set, IEC operator precedence, structures, enumerations, multi-dimensional arrays, based and duration literals, direct addresses, nested comments and pragmas.
- Typed intermediate representation with a resolver that annotates every expression.
- Python backend with a scan-cycle runtime: injectable clocks, the standard function blocks and the IEC functions where Python's operators disagree.
- Error recovery: a malformed statement is reported and parsing continues.
- Command line interface:
convert,check,info.