05:00:29 18/12/2017;
 Разработка станков MicroCNC и модернизация раннее выпущеных станков с ЧПУ


Пример модернизации 2-х координатного станка ИТ42

Видео модернизированного ИТ42

Условия применения станка

Станок предполагалось использовать для расточки внутреннего конуса шестерни после термообработки. Неравномерность конуса от идеальной прямой не должна была превышать 20 мкм в плюс или минус допуска. Должно выполняться условие равномерного и согласованного перемещения обоих осей одновременно. Так как нарушение в перемещении одной из осей сразу же приводило к появлению брака шестерни. Станок можно назвать операционным, поэтому используется один инструмент, что еще более облегчало задачу. Время работы станка - до 3-х сменного режима. Требуется обязательно использование смазки направляющей и применение охлаждающей жидкости.

Задачи по модернизации

Ввиду ограниченности использования станка одной операцией считается затратным использовать покупную систему ЧПУ от "Балтсистем" типа NC-201 или NC-202. Стоимость этой системы с блоками входов-выходов превышает 100.000 рублей. Следовательно нужно подобрать систему ЧПУ по сумме не более 20.000 рублей. Система ЧПУ должна быть широко применяема в мире и иметь достаточную документацию для обслуживания. Написание собственной системы запрещается, ввиду проблем с сопровождением. Для обеспечения движения осей требуется использовать серво привода с обратной связью, так как шаговые двигатели без обратной связи не контролируют конечное перемещение и возможено появление эффекта потери шагов. Требования по мощности координатных двигателей - 6-8Нмкг учитывая двигатели, которые были раннее использованы в станке ИТ42. Так как станок нужно максимально упростить и исключить ручные переключения скорости, наличие механической коробки исключается, и изменение частоты вращения главного двигателя обеспечивается частотным преобразователем. Управление включением/отключением охлаждающей жидкости обеспечивает программа обработки. Допускается включение/отключение СОЖ и главного двигателя в ручном режиме с пульта оператора.

Способ решения задачи

Для решения поставленной задачи в качестве системы ЧПУ станка была выбрана EMC2 (LinuxCNC). Система устанавливается на обычный PC совместимый компьютер под управлением многозадачной ОС Linux (Ubuntu). Требования к железу компьютера: частота процессора не менее 2.0 ГГц, не менее 1Гб оперативной памяти, 4Гб дисковой памяти. Наличие не менее 3-х разъемов PCI. На этом для компьютера все.

Так как планировалось использовать серво привода, нужно было приобрести серво плату для системы ЧПУ. В качестве такой выбрали плату Mesa 5I20. Эта плата представляет собой программируемую логическую матрицу с 72 входами/выходами. Преимущество этой платы в том, что матобеспечение уже написано, и необходимо только правильно его настроить. В качестве конечных блоков вход/выход с гальванической развязкой и блока ШИМ управления частотным приводом главного двигателя были выбраны дочерние платы для Mesa 5I20 - это 7I33TA и 7I37TA.

В качестве серво приводов выбраны преобразователь с сервомотором на 6Нмкг, которые предлагает "Балтсистем". Для управления главным двигателем - частотный преобразователь "Веспер" на 15КВт и асинхронный двигатель АИР на 11КВт и 1500 об/мин.

Привода осей X,Z имеют обратную связь с вала сервомотора (выход энкодера). Сам привод программируется для ЧПУ как шаговый двигатель, с числом импульсов 2500 на один полный оборот. Выход с энкодера поступает на серво плату MESA 5I20 и система ЧПУ отслеживает постоянно положение вала двигателя в режиме слежения по скорости. PID ЧПУ запрограммирован в режиме слежение по скорости.

Индекс метка с привода поступает на серво плату, ЧПУ запрограммировано для поиска индекс метки в процессе нахождения нуля (HOMING). При работе с шаговыми двигателями без обратной связи это было узким местом при точном начальном позиционировании (нахождении нуля).

В таблице сведены все основные покупные устройства, примененные при модернизации станка.


