用Matlab来将分层制造过程中G代码所表示的单层的加工路径显示出来

为了使数据变得更加直观,通常要用到可视化技术。这里从先从G代码中分离出坐标,然后根据G1代码的含义(直线插补),采用line命令来作出路径图。

原始数据如下(保存为test.txt):

G1 X-57.636 Y0.0 Z1.18 F960.0
G1 X57.636 Y0.0 Z1.18 F960.0
G1 X57.636 Y-1.44 Z1.18 F960.0
G1 X-57.636 Y-1.44 Z1.18 F960.0
G1 X-57.636 Y-2.88 Z1.18 F960.0
G1 X57.636 Y-2.88 Z1.18 F960.0
G1 X57.636 Y-4.32 Z1.18 F960.0
G1 X-57.636 Y-4.32 Z1.18 F960.0
G1 X-57.636 Y-5.76 Z1.18 F960.0
G1 X57.636 Y-5.76 Z1.18 F960.0
G1 X57.636 Y-7.2 Z1.18 F960.0
G1 X-57.636 Y-7.2 Z1.18 F960.0
G1 X-57.636 Y-8.64 Z1.18 F960.0
G1 X57.636 Y-8.64 Z1.18 F960.0
G1 X57.636 Y-10.08 Z1.18 F960.0
G1 X-57.636 Y-10.08 Z1.18 F960.0
G1 X-57.636 Y-11.52 Z1.18 F960.0
G1 X57.636 Y-11.52 Z1.18 F960.0
G1 X57.636 Y-12.96 Z1.18 F960.0
G1 X-57.636 Y-12.96 Z1.18 F960.0
G1 X-57.636 Y-14.4 Z1.18 F960.0
G1 X57.636 Y-14.4 Z1.18 F960.0
G1 X57.636 Y-15.84 Z1.18 F960.0
G1 X-57.636 Y-15.84 Z1.18 F960.0
G1 X-57.636 Y-17.28 Z1.18 F960.0
G1 X57.636 Y-17.28 Z1.18 F960.0
G1 X57.636 Y-18.72 Z1.18 F960.0
G1 X-57.636 Y-18.72 Z1.18 F960.0
G1 X-57.636 Y-20.16 Z1.18 F960.0
G1 X57.636 Y-20.16 Z1.18 F960.0
G1 X57.636 Y-21.6 Z1.18 F960.0
G1 X-57.636 Y-21.6 Z1.18 F960.0
G1 X-57.636 Y-23.04 Z1.18 F960.0
G1 X57.636 Y-23.04 Z1.18 F960.0
G1 X57.636 Y-24.48 Z1.18 F960.0
G1 X-57.636 Y-24.48 Z1.18 F960.0
G1 X-57.636 Y-25.92 Z1.18 F960.0
G1 X57.636 Y-25.92 Z1.18 F960.0
G1 X57.636 Y-27.36 Z1.18 F960.0
G1 X-57.636 Y-27.36 Z1.18 F960.0
G1 X-57.636 Y-28.8 Z1.18 F960.0
G1 X57.636 Y-28.8 Z1.18 F960.0
G1 X57.636 Y-30.24 Z1.18 F960.0
G1 X-57.636 Y-30.24 Z1.18 F960.0
M103
G1 X-57.636 Y1.44 Z1.18 F960.0
M101
G1 X57.636 Y1.44 Z1.18 F960.0
G1 X57.636 Y2.88 Z1.18 F960.0
G1 X-57.636 Y2.88 Z1.18 F960.0
G1 X-57.636 Y4.32 Z1.18 F960.0
G1 X57.636 Y4.32 Z1.18 F960.0
G1 X57.636 Y5.76 Z1.18 F960.0
G1 X-57.636 Y5.76 Z1.18 F960.0
G1 X-57.636 Y7.2 Z1.18 F960.0
G1 X57.636 Y7.2 Z1.18 F960.0
G1 X57.636 Y8.64 Z1.18 F960.0
G1 X-57.636 Y8.64 Z1.18 F960.0
G1 X-57.636 Y10.08 Z1.18 F960.0
G1 X57.636 Y10.08 Z1.18 F960.0
G1 X57.636 Y11.52 Z1.18 F960.0
G1 X-57.636 Y11.52 Z1.18 F960.0
G1 X-57.636 Y12.96 Z1.18 F960.0
G1 X57.636 Y12.96 Z1.18 F960.0
G1 X57.636 Y14.4 Z1.18 F960.0
G1 X-57.636 Y14.4 Z1.18 F960.0
G1 X-57.636 Y15.84 Z1.18 F960.0
G1 X57.636 Y15.84 Z1.18 F960.0
G1 X57.636 Y17.28 Z1.18 F960.0
G1 X-57.636 Y17.28 Z1.18 F960.0
G1 X-57.636 Y18.72 Z1.18 F960.0
G1 X57.636 Y18.72 Z1.18 F960.0
G1 X57.636 Y20.16 Z1.18 F960.0
G1 X-57.636 Y20.16 Z1.18 F960.0
G1 X-57.636 Y21.6 Z1.18 F960.0
G1 X57.636 Y21.6 Z1.18 F960.0
G1 X57.636 Y23.04 Z1.18 F960.0
G1 X-57.636 Y23.04 Z1.18 F960.0
G1 X-57.636 Y24.48 Z1.18 F960.0
G1 X57.636 Y24.48 Z1.18 F960.0
G1 X57.636 Y25.92 Z1.18 F960.0
G1 X-57.636 Y25.92 Z1.18 F960.0
G1 X-57.636 Y27.36 Z1.18 F960.0
G1 X57.636 Y27.36 Z1.18 F960.0
G1 X57.636 Y28.8 Z1.18 F960.0
G1 X-57.636 Y28.8 Z1.18 F960.0
G1 X-57.636 Y30.24 Z1.18 F960.0
G1 X57.636 Y30.24 Z1.18 F960.0

