最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

在klipper固件G代碼宏中執(zhí)行if條件判斷與for變量循環(huán)

2023-09-18 07:33 作者:晚杯琦禮  | 我要投稿

Klipper固件的G代碼宏使用了名為Jinja(神社)的模板作為實(shí)現(xiàn)G代碼編程的執(zhí)行器

本教程旨在提供比較容易看懂的if條件判斷教學(xué),讓您能夠在您的機(jī)器上編寫一些更加便利的功能

本教程的文字版本在圖片之后,您可以將其復(fù)制到更方便編程的軟件內(nèi)查看

字確實(shí)太小了




#jinja的數(shù)據(jù)類型種類與python相似,分別有布爾,字符,整數(shù),浮點(diǎn)數(shù),字典


{% 機(jī)器是否激活 = True ? ? ? ? %}

#布爾可以理解為開關(guān)的兩種狀態(tài),一個是打開,一個是關(guān)閉,可以實(shí)現(xiàn)機(jī)器狀態(tài)的檢測,能夠傳遞開關(guān)是否閉合或機(jī)器是否到達(dá)指定位置的檢測結(jié)果


{% 機(jī)器反饋信息 = '耗材已裝填' %}

#字符的內(nèi)容可以是任何狀態(tài)的名稱或任何模塊的名稱,比如filament_switch_sensor(耗材傳感器)可以放在字符里,

#這樣機(jī)器就可以把之后的條件判斷應(yīng)用到這個字符所代表的模塊上


{% 目標(biāo)材料編號 = 2 ? ? ? ? ? ?%}

#整數(shù)是最基礎(chǔ)的數(shù)字,一般用來表示編號或順序,整數(shù)雖然也可以拿來指定數(shù)值,比如指定噴頭溫度升高到200度,

#但整數(shù)無法附帶小數(shù),整數(shù)可以與整數(shù)做數(shù)學(xué)運(yùn)算,但整數(shù)不能和浮點(diǎn)數(shù)做運(yùn)算,因?yàn)樗麄兊念愋蛯τ跈C(jī)器來說完全不一樣,機(jī)器會拒絕執(zhí)行這種命令


{% 噴頭目標(biāo)溫度 = 300.0 ? ? ? ?%}

?#浮點(diǎn)數(shù)擁有整數(shù)的一部分基本功能,可以表示編號可以表示順序也可以用來指定數(shù)值,

?#但浮點(diǎn)數(shù)可以附帶任意數(shù)量的小數(shù),您可以用浮點(diǎn)數(shù)命令擠出機(jī)精確的擠出 0.00123456789 毫米長度的材料,

?#浮點(diǎn)數(shù)與整數(shù)的數(shù)據(jù)結(jié)構(gòu)完全不同,30與30.0對于編程語言來說完全就是兩種東西


#您可以將整數(shù)與浮點(diǎn)數(shù)互相轉(zhuǎn)換,編程語言默認(rèn)會用四舍五入的方式來將浮點(diǎn)數(shù)轉(zhuǎn)換為最接近的整數(shù)

#比如:

{% set 17.356 = X ?|int %}

#17.356是我們要轉(zhuǎn)換的對象,而這個未知的X是我們想要的結(jié)果,X后面的 |int 是一個轉(zhuǎn)換器,在任何整數(shù)或小數(shù)后加上 |int 都可以把這個數(shù)字轉(zhuǎn)換成整數(shù)

#那么變量X輸出的結(jié)果為

{% X = 17 %}

#可以看到小數(shù)點(diǎn)后面的數(shù)字全被四舍五入處理掉了


#同理,編程語言內(nèi)還有另一個將整數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)的工具,他的符號是 |float ,用法與 |int 一樣

#例如:

{% set 30 = X ?|float %}

#輸出結(jié)果為

{% X = 30.0 %}

#對于人類來說30與30.0一模一樣,但對于機(jī)器來說,加上了一個小數(shù)點(diǎn)的話他就可以理解這個數(shù)字是整數(shù)而不是小數(shù),

#所以現(xiàn)在你可以把被轉(zhuǎn)換的數(shù)字與其他浮點(diǎn)數(shù)做一些加減乘除之類的事情了


#if條件判斷模板

[gcode_macro SMPLE ]

gcode:

?{% set tooltemp = 300.0 ?%}


?{% if ?tooltemp <= printer.extruder.temperature ?%}

? ?M118 熱端的溫度還不夠熱!

?{% else %}

? ?M118 熱端溫度現(xiàn)在已經(jīng)足夠熱了

?{% endif %}


#您可以直接把這一段宏作為一個基礎(chǔ)模板,將里面的內(nèi)容改成符合您需求的樣子就能開始用了

#條件判斷與其他所有編程內(nèi)容都只能運(yùn)行在G代碼宏內(nèi),如果想要直接在打印機(jī)操作界面的命令行內(nèi)輸入這些邏輯判斷,那樣是行不通的

