Contact me: hankecnc@gmail.com

获取警报/故障输入的最佳方式 #481

推推 grbl 3年前 (2023-01-30) 189次浏览
关闭
karoria 打开了这个问题 2020 年 7 月 18 日 · 4条评论
关闭

获取警报/故障输入的最佳方式#481

karoria 打开了这个问题 2020 年 7 月 18 日 · 4条评论

注释

获取警报/故障输入的最佳方式 #481

嗨,朋友们,
我正在为我的工厂使用简易伺服(带编码器的步进)电机。我想知道如果其中一个驱动器出现故障(由于位置跟随错误或过流或任何原因)的最佳实践,如何在 grbl_esp32 中获取该信号并配置下一步操作,如馈电/复位/继电器操作/步进器禁用。我正在使用 leadshine ES2-DA808 驱动器,它在检测到故障时提供集电极开路输出。
在检测到此类故障时,我倾向于“保持”。但是我想知道如果与grbl_esp32无关的最佳实践。
感谢期待。
拉维

获取警报/故障输入的最佳方式 #481
所有者

我认为我们需要扩展sys_rt_exec_alarm 警报列表。

现在

#define EXEC_ALARM_HARD_LIMIT           1
#define EXEC_ALARM_SOFT_LIMIT           2
#define EXEC_ALARM_ABORT_CYCLE          3
#define EXEC_ALARM_PROBE_FAIL_INITIAL   4
#define EXEC_ALARM_PROBE_FAIL_CONTACT   5
#define EXEC_ALARM_HOMING_FAIL_RESET    6
#define EXEC_ALARM_HOMING_FAIL_DOOR     7
#define EXEC_ALARM_HOMING_FAIL_PULLOFF  8
#define EXEC_ALARM_HOMING_FAIL_APPROACH 9
#define EXEC_ALARM_SPINDLE_CONTROL      10

然后我们需要有一些输入 I/O 功能,可能会中断以观察该 I/O

它们可以是通用的

#define ALARM_INPUT_1     GPIO_NUM_xx
#define ALARM_INPUT_1_TYPE    EXEC_ALARM_MOTOR_FAULT

最终同样的想法可以在没有#defines

如果你想为每个驱动程序单独输入,它很快就会变得混乱。

获取警报/故障输入的最佳方式 #481
合作者
米奇布拉德利 评论了 2020 年 7 月 19 日  

报警代码值使用如下:

  • 多个代码路径检查它是否为非零
  • protocol.cpp 用代码调用report_alarm_message,然后grbl_sendf(.."ALARM:%d\r\n", alarm_code);
  • protocol.cpp 检查特定值 EXEC_ALARM_HARD_LIMIT 和 EXEC_ALARM_SOFT_LIMIT,将它们视为“关键事件”。其他警报值被视为非关键

一些 GCode 发送器解析 ALARM:n 消息。比如CNCjs是这样处理的:

  • 提取 ALARM: 之后的部分并删除 : 和 n 之间的空格。
  • 结果转换为数字。
  • 在包含编号、简要说明和完整说明的表中查找数值。例如,数字 7 是“Homing fail”..“Homing fail. Safety door was opened during homing cycle.”
  • 该表最多包含 9 个条目。CNCjs 不支持第 10 个条目,即 EXEC_ALARM_SPINDLE_CONTROL。
  • 如果表中有匹配项,CNCjs 会向 UI 代理发送以下消息:ALARM:n brief_description。这是为了与 GRBL 1.1 兼容
  • 如果表中没有匹配项,CNCjs 会逐字发送它收到的整个 ALARM:… 消息。这是为了与 GRBL 0.9 兼容。

GRBL 0.9 以 ALARM: brief_description 的形式发送警报消息。如果我们假设 GCode 发送器可以处理 GRBL 0.9 报告,那么我们可以将任何新的警报类型作为文本而不是数字发送。将新的警报类型作为数字发送将不是很友好,除非我们能够设法让发送者更新他们的表。

可能的失败模式是,如果发送者没有检查 ALARM: 消息的形式并做正确的事情,而是打开了 GRBL 版本的知识。

如果我们假设以 GRBL 0.9 文本形式发送警报消息是可以接受的,那么我们需要以下内容:

  • 每个警报都需要一个消息字符串和一个关键位。
  • 干净的方法是创建一个有两个字段的警报类,bool critical 并且 const char* message
  • 如果我们愿意,我们可以int alarmNum为旧的 grbl 1.1 兼容号码添加第三个字段 – 但我不确定我们是否需要它。
  • 为每个现有警报实例化该类,并且每当需要新警报时,使用新消息再次实例化它。不需要分配新号码,因为发件人无论如何都不会知道新警报。

system_set_exec_alarm() 的参数从 uint8_t 更改为 Alarm*。

获取警报/故障输入的最佳方式 #481
作者

感谢您考虑改进。现在,我可以使用步进禁用引脚作为此类警报的输入来禁用所有电机吗?或任何外部装置输入到feedhold pin,以便在出现警报之前,用户无法恢复程序。或者简单地操作继电器并切断驱动器的电源。

获取警报/故障输入的最佳方式 #481
所有者

这已添加到路线图中…关闭