注释
我试图改变 # most probably an assignment like #nnn = expr
if line[0]=='_':
line = re.sub("\([^\)]*\)", "", line) # this is my correction
try:
return compile(line,"","exec")
except:
# FIXME show the error!!!!
return None
现在行:
并毫无例外地编译,但无论如何在 sender.py -> serialIO -> tosend
好的,会在下一篇继续(我怕蓝屏) |
..继续 好的, elif c == "F": # cmd = "F#103"
self.feed = value*self.unit # value = 0
但是, try:
value = float(cmd[1:]) # cmd[1:] = "#103"
except:
value = 0 # and value == 0 with any parameter
好的,让我们尝试在下一篇文章中修复 |
在“GCode.vars”字典中是所有参数,但我无法从 cnc.py:1139 Cnc.motionStart 接收它们! |
更改支持参数 数控.py 117:(全球空间) GCODE_PARAMS = {}
def value_of_cmd(cmd):
value = 0.0
try:
if cmd[1] == '_':
pat = re.match("^_\d+", cmd[1:])
if pat and pat.group(0) in GCODE_PARAMS.keys():
value = float(GCODE_PARAMS[pat.group(0)])
else:
value = float(cmd[1:])
except:
value = 0.0
return value
~2140:(GCode 类) class GCode:
LOOP_MERGE = False
#----------------------------------------------------------------------
def __init__(self):
global GCODE_PARAMS
self.cnc = CNC()
self.header = ""
self.footer = ""
self.undoredo = undo.UndoRedo()
self.probe = Probe()
self.orient = Orient()
self.vars = {} # local variables
self.init()
GCODE_PARAMS = self.vars # my horrible hack
~735 @staticmethod
def updateG():
for g in CNC.vars["G"]:
if g[0] == "F":
CNC.vars["feed"] = value_of_cmd(g) #float(g[1:])
elif g[0] == "S":
CNC.vars["rpm"] = value_of_cmd(g) #float(g[1:])
elif g[0] == "T":
CNC.vars["tool"] = value_of_cmd(g) #int(g[1:])
else:
var = MODAL_MODES.get(g)
if var is not None:
CNC.vars[var] = g
~1156: def motionStart(self, cmds):
#print "\n<<<",cmds
for cmd in cmds:
c = cmd[0].upper()
value = value_of_cmd(cmd) # my change
# try:
# value = float(cmd[1:])
# except:
# value = 0
if c == "X":
~1604 for cmd in cmds:
c = cmd[0]
value = value_of_cmd(cmd) # my change
#try: float(cmd[1:])
#except: value = 0.0
if c.upper() in ("F","X","Y","Z","I","J","K","R","P"):
cmd = CNC.fmt(c,value)
~3964: for cmd in cmds:
c = cmd[0]
value = value_of_cmd(cmd) # my change
#try: float(cmd[1:])
#except: value = 0.0
if c.upper() in ("F","X","Y","Z","I","J","K","R","P"):
cmd = self.fmt(c,value)
else:
这不是结束。明天继续 |
随着帖子#334(评论)的更改,它修复了参数,但看起来 grbl 不喜欢 F0 命令。尝试删除或更改它们 顺便说一下,我用 python 编写了 gcode 解析器库。它可以用作解析,用作绘图,用作检查。并且它易于使用(我希望如此)并且与手写解析器相比更容易定制。 https://github.com/bhgv/python_gcode_parser_library README.md 文件 |
@bhgv: 请记住,gcode 并非普遍相同。这意味着制造商和控制器之间存在细微差异。Grbl 使用 LinuxCNCs gcode 描述。至于 F0 错误,这个值是未定义的。您不能以零进给移动。我没有明确记得 LinuxCNC 的 gcode 描述在哪里说这是一个错误,但我不明白它不会是什么。如果您能指出 F0 有效的地方,请告诉我,我会更新 Grbls 解析器。 |
@bhgvbCNC 通过以下方式处理 gcode 参数
这样做是为了更容易使用 python 解释器及其所有功能, 所以你的例子必须写成
|
我忘了提到 CNC 类中有一个名为 stdexpr 的变量, |
你好,今天 抱歉倒序。 接下来,看看 上次 git中的#334 后(评论)示例
(收集到的值存储在GCode.vars中,自己看) 用于测试的gEDA输出文件:链接 (在这个文件中太多#参数,我想自动修复它们。越多越好) 我不建议将我的更改安装到 bCNC,但如果你帮我找到内部 gcode 解析器的链接和用法,也许将来配置、定制和扩展会更容易。 @chamnit 关于 g 代码的许多变体。 parser.set_callback_dict( # set callback-foos for executing different g-codes and situations
{
"G0": G0_callback, # foo(key, param) should return executed g-code as string
"G1": G1_callback, # foo(key, param) --//--
"G2": G2_callback, # foo(key, param) --//--
# ...etc
"default": G_def_cb, # foo(key, param) default g-codes callback
"set_param": set_param_callback, # foo(key, value)
"get_param": get_param_callback, # foo(key) must return value or None
"eol": New_line_callback, # foo()
"non_gcode_cmd":
"no_callback": no_callback_callback, # foo(key, param, (line, row))
"self": self_or_None # self value used to call callbacks
# if self_or_None is not defined or None
# callbacks call as foo(key_params)
# else if self_or_None defined and not None
# callbacks call as foo(self_or_None, key_params)
}
)
你可以看到你只在传递之前将回调执行器发送到不同的 g 代码和情况。对我来说这是最简单和最快的方法。您可以根据它们进行绘制,可以向步进器等发送命令,而无需深入解析器。 更改解析器,添加/删除等。 PRODUCTIONS
GCode = (.
if self.gcode_test:
self._int_init()
.)
{
ParamDecl
|
NonGcodeCmd
|
{ GcodeCmd }
eolTok (. self.call("eol") .)
}
EOF (.
if self.gcode_test:
self.print_gcode_out()
.)
.
ParamDecl =
param (. key = self.token.val .)
"="
Number<out num> (. self.set_param(key, num) .)
eolTok
.
NonGcodeCmd =
nonGcodeCmdBody (. self.call("non_gcode_cmd", self.token.val[1:]) .)
eolTok
.
GcodeCmd = (.
cmd = ""
num = ""
.)
(
CmdNoMoveAloneLetter<out cmdLetter> (. cmd = cmdLetter .)
[
Number<out num> (. cmd += num .)
] (. self.call(cmd) .)
|
CmdNoMoveParamLetter<out cmdLetter> (. cmd = cmdLetter .)
Number<out num> (. self.call(cmd, num) .)
|
CmdMoveLetter<out cmdLetter> (. cmd = cmdLetter .)
Number<out num> (. self.call(cmd, num) .)
)
.
CmdNoMoveAloneLetter<out cmdLetter> = (. cmdLetter = "" .)
(
"G"
| "M"
| "T"
) (. cmdLetter = self.token.val.upper() .)
.
CmdNoMoveParamLetter<out cmdLetter> = (. cmdLetter = "" .)
(
"S"
| "F"
| "P"
| "D"
| "E"
| "H"
| "L"
| "N"
| "O"
) (. cmdLetter = self.token.val.upper() .)
.
CmdMoveLetter<out cmdLetter> = (. cmdLetter = "" .)
(
"X"
| "Y"
| "Z"
| "A"
| "B"
| "C"
| "U"
| "V"
| "W"
| "I"
| "J"
| "K"
| "R"
) (. cmdLetter = self.token.val.upper() .)
.
Number<out num> =
number (. num = self.token.val .)
| param (. num = self.get_param(self.token.val) .)
.
|
() – 在正则表达式中是 () 我认为您现在可以理解并开始自定义此解析器,而无需阅读完整的文档 |
例如如何添加[参数]处理?它只需要将 1 个字符串添加到 Number 块中: Number<out num> =
number (. num = self.token.val .)
| param (. num = self.get_param(self.token.val) .)
// -VV this one -
| "[" number (. num = self.get_param("#" + self.token.val) .)
"]"
.
就这样 |
我只请你帮我做这个实验。因为很难仅从调试器接收所有信息。在成功的情况下 bcnc 变得更快,因为正则表达式太慢,更多变(例如:添加对其他 cnc/3d 打印机的支持或驱动步进器/加热器/直接通过并行 gpio 等) 我只要求你帮我找到 bcnc gcode 解析器到其他 bcnc 代码的链接,因为这是你的代码,你比我更了解它。 抱歉我的坚持,但 bcnc 是一个非常棒的产品,我想为我的目的开发它。并添加对除 grbl 之外的一些其他控制器的支持。 |
@bhgv对不起,但我不明白你需要什么? |
我已经更换了解析器,现在参数处理得很好。两种类型
但需要更多测试并将解析器的某些部分移动到其他文件以便将来更容易开发 |
我已经更换了解析器。在开始部分,绘制部分和发送到控制器部分。如果有人想测试 – 欢迎。
|
你好@bhgv. 这里真的有很多东西 |
它更慢。最新版本(不是来自 github)比原来慢 2-2.5 倍。但我现在想收到正确的工作。 |
新版本已上传到github。
(解析速度不是大问题,因为它可以很容易地重写为 C 或 C++。因为 coco 支持许多语言) 原始 bCNC 中的一件事: if time.time() - startTime > DRAW_TIME:
raise AlarmException()
DRAW_TIME 应该更大或删除此字符串,因为它们不允许绘制大的 g 代码 |
我已经在 Coco 的 C++ 分支上重写了解析器。现在比原来快 2 倍。支持两种类型的参数,参数中的数学,变量。前任
在像 python 一样添加回调连接器后,我将上传它进行测试 |
@bhgv你在做什么很好,但是在 python 中拥有它的整个想法是从 python 扩展中获利,不仅是简单地评估表达式,而且能够嵌入 python 程序作为 gcode 的生成器。纯 python 的另一个好处是它不需要任何重新编译,因此它可以在任何平台上运行(windows、linux、mac 等…) |
@vlachoudispython 和 C++ gcode coco pasers 具有非常相同的外观和非常相同的界面。每个都可以代替其他使用。配置中只有很小的变化(开/关)。
我认为最好的是 – 上传和展示。明天吧。 |
上传了带有 Py 和 C++ 解析器的 bCNC。现在绘图比解析 (C++) 花费更多时间。
|
我尝试将 bcnc 与 geda pcb g 代码一起使用。它包含许多字符串,例如:
运行后,bcnc 显示“错误:未定义进给率”并停止。
我取消注释字符串
它写入控制台
谁能指出我在哪里处理参数?
我试图找到。
这一点我的调试器转到 1026
编译在这里 – https://docs.python.org/2/library/functions.html#compile ?
这里的行值为:
和 python 编译器给出了一个错误。
ok,下篇继续
PS(也许编写非手写解析器会更好?如果你愿意,我可以提供帮助)