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¶
- 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. - The complete symbolic I/O map exists as a text file —
Mw310\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 fromCLAUDE.md§6 item 4, already done, on paper. It still needs LED confirmation, but the guesswork is gone. - The full PLC source is present —
Mw310\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. - Error
0.0.0090is 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. - 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.43–OF.47 with an enable (OF.41) and a go/position strobe (OF.42), and it reports back the same 5 bits on IF.36–IF.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 IF1–IF6 and UF1–UF6.
48 points across 6 modules is 8 points per module, which gives:
IF.n→ moduleIF[⌊(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.12–IF.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 mm — Q.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,Tool10–Tool14using a25/1…25/5sub-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 onefresa diamante da duemilioni di lire.utn("two-million-lire diamond cutter" — someone's joke, from before the euro).Param\TESTINE.PRM— head offsets. OnlyT0is 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):
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
Related¶
- serial-port — the COM1 answer in full