Contact me: hankecnc@gmail.com

P2x环阳变频器 #453

推推 grbl 3年前 (2023-01-30) 209次浏览
关闭
atlaste 打开了这个问题 2020 年 6 月 25 日 · 30条评论
关闭

P2x环阳变频器#453

atlaste 打开了这个问题 2020 年 6 月 25 日 · 30条评论

注释

P2x环阳变频器 #453
合作者

因为我讨厌这些事情发生,所以我想让你知道会很高兴。这与 P2A、P2B 和 P2C VFD 相关。

让我开始吧:

坏消息:基本上他们以几种不同的方式改变了协议。这适用于来自 Huanyang 的 P2x VFD – 这可能会成为新标准。
坏消息:手册很糟糕。虽然它解释了它应该如何工作,但实际上它只是一团糟,缺少信息等。
好消息:它很容易修复,而且我已经为 Marlin 实现了一些工作代码。应该很容易集成到当前的 Huanyang 实现中:)

这是您需要的文档:https
://github.com/atlaste/Marlin/blob/2.0.x/docs/P2A_VFD_Modbus_Protocol.md 和代码:https ://github.com/atlaste/Marlin/blob/2.0.x /Marlin/src/feature/vfd_spindle.cpp

干杯!

P2x环阳变频器 #453 最后 添加了 增强 新功能或要求标签 2020 年 6 月 25 日
P2x环阳变频器 #453
所有者
培养 评论了 2020 年 6 月 25 日  

@atlaste 谢谢你让我知道。

我没有使用该协议进行测试的 VFD。如果您想在 Grbl_ESP32 中进行测试,我建议使用现有的 VFD 主轴类作为新主轴类的模板。

P2x环阳变频器 #453
合作者作者
最后 评论了 2020 年 6 月 26 日 通过电子邮件
P2x环阳变频器 #453

你好@atlaste
我不是程序员,但我对使用 RS485 运行我的主轴非常感兴趣。我使用具有 RS485 Modbus 输入功能的 Delta MS300 VFD。我将 grbl_esp32 与 pwm 一起使用,然后将其转换为 0-10V 模拟输入到 vfd。如果我对测试您的代码有用,请告诉我。我很乐意提供帮助。

P2x环阳变频器 #453
合作者作者

我刚刚为 H2x VFD 创建了这段代码。此代码有效。今天在 H2A VFD 和 Arduino DUE 上进行了广泛测试,有关所有实施细节的更多信息,请参阅 MD 文件。

主轴测试.zip

@bdring您应该能够简单地将此代码复制/粘贴到新的 VFD 主轴驱动程序中,并且它会起作用。只是不要触摸任何发送/接收代码,因为时间很难正确…

P2x环阳变频器 #453
合作者作者

你好@atlaste
我不是程序员,但我对使用 RS485 运行我的主轴非常感兴趣。我使用具有 RS485 Modbus 输入功能的 Delta MS300 VFD。我将 grbl_esp32 与 pwm 一起使用,然后将其转换为 0-10V 模拟输入到 vfd。如果我对测试您的代码有用,请告诉我。我很乐意提供帮助。

不幸的是,如果这里没有实际的 VFD,这几乎是不可能的,而且它们在协议方面似乎都不同。

不过,我确实有一些好消息。您可以下载我刚刚上传的 SpindleTest.zip 文件,获取 VFD 手册,然后开始使用命令。您的 VFD 某处应该有一本 modbus 命令手册。Modbus 部分基本上告诉第一个字节(地址)和校验和(最后 2 个字节)在它接受代码之前应该是正确的,所以尝试这个没有真正的危害。此外,您可以定义 VFD_RS485_DEBUG 变量来获取所有二进制数据。确保你从一些“读取”命令开始,一旦成功,在你继续之前从“停止主轴”开始。

显然,如果有人已经为您的 VFD 做过这件事,请先谷歌搜索,和/或向 VFD 公司的技术代表索取参考实施或示例命令。如果他这样做了,复制/粘贴代码本身就是简单的部分,因为我已经处理了所有时间问题。

恐怕没有办法绕过这个相当痛苦的过程。我花了好几个小时试图弄清楚我的 RS485 命令,因为手册非常缺乏使用轻描淡写的…

P2x环阳变频器 #453

谢谢@atlaste为详细的答案。一定会尝试一下。

P2x环阳变频器 #453
所有者

感谢您的代码。可以作为参考。它需要转换为 Grbl_ESP32 主轴类。由于 RTOS,ESP32 中的时序可能更容易。

我很乐意审查某人的 Grbl_ESP32 类代码,但如果没有测试硬件,这对我来说是一个缓慢的过程。

P2x环阳变频器 #453
合作者作者

感谢您的代码。可以作为参考。它需要转换为 Grbl_ESP32 主轴类。由于 RTOS,ESP32 中的时序可能更容易。

我很乐意审查某人的 Grbl_ESP32 类代码,但如果没有测试硬件,这对我来说是一个缓慢的过程。

