Skip to main content

No project description provided

Project description

Showcase video

Unofficial Control Library for FANUC Robots

A library implementing a variety of FANUC robot proprietary protocols such as:

  • Stream Motion (stmo)
  • High Speed Position Output (hspo)
  • Remote Motion Interface (rmi)
  • SNPX based "HMI" (hmi)

The library is implemented in rust with the ability to be used as a crate in rust or a python module via pyo3. Has been tested with Linux(x86_64 and arm64), Windows(x86_64) and MacOS(arm64) although it likely works on all architectures that windows and macos support.

Installation

Rust

Add the following to your Cargo.toml:

[dependencies]
fanuc_ucl = "1"

or run cargo add fanuc_ucl in your project directory.

Python

The library is available on PyPI as fanuc_ucl, so you can install it using pip:

pip install fanuc_ucl==1

Usage

Python and rust have nearly identical APIs. The Python API is as strongly typed as possible with advanced type hints.

Unit and Format Safe Joint Representations

Every instance of working with direct joint representations requires also specifying the format and template of the joints, ensuring that the user is always aware of the units and the j2/j3 convention being used. Utilities to convert between different formats and templates are also provided as an independent API.

JointFormats:

  • FanucDeg: Angles in degrees, with the j3 angle relative to the ground plane
  • FanucRad: Angles in radians, with the j3 angle relative to the ground plane
  • AbsDeg: Angles in degrees, with the j3 angle relative to the previous joint
  • AbsRad: Angles in radians, with the j3 angle relative to the previous joint

JointTemplates can be arbitrarily created but the struct comes with a few pre-defined ones:

  • SIX: The common 6 axis joint configuration of most FANUC robots
  • SIX_LINEAR_TRACK: A 6 axis robot on a linear track, with the track being the 7th joint
  • FOUR: A 4 axis joint configuration, common for FANUC palletizing robots
  • FOUR_LINEAR_TRACK: A 4 axis robot on a linear track, with the track being the 5th joint
  • FIVE: A 5 axis joint configuration, somewhat common for FANUC palletizing robots
  • FIVE_LINEAR_TRACK: A 5 axis robot on a linear track, with the track being the 6th joint
use fanuc_ucl::joints::{JointFormat, JointTemplate};

fn main() {
    let joints = vec![-90.0, 0.0, 0.0, -180.0, 90.0, 180.0];
    let joints_conv = JointFormat::AbsRad.convert_from(JointFormat::FanucDeg, JointTemplate::SIX, joints);
    println!("Converted joints: {:?}", joints_conv);
}
from fanuc_ucl import JointFormat, JointTemplate

def main():
    joints = [-90.0, 0.0, 0.0, -180.0, 90.0, 180.0]
    joints_conv = JointFormat.AbsRad.convert_from(JointFormat.FanucDeg, JointTemplate.SIX, joints)
    print(f"Converted joints: {joints_conv}")

RMI

use std::time::Duration;

use fanuc_ucl::{rmi::{RmiDriver, RmiDriverConfig, proto}, joints::{JointFormat, JointTemplate}};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut driver = RmiDriver::new(RmiDriverConfig::default_with_ip([10, 0, 0, 1]));
    driver.connect(Some(ThreadConfig::new(80, None)))?;

    driver.send_full_reset()?.wait_timeout(Duration::from_secs(15))?;
    driver.send(proto::FrcInitialize::default())?.wait_timeout(Duration::from_secs(15))?;
    driver.send(proto::FrcSetOverRide::new(80))?.wait_timeout(Duration::from_secs(1))?;
    driver.send(proto::FrcSetUTool::new(1))?.wait_timeout(Duration::from_secs(1))?;
    driver.send(proto::FrcSetUFrame::new(1))?.wait_timeout(Duration::from_secs(1))?;

    let movement_cmd1 = proto::FrcJointMotionJRep::new(
        proto::JointAngles::new6(
            JointFormat::AbsDeg,
            JointTemplate::SIX,
            -90.0, 0.0, 0.0, -180.0, 90.0, 180.0
        ),
        proto::SpeedType::MilliSeconds,
        528,
        proto::TermType::FINE,
        0
    );
    let movement_cmd2 = proto::FrcJointMotionJRep::new(
        proto::JointAngles::new6(
            JointFormat::AbsDeg,
            JointTemplate::SIX,
            90.0, 0.0, 0.0, 180.0, -90.0, -180.0
        ),
        proto::SpeedType::MilliSeconds,
        528,
        proto::TermType::FINE,
        0
    );
    driver.send(movement_cmd1)?.wait_timeout(Duration::from_millis(600))?;
    driver.send(proto::FrcWaitTime::new(Duration::from_secs(1)))?.wait()?;
    driver.send(movement_cmd2)?.wait_timeout(Duration::from_millis(600))?;

    let pos_resp = driver.send(proto::FrcReadJointAngles::new(None))?.wait()?;
    println!("Current joint angles: {:?}", pos_resp.joints(JointFormat::AbsDeg, JointTemplate::SIX).as_array());

    Ok(())
}
from fanuc_ucl import JointFormat, JointTemplate, ThreadConfig, rmi

