Repository navigation
OpenPLC Editor v4.3.0
·
819 commits
to development
since this release
OpenPLC Editor v4.3.0
Our biggest release since the 4.2 line, with new industrial protocols, a major step toward full IEC 61131-3 / CODESYS parity, and a reworked data-type system. Highlights are below; the complete list of changes is at the bottom.
Industrial protocols
- S7comm server on bare metal. Baremetal targets now answer Siemens S7 clients: Read/Write Var against live PLC variables, CPU identification, and start/stop, at roughly 1,600 reads per second. It works with TIA Portal, python-snap7, and similar tools.
- Unified Modbus server. One Modbus server configuration screen now works the same way across bare-metal boards and Runtime v4, instead of two screens that shared nothing.
IEC 61131-3 language
- Python and C++ function blocks reach full IEC parity. A native block now sees the same Variables Table as an ST block, including structures, enumerations, function-block instances, arrays, and every variable class.
- RETAIN, CONSTANT and NON_RETAIN. The IEC variable qualifiers are here, with a new Flags column, retained values that survive power loss on bare metal, and a Persistent Storage screen to configure where and how often a device saves them.
- Global Variable Lists (GVL). CODESYS's GVL as a first-class project element, end to end.
- Located arrays. Place an
ARRAYat an explicit%-address, with range-collision detection.
Data types, reimagined
- New
.dtdata-type format. Each data type lives in its own file. You get a form/code toggle, rename with automatic reference propagation across the whole project (with an impact preview before you commit), and editing straight from the.dtcode view.
Project and workflow
- Retrieve Project from PLC. A device now keeps a copy of the source project it is running, so you can pull it back with one menu action. A working Save As lands alongside it.
- Headless CLI. Create, compile, upload and debug a project from the command line.
- Print and export to PDF. A full print and PDF-export pipeline for your project.
- Runtime Status screen. Runtime statistics get their own place in the Device tree, alongside the action to change the runtime version on a device.
- VPP licensing. Buy and activate paid vendor packages over both the bare-metal connection and Runtime v4. The licence is written automatically once the purchase completes.
Naming
- "Orchestrator" is now "Edge Device", and its children are "vPLC", clearer language for the industrial-automation audience.
And dozens of parity and stability fixes
Case-insensitive identifiers and one unified name namespace, execution-order fixes, ladder and graphical-editor recovery, a long run of LSP and code-view fixes, debugger DATE and TIME corrections, Modbus and OPC-UA fixes, and many community-reported bugs.
This is a joint release. OpenPLC Editor (desktop) and OpenPLC for the web both ship as 4.3.0.
Full changelog: v4.2.11...v4.3.0
What's Changed
- feat(licensing): watch for the purchase after buy() and write the licence automatically by @marconetsf in #1008
- fix(simulator): stop the emulator on Stop, and close its session on every stop path by @thiagoralves in #1009
- Merge development into main by @thiagoralves in #1010
- DOPE-526: sync installFromCatalog signature with openplc-web by @dcoutinho1328 in #982
- fix(modbus): make IO Group size edits visible and reject invalid lengths (DOPE-439) by @JulioSergioFS in #1004
- fix(iec-address): close the paths where address recompaction silently no-ops (DOPE-565) by @JulioSergioFS in #1013
- fix(variables): allow a comma in a declaration's type so inline multi-dimensional arrays parse by @thiagoralves in #1003
- fix(graphical-editor): render VAR_IN_OUT as a single input-side pin, like CODESYS by @thiagoralves in #1012
- feat(global-variables): Global Variable Lists — CODESYS's GVL, end to end by @thiagoralves in #1016
- chore(strucpp): pin v0.6.3 by @thiagoralves in #1020
- feat(ladder): recover unusable rung geometry on load, and put GVLs in the LSP's scope by @thiagoralves in #1021
- feat(licensing): generate trusted_keys.c from the package's key table at project build by @marconetsf in #1014
- feat(licensing): carry the VPP licensing flow onto runtime-v4 targets by @marconetsf in #1023
- feat(modbus): surface the Modbus-to-IEC address map (DOPE-441) by @JulioSergioFS in #1017
- chore(shared): mirror the Edge session surface from openplc-web [EDGE-602] by @Gustavohsdp in #1027
- feat(cli): headless CLI for create/compile/upload/debug (DOPE-567) by @thiagoralves in #1026
- feat(data-types): make .dt persistence a deploy setting and survivable to roll back (DOPE-542) by @JoaoGSP in #999
- fix(cli,compile): exit-code-driven build outcome, drop the soft-write verb, remove a live credential by @thiagoralves in #1029
- feat(variables): a Flags column, and the qualifier reaches the compiler by @thiagoralves in #1030
- feat(retain): baremetal retain — driver contract, scan-cycle save, cold reset by @thiagoralves in #1031
- feat(retain): refuse a program whose retained state outgrows the board [NODE-94 phase 5] by @thiagoralves in #1033
- refactor(console): let addLog mint log ids; consolidate UUID minting behind one helper + lint guard (mirror of openplc-web#678) by @Gustavohsdp in #1018
- fix(python): reject Python blocks on targets that cannot run them [DOPE-584 P1] by @thiagoralves in #1037
- fix(python): one table for the SHM layout, and make WSTRING work [DOPE-584 P2] by @thiagoralves in #1038
- fix(python): seed block outputs from the PLC, not their declarations [DOPE-584 P3] by @thiagoralves in #1039
- task(DOPE-584): C++ function blocks reach IEC parity [phase 4] by @thiagoralves in #1040
- task(DOPE-584): Python function blocks reach class parity [phase 5] by @thiagoralves in #1041
- task(DOPE-584): Python structures, enumerations, EN/ENO and editor stubs [phases 6-8] by @thiagoralves in #1043
- bugfix(DOPE-586): read a DATE as days, which is what the compiler emits by @thiagoralves in #1045
- bugfix(DOPE-587): ask for a unique id only where one can be licensed by @thiagoralves in #1047
- fix(dev-console): a real IPC unsubscribe for accelerators, and rung bounds without xyflow's standalone helper [DOPE-507] by @JulioSergioFS in #1046
- fix(DOPE-585): library C/C++/Python blocks build and compile (shared-surface mirror) by @thiagoralves in #1042
- chore(licensing): plainer VPP licence copy, drop the debug-channel poll spam by @marconetsf in #1032
- feat(retain): a Persistent Storage screen for the connected device [NODE-94] by @thiagoralves in #1035
- task(DOPE-584): Python and C++ function blocks reach IEC parity by @thiagoralves in #1044
- fix(vpp): forward the package signature, and let a HAL include the runtime's contracts [NODE-94] by @thiagoralves in #1036
- fix(DOPE-585): library block naming, native variable table parity, and C++ nested autocomplete (shared surface) by @thiagoralves in #1048
- task(DOPE-584): one leaf list for the Python SHM boundary, and array-element type spelling for C++ by @thiagoralves in #1054
- fix(DOPE-592): keep a library block's source out of the project file by @thiagoralves in #1055
- fix(retain): review fixes — global flags, verification verdict, lint, casts [NODE-94] by @thiagoralves in #1053
- test: make the unit-tests check green again (DOPE-591) by @JoaoGSP in #1052
- fix(DOPE-541): stop nesting store writes inside setTableData's updater by @dcoutinho1328 in #1057
- fix(lsp): clip partial code views to their document window (DOPE-554, DOPE-555) by @JoaoGSP in #1051
- chore(ci): trim stale commentary from the unit-tests workflow by @JoaoGSP in #1060
- fix(lsp): resolve document symbols against the LSP URI (DOPE-590) by @JoaoGSP in #1061
- RTOP-274 Shared: build and parse the project snapshot archive by @thiagoralves in #1065
- RTOP-275 Editor: send the project on upload, and Retrieve Project from PLC by @thiagoralves in #1066
- RTOP-276 Editor: identify a library by canonical content, not raw bytes by @thiagoralves in #1067
- RTOP-280 Editor: implement Save As by @thiagoralves in #1068
- feature(library): detach simulator verification from the build, add a debug harness [DOPE-597] by @thiagoralves in #1063
- RTOP-272: Retrieve Project from PLC (desktop editor) by @thiagoralves in #1070
- feat(retain): CONSTANT, RETAIN and NON_RETAIN [NODE-94] by @thiagoralves in #1034
- fix(naming): validate element names against one identifier namespace (DOPE-538) by @JoaoGSP in #1071
- RTOP-272 follow-up: consume the projectSnapshot capability, and drop what nothing calls by @thiagoralves in #1072
- fix(retain): Persistent Storage as a project property, one driver contract, blank flag cell [NODE-94] by @thiagoralves in #1073
- feat(DOPE-589): FC 0x48 reports the derived device_id, and ArduinoUniqueID leaves the firmware by @marconetsf in #1059
- chore(strucpp): pin v0.6.6 by @JoaoGSP in #1075
- fix(save): stop queueing a save no sign-in can ever replay (mirror of openplc-web#726) by @Gustavohsdp in #1076
- fix(firmware): mirror openplc_retain.h into src/ for every arduino-cli bundle [DOPE-602] by @dcoutinho1328 in #1077
- chore(release): bring the version fields back into agreement (DOPE-601) by @JoaoGSP in #1074
- task(data-types): make .dt the standard format and drop the DATATYPES_DT_FILES gate (DOPE-603) by @thiagoralves in #1081
- fix(editor): three small defects from the community forum [DOPE-606] by @thiagoralves in #1084
- feat(located): allow ARRAY at a physical address, and detect range collisions by @JulioSergioFS in #1080
- fix(editor): make execution order legible, drop it from ladder, stop it rewiring blocks [DOPE-606 + DOPE-611] by @thiagoralves in #1085
- fix(variables): compare variable names case-insensitively everywhere (DOPE-599) by @JoaoGSP in #1083
- fix(store): refuse element names already taken by a library symbol (DOPE-557) by @JoaoGSP in #1078
- RTOP-283: Runtime Status screen, with runtime version changes by @thiagoralves in #1086
- fix(store): refuse duplicate variable names from the variables code view (DOPE-616) by @JoaoGSP in #1088
- feat(print): print / export to PDF (DOPE-594) by @dcoutinho1328 in #1087
- DOPE-617: Retrieve Project in the native menu, Device breadcrumbs, stray divider, Persistent Storage copy, Location cell font by @thiagoralves in #1089
- fix(lsp): keep the variables code view's tokens and markers in step with its document (DOPE-552) by @JoaoGSP in #1092
- fix(lsp): navigate on activation only, never while resolving a definition (DOPE-551) by @JoaoGSP in #1095
- fix(store): gate globals, servers and remote devices against every other element name [DOPE-598 + DOPE-600] by @JoaoGSP in #1097
- feat(compile): install third-party Arduino libraries by git URL (DOPE-628) by @thiagoralves in #1103
- feat(s7comm): Phase 1 — serve live PLC variables over S7 (DOPE-631) by @thiagoralves in #1104
- feat(s7comm): Phase 2 — identification and CPU control (DOPE-632) by @thiagoralves in #1105
- feat(s7comm): Phase 3 — harden, measure and document (DOPE-633) by @thiagoralves in #1106
- fix(capabilities): resolve nested profiles even when a VPP declares none by @thiagoralves in #1108
- merge: DOPE-442 into the S7Comm branch — unlocks servers on baremetal targets by @thiagoralves in #1109
- fix(ci): make the OPC-UA branch pass the gates CI actually runs by @thiagoralves in #1110
- sync: take the parent LOGO! branch's three outstanding fixes by @thiagoralves in #1111
- sync: bring the OPC-UA branch's CI fixes and LOGO! updates into S7Comm by @thiagoralves in #1112
- fix(store): warn before deleting a data type that is still referenced (DOPE-553) by @JoaoGSP in #1099
- DOPE-442: unify the Modbus server screen across baremetal and Runtime v4 by @marconetsf in #1094
- Feature/dope 636 opcua library separation by @thiagoralves in #1117
- feat(data-type): rename a data type from its .dt code view (DOPE-545) by @JoaoGSP in #1116
- fix(graphical): re-derive placed user-FB signatures on load (DOPE-548) by @JoaoGSP in #1115
- chore(strucpp): pin the language server to v0.6.7 by @JoaoGSP in #1120
- fix(frontend): keyboard-accessible view toggles + structure editor scoped to its own type (DOPE-546, DOPE-547) by @JoaoGSP in #1121
- fix(frontend): re-canonicalise the code buffer after a successful commit (DOPE-622) by @JoaoGSP in #1122
- chore(frontend): drop rewriteDeclaredTypeName, now unused by @JoaoGSP in #1126
- EDGE-639: rename Orchestrator to Edge Device and its children to vPLC by @Thiago-Pio-Autonomy in #1096
- RTOP-285: OpenPLC runtime on Siemens LOGO! 8.2 over Ethernet + Modbus TCP debug by @thiagoralves in #1091
- Release 4.3.0 by @thiagoralves in #1127
Full Changelog: v4.2.11...v4.3.0