线程评级:
3D打印挤出机控制程序事件或函数调用
# 1
亲爱的社区,

我试图使用RoboDK和带有KRC4控制器的库卡进行3D打印,我希望通过RoboDK使用“运行机器人”功能来控制机器人和挤出机。

我的想法是有三个非常相似的函数调用“SetRPM”,“挤出机”和“MCode”。SetRPM给出F值,Extruder给出G1命令的E值,MCode给出G代码的所有M命令。然后,这些函数将使用TCP/IP通过以太网将这些值作为文本字符串发送到挤出机的控制板,然后将相应的动作发送给机器人,然后继续执行程序。

我希望通过这种方式,移动和挤压之间的误差被限制在一次一个移动,因此非常小,以避免机器人或挤压机比另一个运行得更快。
到目前为止,我已经修改了后期处理器,因此它添加了行SetRPM(ExtruderSpeed)和Extruder(PRINT_E_New),括号中的参数是F和e的值。当我生成一个程序时,函数被传递给机器人程序,正如你可以在下文中末尾的代码示例中看到的那样。

我现在的问题是,如果我通过机器人上的RoboDK运行这个程序,我是否可以使用这些行来调用函数或程序事件,然后通过以太网连接将相应的代码发送到挤出机的控制板?如果是这样,你知道我可以从任何类似的代码片段改编代码吗?

我在论坛上看到了很多关于3D打印的帖子,但没有一个涉及这个问题,是否有我不知道的更简单的解决方案?

致以最亲切的问候
帕特里克


代码:
林{x 301.500, y 498.500, z 15.000, a 180.000, b 0.000, c -180.000} c_dis
MCode (83) ()
MCode (83)
或者美元。Cp = 0.02500
SetRPM (0.000)
挤出机(-6.500)
林{x 301.500, y 498.500, z 15.000, a 180.000, b 0.000, c -180.000} c_dis
MCode (107) ()
MCode (107)
或者美元。Cp = 0.06000
林{x 301.500, y 498.500, z 0.300, a 180.000, b 0.000, c 180.000} c_dis
或者美元。Cp = 0.02500
林{x 301.500, y 498.500, z 0.300, a 180.000, b 0.000, c 180.000} c_dis
或者美元。Cp = 0.03000
SetRPM (6000.000)
挤出机(73.713)
Lin {x 301.500, y 301.500, z 0.300, a 180.000, b 0.000, c -180.000} c_dis
你好,帕特里克,

后置处理器和驱动程序是不同的(有一个工作的后置处理器并不意味着驱动程序可以工作)。

在驱动程序中实现这一点的最好方法是用一个数字触发一个程序。例如:
挤出机(73)
将通过程序id 73。然而,这是为了使它适用于更简单的调用(程序ID)。例子:
程序1
这将传递program_id数字1。你可以传递一个浮点数(32位精度,更多信息在这里)。

注意,使用此方法不可能按名称触发程序。您也被限制为1个值。如果您需要,我们可以将其改进为传递2或3个值。

一旦您传递了程序id(整数或十进制值),您就需要在驱动程序(SRC文件)中实现您的操作。我在驱动文件中附加了示例实现代码和注释。

