Contact me: hankecnc@gmail.com

将串行端口逻辑移动到控制器类中。 #1330

推推 grbl 3年前 (2023-02-02) 332次浏览
打开
mrdunk 打开了这个问题 2019 年 12 月 29 日 · 6条评论
打开

将串行端口逻辑移动到控制器类中。#1330

mrdunk 打开了这个问题 2019 年 12 月 29 日 · 6条评论

评论

将串行端口逻辑移动到控制器类中。 #1330

我刚刚看了一下Sender.py
几年前我最后一次查看这个文件,当时认为将不同的控制器类型子类化会很好。很高兴看到控制器插件已经完成了这项工作。

我认为我们可以更进一步。
目前所有支持的控制器都是使用串行端口驱动的,但我认为这有点限制;如果串行端口代码移动到插件父类之一,它将允许编写不依赖于串行端口的插件。
一些有用的插件浮现在脑海中:

  • 使用并行端口、GPIO 引脚等的控制器
  • 无需物理控制器即可测试 bCNC 其余部分的虚拟控制器。
  • 允许对Sender.py.
  • 网络控制器连接到远程端的简化 bCNC(仅实例化Sender类以允许远程使用任何现有插件)。

这项工作看起来并不复杂。它主要只是重构,对逻辑的更改很少。
之后插件层次结构看起来像这样:

_GenericController
.   dummyController
.   _GenericSerialController
. .   SMOOTHIE
. .   _GenericGRBL
. . .   GRBL0
. . .   GRBL1

如果我处理它,这可能会被合并吗?

将串行端口逻辑移动到控制器类中。 #1330
合作者
哈维 评论了 2019 年 12 月 29 日  

实际上,此类功能大多存在。我们为此使用 pyserial url 处理程序:

https://pyserial.readthedocs.io/en/latest/url_handlers.html

谈到用于测试的虚拟控制器,有几种可能性。
您可能会使用grbl-sim(将 grbl 编译为 linux 可执行文件),或者simavr(可以在 linux 上运行任何 atmega/arduino 代码,包括串行线)。或者你可能只是选择这个 repo 中包含的虚拟对象:
https ://github.com/vlachoudis/bCNC/blob/master/tests/fake-grbl.sh

它使用 socat 创建假串口(目前可能只适用于 linux,可能需要在其他平台上进行一些调整)。

如果你不喜欢假串口的想法,如果 pyserial 修复了这个会有所帮助:pyserial/pyserial#393

这将允许直接启动 grbl 模拟器二进制文件,而无需中间伪串行端口将 bCNC 连接到它。

另请注意,如果这种抽象得到改进,它将不仅仅用于 bCNC。其他使用 pyserial 的项目也会受益。

将串行端口逻辑移动到控制器类中。 #1330
作者

因此,虽然我上面列出的大多数用例都有解决方案,但它们都需要在 bCNC 之外进行黑客攻击。
如果对串行端口的依赖是可选的,它将把Sender类与串行端口分离,这样就不再需要这样的 hack 了。

我想我在这里讨论的是代码结构,而不是任何特定的功能。
在我看来,我建议的重构将使现有代码更清晰,未来的工作更容易。

不过,这是您的选择;如果你认为它没有用,那我就放弃它。

将串行端口逻辑移动到控制器类中。 #1330
作者

其他一些随机的想法:

Pyserial URL 处理程序;
我看到你已经发现了 socat 的乐趣。
你知道 socat 可以做 TCP 和串口吗?
有了这个,你可以有一个小型无头 Linux 机器,连接控制器运行 socat
,然后直接从 bCNC 连接到它。socat 可以执行 SOCKS、SSL 等,因此您可以免费获得一些安全性。

你在pyserial/pyserial#393的 pyserial 建议;
我不相信向execpyserial 添加类型功能是正确的方法。
将关于严重安全隐患的讨论放在一边,
在远程服务器上执行任意命令超出了 pyserial 项目试图实现的范围。您可以使用https://github.com/paramiko/paramiko
实现类似的效果。它是一个 Python ssh 库,它(除其他外)允许在远程服务器上执行任意命令。 当然,这让我们回到了最初关于是否需要本地串行连接的讨论……

但是您/可以/使用 paramiko 在远程服务器上以 TCP 模式启动 socat,然后使用 pyserial 连接到它。
我更喜欢使用 paramiko 启动 bCNC 的无头版本并使用 paramiko 与其通信……没有本地串行端口……。这将使远程机器操作系统不可知。它适用于任何具有 Python 和 SSHd 的东西。

