我必须编写一个java程序,通过网络接收G-Code命令,并通过串行通信将它们发送到3D打印机.原则上一切似乎都没问题,只要打印机需要超过300毫秒来执行命令.如果执行时间短于此时间,则打印机接收下一个命令需要花费太多时间,并且导致命令执行之间的延迟(打印机喷嘴静止约100-200ms).这可能会成为3d打印中的问题所以我必须消除这种延迟.
为了比较:像Repetier Host或Cura这样的软件可以通过seial发送相同的命令,命令执行之间没有任何延迟,所以它必须以某种方式.
我使用jSerialComm库进行串行通信.
这是将命令发送到打印机的线程:
@Override
public void run() {
if(printer == null) return;
log("Printer Thread started!");
//wait just in case
Main.sleep(3000);
long last = 0;
while(true) {
String cmd = printer.cmdQueue.poll();
if (cmd != null && !cmd.equals("") && !cmd.equals("\n")) {
log(cmd+" last: "+(System.currentTimeMillis()-last)+"ms");
last = System.currentTimeMillis();
send(cmd + "\n", 0);
}
}
}
private void send(String cmd, int timeout) {
printer.serialWrite(cmd);
waitForBuffer(timeout);
}
private void waitForBuffer(int timeout) {
if(!blockForOK(timeout))
log("OK Timeout ("+timeout+"ms)");
}
public boolean blockForOK(int timeoutMillis) …Run Code Online (Sandbox Code Playgroud) 一种名为Slic3r的流行的开源3D打印切片软件是用Perl编写的.我需要对大学项目的源代码进行一些小改动,但我对Perl完全不熟悉.
这是一个很好的双挤压图像.基本上,当您更换喷嘴/材料时,会产生问题.你需要一个擦拭塔来消除喷嘴上的流口水,你必须处理再加热/冷却和其他耗时的任务.
这就是为什么我所知道的所有切片程序都试图最小化挤出机的变化.例如,如果第3层和第4层需要两种材料,则第3层将打印挤出机/材料1,然后是挤出机/材料2.在第4层,您将打印挤出机2,然后打印挤出机1.
但是,我需要始终以与挤出机编号相同的顺序打印; 每层应从挤出机1开始,然后是挤出机2,然后是3,等等.
我相信我在Slic3r源代码中找到了重要的代码片段.它是在LIB/Slic3r /打印/ GCode.pm,也是在Github 这里,开始对线622.
这是代码:
# tweak extruder ordering to save toolchanges
my @extruders = sort { $a <=> $b } keys %by_extruder;
if (@extruders > 1) {
my $last_extruder_id = $self->_gcodegen->writer->extruder->id;
if (exists $by_extruder{$last_extruder_id}) {
@extruders = (
$last_extruder_id,
grep $_ != $last_extruder_id, @extruders,
);
}
}
Run Code Online (Sandbox Code Playgroud)
我猜@extruders只是一个列表,可以是[1],[1,2],[1,2,3]或更多.我想修改这个块,以便我们总是按数字顺序(1,2,3)编写挤出机命令.
如果您想了解更多有关"为什么?"的详细信息,我很高兴告诉您关于FFF打印,印刷换热器等的信息.
编辑 事实上,评论if语句是完美的.重新编译后,slic3r工作正常,Gcode似乎是正确的.因此,我想这是软件中唯一提到订单的地方.具有此更改的Slic3r代码可以在Github上的fork中找到,以防任何人遇到同样的问题.谢谢zdim的反馈意见!
我正在尝试编写一个简单的 python 脚本,将 gcode 命令发送到运行 Marlin 的 wanhao D9 主板打印机。我在通过 USB 连接到打印机的树莓派上运行 python 脚本。
import serial
ser = serial.Serial("/dev/ttyUSB0", 115200)
ser.write("G28\n")
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 20 多个有类似问题的论坛页面,并尝试了他们的答案,例如将波特率更改为 250000 以及对 write 函数参数进行以下更改:
ser.write("G28\r\n")
ser.write(b'G28\r\n')
ser.write(b'G28\n')
ser.write(b'G28')
ser.write("G28")
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有这些组合,并且我还添加了:
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
以及我文件顶部的时间模块的相关导入语句。我在 ser 声明和 ser.write 函数调用之间添加了这行代码。
我也尝试添加:
ser.close()
Run Code Online (Sandbox Code Playgroud)
看看这是否会有所作为,但事实并非如此,因为我知道这无论如何都是最佳实践。
无论我使用什么代码组合,当我运行我的 python 脚本时,我的打印机似乎重新启动(屏幕从主页变为打开的 wanhao 徽标并返回主页)
我期待任何人都可以就我的代码以及我可能做错的事情向我提供任何帮助。
openscad 是否有用于字符串键关联数组(又名哈希映射,又名字典)的任何语言原语?或者是否有关于如何模拟关联数组的约定?
到目前为止,我能想到的就是使用向量并使用变量将索引映射到向量中,以获取人类可读的名称。这意味着没有很好的、可读的方式来定义向量,你只需要评论它。
想象一下,我想写一些类似于 Python 数据结构的东西:
bobbin_metrics = {
'majacraft': {
'shaft_inner_diameter': 9.0,
'shaft_outer_diameter': 19.5,
'close_wheel_diameter': 60.1,
# ...
},
'majacraft_jumbo': {
'shaft_inner_diameter': 9.0,
'shaft_outer_diameter': 25.0,
'close_wheel_diameter': 100.0,
},
# ...
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以在模型定义中以某种可识别的类似哈希映射的方式引用它,比如传递bobbin_metrics['majacraft']给某物metrics并引用metrics['close_wheel_diameter'].
到目前为止,我最大的努力看起来像
# Vector indexes into bobbin-metrics arrays
BM_SHAFT_INNER_DIAMETER = 0
BM_SHAFT_OUTER_DIAMETER = 1
BM_CLOSE_WHEEL_DIAMETER = 2
bobbin_metrics_majacraft = [
9.0, # shaft inner diameter
19.5, # shaft outer diameter
60.1, # close-side wheel diameter
# ....
];
bobbin_metrics_majacraft_jumbo = …Run Code Online (Sandbox Code Playgroud) 3d-printing ×4
dictionary ×1
g-code ×1
java ×1
openscad ×1
perl ×1
pyserial ×1
python ×1
serial-port ×1