Adds the mbproxy service end-to-end. Phases 00-08 implement the production-ready single-listener / 1:1-backend transparent Modbus TCP proxy with bidirectional BCD rewriting for the ~54-PLC DL205/DL260 fleet. Phase 9 replaces the connection layer with a single backend socket per PLC plus MBAP TxId rewriting, lifting the H2-ECOM100's 4-concurrent-client cap as an operational ceiling. Phase 9 additions of note: - PlcMultiplexer + UpstreamPipe + TxIdAllocator + CorrelationMap - InFlightRequest with IReadOnlyList<InterestedParty> (load-bearing for Phase 10 read coalescing — do not collapse to a single field) - Per-request watchdog: surfaces Modbus exception 0x0B to upstream on BackendRequestTimeoutMs, defending against lost responses, dead-PLC paths, and pymodbus 3.13.0's concurrent-multiplexed- request bug (its ServerRequestHandler.last_pdu state race) - Status DTO + HTML gain inFlight / maxInFlight / txIdWraps / disconnectCascades / queueDepth (Tier 1.6 in docs/kpi.md) Tests: 263 unit + 38 E2E. Multiplexer correctness under truly concurrent backend traffic is proved against a stub backend in PlcMultiplexerTests; MultiplexerE2ETests paces requests so pymodbus 3.13's single-PDU framer stays in known-good mode. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.5 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
What this repo is
A personal collection of reference material and tools for working with AVEVA / Wonderware System Platform (formerly Invensys / Wonderware): vendor documentation, sample projects, an active CLI codebase, and a SQL exploration of the Galaxy Repository — pulled together for offline reference and for grounding LLM-assisted work on Wonderware integrations.
How docs are organized
This repo is consumed primarily by LLM coding agents. Documentation follows the rules in DOCS-GUIDE.md — read it before adding or restructuring documentation. The short version:
- This
CLAUDE.mdis a thin index: it points to tools, not into them. - Each tool has its own
README.mdat its folder root that introduces the tool and routes into its deep docs. - Deep documentation (API references, workflows, incident notes) lives inside each tool folder.
When in doubt about where content belongs, default to pushing it deeper. DOCS-GUIDE.md has the full doctrine and the maintenance rules.
Layout
aalogcli/—.NET Framework 4.8 / x86CliFx-based CLI that reads System Platform binary logs (*.aaLGX) for LLM-driven debugging, built on the aaOpenSource/aaLog reader library.aot/— ArchestrA Object Toolkit 2014 v4.0 reference material (dev guide, API reference, sample VS solutions).graccesscli/—.NET Framework 4.8 / x86CliFx-based CLI for automating Galaxy configuration through the ArchestrA GRAccess COM interop.grdb/— SQL/DDL exploration of the Galaxy Repository SQL database (queries, schema, hierarchy/tag-name translation).histdb/— LLM-oriented reference for AVEVA Historian retrieval (extension tables,wwXxxtime-domain extensions, retrieval modes/options, alarm-event SQL, REST API). Distilled from the official Historian Retrieval Guide.mbproxy/—.NET 10Windows Service that proxies Modbus TCP inline and rewrites BCD-encoded registers bidirectionally for a fleet of ~54 DL205/DL260 PLCs.mxaccesscli/—.NET Framework 4.8 / x86CliFx-based CLI for reading, writing, and subscribing to System Platform tags via the MxAccess COM proxy (LMXProxyServerClass).secrets/— Self-hosted Infisical CLI +secretPowerShell helper for fetching credentials fromhttps://infisical.dohertylan.cominstead of inlining plaintext.
Tool / resource index
| Task | Go to |
|---|---|
| Read System Platform logs (last N records, last N minutes, ranges, incremental) — for LLM debugging | aalogcli/README.md |
| Anything AOT — object/primitive design, attributes, building, debugging, samples, API reference | aot/README.md |
| Automate Galaxy configuration via GRAccess COM (CLI usage, session daemon, mutations, LLM integration) | graccesscli/README.md |
| Galaxy Repository SQL — connect, schema, hierarchy queries, contained-name ↔ tag-name translation | grdb/README.md |
AVEVA Historian retrieval — SQL via INSQL, wwXxx extensions, retrieval modes/options, alarm/event SQL, REST API |
histdb/README.md |
| Proxy Modbus TCP inline with bidirectional BCD rewriting for DL205/DL260 fleet (install, ops, status page) | mbproxy/README.md |
| Read / write / subscribe to System Platform tags via MxAccess (timeouts, error categories, JSON envelope) | mxaccesscli/README.md |
Fetch credentials from Infisical instead of using plaintext (secret <KEY> helper, env vars, identity reuse) |
secrets/README.md |
Maintaining this index
Authoritative rules: DOCS-GUIDE.md. The short version that applies here:
- A new top-level tool requires a new
<tool>/README.mdfirst, then one row in the index above pointing to that README. Do not fan out per-file links at the root. - A removed tool deletes its row in the same change.
- When a tool's internals change, update the tool's own README/deep docs — touch this file only if the task → tool mapping changed.
- If this file grows past ~150 lines or starts repeating tool-internal facts, refactor downward per
DOCS-GUIDE.md.