Skip to main content
Miller Welder EtherNet/IP Integration

Productive Robotics

Miller Welder EtherNet/IP Integration

Built the complete integration between the OB7 collaborative robot and Miller industrial welding power sources (AutoContinuum and DeltaWeld) using EtherNet/IP CIP protocol — the same engineer wrote the packed binary C++ driver, the Python executive integration, and the full Vue 3 tablet application with 40+ pages. ~3,000 lines refactored in December alone; 14 YAML recipe files. This is the kind of welder-to-robot integration built at Lincoln Electric Automation, Fanuc, and ABB Robotics.

Wrote a C++ EtherNet/IP driver (miller_eip.cpp) with packed I/O assemblies mapped directly to C++ structs using __attribute__((packed)), matching the Miller welder's CIP object model byte-for-byte. The output_assembly_ (robot-to-welder) controls weld enable, wire feed speed, voltage, gas flow, schedule selection, and P-code read/write commands. The input_assembly_ (welder-to-robot) reads arc current, arc voltage, wire feed speed, fault codes, and the welding state machine status at 125Hz after optimizing the Requested Packet Interval from 100ms to 8ms. These aren't REST APIs — they're packed binary protocols with strict timing constraints and zero error messages on failure.

Built a generic P-code read/write system for reading and writing any Miller parameter by numeric ID. Discovered a critical simultaneous field write bug through hardware debugging — sending weld_list_number_ and set_pcode_id_ in the same EtherNet/IP I/O cycle causes the welder to silently ignore the write. No error codes, no fault flags, no log messages — the parameter just doesn't change. The fix requires clearing one field, waiting 500ms for I/O cycles to propagate, then setting the other. Also built a P-code 800 packed process ID decoder that extracts wire size (bits 0–3), wire type (bits 4–7: Steel ER70X, Metal Core, Flux Core, Aluminum, Stainless), gas type (bits 8–12: 17 mixtures from 100% Argon to 90% He/7.5% Ar/2.5% CO2), and process type (bits 13–15: CV MIG, Accu-Pulse, HD MIG, RMD). Implemented DeltaWeld profile pulse support (P-codes 803–807) with 200ms inter-write delays and 8 memory slot management.

Developed a complete [Vue 3 tablet application](/portfolio/welding-ui-vue3) (welding-ui/) from scratch — 40+ pages that welding operators use daily on the factory floor. Architecture: Pinia state management with 3 stores (programStore for weld programs, connection for ROS WebSocket lifecycle with 1-second auto-reconnect, recipes for weld recipe management). ROS integration layer includes promise-wrapped ROSLIB service calls with caching, 30+ topic definitions, and reusable Vue 3 composables (useRosTopic for auto-cleanup subscriptions on component unmount, useRosService for service calls). Welding features: program create/edit/load/save/step-through, recipe system with translation layer between UI and robot data formats, multipass welding with per-pass offsets, DeltaWeld variant with wire type/diameter selectors, arc start/end parameters, weave frequency/width settings, I/O state monitoring, and IntelliSet/IntelliSense integration with Miller's parameter recommendation system.

Executed a 3,000-line refactor in December 2025: consolidated recipe translation logic scattered across multiple files into a single recipe translation module, removed the ProgramService abstraction in favor of a direct welder config pattern, and restructured ProgramStore for maintainability. Delivered in a 3-phase plan over multiple weeks while maintaining zero downtime on production robots. Also defined 14 YAML-based recipe files (500.yaml through 513.yaml) specifying process type, wire type/diameter, gas mixture, voltage, wire feed speed, arc length trim, start/end parameters, weave parameters, and DeltaWeld-specific constraints.

C++EtherNet/IPVue 3PiniaIndustrialWelding