Конфигурация LCNC для простого автомата с MYGUI: различия между версиями

Материал из cnc-club
Перейти к навигации Перейти к поиску
Строка 211: Строка 211:
 
Блок схема движения по оси X:
 
Блок схема движения по оси X:
  
[[Файл:Ось X.png|400px|обрамить]]
+
[[Файл:Ось X.png|400px]]
 
Движение по оси намеренно выполнено с плавным (линейным) нарастание скорости для того, чтобы можно было более точно подвести сканирующую головку к точкам начала и конца сканирования.
 
Движение по оси намеренно выполнено с плавным (линейным) нарастание скорости для того, чтобы можно было более точно подвести сканирующую головку к точкам начала и конца сканирования.
  

Версия 10:39, 20 октября 2014

Часто возникает необходимость создания конфигурации простого автомата на LinuxCNC. (обсуждение статьи на форуме Создание конфигурации простого автомата от чайника)


Постановка задачи.

Сконфигурировать простой автомат "Планшетный широкоформатный сканер" на базе LinuxCNC со своей панелью управления и встроенной перепрограммируемой программой обработки заготовки.

Необходимые направления работы:

1. Описание логики работы сканера

2. Создание файла INI

3. Создание визуальной панели

4. Создание связей между HAL, визуальной панелью и программами/подпрограммами

5. Создание HAL

6. Написание программы сканирования

7. Способы проверки и тестирования конфигурации

В задачу данной темы не входят вопросы конструкции, электроники, программ обработки графической информации!

Логика работы автомата

1. Включение автомата и начальные установки:

- при включении автомата загружается визуальная панель, программа сканирования;

- перевести автомат в рабочий режим нажатием кнопки "ВКЛ" визуальной панели, проверка состояния E-STOP, концевых датчиков (если сработал один из датчиков крайнего положения - автомат выходит из крайнего положения самостоятельно; если сработали сразу два противоположных датчика положения - авария)

2. Вывести сканирующую головку в начальную точку сканирования, пользуясь соответствующими кнопками визуальной панели и задать начальную точку сканирования нажатием кнопки "Уст-ка нуля" визуальной панели.

3. Вывести сканирующую головку в крайнюю точку сканирования и задать крайние координаты сканирования нажатием кнопки "Уст-ка MAX".

4. Установить необходимое фокусное расстояние вручную.

5. Установить необходимое разрешение сканирования выбором соответствующего режима сканирования кнопками визуальной панели.

6. Включить лампу освещения зоны сканирования нажатием соответствующей кнопки визуальной панели.

7. Запустить процесс сканирования нажатием кнопки "ПУСК" визуальной панели.

8. После работы выключить автомат нажатием кнопки "ВЫКЛ" визуальной панели.

INI-файл

Так как установка фокусного расстояния осуществляется вручную, то мы должны сконфигурировать двухкоординатный автомат.

Итак, файл skaner.ini :

[EMC]
MACHINE = skaner
DEBUG = 0

[DISPLAY]
DISPLAY = mygui

... говорит о том, что мы будем использовать собственную визуальную панель для управления автоматом.

Если хотим положить файл в саму папку с конфигурацией, то строка должна выглядеть так:

DISPLAY = ./mygui

Далее:

POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 1.2
PROGRAM_PREFIX = /home/sun/linuxcnc/configs/skaner

(указали адрес, по которому находятся исполняемые файлы и программы)

OPEN_FILE = /home/sun/linuxcnc/configs/skaner/skan1.ngc

(указали адрес и имя загружаемой программы по умолчанию)

