APIs, concepts, guides, and more
multiaxis-motion-velocity.cs
/* This sample demonstrates updating a multi-axis velocity synchronously and on the fly.
It can update velocities at a rate of ~2ms.
Before running this sample app:
1. Make sure to configure your Multi-Axis on RapidSetup.
2. Make sure to adjust your Limits and Action for all axes.
*/
using RSI.RapidCode; // RSI.RapidCode.dotNET;
using System.Threading;
Console.WriteLine("📜 MultiAxis Motion: Velocity");
// set sample config params
const int CYCLES = 3; // how many times to update the velocity
// get rmp objects
try
{
Helpers.CheckErrors(controller);
// set the motion count to AxisCount + 1, every multiaxis needs a motion supervisor
var axisCount = controller.AxisCountGet();
controller.MotionCountSet(axisCount + 1);
// get axes
Axis axis0 = controller.AxisGet(Constants.AXIS_0_INDEX);
Axis axis1 = controller.AxisGet(Constants.AXIS_1_INDEX);
Axis axis2 = controller.AxisGet(Constants.AXIS_2_INDEX);
// get multiaxis (motion supervisor number is equal to number of axes because indexing starts at 0)
MultiAxis multi = controller.MultiAxisGet(axisCount);
// remove any existing axes
multi.AxisRemoveAll();
// add axes to multiaxis
multi.AxisAdd(axis0);
multi.AxisAdd(axis1);
multi.AxisAdd(axis2);
// prepare for motion
multi.Abort();
multi.ClearFaults();
multi.AmpEnableSet(true);
// define motion parameters
double[] accelerations = [1000, 1000, 1000];
double[] velocities = [0, 0, 0];
Random rnd = new Random(); // for generating random velocities
// update velocities on the fly
for (int i = 0; i < CYCLES; i++)
{
// generate random velocities for all axes
velocities[0] = rnd.Next(1, 100);
velocities[1] = rnd.Next(1, 100);
velocities[2] = rnd.Next(1, 100);
Console.WriteLine($"Cycle {i + 1}: Velocities = [{velocities[0]}, {velocities[1]}, {velocities[2]}]");
// move multiaxis (this will also update the move on the fly)
multi.MoveVelocity(velocities, accelerations);
// short delay before next iteration
Thread.Sleep(100);
}
// clean up
Helpers.AbortMotionObject(multi); // stop motion on all axes
controller.MotionCountSet(axisCount); // remove multiaxis
}
// handle errors as needed
finally
{
controller.Delete(); // dispose
}
static void AbortMotionObject(RapidCodeMotion motionObject)
Aborts motion on the given RapidCodeMotion object (Axis or MultiAxis), waits for motion to stop,...
Definition _helpers.cs:186
static void CheckErrors(RapidCodeObject rsiObject)
Checks for errors in the given RapidCodeObject and throws an exception if any non-warning errors are ...
Definition _helpers.cs:15
Helpers class provides static methods for common tasks in RMP applications.
Definition _helpers.cs:5
Represents a single axis of motion control. This class provides an interface for commanding motion,...
Definition rsi.h:5862
Axis * AxisGet(int32_t axisNumber)
AxisGet returns a pointer to an Axis object and initializes its internals.
void MotionCountSet(int32_t motionCount)
Set the number of processed Motion Supervisors in the controller.
static MotionController * Get()
Get an already running RMP EtherCAT controller.
void Delete(void)
Delete the MotionController and all its objects.
MultiAxis * MultiAxisGet(int32_t motionSupervisorNumber)
MultiAxisGet returns a pointer to a MultiAxis object and initializes its internals.
int32_t AxisCountGet()
Get the number of axes processing.
Represents the RMP soft motion controller. This class provides an interface to general controller con...
Definition rsi.h:800
void AxisRemoveAll()
Remove all axes from a MultiAxis group.s.
void MoveVelocity(const double *const velocity, const double *const accel)
Velocity move.
void AxisAdd(Axis *axis)
Add an Axis to a MultiAxis group.
Represents multiple axes of motion control, allows you to map two or more Axis objects together for e...
Definition rsi.h:10794
void ClearFaults()
Clear all faults for an Axis or MultiAxis.
void Abort()
Abort an axis.
int32_t AmpEnableSet(bool enable, int32_t ampActiveTimeoutMilliseconds=AmpEnableTimeoutMillisecondsDefault, bool overrideRestrictedState=false)
Enable all amplifiers.