#接下來是內(nèi)容拆解


[gcode_macro SMPLE ]

#這是一個宏的標(biāo)題,方括號內(nèi)的內(nèi)容會被識別為一個功能,gcode_macro 這個詞能夠告訴klipper這是一個G代碼宏

#中間空一個空格隔開,后面的詞就是這個宏的名字,名字可以是任何語言任何字符,名字的大小寫對于klipper來說都一樣,所以smple與SMPLE對于klipper來說都一樣

#名字的內(nèi)容雖然不重要,但還是要遵循一個規(guī)則,那就是名稱中的數(shù)字一定只能放在名稱的最后面,耗材插槽1 這個名字對于klipper來說可以接受,但 1號耗材插槽 這個名字就是不可接受的


gcode:

#這個詞告訴klipper“從現(xiàn)在開始,到下一個宏標(biāo)題為止,中間的內(nèi)容就都是需要執(zhí)行的宏了”,宏必須要往內(nèi)空一格才能被正確識別

#比如:

{% set tooltemp = 300.0 ?%}#像這樣直接頂?shù)筋^的就無法被接受

?{% set tooltemp = 300.0 ?%}#但像這樣最前面空一格再開始就是正確的

?#往內(nèi)縮一格就能告訴klipper,這往內(nèi)縮縮一行的就是上面那行的子集

?#而這個奇怪的“ {% ”和“ %} ” 這兩個符號能夠告訴klipper,“這兩個符號中間的東西與普通的G代碼不同,你要把它當(dāng)作邏輯判斷來執(zhí)行”


?{% set tooltemp = 300.0 ?%}

?#這一行能夠創(chuàng)建一個叫做 tooltemp 的變量并且為他賦予數(shù)值,tooltemp只是一個無關(guān)緊要的名字,你可以改成任何你喜歡的字母,而這個變量只會在現(xiàn)在這個宏里面起作用

?#這中間的等號可以告訴klipper“從現(xiàn)在開始,等號前面的東西就與等號后面的東西完全相等了!”

?#所以對于klipper來說,之后出現(xiàn)的所有 tooltemp 都可以被看作是 300.0


?{% if ?tooltemp <= printer.extruder.temperature ?%}

? ?M118 熱端的溫度還不夠熱!

?{% else %}

? ?M118 熱端溫度現(xiàn)在已經(jīng)足夠熱了

?{% endif %}

?#{% endif %}這一句沒什么特別的地方,每個循環(huán)都需要這一句來告訴kliper這次的判斷到哪里為止

?#M118是一個基礎(chǔ)的G代碼,當(dāng)開啟打印機(jī)開啟[respond]的功能以后,他可以把他這一行的內(nèi)容回傳到打印機(jī)控制面板的命令行里面,

?#您可以把這個M118換成任何你想要執(zhí)行的G代碼,所以無需理會我現(xiàn)在這個模板的G代碼內(nèi)容


?#klipper的條件判斷開始是從這一句 {% if ?tooltemp <= printer.extruder.temperature ?%} 開始

?# ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?^ ? ? ^ ? ^^^^^^^^^^^^^^^^^^^^^^^^^

?# tooltemp是我們一開始創(chuàng)建的一個變量,而這個<= 小于等于號是一個基礎(chǔ)的條件判斷符號,后面的一串是klipper內(nèi)部狀態(tài)的訪問路徑,

?#可以訪問的狀態(tài)有一個預(yù)先做好的列表,網(wǎng)址我會在后面放出來

?#把這句代碼翻譯成容易懂的樣子就是“{% 如果 這叫tooltemp的變量所代表的值 ?小于等于 打印機(jī).擠出機(jī).擠出機(jī)熱端溫度 %}”

?#所以你可以把中間的判斷符號換成任何你需要的符號,比如“==”代表是否完全相等,“!=”代表是否完全不相等,“<=”就是小于或等于,而“>=”就是大于或等于

?#當(dāng)滿足判斷條件時,那現(xiàn)在這個模板中的例子來說,這個模板會檢查一次噴頭溫度是否小于300度,

?#假如現(xiàn)在噴頭實(shí)際上溫度還沒到300度,那么判斷就會成立,噴頭現(xiàn)在的狀態(tài)滿足小于300度這個條件,程序會把開始執(zhí)行后面的代碼

?#假如我現(xiàn)在已經(jīng)把噴頭溫度升到超過300度以上了,那么機(jī)器檢測溫度時,噴頭小于300度這個條件就不成立,機(jī)器就不會執(zhí)行后面的代碼,而是開始執(zhí)行{% else %}這一句后面的代碼

?#而{% else %}這一句是可有可無的,如果程序里沒有{% else %},那也可以正常運(yùn)行,只不過當(dāng)判斷不成立時,機(jī)器就會直接跳過中間的代碼,轉(zhuǎn)而直接執(zhí)行{% endif %}之后的內(nèi)容


klipper可以查詢的基礎(chǔ)狀態(tài)列表在這里:

