For the complete documentation index, see llms.txt. This page is also available as Markdown.

Salad Dressing Factory

This cookbook walks you through setting up TilliT for a salad dressing and condiment manufacturing facility. By the end, you will have a fully configured site with cooking kettles, holding tanks, a glass bottle line, bulk filling, and portion control lines, plus live machine data flowing in via a Kepware OPC-UA edge connection.

The setup is based on a real-world condiment and dressing factory that blends and cooks raw ingredients in kettles, holds finished product in tanks, and fills into glass jars, bulk containers, and individual portion-control cups for retail and foodservice customers. The plant operates on day and afternoon shifts and uses TilliT for quality checks, cook data capture, filling controls, and live equipment monitoring via edge integration.

All names used in this guide are generic examples. Replace them with your own site, line, and product names.

Prerequisites

Before you begin, ensure you have:

  • A TilliT tenant provisioned for your organisation

  • An administrator account with access to Settings

  • The Excel Add-in installed (recommended for bulk data loading)

For a general introduction to TilliT setup concepts, see Introduction for New TilliT Customers.

1

Create the Site

A site represents the physical location of your factory.

Go to Settings -> Asset Hierarchy -> Sites -> Create

Field
Example Value

Name

Sauce & Dressing Plant

Timezone

Denmark

Location Code

SD

For more detail, see Site.

2

Define Asset Classes

Asset classes group similar types of equipment. A salad dressing and condiment factory typically has the following asset classes:

Asset Class
Description

Area

Top-level groupings (Prepping & Cooking, Production, QA)

Preppers

Fruit and vegetable preparation equipment

Kettles

Cooking and blending vessels

Tanks

Heated holding tanks for finished product awaiting filling

Depalletisers

Empty jar or container unloading

Fillers

Hot-fill machines (glass line, bulk, portion control)

Cappers

Lid or cap application machines

Labellers

Primary and secondary label applicators

Packers

Carton overpackers

Palletisers

Automated palletising

Go to Settings -> Asset Hierarchy -> Asset Class -> Create

Create one asset class for each type listed above. See Asset Class for details.

3

Build the Asset Hierarchy

Assets represent the individual machines and areas. In a condiment factory the hierarchy follows the production flow: preparation → cooking → holding → filling → packing.

Sauce & Dressing Plant
├── Prepping & Cooking (class: Area)
│   ├── Prep Area (class: Preppers)
│   ├── Kettle 1 (class: Kettles)
│   ├── Kettle 2 (class: Kettles)
│   ├── Kettle 3 (class: Kettles)
│   ├── Kettle 4 (class: Kettles)
│   ├── Holding Tank 1 (class: Tanks)
│   ├── Holding Tank 2 (class: Tanks)
│   ├── Holding Tank 3 (class: Tanks)
│   └── Holding Tank 4 (class: Tanks)
├── Production (class: Area)
│   ├── Glass Line (class: Area)
│   │   ├── Depalletiser (class: Depalletisers)
│   │   ├── Filler (class: Fillers)
│   │   ├── Capper (class: Cappers)
│   │   ├── Labeller (class: Labellers)
│   │   ├── Carton Overpacker (class: Packers)
│   │   └── Palletiser (class: Palletisers)
│   ├── Bulk Line (class: Fillers)      ← fills 2 kg – 10 kg containers
│   ├── Portion Control Line 1 (class: Fillers)  ← fills cups 13 mL – 45 mL
│   └── Portion Control Line 2 (class: Fillers)  ← fills cups 13 mL – 45 mL
└── QA (class: Area)                    ← shared quality assurance

Key points

  • Kettles cook and blend dressings, sauces, jams, and chutneys. Number kettles based on your actual equipment (e.g. Kettle 1 through Kettle 4).

  • Holding tanks keep the cooked product hot and ready for filling. They are typically heated and agitated.

  • Glass Line is the primary retail packaging line: jars are depalletised, hot-filled, capped, labelled, overpacked into cartons, and palletised.

  • Bulk Line fills large containers (2 kg to 10 kg) for foodservice and industrial customers.

  • Portion Control Lines fill individual cups (13 mL to 45 mL) for hospitality and airline catering.

  • QA sits at the top level and is shared across all lines.

  • Use Display Order to control the sequence assets appear in the UI (e.g. 100, 200, 300).

Go to Settings -> Asset Hierarchy -> Assets -> Create

Create each asset, assign it to the correct asset class, and set the parent asset for child equipment. See Asset for details.

For sites with many assets, use the Excel Add-in to create assets in bulk.

4

Configure Shifts

Shift templates define the working hours for each area.

Shift Template
Start Time
Duration
Description

Day Shift

06:00

8 hours

Standard morning shift

Afternoon Shift

14:00

8 hours

Afternoon shift

Night Shift

22:00

8 hours

Night shift (high-volume periods)

Not every area runs the same schedule. Kettles may run a single extended cook shift while filling lines run two shifts.

Creating shift schedules

Setting up shifts is a two-step process: first, you define the overall shift pattern (Shift Template and its Items); then, you link that pattern to your equipment using a Shift Calendar.

1

Create and Configure the Shift Template

  1. Go to: Settings -> Asset Hierarchy -> Shift Templates -> Create.

  2. Create the required shift templates.

  3. Within each created template, go to: Items

  4. Define the specific shift periods, including their start times and durations.

