Gestions de deux servomoteur sur portique linuxcnc

NovA
Nouveau
23 Juillet 2017
11
  • Auteur de la discussion
  • #1
Bonjour à tous,

Voilà plusieurs semaines que je bosse sur une CNC 3 axes à rétrofiter:
- Drivers commandés en +-10Vdc
- Moteurs brushless avec codeurs intégrés
- Le pont est déplacé par 2 moteurs à synchroniser
La machine fera principalement de la découpe plasma, avec la pose d'une broche de temps à autre.
J'ai choisi LinuxCNC, avec un kit MESA 5i25+7i77.

Aujourd'hui j'en suis au stade où les moteurs tournent bien, mes boucles PID sont certainement à affiner mais les mouvements sont corrects.
Problème: Je ne parviens pas à comprendre comment jumeler les deux moteurs de mon portique.

Je ne dois pas chercher correctement, je ne trouve pas d'explication (et des exemples surtout) de configurations de portiques autre qu'avec moteurs pas-à-pas.
J'ai fait différents essais avec "GANTRY", mais je ne parviens pas à charger le module (erreur au démarrage), et de toutes façon la structure de la gestion de ce couple de moteur dans HAL est bien trop floue pour moi pour l'instant, pour que je puisse aller plus loin.

SVP, quelqu'un aurait un exemple de fichier .HAL à me communiquer pour ce type de moteur? ou des explications claires? ou des liens que je n'aurais pas trouvé?

D'avance, merci beaucoup!
 
gaston48
Compagnon
26 Février 2008
8 940
59000
Bonjour,
Il faut que tu joignes ton fichier .INI et .HAL pour que je puisse essayer d'intégrer la modif.

pour insérer du code sans que ça interfère avec le code html de la page de ce forum
tu cliques sur la touche + au dessus et tu as les balises code </>

Code:
ça  c'est du code
 
NovA
Nouveau
23 Juillet 2017
11
  • Auteur de la discussion
  • #3
Bonjour Gaston48,

D'abord merci beaucoup pour ce retour si rapide!
Je ne suis pas à proximité de la machine ce matin, je te joins un des essais que j'ai fait, une archive un peu brouillon (toutes mes excuses) mais je ne veux pas y toucher à l'aveugle, sans pouvoir la réessayer sur la machine avant de te l'envoyer. Du coup tu y verra entre autre:
- "Y1 et Y2" que j'ai mis sous cette forme pour suivre une piste
- Toutes les parties inutilisés pour l'instant (spindle, capteurs homing) en commentaires
- PID simplifiées juste pour essai (les moteurs tournent)

En espérant que tu n'y perde pas trop de temps:


Code:
# INI CNC-D, le 23/07/17

[EMC]
MACHINE = CNC-D
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 = linuxcnc.gif
INTRO_TIME = 5
PROGRAM_PREFIX =
PYVCP = pyvcp-panel.xml
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
POSITION_FEEDBACK = ACTUAL
DEFAULT_LINEAR_VELOCITY = 30
MAX_LINEAR_VELOCITY = 70
MIN_LINEAR_VELOCITY = 0.01
DEFAULT_ANGULAR_VELOCITY = 12.000000
MAX_ANGULAR_VELOCITY = 180.000000
MIN_ANGULAR_VELOCITY = 1.666667
EDITOR = gedit
GEOMETRY = xyz

