Skip to content

Working documentation

This page is generated from the project's working notes. It records a real retrofit in progress, corrections included. Anything marked 🔴 or ⚠️ is unresolved or carries a caveat - read those before acting.

MW310 recon — what is on the rp5800

31 August 2026. Read-only inventory of the MW310 install on the rp5800.

Nothing in C:\Mw310 or C:\Windows was modified, moved or deleted. Verified afterwards: no file under C:\Mw310 has a modification time from today, and every copied file byte-compares identical to its source.

Raw files are captured in tuchop/mw310-capture/2026-08-31/. The serial port answer has its own write-up in serial-port.

Headline results

  1. The serial link is COM1, 19200 baud, ACKNACK — and the config that matters is in C:\Windows\Mw310.ini, not in the program folder. See serial-port.
  2. The complete symbolic I/O map exists as a text fileMw310\Sv\MW310.EQU, 765 lines, every input and output named in Italian with its physical address and whether it is N.O. or N.C. This is the systematic I/O mapping from CLAUDE.md §6 item 4, already done, on paper. It still needs LED confirmation, but the guesswork is gone.
  3. The full PLC source is presentMw310\Sv\MW310.PLC, 3.87 MB of commented assembler, version R1 4.20 dated 17 Feb 2005. This is the machine's actual control logic, including the ATC sequence and every interlock. It is the single most irreplaceable file on the box.
  4. Error 0.0.0090 is not only the E-stop. The Italian catalogue reads "Emergenza premuta o End-Cycle" — emergency pressed or End-Cycle. The English catalogue says only "Emergency stop pressed" and has probably been sending us down one branch of a two-branch fault. Details below.
  5. The axis parameters were detuned at some point. A 2017 backup has X max velocity 40000 / accel 2000; the live file has 30000 / 1200. Someone slowed the machine down by 25–40%.

Where everything lives

C:\Windows\Mw310.ini          ← main HMI config: serial port, DAC resolution, paths
C:\Mw310\                     ← install root
├── Comdrv.ini                  comms driver defaults (untouched template, ignore)
├── Param\                      machine + axis parameters, tool table, work planes
├── Sv\                         service tools, PLC source/binary, I/O definitions, logs
├── Defs\                       machine feature definitions (spindle, magazine, heads)
├── Utensili\                   tool library, one file per tool
├── PROG\                       part programs (.PRG) and toolpath files (.TLF)
├── English\ Italiano\ +4       error and message catalogues per language
├── MSystem\                    CAD/nesting subsystem
└── Bitmap\ Bmpsys\             HMI graphics
C:\Mw310 - Copy\              ← an older backup of the tree, NOT identical (see below)

C:\Mw310 - Copy is a stale copy. MW310.EQU and Comdrv.ini are byte-identical to the live tree, but Param\Syncro.prm and Param\pargen.prm differ — they are older and, in the case of the axis parameters, faster. Both differing files are captured under mw310-capture/2026-08-31/Mw310-Copy-backup/.

The I/O map

Mw310\Sv\MW310.EQU declares every I/O point as EQU <symbol>,<address> ;<Italian description> (N.O./N.C.).

Addresses OF.254, OF.255 and OF.256 are not-present placeholders — a signal mapped there does not exist on this machine. That is how the file encodes options this IDW280 was not built with, and it is very useful: it tells us what to ignore.

Filtering those out leaves 42 real outputs and 46 real inputs.

Inputs that matter now

Address Symbol Meaning Type
IF.8 IF_EMERG_TERM EMERGENZA TERMICI — the summary fault input, not just the E-stop. See safety-and-enable-chain.md N.C.
IF.29 IF_END_CYCLE END-CYCLE N.C.
IF.7 IF_HOLD HOLD N.C.
IF.9 IF_CONTR_VUOTO Vacuum control N.C.
IF.33 / IF.34 IF_FOTOC_Z1/Z2 Photocell zone 1 / zone 2 N.C.
IF.45 IF_LIVELLO_OLIO Oil level sensor N.C.
IF.22 / 23 / 24 IF_FC_ASSEU/V/W Overtravel, X / Y / Z N.O.
IF.30 / IF.32 / IF.31 IF_JOGM / IF_JOGP / IF_JOGR Jog − / Jog + / Jog rapid N.O.
IF.12–IF.15 IF_OVERR0..3 Feed override, 4-bit binary N.O.
IF.1 / IF.2 IF_START_ZONA1/2 Cycle start, zone 1 / zone 2 N.O.
IF.3 / IF.4 IF_BLOCCO_AEI/DHL Workpiece clamp foot pedals N.O.
IF.26 / 27 / 28 IF_GRUPPO_ORIZZ1/2/3 Horizontal drill units 1–3 retracted N.O.
IF.11 IF_LAMA_NON_AGGR_SU Head saw group retracted N.O.
IF.35–IF.40, IF.43, IF.44, IF.46 *_GIOSTRA_CU_6, *_PINZA_CU_6 ATC carousel position + gripper N.O.

