Понятно, что нужно для управления релюхами необходимо прописывать байт целиком - все 8 разрядов.
Но как это организовать в LinuxCNC?
Я бы хотел управлять не вводя сразу значение байта, например, "170", а нажимая на визуальной панели отдельные кнопочки. Например, "включить компрессор" - взяли текущее значение управляющего байта, изменили один бит и прописали по СОМ-у
Т.е. нужно:
1. Прописать СОМ-порт в CNC (адрес)
2. Сформировать байт из отдельных битов
3. Организовать передачу сформированного байта по COM.
В результате был написан компонент comform в python-е.
ОПИСАНИЕ comform.
Формирует байт из входных пинов и передаёт его по COM.
Загрузка.
Загрузка осуществляется как и любой пользовательский компонент:
loadusr -Wn comform python comform.py
Функция.
out = in1 + in2*2 + in3*4 + in4*8 + in5*16 + in6*32 + in7*64 + in8*128
Пины.
in1 (bit in)
in2 (bit in)
in3 (bit in)
in4 (bit in)
in5 (bit in)
in6 (bit in)
in7 (bit in)
in8 (bit in)
out (float out)
Полный текст компонента:
Код: Выделить всё
#!/usr/bin/python
import hal
import serial
import time
ser = serial.Serial(port='/dev/ttyS0', baudrate=19200, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
h=hal.component("comform")
h.newpin("in1", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in2", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in3", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in4", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in5", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in6", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in7", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in8", hal.HAL_BIT, hal.HAL_IN)
h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
try:
while 1:
v = h["in1"] | h["in2"]<<1 | h["in3"]<<2 | h["in4"]<<3 | h["in5"]<<4 | h["in6"]<<5 | h["in7"]<<6 | h["in8"]<<7
h['out']= v
ser.write(chr(v))
time.sleep(0.01)
except KeyboardInterrupt:
raise SystemExit
Ниже - путь к этому результату: