The three Banknote Works documents merged into one reference: the functional briefing for readers new to MES, the golden-thread traceability use case, and the machine connectivity standard for IT. Everything describes the same live system, with the same numbers.
What an MES does, told through the line and its use cases — for readers new to MES.
Your office systems know what should happen. Your machines know what is happening — but the two don't talk. A Manufacturing Execution System sits in between: it listens to every machine, writes everything down, and turns that stream into answers people can use.
The key idea for everything that follows: nobody types anything. Every fact in this document's use cases is written by a machine, at the moment it happens.
A sheet of security paper enters at B010 and gains one security layer per press; only at the end is it cut into 45 individual banknotes. If a sheet is defective at any point it is shredded — banknotes are never "repaired".
| Op | Station | What happens to the sheet | Cycle |
|---|---|---|---|
| 10 | B010 | Paper in — thickness, watermark and security-thread check | 30 s |
| 20 | B020 | Background printing on both faces in a single pass (perfect front/back register) | 45 s |
| 30 | B030 | Colour-shifting ink patch, silk-screened (~18 µm deposit) | 60 s |
| 40 | B040 | Holographic foil stripe, hot-stamped at 105 °C | 50 s |
| 50 | B050 | Intaglio — the raised print you can feel, pressed at 900 kN. The slowest press: it sets the pace | 90 s |
| 60 | B060 | Two serial numbers per note (letterpress) + protective varnish | 55 s |
| 70 | B070 | Every note camera-inspected · sheet cut · notes banded in 100s | 70 s |
Two characters matter for the rest of this document: the intaglio press B050 (expensive, wears out, paces the line) and the colour-shift ink at B030 (the most expensive consumable — small, precious lots).
Reading the layout: material enters once (vault, top-left), sheets flow left→right then right→left in a U through the seven presses, and product exits once (cash vault, bottom-left). Defective sheets leave the U at whichever press caught them, straight to the shredder. The AGV corridor crossing the hall carries only vault-escorted material — never product.
Four rules govern the flow, and they explain every number the MES will show:
One sheet per press. Each press works on exactly one sheet; when it finishes, the sheet moves forward as soon as the next press is free. There are no piles between machines — work-in-progress stays small and visible.
The slowest press sets the pace. Intaglio takes 90 seconds, so the line can never make more than 40 sheets/h (1,800 notes/h) — no matter how fast the other presses run. The faster presses wait part of every cycle; that idle time is structural, not a problem:
Quality gate at every press — shred early. A sheet is measured at each step; if it fails, it leaves the line right there and goes to the shredder. You never spend hologram foil or intaglio ink on a sheet that is already bad.
A day has a rhythm. Three 8-hour shifts with fixed breaks — a press finishes its sheet, then pauses; that is planned time, not a breakdown — plus short planned maintenance every ~200 sheets per press.
One consequence worth remembering: a stop at B050 is lost output forever; a stop at B010 usually costs nothing — it catches up within its idle margin. The MES reads losses against the pacemaker for exactly this reason.
Is the line running right now, and how well?
In the demo — the Live Line page: watch a real sheet move press to press; stop and restart the whole line with one click and see it drain gracefully.
An auditor points at one banknote. Tell me its story.
Every sheet receives a unique number the moment it enters the line — think of it as a passport. From then on, every press stamps that passport automatically: when the sheet arrived, what was measured, whether it passed, and which material lot was mounted at that moment.
| Time | Press | Entry in the passport of sheet BNK-…-0408569 | Material lot |
|---|---|---|---|
| 09:12 | B010 | Paper verified (thickness, watermark, thread) | PAPER-408608 |
| 09:12 | B020 | Background print in register — pass | INK-408609 |
| 09:13 | B030 | Colour-shift patch in spec — pass | OVI-408610 |
| 09:15 | B040 | Hologram applied, adhesion checked — pass | FOIL-408611 |
| 09:16 | B050 | Relief printed at 900 kN, height in spec — pass | IINK-408612 |
| 09:18 | B060 | 2 serials per note stamped, varnished — pass | NINK-408613 |
| 09:19 | B070 | 45/45 notes passed · cut · banded — released | BAND-408615 |
Three properties make this trustworthy: the passport is written by the machines at process time (it cannot be forgotten, backdated or edited); it also exists for sheets shredded mid-line (the record ends with a cause, not with silence); and it works backwards — pick a material lot and get every sheet that used it. That is the recall question, answered in seconds. The full mechanics are the subject of the companion use case, The Golden Thread.
In the demo — the Traceability page: we open the passport of the sheet currently in production.
How do you know the right ink was used?
Because the system makes it impossible not to know. Four rules, each one recorded automatically:
| # | Rule | What it means in practice |
|---|---|---|
| 1 | Each press accepts one material | B030 takes colour-shift ink and nothing else — that is configuration, not an operator's memory. |
| 2 | Every delivery is logged | Ink arrives by robot shuttle from the vault: box, lot and trip recorded. A manual swap goes through the same transaction, flagged as manual. |
| 3 | Each sheet notes its lot | When a sheet passes a press, its passport records the lot mounted at that moment — the link is made live, never reconstructed afterwards. |
| 4 | The vault must balance | Boxes are counted out of the vault; consumption is counted at the press. Issued − used − remaining must add up, per lot. |
What this buys you: a supplier calls about a suspect lot → you list every affected sheet in seconds, not days. An auditor asks for proof → you show the passport, not a promise.
In the demo — the Material page: the live lot at each press, its delivery record, its history.
How much ink is left — and who refills it?
In the demo — the Shopfloor page: the OVI ink bin at B030 counting down sheet by sheet, and the AGV's mission and battery, live.
Why did we shred 12 sheets yesterday?
In the demo — the Stoppages and Statistics pages: the line's real fault history, aggregated into a Pareto with downtime minutes.
Can we catch a problem before we scrap anything?
Yes — because the presses measure every sheet. Think of it as the machine's temperature curve: values wander slightly around a target, which is normal; what matters is the trend.
The intaglio plate wears slowly, so the measured relief height drifts for hours before the first bad sheet appears. The MES watches that drift (statisticians call it SPC — the trend chart is enough of a name) and raises a hand while everything still passes. You schedule the plate change at the next break instead of discovering a scrap wave the next morning.
The scenario we run live: a subtly bad ink lot is delivered to B030 — nothing announced, exactly like real life. You find it yourself in four steps: quality alerts and scrap events start appearing at B030 → the trend chart shows the OVI layer thickness drifting high → the material page names the suspect lot → one click lists every sheet that used it. Then we fix it, and everything returns to green. That investigation takes minutes here; without the data, it is days of meetings.
In the demo — the SPC page, plus the bad-lot scenario run end to end.
Running state, today's output, material levels, the AGV. We stop the line — presses finish their sheet, then hold — and restart it. Stage the finale now: click the bad-lot use case — the suspect ink ships immediately and will have visibly drifted by step 4 (rehearsed timing: first drifted measurement ≈60 s after injection; convincing trend and affected serials within ≈5 min).
Follow the sheet in production across the seven presses, then open its passport in Traceability.
Live ink levels on the shopfloor map, the active lot at B030, its delivery record.
Inject the suspect ink lot, then find it: quality alerts → trend chart (OVI layer thickness) → lot trace → affected serials.
Reset the station, order the plate change. Screens return to green — and the whole incident stays in the record, forever queryable.
One plant server, open standards only; machines never talk to applications directly.
The ERP does not need to know a press exists, and a press does not need to know an invoice exists — the MES translates between the two. The WMS is, strictly speaking, a sibling of the MES (both are execution systems); it is drawn between ERP and MES here because that is how material physically flows — purchased, received into the vault, issued to the line. The hand-over is clean: the MES raises a material call, the WMS answers with a picked, lot-stamped box, and the mounting is confirmed back as a logged transaction. In this demo environment the ERP and WMS sides are simulated; the hand-over formats are real and ready.
| Role | Their question | The MES answer |
|---|---|---|
| Production manager | "Are we on plan, right now?" | Live line view, output counters, one honest OEE |
| Quality manager | "Why did we scrap — and can we prevent it?" | Named scrap causes, trend charts that warn before scrap |
| Logistics / stores | "What's left, consumed, and next?" | Live levels, automatic refills, exact per-lot consumption |
| Auditor / customer | "Prove what happened to this unit." | The passport: every station, measurement and lot — in three clicks |
| Finance | "What did our losses actually cost?" | Complete scrap & downtime record, ready to be costed |
| IT | "What must we install on machines?" | Nothing proprietary — open standards, one integration contract (BW-CON-001) |
The honest closing line: everything in this briefing is built from data the machines already produce. The MES does not create work — it stops that data from evaporating.
Serialized traceability of one sheet across the seven presses.
A sheet of security paper — 45 future banknotes — enters the line, receives a unique serial, and is followed press by press. Every station writes its data against that one serial: measurements, verdicts, and the exact material lot it consumed. Nothing is typed by anyone.
A banknote line is the perfect setting for this use case for three reasons: no rework exists, so the record is never muddied by repair loops — a sheet passes, or is shredded with a cause; materials are vault-counted, so lot binding is a security requirement rather than a nice-to-have; and the mechanics transfer unchanged to any serialized product — pharmaceuticals, medical devices, aerospace parts.
One unique serial is assigned at the first station. From that point on, everything measured or consumed is bound to it — nothing floats free. Read the serial and you have the whole history.
Three guarantees make the key trustworthy: it is bound once, at the entry press, before anything can happen to the sheet; it is written by machines at process time — never typed, never backdated; and it is never reused — day-seeded sequencing makes re-issue impossible, even across system restarts.
| Contents of the sheet record · BNK-20260723-0408569 | |
|---|---|
| Material lots | the exact paper, ink, foil and tape lot mounted at each press |
| Process parameters | 21 measured values against machine-published limits |
| Equipment | press, work op, line |
| Timestamps | arrival, cycle time and completion, per press |
| Verdicts | pass / fail at each of the seven quality gates |
| Final status | released to the cash vault — or shredded, with the cause |
parent sheet ← linked → consumed material lots — the tree grows one branch per press
| Parameter | Value | Limits | |
|---|---|---|---|
| Relief height | 61.2 µm | 48 – 72 | PASS |
| Plate pressure | 903 kN | 840 – 960 | PASS |
| Wiping residue | 1.9 % | ≤ 1.8 | FAIL |
A wiping failure like this one sends the sheet to the shredder — serial, cause, press and ink lot recorded in a single event. No downstream value is ever added to a bad sheet.
Sheets shredded earlier keep a sealed record too — ending at their exit press, with the cause. The absence of an ending is itself an alert the system can raise.
| Direction | Question answered | Example |
|---|---|---|
| Backward trace | From one serial → every material lot, measured value, verdict and press that went into it. | BNK-…-0408569 → lots · measurements · verdicts |
| Forward trace | From one material lot → every sheet that consumed it — the exact scope of any recall. | LOT-OVI-408610 → 38 sheets → 1,710 notes |
Four business outcomes follow directly: recall containment (isolate exactly the affected sheets, in seconds), quality analytics (trends by lot, press and shift), audit and compliance (proof of what was printed and how), and security reconciliation (vault issued = consumed + remaining, per lot).
In the live demonstration this section is played out for real: a subtly defective OVI ink lot is delivered to B030, quality drifts, and the investigation uses exactly these two queries — name the lot, list every affected serial — before recovering the line.
The vocabulary changes from vendor to vendor; the objects do not. Every concept in this use case lands one-to-one in any serialized-production MES:
| In this use case | In your MES |
|---|---|
| Serialized sheet | the serialized unit / SFC the MES tracks |
| Press B010–B070 | an operation in the routing |
| Material-lot binding | genealogy / as-built component linking |
| Measurements vs limits | data-collection parameters |
| Fail → shredder, cause on serial | nonconformance handling |
| The sheet's passport | as-built record / where-used query |
Same principle, whatever the MES — one unique serial ties the whole build together. The live system behind this document proves it end to end.
The machine-integration contract — for integrators and IT.
The line publishes on two parallel southbound interfaces — OPC-UA for SCADA/HMI-style clients and MQTT for the unified namespace. The broker archives selected namespaces into the historian (PostgreSQL); the shopfloor dashboard is a read-only ISA-95 Level 2 consumer of that data and issues commands exclusively over the MQTT command channel.
Design rule — the dashboard never writes machine state directly. Every
actuation (start/stop, maintenance, demo scenarios) is a broker-mediated command with an
acknowledgement on mes/commands/response, keeping a full audit trail.
Two enterprise systems sit at defined integration boundaries around this line:
| System | Owns | Exchange with the line / MES |
|---|---|---|
| ERP (Level 4) | Production orders, purchasing, inventory valuation, costing | ↓ order release · ↑ completion confirmations, per-lot consumption (backflush), scrap valuation |
| WMS (Level 3, sibling of the MES) | The substrate vault: goods receipt of supplier
lots (where a LOT-… number is born), storage locations, stock counts, picking |
↓ picking order fulfilment — a lot-stamped box issued to AGV-D · ↑ material calls (low-threshold events, §8), consumption per lot, vault reconciliation (issued = consumed + remaining) |
The WMS hand-over point is the material delivery queue: a press's low-material event
becomes a picking order; the issued box arrives carrying its lot number and is mounted through the
materialSetup transaction (§5). Both boundaries are exercised by the simulator in this
environment; the contracts are unchanged when real ERP/WMS systems connect.
The production unit is the sheet — security paper carrying 45 notes in a 5×9 layout. Sheets flow strictly B010 → B070; single notes exist only after the cut at B070. Defective sheets are always destroyed (shredded) — the line has no rework path.
The routing is a fixed, linear gamme — one entry point, seven operations in mandatory order, no alternative routes and no rework loop. Each operation adds one security layer to the sheet and consumes one unit of its assigned material:
| Op | Station | Process — what physically happens to the sheet | Material in | Cycle |
|---|---|---|---|---|
| 10 | B010 | Sheet feed & substrate check. A blank sheet is picked from the vault-issued pallet. The watermark and the embedded security thread are already in the substrate (from the paper mill); the station gauges thickness and verifies watermark and thread position against register before releasing the sheet into the line. | security_paper | 30 s |
| 20 | B020 | Offset "Simultan" printing. The background artwork is printed on both faces in a single pass through opposed blanket cylinders — this is what guarantees perfect front/back register (the see-through motifs that must align on a genuine note). | offset_ink | 45 s |
| 30 | B030 | Silk-screen OVI. A flat screen deposits the optically variable ink patch — a thick (~18 µm) layer whose colour shifts with viewing angle. Deposit thickness and shift angle are what make the effect work. | ovi_ink | 60 s |
| 40 | B040 | Hot-foil / OVD application. A heated die (~105 °C) presses the holographic stripe from the foil web onto every note position; adhesion and patch position are checked on the fly. | foil_roll | 50 s |
| 50 | B050 | Intaglio printing. Bottleneck The engraved plate is inked, its surface wiped clean, then the sheet is pressed against it at ~900 kN — the paper is drawn into the engraving, producing the raised, tactile print you can feel on a genuine note. Slowest and most valuable operation; plate wear is the line's dominant loss. | intaglio_ink | 90 s |
| 60 | B060 | Numbering & varnish. Letterpress numbering boxes stamp two serial numbers on each of the 45 notes; a protective varnish coat is then applied over the whole sheet. | numbering_ink + varnish | 55 s |
| 70 | B070 | Inspection, cut & pack. Cameras inspect all 45 notes individually; the sheet is guillotine-cut into single notes, which are banded into 100-note packs and released to the cash vault. | banding_tape | 70 s |
Routing rules. Entry only at Op 10; sheets cannot skip, repeat or reorder operations — the work-op id (10…70) in every transaction encodes the position in the gamme. There are exactly two exits: good sheets leave at Op 70 to the cash vault as banded packs, and failing sheets leave at whichever operation caught the defect, routed to the shredder (see Quality gates below). A sheet that leaves early therefore has a genealogy that is complete up to and including its exit point.
Every station runs the same ISA-88-style state machine, exposed identically on both interfaces:
IDLE → LOADING → READY → RUNNING → COMPLETE → UNLOADING → IDLE
│
├→ FAULT (auto-recovery, reason-coded)
├→ MAINTENANCE (planned, every 200 cycles or on command)
├→ SETUP (product changeover)
└→ BREAK (shift calendar — planned pause, not downtime)
The shift calendar (3×8, breaks per shift) follows the wall clock. During a
break a station finishes the sheet in flight, then holds in BREAK — consumers
must not count this as fault downtime.
The line runs one-piece flow: each station holds exactly one sheet at a time.
On completion the sheet is passed to the next station's inbound queue and is picked up as
soon as that station returns to IDLE. There are no inter-station buffers by
design — WIP between stations is therefore small, visible (queue depth per station in the
WIP feed) and self-limiting: an upstream station simply waits when its successor is busy.
The intaglio press B050 (90 s) is the pacemaker: the line can never exceed 40 sheets/h ≈ 1,800 notes/h regardless of how fast the other presses run. Station utilisation against that takt explains the idle time consumers will observe — it is structural, not a fault:
| Station | Cycle | Utilisation vs takt | Behaviour at takt |
|---|---|---|---|
| B010 | 30 s | 33 % | Waits most of the cycle — feeds on demand |
| B020 | 45 s | 50 % | Waits ~half the takt |
| B030 | 60 s | 67 % | Comfortable margin |
| B040 | 50 s | 56 % | Comfortable margin |
| B050 | 90 s | 100 % | Pacemaker — any B050 stop is lost line output |
| B060 | 55 s | 61 % | Comfortable margin |
| B070 | 70 s | 78 % | Second-highest load — watch after any B050 speed-up |
Consequence for KPI consumers: an hour of B050 downtime costs the line a full hour of output; an hour of B010 downtime may cost nothing (it catches up within its idle margin). Loss accounting should always be read against the pacemaker.
Every station is a quality gate: the pass/fail verdict is made at
operationComplete from that station's three measured parameters. A failing
sheet exits the flow immediately at the station that caught it and is routed to the
shredder — no downstream value is ever added to a defective sheet, and the failing
station, parameter and active material lot are recorded in the same event. First-pass
yield is therefore computed per gate and compounds across the seven gates to the line FPY;
finished output is counted at B070 only (good sheets × 45 = good notes).
Production runs 3×8 (morning / afternoon / night) with fixed in-shift breaks:
stations finish the sheet in flight then hold in BREAK (planned time — see
above). Maintenance is twofold: planned every 200 cycles per station (short,
counted as planned downtime) and corrective on faults, with reason-coded recovery
times — the intaglio plate change (~15 min) being the dominant one. Material replenishment
(§8) runs continuously and independently of the production takt; a starved station holds
in place and raises a critical alert rather than passing an unprocessed sheet.
Endpoint: opc.tcp://<host>:4844/banknote (anonymous, demo profile).
One folder per station under the banknote object; identical node set across
stations. Node ids are server-assigned numeric (ns=1;i=…) — browse from
Objects/banknote rather than hard-coding ids.
| Node | Type | Access | Meaning |
|---|---|---|---|
| State | String | R | ISA-88 state name |
| CycleTime | Double | R/W | Effective cycle time (s) |
| SpeedMultiplier | Double | R/W | 0.1 – 10.0 line-speed factor |
| PartsProduced / PartsDefective / PartsScrap / PartsRework | Int32 | R | Sheet counters (rework is always 0 on this line) |
| OEE | Double | R | Station OEE (A×P×Q) |
| InputUnique | String | R | Serial of the sheet on station |
| FaultReasonCode | String | R | Active reason code, empty if none |
| MaintenanceNeeded · CyclesSinceLastMaintenance | Bool · Int32 | R | Planned-maintenance window |
| InputMaterialLot / InputMaterialBox / InputMaterialRemaining | String · String · Int32 | R | Active material lot at the station |
| ProcessParameters/<param>/{Nominal, UpperLimit, LowerLimit, Unit} | Double/String | R | Spec limits (see §7) |
| Measurements/<param> | Double | R | Last measured value |
| DataCollection/{LastRecord, RecordCount} | String · Int32 | R | Last full record as JSON |
Broker mqtt://<host>:1883, JSON payloads, QoS 0. The
banknote/# namespace is part of the archived filter set — every message below
lands in the historian.
| Topic | Cadence | Content |
|---|---|---|
| banknote/{B010…B070}/status | on state change | State, cycle, counters, sheet serial |
| banknote/{B010…B070}/measurements | per sheet | Measured values for that sheet |
| banknote/{B010…B070}/transaction | per event | MES transactions (§5) |
| banknote/{B010…B070}/materialSetup | per lot change | New box/lot mounted |
| banknote/line/summary | 2 s | Line KPIs: OEE, FPY, WIP, bottleneck, goodNotes |
| mes/banknote/state | 2 s + on change | Line RUNNING/STOPPED + station snapshot |
| mes/alerts | per event | Faults, quality, material-low, shift events (shared) |
| mes/materials/status | 2 s | All stations' active boxes incl. B010–B070 |
| agv/status | 2 s | Fleet snapshot — AGV-D under fleet.D (not archived; the fleet snapshot is mirrored into an archived logistics feed) |
Transactions follow an MES-style function model:
operationStart, operationComplete, operationStop,
saveDataCollection, scrapPiece, materialSetup
(reworkPiece never occurs on this line).
banknote/B050/status{ "state": "RUNNING", "cycleTime": 90, "partsProduced": 26,
"partsScrap": 0, "partsRework": 0, "inputUnique": "BNK-20260723-0408569" }
banknote/B050/transaction{ "function": "operationComplete", "station": "B050", "workOp": 50,
"inputUnique": "BNK-20260723-0408569", "result": "PASS",
"measurements": {
"reliefHeight": { "value": 61.2, "unit": "µm", "nominal": 60, "tolerance": 12, "inTolerance": true },
"platePressure": { "value": 903.5, "unit": "kN", "nominal": 900, "tolerance": 60, "inTolerance": true },
"wipingResidue": { "value": 0.8, "unit": "%", "nominal": 1.0, "tolerance": 0.8, "inTolerance": true } },
"actualCycleTime": 90.2, "targetCycleTime": 90,
"timestamp": "2026-07-23T09:31:04.512Z" }
banknote/B050/transaction{ "function": "scrapPiece", "station": "B050",
"inputUnique": "BNK-20260723-0381809",
"reason": "Intaglio relief height out of spec — plate wear", "totalScrap": 3 }
banknote/B030/materialSetup{ "function": "materialSetup", "station": "B030",
"boxId": "BOX-412-20260723", "lotNumber": "LOT-OVI-20260723-408610",
"materialType": "ovi_ink", "quantity": 40,
"source": "AGV", "agvTripId": "MTRIP-078" }
| Object | Format | Example |
|---|---|---|
| Sheet serial | BNK-YYYYMMDD-####### | BNK-20260723-0408569 |
| Material lot | LOT-<CODE>-YYYYMMDD-### | LOT-OVI-20260723-408610 |
| Material box | BOX-###-YYYYMMDD | BOX-412-20260723 |
| AGV trip | MTRIP-### | MTRIP-078 |
One serial per sheet, assigned at B010 and carried through every transaction and measurement. The genealogy of a sheet therefore contains: all seven station visits with timestamps and cycle times, every measured value against its spec limits, the verdict per station, and the material lot active at each station when the sheet passed — enabling descending lot trace (which sheets consumed lot X) and ascending trace (which lots are in sheet Y). Sequence numbers are day-seeded, so restarts never reissue a serial.
Three parameters per station, Gaussian behaviour around nominal, spec = nominal ± tolerance. An out-of-tolerance sheet is scrapped — 100 % shred, no rework. SPC (Cp/Cpk) is computed downstream from the measurement stream.
| Station | Parameter | Unit | Nominal | ± Tol |
|---|---|---|---|---|
| B010 | sheetThickness | µm | 115 | 8 |
| watermarkRegistration | mm | 0 | 0.5 | |
| threadPosition | mm | 0 | 0.8 | |
| B020 | frontBackRegister | µm | 0 | 40 |
| colorDeltaE | ΔE | 0.8 | 0.6 | |
| inkFilmThickness | µm | 2.5 | 0.5 | |
| B030 | oviLayerThickness | µm | 18 | 3 |
| colorShiftAngle | ° | 30 | 4 | |
| screenRegister | µm | 0 | 60 | |
| B040 | foilAdhesion | N | 12 | 2 |
| patchPosition | µm | 0 | 150 | |
| stampTemp | °C | 105 | 6 | |
| B050 | reliefHeight | µm | 60 | 12 |
| platePressure | kN | 900 | 60 | |
| wipingResidue | % | 1.0 | 0.8 | |
| B060 | numberRegister | µm | 0 | 80 |
| inkDensity | OD | 1.45 | 0.15 | |
| varnishThickness | µm | 3.0 | 0.6 | |
| B070 | defectDensity | def/sheet | 0.5 | 0.5 |
| cutAccuracy | mm | 0 | 0.15 | |
| bandTension | N | 25 | 3 |
Fault reason codes follow the plant library (MECH, ELEC, TOOL, MAT, SENS, HYD, THERM, CALIB, SOFT) with station-specific weightings — plate wear (TOOL, ~900 s recovery) dominates the intaglio press; numbering-box jams (MECH) dominate B060; vision faults (SENS) dominate B070.
Each station consumes one unit of its material per sheet. When a box crosses its low
threshold, a delivery is queued and AGV-D (dedicated to the secure hall, prefix B)
executes a vault-escorted run: MOVING_TO_WAREHOUSE → LOADING_MATERIAL →
MOVING_TO_STATION → UNLOADING_MATERIAL → RETURNING, with opportunity charging below
30 % battery. Every delivery emits a materialSetup transaction carrying the
new lot number.
Boundary with the WMS (§1): vault-side inventory — reception of supplier lots, storage locations, stock counts — is WMS territory. The line-side contract stays minimal and stable: a material call goes out, a lot-stamped box comes in. Lot numbers are assigned at goods receipt, never on the line.
| Station | Material | Lot code | Box qty | Low @ |
|---|---|---|---|---|
| B010 | security_paper | PAPR | 60 | 15 |
| B020 | offset_ink | OINK | 80 | 20 |
| B030 | ovi_ink | OVI | 40 | 10 |
| B040 | foil_roll | FOIL | 50 | 12 |
| B050 | intaglio_ink | IINK | 70 | 15 |
| B060 | numbering_ink + varnish (secondary) | NINK · VARN | 60 · 120 | 15 · 25 |
| B070 | banding_tape | BAND | 200 | 30 |
All commands are published to mes/commands/<name>; acknowledgements
arrive on mes/commands/response. Relevant to this line:
| Command | Payload | Effect |
|---|---|---|
| startLine / stopLine | {"line":"banknote"} | Manual line control (graceful drain on stop) |
| adjustSpeed | {"line":"banknote","multiplier":1.5} | Line-wide speed factor |
| triggerMaintenance / postponeMaintenance | {"station":"B050"} | Corrective / deferred maintenance |
| degradeStation / recoverStation | {"station":"B050","rate":0.2} | Demo: force / reset a defect rate |
| injectBadLot | {"station":"B030"} | Demo: next delivered lot carries a latent defect |
| materialSetup | {"station":"B020", …box} | Operator lot change |
Commands are subscribed ~30 s after line boot — clients should not send commands during that window (they are lost, by design there is no retained queue).
The broker's archive group persists banknote/# (together with the
mes/# plant namespace) into PostgreSQL: defaultarchive
(30-day time series) and defaultlastval (last value per topic, 7-day
retention). The dashboard exposes the line read-only:
| Endpoint | Serves |
|---|---|
| /api/status/banknote | Live per-station state incl. sheet serials |
| /api/line-summary/banknote | OEE, FPY, WIP, goodNotes, bottleneck |
| /api/stats/* ?line=banknote | Production, OEE trend, stations, Pareto, cycle times |
| /api/stoppages?line=banknote · /api/gantt?line=banknote | Fault events · state timeline |
| /api/report/<BNK-serial> · /api/line-serials/banknote | Full genealogy · serial browser |
| /api/material/status · /api/material/history | Live lots & delivery history |
| /api/banknote/agv | AGV-D telemetry (state, battery, mission, trips) |
| /api/banknote/start · /api/banknote/stop · /api/control | Command bridge (POST → MQTT) |