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