See Creating a Shift Template for details.

2

Assign Shifts to Assets

Once your templates and items are ready, create calendars to map these schedules to the correct assets.

Since not every line runs the same schedule (e.g., Kettle and prep areas often run earlier shifts to have product ready in holding tanks before filling lines start), calendars ensure each asset accurately reflects its real-world operating schedule.

  1. Go to: Settings -> Asset Hierarchy -> Calendars -> Create.

  2. Add your Shift Template as a calendar Item.

  3. Select the relevant asset and apply the template.

5

Set Up Units of Measure

Before creating materials and process variables, define the units of measure your site will use.

Unit
Description

g

Grams (fill weights, small quantities)

kg

Kilograms (ingredient weights, bulk containers)

mL

Millilitres (fill volumes, liquid ingredients)

L

Litres (large liquid volumes, holding tanks)

°C

Degrees Celsius (cook and fill temperatures)

°Brix

Brix refractometer readings (sugar concentration)

%

Percentage (acidity, viscosity tolerance)

bar

Pressure (capper, hot wash tunnel)

kPa

Pressure alternative unit

EA

Each (individual items, jars, cups)

CTN

Cartons

Go to Settings -> Configuration -> Unit of Measure -> Create

See Unit of Measure for details.

6

Create Material Groups

Material groups categorise your raw materials, semi-finished goods, and finished products. For a condiment factory:

Group
Description

Raw Materials

Fruits, vegetables, oils, vinegars, sugars, salt, spices

Ingredients

Flavourings, stabilisers, emulsifiers, preservatives, colours

Semi-Finished Goods

Cooked product ready for filling (bases, concentrates)

Finished Goods

Retail-packed glass jars (150 g – 300 mL)

Bulk

Large foodservice containers (2 kg – 10 kg)

PCL Packaging

Portion control cup packs (13 mL – 45 mL)

Glass

Glass jars by size

Caps

Lids and caps by type

Labels

Primary, secondary, and carton labels

Cartons

Outer cartons and outers

Lids

Press-on and screw lids for bulk containers

Plastic

Plastic cups and lids for PCL lines

Rework

Rework and returned product

WIP

Work-in-progress material

Go to Settings -> Material Definition -> Material Groups -> Create

See Material Group for details.

Separate Glass, Caps, Labels, and Cartons into their own groups to make it easier to track packaging consumption by type.

7

Add Materials

Materials represent the specific items consumed or produced during manufacturing. A condiment factory can have hundreds of materials across groups.

Raw Materials (sample)

  • Produce - fresh tomatoes, onions, capsicum, cucumbers, fruit pulp

  • Oils - canola oil, olive oil, sunflower oil

  • Acids - white vinegar, apple cider vinegar, citric acid

  • Sugar & Salt - white sugar, sea salt, glucose syrup

  • Spices & Herbs - black pepper, garlic, mixed herbs, chilli flakes

Ingredients

  • Emulsifiers - xanthan gum, guar gum, lecithin

  • Preservatives - potassium sorbate, sodium benzoate

  • Flavourings - lemon juice concentrate, garlic extract, herb blends

  • Colours and modifiers - caramel colour, paprika extract

Semi-Finished Goods

Cooked product held in tanks ready for filling, typically named by product type:

  • French Dressing Base

  • Caesar Dressing Base

  • Ranch Dressing Base

  • Balsamic Vinaigrette Base

  • BBQ Sauce Base

  • Chilli Sauce Base

  • Tomato Chutney Base

  • Strawberry Jam Base

  • Apricot Jam Base

Finished Goods (sample)

By format and product:

  • Glass retail - e.g. "French Dressing 300 mL", "Ranch Dressing 300 mL", "BBQ Sauce 300 mL", "Apricot Jam 300 g"

  • Bulk foodservice - e.g. "Caesar Dressing 2 kg", "Tomato Relish 2 kg", "Caramelised Onion 10 kg"

  • Portion control cups - e.g. "Ranch Dressing 25 mL x 60", "BBQ Sauce 25 mL x 60", "Apricot Jam 14 g Cup x 120"

Go to Settings -> Material Definition -> Materials -> Create

For bulk loading, use the Excel Add-in to import materials from a spreadsheet.

See Material for details.

8

Define Attributes

Attributes store metadata against orders, materials, and assets. In condiment manufacturing, think of them as the product's digital "Product Specification Sheet" or identity card. They hold specific details that drive activity behaviour, store filling machine settings, and track label and packaging configurations per product. TilliT uses this information to automatically show or hide relevant fields based on that specific product type, as well as to help the Scheduler calculate changeover times.

Order Number Attributes

These attach to individual work orders. When orders are loaded via the API, attribute values are sent in the payload (see Step 14). Group them by purpose:

Product & Batch

Attribute
Data Type
Purpose

Batch

STRING

Batch number for traceability

Run

STRING

Production run identifier

Shelf Life

STRING

Shelf life in days or months

Label & Coding

Attribute
Data Type
Purpose

Label Date Coding - Format

STRING

Date code format printed on pack (e.g. DDMMYYYY)

Label Date Coding - Location

STRING

Position of date code on container

Print Message Primary Label

STRING

Text to print on the primary label

Print Message Inner Carton Label

STRING

