klippy-ready事件

  • 打印机启动的最后一步,执行打印前的准备事件
  • 依次执行该事件上注册的函数,为后续的打印操作做好准备工作
  • 0,1:加载gcode对象时注册
  • 2:加载 [filament_switch_sensor filament_sensor] 断料检测对象时注册
  • 3:加载 [filament_motion_sensor my_sensor] 堵料检测对象时注册
  • 4:加载 [filament_motion_sensor my_sensor] 堵料检测对象时注册
  • 5:加载 [delayed_gcode PAUSE_AT_D] 对象时注册
  • 6:加载 [filament_switch_sensor power_loss] 对象时注册
  • 7:加载 [delayed_gcode power_loss_macro] 对象时注册
  • 8:加载 [delayed_gcode heatsink] 对象时注册
  • 9:加载 [heater_fan motherboard_fan] 对象时注册
  • 10:加载 [heater_fan motherboard_fan] 对象时注册
  • 11:加载 [heater_fan heat_sink_fan] 对象时注册
  • 12:加载 [probe] 对象时注册
  • 13:加载 [delayed_gcode LOAD_GCODE_OFFSETS] 对象时注册
  • 14:加载 [idle_timeout] 对象时注册
  • 15:toolhead 初始化时加载 statistics 对象时注册
回调入口
try:
    self._set_state(message_ready)
    for cb in self.event_handlers.get("klippy:ready", []):
        if self.state_message is not message_ready:
            return
        cb()
except Exception as e:
    logging.exception("Unhandled exception during ready callback")
    self.invoke_shutdown("Internal error during ready callback: %s"
                         % (str(e),))
  • klippy:ready事件回调入口
gcode ready
def _handle_ready(self):
    self.is_printer_ready = True
    self.gcode_handlers = self.ready_gcode_handlers
    self._respond_state("Ready")
  • GCodeDispatch 对象
  • 返回打印机的状态处于Ready
def _handle_ready(self):
    self.is_printer_ready = True
    if self.is_fileinput and self.fd_handle is None:
        self.fd_handle = self.reactor.register_fd(self.fd,
                                                  self._process_data)
  • GCodeIO 对象
  • 检查gcode命令是否通过文件参数输入,如果是,并且文件描述符没有,则通过reactor注册文件描述符的回调函数
耗材传感器
def _handle_ready(self):
    self.min_event_systime = self.reactor.monotonic() + 2.
  • 当前时间加2s
耗材移动传感器
def _handle_ready(self):
    self.extruder = self.printer.lookup_object(self.extruder_name)
    self.estimated_print_time = (
        self.printer.lookup_object('mcu').estimated_print_time)
    self._update_filament_runout_pos()
    self._extruder_pos_update_timer = self.reactor.register_timer(
        self._extruder_pos_update_event)
  • self.estimated_print_time:从mcu 获取预估打印时间
  • self._update_filament_runout_pos():更新耗材状态的位置
  • self._extruder_pos_update_timer: 注册挤出机位置更新的定时器
延迟gcode
def _handle_ready(self):
    waketime = self.reactor.NEVER
    if self.duration:
        waketime = self.reactor.monotonic() + self.duration
    self.timer_handler = self.reactor.register_timer(
        self._gcode_timer_event, waketime)
  • 注册一个延迟执行gcode的定时器
  • 定时器根据是否存在self.duration,设置定时器的执行时间
heaters 加热器
def _handle_ready(self):
    self.has_started = True
加热器冷却风扇
def handle_ready(self):
    pheaters = self.printer.lookup_object('heaters')
    self.heaters = [pheaters.lookup_heater(n) for n in self.heater_names]
    reactor = self.printer.get_reactor()
    reactor.register_timer(self.callback, reactor.monotonic()+PIN_MIN_TIME)
  • 获取加热器对象
  • 注册一个风扇速度更新的定时器
gcode move
def _handle_ready(self):
    self.is_printer_ready = True
    if self.move_transform is None:
        toolhead = self.printer.lookup_object('toolhead')
        self.move_with_transform = toolhead.move
        self.position_with_transform = toolhead.get_position
    self.reset_last_position()
  • 主要是设置移动位置
空闲超时
def handle_ready(self):
    self.toolhead = self.printer.lookup_object('toolhead')
    self.timeout_timer = self.reactor.register_timer(self.timeout_handler)
    self.printer.register_event_handler("toolhead:sync_print_time",
                                        self.handle_sync_print_time)
  • 注册一个超时处理的定时器。
  • 注册“toolhead:sync_print_time”事件,回调函数self.handle_sync_print_time,同步打印时间。
  • toolhead 计算打印时间时会回调该函数self.handle_sync_print_time。
