Releases: celikgo/salman
Release list
salman v0.1.0
salman v0.1.0
Pre-alpha. The first release with something to download.
salman is a vendor-neutral, text-first, git-native workbench for IEC 61131-3 PLC
engineering. Structured Text compiles and runs on a deterministic runtime, and
its tests run headless in CI with no vendor licence.
This is the first tagged version. Everything below is drawn from
docs/STATUS.md, which is generated from the capability
registry in crates/salman-core/src/capability.rs and refuses to call anything
tested unless it names tests that exist in the tree.
Install
Download the archive for your platform below, unpack it, and run salman. It is
a single self-contained binary of about three megabytes — no installer, no
service, no registry key, no licence server. Deleting the file uninstalls it.
| Platform | Archive |
|---|---|
| Linux x86-64 | salman-v0.1.0-x86_64-unknown-linux-gnu.tar.gz |
| macOS Apple silicon | salman-v0.1.0-aarch64-apple-darwin.tar.gz |
| macOS Intel | salman-v0.1.0-x86_64-apple-darwin.tar.gz |
| Windows x86-64 | salman-v0.1.0-x86_64-pc-windows-msvc.zip |
SHA256SUMS is attached. On macOS the binary is unsigned and unnotarised, so
Gatekeeper will refuse it until you clear the quarantine attribute — that is
stated here rather than left as a surprise.
Or build it from source. A release build from an empty target directory took
12.5 s on an M-series laptop; it is a small tree with 26 third-party crates in it:
git clone https://github.com/celikgo/salman.git
cd salman
cargo build --release
./target/release/salman test examples/conveyor/conveyor.st examples/conveyor/salman is not on crates.io. Publishing there is permanent, and the name is
not worth claiming until the interface has settled past pre-alpha.
What works
41 capabilities are implemented and tested, each naming tests that exist.
Language. Structured Text end to end: lexer, recursive-descent parser with
error recovery and bounded nesting, name resolution, type checking, constant
folding, recursion rejection, and a bytecode compiler. Every statement and
declaration form of ST, with Edition 3 operator precedence. Case-insensitive,
case-preserving identifiers. Elementary types and the ANY generic hierarchy.
TIME, LTIME, DATE, TIME_OF_DAY and DATE_AND_TIME. EN and ENO on every call as
part of the calling convention. Several source files build as one program. Two
dialect profiles — generic and iec61131-3:2013-strict — and every diagnostic
names the rule it applied.
Runtime. A deterministic scan runtime with a correct process image and a
visible force list. AT % variables bound to the image with no copy — a located
variable is its location, so it cannot go stale. Cyclic, event and
freewheeling tasks. All ten IEC standard function blocks. RETAIN and PERSISTENT
across simulated warm and cold restarts. Subrange bounds and string lengths
enforced wherever a value is stored. The interpreter faults rather than panics,
and has a scan watchdog.
Determinism. Same project, same inputs, same seed, identical trace, bit for
bit. A seeded xoshiro256++ generator written in-crate and recorded in every
trace header, and an in-crate SHA-256 trace fingerprint with NIST known-answer
tests.
Protocols. Modbus TCP and RTU framing, a client, and a simulator to point it
at. Every write gated by the posture model. Reading classic pcap captures and
decoding Ethernet, IP and TCP, with TCP reassembly so a decoder sees a byte
stream rather than packets. A capture and a scan trace on one time axis.
Findings that carry their evidence and say how sure salman is.
Interchange. Reading and writing PLCopen XML, both families of Structured
Text wrapper, with a compatibility matrix generated by round-tripping every
construct rather than written by hand.
Testing. Declarative unit tests and golden-trace tests, with JUnit XML
output and a real exit code, so salman test is a CI job.
What is not implemented
Stated plainly, because a missing feature is cheaper than a surprise:
- Every graphical language. Ladder, Function Block Diagram and Sequential
Function Chart are not implemented. A PLCopen document containing one is
named rather than silently dropped, but salman cannot read the body. - Semantic diff of graphical logic. This is the workbench milestone. It does
not exist yet, in any form. - Instruction List, the Edition 3 object-oriented extensions, references,
and most of the standard function library. - Every protocol except Modbus. No EtherCAT, no PROFINET, no OPC UA, no
EtherNet/IP, no CANopen. - Every importer other than PLCopen XML.
- The network model, the desktop application and the AI layer.
- No user interface. There is no GUI and no screenshot to show.
Meeting any of these in source produces a message naming what is missing, rather
than a confusing failure.
Three capabilities are implemented but untested by the registry's evidence
rule, and say so: the libFuzzer targets for the ST front end and for the Modbus
decoders — a fuzzing run shows nothing was found, which is not the same as
showing anything is right — and the pymodbus interop check, which is a CI job
rather than a named test function.
What salman does not claim
- Not a safety tool. salman is not certified, assessed, qualified or
approved under IEC 61508, IEC 62061, ISO 13849 or any other functional safety
standard, and no such assessment is planned. Never use it to design, validate
or replace a safety function. - Not a certified runtime. The embedded runtime is for development, testing
and simulation. It is not for controlling machinery. - No claimed conformance to IEC 61131-3. salman aims at Structured Text
and publishes a per-feature account indocs/CONFORMANCE.md. Aiming and
conforming are different things. - No claimed conformance to Modbus. salman speaks the protocol; it is not
certified by, conformant to the certification programme of, nor affiliated
with Schneider Electric or the Modbus Organization. Speaking a protocol and
being certified against it are different things. - Not a replacement for vendor engineering tools. Downloading to a physical
PLC and commissioning remain vendor tooling's job. - salman reads live equipment and will not drive its outputs.
See LEGAL.md, which ships inside each archive.
Measured cost
From the perf workflow on GitHub-hosted runners, not a developer's laptop.
Single runs on shared-tenant machines, so read them as an order of magnitude:
| Linux x86-64 | macOS aarch64 | Windows x86-64 | |
|---|---|---|---|
| Cold start | ~0.9 ms | 1–4 ms | ~8 ms |
| Binary on disk | 3.4 MB | 2.8 MB | 3.1 MB |
| Peak resident set | 2.7 MB | 1.9 MB | not gated |
| Full test suite | 1–2 s | 2 s | ~3 s |
Sizes are exact; times are approximate on purpose. Two runs of the same commit
measured macOS cold start at 1.21 ms and 4.26 ms — a second decimal place would
imply precision that is not there.
perf-budget.toml holds the ceilings and the perf workflow fails the build
when a measurement exceeds one.
salman publishes no interpreter throughput number — no scans per second, no
instructions per second. There is no benchmark in the repository that measures
it, so there is nothing to publish and nothing a reader could check.
Since the tree was first pushed
- Every IEC citation now names tests that exist, enforced by two tests. Twenty
of the forty-three were previously attached to nothing. SECURITY.mdcorrected: it claimed no code path opened a socket or wrote to a
device, which the Modbus client and simulator had made false.- The README's unsupported scan-time figure removed — there is no benchmark
behind it. - Every source file carries an SPDX identifier: 111 of 111, up from 31 of 48.
Supported versions
0.1.0 is pre-alpha. There is no support commitment, no patch stream and no
backport policy. See SECURITY.md.