Text to print on the inner carton

Print Message Outer Carton

STRING

Text to print on the outer carton label

Product EAN Barcode

STRING

EAN/GTIN barcode for the product

Carton TUN Barcode

STRING

Traded unit barcode for the carton

Carton Labeling Placement

STRING

Where carton labels are applied

Carton Dividers

STRING

Whether carton dividers are required

Carton Format

STRING

Carton configuration (e.g. 6pk, 12pk, tray)

Holding Tank Settings

Attribute
Data Type
Purpose

Holding Tank Temperature - Target

NUMBER

Target holding temperature (°C)

Holding Tank Temperature - Min

NUMBER

Minimum holding temperature (°C)

Holding Tank Temperature - Max

NUMBER

Maximum holding temperature (°C)

Holding Tank Stirrer Function

STRING

Stirrer speed or mode for this product

Filler Settings

Attribute
Data Type
Purpose

Fill Weight (g)

NUMBER

Target fill weight in grams

Fill Temperature Min

STRING

Minimum acceptable fill temperature

Fill Temperature Max

STRING

Maximum acceptable fill temperature

Filler Nozzles

STRING

Number and configuration of filler nozzles

Filler Speed

STRING

Filler speed setting

Forming Die Size (ml)

STRING

Die size for portion control lines

Forming Die Size Number of Turns

STRING

Adjustment turns for portion control die

Filling Program

STRING

Machine program number for this product

Capping & Sealing

Attribute
Data Type
Purpose

Sealing/Capping - Description

STRING

Cap or lid type description

Sealing/Capping - Integrity Test

STRING

Integrity test method (vacuum, pop test)

Sealing/Capping - Limits (bar/kPa) Min

NUMBER

Minimum acceptable cap pressure

Sealing/Capping - Limits (bar/kPa) Max

NUMBER

Maximum acceptable cap pressure

Washing & Sterilisation

Attribute
Data Type
Purpose

Hot Wash Tunnel Pressure

STRING

Hot wash tunnel pressure setting

Wash Tunnel Settings - Temperature

NUMBER

Hot wash tunnel temperature (°C)

Cooling Tunnel Program

STRING

Cooling tunnel program setting

Jar Prewarmer

STRING

Jar pre-warm setting (on/off, temperature)

UV Steriliser

STRING

UV steriliser enabled/mode

Crack Detection Unit

STRING

Crack detector setting

Cap Detection Unit

STRING

Cap presence detector setting

Break Detection Unit

STRING

Glass break detector setting

Air Dryer

STRING

Air dryer setting post-wash

Pallet Configuration

Attribute
Data Type
Purpose

Pallet Brand to Use

STRING

Pallet brand or type

Pallet Dividers

STRING

Whether pallet layer dividers are used

Pallet Divider Location

STRING

Where dividers are placed on the pallet

Pallet Wrap

STRING

Pallet wrap type

Pallet ID Sheet Requirements

STRING

Requirements for pallet identification sheet

Bin Tracking (portion control lines)

Attribute
Data Type
Purpose

Bins

NUMBER

Number of bins (PCL cups per cycle)

Bin 0 - Bin 12

STRING

Individual bin assignment tracking

Current Bin

NUMBER

Currently active bin index

Quality & Compliance

Attribute
Data Type
Purpose

Pre-Citrate Testing Required

STRING

Whether citrate testing is required before filling

Cleaning / Allergen Instructions

STRING

Specific cleaning or allergen changeover instructions

HasX-Ray

STRING

Whether X-ray inspection is in use

Other Instruction 1

STRING

General instructions for operators

Other Instruction 2

STRING

Additional instructions for operators

Go to Settings -> Configuration -> Attributes -> Create

See Attribute for details.

You do not need to create all attributes manually before loading orders. When you use the order upsert API (see Step 14), any attribute that does not already exist will be created automatically.

9

Set Up Process Variables

Process variables define the measurements operators capture during cooking and filling. They enforce quality spec limits per product.

Cook Quality (Kettles)

Process Variable
UoM
Purpose

Cook Limit

°C

Maximum cook temperature

Brix

°Brix

Sugar concentration (refractometer)

pH

--

Acidity measurement

Total Titratable Acidity (T.T.A)

%

Titratable acid content

Viscosity

--

Product viscosity check

Fill Quality (Glass Line & PCL)

Process Variable
UoM
Purpose

Fill Weight

g

Weight of each filled container

Fill Temperature

°C

Product temperature at the filler

Holding Tank Temperature

°C

Holding tank temperature at time of fill

Machine Monitoring

Process Variable
UoM
Purpose

Super Heated Steam Temperature

°C

Steam steriliser temperature

Cap Pressure

bar

Capper torque/pressure reading

Pop Pressure

bar

Vacuum pop test result (seal integrity)

Hot Wash Tunnel Tank Temperature

°C

Hot wash tunnel water temperature

Hot Wash Tunnel Pressure

bar

Hot wash tunnel pressure

Go to Settings -> Configuration -> Process Variable -> Create

See Process Variable for details.

Process variables (such as Brix or pH) can reference specific order attributes to automatically pull target values directly from the current work order. This ensures that a single activity template can dynamically adapt and work for all products.

10

Create Activity Classes

Activity classes group related activity templates in the UI. For a condiment factory:

Activity Class
Purpose

