cbb
|
f09decc127
|
feat(server): CANFD 批量收发区 + 电机控制台后端 API
PDO 布局扩展(与 GD32 1.5.56 对齐):
段2 [48..383] CANFD 批量发送区 —— 多帧共用一个 seq 沿, 从站在同一次
processOutput 里先发单帧再发批量, 9 帧 DLC32 由原来 9 个
周期压缩到 1 个周期。
段4 [360..639] CANFD 批量接收区 —— 一周期回收多帧, 支持 DLC64 满长 CANFD,
带 lost/pending 计数。
单帧区 [0..47] 布局不动, 批量区 count=0 时逐字节兼容 1.5.55, 老主站与
CAN 调试页行为不变。
新增 API: /api/can/{send,state} 与 /api/motor/{start,stop,state,send,rx};
电机 PDO 后台循环靠滚动窗口扫 27 个槽, 命令走队列按 seq 沿下发。
ecat.html 加「电机控制台」入口与「CAN 转发」标签页。
test_motor_backend.py 8 项全通过(不接硬件, 假从站模拟 GD32 buildInput/
processOutput): DLC32 不截断、滚动窗口扫全槽、STATUS 32B 完整回传、
队列不互相覆盖、循环可干净停止、批量同步下发、DLC64 回收、1.5.55 兼容。
|
2026-09-03 21:42:07 +08:00 |
|
cbb
|
a1ec486c74
|
fix(server): 修模块级变量粘连, op/start 入口预清理重枚举
1) g_op_active = Falseg_httpd = None 这行把 None 赋给了 g_op_active 和
笔误变量 Falseg_httpd, 导致 g_httpd 在模块级从未定义, 第 744 行
if g_httpd is not None 在服务启动前命中即 NameError。拆成两行。
语法合法故初次提交未拦住。
2) _require_op_ready 入口无条件预清理(回 INIT + config_init 重枚举):
同一连接反复停止/启动而不重枚举时从站邮箱通路逐轮退化, 第 4 轮
config_map() 内 SOEM CoE 分段读的无边界 memcpy 吃到楔死邮箱异常帧
触发 0xC0000005 闪退。置于入口使所有调用方全覆盖, 单从站成本 ~100ms。
op_start 的重试分支因此简化为直接重跑序列。
3) config_map 失败时附带邮箱 SM 寄存器现场, 便于对照 GD32 串口日志。
地址按 SM = 0x0800 + 8n 修正为 SM0=0x0800 / SM1=0x0808;
原写的 0x0810/0x0818 实为 SM2/SM3(过程数据), 抓的现场会误导判断。
|
2026-09-03 02:35:24 +08:00 |
|