Hi,

We also use the EL7041 in production, but have also used an EL7031 for testing.

The default the PDO mapping is for velocity control.  You need to change it to 
use the position control PDO's.


For the EL7031 the PDO setup I use is:

ec_pdo_entry_info_t EL7031_pdoEntries[] = {
    // 0x1602, stepper control (0)
    {0x7010, 0x01, 1},    // Enable
    {0x7010, 0x02, 1},    // Reset 
    {0x7010, 0x03, 1},    // Reduce torque 
    {0x0000, 0x00, 5},    //   spacer 
    {0x0000, 0x00, 8},    //   spacer 
    
    // 0x1603, stepper pos (5)
    {0x7010, 0x11, 32},   // Target position

    
    // 0x1a03, stepper status (6)
    {0x6010, 0x01, 1},    // Ready to enable 
    {0x6010, 0x02, 1},    // Ready 
    {0x6010, 0x03, 1},    // Warning 
    {0x6010, 0x04, 1},    // Error 
    {0x6010, 0x05, 1},    // Moving positive 
    {0x6010, 0x06, 1},    // Moving negative 
    {0x6010, 0x07, 1},    // Torque reduced 
    {0x0000, 0x00, 1},    //   spacer 
    {0x0000, 0x00, 3},    //   spacer
    {0x6010, 0x0c, 1},    // Digital input 1 
    {0x6010, 0x0d, 1},    // Digital input 2 
    {0x1c32, 0x20, 1},    // Sync error 
    {0x0000, 0x00, 1},    //   spacer 
    {0x1803, 0x09, 1},    // *** unknown ***
  
};

ec_pdo_info_t EL7031_pdos[] = {
    {0x1602, 5, EL7031_pdoEntries + 0},
    {0x1603, 1, EL7031_pdoEntries + 5},
    {0x1a03, 14, EL7031_pdoEntries + 6},
};

