栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

ABB PC SDK C#二次开发

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ABB PC SDK C#二次开发

开发环境

本文的开发使用的是Visual Studio 2019,基于.net Framework 4.8进行开发
SDK使用ABB PC SDK 2020.4版本
下载链接https://download.csdn.net/download/a820946475/14753888
或者官网https://robotapps.blob.core.windows.net/apps/acdb3967-fa5c-42a4-b148-443cef4e5d23PCSDK_2020.4.zip

Demo下载地址https://download.csdn.net/download/a820946475/14158054

SDK引用

我的ABB SDK安装在C盘,所以DLL引用路径为:C:Program Files (x86)ABBSDKPCSDK 2020 引用的dll文件为:ABB.Robotics.Controllers.PC.dll、RobotStudio.Services.RobApi.Desktop.dll、RobotStudio.Services.RobApi.dll 三个。

同时在Form1中对添加using

using ABB.Robotics;
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.RapidDomain;
控制器连接

在Form1界面添加btn_scan、btn_connect和ListView1控件

  • btn_scan设置
项目Value
Text扫描
  • btn_connect设置
项目Value
EnabledFalse
Text连接
  • ListView1设置
项目Value
FullRowSelectTrue
GridLinesTrue
ViewDetails
Columns列内容

在Form1中定义全年局变量

NetworkScanner scanner = new NetworkScanner(); //实例化NetworkScanner类
Controller controller = null;  //定义controller全局变量
ControllerInfoCollection controllers = null; //定义控制器集合

btn_scan Click事件,实现点击按钮后,扫描控制器,并显示在ListView1中

private void btn_scanner_Click(object sender, EventArgs e)
{
    scanner.Scan();  //扫描控制器
    controllers = scanner.Controllers; //获取扫描到的控制器集合
    if(controllers.Count>0)
    {
        AddListview(controllers);
    }
}

public void AddListview(ControllerInfoCollection icontrollers)
{
   listView1.Items.Clear();
   for(int i=0;i
      ControllerInfo controllerInfo = icontrollers[i];

      listView1.Items.Add(controllerInfo.IPAddress.ToString());
      listView1.Items[i].SubItems.Add(controllerInfo.Availability.ToString());
      listView1.Items[i].SubItems.Add(controllerInfo.ControllerName);
      listView1.Items[i].SubItems.Add(controllerInfo.IsVirtual == true ? "虚拟" : "现实");
      listView1.Items[i].SubItems.Add(controllerInfo.Name);
      listView1.Items[i].SubItems.Add(controllerInfo.RobApiPort.ToString());
      listView1.Items[i].SubItems.Add(controllerInfo.RunLevel.ToString());
      listView1.Items[i].SubItems.Add(controllerInfo.SystemId.ToString());
      listView1.Items[i].SubItems.Add(controllerInfo.SystemName);
      listView1.Items[i].SubItems.Add(controllerInfo.Version.ToString());
      listView1.Items[i].SubItems.Add(controllerInfo.WebServicesPort.ToString());
    }
}

listView1_SelectedIndexChanged事件

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
   if(listView1.SelectedItems.Count!=0)
   {
       btn_connect.Enabled = true;
   }
   else
   {
       btn_connect.Enabled = false;
   }
}

btn_connect_Click事件

private void btn_connect_Click(object sender, EventArgs e)
{
    if (btn_connect.Text == "连接")
    {
         if (ConnectControl())
         {
             MessageBox.Show("控制器连接成功");
         }
         else
         {
             MessageBox.Show("控制器连接失败");
         }
    }
    else
    {
         DisConnect();
    }
}
public void DisConnect()
{
    controller.Logoff();
    controller.Dispose();
    controller = null;
    btn_connect.Text = "连接";
}

