
最初,我计划将自己限制在有关CNC实验的两篇文章中(
一 ,
二 )。 但是,这个话题原来对很多人来说都很有趣,因此,我仍然会稍微介绍一下。 在这篇文章中,我们将讨论编写用于控制业余CNC的自制软件。
前言
我不知道我是否能通过第一篇文章激励某人,但我自己的一些评论令人深思。
特别感谢
@evilruff为他的
实验室 拍摄的照片和带有
韩国帅气的视频。 看完这两本书之后,我在地下室的手套箱不再显得那么舒适。
聚集他的力量,在周末,他带来了一些隐约让人联想到秩序的东西,最后做了半年前他打算做的两件事。
首先,他更换了一块用作牺牲桌的胶合板。 从购买机器的那一刻起,我就使用了这种胶合板,用螺钉将坯料拧入其中,并用棍棒和楔子构造了各种疯狂的设计。 所有这些使零件在铣削过程中不会发生不可预测的飞行。
也许有人需要救生员:他们用塑料甲板(在Castorama出售)制成了一张新桌子:

他将木板直接用螺栓固定在铝制桌子上。 额外的好处是用于工件夹紧的便捷凹槽和加料台的快速安装。 一切都花了几个小时和1100r。
其次,最后,他编写了用于管理非标准CNC功能的或多或少可用的软件。 这将是主要故事。
问题陈述
第二部分中描述的操作的G代码
是最简单的。 但是,设置过程本身不能被快速调用。
这是怎么发生的
例如,对于添加剂,这是必要的:了解面板的宽度,计算孔的数量,计算孔之间的确切距离,创建文件,编写g代码,并将其加载到Mach3中。 所有这些最多只需要15到20分钟的时间,因此,与手动工具相比,数字机器的优势大大降低,而手动工具却可以打出很多孔。
我想要得到什么
对于相同的添加剂,我想得到一个程序,在一个非常简单的界面中,我将输入面板的宽度和厚度,然后按下按钮以开始以彼此相同的距离钻孔所需数量的填充孔的过程。
寻找解决方案
我想到的第一件事是编写一个可直接与并行端口进行交互的自治程序。 快速搜寻表明,写给lpt的任务是可以解决的,但是您知道,魔鬼正在详细隐藏。 通过对该问题的进一步研究,我意识到您可能会长期陷入困境。 而且,这样的解决方案将不够灵活:对于另一台机器(例如带有USB的机器),它将无法工作。
有一个处理Mach3 SDK的选项。 在收集有关创建mach插件的信息的过程中,我遇到了一个有趣的解决方案。 它描述了如何使用OLE机制从第三方应用程序中提取Mach3。 我不是Microsoft技术方面的专家,但是在查看了Mach3 SDK上的手册对角线后,如果我正确理解了主要思想,就没有灵丹妙药,那么插件将使用与Mach3 COM对象相同的公共方法。 我不会重绘Mach3界面,因此,该用户在插件和Standalon应用程序之间的唯一区别是可以从Mach3菜单访问该插件,而可以通过XP桌面上的图标访问该应用程序。
对我来说,单独申请似乎更可取。 在这种情况下,从理论上讲,我可以在加载计算机后立即启动程序,这将为Mach3加载蒸汽机车(而不是先加载Mach3,然后再挖掘其菜单以启动插件)。
拿起军刀
我上一次不得不为Windows编写本机桌面应用程序是在2006年,当时是在Delphi中。 从那时起,带有Linux的Web技术就完全让我吃饱了。 因此,现在我对使用哪种语言来雕刻Windows程序没有任何特别的偏好。 找到的简单示例是用C#编写的,该语言被选为实验兔子。
我不会在此处发布最终应用程序的所有代码(如果您愿意,可以使用文章底部的链接在github上找到它)。 我将解释基本的东西。 我在带有WinXP SP3,VS 2003和Mach3 R3.043.062版本的虚拟机上进行的所有实验。 对于那些认为最好
在YouTube上一次查看
视频链接的人 ,据我了解。 以下是重点摘要的笔录。
准备工作
- 为了使Visual Studio能够正确拾取Mach3组件,必须在注册表中正确注册它。 为此,请下载文件Mach3Registry.reg
- 启动Mach3Registry.reg
- 我们启动VS,在C#中创建一个窗口应用程序的项目
- 在“解决方案资源管理器”块中,右键单击“引用”,然后从菜单中选择“添加引用”。 在打开的窗口中,单击“浏览”,然后查找Mach3.exe。

