评论
拥有 STATE_BOOT 或 STATE_RESET 标志(或两者都有?)甚至可能很有用。 |
我看看我是否可以在不进行太多更改的情况下添加它。你也可以在你的插件中本地处理这个,见下文。
|
谢谢,我会检查一下。 另一个关于入口点的想法。我仍然对代码很熟悉,但我希望能够在某些状态下闪烁灯光,例如 ALARM。要以非阻塞方式执行此操作,我需要循环,但是对于事件驱动的回调,我不能保证我会在可靠的时间间隔内被调用。 现在我将闪烁代码切换到报告更新回调中,但这仅在发送方已连接并可靠地请求更新时才有效。诚然,这是预期的操作,大多数发件人都遵守,但间隔有所不同。CNCjs 的当前稳定/官方版本在 ALARM 状态期间停止查询(这可能不是预期/期望的情况,但它就是这样),这会干扰循环。 除了已经存在的更经典的触发事件之外,是否有可能在主循环的末尾有一个入口点,它不是由事件触发,而是在到达循环末尾时触发? |
我在管道中有几个例子,一个是眨眼的:
|
太好了,这正是我要找的。这在今天可用还是在您“在不久的将来承诺”堆栈中可用? |
这是我现在正在为闪烁部分所做的。 是否有 HAL 调用会返回当前警报子代码?我还没有找到一个。 另外,是否有通过 hal.spindle.get_state 调用读取主轴状态的示例?主轴开启是我想要跟踪的关键事项之一。 我还没有尝试优化代码(而且我是一个相对的新手),仍在尝试制定我的核心逻辑。 我希望能够做这样的事情:对于限位开关触发的警报,闪烁红色,但在序列中添加一个轴颜色的快速脉冲,这样你就可以得到 Z 的蓝色脉冲、Y 的绿色脉冲和 X 的红色脉冲传感器。我只需要弄清楚如何从 hal 调用中提取这些细节。
|
您的示例效果很好。我要把我的代码移到那个回调中。 |
也发现了这个: (!(hal.spindle.get_state().on)) |
昨天提交了更多示例。
没有来电,可以从 中读取报警代码
你可以在 grbl/report.c 中找到一个:
您还可以将代码链接到 HAL 入口点,这样就不需要进行轮询。请参阅等离子插件以了解如何执行此操作。请注意,某些功能指针会在设置更改时重置,
将您自己的代码链接到 HAL 在某种程度上与订阅事件相同,您可以用它做各种奇特的事情。查看提供的插件中的代码以获取想法…
提示:轮询 |
感谢您提供的出色反馈以及您对这个项目的所有工作和深入思考。我对您的布局了解得越多,我对结构和可扩展性的印象就越深刻。做得好! |
关于以下问题:
这是一种优雅的表达方式吗?“如果状态为 == STATE_HOLD,则只执行 hal.port.digital_out(port) 调用?如果是这样,你能不能连续有多个这样的东西,它们几乎就像一个 if 链statements or a case statement?我没有意识到你可以在函数调用中进行测试,这很有帮助。 |
不 – 这是一种通过一次状态更改调用来打开或关闭输出的方法。您还可以像这样编写 hal.port.digital_out() 调用:
或者像这样: 当参数值不是布尔值时,最后一个很有用。
这取决于,它会导致一些开销,因为函数调用将始终被执行。
您甚至可以将函数调用用作参数,只要它返回正确的类型即可。无需使用临时变量。一个例子: |
我忘了你上面提到的这个:
这可以这样写(大多数人会这样做?):
如果只需要引用结构/联合返回值中的一个元素,这是一个巧妙的技巧。同样,不需要临时变量。 |
这是一个非常巧妙的技巧。这些都是很棒的细节。 非常感谢所有提示。我将广泛地注释我的插件。当我准备好分享时,我很乐意得到你的想法/代码审查。 |
我正在为我的机器处理状态灯,如果机器进入 STATE_IDLE,它似乎不会触发 onStateChanged 事件。
但是,如果它出现在 STATE_ALARM(需要归位)状态,它就会触发。在启动和重置事件期间触发状态更改会很好,因此链接到该触发器的任何东西都有机会在启动/重置时执行功能。