APIs, concepts, guides, and more

◆ UserLimitInterruptUserDataAddressSet()

void UserLimitInterruptUserDataAddressSet ( int32_t number,
uint32_t userDataIndex,
uint64_t address )
Description:
UserLimitInterruptUserDataAddressSet will allow you to specify set the user data object address that will be recorded when the user limit specified triggers.

Your specified address can be any address, including all RSIAxisAddressType addresses.

Parameters
numberNumber of the UserLimit.
userDataIndexThere are only 5 User Data objects. (userDataIndex is zero ordinate and must be a value from 0 to 4)
addressThis is the address of the object that you want to keep track of when the User Limit interrupt triggers..

Part of the User Limit method group.

Sample Code:
IO: User Limits
/* This sample demonstrates using two user limits in sequence.
First user limit: triggers on digital input, executes triggered modify to decelerate, stores position.
Second user limit: triggers when first completes and axis is idle, directly sets command position.
This is an advanced example of coordinating multiple user limits.
*/
using RSI.RapidCode; // RSI.RapidCode.dotNET;
Console.WriteLine("šŸ“œ User Limit: Command Position Direct Set");
int exitCode = 0;
// set sample config params
const int USER_LIMIT_FIRST = 0;
const int USER_LIMIT_SECOND = 1;
const int USER_LIMIT_COUNT = 2;
const int DURATION = 0;
const bool ONE_SHOT = true; // user limit triggers only once
// user limit interrupt constants
const int COMMAND_POSITION_INDEX = 0;
const int ACTUAL_POSITION_INDEX = 1;
// get rmp objects
MotionController controller = MotionController.Get();
try
{
Helpers.CheckErrors(controller);
Helpers.VerifyHardwareUsage(controller);
Helpers.VerifyAxisCount(controller);
int initialAxisCount = controller.AxisCountGet();
// configure user limits
controller.UserLimitCountSet(USER_LIMIT_COUNT);
// get axis
Axis axis = controller.AxisGet(Constants.AXIS_0_INDEX);
Helpers.CheckErrors(axis);
if (!Constants.USE_HARDWARE) Helpers.PhantomAxisReset(axis);
// set the triggered modify values to stop very quickly
/*
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│ FIRST USER LIMIT │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
*/
// condition 0: trigger on digital input
controller.UserLimitConditionSet(
number: USER_LIMIT_FIRST,
conditionNumber: 0,
logic: RSIUserLimitLogic.RSIUserLimitLogicEQ,
addressOfUInt32: axis.NetworkNode.DigitalInAddressGet(0),
userLimitMask: (uint) axis.NetworkNode.DigitalInMaskGet(1),
limitValueUInt32: (uint) axis.NetworkNode.DigitalInMaskGet(1));
// configuration: cause a triggered_modify action on the axis
controller.UserLimitConfigSet(
number: USER_LIMIT_FIRST,
triggerType: RSIUserLimitTriggerType.RSIUserLimitTriggerTypeSINGLE_CONDITION,
action: RSIAction.RSIActionTRIGGERED_MODIFY,
actionAxis: axis.NumberGet(),
duration: DURATION,
singleShot: ONE_SHOT);
/*
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│ SECOND USER LIMIT │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
*/
// condition 0: wait for first user limit to trigger
controller.UserLimitConditionSet(
number: USER_LIMIT_SECOND,
conditionNumber: 0,
logic: RSIUserLimitLogic.RSIUserLimitLogicEQ,
addressOfUInt32: controller.AddressGet(RSIControllerAddressType.RSIControllerAddressTypeUSERLIMIT_STATUS, USER_LIMIT_FIRST),
userLimitMask: 1,
limitValueUInt32: 1);
// condition 1: AND wait for axis command velocity = 0.0
controller.UserLimitConditionSet(
number: USER_LIMIT_SECOND,
conditionNumber: 1,
logic: RSIUserLimitLogic.RSIUserLimitLogicEQ,
addressOfDouble: axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeCOMMAND_VELOCITY),
limitValueDouble: 0.0);
// configuration: no action, just monitoring
controller.UserLimitConfigSet(
number: USER_LIMIT_SECOND,
triggerType: RSIUserLimitTriggerType.RSIUserLimitTriggerTypeCONDITION_AND,
action: RSIAction.RSIActionNONE,
actionAxis: 0,
duration: 0,
singleShot: ONE_SHOT);
// start motion
axis.ClearFaults();
axis.MoveVelocity(velocity: 10, accel: 20);
Console.WriteLine("Axis moving... waiting for user limit triggers");
// configure and enable interrupts
ConfigureUserLimitInterrupts(controller, axis, USER_LIMIT_FIRST);
ConfigureUserLimitInterrupts(controller, axis, USER_LIMIT_SECOND);
controller.InterruptEnableSet(true);
// wait for and display interrupts
WaitForInterrupts(controller, initialAxisCount);
// cleanup
axis.Abort();
controller.UserLimitDisable(USER_LIMIT_FIRST);
controller.UserLimitDisable(USER_LIMIT_SECOND);
axis.ClearFaults();
Console.WriteLine("\nUser limit command position direct set complete.");
exitCode = Constants.EXIT_SUCCESS;
}
// handle errors as needed
catch (Exception e)
{
Console.WriteLine($"āŒ Error: {e.Message}");
exitCode = Constants.EXIT_FAILURE;
}
finally
{
controller.Delete(); // dispose
}
return exitCode;
// configure interrupt user data addresses for a user limit
void ConfigureUserLimitInterrupts(MotionController controller, Axis axis, int userLimitIndex)
{
controller.UserLimitInterruptUserDataAddressSet(
number: userLimitIndex,
userDataIndex: COMMAND_POSITION_INDEX,
address: axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeCOMMAND_POSITION));
controller.UserLimitInterruptUserDataAddressSet(
number: userLimitIndex,
userDataIndex: ACTUAL_POSITION_INDEX,
address: axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeACTUAL_POSITION));
}
// wait for and display user limit interrupts
void WaitForInterrupts(MotionController controller, int initialAxisCount)
{
bool done = false;
int timeout_milliseconds = 3000;
int interruptCount = 0;
while (!done)
{
RSIEventType eventType = controller.InterruptWait(timeout_milliseconds);
if (eventType != RSIEventType.RSIEventTypeTIMEOUT)
{
interruptCount++;
Console.WriteLine($"\nInterrupt {interruptCount}: {eventType} at sample {controller.InterruptSampleTimeGet()}");
}
switch (eventType)
{
case RSIEventType.RSIEventTypeUSER_LIMIT:
int userLimitNum = controller.InterruptSourceNumberGet() - initialAxisCount;
double cmdPos = controller.InterruptUserDataDoubleGet(COMMAND_POSITION_INDEX);
double actPos = controller.InterruptUserDataDoubleGet(ACTUAL_POSITION_INDEX);
Console.WriteLine($" UserLimit: {userLimitNum}");
Console.WriteLine($" Command Position: {cmdPos}");
Console.WriteLine($" Actual Position: {actPos}");
break;
case RSIEventType.RSIEventTypeTIMEOUT:
done = true;
Console.WriteLine($"\nāœ“ Completed - received {interruptCount} interrupts");
break;
default:
break;
}
}
}
Constants used in the C# sample apps.
Definition _constants.cs:3
const bool USE_HARDWARE
Default: false.
Definition _constants.cs:10
const int EXIT_FAILURE
Exit code for failed execution.
Definition _constants.cs:69
const int AXIS_0_INDEX
Default: 0.
Definition _constants.cs:20
const int AMP_ENABLE_MS
Default: 750.
Definition _constants.cs:35
const int EXIT_SUCCESS
Exit code for successful execution.
Definition _constants.cs:68
uint64_t AddressGet(RSIAxisAddressType addressType)
Get the an address for some location on the Axis.
void TriggeredModifyDecelerationSet(double decel)
Set the deceleration rate for an Triggered Modify Event.
NetworkNode * NetworkNode
Gets the associated NetworkNode object.
Definition rsi.h:5951
void MoveVelocity(double velocity)
void TriggeredModifyJerkPercentSet(double jerkPct)
Set the jerk percent for an Triggered Modify Event.
Represents a single axis of motion control. This class provides an interface for commanding motion,...
Definition rsi.h:5921
Represents the RMP soft motion controller. This class provides an interface to general controller con...
Definition rsi.h:800
int32_t DigitalInMaskGet(int32_t bitNumber)
Get the bitwise mask for a Node's digital input.
uint64_t DigitalInAddressGet(int32_t bitNumber)
Get the controller memory address for a Node's digital input.
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.
int32_t NumberGet()
Get the axis number.
RSIControllerAddressType
Used to get firmware address used in User Limits, Recorders, etc.
Definition rsienums.h:405
RSIEventType
Event Types or Status Bits.
Definition rsienums.h:973
RSIUserLimitLogic
Logic options for User Limits.
Definition rsienums.h:651
RSIAction
Action to perform on an Axis.
Definition rsienums.h:1122
RSIAxisAddressType
Used to get firmware address used in User Limits, Recorders, etc.
Definition rsienums.h:439
RSIUserLimitTriggerType
Trigger types for UserLimits.
Definition rsienums.h:638
Helpers namespace provides utility functions for common tasks in RMP applications.
Definition helpers.h:21
Examples
userlimit-command-position-direct.cs.