C# ABB机器人上位机控制 .net PC SDK开发全流程(通信、控制、日志、二次开发)--Chapter 2

3. 硬件通信连接

下面进入实际机器人调试环节,此时使用的机器人是ABB IRB1200,年代稍微有点早,上次维护系统尚且是在四年前。
首先按照之前的操作完成PC SDK的安装和连接。

硬件连接常见错误

错误1:指定服务未安装

在这里插入图片描述
此错误:指定服务未安装——一般由于PC SDK并没有安装完成,因为PC SDK为机器人硬件驱动,需要注意的是,SDK安装过程不可以被防火墙拦截。

错误2:局域网搜索不到机器人系统

当搜索完全没有搜到任何机器人的时候,需要依次进行排查:

  1. 确保机器人和上位机使用网线连接稳定,网线的水晶头如果有信号会发出微弱的闪光;
  2. 首先去机器人端,在示教器上系统信息System Info里面,寻找网络连接,Service Port是连接到机器人所需要的网络信息,找到Service Port;
  3. 机器人上Service Port信息包含了IP Address 和 Subnet Mask两个信息,分别对应网络地址和子网掩码,记录这两个信息;
  4. 在电脑网络中心,设置与机器人局域网的IP Address(具体流程可以百度),前三位与机器人一致,最后一位不同;设置子网掩码一致;设置默认网关前三位与机器人IP地址一致,最后一位为1;
  5. 完成全部设置,现在可以搜索到机器人了。
    在这里插入图片描述
    在连接上机器人之后,下一步是进行机器人基本信息的采集和读取。

4. 机器人基本信息读取

运行状态

机器人的运行状态包含以下几种,将其输出的代码为:

        static public string GetStatusLabel()//得到当前机器人运行状态
        {
    
    
            ControllerState con_states = new ControllerState();
            con_states = controller.State;
            ControllerOperatingMode op_mode = new ControllerOperatingMode();
            op_mode = controller.OperatingMode;
            string T1 = "";
            string T2 = "";
            if (con_states.Equals(ControllerState.EmergencyStop)) T1 = "急停";
            else if (con_states.Equals(ControllerState.EmergencyStopReset)) T1 = "急停复位";
            else if (con_states.Equals(ControllerState.GuardStop)) T1 = "安全停止";
            else if (con_states.Equals(ControllerState.Init)) T1 = "初始化";
            else if (con_states.Equals(ControllerState.MotorsOff)) T1 = "电机关闭";
            else if (con_states.Equals(ControllerState.MotorsOn)) T1 = "电机启动";
            else if (con_states.Equals(ControllerState.SystemFailure)) T1 = "系统失效";
            else if (con_states.Equals(ControllerState.Unknown)) T1 = "未知";
            else T1 = "严重错误";
            if (op_mode.Equals(ControllerOperatingMode.Auto)) T2 = "自动";
            else if (op_mode.Equals(ControllerOperatingMode.AutoChange)) T2 = "自动改";
            else if (op_mode.Equals(ControllerOperatingMode.Init)) T2 = "初始化";
            else if (op_mode.Equals(ControllerOperatingMode.ManualFullSpeed)) T2 = "手动全速";
            else if (op_mode.Equals(ControllerOperatingMode.ManualFullSpeedChange)) T2 = "手动全速改";
            else if (op_mode.Equals(ControllerOperatingMode.ManualReducedSpeed)) T2 = "手动减速";
            else if (op_mode.Equals(ControllerOperatingMode.NotApplicable)) T2 = "不适用";
            else T2 = "严重错误";
            return "(" +  T1 + "," + T2 + ")";
        }

当前坐标

返回坐标需要两步,第一步是得到机器人本身的RobTarget,即:

		controller.MotionSystem.MechanicalUnits[0].GetPosition(type);

其中type是机器人本身的坐标系形式,这个之后细说。
完整得到当前机器人坐标(并转换成double数组的是)

        static public double[] GetPosition(CoordinateSystemType type)//返回坐标值
        {
    
    
            double[] Pos = new double[7];
            string PosStr = controller.MotionSystem.MechanicalUnits[0].GetPosition(type).ToString();
            string[] Poses = PosStr.Split(new char[] {
    
     ' ', '{', '}', '[', ']',',' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < 7; i++) Pos[i] = Convert.ToDouble(Poses[i]);
            return Pos;
        }

其他信息

运行日志

运行日志的读取是相对来说比较简单的,但是这个过程比较耗时

            EventLog log = controller.EventLog;
            EventLogCategory cat = log.GetCategory(0);
            ArrayList newarray = new ArrayList();
            foreach (EventLogMessage emsg in cat.Messages)
            {
    
    
                newarray.Add(emsg.Number + "{" + emsg.Title + "{" + emsg.Timestamp);
            }
            ArrayList ary = new ArrayList();
            ary = newarray.GetRange(0, Range);
            return ary;

机器人速度

机器人速度必须在自动模式下修改和读取,具体变量为:

			controller.MotionSystem.SpeedRatio

注意事项

对于虚拟的机器人,RobotStudio有很快的反应速度,所以可以直接在线程当中访问机器人,但对于实际的机器人,每一次机器人操作都需要经过底层TCP/IP和RAPID代码对机器人进行操作,比较耗时,所以一般推荐在单独线程当中对机器人进行操作以避免卡顿。尤其是读取机器人的运行日志,非常耗时,最好在单独线程当中执行。

总结

在这一章中,完成了日志和通信的基本调用,并提供了一定的样例代码。在这部分操作当中,建议机器人的操作全部使用静态方法。下一章是进行更进一步的操作。

猜你喜欢

转载自blog.csdn.net/weixin_42835288/article/details/111029663
今日推荐