static void ConfigureUserLimitInterrupts(int userLimitIndex)
 {
     controller.UserLimitInterruptUserDataAddressSet(userLimitIndex, COMMAND_POSITION_INDEX, axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeCOMMAND_POSITION));
     controller.UserLimitInterruptUserDataAddressSet(userLimitIndex, ACTUAL_POSITION_INDEX, axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeACTUAL_POSITION));
     //controller.UserLimitInterruptUserDataAddressSet(userLimitIndex, TC_COMMAND_POSITION_INDEX, axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeTC_COMMAND_POSITION));
     //controller.UserLimitInterruptUserDataAddressSet(userLimitIndex, TC_ACTUAL_POSITION_INDEX, axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeTC_ACTUAL_POSITION));
 }
        static void Main(string[] args)
        {
            // Initialize RapidCode Objects
            controller = MotionController.CreateFromSoftware();                                                                 // Insert the path location of the RMP.rta (usually the RapidSetup folder)
            SampleAppsCS.HelperFunctions.CheckErrors(controller);                                                               // [Helper Function] Check that the controller has been initialize correctly.

            // Some Necessary Pre User Limit Configuration
            controller.UserLimitCountSet(USER_LIMIT_COUNT);                                                                     // Set the amount of UserLimits that you want to use.

            SampleAppsCS.HelperFunctions.StartTheNetwork(controller);                                                           // [Helper Function] Initialize the network.

            axis = controller.AxisGet(AXIS_INDEX);                                                                              // Initialize your axis object.
            SampleAppsCS.HelperFunctions.CheckErrors(axis);


            try
            {
                // set the triggered modify values to stop very quickly
                axis.TriggeredModifyDecelerationSet(DECEL);
                axis.TriggeredModifyJerkPercentSet(JERK_PCT);

                //////////// FIRST USER LIMIT ////////////
                // USER LIMIT CONDITION 0 (trigger on digital input)
                controller.UserLimitConditionSet(USER_LIMIT_FIRST, 0, LOGIC, axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeDIGITAL_INPUTS), 0x400000, 0x400000);              // Set your User Limit Condition (1st step to setting up your user limit)

                //// USER LIMIT OUTPUT  (copy TC.ActualPosition to UserBuffer)
                // controller.UserLimitOutputSet(USER_LIMIT_FIRST, RSIDataType.RSIDataTypeDOUBLE,  axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeTC_ACTUAL_POSITION), controller.AddressGet(RSIControllerAddressType.RSIControllerAddressTypeUSER_BUFFER), true);

                //// USER LIMIT CONFIGURATION  (cause a TRIGGERED_MODIFY action on the Axis)
                controller.UserLimitConfigSet(USER_LIMIT_FIRST, TRIGGER_TYPE, ACTION, axis.NumberGet(), DURATION, ONE_SHOT);                    // Set your User Limit Configuration. (2nd step to setting up your user limit)


                //////////// SECOND USER LIMIT ////////////
                // CONDITION 0  (wait for first user limit to trigger)
                controller.UserLimitConditionSet(USER_LIMIT_SECOND, 0, RSIUserLimitLogic.RSIUserLimitLogicEQ, controller.AddressGet(RSIControllerAddressType.RSIControllerAddressTypeUSERLIMIT_STATUS, USER_LIMIT_FIRST), 1, 1);

                // CONDITION 1 (AND wait for Axis command velcity = 0.0)
                controller.UserLimitConditionSet(USER_LIMIT_SECOND, 1, RSIUserLimitLogic.RSIUserLimitLogicEQ, axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeCOMMAND_VELOCITY), 0.0);

                // OUTPUT (copy value from UserBuffer to TC.CommandPosition when trigered)
                //controller.UserLimitOutputSet(USER_LIMIT_SECOND, RSIDataType.RSIDataTypeDOUBLE, controller.AddressGet(RSIControllerAddressType.RSIControllerAddressTypeUSER_BUFFER), axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeTC_COMMAND_POSITION), true);
                controller.UserLimitConfigSet(USER_LIMIT_SECOND, RSIUserLimitTriggerType.RSIUserLimitTriggerTypeCONDITION_AND, RSIAction.RSIActionNONE, 0, 0, ONE_SHOT);


                // get the Axis moving
                axis.ClearFaults();
                axis.AmpEnableSet(true);
                axis.MoveVelocity(VELOCITY, ACCEL);

                // configure and enable interrupts
                ConfigureUserLimitInterrupts(USER_LIMIT_FIRST);
                ConfigureUserLimitInterrupts(USER_LIMIT_SECOND);
                controller.InterruptEnableSet(true);

                // wait for (and print) interrupts
                WaitForInterrupts();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }