说明

2025年更新:

G代码本质是文本文件        txt  。

所以可以用string获取。     //  C语言,C#语言,。。。

                N0010     G00   X500   Y500   Z500    F200;

                N0020     M08;

                N0030     M03  S150;

1截取字符串用正则表达式,先截取一行。    【/r/n】回车,换行

2截取行号,【换行符+N】或者【空白+N】,获取数值 

3截取G功能码,【空白+G】,获取数值   0x20,0x47

4获取坐标,【空白+X】,获取数值          0x20,0x58

                ,【空白+Y】,获取数值          0x20,0x59

                ,【空白+Z】,获取数值

                ,【空白+A】,获取数值

                ,【空白+B】,获取数值

                ,【空白+C】,获取数值

5获取速度,【空白+F】,获取数值

6截取M功能码,【空白+M】,获取数值

7截取S功能码,【空白+S】,获取数值

8.。。。。按自己需求再添加

9截取;字符码,当前行分号后面的字符串作废。

正则表达式不会用的话可以问 【 Ai 】   

关于更多G代码功能,可以去了解3D打印机,MarLin固件,grbl固件源码。

获取字母后数字

 cnc.need_F = Get_G_Value(input, @"[Ff]\d+", out cnc.F速度);// 字母后的数字
 cnc.need_G = Get_G_Value(input, @"[Gg]\d+", out cnc.G指令);// 字母后的数字

 cnc.need_X = Get_G_Value(input, @"[Xx][-+]?\d+\.?\d+", out cnc.X坐标);// 字母后的数字
 cnc.need_Y = Get_G_Value(input, @"[Yy][-+]?\d+\.?\d+", out cnc.Y坐标);// 字母后的数字
 cnc.need_Z = Get_G_Value(input, @"[Zz][-+]?\d+\.?\d+", out cnc.Z坐标);// 字母后的数字

 public bool Get_Value64(Match match, out double num)
 {
     //match = Regex.Match(match.Value, @"[-]?\d+\.?\d+"); // - .【去字母】
     match = Regex.Match(match.Value, @"[-]?\d+\.?(\d+)?"); // - .【去字母】
     if (double.TryParse(match.Value, out num)) return true;
     return false;
 }


public bool Get_G_Value(string input, string pattern, out double i64)// 字母后的数字
{// 自裁出匹配条件的数据
 //MatchCollection matches = Regex.Matches(input, pattern);
 //Match matches = (Match)Regex.Matches(input, pattern);
 //foreach (Match match in matches)
 //{
 //    return      int.Parse(  match.Value);
 //}

    Match X字母;
    //X字母 = Regex.Match(input, $@"[{pattern}][-+]?\d+\.?\d+");// 字母后数字  X+123.456
    X字母 = Regex.Match(input,pattern);// 字母后数字  X+123.456
    return Get_Value64(X字母, out i64);// 去字母
}

下面是一个使用C#编写的解析G代码的示例方法:

下面是一个使用C#编写的解析G代码的示例方法:

csharp
using System;
using System.Collections.Generic;

public class GCodeParser
{
    public static List<GCodeCommand> ParseGCode(string gcode)
    {
        var commands = new List<GCodeCommand>();
        
        // 按行分割G代码
        var lines = gcode.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        
        foreach (var line in lines)
        {
            // 忽略空行和注释行
            if (string.IsNullOrWhiteSpace(line) || line.Trim().StartsWith(";"))
            {
                continue;
            }
            
            // 分割行为指令和参数
            var parts = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
            
            if (parts.Length == 0)
            {
                continue;
            }
            
            // 第一个部分是指令
            var command = new GCodeCommand();
            command.Instruction = parts[0].ToUpper();
            
            // 其余部分是参数
            for (int i = 1; i < parts.Length; i++)
            {
                var parameter = parts[i];
                
                // 分割参数名和值
                var equalsIndex = parameter.IndexOf('=');
                if (equalsIndex > 0)
                {
                    var parameterName = parameter.Substring(0, equalsIndex);
                    var parameterValue = parameter.Substring(equalsIndex + 1);
                    
                    command.Parameters[parameterName] = parameterValue;
                }
                else
                {
                    // 参数没有指定名称,默认使用字母序号作为参数名
                    command.Parameters[i.ToString()] = parameter;
                }
            }
            
            commands.Add(command);
        }
        
        return commands;
    }
}

public class GCodeCommand
{
    public string Instruction { get; set; }
    public Dictionary<string, string> Parameters { get; set; }
    
    public GCodeCommand()
    {
        Parameters = new Dictionary<string, string>();
    }
}
使用示例:

csharp
var gcode = "G1 X10 Y20 Z30" + Environment.NewLine +
            "G2 X50 Y50 R20" + Environment.NewLine +
            "G28" + Environment.NewLine +
            "; This is a comment" + Environment.NewLine +
            "G90";

var commands = GCodeParser.ParseGCode(gcode);
foreach (var command in commands)
{
    Console.WriteLine("Instruction: " + command.Instruction);
    foreach (var parameter in command.Parameters)
    {
        Console.WriteLine("Parameter: " + parameter.Key + " = " + parameter.Value);
    }
    Console.WriteLine();
}
输出结果:

Instruction: G1
Parameter: 1 = X10
Parameter: 2 = Y20
Parameter: 3 = Z30

Instruction: G2
Parameter: 1 = X50
Parameter: 2 = Y50
Parameter: 3 = R20

Instruction: G28

Instruction: G90

正则表达式:

用正则表达式提取文本字母G后面的double类型的数字。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string text = "Some text with G3.14 and g2.718 and other stuff";
        Regex regex = new Regex(@"(?i)[Gg]([0-9]+(\.[0-9]+)?)");
        MatchCollection matches = regex.Matches(text);
        foreach (Match match in matches)
        {
            if (match.Groups.Count > 1)
            {
                Console.WriteLine(match.Groups[1].Value);
            }
        }
    }
}

这段代码使用正则表达式(?i)[Gg]([0-9]+(\.[0-9]+)?)来匹配文本中字母 “G” 或 “g” 后面的 double 类型小数,并将其输出。

正则表达式中的(?i)表示不区分大小写,

[Gg]匹配 “G” 或 “g”,后面的[0-9]+(\.[0-9]+)?匹配一个或多个数字,以及可选的小数点和一个或多个数字。

+表示多个 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