Aprendizagem GRBL (4)

Aprendizagem GRBL

gcode.c / .h

Sim, sim, seja uma impressora ou uma gravadora, no final, um modelo fatiado ou imagem é necessário para a impressão.Neste momento, o processo central é o processo de análise do Gcode. Portanto, esses dois arquivos são simplesmente o coração do grbl.
Você pode começar com o arquivo de cabeçalho:

No início, o Gcode comumente usado é definido brevemente; na verdade, há mais do que isso.

// Define modal group internal numbers for checking multiple command violations and tracking the 
// type of command that is called in the block. A modal group is a group of g-code commands that are
// mutually exclusive, or cannot exist on the same line, because they each toggle a state or execute
// a unique motion. These are defined in the NIST RS274-NGC v3 g-code standard, available online, 
// and are similar/identical to other g-code interpreters by manufacturers (Haas,Fanuc,Mazak,etc).
// NOTE: Modal group define values must be sequential and starting from zero.
#define MODAL_GROUP_G0 0 // [G4,G10,G28,G28.1,G30,G30.1,G53,G92,G92.1] Non-modal
#define MODAL_GROUP_G1 1 // [G0,G1,G2,G3,G38.2,G38.3,G38.4,G38.5,G80] Motion
#define MODAL_GROUP_G2 2 // [G17,G18,G19] Plane selection
#define MODAL_GROUP_G3 3 // [G90,G91] Distance mode
#define MODAL_GROUP_G4 4 // [G91.1] Arc IJK distance mode
#define MODAL_GROUP_G5 5 // [G93,G94] Feed rate mode
#define MODAL_GROUP_G6 6 // [G20,G21] Units
#define MODAL_GROUP_G7 7 // [G40] Cutter radius compensation mode. G41/42 NOT SUPPORTED.
#define MODAL_GROUP_G8 8 // [G43.1,G49] Tool length offset
#define MODAL_GROUP_G12 9 // [G54,G55,G56,G57,G58,G59] Coordinate system selection
#define MODAL_GROUP_G13 10 // [G61] Control mode

#define MODAL_GROUP_M4 11  // [M0,M1,M2,M30] Stopping
#define MODAL_GROUP_M7 12 // [M3,M4,M5] Spindle turning
#define MODAL_GROUP_M8 13 // [M7,M8,M9] Coolant control

Sim, você pode olhar para trás. No arquivo de cabeçalho, você basicamente faz algumas configurações específicas para diferentes códigos G, como:

#define DISTANCE_MODE_ABSOLUTE 0 // G90 (Default: Must be zero)
#define DISTANCE_MODE_INCREMENTAL 1 // G91

Os dois códigos G G90 e G91, na verdade, muitas vezes podem ser analisados ​​na impressora, que é para fazer o motor se mover de forma relativa ou absoluta. O que se segue é na verdade a definição de um código G especial e comumente usado.

Esta estrutura aparecerá mais tarde, é óbvio que esta estrutura contém diretamente os parâmetros carregados pelo sistema ao imprimir e os códigos G que os controlam.

typedef struct {
    
    
  uint8_t motion;          // {G0,G1,G2,G3,G38.2,G80}
  uint8_t feed_rate;       // {G93,G94}
  uint8_t units;           // {G20,G21}
  uint8_t distance;        // {G90,G91}
  // uint8_t distance_arc; // {G91.1} NOTE: Don't track. Only default supported.
  uint8_t plane_select;    // {G17,G18,G19}
  // uint8_t cutter_comp;  // {G40} NOTE: Don't track. Only default supported.
  uint8_t tool_length;     // {G43.1,G49}
  uint8_t coord_select;    // {G54,G55,G56,G57,G58,G59}
  // uint8_t control;      // {G61} NOTE: Don't track. Only default supported.
  uint8_t program_flow;    // {M0,M1,M2,M30}
  uint8_t coolant;         // {M7,M8,M9}
  uint8_t spindle;         // {M3,M4,M5}
} gc_modal_t;  

Por exemplo: movimento é movimento, e G0 / G1 é um comando G que pode controlar o movimento do motor X / Y, como: G0 X10 F300, isso significa que X vai 10 mm na direção positiva e a velocidade é 300 ao caminhar . Desse ponto de vista, essa estrutura é muito simples.

