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.