https://www.klipper3d.org/zh/Status_Reference.html#_2



#在klipper中執(zhí)行for循環(huán)


#基礎(chǔ)for循環(huán)模板


[gcode_macro cleaningnozzle ]

gcode:

?{% set looptime = 10 %}

?{% for counter in range(looptime|int) %}

? ?G0 x20

? ?G0 x0

? ?G0 y+{2 * counter}

?{% endfor %} ?

?#這個命令可以讓機(jī)器在XY軸歸零的情況下控制噴頭重復(fù)左右移動20毫米10次,并且每移動一次都會讓Y軸往前多走2毫米

?#接下來是內(nèi)容分解


[gcode_macro cleaningnozzle ]

gcode:

#與之前的內(nèi)容相同,這兩行是聲明G代碼宏開始的標(biāo)題


?{% set looptime = 10 %}

?#如果想要在klipper中實(shí)現(xiàn)定量循環(huán)的話,那就必須要先創(chuàng)建一個能夠代表循環(huán)總次數(shù)的變量

?#klipper的編程語言不允許直接使用像C代碼一樣的循環(huán)方式,在C代碼中只需要在循環(huán)條件中直接提供循環(huán)的總數(shù)就可以使用,而klipper不同


?{% for counter in range(looptime|int) %}

#這一行就是循環(huán)開始的聲明,for與if的功能類似,這可以告訴Klipper現(xiàn)在應(yīng)該轉(zhuǎn)到循環(huán)模式,重復(fù)循環(huán)多少次取決于循環(huán)總次數(shù)的值

#這個 counter 表示已經(jīng)經(jīng)歷的循環(huán)次數(shù),實(shí)際上你可以把他換成任何你喜歡的字母,同時也可以把他放在循環(huán)里面當(dāng)成一個變量來使用

#循環(huán)每經(jīng)歷一次counter的表示的數(shù)量就會增加1,而計(jì)數(shù)是從1開始的,所以如果循環(huán)要經(jīng)歷10次的話,

#他會從1開始,每經(jīng)歷一次循環(huán)就會在累積加上一次1,當(dāng)循環(huán)到第10次時他代表的值也會變成10


? ?G0 x20

? ?G0 x0

? ?G0 y+{2 * counter}

? ?#這些被夾在中間的內(nèi)容就是循環(huán)實(shí)際執(zhí)行的G代碼了,G0 X20讓噴頭向右移動20毫米,而G0 X0則讓噴頭再返回0點(diǎn)

? ?#Y軸每次多移動2毫米的效果就是由G0 y+{2 * counter}這一行實(shí)現(xiàn)的,用每次需要移動的距離乘以循環(huán)的次數(shù)就能做出這種效果

? ?#最開始第一次循環(huán)時,機(jī)器完成左右移動20毫米的命令以后就開始執(zhí)行Y軸移動的命令了,現(xiàn)在我們來看第一次循環(huán)時這一行里發(fā)生了什么

? ?#G0 y+{2 * 1} = G0 y2

? ?#我們將之前的counter變量轉(zhuǎn)換成實(shí)際上已經(jīng)循環(huán)過的次數(shù)時就得到了這樣的結(jié)果,y軸在第一次循環(huán)時按照命令從原點(diǎn)移動到了絕對距離為2mm的地方

? ?#再看看第二次

? ?#G0 y+{2 * 2} = G0 y4

? ?#第三次

? ?#G0 y+{2 * 3} = G0 y6

? ?#以此類推,這樣就能理解counter在for循環(huán)中發(fā)揮的作用了,這個變量能夠?qū)崿F(xiàn)非常多的功能,比如耗材開關(guān)按編號循環(huán)檢測,相似條件按順序檢測并輸出不同結(jié)果之類的


?{% endfor %}

?#加上這一句就能告訴klipper,本次循環(huán)到這里就結(jié)束了,同時這次簡短的教程到這里也已經(jīng)結(jié)束了,

?#真希望這篇不算精致的教程能夠用通俗的語言幫你理解klipper的基本命令,同時讓你能夠在自己的機(jī)器上實(shí)現(xiàn)想要的功能



?




在klipper固件G代碼宏中執(zhí)行if條件判斷與for變量循環(huán)的評論 (共 條)

分享到微博請遵守國家法律
浦城县| 常山县| 颍上县| 乐陵市| 安乡县| 揭东县| 府谷县| 怀仁县| 德钦县| 清水河县| 衡南县| 夏河县| 常山县| 大丰市| 建阳市| 苗栗市| 江口县| 彭州市| 青铜峡市| 吐鲁番市| 南宁市| 台北市| 柳林县| 来宾市| 鹤庆县| 深州市| 勃利县| 榕江县| 桦甸市| 三台县| 基隆市| 娄烦县| 达州市| 塔河县| 图们市| 信宜市| 阿拉善右旗| 公安县| 金山区| 正安县| 永登县|