# apache/plc4x architecture

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

- Interactive diagram: https://gitdiagram.com/apache/plc4x
- Repository: https://github.com/apache/plc4x

## Overview

Apache PLC4X provides libraries for uniform access to industrial PLCs across several language runtimes. A representative Java workflow selects a protocol driver from a connection URL, obtains and connects a protocol-specific connection, then uses that connection to communicate with a PLC. The repository also includes language-specific managers, protocol support, an object-to-PLC mapping tool, and specification-based code-generation components. Edges are limited to relationships shown in excerpts or documented in the README; unsampled subsystems are represented without inferred internal call chains.

Main entry points: [`code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java`](https://github.com/apache/plc4x/blob/develop/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java) (MSpec Parser), [`plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java`](https://github.com/apache/plc4x/blob/develop/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java) (Java Connection API), [`plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java`](https://github.com/apache/plc4x/blob/develop/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java) (Object-PLC Mapping), [`plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java`](https://github.com/apache/plc4x/blob/develop/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java) (Java Driver Manager)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["Client APIs"]
  node_java_client["Java Driver Manager"]
  node_java_connection["Java Connection API<br/>[PlcConnection.java]"]
  node_go_client["Go Driver Manager"]
  node_go_query["Go Query Model<br/>[plc_query.go]"]
  node_python_client["Python Driver Manager"]
  node_net_client[".NET Driver Manager"]
end

subgraph group_protocols["Protocol Support"]
  node_go_transactions["Request Transactions"]
  node_s7_szl["S7 SZL Service<br/>[S7SzlService.java]"]
  node_go_protocol_models["Generated Protocol Models"]
  node_c_runtime["PLC4C Runtime"]
  node_opcua_chunks["OPC UA Chunk Storage"]
end

subgraph group_mapping["Application Tools"]
  node_opm["Object-PLC Mapping"]
end

subgraph group_generation["Code Generation"]
  node_mspec_parser["MSpec Parser"]
  node_java_generators["Java Generators"]
  node_c_generator["C Language Output"]
  node_go_generator["Go Language Output"]
  node_python_generator["Python Language Output"]
end

node_plc(("Industrial PLC"))

node_java_client -->|"creates and connects"| node_java_connection
node_java_connection -->|"communicates with"| node_plc
node_go_client -.->|"opens PLC connection"| node_plc
node_python_client -.->|"opens PLC connection"| node_plc
node_net_client -.->|"opens PLC connection"| node_plc
node_go_transactions -.->|"coordinates protocol requests"| node_go_protocol_models
node_s7_szl -.->|"requests device data"| node_plc
node_opm -->|"uses connection manager"| node_java_client
node_opm -->|"reads PLC fields"| node_java_connection
node_mspec_parser -.->|"feeds generation"| node_java_generators
node_mspec_parser -.->|"feeds generation"| node_c_generator
node_mspec_parser -.->|"feeds generation"| node_go_generator
node_mspec_parser -.->|"feeds generation"| node_python_generator

click node_java_client "https://github.com/apache/plc4x/blob/develop/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java"
click node_java_connection "https://github.com/apache/plc4x/blob/develop/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java"
click node_go_client "https://github.com/apache/plc4x/blob/develop/plc4go/pkg/api/PlcDriverManager.go"
click node_go_query "https://github.com/apache/plc4x/blob/develop/plc4go/pkg/api/model/plc_query.go"
click node_python_client "https://github.com/apache/plc4x/blob/develop/plc4py/plc4py/PlcDriverManager.py"
click node_net_client "https://github.com/apache/plc4x/blob/develop/plc4net/api/PlcDriverManager.cs"
click node_go_transactions "https://github.com/apache/plc4x/blob/develop/plc4go/spi/transactions/RequestTransactionManager.go"
click node_s7_szl "https://github.com/apache/plc4x/blob/develop/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/userdata/S7SzlService.java"
click node_go_protocol_models "https://github.com/apache/plc4x/tree/develop/plc4go/protocols"
click node_c_runtime "https://github.com/apache/plc4x/tree/develop/plc4c/api"
click node_opcua_chunks "https://github.com/apache/plc4x/blob/develop/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/chunk/MemoryChunkStorage.java"
click node_opm "https://github.com/apache/plc4x/blob/develop/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java"
click node_mspec_parser "https://github.com/apache/plc4x/blob/develop/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java"
click node_java_generators "https://github.com/apache/plc4x/tree/develop/code-generation/language/java/src/main/java/org/apache/plc4x/codegeneration/language/java/generators"
click node_c_generator "https://github.com/apache/plc4x/blob/develop/code-generation/language/c/src/main/java/org/apache/plc4x/language/c/CLanguageOutput.java"
click node_go_generator "https://github.com/apache/plc4x/blob/develop/code-generation/language/go/src/main/java/org/apache/plc4x/language/go/GoLanguageOutput.java"
click node_python_generator "https://github.com/apache/plc4x/blob/develop/code-generation/language/python/src/main/java/org/apache/plc4x/language/python/PythonLanguageOutput.java"

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_java_client,node_java_connection,node_go_client,node_go_query,node_python_client,node_net_client toneBlue
class node_go_transactions,node_s7_szl,node_go_protocol_models,node_c_runtime,node_opcua_chunks toneAmber
class node_opm toneMint
class node_mspec_parser,node_java_generators,node_c_generator,node_go_generator,node_python_generator toneRose
class node_plc toneIndigo
```

## Components

### Client APIs

- [Java Driver Manager](https://github.com/apache/plc4x/blob/develop/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java): `plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java`
- [Java Connection API](https://github.com/apache/plc4x/blob/develop/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java): `plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java`
- [Go Driver Manager](https://github.com/apache/plc4x/blob/develop/plc4go/pkg/api/PlcDriverManager.go): `plc4go/pkg/api/PlcDriverManager.go`
- [Go Query Model](https://github.com/apache/plc4x/blob/develop/plc4go/pkg/api/model/plc_query.go): `plc4go/pkg/api/model/plc_query.go`
- [Python Driver Manager](https://github.com/apache/plc4x/blob/develop/plc4py/plc4py/PlcDriverManager.py): `plc4py/plc4py/PlcDriverManager.py`
- [.NET Driver Manager](https://github.com/apache/plc4x/blob/develop/plc4net/api/PlcDriverManager.cs): `plc4net/api/PlcDriverManager.cs`

### Protocol Support

- [Request Transactions](https://github.com/apache/plc4x/blob/develop/plc4go/spi/transactions/RequestTransactionManager.go): `plc4go/spi/transactions/RequestTransactionManager.go`
- [S7 SZL Service](https://github.com/apache/plc4x/blob/develop/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/userdata/S7SzlService.java): `plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/userdata/S7SzlService.java`
- [Generated Protocol Models](https://github.com/apache/plc4x/tree/develop/plc4go/protocols): `plc4go/protocols`
- [PLC4C Runtime](https://github.com/apache/plc4x/tree/develop/plc4c/api): `plc4c/api`
- [OPC UA Chunk Storage](https://github.com/apache/plc4x/blob/develop/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/chunk/MemoryChunkStorage.java): `plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/chunk/MemoryChunkStorage.java`

### Application Tools

- [Object-PLC Mapping](https://github.com/apache/plc4x/blob/develop/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java): `plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java`

### Code Generation

- [MSpec Parser](https://github.com/apache/plc4x/blob/develop/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java): `code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java`
- [Java Generators](https://github.com/apache/plc4x/tree/develop/code-generation/language/java/src/main/java/org/apache/plc4x/codegeneration/language/java/generators): `code-generation/language/java/src/main/java/org/apache/plc4x/codegeneration/language/java/generators`
- [C Language Output](https://github.com/apache/plc4x/blob/develop/code-generation/language/c/src/main/java/org/apache/plc4x/language/c/CLanguageOutput.java): `code-generation/language/c/src/main/java/org/apache/plc4x/language/c/CLanguageOutput.java`
- [Go Language Output](https://github.com/apache/plc4x/blob/develop/code-generation/language/go/src/main/java/org/apache/plc4x/language/go/GoLanguageOutput.java): `code-generation/language/go/src/main/java/org/apache/plc4x/language/go/GoLanguageOutput.java`
- [Python Language Output](https://github.com/apache/plc4x/blob/develop/code-generation/language/python/src/main/java/org/apache/plc4x/language/python/PythonLanguageOutput.java): `code-generation/language/python/src/main/java/org/apache/plc4x/language/python/PythonLanguageOutput.java`

### Other components

- **Industrial PLC**

## Connections

- Java Driver Manager → Java Connection API: creates and connects (evidence: `plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java`)
- Java Connection API → Industrial PLC: communicates with (evidence: `plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java`)
- Go Driver Manager → Industrial PLC: opens PLC connection
- Python Driver Manager → Industrial PLC: opens PLC connection
- .NET Driver Manager → Industrial PLC: opens PLC connection
- Request Transactions → Generated Protocol Models: coordinates protocol requests
- S7 SZL Service → Industrial PLC: requests device data
- Object-PLC Mapping → Java Driver Manager: uses connection manager (evidence: `plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java`)
- Object-PLC Mapping → Java Connection API: reads PLC fields (evidence: `plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java`)
- MSpec Parser → Java Generators: feeds generation
- MSpec Parser → C Language Output: feeds generation
- MSpec Parser → Go Language Output: feeds generation
- MSpec Parser → Python Language Output: feeds generation