我刚刚订购了 ESP32,应该会在下周日到货。对你所说的 RTOS 没有任何经验,但我应该有时间并且很有兴趣在下周日晚上运行一些测试。

P2x环阳变频器 #453
所有者

这是当前 VFD 主轴类代码的链接。

https://github.com/bdring/Grbl_Esp32/blob/master/Grbl_Esp32/Spindles/HuanyangSpindle.cpp

您可以将其用作模板来制作新课程。

使用 Grbl,您不应在与运动控制器相同的线程中使用任何形式的延迟。此代码使用一个单独的、优先级较低的任务来进行通信和响应等待。将uart_read_bytes(...)在指定时间后等待响应字节或超时。该方法将尽可能快地运行代码。

P2x环阳变频器 #453
合作者作者

这是当前 VFD 主轴类代码的链接。[…]

是的,我非常了解那个类(并且非常了解原始的 grbl 代码库)。

我仍然怀疑最好的方法是什么。我理解为什么 grbl 不喜欢任何延迟,但我们显然也不希望发生一些通信错误和一个非旋转的主轴在您的作品中崩溃 :-) 如果发生错误,这可能需要一些时间。 ..

处理这个问题的另一种方法是使整个界面成为非阻塞的。毕竟控制主轴的 G 代码只有这么多,所以完全有可能将这些代码分成“startXXX”和“updateStateXXX”阶段。甚至可以使用状态模式;我怀疑 ESP 有足够的能力来做这样的事情。

P2x环阳变频器 #453
所有者

如果您查看代码,您会发现检测到一个无响应的主轴。目前我们只弹出一条消息。还有一些意见可以提出常规状态请求。如果正常主轴命令未排队,则可以每 200 毫秒发出当前速度等状态请求。

在任何一种情况下,都可以使用警报或暂停来停止机器。

所有通信都是“非阻塞”的,因为它是一个单独的任务。

P2x环阳变频器 #453
合作者作者

是的。所以我做了一些研究,我想我可以将所有安全检查的代码移植到 grbl esp32。那是目前的议程……我目前唯一的问题是我很难让 grbl esp32 在我的自定义构建上工作,如果没有它几乎不可能让它全部工作。

P2x环阳变频器 #453
合作者作者

@bdring我今天开始为 H2x 实现 VFD 代码。仍然未经测试,但我确实有一些悬而未决的问题需要一些答案,我主要对 grbl 的意图感到好奇……我以 Huanyang 代码作为参考点。

  1. 如果命令队列已满会发生什么。我的意思是,如果我忽略消息(如 Huanyang),它是一个“禁用主轴”命令或“反转主轴方向”,事情就会出错。不过,我不能只是重试,因为 grbl 不允许我 afaik。还有哪些其他选择?

我确实注意到“VFD 队列已满”消息。在这种情况下中止也许是更好的选择?

  1. 如何在 GRBL 中加强速度。F.ex. 当我说“做 20k rpm”并且主轴旋转起来需要 20 秒时,我希望它等待切割材料直到它旋转起来。这个有g代码吗?或者我可以只设置sys.spindle_speed并假设主循环会处理正确的行为吗?

  2. 正如您在评论中注意到的那样,VFD 是一种危险的工具。为了安全起见,我想玩它,并在主轴停止时运行 xQueueReset 和“停止”命令。我想这包括 grbl reset 命令。我假设这称为“init”?

P2x环阳变频器 #453
所有者

当前的实现足以测试我订购的一些硬件。我一直在为它做一些补充。第一个是一般的主轴报警。如果通信失败或返回的状态表明主轴运行不正常,这将停止所有运动。您可以看到有一些 TODO 和关于其中一些的评论。

我打算测试一些失败场景。我没想到在正常操作下会出现队列问题,但如果真的发生了,停止命令可能可以解决这个问题。如果 VFD 没有响应,您将无能为力。注意:任务中的循环,可以独立于队列发送命令。这就是状态更新可能的工作方式。

vTaskDelay(200); 在任务中只是一个猜测。我不知道用于状态更新的频率。

没有主轴旋转上升/下降延迟。可以添加一个像驻留一样工作的 (G4)。它可以通过 $Spindle/Delay/On 和 $Spindle/Delay/Off 设置来实现。主轴类可以实现这一点,因此激光会忽略它。

我认为,在工作中,主轴速度覆盖它必须忽略延迟。

P2x环阳变频器 #453
合作者作者

@bdring这些更改已经在 github 上了吗?我想整合它们。

你知道,我目前正在使用的版本可以在这里找到:https ://github.com/atlaste/Grbl_Esp32/blob/master/Grbl_Esp32/Spindles/H2XSpindle.cpp 。我采用了状态机方法,主要是因为我的 VFD 上的某些操作(如“设置速度”)需要多个相关操作。

我打算测试一些失败场景。[…] 如果 VFD 没有响应,您将无能为力。

