ISO 11783-13 — the File Server
Part 13 puts a filesystem on the bus. A File Server offers volumes and directories; clients open, seek, read, write, and close files, manage attributes, and query free space — each as a request/response exchange. It is how implements persist configuration, prescriptions, and logs without storage of their own.
Why this exists
A small implement ECU may have little or no non-volatile memory, yet it needs to load a prescription, save an as-applied log, or keep settings across power cycles. Rather than give every ECU a card slot, ISOBUS lets one node be the server and everyone else share it.
The conversation
Every operation is a request tagged with a transaction number (TAN); the matching response carries the same TAN, so a client can have several in flight:
CLIENT SERVER
│ ── open "/presc.bin", read ──► (TAN 7)
│ ◄── handle 3, ok ────────────
│ ── read handle 3, 512 bytes ─► (TAN 8)
│ ◄── 512 bytes ─────────────── (large reads ride Transport Protocol)
│ ── write handle 3, <data> ──► (TAN 9)
│ ◄── 512 bytes written ───────
│ ── close handle 3 ──────────► (TAN 10)
│ ◄── ok ──────────────────────
The full surface: connect (a CCM handshake), open/close, read/write/seek, get/set attributes, get date-time, current/change directory, move/delete, volume init and status, plus free-space queries.
How machbus expresses it
machbus implements both halves with an async-style request → event model: each
request method returns its TAN immediately, and the matching response arrives later as
an FsEvent. The FsClient plugin drives the client; FsServer serves in-memory
files and directories.
let tan = ctrl.with_mut::<FsClient, _>(|fs| fs.open("/presc.bin", flags))??;
// … later …
// Event::Fs(FsEvent::OpenResponse { tan, result: Ok(handle) })
From concept to code
| You read about… | Build it with… | See… |
|---|---|---|
| Reading/writing files (client) | session::plugins::FsClient | File Server |
| Serving files (server) | session::plugins::FsServer | File Server |
| The FS codecs directly | isobus::fs | File Server |
What counts as malformed
Narrower than it looks. §4.9 scopes the malformed-request error to one thing:
“The file server shall respond with Error Code 47 Malformed Request, if it receives a message, which is shorter than expected.”
Length — not a surprising flag value. The volume flags (B.29) and volume mode (B.30) each describe their spare bits as “Reserved, send as 000000”, which binds the sender; nothing licenses a server to refuse a request over one. Refusing would also mean a later revision that defines one of those bits gets turned away rather than ignored, against the general rule that undefined bits are “received as ‘don’t care’”. machbus therefore masks them on receive while still refusing to transmit them set.
Failure modes worth knowing
- TAN confusion — matching a response to the wrong request if TANs are not tracked.
- Not connected — issuing file ops before the CCM handshake completes.
- Big transfers — large reads/writes ride the transport protocol and inherit its timeout/abort behavior.
See also
- ISO 11783-3 — data link & transport — what carries the big reads and writes.
- Implement control, the tractor ECU, and the rest.