APIs, concepts, guides, and more

◆ InterruptUserDataGet()

uint64_t InterruptUserDataGet ( uint32_t userDataIndex)
inherited
Description:
InterruptUserDataGet returns the user data from the interrupt
Returns
(uint64) User data.
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
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)
{
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:5993
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:5963
static MotionController * Get()
Get an already running RMP EtherCAT controller.
void UserLimitInterruptUserDataAddressSet(int32_t number, uint32_t userDataIndex, uint64_t address)
Set the User Data address based on a User Limit trigger.
Represents the RMP soft motion controller. This class provides an interface to general controller con...
Definition rsi.h:796
int32_t DigitalInMaskGet(int32_t bitNumber)
Get the bitwise mask for a Node's digital input.
uint64_t DigitalInAddressGet(int32_t bitNumber)
Get the host 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:1016
RSIUserLimitLogic
Logic options for User Limits.
Definition rsienums.h:690
RSIAction
Action to perform on an Axis.
Definition rsienums.h:1165
RSIAxisAddressType
Used to get firmware address used in User Limits, Recorders, etc.
Definition rsienums.h:439
RSIUserLimitTriggerType
Trigger types for UserLimits.
Definition rsienums.h:677
Helpers namespace provides utility functions for common tasks in RMP applications.
Definition helpers.h:21
See also
UserLimitInterruptUserDataAddressSet