Editing Optimizing SimpleMotion V2 performance

Jump to: navigation, search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.

This page supports semantic in-text annotations (e.g. "[[Is specified as::World Heritage Site]]") to build structured and queryable content provided by Semantic MediaWiki. For a comprehensive description on how to use annotations or the #ask parser function, please have a look at the getting started, in-text annotation, or inline queries help page.

Latest revision Your text
Line 44: Line 44:
 
smGetQueuedSetParamReturnValue(  busHandle, &nul );
 
smGetQueuedSetParamReturnValue(  busHandle, &nul );
 
smGetQueuedSetParamReturnValue(  busHandle, &nul );
 
smGetQueuedSetParamReturnValue(  busHandle, &nul );
 
//TODO add some SM error checking in appropriate places
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
In the above example, the ''smExecuteCommandQueue'' is the only line where RS485 is being used thus generating only one write-read latency instead. ''smAppendSetParamCommandToQueue'' and ''smGetQueuedSetParamReturnValue'' transfer data only inside SMV2 library buffers and are fast calls. The optimized code does only one bus transfer cycle instead of four.
+
In the above example, the ''smExecuteCommandQueue'' is the only line where RS485 is being used thus generating only one write-read latency. ''smAppendSetParamCommandToQueue'' and ''smGetQueuedSetParamReturnValue'' transfer data only inside SMV2 library buffers and are fast calls.
  
 
====Queued size limit====
 
