Buffered High-Speed Capture C/C++ Code
The following example code is not necessarily complete, and may not compile if copied exactly. Refer to the examples folder on the NI-Motion CD for files that are complete and compile as is.
// Main function
void main(void)
{
u8 boardID; // Board identification number
u8 axis; // Axis number
u16 csr = 0; // Communication status register
i32 bufferSize = 100; // The size of the buffer to allocate on the motion controller
u32 totalPoints = 100; // The number of high speed capture to acquire
i32 capturedPositions[100]; // Array to store the captured positions
f64 actualInterval; // The interval the controller can really contour at
u32 backlog; // Indicates the available space for captured positions
u32 pointsDone; // Indicates the number of points that have been consumed
u16 bufferState; // Indicates the state of the onboard buffer
u32 currentDataPoint = 0; // Indicates the next points to be read from the buffer
i32* readBuffer = NULL; // The temporary array that is created to read captured positions
u32 i;
// Variables for modal error handling
u16 commandID; // The commandID of the function
u16 resourceID; // The resource ID
i32 errorCode; // Error code
///////////////////////////////
// Set the board ID
boardID = 1;
// Set the axis number
axis = NIMC_AXIS1;
////////////////////////////////
// Configure buffer on motion controller memory (RAM)
// Note requested time interval is hardcoded to 10 milliseconds
err = flex_configure_buffer(boardID, 1 /*buffer number*/, axis, NIMC_HS_CAPTURE_READBACK, bufferSize,
totalPoints, NIMC_TRUE, 10, &actualInterval);
CheckError;
// Configure High Speed Capture
err = flex_configure_hs_capture(boardID, axis, NIMC_HS_LOW_TO_HIGH_EDGE, NIMC_OPERATION_BUFFERED);
CheckError;
// Enable the high speed capture on axis
err = flex_enable_hs_capture(boardID, axis, NIMC_TRUE);
CheckError;
do
{
err = flex_check_buffer_rtn(boardID, 1 /*buffer number*/, &backlog, &bufferState, &pointsDone);
CheckError;
// Check backlog for captured position in buffer
if (backlog > 0)
{
readBuffer = (i32*)malloc(sizeof(i32)*backlog);
// If captured position available in the buffer, read the captured position from the buffer
err = flex_read_buffer_rtn(boardID, 1/*buffer number*/, backlog, readBuffer);
for(i=0;i<backlog;i++){
if(currentDataPoint > totalPoints) break;
capturedPositions[currentDataPoint] = readBuffer[i];
printf("capture pos %d\n",capturedPositions[currentDataPoint]);
currentDataPoint++;
}
free(readBuffer);
readBuffer = NULL;
CheckError;
}
// Check for axis off status/following error or any modal errors
// Read the communication status register and check the modal errors
err = flex_read_csr_rtn(boardID, &csr);
CheckError;
// Check the modal errors
if (csr & NIMC_MODAL_ERROR_MSG){
err = csr & NIMC_MODAL_ERROR_MSG;
CheckError;
}
Sleep(60); // Check every 60 ms
} while (bufferState != NIMC_BUFFER_DONE);
// Free the buffer allocated on the controller memory
err = flex_clear_buffer(boardID, 1/*buffer number*/);
CheckError;
return; // Exit the Application
/////////////////////////////////////////////////////////////////////////
// Error Handling
//
nimcHandleError; //NIMCCATCHTHIS:
// Check to see if there were any Modal Errors
if (csr & NIMC_MODAL_ERROR_MSG){
do{
// Get the command ID, resource and the error code of the modal
// error from the error stack on the board
flex_read_error_msg_rtn(boardID,&commandID,&resourceID,&errorCode);
nimcDisplayError(errorCode,commandID,resourceID);
// Read the Communication Status Register
flex_read_csr_rtn(boardID,&csr);
}while(csr & NIMC_MODAL_ERROR_MSG);
}
else // Display regular error
nimcDisplayError(err,0,0);
return; // Exit the Application
}