def main():
    driver = rmi.RmiDriver(rmi.RmiDriverConfig("10.0.0.1"))
    driver.connect(ThreadConfig(80, None))

    driver.send_full_reset().wait_timeout(20.0)
    driver.send(rmi.FrcInitialize()).wait_timeout(20.0)
    driver.send(rmi.FrcSetOverRide(80)).wait_timeout(1.0)
    driver.send(rmi.FrcSetUTool(1)).wait_timeout(1.0)
    driver.send(rmi.FrcSetUFrame(1)).wait_timeout(1.0)

    movement_cmd1 = rmi.FrcJointMotionJRep(
        rmi.JointAngles(
            JointFormat.AbsDeg,
            JointTemplate.SIX,
            *[-90.0, 0.0, 0.0, -180.0, 90.0, 180.0]
        ),
        rmi.SpeedType.MilliSeconds,
        528,
        rmi.TermType.FINE,
        0,
    )
    movement_cmd2 = rmi.FrcJointMotionJRep(
        rmi.JointAngles(
            JointFormat.AbsDeg,
            JointTemplate.SIX,
            *[90.0, 0.0, 0.0, 180.0, -90.0, -180.0]
        ),
        rmi.SpeedType.MilliSeconds,
        528,
        rmi.TermType.FINE,
        0,
    )
    driver.send(movement_cmd1).wait_timeout(0.6)
    driver.send(rmi.FrcWaitTime(1.0)).wait()
    driver.send(movement_cmd2).wait_timeout(0.6)

    pos_resp = driver.send(rmi.FrcReadJointAngles()).wait_timeout(0.2)
    print(f"Current joint angles: {pos_resp.joints(JointFormat.AbsDeg, JointTemplate.SIX).as_array()}")

HSPO

use std::{net::SocketAddr, thread::sleep, time::Duration};

use fanuc_ucl::{ThreadConfig, hspo::{HspoReceiver, destroy_broker, initialize_broker}, joints::{JointFormat, JointTemplate}};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    initialize_broker(
        SocketAddr::from(([0, 0, 0, 0], 15000)),
        Some(ThreadConfig::new(55, None)),
    ).expect("Broker couldnt be started");

    let receiver = HspoReceiver::try_new([10, 0, 0, 1], 128, Duration::from_millis(10))?;

    if let Some(joint_packet) = receiver.wait_for_joint_packet(Duration::from_millis(16)) {
        println!(
            "Received joint packet: {:?}",
            joint_packet.joints(JointFormat::AbsDeg, JointTemplate::SIX)
        );
    }

    receiver.clear_tcp_packet_buffer();
    sleep(Duration::from_secs(1));
    let opt_tcp_packet = receiver.try_recv_tcp_packet();
    match opt_tcp_packet {
        Some(packet) => println!("Received TCP packet: {:?}", packet),
        None => println!("No TCP packet received within the timeout."),
    }
    let var_packets = receiver.recv_all_var_packets();
    println!(
        "Received {} Variables packets: {:?}",
        var_packets.len(),
        var_packets
    );

    destroy_broker(true);
    Ok(())
}
from fanuc_ucl import JointFormat, JointTemplate, ThreadConfig, hspo

def main():
    hspo.initialize_broker("0.0.0.0:15000", ThreadConfig(55, None))

    receiver = hspo.HspoReceiver("10.0.0.1", 128)

    joint_packet = receiver.wait_for_joint_packet(0.016)
    if joint_packet is not None:
        print(f"Received joint packet: {joint_packet.joints(JointFormat.AbsDeg, JointTemplate.SIX)}")

    receiver.clear_tcp_packet_buffer()
    tcp_packet = receiver.try_recv_tcp_packet()
    if tcp_packet is not None:
        print(f"Received TCP packet: {tcp_packet}")
    else:
        print("No TCP packet received within the timeout.")
    var_packets = receiver.recv_all_var_packets()
    print(f"Received {len(var_packets)} Variables packets: {var_packets}")

    hspo.destroy_broker()

