Files
cnc_wams/work/working5/06-决策记录.md

11 KiB
Raw Permalink Blame History

06-决策记录

DR-W5-001以 gmoccapy_XYZAB 执行流程作为本轮验收主线

日期2026-06-26

决策:

  • 本轮不只验证图形 RTCP 轨迹,而是按 LinuxCNC 启动、INI/HAL、task/NML、interpreter、gmoccapy UI 通信和互锁全链路推进。

原因:

  • 用户指定的基准文件覆盖了 gmoccapy_XYZAB.ini 五轴仿真从启动到界面通信的完整执行流程。
  • 若只看轨迹显示容易遗漏回零、状态机、换刀、主轴到速、冷却、UI gate 等数控系统仿真关键行为。

影响:

  • 任务矩阵按 LinuxCNC 行为拆分。
  • 任何实现修改都需要补充对应测试或验收证据。

DR-W5-002模式按钮门控前移到 SET_MODE 和 UI disabled 状态

日期2026-06-26

决策:

  • Web 侧 SET_MODE 统一按 LinuxCNC/gmoccapy 状态门控。
  • STATE_OFF 或未上电时Manual/Jog/MDI/Auto 都禁止切换。
  • STATE_ON 但未全轴回零且 NO_FORCE_HOMING = 0 时,只允许 Manual/Jog禁止 MDI/Auto。
  • 回零后 MDI/Auto 恢复可用Auto 解释器非 idle 时仍禁止离开 Auto。

原因:

  • LinuxCNC gmoccapy.pyon_hal_status_state_off() 会禁用 rbt_manualrbt_mdirbt_auto
  • on_hal_status_state_on() 先只启用 rbt_manual,退出设置页时也明确区分“未回零只 Manual 可用”和“已回零三种模式可用”。
  • 旧 Web 实现主要在 RUNRUN_MDI 时拦截,模式按钮本身仍可点击,不符合 gmoccapy 的按钮敏感状态。

影响:

  • app/src/state/linuxcnc-task-policy.js 成为模式切换和执行动作的统一互锁入口。
  • app/src/ui/gmoccapy-shell.js 侧边模式按钮使用同一 gate 输出 disabled、data-command-readyaria-disabled
  • Node 和浏览器测试增加下电、未回零、已回零三个阶段的断言。

DR-W5-003XYZAB 换刀按 POSTGUI iocontrol 回环建模,不实现手动换刀弹窗

日期2026-06-26

决策:

  • gmoccapy-xyzab profile 和 gmoccapyHalModel 将 M6/M61 换刀执行路径标记为 iocontrol-loopback
  • manualGmoccapyPinsConnected = false,用于说明 gmoccapy.toolchange-changegmoccapy.toolchange-changedgmoccapy.toolchange-number 在该配置中没有作为活动 HAL net 接入。
  • UI 只显示换刀 HAL 诊断,不弹出 gmoccapy 手动换刀确认流程。

原因:

  • gmoccapy_postgui.hal 在 GUI HAL pins 创建后执行 unlinkp iocontrol.0.tool-changeunlinkp iocontrol.0.tool-changedunlinkp iocontrol.0.tool-prep-number
  • 同一文件里连接 gmoccapy.toolchange-* 的手动换刀 nets 保持注释状态。
  • 活动换刀完成路径是 net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed,与 core_sim_XYZAB.hal 的仿真换刀回环语义一致。

影响:

  • HAL/profile 诊断现在能区分“存在 gmoccapy toolchange pins”与“此配置没有把这些 pins 接入手动换刀流程”。
  • verify_gmoccapy_hal_model.mjsverify_gmoccapy_xyzab_profile.mjsverify_profile_boundary.mjs 和浏览器 smoke 均覆盖该换刀语义。

DR-W5-004外部 HAL hard-button pin 使用显式映射,不依赖 Web DOM 顺序

日期2026-06-26

