婚戒 评论 on 25 Jun 2020 •
@atlaste 谢谢你让我知道。 我没有使用该协议的 VFD 进行测试。如果您想在 Grbl_ESP32 中进行测试,我建议使用现有的 VFD 主轴类作为新的模板。 |
地图集 评论 on 26 Jun 2020
我会的,只是这里没有可用的 esp32(不再……)。我给出的协议规范虽然有效;如果您只是更改现有 vfd 实现中的命令,它将起作用。一旦我在这里有一个 esp32,我很乐意给它试驾。斯特凡。Verzonden vanaf mijn Xperia van 索尼智能手机
|
你好@atlaste |
地图集 评论 on 27 Jun 2020
我刚刚为 H2x VFD 创建了这段代码。此代码有效。今天在 H2A VFD 和 Arduino DUE 上进行了广泛测试,有关所有实施细节的更多信息,请参阅 MD 文件。 @bdring您应该能够简单地将此代码复制/粘贴到新的 VFD 主轴驱动程序中,它就可以工作了。只是不要触摸任何发送/接收代码,因为时间安排是正确的…… |
地图集 评论 on 27 Jun 2020
不幸的是,如果没有实际的 VFD,这几乎是不可能的,而且它们在协议方面似乎都不同。 不过,我确实有一些好消息。您可以下载我刚刚上传的 SpindleTest.zip 文件,获取 VFD 的手册,然后开始使用命令。您的 VFD 的某处应该有一个 modbus 命令手册。Modbus 部分基本上告诉它在接受代码之前第一个字节(地址)和校验和(最后 2 个字节)应该是正确的,所以尝试这个并没有真正的危害。此外,您可以定义 VFD_RS485_DEBUG 变量来获取所有二进制数据。确保从一些“读取”命令开始,一旦成功,在继续之前从“停止主轴”开始。 显然,如果有人已经为您的 VFD 做过,请先谷歌,和/或向 VFD 公司的技术代表询问参考实现或示例命令。如果他这样做了,复制/粘贴代码本身就很容易,因为我已经处理了所有时间问题。 恐怕没有办法绕过这个相当痛苦的过程。我花了几个小时试图弄清楚我的 RS485 命令,因为手册非常缺乏使用轻描淡写…… |
谢谢@atlaste以获得详细的答案。一定会试一试的。 |
婚戒 评论 on 27 Jun 2020
感谢您的代码。可以作为参考。它需要转换为 Grbl_ESP32 主轴类。由于 RTOS,ESP32 中的时序可能更容易。 我很乐意复习某人的 Grbl_ESP32 类代码,但如果没有测试硬件,我编写会是一个缓慢的过程。 |
地图集 评论 on 27 Jun 2020
我刚订购了一个 ESP32,应该会在下周日到货。对您所描述的 RTOS 没有任何经验,但我应该有时间并有兴趣在下周日晚上运行一些测试。 |
婚戒 评论 on 27 Jun 2020
这是当前 VFD 主轴类代码的链接。 https://github.com/bdring/Grbl_Esp32/blob/master/Grbl_Esp32/Spindles/HuanyangSpindle.cpp 您可以使用它作为模板来创建一个新类。 使用 Grbl,您不应在与运动控制器相同的线程中使用任何形式的延迟。此代码使用一个单独的、优先级较低的任务来进行通信和响应等待。将 |
地图集 评论 on 27 Jun 2020
是的,我非常了解该类(并且非常了解原始 grbl 代码库)。 我仍然怀疑最好的方法是什么。我理解为什么 grbl 不喜欢任何延迟,但我们显然也不希望发生一些通信错误和一个不旋转的主轴在你的作品中崩溃:-) 如果发生错误,这可能需要一些时间。 .. 处理此问题的另一种方法是使整个界面非阻塞。毕竟控制主轴的 G 代码只有这么多,因此完全可以将这些代码拆分为“startXXX”和“updateStateXXX”阶段。甚至可能使用状态模式;我怀疑 ESP 有足够的能力来处理这样的事情。 |
婚戒 评论 on 27 Jun 2020
如果您查看代码,您可以看到检测到无响应的主轴。目前我们只弹出一条消息。还有一些评论可以提出定期状态请求。如果正常的主轴命令没有排队,则可以每 200 毫秒对当前速度等进行状态请求。 在任何一种情况下,都可以使用警报或暂停来停止机器。 所有通信都是“非阻塞”的,因为它是一项单独的任务。 |
地图集 评论 on 12 Jul 2020
是的。所以我做了一些研究,我认为我可以将所有安全检查的代码移植到 grbl esp32。这是目前的议程……我目前唯一的问题是我无法让 grbl esp32 处理我的自定义构建,没有它几乎不可能让它全部工作。 |
地图集 评论 on 22 Jul 2020
@bdring我今天开始为 H2x 实现 VFD 代码。仍然未经测试,但我确实有一些需要回答的未解决问题,我主要对 grbl 的行为感到好奇……我以环阳代码作为参考点。
我确实注意到“VFD 队列已满”消息。在这种情况下中止也许是更好的选择?
|
婚戒 评论 2020 年 7 月 22 日
当前的实现足以测试我订购的一些硬件。我一直在为它添加一些内容。首先是一般的主轴报警。如果通信失败或返回状态表明主轴未正常运行,这将停止所有运动。你可以看到有一些 TODO 和关于其中一些的评论。 我打算测试一些失败场景。我没想到在正常操作下会出现队列问题,但如果确实发生了,则停止命令可能会处理该问题。如果 VFD 没有响应,则您无能为力。注意:任务中的循环,可以独立于队列发送命令。这就是状态更新可能的工作方式。 vTaskDelay(200); 在任务中只是一个猜测。我不知道使用什么频率进行状态更新。 没有主轴加速/减速延迟。可以添加一个可以像停顿一样工作的(G4)。它可以通过 $Spindle/Delay/On 和 $Spindle/Delay/Off 设置来实现。主轴类可以实现这一点,因此激光器会忽略它。 我认为,在工作中,主轴速度覆盖它必须忽略延迟。 |
地图集 评论 2020 年 7 月 22 日
@bdring这些更改是否已经在 github 上?我想整合它们。 请注意,我目前正在开发的版本可以在这里找到:https ://github.com/atlaste/Grbl_Esp32/blob/master/Grbl_Esp32/Spindles/H2XSpindle.cpp 。我采用了状态机方法,主要是因为我的 VFD 上的某些操作(例如“设置速度”)需要多个相关操作。
一些 VFD 具有紧急中断功能。我们可以尝试触发该命令或停止主轴命令,这或多或少是最好的希望。在最坏的情况下,VFD 没有响应,在这种情况下,GRBL 应该停止它正在做的任何事情。不幸的是,我认为这很难实现,因为 grbl 的工作方式是非阻塞的。
我所做的是在数据包没有产生令人满意的响应时自动重试。我已经看到数据包丢失发生了很多次,所以我认为这不是可选的。根据丢弃的数据包数量,这可能会导致排队问题,尤其是在使用电源延迟时(这将导致相当多的通信和长时间运行的任务)。
好吧,我的 VFD 手册指出两个命令之间的时间至少应为 7 个字符。波特率为 19200bps,每个字符 9 位,即 63 位,大约等于 3.281 毫秒。所以这将产生一个值 4 作为绝对最小值。 另一种看待这一点的方法是使用 uart 的缓冲区大小作为参考点。我们不希望消息被丢弃。从 ESP32 技术参考手册中,我了解到 UART 控制器共享总共 1024 字节 RAM,大约等于 500 毫秒。我们称之为绝对最大值。 我猜现实是 200 是两个主轴命令之间的最短时间。不幸的是,主轴指令是程序段进给率的一部分,所以这里真正的问题是两个程序段之间有多少时间。如果您的龙门架以 1000 毫米/分钟的速度移动,则 200 的值大约为 3.5 毫米。对于 PCB 铣削来说,这相当多…… 考虑到所有因素,我认为~50ms 将是最好的平衡。那是 另一种方法……你会在电脑上做的是使用一个条件变量,它是从另一个线程触发的。这样,您可以避免睡眠,这使得任务调度程序更容易。另一种方法是使用原子变量,它在任务退出时重置,并在任务开始之前设置。任务只是在使用时启动。但是,我不知道 ESP32 的开销是多少。
是的,关于那个… 这也让我很担心。我在代码中看不到线程同步。虽然我不是 ESP32 架构方面的专家,但我确实知道我在多线程方面的方法,并且我预计至少会有一些易失性、内存栅栏或类似的同步结构。但是,我在这里可能错了;这一切都取决于确切的架构。
我已经考虑过了……我建议让 M3/M4/M5 使用电源延迟,并让块主轴速度覆盖忽略延迟。这至少是我在使用 g 代码时所期望的。 |
婚戒 评论 2020 年 7 月 22 日
如果速度与上次相比没有变化,则忽略来自 Grbl 的持续更新。唯一会导致快速变化的是实时主轴速度倍率。在发送命令后移动
在某些命令之前执行的一种可能性
我没有看到这个,但我想你需要允许重试几次。状态机可能会更好地处理这个问题。任务循环中的状态机可以消除对 xQueue 的需求。
我要先看看这个和警报。它们独立于任何一种主轴类别。 |
地图集 评论 2020 年 7 月 22 日
作为诊断代码的一部分,我的 VFD 可以轮询当前 rpm 值。我也希望其他 vfd 也能做到这一点。 我想可以使用任务的空闲路径。
同意。还有我发现的。
它非常罕见,我发现大约 200 个数据包中有 1 个在 19200、8e1 上损坏。对于 38400 波特,它要多得多。全部使用非屏蔽 rs485 线。
听起来是一个好主意。 我将做一些小的重构,认为现在我已经看到了差异,添加新的 vfd 类应该是可能的并且更容易。还要看看我想要的限位开关/双龙门平方增强……如果你在 git 上有任何东西,请告诉我,如果我们修复同样的东西,那将是一种浪费。 |
婚戒 评论 2020 年 7 月 23 日
我想我有延迟工作。我需要做更多的测试和微调 新的浮动设置$Spindle/Delay/SpinUp秒的 M3 和 M4 延迟。 新浮动设置$Spindle/Delay/SpinDown秒的 M3 延迟。 目前,如果您仅通过 S 值在 gcode 中间更改速度,则不会有额外的延迟。你用 M3 Sxxxx 改变它还有另一个完整的延迟。我需要尝试在这里可以做些什么。我认为我的 VFD 在任何速度之间切换都需要相同的时间。 任何时候发送 M5 都会有一个 SpinDown 延迟,即使主轴已经关闭。 尝试通过发送 S0 而没有 M5 来停止不会有延迟。使用 VFD,无论如何,它们可能会达到最低安全 RPM。 是的,如果您尝试编写错误的 gcode,您可能不会得到您想要的延迟。 它使用具有 gcode 同步的mc_dwell()函数(确保所有先前的 gcode 在开始延迟之前完成)。 main grbl 中的所有内容都在延迟期间停止,但报告仍在继续。没有新的状态。 我需要看看停车场。我认为如果你有停车位,它的工作原理是一样的,除了你可能会降低停车时间,因为大部分都是为了加速/减速。 我使用 PWM 主轴类进行测试。我需要将此添加到其他主轴中。 |
地图集 评论 2020 年 7 月 23 日
好的。我将在今天晚些时候或明天检查代码。 前段时间我注意到 Marlin 也使用 nr 秒来延迟。然而,我非常确定我的 vfd 的延迟取决于目标速度 – 并且它可以作为 s 曲线工作。
|
婚戒 评论 2020 年 7 月 23 日
我目前有大约 8 种主轴类型,而 RS485 是唯一可以做到这一点的一种。如果需要,请继续在您的主轴类中执行此操作。
然后延迟听起来没用。需要加速度和加加速度值来确定速度之间的时间。 |
地图集 评论 2020 年 7 月 23 日
嗯,我希望所有主轴类型都能支持这一点。如果不是,它当然是一个无用的抽象。 你在哪个 git 分支上工作?想合并相关代码。 |
婚戒 评论 2020 年 7 月 23 日 •
在中继主轴上,您无法获得有关何时IsAtTargetSpeed()的反馈。
我的更改都是对当前 Devt 的本地更改。在我对我的代码满意之前,我不会推动。 |
婚戒 评论 2020 年 7 月 24 日
我将代码推送到 Devt 分支。
我找不到关于如何在作业之间 ping vfd 的好的文档。询问 rpm 只是返回控制寄存器的值,无论它是否打开。我需要进一步调查。 警报生成现在只是一个概念证明。 |
地图集 评论 2020 年 7 月 26 日 •
感谢您的提醒,我将提取并合并我的代码。(或者把它扔掉重新开始……还不确定,我对它不是很满意,我仍在阅读代码库是如何工作的)
在拿到主轴之前,我确实扫描了相当多的环阳文档和其他代码(发现它完全不同),所以我回到我的文档,看看是否能找到一些东西。也许这有帮助:http ://royaumedeole.fr/informatique/plugin-mach3-pour-vfdhuanyang/mach3-plugin-for-huanyang-vfd/ 。请注意,他们谈论的是“通过系统 DRO(39) […] 进行 RPM 监控”。不幸的是我没有 mach3 系统,否则我会为你逆向工程命令代码。 另一个可能有趣的来源是https://github.com/GilchristT/SpindleTalker2/releases。它们具有“输出频率”和“设定频率”。 根据https://make-a-project.blogspot.com/2013/05/connecting-huanyang-hy01d523b-vfd-speed.html,“PD025 = 1(启动模式:频率轨道)”也可能是问题所在 PS 2:在返回文档时,我确实注意到’PD023 = 1′ 可以向后旋转。Iirc vfd 现在在所有情况下都是双向的。在初始化期间读取此寄存器可能会很有趣。 |
婚戒 评论 2020 年 7 月 27 日
感谢您的链接。没有真正的新信息或官方信息,但确实证实了一些事情。我运行了 SpindleTalker 2 程序,效果很好。 我更新了固件(devt)。它现在在后台循环遍历一些状态值。如果命令有问题,它会发出警报。如果状态查询有问题,它只会在作业运行时生成警报。我还没有完成,但正在接近。 这是我知道的状态项。 /*
Header Read Len Reg Data Data CRC CRC
0x01 0x04 0x03 0x00 // Set Frequency
0x01 0x04 0x03 0x01 // Ouput Frequency
0x01 0x04 0x03 0x02 // Ouput Amps
0x01 0x04 0x03 0x03 0x00 0x00 0xF0 0x4E // Read RPM
0x01 0x04 0x03 0x04 // DC voltage
0x01 0x04 0x03 0x05 // AC voltage
0x01 0x04 0x03 0x06 // Cont
0x01 0x04 0x03 0x07 // VFD Temp
*/
|
地图集 评论 2020 年 7 月 27 日
@bdring听起来是个不错的计划。 我在 VFD 上的另一种状态是“当前运行状态”。当我的 VFD 重置时,它处于“停止”状态,而当您运行某些东西时,它会进入“前进运行”或后退运行状态。需要注意的重要一点是,在运行期间可以在 VFD 终端上进行用户输入,并且设置速度(在您的情况下为设置频率)设置的值不会改变。在一次跑步中,我发现这是最有价值的信息。 另一件事:我确实认为这是一个很重要的投票状态。我过去注意到,您可以通过轮询太多信息轻松地淹没 RS485 Modbus。 理论上,它们在命令前后保留 4 个字符作为超时,以及在 VFD 中设置的固定超时。前任 假设超时为 50 毫秒,并且您运行 9600 波特,那么如果命令和响应都是 10 个字符,根据文档,我最终得到 (10+4+4)*2 * 9 = 324 位,约为 34 毫秒。简而言之,这意味着在最大速度下每个请求需要 50+34 = 84 毫秒。此处的错误意味着“crc 错误”(可能是数据包冲突)、“地址错误”(我的 vfd 掩盖了错误地址)或根本没有响应。 实际上,我实际上已经看到在 19200 波特上延迟约 100 毫秒出现问题。在 9600 波特上大约是 200 毫秒。为了规避这一点,我基本上做了一个策略,它使用上述计算(有一些松弛),然后当事情开始出错时增加松弛超时(直到最大值 ~1 秒)。 |
婚戒 评论 2020 年 7 月 27 日
我已经运行了一个小时的测试,没有一次超时或“洪水”。我不断地轮询 (4) 个状态项。我认为这永远不会发生,但是用户在主轴超控上敲击可能会被队列满拒绝。 正如我之前所说,我可能会有一些命令,比如停止,先清除队列。我认为覆盖时队列已满可能会通过重试以匹配 rpm 来修复。 在这一点上,spindle 的能力超过了 grbl 和 senders 的特性和能力。我不认为我现在会做太多。我没有多余的时间来捐赠。 |
地图集 评论 2020 年 7 月 28 日 •
嗯很有趣。那时很难知道原因是什么,也许这只是我身边的一个并发问题,因为我只在我的 marlin 实现中看到过这种情况——但这在很多方面都有很大的不同。(包括您可能使用屏蔽电缆而我不使用的小事实)。 无论如何,如果你没有看到它,它是无关紧要的。如果我看到它发生在我的主轴上,我会修复它。我已经开始实施和修复一些东西(也是为了更好地了解代码库),一旦一切恢复正常,我就会做一个 pull req。我目前的目标是使 vfd 代码在未来对其他 vfd 尽可能简单,因为我已经可以看到代码中的差异和相似之处(我也浏览了其他一些手册)。 无论如何,有趣的一件事是用于 vfd(或一般的主轴)的测试脚本。我也会向我公司的测试工程师征求意见,但如果你已经有解决方案,请告诉我。 |
地图集 评论 2020 年 8 月 14 日
PR #544目前正在审核中,支持 H2A。 |
地图集 评论 on 25 Jun 2020
既然我讨厌发生这些事情,我想最好让你知道。这与 P2A、P2B 和 P2C VFD 相关。
让我开始吧:
坏消息:基本上他们以几种不同的方式改变了协议。这适用于环阳的 P2x VFD – 这可能会成为新标准。
丑闻:手册很烂。虽然它解释了它应该如何工作,但实际上它只是信息丢失等混乱。
好消息:它很容易修复,而且我已经为 Marlin 实现了一些工作代码。应该很容易集成到当前的环阳实现中:)
这是您需要的文档: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
干杯!