# LO-TTA-03 接入整合 —— 改动与交付清单

> 2026-09-19 · MKS DLC32 + MKS SERVO42C（纯电机）通过 `fluidncdll` 接入上位机平台。
> 本文回答：这轮改了什么、成果物在哪、以及三个具体配置问题的答案。

---

## 一、一句话结论

**四层里只动了中间两层，没有新增设备模块：**

| 层 | 动了没有 | 说明 |
|---|---|---|
| 设备侧（DLC32 固件 + `config.yaml`） | ✅ **给了一份针对 LO-TTA-03 的 `config.yaml`**（待上传） | 现成的 FluidNC 固件，不用改固件 |
| 驱动层（`fluidncdll.dll`） | ❌ **未改动，直接复用** | 平台侧设备模块 |
| 厂商层（`FluidNC.dll`） | ✅ **重编了新版本** | `D:\workspace\FluidNC_API` |
| 平台配置（`LO-TTA-03.json`） | ✅ **新增**（不新增 DLL 模块） | 型号即一套指令/字段配置 |
| 下位机驱动器（42C） | ✅ **`Mode` 改 `CR_OPEN`** | 排障结论，非代码改动 |

---

## 二、回答你的三个问题

### ✅ 1. `FluidNC.dll` 需要新版本 —— 是的

| 文件 | 大小 | md5 | 时间 |
|---|---|---|---|
| `FluidNC_API\bin\x64\Release\FluidNC.dll` | 202752 | `9f9575a483b7a6c941301fd9b1c315f9` | 09-19 11:48 |
| `Industrial_ui\device\FluidNC.dll` | 202752 | `9f9575a4…`（已同步） | 09-19 11:49 |
| `Industrial_ui\device\fluidncdll.dll` | 118272 | `5b10aee3776cb67fef520830257ff6cc` | 09-18 11:39 ← **本轮未动** |

**改了什么**（`FluidNC_API`，共 4 文件 / +154 −95）：

| 文件 | 改动 |
|---|---|
| `src/FluidNC_Impl.h` | ★ **`QueryFunc`（速度线程自己发 `?` 查规划器空位）→ 换成 `StateFunc`（只读平台维护的状态缓存）**；**删掉独立的 `monitor()` 线程** |
| `src/VelocityController.cpp` | 重写 `loop()`（179 行）：新增 `isBusyState()` / `isFatalState()`，定速点动改为**发一条长 `$J` + 实时字节 0x85（jog cancel）停止** |
| `src/FluidNC_Impl.cpp` | 状态缓存的接线（48 行） |
| `FluidNCDll.vcxproj` | +5 行 |

**为什么要改（根因，写进了头文件注释）**：速度线程**自己发 `?` 就必须 `purgeRead()` 清 RX 缓冲**，
会和平台的周期性状态轮询**抢串口** → 平台查询超时 → **平台判定设备断开、在运动中途把设备关掉**。
⇒ 所以改成"**只读平台缓存，速度线程绝不碰串口读**"。

### ✅ 2. `config.yaml` 需要针对设备单独配置 —— 是的

- **权威只在文件里**：串口 `$` 写入（`$axes/X/...=`、`$Name=`）**只改 RAM**，
  `$ESP444=RESTART` 后全部回退到 `config.yaml`。**唯一持久路径 = 改文件 + 重启。**
- **本机成品**：`D:\workspace\JiaheFluidNC\configs\LO-TTA-03\config.yaml`（37 行 / 714 B）
  另有同内容副本 `config_LO-TTA-03.yaml`。
- **相对设备当前文件只差 2 行**：

| 行 | 设备现值 | 新值 |
|---|---|---|
| `name` | `LO-TTA-01 S1.0` | `LO-TTA-03` |
| `axes.x.steps_per_mm` | `6400` | **`3200`** |

