Blended Move 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 // 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, 0); 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 scurve in sample periods err = flex_load_scurve_time(boardID, vectorSpace, 1, 0xFF); CheckError; // Set the operation mode to absolute position err = flex_set_op_mode(boardID, vectorSpace, NIMC_ABSOLUTE_POSITION); CheckError; // Load the first straight line segments to position 5000, 5000 err = flex_load_vs_pos(boardID, vectorSpace, 5000, 5000, 0, 0xFF); CheckError; // Start the move err = flex_start(boardID, vectorSpace, 0); CheckError; // Load Circular Arc - making a semicircle in the counter clockwise direction err = flex_load_circular_arc (boardID, vectorSpace, 5000/*radius*/, 0.0/*startAngle*/, 180.0/*travelAngle*/, 0xFF); CheckError; // Blend the move err = flex_blend(boardID, vectorSpace, 0); CheckError; // Wait for blend to complete before loading the next segment do { axisStatus = 0; // 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 // Load the final straightline segments to position 0, 0 err = flex_load_vs_pos(boardID, vectorSpace, 0, 0, 0, 0xFF); CheckError; // Wait for move to complete as this is the final segment do { axisStatus = 0; // Check the move complete status err = flex_check_move_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 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 }