Outputs that matter now

Address Symbol Meaning
OF.1 OF_CNC_OK CNC OK / watchdog
OF.21 OF_MARCIA_INVERTER Inverter 1 run — the spindle VFD run command
OF.22 OF_INV_INVERTER Inverter 1 reverse
OF.40 OF_SBLOCCO_UT1 Tool release, spindle 1
OF.48 OF_MOT_PANT1 Pantograph/head motor 1
OF.23 / OF.24 OF_PANT1_SU / _GIU Head 1 up / down
OF.9 OF_MOT_PUNTE_VERT Vertical drill block motor
OF.10–15, 25–28 OF_PUNTA_VERT1..10 Vertical drill spindles 1–10
OF.16 / 17 / 18 OF_PUNTA_OR1..3 Horizontal drills 1–3
OF.20 OF_LAMA_NON_AGGR_GIU Head saw down/on
OF.19 OF_CONTRO_PRESS Counter-pressure
OF.2 / OF.3 OF_SBLOCCO_CAMPO_* Zone unclamp, A/E/I and D/H/L
OF.41–OF.47 *_GIOSTRA_CU_6 ATC carousel enable, position command, 5-bit position
OF.35 / OF.36 OF_PINZA_*_CU_6 ATC gripper on / off

The ATC, in one line

The carousel is commanded by a 5-bit binary position code on OF.43OF.47 with an enable (OF.41) and a go/position strobe (OF.42), and it reports back the same 5 bits on IF.36IF.40 plus "position reached" (IF.35) and "reset, at position 1" (IF.46). The gripper is a simple two-output, two-input up/down.

Five bits is up to 32 stations. This is a straightforward scheme to reimplement in LinuxCNC HAL when the ATC phase arrives — it needs 7 outputs and 7 inputs and no clever timing.

I/O module numbering — a hypothesis to check

Param\pargen.prm says "N.SCHEDE I/O" 3 (3 I/O cards). Addresses run to IF.46 and OF.48, i.e. 48 of each. CLAUDE.md §3 records 12 modules as IF1IF6 and UF1UF6.

48 points across 6 modules is 8 points per module, which gives:

IF.n → module IF[⌊(n−1)/8⌋+1], point ((n−1) mod 8)+1

So IF.8 (E-stop) would be module IF1, point 8 — the last point on the first input card. And OF.21 (spindle run) would be module UF3, point 5.

This is arithmetic, not an observation. It is exactly the sort of thing the LED-photography exercise in CLAUDE.md §7.2 should confirm or demolish. If it holds, the whole I/O map transfers to physical terminals without any toggling at all.

Error 0.0.0090 — the English catalogue is misleading

The code decodes as section 00 (ESECUTORE, the executor), error 90. Both language catalogues are in the capture.

Language Text
English (English\error.txt) 90 Emergency stop pressed.
Italian (Italiano\error.txt) 90 Emergenza premuta o End-Cycle.

The Italian names two causes. The English translation dropped one.

So 0.0.0090 means: the emergency circuit is open, or the End-Cycle input is open.

Both are N.C. inputs, so both read "open" when unhealthy: - IF_EMERG_TERM = IF.8 - IF_END_CYCLE = IF.29

The per-zone emergency inputs (IF_EMG_TRATTO_A through _L) are all mapped to OF.254, i.e. not present, so there is no zone-by-zone breakdown to chase — the E-stop is a single series chain landing on one input.

The fault was cleared on 31 August 2026. The cause was a rope (pull-cord) safety switch latched in its triggered state — so it was the IF.8 emergency branch, not IF.29 End-Cycle.

It took a while to find, and the reason is worth keeping: a rope switch runs along the machine rather than sitting on the control panel, so it is not where anyone looks first, and it latches mechanically — a rope nudged back to looking normal is still holding the fault open until the switch body itself is reset.

