C# 读取Brother兄弟机床CNC的数据

1、使用TCP连接的方式读取

        首先需要

/// <summary>
        /// 读取CNC的数据
        /// </summary>
        /// <param name="client">CNC登陆后的client</param>
        /// <param name="ParaName">要读取的参数列表</param>
        /// <returns>返回读取到的数据字典</returns>
        public static Dictionary<string, string> GetCncData(TcpClient client,List<string> ParaName)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            if (!client.Connected)
            {
                LogHelper.WriteLog("TCPHelper_GetCncData_CNC未连接!");
                return dic;
            }
            try
            {
                var networkStream = client.GetStream();

                foreach (var par in dic)
                {
                    //此处的dataName就是形如【WKCNTR】的CNC机床的文件名(WKCNTR.CN文件)
                    //读取单个数据,使用
                    //var buffer = Encoding.UTF8.GetBytes("%CLOD    "+ "SYSC89  00" + "\r\n00%");

                    //读取数据库中的信息
                    string cmd = "%CLOD    " + par.Value + "\r\n00%";
                    var buffer = Encoding.UTF8.GetBytes("%CDRQALAL        00" + "\r\n00%");
                    networkStream.Write(buffer, 0, buffer.Length);
                    networkStream.ReadTimeout = 3000;
                    var readBuffer = new byte[1024 * 1024 * 10];//10M
                    var len = networkStream.Read(readBuffer, 0, readBuffer.Length);
                    var result = Encoding.UTF8.GetString(readBuffer, 0, len);
                    //LogHelper.WriteCNCDataTest(par.Key, cmd, result);
                    //LogHelper.WriteLog("TcpHelper:GetSingleCncData,读取到数据:" + par + result);
                    //networkStream.Close(3000);
                    /*var lines = result.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
                    foreach (var line in lines)
                    {
                        if (line.StartsWith("A01"))
                        {
                            var fields = line.Split(',');
                            //LogHelper.WriteLog("TcpHelper:GetSingleCncData" + fields[2].Trim());
                            string value = fields[2].Trim();
                            dic.Add(par, value);
                            break;
                        }
                    }*/
                }
                networkStream.Close(3000);
                return dic;
            }
            catch (Exception err)
            {
                LogHelper.WriteLog("TcpHelper:GetCncData" + err);
                client.Close();
                client.Dispose();
                return dic;
            }
        }

重点在于读取CNC数据的命令的格式,【"%CLOD    "+ "SYSC89  00" + "\r\n00%"】

其中%CLOD是数据开头,固定写法,C表示这是一个命令Command,LOD表示从主机(CNC)加载load数据,%CLOD后有四个空格,整个【%CLOD    】表示读取指令的开头;

【SYSC98  00】表示读取的数据名称,此名称固定占十位,且末尾固定是00,表示指令正常结束。

【\r\n00%】则表示指令的尾部,固定写法,需要注意的是在此尾部指令中,【\r\n】表示的是ascii正常的结束符号,【00%】则表示此指令正常结束。

主要的读取部分在于指令的拼凑,此处介绍的CLOD指令可以实现读取大多数数据和数据库的data,此指令可以读取的数据名称以及数据库名称如下:

此文档将会上传到百度云,有需要的朋友可以自行选择下载。

2、使用FTP方式读取机床数据

这种方式貌似只能读取到数据库,支持下载数据库的文件【XXX.nc】文件。

/// <summary>
        /// 通过FTP方式读取CNC的数据库
        /// </summary>
        public static void FtpTest()
        {
            try
            {
                //FTP测试传送文件
                //必须设置CNC的【限制以太网连接】为1
                var FtpClient = new FtpClient("192.168.1.1"/*FTPip地址*/, "userName", "Password");
                FtpClient.AutoConnect();
                LogHelper.WriteLog("TcpHelper_Ftp_FTP服务器登陆成功!");
                FtpClient.DownloadFile("D://NCFiles//nc1.txt"/*下载到本地的文件名*/, "/CMPR1.NC"/*从服务器下载的文件名*/);
                var files = FtpClient.GetListing();
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("TcpHelper_FtpTest_" + ex.Message);
            }
        }

这个方式比较简单,也比较鸡肋,下载下来的数据库文件需要自己解析才能拿到需要的数据。

