注释
我的直觉告诉我,当您添加第 4 轴时发生了其他事情。 话虽如此,可配置更新的想法并没有错。它可以帮助低功率机器。 |
如果屏幕变得饱和,它不太可能使正在运行的 linuxcnc 机器崩溃。实时任务是分开的。 |
我也有点怀疑。我做了一些非常仔细的调试以得出我上面讨论的结论。我什至使用完全相同的部件构建了第二台计算机。我从头开始安装,我使用 3 轴版本中包含的 Gmoccapy 模拟器文件对其进行了测试,工作正常,但在 4 轴界面上失败。我将回调超时更改为 200,如上所列,并且有效。如果我将它设置为 110,它实际上工作正常,它在 105 时命中和未命中,在 100 时完全失败。当我使用 5 轴示例时,它必须在 120 左右才能可靠地工作。 |
所以要明确一点,您是否也在未修改的模拟配置上看到了这一点?有趣的。 关于监控,我的意思是它不是来来去去的东西——如果这是一个问题,你就解决它,然后就结束了。 您的更改对 AXIS 没有帮助 – hal_glib 用于 gladevcp、gscreen。gmoccapy 和 qtvcp。 |
我在上面编辑了我的帖子,我添加了屏幕截图。上面的屏幕截图来自未修改的 sim 文件 gmoccapy_4_axis.ini,3 轴 sim 工作正常。我认为额外的开销轴足以将计时推到边界之外,正如通过添加 20 毫秒使其工作所证明的那样。(需要说明的是,所有涉及的文件都直接来自大约 5 小时前的 git pull,唯一修改的文件是 hal_glib.py,如上面的屏幕截图所示。) |
这是一个有趣的问题。我不怀疑你的观察和测试。 |
好的,我只是将 master 中的代码添加到 hal_glib 中以兑现 CYCLE_TIME,它实际上可以以毫秒或秒为单位! |
我只是拉动、构建和测试。通过对 .ini 文件中的 CYCLE_TIME 进行细微调整,它可以正常工作。所以绝对是一个很好的步骤。 在这一点上,将它转换为睡眠时间将是微不足道的,只需让 update() 返回 False,并在返回之前重新调用 timeout_add()。在上层也可以做同样的事情。无论系统速度和用户空间负载如何,这种方法都不会受到饱和/抖动的影响。 |
我将了解如何将更多信息添加到文档中。 |
我会考虑制作一个补丁,但这需要一些时间,因为我必须(更加)熟悉所有相关的部分。这就是为什么我没有立即提交补丁,我试图咨询比我更熟悉大局的人。从技术上讲,c-morley 的补丁是对所报告问题的确认修复,因此也许可以/应该关闭此票证。我会要求项目维护者做出决定。但是,如果弹出其他用户空间负载,它仍然会受到竞争条件的影响。我的观点是,任何 GUI 会根据系统负载进行竞争或抖动显然是一个错误,对于安全相关的 GUI,我认为这是不可接受的,所以我很乐意为它制定解决方案. |
听起来不错。请记住 gscreen、gmoccapy、gladevcp 和 qtvcp 使用 hal_glib(虽然 qtvcp 使用它自己的 gobject 计时器),所以如果打补丁,请测试它们以确认它们仍然有效。 感谢您的报告和讨论。 |
多年来,我一直在我的 3 轴铣床上使用 Gmoccapy,没有出现任何问题,直到我添加了第四个轴来处理我设置为可插拔附件的转台。此更改破坏了 Gmoccapy 的显示。它加载一个空白屏幕,只有 Gremlin 视图在工作,但非常滞后。单击按钮所在的空白屏幕有时会引起预期的反应,有时不会。只是为了调试,我尝试了 Axis 界面,更糟糕的是,除了 Gremlin 之外的屏幕都是空白的,点击按钮应该在的地方什么也没做。我在 glib 上附加了一个调试器,我发现它的任务因定时器回调而饱和,因此在下一次超时之前它永远没有足够的 CPU 时间来渲染图形。我看了看,回调时间硬编码为 100。
hal_glib.py:243 GObject.timeout_add(100, self.update)
我将其更改为 200 只是为了测试,问题已解决,此更改可以正常工作。
我查看了 Gmoccapy 代码,它使用 .ini 文件 [DISPLAY] 部分中的“CYCLE_TIME”来执行更新任务,而不是硬编码。也许将其传递给 hal_glib 将允许用户针对较慢的系统进行调整。不确定这是否是个好主意。(此外,对于我没有查看的 HAL 引脚,还有一些定时器回调也默认为 100 hal_glib.py。)
很明显,timeout_add() 在 glib 中的优先级队列中的位置高于渲染图形。我建议需要有一种方法来监控它的饱和度。一种可能的方法是通过 idle_add() 添加第二个回调,这似乎是在图形渲染完成后由 glib 调用的。然后可以使用一个标志来检查自上次调用 update() 以来是否调用了 idle_add() 的回调。(也许在出现严重错误之前允许有少量失误。但即使失误一次也至少要发出警告。)作为替代方案,可以使用 PID 或类似计算来自动设置循环时间。空闲时间的量可以从完成 idle_add() 回调和完成 timeout_add() 回调的时间开始测量。
无论哪种方式,如果 CPU 饱和到 GUI 变得无响应的程度,这显然是一个错误,并且考虑到该程序的作用,它至少需要检查任务饱和度。
我用 GIT 的最新版本以及 2.8.0 和 2.8.1 测试了这个,所有版本都有同样的问题。
该计算机基于 Intel Atom D510 @ 1.66GHz,内存充足,禁用交换。
硬件接口是 Mesa FPGA 卡。
(很抱歉没有遵循正常的错误报告格式,但由于这已经确定了错误,我认为这不是最佳的报告方法。)