Repository navigation
Releases: caspershes/plc-lint
Release list
v1.3 — Windows exe: reads .export and PLCopenXML
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 SHA256v1.2 — every rule runs on .export
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
Superseded by v1.3 —
newer rules and full.exportcoverage. 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
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 findingsResults 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 7034 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)
Superseded by v1.3 —
many more rules and support for the CODESYS.exportformat. 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