grbl-sim看起来很有趣。我想知道这是不是一回事。我会检查一下。谢谢。

将串行端口逻辑移动到控制器类中。 #1330
合作者

我想我在这里讨论的是代码结构,而不是任何特定的功能。

出色地。我现在真的看不到这样做有什么好处。老实说,我最初的目标正是您建议的方法,但是一旦我发现 pyserial 中的功能足够好,我就放弃了这个意图。

不要误会我的意思。我想确保可以从 bCNC 访问常用硬件。我认为目前这意味着两种情况。

1.) ESP32 的 GRBL 端口(启用 wifi 的硬件)
2.) GRBL 插入控制台服务器(例如,带有 USB 端口的架子 Mikrotik 路由器)

这两种设置都在工作并在 wiki 中进行了描述:
https ://github.com/vlachoudis/bCNC/wiki/Connecting

我并不是说你的方法是错误的。也许我们将来可以从中受益。但现在我认为专注于 bCNC 中更大的问题更有意义。现在真正让我心碎的是 g 代码渲染的速度有多慢。更不用说缺乏抗锯齿了。我们需要想办法实现一些更快的图形显示(例如基于 opengl),这将是快速的并且允许即时渲染和自由 3D 旋转。

将串行端口逻辑移动到控制器类中。 #1330
合作者

我不相信将 exec 类型的功能添加到 pyserial 是正确的方法。
将关于严重安全隐患的讨论放在一边,
在远程服务器上执行任意命令超出了 pyserial 项目试图实现的范围。

我不是在谈论在远程服务器上执行任意命令。我说的是在本地执行任意命令。我很清楚这对每个人来说都不是完全安全的,因此需要在使用 pyserial 的代码中显式启用此功能。

我认为问题在于 pyserial 作者反应迟钝。如果他们至少允许新的维护者进入项目,那将会有所帮助。

你知道 socat 可以做 TCP 和串口吗?

我是。这是当前可能的 bCNC 设置之一。在物理连接到 GRBL 的机器上运行 SOCAT,并使用 pyserial over LAN 将 bCNC 连接到它。

将串行端口逻辑移动到控制器类中。 #1330 哈维 补充道 研究和代码清理 需要更多思考的长期想法标签 2019 年 12 月 29 日
将串行端口逻辑移动到控制器类中。 #1330
作者
灌篮 评论了 2019 年 12 月 31 日  

但现在我认为专注于 bCNC 中更大的问题更有意义。
明白了。

现在真正让我心碎的是 g 代码渲染的速度有多慢。

我只是快速浏览了一下CNCCanvas和朋友。
理想情况下,像这样的类要么被提供所有更新,要么缓存或同步对这些更新做出反应,
要么
它可以访问状态机,该状态机具有有关要绘制的内容的数据并每秒自我更新几次。

乍一看CNCCanvas,我认为最适合手头问题的是第二个。
一些引用self.canvas已经泄露,Application导致创建令人担忧的循环依赖。也许这与 TK 处理主循环的方式有关?您是被迫更新以响应 TK 事件,还是您可以根据自己的时间表自由更新画布?
我会担心你对事件的反应比必要的更频繁,浪费了 CPU。
一个可以说更好的模型是在组件需要重绘时在状态机 ( Application) 中设置一个标志,并且每帧只重绘一次。

更不用说缺乏
抗锯齿了。我们需要想办法实现一些更快的图形显示(例如
基于 opengl),这将是快速的并且允许即时渲染和自由 3D 旋转。

你在传统知识中有什么用?
大约 12 年前,我使用过 Pygame,发现它既有趣又直观。它不会强制您使用任何特定的主循环。只需在 2 幅画布中的其中一幅上作画,并在准备好后翻转它们。也许这可能发生在一个单独的线程中?
我不知道有任何其他库可以轻松地从 Python 绘制矢量艺术。

不管怎样,
这有点离题了。
感谢您花时间讨论并感谢有用的软件!

免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
标签
研究和代码清理需要更多思考的长期想法发件人和串行连接
项目

还没有

发展

没有分支机构或拉取请求

2名参加者
将串行端口逻辑移动到控制器类中。 #1330将串行端口逻辑移动到控制器类中。 #1330

喜欢 (0)