C#调用interface与fanuc机器人通信

由于项目需要利用C#做上位机与FANUC机器人进行通讯,用的是fanuc的interface。网上相关资料比较少,摸索之后整理出这篇文章并测试通过,希望对大家有所帮助。

注意要用interface实现与fanuc机器人的通信,需要机器人已购买该功能。

自己实现的demo、参考的文档和案例、interface软件可在此下载:
下载地址

一:准备dll文件

安装fanuc的interface软件,在安装目录下找到FRRJIF.dll文件。
在这里插入图片描述

二:C#中引用

在自己的C#项目中添加引用,将上述的DLL文件添加进来。
在这里插入图片描述
添加完成之后,在 对象浏览器中可以 看到刚刚添加的DLL

在这里插入图片描述

三:DLL怎么用

这方面搜集到的资料不多,有用的包括一个英文版的interface文档和一个别人的案例,经过自己研究,目前可以完成自己的需求,下面的步骤也是基于我自己的研究和理解所写,如果有误请指出。

下面这幅图是文档中的读写数据的流程图(文档第二页),自己在写代码的时候也要按照图中的步骤来,否则会出现问题。
在这里插入图片描述

(1)定义变量

首先定义一些变量,方便使用,这里基本涵盖了我们能用到的功能

static FRRJIf.Core mobjCore;//
static FRRJIf.DataTable mobjDataTable;//数据表
static FRRJIf.DataTable mobjDataTable2;
static FRRJIf.DataCurPos mobjCurPos;
static FRRJIf.DataCurPos mobjCurPosUF;
static FRRJIf.DataCurPos mobjCurPos2;
static FRRJIf.DataTask mobjTask;
static FRRJIf.DataTask mobjTaskIgnoreMacro;
static FRRJIf.DataTask mobjTaskIgnoreKarel;
static FRRJIf.DataTask mobjTaskIgnoreMacroKarel;
static FRRJIf.DataPosReg mobjPosReg;//PR寄存器
static FRRJIf.DataPosReg mobjPosReg2;
static FRRJIf.DataPosRegXyzwpr mobjPosRegXyzwpr;
static FRRJIf.DataPosRegMG mobjPosRegMG;
static FRRJIf.DataSysVar mobjSysVarInt;
static FRRJIf.DataSysVar mobjSysVarInt2;
static FRRJIf.DataSysVar mobjSysVarReal;
static FRRJIf.DataSysVar mobjSysVarReal2;
static FRRJIf.DataSysVar mobjSysVarString;
static FRRJIf.DataSysVarPos mobjSysVarPos;
static FRRJIf.DataSysVar[] mobjSysVarIntArray;
static FRRJIf.DataNumReg mobjNumReg;
static FRRJIf.DataNumReg mobjNumReg2;
static FRRJIf.DataNumReg mobjNumReg3;
static FRRJIf.DataAlarm mobjAlarm;
static FRRJIf.DataAlarm mobjAlarmCurrent;
static FRRJIf.DataSysVar mobjVarString;
static FRRJIf.DataString mobjStrReg;
static FRRJIf.DataString mobjStrRegComment;

(2)创建CORE对象

FRRJIf.Core mobjCore = new FRRJIf.Core();

(3)创建 DATATABLE

一定要先创建datatable,后面的操作很多都是通过这个表进行的,文档中(第六页)也说了连接前先创建表。
在这里插入图片描述

FRRJIf.DataTable mobjDataTable = mobjCore.DataTable;

