Deploying to gh-pages from @ Klipper3d/klipper@a42f615881 🚀

This commit is contained in:
KevinOConnor 2022-12-04 00:06:31 +00:00
parent 147dbb22fc
commit 975322738e
29 changed files with 364 additions and 364 deletions

View file

@ -1457,7 +1457,7 @@
<li>Ha a modulnak hozzáférésre van szüksége a rendszer időzítéséhez vagy külső fájlleírókhoz, akkor a <code>printer.get_reactor()</code> segítségével hozzáférhetünk a globális "event reactor" osztályhoz. Ez a reactor osztály lehetővé teszi az időzítők ütemezését, a fájlleírók bemenetének várakozását, valamint a gazdakód "sleep" használatát.</li>
<li>Ne használj globális változókat. Minden állapotot a <code>load_config()</code> függvény által visszaadott nyomtató objektumban kell tárolni. Ez azért fontos, mert ellenkező esetben a RESTART parancs nem az elvártaknak megfelelően fog működni. Szintén hasonló okokból, ha bármilyen külső fájl (vagy foglalat) megnyílt, akkor mindenképpen regisztráljunk egy "klippy:disconnect" eseménykezelőt, és zárjuk be őket ebből a visszahívásból.</li>
<li>Kerüld a más nyomtató objektumok belső tagváltozóinak elérését (vagy az aláhúzással kezdődő metódusok hívását). Ennek a konvenciónak a betartása megkönnyíti a jövőbeli változások kezelését.</li>
<li>Javasoljuk, hogy a Python osztályok Python konstruktorában minden tagváltozóhoz értéket rendeljen. (És ezért kerülje a Python azon képességének kihasználását, hogy dinamikusan hozzon létre új tagváltozókat.)</li>
<li>Javasoljuk, hogy a Python osztályok Python konstruktorában minden tagváltozóhoz értéket rendelj. (És ezért kerüld a Python azon képességének kihasználását, hogy dinamikusan hozzon létre új tagváltozókat.)</li>
<li>Ha egy Python változónak lebegőpontos értéket kell tárolnia, akkor ajánlott mindig lebegőpontos konstansokkal hozzárendelni és kezelni a változót (és soha ne használjunk egészértékű konstansokat). Például részesítsük előnyben a <code>self.speed = 1.</code> értéket a <code>self.speed = 1</code> értékkel szemben, és részesítsük előnyben a <code>self.speed = 2 értéket. * x</code> a <code>self.speed = 2 * x</code> helyett. A lebegőpontos értékek következetes használatával elkerülhetők a Python-típuskonverziók nehezen hibakereshető furcsaságai.</li>
<li>Ha a modult a Klipper főkódjába való beépítésre küldöd, mindenképpen helyezz el egy szerzői jogi megjegyzést a modul tetején. Az előnyben részesített formátumot lásd a meglévő moduloknál.</li>
</ul>
@ -1488,8 +1488,8 @@
</ol>
<p>További kódolási tippek:</p>
<ol>
<li>Kerülje a "C bitfields" használatát az IO regiszterek eléréséhez; részesítse előnyben a 32 bites, 16 bites vagy 8 bites egész számok közvetlen olvasási és írási műveleteit. A C nyelvi specifikációk nem határozzák meg egyértelműen, hogy a fordítónak hogyan kell megvalósítania a C bitmezőket (pl. endianness és bitkiosztás), és nehéz meghatározni, hogy milyen IO műveletek történnek egy C bitmező olvasásakor vagy írásakor.</li>
<li>Inkább írjon explicit értékeket az IO regiszterekbe, minthogy olvasás-módosítás-írás műveleteket használj. Azaz, ha egy olyan IO-regiszterben frissítünk egy mezőt, ahol a többi mező értékei ismertek, akkor előnyösebb a regiszter teljes tartalmát explicit módon kiírni. Az explicit írások kisebb, gyorsabb és könnyebben hibakereshető kódot eredményeznek.</li>
<li>Kerüld a "C bitfields" használatát az IO regiszterek eléréséhez; részesítsd előnyben a 32 bites, 16 bites vagy 8 bites egész számok közvetlen olvasási és írási műveleteit. A C nyelvi specifikációk nem határozzák meg egyértelműen, hogy a fordítónak hogyan kell megvalósítania a C bitmezőket (pl. endianness és bitkiosztás), és nehéz meghatározni, hogy milyen IO műveletek történnek egy C bitmező olvasásakor vagy írásakor.</li>
<li>Inkább írj explicit értékeket az IO regiszterekbe, minthogy olvasás-módosítás-írás műveleteket használj. Azaz, ha egy olyan IO-regiszterben frissítünk egy mezőt, ahol a többi mező értékei ismertek, akkor előnyösebb a regiszter teljes tartalmát explicit módon kiírni. Az explicit írások kisebb, gyorsabb és könnyebben hibakereshető kódot eredményeznek.</li>
</ol>
<h2 id="koordinata-rendszerek">Koordináta rendszerek<a class="headerlink" href="#koordinata-rendszerek" title="Permanent link">&para;</a></h2>
<p>A Klipper belsőleg elsősorban a nyomtatófej helyzetét követi cartesian koordinátákban, amelyek a konfigurációs fájlban megadott koordináta rendszerhez viszonyítva vannak. Ez azt jelenti, hogy a Klipper kód nagy része soha nem tapasztal koordináta rendszer változást. Ha a felhasználó az origó megváltoztatását kéri (pl. egy <code>G92</code> parancsal), akkor ezt a hatást a jövőbeli parancsok elsődleges koordináta rendszerre történő átváltásával érjük el.</p>
@ -1506,16 +1506,16 @@ Recv: // gcode homing: X:0.000000 Y:0.000000 Z:0.000000
<p>Az "MCU" pozíció (<code>stepper.get_mcu_position()</code> a kódban) a mikrokontroller által pozitív irányban kiadott lépések száma mínusz a mikrokontroller utolsó resetelése óta negatív irányban kiadott lépések száma. Ha a gép a lekérdezéskor mozgásban van, akkor a jelentett érték tartalmazza a mikrokontrollerben pufferelt lépéseket, de nem tartalmazza a look-ahead sorban lévő lépéseket.</p>
<p>A "stepper" pozíció (<code>stepper.get_commanded_position()</code>) az adott léptető pozíciója, ahogyan azt a kinematikai kód követi. Ez általában megfelel a kocsinak a sín mentén a konfigurációs fájlban megadott position_endstop-hoz viszonyított pozíciójának (mm-ben). (Egyes kinematikák a léptetők pozícióját milliméter helyett radiánban követik.) Ha a gép a lekérdezéskor mozgásban van, akkor a jelentett érték tartalmazza a mikrokontrollerben pufferelt mozgásokat, de nem tartalmazza a look-ahead sorban lévő mozgásokat. Használhatjuk a <code>toolhead.flush_step_generation()</code> vagy <code>toolhead.wait_moves()</code> hívásokat a look-ahead és a lépésgeneráló kód teljes kiürítéséhez.</p>
<p>A "kinematic" pozíció (<code>kin.calc_position()</code>) a nyomtatófej "stepper" pozíciókból származtatott cartesian pozíciója, és a konfigurációs fájlban megadott koordinátarendszerhez képest relatív. Ez eltérhet a kért cartesian pozíciótól a léptetőmotorok szaggatottsága miatt. Ha a gép a "stepper" pozíciók felvételekor mozgásban van, akkor a jelentett érték tartalmazza a mikrokontrollerben pufferelt mozgásokat, de nem tartalmazza a look-ahead várólistán lévő mozgásokat. Használhatjuk a <code>toolhead.flush_step_generation()</code> vagy <code>toolhead.wait_moves()</code> hívásokat a look-ahead és a lépésgeneráló kód teljes kiürítéséhez.</p>
<p>A "toolhead" pozíció (<code>toolhead.get_position()</code>) a nyomtatófej utolsó kért pozíciója cartesian koordinátákban a konfigurációs fájlban megadott koordinátarendszerhez képest. Ha a gép a lekérdezés kiadásakor mozgásban van, akkor a jelentett érték tartalmazza az összes kért mozgást (még azokat is, amelyek a pufferben vannak és a motorvezérlőknek való kiadásra várnak).</p>
<p>A "gcode" pozíció a <code>G1</code> (vagy <code>G0</code>) parancs utolsó kért pozíciója cartesian koordinátákban, a konfigurációs fájlban megadott koordinátarendszerhez képest. Ez eltérhet a "toolhead" pozíciótól, ha egy G-kód transzformáció (pl. bed_mesh, bed_tilt, skew_correction) van érvényben. Ez eltérhet az utolsó <code>G1</code> parancsban megadott tényleges koordinátáktól, ha a G-kód origója megváltozott (pl, <code>G92</code>, <code>SET_GCODE_OFFSET</code>, <code>M221</code>). A <code>M114</code> parancs (<code>gcode_move.get_status()['gcode_position']</code>) az aktuális G-kód koordinátarendszerhez viszonyított utolsó G-kód pozíciót jelenti.</p>
<p>A "gcode base" a G-kód origójának helye cartesian koordinátákban a konfigurációs fájlban megadott koordinátarendszerhez képest. Az olyan parancsok, mint a <code>G92</code>, <code>SET_GCODE_OFFSET</code> és <code>M221</code> módosítják ezt az értéket.</p>
<p>A "gcode homing" az a hely, amelyet a G-kód origójaként (a konfigurációs fájlban megadott koordinátarendszerhez viszonyított cartesian koordinátákban) a <code>G28</code> home parancs után használni kell. A <code>SET_GCODE_OFFSET</code> parancs megváltoztathatja ezt az értéket.</p>
<p>A "kinematic" pozíció (<code>kin.calc_position()</code>) a nyomtatófej "stepper" pozíciókból származtatott cartesian pozíciója, és a konfigurációs fájlban megadott koordináta rendszerhez képest relatív. Ez eltérhet a kért cartesian pozíciótól a léptetőmotorok szaggatottsága miatt. Ha a gép a "stepper" pozíciók felvételekor mozgásban van, akkor a jelentett érték tartalmazza a mikrokontrollerben pufferelt mozgásokat, de nem tartalmazza a look-ahead várólistán lévő mozgásokat. Használhatjuk a <code>toolhead.flush_step_generation()</code> vagy <code>toolhead.wait_moves()</code> hívásokat a look-ahead és a lépésgeneráló kód teljes kiürítéséhez.</p>
<p>A "toolhead" pozíció (<code>toolhead.get_position()</code>) a nyomtatófej utolsó kért pozíciója cartesian koordinátákban a konfigurációs fájlban megadott koordináta rendszerhez képest. Ha a gép a lekérdezés kiadásakor mozgásban van, akkor a jelentett érték tartalmazza az összes kért mozgást (még azokat is, amelyek a pufferben vannak és a motorvezérlőknek való kiadásra várnak).</p>
<p>A "gcode" pozíció a <code>G1</code> (vagy <code>G0</code>) parancs utolsó kért pozíciója cartesian koordinátákban, a konfigurációs fájlban megadott koordináta rendszerhez képest. Ez eltérhet a "toolhead" pozíciótól, ha egy G-kód transzformáció (pl. bed_mesh, bed_tilt, skew_correction) van érvényben. Ez eltérhet az utolsó <code>G1</code> parancsban megadott tényleges koordinátáktól, ha a G-kód origója megváltozott (pl, <code>G92</code>, <code>SET_GCODE_OFFSET</code>, <code>M221</code>). A <code>M114</code> parancs (<code>gcode_move.get_status()['gcode_position']</code>) az aktuális G-kód koordináta rendszerhez viszonyított utolsó G-kód pozíciót jelenti.</p>
<p>A "gcode base" a G-kód origójának helye cartesian koordinátákban a konfigurációs fájlban megadott koordináta rendszerhez képest. Az olyan parancsok, mint a <code>G92</code>, <code>SET_GCODE_OFFSET</code> és <code>M221</code> módosítják ezt az értéket.</p>
<p>A "gcode homing" az a hely, amelyet a G-kód origójaként (a konfigurációs fájlban megadott koordináta rendszerhez viszonyított cartesian koordinátákban) a <code>G28</code> home parancs után használni kell. A <code>SET_GCODE_OFFSET</code> parancs megváltoztathatja ezt az értéket.</p>
<h2 id="ido">Idő<a class="headerlink" href="#ido" title="Permanent link">&para;</a></h2>
<p>A Klipper működésének alapvető eleme az órák, időpontok és időbélyegek kezelése. A Klipper a nyomtatón végrehajtott műveleteket a közeljövőben bekövetkező események ütemezésével hajtja végre. Például egy ventilátor bekapcsolásához a kód ütemezheti egy GPIO-tű változását 100ms alatt. Ritkán fordul elő, hogy a kód azonnali műveletet próbál végrehajtani. Ezért az idő kezelése a Klipperben kritikus fontosságú a helyes működés szempontjából.</p>
<p>A Klipper működésének alapvető eleme az órák, időpontok és időbélyegek kezelése. A Klipper a nyomtatón végrehajtott műveleteket a közeljövőben bekövetkező események ütemezésével hajtja végre. Például egy ventilátor bekapcsolásához a kód ütemezheti egy GPIO-tű változását 100ms alatt. Ritkán fordul elő, hogy a kód azonnali műveletet próbál végrehajtani. Ezért az idő kezelése a Klipper-ben kritikus fontosságú a helyes működés szempontjából.</p>
<p>A Klipper gazdaszoftverben háromféle időtípust követhetünk nyomon:</p>
<ul>
<li>Rendszeridő. A rendszeridő a rendszer monoton óráját használja. Ez egy lebegőpontos szám, amelyet másodpercként tárolnak, és (általában) a gazdaszámítógép utolsó indításakor. A rendszeridők korlátozottan használhatók a szoftverben. Elsősorban az operációs rendszerrel való interakció során használják őket. Az állomáskódon belül a rendszeridőket gyakran az <em>eventtime</em> vagy <em>curtime</em> nevű változók tárolják.</li>
<li>Rendszeridő. A rendszeridő a rendszer monoton óráját használja. Ez egy lebegőpontos szám, amelyet másodpercként tárol, és (általában) a gazdaszámítógép utolsó indításakor. A rendszeridők korlátozottan használhatók a szoftverben. Elsősorban az operációs rendszerrel való interakció során használják őket. Az állomáskódon belül a rendszeridőket gyakran az <em>eventtime</em> vagy <em>curtime</em> nevű változók tárolják.</li>
<li>Nyomtatási idő. A nyomtatási idő a mikrokontroller fő órájához szinkronizálódik az ("[mcu]" config) szakaszban meghatározott mikrokontrollerhez. Ez egy másodpercben tárolt lebegőpontos szám, és a fő MCU utolsó újraindításának időpontjához viszonyítva van. Lehetőség van a "nyomtatási idő"-ről a fő mikrokontroller hardveres órájára való átváltásra. A nyomtatási időnek az MCU-val való megszorzásával a statikusan konfigurált frekvenciával. A magas szintű gazdakód szinte minden fizikai művelet (pl. fejmozgás, fűtésváltás stb.) kiszámításához nyomtatási időt használ. A gazdakódon belül a nyomtatási időket általában a <em>print_time</em> vagy <em>move_time</em> nevű változókban tárolják.</li>
<li>MCU óra. Ez az egyes mikrovezérlők hardveres óraszámlálója. Egész számként van tárolva, frissítési gyakorisága az adott mikrovezérlő frekvenciájához viszonyított. A gazdaszoftver belső idejét lefordítja órákra, mielőtt továbbítaná az MCU-nak. Az MCU kód mindig csak az óra ketyegésében követi az időt. A gazdagép kódon belül az óraértékeket 64 bites egész számként követi nyomon, míg az MCU kód 32 bites egész számokat használ. A gazdagép kódon belül az órák általában <em>clock</em> vagy <em>tick</em> nevet tartalmazó változókban tárolódnak.</li>
</ul>
@ -1523,7 +1523,7 @@ Recv: // gcode homing: X:0.000000 Y:0.000000 Z:0.000000
<p>Néhány dolog, amire figyelni kell a kód áttekintésekor:</p>
<ul>
<li>32 bites és 64 bites órajelek: A sávszélesség csökkentése és a mikrokontroller hatékonyságának javítása érdekében a mikrokontroller órajeleit 32 bites egész számokként követik. Két órajel összehasonlításakor az MCU kódban mindig a <code>timer_is_before()</code> függvényt kell használni, hogy az egész számok átfordítását megfelelően kezeljük. A gazdaszoftver a 32 bites órajeleket 64 bites órajelekké alakítja át azáltal, hogy hozzáadja az utolsó kapott MCU időbélyegző magasrendű bitjeit. Egyetlen MCU-tól érkező üzenet sem lehet 2^31 órajelnél több a jövőben vagy a múltban, így ez az átalakítás soha nem félreérthető. A gazdagép a 64 bites órajelekről 32 bites órajelekre konvertál a magasrendű bitek egyszerű lefaragásával. Annak érdekében, hogy ez az átalakítás ne legyen kétértelmű, a <strong>klippy/chelper/serialqueue.c</strong> kód addig puffereli az üzeneteket, amíg azok 2^31 órajelen belül vannak a célidőhöz képest.</li>
<li>Több mikrovezérlő: A gazdaszoftver támogatja több mikrovezérlő használatát egyetlen nyomtatón. Ebben az esetben minden mikrokontroller "MCU órajelét" külön-külön követi. A clocksync.py kód kezeli a mikrovezérlők közötti óraeltolódást a "nyomtatási időről" az "MCU órára" történő átalakítás módjának módosításával. A másodlagos MCU-nál az ebben az átalakításban használt MCU frekvencia rendszeresen frissül, hogy figyelembe vedd a mért csúszást.</li>
<li>Több mikrovezérlő: A gazdaszoftver támogatja több mikrovezérlő használatát egyetlen nyomtatón. Ebben az esetben minden mikrokontroller "MCU órajelét" külön-külön követi. A clocksync.py kód kezeli a mikrovezérlők közötti óraeltolódást a "nyomtatási időről" az "MCU órára" történő átalakítás módjának módosításával. A másodlagos MCU-nál az ebben az átalakításban használt MCU frekvencia rendszeresen frissül, hogy figyelembe vegye a mért csúszást.</li>
</ul>