cyclePanel — master plan
2026-09-08 · cyclepanel.com · the clean-room tool chain for WEG and Mitsubishi drives and the GOT panel
1. What cyclePanel is
cyclePanel started on cyclepanel.com as a service: PLC migration in three days, browser simulator included (Mitsubishi ↔ WEG). Building that service produced something bigger than the service — a complete, clean-room implementation of both vendors' tool chains:
- compilers and linkers that reproduce the vendor object byte for byte (WLP: 123 corpus
programs, 0 B difference; the
.fgwladder decoded to the rung geometry), - the real transfer protocols (CFW500 SoftPLC download with its password handshake; FR‑E800 ladder over USB and Modbus/TCP; GOT package read and write over USB and Ethernet, fragments, manifest and delete list decoded from captures),
- a digital twin that mirrors a running machine — drives and the GOT's own screens,
- offline simulation that runs the whole program on a desk with no hardware, on a bench with real drives (the simulation forces the bench's I/O), or with the GOT in the loop,
- a gateway node (Teltonika TRB145 → TRB246) for connectivity, remote flashing, and fleet management, with every page of the router's own web UI cloned into the suite.
The mandate grew from migration to complete control: programming, flashing, monitoring, digital twin, connectivity, dashboard, fleet. That is the product. The migration service stays as the front door.
Mission. Give engineers who run Mitsubishi and WEG drives one unified, AI-driven platform — vibe-coded ladders from a spec, explained rung by rung, compiled byte-exact, verified in a twin before any hardware, flashed and watched over the air. Bring the AI era to these two vendors' ecosystems and set the standard for how industrial machines are programmed, simulated and managed.
2. Products — one platform, five faces
| face | what it does | state 2026‑09‑07 |
|---|---|---|
| Program | four editors: WLP clone (CFW500 ladder + parameters), FR Developer clone (.fgw local/global + ladder), FR Configurator clone (.frc), GTX editor (GOT screens, comments in 7 languages, scripts, recipe, device repoint) |
WLP + .fgw proven byte-exact (cycleFR decodes all three programs, 0 problems); .frc partial — FRC2D under Wine isolated to a file-share violation on its own lock files, awaiting the Windows ProcMon oracle; GTX read proven, write decoded |
| Flash | CFW500 commission.py (areas → ladder → run → setpoints) through the stick or the gateway; FR frladder.py; GOT gotwrite.py |
CFW500 + FR proven on hardware; GOT read on the HP (Data Check clean), write path needs no password, proven against a fake panel — one real write + the six DDTs pending |
| Twin | mirror of a running machine: drives + GOT screens, via the GOT's gateway (:502) or the TRB register block | GOT gateway proven; TRB block phase 1 proven |
| Simulate | soft‑PLC executes the real ladder, plant model supplies every input (end stops with carriage timing, door, thermal chain, FU↔FU link), panel model draws the GOT screens; with a bench the same inputs are injected into the real drives | no‑hardware proven; bench GOT‑off proven end to end on the real drives (2026‑09‑07); bench GOT‑on route built, GOT copy pending |
| Connect + Fleet | TRB gateway: LTE, GNSS, I/O relay (GOT‑off for flashing), RS‑485 slave + raw serial, MQTT uplink; fleet tree of sites → machines → nodes, every node with monitor / configure / flash / backup | TRB145 done incl. all 123 config pages; internet path proven on a public broker (block 51 ms, 406 parameters per station, hosted twin on the real drives); the router's RS‑485 role switched from anywhere (command register, proven both ways 2026‑09‑08); platform broker (TLS, credentials) pending; TRB246 when it arrives |
3. Architecture
cyclepanel.com · fleet dashboard · AI copilot
│ MQTT (gateway-initiated, TLS)
┌─────────┴──────────┐
│ TRB gateway node │ LTE · GNSS · DO relay · Ethernet (TRB246)
│ Modbus RTU st.3 · raw :5001 · REST/uci · MQTT gateway
└───┬──────────┬─────┘
RS‑485 pair │ │ Ethernet
┌───────────────┴──┐ ┌───┴──────────────┐
│ CFW500 st.1/st.2 │ │ GT2104‑R panel │ gateway :502 · transfer 5015
│ FR‑E820 (Mitsu) │ │ (RS‑485 master) │
└──────────────────┘ └──────────────────┘
▲
desk: cyclePanel server (cycleWLP) — editors · compilers · twin · simulation
Transport rule. Internet = MQTT (the gateway publishes and subscribes; it initiates, so carrier‑NAT on LTE is no obstacle). Desk and cabinet = Modbus (RTU on the pair, TCP on the LAN). The TRB is the hinge.
Bus rule. One master on an RS‑485 pair. With the GOT powered the suite reads through the GOT's gateway or the TRB block and injects simulation inputs through the GOT; flashing happens GOT‑off (the gateway's relay opens the panel's leg).
Full drawing: panel/weg/cyclewlp/docs/SUITE-ARCHITECTURE.html.
4. Phases
Phase 1 — cycleWASH on cyclePanel (now → 2026‑09‑08)
- ☑ WLP clone: spec → ladder →
.bkp, WLP 0 errors,.bkprestores byte-identical - ☑ CFW500 commissioning on both bench drives; flash through stick (15.8 s) and TRB (5.5 s)
- ☑
.fgwdecoded and written back; FR ladder read off the real drive - ☑ GOT package read (USB + Ethernet, 0 differences); write decoded end to end
- ☑ Twin via GOT gateway; twin via TRB block (phase 1)
- ☑ Simulation without hardware; with bench GOT‑off; GOT‑on route (
mode:'got') - ☑ TRB145: LTE on the new SIM, slave + raw roles, relay, all 123 config pages cloned
- ☑ PRO_KBGBENCH commissioned on station 1 (7624 B, 0 errors, PASS 2026‑09‑07 21:50) and the bench simulation run end to end on the real drives: 4 pulses → step 04 at 50 Hz, Weiter → 06 at 87 Hz, Weiter → 09 carriage 22 Hz, Abbruch → 30
- ☐ Windows bootstrap verified on the next laptop (
BOOTSTRAP-WINDOWS.md,tools/roundtrip_all.sh)
Phase 2 — full circle with GOT + TRB246 (2026‑09‑08, at the bench)
- ☐ TRB246 wired (block:
+ D1 D2 D3 CTS RTS R+ D+/− ⏚ A ⏚ TX RX R− D−), SIM, relay on D1, aux contact on D2 - ☐ GOT on Ethernet through the TRB246: package read, then one deliberate write
- ☐ GOT Device Data Transfer: coils 000202–207 → drive sim markers; drive blocks → TRB station 3 — gate:
verify_got_ddt.py --watch 30→ blocks 1–5 LIVE (0/6 today) - ☐ Simulation with bench, GOT on — end to end through the gateway
- ☐ Power-cycle test of the user-parameter areas
- ☐ Hybrid GOT scripts No.10–13 rewritten (GT Designer3)
- ☐ GOT package write on the real panel with the corrected package (
gotwrite.py, no password) — one deliberate write, owner at the bench, read-back diff 0
Phase 3 — the platform (next laptop, Windows)
- ☑ MQTT on the router:
trb_mode.py mqtt(Mosquitto + Modbus-over-MQTT gateway),/api/twin/read|write mode:'mqtt', twin button — read + write proven 2026‑09‑07 over USB - ☑ MQTT on the internet — public broker, gateway-initiated: block read 51 ms, the drives read and written by operand (406 parameters per station), the GitHub-hosted twin on the real drives, 11 031/0 soak (2026‑09‑08 01:40)
- ☑ Router role switched from anywhere — command register in the TRB's block, authenticated, fails closed with the GOT on the pair; proven both ways on the bench 2026‑09‑08 (§8 item 6b)
- ☐ Platform broker: own Mosquitto, TLS, per-gateway credentials (
modbusgateway.gateway.*and~/.cyclepanel/mqtt.jsonalready wired),data_senderstream — required before any customer machine - ☐ Fleet dashboard: sites → machines → nodes, GNSS map, five verbs per node
- ☐ AI copilot: spec → ladder (vibe-coded), rung explainer, fault-to-cause, parameter advisor — all checked by the byte-exact compiler and the twin before flashing
- ☐
.frceditor: cycleFR is the shipped editor; FRC2D under Wine has one remaining action — confirm the_dupshare-violation guard with a Windows ProcMon capture, then shim or stop for good. GTX editor write path in the UI - ☐ Cloud: cyclepanel.com login, per-customer fleets, Cloudflare Access for
/pro,/mini,/demos
Phase 4 — the standard
- ☐ Second machine family on the platform (not cycleWASH)
- ☐ Siemens and Allen‑Bradley importers (migration service already promises them)
- ☐ Vendor-neutral portable ladder AST as the interchange format
- ☐ Marketplace of verified function blocks; certification pack (twin evidence per release)
5. Killer features (what nobody else ships)
- Byte-exact clean-room compilers for WLP and the FR‑E800 ladder — the vendor tool is an oracle, not a dependency.
- Real protocols, not vendor DLLs — CFW500 SoftPLC download, FR USB, GOT package write, all from Python on any OS.
- Twin before hardware — the same ladder runs in the browser, on the bench, on the machine.
- Simulation that drives the real drives — inputs injected as markers, through the GOT when it is on.
- Gateway node — one box gives LTE, GNSS, relay for GOT‑off flashing, and its whole web UI inside the suite.
- AI that is checked — every generated rung goes through the compiler, the linters and the twin.
6. Proof, as of 2026‑09‑08
- 95/95 cycleWLP unit tests · 415/415 GOT writer checks · 27 FR ladder self-tests · 16 twin tests · offline sweep 15/15
- Full circle over the internet (2026‑09‑08 01:40): Mac → HiveMQ → LTE → TRB → RS‑485 — block 51 ms, 406 real parameters per station, the hosted
cyclepanel.com/twin/page on the real drives, 11 031 requests / 0 failures overnight - Commissioning verified against the live internet dump: 34/35 setpoints exact (P1020 bumped by the running SoftPLC)
- Ladder viewer: 0 of 382 rung drawings with text overlaps, none without a rail
- cycleFR decodes all three
.fgwprograms with 0 problems; GT Designer3 read the real panel (4.1 MB, Data Check clean) - The gateway's role switched from the internet (2026‑09‑08 12:50): authenticated command register,
twinre‑applied over HiveMQ → LTE; amqtt-serialrequest with the GOT still on the pair refused by the router's own 12 s bus‑quiet guard (status 202), slave restored — no LAN, no SSH - The drives from the internet with the GOT off (2026‑09‑08 15:10):
mqtt-serialaccepted, station 1 P1000 = 4 / P1001 = 1 / fw 2.06 / step 3, station 2 P1000 = 4 / P1001 = 1 / fw 3.73, raw read 90 ms; pair handed back; station 1 re‑commissioned with the field build PRO_KBGV206 (PASS) - Five programs at WLP 0 errors: GO_KB 4224 B · PRO_KBG 7536 B · PRO_S 1648 B · PRO_KBGV206 7620 B · PRO_SBENCH 1656 B · PRO_KBGBENCH 7624 B
- Both bench drives commissioned 2026‑09‑07; flash through the TRB 5.5 s
- 123 router pages cloned, 220 REST endpoints mapped, live read verified
-
Modbus-over-MQTT: block read 6 telegrams/200 ms cold, 7 ms warm; FC6/FC16 write + read-back OK
-
GOT → TRB → internet, live (2026‑09‑08 17:40): after the HP write,
verify_got_ddt.py --mqttshows blocks 1/2/4 streaming (P0004 = 297/303 V,%MW8002= 3, station‑2 P0001 = 220); read from the Mac over LTE only — the first machine data through the whole chain.
7. Names
- cyclePanel — the platform and the domain.
- cycleWLP — the WEG editor/server component (the name of the Python package stays).
- cycleFR — the Mitsubishi
.fgw/.frccomponent; GTX editor — the GOT component. - cycleWASH — the first machine; cycleCAD Suite — the parent family (cycleCAD · ExplodeView · cyclePanel · Pentacad).
8. Next items (2026‑09‑08)
At the bench (Phase 2)
- ~~GOT DDTs + script No.10~~ — written 2026‑09‑08 17:30 (HP, GT Designer3): blocks 1/2/4 LIVE over LTE/MQTT (step register, P‑blocks of both stations), script 10 completes (step 2 → 3). Bit blocks 3/5/6 refused by GT21 (1 point max) — via script later.
1b. GOT round 2 —
handover/HP-INSTRUCTIONS.mdA9–A13: the panel shows "PLC stop / operation locked" because Trigger Actions + the PLC‑Run switch read P0006 as FR SD203 (→ P1000401001, range4 !=), the project has no inter‑drive relay (Y40..48 → station 2, X40..47 + link words → station 1; scripthandover/hp/script02-Relay-CFW500.txt, addresses from the built tag tables), the door input%IX2is real on the field build (jumper DI2 on the bench), and the transfer password must be set (24081969, rule: always). Gate:%MW8074 = 4and%MW8012331 → 0 over MQTT; carriage moves on the bench. 1c. Bench = software-generated signals through the GOT (owner's rule, no wiring): sim-input level words in the TRB block (regmap 7/8 = holding 1167/1168, coin/door + end stops; button mask 1165/1166) written from the Mac over LTE and read back 2026‑09‑08 19:00 (0 0 3 15); GOT scriptSimInputs(A14) fans them into the drive markers; station 1 back onpro_kbg_bench. Gate: door bit → "Tür ist Offen" disappears; 4 coin pulses → step 04 with the GOT on. 1d. DONE 2026‑09‑08 23:50 — bench runs on software‑generated signals with the GOT on: round‑2 project (P1000 triggers, Relay with the%MW8067setpoint, SimInputs, 7 trimmed DDTs, script 30 v7, password), CH2 at 38400 (P0310 = 2, GOT CH2, TRB), carriage 22 Hz + big drive 87 Hz, coins/end stops from the Mac over LTE. Open: ~2 s relay latency (ladder‑side%PD683, packed link word, GOT‑internal switching devices), GOT Ethernet unreachable since the write, GOT texts + cycleWASH branding (comment CSVs, Windows). - Simulation with bench, GOT on — "Simulation über GOT" end to end once (1) is live: 4 pulses → step 04 → Weiter → 06 → 09 → Abbruch → 30, the GOT the sole RS‑485 master.
- TRB246 when it arrives —
+ D1 D2 D3 CTS RTS R+ D+/− ⏚ A ⏚ TX RX R− D−, SIM, relay on D1 cutting the GOT's leg, aux contact D2; GOT‑off flashing and internetmqtt-serialthrough the relay instead of a hand power‑off. - Power‑cycle test of the user‑parameter areas on both stations: P1001 = 1 stored, areas survive,
P1000 = 4after power‑up. - One real GOT package write with the corrected package (
gotwrite.py— must now send the transfer‑password frame once A11 is on the panel) — owner at the bench, explicit go, read‑back diff 0.
5b. Go program on the bench (A13): GOT off → commission.py go --station 1 → GOT on → write GO-CFW500.GTX with password → verify_got_ddt.py --mqtt → twin ?program=go. Same A9 fixes; no door, no relay.
Platform (Phase 3)
- Own MQTT broker — Mosquitto with TLS and per‑gateway credentials, the gateway pointed at it,
data_senderstream; retire the public prefix. Gate: the hosted twin reads the block through the private broker. 6b. ~~Router‑initiated control channel~~ — DONE 2026‑09‑08 12:50, proven on the bench. Found with the USB hub unplugged: over the internet the gateway answers Modbus, but switching its role was a uci change over SSH, LAN only. Now: a command register in the router's own block (docs/TRB-COMMAND-REGISTER.md) — the router watches four words and flips its role itself; the client writes them over MQTT from anywhere. Adversarially reviewed (16 findings): keyed tag + sequence + lockout + rate limit, bus‑quiet guard, nonce‑echoed status,set -emode scripts, sysupgrade‑safe; 14 tests on the real watcher. Installed on the TRB145 (all five busybox tools present) and exercised over HiveMQ → LTE:remote --to twinre‑applied the slave (seq 1);remote --to mqtt-serialwith the GOT on the pair was refused, status 202, slave restored by the router itself (seq 2). With the GOT off (15:10):remote --to mqtt-serialaccepted (seq 5), both drives read from the internet with no LAN — P1000 = 4 / P1001 = 1 on both stations, step register 3 — thenremote --to twin(seq 6). Closed. - Fleet dashboard — sites → machines → nodes, GNSS map, the five verbs per node.
- AI copilot — spec → ladder, rung explainer, fault‑to‑cause, parameter advisor; every rung through the compiler, the linters and the twin.
- FRC2D under Wine — last action — a Windows ProcMon capture of a successful open (
handover/hp/wine-guard-diagnostics.txt, step 1b) intodiff_procmon.py:_dupSUCCESS on Windows ⇒ shim the share mode; otherwise stop. cycleFR stays the editor either way. - Windows bootstrap on the next laptop —
BOOTSTRAP-WINDOWS.md(§5 = what changed on the last Mac day, 2026‑09‑08: carry.cyclepanel/mqtt.jsonand.ssh/trb145, MQTT tooling works off‑LAN, FRC2D native, GOT on USB), thenbash tools/roundtrip_all.shwithPY=python. - Cloud — cyclepanel.com login, per‑customer fleets, Cloudflare Access for
/pro,/mini,/demos.
panel/cyclepanel/MASTER-PLAN.md · architecture: panel/weg/cyclewlp/docs/SUITE-ARCHITECTURE.html · exported 2026‑09‑08