马上即将毕业了,就自己在学校做的项目中包含有几种主流数控系统需要进行数据采集,总结一下之前的一些经验和开发工作,也希望后面再做相关技术研究的时候少踩点坑,同时也算是一个阶段的总结吧,毕竟马上要从事一个与这个行业不太相关的领域了,记录一下,以后翻翻还能记起以前做过什么。
1.1 Fanuc数控系统机床数据采集方法
以下介绍的为带有以太网接口的Fanuc数控系统的数据采集方法,如果不带有以太网接口,需要采用串口通讯进行采集。
1.1.1 FOCAS简介和基本功能
采集Fanuc系列的机床数据,我们需要用到FOCAS1/2开发包,FOCAS是FANUC Open CNC API Specifications version 1 or 2的缩写,FOCAS1主要应用于0i和16i/18i/21i/系列,FOCAS2则针对30i/31i/32i系列CNC。
CNC/PMC数据窗口功能可以通过HSSB或以太网(TCP/IP)接口在PC和CNC之间完成交换数据和信息共享,他的主要功能包括以下几部分:
1:CNC:NC控制的伺服轴、主轴相关数据的读写。
包括绝对坐标、相对坐标、机床坐标、剩余移动量以及实际进给速度等。
2:CNC:加工程序的相关操作。
这些操作包括NC程序的上传/下载、程序校检、查找以及删除。读取CNC程序目录以及通过电脑实现CNC加工。
3:CNC:读写CNC文件数据。
这些数据包括刀具偏置、工件坐标系偏置、参数、设定、用户宏程序变量、P-Code宏程序变量以及螺距误差补偿数值。
4:CNC:读写刀具寿命管理信息。
5:CNC:读取历史信息记录。
这些信息包括操作历史记录和报警历史记录。
6:CNC:读取伺服、主轴数据。
7:CNC:读写数据服务器、DNC1、DNC2、OSI-Ethernet(只能使用HSSB)相关信息。
8:CNC:读写波形诊断数据。
9:CNC:读写冲床CNC数据。
10:CNC:读写激光器CNC数据。
11:CNC:读写伺服学习控制相关数据(只能使用HSSB)。
12:CNC:读写其他数据。
13:PMC:读写PMC相关数据。
这些数据包括G、F、Y、X、A、R、T、C、D地址等。
14:PMC:读写PROFIBUS-DP相关内容。
1.1.2使用以太网方式连接的相关设定
FOCAS 通过以太网方式连接电脑和 CNC 系统时,使用 TCP/IP 通讯协议。在 CNC 上通常使用 FANUC 以太网板,或者 FANUC 快速以太网板。对于 16i/18i/21i 系列或者 30i/31i/32i系列,还可以使用内嵌以太网功能。
使用 FOCAS 通讯时,可以按照以下步骤进行设定:
- 设定电脑 ip,网上邻居 -> 本地连接 -> Internet 协议(TCP/IP)。
2. 在 CNC 上设定以太网功能或者内嵌以太网功能相关参数,MDI 上 system 键 ->“向右” 扩展键 -> “ETHPRM”软键 -> “(操作)”软键 -> “板卡”软键
在这个画面设定端口号(TCP)8193,时间间隔10。
3 . 使用网线连接电脑和 CNC。一般使用交叉线,如果通过集线器、交换机等设备,则使用直通线。
1.1.3详细开发流程
- 准备工作:FOCAS2开发包(包含Fwlib32.dll等需要用到的dll);
VisualStudio 2017;
FOCAS说明文档(所有机床相关数据函数调用方法 )
FOCAS_Api_Help;(以XML文件形式提供一些接口上的帮助)
2、开发流程
(1)连接方式:采用以太网连接,实验采用的CNC的IP地址为192.168.0.1,端口号为8193,PC侧IP只要配在同一个局域网即可,实验用的PC机的IP为192.168.0.10。IP的配置方法这里不再赘述。
(2)PC端工程搭建操作:使用visual studio 2017新建一个C# Windows窗体应用程序,如下图:
然后进入工程文件,部署FOCAS文件,如下图所示:
如上图所示,首先将将fwlib32.cs文件添加至工程文件,该文件在FOCAS2_Libraries\Fwlib\Dot NET sample路径下。然后在你新建的项目的bin\Debug目录下将要用到的动态链接库全部考进去。如下图所示,所用到的dll在FOCAS2_Libraries下的Fwlib文件夹中,直接全部拷到工程目录下即可。
做完以上的所有准备工作后就可以正式开始开发了。
3、API函数的使用方法:API具体的函数调用方法可以参见FOCAS说明文档,如下图所示:
这里只对一些常用的API函数进行介绍。
与CNC建立连接:参考FOCAS说明文档中的Function related to library handle, node文件夹中的Function Reference related to library handle, node_cnc_allclibhndl3.doc.在测试与机床连接函数时,要首先建立机床与PC机的物理连接,保证他们之间能够ping通,具体方法这里不再赘述。参考代码如下:
private void btnConc_Click(object sender, EventArgs e)
{
string ip = txtIp.Text;
string port = txtPort.Text;
string timeout = txtTimeOut.Text;
int ret = Fanuc.cnc_allclibhndl3(ip, Convert.ToUInt16(port), Convert.ToInt32(timeout), out Fanuc.h);
if (ret == Fanuc.EW_OK)
{
//“函数方法””
}
与CNC断开连接:参考FOCAS说明文档中的Function related to library handle, node文件夹中的Function Reference related to library handle, node_cnc_freelibhndl.doc,具体代码如下:
private void btnDisConn_Click(object sender, EventArgs e)
{
int ret = Fanuc.cnc_freelibhndl(Fanuc.h);
if (ret == Fanuc.EW_OK)
{
MessageBox.Show(“与机床断开连接”);
}
else
{
MessageBox.Show(ret + "");
}
}
采集坐标信息:我们需要参考FOCAS说明文档:
FANUC related to controlled axis&spindle_cnc_absolute.doc;
Function related to controlled axis&spindle_cnc_relative.doc;
Function related to controlled axis&spindle_cnc_machine.doc;
他们分别是机床的绝对坐标,相对坐标和机床坐标。以下为本人自己写的获取位置坐标信息的函数,可供参考。
Fanuc.ODBPOS fos = new Focas1.ODBPOS();
public void get_postion()//获取位置信息
{
short num = Fanuc.MAX_AXIS;
short type = -1;
short ret = Fanuc.cnc_rdposition(Fanuc.h, type, ref num, fos);
if (ret == 0)
{
//相对坐标
label12.Text = fos.p1.rel.name.ToString();
label13.Text = fos.p2.rel.name.ToString();
//label14.Text = fos.p3.rel.name.ToString();
label15.Text = fos.p4.rel.name.ToString();
label16.Text = fos.p5.rel.name.ToString();
X_Relative.Text = Convert.ToString(fos.p1.rel.data * Math.Pow(10, -fos.p1.rel.dec));
Z_Relative.Text = Convert.ToString(fos.p2.rel.data * Math.Pow(10, -fos.p2.rel.dec));
//textBox10.Text = Convert.ToString(fos.p3.rel.data * Math.Pow(10, -fos.p3.rel.dec));
C_Relative.Text = Convert.ToString(fos.p4.rel.data * Math.Pow(10, -fos.p4.rel.dec));
V_Relative.Text = Convert.ToString(fos.p5.rel.data * Math.Pow(10, -fos.p5.rel.dec));
//绝对坐标
label21.Text = fos.p1.abs.name.ToString();
label20.Text = fos.p2.abs.name.ToString();
label18.Text = fos.p4.abs.name.ToString();
label17.Text = fos.p5.abs.name.ToString();
X_Absolute.Text = Convert.ToString(fos.p1.abs.data * Math.Pow(10, -fos.p1.abs.dec));
Z_Absolute.Text = Convert.ToString(fos.p2.abs.data * Math.Pow(10, -fos.p2.abs.dec));
C_Absolute.Text = Convert.ToString(fos.p4.abs.data * Math.Pow(10, -fos.p4.abs.dec));
V_Absolute.Text = Convert.ToString(fos.p5.abs.data * Math.Pow(10, -fos.p5.abs.dec));
//机器坐标
label26.Text = fos.p1.mach.name.ToString();
label25.Text = fos.p2.mach.name.ToString();
//label24.Text = fos.p3.mach.name.ToString();
label23.Text &