概述
由于项目需要利用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);
其他的也都大同小异
最后
以上就是幸福招牌为你收集整理的C#调用interface与fanuc机器人通信的全部内容,希望文章能够帮你解决C#调用interface与fanuc机器人通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复