Datalogic 雕刻机

选型需要考虑:

1. 材料

2. 材质

3. 内容

4. 范围 选择镜头

5. 厚度

6. 效率

7. 效果

脚本代码:

  1 // COM 串口设置
  2 const N_COM = "COM2";
  3
  4 const N_PATH_APP = "D:\\232_load_file\\";
  5 const N_PATH_XLP = N_PATH_APP+"xlp\\";
  6
  7 const N_PATH_DEBUG = N_PATH_APP+"laser_debug\\laser_debug"
  8 var N_DEBUG = false;
  9
 10 var bLoaded = false;
 11 var bStopLaser = false;
 12
 13 function onQueryStart()
 14 {
 15     // 收到开始雕刻信号
 16     if (!bLoaded)
 17     {
 18         debug_print("onQueryStart - Not Load");
 19         return;
 20     }
 21     if (bMarking)
 22     {
 23         debug_print("onQueryStart - Marking");
 24         return;
 25     }
 26     if (N_DEBUG)
 27     {
 28         if (bStopLaser)
 29         {
 30             debug_print("onQueryStart - Test Stop");
 31             bStopLaser = false;
 32             return;
 33         }
 34         bStopLaser = false;
 35         n_StartTime = new Date();
 36         n_StartTime = new Date();
 37     }
 38     uxStatus.text = "开始激光雕刻... ";
 39     bMarking = true;
 40     h_Doc.execute(true, true);
 41 }
 42 function onLaserStop()
 43 {
 44     // 停止激光后
 45     debug_print("onLaserStop ... ");
 46     bMarking = false;
 47     uxStatus.text = "待命";
 48 }
 49 function onLaserStart()
 50 {
 51     // TODO
 52 }
 53 function onLaserEnd()
 54 {
 55     // 雕刻完成后
 56     if (N_DEBUG)
 57     {
 58         var d = new Date();
 59         d = new Date();
 60         var timeDiff = (d - n_StartTime) / 1000;
 61         if (timeDiff > 5)
 62         {
 63             var strOut = "onLaserEnd ... count=" + n_MarkCount + " ,delay = " + timeDiff.toString();
 64             debug_print(strOut);
 65         }
 66         n_MarkCount++;
 67         debug_print("onLaserEnd ... count=" + n_MarkCount + " ,time=" + timeDiff.toString());
 68     }
 69     var cmdOut;
 70     cmdOut = "<XE>";
 71     debug_print("232 Send="+cmdOut);
 72     h_port.writeBlock(cmdOut, cmdOut.length);
 73     uxStatus.text = "待命";
 74     System.collectGarbage();
 75     bMarking = false;
 76 }
 77 function onLaserError(error)
 78 {
 79     switch(error)
 80     {
 81     case System.DSP_IN_HANG:
 82         System.resetBoard();
 83         break;
 84     case System.DSP_ERROR_INIT:
 85         // This event is triggered each time the script engine starts
 86         // if the board was not properly loaded
 87         // MessageBox.critical( "Board initialization error", MessageBox.Ok );
 88         break;
 89         // TODO
 90     }
 91 }
 92 function main()
 93 {
 94     System.sigQueryStart.connect(onQueryStart);
 95     System.sigLaserStop.connect(onLaserStop);
 96     System.sigLaserStart.connect(onLaserStart);
 97     System.sigLaserEnd.connect(onLaserEnd);
 98     System["sigLaserError(int)"].connect(onLaserError);
 99
100     // 系统初始化
101     System.sigClose.connect(onClose);
102
103     bMarking = false;
104     n_StartTime = new Date();
105     n_StartTime = new Date();
106     n_MarkCount = 0;
107
108     initCOM();
109     initIO();
110     initTimer();
111
112     //Create preview dialogue
113     dialog = new Dialog("Laser Custom Application - 232 Load Text - 3.00",Dialog.D_NONE,false);
114     dialog.setFixedSize(600,600);
115     renderarea = new RenderArea();
116     dialog.add(renderarea);
117
118     uxGroupFile = new GroupBox();
119     uxGroupFile.title = "图面文件";
120     dialog.add( uxGroupFile );
121
122     uxFileName = new Label();
123     uxFileName.alignment = 0x02;    // align right
124     uxFileName.text = ""
125     uxGroupFile.add( uxFileName );
126
127     uxDebug = new CheckBox();
128     uxDebug.text = "记录日志";
129     uxDebug.checked = false;
130     uxDebug.sigStateChanged.connect(onStateChanged);
131     dialog.add( uxDebug );
132
133     uxAim = new PushButton();
134     uxAim.text = "红光校准";
135     uxAim.sigPressed.connect(startAiming);
136     dialog.add(uxAim);
137
138     uxStop = new PushButton();
139     uxStop.text = "停止激光";
140     uxStop.sigPressed.connect(stopLaser);
141     dialog.add(uxStop);
142
143     uxMark = new PushButton();
144     uxMark.text = "开始雕刻";
145     uxMark.sigPressed.connect(startMark);
146     dialog.add(uxMark);
147
148     uxStatus = new Label();
149     uxStatus.alignment = 0x02;    // align right
150     uxStatus.text = "待命";
151     dialog.add( uxStatus );
152
153     initCOMUI();
154     initIOUI();
155
156     dialog.show();
157
158     debug_print( "Ready !" );
159     IoPort.setReady(true);
160 }
161 function onClose()
162 {
163       IoPort.setReady(false);
164 }
165
166 // 加载图面文件
167 function onLoadPlain()
168 {
169     var file_name;
170     file_name = FileDialog.getOpenFileName("Laser Documents (*.xlp)", "Select XLP A");
171     if (file_name)
172     {
173         uxFileName.text = file_name;
174         loadPlain(uxFileName.text);
175     }
176
177     file_name = FileDialog.getOpenFileName("Laser Documents (*.xlp)", "Select XLP B");
178     if (file_name)
179     {
180         uxFileName2.text = file_name;
181     }
182 }
183 function loadPlain(file_name)
184 {
185     // 1.21 加载xlp文件
186     h_Doc = new LaserDoc;
187     if (h_Doc.load(file_name))
188     {
189         renderarea.preview(h_Doc);
190         bLoaded = true;
191         n_MarkCount = 0;
192         return true;
193     }
194     else
195     {
196         // MessageBox.information( "加载错误!-"+file_name, MessageBox.Ok );
197         debug_print("Error load XLP- " + file_name + " !");
198         bLoaded = false;
199         return false;
200     }
201 }
202
203 // 雕刻控制
204 function startMark()
205 {
206     // 2.1 触发激光雕刻
207     onQueryStart();
208 }
209 function stopLaser()
210 {
211     System.stopLaser();
212 }
213 function startAiming()
214 {
215     if (System.isLaserBusy())    return;
216     h_Doc.execute(true, false);
217     uxStatus.text = "红光校准";
218 }
219
220 // 232 COM 通讯处理
221 function initCOM()
222 {
223     N_CHAR_SYNC = "";//"UUUU";
224     N_CHAR_START = "<";
225     N_CHAR_END = ">";
226     n_RxBuffer = "";
227
228     // COM init
229     h_port = new ComPort;
230     h_port["readyRead()"].connect(onReadyRead);
231     h_port.portName = N_COM;
232     h_port.baudRate = ComPort.BAUD9600;
233     h_port.flowControl = ComPort.FLOW_OFF;
234     h_port.parity = ComPort.PAR_NONE;
235     h_port.dataBits = ComPort.DATA_8;
236     h_port.stopBits = ComPort.STOP_1;
237     var result = h_port.open(ComPort.ReadWrite);
238     debug_print("Open - "+N_COM+"="+result);
239     if (!result)    debug_print( "open_error-"+N_COM, MessageBox.Ok );
240 }
241 function initCOMUI()
242 {
243     uxStatusCOM = new Label();
244     uxStatusCOM.alignment = 0x02;    // align right
245     uxStatusCOM.text = "COM = "+N_COM+",9600,8,N,1,N";
246     dialog.add( uxStatusCOM );
247 }
248 function onReadyRead()
249 {
250     // 接收数据
251     debug_print( "onReadyRead = " );
252     var msg = h_port.readBlock();
253     var str = "";
254     for (var i=0; i<msg.length; i++)
255     {
256         str += String.fromCharCode(msg[i]);
257     }
258     for (var i=0; i<n_RxBuffer.length; i++)
259     {
260         debug_print("n_RxBuffer="+i+"="+n_RxBuffer.charCodeAt(i));
261     }
262     // h_port.writeBlock(str, str.length);
263     n_RxBuffer += str;
264     debug_print(n_RxBuffer);
265     var cmds = n_RxBuffer.split(N_CHAR_START);
266     debug_print("cmds="+cmds);
267     n_RxBuffer = "";
268     if (cmds.length <1)    return;
269     for (var i=1; i<cmds.length; i++)
270     {
271         var end = cmds[i].indexOf(N_CHAR_END);
272         if (end > 0)
273         {
274             cmds[i] = cmds[i].substring(0, end);
275             decodeCommand(cmds[i]);
276         }
277         else if (i == (cmds.length-1))
278         {
279             n_RxBuffer = N_CHAR_START + cmds[i];
280         }
281     }
282 }
283 function decodeCommand(cmd)
284 {
285     // 解读指令
286     cmd = cmd.replace(N_CHAR_END,"");
287     debug_print("decodeCommand="+cmd);
288     switch (cmd[0])
289     {
290     case ‘X‘:
291         // 开始雕刻
292         onQueryStart();
293         var cmdOut;
294         cmdOut = N_CHAR_SYNC + N_CHAR_START + "X" + N_CHAR_END;
295         debug_print("232 Send="+cmdOut);
296         h_port.writeBlock(cmdOut, cmdOut.length);
297         break;
298     case ‘P‘:
299         // 停止雕刻
300         bStopLaser = true;
301         System.stopLaser();
302         var cmdOut;
303         cmdOut = N_CHAR_SYNC + N_CHAR_START + "P" + N_CHAR_END;
304         debug_print("232 Send="+cmdOut);
305         h_port.writeBlock(cmdOut, cmdOut.length);
306         break;
307     case ‘L‘:
308         // 选泽图面文件
309         cmd = cmd.substring(1, cmd.length);
310         var fullPath = N_PATH_XLP + cmd + ".xlp";
311         var infile = new File(fullPath);
312         debug_print("L="+fullPath);
313         uxStatus.text = "232 选择 XLP = " + fullPath;
314         uxFileName.text = fullPath;
315         var result = loadPlain(uxFileName.text);
316         var cmdOut;
317         if (result)
318         {
319             cmdOut = N_CHAR_SYNC + N_CHAR_START + "L" + cmd + N_CHAR_END;
320             debug_print("232 Send="+cmdOut);
321             h_port.writeBlock(cmdOut, cmdOut.length);
322         }
323         break;
324     case ‘D‘:
325         // 修改文字
326         cmd = cmd.substring(1, cmd.length);
327         var para = cmd.split(",");
328         if (para.length >= 2)
329         {
330             debug_print("D="+cmd);
331             uxStatus.text = "232 修改文字ID"+para[0].toString()+"为"+para[1].toString();
332             var h_Obj = h_Doc.getLaserObject(para[0].toString());
333             h_Obj.text = para[1].toString();
334             h_Obj.update();
335             renderarea.preview(h_Doc);
336             var cmdOut;
337             cmdOut = N_CHAR_SYNC + N_CHAR_START + "D" + para[0].toString() + "," + para[1].toString() + N_CHAR_END;
338             debug_print("232 Send="+cmdOut);
339             h_port.writeBlock(cmdOut, cmdOut.length);
340         }
341         break;
342     case ‘O‘:
343         // 偏移XYA
344         cmd = cmd.substring(1, cmd.length);
345         var para = cmd.split(",");
346         if (para.length >= 4)
347         {
348             h_Obj = h_Doc.getLaserObject(para[0].toString());
349             offX = parseFloat(para[1]);
350             offY = parseFloat(para[2]);
351             offA = parseFloat(para[3]);
352             if ((offX!=NaN) && (offX!=NaN) && (offX!=NaN))
353             {
354                 uxStatus.text = "232 修改ID"+para[0].toString()+",X="+offX.toString()+",Y="+offY.toString()+",A="+offA.toString();
355                 // 获取现时角度
356                 var oldAng = Math.acos(h_Obj.x11) * 180 / Math.PI;
357                 if ( h_Obj.x12 < 0 )    oldAng = 360 - oldAng;
358                 // MessageBox.critical( oldAng, MessageBox.Ok );
359                 offA = offA - oldAng;
360                 // 移动对象
361                 h_Obj.moveTo(offX, offY);
362                 // 旋转对象
363                 h_Obj.rotate(offA);
364                 // print("x11="+h_Obj.x11.toString()+",x12="+h_Obj.x12.toString()+",x21="+h_Obj.x21.toString()+",x22="+h_Obj.x22.toString());
365                 renderarea.preview(h_Doc);
366                 print("O=offX="+offX+",offY="+offY+"offA="+offA);
367                 var cmdOut;
368                 cmdOut = N_CHAR_SYNC + N_CHAR_START + "O" + para[0] + "," + para[1] + "," + para[2] + "," + para[3] + N_CHAR_END;
369                 print("232 Send="+cmdOut);
370                 h_port.writeBlock(cmdOut, cmdOut.length);
371             }
372         }
373         break;
374     case ‘T‘:
375         test1();
376         break;
377     }
378 }
379
380 // 测试 IO 触发
381 function initIO()
382 {
383     if (!N_DEBUG)    return;
384     // reset IO port
385     IoPort.setReady(false);
386 }
387 function initIOUI()
388 {
389     if (!N_DEBUG)    return;
390
391     uxGroupTest = new GroupBox();
392     uxGroupTest.title = "测试";
393     dialog.add( uxGroupTest );
394
395     uxtest1 = new PushButton();
396     uxtest1.text = "测试选择1";
397     uxtest1.sigPressed.connect(test1);
398     uxGroupTest.add(uxtest1);
399 }
400 function test1()
401 {
402     if (!N_DEBUG)    return;
403     debug_print("test1...");
404     IoPort.setReady(true);
405     // reset test input pin
406     timerTest1 = System.setTimer(100);
407 }
408
409 // 定时器设置
410 function initTimer()
411 {
412     if (!N_DEBUG)    return;
413     System["sigTimer(int)"].connect(onTimer);
414 }
415 function onTimer(ID)
416 {
417     System.killTimer(ID);
418     switch (ID)
419     {
420     case(timerTest1):
421         debug_print("timerTest1...");
422         IoPort.setReady(false);
423         break;
424     }
425     System.collectGarbage();
426 }
427
428 // 除错日志
429 function onStateChanged()
430 {
431     if (uxDebug.checked)
432     {
433         N_DEBUG = true;
434     }
435     else
436     {
437         N_DEBUG = false;
438     }
439 }
440 function debug_print(message)
441 {
442     if (!N_DEBUG)    return;
443
444     var d = new Date();
445     d = new Date();
446
447     var yyyy = d.getFullYear().toString();
448     var mm =  (d.getMonth()+1).toString();
449     var dd = d.getDate().toString();
450     var hh = d.getHours().toString();
451     var mi = d.getMinutes().toString();
452     var ss = d.getSeconds().toString();
453     var ms = d.getMilliseconds().toString();
454     if (dd.length < 2)    dd = "0" + dd;
455     if (hh.length < 2)    hh = "0" + hh;
456     if (mi.length < 2)    mi = "0" + mi;
457     if (ss.length < 2)    ss = "0" + ss;
458     if (ms.length < 2)    ms = "0" + ms;
459     if (ms.length < 3)    ms = "0" + ms;
460
461     var day = yyyy + "-" + mm + "-" + dd;
462     var time = hh + ":" + mi + ":" + ss + "." + ms;
463     var s = day + " " + time + "\t" + message;
464
465     var pathFile = N_PATH_DEBUG + "-" + day + ".txt";
466     appendTextToFile(pathFile, s);
467     // print(s);
468 }
469 function appendTextToFile(file_name, text)
470 {
471     var full_path_txt = file_name;
472     var outfile = new File(full_path_txt);
473     var result = false;
474     var strOut = text + "\r\n";
475
476     outfile.open(File.WriteOnly| File.Append);
477     outfile.writeLine(strOut, strOut.length);
478     outfile.close();
479
480     return result;
481 }

折叠/显示

打印测试效果如下:

时间: 01-17

Datalogic 雕刻机的相关文章

[DIY激光雕刻机] 1.拆光驱

最近看了果壳上的一篇文章<激光雕刻机:废旧光驱的涅槃之路>之后开始手痒,准备自己做一个.但手头没有废旧光驱,好在这东西二手的价格便宜,10块钱一个,于是上某宝搞了两台.我买的是普通DVD光驱,如果你不想再单独买激光头可以买DVD刻录机,但是拆的时候要小心不要把激光头损坏. 拆机所需工具:螺丝刀(十字和一字)和镊子. 首先需要把后盖拆下来,把光驱反过来可以看到有4颗螺丝,用螺丝刀拧下后就可以打开后盖. 下一步先不用着急拆主板,通过观察可以发现只要将前面板拆下来就可以把光驱的主体部分整体拆下来,但

Datalogic组网模式下通讯

1.首先要在visiset工具下,设置好地址端口号,组网模式master slave参数: 2.打开工具hercules,选择TCP Client选项,设置参数好连接并通讯,发送打开.关闭 按钮指令,一般是1和2: 代码demo: 定义: //datalogic Socket datalogicClient = null; SocketError errorCode; IPEndPoint _remoteEndPoint = null; 初始化: IPAddress IP = IPAddress

