---
title: "SLB-EXT Closed-Loop Controller"
url: "https://maker.wiznet.io/scott/resellers/slb-ext-closed-loop-controller/"
markdown_url: "https://maker.wiznet.io/scott/resellers/slb-ext-closed-loop-controller/md"
type: "VAR: Value-Added Reseller Products"
author: "Sienci Labs"
author_url: "https://sienci.com/product/slb-ext-closed-loop-controller/"
editor: "WIZnet"
editor_url: "https://maker.wiznet.io/"
original_author: "Sienci Labs"
original_url: "https://sienci.com/product/slb-ext-closed-loop-controller/"
published: "2026-10-07"
language: "en"
hardware: ["WIZnet W5500"]
likes: 0
views: 8
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# SLB-EXT Closed-Loop Controller

> SLB-EXT: Why a Closed-Loop CNC Controller Moved Its Drivers Off the Board but Kept W5500 Ethernet

Original author: Sienci Labs (source: https://sienci.com/product/slb-ext-closed-loop-controller/)

## Components

- **WIZnet W5500** x 1 ([docs](https://docs.wiznet.io/Product/Chip/Ethernet/W5500))

WIZnet parts: W5500 ([Datasheet](https://docs.wiznet.io/Product/Chip/Ethernet/W5500/datasheet?utm_source=maker&utm_medium=project&utm_campaign=w5500), [product hub](https://maker.wiznet.io/products/w5500/))

## Article

## Summary

**SLB-EXT** is a **$240 grblHAL CNC controller** from Sienci Labs in Canada. It takes the **SuperLongBoard (SLB)**, removes the onboard stepper drivers, and instead **drives the external drivers of closed-loop steppers over differential signals**. The MCU (**STM32F412**), the firmware, and the **W5500 Ethernet** design are the same as on the SLB. The W5500 runs in **MACRAW mode** as the MCU's MAC+PHY, while the MCU's **lwIP** stack handles TCP/IP. This article looks at a design that changed the drivers, voltage, and signaling for larger machines but left the path to the PC untouched.

## Overview

Sienci Labs builds the **LongMill** desktop CNC and the larger **AltMill**. The SLB, designed for the LongMill, drives open-loop NEMA 23 motors directly with a **24V supply and onboard TMC2660C drivers**. The AltMill, however, uses **closed-loop steppers** with a driver and encoder mounted on the back of each motor and runs at **48V**, so the SLB cannot be used as is.

SLB-EXT is the variant built to close that gap. The drivers come off the board, and in their place are **differential STEP/DIR outputs plus an ENABLE output**, along with **ALARM inputs** that come back from the drivers. Target machines are the AltMill, LongMills converted to closed-loop motors, and hobby CNCs that use closed-loop NEMA 23 motors.

→ Product page: <https://sienci.com/product/slb-ext-closed-loop-controller/>

## How It Differs from the SLB

| Item | SLB | **SLB-EXT** |
| --- | --- | --- |
| Motor drivers | Onboard **TMC2660C** | **None** — drives external drivers (built into closed-loop motors) |
| Supported motors | Open-loop NEMA 23 | **Closed-loop**; open-loop also works with compatible external drivers |
| Power | 24V 10A | **48V** (product page: 48V 10A, manual recommends 48V 12.5A) |
| Motor signals | N/A (drivers onboard) | **Differential S±/D±** + E−/5V and AL−/GD, 2×4 IDC ribbon |
| Driver alarm | — | **Per-axis ALARM inputs** |
| Y-axis dual homing | Not supported by default | **Supported** (`Y_AUTO_SQUARE=1`) |
| MCU · Ethernet | STM32F412 · W5500 | **Same** |

In firmware, the two boards are **one branch of the same board map file**. `boards/longboard32_map.h` in the upstream grblHAL `STM32F4xx` repository defines both. When `BOARD_LONGBOARD32_EXT` is set, the board name becomes `"SuperLongBoard Ext"` and the Trinamic driver path is blocked (`#error "SLB EXT does not have Trinamic drivers!"`). The `env:sienci_slb_ext` build target also lives in the upstream `platformio.ini`.

→ Board map: <https://github.com/grblHAL/STM32F4xx/blob/master/boards/longboard32_map.h>

## Architecture

The block diagram in Sienci's published schematic shows the same structure. The **Ethernet_Interface** block connects to the MCU through SPI plus `W5500_INTn` and `W5500_RSTn`, and RS485, USB, limit and auxiliary I/O blocks sit around the MCU. The schematic is released under **CERN-OHL-S v2**.

## Technology Background

### Closed-Loop Steppers and Alarm Feedback

A **closed-loop stepper** adds an **encoder and a dedicated driver** to a regular stepper motor. The driver compares the commanded position with the actual position and corrects the difference on its own. With an open-loop stepper, the controller never learns about a **missed step** when the load exceeds the motor's torque. A closed-loop driver raises an **ALARM signal** when the error goes beyond its tolerance.

On the SLB-EXT, these alarms come back per axis. The board map defines `X/Y/Z/M3/M4_MOTOR_FAULT` input pins. The SLB-EXT build sets `DEFAULT_MOTOR_FAULT_SIGNALS_ENABLE=15` and `DEFAULT_MOTOR_FAULT_SIGNALS_INVERT=15`, so the X, Y, Z and A fault inputs are **enabled and inverted by default**. The manual describes the alarm as an active-low signal. The grblHAL core treats a motor fault as a **blocking signal**, just like E-stop, and raises **Alarm 17 (`Alarm_MotorFault`)**. Instead of cutting on after a missed step, the machine stops and tells the user.

→ grblHAL core protocol.c: <https://github.com/grblHAL/core/blob/master/protocol.c>

### Differential STEP/DIR Signals

**Differential signaling** sends one signal on two wires in opposite phase. The receiver reads only the **voltage difference** between them. Noise that couples equally onto both wires cancels out in the subtraction, so differential lines hold up better than single-ended ones over long cables and near high currents.

Each SLB-EXT motor connector groups **S± (STEP), D± (DIR), E−/5V (ENABLE) and AL−/GD (ALARM)** on a single 2×4 IDC ribbon. The manual calls these **differential signals on twisted-pair cable**. That choice matters on a large machine where signal wires ride along the gantry next to 48V motor current.

→ SLB technical manual: <https://resources.sienci.com/view/slb-manual>

### Modbus RTU over RS485

**Modbus RTU** is an industrial serial protocol. A master sends a frame with a slave address, function code and register, then reads the reply. It runs on the differential RS485 bus and is widely used to control VFDs (inverters).

The SLB-EXT controls the rotation and speed of a **VFD spindle** through its RS485 port. The build uses `MODBUS_ENABLE=3` (RTU plus a direction-control pin). The manual lists **Huanyang v1 and P2A, Yalang YL620, H-100 and GS20** as supported VFDs. Because spindle control travels as serial commands rather than an analog 0–10V level, status values such as spindle speed can also be read back from the VFD [Inferred].

→ Modbus specifications: <https://modbus.org/modbus-specifications>

## Technical Highlights

- **Independent per-axis alarm inputs** — each axis has its own pin. The firmware raises a single `Alarm_MotorFault`, so whether the UI shows which axis tripped is not confirmed

- **Simultaneous 4-axis cutting** — an independent **A axis (rotary)** output. Build defaults are `N_AXIS=4` and `DEFAULT_AXIS_ROTATIONAL_MASK=8`

- **Dual-motor Y auto-squaring** — Y1 and Y2 home separately to square the gantry (`Y_AUTO_SQUARE=1`)

- **Direct 48V distribution** — board terminals feed power to five motors (silkscreen reads **72V MAX**)

- **Noise countermeasures** — the product page cites **shielding and onboard ferrites** on USB-C and Ethernet, and the manual says USB and Ethernet are **isolated for noise**

- **Stock upstream firmware** — `env:sienci_slb_ext` builds Telnet, WebSocket, FTP, three macro buttons, RGB status lights and Sienci's ATC interface plugin

- **Open hardware** — schematics, connector list and pinout are downloadable from the product page

## Where WIZnet Fits — MAC+PHY with lwIP on Top

**Bottom line: the W5500 on the SLB-EXT is not used as a TOE (hardware TCP/IP engine).** grblHAL's WIZnet network driver (`Plugin_networking/wiznet`) opens W5500 socket 0 in **MACRAW** mode (`#define SOCKET_MACRAW 0`) and hands received Ethernet frames straight to an **lwIP** `netif`. ARP, IP, TCP and retransmission all run in lwIP on the STM32F412.

The STM32F412 has **no built-in Ethernet MAC**. That is likely why the designers chose the W5500, which provides **both MAC and PHY** over a single SPI bus [Inferred]. The board map assumes this chip and refuses to compile if another one is configured (`"Board has a WZ5500 ethernet chip"`). The reasoning behind that choice is covered in the SLB article, so this section follows the data path on the SLB-EXT itself.

→ SuperLongBoard article: <https://maker.wiznet.io/scott/resellers/superlongboard/>

**How one line of G-code from gSender reaches the motors**

1. gSender on the PC sends `G1 X100 F3000` over a Telnet (or WebSocket) connection to `192.168.5.1`

2. The **W5500** receives the frame through its PHY and MAC, stores it in the **MACRAW receive buffer**, and pulls `INT` (PA10) low. The socket is opened without the MAC filter (`socket()` flag 0), so it accepts every incoming frame regardless of destination address. The MCU checks for received data both on this interrupt and through periodic systick polling

3. The STM32F412 reads the whole frame over **SPI1** and passes it to lwIP

4. **lwIP** unpacks the IP and TCP headers, handles ordering, acknowledgments (ACK) and retransmission, then passes only the payload bytes to the Telnet daemon

5. grblHAL takes those bytes as an input stream and feeds them to the G-code parser and motion planner

6. STEP/DIR pulses from the planner leave through the differential drivers to the closed-loop motors. Status reports (the `?` response) travel the same path in reverse back to gSender

**Think of the W5500 as the board's "post office counter."** The counter takes every envelope that arrives and passes it inside unopened. Everything else is done by **the clerk in the back office (lwIP on the STM32F412)** — checking whether the envelope is addressed to this building, opening it, counting which letter it is, and writing back to ask for missing ones (TCP). In TOE mode the counter would open the letters and put them in order itself. This board chose to leave that work to the clerk.

The SLB-EXT build sets the size of the clerk's desk explicitly:

| lwIP setting | Value | Meaning |
| --- | --- | --- |
| `TCP_MSS` | **1460** | Largest TCP payload that fits in one Ethernet frame |
| `TCP_SND_BUF` | **5840** | Send buffer = 4 × MSS |
| `MEM_SIZE` | **16384** | 16 KB lwIP heap |
| `NETWORK_IPMODE` | **0** | Static IP by default |

**Without the W5500**, the STM32F412 has no built-in MAC, so wired Ethernet would be impossible without an external Ethernet chip. The alternatives are a MAC-equipped MCU (STM32F407/F429, etc.) with a separate RMII PHY, or another SPI Ethernet chip. The W5500 solves the problem with just **4 SPI lines plus INT and RST**, without changing the MCU. In exchange, the MCU carries the TCP processing load and the lwIP memory.

→ grblHAL networking plugin (WIZnet driver): <https://github.com/grblHAL/Plugin_networking/tree/master/wiznet>
→ W5500 datasheet: <https://docs.wiznet.io/Product/Chip/Ethernet/W5500/datasheet>

## Similar Projects on WIZnet Makers

- **SuperLongBoard** — same company, same STM32F412, same board map, same W5500 MACRAW + lwIP design. The only difference is the output stage: the SLB carries TMC2660C drivers on the board, while the SLB-EXT moves them off it
  → Project link: <https://maker.wiznet.io/scott/resellers/superlongboard/>

- **FlexiHAL 2350** — a grblHAL + W5500 controller that, like the SLB-EXT, drives external drivers over **RS-422 differential Step/Dir**. It differs in using an RP2350 whose PIO generates the pulses, and in offering 6 axes and isolated outputs
  → Project link: <https://maker.wiznet.io/scott/resellers/flexihal-2350-cnc-controller/>

- **Ooznest Motion Control Core** — an **unreleased** ESP32-S3 board that Ooznest, the UK CNC company behind the WorkBee, added to grblHAL. It uses the W5500 as a **MAC+PHY under lwIP**. It differs in going through ESP-IDF's `esp_eth` layer and in not being a shipping product yet
  → Project link: <https://maker.wiznet.io/Benjamin/projects/why-did-cnc-vendor-ooznest-choose-w5500-ethernet-for-its-grblhal-esp32-s3-board/>

All three are **grblHAL controllers that solve wired Ethernet with a single W5500**. Two commercial CNC companies (Sienci and Ooznest) made the same choice of placing the W5500 under lwIP, even with different MCUs.

| Item | **SLB-EXT** | SuperLongBoard | FlexiHAL 2350 | Ooznest MCC |
| --- | --- | --- | --- | --- |
| MCU | STM32F412 | STM32F412 | RP2350 | ESP32-S3 |
| Motor drivers | External (closed-loop) | Onboard TMC2660C | External | Unknown |
| Step/Dir signals | Differential | N/A | Differential (RS-422) | Unknown |
| Driver alarm input | Per axis | One shared (for A axis, conditional) | Unknown | Unknown |
| W5500 usage | MACRAW + lwIP | MACRAW + lwIP | Unknown (original article describes TOE) | MAC+PHY + lwIP |
| Power | 48V | 24V | Unknown | Unknown |
| Price | $240 | $165 | Unknown | Not disclosed |

What sets the SLB family apart is **releasing two product lines that keep the same MCU and network path and change only the output stage**. In effect, the machine size could grow without rewriting the network code [Inferred].

## Where It Fits

- **Large gantry CNCs** — machines like the AltMill with more than 1 m of travel (SLB-EXT build defaults: X 1260 mm, Y 1248 mm). Long motor power and signal runs make differential signaling and a direct Ethernet link work together

- **Open-loop to closed-loop conversions** — when adding closed-loop NEMA 23 motors to an existing LongMill or similar, the stock upstream grblHAL build works without custom firmware

- **4-axis rotary work** — the independent A-axis output turns a rotary axis together with X, Y and Z

- **Noisy workshops** — stream over a **direct Ethernet link** instead of USB where VFD spindles and dust collectors run. In May 2025, Sienci support answered a mid-job disconnect question by suggesting an Ethernet connection first

→ Sienci forum "Continuous disconnect": <https://forum.sienci.com/t/continuous-disconnect/17344>

## Limitations and Future Improvements

The SLB-EXT is a well-built product that ties a large closed-loop machine to open firmware. Forum threads and documentation still point to a few areas for improvement.

- **Ethernet link loss report** — in April 2026, a user reported the controller going offline after idle periods with the **RJ45 link LEDs turned off**. USB came back after a power cycle, and Ethernet stayed down for a while before reconnecting later the same day. The cause was not determined, and the user ordered a new controller
  → Sienci forum "Failure of SLB-EXT": <https://forum.sienci.com/t/failure-of-slb-ext/26159>

- **No firmware updates over Ethernet** — the manual notes that the STM32 does not support flashing over Ethernet and advises keeping a USB-C cable handy. A bootloader extension on the firmware side could address this [Inferred]

- **Point-to-point link recommended** — the manual recommends connecting the PC directly to the board rather than through a router or plant network. Putting several machines on one network needs separate validation

- **SD card and ATC support timing** — in September 2025, a user relayed that Sienci support told them SD cards were not supported. The current upstream build includes `SDCARD_ENABLE=2`, `FTP_ENABLE=1` and the ATC interface plugin, so once gSender support follows, uploading G-code files over Ethernet becomes possible [Inferred]
  → Sienci forum "SLB-EXT and the ATC": <https://forum.sienci.com/t/slb-ext-ant-the-atc/22098>

- **Documentation mismatch** — the product page said "not compatible with open-loop" while the resources page said open-loop is supported. In December 2025, Sienci clarified that open-loop works with compatible external drivers. The power spec also differs between the product page (48V 10A) and the manual (48V 12.5A), so the manual value is the safer baseline
  → Sienci forum "SLB vs. SLB-EXT": <https://forum.sienci.com/t/slb-vs-slb-ext/24865>

## FAQ

**Q. Can I use it with open-loop stepper motors?** A. Yes, if each motor has a **compatible external driver**. The SLB-EXT only outputs STEP/DIR signals, so it does not matter whether the driver is built into a closed-loop motor or mounted separately.

**Q. Can I connect it through a router?** A. It works, but the manual recommends a **direct link to the PC**. The default is the static IP **192.168.5.1/24**, so set the PC adapter to the same subnet (for example, 192.168.5.2).

**Q. Should I use USB or Ethernet?** A. In a noisy workshop, use **Ethernet**. Firmware updates only work over USB-C, though, so keep both paths available.

**Q. Doesn't the W5500 handle TCP, leaving no load on the MCU?** A. No. On this board the W5500 runs in **MACRAW** mode and only moves frames. TCP/IP runs in **lwIP** on the STM32F412, which is why the build tunes the lwIP buffer sizes separately.

**Q. Where do I start if I want to modify the firmware?** A. Start with the `env:sienci_slb_ext` build target and `boards/longboard32_map.h` in the upstream grblHAL `STM32F4xx` repository. Sienci's fork (`Sienci-Labs/sienciHAL`) is also public.

→ sienciHAL: <https://github.com/Sienci-Labs/sienciHAL>

---

---

## 요약

**SLB-EXT** 는 캐나다 Sienci Labs 의 **$240 grblHAL CNC 컨트롤러**로, 형제 제품 **SuperLongBoard(SLB)** 에서 온보드 스테퍼 드라이버를 빼고 **폐루프(closed-loop) 스테퍼의 외부 드라이버를 차동 신호로 구동**하도록 바꾼 보드입니다. MCU(**STM32F412**)와 펌웨어, **W5500 Ethernet** 구성은 SLB 와 같고, W5500 은 **MACRAW 모드**로 MCU 에 MAC+PHY 를 제공하며 TCP/IP 는 MCU 의 **lwIP** 가 처리합니다. 드라이버·전압·신호 방식은 대형 기계에 맞춰 전부 바꾸면서도 PC 와 잇는 경로는 그대로 둔 설계라는 점이 이 글의 관심사입니다.

## 개요

Sienci Labs 는 데스크톱 CNC **LongMill** 과 대형 CNC **AltMill** 을 만드는 회사입니다. LongMill 용으로 만든 SLB 는 **24V 전원과 온보드 TMC2660C 드라이버**로 개루프 NEMA 23 모터를 직접 돌립니다. 그런데 AltMill 은 모터 뒤에 드라이버와 엔코더가 붙은 **폐루프 스테퍼**를 쓰고 **48V** 로 동작해, SLB 를 그대로 쓸 수 없습니다.

SLB-EXT 는 이 차이를 메우려고 만든 변형입니다. 드라이버를 보드에서 걷어내고, 그 자리에 **STEP/DIR 차동 출력·ENABLE 출력**과 드라이버에서 돌아오는 **ALARM 입력**을 넣었습니다. 대상은 AltMill, 폐루프 모터로 개조한 LongMill, 그리고 NEMA 23 폐루프 모터를 쓰는 일반 취미용 CNC 입니다.

→ 제품 페이지: <https://sienci.com/product/slb-ext-closed-loop-controller/>

## SLB 와 무엇이 다른가

| 항목 | SLB | **SLB-EXT** |
| --- | --- | --- |
| 모터 드라이버 | 온보드 **TMC2660C** | **없음** — 외부 드라이버(폐루프 모터 일체형) 구동 |
| 지원 모터 | 개루프 NEMA 23 | **폐루프**, 호환 외부 드라이버를 쓰면 개루프도 가능 |
| 전원 | 24V 10A | **48V** (제품 페이지 48V 10A, 매뉴얼 48V 12.5A 권장) |
| 모터 신호 | 드라이버 내장이라 해당 없음 | **차동 S±/D±** + E−/5V·AL−/GD, 2×4 IDC 리본 |
| 드라이버 알람 | — | **축별 ALARM 입력** |
| Y 축 듀얼 홈잉 | 기본 미지원 | **가능**(`Y_AUTO_SQUARE=1`) |
| MCU · Ethernet | STM32F412 · W5500 | **동일** |

펌웨어 쪽에서 두 보드는 **같은 보드 맵 파일의 분기 하나**입니다. grblHAL 본가 `STM32F4xx` 의 `boards/longboard32_map.h` 가 두 보드를 함께 정의하고, `BOARD_LONGBOARD32_EXT` 가 정의되면 보드 이름이 `"SuperLongBoard Ext"` 로 바뀌며 Trinamic 드라이버 경로가 막힙니다(`#error "SLB EXT does not have Trinamic drivers!"`). 빌드 대상도 `env:sienci_slb_ext` 로 본가 `platformio.ini` 에 들어 있습니다.

→ 보드 맵: <https://github.com/grblHAL/STM32F4xx/blob/master/boards/longboard32_map.h>

## 아키텍처

Sienci 가 공개한 회로도의 블록 다이어그램에도 같은 구조가 보입니다. **Ethernet_Interface** 블록이 SPI 와 `W5500_INTn`·`W5500_RSTn` 으로 MCU 에 붙고, RS485·USB·리밋·보조 I/O 가 MCU 주변에 배치됩니다. 회로도는 **CERN-OHL-S v2** 로 공개돼 있습니다.

## 기술 배경

### 폐루프 스테퍼와 알람 귀환

**폐루프 스테퍼**는 일반 스테퍼 모터에 **엔코더와 전용 드라이버**를 붙여, 지령 위치와 실제 위치의 차이를 드라이버가 스스로 보정하는 방식입니다. 개루프 스테퍼는 부하가 토크를 넘으면 **탈조(missed step)** 가 나도 컨트롤러가 알 수 없지만, 폐루프 드라이버는 오차가 허용 범위를 넘으면 **ALARM 신호**를 냅니다.

SLB-EXT 에서 이 알람은 축마다 따로 돌아옵니다. 보드 맵이 `X/Y/Z/M3/M4_MOTOR_FAULT` 입력 핀을 정의하고, SLB-EXT 빌드는 `DEFAULT_MOTOR_FAULT_SIGNALS_ENABLE=15`·`DEFAULT_MOTOR_FAULT_SIGNALS_INVERT=15` 로 X·Y·Z·A 축 폴트 입력을 **기본으로 켜고 반전(invert)해서** 받습니다. 매뉴얼은 이 알람을 active-low 신호로 설명합니다. grblHAL 코어는 모터 폴트를 E-stop 과 같은 **차단 신호**로 다루며, 신호가 들어오면 **Alarm 17(`Alarm_MotorFault`)** 을 올립니다. 탈조를 무시한 채 가공을 계속하는 대신, 기계를 멈추고 사용자에게 알리는 구조입니다.

→ grblHAL core protocol.c: <https://github.com/grblHAL/core/blob/master/protocol.c>

### 차동 STEP/DIR 신호

**차동 신호**는 한 신호를 +/− 두 선에 반대 위상으로 실어 보내고, 수신 측이 두 선의 **전압 차**만 읽는 방식입니다. 두 선에 똑같이 실린 노이즈는 차를 구할 때 상쇄되므로, 긴 케이블과 큰 전류가 오가는 환경에서 단일 종단 신호보다 강합니다.

SLB-EXT 의 모터 커넥터는 축마다 **S±(STEP), D±(DIR), E−/5V(ENABLE), AL−/GD(ALARM)** 네 쌍을 2×4 IDC 리본 하나로 묶습니다. 매뉴얼은 이를 **차동 트위스트 페어 신호**라고 설명합니다. 48V 모터 전류가 흐르는 겐트리 위를 신호선이 함께 지나가는 대형 기계에서 이 선택이 의미가 있습니다.

→ SLB 기술 매뉴얼: <https://resources.sienci.com/view/slb-manual>

### RS485 위의 Modbus RTU

**Modbus RTU** 는 마스터가 슬레이브 주소·기능 코드·레지스터를 담은 프레임을 보내고 응답을 받는 산업용 직렬 프로토콜입니다. RS485 차동 버스 위에서 동작해 VFD(인버터) 제어에 널리 쓰입니다.

SLB-EXT 는 RS485 포트로 **VFD 스핀들**의 회전·속도를 제어합니다. 빌드 설정은 `MODBUS_ENABLE=3`(RTU + 방향 제어 핀)이며, 매뉴얼이 밝힌 지원 VFD 는 **Huanyang v1·P2A, Yalang YL620, H-100, GS20** 입니다. 스핀들 제어가 아날로그 0–10V 가 아니라 직렬 명령으로 오가므로 회전 속도 같은 상태값도 VFD 에서 읽어 올 수 있습니다 [추정].

→ Modbus 사양: <https://modbus.org/modbus-specifications>

## 기술 특징

- **축별 독립 알람 입력** — 축마다 따로 핀을 받습니다. 펌웨어가 올리는 알람은 `Alarm_MotorFault` 하나라, 어느 축인지 화면에 구분해 보여 주는지는 확인되지 않았습니다

- **4축 동시 가공** — 독립된 **A 축(로터리)** 출력. 빌드 기본값 `N_AXIS=4`, `DEFAULT_AXIS_ROTATIONAL_MASK=8`

- **Y 축 듀얼 모터 오토스퀘어** — Y1·Y2 를 각각 홈잉해 겐트리 직각을 맞춥니다(`Y_AUTO_SQUARE=1`)

- **48V 전원 직접 분배** — 보드 단자에서 모터 5개에 전원을 나눠 줍니다(실크 표기 **72V MAX**)

- **노이즈 대책** — 제품 페이지는 USB-C 와 Ethernet 에 **차폐와 온보드 페라이트**를 적용했다고 밝히고, 매뉴얼은 USB·Ethernet 을 **노이즈 분리** 처리했다고 설명합니다

- **본가 펌웨어 그대로** — `env:sienci_slb_ext` 는 Telnet·WebSocket·FTP, 매크로 버튼 3개, RGB 상태등, Sienci 의 ATC 인터페이스 플러그인을 함께 빌드합니다

- **하드웨어 공개** — 회로도·커넥터 목록·핀아웃을 제품 페이지에서 내려받을 수 있습니다

## W5500 이 맡은 일 — MAC+PHY, 그 위의 lwIP

**결론부터: SLB-EXT 의 W5500 은 TOE(하드웨어 TCP/IP)로 쓰이지 않습니다.** grblHAL 의 WIZnet 네트워크 드라이버(`Plugin_networking/wiznet`)는 W5500 의 소켓 0 을 **MACRAW** 로 열고(`#define SOCKET_MACRAW 0`), 받은 이더넷 프레임을 그대로 **lwIP** 의 `netif` 에 넘깁니다. ARP·IP·TCP·재전송은 모두 STM32F412 의 lwIP 가 처리합니다.

STM32F412 에는 **내장 Ethernet MAC 이 없습니다.** SPI 하나로 **MAC 과 PHY 를 함께** 얻을 수 있는 W5500 을 고른 것은 이 때문으로 보입니다 [추정]. 보드 맵은 이 칩을 전제로 하며, 다른 칩이 설정되면 컴파일을 막습니다(`"Board has a WZ5500 ethernet chip"`). 이 판단 근거는 SLB 소개 글에서 자세히 다뤘으므로, 여기서는 SLB-EXT 에서 실제로 데이터가 흐르는 경로를 봅니다.

→ SuperLongBoard 소개 글: <https://maker.wiznet.io/scott/resellers/superlongboard/>

**gSender 가 보낸 G-code 한 줄이 모터까지 가는 길**

1. PC 의 gSender 가 `192.168.5.1` 의 Telnet(또는 WebSocket) 연결로 `G1 X100 F3000` 을 보냅니다

2. **W5500** 이 PHY·MAC 으로 프레임을 받아 **MACRAW 수신 버퍼**에 담고 `INT`(PA10) 를 내립니다. MAC 필터를 켜지 않고 소켓을 열기 때문에(`socket()` flag 0) 목적지 주소와 상관없이 들어온 프레임을 모두 받습니다. MCU 는 이 인터럽트와 systick 주기 폴링 양쪽으로 수신을 확인합니다

3. STM32F412 가 **SPI1** 로 프레임을 통째로 읽어 lwIP 에 넘깁니다

4. **lwIP** 가 IP·TCP 헤더를 풀고, 순서·확인응답(ACK)·재전송을 처리한 뒤 페이로드 바이트만 Telnet 데몬에 넘깁니다

5. grblHAL 이 그 바이트를 입력 스트림으로 받아 G-code 파서와 모션 플래너에 넣습니다

6. 플래너가 만든 STEP/DIR 펄스가 차동 드라이버를 거쳐 폐루프 모터로 나갑니다. 반대 방향으로 상태 보고(`?` 응답)는 같은 길을 거꾸로 돌아 gSender 에 도착합니다

**비유하자면 W5500 은 이 보드의 "우체국 창구"입니다.** 창구는 들어온 봉투를 받는 대로 봉투째 안으로 넘깁니다. 이 건물 앞으로 온 것인지 가려내는 일부터, 봉투를 뜯어 몇 번째 편지인지 세고 빠진 편지를 다시 보내 달라고 답장하는 일(TCP)은 **사무실 안의 직원(STM32F412 의 lwIP)** 이 합니다. TOE 모드였다면 창구가 편지를 뜯어 순서까지 맞춰 줬겠지만, 이 보드는 그 일을 직원에게 맡기는 쪽을 택했습니다.

SLB-EXT 빌드는 이 직원의 책상 크기를 따로 정해 둡니다:

| lwIP 설정 | 값 | 의미 |
| --- | --- | --- |
| `TCP_MSS` | **1460** | Ethernet 한 프레임에 실을 수 있는 최대 TCP 페이로드 |
| `TCP_SND_BUF` | **5840** | 송신 버퍼 = MSS 4개분 |
| `MEM_SIZE` | **16384** | lwIP 힙 16KB |
| `NETWORK_IPMODE` | **0** | 고정 IP 기본 |

**만약 W5500 이 없었다면**, STM32F412 에는 내장 MAC 이 없으니 외부 Ethernet 칩 없이는 유선 Ethernet 을 붙일 수 없습니다. 내장 MAC 이 있는 MCU(STM32F407/F429 등)로 바꾸고 RMII PHY 를 따로 달거나, 다른 SPI Ethernet 칩을 찾아야 합니다. W5500 은 MCU 를 바꾸지 않고 **SPI 4선 + INT + RST** 만으로 이 문제를 풉니다. 대신 TCP 처리 부담과 lwIP 메모리는 MCU 가 집니다.

→ grblHAL 네트워킹 플러그인(WIZnet 드라이버): <https://github.com/grblHAL/Plugin_networking/tree/master/wiznet>
→ W5500 데이터시트: <https://docs.wiznet.io/Product/Chip/Ethernet/W5500/datasheet>

## WIZnet Makers 유사 사례

- **SuperLongBoard** — 같은 회사, 같은 STM32F412, 같은 보드 맵, 같은 W5500 MACRAW + lwIP 구성입니다. 차이는 출력단뿐으로, SLB 는 TMC2660C 를 보드에 얹고 SLB-EXT 는 그것을 밖으로 뺐습니다
  → 프로젝트 링크: <https://maker.wiznet.io/scott/resellers/superlongboard/>

- **FlexiHAL 2350** — grblHAL + W5500 에, SLB-EXT 처럼 **RS-422 차동 Step/Dir** 로 외부 드라이버를 구동하는 컨트롤러입니다. MCU 가 RP2350 이고 PIO 로 펄스를 만든다는 점, 6축·절연 출력이라는 점이 다릅니다
  → 프로젝트 링크: <https://maker.wiznet.io/scott/resellers/flexihal-2350-cnc-controller/>

- **Ooznest Motion Control Core** — WorkBee 를 파는 영국 CNC 업체 Ooznest 가 grblHAL 에 올린 **미발표** ESP32-S3 보드로, W5500 을 **lwIP 아래 MAC+PHY** 로 씁니다. ESP-IDF 의 `esp_eth` 계층을 거친다는 점과, 아직 제품으로 나오지 않았다는 점이 다릅니다
  → 프로젝트 링크: <https://maker.wiznet.io/Benjamin/projects/why-did-cnc-vendor-ooznest-choose-w5500-ethernet-for-its-grblhal-esp32-s3-board/>

세 사례 모두 **grblHAL 컨트롤러가 유선 Ethernet 을 W5500 하나로 해결**한다는 공통점이 있습니다. 상용 CNC 업체 둘(Sienci, Ooznest)은 MCU 가 달라도 W5500 을 lwIP 아래에 두는 같은 선택을 했습니다.

| 항목 | **SLB-EXT** | SuperLongBoard | FlexiHAL 2350 | Ooznest MCC |
| --- | --- | --- | --- | --- |
| MCU | STM32F412 | STM32F412 | RP2350 | ESP32-S3 |
| 모터 드라이버 | 외부(폐루프) | 온보드 TMC2660C | 외부 | 미상 |
| Step/Dir 신호 | 차동 | 해당 없음 | 차동(RS-422) | 미상 |
| 드라이버 알람 입력 | 축별 | 공용 1개(A 축용, 조건부) | 미상 | 미상 |
| W5500 사용 방식 | MACRAW + lwIP | MACRAW + lwIP | 미상(원 글은 TOE 로 서술) | MAC+PHY + lwIP |
| 전원 | 48V | 24V | 미상 | 미상 |
| 가격 | $240 | $165 | 미상 | 미공개 |

SLB 계열의 차별점은 **같은 MCU·같은 네트워크 경로를 유지한 채 출력단만 바꿔 두 제품군을 낸 것**입니다. 네트워크 코드를 새로 짤 필요 없이 기계 규모만 키울 수 있었던 셈입니다 [추정].

## 어디에 쓰나

- **대형 겐트리 CNC** — AltMill 처럼 이동 거리가 1m 를 넘는 기계(SLB-EXT 빌드 기본값 X 1260mm·Y 1248mm). 모터 전원선과 신호선이 길어지는 구조라 차동 신호와 Ethernet 직결이 함께 효과를 냅니다

- **개루프 → 폐루프 개조** — 기존 LongMill 등에 폐루프 NEMA 23 을 달 때, 펌웨어를 새로 만들 필요 없이 본가 grblHAL 빌드를 그대로 씁니다

- **4축 로터리 가공** — 독립 A 축 출력으로 X·Y·Z 와 동시에 회전축을 돌립니다

- **노이즈가 많은 공방** — VFD 스핀들·집진기가 함께 도는 환경에서 USB 대신 **Ethernet 직결**로 스트리밍합니다. 2025년 5월 작업 중 끊김 문의에 Sienci 지원팀은 Ethernet 연결부터 시도해 보라고 답했습니다

→ Sienci 포럼 「Continuous disconnect」: <https://forum.sienci.com/t/continuous-disconnect/17344>

## 한계 및 개선 방향

SLB-EXT 는 대형 폐루프 기계를 오픈 펌웨어로 묶어 낸 완성도 높은 제품입니다. 다만 포럼과 문서에서 확인되는 몇 가지 개선 지점이 있습니다.

- **Ethernet 링크 소실 사례** — 2026년 4월 한 사용자가 유휴 시간 뒤 컨트롤러가 오프라인이 되고 **RJ45 링크 LED 가 꺼지는** 현상을 보고했습니다. USB 는 전원을 다시 넣으면 살아났고, Ethernet 은 한동안 안 되다가 같은 날 다시 연결됐습니다. 원인은 확정되지 않았고 사용자는 새 컨트롤러를 주문했습니다
  → Sienci 포럼 「Failure of SLB-EXT」: <https://forum.sienci.com/t/failure-of-slb-ext/26159>

- **Ethernet 으로 펌웨어 업데이트 불가** — 매뉴얼은 STM32 가 Ethernet 플래싱을 지원하지 않으니 USB-C 케이블을 남겨 두라고 안내합니다. 펌웨어 쪽 부트로더 확장으로 풀 수 있는 지점입니다 [추정]

- **점대점 직결 권장** — 매뉴얼은 공유기·공장망을 거친 연결보다 PC 와 보드를 바로 잇는 구성을 권합니다. 여러 기계를 한 네트워크로 묶으려면 별도 검증이 필요합니다

- **SD 카드·ATC 지원 시점** — 2025년 9월 한 사용자가 Sienci 지원팀에서 "SD 카드 미지원" 답을 받았다고 전했습니다. 현재 본가 빌드에는 `SDCARD_ENABLE=2`·`FTP_ENABLE=1`·ATC 인터페이스 플러그인이 들어 있어, gSender 쪽 지원이 따라오면 Ethernet 으로 G-code 파일을 올리는 흐름도 가능해집니다 [추정]
  → Sienci 포럼 「SLB-EXT and the ATC」: <https://forum.sienci.com/t/slb-ext-ant-the-atc/22098>

- **문서 표기 불일치** — 제품 페이지의 "개루프 비호환"과 리소스 페이지의 "개루프 지원"이 어긋났고, 2025년 12월 Sienci 가 "호환 외부 드라이버가 있으면 개루프도 가능"이라고 정리했습니다. 전원 사양도 제품 페이지(48V 10A)와 매뉴얼(48V 12.5A)이 다르므로 매뉴얼 값을 기준으로 잡는 것이 안전합니다
  → Sienci 포럼 「SLB vs. SLB-EXT」: <https://forum.sienci.com/t/slb-vs-slb-ext/24865>

## FAQ

**Q. 개루프 스테퍼 모터에도 쓸 수 있나요?** A. 모터마다 **호환되는 외부 드라이버**를 달면 가능합니다. SLB-EXT 는 STEP/DIR 신호만 내보내므로, 드라이버가 폐루프 모터에 붙어 있든 따로 있든 상관없습니다.

**Q. 공유기에 물려서 써도 되나요?** A. 동작은 하지만 매뉴얼은 **PC 와 직결**을 권합니다. 기본값은 고정 IP **192.168.5.1/24** 이므로 PC 쪽 어댑터를 같은 대역(예: 192.168.5.2)으로 맞춰야 합니다.

**Q. USB 와 Ethernet 중 무엇을 써야 하나요?** A. 노이즈가 많은 공방이라면 **Ethernet** 을 권합니다. 다만 펌웨어 업데이트는 USB-C 로만 되므로 두 경로를 모두 준비해 두는 것이 좋습니다.

**Q. W5500 이 TCP 를 처리하니 MCU 부담이 없는 것 아닌가요?** A. 아닙니다. 이 보드에서 W5500 은 **MACRAW** 로 동작해 프레임만 주고받고, TCP/IP 는 STM32F412 의 **lwIP** 가 처리합니다. 그래서 lwIP 버퍼 크기를 빌드 설정에서 따로 조정합니다.

**Q. 펌웨어를 직접 수정하려면 어디서 시작하나요?** A. grblHAL 본가 `STM32F4xx` 저장소의 `env:sienci_slb_ext` 빌드 대상과 `boards/longboard32_map.h` 가 출발점입니다. Sienci 의 포크(`Sienci-Labs/sienciHAL`)도 공개돼 있습니다.

→ sienciHAL: <https://github.com/Sienci-Labs/sienciHAL>

---

Source: https://maker.wiznet.io/scott/resellers/slb-ext-closed-loop-controller/
