APIs, concepts, guides, and more
Recorder

Learn how to use Recorders.

Warning
This is a sample program to assist in the integration of the RMP motion controller with your application. It may not contain all of the logic and safety features that your application requires. We recommend that you wire an external hardware emergency stop (e-stop) button for safety when using our code sample apps. Doing so will help ensure the safety of you and those around you and will prevent potential injury or damage.

The sample apps assume that the system (network, axes, I/O) are configured prior to running the code featured in the sample app. See the Configuration page for more information.


📜 Recorder
In this sample app we show you how easy it is to track multiple drive parameters with a Recorder.

const int VALUES_PER_RECORD = 2; // How many values to store in each record.
const int RECORD_PERIOD_SAMPLES = 1; // How often to record data. (samples between consecutive records)
const int RECORD_TIME = 250; // How long to record. (in milliseconds)
const int INPUT_INDEX = 0;
// Get the host controller addresses for the values we want to record
// Number of processed Recorders in the controller.
controller.RecorderCountSet(1);
controller.AxisCountSet(1);
Axis axis = CreateAndReadyAxis(Constants.AXIS_NUMBER); // Helper function to setup an axis
UInt64 userBufferAddress = controller.AddressGet(RSIControllerAddressType.RSIControllerAddressTypeUSER_BUFFER, 0); // Grabing an memory address to store a simulated IO point.
// Instead of using physical IO we will use simulated IO using a memory address as simulated IO. See the IO sample apps to see how to use a physical IO instead.
IOPoint input = IOPoint.CreateDigitalInput(controller, userBufferAddress, INPUT_INDEX); // Create a simulated IOpoint using userBuffer memory.
if (controller.RecorderEnabledGet() == true) // Check if the recorder is running already. If it is, stop it.
{
controller.RecorderStop(); // Stop recording.
controller.RecorderReset(); // Reset controller.
}
controller.RecorderPeriodSet(RECORD_PERIOD_SAMPLES); // Configure recorder to record every 'n' samples (Every 'n' ms)
controller.RecorderCircularBufferSet(false); // Do not use a circular buffer
controller.RecorderDataCountSet(VALUES_PER_RECORD); // Configure the number of values for each record. (how many things to record)
controller.RecorderDataAddressSet(0, axis.AddressGet(RSIAxisAddressType.RSIAxisAddressTypeACTUAL_POSITION)); // Configure the recoder to record values from this address (1st recorded address)
controller.RecorderDataAddressSet(1, input.AddressGet()); // Configure the recoder to record values from this address (2nd recorded address)
controller.RecorderStart(); // Start recording.
controller.OS.Sleep(RECORD_TIME); // Put this thread to sleep for some milliseconds.
int recordsAvailable = controller.RecorderRecordCountGet(); // find out how many records were recorded. (Get the number of records that are stored and ready for reading)
Console.WriteLine("There are {0} Records available.", recordsAvailable); // Print the number of records recorded.
for (int i = 0; i < recordsAvailable; i++) // Check every record recorded.
{
controller.RecorderRecordDataRetrieve(); // Retrieve one record of recorded data.
double positionRecord = controller.RecorderRecordDataDoubleGet(0); // Get the value from the 1st specified address. /use double
var digitalInputsValue = controller.RecorderRecordDataValueGet(1); // Get the value from the 2nd specified address.
if ((digitalInputsValue & input.MaskGet()) == input.MaskGet()) // We are checking to see if the digital input 1 bit changes. If it does then we record the position when that input went high.
{
i = recordsAvailable; // break from loop.
Console.WriteLine("Your encoder position was: " + positionRecord + " when the input triggered.");
}
}
controller.RecorderStop(); // Stop recording.
controller.RecorderReset(); // Reset controller.

Learn more in the concept page.