Clearing it took two steps: reset the latched device, then press a start button to bring the safety relay back in. The second step is reported from experience rather than confirmed, and is worth verifying deliberately next time the machine is put into E-stop. Full checklist in HANDOVER.md.

The decode above stays useful as reference, because the same error reappears the next time either circuit opens. If it does: check the rope switch first, then the mushroom buttons and door interlock, and keep IF.29 End-Cycle in mind as the other branch — the English catalogue will not mention it. If the I/O module hypothesis above holds, IF.29 is module IF4 point 5. Watching the two LEDs while cycling the E-stop separates the branches in under a minute. Neighbouring N.C. inputs are worth a glance at the same time, because they fail the same way: IF.7 HOLD, IF.9 vacuum, IF.33/IF.34 photocells, IF.45 oil level.

For the retrofit: the rope switch is a guarding device on the IF.8 chain and must survive into the LinuxCNC build, with the emergency chain kept hardwired to the drive enables and main contactor and Mesa only monitoring it. See HANDOVER.md.

Jogging — there are hardware jog inputs

IF.30 (jog −), IF.32 (jog +), IF.31 (jog rapid) are real, assigned inputs. Jogging on this machine is driven by physical buttons wired into the PLC, not only by something in the HMI. Feed override is a 4-bit binary encoded switch on IF.12IF.15, which matches the "check for a feed override dial" note in HANDOVER.md.

That reframes the jogging task: rather than hunting through MW310 screens, find the buttons and the override switch, and check whether their inputs are being seen. The PLC refuses to jog while 0.0.0090 is active regardless of what the HMI offers, and that fault is now cleared — so the first thing to try is simply jogging again. It may already work.

Axis parameters

Param\Syncro.prm holds per-axis parameters for U, V, W, S (X, Y, Z, spindle) plus four unused axis slots and an interpolation block.

Linear distances are in 1/100 mmQ.PARK X Z.1 = 280000 in pargen.prm is the 2800.00 mm X park position recorded in CLAUDE.md §3, which confirms the scale.

Parameter U (X) V (Y) W (Z) S (spindle)
Q.MUL / Q.DIV (scaling) 4 / 3 25 / 28 1 / 4 1 / 1
FCSW min (soft limit) −22.00 mm −20.00 mm −11.00 mm −100.00
FCSW max (soft limit) 2903.00 mm 1732.00 mm 202.00 mm 6000.00
Q.TARAT (home offset) −10.00 mm 0 0 0
TOLL.POS (in-position) 2.00 mm 2.00 mm 2.00 mm 1.00
KEP (position gain) 190 190 190 200
KVINT 605 905 3200 0
LAG max 5500 5500 5500 10000
VEL max 30000 25000 13000 50000
ACC max 1200 1200 600 1000
DECEMG (E-stop decel) 40 40 40 20

Interpolation block: VEL_INT 25000, ACC_INT 150, ARMAX 45000, TOLLER 100, EN_OVER 1.

The ratios here are directly reusable — X:Y:Z max velocity 30000:25000:13000 and the gains are what the machine has actually been running with. The absolute units of VEL max and ACC max are not proven. If velocity is in 1/100 mm/s then X max is 300 mm/s = 18 m/min, which sits well below the 40–50 m/min estimated from video in CLAUDE.md §3. Do not port these as numbers until the units are pinned down — the axis scaling measurement (CLAUDE.md §6 item 6) will settle it.

The machine was detuned

Comparing the live Syncro.prm (11 Nov 2021) against the copy in C:\Mw310 - Copy (8 Nov 2017), the only differences are:

2017 2021 (live)
U (X) VEL max 40000 30000
U (X) ACC max 2000 1200
V (Y) VEL max 35000 25000
V (Y) ACC max 2000 1200

X and Y were slowed by 25–29% and their acceleration cut by 40%, some time between those dates. Z and the spindle were left alone. Nothing else in the file changed.

Worth knowing why before choosing LinuxCNC limits. It could be wear, a mechanical problem, a following-error nuisance, or simply someone being cautious. If there is a mechanical reason, the 2017 numbers are not a target to aim back at. Ask Eva whether anything happened to X or Y around 2018–2021.

