Part 1 - Production line modeling
In this section we identify the equipment models and instances we need to describe and handle the production line data
Introduction
The first thing in our application development is to identify the things that needs to be presented with equipment models. Typically equipment model is describing some physical asset or device such as oven. Whole production line can also be a separate model if needed, but it can be also just equipment instances that are connected to each other in equipment hierarchy. One model can also contain reference links to other equipment such as mixer contains raw materials dosing equipment.
The product itself, i.e. cookie or cookie package, is not an equipment. Product is more like an event or as in this case a batch of cookies is the event. The event has typically some id (batch id) and start and end timestamps, and further many measured or calculated properties such as amount of cookies, production price, used raw materials, and quality. The calculated values and key performance indicators can be stored to the event itself or to numerical history. Many times the numerical history is more handy, because it supports better e.g. recalculations. The batch related values can be found in history with the start time stamp of the batch.
One another thing that is an equipment is the recipe. Recipe contains multiple properties and production instructions. Recipe can also evolve over the time when something is changed in it e.g. to improve quality. This is why most of its properties are time series so that we can trace back to see how we produced this type of cookie 3 years ago.
The goal is to build a small scale MES (Manufacturing Execution System) application for the cookie production line. The application includes recipe management, production planning, monitoring, reporting, and traceability from end products back to production details.

