前面两篇重点介绍了理论,从这篇开始,我们开始进行实战。首先从发那科机床开始,为何第一个将发那科。因为发那科系统机床有三最。最广泛(中国保有量最多)、 最多资料(发那科系统的开发包历史悠久,资料也最好找,出现问题最好解决)、最简单(可能也正是因为资料多,所以学起来对简单)。
后面的介绍我会分为两部分,一部分为官方SDK介绍,一部分为专有协议采集介绍。照理说直接介绍专有协议采集就行了,为啥要介绍官方SDK。因为官方SDK就是我们后续抓包的标本啊,我们后续需要采集什么样的数据,最保险的方式,就是通过官方SDK将这个数据采集出来,然后查看数据包格式进行解析。市面上有公司或者同行,上来不管SDK,直接用专有协议采集,这样只会本末倒置,出现问题自己也解决不了,想新增加采集数据也解决不了,只能干瞪眼。所以不论是学习还是做产品,要步步为营,先将官方SDK搞懂(当然后面也会出现没有官方SDK包的情况,到时候我再告诉大家具体怎么处理)。
一、通过官方SDK采集数据
1、Focas 简介
首先Focas是发那科机床联网SDK的名称。其中包含了:连接说明、使用说明、常见问题。从官方文档上看,1996年应该就有这个SDK了。这点还是比较佩服发那科系统的,在30年前就能有这个意识。
2、资料使用
拿到资料后,有以下几个文件夹:
第一个文件夹是库文件,为后面我们我们要讲库拷贝到我们的项目,项目运行必备。
SpecE这个文件夹是官方的说明文档,后面我们要靠它来调试程序,英文。c++ 程序调试必备
TSUB-E034_v1.0 FOCAS说明文档,这个文件夹可以当做c#的辅助参考,全中文汉字。c# 调试必备
对于每个文件的详细介绍可以看这个文档Focas 2\08_A02B-0207-K737 v4.0_FOCAS1_2 Libraries\A02B-0207-K737 (F)\README.TXT,下面我挑重点的讲,如何进行项目调试。
a.调试c++ 项目
因为c++的程序都是有官方的示例,所以先要搞懂官方的说明文档。Focas+2\Focas 2\SpecE\FWLIB32.HTM,用浏览器打开这个HTML(注意这里要用微软官方的IE浏览器,不能用谷歌或者火狐内核的浏览器)。
打开后选择机床对应的连接方式(连接方式选择网口接口)和型号(按照采集系统选择)。
点击功能参考
你可以发现很多功能,其中能进一步点击进去的,就代表该系统支持这个功能。
我们点击cnc_actf就可以看到具体的c++代码和说明,包含:声明、描述、返回值、适用于的操作模式,示例代码等等。这些都是对你调试采集至关重要的。
c++项目需要导入的库文件:
给大家个示例参考
官方的说明:
* 64 bit version FOCAS2 library.
< FWLIB64.DLL >
This is a library of data exchange functions between CNC/PMC and HSSB
and Ethernet system.
This is a dynamic link library, which is required at run-time of HSSB
and Ethernet system.
< FWLIBE64.DLL >
This is the DLL for TCP/IP, which is called by FWLIB64.DLL at run-time.
< FWLIB30i64.DLL >
This is the DLL for FS30i/31i/32i/35i and PMi-A, which is called by
FWLIB64.DLL at run-time.
< FWLIB0iD64.DLL >
This is the DLL for FS0i-D, which is called by FWLIB64.DLL at run-time.
< FWLIBNCG64.DLL >
This is the DLL for FOCAS2/HSSB of FS31i-A/B NCGuidePro, which is
called by FWLIB64.DLL at run-time.
< FWLIB0DN64.DLL >
This is the DLL for FOCAS2/HSSB of FS0i-D NCGuidePro, which is called
by FWLIB64.DLL at run-time.
< FWLIB64.LIB >
The import library to link with CNC/PMC Data window library
(FWLIB64.DLL) in C/C++ language.
< FWLIB64.H >
C/C++ header file for CNC/PMC Data window functions and structures.
This file is divided for each CNC model.
b.调试c#项目
如果你想用c#去调试你的采集,那么会简单的多,因为官方给我们做好了示例程序,并且说明都是汉语的。举个例子:
c#项目需要导入的库文件:
初学者不会引用以来的话,看下这篇文章:
https://www.cnblogs.com/snail1502/p/18068966
3、示例工程代码
c#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Test
{class Program{static void Main(string[] args){// 获取库句柄 ( Ethernet ) 并进行连接ushort Flibhndl = 0;short ret = Focas1.cnc_allclibhndl3("10.178.67.13", 8193, 10, out Flibhndl);if (ret != Focas1.EW_OK){Console.WriteLine("发生异常,请检查!");return;}#region cnc_machineFocas1.ODBAXIS odbaxis = new Focas1.ODBAXIS(); for (short i = 0; i < 3; i++){ret = Focas1.cnc_machine(Flibhndl, (short)(i + 1), 8, odbaxis);Console.WriteLine(odbaxis.data[0]*Math.Pow(10,-4));}#endregionConsole.Write("read values");Console.Read();}}}
c++代码
#include "stdafx.h"
#include "Fwlib64.h"unsigned short h;int _tmain(int argc, _TCHAR* argv[])
{int status();int rddynamic();int rdopnlsgnl();int exeprgname2();int rdspmeter();int getdtailerr();//int rdmovrlap();int rdaxisdata();int rdloopgain();//int rdproginfo();int rdproctime();int modal();int rdopmsg();int rdpm_item();//int rdcommand();int rdprogdir4();int rdproginfo();int exeprgname2();int rdblkcount();int pmcrdpmcrng();//读PMCint cncsysinfo();//读系统信息int cncrdparainfo();int cncrdparam();int cncrdmain();status();rddynamic();rdopnlsgnl();//exeprgname2();rdspmeter();getdtailerr();//rdmovrlap();rdaxisdata();/*rdloopgain();*///rdproginfo();rdproctime();modal();rdopmsg();//rdcommand();rdpm_item();rdprogdir4();rdproginfo();exeprgname2();rdblkcount();pmcrdpmcrng();cncsysinfo();cncrdparainfo();cncrdparam();cncrdmain(); //读cnc主程序名//ODBSPLOAD sp[4]; /* 4 = maximum spinlde number */// short num = 4;// short reta = cnc_rdspmeter(h, 0, &num, sp);// if(!reta) {// int i;// for(i = 0 ; i < num ; i++) {// printf("%c%c = %d\n", // sp[i].spload.name, sp[i].spload.suff1,// sp[i].spload.data);// }// }//int MAX = 4;//struct odbdy2 buf2 ;// unsigned int idx ;// cnc_rddynamic2( h, -1, sizeof(buf2), &buf2 ) ;// printf( "Current program = %d Main program = %d\n",buf2.prgmnum, buf2.prgmnum ) ;// printf( "Sequence number = %ld\n", buf2.seqnum ) ;// printf( "actf = %ld acts = %ld\n", buf2.actf, buf2.acts ) ;// printf( "Alarm status = %ld\n", buf.alarm ) ;// printf( "AXIS Absolute Relative Machine Distance\n" ) ;// printf( "----+---------+---------+---------+--------\n" ) ;// for ( idx = 0 ; idx < MAX ; idx++ )// printf( " %u %8ld %8ld %8ld %8ld\n", idx,// buf2.pos.faxis.absolute[idx],// buf2.pos.faxis.relative[idx],// buf2.pos.faxis.machine[idx],// buf2.pos.faxis.distance[idx] ) ;return 0;
}
发那科的功能和参数非常多,前期千万别贪多求全。从自己业务需要的函数调起来,配合虚拟机系统或者真机进行调试。
二、通过专有协议采集需要注意的要点
1、采用TCP主从收发的模式。
2、有连接包,再未发送连接包前,发送其他值不会被接受。
3、不同系统,在不同参数上,发送的数据包略有不同。
4、处理报警时候,要注意字符集问题,注意返回长度问题。