[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 = linuxcnc.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=5i25

[HAL]
HALUI = halui
HALFILE = CNC_M.Daclin.hal
HALFILE = custom.hal
POSTGUI_HALFILE = postgui_call_list.hal
SHUTDOWN = shutdown.hal

[HALUI]

[TRAJ]
AXES = 4
COORDINATES = X Y Z Y
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 30
MAX_LINEAR_VELOCITY = 70
MAX_ACCELERATION = 500

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

#********************
# Axis X
#********************
[AXIS_0]
TYPE = LINEAR
FERROR = 50
MIN_FERROR = 5
MAX_VELOCITY = 70
MAX_ACCELERATION = 500.0
P = 0.3
I = 0
D = 0
FF0 = 0
FF1 = 0.01
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 10
ENCODER_SCALE = 1000
OUTPUT_SCALE = 1
OUTPUT_MIN_LIMIT = -10
OUTPUT_MAX_LIMIT = 10

MIN_LIMIT = -0.01
MAX_LIMIT = 230

HOME_OFFSET = 230
HOME = 140
HOME_SEARCH_VEL = 30
HOME_LATCH_VEL = -0.4
HOME_FINAL_VEL = 40
HOME_USE_INDEX = YES
HOME_SEQUENCE = 1

#********************
# Axis Y1
#********************
[AXIS_1]
TYPE = LINEAR
FERROR = 50
MIN_FERROR = 5
MAX_VELOCITY = 70
MAX_ACCELERATION = 500.0
P = 0.3
I = 0
D = 0
FF0 = 0
FF1 = 0.01
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 10
ENCODER_SCALE = 1000
OUTPUT_SCALE = 1
OUTPUT_MIN_LIMIT = -10
OUTPUT_MAX_LIMIT = 10

MIN_LIMIT = -0.01
MAX_LIMIT = 135

HOME_OFFSET = 135
HOME = 130
HOME_SEARCH_VEL = 30
HOME_LATCH_VEL = -0.4
HOME_FINAL_VEL = 40
HOME_USE_INDEX = YES
HOME_SEQUENCE = 2

#********************
# Axis Y2
#********************
[AXIS_2]
TYPE = LINEAR
FERROR = 50
MIN_FERROR = 5
MAX_VELOCITY = 70
MAX_ACCELERATION = 500.0
P = 0.3
I = 0
D = 0
FF0 = 0
FF1 = 0.01
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 10
ENCODER_SCALE = 1000
OUTPUT_SCALE = 1
OUTPUT_MIN_LIMIT = -10
OUTPUT_MAX_LIMIT = 10

MIN_LIMIT = -0.01
MAX_LIMIT = 135

HOME_OFFSET = 135
HOME = 130
HOME_SEARCH_VEL = 30
HOME_LATCH_VEL = -0.4
HOME_FINAL_VEL = 40
HOME_USE_INDEX = YES
HOME_SEQUENCE = 2

#********************
# Axis Z
#********************
[AXIS_3]
TYPE = LINEAR
FERROR = 50
MIN_FERROR = 5
MAX_VELOCITY = 70
MAX_ACCELERATION = 500.0
P = 0.3
I = 0
D = 0
FF0 = 0
FF1 = 0.01
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 10
ENCODER_SCALE = 1000
OUTPUT_SCALE = 1
OUTPUT_MIN_LIMIT = -10
OUTPUT_MAX_LIMIT = 10

MIN_LIMIT = -0.01
MAX_LIMIT = 135

HOME_OFFSET = 135
HOME = 130
HOME_SEARCH_VEL = 30
HOME_LATCH_VEL = -0.4
HOME_FINAL_VEL = 40
HOME_USE_INDEX = YES
HOME_SEQUENCE = 2

#********************
# Spindle
#********************

#        [SPINDLE_9]
#        P = 0
#        I = 0.0
#        D = 0.0
#        FF0 = 1.0
#        FF1 = 0.0
#        FF2 = 0.0
#        BIAS = 0.0
#        DEADBAND = 0.0
#        MAX_OUTPUT = 4000
#        OUTPUT_SCALE = 4000
#        OUTPUT_MIN_LIMIT = -4000
#        OUTPUT_MAX_LIMIT = 4000

...et:

Code:
# CNC-D

loadrt trivkins
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt hostmot2
loadrt hm2_pci config=" num_encoders=6 num_pwmgens=6 num_stepgens=0 sserial_port_0=000xxx"

setp    hm2_5i25.0.watchdog.timeout_ns 5000000

loadrt pid names=pid.x,pid.y1,pid.y2,pid.z

#        loadrt abs names=abs.spindle
#        loadrt lowpass names=lowpass.spindle

addf hm2_5i25.0.read          servo-thread
addf hm2_5i25.0.write         servo-thread

addf motion-command-handler   servo-thread
addf motion-controller        servo-thread

addf pid.x.do-pid-calcs       servo-thread
addf pid.y1.do-pid-calcs       servo-thread
addf pid.y2.do-pid-calcs       servo-thread
addf pid.z.do-pid-calcs       servo-thread
#        addf pid.s.do-pid-calcs       servo-thread

#        addf abs.spindle              servo-thread
#        addf lowpass.spindle          servo-thread


# entrées dans la 7i77 pour MIN et MAX de X Y et Z enclenchant un machine OFF

#        net min-x     <=  hm2_5i25.0.7i77.0.0.input-13-not
#        net max-x     <=  hm2_5i25.0.7i77.0.0.input-11-not
#        net min-y     <=  hm2_5i25.0.7i77.0.0.input-12-not
#        net max-y     <=  hm2_5i25.0.7i77.0.0.input-09-not
#        net min-z     <=  hm2_5i25.0.7i77.0.0.input-10-not
#        net max-z     <=  hm2_5i25.0.7i77.0.0.input-08-not

#        loadrt  logic  count=1 personality=0x206
#        addf    logic.0          servo-thread

#        net  max-x  =>   logic.0.in-00
#        net  min-x   =>  logic.0.in-01
#        net  max-y  =>   logic.0.in-02
#        net  min-y   =>  logic.0.in-03
#        net  max-z  =>   logic.0.in-04
#        net  min-z   =>  logic.0.in-05

#        net any_switch      logic.0.or  =>  halui.machine.off

#*******************
#  AXIS X
#*******************

setp   pid.x.Pgain     [AXIS_0]P
setp   pid.x.Igain     [AXIS_0]I
setp   pid.x.Dgain     [AXIS_0]D
setp   pid.x.bias      [AXIS_0]BIAS
setp   pid.x.FF0       [AXIS_0]FF0
setp   pid.x.FF1       [AXIS_0]FF1
setp   pid.x.FF2       [AXIS_0]FF2
setp   pid.x.deadband  [AXIS_0]DEADBAND
setp   pid.x.maxoutput [AXIS_0]MAX_OUTPUT
setp   pid.x.error-previous-target true

net x-index-enable  <=> pid.x.index-enable
net x-enable        =>  pid.x.enable
net x-pos-cmd       =>  pid.x.command
net x-vel-cmd       =>  pid.x.command-deriv
net x-pos-fb        =>  pid.x.feedback
net x-output        =>  pid.x.output
net tracking-errorx <=   pid.x.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout0-scalemax  [AXIS_0]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout0-minlim    [AXIS_0]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout0-maxlim    [AXIS_0]OUTPUT_MAX_LIMIT

net x-output     => hm2_5i25.0.7i77.0.1.analogout0

net x-pos-cmd    axis.0.motor-pos-cmd
net x-enable     axis.0.amp-enable-out

# enable _all_ sserial pwmgens
#  "autorisation de puissance" sur ENA0- et +24V sur ENA0+

net x-enable   hm2_5i25.0.7i77.0.1.analogena

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.00.counter-mode 0
setp    hm2_5i25.0.encoder.00.filter 1
setp    hm2_5i25.0.encoder.00.index-invert 0
setp    hm2_5i25.0.encoder.00.index-mask 0
setp    hm2_5i25.0.encoder.00.index-mask-invert 0
setp    hm2_5i25.0.encoder.00.scale  [AXIS_0]ENCODER_SCALE

net x-pos-fb               <=  hm2_5i25.0.encoder.00.position
net x-vel-fb               <=  hm2_5i25.0.encoder.00.velocity
net x-pos-fb               =>  axis.0.motor-pos-fb
net x-index-enable    axis.0.index-enable  <=>  hm2_5i25.0.encoder.00.index-enable
net x-pos-rawcounts        <=  hm2_5i25.0.encoder.00.rawcounts

# ---setup home / limit switch signals---

#        net home-x <= hm2_5i25.0.7i77.0.0.input-21
#        net home-x => axis.0.home-sw-in
#        net x-index-enable axis.0.index-enable <=> hm2_5i25.0.encoder.00.index-enable
#        net x-index-enable <=> pid.x.index-enable

#*******************
#  AXIS Y1
#*******************

setp   pid.y1.Pgain     [AXIS_1]P
setp   pid.y1.Igain     [AXIS_1]I
setp   pid.y1.Dgain     [AXIS_1]D
setp   pid.y1.bias      [AXIS_1]BIAS
setp   pid.y1.FF0       [AXIS_1]FF0
setp   pid.y1.FF1       [AXIS_1]FF1
setp   pid.y1.FF2       [AXIS_1]FF2
setp   pid.y1.deadband  [AXIS_1]DEADBAND
setp   pid.y1.maxoutput [AXIS_1]MAX_OUTPUT
setp   pid.y1.error-previous-target true

net y1-index-enable  <=> pid.y1.index-enable
net y1-enable        =>  pid.y1.enable
net y1-pos-cmd       =>  pid.y1.command
net y1-vel-cmd       =>  pid.y1.command-deriv
net y1-pos-fb        =>  pid.y1.feedback
net y1-output        =>  pid.y1.output
net tracking-errory1 <=   pid.y1.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout1-scalemax  [AXIS_1]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout1-minlim    [AXIS_1]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout1-maxlim    [AXIS_1]OUTPUT_MAX_LIMIT

net y1-output  => hm2_5i25.0.7i77.0.1.analogout1
net y1-pos-cmd    axis.1.motor-pos-cmd
net y1-enable     axis.1.amp-enable-out

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.01.counter-mode 0
setp    hm2_5i25.0.encoder.01.filter 1
setp    hm2_5i25.0.encoder.01.index-invert 0
setp    hm2_5i25.0.encoder.01.index-mask 0
setp    hm2_5i25.0.encoder.01.index-mask-invert 0
setp    hm2_5i25.0.encoder.01.scale  [AXIS_1]ENCODER_SCALE

net y1-pos-fb               <=  hm2_5i25.0.encoder.01.position
net y1-vel-fb               <=  hm2_5i25.0.encoder.01.velocity
net y1-pos-fb               =>  axis.1.motor-pos-fb
net y1-index-enable    axis.1.index-enable  <=>  hm2_5i25.0.encoder.01.index-enable
net y1-pos-rawcounts        <=  hm2_5i25.0.encoder.01.rawcounts

# ---setup home / limit switch signals---

#        net home-y <= hm2_5i25.0.7i77.0.0.input-22
#        net home-y => axis.1.home-sw-in
#        net y-index-enable axis.1.index-enable <=> hm2_5i25.0.encoder.01.index-enable
#        net y-index-enable <=> pid.y.index-enable
#*******************
#  AXIS Z
#*******************

setp   pid.z.Pgain     [AXIS_3]P
setp   pid.z.Igain     [AXIS_3]I
setp   pid.z.Dgain     [AXIS_3]D
setp   pid.z.bias      [AXIS_3]BIAS
setp   pid.z.FF0       [AXIS_3]FF0
setp   pid.z.FF1       [AXIS_3]FF1
setp   pid.z.FF2       [AXIS_3]FF2
setp   pid.z.deadband  [AXIS_3]DEADBAND
setp   pid.z.maxoutput [AXIS_3]MAX_OUTPUT
setp   pid.z.error-previous-target true

net z-index-enable  <=> pid.z.index-enable
net z-enable        =>  pid.z.enable
net z-pos-cmd       =>  pid.z.command
net z-vel-cmd       =>  pid.z.command-deriv
net z-pos-fb        =>  pid.z.feedback
net z-output        =>  pid.z.output
net tracking-errorz <=   pid.z.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout3-scalemax  [AXIS_3]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout3-minlim    [AXIS_3]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout3-maxlim    [AXIS_3]OUTPUT_MAX_LIMIT

net z-output => hm2_5i25.0.7i77.0.1.analogout3
net z-pos-cmd    axis.3.motor-pos-cmd
net z-enable     axis.3.amp-enable-out

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.03.counter-mode 0
setp    hm2_5i25.0.encoder.03.filter 1
setp    hm2_5i25.0.encoder.03.index-invert 0
setp    hm2_5i25.0.encoder.03.index-mask 0
setp    hm2_5i25.0.encoder.03.index-mask-invert 0
setp    hm2_5i25.0.encoder.03.scale  [AXIS_3]ENCODER_SCALE

net z-pos-fb               <=  hm2_5i25.0.encoder.03.position
net z-vel-fb               <=  hm2_5i25.0.encoder.03.velocity
net z-pos-fb               =>  axis.3.motor-pos-fb
net z-index-enable    axis.3.index-enable  <=>  hm2_5i25.0.encoder.03.index-enable
net z-pos-rawcounts        <=  hm2_5i25.0.encoder.03.rawcounts

# ---setup home / limit switch signals---

#        net home-z <= hm2_5i25.0.7i77.0.0.input-23
#        net home-z => axis.2.home-sw-in
#        net z-index-enable axis.2.index-enable <=> hm2_5i25.0.encoder.02.index-enable
#        net z-index-enable <=> pid.z.index-enable


#*******************
#  AXIS Y2
#*******************

setp   pid.y2.Pgain     [AXIS_2]P
setp   pid.y2.Igain     [AXIS_2]I
setp   pid.y2.Dgain     [AXIS_2]D
setp   pid.y2.bias      [AXIS_2]BIAS
setp   pid.y2.FF0       [AXIS_2]FF0
setp   pid.y2.FF1       [AXIS_2]FF1
setp   pid.y2.FF2       [AXIS_2]FF2
setp   pid.y2.deadband  [AXIS_2]DEADBAND
setp   pid.y2.maxoutput [AXIS_2]MAX_OUTPUT
setp   pid.y2.error-previous-target true

net y2-index-enable  <=> pid.y2.index-enable
net y2-enable        =>  pid.y2.enable
net y2-pos-cmd       =>  pid.y2.command
net y2-vel-cmd       =>  pid.y2.command-deriv
net y2-pos-fb        =>  pid.y2.feedback
net y2-output        =>  pid.y2.output
net tracking-errory2 <=   pid.y2.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout2-scalemax  [AXIS_2]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout2-minlim    [AXIS_2]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout2-maxlim    [AXIS_2]OUTPUT_MAX_LIMIT

net y2-output  => hm2_5i25.0.7i77.0.1.analogout2
net y2-pos-cmd    axis.2.motor-pos-cmd
net y2-enable     axis.2.amp-enable-out

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.02.counter-mode 0
setp    hm2_5i25.0.encoder.02.filter 1
setp    hm2_5i25.0.encoder.02.index-invert 0
setp    hm2_5i25.0.encoder.02.index-mask 0
setp    hm2_5i25.0.encoder.02.index-mask-invert 0
setp    hm2_5i25.0.encoder.02.scale  [AXIS_2]ENCODER_SCALE

net y2-pos-fb               <=  hm2_5i25.0.encoder.02.position
net y2-vel-fb               <=  hm2_5i25.0.encoder.02.velocity
net y2-pos-fb               =>  axis.2.motor-pos-fb
net y2-index-enable    axis.2.index-enable  <=>  hm2_5i25.0.encoder.02.index-enable
net y2-pos-rawcounts        <=  hm2_5i25.0.encoder.02.rawcounts

# ---setup home / limit switch signals---

#        net home-y <= hm2_5i25.0.7i77.0.0.input-22
#        net home-y => axis.1.home-sw-in
#        net y-index-enable axis.1.index-enable <=> hm2_5i25.0.encoder.01.index-enable
#        net y-index-enable <=> pid.y.index-enable


#*******************
#  SPINDLE S
#*******************



#******************************
# connect miscellaneous signals
#******************************

#  ---HALUI signals---

#        net joint-select-a        halui.joint.0.select
#        net x-is-homed            halui.joint.0.is-homed
#        net jog-x-pos             halui.jog.0.plus
#        net jog-x-neg             halui.jog.0.minus
#        net jog-x-analog          halui.jog.0.analog
#        net joint-select-b        halui.joint.1.select
#        net y-is-homed            halui.joint.1.is-homed
#        net jog-y-pos             halui.jog.1.plus
#        net jog-y-neg             halui.jog.1.minus
#        net jog-y-analog          halui.jog.1.analog
#        net joint-select-c        halui.joint.2.select
#        net z-is-homed            halui.joint.2.is-homed
#        net jog-z-pos             halui.jog.2.plus
#        net jog-z-neg             halui.jog.2.minus
#        net jog-z-analog          halui.jog.2.analog
#        net jog-selected-pos      halui.jog.selected.plus
#        net jog-selected-neg      halui.jog.selected.minus
#        net spindle-manual-cw     halui.spindle.forward
#        net spindle-manual-ccw    halui.spindle.reverse
#        net spindle-manual-stop   halui.spindle.stop
#        net machine-is-on         halui.machine.is-on
#        net jog-speed             halui.jog-speed
#        net MDI-mode              halui.mode.is-mdi

#  ---coolant signals---

net coolant-flood     <=  iocontrol.0.coolant-flood

#  ---probe signal---

net probe-in     =>  motion.probe-input

#  ---motion control signals---

net in-position               <=  motion.in-position
net machine-is-enabled        <=  motion.motion-enabled

#  ---estop signals---

net estop-out     <=  iocontrol.0.user-enable-out
net estop-out     =>  iocontrol.0.emc-enable-in

#  ---manual tool change signals---

#        loadusr -W hal_manualtoolchange
#        net tool-change-request     iocontrol.0.tool-change       =>  hal_manualtoolchange.change
#        net tool-change-confirmed   iocontrol.0.tool-changed      <=  hal_manualtoolchange.changed
#        net tool-number             iocontrol.0.tool-prep-number  =>  hal_manualtoolchange.number
#        net tool-prepare-loopback   iocontrol.0.tool-prepare      =>  iocontrol.0.tool-prepared


Une nouvelle fois: merci beaucoup!
 
gaston48
Compagnon
26 Février 2008
8 940
59000
Je vois que tu es déjà à l'aise avec les éditions de fichier ini et hal .

INI configure l'interface graphique d'axis ainsi que le planificateur de trajectoire qui va
interpréter le gcode. Tu as une machine 3 axes, donc il ne faut déclarer que 3 axes.

C'est au niveau du hard, dans HAL, qu'on pourra brancher une unique commande d'axe
vers 2 servo-moteurs mais qui auront chacun leurs propre PID.
Donc un principe à respecter dans HAL, un emeteur, (une sortie) peut être branché sur
plusieurs récepteurs, (des entrées) mais pas l'inverse. Dans ce cas le récepteur ne doit
être branché que sur une unique sortie d'un aiguillage: logique comme un OU ou
analogique comme un multiplexer MUX.
HAL accepte beaucoup de valeurs de paramètres [entres crochets] qui proviennent de INI
ça n'est pas obligatoire, tu peux rentrer directement des valeurs numériques ou logiques
au bout des lignes "setp" comme par exemple les valeurs de PID l'avantage es que tu peux
les changer "à la volée" quand axis est lancé avec son popup dédié.
Donc les valeurs de PID de l'axe unique Y déclaré dans INI vont être transmises
aux 2 PID individuelles Y1 et Y2 déclarées dans HAL. Si tu veux imposer des
valeurs différentes pour les 2 moteurs en // il faudra les écrire dans HAL et supprimer
les variables entre [].
De la même façon, dans HAL on ne va activer que l'index d'un seul moteur pour
initialiser la POM de précision (après l'activation d'un switch) ainsi que le retour
de position courante vers axis: net y-pos-fb => axis.1.motor-pos-fb
les fichiers ont été modifier avec un éditeur windows, les fins de ligne ne sont pas
compatible avec linux, tu les recharges dans gedit et les sauve en paramétrant bien
"fin de ligne linux".
Ca devrait donner ceci: (non testé car j'ai une 5i20 pas 5i25.)

Ici tu dois pouvoir ne déclarer que num_encoders=4
et les pwm à 0 car sauf erreur, il ne sont pas à déclarer, ils le sont d'une façon implicite avec la 7i77

loadrt hm2_pci config=" num_encoders=6 num_pwmgens=0 num_stepgens=0 sserial_port_0=000xxx"

on doit gagner quelques thread inutiles et donc de la rapidité ?



Code:
# INI CNC-D, le 23/07/17

[EMC]
MACHINE = CNC-D
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 = linuxcnc.gif
INTRO_TIME = 5
PROGRAM_PREFIX =
PYVCP = pyvcp-panel.xml
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
POSITION_FEEDBACK = ACTUAL
DEFAULT_LINEAR_VELOCITY = 30
MAX_LINEAR_VELOCITY = 70
MIN_LINEAR_VELOCITY = 0.01
DEFAULT_ANGULAR_VELOCITY = 12.000000
MAX_ANGULAR_VELOCITY = 180.000000
MIN_ANGULAR_VELOCITY = 1.666667
EDITOR = gedit
GEOMETRY = xyz

[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 = linuxcnc.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=5i25

[HAL]
HALUI = halui
HALFILE = CNC_M.Daclin.hal
HALFILE = custom.hal
POSTGUI_HALFILE = postgui_call_list.hal
SHUTDOWN = shutdown.hal

[HALUI]

[TRAJ]
AXES = 3
COORDINATES = X Y Z
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 30
MAX_LINEAR_VELOCITY = 70
MAX_ACCELERATION = 500

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

#********************
# Axis X
#********************
[AXIS_0]
TYPE = LINEAR
FERROR = 50
MIN_FERROR = 5
MAX_VELOCITY = 70
MAX_ACCELERATION = 500.0
P = 0.3
I = 0
D = 0
FF0 = 0
FF1 = 0.01
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 10
ENCODER_SCALE = 1000
OUTPUT_SCALE = 1
OUTPUT_MIN_LIMIT = -10
OUTPUT_MAX_LIMIT = 10

MIN_LIMIT = -0.01
MAX_LIMIT = 230

HOME_OFFSET = 230
HOME = 140
HOME_SEARCH_VEL = 30
HOME_LATCH_VEL = -0.4
HOME_FINAL_VEL = 40
HOME_USE_INDEX = YES
HOME_SEQUENCE = 1

#********************
# Axis Y
#********************
[AXIS_1]
TYPE = LINEAR
FERROR = 50
MIN_FERROR = 5
MAX_VELOCITY = 70
MAX_ACCELERATION = 500.0
P = 0.3
I = 0
D = 0
FF0 = 0
FF1 = 0.01
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 10
ENCODER_SCALE = 1000
OUTPUT_SCALE = 1
OUTPUT_MIN_LIMIT = -10
OUTPUT_MAX_LIMIT = 10

MIN_LIMIT = -0.01
MAX_LIMIT = 135

HOME_OFFSET = 135
HOME = 130
HOME_SEARCH_VEL = 30
HOME_LATCH_VEL = -0.4
HOME_FINAL_VEL = 40
HOME_USE_INDEX = YES
HOME_SEQUENCE = 2


#********************
# Axis Z
#********************
[AXIS_2]
TYPE = LINEAR
FERROR = 50
MIN_FERROR = 5
MAX_VELOCITY = 70
MAX_ACCELERATION = 500.0
P = 0.3
I = 0
D = 0
FF0 = 0
FF1 = 0.01
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 10
ENCODER_SCALE = 1000
OUTPUT_SCALE = 1
OUTPUT_MIN_LIMIT = -10
OUTPUT_MAX_LIMIT = 10

MIN_LIMIT = -0.01
MAX_LIMIT = 135

HOME_OFFSET = 135
HOME = 130
HOME_SEARCH_VEL = 30
HOME_LATCH_VEL = -0.4
HOME_FINAL_VEL = 40
HOME_USE_INDEX = YES
HOME_SEQUENCE = 2

#********************
# Spindle
#********************

#        [SPINDLE_9]
#        P = 0
#        I = 0.0
#        D = 0.0
#        FF0 = 1.0
#        FF1 = 0.0
#        FF2 = 0.0
#        BIAS = 0.0
#        DEADBAND = 0.0
#        MAX_OUTPUT = 4000
#        OUTPUT_SCALE = 4000
#        OUTPUT_MIN_LIMIT = -4000
#        OUTPUT_MAX_LIMIT = 4000
Code:
# CNC-D

loadrt trivkins
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt hostmot2
loadrt hm2_pci config=" num_encoders=4 num_pwmgens=0 num_stepgens=0 sserial_port_0=000xxx"

setp    hm2_5i25.0.watchdog.timeout_ns 5000000

loadrt pid names=pid.x,pid.y1,pid.y2,pid.z

#        loadrt abs names=abs.spindle
#        loadrt lowpass names=lowpass.spindle

addf hm2_5i25.0.read          servo-thread
addf hm2_5i25.0.write         servo-thread

addf motion-command-handler   servo-thread
addf motion-controller        servo-thread

addf pid.x.do-pid-calcs       servo-thread
addf pid.y1.do-pid-calcs      servo-thread
addf pid.y2.do-pid-calcs      servo-thread
addf pid.z.do-pid-calcs       servo-thread

#        addf pid.s.do-pid-calcs       servo-thread
#        addf abs.spindle              servo-thread
#        addf lowpass.spindle          servo-thread


# entrées dans la 7i77 pour MIN et MAX de X Y et Z enclenchant un machine OFF

#        net min-x     <=  hm2_5i25.0.7i77.0.0.input-13-not
#        net max-x     <=  hm2_5i25.0.7i77.0.0.input-11-not
#        net min-y     <=  hm2_5i25.0.7i77.0.0.input-12-not
#        net max-y     <=  hm2_5i25.0.7i77.0.0.input-09-not
#        net min-z     <=  hm2_5i25.0.7i77.0.0.input-10-not
#        net max-z     <=  hm2_5i25.0.7i77.0.0.input-08-not

#        loadrt  logic  count=1 personality=0x206
#        addf    logic.0          servo-thread

#        net  max-x  =>   logic.0.in-00
#        net  min-x   =>  logic.0.in-01
#        net  max-y  =>   logic.0.in-02
#        net  min-y   =>  logic.0.in-03
#        net  max-z  =>   logic.0.in-04
#        net  min-z   =>  logic.0.in-05

#        net any_switch      logic.0.or  =>  halui.machine.off

#*******************
#  AXIS X
#*******************

setp   pid.x.Pgain     [AXIS_0]P
setp   pid.x.Igain     [AXIS_0]I
setp   pid.x.Dgain     [AXIS_0]D
setp   pid.x.bias      [AXIS_0]BIAS
setp   pid.x.FF0       [AXIS_0]FF0
setp   pid.x.FF1       [AXIS_0]FF1
setp   pid.x.FF2       [AXIS_0]FF2
setp   pid.x.deadband  [AXIS_0]DEADBAND
setp   pid.x.maxoutput [AXIS_0]MAX_OUTPUT
setp   pid.x.error-previous-target true

net x-index-enable  <=> pid.x.index-enable
net x-enable        =>  pid.x.enable
net x-pos-cmd       =>  pid.x.command
net x-vel-cmd       =>  pid.x.command-deriv
net x-pos-fb        =>  pid.x.feedback
net x-vel-fb        =>  pid.x.feedback-deriv
net x-output        =>  pid.x.output
net tracking-errorx <=  pid.x.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout0-scalemax  [AXIS_0]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout0-minlim    [AXIS_0]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout0-maxlim    [AXIS_0]OUTPUT_MAX_LIMIT

net x-output     => hm2_5i25.0.7i77.0.1.analogout0
net x-pos-cmd  <=  axis.0.motor-pos-cmd
net x-enable   <=  axis.0.amp-enable-out

# enable _all_ sserial pwmgens
#  "autorisation de puissance" sur ENA0- et +24V sur ENA0+

net x-enable   hm2_5i25.0.7i77.0.1.analogena

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.00.counter-mode 0
setp    hm2_5i25.0.encoder.00.filter 1
setp    hm2_5i25.0.encoder.00.index-invert 0
setp    hm2_5i25.0.encoder.00.index-mask 0
setp    hm2_5i25.0.encoder.00.index-mask-invert 0
setp    hm2_5i25.0.encoder.00.scale  [AXIS_0]ENCODER_SCALE

net x-pos-fb               <=  hm2_5i25.0.encoder.00.position
net x-vel-fb               <=  hm2_5i25.0.encoder.00.velocity
net x-pos-fb               =>  axis.0.motor-pos-fb
net x-index-enable    axis.0.index-enable  <=>  hm2_5i25.0.encoder.00.index-enable
net x-pos-rawcounts        <=  hm2_5i25.0.encoder.00.rawcounts

# ---setup home / limit switch signals---

#        net home-x <= hm2_5i25.0.7i77.0.0.input-21
#        net home-x => axis.0.home-sw-in

#        net x-index-enable <=> pid.x.index-enable

#*******************
#  AXIS Y
#*******************

setp   pid.y1.Pgain     [AXIS_1]P
setp   pid.y1.Igain     [AXIS_1]I
setp   pid.y1.Dgain     [AXIS_1]D
setp   pid.y1.bias      [AXIS_1]BIAS
setp   pid.y1.FF0       [AXIS_1]FF0
setp   pid.y1.FF1       [AXIS_1]FF1
setp   pid.y1.FF2       [AXIS_1]FF2
setp   pid.y1.deadband  [AXIS_1]DEADBAND
setp   pid.y1.maxoutput [AXIS_1]MAX_OUTPUT
setp   pid.y1.error-previous-target true

net y1-index-enable  <=> pid.y1.index-enable
net y-enable         =>  pid.y1.enable
net y-pos-cmd        =>  pid.y1.command
net y1-vel-cmd       =>  pid.y1.command-deriv
net y1-pos-fb        =>  pid.y1.feedback
net y1-vel-fb        =>  pid.x.feedback-deriv
net y1-output        =>  pid.y1.output
net tracking-errory1 <=  pid.y1.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout1-scalemax  [AXIS_1]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout1-minlim    [AXIS_1]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout1-maxlim    [AXIS_1]OUTPUT_MAX_LIMIT

net y1-output  => hm2_5i25.0.7i77.0.1.analogout1
net y-pos-cmd  <=  axis.1.motor-pos-cmd
net y-enable   <=  axis.1.amp-enable-out

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.01.counter-mode 0
setp    hm2_5i25.0.encoder.01.filter 1
setp    hm2_5i25.0.encoder.01.index-invert 0
setp    hm2_5i25.0.encoder.01.index-mask 0
setp    hm2_5i25.0.encoder.01.index-mask-invert 0
setp    hm2_5i25.0.encoder.01.scale  [AXIS_1]ENCODER_SCALE

net y1-pos-fb               <=  hm2_5i25.0.encoder.01.position
net y1-vel-fb               <=  hm2_5i25.0.encoder.01.velocity
net y1-pos-fb                =>  axis.1.motor-pos-fb
net y1-index-enable    axis.1.index-enable  <=>  hm2_5i25.0.encoder.01.index-enable
net y1-pos-rawcounts        <=  hm2_5i25.0.encoder.01.rawcounts

# ---setup home / limit switch signals---

#        net home-y <= hm2_5i25.0.7i77.0.0.input-22
#        net home-y => axis.1.home-sw-in



#*******************
#  AXIS Y  esclave
#*******************

setp   pid.y2.Pgain     [AXIS_1]P
setp   pid.y2.Igain     [AXIS_1]I
setp   pid.y2.Dgain     [AXIS_1]D
setp   pid.y2.bias      [AXIS_1]BIAS
setp   pid.y2.FF0       [AXIS_1]FF0
setp   pid.y2.FF1       [AXIS_1]FF1
setp   pid.y2.FF2       [AXIS_1]FF2
setp   pid.y2.deadband  [AXIS_1]DEADBAND
setp   pid.y2.maxoutput [AXIS_1]MAX_OUTPUT
setp   pid.y2.error-previous-target true

net y-enable         =>  pid.y2.enable
net y-pos-cmd        =>  pid.y2.command
net y2-vel-cmd       =>  pid.y2.command-deriv
net y2-pos-fb        =>  pid.y2.feedback
net y2-vel-fb        =>  pid.x.feedback-deriv
net y2-output        =>  pid.y2.output
net tracking-errory2 <=  pid.y2.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout2-scalemax  [AXIS_1]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout2-minlim    [AXIS_1]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout2-maxlim    [AXIS_1]OUTPUT_MAX_LIMIT

net y2-output  => hm2_5i25.0.7i77.0.1.analogout2


# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.02.counter-mode 0
setp    hm2_5i25.0.encoder.02.filter 1
setp    hm2_5i25.0.encoder.02.index-invert 0
setp    hm2_5i25.0.encoder.02.index-mask 0
setp    hm2_5i25.0.encoder.02.index-mask-invert 0
setp    hm2_5i25.0.encoder.02.scale              [AXIS_1]ENCODER_SCALE

net y2-pos-fb               <=  hm2_5i25.0.encoder.02.position
net y2-vel-fb               <=  hm2_5i25.0.encoder.02.velocity
net y2-pos-rawcounts        <=  hm2_5i25.0.encoder.02.rawcounts



#*******************
#  AXIS Z
#*******************

setp   pid.z.Pgain     [AXIS_2]P
setp   pid.z.Igain     [AXIS_2]I
setp   pid.z.Dgain     [AXIS_2]D
setp   pid.z.bias      [AXIS_2]BIAS
setp   pid.z.FF0       [AXIS_2]FF0
setp   pid.z.FF1       [AXIS_2]FF1
setp   pid.z.FF2       [AXIS_2]FF2
setp   pid.z.deadband  [AXIS_2]DEADBAND
setp   pid.z.maxoutput [AXIS_2]MAX_OUTPUT
setp   pid.z.error-previous-target true

net z-index-enable  <=> pid.z.index-enable
net z-enable        =>  pid.z.enable
net z-pos-cmd       =>  pid.z.command
net z-vel-cmd       =>  pid.z.command-deriv
net z-pos-fb        =>  pid.z.feedback
net z-vel-fb        =>  pid.x.feedback-deriv
net z-output        =>  pid.z.output
net tracking-errorz <=   pid.z.error

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout3-scalemax  [AXIS_2]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout3-minlim    [AXIS_2]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout3-maxlim    [AXIS_2]OUTPUT_MAX_LIMIT

net z-output   => hm2_5i25.0.7i77.0.1.analogout3
net z-pos-cmd  <=  axis.2.motor-pos-cmd
net z-enable   <=  axis.2.amp-enable-out

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.03.counter-mode 0
setp    hm2_5i25.0.encoder.03.filter 1
setp    hm2_5i25.0.encoder.03.index-invert 0
setp    hm2_5i25.0.encoder.03.index-mask 0
setp    hm2_5i25.0.encoder.03.index-mask-invert 0
setp    hm2_5i25.0.encoder.03.scale  [AXIS_2]ENCODER_SCALE

net z-pos-fb               <=  hm2_5i25.0.encoder.03.position
net z-vel-fb               <=  hm2_5i25.0.encoder.03.velocity
net z-pos-fb               =>  axis.2.motor-pos-fb
net z-index-enable    axis.2.index-enable  <=>  hm2_5i25.0.encoder.03.index-enable
net z-pos-rawcounts        <=  hm2_5i25.0.encoder.03.rawcounts

# ---setup home / limit switch signals---

#        net home-z <= hm2_5i25.0.7i77.0.0.input-23
#        net home-z => axis.2.home-sw-in

#*******************
#  SPINDLE S
#*******************



#******************************
# connect miscellaneous signals
#******************************

#  ---HALUI signals---

#        net joint-select-a        halui.joint.0.select
#        net x-is-homed            halui.joint.0.is-homed
#        net jog-x-pos             halui.jog.0.plus
#        net jog-x-neg             halui.jog.0.minus
#        net jog-x-analog          halui.jog.0.analog
#        net joint-select-b        halui.joint.1.select
#        net y-is-homed            halui.joint.1.is-homed
#        net jog-y-pos             halui.jog.1.plus
#        net jog-y-neg             halui.jog.1.minus
#        net jog-y-analog          halui.jog.1.analog
#        net joint-select-c        halui.joint.2.select
#        net z-is-homed            halui.joint.2.is-homed
#        net jog-z-pos             halui.jog.2.plus
#        net jog-z-neg             halui.jog.2.minus
#        net jog-z-analog          halui.jog.2.analog
#        net jog-selected-pos      halui.jog.selected.plus
#        net jog-selected-neg      halui.jog.selected.minus
#        net spindle-manual-cw     halui.spindle.forward
#        net spindle-manual-ccw    halui.spindle.reverse
#        net spindle-manual-stop   halui.spindle.stop
#        net machine-is-on         halui.machine.is-on
#        net jog-speed             halui.jog-speed
#        net MDI-mode              halui.mode.is-mdi

#  ---coolant signals---

net coolant-flood     <=  iocontrol.0.coolant-flood

#  ---probe signal---

net probe-in     =>  motion.probe-input

#  ---motion control signals---

net in-position               <=  motion.in-position
net machine-is-enabled        <=  motion.motion-enabled

#  ---estop signals---

net estop-out     <=  iocontrol.0.user-enable-out
net estop-out     =>  iocontrol.0.emc-enable-in

#  ---manual tool change signals---

#        loadusr -W hal_manualtoolchange
#        net tool-change-request     iocontrol.0.tool-change       =>  hal_manualtoolchange.change
#        net tool-change-confirmed   iocontrol.0.tool-changed      <=  hal_manualtoolchange.changed
#        net tool-number             iocontrol.0.tool-prep-number  =>  hal_manualtoolchange.number
#        net tool-prepare-loopback   iocontrol.0.tool-prepare      =>  iocontrol.0.tool-prepared
 
Dernière édition:
NovA
Nouveau
23 Juillet 2017
11
  • Auteur de la discussion
  • #5
:smt107
Quelle réactivité!!!

Et un grand merci pour ces détails, ça me paraît assez clair dans l'ensemble, faut que je vois sur la machine (j'y arrive un peu mieux avec du concret).
Pour ce qui est du nombre d'encodeurs, effectivement je peux rester à 4 (je n'avais pas envisagé que ça bouffe de la ressource), mais pour les PWM, il me semblait que c'était la génération de PWM par la 5i25 qui permettait à la 7i77 de me fournir ces signaux analogiques +-10V...
Oui je suis sur W7 à la maison, j'ignorait que d'ouvrir les fichiers avec un éditeur Windows les dégraderait, mais ce n'est pas un problème, le ferai les modifs sur la machine directement.
Je vais bucher encore la dessus dès demain après-midi et je te tiens au courant.

Je me répète encore mais, vraiment, un très grand merci pour tes lumières et ton aide précieuse.:prayer:
Bonne fin de journée.
 
gaston48
Compagnon
26 Février 2008
8 940
59000
mais pour les PWM, il me semblait que c'était la génération de PWM par la 5i25 qui permettait à la 7i77 de me fournir ces signaux analogiques +-10V...
Oui c'est toujours le cas, mais ça ne passe pas par hostmot2 et hm2_pci config.
Tout dépend du firmware qui est chargé ici on a habituellement 5i77X2 et si tu regardes
le fichier .pin, toutes les voies des 2 connecteurs de la 5i25 sont des liaisons séries ou des voies multiplexées
Si tu déclares des pwm, tu ne les vois pas apparaître dans halmeter et donc tu ne peux pas configurer
leur fréquence, le type pwm ou pdm et les brancher etc. donc ça se passe automatiquement entre la 5i25
et la 7i77
C'est d'ailleurs pour ça que je ne suis par certain qu'on gagne du temps en simplifiant hm2_pci config ? mais bon ...

Si tu changes de firmware pour une 7i77 et une autre carte compatible sur l'autre connecteur libre de la 5i25
là tu peux activer au besoin des stepgen par exemple.
 
NovA
Nouveau
23 Juillet 2017
11
  • Auteur de la discussion
  • #7
Bonjour Gaston,

J'avoue que sur le papier, je pense comprendre où tu veux aller, mais qu'en réalité j'ai encore quelques difficultés...

J'ai testé ce que tu m'as indiqué plus haut, et je pense qu'il y a un souci avec les dénominations y, y1, et y2 dans hal.
Tel quel, l'axe y ne tourne pas (aucun des deux moteurs), et je n'ai pas non plus de réponse à l'écran lorsque j'actione les moteurs y1 ou y2 en manuel.
Un essai (certe pas très intelligent:roll:) en remplaçant les "y" par "y1" fait tourner les deux moteur mais ne surveille que y1 en retour.
J'avoue que je saturé un peu à force de retourner le problème dans tous les sens.... Et je crains de m'être un peu embrouillé.
Une petite idée de ton côté par hasard?

D'autre part tu as effectivement raison, la suppression des déclarations de PWM ne gêne en rien le bon fonctionnement.

Je continue la fouille...
 
NovA
Nouveau
23 Juillet 2017
11
  • Auteur de la discussion
  • #8
Un peu plus sérieusement, les PID sont elles autonomes, ou ont-elles besoin d'axis pour tourner?
La question est peut-être bête, mais si je résume ce que tu m'as expliqué, on envoi la même commande aux deux PID, on les laisse gérer chacun leur moteur en fonction de cette consigne, et on se sert d'une des deux boucles pour remonter l'information de position à axis... Et les deux moteur sont correctement asservis, indépendamment l'un de l'autre mais synchronisés sur le même mouvement.

C'est ça? Ou est-ce que je suis complètement à côté?

Là en l'état, le meilleur comportement que je puisse avoir, c'est les deux moteurs qui tourne en même temps mais un seul des deux est réellement asservi, l'autre ne tourne qu'en fonction des ordres du premier.
 
gaston48
Compagnon
26 Février 2008
8 940
59000
C'est ça? Ou est-ce que je suis complètement à côté?
C'est tout à fait ça !! :-D

j'ai corrigé le fichier HAL posté précédemment
je n’écris pas mon code comme le présente pncconf, je suis plus compacte

j’écris une ligne de branchement net avec mon nom de variable, l’émetteur et le récepteur quand j'en ai besoin
puis une nouvelle ligne si ma variable doit entrer dans une autre récepteur
pncconf déclare toutes les variables utiles ou pas

J'ai branché aussi la sortie vitesse d'un encodeur vers l'entrée feedback-vitesse de sa PID
on doit pourvoir minimiser FF1 dans ce cas
 
gaston48
Compagnon
26 Février 2008
8 940
59000
Pour la compréhension, il faudrait peut être mieux nommer y1 y tout court, le rendre
opérationnel comme x et z et ensuite insérer yesc comme esclave avec ses propres
branchement: pid, encodeur, commande analogique etc et une seule commande commune
à y en provenance de axis.1.
c'est à toi de voir
 
NovA
Nouveau
23 Juillet 2017
11
Bonjour Gaston48, bonjour tout le monde,

J'ai pas mal avancé de mon côté et suis en train de peaufiner mon fichier hal, mais il me reste quelques soucis.

D'abord ça y est, la machine tourne, et relativement bien d'ailleurs.
Mais (outre les petits soucis de réglage à affiner ou autre capteurs fin de course à raccorder) il me reste un souci assez important:

- Je démarre la machine, actionne les axes.
- Machine OFF, mais je reste sur AXIS
- Je déplace le moteur Y2 du portique manuellement (pid.y2.error augmente tandis que pid.y.error reste à 0, logique)
-ou-
- L'un des deux moteur du portique s'est arrêté un peu à la limite de la zone morte, et linuxcnc envoi une légère tension sur les drivers de cet axe, qui crois petit-à-petit avec le temps (visible au voltmètre ou sur Hal scope)
- Au bout de quelques minutes, Machine ON
- Le moteur Y2 (sur lequel la boucle ne renvoi pas d'info de position) se lance, seul, sans que rien ne l'arrête.
- obligé de redémarrer linuxcnc pour reprendre un fonctionnement normal.

Gaston48, dans l'ensemble ta solution me convient, ne serait-ce que parce-qu'elle m'a permis de mieux comprendre le fonctionnement de HAL et de sa gestion des PID (un grand merci, de nouveau). Mais n'y existe-t-il pas d'outil spécifique pour la gestion de deux moteur pour un seul axe?

Et Gantrykins par exemple, ça ne permet pas de faire office? tu connais ce composant?

Bonne journée
 
La dernière réponse à ce sujet date de plus de 6 mois

Dernières discussions

Haut