雕刻机制作 PCB 指南

之前使用过感光蓝油制作过 PCB,虽然感光法精度高,但个人制作耗时耗力,发给厂家周期又很长.看到国外的网友使用雕刻机制作 PCB  视频之后.几番周折之后还是成功了.有感于网上几乎没有一份完整的雕刻机法制作 PCB 的资料.撰写此文的目的就是希望其他使用雕刻机制作 PCB 的朋友不要像我一样把时间浪费在折腾工具上面. 这里我们使用雕刻机制作 PCB,俗话说,工欲善其事,必先利其器,首先罗列下需要的工具和软件. 工具准备: 1. 雕刻机及配套电脑和软件(我这里用的 Mach3) 2. 覆铜板 3.

require js 将config和入口函数分开写

原文地址 https://github.com/jrburke/requirejs/issues/354 Area there any plans to standardize/recommend a particular approach? If there is, I would suggest the following: // homepage.html <script data-id="requirejs" data-logic="home" dat

济南网站优化公司告诉你百度地域搜索的小秘密

笔者在济南互联网从业多年,经常发现有些网络公司给客户保证指数较高的非地区关键词可以短期内做到百度首页,还经常炫耀"网站优化"我们应经达到百度首页,全国最厉害.笔者赶紧去百度搜索一番,还真的在百度首页呢.莫名的崇拜之情油然而生,人家咋这么牛啊,全国都名列前茅了.我往QQ群里一发,傻眼了,除了济南,没有任何一个地方这个词百度首页有这个公司. 其实何止"网站优化"这样的词,比如"升降机","雕刻机","装载机"等