- **相对厂商下发模板 `/uploaded`（`name: 单轴位移台`，85 行 / 1387 B）差得较多**，
  新配置是"精简 + 按本机改"的版本：去掉整套 `homing` / 限位 / `soft_limits: true`，
  `steps_per_mm` 1600→**3200**、`max_rate` 900→**60**、`accel` 200→**3**、
  `max_travel` 10→**1000**、`pulse_us` 6→**4**、`dir_delay_us` 10→**0**，
  并补上 `start.must_home: false` 等段。

- ⚠️ **这份 `config.yaml` 还没上传到设备**。上传路径：
  连热点 `FluidNC` → `http://192.168.10.123/` → 顶部 **`FluidNC`** 标签 → 工具栏 **`Manage local files`**
  → 上传到 `/` → **`Restart FluidNC`**。
  ★ **上传文件名必须就叫 `config.yaml`**（固件用本地文件名当设备端路径，否则只是新增文件、覆盖不到）。

### ✅ 3. `LO-TTA-03.json` 与"原来的位移台配置"的区别 —— 总共只有 10 处

以 `LO-TTA-01.json`（上一代那份）为基准，实测差异 **10 处**：

| # | 位置 | 旧值 | 新值 | 分量 |
|---|---|---|---|---|
| 1 | `queryJson.SPQuery` | `lobll75` | **`fluidnc`** | ★★★ **最关键：换了驱动** |
| 2–8 | `checkJson[*].model` ×7 | `LO-ALN100-2` | `LO-TTA-03` | 型号名（模板继承值改成本机） |
| 9 | `attribute[1].value`（对应开环步数） | `4000` | **`3200`** | 机械参数 |
| 10 | `attribute[6].value`（细分[步进电机]） | `"20"` | **`"16"`** | 机械参数 |

★ **第 1 条是本质区别**：`SPQuery` 是"用哪个设备驱动"的键，
和 DLL 目录名一一对应（`lobll75`↔`Lobll75dll`、`cam`↔`camdll`、`weightcell`↔`WeightCellDll`、
**`fluidnc`↔`fluidncdll`**）。
⇒ **`LO-TTA-01` 走的是 `Lobll75dll`；`LO-TTA-03` 改走 `fluidncdll`（+ `FluidNC.dll`）**
——这就是"这次没有新增 DLL 模块，复用 `fluidncdll`"的物证。

★ 第 9/10 条与设备侧 `steps_per_mm` 一致性：
`steps_per_mm = 200 × MStep ÷ 导程(1mm) = 200 × 16 = 3200` ✅ 三处（json / config.yaml / 42C 的 MStep=16）自洽。

---

## 三、交付物清单

### 设备侧
| 文件 | 说明 |
|---|---|
| `JiaheFluidNC\configs\LO-TTA-03\config.yaml` | ★ 待上传到设备的配置（37 行/714B） |
| `JiaheFluidNC\configs\config_LO-TTA-03.yaml` | 同内容副本（方便识别） |
| `JiaheFluidNC\configs\config_LO-TTA-03.notes.md` | 改法 / WiFi 替换步骤 / 持久性更正 / 回滚 |
| `JiaheFluidNC\configs\SERVO42C-点动不转排查.md` | ★ 本次排障的完整记录（含 42C 参数快照与因果链） |

### 平台侧（`D:\workspace\Industrial_ui`）
| 文件 | 说明 |
|---|---|
| `device\FluidNC.dll` | ★ 新版厂商层 DLL（md5 `9f9575a4…`） |
| `src\json\LO-TTA-03.json` | ★ 新型号配置（含 `.bak_before_mech` 备份） |
| `gen_tta03.py` | 由 LO-TTA-01.json 生成 LO-TTA-03.json（带机械参数正则修正 + 还原比对） |
| `register_tta03.py` | 把型号登记进登录用户目录的 `info.json`（幂等、自动备份） |
| 用户目录 `…\account\<userId>\LO-TTA-03.json` | 已登记（md5 `f4261b13…` 与源文件一致） |

