前面两篇重点介绍了理论,从这篇开始,我们开始进行实战。首先从发那科机床开始,为何第一个将发那科。因为发那科系统机床有三最。最广泛(中国保有量最多)、 最多资料(发那科系统的开发包历史悠久,资料也最好找,出现问题最好解决)、最简单(可能也正是因为资料多,所以学起来对简单)。
后面的介绍我会分为两部分,一部分为官方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_machine
Focas1.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));
}
#endregion
Console.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();//读PMC
int 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、处理报警时候,要注意字符集问题,注意返回长度问题。