Skip to content

OpenPLC Editor v4.3.0

Choose a tag to compare

@github-actions github-actions released this 18 Sep 19:32
· 819 commits to development since this release
5adb180

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 ARRAY at an explicit %-address, with range-collision detection.

Data types, reimagined

  • New .dt data-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 .dt code 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