1. 程式人生 > >grbl學習之旅---protocol篇(補充)

grbl學習之旅---protocol篇(補充)

protocol.c和protocol.h是實現控制grbl的方法和程式執行協議。涉及到了system.h;stepper.h;print.h;report.h;

system.h 是系統級命令和實時程序。stepper.h是步進電機驅動器,使用步進電機執行planner.c的運動計劃。

print.h定義了一組格式化輸出字串的函式。report.h定義了報告和傳遞訊息的方法。

grbl下位機主要功能模組如圖:


所以對其他的模組,先只瞭解功能,具體實現以後再看。

對於system.h,定義了系統級命令和實時程序。

#ifndef system_h
#define system_h

#include "grbl.h"

// 定義系統執行位對映。在內部使用實時協議作為實時命令標誌,
// 它通知主程式非同步執行指定的實時命令。
// 注意:系統執行器使用無符號的8位可變變數(8標誌限制)。
// 標記總是錯誤的,所以實時協議只需要檢查一個非零值。
// 知道何時有一個實時命令執行。
#define EXEC_STATUS_REPORT  bit(0) // bitmask 00000001
#define EXEC_CYCLE_START    bit(1) // bitmask 00000010
#define EXEC_CYCLE_STOP     bit(2) // bitmask 00000100
#define EXEC_FEED_HOLD      bit(3) // bitmask 00001000
#define EXEC_RESET          bit(4) // bitmask 00010000
#define EXEC_SAFETY_DOOR    bit(5) // bitmask 00100000
#define EXEC_MOTION_CANCEL  bit(6) // bitmask 01000000	

//警報執行器點陣圖。
//注意:EXEC_CRITICAL_EVENT是一個可選標誌,必須設定一個警報標誌。 啟用後,
//這會使Grbl停止進入無限迴圈,直到使用者確認問題併發出軟解決方案,
//重置命令。 例如,硬限制事件需要這種型別的停止和確認。
#define EXEC_CRITICAL_EVENT     bit(0) // bitmask 00000001 (SPECIAL FLAG. See NOTE:)
#define EXEC_ALARM_HARD_LIMIT   bit(1) // bitmask 00000010
#define EXEC_ALARM_SOFT_LIMIT   bit(2) // bitmask 00000100
#define EXEC_ALARM_ABORT_CYCLE  bit(3) // bitmask 00001000
#define EXEC_ALARM_PROBE_FAIL   bit(4) // bitmask 00010000
#define EXEC_ALARM_HOMING_FAIL  bit(5) // bitmask 00100000


//定義系統狀態點陣圖。 狀態變數主要跟蹤各個功能
// Grbl來管理每個不重疊。 它也被用作一個訊息標誌
//關鍵事件。
#define STATE_IDLE          0      // Must be zero. No flags.
#define STATE_ALARM         bit(0) // In alarm state. Locks out all g-code processes. Allows settings access.
#define STATE_CHECK_MODE    bit(1) // G-code check mode. Locks out planner and motion only.
#define STATE_HOMING        bit(2) // Performing homing cycle
#define STATE_CYCLE         bit(3) // Cycle is running or motions are being executed.
#define STATE_HOLD          bit(4) // Active feed hold
#define STATE_SAFETY_DOOR   bit(5) // Safety door is ajar. Feed holds and de-energizes system.
#define STATE_MOTION_CANCEL bit(6) // Motion cancel by feed hold and return to idle. 

//定義系統暫停狀態。
#define SUSPEND_DISABLE       0      // Must be zero.
#define SUSPEND_ENABLE_HOLD   bit(0) // Enabled. Indicates the cycle is active and currently undergoing a hold.
#define SUSPEND_ENABLE_READY  bit(1) // Ready to resume with a cycle start command.
#define SUSPEND_ENERGIZE      bit(2) // Re-energizes output before resume.
#define SUSPEND_MOTION_CANCEL bit(3) // Cancels resume motion. Used by probing routine.


// 定義全域性系統變數
typedef struct {
  uint8_t abort;                 // 系統中止標誌。強制退出回主迴圈for復位。
  uint8_t state;                 // 當前grbl的狀態
  uint8_t suspend;               // 系統延遲 bitflag 變數用來管理 儲存,取消,安全門

  volatile uint8_t rt_exec_state;  
                                   //全域性實時執行器位標誌變數用於狀態管理。 請參閱EXEC位掩碼。
  volatile uint8_t rt_exec_alarm;  // 全域性實際時間執行者bitflag 變數對於設定各種報警
                                 
  int32_t position[N_AXIS];      // 實時機器(aka home)位置向量步驟。
                                 
                                 //注意:如果出現問題,這可能需要是一個易變的變數。                             

  uint8_t homing_axis_lock;       // 鎖定限位時鎖定軸。 用作步進器ISR中的軸運動遮罩。
  volatile uint8_t probe_state;   // 探測狀態值。 用於協調探測迴圈與步進器ISR。
  int32_t probe_position[N_AXIS]; // 機器座標和步驟中的最後探頭位置。
  uint8_t probe_succeeded;        // 如果最後的探測週期成功,則跟蹤。
} system_t;
extern system_t sys;


// 初始化序列協議
void system_init();

// 根據引腳狀態,如果安全門開啟或關閉,則返回。
uint8_t system_check_safety_door_ajar();

// 執行內部系統命令,將其定義為以'$'開頭的字串
uint8_t system_execute_line(char *line);

// 初始化後,執行儲存在EEPROM中的啟動指令碼行
void system_execute_startup(char *line);