Наименование устройства Тип устройства Количество шт. Цена руб. с НДС Сумма руб. с НДС
Преобразователь частоты главного двигателя "Веспер" E2-8300-015H 1 22213-00 22213-00
Тормозной резистор 80 Ом 1000 Вт 2 2813-00 5626-00
Главный двигатель АИР 380В/11КВт 1500 об/мин 1 11000-00 11000-00
Сервопривод оси ServoDriver SA-030 2 20226-00 40452-00
Двигатель оси KM-11-06.0-020, 2500об/мин, 6Н*кг*кв.м 2 16000-00 32000-00
Программируемая логическая матрица с PCI разъемом MESA 5I20 1 199$ 199$
Дочерняя плата для логической матрицы MESA 7I33TA 1 79$ 79$
Дочерняя плата для логической матрицы MESA 7I37TA 1 79$ 79$
Материнская плата компьютера 2.4Ггц, 1Гб DRAM 1 2500-00 2500-00
Монитор 17 дюймов Samsung SyncMaster 720N 1 5000-00 5000-00
Клавиатура Logitech 1 300-00 300-00
Мышь Logitech 1 200-00 200-00
Переходник IDE->CF CFADPT7-CS 1 17$ 17$
Compact Flash CF-card 4Гб, 300х Мгц 1 1553-00 1553-00
ИТОГО 120391-00 и 374$
В ТОМ ЧИСЛЕ ЧПУ 9553-00 и 374$

Как видно из таблицы, покупка всех приводов и создание всей системы ЧПУ обошлась в сумму эквивалентную 132.064 рублей. При этом само ЧПУ в этой цене составляет эквивалент 20.773 рубля. Мы фактически уложились в отведенный зараннее бюджет на систему ЧПУ. В то же время покупка ЧПУ NC-202с таки же комплектом приводов и главным двигателем обошлась бы в 200.000 рублей. Как видно довольно приличная экономия.

Плюс в применении ОС Linux как базовой операционной системы ЧПУ состоит в том, что легче построить сеть между множеством станков в будующем, чем применяя однозадачные ОС DOS, TRDOS и т д.

