---
title: Body shop framing line
slug: solutions/body-shop-framing-line
docTags: 
createdAt: 2026-08-17T14:36:56.769Z
---

An automotive body shop framing line running at 55 second takt, one body at a time, with per-VIN genealogy: three respot cells, a torque station, a gauge station and end of line. Seven devices and 181 tags.

| Operator view      | port **4014**                |
| ------------------ | ---------------------------- |
| Protocol servers   | port **5024**, **5124**      |
| Devices and tags   | 7 devices, 181 tags          |
| Litmus Edge driver | Modbus TCP and Open Protocol |
| Image              | `automotive-body-shop-demo`  |

## Scenarios

- **Fastening containment scoped to the bodies actually affected.** When a tightening result goes out of window, the question is which vehicles carry the suspect joint. Per-VIN genealogy answers it in bodies rather than in shifts.
- **Cold welds that a stepper hides.** A weld controller's own counters report the schedule it ran, not the joint it made. Electrode wear running away produces welds that pass the controller and fail the part.
- **The constraint against takt.** Every station reports its cycle against the 55 second takt, so the station to fix is the one really costing throughput rather than the one that stopped most recently.

## Overview

This is the only solution here that speaks two industrial protocols at once, and that is the point rather than a complication.

- **Six stations answer Modbus TCP** on 5024, addressed by unit id.
- **The tightening tool controller answers Atlas Copco Open Protocol** on 5124, where the driver's own field names are the domain model rather than something invented for a demo.

Both ports must be reachable from the Edge. Publishing only the Modbus port leaves the torque station unreachable behind a solution that otherwise looks healthy.

## What it creates on Litmus Edge

Seven DeviceHub devices covering the three respot cells, the torque station, the gauge station, end of line and the underbody supply, with 181 tags. A Digital Twin model and instance per station. Analytics groups behind the containment, weld quality and takt figures.

## 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 the protocol port

## 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.

```bash
cat key.json | docker login -u _json_key --password-stdin https://us-docker.pkg.dev
```

Save this as `docker-compose.yml`:

```yaml
services:
  body-shop:
    image: us-docker.pkg.dev/litmus-customer-facing/litmus-solutions/automotive-body-shop-demo:0.5.0
    container_name: automotive-body-shop-demo
    restart: unless-stopped
    ports:
      - target: 4014
        published: 4014
        protocol: tcp
      - target: 5024
        published: 5024
        protocol: tcp
      - target: 5124
        published: 5124
        protocol: tcp
    environment:
      # Fill these in.
      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: "4014"
      MODBUS_PORT: "5024"
      OPEN_PROTOCOL_PORT: "5124"
      AUTOSTART: "1"
      TICK_SECONDS: "0.2"
      TIME_SCALE: "5"
      SEED: "7"
      LOG_LEVEL: "INFO"
```

```javascript
EDGE_URL=https://10.0.0.5
EDGE_API_TOKEN=your-token
SIM_HOST=10.0.0.9
```

```bash
docker compose up -d
```

Open `http://localhost:4014`.

**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.

### Option 2: load the downloaded archive

Download `automotive-body-shop-demo-0.5.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.

```bash
docker load -i automotive-body-shop-demo-0.5.0-amd64.tar.gz
```

`docker load` prints the image it added:

```javascript
Loaded image: us-docker.pkg.dev/litmus-customer-facing/litmus-solutions/automotive-body-shop-demo:0.5.0
```

That 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`:

```bash
docker compose up -d
```

To run it without Compose, pass the same three values on the command line:

```bash
docker run -d \
  --name automotive-body-shop-demo \
  --restart unless-stopped \
  -p 4014:4014 \
  -p 5024:5024 \
  -p 5124:5124 \
  -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/automotive-body-shop-demo:0.5.0
```

## Configuration

| Variable             | Default         | What it does                                                               |
| -------------------- | --------------- | -------------------------------------------------------------------------- |
| `EDGE_URL`           | the Docker host | Litmus Edge to configure                                                   |
| `EDGE_API_TOKEN`     | unset           | token for that Edge. Or a username and password, or a client id and secret |
| `SIM_HOST`           | `auto`          | address the Edge polls to reach this solution                              |
| `APPLY_ON_START`     | `1`             | configure the Edge on startup                                              |
| `EDGE_VERIFY_TLS`    | `0`             | `1` checks the Edge's certificate                                          |
| `OPEN_PROTOCOL_PORT` | `5124`          | the tightening tool controller. Must be reachable from the Edge            |
| `TIME_SCALE`         | `5`             | line runs 5x real time, so a shift of production is watchable              |
| `SEED`               | `7`             | makes a run repeatable                                                     |

## Operator view

The six stations across the top with their live tags, cycle time against takt, and job per hour. Below them, bodies moving down the line with their VINs, and the buffers between stations.

Each body carries its own genealogy, so a fault introduced at one station can be followed to the vehicles that passed through it while the fault was present.

Faults include electrode wear running away in cell 2, the spindle drifting out of the torque-angle window, a robot fault that holds the line, a shifted framing fixture, and the underbody supply starving cell 1.

## Apply and remove

```bash
docker compose down
```

Use Clean up in the [Solutions provisioner](#) to remove what it created on the Edge.

## Support

[support@litmus.io](mailto\:support@litmus.io)