Cook Checks

Kettle startup, cook monitoring, pH and Brix testing

Prep Checks

Ingredient preparation and loading

Glass Line Checks

Filler startup, cap checks, label verification

PCL Checks

Portion control line startup, die setup, cup weight checks

Bulk Line Checks

Bulk filler setup, container checks

QA Checks

Finished product quality sign-offs

Data Capture

Consumption logs, wash tunnel logs, reconciliation

Cleaning

CIP and sanitisation logs

Safety

Safety guard and equipment checks

Downtime

Downtime reason capture

Go to Settings -> Activity Template -> Activity Classes -> Create

See Activity Class for details.

11

Build Activity Templates

Activity templates are the digital forms that operators interact with. A condiment factory typically has templates covering every stage from ingredient preparation through to palletised finished goods.

Core Activity Categories

Preparation & Cooking

Activity
Triggered by
Purpose

Prep Startup Check

Order start

Verify prep area is clean and ready

Ingredient Issuance

Order start

Record ingredients issued from store

Kettle Startup Check

Order start

Confirm kettle condition and settings

Cook Temperature Monitor

Interval

Record kettle temperature during cook

Brix Check

Interval

Record refractometer Brix reading

pH Check

Interval

Record pH measurement during cook

Total Titratable Acidity Check

Interval

Record T.T.A reading

Cook Completion Sign-off

Order end

Confirm cook meets spec, approve transfer

Ingredient Consumption

Order end

Record actual ingredient quantities used

Transfer to Holding Tank

Order end

Record volume transferred and tank used

Holding Tank Monitoring

Activity
Triggered by
Purpose

Holding Tank Level & Temperature

Interval

Monitor temperature and level in holding tanks

Holding Tank Reconciliation

Manual

Reconcile tank contents against production records

Glass Line

Activity
Triggered by
Purpose

Glass Line Startup Check

Order start

Line readiness: filler, capper, labeller settings

Label Verification

Order start

Confirm correct labels loaded for the product

Jar & Cap Information Record

Order start

Verify correct jar and cap sizes

Filler Settings Check

Order start

Confirm filler nozzles, speed, and program

Wash Tunnel Check

Order start

Verify wash tunnel temperatures and pressures

Fill Weight Check

Interval

Record fill weights against target

Fill Temperature Check

Interval

Record product temperature at filler head

Cap Pop Test

Interval

Verify vacuum seal integrity

Cap Pressure Check

Interval

Record capper pressure readings

Label Quality Check

Interval

Check label placement and date coding

Carton Check

Interval

Verify correct carton and overpacker settings

Glass Line End of Run

Order end

End-of-run reconciliation

Glass Line Downtime

Event-based

Record and categorise stoppages

Bulk Line

Activity
Triggered by
Purpose

Bulk Line Startup Check

Order start

Confirm bulk filler and container settings

Bulk Fill Weight Check

Interval

Record container weights

Bulk Line End of Run

Order end

Reconcile filled containers

Portion Control Lines

Activity
Triggered by
Purpose

PCL Startup Check

Order start

Die size, forming program, cup setup verification

PCL Cup Weight Check

Interval

Record individual cup fill weights

PCL Seal Integrity Check

Interval

Verify heat-seal quality

PCL End of Run

Order end

Record cup count and reconcile bins

Quality & Safety

Activity
Triggered by
Purpose

QA Sign-off

Order start / running

QA approval for starting or continuing a run

Pre-Citrate Testing

Event-based

Record pre-fill citrate test results

X-Ray Check

Shift start

Verify X-ray inspection equipment is operating

Safety Guard Check

Shift start

Confirm all safety guards are in place

Cleaning

Activity
Triggered by
Purpose

Pre-Production Cleaning Check

Shift start

Verify all equipment is clean before production

Kettle CIP Log

Event-based

Record kettle clean-in-place cycle

Glass Line CIP Log

Event-based

Record filling line CIP

Allergen Changeover Check

Event-based

Record allergen cleaning between different products

End of Day Cleaning

Shift end

Confirm end-of-day cleaning completed

Building an activity template

For each activity, you need to:

  1. Create the template with a name and activity key

  2. Assign it to an activity class

  3. Set the "Claimable By" field to define who can see and claim the activity

  4. Configure the trigger (when it fires)

  5. Build the form items (the fields operators fill in)

Go to Settings -> Activity Templates -> Activity Template -> Create

See Creating an Activity for a complete walkthrough.

For understanding trigger types, see When and Where.

Start with the most critical activities - cook sign-off, fill weight checks, and cap integrity - and expand once the team is comfortable.

12

Configure Order Templates

Order templates define how a work order is executed across a bottling line. They specify which machines (child assets) within the bottling line (parent asset) participate in the order, as well as the operation type for each stage.

Preparation

Order Template
Operation
Asset

Prep

Prep

Prep Area

Cooking (one per kettle)

Order Template
Operation
Asset

Kettle 1

Cook

Kettle 1

Kettle 2

Cook

Kettle 2

Kettle 3

Cook

Kettle 3

Kettle 4

Cook

Kettle 4

Glass Line

The Glass Line uses a parent asset with child operations cascaded from it:

Order Template
Operation
From Asset
To Asset

Depalletiser

Depal

Glass Line

Depalletiser

Filler

Fill

