APIs, concepts, guides, and more
mathblock-calculate-acceleration-from-velocity.cs
using RSI.RapidCode; // RSI.RapidCode.dotNET;
Console.WriteLine("📜 MathBlock: Calculate Acceleration from Velocity");
// set sample config params
const int MB_COUNT = 2;
const int MB1 = 0; // mathblock 1 index: subtract current velocity - previous velocity
const int MB2 = 1; // mathblock 2 index: store current velocity as previous velocity
const double VELOCITY = 1.0;
const double ACCELERATION = 0.0123;
const RSIDataType DOUBLE = RSIDataType.RSIDataTypeDOUBLE;
const RSIMathBlockOperation SUBTRACT = RSIMathBlockOperation.RSIMathBlockOperationSUBTRACT;
const RSIMathBlockOperation MULTIPLY = RSIMathBlockOperation.RSIMathBlockOperationMULTIPLY;
// get RMP controller
try
{
Helpers.CheckErrors(controller);
// set mathblock count before any RapidCodeObject get/create other than the controller
controller.MathBlockCountSet(MB_COUNT);
// get & configure axis
Axis axis = controller.AxisGet(Constants.AXIS_0_INDEX);
axis.ErrorLimitActionSet(RSIAction.RSIActionNONE);
axis.Abort();
axis.ClearFaults();
controller.SampleWait(10);
axis.PositionSet(0);
// set sample addresses
ulong userBuffer0Addr = controller.AddressGet(RSIControllerAddressType.RSIControllerAddressTypeUSER_BUFFER, 0);
ulong previousVelocityAddr = controller.AddressGet(RSIControllerAddressType.RSIControllerAddressTypeMATHBLOCK_PROCESS_VALUE, MB2);
ulong currentVelocityAddr = axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeCOMMAND_VELOCITY);
// write 1 to user buffer index 0 for MB2 multiplication
controller.MemoryDoubleSet(userBuffer0Addr, 1);
// MathBlock 1 config: subtract current velocity - previous velocity
var mbConfig1 = controller.MathBlockConfigGet(MB1);
mbConfig1.Operation = SUBTRACT;
mbConfig1.InputAddress0 = currentVelocityAddr; // input0: current command velocity
mbConfig1.InputAddress1 = previousVelocityAddr; // input1: previous velocity (from 2nd MathBlock)
mbConfig1.InputDataType0 = DOUBLE;
mbConfig1.InputDataType1 = DOUBLE;
mbConfig1.ProcessDataType = DOUBLE;
// MathBlock 2 config: multiply current velocity by 1 to store previous velocity
var mbConfig2 = controller.MathBlockConfigGet(MB2);
mbConfig2.Operation = MULTIPLY;
mbConfig2.InputAddress0 = currentVelocityAddr; // input0: current command velocity
mbConfig2.InputAddress1 = userBuffer0Addr; // input1: constant "1" from user buffer
mbConfig2.InputDataType0 = DOUBLE;
mbConfig2.InputDataType1 = DOUBLE;
mbConfig2.ProcessDataType = DOUBLE;
// set MathBlock configurations
controller.MathBlockConfigSet(MB1, mbConfig1);
controller.MathBlockConfigSet(MB2, mbConfig2);
// wait 1 sample for MathBlock config to take effect
controller.SampleWait(1);
// move axis with small acceleration to verify MathBlock calculation
axis.AmpEnableSet(true);
axis.MoveVelocity(VELOCITY, ACCELERATION);
controller.SampleWait(10);
// get latest sample velocity delta from MathBlock 1
double latestVelocityDelta = controller.MathBlockProcessValueGet(MB1).Double;
// reduce velocity back to 0
axis.MoveVelocity(0, ACCELERATION);
// see results
double sampleRate = controller.SampleRateGet();
double userUnits = axis.UserUnitsGet();
double calculatedAcceleration = latestVelocityDelta * Math.Pow(sampleRate, 2) / userUnits;
// rounding to 8 decimals matches encoder resolution for most systems.
// this is more precise than typical hardware needs.
double calculatedAccelerationRounded = Math.Round(calculatedAcceleration, 8);
// print results
Console.WriteLine($"Calculated acceleration: {calculatedAccelerationRounded}");
Console.WriteLine($"Expected acceleration: {ACCELERATION}");
// verify accuracy
if (ACCELERATION != calculatedAccelerationRounded)
throw new Exception("❌ MathBlock result is outside accepted tolerance.");
}
// handle errors as needed
finally
{
controller.Delete(); // dispose
}
Constants used in the C# sample apps.
const int AXIS_0_INDEX
Default: 0.
Definition _constants.cs:13
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
uint64_t AddressGet(RSIAxisAddressType addressType)
Get the an address for some location on the Axis.
double UserUnitsGet()
Get the number of counts per User Unit.
void ErrorLimitActionSet(RSIAction action)
Set the action that will occur when the Error Limit Event triggers.
void MoveVelocity(double velocity)
void PositionSet(double position)
Set the Command and Actual positions.
Represents a single axis of motion control. This class provides an interface for commanding motion,...
Definition rsi.h:5870
Axis * AxisGet(int32_t axisNumber)
AxisGet returns a pointer to an Axis object and initializes its internals.
void MathBlockCountSet(int32_t mathBlockCount)
Set the number of processed MathBlocks in the MotionController.
static MotionController * Get()
Get an already running RMP EtherCAT controller.
void MemoryDoubleSet(uint64_t address, double dataDouble)
Write a 64-bit double value to controller memory.
uint64_t AddressGet(RSIControllerAddressType type)
Get the an address for some location on the MotionController.
void SampleWait(uint32_t samples)
Wait for controller firmware to execute samples.
void Delete(void)
Delete the MotionController and all its objects.
Represents the RMP soft motion controller. This class provides an interface to general controller con...
Definition rsi.h:800
MathBlockConfig MathBlockConfigGet(int32_t mathBlockNumber)
Get a MathBlock configuration.
FirmwareValue MathBlockProcessValueGet(int32_t mathBlockNumber)
Get a MathBlock process value.
void MathBlockConfigSet(int32_t mathBlockNumber, MathBlockConfig &config)
Set a MathBlock configuration.
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.
RSIMathBlockOperation
MathBlock operations.
Definition rsienums.h:1431
RSIControllerAddressType
Used to get firmware address used in User Limits, Recorders, etc.
Definition rsienums.h:405
RSIDataType
Data types for User Limits and other triggers.
Definition rsienums.h:659
RSIAction
Action to perform on an Axis.
Definition rsienums.h:1115
RSIAxisAddressType
Used to get firmware address used in User Limits, Recorders, etc.
Definition rsienums.h:434
double Double
Double precision (64-bit) floating-point.
Definition rsi.h:477