Własny moduł HAL
W ramach przerabiania obwiedniówki ZFA-75 na LinuxCNC i budowania „maszyny zgniatająco-przesuwającej” nadeszła pora na napisanie własnego modułu HALa.
Piszemy i testujemy moduł
#!/usr/bin/python
import hal, time
h = hal.component("passthrough")
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
try:
while 1:
time.sleep(1)
h['out'] = h['in']
except KeyboardInterrupt:
raise SystemExitNagrywamy pod nazwą 'kolazebate’, nadajemy prawa
do wykonywania (chmod +x), umieszczamy
gdzies w $PATH (ja zrobiłem linka z home
do /usr/bin.
I możemy testować:
$ halrun
halcmd: loadusr passthrough
halcmd: show pin
Component Pins:
Owner Type Dir Value Name
03 float IN 0 passthrough.in
03 float OUT 0 passthrough.out
halcmd: setp passthrough.in 3.14
halcmd: show pin
Component Pins:
Owner Type Dir Value Name
03 float IN 3.14 passthrough.in
03 float OUT 3.14 passthrough.outPrzykład 'podręcznikowy’ działa.
No to rozbudowujemy.
Na początek własne wejścia i wyjścia.
Na wejściu będę miał liczbę zębów koła, jego moduł i kąt (jeżeli koło skośne).
Na wyjściu chcę przełożenie gitary w ZFA-75, czyli:
– dla kół prostych: 24 / liczbazebow
– dla kół skośnych to samo plus/minus: 7.95775 * sin(kat) / modul
Czyli jakoś tak:
#!/usr/bin/python
import hal, time, math
h = hal.component("kola_zebate")
h.newpin("liczba_zebow", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("modul", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("kat", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("przelozenie", hal.HAL_FLOAT, hal.HAL_OUT)
h.liczba_zebow = 1
h.ready()
try:
while 1:
time.sleep(1)
h.przelozenie = 24.0 / h.liczba_zebow
if h.kat > 0:
h.przelozenie += 7.95775 * sin(radians(h.kat)) / h.m
except KeyboardInterrupt:
raise SystemExiti teścik:
cnc@cnc-desktop:/usr/bin$ halrun
halcmd: loadusr kola_zebate
halcmd: show pin
Component Pins:
Owner Type Dir Value Name
6 float IN 0 kola_zebate.kat
6 float IN 1 kola_zebate.liczba_zebow
6 float IN 0 kola_zebate.modul
6 float OUT 24 kola_zebate.przelozenie
halcmd: setp kola_zebate.liczba_zebow 50
halcmd: show pin
Component Pins:
Owner Type Dir Value Name
6 float IN 0 kola_zebate.kat
6 float IN 50 kola_zebate.liczba_zebow
6 float IN 0 kola_zebate.modul
6 float OUT 0.48 kola_zebate.przelozenie
halcmd:Działa. 😀
#!/usr/bin/python
import hal, time
h = hal.component("passthrough")
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
try:
while 1:
time.sleep(1)
h['out'] = h['in']
except KeyboardInterrupt:
raise SystemExit
Kolejny banalny przykład – przerzutnik RS
#!/usr/bin/python
import hal, time
h = hal.component("przerzutnik_RS")
h.newpin("S", hal.HAL_BIT, hal.HAL_IN)
h.newpin("R", hal.HAL_BIT, hal.HAL_IN)
h.newpin("Q", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("nQ", hal.HAL_BIT, hal.HAL_OUT)
h.ready()
try:
while 1:
if h.S == True and h.R == False:
h.Q = True
if h.S == False and h.R == True:
h.Q = False
h.nQ = not h.Q
except KeyboardInterrupt:
raise SystemExitPodpinamy do Axisa.
Czyli w pliku .hal ładujemy nasz komponent.
loadusr przerzutnik_RS -name przerzutnik_RS.0
i teraz możemy normalnie korzystać z naszego modułu – podpinać sygnały, ustawiać parametry itd.