HMI

use std::time::Duration;

use fanuc_ucl::hmi::{DigitalOutput, GroupInput, GroupOutput, HmiDriver, SysVarArgs};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut driver = HmiDriver::new([10, 0, 0, 1]);
    driver.connect(Some(Duration::from_secs(1)), None)?;

    if driver.read::<DigitalOutput>(1)?.wait_timeout(Duration::from_millis(10))? {
        println!("DO1 is on");
    } else {
        println!("DO1 is off");
    }

    let groups = driver.read_array::<GroupInput>(1, 40)?.wait_timeout(Duration::from_millis(10))?;
    for (i, group) in groups.iter().enumerate() {
        println!("Group {}: {:?}", i + 1, group);
    }

    driver.write::<DigitalOutput>(1, true)?;
    driver.write_array::<GroupOutput>(1, &[10, 11, 12, 13])?;
    driver.write_array_unsafe::<GroupInput>(1, &[10, 11, 12, 13])?;

    let hspo_enable_var = driver.register_asg(
        SysVarArgs{
            var_name: "$MCGR_CFG.$ENABLE".to_string(),
            ..Default::default()
        },
        Duration::from_millis(24)
    )?;
    if hspo_enable_var.read(&driver)?.wait_timeout(Duration::from_millis(10))? {
        println!("HSPO is already enabled");
    } else {
        hspo_enable_var.write(&driver, true)?;
        println!("HSPO is now enabled");
    }

    // ASG has ALOT of functionality, so we won't cover it all here.
    // When the Rustdocs are finished it will delve more into it.

    Ok(())
}
from fanuc_ucl import hmi

def main():
    driver = hmi.HmiDriver("10.0.0.1")
    driver.connect()

    if driver.read(hmi.DigitalOutput, 1).wait_timeout(0.01):
        print("DO1 is on")
    else:
        print("DO1 is off")

    groups = driver.read(hmi.GroupInput, 1, 40).wait_timeout(0.01)
    for i, group in enumerate(groups):
        print(f"Group {i + 1}: {group}")

    driver.write(hmi.DigitalOutput, 1, True)
    driver.write(hmi.GroupOutput, 1, [10, 11, 12, 13])
    driver.write_unsafe(hmi.GroupInput, 1, [10, 11, 12, 13])

    hspo_enable_var = driver.register_sysvar_asg(bool, name="$MCGR_CFG.$ENABLE")
    if hspo_enable_var.read(driver).wait_timeout(0.01):
        print("HSPO is already enabled")
    else:
        hspo_enable_var.write(driver, True)
        print("HSPO is now enabled")

    # ASG has ALOT of functionality, so we won't cover it all here.
    # When the Rustdocs are finished it will delve more into it.

Stream Motion

Stream Motion allows real-time joint-level control of a FANUC robot at the servo loop rate. Commands are batched and streamed over UDP; command_motion returns an StmoHandle that can be waited on to know when the batch has been transmitted.

Basic batch usage

use std::time::Duration;

use fanuc_ucl::{
    joints::{JointFormat, JointTemplate},
    stmo::{StreamMotionDriver, StmoHandle},
    stmo::proto::MotionCommandPacket,
    ThreadConfig,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut driver = StreamMotionDriver::new([10, 0, 0, 1]);
    driver.connect(Some(ThreadConfig::new(80, None)))?;
    driver.start(2.0)?;

    let limits = driver.fetch_movement_limits(0)?;
    println!("vmax = {}", limits.vmax);

    let mut cmd1 = MotionCommandPacket::try_from_joints(
        JointFormat::AbsDeg,
        JointTemplate::SIX,
        &[-90.0, 0.0, 0.0, -180.0, 90.0, 180.0],
    )?;
    let mut cmd2 = MotionCommandPacket::try_from_joints(
        JointFormat::AbsDeg,
        JointTemplate::SIX,
        &[90.0, 0.0, 0.0, 180.0, -90.0, -180.0],
    )?;
    cmd2.set_last_command(true);

    let handle: StmoHandle = driver.command_motion(vec![cmd1, cmd2])?;
    // do other work while the commands are being streamed …
    handle.wait_timeout(Duration::from_secs(5))?;

    driver.stop();
    driver.disconnect();
    Ok(())
}
from fanuc_ucl import JointFormat, JointTemplate, ThreadConfig, stmo

