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

Материал из cnc-club
Перейти к навигации Перейти к поиску

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

Статья написана с актуальной версией linuxcnc 2.6

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

Сконфигурировать простой автомат "Планшетный широкоформатный сканер" на базе 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
MAX_VELOCITY = 250.0
MAX_ACCELERATION = 600.0
STEPGEN_MAXACCEL = 650.0
SCALE = 67.86
FERROR = 1
MIN_FERROR = 0.25

[AXIS_1]
TYPE = LINEAR
MAX_VELOCITY = 150.0
MAX_ACCELERATION = 200.0
STEPGEN_MAXACCEL = 250.0
SCALE = 67.86
FERROR = 1
MIN_FERROR = 0.25

(тут нет ничего особенного - просто следуй 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

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

Параметры движения должны быть изменены для конкретной конструкции автомата. На схеме вывод 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

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

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

Уст-ка 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
#123 = #5399
M66 E1 L0
#124 = #5399
 
o<ust0> endsub

Файл ustmax.ngc:

o<ustmax> sub

M66 E0 L0
#125 = #5399
M66 E1 L0
#126 = #5399

o<ustmax> endsub

Таким образом введенные переменные используются для хранения координат

#123 - X0
#124 - Y0
#125 - Xmax
#126 - Ymax

Возникает вопрос:

Откуда берутся значения координат?

Значения координат мы можем взять с halui.axis.0.pos-commanded для X и с halui.axis.1.pos-commanded для Y

Но ведь в подпрограммах ust0.ngc и ustmax.ngc прописан опрос motion.analog-in-00 и motion.analog-in-01

Пропишем в skaner.hal следующие связи:

net x-pol halui.axis.0.pos-commanded motion.analog-in-00
net x-pol halui.axis.1.pos-commanded motion.analog-in-01

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


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

Режим 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

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

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

Алгоритм работы сканера

1. По команде ПУСК переместить сканерную головку в начальную точку с координатами X#<_X0> Y#<_Y0> .

Снять пин КОНЕЦ СКАНИРОВАНИЯ, по снятию которого запускается графическая программа.

2. Выставить пин СНИМОК для графической программы.

Ожидание пина СНИМОК СДЕЛАН от графической программы.

Снять пин СНИМОК

3. Переместиться во вторую точку строки сканирования (шаг по X - #<STEP_X> ) и т.д. до конца строки сканирования (координата >= X#<_X_MAX> Y#<_Y0> ).

4. Выставить пин СТРОКА для графической программы.

Ожидание пина СТРОКА ЗАВЕРШЕНА от графической программы.

Снять пин СТРОКА.

5. Переместиться в начало второй строки (шаг по Y - #<STEP_Y> ) и т.п. до конца последней строки (координата >= X#<_X_MAX> Y#<_Y_MAX> ).

6. Выставить пин КОНЕЦ СКАНИРОВАНИЯ.

Ожидание пина ИЗОБРАЖЕНИЕ СФОРМИРОВАНО.

7. Окончание программы.

Для реализации программы будем использовать два вложенных цикла. Также будем использовать М-команды для установки и опроса пинов (сигналов) связи программы сканирования с графической программой:

пин СНИМОК - motion.digital-out-00
пин СТРОКА - motion.digital-out-01
пин КОНЕЦ СКАНИРОВАНИЯ - motion.digital-out-02

(эти пины устанавливаются и снимаются программой сканирования skan.ngc по M62...65);

пин СНИМОК СДЕЛАН - motion.digital-in-00
пин СТРОКА ЗАВЕРШЕНА - motion.digital-in-01
пин ИЗОБРАЖЕНИЕ СФОРМИРОВАНО - motion.digital-in-02

(эти пины устанавливает графическая программа и опрашиваются программой skan.ngc по М66).

Программа skan.ngc

G21

(все размеры в милиметрах)

#<Current_X> = #123
#<Current_Y> = #124
#<Step_X> = 100
#<Step_Y> = 70

(присваиваем значения переменным)

M65 P2

(снимаем сигнал КОНЕЦ СКАНИРОВАНИЯ)

G0 X#<Current_X> Y#<Current_Y>
O100 repeat [[[#126 - #124] / #<Step_Y>] + 1]

(организуем первый цикл по строкам, высчитывая количество полных шагов плюс 1)

#<Current_X> = #123

(возвращаем значение переменной X в начальное значение)

  o101 repeat [[[#124 - #123] / #<Step_X>] + 1]

(организуем внутренний цикл по X для движения по строке)

  G0 X#<Current_X> Y#<Current_Y>

(перемещаемся в точку для снимка)

M64 P0

(устанавливаем пин СНИМОК)

M66 P0 L3 Q1

(опрос пина СНИМОК СДЕЛАН в пределах 1 сек для тестирования без графической программы)

M65 P0

(снимаем пин СНИМОК)

  #<Current_X> = [#<Current_X> + #<Step_X>]

(делаем шаг по X)

  o101 end repeat

(закончили цикл по X)

M64 P1

(устанавливаем СТРОКА)

M66 P1 L3 Q1

(опрос СТРОКА ЗАВЕРШЕНА в пределах 1 сек для тестирования)

M65 P1

(снимаем СТРОКА)

#<Current_Y> = [#<Current_Y> + #<Step_Y>]
o100 end repeat

(закончили цикл по строкам)

M64 P2

(устанавливаем КОНЕЦ СКАНИРОВАНИЯ)

M66 P2 L3 Q1

(опрос ИЗОБРАЖЕНИЕ СФОРМИРОВАНО в пределах 1 сек для тестирования)

G0 X#123 Y#124

(вышли в начальную точку сканирования)

M2

(программа выполнена и остановлена)


Диалог с графической программой сделан при помощи M66 с параметром Pxx L3 Q1, которая ждет появления на motion.digital-in-xx появления высокого уровня 1 секунду для тестирования без графической програмы. Если высокий уровень уже есть, то команда выполняется, т.е. мы переходим к следующей команде программы.

А начальные значения переменных #123, #124, #125 и #126 пропишем в файле emc.var

123   0.000000
124   0.000000
125   0.000000
126   0.000000
...

Также пропишем в файле skaner.ini

[RS274NGC]
PARAMETR_FILE = emc.var

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