我和PCB的这些年(一)

PCB就是印刷线路板咯,它是几乎所有电子产品的基础.当年还是小小孩的我很早就和PCB认识了,这些年这个老朋友一直想随.写这篇连载,希望那些将要或已经接触使用PCB的朋友们,能对它有更深的了解,并能解决工作中的一些困扰,文中部分图片引用了一些网上的图片. 我所知道的很久以前,想要拥有一块PCB是很贵很麻烦的事情,电子爱好者们包括技术人员往往都使用面包板做原型设计和实验,或者自己弄一块覆铜板用油漆或胶带画上图形,再再三氯化铁或双氧水中腐蚀,然后打上孔,甚至还有人在环氧树脂板上打孔并铆上铆钉使用.这些

如何正确使用佛珠刀

加工佛珠时,应根据珠子直径,调节钻速,钻速高效果好点.建议15mm以上的钻头使用钻床,珠子直径5-12mm建议1500-2000转,15-20建议1200-1500,转,直径22-30的建议800-1200转,如冒烟发热量大,降低转速.钨钢合金佛珠钻请勿使用在***钻电磨上.高速钢刀具钻速不要超过1500转,高速钢刀具加工高硬度木料需要尽量降低钻速.高速钢刀具可以加工中硬的木料,但要掌握使用技巧.降低转速和间隙进刀,均有效果. 加工注意事项: 钻芯刚上木板时,可以缓慢下钻,逐渐掌握钻芯能承受的压

