Raster Scanning Using Blended Straight Lines 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 vectorSpace; // Vector space number
u16 csr = 0; // Communication status register
u16 axisStatus; // Axis status
u16 status;
u16 complete; // Move or blend complete status
u32 i;
i32 xPosition[11] = {5000, 5000, 0, 0, 5000, 5000, 0, 0, 5000, 5000, 0};
i32 yPosition[11] = {0, 1000, 1000, 2000, 2000, 3000, 3000, 4000, 4000, 5000, 5000};
// 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
vectorSpace = NIMC_VECTOR_SPACE1;
////////////////////////////////
// Configure a 2D Vector Space comprising of axes 1, and 2
err = flex_config_vect_spc(boardID, vectorSpace, 1, 2, 3);
CheckError;
// Set the velocity for the move (in counts/sec)
err = flex_load_velocity(boardID, vectorSpace, 10000, 0xFF);
CheckError;
// Set the acceleration for the move (in counts/sec^2)
err = flex_load_acceleration(boardID, vectorSpace, NIMC_ACCELERATION, 100000, 0xFF);
CheckError;
// Set the deceleration for the move (in counts/sec^2)
err = flex_load_acceleration(boardID, vectorSpace, NIMC_DECELERATION, 100000, 0xFF);
CheckError;
// Set the jerk or s-curve in sample periods
err = flex_load_scurve_time(boardID, vectorSpace, 100, 0xFF);
CheckError;
// Set the operation mode to absolute position
err = flex_set_op_mode(boardID, vectorSpace, NIMC_ABSOLUTE_POSITION);
CheckError;
// Load the straight line segments one by one
for (i=0; i<11; i++){
// Load Target Position
err = flex_load_vs_pos(boardID, vectorSpace, xPosition[i], yPosition[i], 0, 0xFF);
CheckError;
if(i==0){
// Start the move
err = flex_start(boardID, vectorSpace, 0);
CheckError;
}else{
// Blend the move
err = flex_blend(boardID, vectorSpace, 0);
CheckError;
}
do
{
axisStatus = 0;
if(i==10){
// Check the move complete status
err = flex_check_move_complete_status(boardID, vectorSpace, 0, &complete);
CheckError;
}else{
// Check the blend complete status
err = flex_check_blend_complete_status(boardID, vectorSpace, 0, &complete);
CheckError;
}
// Check the following error/axis off status for axis 1
err = flex_read_axis_status_rtn(boardID, 1, &status);
CheckError;
axisStatus |= status;
// Check the following error/axis off status for axis 2
err = flex_read_axis_status_rtn(boardID, 2, &status);
CheckError;
axisStatus |= status;
// 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(50); // Check every 50 ms
}while (!complete && !(axisStatus & NIMC_FOLLOWING_ERROR_BIT) && !(axisStatus & NIMC_AXIS_OFF_BIT)); // Exit on move complete/following error/axis off
if( (axisStatus & NIMC_FOLLOWING_ERROR_BIT) || (axisStatus & NIMC_AXIS_OFF_BIT) ){
break; // Break out of the for loop as an axis was killed
}
}
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
}