最近在完善CNC数控车床的数据采集,做之前没接触过这东西,只知道是使用Fanuc数控系统,在网上搜索一圈,资料少到令人蛋疼。按正常来说,发那科数控系统是非常常见的。最后加了几个群,提的问题没人管,但跑出来很多各种收费解决问题,捂得紧紧的,无奈只能自己研究。

废话少说,进入正题,Fanuc的SDK包叫Focas2,里面有说明文档和开发要用的DLL,而我们数据采集只需要文件:fwlib32.cs、Fwlib32.dll和车床系统版本对应的DLL,如果你不知道,那就把所有DLL全部复制进bin目录。

SDK有开发案例和每个函数的代码实例(doc文件),但是不全,并不是每个函数都有,常用的函数没有问题。

开发时注意,使用cnc_allclibhndl3连接后得到的Flibhndl,使用时必须和使用cnc_allclibhndl3保持在同一线程里,否则获取到就会全是0,不是实际数据。

本次使用多线程采集多个设备的 机械位置,主轴速度,进给率,负载

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Threading;namespace CNCServ
{public class DeviceInfo{public Guid DeviceID { get; set; }public string DeviceCode { get; set; }public string DeviceName { get; set; }public string IP { get; set; }public ushort Port { get; set; }public bool Connected { get; set; }public ushort Flibhndl { get; set; }public bool run { get; set; } = true;//最后获取到数据的时间,处理重连public DateTime LastHasDateTime { get; set; }//获取到机械位置为0的次数,处理是否显示(偶尔会为0,不作显示)public int ZeroCount { get; set; }//采集数据频率 间隔public int GetDataInterval { get; set; }/// <summary>/// 机械坐标/// </summary>/// <returns></returns>public string GetCNC_Machine(){#region cnc_machine  机械坐标Focas1.ODBAXIS odbaxis = new Focas1.ODBAXIS();Focas1.cnc_machine(Flibhndl, (short)(1), 8, odbaxis);string x = (odbaxis.data[0] / 1000.000).ToString("0.000");Focas1.cnc_machine(Flibhndl, (short)(2), 8, odbaxis);string y = (odbaxis.data[0] / 1000.000).ToString("0.000");Focas1.cnc_machine(Flibhndl, (short)(3), 8, odbaxis);string z = (odbaxis.data[0] / 1000.000).ToString("0.000");var d = new { X = x, Y = y, Z = z };string result = JsonConvert.SerializeObject(d);return result;#endregion}/// <summary>/// 主轴实际速度/// </summary>/// <returns></returns>public int GetCNC_Acts(){#region cnc_acts2 主轴实际速度 Focas1.ODBACT odbact = new Focas1.ODBACT();Focas1.cnc_acts(Flibhndl, odbact);return odbact.data;#endregion}/// <summary>/// 伺服器给进率/// </summary>/// <returns></returns>public int GetCNC_Actf(){#region cnc_actf  伺服器给进率Focas1.ODBSPEED odbspeed = new Focas1.ODBSPEED();var odbact = new Focas1.ODBACT();Focas1.cnc_actf(Flibhndl, odbact);return odbact.data;#endregion}/// <summary>/// 系列轴负载/// </summary>/// <returns></returns>public short GetCNC_Rdspload(){#region cnc_rdspload  系列轴负载Focas1.ODBSPN odbspn = new Focas1.ODBSPN();Focas1.cnc_rdspload(Flibhndl, Focas1.ALL_SPINDLES, odbspn);return odbspn.data[0];#endregion}/// <summary>/// 从设备获取实时数据/// </summary>/// <param name="fh">连接句柄</param>public void GetDeviceData(){//上一次检测设备的状态int runstate = 0;//0停止,1待机,开动while (run){bool reConnect = false;string result = "连接失败";int cnc_acts2 = 0, cnc_actf = 0;#region 检查连接情况,断开则重连TimeSpan ts = DateTime.Now - LastHasDateTime;if (ts.TotalSeconds >= 60 * 3)  //3分钟判断一次连接状态{Focas1.ODBST buf = new Focas1.ODBST();Focas1.cnc_statinfo(Flibhndl, buf);runstate = buf.run; //状态+模式if ((buf.run + buf.aut) <= 0) //buf.run //0停止,1待机,开动{reConnect = true; //3分钟重连一次 Connected = false;}LastHasDateTime = DateTime.Now;}#endregion#region 连接设备if (!Connected && reConnect) //3分钟重连一次,降低频率{reConnect = false;if (!Ping(IP)){result = "Ping不通,连接失败";SysLog.WriteEntry("CNCServ", $"{DeviceCode} ping不通,无法连接!", SysLog.LogType.Information, 0);}else{ushort f;var connect = Focas1.cnc_allclibhndl3(IP, Port, 10, out f);if (connect != Focas1.EW_OK){SysLog.WriteEntry("CNCServ", $"{DeviceCode} 连接失败!错误代码:{connect}!", SysLog.LogType.Information, 0);Flibhndl = 0;Connected = false;}else{Flibhndl = f;Connected = true;LastHasDateTime = DateTime.Now;SysLog.WriteEntry("CNCServ", $"{DeviceCode} 连接成功!{Flibhndl}!", SysLog.LogType.Information, 0);result = "连接成功";}}LastHasDateTime = DateTime.Now;UpdateServiceData("connectstate", result, DeviceID, DeviceCode, DeviceName);}#endregion#region 获取数据if (Connected){//UpdateServiceData("connectstate", "连接成功", DeviceID, DeviceCode, DeviceName); try{#region cnc_machine  机械坐标var machine = GetCNC_Machine();#endregion#region cnc_acts2 主轴实际速度  cnc_acts2 = GetCNC_Acts();#endregion#region cnc_actf  伺服器给进率   cnc_actf = GetCNC_Actf();#endregion#region cnc_rdspload  系列轴负载string rdspload = GetCNC_Rdspload();#endregion var data = new{connectstate = "连接成功",cnc_machine = machine,cnc_acts2 = act2,cnc_actf = actf,cnc_rdspload = rdspload};var updatedata = JsonConvert.SerializeObject(data);UpdateServiceData("all", updatedata, DeviceID, DeviceCode, DeviceName);}catch (Exception ex){SysLog.WriteEntry("CNCServ", ex, 1); }}#endregion Thread.Sleep(GetDataInterval);}}/// <summary>/// 更最新数据到接口/// </summary>/// <param name="dataCode"></param>/// <param name="dataValue"></param>/// <param name="deviceID"></param>/// <param name="deviceCode"></param>/// <param name="deviceName"></param>private void UpdateServiceData(string dataCode, string dataValue, Guid deviceID, string deviceCode, string deviceName){try{//接口方式 var t = new Thread(delegate () {APIHelper.TestCNCData(dataCode, deviceCode, deviceName, dataValue);});t.Start();}catch (Exception ex){SysLog.WriteEntry("CNCServ", ex, 2); }}/// <summary>/// 设置失去连接,不再使用循环重连,而是先ping通再连接,防止重连消耗资源/// </summary>/// <param name="ip"></param>/// <returns></returns>private bool Ping(string ip){bool result = false;using (var ping = new Ping()){PingReply pingReply = ping.Send(ip);if (pingReply.Status == IPStatus.Success)result = true;elseresult = false;}return result;}}
}

上面代码为一个对象,多台设备可以实例化多个对象,每个对象放进一个线程里,可以做成win服务或都winfrom程序

下面是调用例子(windows service)

protected override void OnStart(string[] args){ Bind();}/// <summary>/// 设置设备列表,并启动采集线程/// </summary>private void Bind(){int interval = int.Parse(ConfigurationManager.AppSettings["GetDataInterval"]); //采集数据频率 毫秒DeviceInfo deviceInfo0002;DeviceInfo deviceInfo0003;DeviceInfo deviceInfo0004;DeviceInfo deviceInfo0007;deviceInfo0002 = new DeviceInfo{Connected = false,DeviceID = Guid.NewGuid(),,DeviceCode = "001",DeviceName = "数控车床", IP = "192.168.0.1",Port = 8193,GetDataInterval = interval,LastHasDateTime = DateTime.Now.AddDays(-1)};Thread thread2 = new Thread(new ThreadStart(deviceInfo0002.GetDeviceData));this.threadPool.Add(thread2);deviceList.Add(deviceInfo0002);deviceInfo0003 = new DeviceInfo{Connected = false,DeviceID = Guid.NewGuid(),DeviceCode = "002",DeviceName = "数控车床",IP = "192.168.0.2",Port = 8193,GetDataInterval = interval,LastHasDateTime = DateTime.Now.AddDays(-1)};Thread thread3 = new Thread(new ThreadStart(deviceInfo0003.GetDeviceData));this.threadPool.Add(thread3);deviceList.Add(deviceInfo0003);deviceInfo0004 = new DeviceInfo{Connected = false,DeviceID = Guid.NewGuid(),DeviceCode = "003",DeviceName = "数控车床",IP = "192.168.0.3",Port = 8193,GetDataInterval = interval, LastHasDateTime = DateTime.Now.AddDays(-1)};Thread thread4 = new Thread(new ThreadStart(deviceInfo0004.GetDeviceData));this.threadPool.Add(thread4);deviceList.Add(deviceInfo0004);deviceInfo0007 = new DeviceInfo{Connected = false,DeviceID = Guid.NewGuid(),DeviceCode = "004",DeviceName = "数控车床",IP = "192.168.0.4",Port = 8193,GetDataInterval = interval,LastHasDateTime = DateTime.Now.AddDays(-1)};Thread thread7 = new Thread(new ThreadStart(deviceInfo0007.GetDeviceData));this.threadPool.Add(thread7);deviceList.Add(deviceInfo0007);foreach (Thread t in this.threadPool){t.Start();}}//停止服务时,关闭线程和释放连接,网上说连接有1000的限制,没明白是怎么个限制法,但释放总没错protected override void OnStop(){foreach (var m in deviceList){m.run = false;}foreach (Thread t in this.threadPool){t.Abort();}this.threadPool.Clear();foreach (var m in deviceList){ int ret = Focas1.cnc_freelibhndl(m.Flibhndl);}deviceList.Clear();}

完成,因为代码里我加了保存到数据库,这部分已删减,能获取到数据,怎么处理都好办。如果想采集更多其它数据,可以自己查看SDK包的函数说明书,然后在Model里添加上代码

Fanuc发那科数据采集相关推荐

  1. php 发那科,FANUC发那科CNC数据采集教程连接CNC

    重要:本文最后更新于2019-07-16 08:26:19,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. 发那科系统的cnc可以通过官方的支持库接口获取cnc数据,第一步就是要连接 ...

  2. focas2 fanuc发那科数控系统数据采集刀具DNC程序管理源代码

    focas2 fanuc发那科数控系统数据采集刀具DNC程序管理源代码c# 即送fanuc开发虚拟机,无需真机调试. 直接用虚拟机可采集测试 多线程数据采集+分析(日产量.班次产量.日OEE.班次OE ...

  3. 欧姆龙PLC和FANUC发那科DeviceNet通讯

    近期在做发那科FANUC的通讯,会吧CC-LINK.Profibus-DP.Profinet I/O.DeviceNet.EtherNet/IP这些常用通讯做成文档发上来,大家喜欢的话可以关注 注:做 ...

  4. fanuc服务器显示8,FANUC发那科伺服电源报警8维修

    FANUC发那科伺服电源报警8维修,过电压故障原因:电源电压高过了允许输入电压的范围.逆变器上P.N间电压超过了规定值.电源电压太高.存在容性负载或UPS(不间断电源),使得线电压升高.未接再生放电电 ...

  5. Fanuc发那科0i-MF数控系统数据采集方法与IP地址参数设定

    以下操作以0i-MF为例: 首先找到0i-MF数控系统网口 SYSTEM按键被锁,开启方法:OFS/SET,切换到实际位置,输入3299, 搜索设备,把3299参数最后一位从1改为0:3208也从1改 ...

  6. 数控类设备数据读取数据服务接口(西门子数据采集、发那科数据采集、广数数据采集等等)数控采集适应性解决方案

    行业现状: 最近听到很多做MES.ERP这一行的叫苦, 客户对项目的要求越来越严格,做到数字化工厂都伴随着ERP.MES的项目要求必须一起做下去 然而很对MES.ERP对设备协议不懂,买了协议自己还要 ...

  7. 数控系统维修:FANUC发那科编程调试操作图解

    发那科Fanuc全系列设备维修:发那科机器人维修.发那科数控系统维修,发那科数控机床维修,发那科主板维修,发那科电路板维修,发那科控制器维修,发那科伺服电机维修. 发那科维修FANUC配件: 发那科( ...

  8. 三菱Q系列与FANUC发那科CC-LINK通讯案例

    近期在做发那科FANUC的通讯,会吧CC-LINK.Profibus-DP.Profinet I/O.DeviceNet.EtherNet/IP这些常用通讯做成文档发上来,大家喜欢的话可以关注 注:做 ...

  9. 发那科数据采集 (法兰克数据采集)

    因为项目需要用到发那科机器的一些数据,在里面踩了无数的坑,终于写好了一个可以满足目前项目需求的程序. 回想起来真是心酸都不足以形容.. 先上一个采集端的界面,界面是很丑陋,但是胜在简单.: 机器的配置 ...

最新文章

  1. 2021年大数据ELK(二十):FileBeat是如何工作的
  2. ubuntu php7 memcache,linux ubuntu下安装php memcache扩展
  3. 要获得“机器学习或数据科学”的工作,到底选哪种编程语言更好?
  4. 数据中心智慧机房解决方案
  5. idea查询类_Spring Security入门(三): 基于自定义数据库查询的认证实战
  6. 局域网内文件传输速度_详解蒲公英路由器组网 实现文件共享
  7. Android 升级到Android Studio2.2 后打不开以前版本的项目
  8. python类中包含一个特殊的变量、它表示当前对象自身_知到APP教师职场礼仪第七单元章节测试网课答案大学课后答案...
  9. 【Linux安全审计机制模块总体描述】
  10. Echarts 配置渐变
  11. IEEE Fellow、AAAS Fellow 同日公布,清华唐杰、京东郑宇等数十位华人入选
  12. IntelRealsense升级摄像头的固件版本方法
  13. 十五个AI图像放大工具
  14. Vmware 和宿主机之间的网络互通
  15. linux netcdf编译,Netcdf4安装指南
  16. 芜湖市计算机语言,2012年芜湖市小学计算机水平等级测评试卷(logo语言版)
  17. 中国工商银行网上银行新B2C在线支付接口文档下载地址
  18. Mybatis——类型处理器TypeHandler
  19. 宜信唐宁:个人投资者做好资产配置至关重要
  20. html翻译系统,如何实现网页自动翻译成终端系统的文字?

热门文章

  1. Leetcode——507. Perfect Number
  2. android 仿钢笔代码,仿ps画布钢笔抠图工具代码
  3. 大学计算机期末总结范文,大学计算机课期末总结.doc
  4. 几大实时同步工具比较
  5. 23年秋招内推推-软硬件-嵌入式
  6. QT报错:Gtk-Message:Failed to load module :gail“
  7. 任天堂超级玛丽(SuperMario)改编的超级企鹅(java)搞笑版,绝对给力
  8. 计算广告学习笔记1.2 广告的基础知识-广告的有效性模型
  9. 南京邮电大学实验报告3.3
  10. 虚拟与现实!深兰科技打造湖北首个街区数字主理人「江妮」