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后面再看。