Paper Machine
A fine-paper machine and its scanning quality control system, over OPC UA. Eight sections from stock preparation to the reel, 118 nodes.
Operator view | port 4020 |
|---|---|
OPC UA server | port 5030 |
Devices and tags | 8 devices, 118 nodes |
Litmus Edge driver | OPC UA Client Advanced |
Image | pulp-paper-demo |
Overview
Most continuous processes report a point value: a pressure, a level, a flow. A paper machine also reports a profile across the sheet.
The quality control system drags a scanning head across a sheet 8.4 m wide moving at 1,100 m/min, so a single measurement is a curve across the sheet rather than a number. That gives two axes, and both terms appear in the tag names and on the operator view:
Term | Axis | Measured against |
|---|---|---|
MD, machine direction | along the sheet | time |
CD, cross direction | across the sheet | position |
MD control is an ordinary loop: moisture low, add steam. CD control is twenty-four dilution valves in the headbox, each trimming the fibre delivered to one slice of the sheet. The operator view shows both axes, because a side elevation alone cannot show a profile: the machine along the top, and below it the sheet seen from above, one bar per dilution zone, with the scanner head at its live position.
Scenarios
Four scenarios ship with the solution. The first causes the third, with nothing in the model connecting them directly.
Fibre giveaway. Not a fault, and always present. Paper is sold by area and made by mass, so every gram per square metre above the customer minimum is fibre nobody paid for. The mill must keep the thinnest part of the sheet legal rather than the average, so the aim point is the specification minimum plus the profile spread plus an operating margin. A machine that cannot hold a flat profile runs heavier and pays that margin on every tonne, with nothing alarming. Flatten the profile and the aim point comes down.
A stuck headbox dilution valve. The slice it feeds runs heavy. A dilution valve does not affect only its own slice: the diluted stock spreads before it reaches the lip, so one valve moves its neighbours, and a controller cannot correct anything narrower than its own response width. Cross-direction two-sigma goes from about 0.4 to about 1.6 g/m2 and stays there; the aim point follows it up within a scan or two, and giveaway follows the aim.
A sheet break, two sections downstream. A heavier slice is also a wetter slice, and the dryers are controlled on the scanner average, so the average comes right while the streak stays wet. A wet line through the sheet is a weak line, and the open draw between the press and the first dryer is where it lets go. No fault is injected at the press.
A plugged press felt. A point of dryness lost at the press is a point the dryers buy back with steam, and drying is the largest energy consumer on the machine. Steam per tonne goes from about 1.45 to about 1.85 with quality and production unchanged, which is why this condition can run for months. Neither the steam figure nor the dryness figure identifies the cause alone; the analytics group joins them.
Tag names
The node names follow what a paper machine's DCS and QCS publish to the mill historian, which is the level Litmus Edge reads: BasisWeightGsm, MoisturePct, CdSigma2, DrynessAfterPressPct, SteamPerTonne, FreenessCsf, JetWireRatio.
Two groups exist for specific scenarios. BasisWeightGsm and BwAimGsm are separate nodes, and the gap between them is the giveaway. CdZone01Bw through CdZone24Bw are the databoxes across the sheet, and CdZone01Valve through CdZone24Valve are the dilution valves that feed them: the measurement sits on the scanner and the actuator on the headbox, which is where each of them physically is.
There is no OPC UA companion specification covering this domain model, so the node names are the solution's own. The protocol provides discovery, typed values and subscription, not borrowed semantics.
What it creates on Litmus Edge
Component | Created |
|---|---|
DeviceHub | 8 devices on the OPC UA Client Advanced driver, 118 nodes |
Digital Twin | 8 models, one instance each, one per machine section |
Analytics | 4 groups |
Analytics group | Computes |
|---|---|
Profile Control Health | profile spread against the aim point it forces, and whether a valve is stuck |
Basis Weight Control | giveaway in grams, tonnes and dollars per hour |
Drying Energy | specific steam against press dryness, to separate the two causes |
Break Risk | the wet streak against the load in the draw it is about to break |
Every group is multi-input. A single threshold on a single tag is what a SCADA alarm already provides; the join is what Litmus Edge adds.
The cross-direction profile is served as twenty-four sibling scalar nodes rather than one array node. DeviceHub reads a tag as a value, so an array would arrive as one opaque tag that no analytics group could threshold and no twin attribute could bind to.
Requirements
- Litmus Edge 4.0.x, reachable over HTTPS from the host running the solution
- An API token for that Edge, or a username and password, or a client id and secret
- Docker, and Docker Compose for the compose deployment
- A network path in both directions: the solution reaches the Edge's API, and the Edge reaches this host on port 5030
Deploy
The solution ships two ways. Use the registry if the host can reach Google Artifact Registry, and the downloaded archive if it cannot.
Option 1: pull from the registry
Requires a read-only registry credential, supplied by Litmus separately.
cat key.json | docker login -u _json_key --password-stdin https://us-docker.pkg.devSave this as docker-compose.yml:
services:
pulp-paper:
image: us-docker.pkg.dev/litmus-customer-facing/litmus-solutions/pulp-paper-demo:0.3.0
container_name: pulp-paper-demo
restart: unless-stopped
ports:
- target: 4020
published: 4020
protocol: tcp
- target: 5030
published: 5030
protocol: tcp
environment:
EDGE_URL: "${EDGE_URL:-}"
EDGE_API_TOKEN: "${EDGE_API_TOKEN:-}"
SIM_HOST: "${SIM_HOST:-auto}"
APPLY_ON_START: "${APPLY_ON_START:-1}"
EDGE_VERIFY_TLS: "${EDGE_VERIFY_TLS:-0}"
HTTP_PORT: "4020"
OPCUA_PORT: "5030"
SEED: "13"
LOG_LEVEL: "INFO"Put the three values in a .env file beside it:
EDGE_URL=https://10.0.0.5
EDGE_API_TOKEN=your-token
SIM_HOST=10.0.0.9Start it:
docker compose up -dOption 2: load the downloaded archive
Download pulp-paper-demo-0.3.0-amd64.tar.gz from the solution's page on portal.litmus.io. The archive is the container image, not a source bundle, and needs no registry access.
docker load -i pulp-paper-demo-0.3.0-amd64.tar.gzdocker load prints the image it added:
Loaded image: us-docker.pkg.dev/litmus-customer-facing/litmus-solutions/pulp-paper-demo:0.3.0That reference is the one the compose file above already names, so the same docker-compose.yml and .env now work offline with no docker login:
docker compose up -dTo run it without Compose, pass the same three values on the command line:
docker run -d \
--name pulp-paper-demo \
--restart unless-stopped \
-p 4020:4020 \
-p 5030:5030 \
-e EDGE_URL=https://10.0.0.5 \
-e EDGE_API_TOKEN=your-token \
-e SIM_HOST=10.0.0.9 \
us-docker.pkg.dev/litmus-customer-facing/litmus-solutions/pulp-paper-demo:0.3.0Open http://localhost:4020. Within about a minute the Edge is configured and the page fills in.
The page stays on its waiting panel until the Edge carries this solution's devices. That is deliberate: the simulation does not tick and no value is shown until Litmus Edge is verified to hold the devices and poll them, so nothing on screen can be mistaken for data that never made the trip. With APPLY_ON_START at its default of 1 the solution configures the Edge itself on startup, which takes 30 to 60 seconds. If you set it to 0, or the apply failed, press Apply to Edge in the page header.
Configuration
Variable | Default | Purpose |
|---|---|---|
EDGE_URL | the Docker host | Litmus Edge to configure |
EDGE_API_TOKEN | unset | token for that Edge. Alternatively EDGE_USERNAME and EDGE_PASSWORD, or EDGE_CLIENT_ID and EDGE_CLIENT_SECRET |
SIM_HOST | auto | address the Edge subscribes to |
APPLY_ON_START | 1 | configure the Edge on startup |
EDGE_VERIFY_TLS | 0 | 1 verifies the Edge's certificate |
SEED | 13 | makes a run repeatable |
SIM_HOST requires attention. The solution serves OPC UA and the Edge subscribes to it, so the Edge needs an address it can route to. Leave it auto when the solution runs on the Edge itself or with host networking. Otherwise set it to the address of the host running the solution, as the Edge sees it.
An incorrect value fails quietly: the devices are created, they report as online, and no tag ever reads a value, because the address written into the template is one the Edge cannot reach. The solution refuses to apply a template whose address is obviously unreachable and reports why.
Operator view
The header shows fibre giveaway in dollars per hour with tonnes beneath it, the cross-direction two-sigma against the flat-machine floor, steam per tonne, and production with break and downgrade counts.
Below that is the machine, stock preparation to reel, drawn side on with the sheet threaded through it: flat on the wire, through the press nips, over and under the dryer cans, then onto the reel, which grows as the jumbo builds. The sheet changes colour along the line as water leaves it, which shows where the machine is spending its energy.
Below the machine is the sheet from above: one bar per dilution zone against the aim, with the scanner head at its real position. A stuck valve is visible here and nowhere else.
Each scenario has a card naming the DataHub topics to watch and what changes about them.
Apply and remove
The header carries both controls. Apply to Edge pushes the devices, twins and analytics, and greys out once the solution is on the Edge. Remove from Edge previews first, listing what would be removed and from which Edge, then offers to remove it.
The solution removes only what it created, and records which Edge its apply landed on, so repointing at a different Edge cannot leave a solution stranded on the first one.
Reports
Preview report and Export report produce one self-contained HTML file: inline styles, inline charts, no scripts and no external requests, so it opens offline, emails and prints. It carries the shift totals, the cross-direction profile against the specification band, giveaway and specific steam against time with the flat-machine baseline marked, the reel record with its dispositions, and the Litmus Edge configuration that produced it.