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 SystemExit

 

Nagrywamy pod nazwą 'kola_zebate’, nadajemy prawa do wykonywania (chmod +x), umoeszczamy 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.out

Przykł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 / liczba_zebow
– 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 SystemExit

i 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 SystemExit

test:

 

 

Podpinamy 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.