Glass Line

Filler

Capper

Cap

Glass Line

Capper

Labeller

Label

Glass Line

Labeller

Carton Overpacker

Pack

Glass Line

Carton Overpacker

Palletiser

Pallet

Glass Line

Palletiser

QA

QA

Glass Line

QA

Bulk Line

Order Template
Operation
Asset

Bulk Line

Fill

Bulk Line

Portion Control Lines

Order Template
Operation
Asset

Portion Control Line 1

Fill

Portion Control Line 1

Portion Control Line 2

Fill

Portion Control Line 2

Key points

  • Kettle orders are created independently for each cook. Cooked product is transferred to a holding tank on order completion.

  • Glass Line orders are created against the Glass Line parent asset and automatically cascade to child equipment (Depalletiser, Filler, Capper, etc.).

  • Bulk Line and PCL orders are standalone fill operations.

  • QA is shared and configured as a child template under Glass Line.

Go to Settings -> Asset Hierarchy -> Order Templates -> Create

See Order Template for details.

13

Configure Edge Integration (Kepware OPC-UA)

TilliT Edge connects your factory equipment to TilliT Digital Operations in real time. This step walks through setting up a Kepware KEPServerEX demo environment with simulated tags, then connecting TilliT Edge to it via OPC-UA.

This guide uses Kepware's built-in Simulator driver to generate fake data without real PLC hardware. It is ideal for training, demos, and pre-go-live testing. Swap the simulated addresses for real PLC addresses when connecting live equipment.

1

Prerequisites

  • Kepware KEPServerEX installed (v6.x or later) with the Simulator driver licensed

  • Kepware's OPC-UA Server interface enabled (included by default)

  • TilliT Edge Core software installed on a Windows machine on the same network as Kepware

  • Firewall allows inbound TCP on port 49320 (Kepware OPC-UA default)

2

Create the Kepware Channel and Devices

Open KEPServerEX Configuration. In the left-hand project tree under Connectivity, create the following structure:

Add Channel

Field
Value

Channel Name

SauceFactory

Device Driver

Simulator

Communications

Leave defaults

Add Devices under SauceFactory:

Device Name
Description

Kettles

Cooking kettle signals

HoldingTanks

Holding tank temperatures and levels

GlassLine

Glass bottle line signals

BulkLine

Bulk filling line signals

PortionControl

Portion control line signals

For each device, accept the Simulator driver defaults (Device ID = 1, scan rate = 100 ms).

3

Create Simulated Tags

Add the following tags to each device. In Kepware's Simulator driver, R registers are read-only and auto-ramp continuously from 0 to 32,767 — ideal for simulating changing analog values without real hardware. K registers are read/write integers; individual bits (e.g. K0000.0) simulate boolean signals that can be toggled manually in the Quick Client.

Device: Kettles

Tag Name
Address
Data Type
Notes

Kettle1_Temperature

R0000

Word

Ramps 0–32767; apply scale ×0.003 in TilliT → 0–98 °C

Kettle1_Status

K0000.0

Boolean

True = running

Kettle2_Temperature

R0001

Word

Same scaling

Kettle2_Status

K0000.1

Boolean

True = running

Kettle3_Temperature

R0002

Word

Kettle3_Status

K0000.2

Boolean

Kettle4_Temperature

R0003

Word

Kettle4_Status

K0000.3

Boolean

Device: HoldingTanks

Tag Name
Address
Data Type
Notes

Tank1_Temperature

R0010

Word

Scale ×0.003 → 0–98 °C

Tank1_Level

R0011

Word

Scale ×0.003 → 0–98 %

Tank2_Temperature

R0012

Word

Tank2_Level

R0013

Word

Tank3_Temperature

R0014

Word

Tank3_Level

R0015

Word

Tank4_Temperature

R0016

Word

Tank4_Level

R0017

Word

Device: GlassLine

Tag Name
Address
Data Type
Notes

GlassLine_Status

K0001.0

Boolean

True = running

GlassLine_ProductionCount

R0020

Word

Auto-incrementing counter

Filler_FillWeight

R0021

Word

Scale ×0.01 → 0–327 g

Filler_FillTemperature

R0022

Word

Scale ×0.003 → 0–98 °C

Capper_CapPressure

R0023

Word

Scale ×0.00002 → 0–0.65 bar

Device: BulkLine

Tag Name
Address
Data Type
Notes

BulkLine_Status

K0002.0

Boolean

True = running

BulkLine_ProductionCount

R0030

Word

Auto-incrementing counter

Device: PortionControl

Tag Name
Address
Data Type
Notes

PCL1_Status

K0003.0

Boolean

True = running

PCL1_CupCount

R0040

Word

Auto-incrementing counter

PCL2_Status

K0003.1

Boolean

True = running

PCL2_CupCount

R0041

Word

Auto-incrementing counter

After adding all tags, click File → Save in KEPServerEX. The runtime hot-deploys tag changes immediately.

To verify tags are reading, open the Quick Client (Tools → Launch Quick Client) and browse to SauceFactory. R register values will be incrementing every scan cycle. Toggle K register bits to simulate equipment status changes.

4

Confirm Kepware OPC-UA Server Settings

Go to Tools → Options → Runtime Process in KEPServerEX, then select OPC-UA from the left panel.

Setting
Value