### 厂商层源码（`D:\workspace\FluidNC_API`）
| 文件 | 说明 |
|---|---|
| `src\FluidNC_Impl.h` / `.cpp`、`src\VelocityController.cpp`、`FluidNCDll.vcxproj` | 本轮改动（+154 −95） |
| `build_fluidnc.ps1` | 新增构建脚本 |

### 工具脚本（`D:\workspace\jiahe-agg\fluidncdll\`）
| 脚本 | 用途 |
|---|---|
| `probe_ports.py` | 枚举串口 + 逐个探测（判设备是否在线） |
| `diag_motor.py` | 抓 `$I`/`$CMD`/`$GD`/运动配置段 |
| `diag_jog_me.py` | 点动验 MPos + 试 `$MD`/`$ME` |
| `test_enable.py` | 4 步现场判定（判使能 → `clk` 增量 → 判 Stp/Dir 接反 → 看角度/err） |
| `axis_params.py` | 轴参数在线读写 + 卡尺标定 |
| `dump_config.py` / `probe_device_fs.py` / `probe_setting_paths.py` / `extract_webui_entry.py` | 设备侧配置取证与 WebUI 入口挖掘 |
| `device_config_*.yaml` | 设备配置存档（dump / 文件 / 厂商模板） |

### 技能库与清理
| 项 | 说明 |
|---|---|
| `~\.workbuddy\skills\jiahe-add-device-module\` | 本轮多次更新：`SKILL.md`、`references\mks_servo42c_protocol.md`（新增 §8.1~§8.7）、`references\mks_dlc32_fluidnc_grbl.md`（§10 加第 5 条、§11 重写） |
| `jiahe-agg\.workbuddy\_removed_skills_20260919\` | 陈旧的项目级技能副本（9 文件/104K）已**移出**（非删除，可原样恢复），`skills\` 目录已消失 |

---

## 四、⚠️ 待办与隐患（按优先级）

| # | 事项 | 说明 |
|---|---|---|
| **1** | **上传 `config.yaml` 到设备并重启** | 否则 `steps_per_mm=3200` / `name=LO-TTA-03` 只在 RAM，一重启就回退到 6400 / `LO-TTA-01 S1.0` |
| **2** | **设备端 42C 参数做断电重启验证** | 确认 `Mode=CR_OPEN` 掉电保存（避免下次上电又变回 vFOC 复现故障） |
| **3** | **`Industrial_ui\dist_electron\win-unpacked\device\` 与 `needCopyDependence\device\` 里还是旧版 `FluidNC.dll`** | 那两份是 **790016 B / 08-04 / md5 `6942f1d8…`** 的旧版！**若打包发布走这两个目录，新版 DLL 不会被带上** ⇒ 需要同步替换 |
| **4** | **`FluidNC_API` 改动不要提交**（你已明确） | 注意**别把 `build_log.txt` 带进提交**（它在 `git status` 里是未跟踪文件） |
| **5** | `deviceMap.json` 里**没有 `fluidncdll` 这一项** | 该表像是"启用哪些设备 DLL"的开关（`WeightCellDll: true` 等）。平台日志显示 `fluidncdll.dll` 能正常加载，但**这张表是否需要在新增设备模块时同步，值得确认** |
| **6** | 前端需**重启应用**才能在型号下拉里看到 LO-TTA-03 | 下拉数据源是登录用户目录 `info.json` 的 `configData[]`；服务端同步资源时可能覆盖，届时重跑 `register_tta03.py` |
| **7** | 长期正解：让服务端把 LO-TTA-03 下发进 `configData` | 本地登记只是权宜 |
| **8** | `LO-TTA-01.json` / `LO-TTA-02.json` 仍是旧占位值 | 未表态是否一起修 |
| **9** | `LO-TTA-03.json` 声明 2 轴但 `GetAxisNum()` 硬编码返回 1 | 第 2 轴目前是死行，未定 |
| **10** | 开环（`CR_OPEN`）的固有取舍 | 无丢步保护；**`Ma` 是恒定电流**，发热只由 `Ma` 决定 ⇒ 建议跟一次温度，烫就把 `Ma` 降到 800mA |
