Reference 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 axis; // Axis number f64 acceleration =100; // Acceleration value in RPS/S f64 velocity =200; // Velocity value in RPM u16 found, finding; // Check Reference Statuses u16 axisStatus; // Axis status u16 csr=0; // Communication status Register i32 position; // Current position of axis i32 scanVar; // Scan variable to read in values not supported // by the scanf function // Variables for modal error handling u16 commandID; // The commandID of the function u16 resourceID; // The resource ID i32 errorCode; // Error code // Get the board ID printf("Enter the Board ID: "); scanf("%d", &scanVar); boardID=(u8)scanVar; // Check if the board is at power up reset condition err = flex_read_csr_rtn(boardID, &csr); CheckError; if (csr & NIMC_POWER_UP_RESET ){ printf("\nThe FlexMotion board is in the reset condition. Please initialize the board before "); printf("running this example. The \"flex_initialize_controller\" function will initialize the "); printf("board with settings selected through Measurement and Automation Explorer\n"); return; } // Get the axis number printf("Enter the axis: "); scanf("%d",&scanVar); axis=(u8)scanVar; // Flush the Stdin fflush(stdin); // Load acceleration and deceleration to the axis selected err = flex_load_rpsps(boardID, axis, NIMC_BOTH, acceleration, 0xFF); CheckError; // Load velocity to the axis selected err = flex_load_rpm(boardID, axis, velocity, 0xFF); CheckError; // Start the Find Reference move err = flex_find_reference(boardID, axis, 0, NIMC_FIND_HOME_REFERENCE); CheckError; // Wait for find reference to complete on the axis AND // also check for modal errors at the same time do{ // Read the current position of axis err = flex_read_pos_rtn(boardID, axis, &position); CheckError; // Display the current position of axis printf("\rAxis %d position: %10d", axis, position); // Check if the axis has stopped b/c of axis off or following error err = flex_read_axis_status_rtn(boardID, axis, &axisStatus); // Check if the reference has finished finding err = flex_check_reference(boardID, axis, 0, &found, &finding); CheckError; // Read the Communication Status Register - check the // modal error bit err = flex_read_csr_rtn(boardID, &csr); CheckError; if (csr & NIMC_MODAL_ERROR_MSG) { flex_stop_motion(boardID,NIMC_AXIS1, NIMC_DECEL_STOP, 0);//Stop the Motion err = csr & NIMC_MODAL_ERROR_MSG; CheckError; } // test for find reference complete, following error, or axis off status }while ( !(axisStatus & (NIMC_FOLLOWING_ERROR_BIT | NIMC_AXIS_OFF_BIT)) && finding); printf("\nAxis %d position: %10d", axis, position); if (found) printf("\rAxis found reference"); else printf("\rAxis did not find reference"); printf("\n\nFinished.\n"); 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 }