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]!=" ")
{
//当前报警信息
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,操作更方便哦