开源改变世界!!

grbl 在新流中跳过 gcode 行 #917

推推 grbl 2年前 (2023-01-23) 283次浏览

关闭
birkov 打开了这个问题 2016 年 2 月 29 日 · 8条评论
关闭

grbl 在新流中跳过 gcode 行#917

birkov 打开了这个问题 2016 年 2 月 29 日 · 8条评论

注释

grbl 在新流中跳过 gcode 行 #917

我正在测试 Grbl 以运行带有 3 个步进器和东芝驱动程序的 delta 机器人。它在大多数情况下都运行良好,但我注意到很少有奇怪的行为,其中一个几乎毁掉了机器人。
我使用 python 脚本将 gcode 流式传输到 arduino(基于来自 steam.py 脚本的缓冲的方法)。
我在脚本中准备了一个应该完成的 gcode(例如 20 行立即运行的代码)。下一个 gcode 准备好并在例如 10 秒后发送到 arduino。Grbl 似乎跳过了一些行(并且有效地改变了末端执行器的移动路径,这可能会导致物体或框架崩溃)。我注意到这种奇怪的代码行跳过只有在我在代码中使用 G4 命令时才会发生(或者只是巧合?)。例如,如果我在空间中有点并在连接到 grbl 串行端口后第一次运行代码,则效应器将变为:ABCD。当我下次运行相同的轨迹时,它会跳过一个 gcode 行。这是通过相同的串行端口连接完成的,发送和接收相同的 gcode(由 grbl 响应确认)。我是否缺少用于结束/启动当前流的 gcode 命令之类的东西?每次 gcode 传输开始时都应该刷新串行缓冲区吗?(尽管似乎并非如此)。是否有使用G4命令的特殊方法或报告的问题?
希望问题的描述不要太复杂难懂。

我注意到的第二个问题是,当我使用 5v 继电器启动/停止 12v 真空泵时,它似乎有时会弄乱 USB/串行连接。我为继电器使用单独的电源,为 arduino 使用单独的电源,为所有东西制作铝箔屏蔽,目前我唯一的线索是 PC 中的 USB 端口不知何故挂了。你们有类似问题的经验吗?

grbl 在新流中跳过 gcode 行 #917
成员

Grbl 从未设计用于运行 delta 机器。只有笛卡尔机器。如果您对代码进行了修改,那么我帮不了您。如果您没有这样做,则可能是 Grbl 通过无效的 gcode 命令抛出 gcode 错误,或者您在计算发送的消息时不小心更改了串行缓冲区大小。后者会导致数据损坏。或者这是您的 EMI 问题的症状,它也可能会破坏数据。为此,通常是设备接地不当或屏蔽不充分。

grbl 在新流中跳过 gcode 行 #917
作者

我没有修改 grbl 代码,而是将 delta 机器人位置转换为 pc 上的笛卡尔轴步长,并将 gcode 流式传输到 grbl。运动是在 xyz 还是离散的三角角表面都无关紧要。
有趣的是,当第一个循环完成时,它从不跳过任何一行。它总是发生在具有 G4 代码的第二个或第三个相同的流上。如果程序中没有 G4 驻留,它总是好的。
我怀疑电气干扰问题不会总是出现在同一场景中,而是更加随机。
这是我用来将 gcode 流式传输到 grbl 的代码,它几乎是示例中的代码(grbl 代码未被修改)。

def write_to_serial_gcode(serial_port, text, debug = ”):
# 通过更积极的流协议发送 g 代码程序,强制字符进入
# Grbl 的串行读取缓冲区以确保 Grbl 可以立即访问下一个 g 代码命令
# 而不是等待呼叫响应串行协议完成。这是通过仔细
计算 streamer 发送给 Grbl 的字符数并跟踪 Grbl 的
# 响应来完成的,这样我们就不会溢出 Grbl 的串行读取缓冲区。
#serial_port.flushInput()
#serial_port.flushOutput()
RX_BUFFER_SIZE = 128
l_count = 0
g_count = 0
c_line = []
for line in text.splitlines():
l_count += 1 # 迭代行计数器
l_block = line.strip()
c_line.append(len(l_block)+1) # 跟踪 grbl 串行读取缓冲区中的字符数
grbl_out = ”
while sum(c_line) >= RX_BUFFER_SIZE-1 | serial_port.inWaiting() : out_temp = serial_port.readline().strip() # 如果 out_temp.find(‘ok’) < 0 and out_temp.find(‘error’) < 0 : print ” Debug: “
等待 grbl 响应,out_temp # 调试响应 else : grbl_out += out_temp; g_count += 1 # 迭代 g 代码计数器 grbl_out += str(g_count); # 添加行结束指示符 del c_line[0] # 删除最后一个’ok’对应的块字符数 if debug != ”: print “SND: ” + str(l_count) + ” : ” + l_block,

serial_port.write(l_block + ‘\n’) #
如果调试发送 g 代码块到 grbl != ”:
print “BUF:”,str(sum(c_line)),”REC:”,grbl_out

grbl 在新流中跳过 gcode 行 #917
成员

你是如何编写 G4 命令的?他们可能无效。您还可以提供您的问题程序的片段以了解您发送的内容吗?

grbl 在新流中跳过 gcode 行 #917
作者

这是一个在 xy 表面上做正方形的例子,在每个角落等待 0.3 秒。
如果我在用 python 初始化串口后第一次发送它总是好的。其次,接下来的每一个都搞砸了。如果我在没有 g4 停止的情况下运行它总是好的。这只是一个例子,但我在多种情况下遇到了同样的问题。在每个结束的代码块之后是否有任何特定的命令要发送?

G1 X500 Y2113 Z998 F160000
G1 X805 Y2275 Z1272 F160000
G1 X500 Y2113 Z998 F160000
G4 P0.3
G1 X1962 Y1553 Z202 F160000
G1 X2144 Y1776 Z515 F160000
G1 X1962 Y1553 Z202 F160000
G4 P0.3
G1 X1962 Y196 Z1559 F160000
G1 X2144 Y509 Z1782 F160000
G1 X1962 Y196 Z1559 F160000
G4 P0.3
G1 X500 Y992 Z2119 F160000
G1 X805 Y1266 Z2281 F160000
G1 X500 Y992 Z2119 F160000
G4 P0.3
G1 X500 Y2113 Z998 F160000
G1 X805 Y2275 Z1272 F160000
G1 X500 Y2113 Z998 F160000

grbl 在新流中跳过 gcode 行 #917
成员

除了多次进给率外没有什么不寻常的。除非你在反时限模式下运行,否则你只需要在它发生变化时发送一个be one。如果你断开你的 Arduino,所以它只有 Grbl 在运行,流的行为是否相同?这将排除您的电子产品。

grbl 在新流中跳过 gcode 行 #917
成员

您的步进空闲延迟是否设置为 255 以外的值?

grbl 在新流中跳过 gcode 行 #917
作者

我尝试使用不同的 USB 控制器并在每个流的末尾添加 M2 命令,问题似乎消失了。中继也不再重置 USB。感谢帮助

grbl 在新流中跳过 gcode 行 #917
成员

@birkov: 行。感谢更新。

喜欢 (0)