# tganeshg/yocto_miniplc architecture

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

- Interactive diagram: https://gitdiagram.com/tganeshg/yocto_miniplc
- Repository: https://github.com/tganeshg/yocto_miniplc

## Overview

MiniHMI / Mini PLC is an embedded PLC and operator interface product: its firmware exposes device configuration and register data over HTTP, while a browser UI configures and monitors it. The PLC scan engine samples GPIO, conditionally executes a loaded ladder program, and applies outputs. The product layer also includes an LVGL HMI, Modbus-related configuration, project storage, and dynamic plugin loading. Relationships are limited to those visible in excerpts, the source index, or README; several peripheral capabilities are represented without inferred call paths.

Main entry points: [`meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c`](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c) (REST API), [`meta-miniplc/recipes-miniplc/web/src/App.jsx`](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/App.jsx) (Routed UI), [`meta-miniplc/recipes-miniplc/web/src/api/regs.js`](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/regs.js) (Register API), [`meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx`](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx) (Status view)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_firmware["PLC firmware"]
  node_rest["REST API<br/>[rest_api.c]"]
  node_engine["PLC scan engine<br/>[plc_engine.c]"]
  node_ladder["Ladder VM<br/>[ladder_vm.c]"]
  node_gpio["GPIO driver<br/>[gpio_gpiod.c]"]
  node_registers["Register map<br/>[register_map.c]"]
  node_device_config["Device configuration<br/>[device_config.c]"]
  node_project_store["Project storage<br/>[project_store.c]"]
end

subgraph group_web["Web console"]
  node_web_app["Routed UI<br/>[App.jsx]"]
  node_status["Status view<br/>[Status.jsx]"]
  node_modbus_view["Modbus view<br/>[Modbus.jsx]"]
  node_settings["Settings view<br/>[Settings.jsx]"]
  node_overview["Overview view<br/>[Overview.jsx]"]
  node_polling["Polling hook<br/>[usePoll.js]"]
  node_system_status["System status<br/>[useSystemStatus.js]"]
  node_api_client["HTTP client<br/>[client.js]"]
  node_reg_api["Register API<br/>[regs.js]"]
  node_modbus_api["Modbus API<br/>[modbus.js]"]
  node_ntp_api["NTP API<br/>[ntp.js]"]
  node_sysmap["System map<br/>[sysmap.js]"]
end

subgraph group_hmi["Local HMI"]
  node_hmi_app["LVGL HMI<br/>[main.c]"]
  node_hmi_menu["HMI menu<br/>[menu.c]"]
  node_hmi_modbus["HMI Modbus<br/>[modbus.c]"]
end

subgraph group_extensions["Protocols and extensions"]
  node_pool[("Shared data pool<br/>[mdcu_pool.c]")]
  node_plugin_manager["Plugin manager<br/>[plugin_manager.c]"]
  node_modbus_bridge["Modbus bridge<br/>[libmodbus_bridge.c]"]
end

node_operator(("Operator"))
node_field_io(("Physical I/O"))
node_field_devices(("Field devices"))
node_browser(("Browser"))

node_operator -->|"uses"| node_browser
node_browser -->|"opens"| node_web_app
node_web_app -->|"routes to"| node_status
node_web_app -->|"routes to"| node_modbus_view
node_web_app -->|"routes to"| node_settings
node_web_app -->|"routes to"| node_overview
node_status -->|"polls with"| node_polling
node_status -->|"requests"| node_modbus_api
node_status -->|"requests"| node_reg_api
node_settings -->|"polls with"| node_polling
node_settings -->|"requests"| node_reg_api
node_settings -->|"requests"| node_ntp_api
node_modbus_view -->|"polls with"| node_polling
node_modbus_view -->|"loads and saves"| node_modbus_api
node_system_status -->|"uses"| node_polling
node_system_status -->|"requests"| node_reg_api
node_system_status -->|"maps data"| node_sysmap
node_reg_api -->|"calls"| node_api_client
node_reg_api -->|"uses"| node_sysmap
node_modbus_api -->|"calls"| node_api_client
node_ntp_api -.->|"calls"| node_api_client
node_api_client -->|"HTTP requests"| node_rest
node_rest -->|"reads and writes"| node_registers
node_rest -->|"configures scan"| node_engine
node_rest -->|"configures"| node_gpio
node_rest -->|"uses"| node_project_store
node_engine -->|"samples and applies"| node_gpio
node_engine -->|"executes scan"| node_ladder
node_gpio -->|"accesses"| node_registers
node_ladder -->|"accesses"| node_registers
node_project_store -->|"loads program"| node_ladder
node_device_config -.->|"supplies config"| node_engine
node_field_io -.->|"physical signals"| node_gpio
node_hmi_app -->|"initializes UI"| node_hmi_menu
node_hmi_menu -.->|"uses interface"| node_hmi_modbus
node_hmi_modbus -.->|"bridges protocol"| node_modbus_bridge
node_modbus_bridge -.->|"communicates"| node_field_devices
node_plugin_manager -.->|"loads extensions"| node_field_devices
node_pool -.->|"shares data"| node_registers