A estrutura abaixo é o armazenamento dos dados relacionados. Também é baseada no comando G0 X10 F300. A estrutura acima controla este comando, que faz parte do G0 X10. A estrutura abaixo controla o Esta instrução é F300. Na verdade, são a mesma instrução, mas partes diferentes. Portanto, uma instrução de movimento completa deve ser obtida a partir da instrução de controle + dados.

typedef struct {
    
    
  float f;         // Feed
  float ijk[3];    // I,J,K Axis arc offsets
  uint8_t l;       // G10 or canned cycles parameters
  int32_t n;       // Line number
  float p;         // G10 or dwell parameters
  // float q;      // G82 peck drilling
  float r;         // Arc radius
  float s;         // Spindle speed
  uint8_t t;       // Tool selection
  float xyz[3];    // X,Y,Z Translational axes
} gc_values_t;

Pode-se dizer que o acima é o analisador de instruções e o seguinte é a estrutura da análise de estado. Essa estrutura registra vários dados importantes, como velocidade de impressão, posição de impressão, posição atual, etc., são todos parâmetros muito importantes.

typedef struct {
    
    
  gc_modal_t modal;
  
  float spindle_speed;          // RPM
  float feed_rate;              // Millimeters/min
  uint8_t tool;                 // Tracks tool number. NOT USED.
  int32_t line_number;          // Last line number sent

  float position[N_AXIS];       // Where the interpreter considers the tool to be at this point in the code

  float coord_system[N_AXIS];   // Current work coordinate system (G54+). Stores offset from absolute machine
                                // position in mm. Loaded from EEPROM when called.  
  float coord_offset[N_AXIS];   // Retains the G92 coordinate offset (work coordinates) relative to
                                // machine zero in mm. Non-persistent. Cleared upon reset and boot.    
  float tool_length_offset;     // Tracks tool length offset value when enabled.
} parser_state_t;
extern parser_state_t gc_state;

Um objeto como gc_state foi definido em GRBL para controlar e registrar informações relacionadas. Por exemplo, se eu quiser obter as coordenadas de pontos relacionados, posso obter o valor da coordenada ou valor de deslocamento diretamente de gc_state.position [x].

Visto que existem apenas 3 funções declaradas.

// Initialize the parser
void gc_init();

// Execute one block of rs275/ngc/g-code
uint8_t gc_execute_line(char *line);

// Set g-code parser position. Input in steps.
void gc_sync_position(); 

/ *************************************************** ************
Volte para o arquivo .c

Isso é usado para limitar o número de linhas do código G, que pode ser ignorado

#define MAX_LINE_NUMBER 9999999 

Duas definições de estrutura importantes

// Declare gc extern struct
parser_state_t gc_state;
parser_block_t gc_block;

Aqui está a inicialização do código G. Primeiro, a variável de estrutura gc_state é apagada diretamente. Coincidentemente, se a variável de estrutura for apagada, então a máquina será configurada de acordo com o valor padrão.

void gc_init() 
{
    
    
  memset(&gc_state, 0, sizeof(parser_state_t));
  
  // Load default G54 coordinate system.
  if (!(settings_read_coord_data(gc_state.modal.coord_select,gc_state.coord_system))) {
    
     
    report_status_message(STATUS_SETTING_READ_FAIL); 
  } 
}

Portanto, esta função é usada dentro de:

settings_read_coord_data

Na verdade, essa função lê dados relevantes do sistema da eeprom para inicialização.

Aqui você pode converter o número de etapas movidas para o ponto de coordenada atual e gravá-lo.

void gc_sync_position() 
{
    
    
  system_convert_array_steps_to_mpos(gc_state.position,sys.position);
}

A verdadeira análise do gcode é esta função:
como o conteúdo é muito substancial e complicado, só posso explicar brevemente essa função.

uint8_t gc_execute_line(char *line) 

Ele pode ler diretamente as instruções enviadas, incluindo códigos G, valores relacionados (incluindo valores de ponto flutuante com sinal), distinção de maiúsculas e minúsculas e caracteres excluídos. Sim, mesmo se você usar a entrada de comando em minúsculas, ele ainda irá convertê-lo em maiúsculas.O valor de entrada é movido em coordenadas absolutas e a unidade é mm. Existe um cálculo do processo de movimento, e a dificuldade é muito real. . . .

Acho que você gosta

Origin blog.csdn.net/qq_42312125/article/details/112914915
Recomendado
Clasificación