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

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值