Enable OPC-UA Server Interface

✓ Checked

Endpoint Port

49320

Allow Anonymous Login

✓ Checked (demo purposes)

Click Apply, then reinitialise the runtime if prompted (Runtime → Reinitialize).

The OPC-UA endpoint will be: opc.tcp://<kepware-host-ip>:49320

All tags are addressable via OPC-UA node IDs using this format:

ns=2;s=SauceFactory.<DeviceName>.<TagName>

For example, Kettle1_Temperature is:

ns=2;s=SauceFactory.Kettles.Kettle1_Temperature
5

Create a TilliT Edge

Go to Settings -> Edge -> Edges -> Create

Field
Value

Name

Sauce Factory Edge

Type

Core

Description

Edge agent for Kepware OPC-UA simulation

Save, then install and start the TilliT Edge Core service on the Windows machine running Kepware. See Edge for installation instructions.

6

Create the OPC-UA Data Source

Go to Settings -> Edge -> Data Sources -> Create

Field
Value

Name

Kepware Simulator

Edge

Sauce Factory Edge

Datasource Type

OPC_UA

Endpoint

<kepware-host-ip>:49320

Option

{"securityMode":1,"securityPolicy":"http://opcfoundation.org/UA/SecurityPolicy#None"}

The securityMode: 1 option disables encryption — appropriate for a local demo network. For production, use securityMode: 3 with Basic256Sha256 and trust the TilliT Edge certificate in Kepware's OPC-UA Security settings.

Press Publish Configuration and wait for the connected status to show a green checkmark (updates every 60 seconds).

See Common Data Sources for details.

7

Create Data Tags

Go to Settings -> Edge -> Data Tags -> Create

Map each Kepware tag to a TilliT asset and, where applicable, a process variable. The scale option in the Options field adjusts the raw 0–32,767 Word value to a physically meaningful range.

Kettle temperatures

Name
Asset
Source Address
Data Type
Process Variable
Options

Kettle 1 Temperature

Kettle 1

ns=2;s=SauceFactory.Kettles.Kettle1_Temperature

Number

Cook Limit

{"scale":0.003}

Kettle 2 Temperature

Kettle 2

ns=2;s=SauceFactory.Kettles.Kettle2_Temperature

Number

Cook Limit

{"scale":0.003}

Kettle 3 Temperature

Kettle 3

ns=2;s=SauceFactory.Kettles.Kettle3_Temperature

Number

Cook Limit

{"scale":0.003}

Kettle 4 Temperature

Kettle 4

ns=2;s=SauceFactory.Kettles.Kettle4_Temperature

Number

Cook Limit

{"scale":0.003}

Kettle status

Name
Asset
Source Address
Data Type
Template

Kettle 1 Status

Kettle 1

ns=2;s=SauceFactory.Kettles.Kettle1_Status

Boolean

EQUIPMENT_STATUS_RUNNING

Kettle 2 Status

Kettle 2

ns=2;s=SauceFactory.Kettles.Kettle2_Status

Boolean

EQUIPMENT_STATUS_RUNNING

Kettle 3 Status

Kettle 3

ns=2;s=SauceFactory.Kettles.Kettle3_Status

Boolean

EQUIPMENT_STATUS_RUNNING

Kettle 4 Status

Kettle 4

ns=2;s=SauceFactory.Kettles.Kettle4_Status

Boolean

EQUIPMENT_STATUS_RUNNING

Holding tank monitoring

Name
Asset
Source Address
Data Type
Process Variable
Options

Holding Tank 1 Temperature

Holding Tank 1

ns=2;s=SauceFactory.HoldingTanks.Tank1_Temperature

Number

Holding Tank Temperature

{"scale":0.003}

Holding Tank 1 Level

Holding Tank 1

ns=2;s=SauceFactory.HoldingTanks.Tank1_Level

Number

--

{"scale":0.003}

Holding Tank 2 Temperature

Holding Tank 2

ns=2;s=SauceFactory.HoldingTanks.Tank2_Temperature

Number

Holding Tank Temperature

{"scale":0.003}

Holding Tank 2 Level

Holding Tank 2

ns=2;s=SauceFactory.HoldingTanks.Tank2_Level

Number

--

{"scale":0.003}

Holding Tank 3 Temperature

Holding Tank 3

ns=2;s=SauceFactory.HoldingTanks.Tank3_Temperature

Number

Holding Tank Temperature

{"scale":0.003}

Holding Tank 3 Level

Holding Tank 3

ns=2;s=SauceFactory.HoldingTanks.Tank3_Level

Number

--

{"scale":0.003}

Holding Tank 4 Temperature

Holding Tank 4

ns=2;s=SauceFactory.HoldingTanks.Tank4_Temperature

Number

Holding Tank Temperature

{"scale":0.003}

Holding Tank 4 Level

Holding Tank 4

ns=2;s=SauceFactory.HoldingTanks.Tank4_Level

Number

--

{"scale":0.003}

Glass Line

Name
Asset
Source Address
Data Type
Template / PV
Options

Glass Line Status

Filler

ns=2;s=SauceFactory.GlassLine.GlassLine_Status

Boolean

EQUIPMENT_STATUS_RUNNING

--

Glass Line Production Count

Filler

ns=2;s=SauceFactory.GlassLine.GlassLine_ProductionCount