public bool ConnectControl()
{
    bool flag = false;
    foreach(ControllerInfo controllerInfo in controllers)
    {
         if(listView1.SelectedItems[0].SubItems[7].Text==controllerInfo.SystemId.ToString())  //通过GUID判断选中哪个控制器
         {
              if(controllerInfo.Availability== Availability.Available)
              {
                   if(controller!=null)
                   {
                      DisConnect();
                      flag = false;
                   }
                   else
                   {
                       controller = Controller.Connect(controllerInfo, ConnectionType.Standalone);   //连接控制器
                       controller.Logon(UserInfo.DefaultUser);//以DefaultUser登录
                       btn_connect.Text = "断开";
                       flag = true;
                   }
             }
        }
    }
    return flag;
}

PP To Main

在PP To Main之前需要先获取Rapid的主控权,获取方法如下:

using (Mastership.Request((IMastershipResourceController)controller))
{
   //获取权限后需要执行的动作  
}

在Form1界面添加btn_ppToMain控件,btn_ppToMain_Click事件

private void button1_Click(object sender, EventArgs e)
{
    if (controller.OperatingMode == ControllerOperatingMode.Auto) //判断是自动模式才进行操作
    {
         ABB.Robotics.Controllers.RapidDomain.Task[] task = controller.Rapid.GetTasks(); //获取所有Tasks

         using (Mastership.Request((IMastershipResourceController)controller))
         {
              //由于我只有1个Task所有直接使用了Task[0]
              task[0].ResetProgramPointer();  //指针 PP To Main
         }
     }
}

注意
PP To Main之前需要判断运行模式必须是自动模式才行,如不判断,手动模式时会报错。

C004841C : The operation is not allowed in current operation mode. For example, a remote user may not be allowed to perform the operation in manual mode.
ERROR: rdh_rapid.cpp[7073]: org_code: -4502 new_code: 0xc004841c; 
Url:/RAPID/T_ROB1  Cmd:SET  Prop:ResetPP  Args:  Elapsed:7  CurrentCmds:0
History:
-00:00:02.0577533 [73] SendCommand url: cmd:Get prop:RMMPPoll arg:
-00:00:02.0517713 [73] status:SYS_CTRL_S_PENDING data:-Status 294914
-00:00:01.5496286 [74] SendCommand url: cmd:Get prop:RMMPPoll arg:
-00:00:01.5406540 [74] status:SYS_CTRL_S_PENDING data:-Status 294914
-00:00:01.0396212 [75] SendCommand url: cmd:Get prop:RMMPPoll arg:
-00:00:01.0386236 [75] status:SYS_CTRL_S_PENDING data:-Status 294914
-00:00:00.5378822 [76] SendCommand url: cmd:Get prop:RMMPPoll arg:
-00:00:00.5309002 [76] status:SYS_CTRL_S_PENDING data:-Status 294914
-00:00:00.0299200 [77] SendCommand url: cmd:Get prop:RMMPPoll arg:
-00:00:00.0209464 [77] status:SYS_CTRL_S_GRANTED data:-Status 294915
-00:00:00.0209464 [78] SendCommand url: cmd:Get prop:CurrentMaster2 arg:-Domain CFG
-00:00:00.0199477 [78] status:SYS_CTRL_S_OK data:-Status NoMaster
-00:00:00.0179518 [79] SendCommand url: cmd:Set prop:RequestMaster2 arg:-Domain CFG -Uid 34
-00:00:00.0109405 [79] status:SYS_CTRL_S_OK data:
-00:00:00.0109405 [80] SendCommand url: cmd:Get prop:CurrentMaster2 arg:-Domain RAPID
-00:00:00.0099734 [80] status:SYS_CTRL_S_OK data:-Status NoMaster
-00:00:00.0099734 [81] SendCommand url: cmd:Set prop:RequestMaster2 arg:-Domain RAPID -Uid 34
-00:00:00.0089759 [81] status:SYS_CTRL_S_OK data:
-00:00:00.0079792 [82] SendCommand url:/RAPID/T_ROB1 cmd:SET prop:ResetPP arg:
-00:00:00.0009601 [82] status:SYS_CTRL_E_MODE_REJECT data:ERROR: rdh_rapid.cpp[7073]: org_code: -4502 new_code: 0xc004841c; 

