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. . . .