评论
另一个错误日志: |
和另一个错误日志: |
TLDR; 你能举出最简单的例子来重复这个问题吗?
|
我将尝试举一个简单的例子。 |
关于缓冲区和发送消息 我通常将一个充满命令的串行缓冲区排队。在计划这些之前,当它们只是在串行缓冲区中时,我可能会发送一个 |
点动取消字符“跳过队列”,绕过任何已经从硬件 FIFO 前进到行收集缓冲区的部分行。 您确实应该同步发送点动,而不是将它们排队 – 并且在作业完成或取消之前,您不应该发送其他非点动命令。 |
点动取消与“确定”没有任何关系。ok 表示已经接收到完整的行,传递给 GCode 解析器,并且没有错误地解释。该解释的结果导致指示的操作——可能是动作——被传递给规划器,在那里它与任何先前的动作聚合。 在行被移交给 GCode 解析器之前,在任何地方都可以识别点动取消字符,即使是在行的中间。它向协议状态机发送一个事件,导致取消已经在进行中的运动——通常远远超过规划器队列的运动。对发送者的反馈以显示状态变化的状态报告的形式出现,完全独立于面向行的 GCode 解析器的“ok”确认。 |
这个时间戳列表(以微秒为单位)和发送的命令是否足以尝试重现错误?对我来说,这个序列大约有一半的时间出错。这不是一个很好的慢跑序列。它会因未能保持缓冲区队列满而导致抖动,但根据我的经验,它会很快引发错误,但我确实不知道问题出在哪里。 导致失败的命令序列 |
@MitchBradley好的,谢谢你的信息。我将尝试修改我的慢跑代码以符合该要求。 |
我已将我的发件人更改为在发送每个后续命令之前等待“确定”,并且不再进入 新错误日志 |
我写了一个 python 脚本来引发这个错误(在我的机器上)。它在任何意义上都不是在等待“确定”,但这只是重播一个捕获的会话。请注意,错误可能会隐藏在进一步的输出中,因为发送方不知道接收方。您可以通过搜索 轻松在输出中找到它 import serial as pyserial
import time
import multiprocessing
def connect(port="/dev/ttyUSB0", baudrate=115200, timeout=0.1):
serial = pyserial.Serial()
serial.port = port
serial.baudrate = baudrate
serial.timeout = timeout
serial.open()
if not serial.is_open:
raise Exception("could not connect to serial")
return serial
def timed_send(csv, conn: pyserial.Serial):
begin = time.time()
for timestamp, command in csv.items():
while time.time() - begin < (float(timestamp)/1e6):
pass
conn.write(command)
print(command)
def read_loop(conn: pyserial.Serial):
while True:
value = conn.readline().rstrip()
if value:
assert isinstance(value, bytes)
print(f"\t{value}")
if b'error:' in value:
raise Exception(value)
timestamps = {
'0001104424': b'\x18',
'0001104728': b'\x0c',
'0002111029': b'$ri=50\n',
'0002122378': b'$Alarm/Disable\n',
'0002133496': b'G10L20 X0Y0Z0\n',
'0002225694': b'$10=2\n',
'0002234257': b'\n$Bye\n',
'0003851715': b'$T\n',
'0003894207': b'\x85',
'0005971033': b'\x17',
'0005971358': b'\x0c',
'0005975080': b'\x17',
'0005975287': b'\x17',
'0006076116': b'\x0c',
'0006377325': b'\x17',
'0006482553': b'\x17',
'0006482840': b'\x0c',
'0007488691': b'\x18',
'0007488913': b'\x0c',
'0008497874': b'$ri=50\n',
'0008508713': b'$Alarm/Disable\n',
'0008527685': b'G10L20 X0Y0Z0\n',
'0008541794': b'$10=2\n',
'0008549644': b'$T\n',
'0008559413': b'$Commands/List\n',
'0008719920': b'$Settings/List\n',
'0008774405': b'$Settings/ListChanged\n',
'0008787879': b'$Alarms/List\n',
'0008822019': b'$Errors/List\n',
'0009009464': b'$Config/Dump\n',
'0009422404': b'$Alarm/Disable\n',
'0009430830': b'$j=g91x0.0002y0.00333z0.00333f2829.06345\n',
'0009442155': b'$j=g91x0.0004y0.00667z0.00667f2829.06345\n',
'0009452593': b'$j=g91x0.0006y0.01z0.01f2829.06345\n',
'0009462160': b'$j=g91x0.0008y0.01333z0.01333f2829.06345\n',
'0009472766': b'$j=g91x0.001y0.01667z0.01667f2829.06345\n',
'0009483306': b'$j=g91x0.0012y0.02z0.02f2829.06345\n',
'0009492657': b'$j=g91x0.0014y0.02333z0.02333f2829.06345\n',
'0009503597': b'$j=g91x0.0016y0.02667z0.02667f2829.06345\n',
'0009512853': b'$j=g91x0.0018y0.03z0.03f2829.06345\n',
'0009522771': b'$j=g91x0.002y0.03333z0.03333f2829.06345\n',
'0009532953': b'$j=g91x0.0022y0.03667z0.03667f2829.06345\n',
'0009543331': b'$j=g91x0.0024y0.04z0.04f2829.06345\n',
'0009553657': b'$j=g91x0.0026y0.04333z0.04333f2829.06345\n',
'0009566061': b'$j=g91x0.0028y0.04667z0.04667f2829.06345\n',
'0009577291': b'$j=g91x0.003y0.05z0.05f2829.06345\n',
'0009586751': b'$j=g91x0.0032y0.05333z0.05333f2829.06345\n',
'0009598614': b'$j=g91x0.0034y0.05667z0.05667f2829.06345\n',
'0009610146': b'$j=g91x0.0036y0.06z0.06f2829.06345\n',
'0009620304': b'$j=g91x0.0038y0.06333z0.06333f2829.06345\n',
'0009631838': b'$j=g91x0.004y0.06667z0.06667f2829.06345\n',
'0009643195': b'$j=g91x0.0042y0.07z0.07f2829.06345\n',
'0009653522': b'$j=g91x0.0044y0.07333z0.07333f2829.06345\n',
'0009666049': b'$j=g91x0.0046y0.07667z0.07667f2829.06345\n',
'0009675647': b'$j=g91x0.0048y0.08z0.08f2829.06345\n',
'0009684830': b'$j=g91x0.005y0.08333z0.08333f2829.06345\n',
'0009696591': b'$j=g91x0.0052y0.08667z0.08667f2829.06345\n',
'0009708508': b'$j=g91x0.0054y0.09z0.09f2829.06345\n',
'0009720386': b'$j=g91x0.0056y0.09333z0.09333f2829.06345\n',
'0009732658': b'$j=g91x0.0058y0.09667z0.09667f2829.06345\n',
'0009744235': b'$j=g91x0.006y0.1z0.1f2829.06345\n',
'0009753664': b'$j=g91x0.0062y0.10333z0.10333f2829.06345\n',
'0009766080': b'$j=g91x0.0064y0.10667z0.10667f2829.06345\n',
'0009777698': b'$j=g91x0.0066y0.11z0.11f2829.06345\n',
'0009787161': b'$j=g91x0.0068y0.11333z0.11333f2829.06345\n',
'0009798596': b'$j=g91x0.007y0.11667z0.11667f2829.06345\n',
'0009810307': b'$j=g91x0.0072y0.12z0.12f2829.06345\n',
'0009820800': b'$j=g91x0.0074y0.12333z0.12333f2829.06345\n',
'0009832646': b'$j=g91x0.0076y0.12667z0.12667f2829.06345\n',
'0009863908': b'\x85',
'0009868098': b'$j=g91x0.0002y0.00333z0.00333f2829.06345\n',
'0009930934': b'$j=g91x0.0004y0.00667z0.00667f2829.06345\n',
'0009941558': b'$j=g91x0.0006y0.01z0.01f2829.06345\n',
'0009951801': b'$j=g91x0.0008y0.01333z0.01333f2829.06345\n',
'0009962073': b'$j=g91x0.001y0.01667z0.01667f2829.06345\n',
'0009971877': b'$j=g91x0.0012y0.02z0.02f2829.06345\n',
'0009982339': b'$j=g91x0.0014y0.02333z0.02333f2829.06345\n',
'0009994157': b'$j=g91x0.0016y0.02667z0.02667f2829.06345\n',
'0010006050': b'$j=g91x0.0018y0.03z0.03f2829.06345\n',
'0010017547': b'$j=g91x0.002y0.03333z0.03333f2829.06345\n',
'0010027719': b'$j=g91x0.0022y0.03667z0.03667f2829.06345\n',
'0010039530': b'$j=g91x0.0024y0.04z0.04f2829.06345\n',
}
if __name__ == "__main__":
conn = connect()
proc = multiprocessing.Process(target=read_loop, args=[conn], daemon=True)
proc.start()
timed_send(timestamps, conn)
|
当 X 值最终从 0.000 变为 0.005 时,会出现第一条运行消息。在前面的点动命令中,X 偏移小于 – 有时小得多 – 小于机器步长 (.005)。我会继续调查,但我不认为发出小于步长的慢跑有什么意义。 |
好吧,目的是在多个轴上以独立速度实现 GRBL1.1 点动,当较快的轴与较慢的轴一起运行时,会发生这些非常短的运动。我不确定要执行什么样的检查/执行什么来避免这种情况 – 我想所有较短的动作都会在动作的开始/结束时分组,无论如何,所以也许我可以忽略它们而不用担心如何它可能会影响运动的其余部分。 这些短命令是完全被忽略了,还是 0.0025 + 0.0025 = 0.005?同样,是 1.0025 == 1.000 吗?另外,0.005 机器步长是一个通用常数,还是特定于我的配置? |
200 步/mm = 0.005 毫米/步 |
我懂了。下面是我做的一些实验的结果。 0.0025 + 0.0025 = 0.005
0.0005 * 10 = 0.005
部分步骤后跟完整步骤不会(总是?)导致错误
请让我知道是否还有什么我可以做的来推动它。 |
这是一个多核同步问题。我正在修复。 |
太好了谢谢。好打猎。 |
控制板
Makerbase 小蜜蜂 v1.0
机器描述
仅限 fluidnc-v3.6.5-pre2
板,无电机或开关
输入电路
没有反应
配置文件
启动消息
用户界面软件
风俗
发生了什么?
我正在使用
$ri=50
。仅发送点动命令时出现错误:8(“命令需要空闲状态”)。我只发送点动命令,从不发送普通的“gcode”命令。我还观察到状态报告说 state is
run
。当我真的向发送器中的微动键发送垃圾邮件时,经常会发生此错误。但是,有时在执行看似非常简单的动作时也会发生这种情况(即:向前慢跑、取消慢跑、向左慢跑)。
这是失败之前/期间发生的事情的日志。以 (python fstring) 开头
{time.time()}<< SerialConn(...)
的行是从串行接收的行。前缀为的行{time.time()}>>
被发送到串行。其他行只是上下文注释。这是错误之后日志的其余部分:
其他信息
如果您愿意,我可以生成更多错误日志。让我知道我还能提供什么帮助。