本文的开发使用的是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 |
|---|---|
| Enabled | False |
| Text | 连接 |
- ListView1设置
| 项目 | Value |
|---|---|
| FullRowSelect | True |
| GridLines | True |
| View | Details |
| 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 | 当前操作模式下不允许该操作。例如,可能不允许远程用户在手动模式下执行操作。 |
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; }



