一,概述
前面介绍过,发那科CNC数据采集一般有两种方法:

(1)通过FOCAS 1/2 开发包进行二次开发采集数据(仅适用于windows系统)

(2)通过纯TCP协议方法。该方法不局限于CPU架构(x86、ARM、MIPS等等),不局限操作系统(Windows、Linux、FreeRTOS、RT-Thread、μC/OS、裸机等等均可),不局限编程语言(Java、Python、C/C++、C#、Go等等均可)。

下面对两种方法都进行相应介绍。

PS:建议直接用纯协议方式。比如产品使用ARM Cortex-M,可以做到非常高的性价比。也可以方便集成到软件平台里,欢迎交流扣扣17082750

二,FOCAS 1/2 开发包方式
1,使用SDK的Demo源码可以从下面地址下载

发那科CNCSDKDemo源码,Focas1_2SDKDemosourcecode,,C#-C#文档类资源-CSDN下载

主要的库是Fwlib32.dll以及fwlib1.dll。

(1)Fwlib32.dll是负责和fanuc通讯的组件,用来对客户端发送的数据进行转义加密再和数控系统通讯。

(2)fwlib32.dll是核心的函数操作库,封装了各类数据读取函数。

所以,采集程序是对fwlib32.dll进行函数调用,fwlib32.dll再将数据通过Fwlib32.dll库和数控系统进TCP通讯,数控系统响应数据返回给Fwlib21.dll,Fwlib21.dll再将数据返回给fwlib32.dll进行解析,最终反馈采集程序。

2,撸代码

namespace FANUC
{
    public partial class control_axis : Form
    {
        public control_axis()
        {
            InitializeComponent();
        }
        Fanuc.ODBPOS fos = new Focas1.ODBPOS();
        private void duqu_position_rel_info()//读取相对的位置信息
        {
            short num = Fanuc.MAX_AXIS;
            short type = -1; ;
            short ret = Fanuc.cnc_rdposition(Fanuc.h, type, ref num, fos);
            if (ret == 0)
            {
                listBox1.Items.Add(fos.p1.rel.name.ToString() + ":  " + fos.p1.rel.data * Math.Pow(10, -fos.p1.rel.dec));
                listBox1.Items.Add(fos.p2.rel.name.ToString() + ":  " + fos.p2.rel.data * Math.Pow(10, -fos.p2.rel.dec));
                listBox1.Items.Add(fos.p3.rel.name.ToString() + ":  " + fos.p3.rel.data * Math.Pow(10, -fos.p3.rel.dec));
                listBox2.Items.Add(fos.p1.dist.name.ToString() + ":  " + fos.p1.dist.data * Math.Pow(10, -fos.p1.dist.dec));
                listBox2.Items.Add(fos.p2.dist.name.ToString() + ":  " + fos.p2.dist.data * Math.Pow(10, -fos.p2.dist.dec));
                listBox2.Items.Add(fos.p3.dist.name.ToString() + ":  " + fos.p3.dist.data * Math.Pow(10, -fos.p3.dist.dec));
            }
        }
        public void duqu_position_ab_info()//获取绝对位置信息
        {
            short num = Fanuc.MAX_AXIS;
            short type = -1; ;
            short ret = Fanuc.cnc_rdposition(Fanuc.h, type, ref num, fos);
            if (ret == 0)
            {
                listBox8.Items.Add(fos.p1.abs.name.ToString() + ":  " + fos.p1.abs.data * Math.Pow(10, -fos.p1.abs.dec));
                listBox8.Items.Add(fos.p2.abs.name.ToString() + ":  " + fos.p2.abs.data * Math.Pow(10, -fos.p2.abs.dec));
                listBox8.Items.Add(fos.p3.abs.name.ToString() + ":  " + fos.p3.abs.data * Math.Pow(10, -fos.p3.abs.dec));
                listBox7.Items.Add(fos.p1.dist.name.ToString() + ":  " + fos.p1.dist.data * Math.Pow(10, -fos.p1.dist.dec));
                listBox7.Items.Add(fos.p2.dist.name.ToString() + ":  " + fos.p2.dist.data * Math.Pow(10, -fos.p2.dist.dec));
                listBox7.Items.Add(fos.p3.dist.name.ToString() + ":  " + fos.p3.dist.data * Math.Pow(10, -fos.p3.dist.dec));
            }
 
 
        }
        public void get_postion()//获取位置信息
        {
            listBox3.Items.Clear();
            listBox4.Items.Clear();
            listBox5.Items.Clear();
            listBox6.Items.Clear();
            short num = Fanuc.MAX_AXIS;
            short type = -1;
            short ret = Fanuc.cnc_rdposition(Fanuc.h, type, ref num, fos);
            if (ret == 0)
            {
                //绝对
                listBox3.Items.Add(fos.p1.abs.name.ToString() + ":  " + fos.p1.abs.data * Math.Pow(10, -fos.p1.abs.dec));
                listBox3.Items.Add(fos.p2.abs.name.ToString() + ":  " + fos.p2.abs.data * Math.Pow(10, -fos.p2.abs.dec));
                listBox3.Items.Add(fos.p3.abs.name.ToString() + ":  " + fos.p3.abs.data * Math.Pow(10, -fos.p3.abs.dec));
                listBox3.Items.Add(fos.p4.abs.name.ToString() + ":  " + fos.p4.abs.data * Math.Pow(10, -fos.p3.abs.dec));
                listBox3.Items.Add(fos.p5.abs.name.ToString() + ":  " + fos.p5.abs.data * Math.Pow(10, -fos.p5.abs.dec));
                //相对
                listBox4.Items.Add(fos.p1.rel.name.ToString() + ":  " + fos.p1.rel.data * Math.Pow(10, -fos.p1.rel.dec));
                listBox4.Items.Add(fos.p2.rel.name.ToString() + ":  " + fos.p2.rel.data * Math.Pow(10, -fos.p2.rel.dec));
                listBox4.Items.Add(fos.p3.rel.name.ToString() + ":  " + fos.p3.rel.data * Math.Pow(10, -fos.p3.rel.dec));
                listBox4.Items.Add(fos.p4.rel.name.ToString() + ":  " + fos.p4.rel.data * Math.Pow(10, -fos.p4.rel.dec));
                listBox4.Items.Add(fos.p5.rel.name.ToString() + ":  " + fos.p5.rel.data * Math.Pow(10, -fos.p5.rel.dec));
                //机器
                listBox5.Items.Add(fos.p1.mach.name.ToString() + ":  " + fos.p1.mach.data * Math.Pow(10, -fos.p1.mach.dec));
                listBox5.Items.Add(fos.p2.mach.name.ToString() + ":  " + fos.p2.mach.data * Math.Pow(10, -fos.p2.mach.dec));
                listBox5.Items.Add(fos.p3.mach.name.ToString() + ":  " + fos.p3.mach.data * Math.Pow(10, -fos.p3.mach.dec));
                listBox5.Items.Add(fos.p4.mach.name.ToString() + ":  " + fos.p4.mach.data * Math.Pow(10, -fos.p4.mach.dec));
                listBox5.Items.Add(fos.p5.mach.name.ToString() + ":  " + fos.p5.mach.data * Math.Pow(10, -fos.p5.mach.dec));
                //距离
                listBox6.Items.Add(fos.p1.dist.name.ToString() + ":  " + fos.p1.dist.data * Math.Pow(10, -fos.p1.dist.dec));
                listBox6.Items.Add(fos.p2.dist.name.ToString() + ":  " + fos.p2.dist.data * Math.Pow(10, -fos.p2.dist.dec));
                listBox6.Items.Add(fos.p3.dist.name.ToString() + ":  " + fos.p3.dist.data * Math.Pow(10, -fos.p3.dist.dec));
                listBox6.Items.Add(fos.p4.dist.name.ToString() + ":  " + fos.p3.dist.data * Math.Pow(10, -fos.p4.dist.dec));
                listBox6.Items.Add(fos.p5.dist.name.ToString() + ":  " + fos.p5.dist.data * Math.Pow(10, -fos.p5.dist.dec));
 
            }
        }
        Fanuc.ODBACT pindle = new Focas1.ODBACT();
        public void get_pindle()//获取主轴的速度
        {
            short ret = Fanuc.cnc_acts(Fanuc.h, pindle);
            if (ret == 0)
            {
                label5.Text = pindle.data.ToString();
            }
            else
            {
                MessageBox.Show(ret+"");
            }
        }
        Fanuc.ODBSVLOAD sv = new Focas1.ODBSVLOAD();
        Fanuc.ODBSPLOAD sp = new Focas1.ODBSPLOAD();
        public void get_load()//主,伺服轴的加载计//测试成功
        {
            short a = 6;//伺服轴的数量
            short ret = Fanuc.cnc_rdsvmeter(Fanuc.h, ref a, sv);
            short type = Convert.ToInt16(textBox1.Text);//1朱轴压力,-1俩者都有,0主轴监控速度表
            short ret2 = Fanuc.cnc_rdspmeter(Fanuc.h, type, ref a, sp);
            if (ret == 0 && ret2 == 0)
            {
                listBox9.Items.Add("伺服的加载值:" + sv.svload1.data + "  " + sv.svload2.data + "  " + sv.svload3.data + " ");
                listBox9.Items.Add("主轴的加载值:" + sp.spload1.spload.data);
            }
            else
                MessageBox.Show(ret+"");
        }
    }
}

三,协议方式
//读轴相关的坐标
void CMDC_FANUCDlg::F_READ_AXIS()
{
    
    int block_sum = 4;
    int len = 0; 
    union{
        unsigned char d_byte[2];
        int dat;
    }i_d;
 
    unsigned char p_send[] =
    {
        0x**,0x**,0x**,0x**,   //HEAD
        0x**,0x**,0x**,0x**,   //READ DATA
        0x00,len,              //length
        0x00,block_sum,        //发送的数据块个数
 
        //1.机械坐标
        0x00,0x1c,0x00,0x01,
        0x00,0x01,0x00,0x26,     //ID
        0x00,0x00,0x00,0x01,     //起始地址=1  机械坐标,4,ABS  6 REAL  7 DISTANCE      
        0xff,0xff,0xff,0xff,                            
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        //2.ABS
        0x00,0x1c,0x00,0x01,
        0x00,0x01,0x00,0x26,     //ID
        0x00,0x00,0x00,0x04,     //起始地址=1  机械坐标,4,ABS  6 REAL  7 DISTANCE      
        0xff,0xff,0xff,0xff,                            
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        //3.REAL
        0x00,0x1c,0x00,0x01,
        0x00,0x01,0x00,0x26,     //ID
        0x00,0x00,0x00,0x06,     //起始地址=1  机械坐标,4,ABS  6 REAL  7 DISTANCE      
        0xff,0xff,0xff,0xff,                            
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        //4.DISTANC
        0x00,0x1c,0x00,0x01,
        0x00,0x01,0x00,0x26,     //ID
        0x00,0x00,0x00,0x07,     //起始地址=1  机械坐标,4,ABS  6 REAL  7 DISTANCE      
        0xff,0xff,0xff,0xff,                            
        0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
    };
    //调整数据长度
    len = 28 * block_sum + 2;
    i_d.dat = len;
    p_send[8] = i_d.d_byte[1];
    p_send[9] = i_d.d_byte[0];
 
    READ_GROUP = 3;//用于设备返回时候判断是哪个函数发出的数据返回
    Send_Message(0, p_send, len+10);   
}

从上面代码可以看出,不再需要调用官方的库文件,直接填充send buffer,通过TCP连接发送出去即可,所以适用性非常强。

四,机台IP设置
可以参考下面链接

发那科(Fanuc)CNC IP地址与FOCAS端口设置 | 巫迪科技

五,现场问题
1、能ping通但不能够访问到端口
(1)检查设备端的端口是否配置正确。
(2)检查机台IP是否被其他网络设备占用。
(3)检查是否网口插错,有些机器有两个网卡。不同网卡的配置界面还非常相似。

2、没有网口

(1)有网口配置界面,但是没有网卡的MAC地址,这类就是无自带网口,但可以通过PCMCIA网卡进行扩展。

(2)找不到网口的配置界面。这类一般是厂家限制了功能,想要重新把界面搞出来,非常麻烦。建议采集I/O。

(3)网卡选择错误。在配置网卡的时候可以选择,使用机台自带网口需要选择内置有效,选择PCMCIA有效就是使用PCMCIA扩展网口。

3、PCMCIA网卡丢包

国内做这个卡的就那么两家,用过其中一家,用某些交换机不会出现丢包,用其他交换机会出现严重丢包。
————————————————
版权声明:本文为CSDN博主「CNC注塑机PLC专业数采」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q22837656/article/details/124131978

发那科 / 法兰克(Fanuc)CNC数据采集相关推荐

  1. Fanuc发那科法兰克数据采集实战c#——CNC数控系统数据采集、西门子免授权数据采集方案

    上篇文章讲述了Fanuc数据采集的必备库的说明以及调用方式,此片文章开始真正的实战操作 首先看下上图,所有的公开函数都会有一个 FlibHndl参数,次参数的含义为大家解释: 开发者开发客户端程序和F ...

  2. c# Fanuc发那科 法兰克 数据采集 提供源码 支持程序上传下载 Fanuc 免授权数据采集

    FANUC 是日本一家专门研究数控系统的公司,成立于1956年.是世界上最大的专业数控系统生产厂家,占据了全球70%的市场份额.FANUC于1959年首先推出了电液步进电机,在后来的若干年中逐步发展并 ...

  3. Fanuc发那科法兰克数据采集入门一

    从我的上一篇文章,提到了fanuc各类系统的含义.可采集的数据点,下面直接开始进行入门 ①必备组件: 首先Fanuc有开源的库,我们通过调用库进行和fanuc数控系统进行通讯,分别是Fwlib32.d ...

  4. Fanuc发那科法兰克数控系统采集初探c#

    Fanuc数控系统初探 FANUC 是日本一家专门研究数控系统的公司,成立于1956年.是世界上最大的专业数控系统生产厂家,占据了全球70%的市场份额.FANUC于1959年首先推出了电液步进电机,在 ...

  5. 发那科法兰克加工中心FANUC 0MD 操作面板讲解,看看这些按键是什么意思

    在"视图"下拉菜单或者浮动菜单中选择"控制面板切换"后,数控系统操作键盘会出现在视窗的右上角,其左侧为数控系统显示屏,如下图所示.用操作键盘结合显示屏可以进行数 ...

  6. 法兰克FANUC加工中心三点圆分中宏程序

    法兰克FANUC加工中心三点圆分中宏程序,在工厂使用多年,验证了宏程序的可靠性,此宏程序可以提高对刀速度,提高工作效率. ID:5115676648761157刚哥

  7. c++ fanuc cnc数据采集踩过坑

    最近开始搞FANUC CNC数据采集,从领导布置下来这个任务到完成大约花了1个月的时间,每天不是在找API的路上,就是在定位获取不到数据的路上.后来想想主要归纳下主要还是机床不太了解造成的. 1.上来 ...

  8. 法拉科机器人接头_【发那科】图解FANUC机器人I/O信号板

    以下是关于发那科机器人I/O信号板的详细解析.I/O信号JA板(A16B-2204-0010) 1.1  JA信号板主要接口定义 1.2    红色故障灯LED含义 1.3    连接方框图 2.   ...

  9. 法兰克FANUC自动分中,自动分中仪

    法兰克系统实现自动分中功能,需要加装一套雷尼绍探头(二手雷尼绍探头同样有很多客户选择). 机床探头自动分中的原理:以立方料为例,调用自动分中宏程序,使红宝石测针触碰工件,获取该点的工件坐标系坐标,同样 ...

最新文章

  1. VMware Workstation 9下基于Ubuntu 12.10服务器版本的Hadoop集群的配置
  2. 洛谷 U5122 T2-power of 2(费马小定理)
  3. Java连接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash
  4. 修改了系统时间后,myeclipse 和tomcat下的代码不同步了
  5. 【cropper】介绍:JavaScript图片裁切
  6. php日期提示警告,php程序报date()警告的处理的解决方法
  7. 验证身份证合法性的js
  8. Nginx 的常用命令
  9. TCP-IP协议栈概略图与TCP三次握手四次挥手
  10. OpenShift 4之设置用户/组对项目的访问权限
  11. python使用PIL把透明背景图片转成白色背景
  12. 模块EMERSONDELTAVSLS1508/本特利330400-02-CN
  13. RK3228开发之gc2145芯片手册分析
  14. 分布式架构——Gossip 协议详解
  15. linux 挂载nas网络存储_Linux挂载NAS
  16. 帝国CMS7.2重置后台密码
  17. 建立个人的腾讯云服务器
  18. PyCharm如何自定义调整字体大小的快捷键
  19. 华为手机连电脑当摄像头用_今天才知道,华为手机摄像头还能这样用!还不会用你买什么华为?...
  20. 这款国产工具,让我电脑里的PS、XD都落灰了

热门文章

  1. 用Python帮老哥选出好基金,稳赚一笔,老哥专门提着茅台登门拜访
  2. 夜光:Opentcs 边的路径约束
  3. 淼一回收丨二手笔记本电脑回收需要注意三大问题,防坑必看!
  4. 面试问题系列:HR面试和压力面试(续)
  5. SketchUp:SketchUp草图大师软件简介、安装、使用方法之详细攻略
  6. 三星9500android 8.0,三星note 8 高通835 N9500(国行、港行),8.0的安卓版本,可以自行安装xposed框架...
  7. Android解决分屏情况下背景拉伸问题
  8. 干燥机是什么,作用是?
  9. Vue中监听页面刷新和关闭beforeunload事件
  10. Marketing on Twitter 在Twitter上推销 Lynda课程中文字幕