{
    mobjAlarm = mobjDataTable.AddAlarm(FRRJIf.FRIF_DATA_TYPE.ALARM_LIST, 5, 0);
    mobjAlarmCurrent = mobjDataTable.AddAlarm(FRRJIf.FRIF_DATA_TYPE.ALARM_CURRENT, 1, 0);
    mobjCurPos = mobjDataTable.AddCurPos(FRRJIf.FRIF_DATA_TYPE.CURPOS, 1);
    mobjCurPosUF = mobjDataTable.AddCurPosUF(FRRJIf.FRIF_DATA_TYPE.CURPOS, 1, 15);
    mobjCurPos2 = mobjDataTable.AddCurPos(FRRJIf.FRIF_DATA_TYPE.CURPOS, 2);
    mobjTask = mobjDataTable.AddTask(FRRJIf.FRIF_DATA_TYPE.TASK, 1);
    mobjTaskIgnoreMacro = mobjDataTable.AddTask(FRRJIf.FRIF_DATA_TYPE.TASK_IGNORE_MACRO, 1);
    mobjTaskIgnoreKarel = mobjDataTable.AddTask(FRRJIf.FRIF_DATA_TYPE.TASK_IGNORE_KAREL, 1);
    mobjTaskIgnoreMacroKarel = mobjDataTable.AddTask(FRRJIf.FRIF_DATA_TYPE.TASK_IGNORE_MACRO_KAREL, 1);

    //定义PR
    mobjPosReg = mobjDataTable.AddPosReg(FRRJIf.FRIF_DATA_TYPE.POSREG, 1, 1, 15);

    mobjPosReg2 = mobjDataTable.AddPosReg(FRRJIf.FRIF_DATA_TYPE.POSREG, 2, 1, 4);
    mobjSysVarInt = mobjDataTable.AddSysVar(FRRJIf.FRIF_DATA_TYPE.SYSVAR_INT, "$FAST_CLOCK");
    mobjSysVarInt2 = mobjDataTable.AddSysVar(FRRJIf.FRIF_DATA_TYPE.SYSVAR_INT, "$TIMER[10].$TIMER_VAL");
    mobjSysVarReal = mobjDataTable.AddSysVar(FRRJIf.FRIF_DATA_TYPE.SYSVAR_REAL, "$MOR_GRP[1].$CURRENT_ANG[1]");
    mobjSysVarReal2 = mobjDataTable.AddSysVar(FRRJIf.FRIF_DATA_TYPE.SYSVAR_REAL, "$DUTY_TEMP");
    mobjSysVarString = mobjDataTable.AddSysVar(FRRJIf.FRIF_DATA_TYPE.SYSVAR_STRING, "$TIMER[10].$COMMENT");
    mobjSysVarPos = mobjDataTable.AddSysVarPos(FRRJIf.FRIF_DATA_TYPE.SYSVAR_POS, "$MNUTOOL[1,1]");
    mobjVarString = mobjDataTable.AddSysVar(FRRJIf.FRIF_DATA_TYPE.SYSVAR_STRING, "$[HTTPKCL]CMDS[1]");
    mobjNumReg = mobjDataTable.AddNumReg(FRRJIf.FRIF_DATA_TYPE.NUMREG_INT, 1, 5);
    mobjNumReg2 = mobjDataTable.AddNumReg(FRRJIf.FRIF_DATA_TYPE.NUMREG_REAL, 6, 10);
    mobjPosRegXyzwpr = mobjDataTable.AddPosRegXyzwpr(FRRJIf.FRIF_DATA_TYPE.POSREG_XYZWPR, 1, 1, 10);
    mobjPosRegMG = mobjDataTable.AddPosRegMG(FRRJIf.FRIF_DATA_TYPE.POSREGMG, "C,J6", 1, 10);
    mobjStrReg = mobjDataTable.AddString(FRRJIf.FRIF_DATA_TYPE.STRREG, 1, 3);
    mobjStrRegComment = mobjDataTable.AddString(FRRJIf.FRIF_DATA_TYPE.STRREG_COMMENT, 1, 3);
   
}

valid()函数可查看datatable中添加的方法是否生效。

//是否有效
bool aa = mobjPosReg.Valid;

关于datatable中各个方法的具体使用方法可自行在文档中查阅,都大同小异,本文以读写PR寄存器为例进行介绍。
通过mobjPosReg可以读写PR寄存器。

//定义PR
mobjPosReg = mobjDataTable.AddPosReg(FRRJIf.FRIF_DATA_TYPE.POSREG, 1, 1, 15);

在这里插入图片描述
第一个参数是数据类型,第二个参数是 组号,我也没明白什么意思,这两个固定写就行,第三和第四个参数就是需要读的寄存器的开始和结束索引,比如你要读写PR[1]到PR[15]这几个寄存器,就写成1和15。

(4)连接机器人

输入机器人的IP地址(在示教器中可查看)

//连接
bool res =mobjCore.Connect("172.16.1.1");

网线连接机器人和PC,修改PCIP地址
在这里插入图片描述
测试是否通讯成功,通讯成功会返回 true

(5)读写PR寄存器

操作前一定先更新datatable,否则会失败。

//使用前先刷新
bool blnDT = mobjDataTable.Refresh();

接下来就可以读写寄存器了,不同类型的寄存器的读写略有不同,文档中都有说明。
用mobjPosReg进行PR寄存器的读写操作。
在读写之前,需要先定义一下一些需要的参数,

Array xyzwpr = new float[9];
Array config = new short[7];
Array joint = new float[9];
short intUF = 0;
short intUT = 0;
short intValidC = 0;
short intValidJ = 0;

xyzwpr不用多说,其他参数文档13、14页有对这些参数的详细解释,
读PR寄存器:
这里以读PR[6]为例,想要读其他寄存器更改第一个参数即可,需要注意的是这个数值只能介于中(3)中定义的索引之间,比如上文我定义的是1-15,那么这里我可以读写1-15之间的寄存器。

bool res_r =  mobjPosReg.GetValue(6, ref xyzwpr,ref config, ref joint,ref  intUF, ref intUT, ref intValidC, ref intValidJ);

这里要注意ref不要忘记加,否则虽然可以返回true,但是不能成功接收到值。

写PR寄存器:

//写PR11
bool res_w = mobjPosReg.SetValueXyzwpr(11, ref xyzwpr, ref config,-1,-1);

也没什么好说的,

(6)读写I/O

读写IO应该不用datatable,用Core就可以。

//读取SDI
Array intSDI = new short[10];
bool blnSDI = mobjCore.ReadSDI(1, ref intSDI, 10);

其他的也都大同小异

  • 12
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值