click node_rest "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c"
click node_engine "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/core/plc_engine.c"
click node_ladder "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/ladder/ladder_vm.c"
click node_gpio "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/io/gpio_gpiod.c"
click node_registers "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/core/register_map.c"
click node_device_config "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/config/device_config.c"
click node_project_store "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/project/project_store.c"
click node_web_app "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/App.jsx"
click node_status "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx"
click node_modbus_view "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Modbus.jsx"
click node_settings "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Settings.jsx"
click node_overview "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Overview.jsx"
click node_polling "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/hooks/usePoll.js"
click node_system_status "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/hooks/useSystemStatus.js"
click node_api_client "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/client.js"
click node_reg_api "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/regs.js"
click node_modbus_api "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/modbus.js"
click node_ntp_api "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/ntp.js"
click node_sysmap "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/domain/sysmap.js"
click node_hmi_app "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/main.c"
click node_hmi_menu "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/menu.c"
click node_hmi_modbus "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/modbus.c"
click node_pool "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/libmdcu-pool/files/mdcu_pool.c"
click node_plugin_manager "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/plugin/plugin_manager.c"
click node_modbus_bridge "https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/libmodbus_bridge.c"

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_rest,node_engine,node_ladder,node_gpio,node_registers,node_device_config,node_project_store,node_browser toneBlue
class node_web_app,node_status,node_modbus_view,node_settings,node_overview,node_polling,node_system_status,node_api_client,node_reg_api,node_modbus_api,node_ntp_api,node_sysmap toneAmber
class node_hmi_app,node_hmi_menu,node_hmi_modbus toneMint
class node_pool,node_plugin_manager,node_modbus_bridge toneRose
class node_operator,node_field_io,node_field_devices toneIndigo
```

## Components

### PLC firmware

- [REST API](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c`
- [PLC scan engine](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/core/plc_engine.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/core/plc_engine.c`
- [Ladder VM](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/ladder/ladder_vm.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/ladder/ladder_vm.c`
- [GPIO driver](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/io/gpio_gpiod.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/io/gpio_gpiod.c`
- [Register map](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/core/register_map.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/core/register_map.c`
- [Device configuration](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/config/device_config.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/config/device_config.c`
- [Project storage](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/project/project_store.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/project/project_store.c`

### Web console

- [Routed UI](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/App.jsx): `meta-miniplc/recipes-miniplc/web/src/App.jsx`
- [Status view](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx): `meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx`
- [Modbus view](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Modbus.jsx): `meta-miniplc/recipes-miniplc/web/src/pages/Modbus.jsx`
- [Settings view](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Settings.jsx): `meta-miniplc/recipes-miniplc/web/src/pages/Settings.jsx`
- [Overview view](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/pages/Overview.jsx): `meta-miniplc/recipes-miniplc/web/src/pages/Overview.jsx`
- [Polling hook](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/hooks/usePoll.js): `meta-miniplc/recipes-miniplc/web/src/hooks/usePoll.js`
- [System status](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/hooks/useSystemStatus.js): `meta-miniplc/recipes-miniplc/web/src/hooks/useSystemStatus.js`
- [HTTP client](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/client.js): `meta-miniplc/recipes-miniplc/web/src/api/client.js`
- [Register API](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/regs.js): `meta-miniplc/recipes-miniplc/web/src/api/regs.js`
- [Modbus API](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/modbus.js): `meta-miniplc/recipes-miniplc/web/src/api/modbus.js`
- [NTP API](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/api/ntp.js): `meta-miniplc/recipes-miniplc/web/src/api/ntp.js`
- [System map](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/web/src/domain/sysmap.js): `meta-miniplc/recipes-miniplc/web/src/domain/sysmap.js`

### Local HMI

- [LVGL HMI](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/main.c): `meta-miniplc/recipes-miniplc/miniplc-hmi/files/main.c`
- [HMI menu](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/menu.c): `meta-miniplc/recipes-miniplc/miniplc-hmi/files/menu.c`
- [HMI Modbus](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/modbus.c): `meta-miniplc/recipes-miniplc/miniplc-hmi/files/modbus.c`

### Protocols and extensions

- [Shared data pool](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/libmdcu-pool/files/mdcu_pool.c): `meta-miniplc/recipes-miniplc/libmdcu-pool/files/mdcu_pool.c`
- [Plugin manager](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/plc-firmware-src/plugin/plugin_manager.c): `meta-miniplc/recipes-miniplc/plc-firmware-src/plugin/plugin_manager.c`
- [Modbus bridge](https://github.com/tganeshg/yocto_miniplc/blob/main/meta-miniplc/recipes-miniplc/miniplc-hmi/files/libmodbus_bridge.c): `meta-miniplc/recipes-miniplc/miniplc-hmi/files/libmodbus_bridge.c`

### Other components

- **Operator**
- **Physical I/O**
- **Field devices**
- **Browser**

## Connections

- Operator → Browser: uses
- Browser → Routed UI: opens
- Routed UI → Status view: routes to (evidence: `meta-miniplc/recipes-miniplc/web/src/App.jsx`)
- Routed UI → Modbus view: routes to (evidence: `meta-miniplc/recipes-miniplc/web/src/App.jsx`)
- Routed UI → Settings view: routes to (evidence: `meta-miniplc/recipes-miniplc/web/src/App.jsx`)
- Routed UI → Overview view: routes to (evidence: `meta-miniplc/recipes-miniplc/web/src/App.jsx`)
- Status view → Polling hook: polls with (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx`)
- Status view → Modbus API: requests (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx`)
- Status view → Register API: requests (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Status.jsx`)
- Settings view → Polling hook: polls with (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Settings.jsx`)
- Settings view → Register API: requests (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Settings.jsx`)
- Settings view → NTP API: requests (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Settings.jsx`)
- Modbus view → Polling hook: polls with (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Modbus.jsx`)
- Modbus view → Modbus API: loads and saves (evidence: `meta-miniplc/recipes-miniplc/web/src/pages/Modbus.jsx`)
- System status → Polling hook: uses (evidence: `meta-miniplc/recipes-miniplc/web/src/hooks/useSystemStatus.js`)
- System status → Register API: requests (evidence: `meta-miniplc/recipes-miniplc/web/src/hooks/useSystemStatus.js`)
- System status → System map: maps data (evidence: `meta-miniplc/recipes-miniplc/web/src/hooks/useSystemStatus.js`)
- Register API → HTTP client: calls (evidence: `meta-miniplc/recipes-miniplc/web/src/api/regs.js`)
- Register API → System map: uses (evidence: `meta-miniplc/recipes-miniplc/web/src/api/regs.js`)
- Modbus API → HTTP client: calls (evidence: `meta-miniplc/recipes-miniplc/web/src/api/modbus.js`)
- NTP API → HTTP client: calls
- HTTP client → REST API: HTTP requests (evidence: `meta-miniplc/recipes-miniplc/web/src/api/client.js`)
- REST API → Register map: reads and writes (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c`)
- REST API → PLC scan engine: configures scan (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c`)
- REST API → GPIO driver: configures (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c`)
- REST API → Project storage: uses (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/api/rest_api.c`)
- PLC scan engine → GPIO driver: samples and applies (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/core/plc_engine.c`)
- PLC scan engine → Ladder VM: executes scan (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/core/plc_engine.c`)
- GPIO driver → Register map: accesses (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/io/gpio_gpiod.c`)
- Ladder VM → Register map: accesses (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/ladder/ladder_vm.c`)
- Project storage → Ladder VM: loads program (evidence: `meta-miniplc/recipes-miniplc/plc-firmware-src/project/project_store.c`)
- Device configuration → PLC scan engine: supplies config
- Physical I/O → GPIO driver: physical signals
- LVGL HMI → HMI menu: initializes UI (evidence: `meta-miniplc/recipes-miniplc/miniplc-hmi/files/main.c`)
- HMI menu → HMI Modbus: uses interface
- HMI Modbus → Modbus bridge: bridges protocol
- Modbus bridge → Field devices: communicates
- Plugin manager → Field devices: loads extensions
- Shared data pool → Register map: shares data
