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
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 :
python -m venv venv# Windowsvenv\Scripts\activate# Linux and macOSsource venv/bin/activate
On Linux, install the .NET runtime as well and tell pythonnet to use it :
sudo apt-get install -y dotnet-runtime-8.0export PYTHONNET_RUNTIME=coreclr
Install from source
git clone https://github.com/underautomation/ABB.py.gitcd ABB.pypip 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 objectrobot = AbbController()robot.connect("192.168.0.1")# Controller identityidentity = robot.rws.controller.get_identity()print(f"Connected to {identity.name}")# RAPID tasksfor task in robot.rws.rapid.get_tasks():print(f"{task.name} : {task.execution_state}")robot.disconnect()
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 :
| .NET | Python |
|---|---|
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.MacAddress | identity.mac_address |
ControllerState.MotorsOn | ControllerState.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 :
from underautomation.abb.abb_controller import AbbControllerfrom underautomation.abb.connection_parameters import ConnectionParametersfrom underautomation.abb.rws.rws_version import RwsVersionfrom underautomation.abb.rws.data.controller_state import ControllerStatefrom 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 answeredif (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");elseConsole.WriteLine($"RWS error {ex.StatusCode} : {ex.RwsErrorMessage}");}robot.Disconnect();}
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 :
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 :
from System.Net import ServicePointManager, SecurityProtocolTypefrom System.Net.Security import RemoteCertificateValidationCallbackServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12ServicePointManager.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.