Example of our cookie productionline process
Cookie Line
In our example one cookie production batch takes depending on recipe in average 36 minutes to finish and one batch produces typically 72 bags of cookies, each bag containing 36 cookies. The dispensers measure and dose the raw materials to mixer where our cookie dough is mixed. After this, the ready-made dough will be dosed to cooking trays and moved to the oven to bake. From there the baked cookies are transferred to the packaging machine and packed into sales batches. Each produced batch has a unique batch Id and pallet Id.
Batch Identification
Each production batch is identified with unique id that is stored in CookieBatchId property. Whenever the value of CookieBatchId changes, it tells that a batch starts or ends or actually the change typically describes that the previous batch is completed and a new started. The batch calculations are triggered by the changes of CookieBatchId application calculation.
Equipment
First, we create one Equipment class called ProductionLine that defines the production line and production line wide properties such as CookieBatchId and which recipe is currently in production. For this we create one instance called ProductionLine 1 (We use numbering here for multiple production line instance purposes). Then we create four other equipment: Mixer, Oven, Packager and Dispenser. Mixer and Dispenser are instances below ProductionLine 1, but Oven and Packager are defined as reference properties, because they can be shared with other production lines. For Reference Target we will mark the class name (this will be shown in the tables below). By doing this, we are able to access the instances and properties of each model through our base model instance ProductionLine1.
Mixer is not shared with other possible cookie lines, so this will only be an instance under our ProductionLine 1 and in our calculation we will map this separately.
Dispenser is responsible for measuring raw material amounts to Mixer. Our Dispenser has six instances matching our raw material and dough dispensers and these will be accessed through Mixer equipment. To enable this, we create reference properties of each raw material instance to our Mixer class. This is to tie together our Mixer and Dispensers within.
Recipe Library
Recipe tells the amounts of raw materials used for each type of cookie and instructions for the production. Recipe instances form a library of recipes that can be used for our production line. Recipe that is currently in production controls the production process. Production plan contains information which recipe shall be used in production starting from some particular time.
We add an equipment named Recipe and for this we create three recipe instances: ChocolateCookieRecipe , PeanutbutterCookieRecipe and OatmealCookieRecipe.
Then to tie this to our ProductionLine class we create two reference properties to our ProductionLine class: RecipeInProduction and RecipePlan. These will be historized GUID properties that are references to our Recipe class. We create our recipe production plan with the RecipePlan property by entering the values to future to define which recipe shall be applied in production. The planned recipe is then applied to production at the start of the production batch and it is controlling the production and recorded in RecipeInProduction property.
All Equipment model definitions and properties are shown in the tables below.
Model definitions
| Name | Abstract | Class name |
|---|---|---|
| ProductionLine | No | Path_ProductionLine |
| Mixer | No | Path_Mixer |
| Oven | No | Path_Oven |
| Packager | No | Path_Packager |
| Dispenser | No | Path_Dispenser |
| Recipe | No | Path_Recipe |
Model properties
After defining the model hierarchy, we will create properties and define their attributes.
ProductionLine
| Property | Data type | Unit | Historized | Description | Reference Target |
|---|---|---|---|---|---|
| CookieBatchId | string | Yes | Unique identifier for each batch | ||
| Oven | GUID | No | Baking oven | Class:Path_Oven | |
| Packager | GUID | No | Cookie sales batch packager | Class:Path_Packager | |
| ProductionState | boolean | Yes | 0 = off, 1 = on | ||
| ProductionTime | integer (32bit) | MIN | Yes | Time per one batch production in minutes | |
| RecipeInProduction | GUID | Yes | Reference to recipe instance | Class:Path_Recipe | |
| RecipePlan | GUID | Yes | Reference to recipe instance | Class:Path_Recipe |
Mixer
| Property | Data type | Unit | Historized | Description | Reference Target |
|---|---|---|---|---|---|
| AverageTemperature | Floating point value (64bit) | celsius | Yes | Calculated average temperature | |
| Butter | GUID for butter instance in Dispenser class | No | Cookie raw material | Class:Path_Dispenser | |
| Chocolate | GUID for chocolate instance in Dispenser class | No | Cookie raw material | Class:Path_Dispenser | |
| Dough | GUID for dough instance in Dispenser class | No | Ready-made cookie dough | Class:Path_Dispenser | |
| Egg | GUID for dough instance in Dispenser class | No | Cookie raw material | Class:Path_Dispenser | |
| Flour | GUID for dough instance in Dispenser class | No | Cookie raw material | Class:Path_Dispenser | |
| MixingState | Floating point value (64bit) | Yes | Enum, 1 = on, 2 = off | ||
| Sugar | GUID for sugar instance in Dispenser class | No | Cookie raw material | Class:Path_Dispenser | |
| Temperature | Floating point value (64bit) | celsius | Yes | Recorded temperature |
Dispenser
| Property | Data type | Unit | Historized | Description |
|---|---|---|---|---|
| Amount | Floating point value (64bit) | kg | Yes | Amount of material used |
| AmountTotal | Floating point value (64bit) | total kg/batch | Yes | Total amount of material used in one batch |
| Material | Integer (32bit) | Yes | 1=butter/2=sugar/3=egg/4=flour/5=chocolate/6=dough | |
| MaterialId | String | Yes | Unique per batch identifier for each material | |
| Price | Floating point value (64bit) | EUR/batch | Yes | Price per material amount used |
| PriceTotal | Floating point value (64bit) | EUR/batch | Yes | Total price per material used in one batch |
Oven
| Property | Data type | Unit | Historized | Description |
|---|---|---|---|---|
| CookingTime | Floating point value (64bit) | sec | Yes | Cooking time in the oven |
| Temperature | Floating point value (64bit) | celsius | Yes | Recorded temperature |
Packager
| Property | Data type | Unit | Historized | Description |
|---|---|---|---|---|
| AveragePackagerTemperature | Floating point value (64bit) | celsius | Yes | Calculated average temperature |
| Bag number | Integer(32bit) | Yes | Bag number counter for packing bags in pallet | |
| CookiesInBag | Integer(32bit) | Yes | Counter for packing cookies in bags | |
| PackagerTemperature | Floating point value (64bit) | celsius | Yes | Recorded temperature |
| PalletId | Integer(32bit) | Yes | Unique per batch identifier for each pallet |
Recipe
| Property | Data type | Unit | Historized | Description |
|---|---|---|---|---|
| Butter | Floating point value (64bit) | kg | Yes | Recipe ingredient amount |
| Sugar | Floating point value (64bit) | kg | Yes | Recipe ingredient amount |
| Flour | Floating point value (64bit) | kg | Yes | Recipe ingredient amount |
| Egg | Floating point value (64bit) | kg | Yes | Recipe ingredient amount |
| Chocolate | Floating point value (64bit) | kg | Yes | Recipe ingredient amount |
| Oatmeal | Floating point value (64bit) | kg | Yes | Recipe ingredient amount |
| Peanutbutter | Floating point value (64bit) | kg | Yes | Recipe ingredient amount |
| Dough | Floating point value (64bit) | kg | Yes | Recipe dough amount |
Instance hierarchy
ProductionLine1
├── RecipeLibrary
│ ├── ChocolateCookieRecipe
│ ├── PeanutbutterCookieRecipe
│ ├── OatmealCookieRecipe
│
├── Mixer
│ ├── Butter
│ ├── Sugar
│ ├── Egg
│ ├── Flour
│ ├── Chocolate
│ └── Dough
│
├── Oven
└── Packager
As the instance hierarchy shows, raw materials are Dispenser instances that are being derived to Mixer. The properties of these instances may be accessed through Mixer path. See table below.
Instance paths
| Name | Full path |
|---|---|
| ProductionLine1 | ProductionLine1 |
| Mixer | ProductionLine1.DoughMixer |
| Butter | ProductionLine1.DoughMixer.Butter |
| Sugar | ProductionLine1.DoughMixer.Sugar |
| Egg | ProductionLine1.DoughMixer.Egg |
| Flour | ProductionLine1.DoughMixer.Flour |
| Chocolate | ProductionLine1.DoughMixer.Chocolate |
| Dough | ProductionLine1.DoughMixer.Dough |
| Oven | ProductionLine1.CookieOven |
| Packager | ProductionLine1.CookiePackager |
| ChocolateCookieRecipe | ProductionLine1.ChocolateCookieRecipe |
| PeanutbutterCookieRecipe | ProductionLine1.PeanutbutterCookieRecipe |
| OatmealCookieRecipe | ProductionLine1.OatmealCookieRecipe |
Updated 6 days ago
Creating an Equipment model with Engineering UI
