V minulých dílech jsme pokračovali v základním nastavení pro LinuxCNC a blíže jsme si popsali konfigurační soubor .ini. Dnes se podíváme na to, jak je v LinuxCNC udělná logika řízení a jak je možné ji překonfigurovat.
.HAL
Zkratka HAL znamená Hardware Abstraction Layer a pro nás je to způsob jak efektivně složit řídící systém pomocí různých funkčních částí (u LinuxCNC se jim rika components) a sestavit jeden funkční celek.
Na pozadí nejsou ty komponenty nic jiného než programy v jazyce C nebo Python.
Ve své podstatě bych HAL přirovnal k tvorbě programů pro PLC, například kombinací jazyků Ladder a ST, kde k sobě připojujete ruzné signály a tvoříte jeden funkční celek. Mimochodem LinuxCNC má také komponentu Classicladder, kde je možné psát program přesně tak jako pro klasické PLC v jazyce Ladder a připojit ho k dalším zařízením přes Modbus.
Na začátku bych zmínil, že .hal a .ini jsou na sobě nezávislé, ale každá může využívat tu druhou.
Například hned první řádek v moje_masina.hal je
loadrt [KINS]KINEMATICS
V moje_masina.ini jsme si definovali
[KINS]
KINEMATICS = trivkins
Příkaz výše se tedy přeloží na
loadrt trivkins
Což mimochodem znamená: Načti real-time komponentu trivkins (komponenta pro výpočet triviální kinematiky), k tomu se ale dostaneme v zápěti.
Příkazy v HAL
HAL ma několik přikazů, které muzeme vyuzivat. My si probereme 4 základní, které se vyskytují i v námi vygenerovaném souboru moje_masina.hal.
Tyto příkazy je buď možné situovat do zmíněných .hal souborů nebo je možné s nimi pracovat, například za účelem rychlého testování, v příkazové řádce po spuštění programu HALRUN příkazem halrun.
loadrt
Příkaz loadrt načte real-time komponentu do běhu programu. Tyto komponenty jsou napsány v jazyce C.
Syntax
loadrt <komponenta> <volitelne_parametry>
Příklad
loadrt stepgen step_type=0,0,0
Význam
Načti 3x (pro 3 různe osy) komponentu stepgen (generátor kroku) s typem 0 (způsob generovani kroku)
addf
Příkaz addf přiřadí funkci z real-time komponenty do daného threadu (vlákna).
Při konfiguraci jsme si definovali 2 základni vlákna.
- Base-thread (vysokorychlostní vlákno) – toto vlákno by se mělo starat o generování pulzů nebo čtení sběrnic jako je paralelní port.
- Servo-thread (vlákno standartní rychlosti) – vlákno pro funkce, které nepotřebují tak rychlou odezvu. Například výpočet trajektorie, výpočty pro řízeni.
Konkrétně u konfigurace moje_masina máme nastaveno, že
Base-thread = 100 000 ns = 0.1 ms
Servo-thread = 1 000 000 ns = 1 ms
Syntax
addf <komponenta> <vlákno>
Příklad
addf stepgen.make-pulses base-thread
Význam
Přiřaď funkci make-pulses z komponenty stepgen do base-thread vlákna.
net
Příkaz net vytváří spojení mezi signálem a jedním nebo více piny. Jestliže signál neexistuje, tak je vytvořen.
Pro lepší pochopení logiky a směru signálu můžeme do příkazu psát šipky =>, <=, <=>.
Ty ale pro funkčnost HAL nehrají žádný význam. A při zpracovnání jsou vyfiltrovány pryč.
Přiřazování do signálu k pinům musí splňovat určitá pravidla. Například, že do vstupního pinu IN musí přicházet signál z pinu OUT nebo že na signálu nemůže být přiřazeno více OUT pinů.
Syntax
net název_signalu název_pinu <volitelná šipka> <volitelny název_dalšího_pinu>
Příklad
net xstep <= stepgen.0.step
net xstep => parport.0.pin-02-out
příkaz se dá zjednodušit na jednu řádku
net xstep <= stepgen.0.step => parport.0.pin-02-out
Význam
Napoj OUT pin stepgen.0.step na signál xstep
Napoj signál xstep na IN pin parport.0.pin-02-out
Tady to může být trošku zmatecné, ale parport.0.pin-02-out je softwarově vstupní IN pin.
To že má označení -out je vztaženo k jeho fyzické funkci, že je výstupní pin paralelního portu.
setp
Příkaz setp nastavuje hodnotu pinu nebo parametru. Musí souhlasit datové typy přiřazení.
Například do binárního parametru TRUE/FALSE nemůže přiřazovat typ FLOAT.
Syntax
setp <pin/parametr <hodnota>
Příklad
setp stepgen.0.maxaccel [JOINT_0]STEPGEN_MAXACCEL
Význam
Nastav parametr maxaccel (maximální zrychlení) v prvnim genarátoru kroku stepgen.0 na hodnotu definovanou v .ini souboru [JOINT_0]STEPGEN_MAXACCEL
loadusr
Příkaz loadusr načítá uživatelské HAL componenty. To jsou samostatně pracující procesy, které můžou
pracovat s HAL, ale také nemusí. Většinou to jsou programy napsané v Pythonu nebo v C.
V dalších dílech si ukážeme, jak můžeme takové komponenty vytvářet.
Syntax
loadusr <komponenta> <volitelne_parametry>
Příklad
loadusr -W hal_manualtoolchange
Význam
Načti uživatelskou komponentu hal_manualtoolchange. Přepínač -W tu značí, aby komponenta byla načtena do linuxCNC až po té co bude připravena.
Pod sekcí [DISPLAY] budou parametry týkající se uživatelského rozhraní.
Například pomoci nasledujiciho parametru si můžeme změnit uživatelské rozhraní z defaultního Axis na gmoccapy
[DISPLAY]
DISPLAY = gmoccapy
…
V [HAL] sekci si můzeme nastavit, jaké .hal soubory se spustí, a to parametrem HALFILE.
[HAL]
HALFILE = moje_masina.hal
POSTGUI_HALFILE = postgui_call_list.hal
…
Když jich je tam více, spustí se v pořadí v jakém jsou deklarovány.
Parametrem POSTGUI_HALFILE se také načte .hal soubor, ale az po té, co je načteno uzivatelske rozhrani.
To je proto, když si chcete vytvářet nějaká vlastní tlačítka pro řízení, tak chcete tu logiku napojit až poté co jsou vytvořené uživatelské komponenty.
Další sekce, které jsou potřeba zmínit jsou [AXIS] a [JOINT].
Ve starších verzích LinuxCNC byly ty to části spojené pouze do [AXIS] a rozdělení přišlo od verze 2.8.
- Když se hovoří o AXIS, jedná se o jeden z devíti stupňů volnosti v Kartézskem souradnem systemu. Například posunutí v ose X nebo rotace kolem osy Z
- Když se hovoří o JOINT, jedná se o fyzický stupeň volnosti. At uz je to lineární vedeni (pohybový šroub), rotační motor otočného stolu nebo kloub robotického ramene.
U triviální kinematiky jako je klasická 3-osa frezka, můzeme AXIS a JOINT považovat za jednu a tu samou věc, protože je mezi nimi mapování 1:1.
To znamená, že když se motor pro směr X otočí o nějaký úhel, tak osa se posune vždycky o stejnou vzdálenost.
Nicméně u nějakých slozitějších, netriviálních systémů, jako je například roboticka ruká nebo hexapod, se pohyb
skládá z více parametrů a pohyb nemusí být lineárně zavislý na pohybovém elementu. Proto došlo k odlišení těchto dvou částí.
Na obrázku výše je ukázka části souboru moje_masina.hal, kde jsou použity použité příkazy. Jednotlivé komponenty mají různé parametry, o kterých často nemusíme vědět význam pokud nechceme. Je ale možné najít v dokumentaci LinuxCNC
To by asi bylo vše k takové té základní konfiguraci. Příště si pravděpodobně ukážeme jak můžeme vytvářet uživatelské komponenty.