# aklira/igs-iec61850-mms architecture

> Architecture diagram of the GitHub repository aklira/igs-iec61850-mms, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/aklira/igs-iec61850-mms
- Repository: https://github.com/aklira/igs-iec61850-mms

## Overview

This is an IEC 61850 MMS protocol stack for SCADA and telecontrol. Its user-facing workflow is a typed client accessing a server’s model, data, controls, and reports over MMS; a separate configuration path parses and validates SCL before building a server model. Core modules provide the standard catalogue, naming/layout, ACSI types, control state machines, and report engines. The graph reflects indexed references and excerpts; where runtime wiring was not shown, links are omitted rather than inferred.

Main entry points: [`crates/igs-iec61850-mms/src/model.rs`](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/model.rs) (Served model), [`crates/igs-iec61850-mms-core/src/scl/build.rs`](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/scl/build.rs) (Model builder), [`crates/igs-iec61850-mms-core/src/model/mod.rs`](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/model/mod.rs) (Server model), [`crates/igs-iec61850-mms/src/reports.rs`](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/reports.rs) (Report service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client access"]
  node_client_api["Typed client<br/>[client.rs]"]
  node_client_data["Dataset access<br/>[client_dataset.rs]"]
  node_client_control["Control API<br/>[client_control.rs]"]
  node_client_report["Report API<br/>[client_report.rs]"]
  node_client_buffered["Buffered client<br/>[client_buffered.rs]"]
end

subgraph group_server["MMS server"]
  node_server_app["Server process<br/>[igs61850-server.rs]"]
  node_served_model["Served model<br/>[model.rs]"]
  node_datasets["Dataset service<br/>[datasets.rs]"]
  node_updates["Value updates<br/>[updates.rs]"]
end

subgraph group_standard["IEC data model"]
  node_server_model["Server model<br/>[mod.rs]"]
  node_layout["Model layout<br/>[layout.rs]"]
  node_catalogue[("Standard catalogue<br/>[mod.rs]")]
  node_acsi["ACSI types<br/>[acsi.rs]"]
  node_discovery["Discovery<br/>[discovery.rs]"]
  node_names["Object names<br/>[names.rs]"]
end

subgraph group_config["SCL configuration"]
  node_scl_parser["SCL parser<br/>[mod.rs]"]
  node_scl_validate["SCL validation<br/>[validate.rs]"]
  node_scl_build["Model builder<br/>[build.rs]"]
end

subgraph group_services["Control and reports"]
  node_control_api["Server controls<br/>[control.rs]"]
  node_control_machine["Control machine<br/>[machine.rs]"]
  node_urcb["Unbuffered reports<br/>[urcb.rs]"]
  node_brcb["Buffered reports<br/>[brcb.rs]"]
  node_report_codec["Report encoding<br/>[encode.rs]"]
  node_server_reports["Report service<br/>[reports.rs]"]
  node_buffered_reports["Buffered service<br/>[buffered.rs]"]
end

node_operator(("SCADA client"))
node_mms_peer(("MMS peer"))

node_operator -.->|"uses"| node_client_api
node_client_buffered -->|"uses"| node_client_api
node_client_buffered -->|"uses"| node_client_control
node_client_buffered -->|"uses"| node_client_report
node_server_app -.->|"serves"| node_served_model
node_served_model -->|"dispatches"| node_datasets
node_served_model -->|"dispatches"| node_control_api
node_served_model -->|"dispatches"| node_server_reports
node_served_model -->|"dispatches"| node_buffered_reports
node_served_model -->|"uses"| node_updates
node_served_model -.->|"serves"| node_server_model
node_served_model -.->|"exchanges MMS"| node_mms_peer
node_server_model -->|"builds layout"| node_layout
node_server_model -->|"checks against"| node_catalogue
node_server_model -->|"uses names"| node_names
node_discovery -->|"reads model"| node_server_model
node_scl_parser -.->|"validates"| node_scl_validate
node_scl_build -->|"checks"| node_scl_validate
node_scl_build -->|"builds"| node_server_model
node_scl_build -->|"uses"| node_layout
node_scl_build -->|"uses"| node_catalogue
node_scl_build -->|"configures"| node_urcb
node_scl_build -->|"configures"| node_brcb
node_control_api -.->|"uses"| node_control_machine
node_server_reports -.->|"uses"| node_urcb
node_server_reports -.->|"encodes reports"| node_report_codec
node_buffered_reports -.->|"uses"| node_brcb
node_buffered_reports -->|"uses"| node_server_reports
node_report_codec -->|"encodes"| node_brcb
node_report_codec -->|"encodes"| node_urcb
node_acsi -->|"maps types"| node_catalogue

click node_client_api "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client.rs"
click node_client_data "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_dataset.rs"
click node_client_control "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_control.rs"
click node_client_report "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_report.rs"
click node_client_buffered "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_buffered.rs"
click node_server_app "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/bin/igs61850-server.rs"
click node_served_model "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/model.rs"
click node_datasets "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/datasets.rs"
click node_updates "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/updates.rs"
click node_server_model "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/model/mod.rs"
click node_layout "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/model/layout.rs"
click node_catalogue "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/catalogue/mod.rs"
click node_acsi "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/acsi.rs"
click node_discovery "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/discovery.rs"
click node_names "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/names.rs"
click node_scl_parser "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/scl/mod.rs"
click node_scl_validate "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/scl/validate.rs"
click node_scl_build "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/scl/build.rs"
click node_control_api "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/control.rs"
click node_control_machine "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/control/machine.rs"
click node_urcb "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/report/urcb.rs"
click node_brcb "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/report/brcb.rs"
click node_report_codec "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/report/encode.rs"
click node_server_reports "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/reports.rs"
click node_buffered_reports "https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/buffered.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_client_api,node_client_data,node_client_control,node_client_report,node_client_buffered,node_operator toneBlue
class node_server_app,node_served_model,node_datasets,node_updates toneAmber
class node_server_model,node_layout,node_catalogue,node_acsi,node_discovery,node_names toneMint
class node_scl_parser,node_scl_validate,node_scl_build toneRose
class node_control_api,node_control_machine,node_urcb,node_brcb,node_report_codec,node_server_reports,node_buffered_reports,node_mms_peer toneIndigo
```

## Components

### Client access

- [Typed client](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client.rs): `crates/igs-iec61850-mms/src/client.rs`
- [Dataset access](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_dataset.rs): `crates/igs-iec61850-mms/src/client_dataset.rs`
- [Control API](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_control.rs): `crates/igs-iec61850-mms/src/client_control.rs`
- [Report API](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_report.rs): `crates/igs-iec61850-mms/src/client_report.rs`
- [Buffered client](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/client_buffered.rs): `crates/igs-iec61850-mms/src/client_buffered.rs`

### MMS server

- [Server process](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/bin/igs61850-server.rs): `crates/igs-iec61850-mms/src/bin/igs61850-server.rs`
- [Served model](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/model.rs): `crates/igs-iec61850-mms/src/model.rs`
- [Dataset service](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/datasets.rs): `crates/igs-iec61850-mms/src/datasets.rs`
- [Value updates](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/updates.rs): `crates/igs-iec61850-mms/src/updates.rs`

### IEC data model

- [Server model](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/model/mod.rs): `crates/igs-iec61850-mms-core/src/model/mod.rs`
- [Model layout](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/model/layout.rs): `crates/igs-iec61850-mms-core/src/model/layout.rs`
- [Standard catalogue](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/catalogue/mod.rs): `crates/igs-iec61850-mms-core/src/catalogue/mod.rs`
- [ACSI types](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/acsi.rs): `crates/igs-iec61850-mms-core/src/acsi.rs`
- [Discovery](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/discovery.rs): `crates/igs-iec61850-mms-core/src/discovery.rs`
- [Object names](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/names.rs): `crates/igs-iec61850-mms-core/src/names.rs`

### SCL configuration

- [SCL parser](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/scl/mod.rs): `crates/igs-iec61850-mms-core/src/scl/mod.rs`
- [SCL validation](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/scl/validate.rs): `crates/igs-iec61850-mms-core/src/scl/validate.rs`
- [Model builder](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/scl/build.rs): `crates/igs-iec61850-mms-core/src/scl/build.rs`

### Control and reports

- [Server controls](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/control.rs): `crates/igs-iec61850-mms/src/control.rs`
- [Control machine](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/control/machine.rs): `crates/igs-iec61850-mms-core/src/control/machine.rs`
- [Unbuffered reports](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/report/urcb.rs): `crates/igs-iec61850-mms-core/src/report/urcb.rs`
- [Buffered reports](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/report/brcb.rs): `crates/igs-iec61850-mms-core/src/report/brcb.rs`
- [Report encoding](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms-core/src/report/encode.rs): `crates/igs-iec61850-mms-core/src/report/encode.rs`
- [Report service](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/reports.rs): `crates/igs-iec61850-mms/src/reports.rs`
- [Buffered service](https://github.com/aklira/igs-iec61850-mms/blob/main/crates/igs-iec61850-mms/src/buffered.rs): `crates/igs-iec61850-mms/src/buffered.rs`

### Other components

- **SCADA client**
- **MMS peer**

## Connections

- SCADA client → Typed client: uses
- Buffered client → Typed client: uses (evidence: `crates/igs-iec61850-mms/src/client_buffered.rs`)
- Buffered client → Control API: uses (evidence: `crates/igs-iec61850-mms/src/client_buffered.rs`)
- Buffered client → Report API: uses (evidence: `crates/igs-iec61850-mms/src/client_buffered.rs`)
- Server process → Served model: serves
- Served model → Dataset service: dispatches (evidence: `crates/igs-iec61850-mms/src/model.rs`)
- Served model → Server controls: dispatches (evidence: `crates/igs-iec61850-mms/src/model.rs`)
- Served model → Report service: dispatches (evidence: `crates/igs-iec61850-mms/src/model.rs`)
- Served model → Buffered service: dispatches (evidence: `crates/igs-iec61850-mms/src/model.rs`)
- Served model → Value updates: uses (evidence: `crates/igs-iec61850-mms/src/model.rs`)
- Served model → Server model: serves
- Served model → MMS peer: exchanges MMS
- Server model → Model layout: builds layout (evidence: `crates/igs-iec61850-mms-core/src/model/mod.rs`)
- Server model → Standard catalogue: checks against (evidence: `crates/igs-iec61850-mms-core/src/model/mod.rs`)
- Server model → Object names: uses names (evidence: `crates/igs-iec61850-mms-core/src/model/mod.rs`)
- Discovery → Server model: reads model (evidence: `crates/igs-iec61850-mms-core/src/discovery.rs`)
- SCL parser → SCL validation: validates (evidence: `crates/igs-iec61850-mms-core/src/scl/mod.rs`)
- Model builder → SCL validation: checks (evidence: `crates/igs-iec61850-mms-core/src/scl/build.rs`)
- Model builder → Server model: builds (evidence: `crates/igs-iec61850-mms-core/src/scl/build.rs`)
- Model builder → Model layout: uses (evidence: `crates/igs-iec61850-mms-core/src/scl/build.rs`)
- Model builder → Standard catalogue: uses (evidence: `crates/igs-iec61850-mms-core/src/scl/build.rs`)
- Model builder → Unbuffered reports: configures (evidence: `crates/igs-iec61850-mms-core/src/scl/build.rs`)
- Model builder → Buffered reports: configures (evidence: `crates/igs-iec61850-mms-core/src/scl/build.rs`)
- Server controls → Control machine: uses
- Report service → Unbuffered reports: uses
- Report service → Report encoding: encodes reports
- Buffered service → Buffered reports: uses
- Buffered service → Report service: uses (evidence: `crates/igs-iec61850-mms/src/buffered.rs`)
- Report encoding → Buffered reports: encodes (evidence: `crates/igs-iec61850-mms-core/src/report/encode.rs`)
- Report encoding → Unbuffered reports: encodes (evidence: `crates/igs-iec61850-mms-core/src/report/encode.rs`)
- ACSI types → Standard catalogue: maps types (evidence: `crates/igs-iec61850-mms-core/src/acsi.rs`)