决策:

  • Web 侧将 gmoccapy.h-button.*gmoccapy.v-button.* 建模为显式 pin 到 Web action/selector 的映射。
  • GMOCAPY_HARDWARE_BUTTON action 只模拟 rising edgefalling edge 忽略;可执行 pin 复用原有 Web action 和 linuxcnc-task-policy gate。
  • Web DOM 使用 data-gmoccapy-hal-pindata-gmoccapy-native-paneldata-gmoccapy-native-button-index 标记原生 hard-button 对应关系,而不是依赖当前页面按钮的 DOM 顺序。
  • 未实现的 native 页面按钮,如 tbtn_setupbtn_touchbtn_tooltbtn_switch_mode,只保留诊断映射,不伪装成已实现控制。

原因:

  • LinuxCNC gmoccapy.py_button_pin_changed() 只响应 pin 为 true 的 rising edge。
  • _get_child_button() 按当前 notebook 页或 vbtb_main 的可见非 label 子控件位置查找按钮,并在目标不敏感时忽略。
  • gmoccapy.gladevbtb_main 的原生顺序是 tbtn_estoptbtn_onrbt_manualrbt_mdirbt_autotbtn_user_tabstbtn_setupWeb shell 右侧还包含 reset/TCP 等非原生布局控件,直接用 DOM 顺序会误表达 native 语义。

影响:

  • gmoccapy-xyzab panel schema 修正 Estop/Power/Manual/MDI/Auto 的 v-button pin 顺序。
  • HAL model、communication model、store、UI DOM 和浏览器 smoke 都能追踪 hard-button pin 到 Web action/gate 的行为。
  • 未完成的 optional-stop、blockdelete、ignore-limits 等 pin 仍作为后续独立任务处理。

DR-W5-005HAL input pin 按 gmoccapy 回调语义建模,不按名称直连

日期2026-06-27

决策:

  • Web 侧新增 GMOCAPY_HAL_PIN action用于模拟外部 HAL 输入 pin 对 gmoccapy GUI 状态和命令的影响。
  • gmoccapy.ignore-limits 设置 chk_ignore_limits 等效状态active 时记录 command.override_limits() 请求语义。
  • gmoccapy.optional-stop 不直连 optional stop而是按源码 _optional_blocks() 驱动 tbtn_optional_blocks,也就是 block delete。
  • gmoccapy.blockdelete 不直连 block delete而是按源码 _blockdelete() 调用 command.set_optional_stop()
  • override counts 只有对应 *.count-enable 为 true 时才调整滑块;否则只同步 counts 基线。
  • override direct-value 只有对应 *.analog-enable 为 true 时才接管滑块reset pins 只响应 true/rising edge。

原因:

  • gmoccapy.pyoptional-stop pin 连接 _optional_blocks(),该回调设置 tbtn_optional_blocks,随后 on_tbtn_optional_blocks_toggled() 调用 command.set_block_delete()
  • gmoccapy.pyblockdelete pin 连接 _blockdelete(),该回调调用 command.set_optional_stop()
  • _on_counts_changed()_on_analog_value_changed()_reset_override() 明确要求 enable/rising-edge 条件;gmoccapy_XYZAB.pref 给出本配置默认 scalefeed/rapid/spindle 为 1jog velocity 为 140.4。
  • 如果按 pin 名称直接连同名 Web 状态,会掩盖 gmoccapy 原生回调的交叉行为和 enable 条件。

影响:

  • app/src/state/store.js 新增 gmoccapyGui 状态与 GMOCAPY_HAL_PIN 分发。
  • gmoccapyHalModelgmoccapyCommunicationModel 现在显式记录 operator input pins、override pins、enable 规则和 reset 规则。
  • UI override 面板提供 ignore limits、block delete、optional stop 和 100% reset 控件,诊断区显示 operator input 与 override input 语义。
  • Node 和浏览器 smoke 均覆盖 HAL input/override 语义,防止后续把交叉 pin 改成同名直连。

DR-W5-006jog 与消息 HAL pin 按 gmoccapy 回调边界建模

日期2026-06-27

决策:

  • gmoccapy.jog.axis.jog-*-plus/minus 作为按下/释放电平输入处理pin true 触发 jog pressedpin false 触发 jog released。
  • gmoccapy.jog.jog-inc-N 只响应 true/rising edgejog-inc-0 表示 continuous jogjog-inc-1..5 映射 gmoccapy_XYZAB.ini[DISPLAY] INCREMENTS
  • gmoccapy.jog.turtle-jog 作为 level-driven 状态记录,不伪装成 Web 普通倍率按钮。
  • gmoccapy.delete-message 只在 true 时执行删除消息语义falling edge 忽略。
  • gmoccapy.warning-confirm 作为 warning dialog 轮询确认 pin 记录 level不强行制造不存在的 Web modal 流程。

