- 选型指南
- 概述
- 入门指南
- 机械臂参数
- 示教器使用
-
二次开发
-
API(C++)
- 快速开始
- 接口说明
- 7000端口接口说明
- 使用示例
- 返回值说明
-
API(Python)
- 快速开始
- 接口说明
- 7000端口接口说明
- 使用示例
- 返回值说明
- ROS2开发
-
API(C++)
- 相关下载
模式与 IO 控制接口示例
模式与 IO 控制接口示例
Python
# /**
# * ex_digital_io.py
# * @brief 模式与 IO 控制接口(包括设置机械臂模式、设置数字 IO 输出、查询数字 IO 输出、获取所有 IO 输入状态)
# * @attention 确保机械臂供电正常、网络通信正常
# * @note 运行步骤
# * 运行: python3 ex_digital_io.py
# */
import sys
import os
import platform
# 基于脚本所在目录构建 SDK Python 绑定的绝对路径
_script_dir = os.path.dirname(os.path.abspath(__file__))
# 自动检测平台,添加对应 SDK Python 绑定路径
if platform.system() == "Windows":
sys.path.append(os.path.join(_script_dir, "../../lib/windows/python"))
elif platform.machine() in ("aarch64", "arm64"):
sys.path.append(os.path.join(_script_dir, "../../lib/linux/arm64/python"))
else:
sys.path.append(os.path.join(_script_dir, "../../lib/linux/x86/python"))
# Windows: 将 tl_host.dll 所在目录加入 DLL 搜索路径
if platform.system() == "Windows":
_dll_dir = os.path.join(_script_dir, "../../lib/windows")
os.add_dll_directory(_dll_dir)
from tl_interface import *
import time
def enable_servo(socket_fd):
"""使能上电 ------
先清错,再检查伺服状态,报警则报错退出,最后上电"""
print("--- 检查伺服状态 ---")
# 1. 先清除控制器错误和报警,再下电复位确保状态同步
ret = clear_error(socket_fd)
time.sleep(0.3)
set_servo_poweroff(socket_fd)
time.sleep(0.3)
# 2. 检查伺服状态
state = -1
ret, state = get_servo_state(socket_fd, state)
if ret != SUCCESS:
print(f"[ERROR] 获取伺服状态失败: {ret}")
return
print(f" [信息] 当前伺服状态: {state} (0=停止 1=就绪 2=报警 3=运行)")
if state == 2:
print("[ERROR] 伺服处于报警状态,无法上电,请排查报警原因后重试")
return
if state == 3:
print("[INFO] 机械臂已在使能上电状态")
return
# 3. 上电流程
if state == 0:
print(" [信息] 伺服处于停止状态,设置就绪...")
ret = set_servo_state(socket_fd, 1)
if ret != SUCCESS and ret != OPERATION_NOT_ALLOWED:
print(f"[ERROR] 设置伺服就绪失败: {ret}")
return
time.sleep(0.5)
print(" [信息] 上电使能...")
ret = set_servo_poweron(socket_fd)
if ret != SUCCESS:
print(f"[ERROR] 上电失败: {ret}")
return
time.sleep(2)
# 4. 确认结果
_, state = get_servo_state(socket_fd, state)
if state == 3:
print("[INFO] 机械臂使能上电成功(servo_state = %d)" % state)
else:
print("[ERROR] 机械臂使能上电失败(servo_state = %d)" % state)
def disable_servo(socket_fd):
"""@brief 使能下电"""
state = -1
_, state = get_servo_state(socket_fd, state)
if state == 1:
print("[INFO] 机械臂已使能下电")
return
elif state == 3:
set_servo_poweroff(socket_fd) _, state = get_servo_state(socket_fd, state)
print("[INFO] 机械臂使能下电成功(servo_state = %d)" % state)
return
print("[INFO] 机械臂使能下电失败(servo_state = %d)" % state)
def demo_get_robot_running_state(socket_fd):
"""查询流程图编程运行状态"""
print("[INFO] **********查询流程图编程运行状态**********")
status = 0
ret, status = get_robot_running_state(socket_fd, status)
if ret != SUCCESS:
print("[ERROR] 查询流程图编程运行状态失败,错误码: %d" % ret)
return
if status == 0:
print("[INFO] 机械臂处于停止状态 (status = %d)" % status)
elif status == 1:
print("[INFO] 机械臂处于暂停状态 (status = %d)" % status)
elif status == 2:
print("[INFO] 机械臂处于运行状态 (status = %d)" % status)
print()
def main():
# 定义IP地址和端口
# 解析命令行参数: python3 ex_digital_io.py [-ip 192.168.1.13],默认
192.168.1.13
ip = "192.168.1.13"
if len(sys.argv) >= 3 and sys.argv[1] in ("-ip", "--ip"):
ip = sys.argv[2]
port = "6001"
# 获取 SDK 版本
version = get_library_version()
print("[INFO] SDK 版本: %s" % version)
# 连接控制器
print("[INFO] 连接控制器...")
socket_fd = connect_robot(ip, port)
if socket_fd < 0:
print("[ERROR] 连接失败,程序退出!")
return -1
print("[INFO] 连接成功 (socket=%d)" % socket_fd)
# 使能上电
enable_servo(socket_fd)
# ----设置机器人模式----
print("[INFO] **********设置机器人模式**********")
mode = 1
ret = set_current_mode(socket_fd, mode)
if ret != SUCCESS:
print("[ERROR] 设置机器人模式失败,程序退出!")
return -1
print("[INFO] 设置机器人模式成功")
print()
# ----设置数字 IO 输出----
print("[INFO] **********设置数字 IO 输出**********")
io_port = 1
value = 0
ret = set_digital_output(socket_fd, io_port, value)
if ret != SUCCESS:
print("[ERROR] 设置数字 IO 输出失败,程序退出!")
return -1
print("[INFO] 设置数字 IO 输出成功")
print()
# ----查询数字 IO 输出----
print("[INFO] **********查询数字 IO 输出**********")
outputValues = VectorInt()
ret = get_digital_output(socket_fd, outputValues)
if ret != SUCCESS:
print("[ERROR] 查询数字 IO 输出失败,程序退出!")
return -1
print("[INFO] 查询数字 IO 输出成功,状态为:", end="")
for state in outputValues:
print("%d " % state, end="")
print()
# ----获取所有 IO 输入状态----
print("[INFO] **********获取所有 IO 输入状态**********")
inputValues = VectorInt()
ret = get_digital_input(socket_fd, inputValues)
if ret != SUCCESS:
print("[ERROR] 查询数字 IO 输入失败,程序退出!")
return -1
print("[INFO] 查询数字 IO 输入成功,状态为:", end="")
for state in inputValues:
print("%d " % state, end="")
print()
# ----查询流程图编程运行状态----
demo_get_robot_running_state(socket_fd)
# 使能下电
disable_servo(socket_fd)
# 断开控制器连接
print("[INFO] 断开控制器连接...")
ret = disconnect_robot(socket_fd)
if ret != SUCCESS:
print("[ERROR] 断开连接失败,程序退出!")
return -1
print("[INFO] 断开连接成功")
return 0
if __name__ == "__main__":
main()
