注释
在相关说明中,我一直在挖掘各种 Huanyang 文档来源,以更好地理解协议中不太常用的部分,并在此处收集这些说明:https ://paper.dropbox.com/doc/Huanyang-VFD- modbus 协议–BArwgZ4Tgj_dWv27riC1eFBTAQ-836X8EruAxH21PFe0Z2Um 它主要基于这个 Huanyang 手册,但我仍然计划根据我的 VFD 验证一些奇怪的地方,看看它是文档错误还是实际的奇怪行为。 到目前为止,我从实验中注意到的一些有趣的事情:
一般来说,在我更新的实现中,我试图在我们请求的值(我称之为“配置”值)和代表当前状态的值(无论我们请求什么)之间保持明确的区别,我称之为“实际”值。 因此,例如,我的基本状态检查当前返回 4 个值:
它通过读取“Set F”状态寄存器(用于配置的 rpm)、读取“RoTT”状态寄存器(用于实际的 rpm)和写入一个空控制命令(用于配置的和实际状态)来实现这一点。 您可以在一个简单的(正向)加速、减速测试中看到这些变化:
|
@scottbez1很高兴您找到了获得实际 RPM 的方法,这可用于主轴全速功能。有了这个,IMO 将解决你们中的一些人对稳健性的担忧。 |
到目前为止,在这方面取得了很好的进展——我有一堆基本的测试用例通过了,包括一些不会通过现有实现的测试用例(主要是围绕错误处理)。 重大架构变化的高级概述: 最大的变化是 VFDSpindle 抽象。VFD 任务不再是一个相对简单的命令发送器,它从队列中弹出命令并通过几次重试发送它们,但现在实际上使用通用外部 VFD 对预期的双向通信模式进行编码:
VFDSpindle.h 中的函数注释更详细地描述了这个更新的抽象。 实现此抽象的关键部分是 modbus“命令”队列已被“配置”队列取代。
到目前为止,我只实现了 HuanyangSpindle,但我很快就会看到 H2A(它只是在附加的 diff 中被注释掉以避免编译问题,因为它还没有更新)。除了 Huanyang 之外,这个新的抽象可能不太正确或不够通用,无法干净地支持 H2A,在这种情况下,我将继续调整我的方法。不过,我现在可以暂时搁置这次重写;我需要先完成我的 Workbee 的构建,这样我才能真正运行完整的测试程序,而不是仅仅手动发送简单的主轴 g 代码命令…… |
我刚刚浏览了您的评论,老实说,我必须更详细地研究一下。 我们完全同意,在使用 VFD 时,我们应该谨慎行事。事实上,这就是我坚信 RS485 是使用 VFD 的正确方式的主要原因;大多数其他与他们合作的方式都只是单向沟通。 请在 Devt 分支而不是 master 分支上工作。从长远来看,这使得 PR 和/或合并变得更加容易,也许你描述的一些内容已经在那里修复了。 之所以有一个队列与实际的主轴代码分开,是因为 grbl 的设计。GRBL 需要一个基本上负责运动控制的单一非阻塞线程。这里的运动控制块也负责主轴控制,主轴速度也是其中的一部分。不幸的是,这个线程不应该被阻塞很长时间。换句话说,无论这意味着什么,对 Spindle 的调用都应该“快速”返回。 然而,命令之一是 ‘mc_dwell’ 。我一直想改变它来接受一个函数指针,然后可以用来做一个等待操作——比如——当出现问题时,或者当主轴没有达到速度时。这与您描述的安全事项有关,并且已经在我的 TODO 列表中调查了很长一段时间。 当我设计 VFDSpindle 类时,其主要目标之一是使其尽可能独立于正在使用的 VFD。周围有很多很多 VFD 协议,在我开始之前,我浏览了一些 Delta、Huanyang(他们有不同的 VFD)、我自己的 H2A 和其他一些手册。最重要的是,它们根本不支持相同的命令。有些使用频率,有些使用 rpm。有些提供实际的转速反馈(H2A),其他的只是告诉你设置了什么寄存器值(显然是 Huanyang)。无论如何,通常有一些寄存器值你可以拉出来看看它是否还活着,通常你会在正确接收到命令时得到一个 modbus 的“ok”回复。所以,这让我想到了你提到的原则:
我相信情况已经如此。“无响应”标志应该可以解决这个问题。
那是个很好的观点。没有想到这一点,因此没有实施。是的,如果主轴支持寄存器值或实际转速,我确实认为这是个好主意。大多数主轴应该。至于实现,请看下一点。
VFDSpindle.cpp 中的代码(第 78-102 行)旨在在没有命令被推入队列时定期提取不同的诊断信息。这应该确保一切都按计划进行。您可以简单地在解析器中测试 rpm 值,如果不正常就让它失败。
是的。
我不确定这是否是个好主意:如果您有一个错误的主轴速度更改,它会触发主轴停止,这会造成损坏。也就是说,将某些主轴命令标记为“必需”可能是个好主意,这意味着 MAX_ATTEMPTS 检查基本上不会被触发。
我会在 slack 上给你发一些消息,让我们看看什么最有效。 |
首先,感谢一个非常棒的项目 – 到目前为止,我真的很享受使用它!
我刚刚开始设置我的 Huanyang VFD,并且对当前 VFDSpindle 实施的稳健性有一些潜在的担忧。
对于一些背景情况,我最初使用的是一个便宜的 RS485 模块,上面可能是仿冒的 MAX485 IC,它可以很好地传输到主轴,但在接收模式下有可怕的噪音,完全破坏了数据,以至于没有已成功收到回复。
奇怪且有点不和谐的是,尽管从未收到来自主轴的任何有效响应,但 VFDSpindle 实现仍会愉快地发送速度和主轴启动/停止命令。
get_current_rpm
这最初让我感到困惑,因为在我开始实施解析器并意识到我实际上根本没有从 VFD获取任何数据之前,似乎一切都与主轴控制正常工作……真正让我失望的是,如果接收器是间歇性的而不是 100% 损坏,行为会变得更加奇怪。如果我在我的 MAX485 和 VFD 之间连接一个共享地,接收器改进到足以偶尔得到有效响应,但噪声仍然经常破坏数据——在这种配置中,我通常能够 M3 启动主轴,但随后一些噪音会破坏响应消息并触发“关键主轴 RS485 无响应”警报。警报似乎没有触发主轴停止,它还阻止了我在没有先清除警报的情况下使用 M5 关闭主轴,从安全角度来看这似乎不太好。换句话说,当 ESP32 没有接收到任何信号时,我实际上可以更好地控制主轴来自 VFD 的响应比收到间歇性响应时要多。
我已经开始重写 VFDSpindle/Huanyang 类以重组它们并合并一些更强大的往返通信检查(还没有准备好共享的代码),但我想首先讨论我计划的更改背后的一些高级概念确保我不会因为任何原因走上一条糟糕的道路:
对上述原则的思考?我不完全确定的主要事情是错误/警报的行为,因为我对 grbl 语义仍然有些陌生 – 导致主轴自动关闭的错误是否正常/可以接受?这对我来说似乎更安全,但也许还有其他问题,比如如果你清除错误并恢复,需要重新打开它?
我也喜欢一个 slack 邀请来进一步讨论,如果可以的话 – 我的电子邮件是我在 gmail.com 的 github 用户名 – 谢谢!