Electronic Camming 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)
{
// Locals
u8 boardID; // Board ID as assigned by MAX
f64 bufferInterval = 0; // Ignored
// Master axis information
u8 masterAxis; // Master axis ID
i32 targetPos; // Position to move to
f64 velocity; // Velocity limit for this move
f64 camCycle = 70000; // Position cycle to repeat the camming process
NIMC_DATA data; // Generic data structure
i32 masterPosition; // Current master position
u16 masterStatus; // Current master status
// Slave axis information
u8 slaveAxis; // Slave axis ID
u8 buffer; // Buffer to contain the cam table
i32 positionArr[] = {0, 10000, 40000, 45000, 45000, 40000, 10000, 0}; // Position array
u32 positionSize = sizeof(positionArr) / sizeof(i32); // Number of positions in the array
i32 slavePosition; // Current slave position
// For error handling
u16 csr; // Communication status
u16 commandID; // Command ID that causes the error
u16 resourceID; // Resource ID that is set on the failed command
i32 errorCode; // Error code from the controller
i32 scanVar; // Scan variable to read in values not supported
// by the scanf function
// Get the board ID
printf("Enter the board ID: ");
scanf("%d", &scanVar);
boardID=(u8)scanVar;
// Get master axis information
printf("\nEnter information about the master axis... \n");
printf("Axis ID: ");
scanf("%d", &scanVar);
masterAxis=(u8)scanVar;
printf("Target position: ");
scanf("%d", &targetPos);
printf("Velocity limit: ");
scanf("%lf", &velocity);
// Get the slave Axis
printf("\nEnter information about the slave axis... \n");
printf("Axis ID: ");
scanf("%d", &scanVar);
slaveAxis=(u8)scanVar;
printf("Buffer ID: ");
scanf("%d", &scanVar);
buffer=(u8)scanVar;
// Configure the cam master & master cycle
err = flex_configure_camming_master(boardID, slaveAxis, masterAxis, camCycle);
CheckError;
// Configure the cam table
err = flex_configure_buffer(boardID, buffer, slaveAxis,
NIMC_CAMMING_POSITION,
positionSize, positionSize,
TRUE, bufferInterval, &bufferInterval);
CheckError;
// Write the data to the buffer
err = flex_write_buffer(boardID, buffer, positionSize,
NIMC_REGENERATION_NO_CHANGE,
positionArr, 0xFF);
CheckError;
// Enable camming immediately
err = flex_enable_camming_single_axis(boardID, slaveAxis, TRUE, -1.0);
CheckError;
// Set to absolute mode
err = flex_set_op_mode(boardID, masterAxis, NIMC_ABSOLUTE_POSITION);
CheckError;
// Set the maximum velocity
data.doubleData = velocity;
err = flex_load_move_constraint(boardID, masterAxis,
TnimcMoveConstraintVelocity, &data);
CheckError;
// Set the target position
err = flex_load_target_pos(boardID, masterAxis, targetPos, 0xFF);
CheckError;
// Start the master axis movement
err = flex_start(boardID, masterAxis, 0x0);
CheckError;
// Keep running until the master completes or there's a modal error
do
{
Sleep (100);
// Get both the master and the slave current positions.
err = flex_read_pos_rtn(boardID, masterAxis, &masterPosition);
CheckError;
err = flex_read_pos_rtn(boardID, slaveAxis, &slavePosition);
CheckError;
// Display the master and the slave current positions.
printf("Axis %d (master) position is %d, Axis %d (slave) position is %d.\r",
masterAxis, masterPosition, slaveAxis, slavePosition);
// Read current master trajectory status
err = flex_read_axis_status_rtn(boardID, masterAxis, &masterStatus);
CheckError;
// Check for modal error
err = flex_read_csr_rtn(boardID, &csr);
CheckError;
} while (!(masterStatus & NIMC_MOVE_COMPLETE_BIT) &&
!(csr & NIMC_MODAL_ERROR_MSG));
/////////////////////////////////////////////////////////////////////////
// Error Handling
//
nimcHandleError; // NIMCCATCHTHIS:
// Disable camming
flex_enable_camming_single_axis(boardID, slaveAxis, FALSE, -1.0);
// Clear (delete) the buffer
flex_clear_buffer(boardID, buffer);
// Make sure the master is not running
flex_stop(boardID, masterAxis, 0x0);
// 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
}