Deploying to gh-pages from @ Klipper3d/klipper@434770eaf9 🚀

This commit is contained in:
KevinOConnor
2024-05-06 00:04:31 +00:00
parent 1abfa00e23
commit 43cff61d2d
58 changed files with 567 additions and 482 deletions

View File

@@ -1484,21 +1484,23 @@
<p>典型的印表機運動始於klipper上位機接收到"G1"命令,並在微控制器發出對應的步進脈衝結束。本節將簡述典型運動命令的程式碼流。<a href="Kinematics.html">運動學</a>文件將更為細緻的描述運動的機械原理。</p>
<ul>
<li>移動命令的處理始於gcode.py該程式碼將G程式碼轉化為內部呼叫。G1命令將呼叫klippy/extras/gcode_move.py中的cmd_G1()函式。gcode_move.py中的程式碼將處理 原點變換G92絕對座標模式G90和單位變換如F6000=100mm/s。一個移動命令的處理路徑為<code>_process_data() -&gt; _process_commands() -&gt; cmd_G1()</code>。最終將呼叫ToolHead類的方法實現移動 <code>cmd_G1() -&gt; ToolHead.move()</code></li>
<li>The ToolHead class (in toolhead.py) handles "look-ahead" and tracks the timing of printing actions. The main codepath for a move is: <code>ToolHead.move() -&gt; LookAheadQueue.add_move() -&gt; LookAheadQueue.flush() -&gt; Move.set_junction() -&gt; ToolHead._process_moves()</code>.<ul>
<li>
<p>The ToolHead class (in toolhead.py) handles "look-ahead" and tracks the timing of printing actions. The main codepath for a move is: <code>ToolHead.move() -&gt; LookAheadQueue.add_move() -&gt; LookAheadQueue.flush() -&gt; Move.set_junction() -&gt; ToolHead._process_moves()</code>.</p>
<ul>
<li>ToolHead.move()將建立一個Move()對像實例其中將包含移動的參數在笛卡爾空間中並這些參數以mm和s為單位</li>
<li>kinematics類將檢查每個運動命令<code>ToolHead.move() -&gt; kin.check_move()</code>。各種kinematics類存放于 klippy/kinematics/ 目錄。check_move()能在運動命令不合理時拋出錯誤。如果 check_move()成功,這意味著印表機必定能完成運動命令。</li>
<li>LookAheadQueue.add_move() places the move object on the "look-ahead" queue.</li>
<li>LookAheadQueue.flush() determines the start and end velocities of each move.</li>
<li>Move.set_junction()實現移動的「梯形加減速trapezoid generator」。「梯形加減速」將每次移動拆分為三部分恒加速度加速階段、恒速度階段、恒加速度減速階段。所有移動均含有上述三個階段但單個階段的持續時間可能為0。</li>
<li>當ToolHead._process_moves()被呼叫時,一次移動的所有要素均已就緒——移動的起始位置、結束位置、加速度、起始/巡航/結束速度、以及起始/巡航/結束的距離。所有資訊以笛卡爾座標的形式儲存在Move()實例中單位為mm和s。</li>
</ul>
</li>
<li>Klipper uses an <a href="https://en.wikipedia.org/wiki/Root-finding_algorithm">iterative solver</a> to generate the step times for each stepper. For efficiency reasons, the stepper pulse times are generated in C code. The moves are first placed on a "trapezoid motion queue": <code>ToolHead._process_moves() -&gt; trapq_append()</code> (in klippy/chelper/trapq.c). The step times are then generated: <code>ToolHead._process_moves() -&gt; ToolHead._advance_move_time() -&gt; ToolHead._advance_flush_time() -&gt; MCU_Stepper.generate_steps() -&gt; itersolve_generate_steps() -&gt; itersolve_gen_steps_range()</code> (in klippy/chelper/itersolve.c). The goal of the iterative solver is to find step times given a function that calculates a stepper position from a time. This is done by repeatedly "guessing" various times until the stepper position formula returns the desired position of the next step on the stepper. The feedback produced from each guess is used to improve future guesses so that the process rapidly converges to the desired time. The kinematic stepper position formulas are located in the klippy/chelper/ directory (eg, kin_cart.c, kin_corexy.c, kin_delta.c, kin_extruder.c).</li>
<li>需要注意,擠出機有獨特的運動學模型,使用<code>ToolHead._process_moves() -&gt; PrinterExtruder.move()</code>類繼續寧處理。儘管擠出機使用了獨立的Move()類由於Move() 實例包含了實際運動的時間,並且脈衝時間的裝置是定時發送到微控制器上,因此由擠出機類產生的步進運動將與列印頭的運動同步。</li>
<li>當迭代計算器計算出步進時長后,計算結果將被置於一個陣列中:<code>itersolve_gen_steps_range() -&gt; stepcompress_append()</code> (位於 klippy/chelper/stepcompress.c)。陣列(結構體 stepcompress.queue)儲存每一步對應的微處理器時鐘計數器時間。上述的「微處理器計數器」的值指的是微處理器硬體上的計數器——其值基於微處理器最後一次上電而定。</li>
<li>接下來重要的是,對步進數據進行壓縮: <code>stepcompress_flush() -&gt; compress_bisect_add()</code> (位於 klippy/chelper/stepcompress.c)。上述程式碼將基於前述的 步進時間列表 產生和編碼一系列的微控制器"queue_step"(佇列步進)命令。這些"queue_step"命令將被佇列化,優先處理,併發送到微控制器中(上位機通過 stepcompress.c:steppersync下位機通過serialqueue.c:serialqueue))。</li>
<li>在微控制器queue_step命令將經由 src/command.c 處理。改程式碼將對命令進行解釋,並呼叫 <code>command_queue_step()</code>。command_queue_step()位於src/stepper.c將每個queue_step命令的參數附加到對應的步進佇列中。正常執行下一「步」將在其執行前100ms被解釋並加入佇列。最後通過 <code>stepper_event()</code>結束步進事件的產生。該程式碼會基於queue_step命令的參數產生步進脈衝並安排下一次步進脈衝產生的時間。硬體定時器發出中斷在設定的事件呼叫相應的stepper_event。queue_step命令的參數包含「間隔」、「計數」、「增量」。總體而言stepper_event()將執行下列內容,「記錄時間」: <code>do_step(); next_wake_time = last_wake_time + interval; interval += add;</code></li>
</ul>
</li>
</ul>
<p>上面的運動過程看似十分複雜。然而真正需要注意的只有ToolHead列印頭 和 kinematic (運動學)類,上述兩個類的程式碼確定了運動執行和定時。剩下的程式碼僅用於處理通訊和管道的問題。</p>
<h2 id="_6">新增上位機模組<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h2>
<p>Klippy上位機的主程式能對模組進行熱載入。如果設定檔案中出現了類似"[my_module]" 的欄位名,程式會自動嘗試載入 klippy/extras/my_module.py 檔案內的模組。Klipper推薦使用上述方式擴充套件Klipper功能。</p>