grbl學習之旅---protocol篇(補充)
阿新 • • 發佈:2019-02-09
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後面再看。