Getting (hopefully) close to an Rtelligent build

More
1 year 1 month ago #334960 by farmer_mike
I halved the SDO values one more time and the servos are nice and quiet now. I will have to look at the HAL Oscilloscope to see how the tune is, but for now the tune is quiet and on scale.

Here are the files below. I used an ECT60 paired with a precision planetary gearbox for the Z axis of my milling machine. The X and Y axis are controlled by RS750E drives with a slight belt reduction.

Emergency stop button is wired into the ECT60 on input number 6. From the input of the ECT60, I mapped the E stop over to the HALUI emergency stop. Without the HALUI mapping, the drives would start back up as soon as the physical E stop was released. The limit switches and homing switches for the Z axis were straight forward.

Limit switches and homing switches for the RS750E drives were a little more complicated. I converted the drive input tags from s32 to u32 then bit sliced the u32 to break out the switches. I bet all the slicing could have been done in the XML file, but I could not figure that out.

When I first started the project, my plan was to run everything off of a laptop. I have since switched to a raspberry pi 4.

I still have a bit of work to do, but I want to thank everyone for their help so far.
Code:
########################################################### # # CIA 402 example snippet Hal # ########################################################### ########################################################### # Setup ########################################################### loadrt [KINS]KINEMATICS loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS loadusr -W lcec_conf ethercat-conf.xml #loadusr -W /home/cnc/linuxcnc/configs/linuxcnc-cia402-single/python_control.py loadrt lcec loadrt cia402 count=3 loadrt pid names=0-pid,1-pid,2-pid loadrt bitslice count=6 personality=32,32,32,32,32,32 addf bitslice.0 servo-thread addf bitslice.1 servo-thread addf bitslice.2 servo-thread addf bitslice.3 servo-thread addf bitslice.4 servo-thread addf bitslice.5 servo-thread loadrt conv_s32_u32 count=6 addf conv-s32-u32.0 servo-thread addf conv-s32-u32.1 servo-thread addf conv-s32-u32.2 servo-thread addf conv-s32-u32.3 servo-thread addf conv-s32-u32.4 servo-thread addf conv-s32-u32.5 servo-thread ########################################################### # Functions servo-thread ########################################################### addf lcec.read-all servo-thread addf cia402.0.read-all servo-thread addf cia402.1.read-all servo-thread addf cia402.2.read-all servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf 0-pid.do-pid-calcs servo-thread addf 1-pid.do-pid-calcs servo-thread addf 2-pid.do-pid-calcs servo-thread addf cia402.0.write-all servo-thread addf cia402.1.write-all servo-thread addf cia402.2.write-all servo-thread addf lcec.write-all servo-thread ######################################### #nets ######################################### net emc-enable => iocontrol.0.emc-enable-in sets emc-enable 1 #config   # # Joint 0 # setp cia402.0.csp-mode 1 setp cia402.0.pos-scale 786432 #from servo(ethercat) to cia402 net 0-statusword      lcec.0.0.cia-statusword => cia402.0.statusword net 0-opmode-display  lcec.0.0.opmode-display => cia402.0.opmode-display net 0-drv-act-pos     lcec.0.0.actual-position => cia402.0.drv-actual-position net 0-drv-act-velo    lcec.0.0.actual-velocity => cia402.0.drv-actual-velocity #from motion to cia net 0-enable     <= joint.0.amp-enable-out => cia402.0.enable net 0-amp-fault  => joint.0.amp-fault-in   <= cia402.0.drv-fault net 0-pos-cmd    <= joint.0.motor-pos-cmd  => cia402.0.pos-cmd net 0-pos-fb     => joint.0.motor-pos-fb   <= cia402.0.pos-fb #from cia402 to servo(ethercat) net 0-controlword         cia402.0.controlword => lcec.0.0.cia-controlword net 0-modes-of-operation  cia402.0.opmode => lcec.0.0.opmode net 0-drv-target-pos      cia402.0.drv-target-position => lcec.0.0.target-position net 0-drv-target-velo     cia402.0.drv-target-velocity => lcec.0.0.target-velocity net my-out-0 conv-s32-u32.0.in <= lcec.0.0.digitalinputs net my-in-0 conv-s32-u32.0.out => bitslice.0.in net my-bit-0 bitslice.0.out-00 joint.0.neg-lim-sw-in net my-out-0 conv-s32-u32.1.in <= lcec.0.0.digitalinputs net my-in-1 conv-s32-u32.1.out => bitslice.1.in net my-bit-1 bitslice.1.out-01 joint.0.pos-lim-sw-in net my-out-0 conv-s32-u32.2.in <= lcec.0.0.digitalinputs net my-in-2 conv-s32-u32.2.out => bitslice.2.in net my-bit-2 bitslice.2.out-02 joint.0.home-sw-in # # Joint 1 # setp cia402.1.csp-mode 1 setp cia402.1.pos-scale -786432 #from servo(ethercat) to cia402 net 1-statusword      lcec.0.1.cia-statusword => cia402.1.statusword net 1-opmode-display  lcec.0.1.opmode-display => cia402.1.opmode-display net 1-drv-act-pos     lcec.0.1.actual-position => cia402.1.drv-actual-position net 1-drv-act-velo    lcec.0.1.actual-velocity => cia402.1.drv-actual-velocity #from cia402 to servo(ethercat) net 1-controlword         cia402.1.controlword => lcec.0.1.cia-controlword net 1-modes-of-operation  cia402.1.opmode => lcec.0.1.opmode net 1-drv-target-pos      cia402.1.drv-target-position => lcec.0.1.target-position net 1-drv-target-velo     cia402.1.drv-target-velocity => lcec.0.1.target-velocity #from motion to cia net 1-enable    <= joint.1.amp-enable-out => cia402.1.enable net 1-amp-fault => joint.1.amp-fault-in   <= cia402.1.drv-fault net 1-pos-cmd   <= joint.1.motor-pos-cmd  => cia402.1.pos-cmd net 1-pos-fb    => joint.1.motor-pos-fb   <= cia402.1.pos-fb net my-out-1 conv-s32-u32.3.in <= lcec.0.1.digitalinputs net my-in-3 conv-s32-u32.3.out => bitslice.3.in net my-bit-3 bitslice.3.out-00 joint.1.pos-lim-sw-in net my-out-1 conv-s32-u32.4.in <= lcec.0.1.digitalinputs net my-in-4 conv-s32-u32.4.out => bitslice.4.in net my-bit-4 bitslice.4.out-01 joint.1.neg-lim-sw-in net my-out-1 conv-s32-u32.5.in <= lcec.0.1.digitalinputs net my-in-5 conv-s32-u32.5.out => bitslice.5.in net my-bit-5 bitslice.5.out-02 joint.1.home-sw-in # # Joint 2 # setp cia402.2.csp-mode 1 setp cia402.2.pos-scale 96000 #from servo(ethercat) to cia402 net 2-statusword      lcec.0.2.cia-statusword => cia402.2.statusword net 2-opmode-display  lcec.0.2.opmode-display => cia402.2.opmode-display net 2-drv-act-pos     lcec.0.2.actual-position => cia402.2.drv-actual-position net 2-drv-act-velo    lcec.0.2.actual-velocity => cia402.2.drv-actual-velocity #from cia402 to servo(ethercat) net 2-controlword         cia402.2.controlword => lcec.0.2.cia-controlword net 2-modes-of-operation  cia402.2.opmode => lcec.0.2.opmode net 2-drv-target-pos      cia402.2.drv-target-position => lcec.0.2.target-position net 2-drv-target-velo     cia402.2.drv-target-velocity => lcec.0.2.target-velocity #from motion to cia net 2-enable    <= joint.2.amp-enable-out => cia402.2.enable net 2-amp-fault => joint.2.amp-fault-in   <= cia402.2.drv-fault net 2-pos-cmd   <= joint.2.motor-pos-cmd  => cia402.2.pos-cmd net 2-pos-fb    => joint.2.motor-pos-fb   <= cia402.2.pos-fb net  2-CCW-limit lcec.0.2.in-3 => joint.2.neg-lim-sw-in net  2-CW-limit lcec.0.2.in-4 => joint.2.pos-lim-sw-in net  2-in-home lcec.0.2.in-5 => joint.2.home-sw-in net  2-in-6 lcec.0.2.in-6 => halui.estop.activate #net spindle_speed     spindle.0.speed-out => python_control.rpm_in
Code:
# This config file was created 2020-08-14 17:19:37.621705 by the update_ini script # The original config files may be found in the /home/demo/linuxcnc/configs/et-3ax/et_3ax_CIA402.old directory [EMC] # The version string for this INI file. VERSION = 1.1 MACHINE = EtherCAT Machine DEBUG = 1 [DISPLAY] DISPLAY = axis EDITOR = gedit #PYVCP = pyvcp_panel.xml # places the pyvcp panel at the bottom of the Axis window PYVCP_POSITION = RIGHT # Cycle time, in seconds, that display will sleep between polls CYCLE_TIME =            0.100 # Path to help file HELP_FILE =             doc/help.txt # Initial display setting for position, RELATIVE or MACHINE POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL MAX_FEED_OVERRIDE = 1 # Prefix to be used PROGRAM_PREFIX = /home/demo/linuxcnc/nc_files INTRO_GRAPHIC = linuxcnc.gif INTRO_TIME = 0 INCREMENTS = 1in .5in .25in .125in .0625in .025in .05in #INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm [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 nc = /usr/bin/axis [RS274NGC] PARAMETER_FILE = linuxcnc.var [EMCMOT] EMCMOT = motmod COMM_TIMEOUT = 1.0 BASE_PERIOD =  0 SERVO_PERIOD = 1000000 [TASK] TASK = milltask CYCLE_TIME = 0.005 [HAL] HALFILE = cia402.hal #SHUTDOWN = shutdown.hal HALUI = halui [HALUI] [TRAJ] HOME = 16 12 7 COORDINATES = XYZ LINEAR_UNITS = in ANGULAR_UNITS = deg DEFAULT_LINEAR_VELOCITY = .25 MAX_LINEAR_VELOCITY = .5 MIN_LINEAR_VELOCITY = .01 DEFAULT_ANGULAR_VELOCITY = 360 MAX_ANGULAR_VELOCITY = 720 POSITION_FILE = position.txt [EMCIO] # Name of IO controller program, e.g., iov2 has tool changer stuff EMCIO =         iov2 CYCLE_TIME =    0.100 # tool table file TOOL_TABLE =    cia402.tbl TOOL_CHANGE_POSITION = 0 0 50.8 #RANDOM_TOOLCHANGER = 1 [KINS] JOINTS = 3 KINEMATICS = trivkins kinstype=both coordinates=xyz [AXIS_X] MIN_LIMIT = 0.1 MAX_LIMIT = 17.9 MAX_VELOCITY = .5 MAX_ACCELERATION = 10 BACKLASH = 0.0000 [JOINT_0] TYPE = LINEAR MAX_VELOCITY = .5 MAX_ACCELERATION = 10 # The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION # If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger. # is this applicable for ethercat???? #STEPGEN_MAXVEL = 1.25 #STEPGEN_MAXACCEL = 1.25 SCALE = 1 FERROR = 200 MIN_FERROR = 50 MIN_LIMIT = 0 MAX_LIMIT = 18 HOME                    = 16 HOME_OFFSET                = 16 HOME_SEQUENCE            = 0 HOME_SEARCH_VEL = -.125 HOME_LATCH_VEL = -.125 HOME_USE_INDEX = NO HOME_IGNORE_LIMITS        = NO [AXIS_Y] MIN_LIMIT = 0.1 MAX_LIMIT = 12.9 MAX_VELOCITY = .5 MAX_ACCELERATION = 10 BACKLASH = 0.0000 [JOINT_1] TYPE = LINEAR MAX_VELOCITY = .5 MAX_ACCELERATION = 10 # The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION # If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger. # is this applicable for ethercat???? #STEPGEN_MAXVEL = 1.25 #STEPGEN_MAXACCEL = 1.25 STEP_SCALE = 1 FERROR = 2 MIN_FERROR = 20 MIN_LIMIT = 0 MAX_LIMIT = 13 HOME                    = 12 HOME_OFFSET                = 12 HOME_SEQUENCE            = 1 HOME_SEARCH_VEL = .125 HOME_LATCH_VEL = .125 HOME_USE_INDEX = NO HOME_IGNORE_LIMITS        = NO [JOINT_2] TYPE = LINEAR MAX_VELOCITY = .5 MAX_ACCELERATION = 10 # The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION # If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger. # is this applicable for ethercat???? STEPGEN_MAXVEL = 1.25 STEPGEN_MAXACCEL = 1.25 STEP_SCALE = 1 FERROR = 200 MIN_FERROR = 20 MIN_LIMIT = 3.4 MAX_LIMIT = 8.1 HOME                    = 7 HOME_OFFSET                = 7 HOME_SEQUENCE            = 2 HOME_SEARCH_VEL = .125 HOME_LATCH_VEL = .125 HOME_USE_INDEX = NO HOME_IGNORE_LIMITS    = NO [AXIS_Z] MIN_LIMIT = 3.5 MAX_LIMIT = 8 MAX_VELOCITY = .5 MAX_ACCELERATION = 10 BACKLASH = 0.0000
Code:
<masters>   <master idx="0" appTimePeriod="1000000" refClockSyncCycles="5">              <slave idx="0" type="generic" vid="00000A88" pid="0a880013" configPdos="true">    <!-- Joint 0 -->       <sdoConfig idx="2009" subIdx="1"><sdoDataRaw data ="00 32"/></sdoConfig> <!-- position p gain default is 1000 -->   <sdoConfig idx="2009" subIdx="2"><sdoDataRaw data ="00 08"/></sdoConfig> <!-- velocity p gain default is 256 -->   <sdoConfig idx="2009" subIdx="3"><sdoDataRaw data ="00 01"/></sdoConfig> <!-- position i gain default is 200 -->            <syncManager idx="0" dir="out"> </syncManager>    <syncManager idx="1" dir="out"> </syncManager>    <syncManager idx="2" dir="out">     <pdo idx="1600">      <pdoEntry idx="6040" subIdx="00" bitLen="16" halPin="cia-controlword" halType="u32"/>      <pdoEntry idx="607a" subIdx="00" bitLen="32" halPin="target-position" halType="s32"/>      <pdoEntry idx="60b8" subIdx="00" bitLen="16" halPin="touchprobefunction0" halType="bit"/>     </pdo>     <pdo idx="1601">      <pdoEntry idx="6081" subIdx="00" bitLen="32" halPin="profile-velocity" halType="u32"/>      <pdoEntry idx="6083" subIdx="00" bitLen="32" halPin="target-accel" halType="u32"/>      <pdoEntry idx="6084" subIdx="00" bitLen="32" halPin="target-decel" halType="u32"/>      <pdoEntry idx="6060" subIdx="00" bitLen="8" halPin="opmode" halType="s32"/>     </pdo>     <pdo idx="1602">      <pdoEntry idx="60ff" subIdx="00" bitLen="32" halPin="target-velocity" halType="s32"/>     </pdo>    </syncManager>    <syncManager idx="3" dir="in">     <pdo idx="1a00">      <pdoEntry idx="603f" subIdx="00" bitLen="16" halPin="errorcode" halType="bit"/>      <pdoEntry idx="6041" subIdx="00" bitLen="16" halPin="cia-statusword" halType="u32"/>      <pdoEntry idx="6061" subIdx="00" bitLen="8" halPin="opmode-display" halType="s32"/>      <pdoEntry idx="6064" subIdx="00" bitLen="32" halPin="actual-position" halType="s32"/>      <pdoEntry idx="60b9" subIdx="00" bitLen="16" halPin="touchprobestat" halType="bit"/>      <pdoEntry idx="60ba" subIdx="00" bitLen="32" halPin="touchprobe1pos" halType="s32"/>      <pdoEntry idx="60fd" subIdx="00" bitLen="32" halPin="digitalinputs" halType="s32"/>     </pdo>     <pdo idx="1a01">      <pdoEntry idx="606c" subIdx="00" bitLen="32" halPin="actual-velocity" halType="s32"/>     </pdo>    </syncManager>    <dcConf assignActivate="300" sync0Cycle="1000000"/>   </slave>       <slave idx="1" type="generic" vid="00000A88" pid="0a880013" configPdos="true">    <!-- Joint 1 -->              <sdoConfig idx="2009" subIdx="1"><sdoDataRaw data ="00 32"/></sdoConfig> <!-- position p gain default is 1000 -->   <sdoConfig idx="2009" subIdx="2"><sdoDataRaw data ="00 08"/></sdoConfig> <!-- velocity p gain default is 256 -->   <sdoConfig idx="2009" subIdx="3"><sdoDataRaw data ="00 01"/></sdoConfig> <!-- position i gain default is 200 -->          <syncManager idx="0" dir="out"> </syncManager>    <syncManager idx="1" dir="out"> </syncManager>    <syncManager idx="2" dir="out">     <pdo idx="1600">      <pdoEntry idx="6040" subIdx="00" bitLen="16" halPin="cia-controlword" halType="u32"/>      <pdoEntry idx="607a" subIdx="00" bitLen="32" halPin="target-position" halType="s32"/>      <pdoEntry idx="60b8" subIdx="00" bitLen="16" halPin="touchprobefunction0" halType="bit"/>     </pdo>     <pdo idx="1601">      <pdoEntry idx="6081" subIdx="00" bitLen="32" halPin="profile-velocity" halType="u32"/>      <pdoEntry idx="6083" subIdx="00" bitLen="32" halPin="target-accel" halType="u32"/>      <pdoEntry idx="6084" subIdx="00" bitLen="32" halPin="target-decel" halType="u32"/>      <pdoEntry idx="6060" subIdx="00" bitLen="8" halPin="opmode" halType="s32"/>     </pdo>     <pdo idx="1602">      <pdoEntry idx="60ff" subIdx="00" bitLen="32" halPin="target-velocity" halType="s32"/>     </pdo>    </syncManager>    <syncManager idx="3" dir="in">     <pdo idx="1a00">      <pdoEntry idx="603f" subIdx="00" bitLen="16" halPin="errorcode" halType="bit"/>      <pdoEntry idx="6041" subIdx="00" bitLen="16" halPin="cia-statusword" halType="u32"/>      <pdoEntry idx="6061" subIdx="00" bitLen="8" halPin="opmode-display" halType="s32"/>      <pdoEntry idx="6064" subIdx="00" bitLen="32" halPin="actual-position" halType="s32"/>      <pdoEntry idx="60b9" subIdx="00" bitLen="16" halPin="touchprobestat" halType="bit"/>      <pdoEntry idx="60ba" subIdx="00" bitLen="32" halPin="touchprobe1pos" halType="s32"/>      <pdoEntry idx="60fd" subIdx="00" bitLen="32" halPin="digitalinputs" halType="s32"/>     </pdo>     <pdo idx="1a01">      <pdoEntry idx="606c" subIdx="00" bitLen="32" halPin="actual-velocity" halType="s32"/>     </pdo>    </syncManager>    <dcConf assignActivate="300" sync0Cycle="1000000"/>   </slave>        <!-- Joint 2 -->     <slave idx="2" type="generic" vid="00000a88" pid="0a880002" configPdos="true">       <dcConf assignActivate="300" sync0Cycle="*1" sync0Shift="0"/>       <sdoConfig idx="2000" subIdx="0"><sdoDataRaw data ="88 13"/></sdoConfig>  <!-- Max motor current (5.0) -->       <sdoConfig idx="2007" subIdx="3"><sdoDataRaw data ="01"/></sdoConfig>     <!-- Input 3 - CCW Limit -->       <sdoConfig idx="2007" subIdx="4"><sdoDataRaw data ="02"/></sdoConfig>     <!-- Input 4 - CW Limit -->       <sdoConfig idx="2007" subIdx="5"><sdoDataRaw data ="03"/></sdoConfig>     <!-- Input 5 - Home Function -->       <sdoConfig idx="2007" subIdx="6"><sdoDataRaw data ="05"/></sdoConfig>     <!-- Input 6 - Emergency Stop -->       <sdoConfig idx="2011" subIdx="0"><sdoDataRaw data ="01 00"/></sdoConfig>  <!-- Closed loop -->       <sdoConfig idx="6098" subIdx="0"><sdoDataRaw data ="11 00"/></sdoConfig>  <!-- Home mode 17 -->       <sdoConfig idx="607C" subIdx="0"><sdoDataRaw data ="00 00"/></sdoConfig>  <!-- Home offset 0  -->       <sdoConfig idx="609A" subIdx="0"><sdoDataRaw data ="F4 01"/></sdoConfig>  <!-- Home accelleration 500 -->       <sdoConfig idx="6099" subIdx="01"><sdoDataRaw data ="C4 09"/></sdoConfig>  <!-- Home fast speed 2500-->       <sdoConfig idx="6099" subIdx="02"><sdoDataRaw data ="F4 01"/></sdoConfig>  <!-- Home slow speed 500 -->       <syncManager idx="2" dir="out">         <pdo idx="1600">           <pdoEntry idx="6040" subIdx="00" bitLen="16" halPin="cia-controlword" halType="u32"/>           <pdoEntry idx="6060" subIdx="00" bitLen="8" halPin="opmode" halType="s32"/>           <!-- Target Position -->           <pdoEntry idx="607A" subIdx="00" bitLen="32" halPin="target-position" halType="s32"/>           <!-- Target Velocity -->           <pdoEntry idx="60FF" subIdx="00" bitLen="32" halPin="target-velocity" halType="s32"/>           <!-- Digtial Outputs (manufacturer's extension ECT86/ECT60)-->           <pdoEntry idx="204A" subIdx="0" bitLen="16" halType="complex">             <complexEntry bitLen="1" halPin="out-1" halType="bit"/>             <complexEntry bitLen="1" halPin="out-2" halType="bit"/>             <complexEntry bitLen="14"/>           </pdoEntry>         </pdo>       </syncManager>       <syncManager idx="3" dir="in">         <pdo idx="1a00">           <pdoEntry idx="6041" subIdx="00" bitLen="16" halPin="cia-statusword" halType="u32"/>           <pdoEntry idx="6061" subIdx="00" bitLen="8" halPin="opmode-display" halType="s32"/>           <pdoEntry idx="6064" subIdx="00" bitLen="32" halPin="actual-position" halType="s32"/>           <pdoEntry idx="606C" subIdx="00" bitLen="32" halPin="actual-velocity" halType="s32"/>           <pdoEntry idx="6077" subIdx="00" bitLen="32" halPin="actual-torque" halType="s32"/>           <!-- Digtial_inputs (cia402 compatible) -->           <pdoEntry idx="60FD" subIdx="0" bitLen="32" halType="complex">             <complexEntry bitLen="1" halPin="CW-limit" halType="bit"/>             <complexEntry bitLen="1" halPin="CCW-limit" halType="bit"/>             <complexEntry bitLen="1" halPin="in-home" halType="bit"/>             <complexEntry bitLen="13"/>             <complexEntry bitLen="1" halPin="in-1" halType="bit"/>             <complexEntry bitLen="1" halPin="in-2" halType="bit"/>             <complexEntry bitLen="1" halPin="in-3" halType="bit"/>             <complexEntry bitLen="1" halPin="in-4" halType="bit"/>             <complexEntry bitLen="1" halPin="in-5" halType="bit"/>             <complexEntry bitLen="1" halPin="in-6" halType="bit"/>             <complexEntry bitLen="10"/>           </pdoEntry>                   </pdo>       </syncManager>     </slave>         </master> </masters>

 

Please Log in or Create an account to join the conversation.

Time to create page: 0.061 seconds
Powered by Kunena Forum