Skip to content

Releases: caspershes/plc-lint

v1.3 — Windows exe: reads .export and PLCopenXML

Choose a tag to compare

@github-actions github-actions released this 23 Oct 07:56

Local version of PLC Lint for Windows: one file, no install, no Python.

Everything runs on your machine — the tool makes no network calls at all, and nothing
is uploaded anywhere. Drop a .xml (PLCopenXML) or a .export (CODESYS project export)
onto plc-lint.exe: an HTML report appears next to the file and opens in your browser.

Why .export is worth it. PLCopenXML carries the programs only. The CODESYS
.export also carries the device tree and the visualisation, so every program rule
works there and five checks no other analyser does, because every other analyser
reads ST:

  • sensor type cleared on a channel that has a variable bound to it — the channel is
    never digitised and the variable stays at 0.0 (on an outdoor sensor that reads as a
    plausible 0 °C)
  • analog output bound to a variable while its mode is off
  • module excluded from the scan (Disable_module)
  • one variable shown on screen under two different labels (copy-pasted element)
  • the number in the label does not match the index in the variable
    ("Boiler 3" ↔ alarm_boiler[2])

What .export does not give. Task configuration is stored differently in that
format, so the watchdog and duplicate-Modbus-address rules stay silent there.

43 rules in total. From the command line: plc-lint.exe project.export. On Linux and
macOS the same engine runs as python cli.py project.export — standard library only,
no dependencies.

The file is not code-signed. On first run Windows shows "unknown publisher" →
More info → Run anyway. Since you have no publisher to trust, check the file
instead:

SHA-256  a8d16ee62b374aaebdd2be8aca6d95fd48d57e40138615260070dbc4cab149c0
Get-FileHash plc-lint.exe -Algorithm SHA256

v1.2 — every rule runs on .export

Choose a tag to compare

@github-actions github-actions released this 22 Oct 08:59

Superseded by v1.3 —
same tool with screen bindings taken into account and one more rule. Kept for reference.

Local version of PLC Lint for Windows: one file, no install, no Python. Everything runs
on your machine — no network calls, nothing uploaded. Drop a .xml (PLCopenXML) or a
.export (CODESYS project export) onto plc-lint.exe and an HTML report appears next
to the file.

This is the release where every program rule started working on .export as well,
on top of the five configuration and screen checks that format makes possible.

The file is not code-signed: Windows shows "unknown publisher" → More info →
Run anyway.

SHA-256  63ac3cfff56d788f590ac4a2dcceb5e0e900f0b2d31ed685d24a4021673446a0

v1.1 — first .export support

Choose a tag to compare

@github-actions github-actions released this 22 Oct 08:38

Superseded by v1.3 —
newer rules and full .export coverage. Kept for reference.

Local version of PLC Lint for Windows: one file, no install, no Python. Everything runs
on your machine — no network calls, nothing uploaded.

First release that reads the CODESYS .export format: the device tree and the
visualisation, which PLCopenXML leaves out, with five checks no other analyser does —
sensor type cleared on a channel in use, analog output bound while its mode is off,
module excluded from the scan, one variable under two labels, label number not matching
the variable index.

The file is not code-signed: Windows shows "unknown publisher" → More info →
Run anyway.

SHA-256  290babec2c701c32508470a8f433e79c0962a33dd3be0b8c44e5f09517af252e

PLC Lint action v1 — check PLCopenXML exports in CI

Choose a tag to compare

@caspershes caspershes released this 24 Aug 16:09

Runs the PLC Lint analyzer on your PLCopenXML exports (CODESYS, TwinCAT) as part of a
GitHub workflow. The analysis happens on the runner: no network calls, nothing uploaded,
standard library only.

- uses: actions/checkout@v4
- uses: caspershes/plc-lint@v1
  with:
    path: exports/     # files, globs or a directory
    fail-on: high      # break the build on high-severity findings

Results appear on the job summary as a table — score, POU count and findings per export.
High-severity findings become annotations, and fail-on decides whether the step fails.

Inputs: path, fail-on, profile (heating, plcopen-naming), lang (en/ru),
html, summary, annotations, python-version.

Outputs: score, high, medium, low, files, json — so you can gate on the
score instead of severity:

- id: lint
  uses: caspershes/plc-lint@v1
  with: { path: exports/, fail-on: none }
- run: test "${{ steps.lint.outputs.score }}" -ge 70

34 rules: uncalled timers, divide-by-zero, setpoint truncation, unreachable branches,
disabled watchdogs, copy-paste errors between control loops, plus hygiene checks.
Full reference in RULES.md, a known-bad example project in examples/.

The engine is MIT licensed and also runs as a standalone tool — python cli.py project.xml,
or a single .exe on Windows.

v1.0 — first Windows exe (PLCopenXML only)

Choose a tag to compare

@github-actions github-actions released this 18 Aug 09:02

Superseded by v1.3 —
many more rules and support for the CODESYS .export format. Kept for reference.

The first local version of PLC Lint for Windows: one file, no install, no Python.
Everything runs on your machine — no network calls, nothing uploaded. Drop a .xml
(PLCopenXML) onto plc-lint.exe and an HTML report appears next to the file.

The file is not code-signed: Windows shows "unknown publisher" → More info →
Run anyway.

SHA-256  5581dedaa2dffca3a0a3d9e29f4f39f0a2f83d88ce3716c424dddb8f956f186e