Electronic Gearing 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
u16 moveComplete;
// 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 3:2
err = flex_load_gear_ratio(boardID, slaveAxis, NIMC_RELATIVE_GEARING,
3/* ratioNumerator*/, 2/* ratioDenominator*/, 0xFF);
CheckError;
//--------------------------------------------------------
// Enable Gearing on slave axis
//--------------------------------------------------------
err = flex_enable_gearing_single_axis (boardID, slaveAxis, NIMC_TRUE);
CheckError;
// Wait for 5 seconds
Sleep(5000);
//--------------------------------------------------------
// Set up the move parameters for the superimposed move
//--------------------------------------------------------
// Set the operation mode to relative
err = flex_set_op_mode(boardID, slaveAxis, NIMC_RELATIVE_TO_CAPTURE);
CheckError;
// Load Velocity in counts/s
err = flex_load_velocity(boardID, slaveAxis, 10000, 0xFF);
CheckError;
// Load Acceleration and Deceleration in counts.sec^2
err = flex_load_acceleration(boardID, slaveAxis, NIMC_BOTH, 100000, 0xFF);
CheckError;
// Load the target position for the registration (superimposed) move
err = flex_load_target_pos(boardID, slaveAxis, 5000, 0xFF);
CheckError;
// Start registration move on the slave
err = flex_start(boardID, slaveAxis, 0);
CheckError;
err = flex_wait_for_move_complete (boardID, slaveAxis, 0,
1000/*ms timeout*/, 20/*ms pollInterval*/, &moveComplete);
CheckError;
//--------------------------------------------------------
// Disable Gearing on slave axis
//--------------------------------------------------------
err = flex_enable_gearing_single_axis (boardID, slaveAxis, NIMC_FALSE);
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
}