====Queued size limit====
Line 137: Line 135:
 
     smGetQueuedSMCommandReturnValue( busHandle,&readout2 );
 
     smGetQueuedSMCommandReturnValue( busHandle,&readout2 );
 
     smGetQueuedSMCommandReturnValue( busHandle,&readout3 );
 
     smGetQueuedSMCommandReturnValue( busHandle,&readout3 );
 
    //TODO add some SM error checking in appropriate places
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Below an alternative code that writes one variable (absolute setpoint) and read three variables (torque, position and velocity feedbacks). This code is present in live demo in [https://github.com/GraniteDevices/SMV2Commander SMV2Commander example].
 
<syntaxhighlight lang="c">
 
 
    //VALUES DEFINED
 
    int paramAddr1=SMP_ABSOLUTE_SETPOINT;
 
    int paramValue1=0;//your setpoint value
 
    int readOutParamAddr1=SMP_ACTUAL_TORQUE;
 
    int readOutParamAddr2=SMP_ACTUAL_POSITION_FB;
 
    int readOutParamAddr3=SMP_ACTUAL_VELOCITY_FB;
 
    smint32 nul, readout1, readout2, readout3;
 
 
    //WRITING PARAMETERS
 
    //set an parameter number where next values are written. This line consumes 2 bytes of outbound payload
 
    smAppendSMCommandToQueue( busHandle, SMPCMD_SETPARAMADDR, paramAddr1 );
 
 
    //write the parameter value to previously set parameter address. SMPCMD_24B consumes 3 bytes of outbound payload
 
    smAppendSMCommandToQueue( busHandle, SMPCMD_24B, paramValue1);
 
 
    //READING PARAMETERS
 
    //set parameter parameter number which will be returned from each command executed after this
 
    smAppendSMCommandToQueue( busHandle, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_ADDR ); //consumes 2 bytes
 
    /*write new values to parameter SMP_RETURN_PARAM_ADDR. after execution these commands return the parameter values
 
    defined by readOutParamAddrN*/
 
    smAppendSMCommandToQueue( busHandle, SMPCMD_24B, readOutParamAddr1 ); //consumes 3 bytes
 
    smAppendSMCommandToQueue( busHandle, SMPCMD_24B, readOutParamAddr2 ); //consumes 3 bytes
 
    smAppendSMCommandToQueue( busHandle, SMPCMD_24B, readOutParamAddr3 ); //consumes 3 bytes
 
 
    //execute commands over SM bus
 
    smExecuteCommandQueue( busHandle, deviceAddress );
 
 
    /*read value commands (one per each append command). Size of inbound payload depends on
 
    what was set to SMP_RETURN_PARAM_LEN at initialization */
 
    smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
    smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
 
    smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
 
    /*the next readouts reflect to the last three commands appended before smExecuteCommandQueue
 
    and here we get the readout values*/
 
 
    smGetQueuedSMCommandReturnValue( busHandle,&readout1 );
 
    smGetQueuedSMCommandReturnValue( busHandle,&readout2 );
 
    smGetQueuedSMCommandReturnValue( busHandle,&readout3 );
 
 
    //TODO add some SM error checking in appropriate places
 
</syntaxhighlight>
 
 
====Writing multiple and reading single value at one cycle====
 
====Writing multiple and reading single value at one cycle====
 
If we need to read only one variable, we don't need to change readout parameter address during cycle and further improve performance. In this case we set it at initialization and then all consequent commands will return the desired return value.
 
If we need to read only one variable, we don't need to change readout parameter address during cycle and further improve performance. In this case we set it at initialization and then all consequent commands will return the desired return value.
 
Initialization:
 
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
     /* Variables:
 
     /* Variables:
     -readOutParamAddr1 will define the parameter number to be read out into readout1
+
     -readOutParamAddr1 will define the parameter numbers to read out into readout1
 
     */
 
     */
 
     smint32 nul, readOutParamAddr1=SMP_ACTUAL_POSITION_FB;
 
     smint32 nul, readOutParamAddr1=SMP_ACTUAL_POSITION_FB;
Line 216: Line 164:
 
     smGetQueuedSMCommandReturnValue( busHandle, &nul );
 
     smGetQueuedSMCommandReturnValue( busHandle, &nul );
 
     smGetQueuedSMCommandReturnValue( busHandle, &nul );
 
     smGetQueuedSMCommandReturnValue( busHandle, &nul );
 
    //TODO add some SM error checking in appropriate places
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Frequently called function with writing 3 variables and reading one in one bus transfer:
+
Now the same high speed function with writing 3 variables and reading one.
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
     /* Variables:
 
     /* Variables:
Line 252: Line 198:
 
     //write the parameter value to previously set parameter address. SMPCMD_32B consumes 4 bytes of outbound payload
 
     //write the parameter value to previously set parameter address. SMPCMD_32B consumes 4 bytes of outbound payload
 
     smAppendSMCommandToQueue( busHandle, SMPCMD_32B, paramValue3);
 
     smAppendSMCommandToQueue( busHandle, SMPCMD_32B, paramValue3);
 
    //notice that we don't need to change readout parameter addresses here as it we have only one variable to read out
 
  
 
     //execute commands over SM bus
 
     //execute commands over SM bus
 
     smExecuteCommandQueue( busHandle, deviceAddress );
 
     smExecuteCommandQueue( busHandle, deviceAddress );
  
     /*read value commands (one per each append command before execute). Size of inbound payload depends on  
+
    //notice that we don't need to change readout parameter addresses here as it we have only one variable to read out
     what was set to SMP_RETURN_PARAM_LEN at initialization. In this case 3 bytes per return value (total 6x3). */
+
 
 +
     /*read value commands (one per each append command). Size of inbound payload depends on  
 +
     what was set to SMP_RETURN_PARAM_LEN at initialization */
 
     smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
     smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
     smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
     smGetQueuedSMCommandReturnValue( busHandle,&nul );
Line 266: Line 212:
 
     smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
     smGetQueuedSMCommandReturnValue( busHandle,&nul );
 
     smGetQueuedSMCommandReturnValue( busHandle,&readout1 ); //we could get the readout1 from any of the above lines as well
 
     smGetQueuedSMCommandReturnValue( busHandle,&readout1 ); //we could get the readout1 from any of the above lines as well
 
    //TODO add some SM error checking in appropriate places
 
 
</syntaxhighlight>
 
</syntaxhighlight>
==See also==
 
*[[Changing SimpleMotion baud rate]]
 
[[Category:Development]]
 
[[Category:SimpleMotion]]
 

Please note that all contributions to Granite Devices Knowledge Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Granite Devices Knowledge Wiki:Copyrights for details). Do not submit copyrighted work without permission!

Select categories:

To edit this page, please answer the question that appears below (more info):

Cancel | Editing help (opens in new window)