Incidentally the 2017 X figure of 40000, read as 1/100 mm/s, is 400 mm/s — exactly the conservative LinuxCNC starting velocity already written into CLAUDE.md §3. That is mild supporting evidence for the 1/100 mm/s reading, and it means the planned starting value is the machine's own former maximum rather than something conservative. Treat 400 mm/s as an upper bound to approach, not a start point.

Machine configuration

From Param\pargen.prm:

Key Value Reading
N.SCHEDE I/O 3 3 I/O carrier cards
TIPO INVERT. 2 Inverter type 2
EN_CU_6 8 Tool-change unit 6 enabled, 8 stations
EN_BARCODE 2 Barcode reader configured
EN_CAMPO_INT 1 Intermediate zone enabled
POS. ASSE C / POS. ASSE S 5 / 4 Axis position assignments
Q.PARK X Z.1 280000 X park 2800.00 mm
X MAX Z. 1 / X MIN Z. 2 182830 / 183910 Zone 1/2 boundary, ~1828/1839 mm
L.MAX.PAN.Z1 / Z2 120000 Max panel length 1200.00 mm per zone

EN_CU_6 = 8 is worth noting: the tool carousel is configured for 8 stations, even though the position code has room for 32.

The two-zone layout (fields A/E/I and D/H/L, separate start buttons, separate clamps, separate photocells) is a real feature of this machine and will need representing in LinuxCNC eventually. It is not in the four-phase plan in CLAUDE.md §9 — worth adding.

