Phoenix Contact EEM-EM3xx / EEM-DM3xx (MID energy meter)
Status: Vendor Confirmed · Register points: 569 · Transports: Modbus RTU, Modbus TCP
A curated ModDef profile for the Phoenix Contact EEM-EM3xx / EEM-DM3xx (MID energy meter). Import it as
phoenixcontact.eem-em3xx or load the .moddef.yaml directly.
Connect to one over Web Serial and watch its values live in the device dashboard.
Usage
Load the profile, bind a transport, and read a point by name. The runtime applies the offset, scaling, byte order, and sentinels from the definition.
- Go
- TypeScript
- Rust
- Python
- C
- C++
doc, _ := moddef.Load("phoenix-contact-eem-em3xx.moddef.yaml")
dev, _ := client.New(doc, "phoenix-contact-eem-em3xx", transport) // your modbus.Transport
v, _ := dev.ReadPoint(ctx, "voltage_l1_n")
fmt.Println(v)
import {Device} from '@moddef/core';
import {loadDocument} from '@moddef/core/node';
const doc = await loadDocument('phoenix-contact-eem-em3xx.moddef.yaml');
const dev = Device.create(doc, 'phoenix-contact-eem-em3xx', transport);
console.log(await dev.readPoint('voltage_l1_n'));
let doc = moddef_core::load("phoenix-contact-eem-em3xx.moddef.yaml")?;
let mut dev = Device::new(&doc, Some("phoenix-contact-eem-em3xx"), transport)?;
let v = dev.read_point("voltage_l1_n").await?;
from moddef import Device, load
from moddef.pymodbus import Options, PymodbusTransport
doc = load("phoenix-contact-eem-em3xx.moddef.yaml")
transport = await PymodbusTransport.tcp("192.168.1.50", options=Options())
dev = Device.create(doc, "phoenix-contact-eem-em3xx", transport)
print(await dev.read_point("voltage_l1_n"))
md_doc_t doc;
md_doc_init(&doc, flash_ptr, flash_len); /* zero-copy view */
md_dev_t dev;
md_dev_init(&dev, &doc, MD_STR("phoenix-contact-eem-em3xx"), &transport);
md_value_t v;
md_dev_read(&dev, MD_STR("voltage_l1_n"), &v);
auto doc = moddef::Document::view(flash_bytes).value(); // zero-copy over flash
auto dev = moddef::Device::open(doc, "phoenix-contact-eem-em3xx", transport).value();
if (auto v = dev->read("voltage_l1_n"); v)
std::cout << v->to_string() << '\n';
Commands
Multi-step register procedures (spec §11.7)
this profile defines — write params, arm a trigger, poll for completion, then
read the result. Run one with your language's command executor (RunCommand,
runCommand, run_command, or md_cmd_begin/md_cmd_tick in C/C++).
start_all_partial_meters — Start All Partial Energy Meters
Write 0x0D01 to register 0x0526 to start every partial energy meter, then read back the status bitmap (manual table A-22)
Results
| Field | Type |
|---|---|
status | UINT32 |
stop_all_partial_meters — Stop All Partial Energy Meters
Write 0x0D02 to register 0x0526 to stop every partial energy meter, then read back the status bitmap (manual table A-22)
Results
| Field | Type |
|---|---|
status | UINT32 |
reset_all_partial_meters — Reset All Partial Energy Meters
Write 0x0D03 to register 0x0526 to reset every partial energy meter to zero, then read back the status bitmap. The MID-sealed total energy meters are not affected (manual table 6-1)
Results
| Field | Type |
|---|---|
status | UINT32 |
sync_demand_interval — Synchronize Demand Interval
Close the running mean-value interval and start a new one by writing 0x0001 to register 0x053D; only effective when 0x053C selects broadcast synchronization (manual table A-18)
Results
| Field | Type |
|---|---|
interval_config | UINT32 |
save_configuration — Save Configuration And Restart
Buffer the pending configuration in EEPROM and restart the device by writing 0xA1 to register 0xE200 (manual table A-21). Communication drops for the duration of the restart
Results
| Field | Type |
|---|---|
serial_number | STRING |
load_configuration — Load Configuration From EEPROM
Discard the pending configuration and reload the stored one by writing 0xB2 to register 0xE200 (manual table A-21)
Results
| Field | Type |
|---|---|
modbus_address | UINT32 |
Measurands
The 13 semantic quantities this device reports, each linked to the measurand catalog. Query a device by measurand instead of a raw point when you want portable code.
| Base quantity | Name | Unit | Description |
|---|---|---|---|
voltage | Voltage | V | RMS voltage; qualify with phase_ref (L1_N, L1_L2, ...) |
current | Current | A | RMS current; qualify with phase_ref / direction |
active_power | Active Power | W | Instantaneous real power |
reactive_power | Reactive Power | var | Instantaneous reactive power |
apparent_power | Apparent Power | VA | Instantaneous apparent power |
power_factor | Power Factor | 1 (ratio) | Ratio of real to apparent power (dimensionless) |
frequency | Frequency | Hz | Grid frequency |
energy_active | Active Energy | Wh | Cumulative active energy register |
energy_reactive | Reactive Energy | varh | Cumulative reactive energy register |
energy_apparent | Apparent Energy | VAh | Cumulative apparent energy register |
device_status | Device Status | undefined | Overall device operating status (enum) |
fault_code | Fault Code | undefined | Vendor fault code (enum or integer) |
alarm_status | Alarm Status | undefined | Alarm state (enum or flag set) |
Source
- Profile:
energy-meter/phoenix-contact-eem-em3xx/phoenix-contact-eem-em3xx.moddef.yaml - Register map: vendor documentation