def main():
    driver = stmo.StreamMotionDriver("10.0.0.1")
    driver.connect(ThreadConfig(80, None))
    driver.start(2.0)

    limits = driver.fetch_movement_limits(0)
    print(f"vmax = {limits.vmax}")

    cmd1 = stmo.MotionCommandPacket.try_from_joints(
        JointFormat.AbsDeg, JointTemplate.SIX,
        [-90.0, 0.0, 0.0, -180.0, 90.0, 180.0],
    )
    cmd2 = stmo.MotionCommandPacket.try_from_joints(
        JointFormat.AbsDeg, JointTemplate.SIX,
        [90.0, 0.0, 0.0, 180.0, -90.0, -180.0],
    )
    cmd2.set_last_command(True)

    handle = driver.command_motion([cmd1, cmd2])
    # do other work while the commands are being streamed …
    handle.wait_timeout(5.0)

    driver.stop()
    driver.disconnect()

In-the-loop control

The control loop interface (StmoControlLoop) lets you react to each robot status cycle — useful for sensor-based feedback or adaptive trajectories.

use std::time::Duration;

use fanuc_ucl::{
    joints::{JointFormat, JointTemplate},
    stmo::StreamMotionDriver,
    stmo::proto::MotionCommandPacket,
    ThreadConfig,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut driver = StreamMotionDriver::new([10, 0, 0, 1]);
    driver.connect(Some(ThreadConfig::new(80, None)))?;
    driver.start(2.0)?;

    {
        let mut ctl = driver.control_loop()?;
        for _ in 0..100 {
            let status = ctl.wait_for_status(Duration::from_millis(100))?;
            let cur = status.joints(JointFormat::AbsDeg);
            // compute next setpoint based on current feedback …
            let cmd = MotionCommandPacket::try_from_joints(
                JointFormat::AbsDeg,
                JointTemplate::SIX,
                &cur,
            )?;
            ctl.send_command(cmd)?;
        }
    } // control loop dropped — driver resumes normal hold behaviour

    driver.stop();
    driver.disconnect();
    Ok(())
}
from fanuc_ucl import JointFormat, JointTemplate, ThreadConfig, stmo

def main():
    driver = stmo.StreamMotionDriver("10.0.0.1")
    driver.connect(ThreadConfig(80, None))
    driver.start(2.0)

    with driver.itl() as ctl:
        for _ in range(100):
            status = ctl.wait_for_status(0.1)
            cur = status.joints(JointFormat.AbsDeg)
            # compute next setpoint based on current feedback …
            cmd = stmo.MotionCommandPacket.try_from_joints(
                JointFormat.AbsDeg, JointTemplate.SIX, cur,
            )
            ctl.send_command(cmd)

    driver.stop()
    driver.disconnect()

Roadmap

  • Pydocs and Rustdocs for all public APIs
  • Switch python terminal logging to pylog instead of tracing
  • Implement an "In The Loop" interface for the StreamMotionDriver to make using feedback from sensors easier.
  • Implement a unit-safe api for working with Cartesian poses.
  • Update docs to show the usage of stream motion and in-the-loop examples
  • Update docs to show the usage of async rmi/hmi response handles
  • Add async to hspo
  • Add support for async to python
  • Removing all possible panic locations and have graceful error handling for all failure modes.
  • Extensive unit testing, I wrote a special network testing library for this I just need to write the actual tests using it
  • A C api for the library, to allow usage from other languages like c#. The main issue is the extensive usage of rust style enums and traits in the API, so this will require some careful design to make a clean and safe C api. This is a long term goal and will likely be a separate crate that depends on this one.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fanuc_ucl-1.3.1.tar.gz (119.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fanuc_ucl-1.3.1-cp314-cp314t-win_amd64.whl (2.7 MB view details)

Uploaded CPython 3.14tWindows x86-64

fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

