Raster Scanning Using Blended Straight Lines C/C++ Code

NI-Motion

Raster Scanning Using Blended Straight Lines 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  vectorSpace;        // Vector space number
   u16 csr   = 0;          // Communication status register
   u16 axisStatus;         // Axis status
   u16 status;
   u16 complete;           // Move or blend complete status
   u32 i;
   i32 xPosition[11] = {5000, 5000, 0, 0, 5000, 5000, 0, 0, 5000, 5000, 0};
   i32 yPosition[11] = {0, 1000, 1000, 2000, 2000, 3000, 3000, 4000, 4000, 5000, 5000};

   // 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
   vectorSpace = NIMC_VECTOR_SPACE1;
   ////////////////////////////////

   // Configure a 2D Vector Space comprising of axes 1, and 2
   err = flex_config_vect_spc(boardID, vectorSpace, 1, 2, 3);
   CheckError;

   // Set the velocity for the move (in counts/sec)
   err = flex_load_velocity(boardID, vectorSpace, 10000, 0xFF);
   CheckError;
   
   // Set the acceleration for the move (in counts/sec^2)
   err = flex_load_acceleration(boardID, vectorSpace, NIMC_ACCELERATION, 100000, 0xFF);
   CheckError;
   
   // Set the deceleration for the move (in counts/sec^2)
   err = flex_load_acceleration(boardID, vectorSpace, NIMC_DECELERATION, 100000, 0xFF);
   CheckError;
   
   // Set the jerk or s-curve in sample periods
   err = flex_load_scurve_time(boardID, vectorSpace, 100, 0xFF);
   CheckError;

   // Set the operation mode to absolute position
   err = flex_set_op_mode(boardID, vectorSpace, NIMC_ABSOLUTE_POSITION);
   CheckError;


   // Load the straight line segments one by one 
   for (i=0; i<11; i++){
   
      // Load Target Position
      err = flex_load_vs_pos(boardID, vectorSpace, xPosition[i], yPosition[i], 0,  0xFF);
      CheckError;
      
      if(i==0){
         // Start the move
         err = flex_start(boardID, vectorSpace, 0);
         CheckError;
      }else{
         // Blend the move
         err = flex_blend(boardID, vectorSpace, 0);
         CheckError;
      }

      do
      {
         axisStatus = 0;

         if(i==10){
            // Check the move complete status
            err = flex_check_move_complete_status(boardID, vectorSpace, 0, &complete);
            CheckError;
         }else{
            // Check the blend complete status
            err = flex_check_blend_complete_status(boardID, vectorSpace, 0, &complete);
            CheckError;         
         
         }
         
         // Check the following error/axis off status for axis 1
         err = flex_read_axis_status_rtn(boardID, 1, &status);
         CheckError;
         axisStatus |= status;


         // Check the following error/axis off status for axis 2
         err = flex_read_axis_status_rtn(boardID, 2, &status);
         CheckError;
         axisStatus |= status;

         // 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;
         }
         Sleep(50); // Check every 50 ms

      }while (!complete && !(axisStatus & NIMC_FOLLOWING_ERROR_BIT) && !(axisStatus & NIMC_AXIS_OFF_BIT)); // Exit on move complete/following error/axis off
      
      if( (axisStatus & NIMC_FOLLOWING_ERROR_BIT) || (axisStatus & NIMC_AXIS_OFF_BIT) ){
         break; // Break out of the for loop as an axis was killed
      }

   }

   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
}