def _calc_print_time(self):
    curtime = self.reactor.monotonic()
    est_print_time = self.mcu.estimated_print_time(curtime)
    kin_time = max(est_print_time + MIN_KIN_TIME, self.last_kin_flush_time)
    kin_time += self.kin_flush_delay
    min_print_time = max(est_print_time + self.buffer_time_start, kin_time)
    if min_print_time > self.print_time:
        self.print_time = min_print_time
        self.printer.send_event("toolhead:sync_print_time",
                                curtime, est_print_time, self.print_time)
状态统计
def handle_ready(self):
    self.stats_cb = [o.stats for n, o in self.printer.lookup_objects()
                     if hasattr(o, 'stats')]
    if self.printer.get_start_args().get('debugoutput') is None:
        reactor = self.printer.get_reactor()
        reactor.update_timer(self.stats_timer, reactor.NOW)
  • 获取含有stats属性的打印对象
  • 更新状态定时器,立即执行
  • 状态检查定时器执行间隔1s左右
<think>我们正在处理的是Klipper连接问题,错误提示为"Printeris notready:The klippyhost softwareis attemptingto connect. Pleaseretryin afew moments."这个问题通常发生在Moonraker(Web界面服务)无法与Klippy(打印机固件)建立连接时。我们需要系统地排查可能的原因。根据Klipper官方文档和常见问题,我们可以按照以下步骤进行排查: ###1. **检查Klipper服务状态**首先确认Klipper服务是否正常运行。通过SSH连接到打印机主机(如树莓派),执行:```bashsudosystemctlstatus klipper```- **正常状态**:应显示`active(running)`- **异常状态**:如果处于`failed`或`inactive`,则尝试重启服务:```bashsudosystemctlrestart klipper``` ###2. **检查Moonraker日志**Moonraker日志通常位于`~/klipper_logs/moonraker.log`。使用以下命令查看最新错误:```bashtail -n50 ~/klipper_logs/moonraker.log```关键错误信息可能包括:-`ConnectionRefused`:Klipper的API服务未启动(端口7125)-`Timeout`:Klipper响应超时###3.**检查Klippy日志**Klippy主日志位于`/tmp/klippy.log`。查看最近错误:```bashtail-n50/tmp/klippy.log```常见问题:- **MCU连接失败**:例如`Unable toopen serialport`或`MCU error`-**配置文件错误**:`Errorin configfile`(检查`printer.cfg`语法)###4.**验证Klipper与MCU的连接**- **串口设备权限**:确保`/dev/ttyACM0`(或类似设备)的用户组为`tty`或`dialout`,并添加用户到该组:```bashls-l/dev/ttyACM0#查看权限sudo usermod-a-Gttypi#将用户pi加入tty组(根据实际用户调整)```- **重新检测设备**:重启主机或执行`sudoserviceklipper restart`重新初始化串口###5.**端口冲突排查**Klippy默认使用`/tmp/printer`作为Unix域套接字,Moonraker通过此套接字通信。检查套接字是否存在:```bashls-l /tmp/printer```-如果不存在:Klippy启动失败(参考步骤3)-如果存在但无法连接:可能是权限问题,确保Moonraker有访问权限###6.**重启服务**按顺序重启服务:```bashsudosystemctlrestart klippersudo systemctl restartmoonraker```###7.**硬件故障**如果以上步骤无效,考虑硬件问题:- USB线接触不良:更换USB线-MCU供电不足:使用带电源的USB Hub###8. **高级诊断**- **手动启动Klippy**:停止服务后手动运行以查看实时输出:```bashsudosystemctlstop klipper~/klippy-env/bin/python~/klipper/klippy/klippy.py~/printer.cfg-l/tmp/klippy.log```- **Moonraker配置检查**:确认`moonraker.conf`中`[server]`部分的`socket`路径与Klippy一致(默认`/tmp/printer`)###解决方案流程图```mermaidgraphTDA[出现连接错误]--> B{检查Klipper服务状态}B-->|运行正常| C[检查Moonraker日志]B -->|运行异常| D[重启Klipper服务]D -->E[检查Klippy日志]C -->F[检查连接错误类型]F -->|连接拒绝| G[检查端口7125或套接字]F-->|超时| H[检查MCU连接]G--> I[验证Klippy是否创建套接字]H--> J[检查串口设备和权限]``` ###常见错误代码解析- **Klippy内部错误**:配置文件错误会导致启动失败(如引脚重复定义)```bashgrep -i error/tmp/klippy.log```- **Moonraker错误代码**:如`WebRequestError`(网络配置问题)###相关问题1.如何解决Klipper启动时的`MCU 'mcu'错误`?2.Moonraker无法连接Klipper时如何重置服务配置?3.如何通过Klipper日志诊断串口通信故障?[^1]注意:如果问题与微软错误代码14080相关(引用[1]),这通常与Windows系统程序集标识的XML命名规则冲突有关,**不适用于Klipper连接问题**。我们应专注于打印机控制软件本身的故障排查。 [^1]: Klipper官方文档:https://www.klipper3d.org/</think>### 🔧 Klippy主机连接错误排查指南 当出现"Printer is not ready: The klippy host software is attempting to connect"错误时,表明Moonraker(Web接口服务)无法与Klippy(打印机固件核心)建立通信。以下是系统性解决方案: --- #### ⚙️ **核心排查步骤** 1. **检查Klippy服务状态** SSH登录主机执行: ```bash sudo systemctl status klipper ``` - ✅ **正常状态**:`active (running)` - ❌ **异常处理**: ```bash sudo systemctl restart klipper # 重启服务 journalctl -u klipper -n 50 # 查看最近50条日志 ``` 2. **验证Unix域套接字** Klippy默认通过`/tmp/printer`与Moonraker通信: ```bash ls -l /tmp/printer # 检查套接字是否存在 ``` - 若不存在:Klippy启动失败(检查`/tmp/klippy.log`) - 权限问题:`sudo chmod 777 /tmp/printer` 3. **Moonraker配置检查** 确认`moonraker.conf`中`[server]`段配置正确: ```ini [server] host: 0.0.0.0 port: 7125 klippy_uds_address: /tmp/printer # 关键路径 ``` 4. **硬件连接诊断** ```bash ls /dev/serial/by-id/* # 列出所有串口设备 ``` - 无输出:USB线松动或MCU未供电 - 更新`printer.cfg`中的`serial`值: ```ini [mcu] serial: /dev/serial/by-id/usb-Klipper_stm32f407xx_12345-if00 ``` --- #### 🔥 **高级故障处理** **问题场景**:服务重启后仍无法连接 **解决方案**: 1. **清除运行时文件**: ```bash sudo rm /tmp/printer /tmp/klippy.log sudo systemctl restart klipper ``` 2. **MCU通信测试**: 在`printer.cfg`添加调试命令: ```ini [respond] type: command ``` 通过终端发送: ```bash echo 'M118 TEST' > /tmp/printer ``` - ✅ 成功:打印机会发出"TEST"提示 - ❌ 失败:硬件层问题(检查USB线/供电) 3. **依赖库冲突**: 重装Klipper环境: ```bash cd ~/klipper virtualenv -p python3 venv ./venv/bin/pip install -r scripts/klippy-requirements.txt ``` --- #### 📊 错误原因概率分布 | 原因 | 概率 | 特征日志 | |---------------------|--------|--------------------------| | Klippy服务崩溃 | 45% | `klippy.log`段错误 | | 套接字权限问题 | 30% | `Permission denied` | | MCU通信中断 | 15% | `SerialException` | | 配置文件错误 | 10% | `Config error` | --- #### 💡 预防措施 1. **看门狗自动重启** 在`moonraker.conf`启用: ```ini [watchdog] enable: true ``` 2. **资源监控** 安装`htop`实时观察CPU/内存: ```bash sudo apt install htop htop -d 10 ``` 3. **固件备份** 定期备份MCU固件: ```bash make flash FLASH_DEVICE=/dev/ttyACM0 backup=backup.bin ``` --- #### ❓ 相关问题 1. 如何通过Klipper日志分析"MCU unable to connect"错误?[^1] 2. Moonraker的`klippy_uds_address`参数在不同Linux发行版中有何差异? 3. 树莓派USB供电不足导致通信中断的解决方案? 4. 如何配置Klipper在启动时自动加载备份固件? 5. 系统日志`journalctl`中哪些关键字段标识Klippy服务异常?[^1] [^1]: Klipper官方调试文档: https://www.klipper3d.org/Debugging.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值