代码:
-----运行程序COM_VALUE1 ---------
;(从RoboDK触发:使用机器人。RunCodeCustom("程序id", INSTRUCTION_CALL_PROGRAM)
program_id = COM_VALUE1
开关program_id
案例1
;——运行程序1——
;钻()
;-------------------
案例2
;——运行程序2——
;削减()
;-------------------
ENDSWITCH


艾伯特
# 3
嗨,阿尔伯特,

谢谢你的回复,这实际上有很大帮助!当我需要Robot驱动程序时,我一直在尝试修改RDK和Postprocessor中的脚本。我查看了驱动程序所在的目录,发现库卡驱动程序“apikuka”是一个我无法修改的。exe文件,但有一个apikukaiiwa.py。
从快速看,似乎驱动程序是一个7自由度的机器人,我将尝试让它与我们的6自由度机器人一起工作,但你能提供apikka .exe作为.py文件吗?

我会通过添加另一个elif来解决这个问题,如下所示:

代码:
elif n_cmd_values >= nDOFs_MIN and cmd_line.startswith("MOVL"):
UpdateStatus (ROBOTCOM_WORKING)
#激活监视器反馈
ROBOT_MOVING = True
#执行线性移动。RoboDK提供j1,j2,…,j6,j7,x,y,z,w,p,r
如果机器人。SendCmd (MSG_MOVEL cmd_values):
#等待命令执行
如果ROBOT.recv_acknowledge ():
#通知我们已经完成了这个命令
UpdateStatus (ROBOTCOM_READY)


如果代码以“调用挤出机”开头,它会通过telnet与挤出机建立连接,发送Gcode命令并关闭连接。

致以最亲切的问候
帕特里克
# 4
你好,帕特里克,

读了第二条消息后,我意识到你想用计算机(而不是机器人)与挤出机沟通。正确吗?

在这种情况下,集成可能会更容易,因为您可以使用Python编写套接字通信协议。否则,您可能需要购买库卡以太网/XML选项来使用库卡KRC控制器。

要以自定义方式对程序调用(如Extruder)做出反应,您可以创建一个类似于所附的Extruder脚本。可以使用sys. exe收集参数。Argv如下所示:

代码:
E_Value =无
#检查我们是否在另一个程序中运行这个程序并传递参数
导入系统
如果len(sys.argv) > 1:
E_Value = float(sys.argv[1])

如果这不是你想要的,请告诉我。

艾伯特


附加文件
. py Extruder.py(大小:1.79 KB /下载:537)
# 5
艾伯特,太棒了!它的工作原理!你救了我:D

我只是注意到附件文件,当我去张贴这个,我用Telnet代替,但段退出,如果在模拟模式是整洁的,我将添加,并张贴一些详细信息的脚本,我最终使用一旦我通过测试,以防别人有同样的问题。

谢谢你!
# 6
你好PatrickC,

我还试图通过RoboDK中的python脚本实现挤出,用于我们发那科6轴机器人的在线编程。你最终想出解决办法了吗?我自己,我试图使用Printrun库(从Pronterface项目)发送一些g代码命令到挤出机,但我不能使它工作。

你能分享一下你开发的脚本的一些细节吗?任何帮助都将不胜感激。

非常感谢!

摩根富林明
# 7
您使用的是定制挤出机吗?

如果是这样,我建议你只是发送原始字符串或二进制数据来更新挤出机速度。您可以实现自己的协议,只发送必要的信息到挤出机。
# 8
嗨,艾伯特。我使用Arduino控制器与马林固件驱动挤出机。我想解释RoboDK的挤出机(x.x xxx)功能,将我自己的g代码发送到马林固件。
# 9
(02-14-2020, 02:37 pm)JFCh写道:嗨,艾伯特。我使用Arduino控制器与马林固件驱动挤出机。我想解释RoboDK的挤出机(x.x xxx)功能,将我自己的g代码发送到马林固件。

嗨,摩根富林明,

很抱歉没有早点回复。说句公道话,我当时在打印。我的挤出机由一个duet2控制,所以它可以通过http获取请求接收gcode。这就很简单了。您可以使用预处理器在每次机器人速度变化后插入一个函数调用来调整速度,然后调用一个与挤出机调用相同的函数,但将mm/s从robodk转换为gcode中的mm/min,并将挤出线的横截面与您的灯丝横截面进行校正。
下面你会发现代码,你必须使用你各自的板的ip。

挤出机
代码:
e_value =无
from robolink import * #nur fuer Nutzung in RoboDK
RDK = Robolink()
#检查我们是否在另一个程序中运行这个程序并传递参数
导入系统
如果len(sys.argv) > 1:
E_value = float(sys.argv[1])
代码= 'G1 E' + str(e_value)
#打印(消息)#用于测试目的
RDK。ShowMessage(code, popup=False) # for test purpose for popup设置为True,设置为False或注释掉以避免阻塞
if RDK.RunMode() == RUNMODE_SIMULATE:
辞职()

进口的要求
Params = {"gcode": code}
R = requests.get("http://192.168.2.114/rr_status?type=1")

#打印(r.json()) #用于测试
R = requests.get("http://192.168.2.114/rr_gcode", params=params) #这个工作!
# r = requests.get("http://192.168.0.100/rr_gcode?gcode=G1 Z100") #这是工作!
#打印(r.json ())
速度
代码:
f_value =无
from robolink import * #nur fuer Nutzung in RoboDK
RDK = Robolink()
#检查我们是否在另一个程序中运行这个程序并传递参数
导入系统
如果len(sys.argv) > 1:
E_value = float(sys.argv[1])
f_transform=f_value * 60 * 1.5676 # mm/s in mm/min and线截面Q对馈线细丝Q/pi*(2.85/2)²的自适应
代码= 'G1 F' + str(f_transform)
#打印(消息)#用于测试目的
RDK。ShowMessage(code, popup=False) # for test purpose for popup设置为True,设置为False或注释掉以避免阻塞
if RDK.RunMode() == RUNMODE_SIMULATE:
辞职()

进口的要求
Params = {"gcode": code}
R = requests.get("http://192.168.2.114/rr_status?type=1")

#打印(r.json()) #用于测试
R = requests.get("http://192.168.2.114/rr_gcode", params=params) #这个工作!
# r = requests.get("http://192.168.0.100/rr_gcode?gcode=G1 Z100") #这也可以!
#打印(r.json ())

预处理程序:
代码:
从robolink导入* # API与RoboDK通信
从robodk导入* #基本矩阵操作
RDK = Robolink()

#让用户选择一个程序:
prog = RDK。ItemUserPick(“选择一个要修改的程序”,ITEM_TYPE_PROGRAM)
如果不是program . valid ():
打印("操作已取消或无程序可用")
辞职()

#要求用户输入一个函数调用,在每次移动后添加:
print("程序选择:" + prog.Name()))
ins_call = 'SetExtSpeed'
#mbox("输入每次移动后添加的程序调用",entry="SynchRobot")
如果不是,ins_call:
打印(“取消行动”)
辞职()

遍历程序中的所有指令:
Ins_id = 0
ins_count = prog.InstructionCount()
当ins_id < ins_count:
#检索指令
ins_nom, ins_type, move_type, isjointtarget, pose,关节= program . instruction (ins_id)
if ins_type == INS_TYPE_CHANGESPEED:
#选择移动指令作为参考
prog.InstructionSelect (ins_id)
value = program . instruction (ins_id)
Name = value[0]
进口再保险
匹配= re.findall("[+-]?\d+\. "\ d +”,名称)

#添加一个新的程序调用
掠夺。运行指令(ins_call + '(' +匹配[0]+ ')',指令调用程序)

#前进一条额外的指令,因为我们刚刚添加了另一条指令
Ins_id = Ins_id + 1
Ins_count = Ins_count + 1

Ins_id = Ins_id + 1
你好PatrickC,

我已经有一段时间没有看论坛了,我错过了你的回复。非常感谢你和我分享剧本。我会看一看,然后告诉你结果。

问候,

摩根富林明




浏览此线程的用户:
1客人(年代)