APIs, concepts, guides, and more
multiaxis-motion-point-to-point.cs
/* This sample demonstrates both trapezoidal and S-curve point-to-point motion profiles for multi-axis motion.
The MultiAxis object coordinates the motion of multiple axes simultaneously.
*/
using RSI.RapidCode; // RSI.RapidCode.dotNET;
Console.WriteLine("📜 MultiAxis Motion: Point to Point");
// 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);
// 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);
// prepare for motion
multi.Abort(); // stop any existing motion
multi.ClearFaults();
multi.AmpEnableSet(true);
// disable position error for phantom axes
axis0.ErrorLimitActionSet(RSIAction.RSIActionNONE);
axis1.ErrorLimitActionSet(RSIAction.RSIActionNONE);
// define motion parameters
double[] positions1 = [ 5, 10 ]; // first set of positions
double[] positions2 = [ 15, 15 ]; // second set of positions
double[] velocities1 = [ 1000, 1000 ]; // velocities for first move
double[] velocities2 = [ 1000, 1000 ]; // velocities for second move
double[] accelerations = [ 500, 500 ]; // accelerations for both axes
double[] decelerations = [ 500, 500 ]; // decelerations for both axes
double[] jerkPercent = [ 50, 50 ]; // jerk percent for s-curve motion
// move using s-curve motion profile
Console.WriteLine($"\nMove 1 (S-Curve): Positions = [{positions1[0]}, {positions1[1]}]");
multi.MoveSCurve(positions1, velocities1, accelerations, decelerations, jerkPercent);
multi.MotionDoneWait(); // wait for motion to complete
Console.WriteLine($"Axis 0 CommandPosition: {axis0.CommandPositionGet()} (expected: {positions1[0]})");
Console.WriteLine($"Axis 1 CommandPosition: {axis1.CommandPositionGet()} (expected: {positions1[1]})");
// move using trapezoidal motion profile
Console.WriteLine($"\nMove 2 (Trapezoidal): Positions = [{positions2[0]}, {positions2[1]}]");
multi.MoveTrapezoidal(positions2, velocities2, accelerations, decelerations);
multi.MotionDoneWait(); // wait for motion to complete
Console.WriteLine($"Axis 0 CommandPosition: {axis0.CommandPositionGet()} (expected: {positions2[0]})");
Console.WriteLine($"Axis 1 CommandPosition: {axis1.CommandPositionGet()} (expected: {positions2[1]})");
// cleanup
controller.MotionCountSet(axisCount); // remove multiaxis
Console.WriteLine("\nMulti-axis point-to-point motion complete.");
}
// 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
void ErrorLimitActionSet(RSIAction action)
Set the action that will occur when the Error Limit Event triggers.
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 MoveTrapezoidal(const double *const position, const double *const vel, const double *const accel, const double *const decel)
Point-to-point trapezoidal move.
void AxisRemoveAll()
Remove all axes from a MultiAxis group.s.
void MoveSCurve(const double *const position, const double *const vel, const double *const accel, const double *const decel, const double *const jerkPct)
Point-to-point S-Curve 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 MotionDoneWait()
Waits for a move to complete.
int32_t AmpEnableSet(bool enable, int32_t ampActiveTimeoutMilliseconds=AmpEnableTimeoutMillisecondsDefault, bool overrideRestrictedState=false)
Enable all amplifiers.
RSIAction
Action to perform on an Axis.
Definition rsienums.h:1115