M103



处理:

clc
clear all
close all

fid=fopen('test.txt'); 

n=89;%the number of line to read

for i=1:n
    a{i}=fgets(fid);
end 
fclose(fid); 

b(1,:)=zeros(1,3);
bi=2;
air=[];

for i=1:n
    lineCharacter=length(a{i});
    count=0;
    if(a{i}(1)=='G'&&a{i}(2)=='1')
        for k=3:lineCharacter
            if(isspace(a{i}(k)))
                count=count+1;
            end
            if(a{i}(k)=='X')
                kTemp=k+1;
                for kTempC=1:3
                    str=[];
                    while(((a{i}(kTemp))>='0'&&(a{i}(kTemp))<='9')||(a{i}(kTemp))=='.'||(a{i}(kTemp))=='-')
                        str=strcat(str,a{i}(kTemp));
                        kTemp=kTemp+1;
                    end
                    while ~(((a{i}(kTemp))>='0'&&(a{i}(kTemp))<='9')||(a{i}(kTemp))=='.'||(a{i}(kTemp))=='-')
                        kTemp=kTemp+1;
                    end
                    b(bi,kTempC)=str2num(str); 
                end
                bi=bi+1;
            end
        end
    end
    if(i~=(n-2)&&i~=(n-1)&&i~=n&&(strncmp(a{i},'M103',4)||strncmp(a{i+2},'M101',4)))
        air=[air,bi];
    end
end

figure;
hold on;
axis([min(b(:,1))-1,max(b(:,1))+1,min(b(:,2))-1,max(b(:,2))+1]);

for i=2:size(b,1)
%     if(b(i,3)==b(1,3))
        if(~ismember(i,air))
            line([b(i-1,1),b(i,1)],[b(i-1,2),b(i,2)],'LineWidth',1,'Color','b');
        else
            line([b(i-1,1),b(i,1)],[b(i-1,2),b(i,2)],'LineWidth',4,'Color','r');
        end
%     end
end

结果:


代码解释:

M103表示extruder off,刀具不进行加工操作;

M101表示进行加工操作。

所以,在这两个代码之间的G01表示的是空程路径。在这里用红色表示。

蓝色则表示刀具进行加工操作的路径。

air这个变量是用来记录空程的,直接标记空程终点所在坐标即可,作图时也只是变一下颜色就搞定。这个处理得很简洁。


技术点:

  1. line([起点横坐标,终点横坐标],[起点纵坐标,终点纵坐标]),
  2. ismember(c,A,'rows')可以判断数组c是不是矩阵A中的一行
  3. 二维图形坐标轴范围在缺省状态下是根据数据的大小自动设置的,如欲改变,可利用axis(xmin xmax ymin ymax),函数来定义。
  4. line(X,Y,Z,'Color','r','LineWidth',4),注意与plot的控制方法不同。。。。有一些小问题和line的这个问题合在一起了,我找了半天才发现,十分无语。。。。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值