UnderAutomation
Une question ?

[email protected]

Contactez-nous
UnderAutomation
⌘Q
This page is only available in English.

Get started with Python

Install the Python package from PyPI and talk to an IRC5 or an OmniCore controller from your Python code. Same features as the .NET library, with Python naming.

The Python package talks to the same ABB controllers as the .NET library, with the same features. It is the .NET assembly loaded in your Python process through pythonnet, so nothing is installed on the robot and no other dependency is needed.

  • Python : 3.7 and later
  • Operating system : Windows, Linux, macOS
  • Controllers : IRC5 with RobotWare 6, and OmniCore with RobotWare 7

Install from PyPI

Bash
pip install UnderAutomation.ABB

pythonnet is installed with it. See on PyPI : https://pypi.org/project/UnderAutomation.ABB

We recommend a virtual environment, to keep the dependencies of your project apart :

Bash
python -m venv venv
# Windows
venv\Scripts\activate
# Linux and macOS
source venv/bin/activate

On Linux, install the .NET runtime as well and tell pythonnet to use it :

Bash
sudo apt-get install -y dotnet-runtime-8.0
export PYTHONNET_RUNTIME=coreclr

Install from source

Bash
git clone https://github.com/underautomation/ABB.py.git
cd ABB.py
pip install -e .

The repository also holds runnable examples, one folder per feature : examples/controller, examples/io, examples/rapid, examples/motion, and so on.

First program

Import AbbController, connect, and call a service.

from underautomation.abb.abb_controller import AbbController
# The whole SDK is reachable from a single object
robot = AbbController()
robot.connect("192.168.0.1")
# Controller identity
identity = robot.rws.controller.get_identity()
print(f"Connected to {identity.name}")
# RAPID tasks
for task in robot.rws.rapid.get_tasks():
print(f"{task.name} : {task.execution_state}")
robot.disconnect()
Click to see the full code

The default parameters target an OmniCore controller. For an IRC5 running RobotWare 6, set the RWS version. See Connect to your robot for the full list of connection parameters.

How the names are written

The Python package follows the .NET API, with Python naming :

.NETPython
robot.Rws.Controller.GetIdentity()robot.rws.controller.get_identity()
robot.Rws.MotionSystem.GetRobTarget("ROB_1")robot.rws.motion_system.get_rob_target("ROB_1")
identity.MacAddressidentity.mac_address
ControllerState.MotorsOnControllerState.MotorsOn

Classes, methods and properties become snake_case. Enumeration values keep the name they have in .NET. A value whose name is a Python keyword gets a trailing underscore : RapidRegainMode.Continue_, RapidStartCondition.None_, RapidTextQueryMode.Try_.

Each type lives in its own module, named after itself :

Python
from underautomation.abb.abb_controller import AbbController
from underautomation.abb.connection_parameters import ConnectionParameters
from underautomation.abb.rws.rws_version import RwsVersion
from underautomation.abb.rws.data.controller_state import ControllerState
from underautomation.abb.common.pose import Pose

Errors

Every failure reported by the controller raises an RwsException. It comes from the .NET runtime, so its members keep their original names : StatusCode, RwsErrorCode, RwsErrorMessage, ResponseBody.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
try
{
robot.Rws.Io.SetSignalValue("Local", "PANEL", "DO_Gripper", 1);
}
catch (RwsException ex)
{
// StatusCode is the HTTP status code the controller answered
if (ex.StatusCode == 403)
Console.WriteLine("Mastership is held elsewhere, or the user account lacks the grant");
else if (ex.StatusCode == 404)
Console.WriteLine("This signal does not exist on this controller");
else
Console.WriteLine($"RWS error {ex.StatusCode} : {ex.RwsErrorMessage}");
}
robot.Disconnect();
}
Click to see the full code

Differences with the .NET API

  • The asynchronous methods are not wrapped. Every service method is available in its synchronous form.
  • The file service reads and writes bytes, not text or streams. Decode and encode in your own code : bytes(robot.rws.file.get_file_as_bytes(path)).decode("utf-8").
  • Python has no method overloading, so a .NET method that exists in several forms is wrapped once. The mastership is an example : it is always taken with the domain it applies to, robot.rws.mastership.request(MastershipDomain.Rapid). To hold everything, as the parameterless .NET call does, take the domains one by one :
Python
for domain in robot.rws.mastership.get_domains():
robot.rws.mastership.request(domain)

HTTPS and the controller certificate

An OmniCore controller answers on HTTPS with a certificate it signed itself. On Windows the SDK runs on the .NET Framework runtime, which refuses that certificate and offers an old TLS version. Relax both once, before connecting :

Python
from System.Net import ServicePointManager, SecurityProtocolType
from System.Net.Security import RemoteCertificateValidationCallback
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
ServicePointManager.ServerCertificateValidationCallback = \
RemoteCertificateValidationCallback(lambda sender, certificate, chain, errors: True)

What to read next

  • Connect to your robot : connection parameters, IRC5 and OmniCore, errors.
  • Test with a RobotStudio virtual controller : run everything without a real robot.
  • Robot Web Services overview : the list of services and what each one covers.
  • Licensing : the 30 day trial and how to register your key.

Intégrez facilement les robots Universal Robots, Fanuc, Yaskawa, ABB ou Staubli dans vos applications .NET, Python, LabVIEW ou Matlab

UnderAutomation
Contactez-nousLegal

© All rights reserved.