错误代码描述
0xC004841C当前操作模式下不允许该操作。例如,可能不允许远程用户在手动模式下执行操作。
Robot实时位置

ABB.Robotics.Controllers.RapidDomain.RobTarget 结构体中包含位置信息
可以通过以下方法获取到RobTarget

        /// 
        /// 获取机器人位置
        /// 
        /// 机器人位置信息
        public RobTarget GetRobTarget()
        {
            ABB.Robotics.Controllers.MotionDomain.MotionSystem motionSystem = (ABB.Robotics.Controllers.MotionDomain.MotionSystem)controller.MotionSystem;
            RobTarget robTarget = motionSystem.ActiveMechanicalUnit.GetPosition(ABB.Robotics.Controllers.MotionDomain.CoordinateSystemType.Base);
            return robTarget;
        }

然后就可以解析出机器人的X,Y,Z坐标值了

        RobTarget robTarget = GetRobTarget();
        lb_RobotX.Text = robTarget.Trans.X.ToString("#0.00");
        lb_RobotY.Text = robTarget.Trans.Y.ToString("#0.00");
        lb_RobotZ.Text = robTarget.Trans.Z.ToString("#0.00");

如需要实时获取机器人当前坐标,可以通过多线程方式,实时更新坐标信息

速度设置

设置controller.MotionSystem.SpeedRatio即可调整机器人运行速度,下面例子是只在自动状态模式下调整运行速度。

        /// 
        /// 设置机器人运行速度
        /// 
        /// 
        public void SetRobotSpeed(int speed)
        {
            if (controller != null)
            {
                if (controller.OperatingMode == ControllerOperatingMode.Auto)
                {
                    controller.MotionSystem.SpeedRatio = speed;
                }
            }
        }
电机启动/停止

*电机启动
以下示例是在自动状态下,电机启动的方法

        /// 
        /// 电机启动
        /// 
        /// 执行是否成功
        public bool MotorsOn()
        {
            if (controller.OperatingMode == ControllerOperatingMode.Auto)
            {
                if (controller.State == ControllerState.EmergencyStopReset)
                {
                    return false;
                }
                else if (controller.State == ControllerState.MotorsOff)
                {
                    controller.State = ControllerState.MotorsOn;
                    return true;
                }
                else if (controller.State == ControllerState.MotorsOn)
                {
                    return true;
                }
                return false;
            }
            return false;
        }

*电机停止

   /// 
    /// 电机停止
    /// 
    /// 执行是否成功
    public bool MotorsOff()
    {
         if (controller.OperatingMode == ControllerOperatingMode.Auto)
         {
             if (controller.State != ControllerState.EmergencyStopReset && controller.State != ControllerState.EmergencyStop)
             {
                 controller.State = ControllerState.MotorsOff;
             }
             return true;
         }
         return false;
     }
    
任务启动/停止
  • 任务启动
   /// 
    /// 任务运行
    /// 
    /// 执行是否成功
    public bool TaskRun()
    {
        if (controller.OperatingMode == ControllerOperatingMode.Auto)
        {
            if (controller.State != ControllerState.MotorsOn)   //判断电机是否上电
            {
                controller.State = ControllerState.MotorsOn;
            }
            using (Mastership.Request((IMastershipResourceController)controller))
            {
                controller.Rapid.Start();
            }
            return true;
        }
        return false;
    }
  • 任务停止
    注意,任务停止有StopMode.Cycle,StopMode.Immediate,StopMode.Instruction 三种模式。
/// 
/// 任务停止
/// 
/// 停止类型
/// 执行是否成功
public bool TaskStop(StopMode stopMode)
{
    if (controller.OperatingMode == ControllerOperatingMode.Auto)
    {
        using (Mastership.Request((IMastershipResourceController)controller))
        {
            controller.Rapid.Stop(stopMode);

        }
        return true;
    }
    return false;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984332.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号