// 返回軸'idx'的機床位置。 必須傳送'step'陣列。
float system_convert_axis_steps_to_mpos(int32_t *steps, uint8_t idx);

// 根據傳送的'step'陣列更新機器'位置'陣列。
void system_convert_array_steps_to_mpos(float *position, int32_t *steps);

#endif

對於report.h定義了報告和傳遞訊息的方法。

#ifndef report_h
#define report_h

// 定義Grbl狀態碼。
#define STATUS_OK 0
#define STATUS_EXPECTED_COMMAND_LETTER 1
#define STATUS_BAD_NUMBER_FORMAT 2
#define STATUS_INVALID_STATEMENT 3
#define STATUS_NEGATIVE_VALUE 4
#define STATUS_SETTING_DISABLED 5
#define STATUS_SETTING_STEP_PULSE_MIN 6
#define STATUS_SETTING_READ_FAIL 7
#define STATUS_IDLE_ERROR 8
#define STATUS_ALARM_LOCK 9
#define STATUS_SOFT_LIMIT_ERROR 10
#define STATUS_OVERFLOW 11
#define STATUS_MAX_STEP_RATE_EXCEEDED 12

#define STATUS_GCODE_UNSUPPORTED_COMMAND 20
#define STATUS_GCODE_MODAL_GROUP_VIOLATION 21
#define STATUS_GCODE_UNDEFINED_FEED_RATE 22
#define STATUS_GCODE_COMMAND_VALUE_NOT_INTEGER 23
#define STATUS_GCODE_AXIS_COMMAND_CONFLICT 24
#define STATUS_GCODE_WORD_REPEATED 25
#define STATUS_GCODE_NO_AXIS_WORDS 26
#define STATUS_GCODE_INVALID_LINE_NUMBER 27
#define STATUS_GCODE_VALUE_WORD_MISSING 28
#define STATUS_GCODE_UNSUPPORTED_COORD_SYS 29
#define STATUS_GCODE_G53_INVALID_MOTION_MODE 30
#define STATUS_GCODE_AXIS_WORDS_EXIST 31
#define STATUS_GCODE_NO_AXIS_WORDS_IN_PLANE 32
#define STATUS_GCODE_INVALID_TARGET 33
#define STATUS_GCODE_ARC_RADIUS_ERROR 34
#define STATUS_GCODE_NO_OFFSETS_IN_PLANE 35
#define STATUS_GCODE_UNUSED_WORDS 36
#define STATUS_GCODE_G43_DYNAMIC_AXIS_ERROR 37

// 定義Grbl報警程式碼。
#define ALARM_HARD_LIMIT_ERROR 1
#define ALARM_SOFT_LIMIT_ERROR 2
#define ALARM_ABORT_CYCLE 3
#define ALARM_PROBE_FAIL 4
#define ALARM_HOMING_FAIL 5

// 定義Grbl反饋訊息程式碼。
#define MESSAGE_CRITICAL_EVENT 1
#define MESSAGE_ALARM_LOCK 2
#define MESSAGE_ALARM_UNLOCK 3
#define MESSAGE_ENABLED 4
#define MESSAGE_DISABLED 5
#define MESSAGE_SAFETY_DOOR_AJAR 6
#define MESSAGE_PROGRAM_END 7
#define MESSAGE_RESTORE_DEFAULTS 8

// 列印系統狀態訊息。
void report_status_message(uint8_t status_code);

// 列印系統警報訊息。
void report_alarm_message(int8_t alarm_code);

// 列印各種反饋訊息。
void report_feedback_message(uint8_t message_code);

//列印歡迎資訊
void report_init_message();

// 列印Grbl幫助和當前全域性設定
void report_grbl_help();

// 列印Grbl全域性設定
void report_grbl_settings();

// 列印執行前收到的預解析行的回顯。
void report_echo_line_received(char *line);

// 列印實時狀態報告
void report_realtime_status();

// 列印記錄的探針位置
void report_probe_parameters();

// 列印Grbl NGC引數(座標偏移,探針)
void report_ngc_parameters();

// 列印當前的g程式碼解析器模式狀態
void report_gcode_modes();

// 列印啟動線
void report_startup_line(uint8_t n, char *line);

// 列印編譯資訊和使用者資訊
void report_build_info(char *line);

#endif

對於print.h則是定義了一組格式化輸出字串的函式。

#ifndef print_h
#define print_h


void printString(const char *s);

void printPgmString(const char *s);

void printInteger(long n);

void print_uint32_base10(uint32_t n);

// Prints uint8 variable with base and number of desired digits.
void print_unsigned_int8(uint8_t n, uint8_t base, uint8_t digits); 

// Prints an uint8 variable in base 2.
void print_uint8_base2(uint8_t n);

// Prints an uint8 variable in base 10.
void print_uint8_base10(uint8_t n);

void printFloat(float n, uint8_t decimal_places);

//用於Grbl中特殊變數型別的浮動值列印處理程式。
// - CoordValue:以英寸或毫米報告處理所有位置或座標值。
// - RateValue:以英寸或毫米報告處理進給速率和當前速度。
// - SettingValue:處理所有浮點設定值(總是以mm為單位)。
void printFloat_CoordValue(float n);

void printFloat_RateValue(float n);

void printFloat_SettingValue(float n);

// 除錯工具在被調點處以位元組為單位列印空閒記憶體。 否則不用。
void printFreeMemory();

#endif

stepper.h後面再看。