ec_sync_info_t EL7031_syncs[] = {
    {0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
    {1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},
    {2, EC_DIR_OUTPUT, 2, EL7031_pdos + 0, EC_WD_DISABLE},
    {3, EC_DIR_INPUT, 1, EL7031_pdos + 2, EC_WD_DISABLE},
    {0xff}
};


PDO Item #5 {0x7010, 0x11, 32} is the Target position.


You will want to pre-configure some of the SDO values:

  maxCurrent          0x8010, 0x01
  reducedCurrent      0x8010, 0x02
  nominalVoltage      0x8010, 0x03
  motorCoilResistance 0x8010, 0x04
  motorFullSteps      0x8010, 0x06
  maxSpeedRange       0x8012, 0x05
  reversed            0x8012, 0x09


On initialisation you need to set the motor to use the Position Controller mode 
of operation (3):

  ecrt_slave_config_sdo8(dev->slaveConfig, 0x8012, 0x01, 3);


You may also want to set up the distributed clock (eg:)

  ecrt_slave_config_dc(dev->slaveConfig, 0x0300, g_app.scanTimeNS, 500000, 0, 
0);


You will probably want to set up a motor enable state machine but the guts of 
it is that you will want to:
 
- before enabling, if the error status bit (PDO Item #9 {0x6010, 0x04, 1}) is 
set
  set the faultReset control bit (PDO Item #1 {0x7010, 0x02, 1}) for around 
100ms

- ensure the readyToEnable status bit (PDO Item #6 {0x6010, 0x01, 1}) is on
  if there is no error set the enable control bit (PDO Item #0 {0x7010, 0x01, 
1})
  wait until the ready status bit (PDO Item #7 {0x6010, 0x02, 1}) is on


Once enabled you need to update the target position (PDO Item #5 {0x7010, 0x11, 
32}) every scan cycle with the position you want to go to.  It is up to you to 
create a motion profile for the motor and then figure out what the target 
position is at each time increment.


Lastly, if you get the warning or error status bits set you can look up what 
the error or warning is via the 0xA010 SDO diagnostic bits (0xA010:0x01 - 
0xA010:0x11).  Note: these are only available via SDO access, so what I do is 
have a state machine that looks them up if the warning or error status bits are 
set.


Hope this helps.


Regards,

Graeme Foot
Kinetic Engineering Design Ltd.

  

-----Original Message-----
From: etherlab-users [mailto:[email protected]] On Behalf Of 
Thomas Bitsky Jr
Sent: Wednesday, 20 January 2016 3:57 a.m.
To: Paul Mulligan; [email protected]
Subject: Re: [etherlab-users] Controlling motor drivers

I use the EL7041 often. He’s a quick copy/paste of how I make it move to 
position. The code snippet below writes to EtherLAB through a library I wrote, 
but the tasks required should be pretty obvious.

Thanks!
============

static int
stateIdle(void* lp)
{
        EL7041StepperInterface* p;      
        EL7041_ENTER(p, lp);
                
        if (p->doMove)
        {
                p->doMove = false;
                
                
                if ( !lcxReadPdoBit(p->pdoOffset + IX_READY) )
                {
                        PRINT( "EL7041.%s not ready for motion. Cancelling.\n",
                                __FUNCTION__ );
                        return StateMachineRunning;
                }
                

                
                
                lcxWritePdoUInt16(p->pdoOffset + QW_SETACCEL, p->targetAccel );
                lcxWritePdoUInt16(p->pdoOffset + QW_SETDECEL, p->targetDecel );
                lcxWritePdoUInt16(p->pdoOffset + QW_SETVELOCITY, 
p->targetVelocity );
                
                p->fsm = &stateWaitWriteMotionParameters;
                return StateMachineTransition;
        }

}

static int
stateWaitWriteMotionParameters(void* lp) {
        EL7041StepperInterface* p;
        EL7041_ENTER(p, lp);
                
        p->fsm = &stateWriteStartType;
        return StateMachineTransition;
}


static int
stateWriteStartType(void* lp)
{
        EL7041StepperInterface* p;
        EL7041_ENTER(p, lp);
        
        lcxWritePdoUInt32(p->pdoOffset + QW_SETTARGETPOSITION, 
p->setTargetPosition );
        lcxWritePdoUInt32(p->pdoOffset + QW_SETSTARTTYPE, p->setStartType );
        
        p->ton = TON_ENDTIME(100);

        p->fsm = &stateWaitWriteStartType;
        return StateMachineTransition;
}


static int
stateWaitWriteStartType(void* lp)
{
        EL7041StepperInterface* p;
        EL7041_ENTER(p, lp);

        if (TON_ISDONE(p->ton))
        {
                /*
                 * ALERT!
                 * This command should start motion on the axis.
                 */
                lcxWritePdoBit(p->pdoOffset + QX_CONTROLEXECUTE, true);

                p->ton = TON_ENDTIME(500);
                p->fsm = &stateWaitExecute;
                return StateMachineTransition;
        }

        return StateMachineRunning;
}


 
Thomas C. Bitsky Jr. | Lead Developer
ADC | automateddesign.com <http://automateddesign.com/>

Follow ADC news and media:
Facebook <https://facebook.com/automateddesigncorp> | Twitter 
<https://twitter.com/ADCSportsLogic> | YouTube 
<https://www.youtube.com/user/ADCSportsLogic>






From:  etherlab-users <[email protected]> on behalf of Paul 
Mulligan <[email protected]>
Reply-To:  Paul Mulligan <[email protected]>
Date:  Tuesday, January 19, 2016 at 7:49 AM
To:  "[email protected]" <[email protected]>
Subject:  [etherlab-users] Controlling motor drivers


Hi,   (Formatting was wrong on previous post)
 
We bought various Beckoff modules for Digital in , Digital out, Analogue in and 
Stepper Motor control. 
 
I am able to communicate with with the digital I/O and analogue input slave 
modules from Ethercat master IGH 1.5.2 without problems, but the stepper  motor 
controller (EL7031) is more complicated.
 
Below is a list of the PDO entries for the motor controller retrieved from the 
Ethercat bus using the command line tool with the cstruct option.
 
I am only able to set the velocity and then set the enable bit to start the 
motor running. I have no idea how to command the motor to just turn  a certain 
amount of steps and change direction etc. I have tried to set a counter value 
but it doesn't make a difference. Also, if I set the bits to move positive or 
move negative, it doesn't change direction as I would expect. I can't seem to 
find any documentation  or examples on how to control motors with this module 
EL7031. If anyone has any information or knowledge , I would really appreciate 
your help. Thanks
 


ec_pdo_entry_info_t slave_6_pdo_entries[] = {
    {0x0000, 0x00, 1}, /* Gap */
    {0x7000, 0x02, 1}, /* Enable latch extern on positive edge */
    {0x7000, 0x03, 1}, /* Set counter */
    {0x7000, 0x04, 1}, /* Enable latch extern on negative edge */
    {0x0000, 0x00, 4}, /* Gap */
    {0x0000, 0x00, 8}, /* Gap */
    {0x7000, 0x11, 16}, /* Set counter value */
    {0x7010, 0x01, 1}, /* Enable */
    {0x7010, 0x02, 1}, /* Reset */
    {0x7010, 0x03, 1}, /* Reduce torque */
    {0x0000, 0x00, 5}, /* Gap */
    {0x0000, 0x00, 8}, /* Gap */
    {0x7010, 0x21, 16}, /* Velocity */
    {0x0000, 0x00, 1}, /* Gap */
    {0x6000, 0x02, 1}, /* Latch extern valid */
    {0x6000, 0x03, 1}, /* Set counter done */
    {0x6000, 0x04, 1}, /* Counter underflow */
    {0x6000, 0x05, 1}, /* Counter overflow */
    {0x0000, 0x00, 3}, /* Gap */
    {0x0000, 0x00, 4}, /* Gap */
    {0x6000, 0x0d, 1}, /* Status of extern latch */
    {0x6000, 0x0e, 1}, /* Sync error */
    {0x0000, 0x00, 1}, /* Gap */
    {0x6000, 0x10, 1}, /* TxPDO Toggle */
    {0x6000, 0x11, 16}, /* Counter value */
    {0x6000, 0x12, 16}, /* Latch value */
    {0x6010, 0x01, 1}, /* Ready to enable */
    {0x6010, 0x02, 1}, /* Ready */
    {0x6010, 0x03, 1}, /* Warning */
    {0x6010, 0x04, 1}, /* Error */
    {0x6010, 0x05, 1}, /* Moving positive */
    {0x6010, 0x06, 1}, /* Moving negative */
    {0x6010, 0x07, 1}, /* Torque reduced */
    {0x0000, 0x00, 1}, /* Gap */
    {0x0000, 0x00, 3}, /* Gap */
    {0x6010, 0x0c, 1}, /* Digital input 1 */
    {0x6010, 0x0d, 1}, /* Digital input 2 */
    {0x6010, 0x0e, 1}, /* Sync error */
    {0x0000, 0x00, 1}, /* Gap */
    {0x6010, 0x10, 1}, /* TxPDO Toggle */ }; 
_______________________________________________
etherlab-users mailing list
[email protected]
http://lists.etherlab.org/mailman/listinfo/etherlab-users
_______________________________________________
etherlab-users mailing list
[email protected]
http://lists.etherlab.org/mailman/listinfo/etherlab-users

Reply via email to