Примеры конфигурационных файлов

  • Начальный файл инициализации IT42-aike.ini

    [EMC]
    MACHINE = IT42-AIKE
    DEBUG = 0
    
    [DISPLAY]
    DISPLAY = axis
    POSITION_OFFSET = RELATIVE
    POSITION_FEEDBACK = ACTUAL
    MAX_FEED_OVERRIDE = 2.000000
    MAX_SPINDLE_OVERRIDE = 1.000000
    MIN_SPINDLE_OVERRIDE = 0.500000
    INTRO_GRAPHIC = emc2.gif
    INTRO_TIME = 5
    PROGRAM_PREFIX = /home/operator/emc2/nc_files
    PYVCP = custompanel.xml
    INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
    LATHE = 1
    POSITION_OFFSET = RELATIVE
    POSITION_FEEDBACK = ACTUAL
    DEFAULT_LINEAR_VELOCITY = 10.0000
    MAX_LINEAR_VELOCITY = 60.000000
    MIN_LINEAR_VELOCITY = 1.0000
    DEFAULT_ANGULAR_VELOCITY = 0.250000
    MAX_ANGULAR_VELOCITY = 1.000000
    MIN_ANGULAR_VELOCITY = 0.010000
    EDITOR = gedit
    GEOMETRY = xyz
    OPEN_FILE = /home/operator/emc2/nc_files/rastochka_9130-4.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.010
    
    [RS274NGC]
    PARAMETER_FILE = emc.var
    
    [EMCMOT]
    EMCMOT = motmod
    COMM_TIMEOUT = 1.0
    COMM_WAIT = 0.010
    SERVO_PERIOD = 1000000
    
    # [HOSTMOT2]
    # This is for info only
    # DRIVER0=hm2_pci
    # BOARD0=5i20
    # CONFIG0="firmware=hm2/5i20/SVST8_4.BIT num_encoders=3 num_pwmgens=1 num_stepgens=2" 
    
    [HAL]
    HALUI = halui
    HALFILE = IT42-AIKE.hal
    POSTGUI_HALFILE = custom_postgui.hal
    SHUTDOWN = shutdown.hal
    
    [HALUI]
    
    [TRAJ]
    AXES = 3
    COORDINATES = X Z
    LINEAR_UNITS = mm
    ANGULAR_UNITS = degree
    CYCLE_TIME = 0.010
    DEFAULT_VELOCITY = 100.0
    MAX_LINEAR_VELOCITY = 120.0
    
    [EMCIO]
    EMCIO = io
    CYCLE_TIME = 0.0100
    TOOL_TABLE = tool.tbl
    
    #********************
    # Axis X
    #********************
    [AXIS_0]
    TYPE = LINEAR
    HOME = 0.0
    #experiment 2010-12-17
    FERROR =10.5
    #experiment 2010-12-17
    MIN_FERROR = 10.5	
    MAX_VELOCITY = 120.0
    MAX_ACCELERATION =240.0
    #Added by hand 2010-11-16
    P = 50.0
    I = 0.0
    D = 0.0
    FF0 = 0.0
    FF1 = 1.0
    FF2 = 0.0
    BIAS = 0.0
    DEADBAND = 0.001
    OUTPUT_SCALE = 500.0
    OUTPUT_OFFSET = 0.0
    MAX_OUTPUT = 140.0
    #??? SCALE
    INPUT_SCALE =-2500.0
    
    # these are in nanoseconds
    DIRSETUP   = 1000
    DIRHOLD    = 1000
    STEPLEN    = 1000
    STEPSPACE  = 1000
    #??? SCALE
    SCALE = 2500.0
    MIN_LIMIT = -338.0
    MAX_LIMIT = 2.0
    HOME_OFFSET = 0.000000
    HOME_SEARCH_VEL = -20.500000
    HOME_LATCH_VEL = -1.50000
    HOME_FINAL_VEL = 0.000000
    HOME_USE_INDEX = YES
    HOME_SEQUENCE = 1
    
    #********************
    # Axis Z
    #********************
    [AXIS_2]
    TYPE = LINEAR
    HOME = 0.0
    #experiment 2010-12-17
    FERROR = 10.5
    #experiment 2010-12-17
    MIN_FERROR = 10.5
    MAX_VELOCITY = 120.0
    MAX_ACCELERATION = 240.0
    #Added by hand 2010-11-16
    P = 50.0
    I = 0.0
    D = 0.0
    FF0 = 0.0
    FF1 = 1.0
    FF2 = 0.0
    BIAS = 0.0
    DEADBAND = 0.001
    OUTPUT_SCALE = 250.0
    OUTPUT_OFFSET = 0.0
    MAX_OUTPUT = 140.0
    #change sign 2010-11-16
    #???
    INPUT_SCALE =2500.0
    
    
    # these are in nanoseconds
    DIRSETUP   = 1000
    DIRHOLD    = 1000
    STEPLEN    = 1000
    STEPSPACE  = 1000
    #???
    SCALE = 2500.0
    MIN_LIMIT = -300.0
    MAX_LIMIT = 2.0
    HOME_OFFSET = 0.000000
    HOME_SEARCH_VEL = -20.500000
    HOME_LATCH_VEL = -1.50000
    HOME_FINAL_VEL = 0.000000
    HOME_USE_INDEX = YES
    #HOME_USE_INDEX = NO
    HOME_SEQUENCE = 0
    
    #********************
    # Spindle 
    #********************
    [SPINDLE_9]
    MAX_VELOCITY = 16.6666666667
    MAX_ACCELERATION = 20.0
    OUTPUT_SCALE = -2000.0
    OUTPUT_OFFSET = 0.0
    MAX_OUTPUT = 10.0
    INPUT_SCALE = 4000.0
    

  • Основной HAL файл системы IT42-aike.hal
    loadrt trivkins
    loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
    loadrt hostmot2
    loadrt hm2_pci config="firmware=hm2/5i20/SVST8_4.BIT num_encoders=3 num_pwmgens=1 num_stepgens=2" 
    setp     hm2_5i20.0.pwmgen.pwm_frequency 100000
    setp     hm2_5i20.0.pwmgen.pdm_frequency 100000
    setp     hm2_5i20.0.watchdog.timeout_ns 10000000
    loadrt not count=8
    loadrt abs names=abs.spindle
    loadrt pid num_chan=2
    loadrt and2 count=11
    loadrt or2 count=1
    loadrt oneshot count=2
    loadrt timedelay count=2
    loadrt mux8 count=1
    loadrt flipflop count=4
    loadrt minmax count=2
    loadrt debounce cfg="6"
    setp debounce.0.delay 20
    
    addf hm2_5i20.0.read servo-thread
    addf motion-command-handler servo-thread
    addf motion-controller servo-thread
    addf hm2_5i20.0.write         servo-thread
    addf hm2_5i20.0.pet_watchdog  servo-thread
    addf not.0 servo-thread
    addf not.1 servo-thread
    addf not.2 servo-thread
    addf not.3 servo-thread
    addf not.4 servo-thread
    addf not.5 servo-thread
    addf not.6 servo-thread
    addf not.7 servo-thread
    addf and2.0 servo-thread
    addf and2.1 servo-thread
    addf and2.2 servo-thread
    addf and2.3 servo-thread
    addf and2.4 servo-thread
    addf and2.5 servo-thread
    addf and2.6 servo-thread
    addf and2.7 servo-thread
    addf and2.8 servo-thread
    addf and2.9 servo-thread
    addf and2.10 servo-thread
    addf or2.0 servo-thread
    addf mux8.0 servo-thread
    addf oneshot.0 servo-thread
    addf oneshot.1 servo-thread
    addf timedelay.0 servo-thread
    addf timedelay.1 servo-thread
    addf abs.spindle servo-thread
    addf flipflop.0 servo-thread
    addf flipflop.1 servo-thread
    addf flipflop.2 servo-thread
    addf flipflop.3 servo-thread
    addf debounce.0 servo-thread
    addf minmax.0 servo-thread
    addf minmax.1 servo-thread
    addf pid.0.do-pid-calcs                    servo-thread
    addf pid.1.do-pid-calcs                    servo-thread
    
    
    # general signals
    net strob-man       <= halui.mode.is-manual
    net strob-auto      <= halui.mode.is-auto => not.5.in
    net strob-auto-not  <= not.5.out
    net strob-mdi       <= halui.mode.is-mdi
    net power-on        => halui.machine.is-on
    net lube-is-on      => halui.lube.is-on
    net timer-elapsed   => timedelay.0.elapsed
    net is-running      <= halui.program.is-running
    net is-paused       <= halui.program.is-paused
    net is-idle         <= halui.program.is-idle
    net is-home-x       <= halui.joint.0.is-homed     => and2.6.in0
    net is-home-z       <= halui.joint.2.is-homed     => and2.6.in1
    net is-home-out     <= and2.6.out                 => not.7.in
    net is-home-out-not <= not.7.out
    
    # external output signals
    
    # --- ESTOP-OUT ---
    net estop-out => not.0.in
    net estop-out-not => not.0.out =>  hm2_5i20.0.gpio.040.out
    setp    hm2_5i20.0.gpio.040.is_output true
    # similar
    net estop-out-not  =>  hm2_5i20.0.gpio.042.out
    setp    hm2_5i20.0.gpio.042.is_output true
    
    # --- ENABLE ---
    net enable => not.1.in
    net enable-not => not.1.out => hm2_5i20.0.gpio.041.out
    setp    hm2_5i20.0.gpio.041.is_output true
    
    
    # external input signals
    
    # --- MIN-X ---
    net X.min         <=  hm2_5i20.0.gpio.024.in
    # --- MAX-X ---
    net X.max         <=  hm2_5i20.0.gpio.025.in
    # --- HOME-X ---
    net X.home        <=  hm2_5i20.0.gpio.026.in
    # --- MIN-Z ---
    net Z.min         <=  hm2_5i20.0.gpio.027.in
    # --- MAX-Z ---
    net Z.max         <=  hm2_5i20.0.gpio.028.in
    # --- HOME-Z ---
    net Z.home        <=  hm2_5i20.0.gpio.029.in
    
    ##################
    # START-PROGRAMM #
    ##################
    #signal from BUTTON to MESA card
    #test is homed first!!!
    net is-home-out       => and2.7.in0
    net start-program-btn <=  hm2_5i20.0.gpio.032.in_not => and2.7.in1
    #set in TRUE only if all axes homed and pressed button START
    net start-program     <=  and2.7.out
    net start-program     =>  and2.5.in0
    net strob-auto-not    =>  and2.5.in1
    #set auto mode
    net set-auto          <=  and2.5.out
    net set-auto          =>  halui.mode.auto
    #reset minmax ferror values in both axes
    net set-auto          =>  minmax.0.reset
    net set-auto          =>  minmax.1.reset
    #set oneshot impulse length = 2 sec
    setp oneshot.1.width 2
    #make impulse lenth 2 sec
    net set-auto          =>  oneshot.1.in
    net start-program-out =>  oneshot.1.out
    net start-program-out =>  halui.program.run
    
    #################
    # STOP PROGRAMM #
    #################
    net is-running        =>  and2.8.in0
    net stop-program-btn  <=  hm2_5i20.0.gpio.033.in_not => and2.8.in1
    net set-pause         <=  and2.8.out                 => halui.program.pause
    
    #det program stop delay 1 sec
    setp timedelay.1.on-delay  1
    setp timedelay.1.off-delay 0
    
    net is-paused         =>  timedelay.1.in
    net stop-program      <=  timedelay.1.out            => halui.program.stop
    
    #########################
    # LUBE, LUBE-BED ON/OFF #
    #########################
    #set 3 sec delay impulse for first switch-on bed lube
    setp oneshot.0.width 3
    #switch on bed-lube with machine start
    net power-on oneshot.0.in
    net delay oneshot.0.out          => or2.0.in0
    net timer-delay                  => or2.0.in1
    net bed-lube                     => or2.0.out
    net bed-lube                     => hm2_5i20.0.gpio.044.out
    setp    hm2_5i20.0.gpio.044.is_output true
    setp    hm2_5i20.0.gpio.044.invert_output true
    #create timer for bed-lube
    #the impulse will be 3 sec
    #the delay between impulse will be 60min = 60*60=3600 sec
    setp timedelay.0.on-delay 3600
    setp timedelay.0.off-delay 3
    net lube-is-on  => and2.4.in0
    net timer-in    => and2.4.in1
    net timer-in-1  => and2.4.out
    net timer-in-1  => timedelay.0.in
    net timer-delay => timedelay.0.out
    net timer-delay => not.4.in
    net timer-in    <= not.4.out
    
    ################################
    # FLOOD ON/OFF EXTERNAL BUTTON #
    ################################
    net flood-on  => halui.flood.on     => hm2_5i20.0.gpio.035.in_not
    net flood-off => halui.flood.off    => hm2_5i20.0.gpio.036.in_not
    #out from CNC
    net coolant-flood halui.flood.is-on => hm2_5i20.0.gpio.043.out
    setp    hm2_5i20.0.gpio.043.is_output true
    setp    hm2_5i20.0.gpio.043.invert_output true
    
    ############################
    # HOME ALL EXTERNAL BUTTON #
    ############################
    net home-on-btn        => and2.1.in0     <= hm2_5i20.0.gpio.039.in_not
    net strob-man          => and2.1.in1
    net home-strob         <= and2.1.out     => halui.home-all
    
    #net is-home-out-not    => and2.1.in1
    #net home-on            <= and2.1.out     => and2.9.in0
    #net strob-man          => and2.9.in1
    #net home-strob         <= and2.9.out     => halui.home-all
    
    ##################################
    # SPINDLE ON/OFF EXTERNAL BUTTON #
    ##################################
    #START SPINDLE
    net spindle-on         => and2.2.in0     <= hm2_5i20.0.gpio.038.in_not
    net strob-man          => and2.2.in1
    net spindle-on-strob   <= and2.2.out     => halui.spindle.start
    
    #STOP SPINDLE
    net spindle-off        => and2.3.in0     <= hm2_5i20.0.gpio.037.in_not
    net strob-man          => and2.3.in1
    net spindle-off-strob  <= and2.3.out     => halui.spindle.stop
    
    # --- SPINDLE-AT-SPEED ---
    ###net spindle-at-speed     <=  hm2_5i20.0.gpio.033.in
    
    #*******************
    #  AXIS X
    #*******************
    ### start add by hand 2010-11-16
    setp pid.0.Pgain     [AXIS_0]P
    setp pid.0.Igain     [AXIS_0]I
    setp pid.0.Dgain     [AXIS_0]D
    setp pid.0.bias      [AXIS_0]BIAS
    setp pid.0.FF0       [AXIS_0]FF0
    setp pid.0.FF1       [AXIS_0]FF1
    setp pid.0.FF2       [AXIS_0]FF2
    setp pid.0.deadband  [AXIS_0]DEADBAND
    setp pid.0.maxoutput [AXIS_0]MAX_OUTPUT
    ### end add by hand 2010-11-16
    				
    # Step Gen signals/setup
    
    setp   hm2_5i20.0.stepgen.00.dirsetup        [AXIS_0]DIRSETUP
    setp   hm2_5i20.0.stepgen.00.dirhold         [AXIS_0]DIRHOLD
    setp   hm2_5i20.0.stepgen.00.steplen         [AXIS_0]STEPLEN
    setp   hm2_5i20.0.stepgen.00.stepspace       [AXIS_0]STEPSPACE
    setp   hm2_5i20.0.stepgen.00.position-scale  [AXIS_0]SCALE
    setp   hm2_5i20.0.stepgen.00.maxaccel         0
    setp   hm2_5i20.0.stepgen.00.maxvel           0
    setp   hm2_5i20.0.stepgen.00.step_type        0
    setp   hm2_5i20.0.stepgen.00.control-type     1
    
    # ---Encoder feedback signals/setup---
    
    setp hm2_5i20.0.encoder.00.counter-mode 0
    setp hm2_5i20.0.encoder.00.filter 1
    setp hm2_5i20.0.encoder.00.index-invert 0
    setp hm2_5i20.0.encoder.00.index-mask 0
    setp hm2_5i20.0.encoder.00.index-mask-invert 0
    setp hm2_5i20.0.encoder.00.scale  [AXIS_0]INPUT_SCALE
    			    
    net X.pos-fb    axis.0.motor-pos-fb  <=  hm2_5i20.0.encoder.00.position => pid.0.feedback
    net X.pos-cmd  axis.0.motor-pos-cmd  => pid.0.command
    net X.enable     axis.0.amp-enable-out =>  hm2_5i20.0.stepgen.00.enable => pid.0.enable
    net X.pos-out pid.0.output =>   hm2_5i20.0.stepgen.00.velocity-cmd
    net X.index => hm2_5i20.0.encoder.00.index-enable <= axis.0.index-enable
    
    # ---setup home / limit switch signals---
    
    net X.home         =>  debounce.0.4.in
    net X.home-filtred =>  debounce.0.4.out  axis.0.home-sw-in
    net X.min          =>  debounce.0.0.in
    net X.min-filtred  =>  debounce.0.0.out  axis.0.neg-lim-sw-in
    net X.max          =>  debounce.0.1.in
    net X.max-filtred  =>  debounce.0.1.out  axis.0.pos-lim-sw-in
    net X.ferror       =>  axis.0.f-error
    net X.ferror       =>  minmax.0.in
    
    #*******************
    #  AXIS Z
    #*******************
    ### start add by hand 2010-11-16
    setp pid.1.Pgain     [AXIS_0]P
    setp pid.1.Igain     [AXIS_0]I
    setp pid.1.Dgain     [AXIS_0]D
    setp pid.1.bias      [AXIS_0]BIAS
    setp pid.1.FF0       [AXIS_0]FF0
    setp pid.1.FF1       [AXIS_0]FF1
    setp pid.1.FF2       [AXIS_0]FF2
    setp pid.1.deadband  [AXIS_0]DEADBAND
    setp pid.1.maxoutput [AXIS_0]MAX_OUTPUT
    ### end add by hand 2010-11-16
    
    # Step Gen signals/setup
    
    setp   hm2_5i20.0.stepgen.01.dirsetup        [AXIS_2]DIRSETUP
    setp   hm2_5i20.0.stepgen.01.dirhold         [AXIS_2]DIRHOLD
    setp   hm2_5i20.0.stepgen.01.steplen         [AXIS_2]STEPLEN
    setp   hm2_5i20.0.stepgen.01.stepspace       [AXIS_2]STEPSPACE
    setp   hm2_5i20.0.stepgen.01.position-scale  [AXIS_2]SCALE
    setp   hm2_5i20.0.stepgen.01.maxaccel         0
    setp   hm2_5i20.0.stepgen.01.maxvel           0
    setp   hm2_5i20.0.stepgen.01.step_type        0
    setp   hm2_5i20.0.stepgen.01.control-type     1
    
    # ---Encoder feedback signals/setup---
    
    setp hm2_5i20.0.encoder.01.counter-mode 0
    setp hm2_5i20.0.encoder.01.filter 1
    setp hm2_5i20.0.encoder.01.index-invert 0
    setp hm2_5i20.0.encoder.01.index-mask 0
    setp hm2_5i20.0.encoder.01.index-mask-invert 0
    setp hm2_5i20.0.encoder.01.scale  [AXIS_2]INPUT_SCALE
    
    net Z.pos-fb    axis.2.motor-pos-fb   <=  hm2_5i20.0.encoder.01.position => pid.1.feedback
    net Z.pos-cmd   axis.2.motor-pos-cmd  => pid.1.command
    net Z.enable    axis.2.amp-enable-out =>  hm2_5i20.0.stepgen.01.enable => pid.1.enable
    net Z.pos-out   pid.1.output          =>   hm2_5i20.0.stepgen.01.velocity-cmd
    net Z.index        => hm2_5i20.0.encoder.01.index-enable <= axis.2.index-enable
    
    # ---setup home / limit switch signals---
    
    net Z.home         =>  debounce.0.5.in
    net Z.home-filtred =>  debounce.0.5.out axis.2.home-sw-in
    net Z.min          =>  debounce.0.2.in 
    net Z.min-filtred  =>  debounce.0.2.out axis.2.neg-lim-sw-in
    net Z.max          =>  debounce.0.3.in
    net Z.max-filtred  =>  debounce.0.3.out axis.2.pos-lim-sw-in
    net Z.ferror       =>  axis.2.f-error
    net Z.ferror       =>  minmax.1.in
    
    #*******************
    #  SPINDLE S
    #*******************
    
    # ---PWM Generator signals/setup---
    
    setp   hm2_5i20.0.pwmgen.00.output-type 1
    setp   hm2_5i20.0.pwmgen.00.scale  [SPINDLE_9]OUTPUT_SCALE
    
    net spindle-enable        => hm2_5i20.0.pwmgen.00.enable
    net spindle-vel-cmd       =>  abs.spindle.in
    net absolute-spindle-vel    abs.spindle.out =>   hm2_5i20.0.pwmgen.00.value
    
    net spindle-ccw  => not.2.in
    net spindle-enable => not.3.in
    net spindle-cw-n  => not.2.out  =>  hm2_5i20.0.gpio.045.out
    setp    hm2_5i20.0.gpio.045.is_output true
    net spindle-enable-n  => not.3.out =>  hm2_5i20.0.gpio.047.out
    setp    hm2_5i20.0.gpio.047.is_output true
    
    # ---Encoder feedback signals/setup---
    
    setp    hm2_5i20.0.encoder.02.counter-mode 0
    setp    hm2_5i20.0.encoder.02.filter 1
    setp    hm2_5i20.0.encoder.02.index-invert 0
    setp    hm2_5i20.0.encoder.02.index-mask 0
    setp    hm2_5i20.0.encoder.02.index-mask-invert 0
    setp    hm2_5i20.0.encoder.02.scale  [SPINDLE_9]INPUT_SCALE
    
    net spindle-revs              <=  hm2_5i20.0.encoder.02.position
    net spindle-vel-fb            <=  hm2_5i20.0.encoder.02.velocity
    net spindle-index-enable     <=>  hm2_5i20.0.encoder.02.index-enable
    
    # ---setup spindle control signals---
    
    net spindle-vel-cmd-rps    <=  motion.spindle-speed-out-rps
    net spindle-vel-cmd        <=  motion.spindle-speed-out
    net spindle-enable         <=  motion.spindle-on
    net spindle-cw             <=  motion.spindle-forward
    net spindle-ccw            <=  motion.spindle-reverse
    net spindle-brake          <=  motion.spindle-brake
    net spindle-revs           =>  motion.spindle-revs
    net spindle-at-speed       =>  motion.spindle-at-speed
    net spindle-vel-fb         =>  motion.spindle-speed-in
    net spindle-index-enable  <=>  motion.spindle-index-enable
    ##### POSITEVLY
    #if false, then input encoder
    #if true - no input encoder
    sets spindle-at-speed true
    #******************************
    # connect miscellaneous signals
    #******************************
    
    #  ---probe signal---
    
    net probe-in     =>  motion.probe-input
    
    #  ---estop signals---
    
    #logical AND
    net estop-in1 and2.0.in0  <=  iocontrol.0.user-enable-out
    #if button pressed, then "0" everething
    net estop-in2 and2.0.in1  <=  hm2_5i20.0.gpio.034.in_not
    net estop-out and2.0.out  =>  iocontrol.0.emc-enable-in
    net enable                =>  motion.motion-enabled
    
    #  ---toolchange signals for custom tool changer---
    
    #net tool-number             <=  iocontrol.0.tool-prep-number
    #net tool-change-request     <=  iocontrol.0.tool-change
    #net tool-change-confirmed   =>  iocontrol.0.tool-changed
    #net tool-prepare-request    <=  iocontrol.0.tool-prepare
    #net tool-prepare-confirmed  =>  iocontrol.0.tool-prepared
    
    net tool-number              <=  iocontrol.0.tool-prep-number
    net tool-change-loopback iocontrol.0.tool-change    =>  iocontrol.0.tool-changed
    net tool-prepare-loopback iocontrol.0.tool-prepare  =>  iocontrol.0.tool-prepared
    

  • Пользовательский (для GUI) HAL файл системы custom-postgui.hal
    # Include your customized HAL commands here
    # The commands in this file are run after the AXIS GUI (including PyVCP panel) starts
    
    #SPINDLE signals
    
    net absolute-spindle-vel    =>  pyvcp.spindle-speed
    
    #LED signals
    
    net estop-out     => pyvcp.led-estop
    net power-on      => pyvcp.led-power-on
    net X.enable      => pyvcp.led-x-enable
    net Z.enable      => pyvcp.led-z-enable
    net coolant-flood => pyvcp.led-flood
    net lube-is-on    => pyvcp.led-lube
    net bed-lube      => pyvcp.led-bed-lube
    net strob-man     => pyvcp.led-manual
    net strob-auto    => pyvcp.led-auto
    net strob-mdi     => pyvcp.led-mdi
    
    #LED switches
    
    net power-on => flipflop.0.reset
    net power-on => flipflop.1.reset
    net power-on => flipflop.2.reset
    net power-on => flipflop.3.reset
    
    net X.min => flipflop.0.set
    net X.min-out => flipflop.0.out pyvcp.led-x-min
    
    net X.max => flipflop.1.set
    net X.max-out => flipflop.1.out pyvcp.led-x-max
    
    net Z.min => flipflop.2.set
    net Z.min-out => flipflop.2.out pyvcp.led-z-min
    
    net Z.max => flipflop.3.set
    net Z.max-out => flipflop.3.out pyvcp.led-z-max
    
    #TIMER WINDOW
    net timer-elapsed => pyvcp.lube-time
    
    #FB WINDOW
    net X.pos-fb => pyvcp.x-fb
    net Z.pos-fb => pyvcp.z-fb
    
    #F-ERROR WINDOW
    net X.ferror => pyvcp.x-error
    net Z.ferror => pyvcp.z-error
    
    net X.ferror-min <= minmax.0.min => pyvcp.x-error-min
    net X.ferror-max <= minmax.0.max => pyvcp.x-error-max
    
    net Z.ferror-min <= minmax.1.min => pyvcp.z-error-min
    net Z.ferror-max <= minmax.1.max => pyvcp.z-error-max
    
    #JOG
    setp mux8.0.in1 1.00
    setp mux8.0.in2 100.00
    setp mux8.0.in4 1000.00
    
    net scale-1 <= pyvcp.jog-scale.1 => mux8.0.sel0
    net scale-10 <= pyvcp.jog-scale.10 => mux8.0.sel1
    net scale-100 <= pyvcp.jog-scale.100 => mux8.0.sel2
    
    # connect the X pyVCP buttons
    net my-jogxminus halui.jog.0.minus <= pyvcp.x-minus
    net my-jogxplus halui.jog.0.plus <= pyvcp.x-plus
    # connect the Z pyVCP buttons
    net my-jogzminus halui.jog.2.minus <= pyvcp.z-minus
    net my-jogzplus halui.jog.2.plus <= pyvcp.z-plus
    # connect the pyVCP jog speed slider
    net my-jogspeed halui.jog-speed <= mux8.0.out
    

  • Графическая панель пользователя файл системы custompanel.xml


    На главную страницу
    Project by Alex V. Inozemcev & Alexandr V. Massja