fanuc_ucl-1.3.1-cp314-cp314t-macosx_11_0_arm64.whl (2.3 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

fanuc_ucl-1.3.1-cp313-cp313t-win_amd64.whl (2.7 MB view details)

Uploaded CPython 3.13tWindows x86-64

fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.7 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARM64

fanuc_ucl-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

fanuc_ucl-1.3.1-cp310-abi3-win_amd64.whl (2.8 MB view details)

Uploaded CPython 3.10+Windows x86-64

fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

fanuc_ucl-1.3.1-cp310-abi3-macosx_11_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file fanuc_ucl-1.3.1.tar.gz.

File metadata

  • Download URL: fanuc_ucl-1.3.1.tar.gz
  • Upload date:
  • Size: 119.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1.tar.gz
Algorithm Hash digest
SHA256 61b784a62f24ddce794ce4bb37ae356ce29426dc1b56c52d896c607ead690244
MD5 817202fb9c6a6a5b44314aa85480ff9a
BLAKE2b-256 0545ca1ab204e97bc95dac226edd952bf29273476ea7f556fc17418c6b7fd10c

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 2ac40f48a4a21d489831f12af7c3c8a6855053cf07d7bd15095be8d497bbbf8b
MD5 b81ebcf6eddfb77490228b36d1aebb54
BLAKE2b-256 81a622dd30676d2a03d0fd0d31982432ea43533925925767c44f9c8ca4de761c

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.4 MB
  • Tags: CPython 3.14t, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9270a523c3fb63e10a3dffc07d54dfc3e4f0fcc3d7cc50c4c60d8ffa022d0ad
MD5 d8355cfe973359088bc969c10d0af33d
BLAKE2b-256 45ccb9e2876cf95968d4663009a115defc50149e7df037a690cdbc4ee0ef1d08

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.4 MB
  • Tags: CPython 3.14t, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4985f552a90e4dc8dccebfe2a7f65f2de9bd140b64e9496dc05fa6c876ef1de5
MD5 c786af96a93fb03712dd89dbeeb9530c
BLAKE2b-256 886fb5d70f1bc3d446ba227616a3a1aea221be0b33531137c4ad2d3dd2158ae2

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp314-cp314t-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.14t, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f22fafa283c93c3160c833919a09b4b58d9a79281b68eb61e705d82d520dab9
MD5 5e577be553c7c96eca336855315c8a52
BLAKE2b-256 702f061c6db653db77af17fcfa0cbe2e465679a78ec121e17e5b0eaf25bfb91e

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 267388c6ce7f3083c5c8736613350bb69b545f1578a362a7d3108730106a7509
MD5 9b59a77dcef0c161a410f45a00e43a4f
BLAKE2b-256 7112d7fd4f653b979faae13fabbffc65d9161f71d52b759707a405a9ca4dab22

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.13t, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0f16aaec48bd6709eb3942a791476f0a4fcae451e15d64bbbde3a14b73459221
MD5 a44e38cf1ad19203e842eb4ee582a870
BLAKE2b-256 bcb9f335e772e4ffe6f3de43e61efffe2d440063eb13239ad0024ecc812781f6

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.13t, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6c19428bf1c024d40bc74c8bc249d4221c5f075e4c600ddbc63c63c45a2d509a
MD5 661187f45bb1b347d14d42db1c631c12
BLAKE2b-256 872b12c821065b3835efa55659a3cc538cf5d5d9e7c3c2d4e935248b22f16d5a

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.13t, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5101b86acdb3236cb155f31fcc0bc25192e2230dfc1a2936eba418d29917ba13
MD5 b46360b6d8f51e067b7383ea8f912b34
BLAKE2b-256 75c76dd281d914faf6945b13fdcaa63cf59485e5cbb7a1cf01c70ce285ab6067

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 2.8 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 81af420504bbac095b388a60f451bee55f25ff062b450b2d9e73362b4ccb6853
MD5 a1b49dd06aace616997c22bd48ae30a8
BLAKE2b-256 e501da43ce0ae9e99dc56ad147991d3d3e14b7c32639cdb2b70a46e31a304c29

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.4 MB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d82df0d038b231c575756a8ae2023e52cbe3d7ccd2858265264868cb5e310495
MD5 8e4fed3c8b8d2eaec0daea32b1719fb2
BLAKE2b-256 062cfa6c35d1bc5f0f26740de9567f3b5b1e288196956ee6f0a06aa1eba59bca

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.4 MB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 14cde46f2d39eb1fe6ad74722f4a72b4bf0814e82de35d699ebf6f8a18cb10fb
MD5 54689deffb911fa7485c354da43f8efc
BLAKE2b-256 7e82a8b32bcac8d3e5916f5e1b7cbc364d9581cb366664a5fc8bdedfe50b674a

See more details on using hashes here.

File details

Details for the file fanuc_ucl-1.3.1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: fanuc_ucl-1.3.1-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.10+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fanuc_ucl-1.3.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 569f5ce1e98238aa45c17d8893cc8deefa53aa0c1b5a2f82180cae5d2a2e8be5
MD5 ac3d6d37411aeeab1c03d734d0169fe8
BLAKE2b-256 121970a75909f98a42bfd63b2d4660c8ddc4700999a8e08318c853ac7ae33256

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page