3、本人使用的方式,通过机床本身的Web页面来读取数据

由于需要的数据只能在CNC机床本身的web页面来得到,故使用此种方法。

如果不用这种方式,还可以读取机床本省自带的PLC来获取对应的数据,是的,Brother机床自带了PLC,理论上所有的数据都可以通过读取PLC来获得,不过我没有去研究。具体的PLC读取有文档,我会上传到百度云网盘,需要的可以自取。

接下来介绍如何通过Web网页读取CNC数据。

/// <summary>
        /// 通过http发送Get请求的方式获取CNC数据,拼凑出DataModel
        /// </summary>
        /// <param name="webs">Get参数列表</param>
        public static bool GetCNCData(string ipAddress,List<string> webs,ref SaveCncDataModel dataModel)
        {
            LogHelper.WriteLog("TCPHelper_GetCncData_开始读取机床的数据");
            dataModel.CncId = new THM_CNCEntities().MachineInfo.Where(a=>a.MachineIP == ipAddress).Select(a=>a.MachineId).FirstOrDefault();
            try
            {
                foreach (var web in webs)
                {
                    string url = ipAddress.Trim()+ web;
                    WebClient webClient = new WebClient();
                    string html = webClient.DownloadString(url);
                    switch (web) 
                    {
                        case "alarm_list": DBHelper.Page_alarm_list(html,ref dataModel); break;
                        case "alarm_log": DBHelper.Page_alarm_log(html, ref dataModel); break;
                        case "mainte_info": DBHelper.Page_mainte_info(html, ref dataModel); break;
                        case "running_log": DBHelper.Page_running_log(html, ref dataModel); break;
                        case "running_log?mode=1":DBHelper.Page_running_log_mode1(html, ref dataModel); break;
                        case "status_log": DBHelper.Page_status_log(html, ref dataModel); break;
                        case "status_detail?pos=0":DBHelper.Page_status_detail_pos0(html, ref dataModel);break;
                        //case "tool": DBHelper.Page_tool(html, ref dataModel); break;
                        case "work_counter": DBHelper.Page_work_counter(html, ref dataModel); break;
                            default: break;
                    }
                }
                LogHelper.WriteLog("TCPHelper_GetCncData_读取机床数据成功");
                return true;
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("TcpHelper_GetCNCData_读取机床数据失败," + ex.Message);
                return false;
            }
        }

主要部分在于发送http请求获取到网页编码数据,再从网页代码中解析出需要的数据。

此处直接用WebClient的DownLoadString()方法就能直接得到HTML网页代码。

再根据具体的网页url进行分类处理,此处推荐使用【Nsoup】NuGet包来处理,例子如下:

public static void Page_alarm_log(string page, ref SaveCncDataModel Model)
        {
            //当前报警
            Document doc = NSoupClient.Parse(page);
            Elements tr = doc.GetElementsByClass("border_line2");
            List<string> str = tr.Html().Split('\n').ToList();
            List<TempAlarmInfo> listAla = new List<TempAlarmInfo>();
            for (int i = 0; i < str.Count; i+=4)
            {
                if (str[i]!="&nbsp;")
                {
                    //当前报警信息
                    TempAlarmInfo TalarmInfo = new TempAlarmInfo() ;
                    TalarmInfo.Alarm = str[0];
                    TalarmInfo.MachineName = Model.CncName;
                    TalarmInfo.MachineId = Model.CncId;
                    TalarmInfo.Info = str[1];
                    TalarmInfo.ProcessBlockCode = str[3];
                    TalarmInfo.Process = str[2];
                    listAla.Add(TalarmInfo);
                }
            }
            Model.LAlarminfo = listAla;
        }

如此,就能够得到相对而言比较丰富的数据。

4、文件下载链接

1、阿里云链接(推荐使用阿里云,百度云太恶心了)

CNC机床编程资料 https://www.aliyundrive.com/s/dStWHJqFEWv 提取码: 74kb 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

2、百度云链接

链接: https://pan.baidu.com/s/1qIoYOlCtFO5SglDb1knUlA?pwd=4cdv 提取码: 4cdv 复制这段内容后打开百度网盘手机App,操作更方便哦

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值