feat(motor): 反馈刷新率 Hz 适配(0x0400/0x0401 扩展格式)+ ECAT 密排槽与判活自适应
反馈刷新率(配套电机固件 v0.4.1:0x0400 DLC4/0x0401 DLC2 扩展格式, 选择器 0x0100=STATUS · 0x0101=CONFIG 帧,协议值为周期 ms): - 「节点 ID」页签新增 STATUS/CONFIG 刷新率读取/写入;界面单位一律 Hz (写入按 周期ms=round(1000/Hz) 换算下发,读取反算 Hz 并附原始周期, 取整有损如实展示),0=停发,写入掉电保存;配置值以「读取」回读电机为准 - WiFi 应答回执走 0xC1 per-ID 快照(/can/feedback 全量 entries): GD32 0xC0 ACK 仅 1 字节状态、不携带电机回帧;同 ID 回帧快照只存最新 一条,故一次快照只配一次请求(STATUS/CONFIG 分开读写) - ECAT 回执走批量接收区 takeNodeIdReport,按长度分派 2B 旧格式/4B GET/5B SET ACK - GET_NODE_ID 迁移到扩展选择器 0x0000,兼容旧固件 2B 节点 ID 应答 (SET DLC2 旧格式行为不变) - transport-wifi 新增 fetchFeedbackFull(全量 CAN 反馈快照) EtherCAT/基础设施(密排槽固件 1.6.21 配套): - 快照槽位 5→9 一拍整轮(扫描周期数 6→1);判活阈值随实测 seq 间隔 自适应 clamp(3×EWMA, 2s, 30s),秒级回报档不再被固定 2s 误判离线; STATUS 面板 Hz 明确为网页到达口径(按槽 seq 实测电机回报率的方案已否掉) - esp32_server.py:ecat_native 单实例收紧(后起独占 + taskkill 残留实例, 双实例并存会抢 Npcap 致后起者抓不到从站)+ native stdout 落盘 - flash_gd32.py:刷写后校验「GD32 真的在跑新代码」(版本变化或 uptime 归零), 防"写入≠在跑"假台账 - lab:新增 LAN9252 电源诊断台、PDO 布局页;SPI 测速并入 EtherCAT 接收看板 并更名「SPI/ECAT 通信测速」;移除 continuity_test.html;新增 ECAT 单拍耗时 优化报告;/_local/ 排除入库;测试同步更新(62+58 项全过)
This commit is contained in:
+30
-2
@@ -225,7 +225,35 @@
|
||||
</div>
|
||||
<div class="nodeid-result" id="nodeIdResult">连接设备后读取节点 ID</div>
|
||||
<p style="margin-top:var(--sp-3);font-size:.72rem;color:var(--fg-dim);line-height:1.6">
|
||||
SET_NODE_ID (0x000N0400 DLC2) / GET_NODE_ID (0x000N0401 DLC2)。写入后 CAN ID 前缀变为 0x000Nxxxx。
|
||||
SET_NODE_ID (0x000N0400 DLC2) / GET_NODE_ID (0x000N0401 DLC2,选择器 0x0000)。写入后 CAN ID 前缀变为 0x000Nxxxx。
|
||||
</p>
|
||||
|
||||
<!-- 反馈刷新率:界面单位 Hz,协议值是周期 ms(=1000÷Hz,电机 1ms 节拍分频)。
|
||||
配置值以「读取」回读电机为准(0x0401),「写入」经 0x0400 下发并掉电保存 -->
|
||||
<div class="nodeid-row" style="margin-top:var(--sp-4)">
|
||||
<span class="field-label">反馈刷新率 <span class="field-unit">Hz · 0=停发 · 写入掉电保存</span></span>
|
||||
</div>
|
||||
<div class="nodeid-row">
|
||||
<div class="field" style="min-width:140px">
|
||||
<span class="field-label">STATUS 帧 <span class="field-unit">默认 1000 Hz</span></span>
|
||||
<input type="number" id="periodStatusInput" min="0" max="1000" value="1000" aria-label="STATUS 帧刷新率(赫兹,0=停发)" />
|
||||
</div>
|
||||
<button class="btn btn-sm" id="getPeriodStatusBtn">读取</button>
|
||||
<button class="btn btn-primary btn-sm" id="setPeriodStatusBtn">写入</button>
|
||||
</div>
|
||||
<div class="nodeid-row">
|
||||
<div class="field" style="min-width:140px">
|
||||
<span class="field-label">CONFIG 帧 <span class="field-unit">默认 250 Hz</span></span>
|
||||
<input type="number" id="periodConfigInput" min="0" max="1000" value="250" aria-label="CONFIG 帧刷新率(赫兹,0=停发)" />
|
||||
</div>
|
||||
<button class="btn btn-sm" id="getPeriodConfigBtn">读取</button>
|
||||
<button class="btn btn-primary btn-sm" id="setPeriodConfigBtn">写入</button>
|
||||
</div>
|
||||
<div class="nodeid-result" id="periodResult">连接设备后读取当前刷新率</div>
|
||||
<p style="margin-top:var(--sp-3);font-size:.72rem;color:var(--fg-dim);line-height:1.6">
|
||||
输入为频率(Hz),协议按 周期(ms) = 1000 ÷ Hz 换算下发:0x000N0400 DLC4 [选择器][周期] /
|
||||
0x000N0401 DLC2 [选择器](选择器 0x0100=STATUS · 0x0101=CONFIG)。当前值以「读取」回读为准。
|
||||
停发 STATUS 后状态面板会显示离线,电机仍可控可刷写。
|
||||
</p>
|
||||
</div>
|
||||
<!-- OTA TAB -->
|
||||
@@ -402,7 +430,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="module" src="../js/motor/main.js?v=20260908a"></script>
|
||||
<script type="module" src="../js/motor/main.js?v=20260912b"></script>
|
||||
<!-- 单独打开本页(不在标签外壳里)时, 由本页自己持有 app 租约 -->
|
||||
<script src="../js/common/app-lease.js"></script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user