<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
{font-family:Helvetica;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
{mso-style-priority:99;
mso-style-link:"Balloon Text Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:8.0pt;
font-family:"Tahoma","sans-serif";}
span.EmailStyle17
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
span.BalloonTextChar
{mso-style-name:"Balloon Text Char";
mso-style-priority:99;
mso-style-link:"Balloon Text";
font-family:"Tahoma","sans-serif";}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="2050" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-NZ" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">To get information about what PDO’s can be mapped for a device you will need to look into the in device documentation.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Some devices do not allow reconfiguration so you must match what is already there (cstruct command fine for this). Some devices allow you to map different
PDO’s, but only from preconfigured group options (the EL7031 falls into this category). And lastly some devices allow you to configure any PDO item in any order as long as you have enough space to do so, however with these devices not all items can be used
as PDO’s.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">If you have a Beckhoff module you can easily download its documentation from their site using the url: http://www.beckhoff.com/<model_number>/<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Eg:
<a href="http://www.beckhoff.com/EL7031/">http://www.beckhoff.com/EL7031/</a><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><img border="0" width="764" height="426" id="Picture_x0020_1" src="cid:image001.png@01D15433.5C489160"></span><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Then click on the “Documentation (CHM)” link and it will download the documentation. Note: being a chm file you will need to open it in Windows from a local
drive. The content will also be blocked until you select “Unblock” from right-click, properties:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><img border="0" width="374" height="168" id="Picture_x0020_2" src="cid:image002.png@01D15433.5C489160"></span><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Have a look at the “Object description and parameterization” section (in this case it is under: EL70x1 - Stepper Motor Interfaces, Configuration with the TwinCAT
System Manager, EL7031, ...)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Have a look at the 0x160x groups. These are the preconfigured read/write item groups. The value of each item tells you which PDO item addresses will be used.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Then have a look at the 0x1a0x groups. These are the preconfigured readonly item groups.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Note: there may be restrictions as to which groups you can use together. This is generally found in the XML device description files. These files are what
tells TwinCAT what configuration options are valid. Also note that different module firmware revisions will probably support different options and PDO mappings. If over time you need to support different firmware revisions you will need to read the modules
revision from your app and match the correct configuration.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">It’s also a good idea to get the Beckhoff XML device descriptions from:
<a href="http://download.beckhoff.com/download/Config/EtherCAT/XML_Device_Description/Beckhoff_EtherCAT_XML.zip">
http://download.beckhoff.com/download/Config/EtherCAT/XML_Device_Description/Beckhoff_EtherCAT_XML.zip</a><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">You can view them in Internet Explorer, but they are large and really slow. I generally load them into Notepad++ and delete the irrelevant modules and revisions
(without saving) to speed things up and make searching easier.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">In the XML file find the “AlternativeSmMapping” nodes. This tells you what various “modes” the module is designed to be used in and what PDO mapping groups
are used.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">For my application I wanted “Position control”, so I used the following:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <AlternativeSmMapping><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Name>Position control</Name><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Sm No="2"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Pdo>#x1601</Pdo><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Pdo>#x1602</Pdo><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Pdo>#x1603</Pdo><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> </Sm><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Sm No="3"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Pdo>#x1a01</Pdo><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> <Pdo>#x1a03</Pdo><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> </Sm><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"> </AlternativeSmMapping><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">But I also didn’t want to use latching, so in my case I left off 0x1601 and 0x1a01.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">As to changing moving direction, you just need to change the Position Target in the negative direction.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Eg, if you want to move from position 0 to 20 and then back to 0 you would output the positions (one each scan):<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">0 // accelerate moving forward<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">3<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">6<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">10 // decelerate moving forward<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">14<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">17<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">19<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">20 // pause
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">20<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">20<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">20 // accelerate moving reverse<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">19<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">17<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">14<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">10 // decelerate moving reverse<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">6<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">3<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Note: If the above scan time is 1000Hz then the above would be accelerating/decelerating at 1000 counts/second.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">It is up to you to come up with the trajectory of the motor (ie where you want to go) and the kinematics (ie how fast do you want to go and accelerate / decelerate).
Then for each scan period output the target position.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">You can use kinematic equations to figure out a simple kinematic profile (eg from:
<a href="http://www.physicsclassroom.com/class/1DKin/Lesson-6/Kinematic-Equations">
http://www.physicsclassroom.com/class/1DKin/Lesson-6/Kinematic-Equations</a>). However you may need to get into some more advanced mathematics if you want to introduce smoothing factors (jerk etc.)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">However, if you want to move forward and the motor goes in reverse for your mechanical configuration (and vice-versa) then the motor has a Reverse configuration
option (0x8012:09, Invert motor polarity).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Graeme Foot<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Kinetic Engineering Design Ltd.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Paul Mulligan [mailto:mulligan252@yahoo.ie]
<br>
<b>Sent:</b> Thursday, 21 January 2016 3:32 a.m.<br>
<b>To:</b> Graeme Foot<br>
<b>Subject:</b> Re: [etherlab-users] Controlling motor drivers<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black">Hi Graeme,<o:p></o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black">Thanks alot for that.<o:p></o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black">I'm completely new to Ethercat. Where can I find the SDO entries with indexes that you mentioned, for any device? <o:p></o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black">Up until now I have only been using the Ethercat command line tool to retrieve the c-structures relating to the PDOs for the slave
device and then copying and pasting this information into my code.<o:p></o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black">Also, in order to change moving direction of the motor, do I need to change an SDO value ? <o:p></o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black">Regards,<o:p></o:p></span></p>
</div>
<div id="yui_3_16_0_1_1453295784417_6224">
<p class="MsoNormal" style="background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black">Paul<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt;background:white"><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:black">On Tuesday, 19 January 2016, 22:55:37, Graeme Foot <<a href="mailto:Graeme.Foot@touchcut.com">Graeme.Foot@touchcut.com</a>> wrote:</span><span style="font-family:"Helvetica","sans-serif";color:black"><o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt;background:white"><span style="font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal" style="background:white"><span style="font-family:"Helvetica","sans-serif";color:black">Hi,<br>
<br>
We also use the EL7041 in production, but have also used an EL7031 for testing.<br>
<br>
The default the PDO mapping is for velocity control. You need to change it to use the position control PDO's.<br>
<br>
<br>
For the EL7031 the PDO setup I use is:<br>
<br>
ec_pdo_entry_info_t EL7031_pdoEntries[] = {<br>
// 0x1602, stepper control (0)<br>
{0x7010, 0x01, 1}, // Enable<br>
{0x7010, 0x02, 1}, // Reset <br>
{0x7010, 0x03, 1}, // Reduce torque <br>
{0x0000, 0x00, 5}, // spacer <br>
{0x0000, 0x00, 8}, // spacer <br>
<br>
// 0x1603, stepper pos (5)<br>
{0x7010, 0x11, 32}, // Target position<br>
<br>
<br>
// 0x1a03, stepper status (6)<br>
{0x6010, 0x01, 1}, // Ready to enable <br>
{0x6010, 0x02, 1}, // Ready <br>
{0x6010, 0x03, 1}, // Warning <br>
{0x6010, 0x04, 1}, // Error <br>
{0x6010, 0x05, 1}, // Moving positive <br>
{0x6010, 0x06, 1}, // Moving negative <br>
{0x6010, 0x07, 1}, // Torque reduced <br>
{0x0000, 0x00, 1}, // spacer <br>
{0x0000, 0x00, 3}, // spacer<br>
{0x6010, 0x0c, 1}, // Digital input 1 <br>
{0x6010, 0x0d, 1}, // Digital input 2 <br>
{0x1c32, 0x20, 1}, // Sync error <br>
{0x0000, 0x00, 1}, // spacer <br>
{0x1803, 0x09, 1}, // *** unknown ***<br>
<br>
};<br>
<br>
ec_pdo_info_t EL7031_pdos[] = {<br>
{0x1602, 5, EL7031_pdoEntries + 0},<br>
{0x1603, 1, EL7031_pdoEntries + 5},<br>
{0x1a03, 14, EL7031_pdoEntries + 6},<br>
};<br>
<br>
ec_sync_info_t EL7031_syncs[] = {<br>
{0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},<br>
{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},<br>
{2, EC_DIR_OUTPUT, 2, EL7031_pdos + 0, EC_WD_DISABLE},<br>
{3, EC_DIR_INPUT, 1, EL7031_pdos + 2, EC_WD_DISABLE},<br>
{0xff}<br>
};<br>
<br>
<br>
PDO Item #5 {0x7010, 0x11, 32} is the Target position.<br>
<br>
<br>
You will want to pre-configure some of the SDO values:<br>
<br>
maxCurrent 0x8010, 0x01<br>
reducedCurrent 0x8010, 0x02<br>
nominalVoltage 0x8010, 0x03<br>
motorCoilResistance 0x8010, 0x04<br>
motorFullSteps 0x8010, 0x06<br>
maxSpeedRange 0x8012, 0x05<br>
reversed 0x8012, 0x09<br>
<br>
<br>
On initialisation you need to set the motor to use the Position Controller mode of operation (3):<br>
<br>
ecrt_slave_config_sdo8(dev->slaveConfig, 0x8012, 0x01, 3);<br>
<br>
<br>
You may also want to set up the distributed clock (eg:)<br>
<br>
ecrt_slave_config_dc(dev->slaveConfig, 0x0300, g_app.scanTimeNS, 500000, 0, 0);<br>
<br>
<br>
You will probably want to set up a motor enable state machine but the guts of it is that you will want to:<br>
<br>
- before enabling, if the error status bit (PDO Item #9 {0x6010, 0x04, 1}) is set<br>
set the faultReset control bit (PDO Item #1 {0x7010, 0x02, 1}) for around 100ms<br>
<br>
- ensure the readyToEnable status bit (PDO Item #6 {0x6010, 0x01, 1}) is on<br>
if there is no error set the enable control bit (PDO Item #0 {0x7010, 0x01, 1})<br>
wait until the ready status bit (PDO Item #7 {0x6010, 0x02, 1}) is on<br>
<br>
<br>
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.<br>
<br>
<br>
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.<br>
<br>
<br>
Hope this helps.<br>
<br>
<br>
Regards,<br>
<br>
Graeme Foot<br>
Kinetic Engineering Design Ltd.<br>
<br>
<br>
<br>
-----Original Message-----<br>
From: etherlab-users [mailto:<a href="mailto:etherlab-users-bounces@etherlab.org">etherlab-users-bounces@etherlab.org</a>] On Behalf Of Thomas Bitsky Jr<br>
Sent: Wednesday, 20 January 2016 3:57 a.m.<br>
To: Paul Mulligan; <a href="mailto:etherlab-users@etherlab.org">etherlab-users@etherlab.org</a><br>
Subject: Re: [etherlab-users] Controlling motor drivers<br>
<br>
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.<br>
<br>
Thanks!<br>
============<br>
<br>
static int<br>
stateIdle(void* lp)<br>
{<br>
EL7041StepperInterface* p; <br>
EL7041_ENTER(p, lp);<br>
<br>
if (p->doMove)<br>
{<br>
p->doMove = false;<br>
<br>
<br>
if ( !lcxReadPdoBit(p->pdoOffset + IX_READY) )<br>
{<br>
PRINT( "EL7041.%s not ready for motion. Cancelling.\n",<br>
__FUNCTION__ );<br>
return StateMachineRunning;<br>
}<br>
<br>
<br>
<br>
<br>
lcxWritePdoUInt16(p->pdoOffset + QW_SETACCEL, p->targetAccel );<br>
lcxWritePdoUInt16(p->pdoOffset + QW_SETDECEL, p->targetDecel );<br>
lcxWritePdoUInt16(p->pdoOffset + QW_SETVELOCITY, p->targetVelocity );<br>
<br>
p->fsm = &stateWaitWriteMotionParameters;<br>
return StateMachineTransition;<br>
}<br>
<br>
}<br>
<br>
static int<br>
stateWaitWriteMotionParameters(void* lp) {<br>
EL7041StepperInterface* p;<br>
EL7041_ENTER(p, lp);<br>
<br>
p->fsm = &stateWriteStartType;<br>
return StateMachineTransition;<br>
}<br>
<br>
<br>
static int<br>
stateWriteStartType(void* lp)<br>
{<br>
EL7041StepperInterface* p;<br>
EL7041_ENTER(p, lp);<br>
<br>
lcxWritePdoUInt32(p->pdoOffset + QW_SETTARGETPOSITION, p->setTargetPosition );<br>
lcxWritePdoUInt32(p->pdoOffset + QW_SETSTARTTYPE, p->setStartType );<br>
<br>
p->ton = TON_ENDTIME(100);<br>
<br>
p->fsm = &stateWaitWriteStartType;<br>
return StateMachineTransition;<br>
}<br>
<br>
<br>
static int<br>
stateWaitWriteStartType(void* lp)<br>
{<br>
EL7041StepperInterface* p;<br>
EL7041_ENTER(p, lp);<br>
<br>
if (TON_ISDONE(p->ton))<br>
{<br>
/*<br>
* ALERT!<br>
* This command should start motion on the axis.<br>
*/<br>
lcxWritePdoBit(p->pdoOffset + QX_CONTROLEXECUTE, true);<br>
<br>
p->ton = TON_ENDTIME(500);<br>
p->fsm = &stateWaitExecute;<br>
return StateMachineTransition;<br>
}<br>
<br>
return StateMachineRunning;<br>
}<br>
<br>
<br>
<br>
Thomas C. Bitsky Jr. | Lead Developer<br>
ADC | automateddesign.com <<a href="http://automateddesign.com/" target="_blank">http://automateddesign.com/</a>><br>
<br>
Follow ADC news and media:<br>
Facebook <<a href="https://facebook.com/automateddesigncorp" target="_blank">https://facebook.com/automateddesigncorp</a>> | Twitter <<a href="https://twitter.com/ADCSportsLogic" target="_blank">https://twitter.com/ADCSportsLogic</a>> | YouTube <<a href="https://www.youtube.com/user/ADCSportsLogic" target="_blank">https://www.youtube.com/user/ADCSportsLogic</a>><br>
<br>
<br>
<br>
<br>
<br>
<br>
From: etherlab-users <<a href="mailto:etherlab-users-bounces@etherlab.org">etherlab-users-bounces@etherlab.org</a>> on behalf of Paul Mulligan <<a href="mailto:mulligan252@yahoo.ie">mulligan252@yahoo.ie</a>><br>
Reply-To: Paul Mulligan <<a href="mailto:mulligan252@yahoo.ie">mulligan252@yahoo.ie</a>><br>
Date: Tuesday, January 19, 2016 at 7:49 AM<br>
To: "<a href="mailto:etherlab-users@etherlab.org">etherlab-users@etherlab.org</a>" <<a href="mailto:etherlab-users@etherlab.org">etherlab-users@etherlab.org</a>><br>
Subject: [etherlab-users] Controlling motor drivers<br>
<br>
<br>
Hi, (Formatting was wrong on previous post)<br>
<br>
We bought various Beckoff modules for Digital in , Digital out, Analogue in and Stepper Motor control.
<br>
<br>
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.<br>
<br>
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.<br>
<br>
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<br>
<br>
<br>
<br>
ec_pdo_entry_info_t slave_6_pdo_entries[] = {<br>
{0x0000, 0x00, 1}, /* Gap */<br>
{0x7000, 0x02, 1}, /* Enable latch extern on positive edge */<br>
{0x7000, 0x03, 1}, /* Set counter */<br>
{0x7000, 0x04, 1}, /* Enable latch extern on negative edge */<br>
{0x0000, 0x00, 4}, /* Gap */<br>
{0x0000, 0x00, 8}, /* Gap */<br>
{0x7000, 0x11, 16}, /* Set counter value */<br>
{0x7010, 0x01, 1}, /* Enable */<br>
{0x7010, 0x02, 1}, /* Reset */<br>
{0x7010, 0x03, 1}, /* Reduce torque */<br>
{0x0000, 0x00, 5}, /* Gap */<br>
{0x0000, 0x00, 8}, /* Gap */<br>
{0x7010, 0x21, 16}, /* Velocity */<br>
{0x0000, 0x00, 1}, /* Gap */<br>
{0x6000, 0x02, 1}, /* Latch extern valid */<br>
{0x6000, 0x03, 1}, /* Set counter done */<br>
{0x6000, 0x04, 1}, /* Counter underflow */<br>
{0x6000, 0x05, 1}, /* Counter overflow */<br>
{0x0000, 0x00, 3}, /* Gap */<br>
{0x0000, 0x00, 4}, /* Gap */<br>
{0x6000, 0x0d, 1}, /* Status of extern latch */<br>
{0x6000, 0x0e, 1}, /* Sync error */<br>
{0x0000, 0x00, 1}, /* Gap */<br>
{0x6000, 0x10, 1}, /* TxPDO Toggle */<br>
{0x6000, 0x11, 16}, /* Counter value */<br>
{0x6000, 0x12, 16}, /* Latch value */<br>
{0x6010, 0x01, 1}, /* Ready to enable */<br>
{0x6010, 0x02, 1}, /* Ready */<br>
{0x6010, 0x03, 1}, /* Warning */<br>
{0x6010, 0x04, 1}, /* Error */<br>
{0x6010, 0x05, 1}, /* Moving positive */<br>
{0x6010, 0x06, 1}, /* Moving negative */<br>
{0x6010, 0x07, 1}, /* Torque reduced */<br>
{0x0000, 0x00, 1}, /* Gap */<br>
{0x0000, 0x00, 3}, /* Gap */<br>
{0x6010, 0x0c, 1}, /* Digital input 1 */<br>
{0x6010, 0x0d, 1}, /* Digital input 2 */<br>
{0x6010, 0x0e, 1}, /* Sync error */<br>
{0x0000, 0x00, 1}, /* Gap */<br>
{0x6010, 0x10, 1}, /* TxPDO Toggle */ }; _______________________________________________<br>
etherlab-users mailing list<o:p></o:p></span></p>
<div id="yqtfd93031">
<p class="MsoNormal" style="background:white"><span style="font-family:"Helvetica","sans-serif";color:black"><br>
<a href="mailto:etherlab-users@etherlab.org">etherlab-users@etherlab.org</a><o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="background:white"><span style="font-family:"Helvetica","sans-serif";color:black"><br>
<a href="http://lists.etherlab.org/mailman/listinfo/etherlab-users" target="_blank">http://lists.etherlab.org/mailman/listinfo/etherlab-users</a><o:p></o:p></span></p>
<div id="yqtfd01225">
<p class="MsoNormal" style="background:white"><span style="font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt;background:white"><span style="font-family:"Helvetica","sans-serif";color:black"><o:p> </o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>