如果一切正确,则应该在“引用”列表中显示一行,以为会认为Mach4 ... - 5.接下来,绘制UI,挂断处理程序,实现算法...
与Mach3的互动
我们连接必要的库,声明变量(Form1.cs)
... using System.Runtime.InteropServices; using Mach4;
用法:
GetMachInstance();
可以在Wiki上查看按钮和参数值的代码:
OEM_DRO和
OEM_Buttons (它们没有Wiki,表中未显示参数值,我查看了“查看源代码”选项卡)。
该程序的第一个版本是这样工作的:根据设置的参数,生成了由
_mInst.Code方法
逐帧执行(即逐行)的g代码。 那是我的错误。 在虚拟机上的调试环境中,一切正常。 在Mach3中,运行了坐标中的正确数字。 但是,当转移到机器计算机时会出现问题。 托架正确移动,但主轴未打开。
似乎路由器和Mach中的主轴的管理工作在不同的线程中。 结果表明,运动命令(G ...)在一个线程中进入_mInst.Code方法时是依次执行的,而主轴控制命令(M3,M5)(无论是第一个线程)都是在另一个线程中执行的。 结果,在移动托架时,主轴打开(M3)并立即关闭(M5)。
我尝试了不同的选项,连接了延迟,试图将整个g代码控件驱动为一行,然后将其发送到_mInst.Code。 结果,我选择了“额头上”的解决方案:我只是将生成的代码驱动到一个文件中,然后在Mach3中以编程方式打开该文件,然后在此处以编程方式按下“开始”按钮。 工作代码段:
_mInst.LoadFile("C:\\tmp\\gcode.txt"); System.Threading.Thread.Sleep(2000); _mInst.DoOEMButton(1000);
为了使Mach打开文件,需要在下载文件和按下按钮之间暂停。 也许有一些更优雅的方法。 如果有人知道,请在评论中写。
该解决方案的另一个好处是,现在您可以在Mach界面中观察处理过程的可视化。
最终发生了什么
此外,简而言之,涉及到最终的应用程序。 另外,我将讨论每个操作的UI。
切

这里的一切都很透明。 如果工件未沿X(或沿Y沿切削时)沿零点固定,则需要参数S来补偿尺寸L。
添加剂
对于添加,可能有2种快速配置。 第一个带有用于钻削端孔的磨床。 第二个带有通常在屏蔽层上钻孔的主轴(出于某种原因,我称其为“正面添加剂”)。
加性脸

使用最终添加剂时,重要的是在工件的右下角精确设置零(我在这里有侧挡板和工作台的角度)。 用木头钻,这并不难-要进入这个角落,需要有一个尖锐的尖端。 将工件固定在工作台上,我将其放在钻头中。
在不以相同方式更换设备的情况下,我通过垂直固定工件来制造倒角孔:
需要参数X才能连接不同宽度的面板(例如,当机柜的上下面板比侧面板的宽度乘以门的厚度时)。
额叶添加剂

前面的设备是普通主轴。 当您需要在水平表面上钻孔时,不仅可以沿着边缘,还可以在中间某处钻孔,可以使用这种添加剂。 例如,如果机柜中有多个隔间,并且除了侧壁之外,还有内部隔间。 如果面板的长度大于机器的长度,则可以将零件旋转180度制成2组添加剂。 在这种情况下,参数X也很有用。
转弯

对我来说,准备带有旋转路径的g代码的主要困难在于,不要在磁盘的最大浸入深度下过度使用它。 事实是,在Inkscape的出口处获得了一行,并且转弯发生了一次。 因此,我必须创建一个单独的代码来圆柱化工件,直到启动创建模板的主要通道之后。 而且此表格有一些限制。 特别是,必须确保轨迹不会太深。 我尝试不超过原始圆柱的高度10-15毫米。
在新程序中解决了所有这些问题。 它的工作方式如下:加载从Inkscape获得的“原始” g代码,设置工件的条形侧面的大小,并在1次通过中指示最大加工深度(木材越硬,该深度越小)。 基于源g代码和参数,程序将计算安全路径并将其发送到CNC。
未来计划
该程序大大简化了例程,但仍远远不够完善。 首先,有必要优化用于钻深孔的算法(钻头被切屑和过热堵塞,您需要来回摆动)。 其次,提出了制作转弯形式库的想法。 即 几种标准形式(例如圆柱体,圆锥体,rolling面杖等),可以调整尺寸而无需在第三方程序中创建轨迹。
参考文献
→
Mach3Registry.reg→
Mach3 SDK和其他程序→
Github上的项目存储库 (我预先向Sharpoviks致歉以获取建筑门框-这是我在C#中的第一个程序)。