前言
本文调用RobotStudio所提供的库文件通过PCP/IP直接访问控制ABB机器人(需要开通模块616-1 PC interface支持)。
一、RobotStudio是什么?
RobotStudio 是一款 PC 应用程序,用于机器人单元的建模、离线创建和仿真。
RobotStudio 允许您使用离线控制器,即在您 PC 上本地运行的虚拟 IRC5 控制器。这种离线控制器也被称为虚拟控制器 (VC)。RobotStudio 还允许您使用真实的物理 IRC5 控制器(简称为“真实控制器”)。
。
一、使用步骤
1.引入库
项目引用添加如下
using ABB.Robotics.Controllers;
using ABB.Robotics.Controllers.Discovery;
using ABB.Robotics.Controllers.EventLogDomain;
using ABB.Robotics.Controllers.FileSystemDomain;
using ABB.Robotics.Controllers.IOSystemDomain;
using ABB.Robotics.Controllers.MotionDomain;
using ABB.Robotics.Controllers.RapidDomain;
2.扫描ABB控制器
public static ControllerInfoCollection Scan(NetworkScanner scanner)
{
scanner.Scan(); //扫描控制器
ControllerInfoCollection controllers = scanner.Controllers; //获取扫描到的控制器集合
networkWatcher = new NetworkWatcher(controllers);
//networkWatcher.Found += NetworkWatcher_Found;
networkWatcher.Lost += NetworkWatcher_Lost;
networkWatcher.EnableRaisingEvents = true;
return controllers;
}
3.连接控制器
public static bool Connect(ControllerInfoCollection controllers, ref Controller controller)
{
bool flag = false;
try
{
foreach (ControllerInfo controllerInfo in controllers)
{
if (controllerInfo.Availability == Availability.Available)
{
//if (controller != null)
//{
// DisConnect(controller);
// flag = false;
//}
//else
//{
controller = Controller.Connect(controllerInfo, ConnectionType.Standalone); //连接控制器
controller.Logon(UserInfo.DefaultUser); //以DefaultUser登录
flag = true;
//}
}
else
{
flag = false;
}
}
return flag;
}
catch
{
return false;
}
}
4 断开控制器的连接
public static void DisConnect(Controller controller)
{
controller.Logoff();
controller.Dispose();
controller = null;
}
5 获取权限
public static bool GetRoot(Controller controller)
{
try
{
mastership = Mastership.Request(controller);
return mastership.IsMaster;
}
catch (Exception ex)
{
return false;
}
}
6.释放权限
public static void DisposeRoot(Mastership mastership)
{
if (mastership != null && mastership.IsMaster)
mastership.Dispose();
}
7.获取机械单元,可获取坐标、速度....具体看对象的结构或协议
public static bool GetMechanicalUnit(Controller controller)
{
lock (lock_ABBInterface)
{
try
{
MechanicalUnitCollection aMechCol = controller.MotionSystem.MechanicalUnits;
curr_robTarget = aMechCol[0].GetPosition(CoordinateSystemType.World);//获取机械单元ROB_1(机器人本体)数据
curr_robTarget.Extax.Eax_a = aMechCol[2].GetPosition(CoordinateSystemType.World).Trans.X; //获取机械单元M7(第七轴)数据
robot_speed = controller.MotionSystem.SpeedRatio; //获取机械单元的速度,即机器人当前速度
return true;
}
catch (Exception ex)
{
return false;
}
}
}
8 获取程序模块
public static bool GetProgramName(Controller controller)
{
lock (lock_ABBInterface)
{
try
{
ABB.Robotics.Controllers.RapidDomain.Task[] taskCol = controller.Rapid.GetTasks();
routine = taskCol[0].ProgramPointer.Routine;
module = taskCol[0].ProgramPointer.Module;
return true;
}
catch (Exception ex)
{
return false;
}
}
}
9 获取机器人状态
public static bool GetState(Controller controller)
{
lock (lock_ABBInterface)
{
try
{
con_states = controller.State; //控制器状态
op_mode = controller.OperatingMode; //控制器操作模式
executionStatus = controller.Rapid.ExecutionStatus; //执行状态
return true;
}
catch (Exception ex)
{
return false;
}
}
}
10 获取控制器位置数据
public static string GetRapidData(Controller controller, string task, string module, string robTargetName)
{
lock (lock_ABBInterface)
{
RapidData rd = controller.Rapid.GetRapidData(task, module, robTargetName);
return rd.StringValue;
}
}
11 写控制器位置
public static void RobTargetToRapidData(Controller controller, string task, string module, string robTargetName, string robTarget)
{
lock (lock_ABBInterface)
{
RobTarget rt = new RobTarget();
rt.FillFromString2(robTarget);
RapidData rd = controller.Rapid.GetRapidData(task, module, robTargetName);
using (Mastership.Request(controller))
{
rd.Value = rt;
}
}
}
12 获取数字信号
public static int GetDigitalSignal(Signal sig)
{
lock (lock_ABBInterface)
{
DigitalSignal digitalSig = (DigitalSignal)sig;
int val = digitalSig.Get();
return val;
}
}
13 写数字信号
public static void WriteDigitalSignal(Signal sig, float val)
{
lock (lock_ABBInterface)
{
DigitalSignal digitalSig = (DigitalSignal)sig;
digitalSig.Value = val;
}
}
14 获取日志,可以用事件实现
public static EventLogCategory GetEventLog(Controller controller)
{
lock (lock_ABBInterface)
{
ABB.Robotics.Controllers.EventLogDomain.EventLog eventLog = controller.EventLog;
return eventLog.GetCategory(0); //0表示读取所有日志,具体见CategoryType
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C# 上位机通过模块616-1 PC interface 和ABB机器人控制器通讯,从而实现视PC 对ABB机器人的视觉数据传输和控制方法。