Tool data

  • Param\TAB01.DAT — the live tool table. 10 of ~50 slots populated, format: slot, ?, ?, 0, 0, offset, 0, 0, 0, toolfile. Positions 1, 2, 4, 5, 6 and 7–10 hold vertical drill bits from 4 mm to 12.5 mm.
  • Param\UteName.dat — 14 named tool slots, Tool10Tool14 using a 25/125/5 sub-address notation.
  • Utensili\ — 29 tool definition files, mostly plain English names: 10 mm vertical drill bit.utn, 20mm router cutter.utn, 3_2 saw blade.utn, Hinge Hole Drill.utn, and one fresa diamante da duemilioni di lire.utn ("two-million-lire diamond cutter" — someone's joke, from before the euro).
  • Param\TESTINE.PRM — head offsets. Only T0 is non-zero (5000 5000 5000 = 50 mm each axis); T1–T14 are all zero.
  • Param\PIANI.DAT — 16 work plane definitions.

Files deliberately not copied

Everything captured is under 5 MB and no executables were copied. All of it is text or small config apart from two deliberate exceptions, documented below. The following were left behind, with reasons:

File Size Why not
Sv\*.sc0, *.sc1 ~190 KB each ×9 Firmware images for controller variants. Binary. Only one (SyMono.sc0) matches this machine, and flashing is not in scope.
Sv\Mw309.plc, MW310_285.PLC 2.6 / 3.3 MB Superseded PLC versions for older machines. Text, but not this machine's logic.
PROG\*.TLF 26 files Toolpath files for specific parts. Production data, not machine configuration.
MSystem\Cad*.exe, all .exe/.dll 0.6–6.2 MB Executables, excluded by instruction.
Sv\cplc32.exe 135 KB The PLC compiler. Excluded as an executable, but preserve it on the image stick — without it the source-matches-binary check described below cannot be run.
MSystem\IT - Lavorare con i DXF.doc 568 KB Italian half of the DXF guide. The English half is captured; this is the same content.
Bitmap\, Bmpsys\ not sized HMI graphics.
Uninst.isu 169 KB Installer state.

Two binaries kept deliberately

MW310.BIN and the English DXF guide were initially left out under the "no binaries" rule, then added on 31 Aug by decision. The rule targets videos and disk images — things that cost the repo forever for bulk. Neither of these is that.

Sv\MW310.BIN (352 KB) — the compiled PLC actually running on the controller.

Everything else we hold is the presumed source of this file. That the two correspond is an assumption, and the controller is coming out — after which only the .BIN can settle it. 352 KB is a trivial price for turning an assumption into a checkable fact. See the verification data below.

MSystem\EN - Working with DXF.doc (565 KB) — the only English documentation on the box.

Everything else here is Italian. Irreplaceable once the machine is stripped, and there is no second copy.

Verification data for the PLC binary

This is the point of keeping the .BIN. Recorded 31 Aug 2026, from the live files:

File SHA-256 Modified
MW310.BIN dfc3a14d4af0693fa007dc9b5616301239e4f61df907bbd282d9ad7dd5672439 2017-11-23 12:42:12
MW310.LST 5c38565a6d1e93e7bebf041238b8a7d0eb02c71f8774a9aee09dcfedd04655fa 2017-11-23 12:42:12
MW310.SYM 33fc3a8470c3ff390fd89df70dd6bf520be49fc6179877abf945c2c27fab94c9 2017-11-23 12:42:12
MW310.EQU aea543db347aa1ef085e4e91d6a300aee237020b447ae21eaa70f2c90b18609f 2017-11-23 12:34:00
MW310.PLC a86f8ffda32da53fd7bf1e48e9f2deaf61e596850d06dda6ac01c6100b281a8c 2005-02-17 14:58:02

The exact command that produced the binary is preserved in Sv\CPLC32.LOG (captured):

C:\Mw310\SV\CPLC32 /S /AF80000 /L60000 /DMW310 /v3 /D2CAMPI /DCU_6 MW310.PLC MW310.BIN MW310.LST

What the timestamps tell us. .BIN, .LST and .SYM share an identical mtime to the second, so all three came out of a single compiler run on 23 Nov 2017. MW310.EQU was saved eight minutes earlier. MW310.PLC was not touched — it still dates from Feb 2005.

So the November 2017 rebuild changed the I/O assignments (.EQU), not the control logic (.PLC). Someone re-mapped I/O and recompiled. That is good news twice over: the logic we hold is the logic that has been running since 2005, and the I/O map we hold is the one that was current at the last rebuild rather than a stale earlier version.

It also means the binary is a function of MW310.PLC and MW310.EQU together — both captured, both hashed above.

The compile flags are themselves informative and corroborate findings made independently elsewhere in this document: /D2CAMPI is the two-zone (two-field) build, and /DCU_6 is tool-change unit 6 — matching EN_CU_6 = 8 in pargen.prm and the GIOSTRA_CU_6 carousel signals in the I/O map.

To settle source-matches-binary later, recompile MW310.PLC + MW310.EQU with that exact command line and compare the SHA-256 against the value above. cplc32.exe (135 KB) is on the rp5800 at C:\Mw310\Sv\ and is not captured — if the machine is ever wiped without preserving it, this check becomes impossible. Worth grabbing the compiler onto the image stick, though not into the repo.

Nothing exceeded 5 MB that was otherwise eligible. The capture is 165 files, 8.8 MB. The two largest are MW310.PLC (3.87 MB) and MW310.LST (3.31 MB), both plain text, both within the limit — together 82% of the total.

The deliberate decision on those two

CLAUDE.md asks for a deliberate decision on anything large, since git keeps it forever. Recording it here:

Both are kept. MW310.PLC is the machine's control logic and is irreplaceable. MW310.LST is the compiler's listing of it, and is partly redundant — but it carries resolved addresses inline, which is what makes the ATC sequence and the interlocks readable without cross-referencing by hand. It is not cheaply regenerable either: the compiler (cplc32.exe) is an executable and was not captured.

The rule's real target is videos and disk images. 7.2 MB of plain text, captured once, for a controller that is going to be removed from the machine, is a reasonable permanent cost. If the repo later needs slimming, MW310.LST is the one to drop — MW310.PLC plus MW310.SYM (183 KB, the symbol-to-address table, also captured) covers most of what it gives.

What is now answered, and what is not

Answered by this recon: - Serial port, baud, protocol (serial-port) - The complete I/O map, symbolically - What error 0.0.0090 actually means — and that it has two causes, not one - Axis parameters, soft limits, gains, and the fact that they were reduced in 2021 - ATC command scheme - Tool table and tool library

Still needs the machine, or hands on hardware: - Serial framing bits — observe on first tap (serial-port) - Whether the I/O module numbering hypothesis is right — LED photography - ~~Which of IF.8 or IF.29 is causing 0.0.0090~~ — answered: the IF.8 emergency branch, a rope safety switch latched in its triggered state. Cleared 31 Aug - Pn000.1 and CN1 pins 5/6 on the three SGDH drives — the DAC finding makes analog velocity the likely answer, but it is not proof - Absolute units of VEL max / ACC max — axis scaling measurement - Why X and Y were detuned in 2021

  • serial-port — the COM1 answer in full