Carlo Gavazzi VMU-MC pulse concentrator Modbus register map
Also covers VMUMCAS1I2EM
Pulse concentrator (2 S0 inputs, up to 3 VMU-OC input modules) with RS-485 Modbus RTU
- Official
- 146 registers
- Modbus RTU
- Revision 1 · 2026-10-14
- Identity: firmware
Official: Written from the manufacturer's documentation, but not tested on a device yet. Check the map against the manufacturer's documentation before you write to a live device. Tested it? Report a test.
Communication
- Protocol
- Modbus RTU
- Unit ID
- 1
- Serial
- 9600 8N1 · 9600 baud, 8 data bits, none parity, 1 stop bit
- Byte / word order
- CDAB · bytes big-endian, words low first (word swap)
- Addresses
- 0-based
Connection values are defaults: the device may be configured differently.
Map
- Registers
- 146 holding registers
- Groups
- 6
- Revision
- 1 · 2026-10-14
- Added
- ()
- File
- maps/carlo-gavazzi/vmu-mc.mbmap.json · 33 KB · history
- SHA-256
- d0b084da8333a0d2dd183de6356fa9e7e61f65a1eb905aad4d26dba2cccbcd44
- Manufacturer
- gavazziautomation.com
Device identity
What a tool can read to check that this map fits the connected device (SPEC.md section 4.7). Registers with a role are read like any other register.
| Role | Register | Address | Type | Values |
|---|---|---|---|---|
| Firmware | Version code VMU-MC | holding 768 | uint16 | |
| Firmware | Revision code VMU-MC | holding 769 | uint16 |
Sources and notes
- VMU-MC communication protocol · version 1 rev 2, 2018-02-15 tables 2.2-2.10
Source: Carlo Gavazzi, VMU-MC communication protocol, version 1 revision 2 (2018-02-15)
- FC03 and FC04 return the same values; settings are written with FC06 or FC16.
- 32-bit values are sent low word first.
- Totalizers are raw counts: the decimal point and base unit registers say how to read them (they are only for interpretation; the device does not apply them).
- VMU-OC totalizers only have values when the corresponding input module is connected and configured.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| HR | 0 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 2 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 4 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 6 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 8 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 10 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 11 | uint16 | R | Must be read on its own (one register) | |||
| HR | 12 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 14 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 16 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 18 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 20 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 22 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 24 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 26 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 28 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 30 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 32 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 34 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 36 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 38 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 40 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 42 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 44 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 46 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 48 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 50 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 52 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 54 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 56 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 58 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 60 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 62 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 64 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 66 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 68 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 70 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 72 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 74 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 76 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 78 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 80 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 82 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 84 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 86 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 88 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 90 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 92 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 94 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 96 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 98 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 100 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 102 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 104 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 106 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 108 | uint32 CDAB | R | Raw count; divide by 10^(decimal point setting of this input); unit from the base unit setting | |||
| HR | 256 | bool bit 0 | R | ||||
| HR | 256 | bool bit 1 | R | ||||
| HR | 256 | bool bit 2 | R | ||||
| HR | 256 | bool bit 3 | R | ||||
| HR | 256 | bool bit 4 | R | ||||
| HR | 256 | bool bit 5 | R | ||||
| HR | 256 | bool bit 6 | R | ||||
| HR | 256 | bool bit 7 | R | ||||
| HR | 256 | bool bit 8 | R | ||||
| HR | 256 | bool bit 9 | R | ||||
| HR | 256 | bool bit 10 | R | ||||
| HR | 257 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 258 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 259 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 260 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 261 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 262 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 263 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 264 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 265 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 266 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 267 | uint16 | R | Bit n = 1: the n-th last input change was missed by the polling (bit 15 oldest) | |||
| HR | 268 | uint16 | R | ||||
| HR | 269 | bool bit 1 | R | Configured but not detected, or detected but not configured | |||
| HR | 269 | bool bit 2 | R | Configured but not detected, or detected but not configured | |||
| HR | 269 | bool bit 3 | R | Configured but not detected, or detected but not configured | |||
| HR | 768 | uint16 | R | ASCII letter: 65 = A | |||
| HR | 769 | uint16 | R | ||||
| HR | 770 | uint16 | R | ASCII letter: 65 = A | |||
| HR | 771 | uint16 | R | ||||
| HR | 772 | uint16 | R | ASCII letter: 65 = A | |||
| HR | 773 | uint16 | R | ||||
| HR | 774 | uint16 | R | ASCII letter: 65 = A | |||
| HR | 775 | uint16 | R | ||||
| HR | 4096 | uint16 | RW | ||||
| HR | 8192 | uint16 | RW | ||||
| HR | 8193 | uint16 | RW | ||||
| HR | 8194 | uint16 | RW | ||||
| HR | 8195 | uint16 | RW | Serial settings apply after a power cycle | |||
| HR | 8448 | uint16 bits 0–1 | RW | ||||
| HR | 8448 | uint16 bits 2–3 | RW | ||||
| HR | 8704 | uint16 | RW | Only when the input configuration is 3; kept in RAM | |||
| HR | 12288 | uint16 | RW | Each pulse adds this value to the totalizers | |||
| HR | 12289 | uint16 | RW | Each pulse adds this value to the totalizers |
No registers match
Try part of the name, an address (decimal or 0x hex) or clear the filters.
Help improve this map
- I tested it on a deviceReport whether it worked, even if you did not write the map.
- Suggest a correctionEdit the file on GitHub; it opens a pull request.
- Report a problemA wrong address, type, scale or byte order.
- Read the formatWhat each key of the file means (SPEC.md).