一些 VFD 具有紧急中断功能。我们可以尝试触发那个或停止主轴命令,这或多或少是最好的。在最坏的情况下,VFD 没有响应,在这种情况下,GRBL 应该停止它正在做的任何事情。不幸的是,我认为这很难实现,因为 grbl 的工作方式是非阻塞的。

我没想到在正常操作下会出现队列问题,但如果真的发生了,停止命令可能可以解决这个问题。

我所做的是在数据包未产生令人满意的响应时自动重试。我已经看到丢包发生了很多次,所以我不认为这是可选的。根据丢弃的数据包数量,这可能会导致排队问题,尤其是在使用电源延迟时(这将导致相当多的通信和长时间运行的任务)。

vTaskDelay(200); 在任务中只是一个猜测。我不知道用于状态更新的频率。

好吧,我的 VFD 手册指出两个命令之间的时间至少应为 7 个字符。波特率为 19200bps,每个字符 9 位,即 63 位,大约等于 3.281 毫秒。因此,这将产生 4 作为绝对最小值。

另一种看待这个问题的方法是使用 uart 的缓冲区大小作为参考点。我们不希望消息被丢弃。从 ESP32 技术参考手册中,我了解到 UART 控制器共享总共 1024 字节的 RAM,大约等于 500 毫秒。让我们称之为绝对最大值。

我猜实际情况是 200 是两个主轴命令之间的最短时间。不幸的是,主轴指令是块进给率的一部分,所以这里真正的问题是两个块之间的时间间隔。如果您的机架以 1000 毫米/分钟的速度移动,则 200 的值大约为 3.5 毫米。对于 PCB 铣削来说,这是相当多的……

考虑到所有因素,我认为 ~50ms 是最佳平衡。那是50*portTICK_PERIOD_MS(=50) 个滴答声。

另一种方法……你会在个人电脑上做的是使用一个条件变量,它是由另一个线程触发的。这样,您就可以避免休眠,从而使任务计划程序更轻松。另一种方法是使用原子变量,它在任务退出时重置,并在任务开始前设置。任务只是在使用时启动。但是,我不知道 ESP32 的开销是多少。

注意:任务中的循环,可以独立于队列发送命令。这就是状态更新可能的工作方式。

是的关于那个…

这也让我担心。我在代码中看不到线程同步。虽然我不是 ESP32 架构方面的专家,但我确实了解多线程,而且我预计至少会有一些易失性、内存栅栏或类似的同步结构。但是,我在这里可能是错的;这一切都取决于确切的架构。

没有主轴旋转上升/下降延迟。可以添加一个像驻留一样工作的 (G4)。它可以通过 $Spindle/Delay/On 和 $Spindle/Delay/Off 设置来实现。主轴类可以实现这一点,因此激光会忽略它。
我认为,在工作中,主轴速度覆盖它必须忽略延迟。

我考虑过…我建议让 M3/M4/M5 使用功率延迟,并让块主轴速度覆盖忽略延迟。这至少是我在使用 g 代码时所期望的。

P2x环阳变频器 #453
所有者

200 毫秒更新率

如果速度与上次相比没有变化,则忽略来自 Grbl 的不断更新。唯一会导致快速变化的是实时主轴速度覆盖。发送命令后移动_current_pwm_rpm = rpm;到某个点可以解决队列满的问题。没有人应该期望 VFD 立即达到新的速度。

队列问题

在某些命令之前的一种可能性xQueueReset(..) ,例如停止。

正常情况下掉线

我还没有看到这个,但我想你需要允许重试几次。状态机可能会更好地处理这个问题。任务循环中的状态机可以消除对 xQueue 的需求。

延迟

我要先看看这个和警报。它们独立于任何一种主轴等级。

P2x环阳变频器 #453
合作者作者

如果速度与上次相比没有变化,则忽略来自 Grbl 的不断更新。唯一会导致快速变化的是实时主轴速度覆盖。发送命令后移动_current_pwm_rpm = rpm;到某个点可以解决队列满的问题。没有人应该期望 VFD 立即达到新的速度。

我的 VFD 可以轮询当前的转速值,作为诊断代码的一部分。我希望其他 vfd 也能做到这一点。

我想任务的空闲路径可以用于此。

在某些命令之前的一种可能性xQueueReset(..),例如停止。

同意。还有我发现的。

正常情况下掉线

我还没有看到这个,但我想你需要允许重试几次。状态机可能会更好地处理这个问题。任务循环中的状态机可以消除对 xQueue 的需求。

这非常罕见,我发现大约每 200 个数据包中就有 1 个在 19200、8e1 上被损坏。对于 38400 波特,它要多得多。全部使用非屏蔽 rs485 线。

延迟

我要先看看这个和警报。它们独立于任何一种主轴等级。

听起来是一个好主意。

I’m going to do some minor refactoring, think it should be possible and easier to add new vfd classes now that i’ve seen the differences. Also going to take a look at the limit switches/dual gantry squaring enhancement that i want… Do let me know if you have anything on git, it would be a waste if we fix the same thing.

P2x环阳变频器 #453
Owner

喜欢 (0)