[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python

[TASK]
TASK = milltask
CYCLE_TIME = 0.005

[RS274NGC]
PARAMETER_FILE = emc.var

[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
COMM_WAIT = 0.010
BASE_PERIOD = 50000
SERVO_PERIOD = 1000000

[HAL]
HALFILE = skaner.hal
HALUI = halui

[HALUI]

[TRAJ]
AXES = 2
COORDINATES = X Y
MAX_ANGULAR_VELOCITY = 0.10
DEFAULT_ANGULAR_VELOCITY = 0.01
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 50.00
MAX_LINEAR_VELOCITY = 200.00
NO_FORCE_HOMING = 1

[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = tool.tbl

[AXIS_0]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 250.0
MAX_ACCELERATION = 600.0
STEPGEN_MAXACCEL = 650.0
SCALE = 67.86
FERROR = 1
MIN_FERROR = 0.25
MIN_LIMIT = -0.001
MAX_LIMIT = 1500.0
HOME_OFFSET = 0.0

[AXIS_1]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 150.0
MAX_ACCELERATION = 200.0
STEPGEN_MAXACCEL = 250.0
SCALE = 67.86
FERROR = 1
MIN_FERROR = 0.25
MIN_LIMIT = -0.001
MAX_LIMIT = 2700.0
HOME_OFFSET = 0.0

(тут нет ничего особенного - просто следуй LinuxCNC Integrators Manual Глава IV - Файл INI )

Визуальная панель

Из раздела "Логика работы автомата" ясен состав кнопок визуальной панели:

Кнопки без фиксации: ВКЛ, СТОП, ВЫКЛ, Уст-ка нуля, Уст-ка MAX, Кнопки движения по координатам (4 штуки).

Кнопки с фиксацией: Три кнопки режима сканирования, кнопка включения освещения зоны сканирования.

Для удобства управления автоматом и загрузки сканируемых объектов можно добавить четыре кнопки без фиксации для перемещения автомата в крайние положения.

Нарисуем панель в Glade, используя, по возможности, элементы HAL Python . Получилась вот такая панель:

Визуальная панель автомата

Таблица соответствия названия кнопок и их имен:

ВКЛ - hal_button1
СТОП - hal_button2
ВЫКЛ - hal_button3
Уст-ка нуля - hal_button4
Уст-ка MAX - hal_button5
назад до конца - hal_button6
^ - назад - hal_button7
влево до конца - hal_button8
< - влево - hal_button9
> - направо - hal_button10
направо до конца - hal_button11
v - вперед - hal_button12
вперед до конца - hal_button13
ПУСК - hal_button14
Режим 1 - hal_togglebutton1
Режим 2 - hal_togglebutton2
Режим 3 - hal_togglebutton3
Освещение - hal_togglebutton4

(по мере необходимости будем убирать или добавлять элементы визуальной панели)

HAL-файл

Файл skaner.hal в первой своей части ничего уникального не представляет - обычный набор необходимых конструкций и нужные пины LPT-порта.

(для совсем "молодых" чпу-шников посоветую сначала почитать LinuxCNC для чайников )

Во второй части файла skaner.hal пропишем следующие функции:

Движение по осям X и Y от кнопок визуальной панели;

Начальная блокировка сигналов от датчиков положения;

Анализатор состояний датчиков автомата.

Движение по осям X и Y от кнопок визуальной панели

Рассмотрим движение по оси X (вправо-влево). Движение по оси Y выполнено аналогично.

Имеем:

кнопки визуальной панели: Влево до конца, Влево, Вправо, Вправо до конца;

датчики: левый край, правый край.

Управление движением будем осуществлять через halui.jog.0.analog

halui.jog.<n>.analog (float, in) - ввод для аналогового задания скорости ручного перемещения
(полезно при использовании джойстиков или других аналоговых устройств)

Также следует заметить, что кнопки перемещений нужно блокировать при выполнении сканирования.

Блок схема движения по оси X:

Ось X.png Движение по оси намеренно выполнено с плавным (линейным) нарастание скорости для того, чтобы можно было более точно подвести сканирующую головку к точкам начала и конца сканирования.

Параметры движения должны быть изменены для конкретной конструкции автомата. На схеме вывод mux8.in2 - скорость движения в крайнее левое положение (в данном примере = 25), выводы mux8.in4...7 - скорость выхода из зоны датчика крайнего левого положения (в данном примере = -25), вывод mux4.in1 скорость движения в крайнее правое положение (в данном примере = -25), выводы mux4.in2 и mux4.in3 - скорость выхода из зоны датчика крайнего правого положения (в данном примере = 25).

Начальная блокировка сигналов от датчиков положения

Если при включении конфигурации LinuxCNC один из датчиков уже будет включен, то реакции на этот датчик возможно и не последует (по наблюдениям реальной конфигурации широкоформатного планшетного принтера). Поэтому во избежание таких ситуаций в конфигурацию введена схема начальной блокировки входных сигналов. Её задача: задержать подключение входных датчиков крайних положений на одну секунду после включения автомата.

Для этого был написан пользовательский компонент enrun (файл enrun.py)

#!/usr/bin/python
import hal
h=hal.component("enrun")
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("out1", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out2", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out3", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out4", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("enable", hal.HAL_BIT, hal.HAL_IN)
h.ready()
try:
    while 1:
         if h['enable']==0:
              h['out1']=0
              h['out2']=0
              h['out3']=0
              h['out4']=0
         else:
              h['out1']=h['in1']
              h['out2']=h['in2']
              h['out3']=h['in3']
              h['out4']=h['in4']
except KeyboardInterrupt:
    raise SystemExit
Блокировка.png








Схема блокировки входных датчиков:





Осталось добавить, что необходимо обязательно прописать в файле skaner.hal следующую процедуру:

loadusr -Wn enrun python enrun.py

, а сам файл enrun.py положить в папку с конфигурацией автомата.

Анализатор состояний датчиков автомата

Нельзя обойти вниманием ситуацию возникновения непредсказуемых ситуаций при неисправности входных датчиков либо при обрыве сигнальных цепей или целей питания датчиков.

Это может проявиться в ситуации, когда мы получаем одновременно два сигнала: либо Датчик ЛЕВЫЙ КРАЙ и Датчик ПРАВЫЙ КРАЙ, либо Датчик БЛИЖНИЙ КРАЙ и Датчик ДАЛЬНИЙ КРАЙ.

В этих ситуациях нужно блокировать движение автомата до устранения неисправности. О неисправности необходимо оповестить оператора либо индикатором, либо звуковым сигналом, либо и тем, и другим.

Подобная схема не представляет особого интереса, потому не приводится.

Связи между HAL, визуальной панелью и программами/подпрограммами

Сначала свяжем кнопки визуальной панели.

ВКЛ - hal_button1 - halui.machine.on
СТОП - hal_button2 - halui.estop.activate
ПУСК - hal_button14 - halui.program.run 

- тут всем, обратившимся к описанию HAL, всё должно быть понятно.

Нажал на кнопку ВКЛ - послали сигнал на пин halui.machine.on для запроса включения станка.

Нажал на кнопку СТОП - сигнал на пин halui.estop.activate для запроса E-Stop.


Кнопки управления движением мы рассмотрели выше. Их связываем с соответствующими пинами компонентов реального времени HAL.


Освещение - hal_togglebutton4 - parport.0.pin-14-out

Так мы связали кнопку с фиксацией с пином LP-порта, отвечающего за включение освещения (конечно в нашем случае).

Кнопка ВЫКЛ должна при нажатии вызывать процедуру выключения компьютера автомата.

Сделаем это при помощи mdi-команды:

ВЫКЛ - hal_button3 - halui.mdi-command-00

Как подготовить конфигурацию к использованию MDI-команды написано в Организация MyGUI

Сама М-программа (мы будем использовать М102) такого содержания:

#!/bin/sh
sudo shutdown -h now


Уст-ка нуля - hal_button4 - halui.mdi-command-01

При нажатии этой кнопки нам нужно присвоить глобальным переменным _X0 и _Y0 значения координат по осям X и Y в момент нажатия. Сделаем это при помощи подпрограммы, вызываемой mdi-командой.

Аналогично, сделаем и для кнопки Уст-ка MAX. Только при нажатии будем присваивать значение координат осей соответственно глобальным переменным _X_MAX и _Y_MAX.

Уст-ка MAX - hal_button5 - halui.mdi-command-02

Для этого дополним раздел [HALUI] файла skaner.ini двумя строками:

[HALUI]
MDI_COMMAND = M102
MDI_COMMAND = o<ust0>call
MDI_COMMAND = o<ustmax>call

В папку, указанную в файле skaner.ini

[DISPLAY]
PROGRAM_PREFIX = /home/sun/linuxcnc/configs/skaner

поместим файлы подпрограмм ust0.ngc и ustmax.ngc с таким содержанием: Файл ust0.ngc:

o<ust0> sub

M66 E0 L0
#<_X0> = #5399
 (DEBUG, _X0 = #<_X0>)
M66 E1 L0
#<_Y0> = #5399
 (DEBUG, _Y0 = #<_Y0>)

o<ust0> endsub

Файл ustmax.ngc:

o<ustmax> sub

M66 E0 L0
#<_X_MAX> = #5399
 (DEBUG, _X_MAX = #<_X_MAX>)
M66 E1 L0
#<_Y_MAX> = #5399
 (DEBUG, _Y_MAX = #<_Y_MAX>)

o<ustmax> endsub

Для чего мы использовали глобальные переменные? Чтобы мы могли их использовать в других программах и подпрограммах, в частности, в программе сканирования нашего автомата.

Кнопки режимов пока оставим в покое - они будут опрашиваться графической программой и использоваться при формировании выходного графического файла...

Режим 1 - hal_togglebutton1
Режим 2 - hal_togglebutton2
Режим 3 - hal_togglebutton3


Все эти связи прописываются в файле mode.hal:

net on       mygui.hal_button1    halui.machine.on
net stop     mygui.hal_button2    halui.estop.activate
net mdi1     mygui.hal_button3    halui.mdi-command-00

net mdi2     mygui.hal_button4    halui.mdi-command-01
net mdi3     mygui.hal_button5    halui.mdi-command-02

net godk     mygui.hal_button6    
net go       mygui.hal_button7    
net levdk    mygui.hal_button8    
net lev      mygui.hal_button9    
net prav     mygui.hal_button10    
net pravdk   mygui.hal_button11    
net zad      mygui.hal_button12   
net zaddk    mygui.hal_button13    

net start    mygui.hal_button14    halui.program.run

net dpi1     mygui.hal_togglebutton1
net dpi2     mygui.hal_togglebutton2
net dpi3     mygui.hal_togglebutton3
net osv      mygui.hal_togglebutton4   parport.0.pin-14-out

Осталось заметить, что связи файла mode.hal соотвествуют связям файла skaner.hal

Т.е. строку

net osv      mygui.hal_togglebutton4   parport.0.pin-14-out

можно было прописать (и чаще всего так и делают) так:

в файле mode.hal прописывают только:

 net osv      mygui.hal_togglebutton4

, а в файле skaner.hal :

 net osv      parport.0.pin-14-out

Тут видно, что пин mygui.hal_togglebutton связан с пином parport.0.pin-14-out посредством связи osv

Теперь можно перейти к основной программе - программе сканирования.

Программа работы автомата