[etherlab-users] Controlling motor drivers
Thomas Bitsky Jr
tbj at automateddesign.com
Tue Jan 19 15:56:40 CET 2016
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 <etherlab-users-bounces at etherlab.org> on behalf of Paul Mulligan <mulligan252 at yahoo.ie>
Reply-To: Paul Mulligan <mulligan252 at yahoo.ie>
Date: Tuesday, January 19, 2016 at 7:49 AM
To: "etherlab-users at etherlab.org" <etherlab-users at etherlab.org>
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 */
};
More information about the Etherlab-users
mailing list