Страница 3 из 7

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:17
Сергей Саныч
nkp писал(а):в питоне в кавычках - строка...
А hex() это разве не преобразование 16-ричного числа в строке в целое?

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:20
nkp
nkp писал(а):надо пробовать:chr(1)chr(0)
у меня заработало!!!
Выделение(006).jpg (3551 просмотр) <a class='original' href='./download/file.php?id=14735&mode=view' target=_blank>Загрузить оригинал (234.14 КБ)</a>

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:22
nkp
Serg-tmn писал(а):А hex() это разве не преобразование 16-ричной числа в строке в целое?
http://docs.python.org/2/library/functions.html

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:25
Ворон226
УРА! И у меня переключает!
Получается, что теперь мы знаем ЧТО прописывать в компоненте на питоне для включения СОМ-порта и передачи байта?

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:26
Сергей Саныч
nkp писал(а):
Serg-tmn писал(а):А hex() это разве не преобразование 16-ричной числа в строке в целое?
http://docs.python.org/2/library/functions.html
Понял. Строго наоборот :monkey:

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:33
nkp
Ворон226 писал(а):Получается, что теперь мы знаем ЧТО прописывать в компоненте на питоне для включения СОМ-порта и передачи байта?
да - но теперь стоит задача написать красивый алгоритм для суммирования
то есть:
если pin1 в хал есть True - то он равен 1, если False - то 0
если pin2 в хал есть True - то он равен 2, если False - то 0
....................
если pin8 в хал есть True - то он равен 128, если False - то 0
sum=pin1 + pin2 +... +pin8

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:40
Ворон226
А если не переобозначать переменные, а сразу задать 16 переменных и затем

если in1 в хал есть True, то pin1=1, если False, то pin1=0...

И суммировать не входные халовские inN, а внутренние переменные pinN.

А?

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 20:49
nkp
а так и будет - по другому просто нельзя...
ведь у нас наши абстрактные "пины" имеют и логическое значение(True или False) и численное(1,2,4,...128)
я думаю можно создать два массива - один с пинами,другой с их "весом"
потом проверять в цикле и суммировать...

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 21:03
Ворон226
Пробую набросать пользовательский компонент на питоне:

Код: Выделить всё

    #!/usr/bin/python
    import hal
    import serial
    h=hal.component("comform")
    ser = serial.Serial(port='/dev/ttyS0', baudrate=19200, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
    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.ready()
try:
     while 1:
          if h['in1']==True:
               h['pin1']=1
          else:
               h['pin1']=0
     while 2:
          if h['in2']==True:
               h['pin2']=1
          else:
               h['pin2']=0
     while 3:
          if h['in3']==True:
               h['pin3']=1
          else:
               h['pin3']=0
     while 4:
          if h['in4']==True:
               h['pin4']=1
          else:
               h['pin4']=0
     while 5:
          if h['in5']==True:
               h['pin5']=1
          else:
               h['pin5']=0
     while 6:
          if h['in6']==True:
               h['pin6']=1
          else:
               h['pin6']=0
     while 7:
          if h['in7']==True:
               h['pin7']=1
          else:
               h['pin7']=0
     while 8:
          if h['in8']==True:
               h['pin8']=1
          else:
               h['pin8']=0

          v=h['pin1'] + h['pin2'] + h['pin3'] + h['pin4'] + h['pin5'] + h['pin6'] + h['pin7'] + h['pin8']
ser.write(chr(v))


except KeyboardInterrupt:
     raise SystemExit
Чую, что не определил переменные в питоне (pin1...pin8), также не правильно написал суммирование... Да и с командой записи в СОМ-порт тоже, наверняка, перепутал...
И ведь где-то нужно закрыть порт при выходе из программы?

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 21:06
nkp
Ворон226 писал(а):И ведь где-то нужно закрыть порт при выходе из программы?
с этим решаемо - перед закрытием емс можно прописать обязательное выполнение любого скрипта
вот там и прописать закрытие порта
-------

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 21:11
nkp
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

try:
     while 1:
          if h['in1']==True:
               pin1=1
          else:
               pin1=0

          if h['in2']==True:
               pin2=2
          else:
               pin2=0

          if h['in3']==True:
               pin3=4
          else:
               pin3=0

          if h['in4']==True:
               pin4=8
          else:
               pin4=0

................................

          v=pin1 + pin2 + pin3 + ... + pin8
ser.write(chr(v))


except KeyboardInterrupt:
     raise SystemExit
дописать до конца....
ну и отступы потом поправить...

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 21:23
nkp

Код: Выделить всё

#!/usr/bin/python
import hal
import serial
h=hal.component("comform")
ser = serial.Serial(port='/dev/ttyS0', baudrate=19200, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
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.ready()
try:
     while 1:
          if h['in1']==True:
               pin1=1
          else:
               pin1=0

          if h['in2']==True:
               pin2=2
          else:
               pin2=0

          if h['in3']==True:
               pin3=4
          else:
               pin3=0

          if h['in4']==True:
               pin4=8
          else:
               pin4=0

          if h['in5']==True:
               pin5=16
          else:
               pin5=0

          if h['in6']==True:
               pin6=32
          else:
               pin6=0

          if h['in7']==True:
               pin7=64
          else:
               pin7=0

          if h['in8']==True:
               pin8=128
          else:
               pin8=0

          v = pin1 + pin2 + pin3 + pin4 + pin5 + pin6 + pin7 + pin8
     ser.write(chr(v))
except KeyboardInterrupt:
     raise SystemExit
вот - можно попробовать...

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 21:41
Ворон226
Вот что получилось...

Код: Выделить всё

#!/usr/bin/python
import hal
import serial
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.ready()
try:
     while 1:
          if h['in1']==1:
               pin1=1
          else:
               pin1=0
          if h['in2']==1:
               pin2=2
          else:
               pin2=0
          if h['in3']==1:
               pin3=4
          else:
               pin3=0
          if h['in4']==1:
               pin4=8
          else:
               pin4=0
          if h['in5']==1:
               pin5=16
          else:
               pin5=0
          if h['in6']==1:
               pin6=32
          else:
               pin6=0
          if h['in7']==1:
               pin7=64
          else:
               pin7=0
          if h['in8']==1:
               pin8=128
          else:
               pin8=0
          v=pin1 + pin2 + pin3 + pin4 + pin5 + pin6 + pin7 + pin8

ser.write(chr(v))

except KeyboardInterrupt:
     raise SystemExit
Про выключение.
Я так понимаю есть два варианта или оба?
1. В .ini

Код: Выделить всё

[HAL]
SHUTDOWN = shutdown.hal
В файле shutdown.hal

Код: Выделить всё

setp conform.in1 0
setp conform.in2 0
setp conform.in3 0
setp conform.in4 0
setp conform.in5 0
setp conform.in6 0
setp conform.in7 0
setp conform.in8 0
setp halui.machine.off True
2. При выключении станка при помощи пользовательского G-кода (M102):

Код: Выделить всё

#!/bin/sh
ser.close()
sudo shutdown -h now

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 21:50
nkp
Ворон226 писал(а):2. При выключении станка при помощи пользовательского G-кода (M102):
нет - так работать не будет
это скрипт шелл - а строка закрытия порта - питон
-------
забей на закрытие порта
скорей всего емс закрываешь - комп выключаешь
ежели что - потом допишешь...

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 21:59
Ворон226
ага - буду готовить панель для проверки компонента COM-порта... Всем спасибо! До завтра!

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 22:23
nkp
вот попробовал из скрипта шелл питоновский файл запустить:

Код: Выделить всё

#!/bin/sh
python close.py
sudo shutdown -h now
а уже в close.py прописать закрытие порта:

Код: Выделить всё

#!/usr/bin/python
import serial
ser.close()

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 23:06
Serg
Не надо закрывать порт. При завершении программы OS автоматически закроет все открытые файлы.

Re: Управление из LinuxCNC через COM-порт

Добавлено: 19 май 2013, 23:57
Ворон226
nkp писал(а):вот попробовал из скрипта шелл питоновский файл запустить:
а уже в close.py прописать закрытие порта...
Спасибо! Пригодится при других случаях ;)

Re: Управление из LinuxCNC через COM-порт

Добавлено: 20 май 2013, 00:17
Serg
Ворон226 писал(а):Спасибо! Пригодится при других случаях ;)
Запуск отдельного скрипта с закрытием порта бессмыленен: запущенный скрипт - это отдельный процесс в терминах ОС, и в контексте этого процесса порт закрыт, ибо и не открывался. Собственно команда закрытия выполнится с ошибкой и ничего не сделает.

Re: Управление из LinuxCNC через COM-порт

Добавлено: 20 май 2013, 06:51
Ворон226
Так я не про закрытие, а про способ запуска питоновского скрипта ;)