Onboard Subroutine 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 u16 csr = 0; // Communication status register // 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 axis = 1; //////////////////////////////// //-------------------------------------------------------- // Onboard program 2. This onboard program moves axis one // clockwise 5000 counts (steps). This onboard program // is executed by onboard program one. //-------------------------------------------------------- // Begin onboard program storage - program number 2 err = flex_begin_store(boardID, 2); CheckError; // Set the operation mode to relative err = flex_set_op_mode(boardID, axis, NIMC_RELATIVE_POSITION); CheckError; // Load Target Position to move clockwise 5000 counts(steps) err = flex_load_target_pos(boardID, axis, 5000, 0xFF); CheckError; // Load Velocity in RPM err = flex_load_rpm(boardID, axis, 100.00, 0xFF); CheckError; // Load Acceleration and Deceleration in RPS/sec err = flex_load_rpsps(boardID, axis, NIMC_BOTH, 50.00, 0xFF); CheckError; // Start the move err = flex_start(boardID, axis, 0); CheckError; // Wait for move to complete err = flex_wait_on_condition(boardID, 0, NIMC_WAIT, NIMC_CONDITION_MOVE_COMPLETE, 2/*Indicates axis 1*/, 0, NIMC_MATCH_ALL, 1000 /*time out*/, 0); CheckError; // End Program Storage err = flex_end_store(boardID, 2); CheckError; //-------------------------------------------------------- // Onboard program 3. This onboard program moves axis one // counter clockwise 5000 counts (steps). This onboard program // is executed by onboard program one. //-------------------------------------------------------- // Begin onboard program storage - program number 3 err = flex_begin_store(boardID, 3); CheckError; // Set the operation mode to relative err = flex_set_op_mode(boardID, axis, NIMC_RELATIVE_POSITION); CheckError; // Load Target Position to move counter clockwise 5000 counts(steps) err = flex_load_target_pos(boardID, axis, -5000, 0xFF); CheckError; // Load Velocity in RPM err = flex_load_rpm(boardID, axis, 100.00, 0xFF); CheckError; // Load Acceleration and Deceleration in RPS/sec err = flex_load_rpsps(boardID, axis, NIMC_BOTH, 50.00, 0xFF); CheckError; // Start the move err = flex_start(boardID, axis, 0); CheckError; // Wait for move to complete err = flex_wait_on_condition(boardID, 0, NIMC_WAIT, NIMC_CONDITION_MOVE_COMPLETE, 2/*Indicates axis 1*/, 0, NIMC_MATCH_ALL, 1000 /*time out*/, 0); CheckError; // End Program Storage err = flex_end_store(boardID, 3); CheckError; //-------------------------------------------------------- // Onboard program 1. The main onboard program monitors // an IO line and based on state of the IO line executes // onboard program 2 or onboard program 3 //-------------------------------------------------------- // Begin onboard program storage - program number 1 err = flex_begin_store(boardID, 1); CheckError; // Insert Label number 1 err = flex_insert_program_label(boardID, 1); CheckError; // Jump to label 2 if the line 1 on port one is active err = flex_jump_label_on_condition (boardID, NIMC_IO_PORT1, NIMC_CONDITION_IO_PORT_MATCH, 2/*Indicates line 1*/, 0, NIMC_MATCH_ALL, 2/*label number*/); CheckError; // If the above jump failed i.e. the IO line is not active // execute program #3 err = flex_run_prog(boardID, 3); CheckError; // Wait for program #3 to finish executing err = flex_wait_on_condition(boardID, 3 /*program #*/, NIMC_WAIT, NIMC_CONDITION_PROGRAM_COMPLETE, 0, 0, NIMC_MATCH_ALL, 1000 /*time out*/, 0); CheckError; // Jump unconditionally to label 1 and check IO line again err = flex_jump_label_on_condition (boardID, 0, NIMC_CONDITION_TRUE, 0, 0, NIMC_MATCH_ALL, 1/*label number*/); CheckError; // Insert Label number 2 err = flex_insert_program_label(boardID, 2); CheckError; // Execute program #2 err = flex_run_prog(boardID, 2); CheckError; // Wait for program #2 to finish executing err = flex_wait_on_condition(boardID, 2 /*program #*/, NIMC_WAIT, NIMC_CONDITION_PROGRAM_COMPLETE, 0, 0, NIMC_MATCH_ALL, 1000 /*time out*/, 0); CheckError; // Jump unconditionally to label 1 and check IO line again err = flex_jump_label_on_condition (boardID, 0, NIMC_CONDITION_TRUE, 0, 0, NIMC_MATCH_ALL, 1/*label number*/); CheckError; // // // End Program Storage err = flex_end_store(boardID, 1); 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 }