---
title: Adding measurements to a Modbus collector
slug: how-tos/zNn8-adding
docTags: 11HRbizM9olUCcNKOmSMd,XvgE82X7SfoIRBJdtS4Hy
createdAt: 2025-10-06T13:26:18.015Z
---

Measurements can be added to a Modbus TCP collector by:

- Manually adding individual measurements
- Bulk importing measurements
- [Adding measurements using the API](docId\:oCUYPOPzCoUIhWWzC_VJ7)

## Manually add a measurement

:::hint{type="info"}
Follow the guide on [creating a measurement](docId\:u5-07YlMs2jiX9Kz-m-lB) for general instructions on how to create a measurement.
:::

Open the **Measurements** page in the Factry Historian web interface and click **+ Create Measurement**.

Fill in a clear **Name** and an optional short **Description** so the measurement is easy to find and recognize later.

Choose the Modbus **Collector** you configured previously and select the time-series **Database** where this measurement should be stored.

Select the correct **Datatype** for the measurement (Boolean, Number, String) based on how you plan to decode the raw Modbus registers.

![](https://api.archbee.com/api/optimize/SMPo4IS9FkillUAMsur2c/b8LGJjhlwFynnhul60LKo_image.png)

### Basic settings

In the settings panel below, provide the **Address** of the Modbus register to start reading from.
This tells the collector where in the Modbus address space to read data.

:::hint{type="info"}
For an initial test, you can leave **CollectionType**, **CollectionInterval**, **CollectionOffset** and **ByteOrder** at their default values.
If you need more control, see the reference documentation for the [Modbus TCP](docId:-40jggXcnAK-wAnTsu_Bq) .
:::

**SlaveID**
Enter the two-character hexadecimal ID of the Modbus slave to query (for example, `01` or `0A`). Use `FF` when the device is addressed directly rather than through a gateway.

**RegisterType**
Select the Modbus register type that contains the value. This determines the function code used for communication:

- **Coil**: single-bit read/write
- **Discrete Input**: single-bit read-only
- **Input Register**: 16-bit read-only
- **Holding Register**: 16-bit read/write

:::hint{type="info"}
Use **Input Register** or **Holding Register** for numeric values.
Only **Coil** and **Holding Register** support writing.
:::

**ModbusDataType**
Choose how the raw register data should be decoded:

- **boolean** (only valid for Coil and Discrete Input)
- **uint16**, **int16**, **uint32**, **int32**, **float32**, **uint64**, **int64**, **float64**

### Practical examples

Single boolean input on unit 01 at discrete input address 12 polled every 1000 ms with no offset:

:::BlockQuote
Address: 12
RegisterType: Discrete Input
ModbusDataType: boolean
SlaveID: 01
CollectionType: polled
CollectionInterval: 1000
CollectionOffset: 0
:::

32-bit IEEE 754 float located in two holding registers starting at address 100 on unit 0A, polled every 2000 ms with a 250 ms offset, little-endian byte and register order override:

:::BlockQuote
Address: 100
RegisterType: Holding Register
ModbusDataType: float32
SlaveID: 0A
CollectionType: polled
CollectionInterval: 2000
CollectionOffset: 250
ByteOrder: BA-(DC)-(FE-HG)
:::

### Expected outcome

Once you have submitted your measurement, and all settings are correct, you should see the following:

- The measurement status changes to **Good** within about 10 seconds.
- The measurement appears in the list of configured measurements.
- The **data preview panel** begins to display live values coming in. Click the refresh icon if it does not refresh automatically.

If you need to configure a large number of adresses, you can also bulk import
the measurements to speed up the process.

## Bulk import measurements

:::hint{type="info"}
Follow the guide on [Importing measurements in bulk](docId\:G5wek8Z-fIPXAU2YmzIRZ) for file format and examples.
:::
