Rotating Knife 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 slaveAxis; // Slave axis number u8 master; // Gear master u16 csr = 0; // Communication status register i32 synchronizationPosition = 0; // Synchronization position i32 correctionPoint = 500; // Point where the correction can be applied i32 cyclePosition = 2000; // One revolution is 2000 counts i32 currentPosition; // The current slave position i32 capturedPosition; // The position at which the trigger happens u16 axisStatus; // 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 slaveAxis = 1; // Master is encoder 4 master = NIMC_ENCODER4; //////////////////////////////// //-------------------------------------------------------- // Set up the gearing configuration for the slave axis //-------------------------------------------------------- // Configure Gear Master err = flex_config_gear_master(boardID, slaveAxis, master); CheckError; // Load Gear Ratio 1:1 err = flex_load_gear_ratio(boardID, slaveAxis, NIMC_ABSOLUTE_GEARING, 1/* ratioNumerator*/, 1/* ratioDenominator*/, 0xFF); CheckError; //-------------------------------------------------------- // Set up the move parameters for the superimposed move // to be done on registration //-------------------------------------------------------- // Set the operation mode to relative err = flex_set_op_mode(boardID, slaveAxis, NIMC_RELATIVE_TO_CAPTURE); CheckError; // Load Velocity in RPM err = flex_load_rpm(boardID, slaveAxis, 100.00, 0xFF); CheckError; // Load Acceleration and Deceleration in RPS/sec err = flex_load_rpsps(boardID, slaveAxis, NIMC_BOTH, 50.00, 0xFF); CheckError; //-------------------------------------------------------- // Enable Gearing on slave axis //-------------------------------------------------------- err = flex_enable_gearing_single_axis (boardID, slaveAxis, NIMC_TRUE); CheckError; //-------------------------------------------------------- // Wait for trigger to do the registration move //-------------------------------------------------------- for(;;){ // Enable High speed capture for slave axis err = flex_enable_hs_capture(boardID, slaveAxis, NIMC_TRUE); CheckError; do { // Check the high speed capture status/following error/axis off status err = flex_read_axis_status_rtn(boardID, slaveAxis, &axisStatus); CheckError; // 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; } }while (!(axisStatus & NIMC_HIGH_SPEED_CAPTURE_BIT) && !(axisStatus & NIMC_FOLLOWING_ERROR_BIT) && !(axisStatus & NIMC_AXIS_OFF_BIT)); // Exit on following error/axis off if((axisStatus & NIMC_FOLLOWING_ERROR_BIT) || (axisStatus & NIMC_AXIS_OFF_BIT)){ break; // Break out of the for loop } // Update the variables for this cycle synchronizationPosition += cyclePosition; correctionPoint += cyclePosition; // Read the captured position err = flex_read_cap_pos_rtn(boardID, slaveAxis, &capturedPosition); CheckError; // Load the target position for the registration (superimposed) move err = flex_load_target_pos(boardID, slaveAxis, (synchronizationPosition-capturedPosition), 0xFF); CheckError; // Wait until we have passed the correction point before we apply the correction currentPosition = 0; while (currentPosition < correctionPoint){ err = flex_read_pos_rtn(boardID, slaveAxis, ¤tPosition); CheckError; } // Start registration move on the slave err = flex_start(boardID, slaveAxis, 0); CheckError; }// For loop 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 }