Number

COUNT_TOTAL

--

Fill Weight

Filler

ns=2;s=SauceFactory.GlassLine.Filler_FillWeight

Number

Fill Weight

{"scale":0.01}

Fill Temperature

Filler

ns=2;s=SauceFactory.GlassLine.Filler_FillTemperature

Number

Fill Temperature

{"scale":0.003}

Cap Pressure

Capper

ns=2;s=SauceFactory.GlassLine.Capper_CapPressure

Number

Cap Pressure

{"scale":0.00002}

Bulk Line and Portion Control Lines

Name
Asset
Source Address
Data Type
Template / PV

Bulk Line Status

Bulk Line

ns=2;s=SauceFactory.BulkLine.BulkLine_Status

Boolean

EQUIPMENT_STATUS_RUNNING

Bulk Line Production Count

Bulk Line

ns=2;s=SauceFactory.BulkLine.BulkLine_ProductionCount

Number

COUNT_TOTAL

PCL 1 Status

Portion Control Line 1

ns=2;s=SauceFactory.PortionControl.PCL1_Status

Boolean

EQUIPMENT_STATUS_RUNNING

PCL 1 Cup Count

Portion Control Line 1

ns=2;s=SauceFactory.PortionControl.PCL1_CupCount

Number

COUNT_TOTAL

PCL 2 Status

Portion Control Line 2

ns=2;s=SauceFactory.PortionControl.PCL2_Status

Boolean

EQUIPMENT_STATUS_RUNNING

PCL 2 Cup Count

Portion Control Line 2

ns=2;s=SauceFactory.PortionControl.PCL2_CupCount

Number

COUNT_TOTAL

Press Publish Configuration after creating all tags. Tags with a green status indicator are reading successfully from Kepware.

See Data Tags for details.

8

Create Edge Triggers (Optional)

Edge triggers raise TilliT events automatically based on tag values. For a condiment factory, the most useful triggers are equipment stopped events and temperature alarms.

Go to Settings -> Edge -> Triggers -> Create

Trigger
Tag
Event Type
Evaluation Script
Self Close

Kettle 1 Stopped

Kettle 1 Status

Equipment Stopped

value == false

Yes

Kettle 2 Stopped

Kettle 2 Status

Equipment Stopped

value == false

Yes

Glass Line Stopped

Glass Line Status

Equipment Stopped

value == false

Yes

Kettle Overtemp

Kettle 1 Temperature

Custom Alert

value > 90

Yes

Set Minimum Duration to 1 minute on the equipment stopped triggers to avoid spurious events from brief signal interruptions.

See Edge Triggers for details.

14

Integrate Order Loading from ERP

In most condiment factories, work orders originate in an ERP system (SAP, MYOB, Microsoft BC, etc.) and need to flow into TilliT automatically. Use the POST:/core/order-instances/upsert endpoint to load orders with all their attributes, tolerances, and components.

Order Payload Structure

The upsert endpoint accepts an array of orders. Each order carries the core fields plus arrays for attributes, tolerances, and components. Below is an example glass line order for a retail dressing:

[
  {
    "orderNumber": "WO-20260101-001",
    "orderDate": "2026-01-01",
    "dueDate": "2026-01-02",
    "scheduledStart": "2026-01-02T06:00:00",
    "scheduledEnd": "2026-01-02T14:00:00",
    "quantityTarget": 3600,
    "defaultRunRate": 60,
    "status": "NEW",
    "name": "French Dressing 300mL",
    "asset": "Glass Line",
    "material": {
      "externalId": "FG-FRENCH-300",
      "name": "French Dressing 300mL"
    },
    "attributes": [
      { "attributeName": "Batch", "value": "BT-20260102-001" },
      { "attributeName": "Shelf Life", "value": "365" },
      { "attributeName": "Label Date Coding - Format", "value": "DDMMYYYY" },
      { "attributeName": "Label Date Coding - Location", "value": "Cap" },
      { "attributeName": "Print Message Primary Label", "value": "Best Before: " },
      { "attributeName": "Print Message Outer Carton", "value": "French Dressing 12x300mL" },
      { "attributeName": "Product EAN Barcode", "value": "9300001000001" },
      { "attributeName": "Carton TUN Barcode", "value": "09300001000001" },
      { "attributeName": "Carton Format", "value": "12pk" },
      { "attributeName": "Carton Dividers", "value": "No" },
      { "attributeName": "Holding Tank Temperature - Target", "value": "75" },
      { "attributeName": "Holding Tank Temperature - Min", "value": "70" },
      { "attributeName": "Holding Tank Temperature - Max", "value": "80" },
      { "attributeName": "Holding Tank Stirrer Function", "value": "Low" },
      { "attributeName": "Fill Weight (g)", "value": "310" },
      { "attributeName": "Fill Temperature Min", "value": "70" },
      { "attributeName": "Fill Temperature Max", "value": "80" },
      { "attributeName": "Filler Speed", "value": "60" },
      { "attributeName": "Filling Program", "value": "P12" },
      { "attributeName": "Sealing/Capping - Description", "value": "Twist Cap 63mm" },
      { "attributeName": "Sealing/Capping - Integrity Test", "value": "Pop Test" },
      { "attributeName": "Sealing/Capping - Limits (bar/kPa) Min", "value": "0.2" },
      { "attributeName": "Sealing/Capping - Limits (bar/kPa) Max", "value": "0.5" },
      { "attributeName": "Wash Tunnel Settings - Temperature", "value": "85" },
      { "attributeName": "Jar Prewarmer", "value": "On" },
      { "attributeName": "UV Steriliser", "value": "On" },
      { "attributeName": "Crack Detection Unit", "value": "Active" },
      { "attributeName": "Pallet Brand to Use", "value": "Standard CHEP" },
      { "attributeName": "Pallet Wrap", "value": "Yes" },
      { "attributeName": "Cleaning / Allergen Instructions", "value": "Allergen free - standard rinse" }
    ],
    "tolerances": [
      { "processVariableName": "Fill Weight", "target": 310, "lowerLimit": 305, "upperLimit": 315 },
      { "processVariableName": "Fill Temperature", "target": 75, "lowerLimit": 70, "upperLimit": 80 },
      { "processVariableName": "Brix", "target": 18.0, "lowerLimit": 17.0, "upperLimit": 19.0 },
      { "processVariableName": "pH", "target": 3.8, "lowerLimit": 3.5, "upperLimit": 4.1 }
    ],
    "orderComponents": [
      { "componentExternalId": "SFG-FRENCH-BASE", "componentGroup": "Semi-Finished Goods", "componentName": "French Dressing Base", "target": 1100 },
      { "componentExternalId": "PKG-GLS-300-FRENCH", "componentGroup": "Glass", "componentName": "300mL Jar", "target": 3700 },
      { "componentExternalId": "PKG-CAP-63-TWIST", "componentGroup": "Caps", "componentName": "63mm Twist Cap", "target": 3700 },
      { "componentExternalId": "PKG-LAB-FRENCH-300", "componentGroup": "Labels", "componentName": "French Dressing 300mL Label", "target": 3700 },
      { "componentExternalId": "PKG-CTN-12PK-300", "componentGroup": "Cartons", "componentName": "12pk Outer Carton", "target": 310 }
    ]
  }
]