原因:

  • gmoccapy.py_on_pin_jog_changed() 明确在 pin true 时调用 _on_btn_jog_pressed(),在 pin false 时调用 _on_btn_jog_released();这与 hard-button 的 rising-edge-only 语义不同。
  • _on_pin_incr_changed()not pin.get() 直接 return因此 jog increment pin 只响应 true_make_jog_increments() 会把 continuous 的 rbt_0 放在第一位,get_increments() 再把 INI 的 5 个增量值追加到后面。
  • _del_message_changed() 只在 pin true 时删除 alert 或最后一条 notificationdialogs.warning_dialog() 每 100ms 轮询 warning-confirm pin 来接受活动 warning dialog。
  • 如果把这些 pin 当作普通 Web click 或同名状态直连,会混淆 gmoccapy 源码中 “硬按钮”、“jog pin”、“message pin” 三类不同输入边界。

影响:

  • GMOCAPY_HAL_PIN 现在覆盖 jog axis press/release、jog increment selection、turtle jog、delete-message 和 warning-confirm。
  • HAL model 和 communication model 现在能分别呈现 hard-button、operator/override input、jog input、message input 的不同语义。
  • UI 诊断增加 HAL jogHAL messages,浏览器 smoke 通过 DOM 和公开 dispatch 验证这些语义。

DR-W5-007低频 settings/tool/user-message HAL pins 按配置启用边界建模

日期2026-06-27

决策:

  • gmoccapy.unlock-settings 作为 level-driven settings input pin 记录;默认 gmoccapy_XYZAB.prefunlock_way=use,所以 Web 中默认只记录 pin level不把 setup 锁定或解锁。
  • 当测试显式模拟 HAL unlock 模式时,unlock-settings 才按 pin level 控制 setupSensitive,对应源码 _on_unlock_settings_changed()rbt_hal_unlock 的条件判断。
  • gmoccapy.probeheightgmoccapy.blockheightgmoccapy.toolmeasurementgmoccapy.searchvelgmoccapy.probevel 作为 tool measurement HAL_OUT pins 记录,不伪装成外部 HAL 输入。
  • 当前 gmoccapy_XYZAB.ini 没有 [TOOLSENSOR],所以 profile、HAL model 和 UI 诊断明确自动测刀默认禁用,而不是暴露为可操作流程。
  • 动态 gmoccapy.messages.* pins 只在 INI 存在 MESSAGE_* 配置时创建;当前 XYZAB 没有这些配置,所以 Web 对 messages.* dispatch 返回“未配置”的明确 operator message。

原因:

  • gmoccapy.py_on_unlock_settings_changed() 会先检查初始化状态,再检查 rbt_hal_unlock 或 user mode未选择 HAL unlock 时 pin 变化不应改变 setup 页面可用性。
  • _check_toolmeasurement() 需要有效 [TOOLSENSOR] 数据;缺少探针配置时会显示禁用提示、关闭 chk_use_tool_measurement 并使其不敏感。
  • on_chk_use_tool_measurement_toggled()on_spbtn_probe_height_value_changed()on_btn_block_height_clicked() 都是 GUI/prefs 侧写 HAL_OUT pins不是外部 HAL 驱动 GUI 的输入边界。
  • _init_user_messages() 只有从 INI 读到 user messages 才创建 messages.<pinname>messages.<pinname>-waitingmessages.<pinname>-response;当前 gmoccapy_XYZAB.ini 没有 MESSAGE_* 项。

影响:

  • gmoccapy-xyzab profile 补齐 settings/tool measurement/toolchange confirm 相关 pins并记录 no [TOOLSENSOR] 与 no MESSAGE_* 原因。
  • HAL model 和 communication model 能展示 settings input、tool measurement HAL_OUT、dynamic user message 三类不同边界。
  • Store 和浏览器 smoke 覆盖 unlock-settings 默认忽略、HAL unlock level 控制、blockheight 诊断记录和 messages.* 未配置提示。