观《超能陆战队》未来的“机器人设计师”的必备装备

超能陆战队--一部充满了温暖的正能量动画片,它所传播的伟大的设计师理念的确很让人感动但同样片中有很多有意思的细节,值得我们借鉴与推敲.作为一个优秀的机器人设计师,Hiro有哪些秘密武器值得我们借鉴呢? 1.手持3d模型扫描器 用这种装置可以直接将附近的目标扫描成3d模型存储起来.目前市场上已经有了,但还没有此设备轻便和准确.如下图,Hiro给Baymax扫描完后,Baymax的模型就直接出现在了左侧的3d全息投影屏上. 有了这种设备,可以方便的做逆向工程,到底什么是原创什么是山寨的,估计都很难分

菜鸟学四轴控制器之1:插补是啥东西

之前看过运动控制芯片的手册,包括了NOVA的MCX314和PCL6045等,知道插补的概念. 但是插补到底是啥玩意,其实一直是有点疑惑的,然后就傻乎乎的去问一些专家,他们的说法是: 插补可以同时多轴输出,速度很快.然后就不知道问啥了. 基于我之前做步进电机的经验,以及测试步进电机驱动器的经验,我一般情况下都是通过单片机发一个固定脉冲来测试驱动器的性能.如果需要测试电机各种速度下的力矩特性,最多采用了S加减速曲线,在我看来,要画一个直线,那太简单了,直接X轴和Y轴同时给不同速度的脉冲不就OK了么?