Key points

  • asset - set to the parent line name (e.g. Glass Line). If order templates are configured (Step 12), the order will automatically cascade to child assets (Depalletiser, Filler, Capper, etc.).

  • attributes - all values are strings, even for NUMBER types. TilliT converts them based on the attribute definition.

  • tolerances - override default process variable limits for this specific product. Only include tolerances that differ from the defaults.

  • orderComponents - the bill of materials. Include the semi-finished base plus packaging components.

  • Upsert behaviour - if you send a work order that matches an existing combination of orderNumber, operation, and asset, TilliT will simply update the details instead of creating a duplicate. This allows you to safely re-send or refresh the full schedule whenever it changes.

  • Auto-creation - materials, attributes, UoMs, and tolerances that do not already exist will be created automatically.

Typical attribute categories in the payload

Category
Attributes
Purpose

Traceability

Batch, Run, Shelf Life

Batch control and date management

Label & coding

Label Date Coding, Print Messages, Barcodes, Carton Format

Correct labelling and coding per SKU

Holding tank

Temperature Target/Min/Max, Stirrer Function

Product held at correct temperature before filling

Filler settings

Fill Weight, Fill Temperature, Filler Speed, Filling Program

Machine configuration per product

Capper settings

Sealing Description, Integrity Test, Pressure limits

Cap application and seal verification

Wash & sterilise

Wash Tunnel Temperature, Jar Prewarmer, UV Steriliser

Hygiene and glass preparation

Detection

Crack Detection, Cap Detection, Break Detection

Online quality inspection

Pallet

Pallet Brand, Pallet Wrap, Dividers

Palletising configuration

Cleaning

Allergen Instructions

Changeover cleaning requirements

For the full API reference, see Upload Production Schedule.

15

Create Your First Work Order

With all master data in place, you can test by creating a work order manually:

  1. Navigate to the line where you want to run the order (e.g. Glass Line)

  2. Click Create Order

  3. Select the material (finished good) to produce (e.g. French Dressing 300 mL)

  4. Enter the quantity

  5. Fill in the order number attributes (holding tank settings, filler program, label coding)

  6. Start the order

When the order starts, TilliT will automatically trigger the configured activities (glass line startup check, label verification, filler settings check) and the order will flow through each machine according to the order template.

See Create adhoc Order and Start an Order for details.

16

Verify Live Edge Data

With an order running and the Kepware simulator active, confirm that edge data is flowing correctly end-to-end.

  1. Open the Glass Line asset in TilliT

  2. Confirm the Equipment Status indicator shows running (driven by GlassLine_Status)

  3. Navigate to Process Variables and verify Fill Weight and Fill Temperature are updating every minute from the simulated Kepware tags

  4. In Kepware's Quick Client, toggle GlassLine_Status (K0001.0) to false - TilliT should raise a Glass Line Stopped event within the trigger's minimum duration

  5. Toggle the status back to true - the event should self-close

  6. Check the Production Count on the Filler asset is incrementing as the R0020 register ramps

If any tags show a red status in Settings -> Edge -> Data Tags, press Publish Configuration on the data source and verify the Kepware OPC-UA server is reachable from the TilliT Edge host.

See Data Tags for troubleshooting guidance.

Summary Checklist

Use this checklist to track your progress:

Last updated