# 纳博特 NexDroid 开放平台(二次开发文档) — 全量文档(中文) > 本文件由构建脚本(scripts/generate-llms.mjs)自动生成,随站点更新;每页正文之间以分隔线隔开,标题下方给出原文 URL。 > 单页 Markdown 版本:将 .html 替换为 .md(例如 https://open.inexbot.com/zh/01.概述.html → 01.概述.md)。 > 文档索引:https://open.inexbot.com/llms.txt | 站点入口:https://open.inexbot.com/zh/ --- # 概述 > 原文:https://open.inexbot.com/zh/01.%E6%A6%82%E8%BF%B0.html 纳博特是国内领先的工业机器人控制器厂商,自主研发的开放型 **NexDroid** 软件平台分离了运控算法层与应用层,让合作伙伴只需关注行业需求,即可开发 3C 电子、医疗、核能、工程机械、风电等行业的专有自动化装备。 *** ## 二次开发层级 纳博特软件平台提供六个层级的二次开发,用户可按需选择: | 开发方式 | 说明 | 平台 | 语言 | 入口 | | ------------- | ----------------------------- | --------------- | ----------------- | -------------------------------- | | **上位机开发** | 脱离示教器,通过 API 直接控制机器人 | Windows / Linux | C++ / C# / Python | [上位机](./04.上位机/index.md) | | **JSON 协议通信** | 遵循标准 JSON 协议操控控制器 | 跨平台 | 任意语言(TCP Socket) | [JSON 协议](./05.JSON-协议/index.md) | | **控制器二次开发** | 专有工艺开发、特殊机型支持、插补算法替换 | Linux | C++ | [控制器](./06.控制器/index.md) | | **示教器二次开发** | 定制专属 UI/UE,配合控制器实现专有功能 | Linux | Qt / C++ | [示教器](./07.示教器/index.md) | | **主站开发** | 控制器退化为工控机,提供实时系统和 EtherCAT 主站 | Linux (RT) | C / C++ | [主站库](./09.主站库/) | | **ROS 开发** | 控制器作为 ROS Node,按 ROS 协议控制 | Linux | C++ / Python | [ROS](./08.ROS/index.md) | > 不确定选哪种?参见[入门指南](./02.入门指南.md)的快速决策表,一分钟确定方案。 *** ## 目标受众 | 角色 | 典型需求 | 推荐开发方式 | | -------- | ---------------- | ---------------- | | **本体厂商** | 快速客制化控制系统,打造自有品牌 | 控制器 + 示教器二次开发 | | **集成商** | 开发专有工艺,保护行业知识 | 上位机开发 + JSON 协议 | | **科研用户** | 高精度运控算法研究,极限性能验证 | 控制器二次开发 + ROS | | **教育用户** | 培养设计制造机器人的综合能力 | 上位机(Python)+ ROS | *** ## 系统架构 纳博特机器人控制系统由以下核心组件构成: ```text ┌──────────────┐ ┌──────────────┐ │ 上位机 │ │ 示教器 │ │ (客户软件) │ │ (人机交互) │ └──────┬───────┘ └──────┬───────┘ │ 通信协议/SDK │ 网线 ▼ ▼ ┌─────────────────────────────────────┐ │ 控制器 │ │ Linux 实时系统 · 工控机 │ │ 运动规划 · 伺服控制 · 程序执行 │ └──────┬──────────────┬───────────────┘ │ EtherCAT │ ▼ ▼ ┌──────────┐ ┌──────────────┐ │ 伺服驱动器 │ │ IO 模块 │ │ ↓ ↓ ↓ │ │ (继电器/夹爪) │ │ 电机(各轴) │ └──────────────┘ └──────────┘ ``` | 组件 | 说明 | | --------- | -------------------------------------------------------------- | | **控制器** | 运行 Linux 实时系统的工控机,是整个系统的核心。负责运动规划、伺服控制、程序执行。通常安装在电气柜内,无独立显示界面。 | | **示教器** | 人机交互设备,通过网线连接控制器。操作员在示教器上编写程序、控制机器人、查看状态。 | | **上位机** | 客户自行开发的软件,通过 SDK 或通信接口控制控制器。与示教器的区别在于上位机可突破示教器功能局限,实现自定义逻辑。 | | **伺服驱动器** | 接收控制器指令,驱动电机转动。不同轴因负载不同,所需功率不同。 | | **IO 模块** | 输入/输出信号管理,控制继电器、夹爪、传感器等外围设备。 | > **调试环境:** 开发测试时,可使用**虚拟伺服**和**虚拟 IO** 在无真实硬件的环境中模拟运行。 *** ## 主要内容 ### Demo 示例 纳博特 Demo 示例提供了多个基于纳博特控制器典型应用的 Demo,支持 C、C++、Qt、C#、Python、ROS 等环境,用户可以在常见的开发环境中进行快速演示。Demo 内容覆盖机械臂的各种基础操作和高级功能,包括坐标系操作、力控、抓取、IO 功能、外部轴控制、ModbusRTU 通信、样条曲线运动、角度透传、在线编程以及算法等,使用户可以快速掌握各种 API 接口的应用。 → [浏览 Demo 示例](./03.Demo示例.md) ### 二次开发接口 纳博特二次开发接口(NexDroidAPI)将机械臂复杂功能进行接口化封装,用户无需底层开发即可使用机械臂的高级控制功能,降低了开发门槛。接口支持 C、C++、Qt、C#、Python、JSON、ROS 等开发环境,充分满足任意环境的部署需求。每份接口文档涵盖详细的接口说明、参数解释和示例代码,用户可以全面了解每个接口的功能和用法。 → 入口:[上位机](./04.上位机/index.md) · [JSON 协议](./05.JSON-协议/index.md) · [控制器](./06.控制器/index.md) · [示教器](./07.示教器/index.md) ### 相关资源下载 软件二次开发资源包提供了 API 接口包、SDK 包、ROS 包等下载资源,含版本号、平台兼容矩阵和校验信息。基于软件包用户可以便捷地进行二次开发,快速进行应用部署。 → [下载 SDK](./12.相关下载.md) *** ## 技术支持 - 遇到问题先查阅[常见问题](./11.常见问题.md) - 官网: - 视频教程:[纳博特运动控制 - 哔哩哔哩](https://space.bilibili.com/2230767) - 技术支持邮箱: - 关注微信公众号、微信小程序获取最新资讯和产品手册

微信公众号 微信小程序

扫码关注微信公众号      扫码体验微信小程序

--- # 入门指南 > 原文:https://open.inexbot.com/zh/02.%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97.html 纳博特控制器提供多种二次开发方式。本指南帮你根据目标、技术栈和场景选择最合适的方案。 *** ## 快速决策表 | 你的目标 | 推荐方案 | 语言/协议 | 平台 | 难度 | 文档入口 | | ---------------- | --------- | -------------------- | --------------- | -- | ------------------------------------------------------------------------------------------------------------------------------- | | 编写 PC 端控制软件 | 上位机开发 | C++, C#, Python | Windows / Linux | 低 | [C++](./04.上位机/01.C++/01.文档/index.md) · [C#](./04.上位机/02.CSharp/01.文档/01.环境搭建.md) · [Python](./04.上位机/03.Python/01.文档/index.md) | | 通过 TCP 远程控制机器人 | JSON 协议通信 | 任意语言 (JSON over TCP) | 跨平台 | 中 | [RTL-22.07](./05.JSON-协议/01.RTL-22.07/index.md) · [RTL-24.03](./05.JSON-协议/02.RTL-24.03/index.md) | | 定制控制器底层行为 | 控制器二次开发 | C++ | Linux | 高 | [控制器开发指南](./06.控制器/index.md) | | 定制示教器界面 | 示教器二次开发 | C++ / Qt | Linux | 中高 | [示教器开发指南](./07.示教器/index.md) | | 集成 ROS 生态 | ROS 开发 | C++, Python | Linux | 中高 | [ROS 集成指南](./08.ROS/index.md) | | 搭建 EtherCAT 实时主站 | 主站开发 | C / C++ | Linux (RT) | 高 | [主站库说明](./09.主站库/) | *** ## 开发方式说明 ### 1. 上位机开发 在 PC 上通过 API 直接控制机器人,摆脱示教器限制,适合自动化集成、数据采集、远程监控等场景。 **支持语言和平台:** | 语言 | 平台 | 工具链 | | ------ | --------------- | ------------ | | C++ | Windows | MSVC / MinGW | | C++ | Linux | GCC | | C# | Windows | .NET | | Python | Windows / Linux | Python 3.x | **入门路径:** 选择语言 → 下载 SDK → 初始化项目 → 调用 API 连接控制器 → 运行示例 **适合用户:** 需要进行机器人高层控制、自动化操作或系统集成的开发人员。支持多语言,可根据项目需求灵活选择技术栈。 *** ### 2. JSON 协议通信 通过标准 JSON 消息与控制器通信,适用于跨语言、跨平台的远程控制和数据交换。 **协议特点:** - 基于 TCP 通信,端口 5000(文件传输)、6000/6001(JSON 文本命令通信)、7000(上位机服务功能) - 与编程语言无关,任何支持 TCP Socket 的语言均可使用 > RTL-22.07 和 RTL-24.03 均为稳定版本,使用相同的端口体系。6000 端口一般用于示教器通信,6001 端口一般用于上位机通信。当前主流出货版本为 RTL-24.03。 **前提知识:** - TCP Socket 编程基础 - JSON 数据格式 **入门路径:** 选择协议版本 → 查阅消息格式 → 建立 Socket 连接 → 发送指令 **适合用户:** 需要通过标准化协议与机器人进行远程控制或集成的开发人员。JSON 协议轻量、跨平台,适合保护自有工艺数据的集成商。 *** ### 3. 控制器二次开发 在控制器 Linux 环境上开发底层算法,替换或扩展控制器的核心功能。 **应用场景:** 专有工艺开发、特殊机型支持、插补算法替换等。 **前提知识:** - C++ 编程(面向对象、数据结构) - Linux 系统编程(进程管理、内存管理) - 机器人控制理论(运动学、动力学、插补算法) **入门路径:** 安装交叉编译环境 → 编写定制内容 → 编译并部署到控制器 → 调试 **适合用户:** 控制器硬件和算法开发人员,具有较强的底层编程能力,需要定制插补算法、特殊机型支持或专有工艺。 *** ### 4. 示教器二次开发 定制示教器用户界面和交互功能,实现与控制器的协同工作。 **应用场景:** 定制专属 UI/UE,配合控制器二次开发实现专有功能。 **前提知识:** - C++ 编程 - Qt 框架(信号与槽、QML、UI 设计) - Linux 系统基础操作 **入门路径:** 搭建 Qt 开发环境 → 创建示教器项目 → 设计 UI → 关联控制器功能 **适合用户:** UI/UE 开发人员,具备前端开发经验,希望为机器人系统提供自定义操作界面的工程师。 *** ### 5. ROS 开发 将纳博特控制器集成到 ROS 网络中,实现机器人系统的实时监控和控制。 > ROS 开发使用 ROS 原生通信机制(话题/服务),不涉及 JSON 格式或 HTTP 协议。 **前提知识:** - ROS 基本概念(节点、话题、服务、动作) - C++ 或 Python 编程 - ROS 工具链(MoveIt、RViz 等) **入门路径:** 安装 ROS → 配置 ROS 环境 → 启动纳博特 ROS 节点 → 在 ROS 网络中发布/订阅控制指令 **适合用户:** 科研用户和 ROS 开发者,需要将纳博特控制器集成到已有 ROS 系统中的工程师。ROS 生态提供丰富的工具库,适合复杂算法研究和多机器人协同。 *** ### 6. 主站开发 将控制器退化为工控机,在其上运行 EtherCAT 实时主站,实现高度定制化的实时控制系统。 **应用场景:** 满足客户对实时控制的需求,可在该平台上开发实时控制系统和工业网络通信协议。 **前提知识:** - C / C++ 编程 - EtherCAT 协议基础 - 实时操作系统(RTOS / Xenomai) **入门路径:** 搭建交叉编译环境 → 初始化主站库 → 配置 EtherCAT 总线 → 编写实时任务 **适合用户:** 工业自动化和嵌入式系统开发人员,尤其是需要定制实时控制系统和网络通信协议的工程师。 *** ## 按用户角色推荐 ### 本体厂商 目标:快速客制化控制系统,打造自有机器人大脑,提高品牌辨识度。 推荐 **控制器二次开发 + 示教器二次开发**。本体厂商通常需要定制化的控制算法以适配其硬件,控制器二次开发允许对底层控制进行深度定制,调整运动控制、插补算法等。示教器二次开发则可打造专有用户界面,提升品牌辨识度。 **技术要求:** 对机器人有较深了解,熟悉 C++ 编程和控制算法,具备 Linux 系统开发能力。 ### 集成商 目标:开发专有工艺,保护自有行业知识,打造产品护城河。 推荐 **上位机开发 + JSON 协议通信**。集成商需要集成自己的专有工艺和技术,上位机开发可通过 API 进行机器人控制,同时收集处理数据;JSON 协议作为轻量级通信方式,适合标准化数据传输,保护自有工艺数据。 **技术要求:** 熟悉网络协议和数据交换,能够进行系统集成和高效数据传输,掌握至少一种上位机开发语言。 ### 科研用户 目标:专注高精度运控算法研究,深挖机器人极限性能。 推荐 **控制器二次开发 + ROS 开发**。控制器二次开发提供深度定制运动控制和算法的平台;ROS 支持多机器人协同工作,丰富的工具库帮助实现复杂算法研究和创新。 **技术要求:** 高度的技术研发能力,熟悉控制算法、ROS 开发和高精度运动控制,具备 C++ 和 Python 编程能力。 ### 教育用户 目标:培养学生不仅会用机器人,更能设计和制造机器人。 推荐 **上位机开发(Python)+ ROS 开发**。Python 简单易用,适合快速上手和基础编程教学;ROS 有广泛社区支持和丰富学习资源,配合示例程序帮助学生理解机器人控制原理。 **技术要求:** 对机器人操作有基本了解,熟悉图形界面开发和基础编程语言,具备教学场景下的课程设计能力。 *** ## 运动控制方式对比 机器人执行运动有三种方式,适用于不同场景。上位机 SDK 用户主要使用后两种。 | 方式 | 适用场景 | 特点 | 支持平台 | | --------------- | --------- | ------------------------------ | --------- | | **作业文件模式** | 固定任务、批量生产 | 预编程序列,可循环执行,支持完整逻辑控制(条件/循环/IO) | 示教器 + 上位机 | | **队列模式(无作业文件)** | 上位机实时控制 | 不依赖作业文件,直接下发目标点,适合动态路径生成 | 上位机 SDK | | **追加模式** | 视觉引导、动态避障 | 边运动边追加新指令,无需预编译,支持实时决策 | 仅上位机 SDK | > **追加模式**无法通过示教器实现,必须通过 SDK 或通信协议调用。 ## 入门小贴士 - **前提知识:** 对机器人操作有基本了解,熟悉图形界面开发和基础编程语言 - **先读文档:** 各开发方式都提供了详细的文档和示例代码,建议在开始之前先通读相关章节 - **灵活选择:** 初期阶段保持开发路径的开放性,有助于后期快速迭代 - **社区支持:** ROS 和 JSON 协议有广泛的社区支持,可通过在线论坛和教程获取帮助 ## 不确定如何选择? 如果仍不清楚从何入手,按以下顺序尝试: 1. **先看** **[Demo](./03.Demo示例.md)** — 下载并运行对应语言的 Demo,直观感受工作流程 2. **从 Python 开始** — 环境最简单、调试最方便,适合快速验证想法 3. **需要更多功能再查 C++ / C#** — 性能和接口更全面 4. **需要跨语言通讯选 JSON** — 适用于已有 TCP 通信基础的系统集成场景 如果仍有疑问,请查阅[常见问题](./11.常见问题.md)、[版本与兼容性](./版本与兼容性.md)或发送邮件至 。 --- # Demo 示例 > 原文:https://open.inexbot.com/zh/03.Demo%E7%A4%BA%E4%BE%8B.html 纳博特提供多语言、多环境的 Demo 源码,覆盖机械臂基础操作到高级工艺功能,帮助开发者快速上手。 --- ## 上位机开发 Demo ### C++ Demo 涵盖连接管理、伺服控制、运动控制、队列运动、错误回调、作业文件操作、传送带跟踪、焊接工艺等完整示例。 - **开发环境:** Visual Studio 2022 (MSVC) / Qt Creator (MinGW) / Linux GCC - **核心文件:** `main.cpp`、`Api.cpp`、`Api.h` - **头文件:** `nrc_interface.h`、`nrc_queue_operate.h`、`nrc_craft_weld.h`、`nrc_define.h` ### C# Demo WinForms 完整上位机应用,包含连接管理、伺服状态监控、运动控制、IO 控制、DH 参数查看、作业文件管理、视觉工艺、传送带工艺、焊接工艺等模块的交互界面。 - **开发环境:** Visual Studio 2022,.NET Framework 4.7.2 / .NET 8.0 - **核心文件:** `Form1.cs`、`API.cs`、`NbtRobot.cs` - **SDK 封装:** `Csharp_api/` 目录(SWIG 自动生成) ### Python Demo PyQt5 图形化上位机,支持连接、伺服控制、队列运动(movJ/movL)、servo_move 跟踪运动、作业文件上传下载、位置监控等功能。 - **开发环境:** Python 3.8+,PyQt5 - **核心文件:** `main.py`、`Widget.py`、`nrc_interface.py` - **本地库:** `_nrc_host.so`(随 SDK 包分发) --- ## 控制器二次开发 Demo 包含自定义指令的控制器侧实现示例。 --- ## 示教器二次开发 Demo 包含自定义指令的示教器侧 UI 实现示例。 --- ## JSON 协议二次开发 Demo 基于 JSON 文本协议直接与控制器通信的示例。 --- ## HAL二次开发 Demo --- ## 相关下载 所有 Demo 源码及 SDK 包统一在[下载页](./12.相关下载.md)提供。 --- # 一、MinGW + Qt Creator(Windows) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/01.MinGW%20%E7%8E%AF%E5%A2%83.html > **重要:** SDK 与编译器的 ABI 必须匹配。MinGW 编译的库与 MSVC 编译的库**不能混用**。下载 SDK 时请选择 MinGW 版本。 ## 1.1 创建项目 打开 Qt Creator,创建一个 **Qt Widgets Application**,命名为 `qt_demo`。 ## 1.2 导入 SDK 在项目根目录下新建 `libs` 文件夹,将 SDK 文件拷贝进去: ```text 项目根目录/ ├── libs/ │ ├── include/ │ │ ├── c_interface/ │ │ ├── cpp_interface/ │ │ └── parameter/ │ ├── libnrc_host.dll.a # MinGW 导入库 │ └── nrc_host.dll # 运行时动态库 ├── main.cpp ├── mainwindow.h ├── mainwindow.cpp ├── mainwindow.ui └── qt_demo.pro ``` 在 `qt_demo.pro` 末尾添加 SDK 引用: ```makefile # 1. 指定头文件路径 INCLUDEPATH += $$PWD/libs/include # 2. 指定库文件搜索路径 LIBS += -L$$PWD/libs # 3. 链接库文件(注意名称格式) LIBS += -lnrc_host # 4. 生成后自动复制 DLL 到输出目录 win32 { DLL_SOURCE = $$shell_path($${PWD}\\libs\\nrc_host.dll) DLL_TARGET = $$shell_path($${OUT_PWD}\\\\) QMAKE_POST_LINK += $$quote(cmd /c copy /Y $$quote($$DLL_SOURCE) $$quote($$DLL_TARGET)) } ``` ## 1.3 编写最小连接代码 ### (1) 修改 nrc_api.h 头文件包含路径 由于 SDK 的 `nrc_api.h` 中引用的头文件路径可能与实际目录结构不一致,需要修改 `libs/include/cpp_interface/nrc_api.h`,将其中引用的头文件路径改为直接使用文件名(因为它们与 `nrc_api.h` 位于同一 `cpp_interface/` 目录下): ```cpp #ifndef INCLUDE_CPP_INTERFACE_NRC_API_H_ #define INCLUDE_CPP_INTERFACE_NRC_API_H_ #include "nrc_craft_conveyor_belt_track.h" #include "nrc_craft_vision.h" #include "nrc_craft_weld.h" #include "nrc_interface.h" #include "nrc_io.h" #include "nrc_job_operate.h" #include "nrc_modbus.h" #include "nrc_queue_operate.h" #include "nrc_track.h" #include "nrc_dual_arm.h" #endif /* INCLUDE_API_NRC_API_H_ */ ``` ### (2) 修改 cpp_interface/ 下头文件对 parameter/ 目录的引用路径 `nrc_api.h` 所包含的各个头文件(如 `nrc_craft_conveyor_belt_track.h` 等)内部还会引用 `parameter/` 目录下的头文件。由于这些头文件位于 `cpp_interface/` 目录下,需要使用相对路径 `../parameter/` 来定位 `parameter/` 目录。 以 `nrc_craft_conveyor_belt_track.h` 为例,将其内部的头文件引用修改为如下形式: ```cpp #ifndef INCLUDE_CPP_INTERFACE_NRC_CRAFT_CONVEYOR_BELT_TRACK_H_ #define INCLUDE_CPP_INTERFACE_NRC_CRAFT_CONVEYOR_BELT_TRACK_H_ #include "../parameter/nrc_define.h" #include "../parameter/nrc_craft_conveyor_belt_track_parameter.h" ...... ``` > **提示:** 需要对 `cpp_interface/` 目录下**所有**头文件逐一检查,凡是引用了 `parameter/` 目录下头文件的地方,都要统一使用 `../parameter/xxx.h` 的相对路径格式。常见的被引用文件包括 `nrc_define.h`、各类 `*_parameter.h` 等。 ### (3) 编写连接测试代码 在 `mainwindow.cpp` 中添加头文件和连接测试: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "libs/include/cpp_interface/nrc_api.h" // SDK 头文件 #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 1. 连接控制器 SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { ui->statusbar->showMessage("连接失败,请检查 IP 和端口"); return; } // 2. 等待连接就绪 while (get_connection_status(fd) != 0) { QApplication::processEvents(); } ui->statusbar->showMessage("连接成功!fd=" + QString::number(fd)); qDebug() << "SDK 版本:" << QString::fromStdString(get_library_version()); } MainWindow::~MainWindow() { delete ui; } ``` ## 1.4 编译运行 选择 MinGW 编译套件,点击运行。如果状态栏显示"连接成功",说明 SDK 配置正确。 > **验证标准:** 不是"头文件能引入",而是**实际连接控制器成功**。如果编译报链接错误,请检查 `LIBS` 路径和库文件名是否匹配。 ## 下一步 完成连接测试后,请浏览[接口示例](../../03.示例/index.md)了解更多 API 用法。 --- # 二、MSVC + Visual Studio(Windows) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/02.MSVC%20%E7%8E%AF%E5%A2%83.html **环境要求:** Visual Studio 2019+,MSVC 编译工具链,x64 架构。 > **重要:** SDK 与编译器的 ABI 必须匹配。MSVC 编译的库与 MinGW 编译的库**不能混用**。下载 SDK 时请选择 MSVC 版本。 ## 2.1 创建项目 选择 **C++ 控制台应用** 创建,命名为 `cpp_demo`。 ## 2.2 导入 SDK 将 SDK 文件拷贝到项目目录: ```text 项目根目录/ ├── libs/ │ ├── include/ │ │ ├── c_interface/ │ │ ├── cpp_interface/ │ │ └── parameter/ │ ├── nrc_host.lib # MSVC 导入库 │ └── nrc_host.dll # 运行时动态库 └── cpp_demo.cpp └── cpp_demo.aps └── cpp_demo.rc └── cpp_demo.vcxproj └── resource.h ``` ## 2.3 配置 Visual Studio 右键项目 → **属性 (Properties)**,按以下步骤配置: ### (1) 添加头文件路径 **Configuration Properties → C/C++ → 常规 → 附加包含目录** ```text $(ProjectDir)libs\include ``` ### (2) 添加库路径 **Configuration Properties → 链接器 → 常规 → 附加库目录** ```text $(ProjectDir)libs ``` ### (3) 链接库文件 **Configuration Properties → 链接器 → 输入 → 附加依赖项** ```text nrc_host.lib ``` ### (4) 生成后自动复制 DLL **Configuration Properties → 生成事件 → 生成后事件 → 命令行** ```text copy "$(ProjectDir)libs\nrc_host.dll" "$(OutDir)" ``` ## 2.4 编写最小连接代码 ### (1) 修改 nrc_api.h 头文件包含路径 由于 SDK 默认的 `nrc_api.h` 中引用的头文件路径是相对于 `cpp_interface/` 目录的,而 Visual Studio 项目的附加包含目录配置为 `libs\include`,因此需要修改 `libs\include\cpp_interface\nrc_api.h` 文件的内容,将其中引用的头文件路径改为相对于 `cpp_interface/` 目录的形式: ```cpp #ifndef INCLUDE_CPP_INTERFACE_NRC_API_H_ #define INCLUDE_CPP_INTERFACE_NRC_API_H_ #include "nrc_craft_conveyor_belt_track.h" #include "nrc_craft_vision.h" #include "nrc_craft_weld.h" #include "nrc_interface.h" #include "nrc_io.h" #include "nrc_job_operate.h" #include "nrc_modbus.h" #include "nrc_queue_operate.h" #include "nrc_track.h" #include "nrc_dual_arm.h" #endif /* INCLUDE_API_NRC_API_H_ */ ``` > **提示:** 确保每个 `#include` 都直接使用文件名,不带额外的路径前缀,因为这些头文件都与 `nrc_api.h` 位于同一 `cpp_interface/` 目录下。 ### (2) 修改 cpp_interface/ 下头文件对 parameter/ 目录的引用路径 `nrc_api.h` 所包含的各个头文件(如 `nrc_craft_conveyor_belt_track.h`、`nrc_interface.h` 等)内部还会引用 `parameter/` 目录下的头文件。由于这些头文件位于 `cpp_interface/` 目录下,需要使用相对路径 `../parameter/` 来定位 `parameter/` 目录。 以 `nrc_craft_conveyor_belt_track.h` 为例,将其内部的头文件引用修改为如下形式: ```cpp #ifndef INCLUDE_CPP_INTERFACE_NRC_CRAFT_CONVEYOR_BELT_TRACK_H_ #define INCLUDE_CPP_INTERFACE_NRC_CRAFT_CONVEYOR_BELT_TRACK_H_ #include "../parameter/nrc_define.h" #include "../parameter/nrc_craft_conveyor_belt_track_parameter.h" ...... ``` > **提示:** 需要对 `cpp_interface/` 目录下**所有**头文件逐一检查,凡是引用了 `parameter/` 目录下头文件的地方,都要统一使用 `../parameter/xxx.h` 的相对路径格式。常见的被引用文件包括 `nrc_define.h`、各类 `*_parameter.h` 等。 ### (3) 编写连接测试代码 ```cpp #include #include #include "libs/include/cpp_interface/nrc_api.h" int main() { // 1. 连接控制器 SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { std::cout << "连接失败,请检查 IP 和端口" << std::endl; return 1; } // 2. 等待连接就绪 while (get_connection_status(fd) != 0) { Sleep(200); } std::cout << "连接成功!fd = " << fd << std::endl; std::cout << "SDK 版本: " << get_library_version() << std::endl; // 3. 断开连接 disconnect_robot(fd); return 0; } ``` ## 2.5 编译运行 选择 **Release x64** 配置,点击"本地 Windows 调试器"。控制台输出 "连接成功" 即表示配置正确。 > 如果使用 Debug 版本的库,需将配置切换为 Debug x64。 ## 下一步 完成连接测试后,请浏览[接口示例](../../03.示例/index.md)了解更多 API 用法。 --- # 三、Linux + GCC > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/03.Linux%20%E7%8E%AF%E5%A2%83.html ## 3.1 目录结构 ```text 项目目录/ ├── include/ │ ├── c_interface/ # C 接口头文件 │ ├── cpp_interface/ # C++ 接口主入口 │ └── parameter/ # 参数结构体头文件 ├── lib/ │ └── libnrc_host.so # Linux 动态库 ├── src/ │ └── main.cpp └── Makefile ``` ## 3.2 Makefile ```makefile TARGET=demo all: g++ -o $(TARGET) src/*.cpp -I./include -L./lib -lnrc_host -lpthread -lm -ldl -lrt -lstdc++ -std=c++11 -fPIC clean: rm -f $(TARGET) ``` ## 3.3 运行时动态库路径 编译成功后运行前,需要让系统能找到 `libnrc_host.so`: ```bash # 方式一:设置 LD_LIBRARY_PATH export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH ./demo # 方式二:将库复制到系统目录 sudo cp lib/libnrc_host.so /usr/local/lib/ sudo ldconfig ./demo ``` ## 3.4 头文件路径与最小连接代码 ### 3.4.1 头文件包含路径 SDK 头文件之间存在两层 `#include` 关系,集成到自有工程时若目录结构与 3.1 节不同,需要同步调整这些路径,否则编译会报 `No such file or directory`。 **第一层:`nrc_api.h` 包含同目录下的其他接口头文件** `nrc_api.h` 与下列头文件同位于 `include/cpp_interface/` 目录,直接用文件名引用即可: ```cpp // include/cpp_interface/nrc_api.h #include "nrc_craft_conveyor_belt_track.h" #include "nrc_craft_vision.h" #include "nrc_craft_weld.h" #include "nrc_interface.h" #include "nrc_io.h" #include "nrc_job_operate.h" #include "nrc_modbus.h" #include "nrc_queue_operate.h" #include "nrc_track.h" #include "nrc_dual_arm.h" ``` **第二层:被包含的头文件再引用 `parameter/` 目录下的参数头文件** 由于 `cpp_interface/` 与 `parameter/` 是 `include/` 下的平级目录,被包含的头文件使用 `../parameter/` 相对路径引用参数定义。以 `nrc_craft_conveyor_belt_track.h` 为例: ```cpp // include/cpp_interface/nrc_craft_conveyor_belt_track.h #include "../parameter/nrc_define.h" #include "../parameter/nrc_craft_conveyor_belt_track_parameter.h" ``` > 若你的工程把 `parameter/` 放到了其他位置(如 `cpp_interface/` 内部,或重命名了目录),需要同步修改这些 `#include` 路径。 ### 3.4.2 最小连接代码 ```cpp #include #include #include "../include/cpp_interface/nrc_api.h" int main() { std::cout << "正在连接控制器..." << std::endl; SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { std::cout << "连接失败" << std::endl; return 1; } // 等待连接就绪 while (get_connection_status(fd) != 0) { usleep(200000); } std::cout << "连接成功: " << fd << std::endl; std::cout << "SDK 版本: " << get_library_version() << std::endl; std::cout << "连接状态: " << get_connection_status(fd) << std::endl; // 断开连接 disconnect_robot(fd); return 0; } ``` ## 3.5 编译运行 ```bash make export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH ./demo ``` 输出 `连接成功: 1` 即表示配置正确。 ## 下一步 完成连接测试后,请浏览[接口示例](../../03.示例/index.md)了解更多 API 用法。 --- # 架构说明 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/01.%E6%96%87%E6%A1%A3/02.%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E.html `libnrc_host` 是基于 Socket API 通讯协议封装的 C++ 动态库,提供网络接口供上位机快速集成控制器功能。 ## 系统架构 ```text ┌──────────────────────┐ │ 上位机应用程序 │ │ (C++/C#/Python 通过 │ │ SDK 调用接口) │ └──────────┬───────────┘ │ TCP Socket (JSON 协议) ▼ ┌──────────────────────┐ │ 纳博特控制器 │ │ Linux 实时系统 │ └──────────────────────┘ ``` 上位机通过 TCP Socket 连接控制器的指定端口,以 JSON 文本格式发送指令和接收响应。`libnrc_host` 封装了网络通信、JSON 编解码和接口调用,开发者无需关心底层通信细节。 ## SDK 组成 | 组件 | 路径 | 说明 | |------|------|------| | `libnrc_host.dll` / `.so` | SDK 根目录 | 核心动态库,封装全部接口 | | `include/cpp_interface/` | 头文件目录 | C++ 接口声明(按模块拆分) | | `include/parameter/` | 参数头文件目录 | 数据结构与枚举定义 | | `include/c_interface/` | C 接口目录 | 跨语言 ABI 兼容封装 | ## 头文件模块 | 头文件 | 模块 | |--------|------| | `nrc_api.h` | 主入口,聚合所有接口 | | `nrc_interface.h` | 连接管理、伺服控制、运动控制、工具手、坐标系、标定 | | `nrc_io.h` | 数字/模拟 IO、远程 IO、安全 IO | | `nrc_modbus.h` | Modbus 主站(TCP/RTU) | | `nrc_track.h` | 轨迹记录与回放 | | `nrc_dual_arm.h` | 双臂机器人 | | `nrc_vfd_ctr.h` | VFD 主轴变频器 | | `nrc_job_operate.h` | 作业文件管理、运动/逻辑指令插入 | | `nrc_queue_operate.h` | 队列运动模式 | | `nrc_craft_weld.h` | 焊接工艺 | | `nrc_craft_pallet.h` | 码垛工艺 | | `nrc_craft_vision.h` | 视觉工艺 | | `nrc_craft_laser_cutting.h` | 激光切割工艺 | | `nrc_craft_conveyor_belt_track.h` | 传送带跟踪工艺 | | `nrc_define.h` | 宏定义、枚举、基础数据结构 | ## 端口体系 | 端口 | 用途 | |------|------| | 6000 | 控制/查询:上下电、模式切换、状态查询(通常示教器使用) | | 6001 | 上位机 SDK 命令端口:运动和程序控制(C++/C#/Python SDK 使用) | | 7000 | 伺服跟踪数据:servo_move、点位运动控制、状态回调 | | 5000 | 文件传输:作业文件上传/下载/备份 | > **SDK 用户通常使用 6001 端口。** servo_move 等跟踪运动需要额外连接 7000 端口。 ## ABI 兼容性 C++ SDK 分为两个 ABI 版本,**不能混用**: | 编译器 | 平台 | 导入库 | |--------|------|--------| | MSVC (Visual Studio 2019+) | Windows x64 | `nrc_host.lib` | | MinGW (GCC 8.3+) | Windows x64 | `libnrc_host.dll.a` | | GCC (8.3+) | Linux x64 / ARM64 | `libnrc_host.so` | ## 通信模型 `libnrc_host` 采用 JSON 文本协议进行请求/响应交互,支持两种通信模式: | 模式 | 说明 | 典型场景 | |------|------|----------| | 同步请求/响应 | 上位机发送指令,阻塞等待控制器回复 | 参数设置、状态查询、标定计算 | | 异步回调 | 控制器主动推送数据,通过注册的回调函数接收 | 7000 端口伺服跟踪、状态变化通知 | **请求流程:** 上位机构造 JSON 指令 → TCP 发送 → 控制器解析执行 → 返回 JSON 响应 → SDK 解析为返回值/输出参数。 **回调机制:** 调用 `send_message` / `recv_message` / `set_receive_error_or_warnning_message_callback` 等注册回调函数后,控制器事件到达时 SDK 在内部线程触发回调,开发者无需主动轮询。 ## 多机器人支持 控制器支持 1~4 台机器人协同工作,SDK 提供两种调用方式: | 方式 | 接口 | 说明 | |------|------|------| | 单机器人 | `robot_xxx(...)`(如 `robot_movej`) | 默认操作 1 号机器人 | | 多机器人 | `robot_xxx_robot(fd, robotNum, ...)` | 通过 `robotNum` 参数指定机器人编号(1-4) | > 多机器人并行需先调用 `set_robots_parallel` 开启并行模式;外部轴跟随主机器人编号管理。 ## 工艺扩展架构 工艺类功能以独立头文件形式提供,通过工艺号(1-9)管理多套参数: | 头文件 | 工艺 | 典型接口 | |--------|------|----------| | `nrc_craft_weld.h` | 焊接 | 焊接参数配置、送丝/退丝/送气、摆焊 | | `nrc_craft_pallet.h` | 码垛 | 码垛参数设置、状态查询 | | `nrc_craft_vision.h` | 视觉 | 视觉参数、标定、目标点计算 | | `nrc_craft_laser_cutting.h` | 激光切割 | 全局/工艺/模拟量/IO 参数 | | `nrc_craft_conveyor_belt_track.h` | 传送带跟踪 | 传送参数、编码器、PID 同步 | 工艺参数采用"设置/查询"成对接口,设置前需先指定工艺号,与示教器工艺配置保持数据一致。 ## 数据流说明 | 端口 | 数据方向 | 内容 | 典型接口 | |------|----------|------|----------| | 6001 | 双向 | 命令流:控制指令与响应(JSON) | `robot_movel`、`set_servo_state` | | 7000 | 双向 | 伺服数据流:点位跟踪、状态回调 | `servo_move`、`servo_point_position_motion_control` | | 5000 | 双向 | 文件流:作业文件上传/下载/备份 | `file_upload` 等文件接口 | > 6001 为 SDK 主命令端口;涉及伺服跟踪(如外部点移动、点位运动控制)需同时连接 7000 端口。 --- # 核心概念 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/01.%E6%96%87%E6%A1%A3/03.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html 使用 C++ SDK 前需要了解以下关键概念。 ## 连接生命周期 ```text connect_robot() → 等待连接就绪 → 操作(伺服/运动/查询) ↓ disconnect_robot() ``` 1. **连接:** `connect_robot(ip, port)` 返回 socket 文件描述符(SOCKETFD),失败返回 ≤0 2. **等待就绪:** 连接成功后需轮询 `get_connection_status()` 直到返回 `SUCCESS(0)` 3. **操作:** 通过 socketFd 调用所有接口 4. **断开:** `disconnect_robot(fd)` 主动断开 ## 坐标系 | 坐标系 | coord 参数 | 说明 | |--------|-----------|------| | 关节坐标 | 0 | 各关节电机的角度位置 | | 直角坐标 | 1 | 末端相对于机器人底座的世界位置 | | 工具坐标 | 2 | 末端安装工具后的工具端点位置 | | 用户坐标 | 3 | 在工作台上自定义的局部坐标系 | ## 伺服状态机 ```text 停止(0) → 就绪(1) → 运行(3) ↑ ↓ ↓ ←←←←← 报警(2) ←←←←←← ``` | 状态码 | 说明 | |--------|------| | 0 | 停止 — 未使能,可进行清错操作 | | 1 | 就绪 — 已清错,等待上电 | | 3 | 运行 — 已上电,可执行运动指令 | > 上电前必须先设为就绪状态:`set_servo_state(fd, 1)` → `set_servo_poweron(fd)` ## 运动模式 | 模式 | 函数 | 特点 | |------|------|------| | MoveJ | `robot_movej` | 关节空间点到点,快速但路径不定 | | MoveL | `robot_movel` | 笛卡尔空间直线运动 | | Jog | `robot_start_jogging` / `robot_stop_jogging` | 手动点动 | | Queue | `queue_motion_push_back_*` + `queue_motion_send_to_controller` | 无作业文件队列运动 | | Servo | `servo_move` | 7000 端口伺服跟踪 | ## 返回值 | 返回值 | 含义 | |--------|------| | `SUCCESS` (0) | 调用成功 | | 其他值 | 错误码,具体含义参见错误码表 | > 异步接口返回值仅表示"指令已接收",不代表执行完毕。实际执行结果通过回调或状态查询获取。 ## 线程安全 - 所有接口以 socketFd 区分连接,不同 socketFd 之间线程安全 - 同一 socketFd 的并发调用需自行加锁 - 回调函数内不应执行阻塞或耗时操作 ## 坐标系深化 ### 工具坐标系 工具坐标系定义末端工具的中心点(TCP)位置与姿态,默认工具坐标系原点为法兰盘中心,+Z 方向垂直法兰向外。 **工具手参数:** | 参数 | 含义 | 单位 | |------|------|------| | X/Y/Z | 工具 TCP 相对法兰中心的偏移量 | mm | | A/B/C | 工具相对法兰坐标系绕 X/Y/Z 轴的旋转角 | °/rad | **标定方式选择:** | 方式 | 适用场景 | 说明 | |------|----------|------| | 6点标定 | 已激光标定+焊枪 | 校准工具手尺寸+姿态,C轴精度较好 | | 7点标定 | 6点标定 A/B 轴误差大 | 校准尺寸+姿态,A/B 轴精度较好 | | 12点标定 | 未激光标定 | 校准零点+工具手尺寸 | | 15点标定 | 高精度要求 | 校准零点+尺寸+姿态 | | 20点标定 | 零点丢失 | 校准零点+工具手尺寸 | ### 用户坐标系 用户坐标系是工作台上自定义的局部坐标系,默认 User0 与直角坐标系重合,新用户坐标系基于 User0 变换得到。 **用户坐标参数:** | 参数 | 含义 | 单位 | |------|------|------| | X/Y/Z | 用户坐标原点相对机器人基座原点的偏移 | mm | | A/B/C | 用户坐标相对直角坐标系绕 X/Y/Z 轴的旋转角 | °/rad | **标定步骤:** 1. 末梢移到期望的用户坐标原点位置,标定原点 2. 向期望 X 轴正方向移动任意距离,标定 X 轴 3. 向期望 Y 轴正方向移动任意距离,标定 Y 轴 4. 计算并保存,提示成功后标定完成 ## 标定体系 | 标定类型 | 用途 | 相关接口 | |----------|------|----------| | 工具手标定(6/7/12/15/20点) | 确定 TCP 偏移与姿态 | `tool_hand_7_point_calibrate` 等 | | 用户坐标标定 | 建立工作台局部坐标系 | `calibration_oxy`、`set_user_coordinate_data`、`calculate_user_coordinate` | | 零点标定 | 设置/偏移电机单圈零点 | `set_axis_zero_position`、`set_zero_pos_deviation` | | 4点标定(SCARA) | 计算杆长和轴零点偏移,填入 DH 参数 | `set_four_point_mark`、`four_point_calculation`、`set_result_for_DH` | | 20点标定 | 高精度校准(支持 2/12/15/20/21 点法) | `tool_hand_2_or_20_point_calibrate` 等 | > 标定前将法兰盘平行于水平面,标定过程中保持参考点固定;计算结果大于 1 需重新标定。 ## 工艺系统 工艺号(craftID,1-9)用于管理同一工艺的多套参数,示教器与 SDK 共享同一套工艺数据。 | 工艺 | 工艺号 | 参数读写方式 | |------|--------|--------------| | 焊接 | 1-9 | `weld_set_config` / `weld_get_config` + 摆焊参数 | | 码垛 | 1-9 | `pallet_set_running_state` / 状态查询 | | 视觉 | 0-98 | `vision_set_basic_parameter` / 标定/触发 | | 激光切割 | 1-9 | 全局/工艺/模拟量/IO 四类参数 | | 传送带跟踪 | 1-9 | 传送参数 + 编码器 + PID | > 使用前先设置当前工艺号,再读写参数,与示教器配置保持一致。 ## 点位与变量 ### 全局点位(GP/GE) | 类型 | 说明 | posInfo 长度 | |------|------|-------------| | GP | 全局点位(机器人) | 14 | | GE | 全局点位(含外部轴) | 21 | **posInfo 格式(14 长度):** | 索引 | 含义 | |------|------| | [0] | 坐标系:0=关节,1=直角,2=工具,3=用户 | | [1] | 角度单位:0=角度制,1=弧度制 | | [2] | 形态(SCARA:1=左手,2=右手) | | [3] | 工具手坐标序号 | | [4] | 用户坐标序号 | | [5]-[6] | 备用 | | [7]-[13] | 点位信息(关节角或 XYZ+姿态) | ### 全局变量 | 系列 | 类型 | 说明 | |------|------|------| | GI | int | 全局整数变量 | | GD | double | 全局浮点变量 | | GB | bool | 全局布尔变量 | ## 错误处理机制 ### 返回值语义 | 返回值 | 含义 | |--------|------| | `SUCCESS` (0) | 调用成功 | | 负数 | 通信/执行错误(-1 接收失败、-2 断开连接、-6 超时等) | | 其他值 | 业务错误码,参见错误码表 | ### 异步接口 异步接口返回值仅表示"指令已接收",实际执行结果通过: - **回调函数**:`recv_message`、`set_receive_error_or_warnning_message_callback` 等注册 - **状态查询**:`get_robot_running_state`、`get_servo_state` 等轮询 ### 报警与清错 - 伺服报警后进入报警状态(状态码 2) - 清错操作:`clear_error`,清错后需重新下电再上电 - 实时错误信息通过 `set_receive_error_or_warnning_message_callback` 回调接收 --- # C++ SDK 接口说明 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/00.%E5%A4%B4%E6%96%87%E4%BB%B6%E4%B8%8E%E7%AB%AF%E5%8F%A3.html ## 头文件一览 | 头文件 | 路径 | 说明 | | ------------------------------------------- | -------------------------- | ---------------------------------------------------------- | | `nrc_api.h` | `interface/cpp/interface/` | 主入口头文件,聚合所有接口 | | `nrc_interface.h` | `interface/cpp/interface/` | 基础连接、伺服控制、运动控制、工具手、用户坐标、全局变量等 | | `nrc_io.h` | `interface/cpp/interface/` | 数字/模拟 IO 控制、远程 IO、安全 IO | | `nrc_modbus.h` | `interface/cpp/interface/` | Modbus 主站通讯(TCP/RTU) | | `nrc_track.h` | `interface/cpp/interface/` | 轨迹记录与回放 | | `nrc_dual_arm.h` | `interface/cpp/interface/` | 双臂机器人用户坐标 | | `nrc_vfd_ctr.h` | `interface/cpp/interface/` | VFD 主轴变频器控制 | | `nrc_job_operate.h` | `interface/cpp/interface/` | 作业文件管理、运动/逻辑指令插入 | | `nrc_queue_operate.h` | `interface/cpp/interface/` | 队列运动模式控制 | | `nrc_craft_weld.h` | `interface/cpp/interface/` | 焊接工艺(弧焊、摆焊) | | `nrc_craft_pallet.h` | `interface/cpp/interface/` | 码垛工艺 | | `nrc_craft_vision.h` | `interface/cpp/interface/` | 视觉工艺(标定、参数配置) | | `nrc_craft_laser_cutting.h` | `interface/cpp/interface/` | 激光切割工艺 | | `nrc_craft_conveyor_belt_track.h` | `interface/cpp/interface/` | 传送带跟踪工艺 | | `nrc_define.h` | `interface/cpp/parameter/` | 宏定义、枚举、基础数据结构 | | `nrc_interface_parameter.h` | `interface/cpp/parameter/` | 接口相关结构体 | | `nrc_io_parameter.h` | `interface/cpp/parameter/` | IO 相关结构体 | | `nrc_modbus_parameter.h` | `interface/cpp/parameter/` | Modbus 参数结构体 | | `nrc_craft_weld_parameter.h` | `interface/cpp/parameter/` | 焊接参数结构体 | | `nrc_craft_vision_parameter.h` | `interface/cpp/parameter/` | 视觉参数结构体 | | `nrc_craft_laser_cutting_parameter.h` | `interface/cpp/parameter/` | 激光切割参数结构体 | | `nrc_craft_conveyor_belt_track_parameter.h` | `interface/cpp/parameter/` | 传送带跟踪参数结构体 | --- ## 端口说明 | 端口 | 用途 | | ---- | ------------------------------------------------ | | 6000 | 控制/查询:上下电、模式切换、状态查询 | | 6001 | 示教编程:作业编辑和程序控制 | | 7000 | 伺服跟踪数据:servo_move、点位运动控制、状态回调 | --- --- # 一、基础连接与系统接口(nrc_interface.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/01.%E5%9F%BA%E7%A1%80%E8%BF%9E%E6%8E%A5%E4%B8%8E%E7%B3%BB%E7%BB%9F%E6%8E%A5%E5%8F%A3.html ## 1.1 连接管理 ### get_library_version 获取库版本信息。 **函数签名:** ```cpp std::string get_library_version(); ``` **返回值:** 库版本相关信息字符串。 --- ### connect_robot 连接机器人控制器。同步方式,函数会阻塞直到返回连接结果。 **函数签名:** ```cpp SOCKETFD connect_robot(const std::string& ip, const std::string& port); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | ip | const std::string& | 输入 | 控制器 IP 地址,如 "192.168.1.13" | | port | const std::string& | 输入 | 端口号,如 "6001" | **返回值:** `SOCKETFD`(int)—— 连接成功返回 socket 文件描述符;-1 表示连接失败。 --- ### disconnect_robot 断开与控制器连接。 **函数签名:** ```cpp Result disconnect_robot(SOCKETFD socketFd); ``` --- ### get_connection_status 获取控制器连接状态。 **函数签名:** ```cpp Result get_connection_status(SOCKETFD socketFd); ``` --- ### set_reconnect 设置是否开启断开后自动重连功能,默认关闭。 **函数签名:** ```cpp Result set_reconnect(SOCKETFD socketFd, bool reconnect); ``` --- ### set_reconnect_callback 设置重连成功后的回调函数。 **函数签名:** ```cpp Result set_reconnect_callback(SOCKETFD socketFd, void(*function)()); ``` --- ## 1.2 消息通讯 ### send_message 向控制器发送一条自定义消息。 **函数原型:** ```cpp Result send_message(SOCKETFD socketFd, int messageID, const std::string& message); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | messageID | int | 消息 ID | | message | const std::string& | 消息内容 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 向控制器发送 ID=100 的消息 Result result = send_message(fd, 100, "hello controller"); ``` --- ### recv_message 注册消息接收回调,当收到控制器消息时触发。 **函数原型:** ```cpp Result recv_message(SOCKETFD socketFd, void(*callback)(int messageID, const char* message)); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | callback | void(*)(int, const char*) | 回调函数,参数为消息 ID 和消息内容 | > 回调函数内不能做耗时操作或阻塞。 **使用示例:** ```cpp void on_message(int messageID, const char* message) { printf("收到消息 ID=%d: %s\n", messageID, message); } Result result = recv_message(fd, on_message); ``` --- ## 1.3 伺服控制 ### set_axis_sdo 设置伺服命令字(SDO,Service Data Object)。用于直接向伺服驱动器写入 CANopen SDO 对象字典数据。 **函数原型:** ```cpp Result set_axis_sdo(SOCKETFD socketFd, int axisNum, unsigned int index, unsigned int subindex, int cmdvalue, unsigned int size); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | axisNum | int | 机器人的轴编号 | | index | unsigned int | 命令字编码(对象字典索引) | | subindex | unsigned int | 命令字子编码(对象字典子索引) | | cmdvalue | int | 要设置进去的值 | | size | unsigned int | 命令字对应的值的字节数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 向 1 号轴写入对象字典 0x6060 子索引 0,值 8(CSP 模式),1 字节 Result result = set_axis_sdo(fd, 1, 0x6060, 0x00, 8, 1); ``` --- ### set_robots_parallel 设置多机器人并行模式。 **函数原型:** ```cpp Result set_robots_parallel(SOCKETFD socketFd, bool open); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | open | bool | true=开启并行,false=关闭 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### clear_error / clear_error_robot 伺服清错。 **函数原型:** ```cpp Result clear_error(SOCKETFD socketFd); Result clear_error_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 ::: warning 注意 出错前如果处于伺服运行状态,清错后需要手动进行下电操作,释放控制器的占用状态才可以继续上电(清错后不能直接上电,先下电再上电)。 ::: --- ### set_servo_state / set_servo_state_robot 设置伺服状态(停止/就绪)。 **函数原型:** ```cpp Result set_servo_state(SOCKETFD socketFd, int state); Result set_servo_state_robot(SOCKETFD socketFd, int robotNum, int state); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | state | int | 0=停止,1=就绪 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 ::: warning 注意 - 设置伺服就绪前应确保系统没有错误(先调用 `clear_error`) - 该函数只有伺服状态为 0(停止)或 1(就绪)时调用生效,状态为 2(报警)或 3(运行)时不能直接设置 ::: --- ### get_servo_state / get_servo_state_robot 获取伺服状态。 **函数原型:** ```cpp Result get_servo_state(SOCKETFD socketFd, int& status); Result get_servo_state_robot(SOCKETFD socketFd, int robotNum, int& status); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | status | int& | 输出参数:0=停止,1=就绪,2=报警,3=运行 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp int status = 0; Result result = get_servo_state(fd, status); if (result == SUCCESS) { printf("伺服状态: %d (0=停止 1=就绪 2=报警 3=运行)\n", status); } ``` --- ### set_servo_poweron / set_servo_poweron_robot 机器人上电。 **函数原型:** ```cpp Result set_servo_poweron(SOCKETFD socketFd); Result set_servo_poweron_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 ::: warning 注意 调用该函数前需要先调用 `set_servo_state(fd, 1)` 将伺服设置为就绪状态;上电成功后调用 `get_servo_state` 返回 3(运行状态)。该函数只有伺服状态为 1(就绪)时调用生效。 ::: --- ### set_servo_poweroff / set_servo_poweroff_robot 机器人下电。 **函数原型:** ```cpp Result set_servo_poweroff(SOCKETFD socketFd); Result set_servo_poweroff_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 ::: warning 注意 下电成功后调用 `get_servo_state` 返回 1(就绪状态)。该函数只有伺服状态为 3(运行)时调用生效。 ::: --- ## 1.4 位置与状态查询 ### get_current_position / get_current_position_robot 获取机器人当前位置。 **函数原型:** ```cpp Result get_current_position(SOCKETFD socketFd, int coord, std::vector& pos); Result get_current_position_robot(SOCKETFD socketFd, int robotNum, int coord, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | coord | int | 坐标系:0=关节,1=直角,2=工具,3=用户 | | pos | std::vector\& | 输出参数,存储点位数据,长度 7 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp std::vector pos(7); Result result = get_current_position(fd, 1, pos); // 直角坐标 if (result == SUCCESS) { printf("当前位置: X=%.2f Y=%.2f Z=%.2f\n", pos[0], pos[1], pos[2]); } ``` --- ### get_joint_position / get_joint_position_robot 获取机器人指定关节的直角坐标(24.03 版本专用)。 **函数原型:** ```cpp Result get_joint_position(SOCKETFD socketFd, int axisNum, std::vector& pos); Result get_joint_position_robot(SOCKETFD socketFd, int robotNum, int axisNum, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | axisNum | int | 指定需要查询的关节 | | pos | std::vector\& | 输出参数,存储点位数据,长度 7 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_current_extra_position / get_current_extra_position_robot 获取机器人外部轴当前位置。 **函数原型:** ```cpp Result get_current_extra_position(SOCKETFD socketFd, std::vector& pos); Result get_current_extra_position_robot(SOCKETFD socketFd, int robotNum, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | pos | std::vector\& | 输出参数,点位数组,长度 5 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_current_positon_and_extra_position / get_current_positon_and_extra_position_robot 获取机器人和外部轴的当前位置。 **函数原型:** ```cpp Result get_current_positon_and_extra_position(SOCKETFD socketFd, int coord, std::vector& pos); Result get_current_positon_and_extra_position_robot(SOCKETFD socketFd, int robotNum, int coord, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | coord | int | 坐标系:0=关节,1=直角,2=工具,3=用户 | | pos | std::vector\& | 输出参数,点位数组,长度 12(前 7 位机器人,后 5 位外部轴) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_robot_running_state / get_robot_running_state_robot 获取机器人运行状态。 **函数原型:** ```cpp Result get_robot_running_state(SOCKETFD socketFd, int& status); Result get_robot_running_state_robot(SOCKETFD socketFd, int robotNum, int& status); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | status | int& | 输出参数:0=停止,1=暂停,2=运行 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 1.5 速度与模式控制 ### set_speed / set_speed_robot 设置当前模式的速度(示教/运行/远程三种模式)。 **函数原型:** ```cpp Result set_speed(SOCKETFD socketFd, int speed); Result set_speed_robot(SOCKETFD socketFd, int robotNum, int speed); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | speed | int | 速度,范围 0\& pos); Result get_user_coord_para_robot(SOCKETFD socketFd, int robotNum, int userNum, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int | 用户坐标编号 | | pos | std::vector\& | 输出参数,用户坐标参数(X/Y/Z 偏移 + A/B/C 旋转角) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_user_coordinate_data / set_user_coordinate_data_robot 标定用户坐标(写入坐标数据)。 **函数原型:** ```cpp Result set_user_coordinate_data(SOCKETFD socketFd, int userNum, std::vector pos); Result set_user_coordinate_data_robot(SOCKETFD socketFd, int robotNum, int userNum, std::vector pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int | 用户坐标编号 | | pos | std::vector\ | 坐标数据(X/Y/Z 偏移 + A/B/C 旋转角) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### calibration_oxy / calibration_oxy_robot 标定 OXY(三点法:原点、X 轴方向点、Y 轴方向点)。 **函数原型:** ```cpp Result calibration_oxy(SOCKETFD socketFd, int userNum, std::string xyo); Result calibration_oxy_robot(SOCKETFD socketFd, int robotNum, int userNum, std::string xyo); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int | 用户坐标编号 | | xyo | std::string | 标定类型:'X'(X 轴方向点)、'Y'(Y 轴方向点)、'O'(原点) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 三点法标定用户坐标 calibration_oxy(fd, 1, "O"); // 1. 末梢移到原点位置 calibration_oxy(fd, 1, "X"); // 2. 向 X 轴正方向移动任意距离 calibration_oxy(fd, 1, "Y"); // 3. 向 Y 轴正方向移动任意距离 ``` --- ### calculate_user_coordinate / calculate_user_coordinate_robot 计算用户坐标(OXY 三点标定完成后计算最终结果)。 **函数原型:** ```cpp Result calculate_user_coordinate(SOCKETFD socketFd, int userNumber); Result calculate_user_coordinate_robot(SOCKETFD socketFd, int robotNum, int userNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum / userNumber | int | 用户坐标编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // OXY 三点标定后计算用户坐标 Result result = calculate_user_coordinate(fd, 1); if (result == SUCCESS) { printf("用户坐标计算成功\n"); } ``` --- ## 1.8 全局点位与变量 ### set_global_position / set_global_position_robot 设置全局 GP 点位。 **函数原型:** ```cpp Result set_global_position(SOCKETFD socketFd, std::string posName, std::vector posInfo); Result set_global_position_robot(SOCKETFD socketFd, int robotNum, std::string posName, std::vector posInfo); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | posName | std::string | 全局位置名,如 "GP0001" | | posInfo | std::vector\ | 点位数据,长度 14:`[0]`坐标系(0=关节,1=直角,2=工具,3=用户);`[1]`角度制(0)/弧度制(1);`[2]`形态;`[3]`工具手坐标序号;`[4]`用户坐标序号;`[5][6]`备用;`[7-13]`点位信息 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_global_position / get_global_position_robot 查询全局 GP 点位。 **函数原型:** ```cpp Result get_global_position(SOCKETFD socketFd, std::string posName, std::vector& pos); Result get_global_position_robot(SOCKETFD socketFd, int robotNum, std::string posName, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | posName | std::string | 全局位置名,如 "GP0001" | | pos | std::vector\& | 输出参数,全局点位数组,长度 14(前 7 位为点位坐标/姿态信息,后 7 位为机器人位置) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_global_sync_position / set_global_sync_position_robot 设置全局 GE 点位(含外部轴)。 **函数原型:** ```cpp Result set_global_sync_position(SOCKETFD socketFd, const std::string& posName, std::vector posInfo); Result set_global_sync_position_robot(SOCKETFD socketFd, int robotNum, const std::string& posName, std::vector posInfo); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | posName | const std::string& | 全局位置名,如 "GE0001" | | posInfo | std::vector\ | 点位数据,长度 21:`[0-6]`坐标系/角度制/形态/工具/用户坐标序号/备用;`[7-13]`机器人本体点位;`[14-20]`外部轴点位 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_global_sync_position / get_global_sync_position_robot 查询全局 GE 点位。 **函数原型:** ```cpp Result get_global_sync_position(SOCKETFD socketFd, const std::string& posName, std::vector& pos); Result get_global_sync_position_robot(SOCKETFD socketFd, int robotNum, const std::string& posName, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | posName | const std::string& | 全局位置名,如 "GE0001" | | pos | std::vector\& | 输出参数,全局点位数组,长度 21(前 7 位坐标/姿态,中间 7 位机器人位置,后 7 位外部轴位置) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_global_variant / set_global_variant_robot 设置全局变量(GI/GD/GB 系列)。 **函数原型:** ```cpp Result set_global_variant(SOCKETFD socketFd, const std::string& varName, double varValue); Result set_global_variant_robot(SOCKETFD socketFd, int robotNum, const std::string& varName, double varValue); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | varName | const std::string& | 全局变量名,如 "GI001"、"GD001"、"GB001" | | varValue | double | 变量值 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 设置全局整数变量 GI001 为 100 Result result = set_global_variant(fd, "GI001", 100); ``` --- ### get_global_variant / get_global_variant_robot 查询全局变量。 **函数原型:** ```cpp Result get_global_variant(SOCKETFD socketFd, const std::string& varName, double& vaule); Result get_global_variant_robot(SOCKETFD socketFd, int robotNum, const std::string& varName, double& vaule); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | varName | const std::string& | 全局变量名,如 "GI001"、"GD001"、"GB001" | | vaule | double& | 输出参数,变量值 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 1.9 零点与标定 ### set_axis_zero_position / set_axis_zero_position_robot 设置零点位置(将当前轴位置设为零点)。 **函数原型:** ```cpp Result set_axis_zero_position(SOCKETFD socketFd, int axis); Result set_axis_zero_position_robot(SOCKETFD socketFd, int robotNum, int axis); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | axis | int | 轴号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_zero_pos_deviation / set_zero_pos_deviation_robot 设置零点偏移。 **函数原型:** ```cpp Result set_zero_pos_deviation(SOCKETFD socketFd, int axis, double shift); Result set_zero_pos_deviation_robot(SOCKETFD socketFd, int robotNum, int axis, double shift); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | axis | int | 需要偏移的轴号 | | shift | double | 偏移量,范围 -360° \< shift \< 360° | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_single_cycle / get_single_cycle_robot 获取单圈值(编码器单圈位置)。 **函数原型:** ```cpp Result get_single_cycle(SOCKETFD socketFd, std::vector& single_cycle); Result get_single_cycle_robot(SOCKETFD socketFd, int robotNum, std::vector& single_cycle); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | single_cycle | std::vector\& | 输出参数,单圈值数组,长度 7 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_four_point / get_four_point_robot 查询 4 点标定(SCARA 杆长标定)。 **函数原型:** ```cpp Result get_four_point(SOCKETFD socketFd, std::vector& result); Result get_four_point_robot(SOCKETFD socketFd, int robotNum, std::vector& result); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | result | std::vector\& | 输出参数,4 点标定结果 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_four_point_mark / set_four_point_mark_robot 进行 4 点标记。 **函数原型:** ```cpp Result set_four_point_mark(SOCKETFD socketFd, int point, int status); Result set_four_point_mark_robot(SOCKETFD socketFd, int robotNum, int point, int status); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | point | int | 标记点位编号,范围 0-3 | | status | int | 标记状态:0=取消标记,1=标记 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### four_point_calculation / four_point_calculation_robot 4 点标定计算。 **函数原型:** ```cpp Result four_point_calculation(SOCKETFD socketFd, double L1, double L2, std::vector& result); Result four_point_calculation_robot(SOCKETFD socketFd, int robotNum, double L1, double L2, std::vector& result); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | L1 | double | 大臂杆长 | | L2 | double | 小臂杆长 | | result | std::vector\& | 输出参数,标定计算结果 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_result_for_DH / set_result_for_DH_robot 将 4 点标定计算的结果写入机器人 DH 参数。 **函数原型:** ```cpp Result set_result_for_DH(SOCKETFD socketFd, int& apply); Result set_result_for_DH_robot(SOCKETFD socketFd, int robotNum, int& apply); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | apply | int& | 写入是否成功:成功/失败(1/0) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_origin_coord_to_target_coord / get_origin_coord_to_target_coord_robot 坐标值坐标系转换(原坐标系转换为目标坐标系)。 **函数原型:** ```cpp Result get_origin_coord_to_target_coord(SOCKETFD socketFd, int originCoord, std::vector originPos, int targetCoord, std::vector& targetPos); Result get_origin_coord_to_target_coord_robot(SOCKETFD socketFd, int robotNum, int originCoord, std::vector originPos, int targetCoord, std::vector& targetPos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | originCoord | int | 原坐标系:0=关节,1=直角,2=工具,3=用户 | | originPos | std::vector\ | 要进行转换的坐标值,长度 7:关节取值范围 0-6[-10000,10000];直角/工具/用户取值范围 0-2[-10000,10000]、3-6[-3.1416,3.1416]rad | | targetCoord | int | 目标坐标系:0=关节,1=直角,2=工具,3=用户 | | targetPos | std::vector\& | 输出参数,转换后的坐标值 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 1.10 机器人切换与参数 ### set_robot_switch 切换当前机器人。 **函数原型:** ```cpp Result set_robot_switch(SOCKETFD socketFd, int robot); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robot | int | 切换到的机器人编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_robot_switch 获取当前机器人。 **函数原型:** ```cpp Result get_robot_switch(SOCKETFD socketFd, int& robot); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robot | int& | 输出参数,当前机器人编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_robot_dh_param / get_robot_dh_param_robot 获取当前机器人 DH 参数。 **函数原型:** ```cpp Result get_robot_dh_param(SOCKETFD socketFd, RobotDHParam& param); Result get_robot_dh_param_robot(SOCKETFD socketFd, int robotNum, RobotDHParam& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | param | RobotDHParam& | 输出参数,DH 参数结构体 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 > DH 参数是机器人运动学建模的标准方法(Denavit-Hartenberg),包含连杆长度 a、连杆扭角 α、连杆偏距 d、关节角 θ,直接影响机器人运动学正逆解计算精度。 --- ### get_robot_joint_param / get_robot_joint_param_robot 获取当前机器人关节参数。 **函数原型:** ```cpp Result get_robot_joint_param(SOCKETFD socketFd, int id, RobotJointParam& param); Result get_robot_joint_param_robot(SOCKETFD socketFd, int robotNum, int id, RobotJointParam& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | id | int | 关节编号,范围 [1,6] | | param | RobotJointParam& | 输出参数,关节参数结构体 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_teachbox_connection_status / get_teachbox_connection_status_robot 查询示教盒连接状态。 **函数原型:** ```cpp Result get_teachbox_connection_status(SOCKETFD socketFd, bool& connected); Result get_teachbox_connection_status_robot(SOCKETFD socketFd, int robotNum, bool& connected); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | connected | bool& | 输出参数,示教盒连接状态 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_controller_id / get_controller_id_robot 获取控制器序列号 ID(`char*` 版本)。 **函数原型:** ```cpp Result get_controller_id(SOCKETFD socketFd, char* id); Result get_controller_id_robot(SOCKETFD socketFd, int robotNum, char* id); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | id | char* | 输出参数,控制器序列号 ID | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_controller_id_csharp / get_controller_id_csharp_robot 获取控制器序列号 ID(`std::vector` 版本,供 C# 使用)。 **函数原型:** ```cpp Result get_controller_id_csharp(SOCKETFD socketFd, std::vector& id); Result get_controller_id_csharp_robot(SOCKETFD socketFd, int robotNum, std::vector& id); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | id | std::vector\& | 输出参数,控制器序列号 ID | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 1.11 传感器与电机数据 ### get_static_search_position / get_static_search_position_robot 获取静态寻位坐标。 **函数原型:** ```cpp Result get_static_search_position(SOCKETFD socketFd, int fileid, int tableid, int delaytime, std::vector& pos); Result get_static_search_position_robot(SOCKETFD socketFd, int robotNum, int fileid, int tableid, int delaytime, std::vector& pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | fileid | int | 寻位文件号 | | tableid | int | 寻位参数表号 | | delaytime | int | 参数表延时 | | pos | std::vector\& | 输出参数,寻位坐标 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_curretn_motor_torque / get_curretn_motor_torque_robot 获取当前电机扭矩。 **函数原型:** ```cpp Result get_curretn_motor_torque(SOCKETFD socketFd, std::vector& motorTorque, std::vector& motorTorqueSync); Result get_curretn_motor_torque_robot(SOCKETFD socketFd, int robotNum, std::vector& motorTorque, std::vector& motorTorqueSync); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | motorTorque | std::vector\& | 输出参数,机器人扭矩,长度 7,单位 [%] | | motorTorqueSync | std::vector\& | 输出参数,外部轴扭矩,长度 5,单位 [%] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_curretn_motor_speed / get_curretn_motor_speed_robot 获取当前电机转速。 **函数原型:** ```cpp Result get_curretn_motor_speed(SOCKETFD socketFd, std::vector& motorSpeed, std::vector& motorSpeedSync); Result get_curretn_motor_speed_robot(SOCKETFD socketFd, int robotNum, std::vector& motorSpeed, std::vector& motorSpeedSync); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | motorSpeed | std::vector\& | 输出参数,机器人电机转速,长度 7,单位 [RPM] | | motorSpeedSync | std::vector\& | 输出参数,外部轴电机转速,长度 5,单位 [RPM] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_curretn_motor_payload / get_curretn_motor_payload_robot 获取当前电机负载。 **函数原型:** ```cpp Result get_curretn_motor_payload(SOCKETFD socketFd, std::vector& motorPayload, std::vector& motorPayloadSync); Result get_curretn_motor_payload_robot(SOCKETFD socketFd, int robotNum, std::vector& motorPayload, std::vector& motorPayloadSync); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | motorPayload | std::vector\& | 输出参数,机器人电机负载,长度 7,单位 [%] | | motorPayloadSync | std::vector\& | 输出参数,外部轴电机负载,长度 5,单位 [%] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_current_line_speed_and_joint_speed / get_current_line_speed_and_joint_speed_robot 获取当前末端线速度和轴速度。 **函数原型:** ```cpp Result get_current_line_speed_and_joint_speed(SOCKETFD socketFd, double& lineSpeed, std::vector& jointSpeed, std::vector& jointSpeedSync); Result get_current_line_speed_and_joint_speed_robot(SOCKETFD socketFd, int robotNum, double& lineSpeed, std::vector& jointSpeed, std::vector& jointSpeedSync); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | lineSpeed | double& | 输出参数,末端线速度,单位 [mm/s] | | jointSpeed | std::vector\& | 输出参数,关节速度,长度 5,单位 [°/s] | | jointSpeedSync | std::vector\& | 输出参数,外部轴关节速度,长度 5,单位 [°/s] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 1.12 运动控制 ### robot_start_jogging / robot_start_jogging_robot 开始点动。 **函数原型:** ```cpp Result robot_start_jogging(SOCKETFD socketFd, int axis, bool dir); Result robot_start_jogging_robot(SOCKETFD socketFd, int robotNum, int axis, bool dir); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | axis | int | 轴号 | | dir | bool | 方向(true=正方向,false=反方向) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### robot_stop_jogging / robot_stop_jogging_robot 停止点动。 **函数原型:** ```cpp Result robot_stop_jogging(SOCKETFD socketFd, int axis); Result robot_stop_jogging_robot(SOCKETFD socketFd, int robotNum, int axis); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | axis | int | 轴号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### robot_go_to_reset_position / robot_go_to_reset_position_robot 回到设定的复位点。 **函数原型:** ```cpp Result robot_go_to_reset_position(SOCKETFD socketFd); Result robot_go_to_reset_position_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 > 复位点需在示教器【设置-复位点设置】中配置,支持关节/直线插补到安全点,或使用复位程序指令自定义复位轨迹。 --- ### robot_go_home / robot_go_home_robot 回到设定的零点。 **函数原型:** ```cpp Result robot_go_home(SOCKETFD socketFd); Result robot_go_home_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### robot_movej / robot_movej_robot 关节运动(MoveJ)。关节空间点到点运动,速度快但路径不固定。 **函数原型:** ```cpp Result robot_movej(SOCKETFD socketFd, MoveCmd moveCmd); Result robot_movej_robot(SOCKETFD socketFd, int robotNum, MoveCmd moveCmd); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | moveCmd | MoveCmd | 运动指令参数 | **MoveCmd 关键字段:** | 字段 | 说明 | |------|------| | targetPosValue | 点位数组,n 个轴就赋值前 n 位数组,其余置 0 | | velocity | 速度,范围 0\ 点位数组长度 14:前 7 位为机器人本体点位,后 7 位为外部轴点位,几轴就填几位,其余置 0,外部轴从 pos[7] 开始。速度范围 0\ 点位数组长度 14,结构同 `robot_extra_movej`。速度范围 1\ 本节接口需要额外连接 7000 端口:`SOCKETFD fd7000 = connect_robot("192.168.1.13", "7000");` ### get_robot_state / get_robot_state_robot 7000 端口查询状态。 **函数原型:** ```cpp Result get_robot_state(SOCKETFD socketFd, RobotState param); Result get_robot_state_robot(SOCKETFD socketFd, int robotNum, RobotState param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 7000 端口连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | param | RobotState | 查询状态参数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### robot_state_callback 7000 端口状态返回的回调函数。 **函数原型:** ```cpp Result robot_state_callback(SOCKETFD socketFd, void(*function)(const char* message)); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 7000 端口连接句柄 | | function | void(*)(const char*) | 状态回调函数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### servo_move / servo_move_robot 外部点移动(伺服跟踪)。 **函数原型:** ```cpp Result servo_move(SOCKETFD socketFd, ServoMovePara servoMove); Result servo_move_robot(SOCKETFD socketFd, int robotNum, ServoMovePara servoMove); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 7000 端口连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | servoMove | ServoMovePara | 伺服运动参数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp SOCKETFD fd7000 = connect_robot("192.168.1.13", "7000"); ServoMovePara servoMove; // 设置伺服运动参数... Result result = servo_move(fd7000, servoMove); ``` --- ### enable_servo_position_motion_control / enable_servo_position_motion_control_robot 开启/关闭伺服点位运动控制。 **函数原型:** ```cpp Result enable_servo_position_motion_control(SOCKETFD socketFd, bool statue); Result enable_servo_position_motion_control_robot(SOCKETFD socketFd, int robotNum, bool statue); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 7000 端口连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | statue | bool | 1=开启,0=关闭 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### servo_point_position_motion_control / servo_point_position_motion_control_robot 伺服点位运动控制。 **函数原型:** ```cpp Result servo_point_position_motion_control(SOCKETFD socketFd, ServoPointMovePara servoMove); Result servo_point_position_motion_control_robot(SOCKETFD socketFd, int robotNum, ServoPointMovePara servoMove); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 7000 端口连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | servoMove | ServoPointMovePara | 伺服点位运动参数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 1.14 碰撞检测与拖拽 ### set_collision_para / set_collision_para_robot 设置碰撞检测阈值。 **函数原型:** ```cpp Result set_collision_para(SOCKETFD socketFd, CollisionPara collisionpara); Result set_collision_para_robot(SOCKETFD socketFd, int robotNum, CollisionPara collisionpara); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | collisionpara | CollisionPara | 碰撞检测参数结构体(含指令位置响应时间、误差允许时间、碰撞检测阈值(点动)、碰撞检测阈值(指令)、机器人轴数) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_darg_mode / set_darg_mode_robot 设置拖拽示教的拖拽方式。 **函数原型:** ```cpp Result set_darg_mode(SOCKETFD socketFd, int mode); Result set_darg_mode_robot(SOCKETFD socketFd, int robotNum, int mode); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | mode | int | 拖拽模式:0=无,1=3D 鼠标,2=力矩模式,3=位置 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_position_dragParams / set_position_dragParams_robot 设置位置拖动参数(笛卡尔空间线速度限制和关节空间速度限制)。 **函数原型:** ```cpp Result set_position_dragParams(SOCKETFD socketFd, DragParam& param); Result set_position_dragParams_robot(SOCKETFD socketFd, int robotNum, DragParam& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | param | DragParam& | 位置拖动参数结构体 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_drag_thread_is_end / get_drag_thread_is_end_robot 获取拖拽是否已结束。 **函数原型:** ```cpp Result get_drag_thread_is_end(SOCKETFD socketFd, bool& endFlag); Result get_drag_thread_is_end_robot(SOCKETFD socketFd, int robotNum, bool& endFlag); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | endFlag | bool& | 输出参数,拖拽结束标志位 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 1.15 独立轴控制 > 独立轴控制用于伺服轴独立于机器人本体运行,支持点到点、恒转速(PV)、恒转矩等模式。使用前需在示教器【设置-独立轴参数】中新建独立轴并配置关节参数(最多 10 个独立轴)。 ### new_independent_axis_param / new_independent_axis_param_robot 新建独立轴参数。 **函数原型:** ```cpp Result new_independent_axis_param(SOCKETFD socketFd, int axis_num); Result new_independent_axis_param_robot(SOCKETFD socketFd, int robotNum, int axis_num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | axis_num | int | 新建的独立轴数量 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### modify_independent_axis_param / modify_independent_axis_param_robot 修改独立轴参数(先新建再修改)。 **函数原型:** ```cpp Result modify_independent_axis_param(SOCKETFD socketFd, IndependentAxisParam& param); Result modify_independent_axis_param_robot(SOCKETFD socketFd, int robotNum, IndependentAxisParam& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | param | IndependentAxisParam& | 独立轴参数结构体 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_independent_axis_param / get_independent_axis_param_robot 获取独立轴参数。 **函数原型:** ```cpp Result get_independent_axis_param(SOCKETFD socketFd, int num, IndependentAxisParam& param); Result get_independent_axis_param_robot(SOCKETFD socketFd, int robotNum, int num, IndependentAxisParam& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | num | int | 独立轴编号 | | param | IndependentAxisParam& | 输出参数,独立轴参数结构体 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_axis_sum / get_axis_sum_robot 获取独立轴总数。 **函数原型:** ```cpp Result get_axis_sum(SOCKETFD socketFd, int& sum); Result get_axis_sum_robot(SOCKETFD socketFd, int robotNum, int& sum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | sum | int& | 输出参数,独立轴总数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### delete_axis_sum / delete_axis_sum_robot 删除某个独立轴。 **函数原型:** ```cpp Result delete_axis_sum(SOCKETFD socketFd, int& num); Result delete_axis_sum_robot(SOCKETFD socketFd, int robotNum, int& num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | num | int& | 将要删除的独立轴编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_axis_position / get_axis_position_robot 查询独立轴位置。 **函数原型:** ```cpp Result get_axis_position(SOCKETFD socketFd, int& num, double& currentPos); Result get_axis_position_robot(SOCKETFD socketFd, int robotNum, int& num, double& currentPos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | num | int& | 要查询的独立轴 | | currentPos | double& | 输出参数,独立轴当前位置 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### independent_axis_zero_calibration 独立轴零点标定。 **函数原型:** ```cpp Result independent_axis_zero_calibration(SOCKETFD socketFd, int num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | num | int | 要标定的独立轴 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_independent_axis_PV_run 独立控制轴 PV 运动(恒转速,仅支持外部轴)。 **函数原型:** ```cpp Result set_independent_axis_PV_run(SOCKETFD socketFd, IndependentAxisRun param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | param | IndependentAxisRun | 运动参数结构体(含速度、加减速等) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_independent_axis_PV_stop 独立控制轴 PV 停止(仅支持外部轴)。 **函数原型:** ```cpp Result set_independent_axis_PV_stop(SOCKETFD socketFd, int num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | num | int | 轴编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### cancel_independent_axis_move 取消轴独立控制运动(仅支持外部轴)。 **函数原型:** ```cpp Result cancel_independent_axis_move(SOCKETFD socketFd, int num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | num | int | 轴编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### independent_axis_homing 独立轴回零。 **函数原型:** ```cpp Result independent_axis_homing(SOCKETFD socketFd, int num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | num | int | 轴编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 > 回零使用 CSP 模式(对象字典 607A),需配置 PDO 后正常使用。 --- ### independent_axis_homing_stop 独立轴回零停止。 **函数原型:** ```cpp Result independent_axis_homing_stop(SOCKETFD socketFd, int num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | num | int | 轴编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### independent_axis_jog 独立轴点动。 **函数原型:** ```cpp Result independent_axis_jog(SOCKETFD socketFd, IndependentAxisRun param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | param | IndependentAxisRun | 点动参数结构体 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 > 点动使用 CSV 模式(对象字典 60FF),点动速度范围 [0.001,10000],加减速倍数范围 [1,5]。 --- ## 1.16 机器人形态与可达性 ### get_robot_configuration / get_robot_configuration_robot 获取 4 轴 SCARA 机器人的形态。SCARA 机器人在运动学正逆解时存在多解情况,需要通过形态参数指定机器人当前的臂型配置。 **函数签名:** ```cpp Result get_robot_configuration(SOCKETFD socketFd, int& configuration); Result get_robot_configuration_robot(SOCKETFD socketFd, int robotNum, int& configuration); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | configuration | int& | 输出 | 机器人形态 | **形态值说明:** | 值 | 含义 | 说明 | |----|------|------| | 1 | 左手形态(Lefty) | 机器人第 2 关节相对于第 1 关节与末端连线处于左侧 | | 2 | 右手形态(Righty) | 机器人第 2 关节相对于第 1 关节与末端连线处于右侧 | **返回值:** - 0:成功 - 负数:失败 **注意事项:** - 该接口仅适用于 4 轴 SCARA 机器人,其他机器人类型调用可能返回无效值。 - 形态值在点位数据结构 `posInfo[2]` 中同样使用(见 `set_global_position` 等接口的点位格式说明),运动规划时需确保形态一致。 - 在切换工具手坐标系或用户坐标系后,建议重新获取当前形态以确认配置正确。 **使用示例:** ```cpp // 获取当前机器人形态 int config; Result result = get_robot_configuration(fd, config); if (result == 0) { if (config == 1) { printf("当前形态:左手(Lefty)\n"); } else if (config == 2) { printf("当前形态:右手(Righty)\n"); } } ``` --- ### get_pos_reachable / get_pos_reachable_robot 判断指定点位在当前机器人工作空间内是否可达。该接口基于机器人运动学正逆解算法,验证目标点位是否存在有效的关节解。 **函数签名:** ```cpp Result get_pos_reachable(SOCKETFD socketFd, std::vector pos, std::string movetype, bool &result); Result get_pos_reachable_robot(SOCKETFD socketFd, int robotNum, std::vector pos, std::string movetype, bool &result); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | pos | `std::vector` | 输入 | 目标点位坐标数据,长度 14 | | movetype | `std::string` | 输入 | 运动方式:`"MOVJ"`(关节运动)或 `"MOVL"`(直线运动) | | result | bool& | 输出 | 点位是否可达 | **pos 向量格式(长度 14):** | 索引 | 含义 | 说明 | |------|------|------| | [0] | 坐标系 | 0=关节,1=直角,2=工具,3=用户 | | [1] | 角度单位 | 0=角度制,1=弧度制 | | [2] | 形态 | SCARA 机器人形态:1=左手,2=右手 | | [3] | 工具手坐标序号 | 当前使用的工具手编号 | | [4] | 用户坐标序号 | 当前使用的用户坐标系编号 | | [5]-[6] | 备用 | 保留字段 | | [7]-[13] | 点位信息 | 关节角(关节坐标系)或 XYZ+姿态(直角/工具/用户坐标系) | **返回值:** - 0:成功(查询操作本身成功) - 负数:失败 ::: warning 注意 `result` 参数才是点位可达性的判断结果,`true` 表示可达,`false` 表示不可达。函数返回值仅表示接口调用是否成功。 ::: **注意事项:** - 同一目标点位在不同运动方式(MOVJ / MOVL)下的可达性判断结果可能不同:关节运动可能通过非直线路径到达,而直线运动受限于工作空间边界和奇异位形。 - 点位中的形态参数(pos[2])会影响逆解结果,需与实际机器人形态保持一致。 - 该接口内部调用运动学正逆解算法,对于存在关节限位、自碰撞或奇异位形的情况会返回不可达。 **使用示例:** ```cpp // 构造目标点位(直角坐标系,角度制,形态=左手) std::vector pos(14, 0); pos[0] = 1; // 坐标系:直角 pos[1] = 0; // 角度制 pos[2] = 1; // 形态:左手 pos[3] = 1; // 工具手编号 pos[4] = 1; // 用户坐标编号 pos[7] = 400.0; // X (mm) pos[8] = 0.0; // Y (mm) pos[9] = 300.0; // Z (mm) pos[10] = 180.0; // Rx (度) pos[11] = 0.0; // Ry (度) pos[12] = 0.0; // Rz (度) // 判断 MOVL 直线运动是否可达 bool reachable = false; Result ret = get_pos_reachable(fd, pos, "MOVL", reachable); if (ret == 0) { if (reachable) { printf("目标点位通过 MOVL 可达\n"); } else { printf("目标点位通过 MOVL 不可达,请尝试 MOVJ 或调整目标点位\n"); } } // 判断 MOVJ 关节运动是否可达 ret = get_pos_reachable(fd, pos, "MOVJ", reachable); if (ret == 0 && reachable) { printf("目标点位通过 MOVJ 可达\n"); } ``` --- --- # 二、IO 控制(nrc_io.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/02.IO%E6%8E%A7%E5%88%B6.html ## IO 基础概念 IO 控制接口用于读写机器人的数字量/模拟量输入输出端口,支持多块 IO 板级联,端口命名格式为 `板号-端口号`(如 `DIN1-1` 表示第 1 块 IO 板的第 1 路数字输入)。 | 类型 | 命名前缀 | 说明 | 典型用途 | |------|----------|------|----------| | 数字输入 | DIN | 接收外部开关/传感器信号(高/低电平) | 启动按钮、限位开关、传感器检测 | | 数字输出 | DOUT | 控制外部设备通断,不接收反馈 | 继电器、指示灯、电磁阀 | | 模拟输入 | AIN | 接收连续变化的电压/电流信号 | 模拟传感器、变送器 | | 模拟输出 | AOUT | 输出连续变化的电压/电流信号,范围 [0,10] | 变频器给定、比例阀 | > IO 板端口命名:`DIN1-1` 中 `DIN` 为数字输入、`1` 为 IO 板号、`1` 为端口号;模拟量同理为 `AIN1-1` / `AOUT1-1`。 ## 2.1 IO 查询与设置 ### get_io_type IO 型号查询,获取当前连接的 IO 板数量、型号及各类型端口数量。 **函数原型:** ```cpp Result get_io_type(SOCKETFD socketFd, IOtype& io_type); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | io_type | IOtype& | 输出参数,IO 型号和端口信息 | **IOtype 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | num | int | IO 板数量 | | type | vector\ | 各 IO 板型号 | | io_port_sum | vector\\> | 各 IO 板端口数量,一维数组为 [数字输入数量, 数字输出数量, 模拟输入数量, 模拟输出数量] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp IOtype io_type; Result result = get_io_type(fd, io_type); if (result == SUCCESS) { printf("IO板数量: %d\n", io_type.num); for (int i = 0; i < io_type.num; i++) { printf("IO板%d: %s, DIN:%d DOUT:%d AIN:%d AOUT:%d\n", i + 1, io_type.type[i].c_str(), io_type.io_port_sum[i][0], io_type.io_port_sum[i][1], io_type.io_port_sum[i][2], io_type.io_port_sum[i][3]); } } ``` --- ### set_digital_output 设置数字输出端口状态。 **函数原型:** ```cpp Result set_digital_output(SOCKETFD socketFd, int port, int value); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | port | int | 端口号,范围 [1, 最大端口数] | | value | int | 输出值,0 或 1(0=低电平,1=高电平) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 将第 1 块 IO 板的第 3 路数字输出置为高电平 Result result = set_digital_output(fd, 3, 1); if (result == SUCCESS) { printf("数字输出设置成功\n"); } ``` --- ### get_digital_output 一次获取所有数字输出端口状态。 **函数原型:** ```cpp Result get_digital_output(SOCKETFD socketFd, std::vector& out); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | out | std::vector\& | 输出参数,存储结果的数组,长度为 64 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp std::vector out(64); Result result = get_digital_output(fd, out); if (result == SUCCESS) { printf("DOUT1-1 = %d\n", out[0]); } ``` --- ### get_digital_input 一次获取所有数字输入端口状态。 **函数原型:** ```cpp Result get_digital_input(SOCKETFD socketFd, std::vector& in); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | in | std::vector\& | 输出参数,存储结果的数组,长度为 64 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp std::vector in(64); Result result = get_digital_input(fd, in); if (result == SUCCESS) { printf("DIN1-1 = %d\n", in[0]); // 检测启动按钮状态 } ``` --- ### set_analog_output 设置模拟输出端口数值。 **函数原型:** ```cpp Result set_analog_output(SOCKETFD socketFd, int port, double value); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | port | int | 端口号 | | value | double | 输出数值,范围 [0, 10] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 将 AOUT1-1 输出 5V Result result = set_analog_output(fd, 1, 5.0); if (result == SUCCESS) { printf("模拟输出设置成功\n"); } ``` --- ### get_analog_output 查询所有模拟输出端口数值。 **函数原型:** ```cpp Result get_analog_output(SOCKETFD socketFd, std::vector& aout); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | aout | std::vector\& | 输出参数,模拟输出数组,最大长度 64 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_analog_input 查询所有模拟输入端口数值。 **函数原型:** ```cpp Result get_analog_input(SOCKETFD socketFd, std::vector& ain); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | ain | std::vector\& | 输出参数,模拟输入数组,最大长度 64 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp std::vector ain(64); Result result = get_analog_input(fd, ain); if (result == SUCCESS) { printf("AIN1-1 = %.2f\n", ain[0]); } ``` --- ### set_force_digital_input 设置数字输入端口是否强制打开(强制置位),用于调试场景模拟输入信号。 **函数原型:** ```cpp Result set_force_digital_input(SOCKETFD socketFd, int port, int force, int value); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | port | int | 输入端口号 | | force | int | 是否强制,1=强制,0=非强制 | | value | int | 强制状态,0 或 1 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 强制将 DIN1-1 置为 1(模拟按钮按下) Result result = set_force_digital_input(fd, 1, 1, 1); ``` --- ### get_force_digital_input 获取当前已打开强制功能的输入端口及其状态。 **函数原型:** ```cpp Result get_force_digital_input(SOCKETFD socketFd, std::vector& port, std::vector& status); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | port | std::vector\& | 输出参数,当前打开强制输入的端口 | | status | std::vector\& | 输出参数,对应端口状态,下标与 port 一一对应 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 2.2 IO 复位与报警 ### IO 复位功能说明 当程序运行停止或报错时,IO 复位功能能使 IO 输出端口恢复到初始状态。共分三种复位类型: | 复位类型 | type 值 | 触发条件 | |----------|---------|----------| | 远程 IO 复位 | 1 | 远程模式给复位信号,机器人执行复位程序回到复位点时,将设置的 IO 端口复位到复位值;若复位程序中途停止则不复位 | | 切模式停止 | 2 | 运行程序时切换到示教/远程模式导致程序停止,将设置的 IO 端口复位到复位值 | | 程序报错 | 3 | 程序发生错误导致程序停止,将设置的 IO 端口复位到复位值(伺服报错、IO 设置的报错、系统运行中的报错) | ### IO 报警信息说明 可自定义 IO 输入输出端口触发报警时的提示信息,报警优先级高于其他类型 IO 报警。每条报警包含: | 参数 | 说明 | |------|------| | 端口 | 绑定报警的 IO 端口 | | 类型 | 消息(msgType=0)/ 警告(msgType=1)/ 错误(msgType=2) | | 消息 | 触发报警后输出的内容 | | 参数 | 0=端口为 0 时触发,1=端口为 1 时触发 | | 使能 | 关闭后无论 IO 状态如何都不触发报警 | **三种报警类型的表现:** | 类型 | 界面表现 | 对机器人的影响 | |------|----------|----------------| | 消息 | 右下角白色提示条 | 无影响 | | 警告 | 右下角黄色提示条 | 无影响 | | 错误 | 右下角红色提示条 | 若机器人正在运行会强制下使能 | --- ### set_IO_reset_function 设置 IO 复位功能。 **函数原型:** ```cpp Result set_IO_reset_function(SOCKETFD socketFd, int robotNum, int type, std::vector enable, std::vector value); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | type | int | 复位类型:1=远程 IO 复位,2=切模式停止,3=程序报错 | | enable | std::vector\ | 是否复位容器,大小等于所有 IO 板输出端口总数 | | value | std::vector\ | 复位值容器,大小等于所有 IO 板输出端口总数 | ::: warning 注意 每次设置需包含所有端口,否则会覆盖上一次的修改。多块 IO 板时端口顺序为上一块 IO 板末位端口的顺延。 ::: **使用示例(两块 IO 板,每块输出 16 路):** ```cpp // 1-1 端口选择复位,复位值 1;2-1 端口选择复位,复位值 1 std::vector enable(32, 0); std::vector value(32, 0); enable[0] = 1; value[0] = 1; // 第 1 块 IO 板 1 端口 enable[16] = 1; value[16] = 1; // 第 2 块 IO 板 1 端口 Result result = set_IO_reset_function(fd, 1, 1, enable, value); ``` --- ### get_IO_reset_function 获取 IO 复位相关参数。 **函数原型:** ```cpp Result get_IO_reset_function(SOCKETFD socketFd, int robotNum, int type, std::vector& enable, std::vector& value); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | type | int | 复位类型:1=远程 IO 复位,2=切模式停止,3=程序报错 | | enable | std::vector\& | 输出参数,是否复位容器 | | value | std::vector\& | 输出参数,复位值容器 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_error_msg_of_digital_input / set_error_msg_of_digital_output 设置 IO 报警信息数字输入/输出端口报警功能。 **函数原型:** ```cpp Result set_error_msg_of_digital_input(SOCKETFD socketFd, std::vector msg); Result set_error_msg_of_digital_output(SOCKETFD socketFd, std::vector msg); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | msg | std::vector\ | 消息设置结构体数组,大小与 IO 板端口数一致 | **AlarmdIO 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | msgType | int | 消息类型:0=普通消息,1=警告消息,2=错误消息 | | value | int | IO 有效参数 (0/1),0=端口为 0 时触发,1=端口为 1 时触发 | | enable | int | 使能设置 (0/1) | | msg | std::string | 消息内容 | ::: warning 注意 msg 数组大小必须与 IO 板端口数一致,每次设置相应端口均不能忽略,否则会覆盖上一次的设置。 ::: **使用示例(两块 IO 板,每块输入输出各 16 位):** ```cpp std::vector msg(32); // IO 板1 输出端口 1:错误消息 "QQQ",类型 2,参数 1,使能 1 msg[0].msgType = 2; msg[0].enable = 1; msg[0].value = 1; msg[0].msg = "QQQ"; // 中间 15 个端口不设置 for (int i = 1; i < 16; i++) { msg[i].msgType = 0; msg[i].enable = 0; msg[i].value = 0; msg[i].msg = ""; } // IO 板2 输出端口 1:错误消息 "YYY" msg[16].msgType = 2; msg[16].enable = 1; msg[16].value = 1; msg[16].msg = "YYY"; Result result = set_error_msg_of_digital_output(fd, msg); ``` --- ### get_error_msg_of_digital_input / get_error_msg_of_digital_output 获取 IO 报警信息数字输入/输出端口报警设置。 **函数原型:** ```cpp Result get_error_msg_of_digital_input(SOCKETFD socketFd, std::vector& msg); Result get_error_msg_of_digital_output(SOCKETFD socketFd, std::vector& msg); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | msg | std::vector\& | 输出参数,消息设置结构体数组 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 2.3 远程 IO ### 远程模式信号说明 远程模式下可通过 IO 信号控制机器人启停及程序预约,标准信号功能如下: **数字 IO 输入(远程控制信号):** | 功能 | 触发方式 | 说明 | |------|----------|------| | 启动 | 上升沿 | 参数为 1 时,信号 0 变 1 有效 | | 停止 | 持续有效 | 参数为 1 时,信号持续有效 | | 暂停 | 持续有效 | 参数为 1 时,信号持续有效 | | 清除报警 | 上升沿 | 参数为 1 时,信号 0 变 1 有效 | | 预约即启动 | 无 | 打开时,预约成功即上电 | | IO 远程程序 1-10 | 脉冲(周期 0.6s) | 参数为 1 时,信号 0-1-0 有效,程序预约成功至少需触发 0.6 秒以上 | | 紧急停止 1/2 | 高电平 | 1ms 扫描一次,扫描到即触发 | | 安全光幕 1/2 | 高电平 | 运行中触发机器人暂停 | | 屏蔽紧急停止 1/2 | 配合紧急停止 | 按钮打开即屏蔽,设置时间到后重新检测 | **数字 IO 输出(状态提示信号):** | 功能 | 说明 | |------|------| | Robot1 运行 | 程序运行时输出高电平 | | Robot1 暂停 | 程序暂停时输出高电平 | | Robot1 停止 | 程序停止时输出高电平 | | 报错提示 | 常亮输出高电平,闪烁输出脉冲(周期 1s) | | 使能 | 输出高电平 | | IO 远程程序 1-10 预约输出 | 预约中闪烁(周期 1.2s),运行中常亮 | | 主程序首行 | 输出一个高电平参数为 1 的信号,程序光标跳至主程序首行 | | 可继续执行 | 输出高电平,可运行暂停的程序 | | 拔出示教盒 | 拔出示教盒后输出高/低电平 | **远程模式状态说明:** | 状态 | 说明 | |------|------| | 未预约 | 进入远程模式后未预约过程序,或预约后取消 | | 预约中 | 预约成功显示预约中 | | 运行中 | 程序正在运行 | | 已预约 | 程序运行完成或被触发停止 | > 远程模式不能修改速度,速度修改需提前在【设置-远程程序设置】中修改;触发对应程序的 IO 口即预约程序,取消需再次触发。 --- ### set_remote_param 设置远程模式参数(速度、启动方式、屏蔽时间等)。 **函数原型:** ```cpp Result set_remote_param(SOCKETFD socketFd, int robotNum, int speed, bool start, int time, int startTime, int num = 10); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | speed | int | 远程模式默认速度 [1,100] | | start | bool | 是否自动启动 | | time | int | IO 重复触发屏蔽时间,单位 ms | | startTime | int | 启动确认时间 | | num | int | 远程 IO 数量,默认 10 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 设置远程参数:速度 50,不自动启动,屏蔽时间 500ms,启动确认 100ms,10 路远程 IO Result result = set_remote_param(fd, 1, 50, false, 500, 100, 10); ``` --- ### get_remote_param 获取远程参数设置数据。 **函数原型:** ```cpp Result get_remote_param(SOCKETFD socketFd, int robotNum, int& speed, bool& start, int& time, int& startTime, int& num); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | speed | int& | 输出参数,远程模式默认速度 | | start | bool& | 输出参数,是否自动启动 | | time | int& | 输出参数,IO 重复触发屏蔽时间 (ms) | | startTime | int& | 输出参数,启动确认时间 | | num | int& | 输出参数,远程 IO 数量 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_remote_function 设置远程 IO 功能(通用控制信号 + 程序预约信号绑定)。 **函数原型:** ```cpp Result set_remote_function(SOCKETFD socketFd, int robotNum, RemoteControl general, std::vector program, int num = 10); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | general | RemoteControl | 通用功能远程 IO 参数(启动/暂停/停止/清除报警等) | | program | std::vector\ | 远程控制程序参数,program.size() 必须与 num 相等 | | num | int | 远程 IO 数量(24.03 版本必须与 set_remote_param 中的 num 一致) | **RemoteControl 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | clearStashPort / clearStashValue | int | 清除断电保持数据端口及有效参数 (0/1) | | faultResetPort / faultResetValue | int | 清除报警端口及有效参数 (0/1) | | pausePort / pauseValue | int | 暂停端口及有效参数 (0/1) | | startPort / startValue | int | 启动端口及有效参数 (0/1) | | stopPort / stopValue | int | 停止端口及有效参数 (0/1) | | program | vector\ | 远程程序端口设置 | **RemoteProgram 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | port | int | 远程程序端口绑定 | | value | int | 使用远程 IO 功能时有效参数 (0/1);使用远程状态提示功能时有效参数 (0/1/2) | **使用示例:** ```cpp RemoteControl general; general.startPort = 1; general.startValue = 1; // DIN1-1 启动 general.stopPort = 2; general.stopValue = 1; // DIN1-2 停止 general.pausePort = 3; general.pauseValue = 1; // DIN1-3 暂停 general.faultResetPort = 4; general.faultResetValue = 1; // DIN1-4 清除报警 std::vector program(10); program[0].port = 5; program[0].value = 1; // DIN1-5 预约程序 1 Result result = set_remote_function(fd, 1, general, program, 10); ``` --- ### get_remote_function 获取远程 IO 功能设置数据。 **函数原型:** ```cpp Result get_remote_function(SOCKETFD socketFd, int robotNum, int& num, int& time, RemoteControl& general, std::vector& program); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | num | int& | 输出参数,远程 IO 数量 | | time | int& | 输出参数,IO 重复触发屏蔽时间 (ms) | | general | RemoteControl& | 输出参数,通用功能远程 IO 参数 | | program | std::vector\& | 输出参数,远程控制程序参数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_remote_status_tips 设置远程状态提示功能(运行/暂停/停止等状态输出端口)。 **函数原型:** ```cpp Result set_remote_status_tips(SOCKETFD socketFd, int robotNum, int outagePort, int outageValue, std::vector program); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | outagePort | int | 断电保持数据恢复端口 | | outageValue | int | 断电保持数据恢复端口有效值 (0/1/2) | | program | std::vector\ | 远程状态提示参数(size 必须与 set_remote_param 的 num 相等) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_remote_status_tips 获取远程状态提示功能数据。 **函数原型:** ```cpp Result get_remote_status_tips(SOCKETFD socketFd, int robotNum, int& num, int& outagePort, int& outageValue, std::vector& program); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | num | int& | 输出参数,远程 IO 数量 | | outagePort | int& | 输出参数,断电保持数据恢复端口 | | outageValue | int& | 输出参数,断电保持数据恢复端口有效值 | | program | std::vector\& | 输出参数,远程控制程序参数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_remote_program 设置 IO 远程程序选择(预约哪个作业文件、运行次数)。 **函数原型:** ```cpp Result set_remote_program(SOCKETFD socketFd, int robotNum, std::vector program); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | program | std::vector\ | 远程程序设置 | **RemoteProgramSetting 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | job | std::string | 远程程序选择(作业文件名) | | times | int | 远程程序运行次数 | **使用示例:** ```cpp std::vector program(10); program[0].job = "main.job"; // 预约主程序 program[0].times = 1; // 运行 1 次 Result result = set_remote_program(fd, 1, program); ``` --- ### get_remote_program 获取 IO 远程程序设置数据。 **函数原型:** ```cpp Result get_remote_program(SOCKETFD socketFd, int robotNum, int& num, std::vector& program); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | num | int& | 输出参数,远程 IO 数量 | | program | std::vector\& | 输出参数,远程程序设置 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 2.4 安全 IO ### 安全 IO 说明 安全 IO 用于紧急停止、安全光幕等安全功能的端口绑定与电平设置: | 功能 | 说明 | |------|------| | 紧急停止 | 触发后机器人下电并切至伺服停止;解除后需先清错才可继续操作 | | 安全光幕 | 触发后机器人暂停,再次按下启动按钮可继续运行 | | 屏蔽紧急停止 | 打开后屏蔽时间内紧急停止信号被屏蔽 | | 使能硬接线 | 使用使能硬接线示教盒时绑定 DIN 端口,上电使能由 IO 板输入信号控制 | > 使能端口 1 为上电使能,使能端口 2 为下电使能;打开此功能后示教盒使能按钮失效。非使能硬接线示教盒请勿设置。 --- ### set_hard_enable_port 设置是否使能硬接及相关端口。 **函数原型:** ```cpp Result set_hard_enable_port(SOCKETFD socketFd, int enable, int port1, int port2); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | enable | int | 是否打开使能硬接 (0/1) | | port1 | int | 使能硬接端口 1(上电使能) | | port2 | int | 使能硬接端口 2(下电使能) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 使能硬接线:端口 1 绑定 DIN1-5,端口 2 绑定 DIN1-6 Result result = set_hard_enable_port(fd, 1, 5, 6); ``` --- ### get_hard_enable_port 获取使能硬接开关是否打开及相关绑定端口。 **函数原型:** ```cpp Result get_hard_enable_port(SOCKETFD socketFd, int& enable, int& port1, int& port2); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | enable | int& | 输出参数,是否打开使能硬接 | | port1 | int& | 输出参数,使能硬接端口 1 | | port2 | int& | 输出参数,使能硬接端口 2 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_safe_IO_function 设置 IO 安全设置参数(紧急停止、安全光幕、屏蔽时间等)。 **函数原型:** ```cpp Result set_safe_IO_function(SOCKETFD socketFd, int robotNum, SafeIO safeIO); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | safeIO | SafeIO | IO 安全设置参数结构体 | **SafeIO 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | quickStopPort1 / quickStopPort2 | int | 紧急停止端口 1/2 | | quickStopValue1 / quickStopValue2 | int | 紧急停止参数 (0/1) | | quickStopEnable | bool | 紧急停止使能 | | quickStopShied1 / quickStopShied2 | bool | 屏蔽紧急停止 1/2 | | quickStopTime | double | 快速停止时间,单位 ms,范围 [50,100] | | quickStopShiedTime | int | 屏蔽紧急停止时间,单位 s | | screenPort1 / screenPort2 | int | 安全光幕端口 1/2 | | screenValue1 / screenValue2 | int | 安全光幕参数 (0/1) | | screenEnable | bool | 安全光幕使能 | **使用示例:** ```cpp SafeIO safe; safe.quickStopPort1 = 15; safe.quickStopValue1 = 1; safe.quickStopEnable = true; safe.quickStopTime = 100; // 快速停止时间 100ms safe.screenPort1 = 7; safe.screenValue1 = 1; safe.screenEnable = true; Result result = set_safe_IO_function(fd, 1, safe); ``` --- ### get_safe_IO_function 获取 IO 安全设置参数。 **函数原型:** ```cpp Result get_safe_IO_function(SOCKETFD socketFd, int robotNum, SafeIO& safeIO); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4) | | safeIO | SafeIO& | 输出参数,IO 安全设置参数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- --- # 三、Modbus 通讯(nrc_modbus.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/03.Modbus%E9%80%9A%E8%AE%AF.html ## 数据结构 ### ModbusTCPParameter TCP 通讯参数。 | 成员 | 类型 | 默认值 | 说明 | |------|------|--------|------| | IP | string | `"192.168.1.13"` | Modbus TCP 服务器 IP 地址 | | port | int | `503` | Modbus TCP 端口号 | ### ModbusRTUParameter RTU 通讯参数。 | 成员 | 类型 | 默认值 | 说明 | |------|------|--------|------| | slaveId | int | - | 从站 ID,范围 [0, 65535] | | port | int | `1` | 串口端口号 | | baudrate | int | `115200` | 波特率 | | checkBit | string | `"None"` | 奇偶校验位;`"None"`(无校验)/ `"Even"`(偶校验)/ `"Odd"`(奇校验) | | dataBit | int | `8` | 数据位;可选 5、6、7、8 | | stopBit | int | `1` | 停止位;可选 1、2 | ### ModbusMasterParameter Modbus 主站参数。 | 成员 | 类型 | 默认值 | 说明 | |------|------|--------|------| | type | string | `"TCP"` | 主站类型;`"TCP"` 或 `"RTU"` | | startAddress | bool | `false` | 起始地址偏移;`false` 为地址自动 -1(起始为 1),`true` 为地址不变(起始为 0) | | TCP | ModbusTCPParameter | - | TCP 通讯参数(type 为 TCP 时有效) | | RTU | ModbusRTUParameter | - | RTU 通讯参数(type 为 RTU 时有效) | --- ## 主站配置 ### modbus_set_master_parameter 设置主站参数(支持 TCP/RTU,最多 9 个工艺号)。 ```cpp Result modbus_set_master_parameter(SOCKETFD socketFd, int id, const ModbusMasterParameter& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符,由 `connect_robot` 返回 | | id | int | 工艺号,范围 [1, 9] | | param | const ModbusMasterParameter& | 主站参数结构体 | **返回值:** `Result` 结构体,`result` 为 `true` 时表示设置成功。 **使用示例:** ```cpp ModbusMasterParameter masterParam; masterParam.type = "TCP"; masterParam.startAddress = false; masterParam.TCP.IP = "192.168.1.14"; masterParam.TCP.port = 503; Result ret = modbus_set_master_parameter(socketFd, 1, masterParam); if (ret.result) { // 参数设置成功 } ``` --- ### modbus_open_master 打开主站通讯连接。 ```cpp Result modbus_open_master(SOCKETFD socketFd, int id); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | **返回值:** `Result` 结构体。 **说明:** 调用前需先通过 `modbus_set_master_parameter` 设置主站参数。 **使用示例:** ```cpp Result ret = modbus_open_master(socketFd, 1); ``` --- ### modbus_get_master_connection_status 获取主站连接状态。 ```cpp Result modbus_get_master_connection_status(SOCKETFD socketFd, int id, int& status); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | status | int& | 输出参数,连接状态;`0` 表示未连接,`1` 表示已连接 | **返回值:** `Result` 结构体。 **使用示例:** ```cpp int connectStatus = 0; Result ret = modbus_get_master_connection_status(socketFd, 1, connectStatus); if (ret.result && connectStatus == 1) { // Modbus 已连接 } ``` --- ## 功能码 01H - 读线圈 ### modbus_read_coil_status 读取从站线圈状态(位操作,可读可写)。 ```cpp Result modbus_read_coil_status(SOCKETFD socketFd, int id, int address, int quantity, std::vector& data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 起始地址 | | quantity | int | 读取数量;范围 [1, 2000] | | data | `std::vector&` | 输出参数,读取到的线圈状态数组;每个元素为 `0` 或 `1` | **返回值:** `Result` 结构体。 **使用示例:** ```cpp std::vector coilData; Result ret = modbus_read_coil_status(socketFd, 1, 0, 10, coilData); if (ret.result) { for (size_t i = 0; i < coilData.size(); i++) { printf("Coil %zu: %d\n", i, coilData[i]); } } ``` --- ## 功能码 02H - 读输入状态 ### modbus_read_input_status 读取从站离散输入状态(位操作,只读)。 ```cpp Result modbus_read_input_status(SOCKETFD socketFd, int id, int address, int quantity, std::vector& data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 起始地址 | | quantity | int | 读取数量;范围 [1, 2000] | | data | `std::vector&` | 输出参数,读取到的输入状态数组;每个元素为 `0` 或 `1` | **返回值:** `Result` 结构体。 **使用示例:** ```cpp std::vector inputStatus; Result ret = modbus_read_input_status(socketFd, 1, 100, 16, inputStatus); ``` --- ## 功能码 03H - 读保持寄存器 ### modbus_read_holding_registers 读取从站保持寄存器(16 位操作,可读可写)。 ```cpp Result modbus_read_holding_registers(SOCKETFD socketFd, int id, int address, int quantity, std::vector& data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 起始地址 | | quantity | int | 读取数量;范围 [1, 125] | | data | `std::vector&` | 输出参数,读取到的保持寄存器值数组;每个元素范围 [0, 65535] | **返回值:** `Result` 结构体。 **使用示例:** ```cpp std::vector holdingReg; Result ret = modbus_read_holding_registers(socketFd, 1, 200, 5, holdingReg); if (ret.result) { for (size_t i = 0; i < holdingReg.size(); i++) { printf("Register %zu: %d\n", i, holdingReg[i]); } } ``` --- ## 功能码 04H - 读输入寄存器 ### modbus_read_input_registers 读取从站输入寄存器(16 位操作,只读)。 ```cpp Result modbus_read_input_registers(SOCKETFD socketFd, int id, int address, int quantity, std::vector& data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 起始地址 | | quantity | int | 读取数量;范围 [1, 125] | | data | `std::vector&` | 输出参数,读取到的输入寄存器值数组;每个元素范围 [0, 65535] | **返回值:** `Result` 结构体。 **使用示例:** ```cpp std::vector inputReg; Result ret = modbus_read_input_registers(socketFd, 1, 300, 8, inputReg); ``` --- ## 功能码 05H - 写单个线圈 ### modbus_write_signal_coil_status 写单个线圈状态。 ```cpp Result modbus_write_signal_coil_status(SOCKETFD socketFd, int id, int address, int data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 线圈地址 | | data | int | 写入值;`0` 或 `1` | **返回值:** `Result` 结构体。 **使用示例:** ```cpp // 将地址 10 的线圈置为 ON Result ret = modbus_write_signal_coil_status(socketFd, 1, 10, 1); ``` --- ## 功能码 06H - 写单个保持寄存器 ### modbus_write_signal_holding_registers 写单个保持寄存器。 ```cpp Result modbus_write_signal_holding_registers(SOCKETFD socketFd, int id, int address, int data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 寄存器地址 | | data | int | 写入值;范围 [0, 65535] | **返回值:** `Result` 结构体。 **使用示例:** ```cpp // 将地址 200 的寄存器写入 9999 Result ret = modbus_write_signal_holding_registers(socketFd, 1, 200, 9999); ``` --- ## 功能码 0FH - 写多个线圈 ### modbus_write_multiple_coil_status 批量写入多个线圈状态。 ```cpp Result modbus_write_multiple_coil_status(SOCKETFD socketFd, int id, int address, const std::vector& data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 起始地址 | | data | const `std::vector&` | 写入的线圈值数组;每个元素为 `0` 或 `1` | **返回值:** `Result` 结构体。 **使用示例:** ```cpp std::vector coilValues = {1, 0, 1, 0, 1, 1, 0, 0, 1, 0}; Result ret = modbus_write_multiple_coil_status(socketFd, 1, 20, coilValues); ``` --- ## 功能码 10H - 写多个保持寄存器 ### modbus_write_multiple_holding_registers 批量写入多个保持寄存器。 ```cpp Result modbus_write_multiple_holding_registers(SOCKETFD socketFd, int id, int address, const std::vector& data); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 套接字文件描述符 | | id | int | 工艺号,范围 [1, 9] | | address | int | 起始地址 | | data | const `std::vector&` | 写入的寄存器值数组;每个元素范围 [0, 65535] | **返回值:** `Result` 结构体。 **使用示例:** ```cpp std::vector regValues = {100, 200, 300, 400, 500}; Result ret = modbus_write_multiple_holding_registers(socketFd, 1, 200, regValues); ``` --- ## 完整使用示例 ### TCP 主站读写完整流程 ```cpp #include "nrc_modbus.h" void modbus_tcp_example(SOCKETFD socketFd) { // 1. 设置主站参数(TCP 模式) ModbusMasterParameter masterParam; masterParam.type = "TCP"; masterParam.startAddress = false; // 起始地址为 1 masterParam.TCP.IP = "192.168.1.14"; masterParam.TCP.port = 503; Result ret = modbus_set_master_parameter(socketFd, 1, masterParam); if (!ret.result) { printf("设置主站参数失败\n"); return; } // 2. 打开主站 ret = modbus_open_master(socketFd, 1); if (!ret.result) { printf("打开主站失败\n"); return; } // 3. 检查连接状态 int status = 0; ret = modbus_get_master_connection_status(socketFd, 1, status); if (ret.result && status == 1) { printf("Modbus TCP 连接成功\n"); } // 4. 读线圈(功能码 01H) std::vector coilData; ret = modbus_read_coil_status(socketFd, 1, 0, 10, coilData); if (ret.result) { printf("读取线圈成功: "); for (int v : coilData) printf("%d ", v); printf("\n"); } // 5. 写单个线圈(功能码 05H) ret = modbus_write_signal_coil_status(socketFd, 1, 3, 1); // 6. 读保持寄存器(功能码 03H) std::vector holdingReg; ret = modbus_read_holding_registers(socketFd, 1, 200, 5, holdingReg); if (ret.result) { printf("读取保持寄存器成功: "); for (int v : holdingReg) printf("%d ", v); printf("\n"); } // 7. 写多个保持寄存器(功能码 10H) std::vector writeReg = {1000, 2000, 3000}; ret = modbus_write_multiple_holding_registers(socketFd, 1, 400, writeReg); } ``` ### RTU 主站配置示例 ```cpp ModbusMasterParameter rtuParam; rtuParam.type = "RTU"; rtuParam.startAddress = false; rtuParam.RTU.slaveId = 1; rtuParam.RTU.port = 2; rtuParam.RTU.baudrate = 115200; rtuParam.RTU.checkBit = "Even"; rtuParam.RTU.dataBit = 8; rtuParam.RTU.stopBit = 1; Result ret = modbus_set_master_parameter(socketFd, 2, rtuParam); ``` --- ## Modbus 功能码汇总 | 函数 | 功能码 | 操作类型 | 说明 | |------|--------|----------|------| | `modbus_read_coil_status` | 01H | 读 | 读取线圈状态(位,可读可写) | | `modbus_read_input_status` | 02H | 读 | 读取输入状态(位,只读) | | `modbus_read_holding_registers` | 03H | 读 | 读取保持寄存器(16 位,可读可写) | | `modbus_read_input_registers` | 04H | 读 | 读取输入寄存器(16 位,只读) | | `modbus_write_signal_coil_status` | 05H | 写 | 写单个线圈 | | `modbus_write_signal_holding_registers` | 06H | 写 | 写单个保持寄存器 | | `modbus_write_multiple_coil_status` | 0FH | 写 | 批量写多个线圈 | | `modbus_write_multiple_holding_registers` | 10H | 写 | 批量写多个保持寄存器 | ## 注意事项 1. **工艺号范围**:`id` 参数范围为 [1, 9],最多支持 9 个独立的 Modbus 主站配置 2. **地址偏移**:`startAddress` 为 `false` 时,写入地址会自动减 1;为 `true` 时地址不变 3. **读取限制**:线圈/输入状态单次最多读取 2000 个,寄存器单次最多读取 125 个 4. **从站功能**:从站操作接口暂未开放 5. **错误处理**:所有函数返回 `Result` 结构体,需检查 `result` 字段确认操作是否成功 --- # 四、轨迹记录与回放(nrc_track.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/04.%E8%BD%A8%E8%BF%B9%E8%AE%B0%E5%BD%95%E4%B8%8E%E5%9B%9E%E6%94%BE.html ## 功能概述 轨迹记录与回放功能用于手动示教时记录机器人末端运动轨迹,并可按设定速度回放,适用于喷涂、点胶等需要复现人工轨迹的工艺场景。 **基本流程:** 开始记录 → 手动移动机器人 → 停止记录 → 保存轨迹 → 回放轨迹 | 步骤 | 接口 | 说明 | |------|------|------| | 1. 开始记录 | `track_record_start` | 设置采样点数与采样间隔 | | 2. 手动示教 | 示教器/点动 | 移动机器人到目标轨迹 | | 3. 停止记录 | `track_record_stop` | 结束轨迹采集 | | 4. 保存 | `track_record_save` | 以名称保存轨迹数据 | | 5. 回放 | `track_record_playback` | 按设定速度复现轨迹 | > 所有接口均提供 `_robot` 后缀版本,用于指定机器人编号(1-4)。 --- ### track_record_start / track_record_start_robot 轨迹记录开始。设置采样参数后开始采集机器人末端轨迹。 **函数原型:** ```cpp Result track_record_start(SOCKETFD socketFd, double maxSamplingNum, double samplingInterval); Result track_record_start_robot(SOCKETFD socketFd, int robotNum, double maxSamplingNum, double samplingInterval); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | maxSamplingNum | double | 最大采样点数,范围 [200, 12000] | | samplingInterval | double | 采样间隔(秒),范围 [0.03, 1] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 以 5000 个采样点、0.05s 间隔开始轨迹记录 Result result = track_record_start(fd, 5000, 0.05); if (result == SUCCESS) { printf("轨迹记录已开始\n"); // 此时手动移动机器人进行示教... } ``` --- ### track_record_stop / track_record_stop_robot 轨迹记录关闭,结束轨迹数据采集。 **函数原型:** ```cpp Result track_record_stop(SOCKETFD socketFd); Result track_record_stop_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 示教完成后停止记录 Result result = track_record_stop(fd); ``` --- ### get_track_record_status / get_track_record_status_robot 查询轨迹记录开启状态。 **函数原型:** ```cpp Result get_track_record_status(SOCKETFD socketFd, bool& recordStart); Result get_track_record_status_robot(SOCKETFD socketFd, int robotNum, bool& recordStart); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | recordStart | bool& | 输出参数,记录状态:true=开启,false=关闭 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp bool isRecording = false; Result result = get_track_record_status(fd, isRecording); if (result == SUCCESS && isRecording) { printf("轨迹正在记录中\n"); } ``` --- ### track_record_save / track_record_save_robot 轨迹记录保存,将采集到的轨迹数据以指定名称保存。 **函数原型:** ```cpp Result track_record_save(SOCKETFD socketFd, std::string trajName); Result track_record_save_robot(SOCKETFD socketFd, int robotNum, std::string trajName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | trajName | std::string | 保存的轨迹名称 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 将记录的轨迹保存为 "paint_path" Result result = track_record_save(fd, "paint_path"); if (result == SUCCESS) { printf("轨迹保存成功\n"); } ``` --- ### track_record_playback / track_record_playback_robot 轨迹回放,按设定速度复现已保存的轨迹。 **函数原型:** ```cpp Result track_record_playback(SOCKETFD socketFd, int vel); Result track_record_playback_robot(SOCKETFD socketFd, int robotNum, int vel); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | vel | int | 回放速度(百分比) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 以 80% 速度回放已保存轨迹 Result result = track_record_playback(fd, 80); if (result == SUCCESS) { printf("轨迹回放开始\n"); } ``` --- ### track_record_delete / track_record_delete_robot 轨迹清除,删除当前保存的轨迹数据。 **函数原型:** ```cpp Result track_record_delete(SOCKETFD socketFd); Result track_record_delete_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 清除轨迹数据 Result result = track_record_delete(fd); ``` --- --- # 五、双臂机器人(nrc_dual_arm.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/05.%E5%8F%8C%E8%87%82%E6%9C%BA%E5%99%A8%E4%BA%BA.html ## 功能概述 双臂机器人接口用于双臂协同场景下的用户坐标系管理、单条运动指令完成回调及双臂 OXY 标定。 **双臂用户坐标系特点:** | locationType | 说明 | |--------------|------| | 0 | 静态用户坐标系 | | 1 | 联动坐标系(跟随另一机械臂运动) | > 双臂用户坐标标定流程:设置坐标数据 → OXY 标定 → 计算坐标。 --- ### set_one_movecomd_completion_callback 设置一条 move 指令执行完成时的回调函数。 **函数原型:** ```cpp Result set_one_movecomd_completion_callback(SOCKETFD socketFd, void(*function)()); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | function | void(*)() | 回调函数指针,一条 move 指令执行完成时被调用 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp void on_move_done() { printf("一条 move 指令执行完成\n"); } Result result = set_one_movecomd_completion_callback(fd, on_move_done); ``` --- ### set_dualarm_user_coord_number / set_dualarm_user_coord_number_robot 设置双臂用户坐标编号。 **函数原型:** ```cpp Result set_dualarm_user_coord_number(SOCKETFD socketFd, int userNum); Result set_dualarm_user_coord_number_robot(SOCKETFD socketFd, int robotNum, int userNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int | 用户坐标编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 切换到用户坐标系 2 Result result = set_dualarm_user_coord_number(fd, 2); ``` --- ### get_dualarm_user_coord_number / get_dualarm_user_coord_number_robot 获取当前使用的用户坐标编号。 **函数原型:** ```cpp Result get_dualarm_user_coord_number(SOCKETFD socketFd, int& userNum); Result get_dualarm_user_coord_number_robot(SOCKETFD socketFd, int robotNum, int& userNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int& | 输出参数,当前用户坐标编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### get_dualarm_user_coord_para / get_dualarm_user_coord_para_robot 获取用户坐标参数(含坐标系类型和机械臂号)。 **函数原型:** ```cpp Result get_dualarm_user_coord_para(SOCKETFD socketFd, int userNum, std::vector& pos, int& locationType, int& mechID); Result get_dualarm_user_coord_para_robot(SOCKETFD socketFd, int robotNum, int userNum, std::vector& pos, int& locationType, int& mechID); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int | 用户坐标编号 | | pos | std::vector\& | 输出参数,用户坐标参数 | | locationType | int& | 输出参数,坐标系类型:0=静态用户坐标系,1=联动坐标系 | | mechID | int& | 输出参数,机器人号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### set_dualarm_user_coordinate_data / set_dualarm_user_coordinate_data_robot 标定双臂用户坐标(写入坐标数据)。 **函数原型:** ```cpp Result set_dualarm_user_coordinate_data(SOCKETFD socketFd, int userNum, std::vector pos, int locationType, int mechID); Result set_dualarm_user_coordinate_data_robot(SOCKETFD socketFd, int robotNum, int userNum, std::vector pos, int locationType, int mechID); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int | 用户坐标编号 | | pos | std::vector\ | 坐标数据 | | locationType | int | 坐标系类型:0=静态用户坐标系,1=联动坐标系 | | mechID | int | 机器人号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### dualarm_calibration_oxy / dualarm_calibration_oxy_robot 双臂 OXY 标定。 **函数原型:** ```cpp Result dualarm_calibration_oxy(SOCKETFD socketFd, int userNum, std::string xyo); Result dualarm_calibration_oxy_robot(SOCKETFD socketFd, int robotNum, int userNum, std::string xyo); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum | int | 用户坐标编号 | | xyo | std::string | 标定类型:'X'、'Y'、'O'(分别标定 X 轴方向点、Y 轴方向点、原点) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 依次标定原点、X 轴方向点、Y 轴方向点 dualarm_calibration_oxy(fd, 1, "O"); // 移动机器人到原点位置后... dualarm_calibration_oxy(fd, 1, "X"); // 移动机器人到 X 轴方向点后... dualarm_calibration_oxy(fd, 1, "Y"); ``` --- ### dualarm_calculate_user_coordinate / dualarm_calculate_user_coordinate_robot 计算双臂用户坐标(标定完成后计算最终结果)。 **函数原型:** ```cpp Result dualarm_calculate_user_coordinate(SOCKETFD socketFd, int userNumber); Result dualarm_calculate_user_coordinate_robot(SOCKETFD socketFd, int robotNum, int userNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | userNum / userNumber | int | 用户坐标编号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // OXY 三点标定完成后计算用户坐标 Result result = dualarm_calculate_user_coordinate(fd, 1); if (result == SUCCESS) { printf("双臂用户坐标计算成功\n"); } ``` --- --- # 六、VFD 主轴变频器控制(nrc_vfd_ctr.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/06.VFD%E4%B8%BB%E8%BD%B4%E5%8F%98%E9%A2%91%E5%99%A8.html ### vfd_run VFD 运行。 --- ### vfd_shutdown VFD 停机。 --- ### vfd_spindle_positioning_stop VFD 准停。 --- ### get_vfd_vel 查询 VFD 电流、速度、角度。 --- --- # 七、作业文件操作(nrc_job_operate.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/07.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C.html ## 功能概述 作业文件(.JBR)是控制器的核心程序文件,由多条指令组成。本模块提供作业文件的上传/下载/新建/删除/打开、运行控制(运行/单步/暂停/继续/停止)、内容读取与编辑(按行查询/删除/插入指令)等完整操作能力。 **作业文件生命周期:** 上传/新建 → 打开 → 编辑(插入/修改指令)→ 运行 → 暂停/继续 → 停止 ## 7.1 作业文件管理 ### job_get_all_jobfile_name 获取所有作业文件名。 **函数原型:** ```cpp Result job_get_all_jobfile_name(SOCKETFD socketFd, std::vector>& robotsFile); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotsFile | std::vector\\>& | 输出参数,二维数组,一维长度 4,对应 4 个机器人的作业文件列表 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp std::vector> files; Result result = job_get_all_jobfile_name(fd, files); if (result == SUCCESS) { printf("机器人1的作业文件: \n"); for (const auto& name : files[0]) { printf(" %s\n", name.c_str()); } } ``` --- ### job_upload_by_directory 根据文件夹上传一整个文件夹的作业文件。 **函数原型:** ```cpp Result job_upload_by_directory(SOCKETFD socketFd, const std::string& directoryPath); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | directoryPath | const std::string& | 目录的完整路径 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp Result result = job_upload_by_directory(fd, "C:/jobs/robot1"); ``` --- ### job_upload_by_file 根据文件名上传一个作业文件。 **函数原型:** ```cpp Result job_upload_by_file(SOCKETFD socketFd, const std::string& filePath); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | filePath | const std::string& | 文件的完整路径 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp Result result = job_upload_by_file(fd, "C:/jobs/main.JBR"); ``` --- ### job_sync_job_file 上传作业文件后同步刷新示教器文件列表。 **函数原型:** ```cpp Result job_sync_job_file(SOCKETFD socketFd); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 > 调用 `job_upload_by_directory` / `job_upload_by_file` 后建议调用本接口刷新示教器显示。 --- ### job_download_by_directory 下载所有作业文件到指定文件夹。 **函数原型:** ```cpp Result job_download_by_directory(SOCKETFD socketFd, const std::string& directoryPath, bool isCover); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | directoryPath | const std::string& | 目录的完整路径 | | isCover | bool | 是否覆盖已存在的文件 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### log_download_by_quantity 下载指定数量的日志文件到指定文件夹。 **函数原型:** ```cpp Result log_download_by_quantity(SOCKETFD socketFd, int counts, const std::string& directoryPath); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | counts | int | 文件数量 | | directoryPath | const std::string& | 目录的完整路径 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### backup_system 一键备份系统,保存至当前执行程序目录下。 **函数原型:** ```cpp Result backup_system(SOCKETFD socketFd); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### job_create / job_create_robot 新建作业文件。 **函数原型:** ```cpp Result job_create(SOCKETFD socketFd, const std::string& jobName); Result job_create_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | const std::string& | 作业文件名,只允许字母开头,字母数字组合 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 新建 QQQ.JBR Result result = job_create(fd, "QQQ"); ``` --- ### job_delete / job_delete_robot 删除指定的作业文件。 **函数原型:** ```cpp Result job_delete(SOCKETFD socketFd, const std::string& jobName); Result job_delete_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | const std::string& | 作业文件名 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 删除 QQQ.JBR Result result = job_delete(fd, "QQQ"); ``` --- ### job_open / job_open_robot 打开指定的作业文件(打开后才能进行内容读取/编辑操作)。 **函数原型:** ```cpp Result job_open(SOCKETFD socketFd, const std::string& jobName); Result job_open_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | const std::string& | 作业文件名 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 打开 QQQ.JBR Result result = job_open(fd, "QQQ"); ``` --- ## 7.2 作业内容操作 ### job_get_command_total_lines / job_get_command_total_lines_robot 获取当前打开作业文件的总行数。 **函数原型:** ```cpp Result job_get_command_total_lines(SOCKETFD socketFd, int& totalLines); Result job_get_command_total_lines_robot(SOCKETFD socketFd, int robotNum, int& totalLines); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | totalLines | int& | 输出参数,总行数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp int total = 0; Result result = job_get_command_total_lines(fd, total); printf("作业文件共 %d 行\n", total); ``` --- ### job_get_command_content_by_line / job_get_command_content_by_line_robot 获取指定行号的作业文件内容。 **函数原型:** ```cpp Result job_get_command_content_by_line(SOCKETFD socketFd, int line, int& commandType, std::string& jobContent); Result job_get_command_content_by_line_robot(SOCKETFD socketFd, int robotNum, int line, int& commandType, std::string& jobContent); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | line | int | 行号 | | commandType | int& | 输出参数,指令类型 | | jobContent | std::string& | 输出参数,该行指令内容 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp int cmdType = 0; std::string content; Result result = job_get_command_content_by_line(fd, 3, cmdType, content); if (result == SUCCESS) { printf("第3行: %s\n", content.c_str()); } ``` --- ### job_delete_command_by_line / job_delete_command_by_line_robot 删除指定行号的指令。 **函数原型:** ```cpp Result job_delete_command_by_line(SOCKETFD socketFd, int line); Result job_delete_command_by_line_robot(SOCKETFD socketFd, int robotNum, int line); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | line | int | 要删除的行号 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 7.3 作业运行控制 ### job_run / job_run_robot 运行指定的作业文件。 **函数原型:** ```cpp Result job_run(SOCKETFD socketFd, const std::string& jobName); Result job_run_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | const std::string& | 作业文件名 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 运行 QQQ.JBR Result result = job_run(fd, "QQQ"); ``` --- ### job_step / job_step_robot 单步运行指定的作业文件的某一行。 **函数原型:** ```cpp Result job_step(SOCKETFD socketFd, const std::string& jobName, int line); Result job_step_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName, int line); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | const std::string& | 作业文件名 | | line | int | 行号,范围 [1, 最大行号] | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 单步运行 QQQ.JBR 的第一行 Result result = job_step(fd, "QQQ", 1); ``` --- ### job_pause / job_pause_robot 暂停当前运行的作业文件。 **函数原型:** ```cpp Result job_pause(SOCKETFD socketFd); Result job_pause_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### job_continue / job_continue_robot 继续运行暂停的作业文件。 **函数原型:** ```cpp Result job_continue(SOCKETFD socketFd); Result job_continue_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 > 需要运行模式。 --- ### job_stop / job_stop_robot 停止作业文件(不会下电)。 **函数原型:** ```cpp Result job_stop(SOCKETFD socketFd); Result job_stop_robot(SOCKETFD socketFd, int robotNum); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### job_run_times / job_run_times_robot 设置作业文件运行次数。 **函数原型:** ```cpp Result job_run_times(SOCKETFD socketFd, int index); Result job_run_times_robot(SOCKETFD socketFd, int robotNum, int index); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | index | int | 运行次数,0=无限次 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### job_break_point_run / job_break_point_run_robot 断点续跑指定的作业文件(从上次中断位置继续运行)。 **函数原型:** ```cpp Result job_break_point_run(SOCKETFD socketFd, const std::string& jobName); Result job_break_point_run_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | const std::string& | 作业文件名 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 > 需要运行模式。 --- ### job_get_current_file / job_get_current_file_robot 获取当前打开的作业文件名称(`std::string` 版本)。 **函数原型:** ```cpp Result job_get_current_file(SOCKETFD socketFd, std::string& jobName); Result job_get_current_file_robot(SOCKETFD socketFd, int robotNum, std::string& jobName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | std::string& | 输出参数,当前打开的作业文件名 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### job_get_current_file_csharp / job_get_current_file_csharp_robot 获取当前打开的作业文件名称(`std::vector` 版本,供 C# 使用)。 **函数原型:** ```cpp Result job_get_current_file_csharp(SOCKETFD socketFd, std::vector& jobName); Result job_get_current_file_csharp_robot(SOCKETFD socketFd, int robotNum, std::vector& jobName); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | jobName | std::vector\& | 输出参数,当前打开的作业文件名 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### job_get_current_line / job_get_current_line_robot 获取当前打开的作业文件运行到的行数。 **函数原型:** ```cpp Result job_get_current_line(SOCKETFD socketFd, int& line); Result job_get_current_line_robot(SOCKETFD socketFd, int robotNum, int& line); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | line | int& | 输出参数,运行到的行数 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 7.4 点位操作 ### job_insert_local_position / job_insert_local_position_robot 作业文件插入一个局部点位。 **函数原型:** ```cpp Result job_insert_local_position(SOCKETFD socketFd, PositionData posData); Result job_insert_local_position_robot(SOCKETFD socketFd, int robotNum, PositionData posData); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | posData | PositionData | 位置数据 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### job_set_local_position / job_set_local_position_robot 根据点位名修改当前作业文件局部点位。 **函数原型:** ```cpp Result job_set_local_position(SOCKETFD socketFd, const std::string& posName, std::vector posInfo); Result job_set_local_position_robot(SOCKETFD socketFd, int robotNum, const std::string& posName, std::vector posInfo); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | posName | const std::string& | 需要修改的点位名 | | posInfo | std::vector\ | 点位数据,长度 14:`[0]`坐标系(0=关节,1=直角,2=工具,3=用户);`[1]`角度制(0)/弧度制(1);`[2]`形态;`[3]`工具手坐标序号;`[4]`用户坐标序号;`[5][6]`备用;`[7-13]`点位信息 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ## 7.5 运动指令插入 向作业文件指定行号插入运动指令,所有接口均提供 `_robot` 版本。 | 接口 | 指令 | 说明 | |------|------|------| | `job_insert_moveJ` | MoveJ | 关节运动指令 | | `job_insert_moveL` | MoveL | 直线运动指令 | | `job_insert_moveC` | MoveC | 圆弧运动指令 | | `job_insert_imove` | IMOVE | 增量运动指令(`moveCmd.targetPosType = 3`,`moveCmd.targetPosName = "RP0001"`) | | `job_insert_moveComm` | moveComm | 外部点指令,`moveType` 为插补方式 `"MovJ"`/`"MovL"`,参数含速度/加速度/减速度/时间/平滑度 | | `job_insert_samov_command` | SAMOV | 定点移动指令(点位数据用 PositionData) | | `job_insert_EImoveL` | EImoveL | 外部轴直线运动 | | `job_insert_EImoveC` | EImoveC | 外部轴圆弧运动 | | `job_insert_EImoveCA` | EImoveCA | 外部轴圆弧绝对运动 | **moveJ/moveL/moveC 函数原型:** ```cpp Result job_insert_moveJ(SOCKETFD socketFd, int line, MoveCmd moveCmd); Result job_insert_moveL(SOCKETFD socketFd, int line, MoveCmd moveCmd); Result job_insert_moveC(SOCKETFD socketFd, int line, MoveCmd moveCmd); ``` **moveComm 函数原型:** ```cpp Result job_insert_moveComm(SOCKETFD socketFd, int line, std::string moveType, double m_vel, double m_acc, double m_dec, int m_time, int m_pl); ``` **使用示例(插入 MoveJ 指令):** ```cpp MoveCmd cmd; cmd.coord = 0; // 关节坐标 cmd.velocity = 80; // 速度 80% cmd.acc = 50; cmd.dec = 50; // 在第 5 行插入 MoveJ 指令 Result result = job_insert_moveJ(fd, 5, cmd); ``` --- ## 7.6 延迟、IO、逻辑控制指令插入 | 接口 | 指令 | 说明 | |------|------|------| | `job_insert_timer_command` | TIMER | 延时指令,`time` 单位秒 | | `job_insert_io_out_command` | IO_OUT | IO 输出指令,参数 `IOCommandParams` | | `job_insert_until` | UNTIL | 直到循环开始(条件组 + 逻辑类型) | | `job_insert_end_until` | END_UNTIL | 直到循环结束 | | `job_insert_while` | WHILE | 条件循环开始 | | `job_insert_end_while` | END_WHILE | 条件循环结束 | | `job_insert_if` | IF | 条件判断开始 | | `job_insert_end_if` | END_IF | 条件判断结束 | | `job_insert_label` | LABEL | 标签指令,`label` 为标签名 | | `job_insert_jump` | JUMP | 跳转指令(条件组 + 跳转条件标志 + 目标标签) | **条件指令通用参数:** | 参数 | 类型 | 说明 | |------|------|------| | conditionGroups | std::vector\\> | 条件组的二维向量 | | logic | std::vector\ | 第一层逻辑类型,0=与,1=或 | | logicGroup | std::vector\\> | 第二层逻辑类型,0=与,1=或 | **使用示例(插入延时指令):** ```cpp // 在第 3 行插入 2 秒延时 Result result = job_insert_timer_command(fd, 3, 2.0); ``` **使用示例(插入 IF 指令):** ```cpp std::vector> conds; // 构造条件组... std::vector logic = {0}; // 第一层"与" std::vector> logicGroup = {{0}}; Result result = job_insert_if(fd, 5, conds, logic, logicGroup); ``` --- ## 7.7 工艺指令插入 ### 视觉工艺指令 | 接口 | 指令 | 说明 | |------|------|------| | `job_insert_vision_craft_start` | VISION_RUN | 开始视觉,参数 `id` 为工艺号 | | `job_insert_vision_craft_get_pos` | VISION_POS | 获取视觉位置,`posName` 为存放位置变量名(如 GP0001) | | `job_insert_vision_craft_trajectory` | VISION_TARCE | 获取视觉轨迹位置(24.03 可用),参数 `VisualTrajectoryPosition` | | `job_insert_vision_craft_visual_trigger` | VISION_POS | 触发视觉,参数 `id` 为工艺号 | | `job_insert_vision_craft_visual_end` | VISION_END | 视觉结束,参数 `id` 为工艺号 | **使用示例:** ```cpp // 在第 5 行插入视觉开始指令(工艺号 1) Result result = job_insert_vision_craft_start(fd, 5, 1); ``` ### 传送带工艺指令 | 接口 | 指令 | 说明 | |------|------|------| | `job_insert_conveyor_check_pos` | CONVEYOR_CHECKPOS | 传送带工件检测开始 | | `job_insert_conveyor_check_end` | CONVEYOR_CHECKEND | 传送带工件检测结束 | | `job_insert_conveyor_on` | CONVEYOR_ON | 传送带跟踪开始(`posTtype`:0=手动传点位,1=默认工件点;`vel` 范围 [2,2000]mm/s;`acc` 范围 [1,100]%) | | `job_insert_conveyor_off` | CONVEYOR_OFF | 传送带跟踪结束 | | `job_insert_conveyor_pos` | CONVEYOR_POS | 获取传送带跟踪位置,`posName` 为全局点位名 | | `job_insert_conveyor_clear` | CONVEYOR_POS | 清除传送带跟踪目标(`removeType`:0=全部目标,1=本次目标) | | `job_insert_conveyor_wait` | CONVEYOR_Wait | 传送带等料(24.03 可用),参数含超时时间/来料结果/来料位置 | **CONVEYOR_ON 函数原型:** ```cpp Result job_insert_conveyor_on(SOCKETFD socketFd, int line, int id, int postype, std::vector pos, int vel, int acc); ``` **使用示例:** ```cpp // 在第 8 行插入传送带跟踪开始(工艺号 1,使用工件点,速度 500mm/s) std::vector pos(14, 0); Result result = job_insert_conveyor_on(fd, 8, 1, 1, pos, 500, 50); ``` ### 相贯线与独立轴指令 | 接口 | 指令 | 说明 | |------|------|------| | `job_insert_cil` | CIL | 相贯线指令(MoveCmd + 工艺号) | | `job_insert_axis_motion_position` | 轴点动 | 轴点到点运行控制(`AXISPostion`) | | `job_insert_axis_motion_velocity` | 轴恒转速 | 轴恒转速控制(`AxisVelocity`) | | `job_insert_axis_motion_torque` | 轴恒转矩 | 轴恒转矩控制(`AxisTorque`) | | `job_insert_axis_motion_stop` | 轴停止 | 轴运动停止,`axisNum` 为轴号 | | `job_insert_axis_motion_cancel_independent_control` | 取消独立控制 | 取消独立轴控制,`axisNum` 为轴号 | | `job_insert_axis_motion_speed_judge` | 轴速度判断 | 轴运动速度判断(`Axisspeedjudge`) | | `job_insert_axis_motion_position_stop` | 主轴准停 | 主轴准停指令,`angle` 为准停角度 | --- ## 7.8 多机协调指令插入 ### job_insert_tasks / job_insert_tasks_rbobt 插入声明协调参数指令。 **函数原型:** ```cpp Result job_insert_tasks(SOCKETFD socketFd, int line, int crafId, std::vector robotGroup); Result job_insert_tasks_rbobt(SOCKETFD socketFd, int robotNum, int line, int crafId, std::vector robotGroup); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | line | int | 插入位置 | | crafId | int | 协调任务号,范围 1-999 | | robotGroup | std::vector\ | 需要同步的机器人组,传入需要同步的机器人编号 1-4 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 声明协调任务 1,同步机器人 1 和 2 std::vector group = {1, 2}; Result result = job_insert_tasks(fd, 10, 1, group); ``` --- ### job_insert_wait_sync_task / job_insert_wait_sync_task_rbobt 插入等待任务同步点指令。 **函数原型:** ```cpp Result job_insert_wait_sync_task(SOCKETFD socketFd, int line, int crafId, std::string waitSignal); Result job_insert_wait_sync_task_rbobt(SOCKETFD socketFd, int robotNum, int line, int crafId, std::string waitSignal); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | line | int | 插入位置 | | crafId | int | 协调任务号,范围 1-999 | | waitSignal | std::string | 同步信号量 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 **使用示例:** ```cpp // 等待协调任务 1 的同步信号 "SYNC_1" Result result = job_insert_wait_sync_task(fd, 12, 1, "SYNC_1"); ``` --- --- # 八、队列运动模式(nrc_queue_operate.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/08.%E9%98%9F%E5%88%97%E8%BF%90%E5%8A%A8%E6%A8%A1%E5%BC%8F.html ## 8.1 队列模式控制 ### queue_motion_set_status / queue_motion_set_status_robot 打开/关闭队列运动模式。打开或关闭都将清空远端队列。 --- ### queue_motion_get_status / queue_motion_get_status_robot 查询队列运动模式状态。 --- ### queue_motion_clear_Data / queue_motion_clear_Data_robot 清空缓存的运动队列数据。 --- ### queue_motion_size / queue_motion_size_robot 查询队列长度。 --- ### queue_motion_get_queuelen / queue_motion_get_queuelen_robot 查询队列剩余指令数。 --- ### queue_motion_send_to_controller / queue_motion_send_to_controller_robot 发送队列数据到控制器。size: [0,31],0=全部发送。 --- ### queue_motion_suspend / queue_motion_suspend_robot 暂停连续运动。 --- ### queue_motion_restart / queue_motion_restart_robot 暂停后重启队列运动。 --- ### queue_motion_stop / queue_motion_stop_robot 停止连续运动(已废弃,建议用 stop_not_power_off)。 --- ### queue_motion_stop_not_power_off / queue_motion_stop_not_power_off_robot 停止连续运动(保持上电)。 --- ## 8.2 队列运动指令插入 - `queue_motion_push_back_moveJ` / `queue_motion_push_back_moveJ_robot` - `queue_motion_push_back_moveL` / `queue_motion_push_back_moveL_robot` - `queue_motion_push_back_moveC` / `queue_motion_push_back_moveC_robot` - `queue_motion_push_back_moveCA` / `queue_motion_push_back_moveCA_robot` - `queue_motion_push_back_moveS` / `queue_motion_push_back_moveS_robot` - `queue_motion_push_back_moveJ_extra` / `queue_motion_push_back_moveJ_extra_robot` - `queue_motion_push_back_moveL_extra` / `queue_motion_push_back_moveL_extra_robot` - `queue_motion_push_back_imove` / `queue_motion_push_back_imove_robot` - `queue_motion_push_back_EImoveL` / `queue_motion_push_back_EImoveL_robot` - `queue_motion_push_back_EImoveC` / `queue_motion_push_back_EImoveC_robot` - `queue_motion_push_back_EImoveCA` / `queue_motion_push_back_EImoveCA_robot` - `queue_motion_push_back_samov` / `queue_motion_push_back_samov_robot` - `queue_motion_push_back_cil` / `queue_motion_push_back_cil_robot` - `queue_motion_push_back_TOFFSETON` / `queue_motion_push_back_TOFFSETON_robot` - `queue_motion_push_back_TOFFSETOFF` / `queue_motion_push_back_TOFFSETOFF_robot` - `queue_motion_push_back_timer` / `queue_motion_push_back_timer_robot` - `queue_motion_push_back_dout` / `queue_motion_push_back_dout_robot` - `queue_motion_push_moveComm` / `queue_motion_push_moveComm_rbobt` --- ## 8.3 队列工艺指令插入 - `queue_motion_push_back_arc_on` / `queue_motion_push_back_arc_on_robot` - `queue_motion_push_back_arc_off` / `queue_motion_push_back_arc_off_robot` - `queue_motion_push_back_wave_on` / `queue_motion_push_back_wave_on_robot` - `queue_motion_push_back_wave_off` / `queue_motion_push_back_wave_off_robot` - `queue_motion_push_back_tigweld_on` / `queue_motion_push_back_tigweld_on_robot` - `queue_motion_push_back_tigweld_off` / `queue_motion_push_back_tigweld_off_robot` - `queue_motion_push_back_spot_weld` / `queue_motion_push_back_spot_weld_robot` - `queue_motion_push_back_vision_craft_start` / `queue_motion_push_back_vision_craft_start_robot` - `queue_motion_push_back_vision_craft_get_pos` / `queue_motion_push_back_vision_craft_get_pos_robot` - `queue_motion_push_back_vision_craft_trajectory` / `queue_motion_push_back_vision_craft_trajectory_robot` - `queue_motion_push_back_vision_craft_visual_trigger` / `queue_motion_push_back_vision_craft_visual_trigger_robot` - `queue_motion_push_back_vision_craft_visual_end` / `queue_motion_push_back_vision_craft_visual_end_robot` - `queue_motion_push_back_conveyor_check_pos` / `queue_motion_push_back_conveyor_check_pos_robot` - `queue_motion_push_back_conveyor_check_end` / `queue_motion_push_back_conveyor_check_end_robot` - `queue_motion_push_back_conveyor_on` / `queue_motion_push_back_conveyor_on_robot` - `queue_motion_push_back_conveyor_off` / `queue_motion_push_back_conveyor_off_robot` - `queue_motion_push_back_conveyor_pos` / `queue_motion_push_back_conveyor_pos_robot` - `queue_motion_push_back_conveyor_clear` / `queue_motion_push_back_conveyor_clear_robot` - `queue_motion_push_back_conveyor_wait` / `queue_motion_push_back_conveyor_wait_robot` --- ## 8.4 队列逻辑控制指令插入 - `queue_motion_push_back_until` / `queue_motion_push_back_until_robot` - `queue_motion_push_back_end_until` / `queue_motion_push_back_end_until_robot` - `queue_motion_push_back_while` / `queue_motion_push_back_while_robot` - `queue_motion_push_back_end_while` / `queue_motion_push_back_end_while_robot` - `queue_motion_push_back_if` / `queue_motion_push_back_if_robot` - `queue_motion_push_back_end_if` / `queue_motion_push_back_end_if_robot` - `queue_motion_push_back_label` / `queue_motion_push_back_label_robot` - `queue_motion_push_back_jump` / `queue_motion_push_back_jump_robot` --- ## 8.5 队列轴控制指令插入 - `queue_motion_push_back_axis_motion_position` / `queue_motion_push_back_axis_motion_position_robot` - `queue_motion_push_back_axis_motion_velocity` / `queue_motion_push_back_axis_motion_velocity_robot` - `queue_motion_push_back_axis_motion_torque` / `queue_motion_push_back_axis_motion_torque_robot` - `queue_motion_push_back_axis_motion_stop` / `queue_motion_push_back_axis_motion_stop_robot` - `queue_motion_push_back_axis_motion_cancel_independent_control` / `queue_motion_push_back_axis_motion_cancel_independent_control_robot` - `queue_motion_push_back_axis_motion_speed_judge` / `queue_motion_push_back_axis_motion_speed_judge_robot` - `queue_motion_push_back_axis_motion_position_stop` / `queue_motion_push_back_axis_motion_position_stop_robot` --- ## 8.6 队列多机协调指令插入 - `queue_motion_push_back_tasks` / `queue_motion_push_back_tasks_robot` - `queue_motion_push_back_wait_sync_task` / `queue_motion_push_back_wait_sync_task_robot` --- --- # 九、焊接工艺(nrc_craft_weld.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/09.%E7%84%8A%E6%8E%A5%E5%B7%A5%E8%89%BA.html 焊接工艺接口提供焊接参数配置、送丝/退丝/送气控制、焊接使能、手动点焊、摆焊参数设置以及焊接状态监控等功能。支持单机器人和多机器人(`_robot` 后缀)两种调用方式。 ## 数据结构 ### ArcParam —— 焊接工艺参数 ```cpp struct ArcParam { double weldVoltage; // 焊接电压 范围[-1000,1000]V double weldCurrent; // 焊接电流 范围[0,1000]A double arcOnCurrent; // 起弧电流 范围[0,1000]A double arcOnVoltage; // 起弧电压 范围[-1000,1000]V double arcOnTime; // 起弧时间 范围[0,5]S bool arcOnRampEnable; // 起弧渐变 false:未使能 true:使能 int arcOnRampMode; // 起弧方式 时间渐变 double arcOnRampTime; // 起弧渐变时间 范围[0,100000]ms double arcOffCurrent; // 收弧电流 范围[0,1000]A double arcOffVoltage; // 收弧电压 范围[-1000,1000]V double arcOffTime; // 收弧时间 范围[0,5]S bool arcOffRampEnable; // 收弧渐变 false:未使能 true:使能 int arcOffRampMode; // 收弧方式 时间渐变 double arcOffRampTime; // 收弧渐变时间 范围[0,100000]ms }; ``` ### WaveParam —— 摆焊参数 ```cpp struct WaveParam { int type; // 摆法方式 0:正弦摆 1:Z字形 2:圆形摆 3:外部轴定点摆 double swingFreq; // 摆动频率 double swingAmplitude; // 摆动幅度 double radius; // 半径 double LTypeAngle; // L型角度 bool moveWhenEdgeStay; // 边缘停留 double leftStayTime; // 左停留时间 double rightStayTime; // 右停留时间 int initialDir; // 初始方向 double horizontalDeflection; // 水平偏转 double verticalDeflection; // 垂直偏转 }; ``` ### WeldState —— 焊接监控状态 ```cpp struct WeldState { int pistolSwitch; // 焊枪开关 -1:未使能 0:错误 1:使能 int arcingSuccess; // 引弧成功 -1:未使能 0:错误 1:使能 int handWireFeed; // 手动送丝 -1:未使能 0:错误 1:使能 double weldCurrent; // 焊接电流 double weldVoltage; // 焊接电压 double weldTime; // 焊接时间 double weldPWM; // 焊接占空比 }; ``` --- ## 9.1 焊接参数配置 ### weld_get_config / weld_get_config_robot 获取指定工艺号的焊接参数。 **函数签名:** ```cpp Result weld_get_config(SOCKETFD socketFd, int index, ArcParam& param); Result weld_get_config_robot(SOCKETFD socketFd, int robotNum, int index, ArcParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | index | int | 输入 | 工艺号 | | param | ArcParam& | 输出 | 焊接工艺参数 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败(-1: 接收失败,-2: 断开连接,-6: 超时)。 **使用示例:** ```cpp // 获取工艺号1的焊接参数 ArcParam param; Result result = weld_get_config(fd, 1, param); if (result == 0) { printf("工艺号1的焊接参数:\n"); printf(" 焊接电压: %.2f V\n", param.weldVoltage); printf(" 焊接电流: %.2f A\n", param.weldCurrent); printf(" 起弧电流: %.2f A\n", param.arcOnCurrent); printf(" 起弧时间: %.2f S\n", param.arcOnTime); printf(" 收弧电流: %.2f A\n", param.arcOffCurrent); printf(" 收弧时间: %.2f S\n", param.arcOffTime); } ``` --- ### weld_set_config / weld_set_config_robot 设置指定工艺号的焊接参数。 **函数签名:** ```cpp Result weld_set_config(SOCKETFD socketFd, int index, ArcParam& param); Result weld_set_config_robot(SOCKETFD socketFd, int robotNum, int index, ArcParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | index | int | 输入 | 工艺号 | | param | ArcParam& | 输入 | 焊接工艺参数 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **使用示例:** ```cpp // 配置工艺号1的焊接参数 ArcParam param; param.weldVoltage = 25.0; // 焊接电压 25V param.weldCurrent = 180.0; // 焊接电流 180A param.arcOnCurrent = 200.0; // 起弧电流 200A param.arcOnVoltage = 28.0; // 起弧电压 28V param.arcOnTime = 0.5; // 起弧时间 0.5秒 param.arcOnRampEnable = true; // 使能起弧渐变 param.arcOnRampMode = 0; // 起弧方式:时间渐变 param.arcOnRampTime = 200.0; // 起弧渐变时间 200ms param.arcOffCurrent = 150.0; // 收弧电流 150A param.arcOffVoltage = 22.0; // 收弧电压 22V param.arcOffTime = 0.5; // 收弧时间 0.5秒 param.arcOffRampEnable = true; // 使能收弧渐变 param.arcOffRampMode = 0; // 收弧方式:时间渐变 param.arcOffRampTime = 200.0; // 收弧渐变时间 200ms Result result = weld_set_config(fd, 1, param); if (result == 0) { printf("焊接参数设置成功\n"); } ``` --- ## 9.2 送丝/退丝/送气控制 ### weld_set_feed_wire / weld_set_feed_wire_robot 控制送丝功能。 **函数签名:** ```cpp Result weld_set_feed_wire(SOCKETFD socketFd, int state); Result weld_set_feed_wire_robot(SOCKETFD socketFd, int robotNum, int state); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | state | int | 输入 | 1: 开启送丝,0: 关闭送丝 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **注意事项:** 送丝功能通常用于手动调试场景,在自动焊接过程中不建议单独调用。 **使用示例:** ```cpp // 开启送丝 Result result = weld_set_feed_wire(fd, 1); if (result == 0) { printf("送丝已开启\n"); sleep(3); // 送丝3秒 // 关闭送丝 weld_set_feed_wire(fd, 0); } ``` --- ### weld_set_rewind_wire / weld_set_rewind_wire_robot 控制退丝功能。 **函数签名:** ```cpp Result weld_set_rewind_wire(SOCKETFD socketFd, int state); Result weld_set_rewind_wire_robot(SOCKETFD socketFd, int robotNum, int state); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | state | int | 输入 | 1: 开启退丝,0: 关闭退丝 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **使用示例:** ```cpp // 开启退丝 Result result = weld_set_rewind_wire(fd, 1); if (result == 0) { printf("退丝已开启\n"); sleep(2); // 退丝2秒 // 关闭退丝 weld_set_rewind_wire(fd, 0); } ``` --- ### weld_set_supply_gas / weld_set_supply_gas_robot 控制送气功能。 **函数签名:** ```cpp Result weld_set_supply_gas(SOCKETFD socketFd, int state); Result weld_set_supply_gas_robot(SOCKETFD socketFd, int robotNum, int state); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | state | int | 输入 | 1: 开启送气,0: 关闭送气 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **使用示例:** ```cpp // 焊前预送气 Result result = weld_set_supply_gas(fd, 1); if (result == 0) { printf("送气已开启,预送气中...\n"); sleep(1); // 预送气1秒 // 开始焊接... // 焊接完成后关气 // weld_set_supply_gas(fd, 0); } ``` --- ## 9.3 焊接使能与手动点焊 ### weld_set_enable / weld_set_enable_robot 控制焊接使能状态。 **函数签名:** ```cpp Result weld_set_enable(SOCKETFD socketFd, int state); Result weld_set_enable_robot(SOCKETFD socketFd, int robotNum, int state); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | state | int | 输入 | 1: 使能焊接,0: 关闭焊接使能 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **注意事项:** 在自动焊接前需要先调用此接口使能焊接功能。关闭焊接使能后,焊接相关的 IO 输出将被禁用。 **使用示例:** ```cpp // 使能焊接 Result result = weld_set_enable(fd, 1); if (result == 0) { printf("焊接使能已开启,可以开始焊接\n"); } // 焊接完成后关闭使能 // weld_set_enable(fd, 0); ``` --- ### weld_set_hand_spot / weld_set_hand_spot_robot 控制手动点焊功能。 **函数签名:** ```cpp Result weld_set_hand_spot(SOCKETFD socketFd, int state); Result weld_set_hand_spot_robot(SOCKETFD socketFd, int robotNum, int state); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | state | int | 输入 | 1: 开启手动点焊,0: 关闭手动点焊 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **注意事项:** 手动点焊用于调试或临时焊接需求,开启后会立即执行点焊操作。请确保焊枪已到达目标位置后再调用。 **使用示例:** ```cpp // 先移动到焊接位置 // robot_movel(fd, ...); // 执行手动点焊 Result result = weld_set_hand_spot(fd, 1); if (result == 0) { printf("手动点焊完成\n"); } ``` --- ## 9.4 状态获取 ### weld_get_feed_wire_status / weld_get_feed_wire_status_robot 获取送丝、退丝、送气、焊接使能、手动点焊的状态。 **函数签名:** ```cpp Result weld_get_feed_wire_status(SOCKETFD socketFd, std::vector& status); Result weld_get_feed_wire_status_robot(SOCKETFD socketFd, int robotNum, std::vector& status); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | status | std::vector\& | 输出 | 状态数组,长度 5 | **status 数组说明:** | 索引 | 含义 | 取值 | |------|------|------| | status[0] | 送丝状态 | 0: 关闭,1: 开启 | | status[1] | 退丝状态 | 0: 关闭,1: 开启 | | status[2] | 送气状态 | 0: 关闭,1: 开启 | | status[3] | 焊接使能 | 0: 关闭,1: 使能 | | status[4] | 手动点焊 | 0: 关闭,1: 开启 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **使用示例:** ```cpp std::vector status; Result result = weld_get_feed_wire_status(fd, status); if (result == 0) { printf("焊接状态:\n"); printf(" 送丝: %s\n", status[0] ? "开启" : "关闭"); printf(" 退丝: %s\n", status[1] ? "开启" : "关闭"); printf(" 送气: %s\n", status[2] ? "开启" : "关闭"); printf(" 焊接使能: %s\n", status[3] ? "使能" : "关闭"); printf(" 手动点焊: %s\n", status[4] ? "开启" : "关闭"); } ``` --- ### weld_get_monitor_status / weld_get_monitor_status_robot 获取焊接实时监控状态,包括焊枪开关、引弧状态、电流电压等实时数据。 **函数签名:** ```cpp Result weld_get_monitor_status(SOCKETFD socketFd, WeldState& status); Result weld_get_monitor_status_robot(SOCKETFD socketFd, int robotNum, WeldState& status); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | status | WeldState& | 输出 | 焊接状态结构体 | **WeldState 字段说明:** | 字段 | 类型 | 说明 | |------|------|------| | pistolSwitch | int | 焊枪开关:-1=未使能,0=错误,1=使能 | | arcingSuccess | int | 引弧成功:-1=未使能,0=错误,1=使能 | | handWireFeed | int | 手动送丝:-1=未使能,0=错误,1=使能 | | weldCurrent | double | 当前焊接电流(A) | | weldVoltage | double | 当前焊接电压(V) | | weldTime | double | 累计焊接时间(S) | | weldPWM | double | 焊接占空比(%) | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **注意事项:** 该接口可用于焊接质量监控,建议在焊接过程中周期性调用(如每 100ms 一次),以实时获取焊接参数变化。 **使用示例:** ```cpp // 焊接过程监控 WeldState state; Result result = weld_get_monitor_status(fd, state); if (result == 0) { printf("焊接监控数据:\n"); printf(" 焊枪开关: %d\n", state.pistolSwitch); printf(" 引弧成功: %d\n", state.arcingSuccess); printf(" 焊接电流: %.2f A\n", state.weldCurrent); printf(" 焊接电压: %.2f V\n", state.weldVoltage); printf(" 焊接时间: %.2f S\n", state.weldTime); printf(" 焊接占空比: %.2f%%\n", state.weldPWM); } ``` --- ## 9.5 摆焊参数 ### weld_get_wave_weld_param / weld_get_wave_weld_param_robot 获取摆焊参数数据。控制器支持最多 9 组摆焊参数文件。 **函数签名:** ```cpp Result weld_get_wave_weld_param(SOCKETFD socketFd, int num, WaveParam& param); Result weld_get_wave_weld_param_robot(SOCKETFD socketFd, int robotNum, int num, WaveParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | num | int | 输入 | 摆焊文件编号,范围 [1, 9] | | param | WaveParam& | 输出 | 摆焊参数 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **使用示例:** ```cpp // 获取第1组摆焊参数 WaveParam param; Result result = weld_get_wave_weld_param(fd, 1, param); if (result == 0) { printf("摆焊参数(文件1):\n"); printf(" 摆动方式: %d (0:正弦摆 1:Z字形 2:圆形摆 3:外部轴定点摆)\n", param.type); printf(" 摆动频率: %.2f Hz\n", param.swingFreq); printf(" 摆动幅度: %.2f mm\n", param.swingAmplitude); printf(" 半径: %.2f mm\n", param.radius); printf(" 左停留时间: %.2f S\n", param.leftStayTime); printf(" 右停留时间: %.2f S\n", param.rightStayTime); } ``` --- ### weld_set_wave_weld_param / weld_set_wave_weld_param_robot 设置摆焊参数。控制器支持最多 9 组摆焊参数文件。 **函数签名:** ```cpp Result weld_set_wave_weld_param(SOCKETFD socketFd, int num, const WaveParam& param); Result weld_set_wave_weld_param_robot(SOCKETFD socketFd, int robotNum, int num, const WaveParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | num | int | 输入 | 摆焊文件编号,范围 [1, 9] | | param | const WaveParam& | 输入 | 摆焊参数 | **WaveParam 字段说明:** | 字段 | 类型 | 说明 | |------|------|------| | type | int | 摆动方式:0=正弦摆,1=Z字形摆,2=圆形摆,3=外部轴定点摆 | | swingFreq | double | 摆动频率(Hz) | | swingAmplitude | double | 摆动幅度(mm) | | radius | double | 摆动半径(mm),圆形摆时有效 | | LTypeAngle | double | L型角度,Z字形摆时有效 | | moveWhenEdgeStay | bool | 边缘是否停留 | | leftStayTime | double | 左侧边缘停留时间(S) | | rightStayTime | double | 右侧边缘停留时间(S) | | initialDir | int | 初始摆动方向 | | horizontalDeflection | double | 水平方向偏转角度 | | verticalDeflection | double | 垂直方向偏转角度 | **返回值:** `Result` 枚举,0 表示成功,负数表示失败。 **注意事项:** 摆焊参数配置后,在焊接作业文件中引用对应的摆焊文件编号即可生效。支持 1~9 共 9 组独立的摆焊参数。 **使用示例:** ```cpp // 配置正弦摆焊参数 WaveParam param; param.type = 0; // 正弦摆 param.swingFreq = 2.5; // 摆动频率 2.5Hz param.swingAmplitude = 5.0; // 摆动幅度 5mm param.radius = 0.0; // 正弦摆不需要半径 param.LTypeAngle = 0.0; param.moveWhenEdgeStay = true; // 边缘停留 param.leftStayTime = 0.1; // 左停留 0.1秒 param.rightStayTime = 0.1; // 右停留 0.1秒 param.initialDir = 0; // 初始方向 param.horizontalDeflection = 0.0; param.verticalDeflection = 0.0; Result result = weld_set_wave_weld_param(fd, 1, param); if (result == 0) { printf("摆焊参数(文件1)设置成功\n"); } ``` --- ## 9.6 完整焊接流程示例 ```cpp #include "nrc_craft_weld.h" #include int main() { // 1. 连接机器人(假设已完成) SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { printf("连接失败\n"); return -1; } // 2. 配置焊接参数 ArcParam arcParam; arcParam.weldVoltage = 25.0; arcParam.weldCurrent = 180.0; arcParam.arcOnCurrent = 200.0; arcParam.arcOnVoltage = 28.0; arcParam.arcOnTime = 0.5; arcParam.arcOffCurrent = 150.0; arcParam.arcOffVoltage = 22.0; arcParam.arcOffTime = 0.5; Result ret = weld_set_config(fd, 1, arcParam); if (ret != 0) { printf("焊接参数配置失败\n"); return -1; } // 3. 配置摆焊参数(可选) WaveParam waveParam; waveParam.type = 0; // 正弦摆 waveParam.swingFreq = 2.5; waveParam.swingAmplitude = 3.0; ret = weld_set_wave_weld_param(fd, 1, waveParam); if (ret != 0) { printf("摆焊参数配置失败\n"); } // 4. 预送气 weld_set_supply_gas(fd, 1); sleep(1); // 5. 使能焊接 weld_set_enable(fd, 1); // 6. 启动焊接作业文件 // run_job_file(fd, "weld_job_001"); // 7. 监控焊接状态 for (int i = 0; i < 100; i++) { WeldState state; ret = weld_get_monitor_status(fd, state); if (ret == 0) { printf("焊接中: 电流=%.1fA 电压=%.1fV 时间=%.1fS\n", state.weldCurrent, state.weldVoltage, state.weldTime); } usleep(100000); // 100ms } // 8. 焊接完成,关闭焊接使能和送气 weld_set_enable(fd, 0); weld_set_supply_gas(fd, 0); printf("焊接流程完成\n"); return 0; } ``` --- # 十、码垛工艺(nrc_craft_pallet.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/10.%E7%A0%81%E5%9E%9B%E5%B7%A5%E8%89%BA.html 码垛工艺接口提供码垛运行状态设置与查询、当前运行码垛工艺号获取等功能。支持单机器人和多机器人(`_robot` 后缀)两种调用方式。 --- ## 10.1 运行状态控制 ### pallet_set_running_state / pallet_set_running_state_robot 设置码垛运行状态,指定当前码垛的工艺号、层数和工件数。调用后控制器将按照设定的参数执行码垛作业。 **函数签名:** ```cpp Result pallet_set_running_state(SOCKETFD socketFd, int craftID, int layerNum, int workpiecesNum); Result pallet_set_running_state_robot(SOCKETFD socketFd, int robotNum, int craftID, int layerNum, int workpiecesNum); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | craftID | int | 输入 | 码垛工艺号 | | layerNum | int | 输入 | 总层数 | | workpiecesNum | int | 输入 | 每层工件数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **注意事项:** 该接口用于启动或重置码垛运行状态,通常在码垛作业开始前调用。工艺号需与控制器中已配置的码垛工艺文件对应。 **使用示例:** ```cpp // 设置码垛运行状态:工艺号1,共5层,每层4个工件 Result result = pallet_set_running_state(fd, 1, 5, 4); if (result == 0) { printf("码垛运行状态设置成功:工艺号=%d, 层数=%d, 每层工件数=%d\n", 1, 5, 4); } else { printf("码垛运行状态设置失败,错误码: %d\n", result); } ``` --- ### pallet_get_running_state / pallet_get_running_state_robot 获取码垛当前的运行状态,包括总工件数、总层数、当前层进度等详细信息。 **函数签名:** ```cpp Result pallet_get_running_state(SOCKETFD socketFd, int craftID, int& totalWpNum, int& totalLayerNum, int& curLayerWpSum, int& curLayerNum, int& curPalletedWpSum, int& curLayerPalletedWpNum); Result pallet_get_running_state_robot(SOCKETFD socketFd, int robotNum, int craftID, int& totalWpNum, int& totalLayerNum, int& curLayerWpSum, int& curLayerNum, int& curPalletedWpSum, int& curLayerPalletedWpNum); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | craftID | int | 输入 | 要查询的码垛工艺号 | | totalWpNum | int& | 输出 | 总工件数 | | totalLayerNum | int& | 输出 | 总层数 | | curLayerWpSum | int& | 输出 | 当前层总工件数 | | curLayerNum | int& | 输出 | 当前层数(正在执行的第几层) | | curPalletedWpSum | int& | 输出 | 当前已码总工件数 | | curLayerPalletedWpNum | int& | 输出 | 当前层已码工件数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **注意事项:** 该接口可用于实时监控码垛进度,适合在生产管理系统中周期性查询以更新码垛完成进度。 **使用示例:** ```cpp // 查询工艺号1的码垛运行状态 int totalWpNum, totalLayerNum, curLayerWpSum; int curLayerNum, curPalletedWpSum, curLayerPalletedWpNum; Result result = pallet_get_running_state(fd, 1, totalWpNum, totalLayerNum, curLayerWpSum, curLayerNum, curPalletedWpSum, curLayerPalletedWpNum); if (result == 0) { printf("码垛运行状态(工艺号1):\n"); printf(" 总工件数: %d\n", totalWpNum); printf(" 总层数: %d\n", totalLayerNum); printf(" 当前层总工件数: %d\n", curLayerWpSum); printf(" 当前层数: %d\n", curLayerNum); printf(" 已码总工件数: %d\n", curPalletedWpSum); printf(" 当前层已码工件数: %d\n", curLayerPalletedWpNum); // 计算完成进度 if (totalWpNum > 0) { float progress = (float)curPalletedWpSum / totalWpNum * 100; printf(" 完成进度: %.1f%%\n", progress); } } ``` --- ## 10.2 工艺号查询 ### pallet_get_current_run_craftid / pallet_get_current_run_craftid_robot 获取当前运行的作业文件中所包含的所有码垛工艺号列表。 **函数签名:** ```cpp Result pallet_get_current_run_craftid(SOCKETFD socketFd, std::vector& craftIds); Result pallet_get_current_run_craftid_robot(SOCKETFD socketFd, int robotNum, std::vector& craftIds); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | craftIds | std::vector\& | 输出 | 码垛工艺号列表 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **注意事项:** 一个作业文件中可能包含多个码垛工艺,该接口返回当前作业文件中所有已配置的码垛工艺号。可用于动态识别当前作业需要执行哪些码垛任务。 **使用示例:** ```cpp // 获取当前运行的码垛工艺号列表 std::vector craftIds; Result result = pallet_get_current_run_craftid(fd, craftIds); if (result == 0) { printf("当前作业包含 %zu 个码垛工艺:\n", craftIds.size()); for (size_t i = 0; i < craftIds.size(); i++) { printf(" 工艺号 %d: %d\n", (int)(i + 1), craftIds[i]); } } else { printf("获取码垛工艺号失败,错误码: %d\n", result); } ``` --- ## 10.3 完整码垛流程示例 ```cpp #include "nrc_craft_pallet.h" #include "nrc_interface.h" #include int main() { // 1. 连接机器人 SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { printf("连接失败\n"); return -1; } // 2. 获取当前作业包含的码垛工艺号 std::vector craftIds; Result ret = pallet_get_current_run_craftid(fd, craftIds); if (ret == 0 && !craftIds.empty()) { printf("检测到 %zu 个码垛工艺\n", craftIds.size()); } // 3. 设置码垛运行状态 int craftID = 1; // 工艺号 int layers = 3; // 3层 int wpPerLayer = 6; // 每层6个工件 ret = pallet_set_running_state(fd, craftID, layers, wpPerLayer); if (ret != 0) { printf("码垛状态设置失败\n"); return -1; } printf("码垛任务启动:%d层 x %d件/层 = %d件\n", layers, wpPerLayer, layers * wpPerLayer); // 4. 启动码垛作业文件 // run_job_file(fd, "pallet_job_001"); // 5. 监控码垛进度 bool running = true; while (running) { int totalWpNum, totalLayerNum, curLayerWpSum; int curLayerNum, curPalletedWpSum, curLayerPalletedWpNum; ret = pallet_get_running_state(fd, craftID, totalWpNum, totalLayerNum, curLayerWpSum, curLayerNum, curPalletedWpSum, curLayerPalletedWpNum); if (ret == 0) { printf("\r进度: 第%d/%d层, 已码%d/%d件", curLayerNum, totalLayerNum, curPalletedWpSum, totalWpNum); fflush(stdout); // 判断是否全部完成 if (curPalletedWpSum >= totalWpNum && totalWpNum > 0) { running = false; printf("\n码垛全部完成!\n"); } } usleep(500000); // 500ms 查询一次 } printf("码垛流程结束\n"); return 0; } ``` --- # 十一、视觉工艺(nrc_craft_vision.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/11.%E8%A7%86%E8%A7%89%E5%B7%A5%E8%89%BA.html 视觉工艺接口提供视觉系统的基本参数配置、视觉范围设置、坐标参数配置、视觉标定及标定数据查询、手眼标定计算等功能。支持单机器人和多机器人(`_robot` 后缀)两种调用方式。 ## 数据结构 ### VisionParam —— 视觉基本参数 ```cpp struct VisionParam { CameraList cameraList; // 相机列表 Protocol protocol; // 通讯协议配置 Socket socket; // Socket 通讯配置 Trigger trigger; // 触发配置 int userCoordNum; // 用户坐标编号 }; ``` **子结构体说明:** **CameraList:** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | currentName | string | "customize" | 当前相机名称 | | listNum | int | 0 | 相机列表数量 | **Protocol(通讯协议):** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | addDataInitialPara | string | "GD001" | 附加数据初始参数 | | addDataNum | int | 0 | 附加数据数量 | | angleUnit | int | 1 | 角度单位 | | endMark | string | "$" | 结束标志 | | failFlag | string | "NG" | 失败标志 | | frameHeader | string | "" | 帧头 | | hasTCS | bool | false | 是否有TCS | | hasUCS | bool | false | 是否有UCS | | separator | string | "," | 分隔符 | | singleTarget | bool | true | 单目标 | | successFlag | string | "OK" | 成功标志 | | timeOut | int | 30 | 超时时间 | | type | int | 1 | 协议类型 | **Socket(Socket 通讯配置):** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | IP | string | "192.168.1.120" | IP地址 | | cameraDataType | int | 0 | 相机数据类型 | | portNum | int | 1 | 端口号 | | portOne | int | 5050 | 端口1 | | portTwo | int | 5051 | 端口2 | | server | bool | true | 是否为服务器 | **Trigger(触发配置):** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | IOPort | int | 0 | IO端口 | | duration | int | 1000 | 持续时间(ms) | | intervals | int | 35 | 间隔时间(ms) | | triggerMode | int | 2 | 触发模式:1=IO,2=EtherCAT | | triggerOnce | bool | true | 单次触发 | | triggerStr | string | "TRG" | 触发字符串 | ### VisionRange —— 视觉范围 ```cpp struct VisionRange { std::string maxX; // 最大X坐标 std::string maxY; // 最大Y坐标 std::string maxZ; // 最大Z坐标 std::string minX; // 最小X坐标 std::string minY; // 最小Y坐标 std::string minZ; // 最小Z坐标 }; ``` ### VisionPositionParam —— 视觉坐标参数 ```cpp struct VisionPositionParam { Position position; // 位置数据 int protocol; // 协议类型 }; ``` **Position 子结构体包含:** 视角方向(angleDirection)、相机数据(cameraData)、相机点位(cameraPoint,长度14)、参考点位(datumPoint,长度14)、偏移量(Excursion:X/Y/Z 偏移 + 角度)、接收点类型(recvPointsType)、样本数据(sampleData)、比例(scale)。 ### VisionCalibrationData —— 视觉标定数据 ```cpp struct VisionCalibrationData { int visionNum; // 视觉编号 Calibration calibration; // 校准数据(含标定点列表,默认点数6,范围[6,30]) }; ``` **Calibration 包含:** calibrated(是否已校准)、point(标定点列表)、point_num(点数量)。 **CalibrationPoint 包含:** pixel_pos(像素位置,长度7)、pixel_pos_deg(像素位置角度,长度7)、robot_pos(机器人位置,长度7)、robot_pos_deg(机器人位置角度,长度7)。 --- ## 11.1 基本参数配置 ### vision_set_basic_parameter / vision_set_basic_parameter_robot 设置视觉系统的基本参数,包括相机列表、通讯协议、Socket 配置和触发方式。 **函数签名:** ```cpp Result vision_set_basic_parameter(SOCKETFD socketFd, int visionNum, VisionParam vsPamrm); Result vision_set_basic_parameter_robot(SOCKETFD socketFd, int robotNum, int visionNum, VisionParam vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionNum | int | 输入 | 视觉ID编号 | | vsPamrm | VisionParam | 输入 | 视觉基本参数结构体 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp // 配置视觉系统基本参数 VisionParam param; // 设置相机名称 param.cameraList.currentName = "camera_01"; param.cameraList.listNum = 1; // 设置通讯协议 param.protocol.addDataInitialPara = "GD001"; param.protocol.endMark = "$"; param.protocol.failFlag = "NG"; param.protocol.successFlag = "OK"; param.protocol.separator = ","; param.protocol.timeOut = 30; param.protocol.type = 1; // 设置Socket通讯 param.socket.IP = "192.168.1.120"; param.socket.portOne = 5050; param.socket.portTwo = 5051; param.socket.server = true; // 设置触发方式 param.trigger.triggerMode = 2; // EtherCAT触发 param.trigger.duration = 1000; param.trigger.intervals = 35; param.trigger.triggerStr = "TRG"; // 设置用户坐标 param.userCoordNum = 1; Result result = vision_set_basic_parameter(fd, 1, param); if (result == 0) { printf("视觉基本参数设置成功\n"); } ``` --- ### vision_get_basic_parameter / vision_get_basic_parameter_robot 查询视觉系统已配置的基本参数。 **函数签名:** ```cpp Result vision_get_basic_parameter(SOCKETFD socketFd, int visionNum, VisionParam& vsPamrm); Result vision_get_basic_parameter_robot(SOCKETFD socketFd, int robotNum, int visionNum, VisionParam& vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionNum | int | 输入 | 视觉ID编号 | | vsPamrm | VisionParam& | 输出 | 接收视觉基本参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp VisionParam param; Result result = vision_get_basic_parameter(fd, 1, param); if (result == 0) { printf("视觉基本参数:\n"); printf(" 相机名称: %s\n", param.cameraList.currentName.c_str()); printf(" IP地址: %s\n", param.socket.IP.c_str()); printf(" 端口1: %d\n", param.socket.portOne); printf(" 触发模式: %d\n", param.trigger.triggerMode); printf(" 用户坐标编号: %d\n", param.userCoordNum); } ``` --- ## 11.2 视觉范围配置 ### vision_set_range / vision_set_range_robot 设置视觉识别的空间范围(包围盒),用于限定视觉检测的有效区域。 **函数签名:** ```cpp Result vision_set_range(SOCKETFD socketFd, int visionNum, VisionRange vsPamrm); Result vision_set_range_robot(SOCKETFD socketFd, int robotNum, int visionNum, VisionRange vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionNum | int | 输入 | 视觉ID编号 | | vsPamrm | VisionRange | 输入 | 视觉范围参数(min/max XYZ) | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp // 设置视觉检测范围:X[0,500], Y[-200,200], Z[0,300] VisionRange range; range.minX = "0"; range.maxX = "500"; range.minY = "-200"; range.maxY = "200"; range.minZ = "0"; range.maxZ = "300"; Result result = vision_set_range(fd, 1, range); if (result == 0) { printf("视觉范围设置成功\n"); } ``` --- ### vision_get_range / vision_get_range_robot 查询视觉已配置的空间范围参数。 **函数签名:** ```cpp Result vision_get_range(SOCKETFD socketFd, int visionNum, VisionRange& vsPamrm); Result vision_get_range_robot(SOCKETFD socketFd, int robotNum, int visionNum, VisionRange& vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionNum | int | 输入 | 视觉ID编号 | | vsPamrm | VisionRange& | 输出 | 接收视觉范围参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp VisionRange range; Result result = vision_get_range(fd, 1, range); if (result == 0) { printf("视觉范围:\n"); printf(" X: [%s, %s]\n", range.minX.c_str(), range.maxX.c_str()); printf(" Y: [%s, %s]\n", range.minY.c_str(), range.maxY.c_str()); printf(" Z: [%s, %s]\n", range.minZ.c_str(), range.maxZ.c_str()); } ``` --- ## 11.3 坐标参数配置 ### vision_set_position_parameter / vision_set_position_parameter_robot 设置视觉坐标参数,包括拍照位置、参考点位、偏移量和样本数据格式等。 **函数签名:** ```cpp Result vision_set_position_parameter(SOCKETFD socketFd, int visionNum, VisionPositionParam vsPamrm); Result vision_set_position_parameter_robot(SOCKETFD socketFd, int robotNum, int visionNum, VisionPositionParam vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionNum | int | 输入 | 视觉ID编号 | | vsPamrm | VisionPositionParam | 输入 | 视觉坐标参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp VisionPositionParam posParam; // 设置协议类型 posParam.protocol = 0; // 设置位置数据 posParam.position.angleDirection = 0; posParam.position.cameraData = ""; posParam.position.recvPointsType = 0; posParam.position.sampleData = "x,y,Rz,h,$"; posParam.position.scale = 1.0; // 设置偏移量 posParam.position.excursion.Xexcursion = 0.0; posParam.position.excursion.Yexcursion = 0.0; posParam.position.excursion.Zexcursion = 0.0; posParam.position.excursion.angle = 0.0; Result result = vision_set_position_parameter(fd, 1, posParam); if (result == 0) { printf("视觉坐标参数设置成功\n"); } ``` --- ### vision_get_position_parameter / vision_get_position_parameter_robot 查询视觉已配置的坐标参数。 **函数签名:** ```cpp Result vision_get_position_parameter(SOCKETFD socketFd, int visionId, VisionPositionParam& vsPamrm); Result vision_get_position_parameter_robot(SOCKETFD socketFd, int robotNum, int visionId, VisionPositionParam& vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionId | int | 输入 | 视觉ID编号 | | vsPamrm | VisionPositionParam& | 输出 | 接收视觉坐标参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp VisionPositionParam posParam; Result result = vision_get_position_parameter(fd, 1, posParam); if (result == 0) { printf("视觉坐标参数:\n"); printf(" 协议类型: %d\n", posParam.protocol); printf(" 样本数据格式: %s\n", posParam.position.sampleData.c_str()); printf(" 偏移: X=%.2f Y=%.2f Z=%.2f Angle=%.2f\n", posParam.position.excursion.Xexcursion, posParam.position.excursion.Yexcursion, posParam.position.excursion.Zexcursion, posParam.position.excursion.angle); } ``` --- ## 11.4 视觉标定 ### vision_calibrate / vision_calibrate_robot 执行视觉标定操作,设置标定相关的点位数据。 **函数签名:** ```cpp Result vision_calibrate(SOCKETFD socketFd, int visionId, VisionCalibrationData vsPamrm); Result vision_calibrate_robot(SOCKETFD socketFd, int robotNum, int visionId, VisionCalibrationData vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionId | int | 输入 | 视觉ID编号 | | vsPamrm | VisionCalibrationData | 输入 | 标定数据,含像素位置和机器人位置 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **注意事项:** 标定前需确保视觉基本参数和坐标参数已正确配置。标定点数默认为 6,范围 [6, 30],点数越多标定精度越高。 **使用示例:** ```cpp // 创建标定数据(默认6个标定点) VisionCalibrationData calibData(6); calibData.visionNum = 1; // 添加标定点(示例:第1个点) CalibrationPoint point1; // 像素位置(x, y, z, rx, ry, rz, 保留) point1.pixel_pos = {100.0, 200.0, 0.0, 0.0, 0.0, 0.0, 0.0}; // 机器人实际位置 point1.robot_pos = {400.0, 150.0, 50.0, 180.0, 0.0, 0.0, 0.0}; calibData.calibration.addCalibrationPoint(point1); // ... 继续添加其余5个标定点 // 执行标定 Result result = vision_calibrate(fd, 1, calibData); if (result == 0) { printf("视觉标定完成\n"); } ``` --- ### vision_get_calibrate_data / vision_get_calibrate_data_robot 查询已保存的视觉标定数据。 **函数签名:** ```cpp Result vision_get_calibrate_data(SOCKETFD socketFd, int visionId, VisionCalibrationData& vsPamrm); Result vision_get_calibrate_data_robot(SOCKETFD socketFd, int robotNum, int visionId, VisionCalibrationData& vsPamrm); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionId | int | 输入 | 视觉ID编号 | | vsPamrm | VisionCalibrationData& | 输出 | 接收标定数据 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp VisionCalibrationData calibData; Result result = vision_get_calibrate_data(fd, 1, calibData); if (result == 0) { printf("视觉标定数据(视觉编号=%d):\n", calibData.visionNum); printf(" 已校准: %s\n", calibData.calibration.calibrated ? "是" : "否"); printf(" 标定点数: %d\n", calibData.calibration.point_num); for (int i = 0; i < calibData.calibration.point_num; i++) { auto pt = calibData.calibration.getPoint(i); printf(" 点%d: 像素(%.1f,%.1f) -> 机器人(%.1f,%.1f,%.1f)\n", i + 1, pt.pixel_pos[0], pt.pixel_pos[1], pt.robot_pos[0], pt.robot_pos[1], pt.robot_pos[2]); } } ``` --- ### vision_hand_eye_calibration_calculation / vision_hand_eye_calibration_calculation_robot 执行手眼标定计算。在标定点数据全部录入后,调用此接口计算手眼关系矩阵。 **函数签名:** ```cpp Result vision_hand_eye_calibration_calculation(SOCKETFD socketFd, int visionNum); Result vision_hand_eye_calibration_calculation_robot(SOCKETFD socketFd, int robotNum, int visionNum); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | visionNum | int | 输入 | 视觉ID编号 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **注意事项:** 手眼标定计算前需确保所有标定点(像素位置和对应的机器人位置)已通过 `vision_calibrate` 录入。计算完成后,视觉系统即可将相机识别到的像素坐标转换为机器人坐标系下的空间位置。 **使用示例:** ```cpp // 标定点全部录入后,执行手眼标定计算 Result result = vision_hand_eye_calibration_calculation(fd, 1); if (result == 0) { printf("手眼标定计算完成,视觉系统已校准\n"); } else { printf("手眼标定计算失败,请检查标定点数据\n"); } ``` --- ## 11.5 完整视觉标定流程示例 ```cpp #include "nrc_craft_vision.h" #include "nrc_interface.h" #include int main() { SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { printf("连接失败\n"); return -1; } // 1. 配置视觉基本参数 VisionParam visionParam; visionParam.cameraList.currentName = "camera_01"; visionParam.cameraList.listNum = 1; visionParam.socket.IP = "192.168.1.120"; visionParam.socket.portOne = 5050; visionParam.socket.portTwo = 5051; visionParam.socket.server = true; visionParam.trigger.triggerMode = 2; // EtherCAT触发 visionParam.userCoordNum = 1; Result ret = vision_set_basic_parameter(fd, 1, visionParam); if (ret != 0) { printf("视觉基本参数配置失败\n"); return -1; } // 2. 设置视觉范围 VisionRange range; range.minX = "0"; range.maxX = "500"; range.minY = "-200"; range.maxY = "200"; range.minZ = "0"; range.maxZ = "300"; vision_set_range(fd, 1, range); // 3. 设置坐标参数 VisionPositionParam posParam; posParam.protocol = 0; posParam.position.sampleData = "x,y,Rz,h,$"; posParam.position.scale = 1.0; vision_set_position_parameter(fd, 1, posParam); // 4. 执行6点标定 VisionCalibrationData calibData(6); calibData.visionNum = 1; // 标定点采集(此处为示意,实际需移动机器人到各标定点) for (int i = 0; i < 6; i++) { printf("请移动机器人到标定点%d...\n", i + 1); // robot_movel(fd, ...); // 移动到目标位置 CalibrationPoint point; // 从相机获取像素坐标 point.pixel_pos = {100.0 * i, 200.0, 0, 0, 0, 0, 0}; // 获取当前机器人位置 point.robot_pos = {400.0, 150.0 + i * 50, 50.0, 180.0, 0, 0, 0}; calibData.calibration.addCalibrationPoint(point); printf("标定点%d已采集\n", i + 1); sleep(1); } // 5. 提交标定数据 ret = vision_calibrate(fd, 1, calibData); if (ret != 0) { printf("标定数据提交失败\n"); return -1; } // 6. 执行手眼标定计算 ret = vision_hand_eye_calibration_calculation(fd, 1); if (ret == 0) { printf("手眼标定完成!\n"); } else { printf("手眼标定计算失败\n"); return -1; } printf("视觉标定流程结束\n"); return 0; } ``` --- # 十二、激光切割工艺(nrc_craft_laser_cutting.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/12.%E6%BF%80%E5%85%89%E5%88%87%E5%89%B2%E5%B7%A5%E8%89%BA.html 激光切割工艺接口提供切割全局参数、切割工艺参数、模拟量匹配参数和 IO 参数等配置与查询功能。支持单机器人和多机器人(`_robot` 后缀)两种调用方式。 ## 数据结构 ### LaserCuttingGlobalParam —— 切割全局参数 ```cpp struct LaserCuttingGlobalParam { LaserCuttingEquipment equipment; // 设备参数 }; ``` **LaserCuttingEquipment 子结构体:** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | RetreatDistance | double | 0.0 | 回退距离(mm) | | arrivalOutLightMode | int | 0 | 到位出光模式 | | collisionDistance | double | 10.0 | 碰撞检测距离(mm) | | delAspiratedMode | int | 1 | 延时吸气模式 | | delAspiratedTime | double | 0.0 | 延时吸气时间(S) | | focusCompensation | bool | false | 焦点补偿使能 | | focusCompensationConstant | double | 0.0 | 焦点补偿常数 | | focusCompensationPower | double | 0.0 | 焦点补偿功率 | | focusCompensationTime | double | 0.0 | 焦点补偿时间(S) | | focusFormula | int | 0 | 焦点计算公式 | | follow | int | 0 | 随动模式 | | preAspiratedTime | double | 0.0 | 预吸气时间(S) | | rePerforate | int | 1 | 重穿孔模式 | | waitFollowTime | double | 1.0 | 等待随动时间(S) | | waitLiftUpTime | double | 1.0 | 等待抬起时间(S) | ### LaserCuttingCraftParam —— 切割工艺参数 ```cpp struct LaserCuttingCraftParam { int num; // 工艺号 LaserCuttingParam cut; // 切割参数 }; ``` **LaserCuttingParam 子结构体:** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | dutyRatio | int | 0 | 占空比(%) | | focusPosition | double | 0.0 | 焦点位置(mm) | | followHeight | double | 0.10 | 随动高度(mm) | | freq | int | 1 | 频率(Hz) | | power | int | 1 | 激光功率(%) | | pressure | double | 0.0 | 气压(bar) | | note | string | "" | 备注信息 | ### LaserCuttingAnalogParam —— 模拟量匹配参数 ```cpp struct LaserCuttingAnalogParam { LaserCuttingAnalogMatch analogMatch; // 模拟量匹配曲线 }; ``` **LaserCuttingAnalogMatch 子结构体:** | 字段 | 类型 | 说明 | |------|------|------| | laserPower | Curve | 激光功率匹配曲线(含level和x/y向量) | | pressure | Curve | 气压匹配曲线(含level和x/y向量) | **Curve 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | level | int | 曲线等级/层数 | | x | vector\ | X轴数据(输入值) | | y | vector\ | Y轴数据(输出值) | ### LaserCuttingIOParam —— IO 参数配置 ```cpp struct LaserCuttingIOParam { IO io; // IO端口配置 Fault laser_fault; // 激光器故障输入端口 Fault pressure_fault; // 气压故障输入端口 Fault regulator_fault; // 调压器故障输入端口 Fault water_cooler_fault; // 水冷机故障输入端口 }; ``` **IO 子结构体:** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | AO_laserPower | int | - | 激光功率模拟量输出端口 | | AO_pressure | int | - | 气压模拟量输出端口 | | DI_backMiddleArrival | int | - | 回中到位数字量输入端口 | | DI_capacitance_ | int | - | 电容传感器数字量输入端口 | | DI_followArrival | int | - | 随动到位数字量输入端口 | | DI_liftUpArrival | int | - | 抬起到位数字量输入端口 | | DI_perforateArrival | int | - | 穿孔到位数字量输入端口 | | DO_aspiration | int | - | 吸气数字量输出端口 | | DO_backMiddle | int | - | 回中数字量输出端口 | | DO_capacitance_ | int | - | 电容传感器数字量输出端口 | | DO_follow | int | - | 随动数字量输出端口 | | DO_highPressgas | int | - | 高压气数字量输出端口 | | DO_liftUp | int | - | 抬起数字量输出端口 | | DO_lightGate | int | - | 光闸数字量输出端口 | | DO_lowPressgas | int | - | 低压气数字量输出端口 | | DO_redLight | int | - | 红光数字量输出端口 | | pwm_port_ | int | - | PWM输出端口 | **Fault 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | input_port | int | 故障信号输入端口号 | --- ## 12.1 全局参数 ### laser_cutting_set_global_parameter / laser_cutting_set_global_parameter_robot 设置激光切割的全局参数,包括回退距离、碰撞检测、随动模式、穿孔模式等设备级配置。 **函数签名:** ```cpp Result laser_cutting_set_global_parameter(SOCKETFD socketFd, LaserCuttingGlobalParam param); Result laser_cutting_set_global_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingGlobalParam param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingGlobalParam | 输入 | 切割全局参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp // 配置激光切割全局参数 LaserCuttingGlobalParam globalParam; globalParam.equipment.RetreatDistance = 5.0; // 回退距离 5mm globalParam.equipment.collisionDistance = 10.0; // 碰撞检测距离 10mm globalParam.equipment.follow = 1; // 随动模式 1 globalParam.equipment.rePerforate = 1; // 重穿孔模式 globalParam.equipment.waitFollowTime = 1.0; // 等待随动 1秒 globalParam.equipment.waitLiftUpTime = 1.0; // 等待抬起 1秒 globalParam.equipment.focusCompensation = true; // 使能焦点补偿 globalParam.equipment.focusCompensationConstant = 0.5; globalParam.equipment.focusCompensationPower = 80.0; globalParam.equipment.focusCompensationTime = 0.3; globalParam.equipment.delAspiratedMode = 1; // 延时吸气模式 globalParam.equipment.delAspiratedTime = 0.5; // 延时吸气 0.5秒 globalParam.equipment.preAspiratedTime = 1.0; // 预吸气 1秒 Result result = laser_cutting_set_global_parameter(fd, globalParam); if (result == 0) { printf("激光切割全局参数设置成功\n"); } ``` --- ### laser_cutting_get_global_parameter / laser_cutting_get_global_parameter_robot 查询激光切割当前的全局参数配置。 **函数签名:** ```cpp Result laser_cutting_get_global_parameter(SOCKETFD socketFd, LaserCuttingGlobalParam& param); Result laser_cutting_get_global_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingGlobalParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingGlobalParam& | 输出 | 接收全局参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp LaserCuttingGlobalParam globalParam; Result result = laser_cutting_get_global_parameter(fd, globalParam); if (result == 0) { printf("激光切割全局参数:\n"); printf(" 回退距离: %.2f mm\n", globalParam.equipment.RetreatDistance); printf(" 碰撞检测距离: %.2f mm\n", globalParam.equipment.collisionDistance); printf(" 随动模式: %d\n", globalParam.equipment.follow); printf(" 焦点补偿: %s\n", globalParam.equipment.focusCompensation ? "使能" : "未使能"); printf(" 预吸气时间: %.2f S\n", globalParam.equipment.preAspiratedTime); } ``` --- ## 12.2 工艺参数 ### laser_cutting_set_craft_parameter / laser_cutting_set_craft_parameter_robot 设置激光切割的工艺参数,包括指定工艺号的功率、频率、占空比、焦点位置、随动高度和气压等。 **函数签名:** ```cpp Result laser_cutting_set_craft_parameter(SOCKETFD socketFd, LaserCuttingCraftParam param); Result laser_cutting_set_craft_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingCraftParam param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingCraftParam | 输入 | 切割工艺参数,含工艺号和切割参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp // 配置工艺号1的切割参数 LaserCuttingCraftParam craftParam; craftParam.num = 1; // 工艺号1 craftParam.cut.power = 80; // 激光功率 80% craftParam.cut.freq = 5000; // 频率 5000Hz craftParam.cut.dutyRatio = 100; // 占空比 100% craftParam.cut.focusPosition = -0.5; // 焦点位置 -0.5mm(板面下方) craftParam.cut.followHeight = 1.0; // 随动高度 1.0mm craftParam.cut.pressure = 8.0; // 气压 8.0bar craftParam.cut.note = "3mm碳钢板切割"; // 备注 Result result = laser_cutting_set_craft_parameter(fd, craftParam); if (result == 0) { printf("工艺号%d切割参数设置成功\n", craftParam.num); } ``` --- ### laser_cutting_get_craft_parameter / laser_cutting_get_craft_parameter_robot 查询激光切割的工艺参数。 **函数签名:** ```cpp Result laser_cutting_get_craft_parameter(SOCKETFD socketFd, LaserCuttingCraftParam& param); Result laser_cutting_get_craft_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingCraftParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingCraftParam& | 输出 | 接收工艺参数(需先设置 param.num 指定要查询的工艺号) | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp // 查询工艺号1的切割参数 LaserCuttingCraftParam craftParam; craftParam.num = 1; // 需先指定要查询的工艺号 Result result = laser_cutting_get_craft_parameter(fd, craftParam); if (result == 0) { printf("工艺号%d切割参数:\n", craftParam.num); printf(" 功率: %d%%\n", craftParam.cut.power); printf(" 频率: %d Hz\n", craftParam.cut.freq); printf(" 占空比: %d%%\n", craftParam.cut.dutyRatio); printf(" 焦点位置: %.2f mm\n", craftParam.cut.focusPosition); printf(" 随动高度: %.2f mm\n", craftParam.cut.followHeight); printf(" 气压: %.2f bar\n", craftParam.cut.pressure); if (!craftParam.cut.note.empty()) { printf(" 备注: %s\n", craftParam.cut.note.c_str()); } } ``` --- ## 12.3 模拟量匹配参数 ### laser_cutting_set_analog_parameter / laser_cutting_set_analog_parameter_robot 设置激光切割的模拟量匹配曲线参数,用于将激光功率百分比和气压值映射到实际的模拟量输出电压。 **函数签名:** ```cpp Result laser_cutting_set_analog_parameter(SOCKETFD socketFd, LaserCuttingAnalogParam param); Result laser_cutting_set_analog_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingAnalogParam param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingAnalogParam | 输入 | 模拟量匹配参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **注意事项:** 模拟量匹配曲线用于校准不同激光器和比例阀的电压-输出特性。通常由设备供应商提供匹配曲线数据,需根据实际硬件特性进行配置。 **使用示例:** ```cpp LaserCuttingAnalogParam analogParam; // 配置激光功率匹配曲线(示例:线性映射 0-100% -> 0-10V) analogParam.analogMatch.laserPower.level = 2; // 2点线性 analogParam.analogMatch.laserPower.x = {0.0, 100.0}; // 输入:功率百分比 analogParam.analogMatch.laserPower.y = {0.0, 10.0}; // 输出:电压值(V) // 配置气压匹配曲线(示例:线性映射 0-16bar -> 0-10V) analogParam.analogMatch.pressure.level = 2; analogParam.analogMatch.pressure.x = {0.0, 16.0}; // 输入:气压值(bar) analogParam.analogMatch.pressure.y = {0.0, 10.0}; // 输出:电压值(V) Result result = laser_cutting_set_analog_parameter(fd, analogParam); if (result == 0) { printf("模拟量匹配参数设置成功\n"); } ``` --- ### laser_cutting_get_analog_parameter / laser_cutting_get_analog_parameter_robot 查询激光切割当前的模拟量匹配曲线参数。 **函数签名:** ```cpp Result laser_cutting_get_analog_parameter(SOCKETFD socketFd, LaserCuttingAnalogParam& param); Result laser_cutting_get_analog_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingAnalogParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingAnalogParam& | 输出 | 接收模拟量匹配参数 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp LaserCuttingAnalogParam analogParam; Result result = laser_cutting_get_analog_parameter(fd, analogParam); if (result == 0) { printf("激光功率匹配曲线点数: %d\n", analogParam.analogMatch.laserPower.level); printf("气压匹配曲线点数: %d\n", analogParam.analogMatch.pressure.level); } ``` --- ## 12.4 IO 参数 ### laser_cutting_set_io_parameter / laser_cutting_set_io_parameter_robot 设置激光切割的 IO 端口配置,包括模拟量输出、数字量输入输出以及各类故障检测端口。 **函数签名:** ```cpp Result laser_cutting_set_io_parameter(SOCKETFD socketFd, LaserCuttingIOParam param); Result laser_cutting_set_io_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingIOParam param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingIOParam | 输入 | IO参数配置(含IO端口和故障检测端口) | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **注意事项:** IO 端口配置需与实际的硬件接线一致。错误的端口配置会导致激光器无法正常控制或故障检测失效。 **使用示例:** ```cpp LaserCuttingIOParam ioParam; // 配置IO端口 ioParam.io.AO_laserPower = 1; // 激光功率模拟量输出端口1 ioParam.io.AO_pressure = 2; // 气压模拟量输出端口2 ioParam.io.DO_lightGate = 3; // 光闸输出端口3 ioParam.io.DO_redLight = 4; // 红光输出端口4 ioParam.io.DO_highPressgas = 5; // 高压气输出端口5 ioParam.io.DO_lowPressgas = 6; // 低压气输出端口6 ioParam.io.DO_aspiration = 7; // 吸气输出端口7 ioParam.io.DO_follow = 8; // 随动输出端口8 ioParam.io.DO_liftUp = 9; // 抬起输出端口9 ioParam.io.DO_backMiddle = 10; // 回中输出端口10 ioParam.io.DI_perforateArrival = 11; // 穿孔到位输入端口11 ioParam.io.DI_followArrival = 12; // 随动到位输入端口12 ioParam.io.DI_liftUpArrival = 13; // 抬起到位输入端口13 ioParam.io.DI_backMiddleArrival = 14;// 回中到位输入端口14 ioParam.io.pwm_port_ = 15; // PWM输出端口15 // 配置故障检测端口 ioParam.laser_fault.input_port = 20; // 激光器故障输入端口20 ioParam.pressure_fault.input_port = 21; // 气压故障输入端口21 ioParam.regulator_fault.input_port = 22; // 调压器故障输入端口22 ioParam.water_cooler_fault.input_port = 23;// 水冷机故障输入端口23 Result result = laser_cutting_set_io_parameter(fd, ioParam); if (result == 0) { printf("激光切割IO参数设置成功\n"); } ``` --- ### laser_cutting_get_io_parameter / laser_cutting_get_io_parameter_robot 查询激光切割当前的 IO 端口配置。 **函数签名:** ```cpp Result laser_cutting_get_io_parameter(SOCKETFD socketFd, LaserCuttingIOParam& param); Result laser_cutting_get_io_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingIOParam& param); ``` **参数说明:** | 参数 | 类型 | 输入/输出 | 说明 | |------|------|----------|------| | socketFd | SOCKETFD | 输入 | 连接句柄 | | robotNum | int | 输入 | 机器人编号(仅 `_robot` 版本) | | param | LaserCuttingIOParam& | 输出 | 接收IO参数配置 | **返回值:** `Result` 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp LaserCuttingIOParam ioParam; Result result = laser_cutting_get_io_parameter(fd, ioParam); if (result == 0) { printf("激光切割IO配置:\n"); printf(" 激光功率AO: 端口%d\n", ioParam.io.AO_laserPower); printf(" 气压AO: 端口%d\n", ioParam.io.AO_pressure); printf(" 光闸DO: 端口%d\n", ioParam.io.DO_lightGate); printf(" 高压气DO: 端口%d\n", ioParam.io.DO_highPressgas); printf(" 激光器故障DI: 端口%d\n", ioParam.laser_fault.input_port); printf(" 水冷机故障DI: 端口%d\n", ioParam.water_cooler_fault.input_port); } ``` --- ## 12.5 完整激光切割配置流程示例 ```cpp #include "nrc_craft_laser_cutting.h" #include "nrc_interface.h" #include int main() { SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { printf("连接失败\n"); return -1; } // 1. 配置全局参数 LaserCuttingGlobalParam globalParam; globalParam.equipment.RetreatDistance = 5.0; globalParam.equipment.collisionDistance = 10.0; globalParam.equipment.follow = 1; globalParam.equipment.waitFollowTime = 1.0; globalParam.equipment.focusCompensation = true; globalParam.equipment.focusCompensationConstant = 0.5; globalParam.equipment.focusCompensationPower = 80.0; globalParam.equipment.preAspiratedTime = 1.0; globalParam.equipment.delAspiratedTime = 0.5; Result ret = laser_cutting_set_global_parameter(fd, globalParam); if (ret != 0) { printf("全局参数设置失败\n"); return -1; } printf("全局参数配置完成\n"); // 2. 配置工艺号1的切割参数(3mm碳钢板) LaserCuttingCraftParam craftParam; craftParam.num = 1; craftParam.cut.power = 80; craftParam.cut.freq = 5000; craftParam.cut.dutyRatio = 100; craftParam.cut.focusPosition = -0.5; craftParam.cut.followHeight = 1.0; craftParam.cut.pressure = 8.0; craftParam.cut.note = "3mm碳钢板"; ret = laser_cutting_set_craft_parameter(fd, craftParam); if (ret != 0) { printf("工艺参数设置失败\n"); return -1; } printf("工艺参数配置完成\n"); // 3. 配置模拟量匹配参数 LaserCuttingAnalogParam analogParam; analogParam.analogMatch.laserPower.level = 2; analogParam.analogMatch.laserPower.x = {0.0, 100.0}; analogParam.analogMatch.laserPower.y = {0.0, 10.0}; analogParam.analogMatch.pressure.level = 2; analogParam.analogMatch.pressure.x = {0.0, 16.0}; analogParam.analogMatch.pressure.y = {0.0, 10.0}; laser_cutting_set_analog_parameter(fd, analogParam); printf("模拟量匹配参数配置完成\n"); // 4. 配置IO参数 LaserCuttingIOParam ioParam; ioParam.io.AO_laserPower = 1; ioParam.io.AO_pressure = 2; ioParam.io.DO_lightGate = 3; ioParam.io.DO_redLight = 4; ioParam.io.DO_highPressgas = 5; ioParam.io.DO_aspiration = 7; ioParam.io.DI_perforateArrival = 11; ioParam.io.DI_followArrival = 12; ioParam.laser_fault.input_port = 20; ioParam.water_cooler_fault.input_port = 23; ret = laser_cutting_set_io_parameter(fd, ioParam); if (ret != 0) { printf("IO参数设置失败\n"); return -1; } printf("IO参数配置完成\n"); // 5. 验证配置:读取所有参数 printf("\n========== 配置验证 ==========\n"); LaserCuttingGlobalParam readGlobal; laser_cutting_get_global_parameter(fd, readGlobal); printf("全局参数 - 回退距离: %.1fmm, 随动模式: %d\n", readGlobal.equipment.RetreatDistance, readGlobal.equipment.follow); LaserCuttingCraftParam readCraft; readCraft.num = 1; laser_cutting_get_craft_parameter(fd, readCraft); printf("工艺参数 - 功率: %d%%, 频率: %dHz, 气压: %.1fbar\n", readCraft.cut.power, readCraft.cut.freq, readCraft.cut.pressure); printf("激光切割系统配置完成,准备开始切割作业\n"); return 0; } ``` --- # 十三、传送带跟踪工艺(nrc_craft_conveyor_belt_track.h) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/02.%E6%8E%A5%E5%8F%A3/13.%E4%BC%A0%E9%80%81%E5%B8%A6%E8%B7%9F%E8%B8%AA%E5%B7%A5%E8%89%BA.html ## 功能概述 传送带跟踪(Conveyor Belt Tracking)工艺用于机器人在运动中的传送带上动态抓取/放置工件。系统利用编码器实时获取传送带位置,结合用户输入的物料点位置,实时计算工件位置并通过运动追踪物料。 **核心参数分组:** | 参数组 | 说明 | 对应结构体 | |--------|------|-----------| | 基本参数 | 编码器设置、传送带速度、用户坐标、跟踪高度 | `ConveyorBasicParams` | | 识别参数 | 检测源(传感器/视觉)、触发方式 | `ConveyorIdentificationParams` | | 传感器参数 | 传感器标定位置 | `ConveyorSensorParams` | | 跟踪范围 | 跟踪窗口范围(X/Y/Z 最大最小) | `ConveyorTrackRangeParams` | | 等待点 | 无工件等待位置 | `ConveyorWaitPointParams` | > 使用前需在示教器【工艺】-【传送带跟踪工艺】中设置工艺号,每个工艺号(1-9)保存一组参数。 --- ### conveyor_belt_tracking_set_basic_parameter / conveyor_belt_tracking_set_basic_parameter_robot 设置传送带跟踪的基本参数(编码器、速度、坐标等)。 **函数原型:** ```cpp Result conveyor_belt_tracking_set_basic_parameter(SOCKETFD socketFd, int encoderVal, int time, int encoderDirection, double encoderResolution, double maxEncoderVal, double minEncoderVal, int posRecordMode, double speed, int userCoord, int conveyorID, int height, int trackOnRunModeWithTargetOverrun, int compensationEncoderVal); Result conveyor_belt_tracking_set_basic_parameter_robot(SOCKETFD socketFd, int robotNum, int encoderVal, int time, int encoderDirection, double encoderResolution, double maxEncoderVal, double minEncoderVal, int posRecordMode, double speed, int userCoord, int conveyorID, int height, int trackOnRunModeWithTargetOverrun, int compensationEncoderVal); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | encoderVal | int | 编码器当前值,单位线 | | time | int | 跟踪补偿时间,单位毫秒 | | encoderDirection | int | 编码器方向,用于确定正反转 | | encoderResolution | double | 编码器分辨率,每转或每单位的脉冲数 | | maxEncoderVal / minEncoderVal | double | 编码器最大/最小值,限制或标定读数范围,单位线 | | posRecordMode | int | 位置记录模式:编码器/恒速设置 | | speed | double | 传送带速度,单位 mm/s(环形传送带为 °/s) | | userCoord | int | 用户坐标系编号,指定操作在哪个坐标下进行 | | conveyorID | int | 传送带 ID | | height | int | 跟踪目标高度:传感器感知/跟踪指令示教 | | trackOnRunModeWithTargetOverrun | int | 目标超限运行方式:等待下一个目标/跳行到追踪结束运行 | | compensationEncoderVal | int | 跟踪补偿编码器值,单位线 | **返回值:** `SUCCESS(0)` 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 **使用示例:** ```cpp // 设置传送带1的基本参数 Result result = conveyor_belt_tracking_set_basic_parameter( fd, // 连接句柄 1000, // 编码器当前值 50, // 补偿时间 50ms 1, // 编码器正向 10.0, // 分辨率 10 线/mm 100000, 0, // 编码器范围 0, // 位置记录模式:编码器 500.0, // 速度 500mm/s 1, // 用户坐标系 1 1, // 传送带 ID 1 100, // 跟踪高度 100mm 0, // 目标超限:等待下一个目标 0 // 补偿编码器值 ); ``` --- ### conveyor_belt_tracking_set_identification_parameter / conveyor_belt_tracking_set_identification_parameter_robot 设置传送带参数识别的配置(检测源与识别方式)。 **函数原型:** ```cpp Result conveyor_belt_tracking_set_identification_parameter(SOCKETFD socketFd, int conveyorID, int detectSrcType, int capturePos, int visionID, int visionIoFilterType, int visionLatchEncoderValueType, int communication, int sensorTrg, int type); Result conveyor_belt_tracking_set_identification_parameter_robot(SOCKETFD socketFd, int robotNum, int conveyorID, int detectSrcType, int capturePos, int visionID, int visionIoFilterType, int visionLatchEncoderValueType, int communication, int sensorTrg, int type); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | detectSrcType | int | 检测源类型 | | capturePos | int | 信号源参数(捕获位置 IO) | | visionID | int | 视觉系统 ID | | visionIoFilterType | int | 视觉输入输出过滤类型 | | visionLatchEncoderValueType | int | 视觉锁存编码器值类型 | | communication | int | 通讯方式 | | sensorTrg | int | 传感器触发方式(0=下降沿,1=上升沿) | | type | int | 识别类型 | **返回值:** `SUCCESS(0)` 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 --- ### conveyor_belt_tracking_set_sensor_calibration / conveyor_belt_tracking_set_sensor_calibration_robot 设置传送带上的传感器标定参数。 **函数原型:** ```cpp Result conveyor_belt_tracking_set_sensor_calibration(SOCKETFD socketFd, int conveyorID, const std::vector sensorPos); Result conveyor_belt_tracking_set_sensor_calibration_robot(SOCKETFD socketFd, int robotNum, int conveyorID, const std::vector sensorPos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | sensorPos | const std::vector\ | 传感器位置,长度 6 | **返回值:** `SUCCESS(0)` 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 --- ### conveyor_belt_tracking_set_tracking_range / conveyor_belt_tracking_set_tracking_range_robot 设置传送带跟踪范围参数(跟踪窗口)。 **函数原型:** ```cpp Result conveyor_belt_tracking_set_tracking_range(SOCKETFD socketFd, int conveyorID, double receLatestPos, double trackRangeXMax, double trackRangeYMax, double trackRangeYMin, double trackRangeZMax, double trackRangeZMin, double trackStartXPoint); Result conveyor_belt_tracking_set_tracking_range_robot(SOCKETFD socketFd, int robotNum, int conveyorID, double receLatestPos, double trackRangeXMax, double trackRangeYMax, double trackRangeYMin, double trackRangeZMax, double trackRangeZMin, double trackStartXPoint); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | receLatestPos | double | 最新接收位置(最迟接收 X 值) | | trackRangeXMax | double | X 轴最大跟踪范围 | | trackRangeYMax / trackRangeYMin | double | Y 轴最大/最小跟踪范围 | | trackRangeZMax / trackRangeZMin | double | Z 轴最大/最小跟踪范围 | | trackStartXPoint | double | 跟踪起始 X 点 | **返回值:** `SUCCESS(0)` 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 > 工件进入跟踪范围后机器人开始同步;超出跟踪最大范围或未在最迟接收位置前收到数据,则放弃该工件。 --- ### conveyor_belt_tracking_set_tracking_wait_point / conveyor_belt_tracking_set_tracking_wait_point_robot 标定传送带跟踪等待点的位置参数(无工件时等待位置)。 **函数原型:** ```cpp Result conveyor_belt_tracking_set_tracking_wait_point(SOCKETFD socketFd, int conveyorID, bool isWait, double delayDetectTime, const std::vector pos); Result conveyor_belt_tracking_set_tracking_wait_point_robot(SOCKETFD socketFd, int robotNum, int conveyorID, bool isWait, double delayDetectTime, const std::vector pos); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | isWait | bool | 无工件是否到指定点等待 | | delayDetectTime | double | 等待延时时间 | | pos | const std::vector\ | 机器人位置坐标,含 X/Y/Z 轴坐标及三个旋转轴角度(弧度制),长度 7 | **返回值:** `SUCCESS(0)` 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。 --- ### conveyor_belt_set_sensor_calibration / conveyor_belt_set_sensor_calibration_robot 标定获得传感器位置。 **函数原型:** ```cpp Result conveyor_belt_set_sensor_calibration(SOCKETFD socketFd, int conveyorID); Result conveyor_belt_set_sensor_calibration_robot(SOCKETFD socketFd, int robotNum, int conveyorID); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### conveyor_belt_calibrate_for_sensor_point / conveyor_belt_calibrate_for_sensor_point_robot 标定获得传感器位置(传感器标定流程第二步)。 **函数原型:** ```cpp Result conveyor_belt_calibrate_for_sensor_point(SOCKETFD socketFd, int conveyorID); Result conveyor_belt_calibrate_for_sensor_point_robot(SOCKETFD socketFd, int robotNum, int conveyorID); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### conveyor_belt_calculate_for_sensor_point / conveyor_belt_calculate_for_sensor_point_robot 计算传感器位置(传感器标定流程第三步,标定完成后计算)。 **函数原型:** ```cpp Result conveyor_belt_calculate_for_sensor_point(SOCKETFD socketFd, int conveyorID); Result conveyor_belt_calculate_for_sensor_point_robot(SOCKETFD socketFd, int robotNum, int conveyorID); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### conveyor_belt_get_basic_paramters / conveyor_belt_get_basic_paramters_robot 获取基本参数。 **函数原型:** ```cpp Result conveyor_belt_get_basic_paramters(SOCKETFD socketFd, int conveyorID, ConveyorBasicParams& param); Result conveyor_belt_get_basic_paramters_robot(SOCKETFD socketFd, int robotNum, int conveyorID, ConveyorBasicParams& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | param | ConveyorBasicParams& | 输出参数,基本参数结构体 | **ConveyorBasicParams 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | conveyorID | int | 传送带 ID | | compensation_encoderVal | double | 补偿编码器值 | | compensation_time | double | 补偿时间 | | conveyor_encoderDirection | int | 编码器方向 | | conveyor_encoderResolution | double | 编码器分辨率 | | conveyor_encoderValue | double | 编码器当前值 | | conveyor_maxEncoderVal / conveyor_minEncoderVal | double | 编码器最大/最小值 | | conveyor_posRecordMode | int | 位置记录模式 | | conveyor_speed | double | 传送带速度 | | conveyor_userCoord | int | 用户坐标系 | | track_height | int | 轨道高度 | | track_on_run_mode_with_target_overrun | int | 轨道运行模式与目标超限 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### conveyor_belt_get_identification_paramters / conveyor_belt_get_identification_paramters_robot 获取识别参数。 **函数原型:** ```cpp Result conveyor_belt_get_identification_paramters(SOCKETFD socketFd, int conveyorID, ConveyorIdentificationParams& param); Result conveyor_belt_get_identification_paramters_robot(SOCKETFD socketFd, int robotNum, int conveyorID, ConveyorIdentificationParams& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | param | ConveyorIdentificationParams& | 输出参数,识别参数结构体 | **ConveyorIdentificationParams 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | conveyorID | int | 传送带 ID | | detectSrc_DI_capturePos | int | 捕获位置(触发信号 IO) | | detectSrc_globalVar | std::string | 全局变量 | | detectSrc_type | int | 检测源类型(0=传感器,1=视觉,2=传感器+视觉等) | | detectSrc_visionID | int | 视觉 ID | | detectSrc_vision_io_filter_type | int | 视觉 IO 过滤类型 | | detectSrc_vision_latch_encoder_value_type | int | 视觉锁存编码器值类型 | | identification_communication | std::string | 识别通讯 | | identification_sensorTrg | int | 识别传感器触发 | | identification_type | int | 识别类型 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### conveyor_belt_get_sensor_paramters / conveyor_belt_get_sensor_paramters_robot 获取传感器参数。 **函数原型:** ```cpp Result conveyor_belt_get_sensor_paramters(SOCKETFD socketFd, int conveyorID, ConveyorSensorParams& param); Result conveyor_belt_get_sensor_paramters_robot(SOCKETFD socketFd, int robotNum, int conveyorID, ConveyorSensorParams& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | param | ConveyorSensorParams& | 输出参数,传感器参数结构体 | **ConveyorSensorParams 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | conveyorID | int | 传送带 ID | | sensorPosDeg_X / Y / Z | double | 传感器位置 X/Y/Z(角度) | | sensorPosDeg_A / B / C | double | 传感器姿态 A/B/C(角度) | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### conveyor_belt_get_track_range_paramters / conveyor_belt_get_track_range_paramters_robot 获取跟踪范围参数。 **函数原型:** ```cpp Result conveyor_belt_get_track_range_paramters(SOCKETFD socketFd, int conveyorID, ConveyorTrackRangeParams& param); Result conveyor_belt_get_track_range_paramters_robot(SOCKETFD socketFd, int robotNum, int conveyorID, ConveyorTrackRangeParams& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | param | ConveyorTrackRangeParams& | 输出参数,跟踪范围结构体 | **ConveyorTrackRangeParams 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | conveyorID | int | 传送带 ID | | position_receLatestPos | double | 最迟到接收位置 | | position_trackRangeXMax | double | 轨道范围 X 最大 | | position_trackRangeYMax / YMin | double | 轨道范围 Y 最大/最小 | | position_trackRangeZMax / ZMin | double | 轨道范围 Z 最大/最小 | | position_trackStartXPoint | double | 轨道起始 X 点 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- ### conveyor_belt_get_wait_point_paramters / conveyor_belt_get_wait_point_paramters_robot 获取等待点参数。 **函数原型:** ```cpp Result conveyor_belt_get_wait_point_paramters(SOCKETFD socketFd, int conveyorID, ConveyorWaitPointParams& param); Result conveyor_belt_get_wait_point_paramters_robot(SOCKETFD socketFd, int robotNum, int conveyorID, ConveyorWaitPointParams& param); ``` **参数说明:** | 参数 | 类型 | 说明 | |------|------|------| | socketFd | SOCKETFD | 连接句柄 | | robotNum | int | 机器人编号 (1-4),仅 `_robot` 版本 | | conveyorID | int | 传送带 ID | | param | ConveyorWaitPointParams& | 输出参数,等待点参数结构体 | **ConveyorWaitPointParams 结构体:** | 字段 | 类型 | 说明 | |------|------|------| | conveyorID | int | 传送带 ID | | delayDetectTime | double | 延迟检测时间 | | isWait | bool | 是否等待 | | pos | std::vector\ | 位置数组 | **返回值:** `SUCCESS(0)` 表示成功,负数表示失败。 --- --- # 快速开始 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/01.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html 最小可运行示例:连接控制器、获取版本、读取位置、断开。 ## 代码 ```cpp #include #include "cpp_interface/nrc_api.h" int main() { // 1. 连接控制器 SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { std::cout << "连接失败" << std::endl; return 1; } // 2. 等待连接就绪 while (get_connection_status(fd) != 0) { Sleep(200); // Linux: usleep(200000) } // 3. 获取版本 std::cout << "SDK 版本: " << get_library_version() << std::endl; // 4. 读取当前位置(关节坐标) std::vector pos(7); get_current_position(fd, 0, pos); std::cout << "关节位置: "; for (auto v : pos) std::cout << v << " "; std::cout << std::endl; // 5. 断开 disconnect_robot(fd); return 0; } ``` ## 预期输出 ```text SDK 版本: Inexbot API v2.0.4-24.03 关节位置: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ``` ## 下一步 - [MinGW + Qt Creator 环境搭建](../01.文档/01.环境搭建/01.MinGW%20环境.md) - [MSVC + Visual Studio 环境搭建](../01.文档/01.环境搭建/02.MSVC%20环境.md) - [Linux + GCC 环境搭建](../01.文档/01.环境搭建/03.Linux%20环境.md) 如需更复杂的运动控制,参见 [基础应用](./02.基础应用/index.md) 和 [进阶应用](./03.进阶应用/index.md)。 --- # 1. 获取不同坐标系的位置 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/01.%E8%8E%B7%E5%8F%96%E4%B8%8D%E5%90%8C%E5%9D%90%E6%A0%87%E7%B3%BB%E7%9A%84%E4%BD%8D%E7%BD%AE.html 本期将介绍如何连接控制器,并获取机器人在不同坐标系下的实时位置。 机器人在运行和调试过程中,同一个位置可以使用不同的坐标系进行描述。程序首先使用 `connect_robot` 连接控制器,再通过返回的连接句柄 `fd` 调用 `get_current_position`,依次查询机器人在关节坐标、直角坐标、工具坐标和用户坐标下的当前位置。 `get_current_position` 接口中的 `coord` 参数用于指定需要查询的坐标系: - `coord = 0`:关节坐标 - `coord = 1`:直角坐标 - `coord = 2`:工具坐标 - `coord = 3`:用户坐标 接口查询成功后,会将当前位置写入长度为 7 的 `pos` 容器。不同坐标系下各分量的含义不同,使用时应结合机器人型号、当前工具坐标系和用户坐标系配置进行确认。 ::: warning ⚠️ 使用注意 本 Demo 只读取并输出机器人当前位置,不会发送运动指令。运行前仍需确认: - **连接配置:** 控制器 IP 地址和 SDK 服务端口与实际配置一致 - **坐标类型:** `coord` 的取值位于 0~3 范围内 - **坐标配置:** 查询工具坐标或用户坐标前,确认控制器中对应坐标系已经正确设置 - **返回结果:** 实际项目中应检查 `get_current_position` 的返回值,接口调用成功后再使用 `pos` 中的数据 不同坐标系下的位置数据不能直接混用。将查询结果用于运动、偏移或坐标转换前,应先确认坐标系类型及各分量的单位和含义。 ::: ```cpp /* * Demo # : 01 * 功能:获取机器人在关节、直角、工具和用户坐标系下的当前位置 * 依赖:nrc_api.h * * 说明: * 1. coord = 0:关节坐标;coord = 1:直角坐标 * 2. coord = 2:工具坐标;coord = 3:用户坐标 * 3. 本 Demo 只查询并输出位置,不会向机器人发送运动指令 */ #include #include "cpp_interface/nrc_api.h" // 提供控制器连接和机器人位置查询接口 /** * @brief Demo 程序入口:连接控制器,并依次输出四种坐标系下的机器人当前位置。 * @return 控制器连接失败或查询结束时返回 0。 */ int main() { // 使用现场控制器的 IP 地址和 SDK 服务端口建立连接,并保存返回的连接句柄。 SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { std::cout << "连接失败" << std::endl; return 0; } std::cout << "连接成功: "<< fd << std::endl; std::vector pos(7); // 保存 SDK 返回的七维位置数据,具体含义随坐标系类型变化。 for (int coord = 0; coord < 4; coord++) { // 按 coord 指定的坐标系查询当前位置,查询结果由 SDK 写入 pos。 get_current_position(fd, coord, pos); // 按接口返回顺序输出当前位置的七个分量。 for (auto v : pos) { std::cout << v << " "; } std::cout << std::endl; } return 0; } ``` --- # 2. 上电流程 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/02.%E4%B8%8A%E7%94%B5%E6%B5%81%E7%A8%8B.html 本期将介绍如何连接控制器,并根据当前状态安全地完成伺服上电和就绪确认。 通过 SDK 控制机器人之前,需要先连接控制器,再根据当前伺服状态执行清错、切换就绪状态和伺服上电等操作。 伺服状态的含义如下: - 状态 0:伺服停止,需要先切换到就绪状态 - 状态 1:伺服就绪,可以直接执行上电 - 状态 2:伺服报警,需要先清除报警,再重新上电 - 状态 3:伺服已经上电并进入运行状态 ::: danger ⚠️ 安全警告 伺服上电后,机器人将进入允许运动的状态。执行前必须确认: - **人员安全:** 机器人工作空间内无人员或障碍物 - **急停可用:** 急停按钮处于可用状态,并在操作人员可触及范围内 - **控制器状态:** 控制器无未处理的安全报警,安全回路工作正常 - **程序检查:** 确认后续程序不会立即下发未经验证的运动指令 - **现场配置:** 控制器 IP 地址和 SDK 服务端口与实际配置一致 建议先在仿真环境中验证上电流程,确认状态切换符合预期后再连接真机。 ::: ## 1、配置控制器连接和等待参数 首先配置控制器 IP 地址、SDK 服务端口、上电等待超时时间、状态轮询间隔和最大连续查询失败次数。 这些参数集中定义在程序开头,便于根据不同现场环境统一修改,避免相同参数分散在多个函数中,造成遗漏或配置不一致。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 用户实际控制器的 IP 地址 const std::string robot_port = "6001"; ///< 用户实际控制器的 SDK 服务端口,必须与控制器配置一致 /** @} */ /** * @name 客户需根据本 Demo 修改 * 以下配置关系到上电等待是否符合当前机器人的实际耗时。 * @{ */ constexpr int ready_timeout_seconds = 90; ///< 等待伺服完成上电的总超时时间 /** @} */ /** * @name 建议客户修改 * 以下配置用于平衡状态反馈速度与控制器通信负载。 * @{ */ constexpr int poll_interval_ms = 500; ///< 伺服状态轮询间隔,单位为毫秒 /** @} */ /** * @name 可修改也可保留默认值 * 默认值适用于一般场景,仅在需要调整通信容错能力时修改。 * @{ */ constexpr int max_query_failures = 3; ///< 状态查询允许的最大连续失败次数 /** @} */ ``` ## 2、封装 SDK 返回值检查函数 由于在上电过程中需要调用多个 SDK 接口,为了帮助判断接口是否调用成功。我们在这里封装 SDK 返回值检查函数,多数 SDK 控制接口都会返回 `Result`,只有返回 `SUCCESS` 时,才能确认本次调用成功。 ```cpp /** * @brief 统一检查普通 SDK 接口的返回结果。 * @param[in] result SDK 接口返回的执行结果。 * @param[in] operation SDK 接口名称,用于输出错误信息。 * @retval true SDK 接口调用成功。 * @retval false SDK 接口调用失败。 */ bool check_sdk_result(Result result, const char* operation) { if (result == SUCCESS) { return true; // SDK 调用成功。 } std::cerr << operation << "调用失败,错误码:" << static_cast(result) << std::endl; return false; // SDK 调用失败。 } ``` ## 3、封装等待伺服就绪函数 `set_servo_poweron` 调用成功只表示上电命令已经成功发送,不代表伺服已经立即进入运行状态。控制器完成内部状态切换需要一定时间,因此程序还需要持续查询伺服状态,直到状态变为 3。 ```cpp /** * @brief 等待伺服完成上电并进入运行状态。 * @param[in] fd 控制器连接句柄。 * @param[in] timeout 本次等待允许占用的最长时间。 * @retval true 已确认伺服进入运行状态。 * @retval false 查询连续失败、伺服报警或等待超时。 */ bool wait_until_robot_ready( SOCKETFD fd, std::chrono::seconds timeout = std::chrono::seconds(ready_timeout_seconds)) { using clock = std::chrono::steady_clock; // 使用单调时钟,避免系统时间变化影响超时判断。 const auto deadline = clock::now() + timeout; // 计算整个等待过程的绝对截止时间。 int state = 0; int consecutiveFailures = 0; // 记录连续查询失败次数,用于处理短暂通信波动。 while (clock::now() < deadline) { const Result result = get_servo_state(fd, state); // 每轮只查询一次伺服状态。 if (result != SUCCESS) { ++consecutiveFailures; std::cerr << "获取伺服状态失败,第" << consecutiveFailures << "/" << max_query_failures << "次,错误码:" << static_cast(result) << std::endl; if (consecutiveFailures >= max_query_failures) { std::cerr << "连续获取伺服状态失败,停止等待" << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(poll_interval_ms)); continue; // 本轮没有获得有效状态,直接开始下一轮查询。 } consecutiveFailures = 0; // 查询恢复成功后,将连续失败次数清零。 if (state == 3) { std::cout << "伺服上电成功,机器人已经进入运行状态" << std::endl; return true; } if (state == 2) { std::cerr << "伺服进入报警状态,上电失败" << std::endl; return false; } // 状态为 0 或 1 时,等待一个轮询周期后再次查询。 std::this_thread::sleep_for( std::chrono::milliseconds(poll_interval_ms)); } std::cerr << "等待伺服上电超时,最后状态:" << state << std::endl; return false; } ``` 其中使用 `std::chrono::steady_clock` 计算超时时间,是为了避免系统时间被人工修改或自动校时后影响等待结果。只有连续查询失败达到上限时才结束流程,能够容忍短暂的通信波动;任意一次查询成功后,连续失败计数都会清零。 ## 4、封装伺服上电函数 机器人可能处于停止、就绪、报警或已经运行等不同状态。上电前必须先读取实际状态,并根据状态选择正确的处理路径。 ```cpp /** * @brief 根据当前伺服状态执行上电流程。 * @param[in] fd 控制器连接句柄。 * @retval true 机器人已处于运行状态,或已完成上电并确认就绪。 * @retval false 状态查询、清错、状态切换、上电或就绪确认失败。 */ bool power_on(int fd) { int state = 0; if (!check_sdk_result(get_servo_state(fd, state), "get_servo_state")) return false; // 状态未知时不允许继续发送控制命令。 switch (state) { case 0: // 停止状态:先切换到状态 1,再执行上电。 if (!check_sdk_result(set_servo_state(fd, 1), "set_servo_state")) return false; if (!check_sdk_result(set_servo_poweron(fd), "set_servo_poweron")) return false; break; case 1: // 就绪状态:可以直接发送伺服上电命令。 if (!check_sdk_result(set_servo_poweron(fd), "set_servo_poweron")) return false; break; case 2: // 报警状态:先清错,再重新设置就绪状态并执行上电。 if (!check_sdk_result(clear_error(fd), "clear_error")) return false; std::cerr << "伺服报警已清除,重新上电" << std::endl; if (!check_sdk_result(set_servo_state(fd, 1), "set_servo_state")) return false; if (!check_sdk_result(set_servo_poweron(fd), "set_servo_poweron")) return false; break; case 3: // 伺服已经处于运行状态,无需重复发送上电命令。 return true; default: // 未定义状态不能安全处理,直接结束上电流程。 std::cerr << "未知伺服状态:" << state << std::endl; return false; } // 上电命令发送成功后,继续等待状态 3,以确认伺服真正就绪。 return wait_until_robot_ready(fd); } ``` 各状态的处理逻辑如下: 1. 状态 0:调用 `set_servo_state` 切换到状态 1,再调用 `set_servo_poweron`。 2. 状态 1:控制器已经就绪,直接调用 `set_servo_poweron`。 3. 状态 2:先调用 `clear_error`,清错成功后重新切换到状态 1,再执行上电。 4. 状态 3:机器人已经处于运行状态,直接返回成功,避免重复上电。 5. 未知状态:无法确定安全处理方式,返回失败并停止后续操作。 ## 5、主程序连接控制器并执行上电 主函数负责启用 UTF-8 控制台输出、连接控制器、调用封装好的上电函数,并根据结果决定程序是否继续。 上电失败时需要主动调用 `disconnect_robot` 释放已经建立的连接,避免异常路径遗留无效会话。 ```cpp #include #include #include #include #include "../demo_utils.h" /** * @brief Demo 程序入口。 * @return 连接失败时返回 0;上电失败时返回 1;成功时按默认规则返回 0。 */ int main() { demo::enable_console_utf8(); // 启用 UTF-8 控制台输出。 // 同步连接控制器,并通过返回的连接句柄判断连接结果。 SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= 0) { std::cout << "控制器连接失败" << std::endl; return 0; } std::cout << "控制器连接成功" << std::endl; // 只有确认伺服进入状态 3 后,才继续执行成功路径。 if (!power_on(fd)) { std::cerr << "伺服未就绪,停止后续操作" << std::endl; disconnect_robot(fd); // 上电失败时主动释放控制器连接。 return 1; } std::cout << "伺服已就绪,可以执行后续操作" << std::endl; } ``` --- # 3. 伺服状态检测 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/03.%E4%BC%BA%E6%9C%8D%E7%8A%B6%E6%80%81%E6%A3%80%E6%B5%8B.html 本期将介绍如何连接控制器,查询机器人当前的伺服状态,并根据状态码输出对应的检测结果。 在执行上电、运动或其他控制操作之前,通常需要先确认伺服当前所处的状态。程序通过 `get_servo_state` 获取状态码,再根据状态码判断机器人是未上电、已经就绪、正在运行,还是处于报警状态。 伺服状态码的含义如下: - 状态 0:伺服未上电 - 状态 1:伺服就绪 - 状态 2:伺服报警 - 状态 3:伺服运行中 ::: warning ⚠️ 使用注意 本 Demo 只查询和显示伺服状态,不会修改伺服状态,也不会向机器人发送运动指令。运行前仍需确认: - **连接配置:** 控制器 IP 地址和 SDK 服务端口与实际配置一致 - **查询结果:** 只有 `get_servo_state` 返回 `SUCCESS` 时,才能使用查询得到的状态值 - **报警处理:** 状态为 2 时应停止后续控制操作,并检查控制器报警信息 - **未知状态:** SDK 返回未定义状态码时,应按异常处理,不能继续下发控制命令 - **现场安全:** 即使本 Demo 不控制机器人,也应确保急停和安全回路处于正常状态 伺服状态只能反映当前查询时刻的结果。实际项目在执行关键控制操作前,应根据业务需要重新查询状态,避免使用已经过期的状态值。 ::: ## 1、配置控制器连接和查询参数 首先配置控制器 IP 地址、SDK 服务端口、查询失败后的重试间隔,以及允许的最大连续查询失败次数。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 用户实际控制器的 IP 地址。 const std::string robot_port = "6001"; ///< 用户实际控制器的 SDK 服务端口,必须与控制器配置一致。 /** @} */ /** * @name 建议客户修改 * 以下配置应结合控制器通信质量和允许的查询响应时间进行调整。 * @{ */ constexpr int query_retry_interval_ms = 500; ///< 查询失败后的重试间隔,单位为毫秒。 /** @} */ /** * @name 可修改也可保留默认值 * 默认值与本 Demo 的失败提示一致,一般情况下可直接保留。 * @{ */ constexpr int max_query_failures = 3; ///< 单次状态查询允许的最大连续失败次数。 /** @} */ ``` `query_retry_interval_ms` 用于控制两次查询之间的等待时间。如果间隔过短,可能增加控制器的通信负载;如果间隔过长,则会延长状态检测的总响应时间。 `max_query_failures` 用于限制单次检测允许尝试的最大次数,避免控制器持续无响应时程序无限重试。 ## 2、封装带重试的伺服状态查询函数 网络短暂波动或控制器临时繁忙时,单次调用 `get_servo_state` 可能失败。为了避免一次查询失败就直接结束检测,程序封装了 `get_servo_state_with_retry` 函数,在配置的次数范围内重复查询。 ```cpp /** * @brief 查询当前伺服状态,并在查询失败时按配置进行重试。 * @param[in] fd 控制器连接句柄。 * @param[out] state 查询成功时保存当前伺服状态码。 * @retval true 在允许的重试次数内成功获取伺服状态。 * @retval false 所有查询均失败,此时调用方不应使用 @p state。 */ bool get_servo_state_with_retry(SOCKETFD fd, int& state) { // 按固定次数处理临时网络波动,避免单次查询失败就结束检测。 for (int attempt = 1; attempt <= max_query_failures; ++attempt) { // SDK 将当前伺服状态写入 state,并返回本次调用结果。 const Result result = get_servo_state(fd, state); if (result == SUCCESS) { return true; // 查询成功,此时 state 已保存当前状态值。 } std::cerr << "获取伺服状态失败,第 " << attempt << "/" << max_query_failures << " 次,错误码:" << static_cast(result) << std::endl; if (attempt < max_query_failures) { std::this_thread::sleep_for( std::chrono::milliseconds(query_retry_interval_ms)); } } // 所有查询均失败,调用方不应再依据 state 执行后续判断。 std::cerr << "连续3次获取伺服状态失败" << std::endl; return false; } ``` 函数的执行过程如下: 1. 从第 1 次查询开始调用 `get_servo_state`。 2. 如果接口返回 `SUCCESS`,立即返回 `true`,此时 `state` 保存有效状态码。 3. 如果查询失败,输出当前失败次数和 SDK 错误码。 4. 未达到最大次数时,等待 `query_retry_interval_ms` 毫秒后再次查询。 5. 所有查询均失败时返回 `false`,调用方不能继续解释 `state`。 ## 3、封装伺服状态展示与判断函数 成功取得状态码后,还需要将数值状态转换为便于理解的文字,并判断该状态是否允许程序继续执行后续控制操作。 单独封装 `show_servo_state`,是为了将“从控制器读取状态”和“解释状态含义”分离。查询函数只负责保证数据有效,展示函数统一维护状态码与文字说明的对应关系,并通过布尔返回值告知主程序当前状态是否正常。以后增加新的状态码或修改异常处理方式时,只需要调整该函数。 ```cpp /** * @brief 输出 SDK 状态码对应的伺服状态,并判断是否允许继续后续控制操作。 * @param[in] state SDK 返回的伺服状态码。 * @retval true 伺服处于未上电、就绪或运行中状态。 * @retval false 伺服处于报警状态,或 SDK 返回未知状态码。 */ bool show_servo_state(int state) { switch (state) { case 0: std::cout << "伺服状态:未上电" << std::endl; return true; case 1: std::cout << "伺服状态:就绪" << std::endl; return true; case 2: std::cerr << "伺服状态:报警" << std::endl; std::cerr << "处理:停止后续控制操作,请检查控制器报警信息" << std::endl; return false; // 报警未排除时停止后续控制,避免继续下发命令。 case 3: std::cout << "伺服状态:运行中" << std::endl; return true; default: // 未定义的状态码同样按异常处理,避免根据未知状态作出错误判断。 std::cerr << "伺服返回未知状态:" << state << std::endl; std::cerr << "处理:停止后续控制操作" << std::endl; return false; } } ``` 各状态的处理逻辑如下: 1. 状态 0:输出“未上电”,状态值有效,函数返回 `true`。 2. 状态 1:输出“就绪”,状态值有效,函数返回 `true`。 3. 状态 2:输出“报警”和处理提示,函数返回 `false`,阻止后续控制操作。 4. 状态 3:输出“运行中”,状态值有效,函数返回 `true`。 5. 未知状态:无法确认机器人状态,按异常处理并返回 `false`。 这里返回 `true` 表示状态码已被识别且不属于报警或未知状态,并不表示伺服一定已经上电。例如状态 0 虽然返回 `true`,但它仍表示伺服当前处于未上电状态。 ## 4、主程序连接控制器并检测伺服状态 主函数负责启用 UTF-8 控制台输出、连接控制器、获取伺服状态,并根据检测结果设置程序退出码。 只有 `get_servo_state_with_retry` 返回成功时,主函数才会调用 `show_servo_state`。这样可以避免查询失败后继续使用无效或过期的状态值。 ```cpp #include #include #include #include #include "../demo_utils.h" /** * @brief Demo 程序入口:连接控制器、查询伺服状态并输出检测结果。 * @return 状态正常时返回 0;查询失败、报警或未知状态时返回 1。 */ int main() { demo::enable_console_utf8(); // 启用 UTF-8 控制台输出。 SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= 0) { std::cout << "控制器连接失败" << std::endl; return 0; } std::cout << "控制器连接成功" << std::endl; int state = 0; bool statusNormal = false; // 记录状态是否正常,用于确定程序最终退出码。 if (get_servo_state_with_retry(fd, state)) { // 仅在查询成功时解释状态,避免使用无效或过期的状态值。 statusNormal = show_servo_state(state); } if (statusNormal) // 正常状态返回 0;查询失败、报警或未知状态返回非 0。 return 0; else return 1; } ``` --- # 4. 直接运动指令 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/04.%E7%9B%B4%E6%8E%A5%E8%BF%90%E5%8A%A8%E6%8C%87%E4%BB%A4.html 本期将介绍如何通过 SDK 依次发送 MOVJ 和 MOVL 直接运动指令,并在每段运动开始前执行目标点可达性预检,在指令发送后等待机器人运动完成。 MOVJ 和 MOVL 的运动方式不同: - **MOVJ:** 以关节运动方式到达目标点,当前 Demo 使用关节坐标数据 - **MOVL:** 控制机器人末端沿直线路径到达目标点,当前 Demo 使用直角坐标数据 本 Demo 的执行顺序为:先检查目标点人工确认标志,再执行 MOVJ 可达性预检和运动;确认 MOVJ 完全结束后,重新执行 MOVL 可达性预检并发送 MOVL 指令,最后等待第二段运动完成。 ::: danger ⚠️ 安全警告 以下代码会向控制器发送真实运动指令,并导致机器人实际运动。执行前必须确认: - **人员安全:** 机器人工作空间及规划路径内无人员、工装干涉或障碍物 - **目标点来源:** MOVJ 和 MOVL 目标点均来自当前机器人实际示教,禁止直接使用其他机器人或其他现场的坐标 - **坐标配置:** 坐标类型、工具坐标系、用户坐标系和机器人构型与示教目标点一致 - **伺服与模式:** 伺服已经上电,控制器处于允许 SDK 下发运动指令的模式 - **速度限制:** 首次调试使用较低速度和较缓加减速度,并结合机器人负载逐步调整 - **急停可用:** 急停按钮处于可用状态,并在操作人员可触及范围内 - **路径安全:** 可达性预检只能判断运动学是否可达,不能代替碰撞检测和真实路径安全检查 建议先在仿真环境中验证目标点、坐标系和运动顺序,再在空载低速条件下进行真机测试。 ::: ## 1、配置控制器、目标点和运动参数 首先配置控制器 IP 地址和 SDK 服务端口。程序只有连接到正确的控制器,才能对目标点执行预检并发送运动指令。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 实际控制器的 IP 地址。 const std::string robot_port = "6001"; ///< 实际控制器的 SDK 服务端口,必须与控制器配置一致。 /** @} */ ``` MOVJ 和 MOVL 目标点必须来自当前机器人实际示教。源码默认使用全零数据作为占位值,并将 `target_positions_confirmed` 设置为 `false`,防止程序直接使用未经验证的目标点驱动机器人。 ```cpp /** * @name 客户需根据本 Demo 修改 * 目标点必须来自当前机器人实际示教;确认点位和运行环境安全后,才可修改确认标志。 * @{ */ const std::array movej_target = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; ///< MOVJ 实际示教关节目标点,禁止使用未确认点位。 const std::array movel_target = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; ///< MOVL 实际示教直角目标点,坐标格式必须匹配机器人型号。 constexpr bool target_positions_confirmed = false; ///< 两个目标点均完成示教和安全确认后才可设为 true。 /** @} */ ``` 运动速度、加速度和减速度应结合机器人型号、负载和现场条件设置。首次调试时应保留较低参数,再根据实际运行情况逐步调整。 ```cpp /** * @name 建议客户修改 * 首次调试建议采用较低速度和较缓加减速度,并结合机器人负载及现场条件逐步调整。 * @{ */ constexpr double movej_velocity = 10.0; ///< MOVJ 关节运动速度。 constexpr double movel_velocity = 20.0; ///< MOVL 直线运动速度。 constexpr double motion_acceleration = 20.0; ///< 运动加速度。 constexpr double motion_deceleration = 20.0; ///< 运动减速度。 /** @} */ ``` 等待参数用于限制单次运动的最长等待时间、控制运行状态查询频率,并处理短暂通信异常和极短运动状态难以捕获的问题。 ```cpp /** * @name 可修改也可保留默认值 * 以下配置控制运动完成等待、状态轮询和通信容错,默认值适用于一般演示场景。 * @{ */ constexpr int motion_timeout_seconds = 30; ///< 单次运动完成等待的总超时时间,单位为秒。 constexpr int poll_interval_ms = 100; ///< 机器人运行状态的轮询间隔,单位为毫秒。 constexpr int max_state_query_failures = 3; ///< 运行状态查询允许的最大连续失败次数。 constexpr int stopped_confirmation_count = 5; ///< 未观察到运行状态时,判定运动完成所需的连续停止状态次数。 /** @} */ ``` ## 2、封装运动指令构造函数 MOVJ 和 MOVL 都使用 `MoveCmd` 结构传递目标点、坐标类型、速度、加减速度、平滑参数和坐标系编号。两种指令的大部分公共参数相同,只有目标点、坐标类型和速度不同。 ```cpp /** * @brief 使用统一的公共参数构造 MOVJ 或 MOVL 运动指令。 * @param[in] target 七维运动目标值。 * @param[in] coord 目标点坐标类型;当前 Demo 使用 0 表示关节坐标,1 表示直角坐标。 * @param[in] velocity 本次运动使用的速度。 * @return 填充完成的运动指令参数。 */ MoveCmd make_move_command( const std::array& target, int coord, double velocity) { MoveCmd command; command.targetPosType = PosType::data; std::copy(target.begin(), target.end(), command.targetPosValue.begin()); command.coord = coord; command.velocity = velocity; command.acc = motion_acceleration; command.dec = motion_deceleration; command.pl = 0; // 关闭与下一段轨迹的平滑过渡,便于准确判断本段结束。 command.toolNum = 0; // 必须与示教目标点使用的工具坐标系编号一致。 command.userNum = 0; // 必须与示教目标点使用的用户坐标系编号一致。 command.configuration = 0; // 必须按机器人型号填写目标点构型。 return command; } ``` 其中 `pl = 0` 表示本 Demo 不考虑与下一段运动之间的平滑过渡。程序会等待当前运动完全结束后再发送下一条指令,因此能够明确区分 MOVJ 和 MOVL 两段运动。 `toolNum`、`userNum` 和 `configuration` 不能仅因为示例值为 0 就直接保留。实际使用时,必须与目标点示教时采用的工具坐标系、用户坐标系和机器人构型一致。 ## 3、封装可达性位置数据转换函数 运动指令使用 `MoveCmd` 保存目标数据,而 `get_pos_reachable` 接口要求传入长度为 14 的位置容器。程序需要将运动指令转换为可达性接口规定的数据格式。 ```cpp /** * @brief 将运动指令转换为可达性接口要求的 14 位位置数据。 * @param[in] command 待执行的运动指令参数。 * @return 用于可达性预检的位置数据。 * * @details * 转换结果与实际下发指令使用同一目标数据,避免预检点位与真实运动点位不一致。 */ std::vector make_reachability_position(const MoveCmd& command) { // 前 7 位描述坐标系、角度制和构型,后 7 位保存实际目标坐标。 std::vector position(14, 0.0); position[0] = static_cast(command.coord); position[1] = 0.0; // 当前目标使用角度制;使用弧度制时必须与实际数据保持一致。 position[2] = static_cast(command.configuration); position[3] = static_cast(command.toolNum); position[4] = static_cast(command.userNum); std::copy_n(command.targetPosValue.begin(), 7, position.begin() + 7); return position; } ``` 转换后的 14 位位置数据含义如下: - 第 0 位:目标点坐标类型 - 第 1 位:角度制或弧度制标志,当前 Demo 使用角度制 - 第 2 位:机器人构型 - 第 3 位:工具坐标系编号 - 第 4 位:用户坐标系编号 - 第 5~6 位:备用字段,保持为 0 - 第 7~13 位:七维目标位置数据 ## 4、封装目标点可达性预检函数 在向机器人发送真实运动指令之前,程序先调用 `get_pos_reachable` 检查目标点在运动学上是否可达。只有 SDK 调用成功且接口返回目标点可达时,才允许继续发送运动指令。 单独封装 `precheck_reachability`,是为了统一 MOVJ 和 MOVL 的预检流程、错误处理和结果输出。主程序不需要重复编写位置转换、SDK 返回值判断和可达结果判断,也能保证预检失败时立即取消对应运动。 ```cpp /** * @brief 在发送真实运动指令前检查目标点是否可达。 * @param[in] fd 控制器连接句柄。 * @param[in] command 待预检的运动指令参数。 * @param[in] moveType 运动类型名称,用于调用接口和输出提示。 * @retval true SDK 调用成功且目标点可达。 * @retval false SDK 调用失败或目标点不可达。 */ bool precheck_reachability( SOCKETFD fd, const MoveCmd& command, const std::string& moveType) { bool reachable = false; const Result result = get_pos_reachable( fd, make_reachability_position(command), moveType, reachable); if (result != SUCCESS) { std::cerr << moveType << " 可达性预检调用失败,错误码:" << static_cast(result) << std::endl; return false; } if (!reachable) { std::cerr << moveType << " 目标点不可达,已取消运动指令" << std::endl; return false; } std::cout << moveType << " 目标点可达性预检通过" << std::endl; return true; } ``` 需要特别注意,可达性预检通过只代表控制器认为目标点在运动学上可达,并不代表运动路径一定不会发生碰撞。工具、工件、外围设备、机器人本体和奇异位形等风险仍需通过仿真和现场安全验证进行确认。 ## 5、封装等待运动完成函数 `robot_movej` 或 `robot_movel` 返回 `SUCCESS`,只表示运动指令已经成功发送,不代表机器人已经到达目标点。程序需要持续调用 `get_robot_running_state` 查询运行状态,直到确认本段运动结束。 运行状态的含义如下: - 状态 0:机器人停止 - 状态 1:机器人暂停 - 状态 2:机器人正在运行 ```cpp /** * @brief 等待当前运动完成,并统一处理暂停、查询失败、未知状态和超时。 * @param[in] fd 控制器连接句柄。 * @param[in] timeout 本次等待允许占用的最长时间。 * @retval true 已确认机器人运动完成。 * @retval false 状态查询连续失败、返回未知状态或等待超时。 */ bool wait_for_motion_complete( SOCKETFD fd, std::chrono::seconds timeout = std::chrono::seconds(motion_timeout_seconds)) { using clock = std::chrono::steady_clock; const auto deadline = clock::now() + timeout; // 使用绝对截止时间限制整个等待过程。 bool runningObserved = false; // 是否观察到运行状态 2。 bool pauseReported = false; // 暂停期间只提示一次。 int stoppedCount = 0; // 连续停止状态的确认次数。 int consecutiveFailures = 0; // 运行状态连续查询失败次数。 while (clock::now() < deadline) { int runningState = 0; const Result result = get_robot_running_state(fd, runningState); if (result != SUCCESS) { ++consecutiveFailures; std::cerr << "获取机器人运行状态失败,第 " << consecutiveFailures << "/" << max_state_query_failures << " 次,错误码:" << static_cast(result) << std::endl; if (consecutiveFailures >= max_state_query_failures) { std::cerr << "连续获取机器人运行状态失败,停止等待" << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(poll_interval_ms)); continue; } consecutiveFailures = 0; // 查询成功后清除连续失败计数。 switch (runningState) { case 2: // 已确认运动开始,后续读取到停止状态即可判定本段运动结束。 runningObserved = true; pauseReported = false; stoppedCount = 0; break; case 1: // 暂停不等于完成,继续等待恢复;总等待时间仍受 timeout 限制。 stoppedCount = 0; if (!pauseReported) { std::cout << "机器人运动已暂停,继续等待恢复" << std::endl; pauseReported = true; } break; case 0: // 已观察到运行时,状态 0 表示结束;否则连续确认以兼容极短运动。 ++stoppedCount; if (runningObserved || stoppedCount >= stopped_confirmation_count) { std::cout << "机器人运动完成" << std::endl; return true; } break; default: std::cerr << "机器人返回未知运行状态:" << runningState << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(poll_interval_ms)); } std::cerr << "等待机器人运动完成超时" << std::endl; return false; } ``` `runningObserved` 用于记录程序是否实际观察到机器人进入运行状态。对于正常运动,一旦先观察到状态 2,之后读取到状态 0 就可以确认运动结束。 某些运动时间很短,程序可能因为轮询间隔而没有捕获到状态 2。此时通过 `stopped_confirmation_count` 连续确认多次状态 0,避免程序一直等待,也降低单次瞬时状态造成误判的概率。 ## 6、主程序依次执行 MOVJ 和 MOVL 主函数首先检查 `target_positions_confirmed`。确认标志为 `false` 时,程序会在连接控制器和发送运动指令之前直接退出,避免全零占位点或未经验证的目标点驱动机器人。 连接成功后,程序分别为 MOVJ 和 MOVL 构造运动指令。每条指令都必须先通过可达性预检,再检查运动接口的 SDK 返回值,并等待当前运动完全结束。 ```cpp #include #include #include #include #include #include #include #include #include "../demo_utils.h" /** * @brief Demo 程序入口:依次执行 MOVJ、MOVL,并等待每段运动完成。 * @return 全部预检、指令发送和运动等待均成功时返回 0,否则返回 1。 */ int main() { demo::enable_console_utf8(); // 在连接和下发指令前检查人工确认标志,避免使用占位点或未经验证的点位。 if (!target_positions_confirmed) { std::cerr << "目标点尚未确认:请填写实际示教点,并将 " << "target_positions_confirmed 设置为 true" << std::endl; return 1; } SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= 0) { std::cerr << "控制器连接失败" << std::endl; return 1; } std::cout << "控制器连接成功" << std::endl; // MOVJ 使用关节坐标(coord = 0),仅在可达性预检通过后发送指令。 MoveCmd movejCommand = make_move_command(movej_target, 0, movej_velocity); if (!precheck_reachability(fd, movejCommand, "MOVJ")) { return 1; } Result result = robot_movej(fd, movejCommand); if (result != SUCCESS) { std::cerr << "发送 MOVJ 指令失败,错误码:" << static_cast(result) << std::endl; return 1; } std::cout << "MOVJ 指令发送成功,等待运动完成" << std::endl; // 等待 MOVJ 完全结束后再执行 MOVL,避免两条指令同时占用机器人。 if (!wait_for_motion_complete(fd)) { return 1; } // MOVL 使用直角坐标(coord = 1),并基于当前实际位置重新执行预检。 MoveCmd movelCommand = make_move_command(movel_target, 1, movel_velocity); if (!precheck_reachability(fd, movelCommand, "MOVL")) { return 1; } result = robot_movel(fd, movelCommand); if (result != SUCCESS) { std::cerr << "发送 MOVL 指令失败,错误码:" << static_cast(result) << std::endl; return 1; } std::cout << "MOVL 指令发送成功,等待运动完成" << std::endl; // 将最后一次等待结果作为退出状态,便于外部脚本判断本次 Demo 是否成功。 return wait_for_motion_complete(fd) ? 0 : 1; } ``` --- # 5. 断开连接 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/05.%E6%96%AD%E5%BC%80%E8%BF%9E%E6%8E%A5.html 本期将介绍上位机如何主动断开与控制器建立的 SDK 连接,并分别演示正常退出和业务异常退出两种场景下的连接清理方式。 程序通过 `connect_robot` 成功连接控制器后,会获得一个连接句柄 `fd`。当业务执行结束或发生可捕获异常时,应在程序退出前显式调用 `disconnect_robot`,释放本次连接使用的通信资源。 本 Demo 支持以下两种运行方式: ```text demo.exe 正常退出,在正常业务路径中显式断开连接 demo.exe --abnormal 模拟业务异常,在异常处理路径中显式断开连接 ``` `--abnormal` 只用于模拟上层业务抛出异常,不表示 SDK 连接本身发生异常。两种场景都会真实连接控制器,也都会真实调用 `disconnect_robot`。 ::: warning ⚠️ 使用注意 本 Demo 只演示建立和断开 SDK 连接,不会发送机器人运动指令。使用时仍需注意: - **连接配置:** 控制器 IP 地址和 SDK 服务端口必须与实际配置一致 - **显式清理:** 正常路径和可捕获异常路径都应在退出前调用断开接口 - **返回结果:** 不能因为程序即将退出就忽略 `disconnect_robot` 的返回值 - **运动安全:** 断开 SDK 连接不等于急停、伺服下电或运动停止,不能将其作为安全停止手段 - **不可恢复场景:** 断电、进程被强制结束或操作系统异常终止时,程序无法继续执行,因此无法保证调用 SDK 断开接口 实际项目应将连接清理纳入统一的资源管理流程,同时通过急停、安全回路和控制器自身机制保障机器人运动安全。 ::: ## 1、配置控制器连接参数 首先配置控制器 IP 地址和 SDK 服务端口。程序会使用这两个参数建立真实连接,因此运行前必须确认目标控制器无误。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 用户实际控制器的 IP 地址。 const std::string robot_port = "6001"; ///< 用户实际控制器的 SDK 服务端口,必须与控制器配置一致。 /** @} */ ``` `connect_robot` 返回的是连接句柄,而不是普通的 `Result`。因此,程序通过判断句柄是否大于 0 来确认连接是否建立成功。只有获得有效句柄后,才能调用 `disconnect_robot`。 ## 2、封装控制器连接断开函数 正常业务结束、标准异常和未知异常等退出路径都需要执行相同的断开操作。程序将断开逻辑封装为 `disconnect_controller`,统一调用 SDK 接口、检查返回值并输出当前退出路径的处理结果。 ```cpp /** * @brief 主动断开控制器连接,并统一检查 SDK 返回结果。 * @param[in] fd 控制器连接句柄。 * @param[in] exitPath 当前退出路径的说明文字,用于输出处理结果。 * @retval true 控制器连接已成功断开。 * @retval false SDK 返回失败,或断开过程中捕获到异常。 * * @details * `noexcept` 保证清理函数不会继续传播异常,使正常和异常退出路径都能稳定结束。 */ bool disconnect_controller( SOCKETFD fd, const std::string& exitPath) noexcept { try { // 真实调用 SDK 断开接口并检查返回值,不能因程序即将退出就假定连接已关闭。 const Result result = disconnect_robot(fd); if (result != SUCCESS) { std::cerr << exitPath << ":关闭控制器连接失败,错误码:" << static_cast(result) << std::endl; return false; } std::cout << exitPath << ":控制器连接已关闭" << std::endl; return true; } catch (const std::exception& error) { // SDK 若抛出标准异常,在此转换为 false,由调用方统一返回失败退出码。 std::cerr << exitPath << ":disconnect_robot 抛出异常:" << error.what() << std::endl; return false; } catch (...) { // 未知异常也在此截断,防止断开操作破坏原有异常处理流程。 std::cerr << exitPath << ":disconnect_robot 抛出未知异常" << std::endl; return false; } } ``` 函数使用 `exitPath` 区分“正常退出路径”和“异常退出路径”,便于从日志中判断本次断开操作发生在哪个阶段。 ## 3、定义退出场景并封装参数解析函数 为了明确区分正常退出和异常退出,程序使用 `ExitScenario` 枚举表示本次需要运行的演示场景。 ```cpp /** * @brief Demo 支持的退出场景。 */ enum class ExitScenario { normal, ///< 正常业务路径主动断开连接。 abnormal ///< 模拟业务异常后主动断开连接。 }; ``` 使用枚举而不是普通整数或字符串,可以让场景含义更加清晰,并避免在后续业务函数中重复比较命令行文本。 命令行参数由 `parse_scenario` 统一解析:不传参数时选择正常场景,只传入 `--abnormal` 时选择异常场景,其他参数均视为无效。 单独封装参数解析函数,是为了在连接控制器之前完成输入校验。参数无效时程序可以直接退出,避免先建立真实控制器连接,再发现本次运行方式无法识别。 ```cpp /** * @brief 解析命令行参数并确定本次 Demo 的退出场景。 * @param[in] argc 命令行参数数量。 * @param[in] argv 命令行参数数组。 * @param[out] scenario 解析成功后保存选择的退出场景。 * @retval true 参数有效,已确定退出场景。 * @retval false 参数无效,不应继续连接控制器。 */ bool parse_scenario( int argc, char* argv[], ExitScenario& scenario) { if (argc == 1) { // 未传入参数时,默认演示正常主动断开流程。 scenario = ExitScenario::normal; return true; } if (argc == 2 && std::string(argv[1]) == "--abnormal") { // --abnormal 只选择异常测试路径,不表示 SDK 连接本身已经异常。 scenario = ExitScenario::abnormal; return true; } std::cerr << "参数错误。用法:demo.exe [--abnormal]" << std::endl; return false; } ``` 参数解析结果如下: - `demo.exe`:选择 `ExitScenario::normal` - `demo.exe --abnormal`:选择 `ExitScenario::abnormal` - 其他参数:输出正确用法并返回失败,不连接控制器 ## 4、封装正常和异常断开演示函数 `run_disconnect_demo` 根据选择的场景执行正常业务路径或模拟异常路径。 ```cpp /** * @brief 执行选定的正常或异常断开演示场景。 * @param[in] fd 控制器连接句柄。 * @param[in] scenario 本次需要执行的退出场景。 * @return 正常路径成功断开连接时返回 0;正常路径断开失败时返回 1。 * @throws std::runtime_error 当选择异常场景时,抛出模拟业务异常。 */ int run_disconnect_demo(SOCKETFD fd, ExitScenario scenario) { if (scenario == ExitScenario::abnormal) { // 故意抛出可捕获的业务异常,用于验证 catch 路径仍会关闭真实连接。 std::cout << "开始模拟业务异常" << std::endl; throw std::runtime_error("模拟异常退出"); } std::cout << "开始执行正常断开流程" << std::endl; // 正常路径在返回前主动关闭连接,断开失败时使用非零退出码报告结果。 if (!disconnect_controller(fd, "正常退出路径")) { return 1; } return 0; } ``` 正常场景会直接调用 `disconnect_controller`,断开成功时返回 0,断开失败时返回 1。 异常场景不会在此函数内断开连接,而是故意抛出 `std::runtime_error`。异常会返回 `main` 中的 `catch` 路径,由异常处理代码统一调用 `disconnect_controller`,用于验证异常退出时的真实连接清理过程。 ## 5、主程序连接控制器并处理退出路径 主函数首先解析命令行参数,参数有效时才连接控制器。连接成功后的场景执行代码全部放入 `try` 中,保证可捕获的标准异常和未知异常都能进入对应的清理路径。 ```cpp #include #include #include #include #include #include "../demo_utils.h" /** * @brief Demo 程序入口:解析退出场景、连接控制器并验证显式断开流程。 * @param[in] argc 命令行参数数量。 * @param[in] argv 命令行参数数组。 * @return 正常退出且断开成功时返回 0;参数无效、连接失败、业务异常或断开失败时返回 1。 */ int main(int argc, char* argv[]) { demo::enable_console_utf8(); ExitScenario scenario = ExitScenario::normal; if (!parse_scenario(argc, argv, scenario)) { return 1; } // connect_robot 返回连接句柄而非 Result,因此通过句柄是否有效判断连接结果。 SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= 0) { std::cerr << "控制器连接失败" << std::endl; return 1; } std::cout << "控制器连接成功" << std::endl; // 连接成功后的场景代码全部放入 try,确保可捕获异常都进入显式断开路径。 try { return run_disconnect_demo(fd, scenario); } catch (const std::exception& error) { std::cerr << "捕获业务异常:" << error.what() << std::endl; // 异常路径在返回前显式关闭真实控制器连接。 if (!disconnect_controller(fd, "异常退出路径")) { return 1; } // 连接关闭成功不改变业务发生异常的事实,因此保持非零退出码。 return 1; } catch (...) { // 未知异常执行相同清理策略,避免新增异常类型时遗漏断开连接。 std::cerr << "捕获未知异常" << std::endl; if (!disconnect_controller(fd, "异常退出路径")) { return 1; } return 1; } } ``` ## 6、正常退出流程 不传入命令行参数时,程序执行正常主动断开流程: 1. `parse_scenario` 将场景设置为 `ExitScenario::normal`。 2. `connect_robot` 建立与控制器的真实连接。 3. `run_disconnect_demo` 进入正常业务路径。 4. `disconnect_controller` 调用 `disconnect_robot` 主动断开连接。 5. 断开成功时程序返回 0;断开失败时返回 1。 正常运行命令如下: ```text demo.exe ``` 正常路径预期输出类似: ```text 控制器连接成功 开始执行正常断开流程 正常退出路径:控制器连接已关闭 ``` ## 7、异常退出流程 传入 `--abnormal` 时,程序模拟业务执行过程中发生可捕获异常: 1. `parse_scenario` 将场景设置为 `ExitScenario::abnormal`。 2. 程序与控制器建立真实连接。 3. `run_disconnect_demo` 主动抛出 `std::runtime_error`。 4. `main` 中的标准异常分支捕获该异常。 5. 异常处理路径调用 `disconnect_controller` 断开真实连接。 6. 即使连接成功关闭,程序仍返回 1,以表示本次业务执行发生异常。 异常测试命令如下: ```text demo.exe --abnormal ``` 异常路径预期输出类似: ```text 控制器连接成功 开始模拟业务异常 捕获业务异常:模拟异常退出 异常退出路径:控制器连接已关闭 ``` 异常场景的非零退出码用于保留“业务执行失败”的事实,不能因为资源已经成功清理就将本次运行报告为成功。 需要注意,本 Demo 只能处理程序仍有机会执行代码的正常退出和可捕获异常。对于突然断电、进程被操作系统强制结束或不可恢复的进程崩溃,应用程序无法继续运行清理代码,因此不能依赖本示例保证这些情况下仍会调用 SDK 断开接口。 --- # 6. 运动队列的曲线运动 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/06.%E8%BF%90%E5%8A%A8%E9%98%9F%E5%88%97%E7%9A%84%E6%9B%B2%E7%BA%BF%E8%BF%90%E5%8A%A8.html ## 1、封装设置伺服就绪函数 ```cpp /* * 伺服就绪函数 */ void servo_ready(int fd) { int state = 0; get_servo_state(fd, state); switch (state) { case 0: set_servo_state(fd, 1); // 将伺服切换为就绪 break; case 2: clear_error(fd); set_servo_state(fd, 1); break; } get_servo_state(fd, state); std::cout << "伺服状态: " << state << std::endl; } ``` ## 2、封装等待运动结束的函数 ```cpp /* * 循环阻塞运动结束函数 */ void wait_for_running_over(int fd) { // 等待运动完成 int running_state = 0; get_robot_running_state(fd, running_state); // 查询机器人是否在运动 2-正在运动 while (running_state == 2) { std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 阻塞500ms get_robot_running_state(fd, running_state); // 再次查询 } } ``` ## 3.moves运动示例 ```cpp #include #include #include #include "cpp_interface/nrc_interface.h" #include "cpp_interface/nrc_queue_operate.h" //运动队列运行movs示例 void Test_multi_robot_motion_movs(SOCKETFD fd) { queue_motion_set_status(fd, true); //开启运动队列模式 sleep(1); // 设置期望位置 std::vector pos{431, 214, 149, 0, 0, 0}; std::vector pos1{378, 214, 149, 0, 0, 0}; std::vector pos2{340, 230, 149, 0, 0, 0}; std::vector pos3{280, 280, 149, 0, 0, 0}; std::vector pos4{262, 327, 149, 0, 0, 0}; std::vector pos5{299, 342, 149, 0, 0, 0}; std::vector pos6{378, 353, 149, 0, 0, 0}; std::vector pos7{429, 368, 149, 0, 0, 0}; std::vector pos8{471, 317, 149, 0, 0, 0}; std::vector pos9{448, 238, 149, 0, 0, 0}; MoveCmd movecmd; movecmd.targetPosType = PosType::data; movecmd.targetPosValue = pos; movecmd.coord = 1; movecmd.velocity = 50; movecmd.acc = 50; movecmd.dec = 50; movecmd.pl = 5; std::cout << "queue_motion_push_back_moveJ return" << queue_motion_push_back_moveJ(fd, movecmd) << std::endl; movecmd.targetPosValue = pos1; movecmd.velocity = 200; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; movecmd.targetPosValue = pos2; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; movecmd.targetPosValue = pos3; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; movecmd.targetPosValue = pos4; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; movecmd.targetPosValue = pos5; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; movecmd.targetPosValue = pos6; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; movecmd.targetPosValue = pos7; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; movecmd.targetPosValue = pos8; std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl; std::cout << "queue_motion_send_to_controller return" << queue_motion_send_to_controller(fd, 9) << std::endl; //这里的9对应你插入了多少条指令 std::cout << "star test moves" << std::endl; wait_for_running_over(fd); queue_motion_set_status(fd, 0); // 关闭队列 set_current_mode(fd, 0); // 切换回示教模式 } int main() { // 连接机器人 std::string robot_ip = "192.168.1.13"; std::string robot_port = "6001"; int robot_num = 1; fd = connect_robot(robot_ip, robot_port); printf("fd = %d\n", fd); while (!(get_connection_status(fd) == SUCCESS)) { usleep(8000); // 等待连接成功 std::cout << "waiting for connect......" << std::endl; } std::cout << "connect robot success!" << std::endl; clear_error(fd); int status; get_servo_state(fd, status); if(status != 1) { set_servo_state(fd, 1); } std::cout<< "star........" << std::endl; Test_multi_robot_motion_movs(fd); usleep(20000); while (true) { usleep(1000000); std::vector pos; get_current_position(fd, 1, pos); print_vector_double(pos); int configuration; std::cout << "get_robot_configuration return is "<< get_robot_configuration(fd, configuration) << std::endl; std::cout << "configuration is " << configuration << std::endl; } std::cout << "ending..........." << std::endl; return 0; } ``` --- # 7. 新建并执行作业文件 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/07.%E6%96%B0%E5%BB%BA%E5%B9%B6%E6%89%A7%E8%A1%8C%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6.html 本期将介绍如何通过 SDK 新建作业文件、写入延时指令,并验证作业运行、暂停、继续、主动停止和自然完成的完整生命周期。 本 Demo 会为每次运行生成一个唯一的作业名称,在控制器中新建对应的 `.JBR` 文件,并写入 3 条延时指令。作业会执行两次:第一次用于验证运行、暂停、继续和主动停止,第二次重新启动并等待作业自然完成。 ::: warning ⚠️ 使用注意 当前示例只向作业文件写入延时指令,不包含机器人运动指令。运行前仍需确认: - **连接配置:** 控制器 IP 地址和 SDK 服务端口与实际配置一致 - **作业占用:** 控制器当前没有其他作业处于运行或暂停状态 - **伺服状态:** 伺服已经上电并进入状态 3 - **控制器模式:** 控制器允许切换到运行模式并执行作业 - **文件保留:** 程序不会删除新建的作业文件,运行后可在控制器中检查 - **指令安全:** 如果将延时指令替换为运动指令,必须重新进行点位、坐标系、可达性和现场安全检查 延时指令本身不会驱动机器人运动,但作业执行能力会真实作用于控制器。请勿在已有生产作业运行时执行本 Demo。 ::: ## 1、配置控制器和作业参数 首先配置控制器 IP 地址和 SDK 服务端口。运行前必须确认程序连接的是预期控制器。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 实际控制器的 IP 地址。 const std::string robot_port = "6001"; ///< 实际控制器的 SDK 服务端口,必须与控制器配置一致。 /** @} */ ``` 示例作业默认写入 3 条延时 2 秒的指令。修改指令数量或单条持续时间后,需要同步调整自然完成等待时间,确保总超时时间大于作业的实际执行时间。 ```cpp /** * @name 客户需根据本 Demo 修改 * 以下配置决定示例作业的内容及自然完成等待时间;修改作业内容时必须同步确认超时时间。 * @{ */ constexpr int TIMER_COMMAND_COUNT = 3; ///< 写入示例作业的延时指令数量。 constexpr double TIMER_COMMAND_SECONDS = 2.0; ///< 每条延时指令的持续时间,单位为秒。 constexpr int JOB_COMPLETE_TIMEOUT_SECONDS = 30; ///< 等待作业自然完成的总超时时间,单位为秒。 /** @} */ ``` 状态切换和控制动作的等待参数用于给控制器留出响应时间,也便于观察暂停和停止效果。 ```cpp /** * @name 建议客户修改 * 以下配置应结合控制器响应速度和暂停、停止操作的观察需求进行调整。 * @{ */ constexpr int STATE_CHANGE_TIMEOUT_SECONDS = 10; ///< 等待作业状态切换的总超时时间,单位为秒。 constexpr int CONTROL_ACTION_DELAY_MS = 1000; ///< 确认运行后,执行暂停或停止前的等待时间。 constexpr int PAUSE_HOLD_MS = 1000; ///< 暂停状态的保持时间,便于观察暂停效果。 /** @} */ ``` 查询参数用于控制状态轮询频率和通信容错次数。连接已经断开时会立即停止重试,其他临时查询错误则按配置等待后再次尝试。 ```cpp /** * @name 可修改也可保留默认值 * 以下配置控制查询重试、状态轮询和通信容错,默认值适用于一般演示场景。 * @{ */ constexpr int POLL_INTERVAL_MS = 200; ///< 作业状态轮询间隔,单位为毫秒。 constexpr int QUERY_RETRY_INTERVAL_MS = 500; ///< 单次状态查询失败后的重试间隔,单位为毫秒。 constexpr int MAX_QUERY_FAILURES = 3; ///< 状态查询允许的最大连续失败次数。 /** @} */ ``` ## 2、封装 SDK 返回值检查和查询重试 作业生命周期会调用多个 SDK 接口。`check_sdk_result` 统一判断普通控制接口的返回值,并在失败时输出操作名称和错误码。 ```cpp /** * @brief 统一检查普通 SDK 接口的返回结果。 * @param[in] result SDK 接口返回的执行结果。 * @param[in] operation 当前操作名称,用于输出错误信息。 * @retval true SDK 接口调用成功。 * @retval false SDK 接口调用失败。 */ bool check_sdk_result(Result result, const std::string& operation) { if (result == SUCCESS) { return true; } std::cerr << operation << "失败,错误码:" << static_cast(result) << std::endl; return false; } ``` 状态查询容易受到短暂通信波动影响,因此程序将统一重试策略封装为模板函数 `query_with_retry`。调用方传入实际查询操作,即可复用相同的失败次数、间隔和断线处理逻辑。 ```cpp /** * @brief 执行可重试的 SDK 状态查询。 * @tparam Query 无参数且返回 Result 的可调用对象类型。 * @param[in] operation 当前查询名称,用于输出错误信息。 * @param[in] query 实际执行 SDK 查询的可调用对象。 * @retval true 在允许的重试次数内查询成功。 * @retval false 连接断开或所有查询尝试均失败。 */ template bool query_with_retry(const std::string& operation, Query query) { for (int attempt = 1; attempt <= MAX_QUERY_FAILURES; ++attempt) { const Result result = query(); if (result == SUCCESS) { return true; } std::cerr << operation << "失败,第 " << attempt << "/" << MAX_QUERY_FAILURES << " 次,错误码:" << static_cast(result) << std::endl; if (result == DISCONNECT) { std::cerr << "控制器连接已经断开,停止重试" << std::endl; return false; } if (attempt < MAX_QUERY_FAILURES) { std::this_thread::sleep_for( std::chrono::milliseconds(QUERY_RETRY_INTERVAL_MS)); } } std::cerr << operation << "连续失败,停止当前流程" << std::endl; return false; } ``` 机器人运行状态、控制器模式、伺服状态和当前活动作业使用四个轻量封装函数查询。它们将具体 SDK 调用和对应的操作名称传给 `query_with_retry`,使上层业务代码不需要重复编写 Lambda 和错误提示。 ```cpp bool query_running_state(SOCKETFD fd, int& state) { return query_with_retry("获取机器人运行状态", [&]() { return get_robot_running_state(fd, state); }); } bool query_current_mode(SOCKETFD fd, int& mode) { return query_with_retry("获取机器人当前模式", [&]() { return get_current_mode(fd, mode); }); } bool query_servo_state(SOCKETFD fd, int& state) { return query_with_retry("获取伺服状态", [&]() { return get_servo_state(fd, state); }); } bool query_current_job(SOCKETFD fd, std::string& job_name) { return query_with_retry("获取当前作业文件", [&]() { return job_get_current_file(fd, job_name); }); } ``` ## 3、封装作业名称生成和匹配函数 控制器返回的当前作业可能包含目录、`.JBR` 扩展名或不同的 ASCII 大小写形式。程序通过 `to_upper_ascii` 和 `is_expected_job` 统一处理这些差异,再判断当前活动作业是否为本 Demo 创建的作业。 ```cpp /** * @brief 将字符串中的 ASCII 字符转换为大写。 */ std::string to_upper_ascii(std::string value) { for (char& character : value) { character = static_cast( std::toupper(static_cast(character))); } return value; } /** * @brief 判断控制器返回的活动作业是否为预期作业。 */ bool is_expected_job( const std::string& current_job, const std::string& expected_job) { std::string current_name = current_job; const std::size_t separator = current_name.find_last_of("/\\"); if (separator != std::string::npos) { current_name = current_name.substr(separator + 1); } current_name = to_upper_ascii(current_name); if (current_name.size() > 4 && current_name.compare(current_name.size() - 4, 4, ".JBR") == 0) { current_name.erase(current_name.size() - 4); } return current_name == to_upper_ascii(expected_job); } ``` 每次运行都需要创建新的作业文件,因此程序使用当前本地时间和毫秒数生成 16 位作业名称。 ```cpp /** * @brief 使用当前本地时间生成本次 Demo 的唯一作业名称。 * @return 由 16 个字母或数字字符组成的作业名称。 */ std::string make_unique_job_name() { const auto now = std::chrono::system_clock::now(); const std::time_t now_time = std::chrono::system_clock::to_time_t(now); std::tm local_time{}; localtime_s(&local_time, &now_time); const auto milliseconds = std::chrono::duration_cast( now.time_since_epoch()) % 1000; std::ostringstream name; name << "J" << std::put_time(&local_time, "%y%m%d%H%M%S") << std::setw(3) << std::setfill('0') << milliseconds.count(); return name.str(); } ``` 例如,生成的名称格式类似 `J260804143012123`,控制器中对应的文件为 `J260804143012123.JBR`。 ## 4、封装作业状态等待函数 作业运行、暂停、继续和停止接口返回成功,只表示控制命令已经被控制器接受,不代表状态已经立即切换。程序需要持续查询机器人运行状态,并在运行或暂停时确认当前活动文件确实是预期作业。 `wait_for_job_state` 封装了状态轮询、活动作业身份确认、未知状态处理和超时退出。这样每个生命周期操作都可以使用同一套确认规则,避免刚发送命令就直接假定状态切换成功。 ```cpp /** * @brief 等待指定作业进入预期运行状态。 * @param[in] fd 控制器连接句柄。 * @param[in] job_name 预期活动作业名称。 * @param[in] expected_state 需要等待的机器人运行状态码。 * @param[in] expected_description 预期状态说明,用于输出处理结果。 * @param[in] timeout 本次等待允许占用的最长时间。 * @retval true 已确认预期状态;运行或暂停时也已确认活动作业名称。 * @retval false 查询失败、活动作业不一致、状态异常或等待超时。 */ bool wait_for_job_state( SOCKETFD fd, const std::string& job_name, int expected_state, const std::string& expected_description, std::chrono::seconds timeout = std::chrono::seconds(STATE_CHANGE_TIMEOUT_SECONDS)) { using clock = std::chrono::steady_clock; const auto deadline = clock::now() + timeout; while (clock::now() < deadline) { int running_state = 0; if (!query_running_state(fd, running_state)) { return false; } if (running_state == expected_state) { if (expected_state == 1 || expected_state == 2) { std::string current_job; if (!query_current_job(fd, current_job)) { return false; } if (!is_expected_job(current_job, job_name)) { std::cerr << "当前活动作业不是预期文件,预期:" << job_name << ",实际:" << current_job << std::endl; return false; } } std::cout << "已确认作业文件" << expected_description << std::endl; return true; } if (expected_state == 1 && running_state == 0) { std::cerr << "作业已停止,未检测到暂停状态" << std::endl; return false; } if (running_state < 0 || running_state > 2) { std::cerr << "控制器返回未知运行状态:" << running_state << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } std::cerr << "等待作业文件" << expected_description << "超时" << std::endl; return false; } ``` 运行状态码在本 Demo 中的含义为:状态 0 表示停止,状态 1 表示暂停,状态 2 表示运行。 第二次执行作业时,程序需要区分“尚未开始”与“运行后自然停止”。`wait_for_job_completion` 只有先观察到预期作业进入运行状态,再观察到停止状态时,才判定作业自然完成。 ```cpp bool wait_for_job_completion( SOCKETFD fd, const std::string& job_name, std::chrono::seconds timeout = std::chrono::seconds(JOB_COMPLETE_TIMEOUT_SECONDS)) { using clock = std::chrono::steady_clock; const auto deadline = clock::now() + timeout; bool running_observed = false; bool pause_reported = false; while (clock::now() < deadline) { int running_state = 0; if (!query_running_state(fd, running_state)) { return false; } switch (running_state) { case 2: { std::string current_job; if (!query_current_job(fd, current_job)) { return false; } if (!is_expected_job(current_job, job_name)) { std::cerr << "检测到其他作业正在运行,预期:" << job_name << ",实际:" << current_job << std::endl; return false; } running_observed = true; pause_reported = false; break; } case 1: if (!pause_reported) { std::cout << "作业处于暂停状态,继续等待完成" << std::endl; pause_reported = true; } break; case 0: if (running_observed) { std::cout << "已检测到作业文件运行完成" << std::endl; return true; } break; default: std::cerr << "控制器返回未知运行状态:" << running_state << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } std::cerr << "等待作业文件运行完成超时" << std::endl; return false; } ``` ## 5、封装运行模式准备函数 执行作业前,控制器必须处于运行模式。`prepare_run_mode` 先保存进入 Demo 前的原始模式,再在需要时切换到模式 2,并重新查询确认切换结果。 ```cpp bool prepare_run_mode(SOCKETFD fd, int& original_mode) { if (!query_current_mode(fd, original_mode)) { return false; } if (original_mode < 0 || original_mode > 2) { std::cerr << "控制器返回未知模式:" << original_mode << std::endl; return false; } if (original_mode == 2) { std::cout << "控制器已处于运行模式" << std::endl; return true; } if (!check_sdk_result(set_current_mode(fd, 2), "切换到运行模式")) { return false; } int confirmed_mode = -1; if (!query_current_mode(fd, confirmed_mode)) { return false; } if (confirmed_mode != 2) { std::cerr << "运行模式确认失败,当前模式:" << confirmed_mode << std::endl; return false; } std::cout << "已切换到运行模式" << std::endl; return true; } ``` ## 6、新建作业并写入延时指令 `create_and_write_job` 依次完成新建、打开、身份确认和指令写入。打开作业后再次查询当前活动文件,可以防止后续指令被写入错误的作业。 ```cpp bool create_and_write_job(SOCKETFD fd, const std::string& job_name) { if (!check_sdk_result(job_create(fd, job_name), "新建作业文件")) { return false; } std::cout << "已新建作业文件:" << job_name << ".JBR" << std::endl; if (!check_sdk_result(job_open(fd, job_name), "打开作业文件")) { return false; } std::string current_job; if (!query_current_job(fd, current_job)) { return false; } if (!is_expected_job(current_job, job_name)) { std::cerr << "打开的作业文件与预期不一致,预期:" << job_name << ",实际:" << current_job << std::endl; return false; } // 新建文件确定为空,直接从第 1 行写入,并检查每次插入接口的返回值。 for (int index = 0; index < TIMER_COMMAND_COUNT; ++index) { const int insert_line = index + 1; if (!check_sdk_result( job_insert_timer_command(fd, insert_line, TIMER_COMMAND_SECONDS), "写入第 " + std::to_string(index + 1) + " 条延时指令")) { return false; } } std::cout << "作业内容写入完成,共写入 " << TIMER_COMMAND_COUNT << " 条延时指令" << std::endl; return true; } ``` 部分控制器固件对刚创建的空作业调用总行数或逐行读取接口时,可能主动断开 SDK 连接。因此本示例明确知道新文件为空,直接从第 1 行开始插入,并通过每次写入接口的返回值确认结果。 ## 7、封装两次作业执行流程 第一次执行用于验证完整控制生命周期:启动作业、确认运行、暂停、确认暂停、继续、确认恢复运行,最后主动停止并确认停止状态。 ```cpp bool run_pause_continue_stop_lifecycle( SOCKETFD fd, const std::string& job_name) { std::cout << "\n开始第一次执行:验证运行、暂停、继续和停止" << std::endl; if (!check_sdk_result(job_run(fd, job_name), "执行作业文件")) return false; if (!wait_for_job_state(fd, job_name, 2, "正在运行")) return false; std::this_thread::sleep_for( std::chrono::milliseconds(CONTROL_ACTION_DELAY_MS)); if (!check_sdk_result(job_pause(fd), "暂停作业文件")) return false; if (!wait_for_job_state(fd, job_name, 1, "已暂停")) return false; std::this_thread::sleep_for(std::chrono::milliseconds(PAUSE_HOLD_MS)); if (!check_sdk_result(job_continue(fd), "继续运行作业文件")) return false; if (!wait_for_job_state(fd, job_name, 2, "已继续运行")) return false; std::this_thread::sleep_for( std::chrono::milliseconds(CONTROL_ACTION_DELAY_MS)); if (!check_sdk_result(job_stop(fd), "停止作业文件")) return false; if (!wait_for_job_state(fd, job_name, 0, "已停止")) return false; std::cout << "第一次执行已主动停止,本次不判定为自然完成" << std::endl; return true; } ``` 第二次执行不再主动暂停或停止,而是等待作业从运行状态自然切换到停止状态。 ```cpp bool run_to_natural_completion(SOCKETFD fd, const std::string& job_name) { std::cout << "\n开始第二次执行:等待作业自然完成" << std::endl; if (!check_sdk_result(job_run(fd, job_name), "重新执行作业文件")) { return false; } if (!wait_for_job_state(fd, job_name, 2, "正在运行")) { return false; } return wait_for_job_completion(fd, job_name); } ``` ## 8、封装异常安全停止函数 流程中任一步骤失败时,作业可能仍处于运行或暂停状态。`stop_job_if_active` 会先查询当前状态,只有检测到活动作业时才发送停止命令,并等待状态变为 0。 ```cpp bool stop_job_if_active(SOCKETFD fd) { int running_state = 0; if (!query_running_state(fd, running_state)) { return false; } if (running_state == 0) { return true; } std::cerr << "检测到作业仍处于运行或暂停状态,正在执行安全停止" << std::endl; if (!check_sdk_result(job_stop(fd), "异常清理:停止作业文件")) { return false; } return wait_for_job_state(fd, "", 0, "已安全停止"); } ``` 停止状态不需要检查活动作业名称,因此异常清理时可以传入空名称并等待状态 0。 ## 9、封装完整 Demo 业务流程 `run_demo` 将前置检查、模式准备、作业创建、两次执行、失败清理和模式恢复组织成完整流程。 ```cpp bool run_demo(SOCKETFD fd) { int initial_running_state = 0; if (!query_running_state(fd, initial_running_state)) return false; if (initial_running_state != 0) { std::string current_job; if (query_current_job(fd, current_job)) { std::cerr << "控制器当前已有作业运行或暂停:" << current_job << std::endl; } std::cerr << "为避免干扰现有任务,本示例不会创建或执行新作业" << std::endl; return false; } int servo_state = 0; if (!query_servo_state(fd, servo_state)) return false; if (servo_state != 3) { std::cerr << "伺服未处于运行状态,当前状态:" << servo_state << std::endl; std::cerr << "请先完成上电流程" << std::endl; return false; } int original_mode = -1; if (!prepare_run_mode(fd, original_mode)) return false; const std::string job_name = make_unique_job_name(); bool success = create_and_write_job(fd, job_name); if (success) success = check_sdk_result(job_run_times(fd, 1), "设置作业运行次数为1次"); if (success) success = run_pause_continue_stop_lifecycle(fd, job_name); if (success) success = run_to_natural_completion(fd, job_name); if (!success) { stop_job_if_active(fd); } if (original_mode != 2) { if (!check_sdk_result( set_current_mode(fd, original_mode), "恢复控制器原始模式")) { success = false; } } if (success) { std::cout << "\nDemo执行成功,作业文件保留在控制器中:" << job_name << ".JBR" << std::endl; } return success; } ``` 前置检查会拒绝以下情况: - 当前已有作业运行或暂停,避免干扰现有任务 - 伺服状态不是 3,提示先完成上电流程 - 控制器返回未知模式或无法切换到运行模式 如果作业流程失败,程序会尝试停止仍处于活动状态的作业。无论业务结果如何,只要原始模式不是运行模式,程序都会尝试恢复进入 Demo 前的控制器模式。 ## 10、主程序连接控制器并执行完整流程 主函数在 Windows 平台启用 UTF-8 控制台输入和输出,然后连接控制器并调用 `run_demo`。业务成功时返回 0,连接或流程执行失败时返回 1。 ```cpp #include #include #include #include #include #include #include #include #include #include #include "../demo_utils.h" /** * @brief Demo 程序入口:连接控制器并执行完整作业生命周期示例。 * @return Demo 成功时返回 0;连接或执行失败时返回 1。 */ int main() { demo::enable_console_utf8(); const SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= 0) { std::cerr << "控制器连接失败" << std::endl; return 1; } std::cout << "控制器连接成功" << std::endl; const bool success = run_demo(fd); return success ? 0 : 1; } ``` 程序执行成功后,新建的 `.JBR` 作业文件会保留在控制器中,便于检查文件内容和执行结果。本示例没有删除作业文件,也没有在 `main` 返回前显式调用断开接口;集成到实际项目时,应结合连接管理策略主动调用 `disconnect_robot`,并检查断开结果。 --- # 8. 无作业文件运行 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/08.%E6%97%A0%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6%E8%BF%90%E8%A1%8C.html 本期将介绍如何在不创建、不打开也不执行作业文件的情况下,通过 SDK 直接向机器人下发 MOVJ 运动指令。 程序会先校验本地运动配置,再连接控制器并完成伺服上电、停止状态确认和远程模式切换。目标点通过可达性预检后,程序直接调用 `robot_movej` 下发运动指令,等待运动完成并显示最终关节位置,最后在安全条件满足时恢复控制器原始模式并断开连接。 本 Demo 与作业文件运行方式的主要区别如下: - 不调用 `job_create`、`job_open` 或 `job_run` - 不在控制器中生成 `.JBR` 作业文件 - 运动参数由上位机通过 `MoveCmd` 直接传递给 `robot_movej` - 上位机负责完成上电、模式切换、预检、运动等待和连接清理 ::: danger ⚠️ 安全警告 以下代码会向控制器发送真实 MOVJ 指令,并导致机器人实际运动。执行前必须确认: - **目标点来源:** `MOVJ_TARGET` 必须来自当前机器人实际示教,禁止直接使用源码中的示例坐标控制其他机器人 - **人员安全:** 机器人工作空间和预期路径内无人员、工装干涉或障碍物 - **参数安全:** 速度、加速度和减速度适合当前机器人、负载及调试阶段 - **控制模式:** 控制器允许 SDK 切换到远程模式并直接下发运动指令 - **可达性限制:** 可达性预检只能判断运动学可达,不能代替碰撞、干涉、奇异位形和现场安全检查 - **急停可用:** 急停按钮处于可用状态,并在操作人员可触及范围内 建议先使用全零占位配置并保持确认标志为 `false`,完成仿真、示教和现场安全验证后,再填写真实目标点并启用运行。 ::: ## 1、配置控制器和目标关节点 首先配置控制器 IP 地址和 SDK 服务端口。程序只有连接到正确的控制器,才能安全执行后续上电和运动流程。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 实际控制器的 IP 地址。 const std::string robot_port = "6001"; ///< 实际控制器的 SDK 服务端口,必须与控制器配置一致。 /** @} */ ``` `MOVJ_TARGET` 保存七维关节目标数据,`TARGET_POSITION_CONFIRMED` 是人工安全确认标志。只有目标点来自当前机器人实际示教,并且已经完成路径和现场安全检查后,才能将确认标志设为 `true`。 ```cpp /** * @name 客户需根据本 Demo 修改 * 目标点必须来自当前机器人实际示教;确认点位和现场安全后,才可启用确认标志。 * @{ */ const std::array MOVJ_TARGET = { 31.752, -33.184, 31.453, 5.255, -45.787, 31.997, 0.0 }; ///< MOVJ 实际示教关节目标点。 constexpr bool TARGET_POSITION_CONFIRMED = true; ///< 仅在目标点完成示教和安全确认后设为 true。 /** @} */ ``` 源码中的非零坐标只能视为当前示例环境的数据,不能直接用于其他机器人。未填写真实示教点前,应使用以下安全占位格式: ```cpp const std::array MOVJ_TARGET = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; constexpr bool TARGET_POSITION_CONFIRMED = false; ``` ## 2、配置运动和等待参数 MOVJ 速度、加速度和减速度均使用百分比配置。首次调试应使用较低参数,再根据机器人型号、负载和现场条件逐步调整。 `POSITION_DISPLAY_TOLERANCE` 只用于运动完成后的偏差提示,不参与运动成功或失败判定。 ```cpp /** * @name 建议客户修改 * 首次调试建议使用较低速度和较缓加减速度,并按机器人精度调整位置显示容差。 * @{ */ constexpr double MOVJ_VELOCITY = 10.0; ///< MOVJ 关节运动速度百分比。 constexpr double MOTION_ACCELERATION = 20.0; ///< 运动加速度百分比。 constexpr double MOTION_DECELERATION = 20.0; ///< 运动减速度百分比。 constexpr double POSITION_DISPLAY_TOLERANCE = 0.5; ///< 目标位置与实际位置的显示偏差阈值,单位为度。 /** @} */ ``` 等待参数用于限制伺服上电和运动完成的最长等待时间,同时控制状态轮询频率与通信重试次数。 ```cpp /** * @name 可修改也可保留默认值 * 以下配置控制等待时间、状态轮询和通信容错,默认值适用于一般演示场景。 * @{ */ constexpr int POWER_ON_TIMEOUT_SECONDS = 90; ///< 等待伺服上电完成的总超时时间,单位为秒。 constexpr int MOTION_TIMEOUT_SECONDS = 30; ///< 等待单次运动完成的总超时时间,单位为秒。 constexpr int POLL_INTERVAL_MS = 100; ///< 伺服及运动状态轮询间隔,单位为毫秒。 constexpr int QUERY_RETRY_INTERVAL_MS = 500; ///< 状态查询失败后的重试间隔,单位为毫秒。 constexpr int MAX_QUERY_FAILURES = 3; ///< 状态查询允许的最大连续失败次数。 constexpr int STOPPED_CONFIRMATION_COUNT = 5; ///< 未观察到运行状态时,判定完成所需的连续停止状态次数。 /** @} */ ``` 远程模式和关节坐标类型由 SDK 接口语义决定,通常不应修改: ```cpp constexpr int REMOTE_MODE = 1; ///< SDK 直接控制使用的远程模式。 constexpr int JOINT_COORD = 0; ///< MOVJ 及关节位置查询使用的关节坐标类型。 ``` ## 3、封装 SDK 返回值检查和状态查询重试 程序中的控制接口统一使用 `check_sdk_result` 检查返回值,状态查询则通过 `query_with_retry` 处理短暂通信失败。 ```cpp bool check_sdk_result(Result result, const std::string& operation) { if (result == SUCCESS) { return true; } std::cerr << operation << "失败,错误码:" << static_cast(result) << std::endl; return false; } template bool query_with_retry(const std::string& operation, Query query) { for (int attempt = 1; attempt <= MAX_QUERY_FAILURES; ++attempt) { const Result result = query(); if (result == SUCCESS) { return true; } std::cerr << operation << "失败,第 " << attempt << "/" << MAX_QUERY_FAILURES << " 次,错误码:" << static_cast(result) << std::endl; if (attempt < MAX_QUERY_FAILURES) { std::this_thread::sleep_for( std::chrono::milliseconds(QUERY_RETRY_INTERVAL_MS)); } } std::cerr << operation << "连续失败,停止当前流程" << std::endl; return false; } ``` 伺服状态、机器人运行状态和控制器模式分别使用轻量包装函数查询。这些函数复用相同的重试策略,并为每类查询提供明确的错误提示。 ```cpp bool query_servo_state(SOCKETFD fd, int& state) { return query_with_retry("获取伺服状态", [&]() { return get_servo_state(fd, state); }); } bool query_running_state(SOCKETFD fd, int& state) { return query_with_retry("获取机器人运行状态", [&]() { return get_robot_running_state(fd, state); }); } bool query_current_mode(SOCKETFD fd, int& mode) { return query_with_retry("获取机器人当前模式", [&]() { return get_current_mode(fd, mode); }); } ``` ## 4、封装本地运动配置校验函数 连接控制器和改变伺服状态之前,程序先检查人工确认标志、速度和加减速度范围,以及目标点中是否存在无穷大或非数字值。 ```cpp /** * @brief 校验目标点确认标志、运动参数范围和目标点数值有效性。 * @retval true 本地运动配置通过校验。 * @retval false 目标点未确认、运动参数越界或目标点包含非法数值。 */ bool validate_motion_configuration() { if (!TARGET_POSITION_CONFIRMED) { std::cerr << "目标点尚未确认:请填写实际示教关节点,并将 " << "TARGET_POSITION_CONFIRMED 设置为 true" << std::endl; return false; } if (MOVJ_VELOCITY <= 0.0 || MOVJ_VELOCITY > 100.0) { std::cerr << "MOVJ速度必须位于 (0, 100] 范围内" << std::endl; return false; } if (MOTION_ACCELERATION <= 0.0 || MOTION_ACCELERATION > 100.0 || MOTION_DECELERATION <= 0.0 || MOTION_DECELERATION > 100.0) { std::cerr << "加速度和减速度必须位于 (0, 100] 范围内" << std::endl; return false; } for (double value : MOVJ_TARGET) { if (!std::isfinite(value)) { std::cerr << "目标点包含非法数值" << std::endl; return false; } } return true; } ``` 该函数只验证本地数据格式和参数范围,不能证明目标点属于当前机器人,也不能替代关节限位、可达性和碰撞风险检查。 ## 5、封装伺服上电和状态确认函数 `set_servo_poweron` 调用成功只表示上电命令已发送,不代表伺服已经立即进入状态 3。`wait_until_servo_running` 会持续查询伺服状态,直到确认进入运行状态、检测到报警或未知状态,或者等待超时。 ```cpp bool wait_until_servo_running( SOCKETFD fd, std::chrono::seconds timeout = std::chrono::seconds(POWER_ON_TIMEOUT_SECONDS)) { using clock = std::chrono::steady_clock; const auto deadline = clock::now() + timeout; int last_state = -1; while (clock::now() < deadline) { if (!query_servo_state(fd, last_state)) return false; if (last_state == 3) { std::cout << "伺服上电完成,已进入运行状态" << std::endl; return true; } if (last_state == 2) { std::cerr << "伺服在上电过程中进入报警状态" << std::endl; return false; } if (last_state != 0 && last_state != 1) { std::cerr << "控制器返回未知伺服状态:" << last_state << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } std::cerr << "等待伺服上电超时,最后状态:" << last_state << std::endl; return false; } ``` `power_on` 根据当前伺服状态选择对应的上电路径:状态 0 先切换到就绪再上电,状态 1 直接上电,状态 3 直接返回成功。 ```cpp bool power_on(SOCKETFD fd) { int servo_state = -1; if (!query_servo_state(fd, servo_state)) return false; switch (servo_state) { case 0: if (!check_sdk_result(set_servo_state(fd, 1), "设置伺服为就绪状态")) return false; if (!check_sdk_result(set_servo_poweron(fd), "机器人上电")) return false; break; case 1: if (!check_sdk_result(set_servo_poweron(fd), "机器人上电")) return false; break; case 2: std::cerr << "伺服处于报警状态,请排除故障并确认安全后再运行" << std::endl; return false; case 3: std::cout << "伺服已经处于运行状态,无需重复上电" << std::endl; return true; default: std::cerr << "控制器返回未知伺服状态:" << servo_state << std::endl; return false; } return wait_until_servo_running(fd); } ``` ## 6、封装远程模式切换函数 SDK 直接下发 MOVJ 需要控制器处于远程模式。`switch_to_remote_mode` 先保存原始模式,再在需要时切换到模式 1,并重新查询确认切换结果。 ```cpp bool switch_to_remote_mode(SOCKETFD fd, int& original_mode) { if (!query_current_mode(fd, original_mode)) return false; if (original_mode < 0 || original_mode > 2) { std::cerr << "控制器返回未知模式:" << original_mode << std::endl; return false; } if (original_mode == REMOTE_MODE) { std::cout << "控制器已处于远程模式" << std::endl; return true; } if (!check_sdk_result( set_current_mode(fd, REMOTE_MODE), "切换控制器到远程模式")) return false; int confirmed_mode = -1; if (!query_current_mode(fd, confirmed_mode)) return false; if (confirmed_mode != REMOTE_MODE) { std::cerr << "远程模式确认失败,当前模式:" << confirmed_mode << std::endl; return false; } std::cout << "控制器已切换到远程模式" << std::endl; return true; } ``` ## 7、构造 MOVJ 指令并执行可达性预检 `make_movej_command` 使用已确认的目标点和运动参数填充 `MoveCmd`。单独封装构造过程可以集中维护坐标类型、速度、加减速度、平滑参数及构型等字段,避免主流程遗漏配置。 ```cpp MoveCmd make_movej_command() { MoveCmd command; command.targetPosType = PosType::data; std::copy(MOVJ_TARGET.begin(), MOVJ_TARGET.end(), command.targetPosValue.begin()); command.coord = JOINT_COORD; command.velocity = MOVJ_VELOCITY; command.acc = MOTION_ACCELERATION; command.dec = MOTION_DECELERATION; command.pl = 0; command.toolNum = 0; command.userNum = 0; command.configuration = 0; return command; } ``` 可达性接口需要长度为 14 的位置数据,因此 `make_reachability_position` 将实际 MOVJ 指令转换为接口格式。 ```cpp std::vector make_reachability_position(const MoveCmd& command) { std::vector position(14, 0.0); position[0] = static_cast(command.coord); position[1] = 0.0; // 0 表示目标点使用角度制。 position[2] = static_cast(command.configuration); position[3] = static_cast(command.toolNum); position[4] = static_cast(command.userNum); std::copy_n(command.targetPosValue.begin(), 7, position.begin() + 7); return position; } ``` `precheck_reachability` 统一调用 `get_pos_reachable`、检查 SDK 返回值并解释可达结果。预检失败或目标点不可达时,程序不会发送运动指令。 ```cpp bool precheck_reachability(SOCKETFD fd, const MoveCmd& command) { bool reachable = false; if (!check_sdk_result( get_pos_reachable( fd, make_reachability_position(command), "MOVJ", reachable), "MOVJ目标点可达性预检")) { return false; } if (!reachable) { std::cerr << "MOVJ目标点不可达,已取消运动" << std::endl; return false; } std::cout << "MOVJ目标点可达性预检通过" << std::endl; return true; } ``` 可达性通过只表示目标点在运动学上可达,不能证明实际路径没有碰撞或干涉风险。 ## 8、封装运动完成等待和最终位置显示 `robot_movej` 返回成功只表示运动指令已经下发。`wait_for_motion_complete` 持续查询机器人运行状态,并处理运行、暂停、停止、未知状态和超时。 ```cpp bool wait_for_motion_complete( SOCKETFD fd, std::chrono::seconds timeout = std::chrono::seconds(MOTION_TIMEOUT_SECONDS)) { using clock = std::chrono::steady_clock; const auto deadline = clock::now() + timeout; bool running_observed = false; bool pause_reported = false; int stopped_count = 0; while (clock::now() < deadline) { int running_state = -1; if (!query_running_state(fd, running_state)) return false; switch (running_state) { case 2: running_observed = true; pause_reported = false; stopped_count = 0; break; case 1: stopped_count = 0; if (!pause_reported) { std::cout << "机器人运动已暂停,继续等待恢复" << std::endl; pause_reported = true; } break; case 0: ++stopped_count; if (running_observed || stopped_count >= STOPPED_CONFIRMATION_COUNT) { std::cout << "已确认机器人运动完成" << std::endl; return true; } break; default: std::cerr << "控制器返回未知运行状态:" << running_state << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } std::cerr << "等待机器人运动完成超时,请立即确认机器人状态,必要时按下急停" << std::endl; return false; } ``` 运动完成后,`show_final_position` 查询当前关节位置并逐轴显示。单独封装该函数可以统一检查返回容器长度和位置偏差,避免读取不完整数据。 ```cpp bool show_final_position(SOCKETFD fd) { std::vector current_position; if (!query_with_retry("获取运动完成后的关节位置", [&]() { return get_current_position(fd, JOINT_COORD, current_position); })) { return false; } if (current_position.size() < MOVJ_TARGET.size()) { std::cerr << "控制器返回的关节位置长度不足,实际长度:" << current_position.size() << std::endl; return false; } bool within_tolerance = true; std::cout << "运动完成后的关节位置:"; for (std::size_t index = 0; index < MOVJ_TARGET.size(); ++index) { if (index != 0) std::cout << ", "; std::cout << current_position[index]; if (std::fabs(current_position[index] - MOVJ_TARGET[index]) > POSITION_DISPLAY_TOLERANCE) { within_tolerance = false; } } std::cout << std::endl; if (!within_tolerance) { std::cout << "提示:实际关节位置与目标值存在超过 " << POSITION_DISPLAY_TOLERANCE << " 度的偏差,请结合机器人精度和轴数量检查" << std::endl; } return true; } ``` 偏差超过阈值只输出提示,不会将本次位置查询判定为失败。该阈值不是控制器到位判定参数。 ## 9、封装无作业文件运动主流程 `run_demo` 负责组织全部控制步骤,并在每个关键节点执行安全确认: 1. 根据当前伺服状态完成上电。 2. 确认机器人当前处于停止状态,避免干扰已有运动。 3. 保存原模式并切换到远程模式。 4. 构造 MOVJ 指令并执行可达性预检。 5. 通过 `robot_movej` 直接下发运动,不创建作业文件。 6. 等待运动完成并显示最终关节位置。 7. 再次查询运行状态,只有确认停止时才恢复原模式。 ```cpp bool run_demo(SOCKETFD fd) { if (!power_on(fd)) { std::cerr << "机器人上电失败,不会下发运动指令" << std::endl; return false; } int running_state = -1; if (!query_running_state(fd, running_state)) return false; if (running_state != 0) { std::cerr << "机器人当前不是停止状态,运行状态码:" << running_state << std::endl; std::cerr << "为避免干扰现有运动,本示例不会下发新指令" << std::endl; return false; } int original_mode = -1; if (!switch_to_remote_mode(fd, original_mode)) return false; bool success = true; const MoveCmd command = make_movej_command(); if (!precheck_reachability(fd, command)) { success = false; } else if (!check_sdk_result( robot_movej(fd, command), "直接下发MOVJ运动指令")) { success = false; } else { std::cout << "MOVJ指令已通过SDK直接下发,未创建或使用作业文件" << std::endl; success = wait_for_motion_complete(fd); if (success) { success = show_final_position(fd); } } int final_running_state = -1; if (!query_running_state(fd, final_running_state)) { success = false; } else if (final_running_state == 0 && original_mode != REMOTE_MODE) { if (!check_sdk_result( set_current_mode(fd, original_mode), "恢复控制器原始模式")) { success = false; } } else if (final_running_state != 0) { std::cerr << "机器人仍可能处于运动或暂停状态,未自动切换控制器模式" << std::endl; success = false; } return success; } ``` 当最终运行状态不确定,或者机器人仍在运行或暂停时,程序不会自动切换控制器模式,而是保留远程模式并返回失败,提示操作人员先确认机器人实际状态。 ## 10、主程序校验配置、连接并断开控制器 主函数在连接控制器之前调用 `validate_motion_configuration`,避免无效配置改变真实控制器状态。连接成功后执行无作业运动流程,无论运动流程成功还是失败,最后都会调用 `disconnect_robot` 并检查断开结果。 ```cpp #include #include #include #include #include #include #include #include #include #include "../demo_utils.h" /** * @brief Demo 程序入口:校验配置、连接控制器并执行无作业文件的 MOVJ 运动。 * @return Demo 成功且连接正常断开时返回 0,否则返回 1。 */ int main() { demo::enable_console_utf8(); // 在建立连接和上电前验证本地配置,避免使用占位点位改变控制器状态。 if (!validate_motion_configuration()) { return 1; } const SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= 0) { std::cerr << "控制器连接失败" << std::endl; return 1; } std::cout << "控制器连接成功" << std::endl; bool success = run_demo(fd); if (!check_sdk_result(disconnect_robot(fd), "断开控制器连接")) { success = false; } else { std::cout << "控制器连接已断开" << std::endl; } return success ? 0 : 1; } ``` --- # 9. 追加队列模式(单机器人) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/09.%E8%BF%BD%E5%8A%A0%E9%98%9F%E5%88%97%E6%A8%A1%E5%BC%8F%EF%BC%88%E5%8D%95%E6%9C%BA%E5%99%A8%E4%BA%BA%EF%BC%89.html 本期将介绍如何在单机器人场景下开启追加队列模式、向本地队列追加指令、将队列发送到控制器执行,并在确认全部指令完成后安全关闭队列模式。 当前 Demo 只向队列中追加延时指令和运动指令,程序会同时监控队列模式开关、控制器剩余队列长度和机器人运行状态,避免仅依赖单一状态判断队列是否完成。 完整流程如下: 1. 确认伺服已经进入状态 3,机器人当前处于停止状态。 2. 保存控制器原始模式,并在需要时切换到远程模式。 3. 开启追加队列模式,同时确认控制器已进入队列模式。 4. 向本地队列追加配置数量的延时指令和运动指令。 5. 将全部本地队列发送到控制器并立即执行。 6. 轮询队列模式、剩余指令数和机器人运行状态,确认队列执行完成。 7. 关闭追加队列模式,并在安全条件满足时恢复控制器原始模式。 8. 发生异常时优先使用不下电停止接口终止队列,再关闭队列模式。 ::: danger ⚠️ 安全警告 运行前必须确认: - **队列占用:** 控制器当前没有其他队列任务、运动任务或暂停任务 - **清空风险:** 开启或关闭追加队列模式都会清空控制器中的已有队列 - **伺服状态:** 伺服已经上电并进入状态 3 - **控制器模式:** 控制器允许切换到远程模式并执行追加队列 - **异常停止:** 队列状态异常时,应优先确认机器人状态,再执行不下电停止 - **运动扩展:** 使用MOVJ 或 MOVL运动指令时,必须使用真实示教点,并完成路径和现场安全检查 不要在生产队列仍然存在或机器人正在执行其他任务时运行本 Demo,否则开启队列模式可能清空或干扰现有任务。 ::: ## 1、配置控制器和队列参数 首先配置控制器 IP 地址和 SDK 服务端口,运行前必须确认程序连接的是预期控制器。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 实际控制器的 IP 地址。 const std::string robot_port = "6001"; ///< 实际控制器的 SDK 服务端口,必须与控制器配置一致。 /** @} */ ``` 示例默认追加 3 条延时 2 秒的指令,预计总执行时间约为 6 秒。修改指令数量或持续时间后,需要同步确认队列完成等待超时时间。 ```cpp /** * @name 客户需根据本 Demo 修改 * 以下配置决定队列中的延时指令内容及完成等待时间;修改队列内容时必须同步确认超时时间。 * @{ */ constexpr int TIMER_COMMAND_COUNT = 3; ///< 追加到本地队列的延时指令数量。 constexpr double TIMER_COMMAND_SECONDS = 2.0; ///< 每条延时指令的持续时间,单位为秒。 constexpr int QUEUE_COMPLETE_TIMEOUT_SECONDS = 30; ///< 等待追加队列执行完成的总超时时间,单位为秒。 /** @} */ ``` 状态切换、轮询和通信重试参数应结合控制器响应速度进行设置。 ```cpp constexpr int QUEUE_STATE_TIMEOUT_SECONDS = 10; ///< 等待队列模式切换或安全停止的总超时时间,单位为秒。 constexpr int POLL_INTERVAL_MS = 200; ///< 队列模式及执行状态轮询间隔,单位为毫秒。 constexpr int QUERY_RETRY_INTERVAL_MS = 500; ///< 状态查询失败后的重试间隔,单位为毫秒。 constexpr int MAX_QUERY_FAILURES = 3; ///< 状态查询允许的最大连续失败次数。 constexpr int STOPPED_CONFIRMATION_COUNT = 5; ///< 未观察到执行状态时,判定完成所需的连续停止状态次数。 constexpr int REMOTE_MODE = 1; ///< 追加队列直接控制使用的远程模式。 ``` ## 2、定义队列状态快照 判断队列是否完成需要同时观察多个状态。程序使用 `QueueSnapshot` 保存一次采样得到的队列模式、剩余指令数量和机器人运行状态。 ```cpp /** * @brief 一次队列状态采样结果。 */ struct QueueSnapshot { bool queue_mode_open = false; ///< 追加队列模式是否开启。 int remaining_commands = 0; ///< 控制器中尚未完成的队列指令数量。 int robot_running_state = 0; ///< 当前机器人运行状态码。 }; ``` ## 3、封装 SDK 返回值检查和查询重试 普通控制接口使用 `check_sdk_result` 统一检查返回值;状态查询使用 `query_with_retry` 处理短暂通信失败。查询返回 `DISCONNECT` 时会立即停止重试,因为同一连接句柄已经无法继续使用。 ```cpp bool check_sdk_result(Result result, const std::string& operation) { if (result == SUCCESS) { return true; } std::cerr << operation << "失败,错误码:" << static_cast(result) << std::endl; return false; } template bool query_with_retry(const std::string& operation, Query query) { for (int attempt = 1; attempt <= MAX_QUERY_FAILURES; ++attempt) { const Result result = query(); if (result == SUCCESS) { return true; } std::cerr << operation << "失败,第 " << attempt << "/" << MAX_QUERY_FAILURES << " 次,错误码:" << static_cast(result) << std::endl; if (result == DISCONNECT) { std::cerr << "控制器连接已经断开,停止重试" << std::endl; return false; } if (attempt < MAX_QUERY_FAILURES) { std::this_thread::sleep_for( std::chrono::milliseconds(QUERY_RETRY_INTERVAL_MS)); } } std::cerr << operation << "连续失败,停止当前流程" << std::endl; return false; } ``` 伺服状态、机器人运行状态、控制器模式、队列模式和剩余队列长度分别使用轻量包装函数查询。这些函数复用同一套重试策略,并提供明确的查询名称。 ```cpp bool query_servo_state(SOCKETFD fd, int& state) { return query_with_retry("获取伺服状态", [&]() { return get_servo_state(fd, state); }); } bool query_running_state(SOCKETFD fd, int& state) { return query_with_retry("获取机器人运行状态", [&]() { return get_robot_running_state(fd, state); }); } bool query_current_mode(SOCKETFD fd, int& mode) { return query_with_retry("获取机器人当前模式", [&]() { return get_current_mode(fd, mode); }); } bool query_queue_mode(SOCKETFD fd, bool& status) { return query_with_retry("获取追加队列模式状态", [&]() { return queue_motion_get_status(fd, status); }); } bool query_queue_remaining(SOCKETFD fd, int& remaining_commands) { return query_with_retry("获取控制器剩余队列长度", [&]() { return queue_motion_get_queuelen(fd, remaining_commands); }); } ``` ## 4、封装完整队列状态采样函数 `read_queue_snapshot` 依次读取队列模式、剩余指令数量和机器人运行状态,并检查剩余数量是否为负数、运行状态是否位于 0~2 范围内。 ```cpp bool read_queue_snapshot(SOCKETFD fd, QueueSnapshot& snapshot) { if (!query_queue_mode(fd, snapshot.queue_mode_open)) return false; if (!query_queue_remaining(fd, snapshot.remaining_commands)) return false; if (!query_running_state(fd, snapshot.robot_running_state)) return false; if (snapshot.remaining_commands < 0) { std::cerr << "控制器返回非法剩余队列长度:" << snapshot.remaining_commands << std::endl; return false; } if (snapshot.robot_running_state < 0 || snapshot.robot_running_state > 2) { std::cerr << "控制器返回未知运行状态:" << snapshot.robot_running_state << std::endl; return false; } return true; } ``` 运行状态码在本 Demo 中的含义为:状态 0 表示停止,状态 1 表示暂停,状态 2 表示运行。 ## 5、封装远程模式准备函数 追加队列直接控制要求控制器处于远程模式。`prepare_remote_mode` 保存原始模式,在需要时切换到模式 1,并重新查询确认切换结果。 ```cpp bool prepare_remote_mode(SOCKETFD fd, int& original_mode) { if (!query_current_mode(fd, original_mode)) return false; if (original_mode < 0 || original_mode > 2) { std::cerr << "控制器返回未知模式:" << original_mode << std::endl; return false; } if (original_mode == REMOTE_MODE) { std::cout << "控制器已处于远程模式" << std::endl; return true; } if (!check_sdk_result( set_current_mode(fd, REMOTE_MODE), "切换控制器到远程模式")) return false; int confirmed_mode = -1; if (!query_current_mode(fd, confirmed_mode)) return false; if (confirmed_mode != REMOTE_MODE) { std::cerr << "远程模式确认失败,当前模式:" << confirmed_mode << std::endl; return false; } std::cout << "控制器已切换到远程模式" << std::endl; return true; } ``` ## 6、开启并确认追加队列模式 `queue_motion_set_status(fd, true)` 会开启追加队列模式,同时清空控制器中的已有队列。接口返回成功后,还需要持续查询队列模式状态,确认控制器已经真正完成切换。 `wait_for_queue_mode` 单独封装队列模式轮询和超时;`start_append_queue` 则负责发送开启命令并调用等待函数确认结果。这样可以区分“命令发送成功”和“模式已经生效”两个阶段。 ```cpp bool wait_for_queue_mode( SOCKETFD fd, bool expected_status, std::chrono::seconds timeout = std::chrono::seconds(QUEUE_STATE_TIMEOUT_SECONDS)) { using clock = std::chrono::steady_clock; const auto deadline = clock::now() + timeout; while (clock::now() < deadline) { bool current_status = false; if (!query_queue_mode(fd, current_status)) return false; if (current_status == expected_status) { std::cout << "追加队列模式已" << (expected_status ? "开始" : "结束") << std::endl; return true; } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } std::cerr << "等待追加队列模式" << (expected_status ? "开始" : "结束") << "超时" << std::endl; return false; } bool start_append_queue(SOCKETFD fd) { if (!check_sdk_result( queue_motion_set_status(fd, true), "开始追加队列模式")) { return false; } return wait_for_queue_mode(fd, true); } ``` ## 7、追加队列指令 `append_relative_movej` 按运动配置调用 `queue_motion_push_back_moveJ`,将MoveJ运动指令追加到上位机本地队列。 ```cpp /** * @brief 向本地追加队列写入基于当前关节位置的相对 MoveJ 指令 * @param[in] fd 控制器连接句柄 * @retval true 运动指令追加成功 * @retval false 指令追加失败 * * @details 查询当前关节坐标后,将关节 1 增加 10° 作为目标位置。 * @warning 本函数会生成实际运动;调用前必须确认目标点可达、无碰撞且现场安全。 */ bool append_relative_movej(SOCKETFD fd) { /// @brief 保存待追加的关节运动参数。 MoveCmd movej; movej.coord = 0; ///< 使用关节坐标系。 /// @brief 指定目标位置由数值数组直接提供。 movej.targetPosType = PosType::data; /// @brief 读取当前关节位置,作为相对运动的安全起点。 if (!check_sdk_result(get_current_position(fd, 0, movej.targetPosValue), "获取当前的关节坐标")) { return false; } movej.targetPosValue[0] += 10; ///< 关节 1 相对当前位置向正方向移动 10°。 movej.velocity = 50; ///< 关节速度百分比,取值范围为 [1, 100]。 movej.acc = 50; ///< 关节运动加速度百分比。 movej.dec = 50; ///< 关节运动减速度百分比。 movej.pl = 5; ///< 轨迹平滑系数。 /// @brief 将已完成参数设置的 MoveJ 指令写入本地追加队列。 std::cout << "正在追加关节运动指令" << std::endl; return check_sdk_result(queue_motion_push_back_moveJ(fd, movej), "追加MoveJ运动指令"); } ``` `append_relative_moveL` 按运动配置调用 `queue_motion_push_back_moveL`,将MoveL运动指令追加到上位机本地队列。 ```cpp /** * @brief 向本地追加队列写入基于当前直角坐标的相对 MoveL 指令 * @param[in] fd 控制器连接句柄 * @retval true 运动指令追加成功 * @retval false 指令追加失败 * * @details 查询当前直角坐标后,将 X 轴增加 10 mm 作为目标位置。 * @warning 本函数会生成实际运动;调用前必须确认目标点可达、无碰撞且现场安全。 */ bool append_relative_moveL(SOCKETFD fd) { /// @brief 保存待追加的直线运动参数。 MoveCmd moveL; moveL.coord = 1; ///< 使用直角坐标系。 /// @brief 指定目标位置由数值数组直接提供。 moveL.targetPosType = PosType::data; /// @brief 读取当前直角坐标,作为相对运动的安全起点。 if (!check_sdk_result(get_current_position(fd, 1, moveL.targetPosValue), "获取当前的直角坐标")) { return false; } moveL.targetPosValue[0] += 10; ///< X 轴相对当前位置向正方向移动 10 mm。 moveL.velocity = 500; ///< 直线速度,取值范围为 [1, 1000] mm/s。 moveL.acc = 50; ///< 直线运动加速度百分比。 moveL.dec = 50; ///< 直线运动减速度百分比。 moveL.pl = 5; ///< 轨迹平滑系数。 /// @brief 将已完成参数设置的 MoveL 指令写入本地追加队列。 std::cout << "正在追加直线运动指令" << std::endl; return check_sdk_result(queue_motion_push_back_moveL(fd, moveL), "追加MoveL运动指令"); } ``` `append_timer_commands` 按配置数量循环调用 `queue_motion_push_back_timer`,将延时指令追加到上位机本地队列。任一指令追加失败时立即停止,避免发送内容不完整的队列。 ```cpp /** * @brief 向本地追加队列写入配置数量的延时指令 * @param[in] fd 控制器连接句柄 * @retval true 全部延时指令均追加成功 * @retval false 任一延时指令追加失败 */ bool append_timer_commands(SOCKETFD fd) { for (int index = 0; index < TIMER_COMMAND_COUNT; ++index) { if (!check_sdk_result( queue_motion_push_back_timer(fd, TIMER_COMMAND_SECONDS), "追加第 " + std::to_string(index + 1) + " 条延时指令")) { return false; } } std::cout << "正在追加延时指令" << std::endl; return true; } ``` ## 8、发送队列指令 `execute_append_queue` 将本地队列发送到控制器。`size = 0` 表示发送本地队列中的全部指令,`isContinue = false` 表示发送后立即执行。 ```cpp bool execute_append_queue(SOCKETFD fd) { if (!check_sdk_result( queue_motion_send_to_controller(fd, 0, false), "发送并执行追加队列")) { return false; } std::cout << "追加队列已经发送到控制器" << std::endl; return true; } ``` ## 9、封装队列完成等待函数 仅检测剩余指令数为 0,可能会把“队列尚未开始”误判为“队列已经完成”。`wait_for_queue_completion` 同时检查以下条件: - 追加队列模式在执行期间始终保持开启 - 机器人曾进入运行状态,或剩余指令数曾大于 0 - 最终剩余指令数为 0,机器人运行状态为 0 - 未观察到执行状态时,连续多次确认停止状态 - 配置的延时指令预计总时长已经过去 ```cpp bool wait_for_queue_completion( SOCKETFD fd, std::chrono::seconds timeout = std::chrono::seconds(QUEUE_COMPLETE_TIMEOUT_SECONDS)) { using clock = std::chrono::steady_clock; const auto start_time = clock::now(); const auto deadline = start_time + timeout; const auto earliest_completion = start_time + std::chrono::milliseconds( static_cast( TIMER_COMMAND_COUNT * TIMER_COMMAND_SECONDS * 1000.0) - POLL_INTERVAL_MS); bool execution_observed = false; bool executing_reported = false; bool paused_reported = false; int completed_confirmation_count = 0; while (clock::now() < deadline) { QueueSnapshot snapshot; if (!read_queue_snapshot(fd, snapshot)) return false; if (!snapshot.queue_mode_open) { std::cerr << "队列执行期间追加队列模式被关闭" << std::endl; return false; } const bool executing = snapshot.robot_running_state == 2 || snapshot.remaining_commands > 0; if (executing) { execution_observed = true; completed_confirmation_count = 0; if (!executing_reported) { std::cout << "已检测到追加队列正在执行,剩余指令数:" << snapshot.remaining_commands << std::endl; executing_reported = true; } } if (snapshot.robot_running_state == 1) { completed_confirmation_count = 0; if (!paused_reported) { std::cout << "追加队列当前处于暂停状态" << std::endl; paused_reported = true; } } else { paused_reported = false; } if (snapshot.remaining_commands == 0 && snapshot.robot_running_state == 0) { ++completed_confirmation_count; const bool execution_state_confirmed = execution_observed || completed_confirmation_count >= STOPPED_CONFIRMATION_COUNT; const bool expected_duration_elapsed = clock::now() >= earliest_completion; if (execution_state_confirmed && expected_duration_elapsed) { std::cout << "已检测到追加队列执行完成" << std::endl; return true; } } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } std::cerr << "等待追加队列执行完成超时" << std::endl; return false; } ``` ## 10、关闭队列模式和异常安全停止 正常完成后,`end_append_queue` 调用 `queue_motion_set_status(fd, false)` 关闭追加队列模式,并等待状态确认。关闭队列模式同样会清空队列,因此只能在确认执行完成或安全停止后调用。 ```cpp bool end_append_queue(SOCKETFD fd) { if (!check_sdk_result( queue_motion_set_status(fd, false), "结束追加队列模式")) { return false; } return wait_for_queue_mode(fd, false); } ``` 流程失败时,`stop_queue_if_active` 会先查询机器人状态。检测到运行或暂停时,调用 `queue_motion_stop_not_power_off` 执行不下电停止,并等待机器人进入状态 0;之后检查并关闭仍然开启的队列模式。 ```cpp bool stop_queue_if_active(SOCKETFD fd) { int running_state = 0; if (!query_running_state(fd, running_state)) return false; if (running_state != 0) { std::cerr << "检测到队列仍在执行或暂停,正在执行不下电停止" << std::endl; if (!check_sdk_result( queue_motion_stop_not_power_off(fd), "异常清理:停止追加队列")) { return false; } using clock = std::chrono::steady_clock; const auto deadline = clock::now() + std::chrono::seconds(QUEUE_STATE_TIMEOUT_SECONDS); while (clock::now() < deadline) { if (!query_running_state(fd, running_state)) return false; if (running_state == 0) break; std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } if (running_state != 0) { std::cerr << "停止追加队列超时" << std::endl; return false; } } bool queue_mode_open = false; if (!query_queue_mode(fd, queue_mode_open)) return false; if (queue_mode_open) return end_append_queue(fd); return true; } ``` 不下电停止只用于终止队列执行,不代表已经排除导致异常的根本原因。清理完成后仍需检查控制器状态和现场环境。 ## 11、封装单机器人队列完整流程 `run_demo` 负责组织全部生命周期,并执行以下前置检查: - 伺服状态必须为 3 - 机器人运行状态必须为 0 - 控制器模式必须有效并能够切换到远程模式 通过检查后,程序依次开启队列、追加指令、发送执行、等待完成并关闭队列。任一步骤失败时调用异常安全停止函数;结束前只有确认机器人停止,才会恢复控制器原始模式。 ```cpp bool run_demo(SOCKETFD fd) { int servo_state = 0; if (!query_servo_state(fd, servo_state)) { return false; } if (servo_state != 3) { std::cerr << "伺服未处于运行状态,当前状态:" << servo_state << std::endl; std::cerr << "请先完成上电流程" << std::endl; return false; } int initial_running_state = 0; if (!query_running_state(fd, initial_running_state)) { return false; } if (initial_running_state != 0) { std::cerr << "机器人当前已有运动或暂停任务,状态码:" << initial_running_state << std::endl; std::cerr << "为避免清空或干扰现有队列,本示例停止执行" << std::endl; return false; } int original_mode = -1; if (!prepare_remote_mode(fd, original_mode)) { return false; } bool success = start_append_queue(fd); if (success) { success = append_relative_movej(fd); //调用MoveJ运动指令 } if (success) { success = append_relative_moveL(fd); //调用MoveL运动指令 } if (success) { success = append_timer_commands(fd); //调用延时指令 } if (success) { success = execute_append_queue(fd); } if (success) { success = wait_for_queue_completion(fd); } if (success) { success = end_append_queue(fd); } if (!success) { stop_queue_if_active(fd); } int final_running_state = -1; if (!query_running_state(fd, final_running_state)) { success = false; } else if (final_running_state == 0 && original_mode != REMOTE_MODE) { if (!check_sdk_result( set_current_mode(fd, original_mode), "恢复控制器原始模式")) { success = false; } } else if (final_running_state != 0) { std::cerr << "机器人状态未确认停止,未自动恢复控制器模式" << std::endl; success = false; } } ``` ## 12、主程序连接并执行队列流程 主函数连接控制器后调用 `run_demo`,无论队列流程成功还是失败,最后都会调用 `disconnect_robot` 并检查断开结果。 ```cpp /** * @brief Demo 程序入口:连接控制器并执行单机器人追加队列示例。 * @return Demo 成功且连接正常断开时返回 0,否则返回 1。 */ int main() { demo::enable_console_utf8(); const SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= 0) { std::cerr << "控制器连接失败" << std::endl; return 1; } std::cout << "控制器连接成功" << std::endl; bool success = run_demo(fd); if (!check_sdk_result( disconnect_robot(fd), "断开控制器连接")) { success = false; } else { std::cout << "控制器连接已断开" << std::endl; } return success ? 0 : 1; } ``` --- # 10. 追加队列模式(双机器人) > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/10.%E8%BF%BD%E5%8A%A0%E9%98%9F%E5%88%97%E6%A8%A1%E5%BC%8F%EF%BC%88%E5%8F%8C%E6%9C%BA%E5%99%A8%E4%BA%BA%EF%BC%89.html 本期将介绍如何通过一个 SDK 连接控制同一控制器下的两台机器人,为两台机器人分别准备追加队列,并在两组队列都准备完成后启动执行、联合监控状态和安全清理资源。 当前 Demo 为两台机器人分别追加延时指令和运动指令。两台机器人共用一个连接句柄,但所有机器人级接口都需要传入对应的机器人编号。 完整流程如下: 1. 连接双机器人控制器并开启多机器人并行模式。 2. 分别确认两台机器人空闲,记录各自原始模式并切换到运行模式。 3. 分别确认伺服状态;需要上电时提示操作人员从示教器执行上电。 4. 为两台机器人分别开启追加队列模式并追加指令。 5. 两组队列全部准备完成后,按顺序快速发送两条执行命令。 6. 在同一个轮询循环中分别监控两台机器人的队列状态,直到两组队列都完成。 7. 分别关闭队列、恢复原始模式,最后关闭多机器人并行模式并断开连接。 ::: danger ⚠️ 安全警告 运行前必须确认: - **机器人编号:** `ROBOT_ONE_NUMBER` 和 `ROBOT_TWO_NUMBER` 与控制器中的实际编号一致,且不能相同 - **任务空闲:** 两台机器人都没有其他运动、暂停或队列任务 - **清空风险:** 开启或关闭某台机器人的队列模式都会清空该机器人的已有队列 - **人工上电:** 多机器人并行模式下控制器不接受 SDK 上电命令,需要操作人员在示教器上确认并执行上电 - **协同安全:** 如果延时指令替换为 MOVJ/MOVL,两台机器人的目标点必须分别示教,并完成共享空间干涉和协同路径检查 - **急停可用:** 两台机器人的急停、安全回路和防护装置均处于正常状态 两条执行命令由同一线程按顺序快速发送,不是控制器层面的绝对同步启动。如果业务要求严格同步,需要使用控制器支持的同步机制重新设计流程。 ::: ## 1、配置控制器和机器人编号 两台机器人共用控制器 IP、SDK 端口和连接句柄,但调用机器人级接口时必须传入正确编号。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定 SDK 连接目标及两台机器人的控制器编号,运行前必须核对。 * @{ */ const std::string ROBOT_IP = "192.168.3.243"; ///< 双机器人控制器的实际 IP 地址。 const std::string ROBOT_PORT = "6001"; ///< 实际 SDK 服务端口,必须与控制器配置一致。 constexpr int ROBOT_ONE_NUMBER = 1; ///< 第一台机器人的控制器编号。 constexpr int ROBOT_TWO_NUMBER = 2; ///< 第二台机器人的控制器编号。 /** @} */ ``` 机器人编号配置错误可能导致指令发送给非预期机器人。正式运行前,应在控制器配置和示教器中逐一核对编号。 ## 2、配置队列和状态等待参数 每台机器人默认追加 3 条延时 2 秒的指令,单组队列预计执行约 6 秒。两组队列使用同一个总完成超时时间。 ```cpp constexpr int TIMER_COMMAND_COUNT = 3; ///< 每台机器人追加的延时指令数量。 constexpr double TIMER_COMMAND_SECONDS = 2.0; ///< 每条延时指令的持续时间,单位为秒。 constexpr int QUEUE_COMPLETE_TIMEOUT_SECONDS = 30; ///< 等待两组队列全部完成的总超时时间,单位为秒。 constexpr int SERVO_STATE_TIMEOUT_SECONDS = 90; ///< 等待伺服状态切换及人工上电的总超时时间,单位为秒。 constexpr int QUEUE_STATE_TIMEOUT_SECONDS = 10; ///< 等待队列模式切换或安全停止的总超时时间,单位为秒。 constexpr int POLL_INTERVAL_MS = 500; ///< 伺服及队列状态轮询间隔,单位为毫秒。 constexpr int QUERY_RETRY_INTERVAL_MS = 800; ///< 状态查询失败后的重试间隔,单位为毫秒。 constexpr int MAX_QUERY_FAILURES = 3; ///< 状态查询允许的最大连续失败次数。 constexpr int STOPPED_CONFIRMATION_COUNT = 5; ///< 未观察到执行状态时,判定完成所需的连续停止状态次数。 ``` 修改指令数量或持续时间后,需要同步确认完成超时和最早完成时间是否合理。人工上电时间较长时,还应调整伺服状态等待时间。 SDK 语义常量用于表示运行模式和伺服状态,通常不应修改: ```cpp constexpr int EXECUTION_MODE = 2; ///< 队列执行所需的控制器运行模式。 constexpr int SERVO_STOPPED = 0; ///< 伺服停止状态码。 constexpr int SERVO_READY = 1; ///< 伺服就绪状态码。 constexpr int SERVO_ALARM = 2; ///< 伺服报警状态码。 constexpr int SERVO_RUNNING = 3; ///< 伺服运行状态码。 ``` ## 3、定义单台机器人的运行时状态 双机器人流程需要分别保存两台机器人的编号、日志前缀、原始模式和队列执行进度。程序使用 `RobotRuntime` 保存每台机器人的独立状态。 ```cpp /** * @brief 单台机器人在双队列流程中的运行时状态。 */ struct RobotRuntime { int number = 0; ///< 机器人在控制器中的编号。 std::string log_prefix; ///< 区分两台机器人输出信息的日志前缀。 int original_mode = -1; ///< 进入 Demo 前的控制器模式。 bool queue_started = false; ///< 是否已经开启追加队列模式。 bool execution_observed = false; ///< 是否观察到队列处于执行状态。 bool executing_reported = false; ///< 是否已经输出开始执行提示。 bool paused_reported = false; ///< 是否已经输出暂停提示。 bool completed = false; ///< 是否已经确认队列执行完成。 int completed_confirmation_count = 0; ///< 连续检测到停止且无剩余指令的次数。 }; ``` `QueueSnapshot` 保存单台机器人一次采样得到的队列模式、剩余指令数和运行状态。 ```cpp struct QueueSnapshot { bool queue_mode_open = false; int remaining_commands = 0; int robot_running_state = 0; }; ``` ## 4、封装系统级和机器人级返回值检查 双机器人程序既包含系统级接口,例如开启并行模式和断开连接;也包含机器人级接口,例如切换某台机器人的模式和控制其队列。 程序分别封装 `check_system_result` 和 `check_sdk_result`。机器人级错误信息带有 `[机器人1]` 或 `[机器人2]` 前缀,系统级错误使用 `[系统]` 前缀。 ```cpp bool check_sdk_result( Result result, const RobotRuntime& robot, const std::string& operation) { if (result == SUCCESS) return true; std::cerr << robot.log_prefix << operation << "失败,错误码:" << static_cast(result) << std::endl; return false; } bool check_system_result(Result result, const std::string& operation) { if (result == SUCCESS) return true; std::cerr << "[系统] " << operation << "失败,错误码:" << static_cast(result) << std::endl; return false; } ``` ## 5、封装机器人级查询重试和状态快照 `query_with_retry` 接收目标机器人的运行时信息,在查询失败时输出对应机器人前缀。连接断开时立即停止重试,其他临时错误按配置等待后再次查询。 ```cpp template bool query_with_retry( const RobotRuntime& robot, const std::string& operation, Query query) { for (int attempt = 1; attempt <= MAX_QUERY_FAILURES; ++attempt) { const Result result = query(); if (result == SUCCESS) return true; std::cerr << robot.log_prefix << operation << "失败,第 " << attempt << "/" << MAX_QUERY_FAILURES << " 次,错误码:" << static_cast(result) << std::endl; if (result == DISCONNECT) { std::cerr << robot.log_prefix << "控制器连接已经断开,停止重试" << std::endl; return false; } if (attempt < MAX_QUERY_FAILURES) { std::this_thread::sleep_for( std::chrono::milliseconds(QUERY_RETRY_INTERVAL_MS)); } } std::cerr << robot.log_prefix << operation << "连续失败,停止当前流程" << std::endl; return false; } ``` 各查询包装函数调用带 `_robot` 后缀的接口,并传入 `robot.number`: ```cpp bool query_servo_state(SOCKETFD fd, const RobotRuntime& robot, int& state) { return query_with_retry(robot, "获取伺服状态", [&]() { return get_servo_state_robot(fd, robot.number, state); }); } bool query_running_state(SOCKETFD fd, const RobotRuntime& robot, int& state) { return query_with_retry(robot, "获取运行状态", [&]() { return get_robot_running_state_robot(fd, robot.number, state); }); } bool query_current_mode(SOCKETFD fd, const RobotRuntime& robot, int& mode) { return query_with_retry(robot, "获取当前模式", [&]() { return get_current_mode_robot(fd, robot.number, mode); }); } bool query_queue_mode(SOCKETFD fd, const RobotRuntime& robot, bool& status) { return query_with_retry(robot, "获取追加队列模式状态", [&]() { return queue_motion_get_status_robot(fd, robot.number, status); }); } bool query_queue_remaining( SOCKETFD fd, const RobotRuntime& robot, int& remaining_commands) { return query_with_retry(robot, "获取剩余队列长度", [&]() { return queue_motion_get_queuelen_robot( fd, robot.number, remaining_commands); }); } ``` `read_queue_snapshot` 将三项队列状态读入一个快照,并验证剩余数量和运行状态值。单独封装后,完成判断函数只处理已经校验的数据。 ```cpp bool read_queue_snapshot( SOCKETFD fd, const RobotRuntime& robot, QueueSnapshot& snapshot) { if (!query_queue_mode(fd, robot, snapshot.queue_mode_open)) return false; if (!query_queue_remaining(fd, robot, snapshot.remaining_commands)) return false; if (!query_running_state(fd, robot, snapshot.robot_running_state)) return false; if (snapshot.remaining_commands < 0) { std::cerr << robot.log_prefix << "控制器返回非法剩余队列长度:" << snapshot.remaining_commands << std::endl; return false; } if (snapshot.robot_running_state < 0 || snapshot.robot_running_state > 2) { std::cerr << robot.log_prefix << "控制器返回未知运行状态:" << snapshot.robot_running_state << std::endl; return false; } return true; } ``` ## 6、等待伺服状态并准备单台机器人 多机器人并行模式或模式切换可能触发安全下电。程序在最终运行模式确定后,分别确认两台机器人的伺服状态。 `wait_for_servo_state` 持续查询指定机器人的伺服状态,直到进入期望状态、检测到报警或等待超时。 ```cpp bool wait_for_servo_state( SOCKETFD fd, const RobotRuntime& robot, int expected_state, const std::string& expected_state_name) { using clock = std::chrono::steady_clock; const auto deadline = clock::now() + std::chrono::seconds(SERVO_STATE_TIMEOUT_SECONDS); while (clock::now() < deadline) { int servo_state = -1; if (!query_servo_state(fd, robot, servo_state)) return false; if (servo_state == expected_state) { std::cout << robot.log_prefix << "伺服已进入" << expected_state_name << std::endl; return true; } if (servo_state == SERVO_ALARM) { std::cerr << robot.log_prefix << "伺服在状态切换过程中进入报警状态,请检查示教器报警" << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } std::cerr << robot.log_prefix << "等待伺服进入" << expected_state_name << "超时" << std::endl; return false; } ``` `prepare_robot` 对指定机器人执行以下操作: 1. 确认当前运行状态为 0,没有运动或暂停任务。 2. 保存原始模式,并在需要时切换到运行模式 2。 3. 查询伺服状态;状态 0 时先切换为就绪,状态 1 时直接等待人工上电。 4. 状态 2 时停止流程,不自动清错;状态 3 时直接确认完成。 ```cpp bool prepare_robot(SOCKETFD fd, RobotRuntime& robot) { int running_state = 0; if (!query_running_state(fd, robot, running_state)) return false; if (running_state != 0) { std::cerr << robot.log_prefix << "当前已有运动或暂停任务,状态码:" << running_state << std::endl; return false; } if (!query_current_mode(fd, robot, robot.original_mode)) return false; if (robot.original_mode < 0 || robot.original_mode > 2) { std::cerr << robot.log_prefix << "控制器返回未知模式:" << robot.original_mode << std::endl; return false; } if (robot.original_mode != EXECUTION_MODE) { if (!check_sdk_result( set_current_mode_robot(fd, robot.number, EXECUTION_MODE), robot, "切换到运行模式")) return false; int confirmed_mode = -1; if (!query_current_mode(fd, robot, confirmed_mode)) return false; if (confirmed_mode != EXECUTION_MODE) { std::cerr << robot.log_prefix << "运行模式确认失败,当前模式:" << confirmed_mode << std::endl; return false; } } int servo_state = SERVO_STOPPED; if (!query_servo_state(fd, robot, servo_state)) return false; bool needs_power_on = false; switch (servo_state) { case SERVO_STOPPED: if (!check_sdk_result( set_servo_state_robot(fd, robot.number, SERVO_READY), robot, "设置伺服为就绪状态")) return false; if (!wait_for_servo_state(fd, robot, SERVO_READY, "就绪状态")) return false; needs_power_on = true; break; case SERVO_READY: std::cout << robot.log_prefix << "伺服已经处于就绪状态" << std::endl; needs_power_on = true; break; case SERVO_RUNNING: std::cout << robot.log_prefix << "伺服已经处于运行状态" << std::endl; break; case SERVO_ALARM: std::cerr << robot.log_prefix << "伺服处于报警状态,请先排除报警,不自动清错" << std::endl; return false; default: std::cerr << robot.log_prefix << "控制器返回未知伺服状态:" << servo_state << std::endl; return false; } if (needs_power_on) { std::cout << robot.log_prefix << "多机器人并行模式下控制器不接受 SDK 上电命令;" << "请现在从示教器执行上电,程序最多等待 " << SERVO_STATE_TIMEOUT_SECONDS << " 秒" << std::endl; if (!wait_for_servo_state(fd, robot, SERVO_RUNNING, "运行状态")) return false; } std::cout << robot.log_prefix << "准备完成:伺服运行、机器人空闲、运行模式" << std::endl; return true; } ``` ## 7、分别准备两组追加队列 `wait_for_queue_mode`、`start_queue`、`append_timer_commands` 和 `execute_queue` 都接收 `RobotRuntime`,通过其中的编号调用对应机器人接口。 开启或关闭队列模式会清空对应机器人的队列。`start_queue` 在开启接口成功后将 `queue_started` 设为 `true`,便于异常清理阶段判断哪些队列需要关闭。 ```cpp bool start_queue(SOCKETFD fd, RobotRuntime& robot) { if (!check_sdk_result( queue_motion_set_status_robot(fd, robot.number, true), robot, "开始追加队列模式")) { return false; } robot.queue_started = true; return wait_for_queue_mode(fd, robot, true); } ``` `append_relative_movej` 按运动配置调用 `queue_motion_push_back_moveJ`,将MoveJ运动指令追加到上位机本地队列。 ```cpp /** * @brief 向本地追加队列写入基于当前关节位置的相对 MoveJ 指令 * @param[in] fd 控制器连接句柄 * @retval true 运动指令追加成功 * @retval false 指令追加失败 * * @details 查询当前关节坐标后,将关节 1 增加 10° 作为目标位置。 * @warning 本函数会生成实际运动;调用前必须确认目标点可达、无碰撞且现场安全。 */ bool append_relative_movej(SOCKETFD fd) { /// @brief 保存待追加的关节运动参数。 MoveCmd movej; movej.coord = 0; ///< 使用关节坐标系。 /// @brief 指定目标位置由数值数组直接提供。 movej.targetPosType = PosType::data; /// @brief 读取当前关节位置,作为相对运动的安全起点。 if (!check_sdk_result(get_current_position(fd, 0, movej.targetPosValue), "获取当前的关节坐标")) { return false; } movej.targetPosValue[0] += 10; ///< 关节 1 相对当前位置向正方向移动 10°。 movej.velocity = 50; ///< 关节速度百分比,取值范围为 [1, 100]。 movej.acc = 50; ///< 关节运动加速度百分比。 movej.dec = 50; ///< 关节运动减速度百分比。 movej.pl = 5; ///< 轨迹平滑系数。 /// @brief 将已完成参数设置的 MoveJ 指令写入本地追加队列。 std::cout << "正在追加关节运动指令" << std::endl; return check_sdk_result(queue_motion_push_back_moveJ(fd, movej), "追加MoveJ运动指令"); } ``` `append_relative_moveL` 按运动配置调用 `queue_motion_push_back_moveL`,将MoveL运动指令追加到上位机本地队列。 ```cpp /** * @brief 向本地追加队列写入基于当前直角坐标的相对 MoveL 指令 * @param[in] fd 控制器连接句柄 * @retval true 运动指令追加成功 * @retval false 指令追加失败 * * @details 查询当前直角坐标后,将 X 轴增加 10 mm 作为目标位置。 * @warning 本函数会生成实际运动;调用前必须确认目标点可达、无碰撞且现场安全。 */ bool append_relative_moveL(SOCKETFD fd) { /// @brief 保存待追加的直线运动参数。 MoveCmd moveL; moveL.coord = 1; ///< 使用直角坐标系。 /// @brief 指定目标位置由数值数组直接提供。 moveL.targetPosType = PosType::data; /// @brief 读取当前直角坐标,作为相对运动的安全起点。 if (!check_sdk_result(get_current_position(fd, 1, moveL.targetPosValue), "获取当前的直角坐标")) { return false; } moveL.targetPosValue[0] += 10; ///< X 轴相对当前位置向正方向移动 10 mm。 moveL.velocity = 500; ///< 直线速度,取值范围为 [1, 1000] mm/s。 moveL.acc = 50; ///< 直线运动加速度百分比。 moveL.dec = 50; ///< 直线运动减速度百分比。 moveL.pl = 5; ///< 轨迹平滑系数。 /// @brief 将已完成参数设置的 MoveL 指令写入本地追加队列。 std::cout << "正在追加直线运动指令" << std::endl; return check_sdk_result(queue_motion_push_back_moveL(fd, moveL), "追加MoveL运动指令"); } ``` `append_timer_commands` 按配置数量循环调用 `queue_motion_push_back_timer`,将延时指令追加到上位机本地队列。任一指令追加失败时立即停止,避免发送内容不完整的队列。 ```cpp /** * @brief 向本地追加队列写入配置数量的延时指令 * @param[in] fd 控制器连接句柄 * @retval true 全部延时指令均追加成功 * @retval false 任一延时指令追加失败 */ bool append_timer_commands(SOCKETFD fd, const RobotRuntime& robot) { for (int index = 0; index < TIMER_COMMAND_COUNT; ++index) { if (!check_sdk_result( queue_motion_push_back_timer_robot( fd, robot.number, TIMER_COMMAND_SECONDS), robot, "追加第 " + std::to_string(index + 1) + " 条延时指令")) { return false; } } std::cout << "正在追加延时指令" << std::endl; return true; } bool execute_queue(SOCKETFD fd, const RobotRuntime& robot) { if (!check_sdk_result( queue_motion_send_to_controller_robot( fd, robot.number, 0, false), robot, "发送并执行追加队列")) { return false; } std::cout << robot.log_prefix << "追加队列已经发送并开始执行" << std::endl; return true; } ``` 程序必须先为两台机器人都完成队列开启和指令追加,再进入执行阶段。这样可以减少第一台机器人已经开始执行、第二台机器人却仍在准备队列的时间差。 ## 8、分别更新状态并等待两组队列完成 `update_completion_state` 只处理一台机器人的一次状态更新,并将执行观察、暂停提示、完成确认次数和最终完成结果写回该机器人的 `RobotRuntime`。 ```cpp bool update_completion_state( SOCKETFD fd, RobotRuntime& robot, std::chrono::steady_clock::time_point earliest_completion) { QueueSnapshot snapshot; if (!read_queue_snapshot(fd, robot, snapshot)) return false; if (!snapshot.queue_mode_open) { std::cerr << robot.log_prefix << "执行期间追加队列模式被关闭" << std::endl; return false; } const bool executing = snapshot.robot_running_state == 2 || snapshot.remaining_commands > 0; if (executing) { robot.execution_observed = true; robot.completed_confirmation_count = 0; if (!robot.executing_reported) { std::cout << robot.log_prefix << "已检测到队列正在执行,剩余指令数:" << snapshot.remaining_commands << std::endl; robot.executing_reported = true; } } if (snapshot.robot_running_state == 1) { robot.completed_confirmation_count = 0; if (!robot.paused_reported) { std::cout << robot.log_prefix << "追加队列当前处于暂停状态" << std::endl; robot.paused_reported = true; } } else { robot.paused_reported = false; } if (snapshot.remaining_commands == 0 && snapshot.robot_running_state == 0) { ++robot.completed_confirmation_count; const bool execution_state_confirmed = robot.execution_observed || robot.completed_confirmation_count >= STOPPED_CONFIRMATION_COUNT; const bool expected_duration_elapsed = std::chrono::steady_clock::now() >= earliest_completion; if (execution_state_confirmed && expected_duration_elapsed) { robot.completed = true; std::cout << robot.log_prefix << "已检测到追加队列执行完成" << std::endl; } } return true; } ``` `wait_for_both_queues` 在同一个循环中遍历两台机器人,只更新尚未完成的队列。两台机器人的 `completed` 都变为 `true` 后才返回成功。 ```cpp bool wait_for_both_queues( SOCKETFD fd, std::array& robots, std::chrono::seconds timeout = std::chrono::seconds(QUEUE_COMPLETE_TIMEOUT_SECONDS)) { using clock = std::chrono::steady_clock; const auto start_time = clock::now(); const auto deadline = start_time + timeout; const auto earliest_completion = start_time + std::chrono::milliseconds( static_cast( TIMER_COMMAND_COUNT * TIMER_COMMAND_SECONDS * 1000.0) - POLL_INTERVAL_MS); while (clock::now() < deadline) { bool all_completed = true; for (RobotRuntime& robot : robots) { if (!robot.completed) { all_completed = false; if (!update_completion_state(fd, robot, earliest_completion)) return false; } } if (all_completed || (robots[0].completed && robots[1].completed)) { std::cout << "[系统] 两台机器人的追加队列均已执行完成" << std::endl; return true; } std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } for (const RobotRuntime& robot : robots) { if (!robot.completed) { std::cerr << robot.log_prefix << "等待追加队列执行完成超时" << std::endl; } } return false; } ``` ## 9、分别关闭队列、异常停止和恢复模式 `end_queue` 只关闭已经成功开启的队列,并在关闭成功后清除 `queue_started` 标志。关闭队列模式会清空对应机器人的队列,只能在完成或安全停止后执行。 ```cpp bool end_queue(SOCKETFD fd, RobotRuntime& robot) { if (!robot.queue_started) return true; if (!check_sdk_result( queue_motion_set_status_robot(fd, robot.number, false), robot, "结束追加队列模式")) return false; if (!wait_for_queue_mode(fd, robot, false)) return false; robot.queue_started = false; return true; } ``` 异常时,`stop_and_close_queue` 针对每台机器人分别调用不下电停止接口,等待状态 0 后再关闭该机器人的队列。 ```cpp bool stop_and_close_queue(SOCKETFD fd, RobotRuntime& robot) { int running_state = 0; if (!query_running_state(fd, robot, running_state)) return false; if (running_state != 0) { std::cerr << robot.log_prefix << "队列仍在执行或暂停,正在执行不下电停止" << std::endl; if (!check_sdk_result( queue_motion_stop_not_power_off_robot(fd, robot.number), robot, "异常清理:停止追加队列")) return false; using clock = std::chrono::steady_clock; const auto deadline = clock::now() + std::chrono::seconds(QUEUE_STATE_TIMEOUT_SECONDS); while (clock::now() < deadline) { if (!query_running_state(fd, robot, running_state)) return false; if (running_state == 0) break; std::this_thread::sleep_for( std::chrono::milliseconds(POLL_INTERVAL_MS)); } if (running_state != 0) { std::cerr << robot.log_prefix << "停止追加队列超时" << std::endl; return false; } } return end_queue(fd, robot); } ``` `restore_robot_mode` 只有在机器人确认停止时才恢复原模式。单独封装后,可以为两台机器人分别判断是否需要恢复,避免一台机器人仍在运行时切换其控制器模式。 ```cpp bool restore_robot_mode(SOCKETFD fd, const RobotRuntime& robot) { if (robot.original_mode < 0 || robot.original_mode == EXECUTION_MODE) return true; int running_state = -1; if (!query_running_state(fd, robot, running_state)) return false; if (running_state != 0) { std::cerr << robot.log_prefix << "状态未确认停止,不恢复原始模式" << std::endl; return false; } return check_sdk_result( set_current_mode_robot(fd, robot.number, robot.original_mode), robot, "恢复控制器原始模式"); } ``` ## 10、封装机器人检查函数 为了确保当前的追加队列模式下,机器人的数量确定是两台,因此在本节函数中增加了两层机器人数量检查环节,依次检测依次验证机器人类型、7 个关节坐标及运行状态。 ```cpp /** * @brief 检查指定机器人是否能够返回有效的机器人本体数据 * @param[in] fd 控制器连接句柄 * @param[in] robot 待检查机器人的运行时信息 * @retval true 机器人类型、关节坐标和运行状态均连续三次查询有效 * @retval false 任一查询失败,或返回的数据不符合预期范围 * * @details 每轮检测依次验证机器人类型、7 个关节坐标及运行状态,避免仅凭单个接口判断机器人存在。 * @note 这是只读检测,不改变控制器模式、伺服状态或队列状态。 */ bool probe_robot_instance( SOCKETFD fd, const RobotRuntime& robot) { /* * 连续检测3次,避免某些接口第一次返回缓存值或瞬时默认值。 */ constexpr int PROBE_COUNT = 3; for (int attempt = 1; attempt <= PROBE_COUNT; ++attempt) { /* * 1. 获取机器人类型 */ int robot_type = -1; const Result type_result = get_robot_type_robot( fd, robot.number, robot_type); if (type_result != SUCCESS) { std::cerr << robot.log_prefix << "机器人类型查询失败,错误码:" << static_cast(type_result) << std::endl; return false; } /* * 根据当前SDK头文件,机器人类型有效范围为1~14。 */ if (robot_type < 1 || robot_type > 14) { std::cerr << robot.log_prefix << "返回了非法机器人类型:" << robot_type << std::endl; return false; } /* * 2. 获取当前关节坐标 */ std::vector joint_position; const Result position_result = get_current_position_robot( fd, robot.number, 0, joint_position); if (position_result != SUCCESS) { std::cerr << robot.log_prefix << "关节坐标查询失败,错误码:" << static_cast(position_result) << std::endl; return false; } if (joint_position.size() != 7) { std::cerr << robot.log_prefix << "关节坐标长度异常,期望7,实际为:" << joint_position.size() << std::endl; return false; } for (double value : joint_position) { if (!std::isfinite(value)) { std::cerr << robot.log_prefix << "关节坐标中包含无效数值" << std::endl; return false; } } /* * 3. 获取运行状态 */ int running_state = -1; const Result state_result = get_robot_running_state_robot( fd, robot.number, running_state); if (state_result != SUCCESS) { std::cerr << robot.log_prefix << "运行状态查询失败,错误码:" << static_cast(state_result) << std::endl; return false; } if (running_state < 0 || running_state > 2) { std::cerr << robot.log_prefix << "返回了非法运行状态:" << running_state << std::endl; return false; } std::this_thread::sleep_for( std::chrono::milliseconds(200)); } std::cout << robot.log_prefix << "机器人检测通过" << std::endl; return true; } ``` ```cpp /** * @brief 检查程序配置的两台机器人是否均能返回有效本体数据 * @param[in] fd 控制器连接句柄 * @param[in] robots 程序配置的两台机器人 * @retval true 两台机器人的编号有效、互不相同且均通过本体数据检测 * @retval false 编号配置错误,或任意一台机器人无法访问 * * @note 调用本函数前必须已经开启多机器人并行模式,否则无法访问机器人 2。 */ bool verify_two_robots_available( SOCKETFD fd, const std::array& robots) { if (robots[0].number <= 0 || robots[1].number <= 0) { std::cerr << "[系统] 机器人编号必须大于0" << std::endl; return false; } if (robots[0].number == robots[1].number) { std::cerr << "[系统] 两台机器人编号相同:" << robots[0].number << std::endl; return false; } for (const RobotRuntime& robot : robots) { if (!probe_robot_instance(fd, robot)) { std::cerr << robot.log_prefix << "未检测到有效机器人" << std::endl; return false; } } std::cout << "[系统] 两台机器人均检测有效" << std::endl; return true; } ``` ```cpp /** * @brief 检查两台机器人是否都具有独立且可用的追加队列通道 * @param[in] fd 控制器连接句柄 * @param[in,out] robots 程序配置的两台机器人;预检结束时会关闭已开启的队列并清除状态标志 * @retval true 两台机器人的队列均可开启、确认并正常关闭 * @retval false 任一机器人的队列通道不可用,或预检清理失败 * * @warning 开启和关闭队列模式会清空队列。 * 本函数必须在正式追加指令之前调用。 */ bool verify_dual_queue_channels( SOCKETFD fd, std::array& robots) { bool success = true; /* * 依次开启两台机器人的空队列。 */ for (RobotRuntime& robot : robots) { std::cout << robot.log_prefix << "正在预检追加队列通道" << std::endl; if (!start_queue(fd, robot)) { std::cerr << robot.log_prefix << "追加队列通道预检失败" << std::endl; success = false; break; } } /* * 无论是否全部成功,都关闭已经尝试开启的队列。 */ for (RobotRuntime& robot : robots) { if (robot.queue_started) { if (!end_queue(fd, robot)) { std::cerr << robot.log_prefix << "预检后关闭队列失败" << std::endl; success = false; } } } if (!success) { std::cerr << "[系统] 双机器人队列通道不可用," << "禁止继续追加或执行运动指令" << std::endl; return false; } std::cout << "[系统] 两台机器人的追加队列通道预检通过" << std::endl; return true; } ``` ## 11、封装双机器人队列完整流程 `run_demo` 首先创建两份 `RobotRuntime`,并为日志设置不同前缀。随后执行系统级并行模式开启、检测是否存在两台机器人、两台机器人准备、两组队列准备、快速发送执行、联合等待和清理恢复。 ```cpp /** * @brief 执行双机器人追加队列的完整生命周期 * @param[in] fd 两台机器人共用的控制器连接句柄 * @retval true 两台机器人均完成准备、队列执行和清理,且并行模式正常关闭 * @retval false 任一系统、机器人、队列或清理操作失败 * * @details * 流程先开启多机器人并行模式,再依次准备两台机器人和两组队列;队列执行命令按顺序快速发送, * 随后在同一轮询循环中监控两台机器人的完成状态,最后恢复模式并关闭并行模式 */ bool run_demo(SOCKETFD fd) { std::array robots = { RobotRuntime{ ROBOT_ONE_NUMBER, "[机器人1] " }, RobotRuntime{ ROBOT_TWO_NUMBER, "[机器人2] " } }; bool success = true; bool parallel_enabled = false; // 必须先开启并行模式,控制器才允许访问机器人 2 parallel_enabled = check_system_result( set_robots_parallel(fd, true), "开启多机器人并行模式"); success = parallel_enabled; if (success) { std::cout << "[系统] 多机器人并行模式已开启" << std::endl; } /* * 第一层检测:读取两台机器人的本体数据。 */ if (success && !verify_two_robots_available(fd, robots)) { std::cerr << "[系统] 未检测到两个有效机器人,程序退出" << std::endl; check_system_result( set_robots_parallel(fd, false), "关闭多机器人并行模式"); return false; } // 并行模式开启后,再分别查询和准备两台机器人 if (success) { for (RobotRuntime& robot : robots) { if (!prepare_robot(fd, robot)) { success = false; break; } } } /* * 第二层检测:验证两台机器人是否都有可用的独立队列通道。 * 此时尚未追加MoveJ、MoveL或Timer,因此可以安全清空空队列。 */ if (success && !verify_dual_queue_channels(fd, robots)) { success = false; } // 必须先为两台机器人完成队列准备,再发送执行命令 for (RobotRuntime& robot : robots) { if (success && !start_queue(fd, robot)) { success = false; } if (success && !append_relative_movej(fd, robot)) { success = false; } if (success && !append_relative_moveL(fd, robot)) { success = false; } if (success && !append_timer_commands(fd, robot)) { success = false; } } if (success) { std::cout << "[系统] 两台机器人队列准备完成,开始并行执行" << std::endl; for (const RobotRuntime& robot : robots) { if (!execute_queue(fd, robot)) { success = false; break; } } } if (success) { success = wait_for_both_queues(fd, robots); } if (success) { for (RobotRuntime& robot : robots) { if (!end_queue(fd, robot)) { success = false; } } } if (!success) { for (RobotRuntime& robot : robots) { stop_and_close_queue(fd, robot); } } for (const RobotRuntime& robot : robots) { if (!restore_robot_mode(fd, robot)) { success = false; } } if (parallel_enabled) { if (!check_system_result( set_robots_parallel(fd, false), "关闭多机器人并行模式")) { success = false; } else { std::cout << "[系统] 多机器人并行模式已关闭" << std::endl; } } if (success) { std::cout << "[系统] 追加队列(双机器人)Demo执行成功" << std::endl; } return success; } ``` 并行模式必须在准备机器人 2 之前开启。关闭并行模式则应放在两台机器人的队列清理和模式恢复之后,避免提前失去对机器人 2 的访问能力。 ## 12、主程序连接并执行双机器人流程 主函数只建立一次控制器连接。两台机器人所有状态查询和队列操作都通过同一个 `fd` 完成,并使用机器人编号进行区分。 ```cpp #include #include #include #include #include #include #include #include #include #include "../demo_utils.h" /** * @brief Demo 程序入口:连接双机器人控制器并执行两组追加队列。 * @return Demo 成功且连接正常断开时返回 0,否则返回 1。 */ int main() { demo::enable_console_utf8(); const SOCKETFD fd = connect_robot(ROBOT_IP, ROBOT_PORT); if (fd <= 0) { std::cerr << "[系统] 控制器连接失败" << std::endl; return 1; } std::cout << "[系统] 控制器连接成功" << std::endl; bool success = run_demo(fd); if (!check_system_result(disconnect_robot(fd), "断开控制器连接")) { success = false; } else { std::cout << "[系统] 控制器连接已断开" << std::endl; } return success ? 0 : 1; } ``` --- # 11. 上传下载文件 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/11.%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6.html 本期将介绍如何通过 SDK 在上位机和控制器之间传输文件,并使用交互式菜单完成作业查询、作业上传、作业下载、日志下载和系统备份。 本 Demo 支持以下功能: 1. 查询控制器中的全部作业文件。 2. 上传单个 `.JBR` 作业文件。 3. 上传包含作业文件的整个本地目录。 4. 下载控制器中的全部作业文件。 5. 下载指定数量的控制器日志。 6. 备份控制器系统数据和配置。 `nrc_job_operate.h` 没有提供任意配置文件的单独上传或恢复接口,因此系统配置、作业文件等整体数据通过 `backup_system` 进行备份。 ::: warning ⚠️ 使用注意 本 Demo 不会发送机器人运动指令,但会真实读取、写入或备份控制器文件。运行前必须确认: - **连接配置:** 普通 SDK 使用 `robot_port` 连接,默认文件传输还需要控制器 TCP 5000 端口可用 - **端口区别:** 不能将普通 SDK 端口错误修改为文件服务端口 5000 - **覆盖风险:** 上传同名作业前确认控制器端文件是否允许被替换;下载前确认是否允许覆盖本地同名文件 - **网络稳定:** 文件传输过程中不要断开网络、关闭控制器或强制结束程序 - **目录权限:** 下载目录和系统备份保存位置具有足够的写入权限和磁盘空间 - **控制器状态:** 执行系统备份前确认机器人空闲,并避免同时进行其他配置修改 上传、下载和备份属于可能改变文件状态的操作。程序不会自动重试这些写操作,避免请求已经成功但响应丢失时再次覆盖文件或重复执行备份。 ::: ## 1、配置普通 SDK 和文件服务参数 程序首先通过普通 SDK 端口连接控制器。当前 `nrc_host.dll` 在执行文件传输时,还会使用同一控制器 IP 的 TCP 5000 端口建立文件连接。 ```cpp /** * @name 用户必须根据运行环境修改 * 以下配置决定普通 SDK 能否连接到实际控制器,运行前必须核对。 * @{ */ const std::string robot_ip = "192.168.3.243"; ///< 实际控制器的 IP 地址。 const std::string robot_port = "6001"; ///< 实际控制器的普通 SDK 服务端口。 /** @} */ constexpr int sdk_file_server_port = 5000; ///< 当前 nrc_host.dll 使用的控制器文件服务端口。 ``` `robot_port` 仍用于 `connect_robot`,不能改成 5000。文件服务端口由 DLL 在文件接口内部使用,上位机、防火墙、交换机和 VLAN 都必须允许访问该端口。 下载作业文件时,`cover_local_job_files` 决定是否覆盖本地已有的同名文件。设置为 `true` 前,应先确认本地文件保留策略。 ```cpp constexpr bool cover_local_job_files = true; ///< 下载时是否覆盖本地已有的同名作业文件。 constexpr int default_log_count = 5; ///< 日志下载数量的默认值。 constexpr int job_refresh_timeout_seconds = 15; ///< 上传后等待控制器识别作业文件的总超时时间,单位为秒。 constexpr int job_refresh_interval_ms = 500; ///< 上传后刷新控制器作业列表的间隔,单位为毫秒。 constexpr int query_retry_interval_ms = 500; ///< 只读查询失败后的重试间隔,单位为毫秒。 constexpr int query_max_failures = 3; ///< 只读查询允许的最大连续失败次数。 ``` 其他常量定义菜单范围、日志数量范围、取消输入和作业文件扩展名,通常不应修改: ```cpp constexpr SOCKETFD invalid_socket = -1; constexpr int first_robot_number = 1; constexpr int minimum_log_count = 1; constexpr int maximum_log_count = 100; constexpr int menu_minimum_value = 0; constexpr int menu_maximum_value = 6; constexpr DWORD path_buffer_size = 32768; const std::string cancel_input = "q"; const std::string job_file_extension = ".JBR"; ``` ## 2、定义交互菜单操作 程序使用 `MenuOption` 枚举表示用户可以选择的操作。使用枚举可以避免在业务分发逻辑中直接使用含义不明确的整数。 ```cpp /** * @brief 文件传输 Demo 支持的菜单操作。 */ enum class MenuOption { exit_program = 0, list_job_files = 1, upload_job_file = 2, upload_job_directory = 3, download_job_files = 4, download_log_files = 5, backup_system_data = 6 }; ``` 菜单值 0 用于退出,1~6 分别对应查询、上传、下载和备份操作。 ## 3、SDK 结果检查 普通 SDK 接口使用 `check_sdk_result` 检查结果。文件传输接口则使用 `check_file_transfer_result`,当错误为 `DISCONNECT` 时额外输出文件服务端口、网络和版本诊断信息。 ```cpp bool check_sdk_result(Result result, const std::string& operation) { if (result == SUCCESS) return true; std::cerr << operation << "失败,错误码:" << static_cast(result) << std::endl; return false; } bool check_file_transfer_result( Result result, const std::string& operation) { if (check_sdk_result(result, operation)) return true; if (result == DISCONNECT) { std::cerr << "文件传输连接失败。请确认:" << std::endl; std::cerr << " 1. 控制器文件服务已经启动;" << std::endl; std::cerr << " 2. 上位机能够访问 " << robot_ip << ":" << sdk_file_server_port << ";" << std::endl; std::cerr << " 3. 防火墙、交换机或 VLAN 没有拦截 TCP " << sdk_file_server_port << ";" << std::endl; std::cerr << " 4. 控制器软件版本与当前 nrc_host.dll 匹配。" << std::endl; std::cerr << "注意:普通 SDK 端口仍为 " << robot_port << ",请勿改成 " << sdk_file_server_port << "。" << std::endl; } return false; } ``` ## 4、封装字符串和本地路径处理函数 用户从资源管理器复制路径时,路径两侧可能带有空格或成对双引号。程序通过 `trim_copy` 和 `remove_surrounding_quotes` 统一清理输入。 ```cpp std::string trim_copy(const std::string& value) { const std::string whitespace = " \t\r\n"; const std::size_t begin = value.find_first_not_of(whitespace); if (begin == std::string::npos) return ""; const std::size_t end = value.find_last_not_of(whitespace); return value.substr(begin, end - begin + 1); } std::string remove_surrounding_quotes(const std::string& value) { const std::string trimmed = trim_copy(value); if (trimmed.size() >= 2 && trimmed.front() == '"' && trimmed.back() == '"') { return trimmed.substr(1, trimmed.size() - 2); } return trimmed; } ``` `to_upper_ascii` 用于不区分 ASCII 大小写地比较取消输入、菜单确认和 `.JBR` 扩展名。 ```cpp std::string to_upper_ascii(std::string value) { std::transform( value.begin(), value.end(), value.begin(), [](unsigned char character) { return static_cast(std::toupper(character)); }); return value; } ``` 文件和目录检查分别封装为 `is_existing_file` 与 `is_existing_directory`。`get_absolute_path` 将用户输入转换为绝对路径,避免文件接口依赖程序当前工作目录。 ```cpp bool is_existing_file(const std::string& path) { const DWORD attributes = GetFileAttributesA(path.c_str()); return attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY) == 0; } bool is_existing_directory(const std::string& path) { const DWORD attributes = GetFileAttributesA(path.c_str()); return attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; } bool get_absolute_path( const std::string& input_path, std::string& absolute_path) { std::vector buffer(path_buffer_size); const DWORD length = GetFullPathNameA( input_path.c_str(), static_cast(buffer.size()), buffer.data(), nullptr); if (length == 0 || length >= buffer.size()) { std::cerr << "获取绝对路径失败,Windows 错误码:" << GetLastError() << std::endl; return false; } absolute_path.assign(buffer.data(), length); return true; } ``` 下载目录不存在时,`create_directory_tree` 会从盘符根目录开始逐级创建。单独封装目录创建逻辑,可以让作业下载和日志下载复用同一套保存路径准备流程。 ```cpp bool create_directory_tree( const std::string& input_path, std::string& absolute_path) { if (!get_absolute_path(input_path, absolute_path)) return false; std::replace(absolute_path.begin(), absolute_path.end(), '/', '\\'); if (is_existing_directory(absolute_path)) return true; const std::size_t drive_root_length = 3; for (std::size_t index = drive_root_length; index <= absolute_path.size(); ++index) { const bool at_separator = index < absolute_path.size() && absolute_path[index] == '\\'; const bool at_end = index == absolute_path.size(); if (!at_separator && !at_end) continue; const std::string partial_path = absolute_path.substr(0, index); if (partial_path.empty() || is_existing_directory(partial_path)) continue; if (CreateDirectoryA(partial_path.c_str(), nullptr) == 0 && GetLastError() != ERROR_ALREADY_EXISTS) { std::cerr << "创建目录失败:" << partial_path << ",Windows 错误码:" << GetLastError() << std::endl; return false; } } return is_existing_directory(absolute_path); } ``` ## 5、封装作业名称规范化和查询重试 控制器返回的作业名称可能包含路径、扩展名或不同大小写。`get_file_name` 和 `normalize_job_name` 会提取文件名、去除 `.JBR` 后缀并转换为大写。 ```cpp std::string get_file_name(const std::string& path) { const std::size_t separator = path.find_last_of("/\\"); if (separator == std::string::npos) return path; return path.substr(separator + 1); } std::string normalize_job_name(const std::string& value) { std::string name = to_upper_ascii(get_file_name(value)); if (name.size() > job_file_extension.size() && name.compare( name.size() - job_file_extension.size(), job_file_extension.size(), job_file_extension) == 0) { name.erase(name.size() - job_file_extension.size()); } return name; } bool contains_job( const std::vector>& robots_files, const std::string& expected_job) { const std::string normalized_expected = normalize_job_name(expected_job); for (const auto& files : robots_files) { for (const std::string& file : files) { if (normalize_job_name(file) == normalized_expected) return true; } } return false; } ``` 只读查询通过 `query_with_retry` 进行有限次重试。写操作不自动重试,因为请求可能实际成功但响应丢失,再次调用可能重复覆盖或执行。 ```cpp template bool query_with_retry(const std::string& operation, Query query) { for (int attempt = 1; attempt <= query_max_failures; ++attempt) { const Result result = query(); if (result == SUCCESS) return true; std::cerr << operation << "失败,第 " << attempt << "/" << query_max_failures << " 次,错误码:" << static_cast(result) << std::endl; if (result == DISCONNECT) { std::cerr << "控制器连接已经断开,停止重试" << std::endl; return false; } if (attempt < query_max_failures) { std::this_thread::sleep_for( std::chrono::milliseconds(query_retry_interval_ms)); } } return false; } ``` ## 6、查询作业列表并确认上传结果 `list_all_job_files` 查询按机器人分组的作业列表,并输出每台机器人对应的文件。单独封装该函数后,菜单查询和目录上传后的列表刷新都可以复用。 ```cpp bool list_all_job_files(SOCKETFD fd) { std::vector> robots_files; const bool query_success = query_with_retry( "job_get_all_jobfile_name", [&]() { robots_files.clear(); return job_get_all_jobfile_name(fd, robots_files); }); if (!query_success) return false; bool has_job_file = false; for (std::size_t robot_index = 0; robot_index < robots_files.size(); ++robot_index) { if (robots_files[robot_index].empty()) continue; has_job_file = true; std::cout << "机器人 " << robot_index + first_robot_number << ":" << std::endl; for (const std::string& file : robots_files[robot_index]) std::cout << " " << file << std::endl; } if (!has_job_file) std::cout << "控制器中没有查询到作业文件" << std::endl; return true; } ``` 单个文件上传完成并调用同步接口后,控制器仍可能需要时间刷新作业列表。`wait_for_uploaded_job` 在有限时间内重复查询,并通过规范化名称确认目标文件已经出现。 ```cpp bool wait_for_uploaded_job(SOCKETFD fd, const std::string& job_name) { using steady_clock = std::chrono::steady_clock; const auto deadline = steady_clock::now() + std::chrono::seconds(job_refresh_timeout_seconds); int consecutive_failures = 0; while (steady_clock::now() < deadline) { std::vector> robots_files; const Result result = job_get_all_jobfile_name(fd, robots_files); if (result == SUCCESS) { consecutive_failures = 0; if (contains_job(robots_files, job_name)) { std::cout << "控制器已经识别作业文件:" << get_file_name(job_name) << std::endl; return true; } } else { ++consecutive_failures; std::cerr << "刷新作业列表失败,第 " << consecutive_failures << "/" << query_max_failures << " 次,错误码:" << static_cast(result) << std::endl; if (result == DISCONNECT || consecutive_failures >= query_max_failures) { return false; } } std::this_thread::sleep_for( std::chrono::milliseconds(job_refresh_interval_ms)); } std::cerr << "等待控制器识别作业文件超时:" << get_file_name(job_name) << std::endl; return false; } ``` ## 7、封装用户路径和整数输入 `read_path` 读取一行路径,自动去除成对引号,并允许用户输入 `q` 取消当前操作。取消业务操作被视为正常返回,不会结束整个菜单程序。 ```cpp bool read_path(const std::string& prompt, std::string& path) { while (true) { std::cout << prompt << "(输入 q 取消):"; std::string input; if (!std::getline(std::cin, input)) { std::cerr << "读取控制台输入失败" << std::endl; return false; } path = remove_surrounding_quotes(input); if (to_upper_ascii(path) == to_upper_ascii(cancel_input)) return false; if (!path.empty()) return true; std::cerr << "路径不能为空,请重新输入" << std::endl; } } ``` 上传单个文件时,`prompt_upload_file` 会确认路径存在、指向普通文件且扩展名为 `.JBR`。上传目录则要求本地目录已经存在;下载目录不存在时会自动递归创建。 ```cpp bool prompt_upload_file(std::string& absolute_path) { while (true) { std::string input_path; if (!read_path("请输入本地 .JBR 作业文件完整路径", input_path)) return false; if (!get_absolute_path(input_path, absolute_path)) continue; if (!is_existing_file(absolute_path)) { std::cerr << "文件不存在,请重新输入:" << absolute_path << std::endl; continue; } const std::string upper_file_name = to_upper_ascii(get_file_name(absolute_path)); if (upper_file_name.size() <= job_file_extension.size() || upper_file_name.compare( upper_file_name.size() - job_file_extension.size(), job_file_extension.size(), job_file_extension) != 0) { std::cerr << "job_upload_by_file 仅用于 .JBR 作业文件,请重新输入" << std::endl; continue; } return true; } } bool prompt_existing_directory(std::string& absolute_path) { while (true) { std::string input_path; if (!read_path("请输入待上传的本地作业目录", input_path)) return false; if (!get_absolute_path(input_path, absolute_path)) continue; if (is_existing_directory(absolute_path)) return true; std::cerr << "目录不存在,请重新输入:" << absolute_path << std::endl; } } bool prompt_download_directory(std::string& absolute_path) { while (true) { std::string input_path; if (!read_path("请输入上位机保存目录", input_path)) return false; if (create_directory_tree(input_path, absolute_path)) return true; std::cerr << "保存目录无效,请重新输入" << std::endl; } } ``` `prompt_integer` 用于读取菜单编号和日志数量,确保整行只有一个整数且位于允许范围内。`confirm_operation` 则要求用户明确输入 `y` 或 `n`,用于系统备份确认。 ## 8、上传单个作业文件 上传单个文件的流程为:读取并校验 `.JBR` 路径,调用 `job_upload_by_file` 传输文件,调用 `job_sync_job_file` 刷新作业数据,最后等待控制器作业列表出现该文件。 ```cpp bool upload_one_job_file(SOCKETFD fd) { std::string file_path; if (!prompt_upload_file(file_path)) { std::cout << "已取消上传单个作业文件" << std::endl; return true; } std::cout << "开始上传:" << file_path << std::endl; if (!check_file_transfer_result( job_upload_by_file(fd, file_path), "job_upload_by_file")) { return false; } if (!check_sdk_result(job_sync_job_file(fd), "job_sync_job_file")) return false; return wait_for_uploaded_job(fd, file_path); } ``` ## 9、上传作业目录 上传目录时,程序先确认目录存在,再调用 `job_upload_by_directory`。传输完成后执行作业同步,并输出刷新后的控制器作业列表。 ```cpp bool upload_job_directory(SOCKETFD fd) { std::string directory_path; if (!prompt_existing_directory(directory_path)) { std::cout << "已取消上传作业目录" << std::endl; return true; } std::cout << "开始上传目录:" << directory_path << std::endl; if (!check_file_transfer_result( job_upload_by_directory(fd, directory_path), "job_upload_by_directory")) { return false; } if (!check_sdk_result(job_sync_job_file(fd), "job_sync_job_file")) return false; std::cout << "目录上传完成,刷新后的控制器作业列表如下:" << std::endl; return list_all_job_files(fd); } ``` 目录上传可能包含多个同名文件,执行前应检查目录内容和控制器端文件保留策略。 ## 10、下载作业文件和控制器日志 `download_all_job_files` 准备本地保存目录后,调用 `job_download_by_directory` 下载控制器中的全部作业文件。第三个参数决定是否覆盖本地同名文件。 ```cpp bool download_all_job_files(SOCKETFD fd) { std::string directory_path; if (!prompt_download_directory(directory_path)) { std::cout << "已取消下载作业文件" << std::endl; return true; } std::cout << "开始下载全部作业文件到:" << directory_path << std::endl; return check_file_transfer_result( job_download_by_directory( fd, directory_path, cover_local_job_files), "job_download_by_directory"); } ``` 日志下载先要求用户输入 1~100 的数量,再准备保存目录并调用 `log_download_by_quantity`。 ```cpp bool download_controller_logs(SOCKETFD fd) { int log_count = default_log_count; if (!prompt_integer( "请输入下载日志数量(1~100):", minimum_log_count, maximum_log_count, log_count)) { return false; } std::string directory_path; if (!prompt_download_directory(directory_path)) { std::cout << "已取消下载日志文件" << std::endl; return true; } std::cout << "开始下载 " << log_count << " 个日志文件到:" << directory_path << std::endl; return check_file_transfer_result( log_download_by_quantity(fd, log_count, directory_path), "log_download_by_quantity"); } ``` ## 11、备份控制器系统数据 `backup_controller_system` 在执行前明确提示系统备份会保存到当前可执行程序目录,并要求用户输入 `y` 确认。输入 `n` 被视为正常取消,不会终止菜单程序。 ```cpp bool backup_controller_system(SOCKETFD fd) { std::cout << "系统备份会保存到当前可执行程序目录," << "请确保机器人处于空闲状态。" << std::endl; if (!confirm_operation("是否继续执行系统备份")) { std::cout << "已取消系统备份" << std::endl; return true; } return check_file_transfer_result( backup_system(fd), "backup_system"); } ``` 系统备份包含控制器配置、作业文件等数据,但该接口不等于任意单个配置文件的上传或恢复功能。 ## 12、显示菜单并分发文件操作 每次执行文件操作前,`confirm_connection` 通过只读接口确认普通 SDK 连接仍然有效。连接失效时退出菜单循环,避免继续调用文件接口。 ```cpp bool confirm_connection(SOCKETFD fd) { return query_with_retry( "get_connection_status", [&]() { return get_connection_status(fd); }); } ``` `prompt_menu` 显示功能列表并通过 `prompt_integer` 读取 0~6 的有效整数。`execute_operation` 根据枚举调用对应的业务函数。 ```cpp bool execute_operation(SOCKETFD fd, MenuOption option) { switch (option) { case MenuOption::list_job_files: return list_all_job_files(fd); case MenuOption::upload_job_file: return upload_one_job_file(fd); case MenuOption::upload_job_directory: return upload_job_directory(fd); case MenuOption::download_job_files: return download_all_job_files(fd); case MenuOption::download_log_files: return download_controller_logs(fd); case MenuOption::backup_system_data: return backup_controller_system(fd); case MenuOption::exit_program: return true; default: std::cerr << "未知菜单选项" << std::endl; return false; } } ``` 单次操作失败时,程序记录失败状态并继续显示菜单,用户可以检查错误信息后重新选择功能。连接确认失败或控制台输入流失败时,程序退出循环。 ## 13、主程序连接控制器并运行交互菜单 主函数设置 UTF-8 控制台后连接普通 SDK,并提示文件传输还需要 TCP 5000 端口。菜单循环持续运行到用户选择退出,最后显式调用 `disconnect_robot`。 ```cpp /** * @brief Demo 程序入口。 * @return 全部操作及断开连接成功时返回 EXIT_SUCCESS,否则返回 EXIT_FAILURE。 */ #include #include #include #include #include #include #include #include #include #include #include #include "../demo_utils.h" //封装的控制台UTF-8 int main() { demo::enable_console_utf8(); //调用控制台UTF-8输出 std::cout << "连接控制器 " << robot_ip << ":" << robot_port << " ..." << std::endl; const SOCKETFD fd = connect_robot(robot_ip, robot_port); if (fd <= invalid_socket) { std::cerr << "connect_robot 失败,请检查 IP、端口和网络连接" << std::endl; return EXIT_FAILURE; } std::cout << "控制器连接成功" << std::endl; std::cout << "提示:文件上传、下载还需要控制器 TCP " << sdk_file_server_port << " 端口可用。" << std::endl; bool program_success = true; while (true) { MenuOption option = MenuOption::exit_program; if (!prompt_menu(option)) { program_success = false; break; } if (option == MenuOption::exit_program) break; if (!confirm_connection(fd)) { program_success = false; break; } if (!execute_operation(fd, option)) { program_success = false; std::cerr << "本次操作失败,可检查错误信息后重新选择功能" << std::endl; } } if (!check_sdk_result(disconnect_robot(fd), "disconnect_robot")) program_success = false; return program_success ? EXIT_SUCCESS : EXIT_FAILURE; } ``` --- # 12.示教模式类型切换与轨迹回放功能 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/12.%E7%A4%BA%E6%95%99%E6%A8%A1%E5%BC%8F%E7%B1%BB%E5%9E%8B%E5%88%87%E6%8D%A2%E4%B8%8E%E8%BD%A8%E8%BF%B9%E5%9B%9E%E6%94%BE%E5%8A%9F%E8%83%BD.html 在使用上位机开启拖拽模式前,需要先在示教器上做好拖拽的辨识。 注意:切换到拖拽模式后需要调用 set_servo_poweron 接口让机器人上使能才能进行拖拽 ::: danger ⚠️ 安全警告 以下代码**会导致机器人实际运动**。执行前必须确认: - **人员安全:** 机器人工作空间内**无人员或障碍物** - **急停可用:** 急停按钮在可触及范围内 - **伺服使能:** 确认伺服已正确使能 - **速度限制:** 首次运行将速度设置为较低值(建议 ≤ 最大速度的 20%) - **坐标系与单位:** 关节运动单位为度(°),直线运动单位为毫米(mm) 建议先在**仿真环境或空载低速条件**下测试,确认无误后再用于实际生产。 ::: ## 1、切换示教模式类型函数 ```cpp /* * 封装切换示教模式类型函数 */ void Switching_teach_type(int fd) { int type; get_teach_type(fd, type); switch (type) { case 0: //当前示教模式类型为点动模式 set_teach_type(fd, 1); //切换当前示教模式类型为拖拽模式 break; case 1: //当前示教模式类型为拖拽模式 set_teach_type(fd, 0); //切换当前示教模式类型为点动模式 break; } } ``` ## 2、封装等待运动结束的函数 ```cpp /* * 循环阻塞运动结束函数 */ void wait_for_running_over(int fd) { // 等待运动完成 int running_state = 0; get_robot_running_state(fd, running_state); // 查询机器人是否在运动 2-正在运动 while (running_state == 2) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 阻塞500ms get_robot_running_state(fd, running_state); // 再次查询 } } ``` ## 3,封装轨迹回放功能函数 ```cpp /* * 封装轨迹回放功能函数 */ void record_playback(int fd) { int vel = 30; //轨迹回放的速度 set_teach_type(fd, 0); track_record_playback(fd, vel); //回放记录的轨迹 wait_for_running_over(fd); } ``` ## 4、封装拖拽轨迹记录函数 ```cpp /* * 封装拖拽轨迹记录函数 */ void track_record(int fd) { set_teach_type(fd, 1); //切换当前示教模式类型为拖拽模式 double maxSamplingNum = 200; //轨迹的采样间隔 double samplingInterval = 0.05; //最大的采样点数 int vel = 30; //轨迹回放的速度 track_record_delete(fd); //记录新的轨迹前清除旧的轨迹 track_record_start(fd, maxSamplingNum, samplingInterval); //开启轨迹记录 for(int i = 0; i < 50; i++) { sleep(0.2); ////.....等待10s,等待拖拽结束 } track_record_stop(fd); //关闭轨迹记录 } ``` ## 5、拖拽回放功能 ```cpp #include #include #include #include #include #include "cpp_interface/nrc_api.h" using namespace std; int main() { SOCKETFD fd = connect_robot("192.168.1.15", "6001"); // 连接控制器 if (fd <= 0) { std::cout << "连接失败" << std::endl; return 0; } std::cout << "连接成功: "<< fd << std::endl; clear_error(fd); //清除错误 track_record(fd); //record_playback(fd); //需要回放刚才记录的轨迹就调用这个函数 } ``` --- # 13.工具手标定 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/13.%E5%B7%A5%E5%85%B7%E6%89%8B%E6%A0%87%E5%AE%9A.html ## 概述 工具手标定是建立机器人末端工具坐标系的过程,通过标定可以确定工具中心点(TCP)相对于法兰中心的偏移量和旋转角度。 ## 标定前准备 1. **准备标定工具**:尖状物体或标定锥 2. **固定参考点**:将标定锥固定在工作台上,确保标定过程中不移动 3. **检查机器人状态**:确保机器人已上电且伺服使能 4. **选择工具手编号**:确定要标定的工具手编号(1-999) ## 7点标定流程 ### 步骤1:设置工具手编号 ```cpp int toolNum = 3; // 工具手编号 set_tool_hand_number(fd, toolNum); ``` ### 步骤2:标定7个点 ```cpp // 标定第1个点:工具手末梢垂直对准参考点 // 移动机器人到位置1 tool_hand_7_point_calibrate(fd, 1, toolNum); // 标定第2个点:切换姿势,末端正对参考点 // 移动机器人到位置2 tool_hand_7_point_calibrate(fd, 2, toolNum); // 标定第3个点:切换姿势,末端正对参考点 // 移动机器人到位置3 tool_hand_7_point_calibrate(fd, 3, toolNum); // 标定第4个点:切换姿势,末端正对参考点 // 移动机器人到位置4 tool_hand_7_point_calibrate(fd, 4, toolNum); // 标定第5个点:工具末端垂直且正对参考点(同第1点) // 移动机器人到位置5 tool_hand_7_point_calibrate(fd, 5, toolNum); // 标定第6个点:在第5点基础上,沿X轴负方向移动任意距离 // 移动机器人到位置6 tool_hand_7_point_calibrate(fd, 6, toolNum); // 标定第7个点:在第6点基础上,沿Y轴正方向移动任意距离 // 移动机器人到位置7 tool_hand_7_point_calibrate(fd, 7, toolNum); ``` ### 步骤3:计算标定结果 ```cpp // 7个点全部标定完成后,计算标定结果 Result result = tool_hand_7_point_calibrate_caculate(fd, toolNum, 7); if (result == 0) { printf("标定成功\n"); } else { printf("标定失败,请重新标定\n"); } ``` ### 步骤4:验证标定精度 ```cpp // 切换到标定的工具手 set_tool_hand_number(fd, toolNum); // 移动机器人,使工具末梢对准标定锥 // 在直角坐标系下点动A、B、C轴,观察尖端是否对准 // 如果偏差较大,需要重新标定 ``` --- ## 20点标定流程 ### 步骤1:设置工具手编号 ```cpp int toolNum = 4; // 工具手编号 set_tool_hand_number(fd, toolNum); ``` ### 步骤2:标定20个点 ```cpp // 标定20个点 for (int i = 1; i <= 20; i++) { // 移动机器人到标定点位 // ... // 标记点位 tool_hand_2_or_20_point_calibrate(fd, i); printf("标定第%d个点\n", i); sleep(3); // 等待机器人移动 } ``` ### 步骤3:计算标定结果 ```cpp // 20个点全部标定完成后,计算标定结果 Result result = tool_hand_2_or_20_point_calibrate_caculate(fd, toolNum, false); if (result == 0) { printf("20点标定成功\n"); } else { printf("20点标定失败\n"); } ``` --- ## 完整代码示例 ### 7点标定完整示例 ```cpp #include #include "cpp_interface/nrc_api.h" int main() { // 1. 连接机器人 SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { printf("连接失败\n"); return -1; } printf("连接成功\n"); // 2. 设置工具手编号 int toolNum = 3; set_tool_hand_number(fd, toolNum); printf("设置工具手编号:%d\n", toolNum); // 3. 标定7个点 for (int i = 1; i <= 7; i++) { printf("请移动机器人到第%d个标定点位置,然后按Enter...\n", i); std::cin.get(); // 等待用户确认 Result result = tool_hand_7_point_calibrate(fd, i, toolNum); if (result == 0) { printf("标定第%d个点成功\n", i); } else { printf("标定第%d个点失败\n", i); return -1; } } // 4. 计算标定结果 Result result = tool_hand_7_point_calibrate_caculate(fd, toolNum, 7); if (result == 0) { printf("标定成功!\n"); // 5. 验证标定精度 printf("请验证标定精度:\n"); printf(" 1. 切换到工具手%d\n", toolNum); printf(" 2. 移动机器人,使工具末梢对准标定锥\n"); printf(" 3. 在直角坐标系下点动A、B、C轴\n"); printf(" 4. 观察尖端是否对准\n"); } else { printf("标定失败,请重新标定\n"); } return 0; } ``` ### 20点标定完整示例 ```cpp #include #include "cpp_interface/nrc_api.h" int main() { // 1. 连接机器人 SOCKETFD fd = connect_robot("192.168.1.15", "6001"); if (fd <= 0) { printf("连接失败\n"); return -1; } // 2. 设置工具手编号 int toolNum = 4; set_tool_hand_number(fd, toolNum); // 3. 标定20个点 for (int i = 1; i <= 20; i++) { printf("请移动机器人到第%d个标定点位置,然后按Enter...\n", i); std::cin.get(); Result result = tool_hand_2_or_20_point_calibrate(fd, i); if (result == 0) { printf("标定第%d个点成功\n", i); } else { printf("标定第%d个点失败\n", i); return -1; } } // 4. 计算标定结果 Result result = tool_hand_2_or_20_point_calibrate_caculate(fd, toolNum, false); if (result == 0) { printf("20点标定成功!\n"); } else { printf("20点标定失败\n"); } return 0; } ``` --- ## 参数含义详解 ### 工具手参数 | 参数 | 含义 | 单位 | 说明 | |------|------|------|------| | X | 工具末端相对于法兰中心,沿直角坐标系X轴方向的偏移长度 | mm | 正值表示工具末端在法兰中心X轴正方向 | | Y | 工具末端相对于法兰中心,沿直角坐标系Y轴方向的偏移长度 | mm | 正值表示工具末端在法兰中心Y轴正方向 | | Z | 工具末端相对于法兰中心,沿直角坐标系Z轴方向的偏移长度 | mm | 正值表示工具末端在法兰中心Z轴正方向 | | A | 工具末端相对于法兰中心,绕直角坐标系X轴方向旋转角度 | °/rad | 右手法则,拇指指向X轴正方向,四指弯曲方向为正 | | B | 工具末端相对于法兰中心,绕直角坐标系Y轴方向旋转角度 | °/rad | 右手法则,拇指指向Y轴正方向,四指弯曲方向为正 | | C | 工具末端相对于法兰中心,绕直角坐标系Z轴方向的旋转角度 | °/rad | 右手法则,拇指指向Z轴正方向,四指弯曲方向为正 | ### 负载参数 | 参数 | 含义 | 单位 | 说明 | |------|------|------|------| | payloadMass | 负载质量 | kg | 工具和工件的总质量 | | payloadInertia | 负载惯量 | 0.001kgm² | 负载的转动惯量 | | payloadMassCenterX | 负载质心X | m | 负载质心相对于工具坐标系的X坐标 | | payloadMassCenterY | 负载质心Y | m | 负载质心相对于工具坐标系的Y坐标 | | payloadMassCenterZ | 负载质心Z | m | 负载质心相对于工具坐标系的Z坐标 | --- ## 验证标定精度 ### 验证方法 1. **切换到标定的工具手** ```cpp set_tool_hand_number(fd, toolNum); ``` 2. **移动机器人,使工具末梢对准标定锥** 3. **在直角坐标系下点动 A、B、C 轴** - 观察尖端是否对准 - 记录偏差值(mm) 4. **判断标定精度** - 偏差 < 0.5mm:标定精度良好 - 偏差 0.5-1.0mm:标定精度一般,可接受 - 偏差 > 1.0mm:标定精度差,需要重新标定 ### 常见问题 **Q: 标定失败,计算结果大于1** A: 可能原因: - 标定点位置不准确 - 标定过程中参考点移动 - 机器人姿态不正确 解决方案: - 重新标定,确保参考点固定 - 检查机器人姿态是否正确 - 使用更精确的标定工具 **Q: 标定后 A、B 轴旋转误差大** A: 可能原因: - 6点标定精度不够 - 标定点分布不合理 解决方案: - 更换7点标定 - 重新标定,确保标定点分布合理 **Q: 标定后 C 轴旋转误差大** A: 可能原因: - 标定点位置不准确 - 参考点移动 解决方案: - 重新标定 - 确保参考点固定 --- # 使用 servo_move() 来进行跟踪运动 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/03.%E8%BF%9B%E9%98%B6%E5%BA%94%E7%94%A8/01.%E4%BD%BF%E7%94%A8-servo_move%28%29-%E6%9D%A5%E8%BF%9B%E8%A1%8C%E8%B7%9F%E8%B8%AA%E8%BF%90%E5%8A%A8.html servo_move(SOCKETFD socketFd,ServoMovePara servoMove) 可以接收一组点,然后将接收到的点位根据 timeStamp 做平滑处理后下发到伺服运动。 ::: danger ⚠️ 安全警告 以下代码**会导致机器人实际运动**。执行前必须确认: - **人员安全:** 机器人工作空间内**无人员或障碍物** - **急停可用:** 急停按钮在可触及范围内 - **伺服使能:** 确认伺服已正确使能 - **速度限制:** 首次运行将速度设置为较低值(建议 ≤ 最大速度的 20%) - **坐标系与单位:** 关节运动单位为度(°),直线运动单位为毫米(mm) 建议先在**仿真环境或空载低速条件**下测试,确认无误后再用于实际生产。 ::: ```cpp struct ServoMovePara { ///< 传输参数 bool clearBuffer; ///< 是否清除之前发送的,未开始插补计算的点位 int targetMode; ///< 0-独立点 1-连续轨迹 int sendMode; ///< 0-一次传输完全部轨迹 1-一次传输部分点位 int runMode; ///< 0-接收完再运动 1-边接受边运动 int sum; ///< 总传输次数 int count; ///< 当前是第几次传输 ///< 运动参数 int coord; ///< 0-关节 1-直角 int size; ///< 本次传输的点位数 std::vector> pos; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个关节角度或笛卡尔坐标 std::vector> axisvel; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个轴的速度 std::vector> axisacc; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个轴的加速度 std::vector timeStamp; ///< 长度为本次传输的点位数,表示到达该点位的时间,单位ms }; ``` ## 使用前提:需要在示教器上运行外部点的指令 启动运行这个作业文件 ### 示例一:使用连续点位轨迹,每次传输部分点位来进行遥操作 ```cpp #include #include #include #include "cpp_interface/nrc_api.h" int main() { ServoMovePara param; // 目标点位数据 double axis1_pos = 1; double axis2_pos = 2; // 查询运动前坐标 std::vector pos(7); get_current_position(fd, 0, pos); std::cout << "关节运动前坐标:" << pos[0] << " " << pos[1] << " " << pos[2] << " " << pos[3] << " " << pos[4] << " " << pos[5] << " " << pos[6] << std::endl; for (int k = 0; k < 4000; k++) { // 生成目标点位数据 for (int i = 0; i < 2; i++) { param.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6]}); //目标点位数据 std::cout << "关节角=" << param.pos[i][6] << std::endl; if (k < 100) { pos[5] += 0.05; } else if (k >= 100 && k < 200) { pos[5] -= 0.05; } else if (k >= 200 && k < 300) { pos[5] += 0.05; } else { pos[5] -= 0.05; } std::cout << "k=" << k << std::endl; } std::cout << "大小=" << param.pos.size() << std::endl; // 设置每个轴的速度 for (int i = 0; i < param.pos.size(); i++) { param.axisvel.push_back({1, 1, 1, 1, 1, 50, 1}); //到达目标点位的每个轴的速度,单位度每秒 } // 设置每个轴的加速度 for (int i = 0; i < param.pos.size(); i++) { param.axisacc.push_back({1, 1, 1, 1, 1, 50, 1}); //到达目标点位的每个轴的加速度 } // 设置时间戳 double times = 5; //运行到该点位时,相对于起始点的时间 for (int i = 0; i < param.pos.size(); i++) { param.timeStamp.push_back(times); times += 5; //假设后续每一个点位都相较于上一个点多5ms,最终timeStamp数组是{5,10,15,20...} } // 设置参数 param.clearBuffer = true; // 使用连续运动时,clearBuffer,targetMode,sendMode,runMode需要按照这个固定格式赋值 param.targetMode = 0; // 连续轨迹 param.sendMode = 0; // 一次传输完全部轨迹点位 param.runMode = 0; param.coord = 0; // 关节坐标 param.sum = 100000; // 因为需要持续发送点位,我们假设总的发送次数很大 param.count = 100000; // 因为需要持续发送点位,我们假设总的发送次数很大 param.extMove = 0; param.size = param.pos.size(); // 调用运动接口 auto t_start = std::chrono::high_resolution_clock::now(); std::cout << "servo_move return: " << servo_move(fd, param) << std::endl; auto t_stop = std::chrono::high_resolution_clock::now(); auto t_duration = std::chrono::duration(t_stop - t_start); std::cout << "t_duration: " << t_duration.count() << std::endl; // 延时补偿 if (t_duration.count() < times / 1000 + 0.01) { std::this_thread::sleep_for(std::chrono::duration(times / 1000 + 0.01 - t_duration.count())); } // 清空参数 param.pos.clear(); param.axisvel.clear(); param.axisacc.clear(); param.timeStamp.clear(); } return 0; } ``` ### 示例二:使用独立点位轨迹,,一次性传输完全部轨迹点位(没有平滑) ```cpp #include #include #include #include "cpp_interface/nrc_api.h" int main() { ServoMovePara param; // 目标点位数据 double axis1_pos = 1; double axis2_pos = 2; // 查询运动前坐标 std::vector pos(7); get_current_position(fd, 0, pos); std::cout << "关节运动前坐标:" << pos[0] << " " << pos[1] << " " << pos[2] << " " << pos[3] << " " << pos[4] << " " << pos[5] << " " << pos[6] << std::endl; for (int k = 0; k < 4000; k++) { // 生成目标点位数据 for (int i = 0; i < 2; i++) { param.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6]}); //目标点位数据 std::cout << "关节角=" << param.pos[i][6] << std::endl; if (k < 100) { pos[5] += 0.05; } else if (k >= 100 && k < 200) { pos[5] -= 0.05; } else if (k >= 200 && k < 300) { pos[5] += 0.05; } else { pos[5] -= 0.05; } std::cout << "k=" << k << std::endl; } std::cout << "大小=" << param.pos.size() << std::endl; // 设置每个轴的速度 for (int i = 0; i < param.pos.size(); i++) { param.axisvel.push_back({1, 1, 1, 1, 1, 50, 1}); //到达目标点位的每个轴的速度,单位度每秒 } // 设置每个轴的加速度 for (int i = 0; i < param.pos.size(); i++) { param.axisacc.push_back({1, 1, 1, 1, 1, 50, 1}); //到达目标点位的每个轴的加速度 } // 设置时间戳 double times = 5; //运行到该点位时,相对于起始点的时间 for (int i = 0; i < param.pos.size(); i++) { param.timeStamp.push_back(times); times += 5; //假设后续每一个点位都相较于上一个点多5ms,最终timeStamp数组是{500,550,600,650...} } // 设置参数 param.robotNum = 1; param.clearBuffer = true; // 使用连续运动时,clearBuffer,targetMode,sendMode,runMode需要按照这个固定格式赋值 param.targetMode = 0; // 独立点位 param.sendMode = 0; // 一次传输完全部轨迹点位 param.runMode = 0; param.coord = 0; // 关节坐标 param.size = param.pos.size(); // 调用运动接口 std::cout << "servo_move return: " << servo_move(fd, param) << std::endl; // 延时5ms std::this_thread::sleep_for(std::chrono::milliseconds(5)); // 清空参数 param.pos.clear(); param.axisvel.clear(); param.axisacc.clear(); param.timeStamp.clear(); } return 0; } ``` --- # 使用 star_servo_point_position_motion_control() 来进行伺服控制运动 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/03.%E8%BF%9B%E9%98%B6%E5%BA%94%E7%94%A8/02.%E4%BD%BF%E7%94%A8-star_servo_point_position_motion_control%28%29-%E6%9D%A5%E8%BF%9B%E8%A1%8C%E4%BC%BA%E6%9C%8D%E6%8E%A7%E5%88%B6%E8%BF%90%E5%8A%A8.html ::: danger ⚠️ 安全警告 以下代码**会导致机器人实际运动**。执行前必须确认: - **人员安全:** 机器人工作空间内**无人员或障碍物** - **急停可用:** 急停按钮在可触及范围内 - **伺服使能:** 确认伺服已正确使能 - **速度限制:** 首次运行将速度设置为较低值(建议 ≤ 最大速度的 20%) - **坐标系与单位:** 关节运动单位为度(°),直线运动单位为毫米(mm) 建议先在**仿真环境或空载低速条件**下测试,确认无误后再用于实际生产。 ::: ## 伺服控制运动模式是每个通讯周期将点位直接下发给伺服进行运动 ```cpp struct ServoPointMovePara { bool end; ///< 是否清除之前发送的,未开始插补计算的点位 int sum; ///< 总共要发的帧数 int count; ///< 当前为第几帧 std::vector> pos; ///< 二维数组,一维表示本次传输的点位数,二维长度为12,各个关节角度或笛卡尔坐标 坐标:机器人(前7个)+ 外部轴(后5个) }; ``` 注意:发送的数据只有当总帧数 sum = count 的时候机器人才会运行,所以当 sum≠1的时候,count 就需要从1开始发送,一直累加到 sum 的值后,机器人才会开始按照对应下发的点位进行运动(具体可以看示例二,示例二就是 sum = 10的情况,count = 1开始传到接口 servo_point_position_motion_control 中,count = 2传给 servo_point_position_motion_control, count = 3 ..........一直到 count = 10传给接口 servo_point_position_motion_control 后,下发的全部点位才会开始执行 ### 示例1:封装 servo_point_position_motion_control()接口,将目标点位发送给伺服进行运动,每次只发送一个点给伺服 ```cpp void test_servo_point_position_motion_control() { ServoPointMovePara servoMove; servoMove.end = 0; servoMove.sum = 1; servoMove.count = 1; std::vector pos = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //前7位为机器人本体,后5位为外部轴 for (int i = 0; i < 100000; i++) { servoMove.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6] , pos[7], pos[8], pos[9], pos[10], pos[11]}); std::cout << "servo_point_position_motion_control return " << servo_point_position_motion_control(fd_7000, servoMove) << std::endl; servoMove.pos.clear(); pos[0] += 0.001; pos[8] += 0.001; printf("pos : %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f", pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6] , pos[7], pos[8], pos[9], pos[10], pos[11]); } } ``` ### 示例2:封装 servo_point_position_motion_control()接口,将目标点位发送给伺服进行运动,每次最大可发送600个点位 ```cpp void test_servo_point_position_motion_control() { ServoPointMovePara servoMove; servoMove.end = 0; servoMove.sum = 10; servoMove.count = 1; std::vector tar_pos; std::vector pos_sync; get_current_position(fd, 0, tar_pos); get_current_extra_position(fd, pos_sync); std::vector pos = {tar_pos[0], tar_pos[1], tar_pos[2], tar_pos[3], tar_pos[4], tar_pos[5], tar_pos[6], pos_sync[0], pos_sync[1], pos_sync[2], pos_sync[3], pos_sync[4]}; //前7位为机器人本体,后5位为外部轴 for (int i = 0; i < 10; i++) { for (int j = 0; j < 600; j++) //存最大600个点位 { servoMove.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6] , pos[7], pos[8], pos[9], pos[10], pos[11]}); if (i < 100) { pos[0] += 0.008; pos[8] += 0.008; } else if ( i >= 200 && i < 300) { pos[0] -= 0.008; pos[8] -= 0.008; } else if ( i >= 300 && i < 400) { pos[0] += 0.008; pos[8] += 0.008; } else { pos[0] -= 0.008; pos[8] -= 0.008; } } std::cout << "servo_point_position_motion_control return " << servo_point_position_motion_control(fd_7000, servoMove) << std::endl; servoMove.pos.clear(); if (servoMove.count == 10) { servoMove.count = 0; } servoMove.count ++; } } ``` ### 示例3:封装 servo_point_position_motion_control()接口,当出现发送点位不运动,或者缓存区已经满的情况下,发送 ```cpp void test_clean_motion() { ServoPointMovePara servoMove; servoMove.end = 1; servoMove.sum = 1; servoMove.count = 1; std::vector pos = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //前7位为机器人本体,后5位为外部轴 servoMove.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6] , pos[7], pos[8], pos[9], pos[10], pos[11]}); std::cout << "servo_point_position_motion_control return " << servo_point_position_motion_control(fd_7000, servoMove) << std::endl; } ``` ### 示例:当出现发送点位不运动,或者缓存区已经满的情况下,发送下面的代码 ```cpp #include #include #include #include "cpp_interface/nrc_interface.h" int main() { int fd_7000; connect(fd_7000, "192.168.1.13"); enable_servo_position_motion_control(fd_7000, 1); //开启伺服控制模式 test_servo_point_position_motion_control(); //当需要清除点位的时候再调用下面的接口 // test_clean_motion(); } ``` --- # 使用 servoJ 进行关节控制 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/03.%E7%A4%BA%E4%BE%8B/03.%E8%BF%9B%E9%98%B6%E5%BA%94%E7%94%A8/03.%E4%BD%BF%E7%94%A8servoJ%E8%BF%9B%E8%A1%8C%E5%85%B3%E8%8A%82%E6%8E%A7%E5%88%B6.html ::: danger ⚠️ 安全警告 以下代码**会导致机器人实际运动**。执行前必须确认: - **人员安全:** 机器人工作空间内**无人员或障碍物** - **急停可用:** 急停按钮在可触及范围内 - **伺服使能:** 确认伺服已正确使能 - **速度限制:** 首次运行将速度设置为较低值(建议 ≤ 最大速度的 20%) - **坐标系与单位:** 关节运动单位为度(°),直线运动单位为毫米(mm) 建议先在**仿真环境或空载低速条件**下测试,确认无误后再用于实际生产。 ::: ## 接口说明 ```cpp /** * @brief 打开关节跟踪模式 * @param vmax 速度约束 单位 度/秒 * @param amax 加速度约束 单位 度/秒^2 * @param jmax 加加速度约束 单位 度/秒^3 */ Result open_servoJ(SOCKETFD socketFd, std::vector vmax, std::vector amax, std::vector jmax); /** * @brief 发送跟踪关节位置 * @param q 目标位置 单位 度 */ Result set_servoJ_pos(SOCKETFD socketFd, std::vector q); /** * @brief 关闭关节跟踪模式 */ Result stop_servoJ(SOCKETFD socketFd); ``` ## 使用示例 ```cpp int main() { // 连接6000端口, 用来控制上电,查询机械臂当前位置 SOCKETFD fd_6000 = connect_robot("192.168.1.13", "6000"); // 连接7000端口 SOCKETFD fd_7000 = connect_robot("192.168.1.13", "7000"); if (fd_6000 < 0 || fd_7000 < 0) { return 0; // 连接失败,退出。 } // 设置机器人上电 std::cout << "就绪: " << set_servo_state(fd_6000, 1)< vMax = {10, 10, 10, 10, 10, 10, 10}; // 速度 10°/s std::vector avMax = {1000, 1000, 1000, 1000, 1000, 1000, 1000}; // 加速度 1000°/s^2 std::vector jMax = {1000, 1000, 1000, 1000, 1000, 1000, 1000}; // 加加速度 1000°/s^3 std::cout << "打开关节跟随" << open_servoJ(fd_7000, vMax, avMax, jMax) << std::endl; int n = 100 while(n > 0) { n--; std::cout << "当前位置: " << get_current_position(fd_6000, 0, pos) << std::endl; // 只对第一个元素 pos[0] 增加 0.5,对应机械臂的1轴 pos[0] += 0.2; std::cout << "发送关节跟随" << set_servoJ_pos(fd_7000, pos) << std::endl; // 每10ms下发一次新的位置 std::this_thread::sleep_for(std::chrono::milliseconds(10)); } // 停止servoJ模式 stop_servoJ(fd_7000); return 0; } ``` --- # 变更日志 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html TODO:待补充 — 记录 C++ SDK 各版本的发布说明和变更内容。 ## 版本历史 | 版本 | 日期 | 变更说明 | |------|------|---------| | TODO | TODO | TODO | --- # 十四、数据结构定义 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/04.%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html ## Result(返回状态码) ```cpp enum Result { TIMEOUT = -6, EXCEPTION = -5, OPERATION_NOT_ALLOWED = -4, PARAM_ERR = -3, DISCONNECT = -2, RECEIVE_FAILED = -1, SUCCESS = 0 }; ``` | 值 | 含义 | |----|------| | 0 | SUCCESS:成功 | | -1 | RECEIVE_FAILED:接收失败 | | -2 | DISCONNECT:未连接机器人 | | -3 | PARAM_ERR:参数错误 | | -4 | OPERATION_NOT_ALLOWED:操作不允许 | | -5 | EXCEPTION:异常 | | -6 | TIMEOUT:超时 | --- ## MoveCmd(移动指令参数) ```cpp struct MoveCmd { PosType targetPosType{PosType::data}; std::vector targetPosValue; // 前7位本体,后7位外部轴 std::string targetPosName{""}; int coord{0}; double velocity{50}; double velocitySync{0}; double acc{50}; double dec{50}; int pl{0}; int time{0}; int toolNum{0}; int userNum{0}; int configuration{0}; int spin{0}; bool parasync{false}; }; ``` --- ## ToolParam(工具手参数) 包含 X/Y/Z 偏移量(double),A/B/C 旋转量(double),负载质量、惯性、质心等参数。 --- ## RobotDHParam(DH 参数) 包含 L1-L20 共 20 个 DH 参数,耦合系数、动态限制、螺距、转换比等。 --- ## ServoMovePara(伺服运动参数) ```cpp struct ServoMovePara { bool clearBuffer; int targetMode; // 0=独立点,1=连续轨迹 int sendMode; // 0=一次传输全部,1=部分传输 int runMode; // 0=接收完再运动,1=边接收边运动 int sum; // 总传输次数 int count; // 当前第几次 int coord; // 0=关节,1=直角 int size; // 本次传输点位数 std::vector> pos; std::vector> axisvel; std::vector> axisacc; std::vector timeStamp; // 单位 ms }; ``` --- ## WeldState(焊接状态) | 字段 | 类型 | 说明 | |------|------|------| | pistolSwitch | int | 焊枪开关 | | arcingSuccess | int | 引弧成功 | | handWireFeed | int | 手动送丝 | | weldCurrent | double | 焊接电流 | | weldVoltage | double | 焊接电压 | | weldTime | double | 焊接时间 | | weldPWM | double | 焊接占空比 | --- ## ArcParam(焊接参数) 包含焊接电压、焊接电流、起弧/收弧电压电流、时间、渐变等参数。 --- ## WaveParam(摆焊参数) 包含摆法方式、频率、幅度、半径、停留时间、偏转等参数。 --- ## CollisionPara(碰撞检测参数) | 字段 | 类型 | 说明 | |------|------|------| | collisionDetection_run | `vector` | 碰撞检测阈值(指令),[1,10000] | | collisionDetection_teach | `vector` | 碰撞检测阈值(点动),[1,10000] | | position_delay_time_ms_value | double | 指令位置响应时间,(0,99]ms | | error_enable_time_ms_value | double | 误差允许时间,[0,99]ms | | axisum | unsigned int | 轴数,默认6 | --- ## SafeIO(安全 IO 参数) 包含急停端口、安全光幕端口、使能控制等参数。 --- ## ModbusMasterParameter(Modbus 主站参数) | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | type | string | "TCP" | 主站类型 "TCP" 或 "RTU" | | startAddress | bool | false | false=起始地址1,true=起始地址0 | | TCP.IP | string | "192.168.1.13" | TCP IP地址 | | TCP.port | int | 503 | TCP 端口 | --- > 本文档由 aladin-doc-forge 工具基于 Inexbot API v2.0.4-24.03 头文件自动生成。 --- # 错误码表 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/01.C++/04.%E5%8F%82%E8%80%83/%E9%94%99%E8%AF%AF%E7%A0%81%E8%A1%A8.html TODO:待补充 — 汇总 C++ SDK 各接口返回的错误码及其含义和排查建议。 ## 通用错误码 | 错误码 | 含义 | 排查建议 | |--------|------|---------| | TODO | TODO | TODO | --- # 环境搭建 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/02.CSharp/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html ## 环境要求 - **IDE:** Visual Studio 2022(或更高版本) - **.NET 版本:** .NET 8.0(目标框架) - **架构:** x64(SDK 仅支持 64 位) - **配置:** Release / Debug(需与 SDK 版本匹配) - **SDK 包:** 从[下载页](../../../12.相关下载.md)获取 C# SDK ## 1. 创建项目 打开 Visual Studio 2022,选择 **Windows 窗体应用 (.NET 8.0)**,命名为 `csharp_demo`。 ## 2. 导入 SDK 将 SDK 文件夹拷贝到项目目录: ```text 项目根目录/ ├── Csharp_api/ │ └── ... # 其他依赖 └── nrc_host.dll # 原生库(自动复制) ``` ### 2.1 设置原生库自动复制 找到 `nrc_host.dll`: 1. 右键 `nrc_host.dll` → **属性** 2. 将 **复制到输出目录** 设置为 **如果较新则复制** 这样每次编译时,`nrc_host.dll` 会自动复制到 `bin/Release/net8.0-Windows` 目录,无需手动操作。 ### 2.2 显示所有文件(可选) 如果 SDK 文件夹在解决方案管理器中不可见:**项目 → 显示所有文件** → 右键 `Csharp_api` → **包括在项目中**。 ## 3. 编写最小连接代码 在 `Form1.cs` 中添加连接测试代码: ```csharp using System; using System.Windows.Forms; using Csharp_api; // SDK 命名空间 namespace csharp_demo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string ip = "192.168.1.15"; string port = "6001"; int fd = NrcApi.connect_robot(ip, port); if (fd <= 0) { MessageBox.Show("连接失败,请检查 IP 和端口", "提示"); return; } MessageBox.Show("连接成功!SocketFd: " + fd, "提示"); } } } ``` ## 4. 编译运行 1. 在工具栏中将配置切换为 **Release**,平台选择 **x64** 2. 点击**启动**(或按 F5) 3. 如果弹出对话框显示"连接成功",表示 SDK 配置正确 ## 排错 | 错误 | 原因 | 解决 | |------|------|------| | `DllNotFoundException` | `nrc_host.dll` 不在输出目录 | 检查 DLL 的"复制到输出目录"是否设为"如果较新则复制" | | `BadImageFormatException` | 架构不匹配(x86 vs x64) | 确认项目平台目标为 **x64** | | `TypeInitializationException` | 托管接口与原生库版本不一致 | 确认 `Csharp_api.dll` 与 `nrc_host.dll` 来自同一 SDK 包 | | 连接返回 `<= 0` | IP/端口错误或控制器未就绪 | 检查 IP 和端口;用 ping 确认网络连通性 | --- # 架构说明 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/02.CSharp/01.%E6%96%87%E6%A1%A3/02.%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E.html C# SDK 是对 C++ SDK 的托管封装,`Csharp_api/` 目录包含 SWIG 自动生成的 C# 接口。 ## 原生库 | 层次 | 文件 | 说明 | |------|------|------| | 原生库 | `nrc_host.dll` | C++ 底层通信库(**必须随程序分发**) | 运行时`nrc_host.dll`必须在输出目录中。 ## SDK 组成 ```text Csharp_api/ ├── nrc_interface.cs ← 主接口类(静态方法) ├── nrc_interfacePINVOKE.cs ← P/Invoke 底层调用 ├── MoveCmd.cs ← 运动指令参数 ├── ServoMovePara.cs ← 伺服运动参数 ├── ToolParam.cs ← 工具手参数 ├── RobotDHParam.cs ← DH 参数 └── ... ← 其他数据结构与枚举 nrc_host.dll ← C++ 原生动态库 ``` ## 调用链 ```text C# 代码 → Csharp_api.dll (托管) → P/Invoke → nrc_host.dll (原生) → TCP Socket → 控制器 ``` 所有 C# 接口与 C++ **同名同参**,可对照 [C++ API 参考](../../01.C++/02.接口/index.md) 了解详细参数说明。 ## 类型映射 | C++ | C# | |-----|-----| | `SOCKETFD` (int) | `int` | | `std::string` | `string` | | `std::vector` | `VectorDouble` | | `std::vector>` | `VectorVectorDouble` | ## 通信模型 C# SDK 与 C++ 一致,采用 JSON 文本协议进行请求/响应交互,支持两种通信模式: | 模式 | 说明 | 典型场景 | |------|------|----------| | 同步请求/响应 | 上位机发送指令,阻塞等待控制器回复 | 参数设置、状态查询、标定计算 | | 异步回调 | 控制器主动推送数据,通过注册的回调函数接收 | 7000 端口伺服跟踪、状态变化通知 | **请求流程:** C# 构造 JSON 指令 → `Csharp_api.dll` → P/Invoke → `nrc_host.dll` → TCP 发送 → 控制器解析执行 → 返回 JSON 响应 → SDK 解析为返回值/输出参数。 **回调机制:** 调用 `send_message` / `recv_message` / `set_receive_error_or_warnning_message_callback` 等注册回调函数后,控制器事件到达时 SDK 在内部线程触发回调,开发者无需主动轮询。 ## 多机器人支持 控制器支持 1~4 台机器人协同工作,C# 接口与 C++ 一致,提供两种调用方式: | 方式 | 接口 | 说明 | |------|------|------| | 单机器人 | `robot_xxx(...)`(如 `robot_movej`) | 默认操作 1 号机器人 | | 多机器人 | `robot_xxx_robot(fd, robotNum, ...)` | 通过 `robotNum` 参数指定机器人编号(1-4) | > 多机器人并行需先调用 `set_robots_parallel` 开启并行模式;外部轴跟随主机器人编号管理。 ## 工艺扩展架构 工艺类功能以独立头文件形式提供,C# 中对应接口类,通过工艺号(1-9)管理多套参数: | 工艺 | C# 接口 | 典型接口 | |------|---------|----------| | 焊接 | `nrc_craft_weld` | 焊接参数配置、送丝/退丝/送气、摆焊 | | 码垛 | `nrc_craft_pallet` | 码垛参数设置、状态查询 | | 视觉 | `nrc_craft_vision` | 视觉参数、标定、目标点计算 | | 激光切割 | `nrc_craft_laser_cutting` | 全局/工艺/模拟量/IO 参数 | | 传送带跟踪 | `nrc_craft_conveyor_belt_track` | 传送参数、编码器、PID 同步 | 工艺参数采用"设置/查询"成对接口,设置前需先指定工艺号,与示教器工艺配置保持数据一致。 ## 数据流说明 | 端口 | 数据方向 | 内容 | 典型接口 | |------|----------|------|----------| | 6001 | 双向 | 命令流:控制指令与响应(JSON) | `robot_movel`、`set_servo_state` | | 7000 | 双向 | 伺服数据流:点位跟踪、状态回调 | `servo_move`、`servo_point_position_motion_control` | | 5000 | 双向 | 文件流:作业文件上传/下载/备份 | 文件传输接口 | > 6001 为 SDK 主命令端口;涉及伺服跟踪(如外部点移动、点位运动控制)需同时连接 7000 端口。 --- # 核心概念 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/02.CSharp/01.%E6%96%87%E6%A1%A3/03.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html C# SDK 与 C++ SDK **接口一致**,核心概念参见 [C++ 核心概念](../../01.C++/01.文档/03.核心概念.md)。以下仅列出 C# 特有差异。 ## 静态方法调用 所有接口为 `nrc_interface` 的静态方法: ```csharp int fd = nrc_interface.connect_robot("192.168.1.15", "6001"); int result = nrc_interface.get_servo_state(fd, ref status); ``` ## 容器类型 使用 Csharp_api 提供的容器类替代原生数组: | 容器 | 用法 | |------|------| | `VectorDouble` | `new VectorDouble(7)` 或 `new VectorDouble(new double[]{1,2,3})` | | `VectorVectorDouble` | 二维数组 | | `VectorInt` | 整数数组 | ## 异步回调 C# 回调接口通过委托/事件注册,与 C++ 回调语义一致: ```csharp // 注册消息接收回调(对应 C++ recv_message) nrc_interface.recv_message(fd, (messageID, msg) => { Console.WriteLine($"收到消息 ID={messageID}: {msg}"); }); ``` > 回调在 SDK 内部线程触发,回调内不应执行阻塞或耗时操作(与 C++ 一致)。 ## 错误处理 - 返回值语义与 C++ 一致:`SUCCESS(0)` 表示成功,负数表示通信/执行错误 - 异步接口返回值仅表示"指令已接收",实际结果通过回调或状态查询获取 - 伺服报警后需调用 `clear_error` 清错,清错后重新下电再上电 ## 线程安全 - 不同 socketFd 之间线程安全 - 同一 socketFd 的并发调用需自行加锁(C# 可使用 `lock` 语句) - 回调函数内不应执行阻塞或耗时操作 ## C++ 文档对照 C# SDK 与 C++ 接口同名同参,以下 C++ 文档可直接作为参考: - [基础连接与系统接口](../../01.C++/02.接口/01.基础连接与系统接口.md) - [IO 控制](../../01.C++/02.接口/02.IO控制.md) - [作业文件操作](../../01.C++/02.接口/07.作业文件操作.md) - [队列运动模式](../../01.C++/02.接口/08.队列运动模式.md) --- # 连接示例 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/02.CSharp/03.%E7%A4%BA%E4%BE%8B/01.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html 点击按钮时连接控制器,注册消息回调接收推送。 ```cs [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void RecvMsgCallbackDelegate(int cmd, IntPtr message); private RecvMsgCallbackDelegate recvMsgbackDelegate; private SWIGTYPE_p_f_int_p_q_const__char__void recvMsgCallback; public void RecvMsgCallback(int messageType, IntPtr messagePtr) { int length = 0; while (Marshal.ReadByte(messagePtr, length) != 0) ++length; byte[] buffer = new byte[length]; Marshal.Copy(messagePtr, buffer, 0, length); string message = Encoding.UTF8.GetString(buffer); string messageTypeHex = messageType.ToString("X"); string currentTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"); Debug.WriteLine($"{currentTime} {messageTypeHex} : {message}\n\n"); AppendText($"{currentTime} {messageTypeHex} : {message}\n\n"); } private void button1_Click(object sender, EventArgs e) { AppendText("Connecting..."); int temp = nrc_interface.connect_robot("192.168.1.13", "6001"); if (temp > 0) { fd = temp; recvMsgbackDelegate = new RecvMsgCallbackDelegate(RecvMsgCallback); IntPtr recvCallbackPtr = Marshal.GetFunctionPointerForDelegate(recvMsgbackDelegate); recvMsgCallback = new SWIGTYPE_p_f_int_p_q_const__char__void(recvCallbackPtr, true); nrc_interface.recv_message(fd, recvMsgCallback); AppendText(textBox_ip.Text + " connect success."); } else { AppendText("Connect fail."); } } ``` --- # 变更日志 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/02.CSharp/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html TODO:待补充 --- # 数据结构 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/02.CSharp/04.%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html TODO:待补充 — C# 结构体定义参见 Csharp_api/ 目录下的 .cs 文件。 --- # 错误码表 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/02.CSharp/04.%E5%8F%82%E8%80%83/%E9%94%99%E8%AF%AF%E7%A0%81%E8%A1%A8.html TODO:待补充 — 参考 C++ 错误码表。 --- # 环境搭建 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html ## 环境要求 - **Python 版本:** 3.x(必须与 SDK 包匹配,否则 `_nrc_host.so` 加载失败) - **操作系统:** Windows x64 / Linux x64 - **控制器 IP 地址和端口号** - **SDK 包:** 从[下载页](../../../12.相关下载.md)获取 ## 1. 准备 SDK 文件 解压 SDK 包后得到: ```text 项目目录/ ├── nrc_interface.py ← Python 接口模块(必须) └── _nrc_host.so ← Linux 本地库 ``` > 将下载的_nrc_host.so和nrc_interface.py放到项目中 **验证导入:** ```python import nrc_interface print("SDK 导入成功") ``` 运行后如果输出 `SDK 导入成功`,说明 SDK 文件放置正确。 ## 2. 只读连接测试 以下代码只连接控制器并读取当前位置,**不会使机器人运动**。 ```python import nrc_interface as nrc import sys fd = nrc.connect_robot("192.168.1.16", "6001") if fd <= 0: print("连接失败") sys.exit(1) print("连接成功!fd =", fd) print("SDK 版本:", nrc.get_library_version()) # 读取当前位置 pos = nrc.VectorDouble(7) nrc.get_current_position(fd, 0, pos) print("当前位置:", [pos[i] for i in range(7)]) ``` **预期输出:** ```text 连接成功!fd = 1 SDK 版本: Inexbot API v2.0.4-24.03 当前位置: [0.0, -45.0, 90.0, 0.0, 0.0, 0.0, 0.0] ``` ## 排错 > **Python API 返回值说明:** 大部分 getter 函数返回 `(结果码, 数据值)` 元组。例如 `get_servo_state(fd, status)` 返回 `(0, 3)` 表示调用成功且伺服状态为运行。每次调用前需重新初始化传入的变量。 | 错误现象 | 原因 | 解决 | |---------|------|------| | `ImportError: No module named nrc_interface` | SDK 文件未放入 Python 路径 | 将 SDK 文件放在脚本相同目录 | | `ImportError: No module named _nrc_host` | 本地库未找到或版本不匹配 | 确认 SDK 包与 Python 版本、OS 架构一致 | | Windows 找不到指定模块 | `nrc_host.pyd` 缺失或 VC++ 运行库未安装 | 将 `.pyd` 放在项目目录;安装 Visual C++ Redistributable | | 连接返回 `<= 0` | IP/端口错误、网络不通或控制器未就绪 | 检查 IP/端口;用 `ping` 测试;确认控制器已启动 | | 运动指令无响应 | 运动队列未使能 | 调用 `queue_motion_set_status(fd, True)` | --- # 架构说明 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/01.%E6%96%87%E6%A1%A3/02.%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E.html Python SDK 通过 **SWIG** 从 C++ `libnrc_host` 自动生成,`nrc_interface.py` 包含全部接口。 ## SDK 组成 ```text SDK 包/ ├── nrc_interface.py ← SWIG 生成的 Python 接口(全量) ├── _nrc_host.so ← Linux 原生动态库 └── nrc_host.pyd ← Windows 原生动态库 ``` ## 调用链 ```text Python 代码 → nrc_interface.py → _nrc_host.so → TCP Socket → 控制器 ``` 所有 Python 函数名与 C++ **完全一致**,参数对应关系参见 [类型映射](#类型映射)。 ## 类型映射 | C++ | Python | 说明 | |-----|--------|------| | `SOCKETFD` (int) | `int` | socket 文件描述符 | | `Result` (int) | `int` | 返回状态码 | | `std::string` | `str` | 字符串 | | `std::vector` | `VectorDouble` | 先创建再 append | | `std::vector>` | `VectorVectorDouble` | 二维数组 | | 结构体 (MoveCmd等) | 同名 Python 类 | 字段名一致 | ## C++ 对照 所有参数含义参见 [C++ API 文档](../../01.C++/02.接口/index.md)。 ## 通信模型 Python SDK 与 C++ 一致,采用 JSON 文本协议进行请求/响应交互,支持两种通信模式: | 模式 | 说明 | 典型场景 | |------|------|----------| | 同步请求/响应 | 上位机发送指令,阻塞等待控制器回复 | 参数设置、状态查询、标定计算 | | 异步回调 | 控制器主动推送数据,通过注册的回调函数接收 | 7000 端口伺服跟踪、状态变化通知 | **请求流程:** Python 构造 JSON 指令 → `nrc_interface.py` → `_nrc_host.so` → TCP 发送 → 控制器解析执行 → 返回 JSON 响应 → SDK 解析为返回值/输出参数。 **回调机制:** 调用 `send_message` / `recv_message` / `set_receive_error_or_warnning_message_callback` 等注册回调函数后,控制器事件到达时 SDK 在内部线程触发回调,开发者无需主动轮询。 ## 多机器人支持 控制器支持 1~4 台机器人协同工作,Python 接口与 C++ 一致,提供两种调用方式: | 方式 | 接口 | 说明 | |------|------|------| | 单机器人 | `robot_xxx(...)`(如 `robot_movej`) | 默认操作 1 号机器人 | | 多机器人 | `robot_xxx_robot(fd, robotNum, ...)` | 通过 `robotNum` 参数指定机器人编号(1-4) | > 多机器人并行需先调用 `set_robots_parallel` 开启并行模式;外部轴跟随主机器人编号管理。 ## 工艺扩展架构 工艺类功能以独立头文件形式提供,Python 中对应同名接口,通过工艺号(1-9)管理多套参数: | 工艺 | Python 模块 | 典型接口 | |------|------------|----------| | 焊接 | `nrc_craft_weld` | 焊接参数配置、送丝/退丝/送气、摆焊 | | 码垛 | `nrc_craft_pallet` | 码垛参数设置、状态查询 | | 视觉 | `nrc_craft_vision` | 视觉参数、标定、目标点计算 | | 激光切割 | `nrc_craft_laser_cutting` | 全局/工艺/模拟量/IO 参数 | | 传送带跟踪 | `nrc_craft_conveyor_belt_track` | 传送参数、编码器、PID 同步 | 工艺参数采用"设置/查询"成对接口,设置前需先指定工艺号,与示教器工艺配置保持数据一致。 ## 数据流说明 | 端口 | 数据方向 | 内容 | 典型接口 | |------|----------|------|----------| | 6001 | 双向 | 命令流:控制指令与响应(JSON) | `robot_movel`、`set_servo_state` | | 7000 | 双向 | 伺服数据流:点位跟踪、状态回调 | `servo_move`、`servo_point_position_motion_control` | | 5000 | 双向 | 文件流:作业文件上传/下载/备份 | 文件传输接口 | > 6001 为 SDK 主命令端口;涉及伺服跟踪(如外部点移动、点位运动控制)需同时连接 7000 端口。 --- # 核心概念 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/01.%E6%96%87%E6%A1%A3/03.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html Python SDK 与 C++ SDK **接口完全一致**,核心概念参见 [C++ 核心概念](../../01.C++/01.文档/03.核心概念.md)。以下仅列出 Python 特有差异。 ## 返回值差异(重要) C++ 通过引用参数输出数据,Python 通过**元组**同时返回结果码和输出值: ```python status = 0 result, status = nrc.get_servo_state(fd, status) # result = 0(成功),status = 3(运行中) ``` > **每次调用 getter 前必须重新初始化变量**,因为 Python 端通过引用修改原始对象的值。 ## 容器类 ```python # 一维数组 pos = nrc.VectorDouble() pos.append(1.0) pos.append(2.0) # 二维数组 pos_list = nrc.VectorVectorDouble() pos_list.append(pos) ``` ## 结构体 ```python cmd = nrc.MoveCmd() cmd.coord = 0 # 关节坐标 cmd.velocity = 80 cmd.targetPosType = nrc.PosType_data ``` ## 枚举 ```python nrc.PosType_data # == C++ PosType::data nrc.SUCCESS # == 0 ``` ## 异步回调 回调在 SDK 内部线程触发,Python 中需注意线程上下文: ```python def on_message(messageID, msg): print(f"收到消息 ID={messageID}: {msg}") nrc.recv_message(fd, on_message) ``` > 回调线程中不应执行阻塞或耗时操作;如需更新 UI,应通过队列或信号量转发到主线程(与 C++ 一致)。 ## 错误处理 - 返回值语义与 C++ 一致:`SUCCESS(0)` 表示成功,负数表示通信/执行错误 - 异步接口返回值仅表示"指令已接收",实际结果通过回调或状态查询获取 - 伺服报警后需调用 `clear_error` 清错,清错后重新下电再上电 ## 线程安全 - 不同 socketFd 之间线程安全 - 同一 socketFd 的并发调用需自行加锁(Python 可使用 `threading.Lock`) - 受 GIL 限制,Python 多线程无法利用多核并行,高实时场景建议使用多进程或 C++ 端处理 - 回调函数内不应执行阻塞或耗时操作 --- # 快速开始 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/03.%E7%A4%BA%E4%BE%8B/01.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html 最小可运行示例:连接控制器、获取版本、读取位置。 ```python import nrc_interface as nrc # 1. 连接 fd = nrc.connect_robot("192.168.1.15", "6001") if fd <= 0: print("连接失败") exit(1) print("连接成功!fd =", fd) print("SDK 版本:", nrc.get_library_version()) # 2. 获取当前位置 pos = nrc.VectorDouble(7) nrc.get_current_position(fd, 0, pos) print("关节位置:", [pos[i] for i in range(7)]) # 3. 断开 nrc.disconnect_robot(fd) ``` ## 安全运动示例 > **安全警告:** 以下代码会导致机器人运动!确保工作空间内没有人员或障碍物,急停按钮在可触及范围内,首次运行时用低速。 ```python import nrc_interface as nrc import sys CONTROLLER_IP = "192.168.1.16" CONTROLLER_PORT = "6001" def move_joint(fd, target_pos): cmd = nrc.MoveCmd() cmd.coord = 0 cmd.targetPosType = nrc.PosType_data cmd.targetPosValue = target_pos cmd.velocity = 20 cmd.acc = 20 cmd.dec = 20 cmd.pl = 5 nrc.queue_motion_push_back_moveJ(fd, cmd) nrc.queue_motion_send_to_controller(fd, 1) fd = nrc.connect_robot(CONTROLLER_IP, CONTROLLER_PORT) if fd <= 0: sys.exit(1) pos = nrc.VectorDouble(7) nrc.get_current_position(fd, 0, pos) current = [pos[i] for i in range(7)] print("当前位置:", current) # 在当前位置基础上微调 nrc.queue_motion_set_status(fd, True) current[0] -= 1 move_joint(fd, nrc.VectorDouble(current)) ``` ## 下一步 - [环境搭建](../01.文档/01.环境搭建.md) — 完整安装步骤 - [基础应用](./02.基础应用/index.md) — 更多示例 --- # 连接控制器与错误回调 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/03.%E7%A4%BA%E4%BE%8B/02.%E5%9F%BA%E7%A1%80%E5%BA%94%E7%94%A8/01.%E8%AE%BE%E7%BD%AE%E6%8E%A5%E6%94%B6%E5%88%B0%E9%94%99%E8%AF%AF%E6%B6%88%E6%81%AF%E6%97%B6%E7%9A%84%E5%9B%9E%E8%B0%83.html ## 连接控制器 ```python import nrc_interface socketFd = nrc_interface.connect_robot("192.168.1.13", "6001") print(socketFd) result = nrc_interface.get_connection_status(socketFd) print(result) ``` ## 设置错误/告警消息回调 ```python import nrc_interface import time def my_callback(message_type: int, message: str, message_code: int): print(f"[回调] 类型={message_type}, 信息={message}, 代码={message_code}") if __name__ == "__main__": socketFd = nrc_interface.connect_robot("192.168.1.13", "6001") print(socketFd) result = nrc_interface.get_connection_status(socketFd) print(result) nrc_interface.set_receive_error_or_warnning_message_callback(socketFd, my_callback) time.sleep(1000) ``` [← 返回基础应用](./index.md) --- # 使用 servo_move() 来进行跟踪运动 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/03.%E7%A4%BA%E4%BE%8B/03.%E8%BF%9B%E9%98%B6%E5%BA%94%E7%94%A8/01.%E4%BD%BF%E7%94%A8-servo_move%28%29-%E6%9D%A5%E8%BF%9B%E8%A1%8C%E8%B7%9F%E8%B8%AA%E8%BF%90%E5%8A%A8.html `servo_move(SOCKETFD socketFd,ServoMovePara servoMove)` 可以接收一组点,然后将接收到的点位根据 timeStamp 做平滑处理后下发到伺服运动。 ::: danger ⚠️ 安全警告 以下代码**会导致机器人实际运动**。执行前必须确认: - **人员安全:** 机器人工作空间内**无人员或障碍物** - **急停可用:** 急停按钮在可触及范围内 - **伺服使能:** 确认伺服已正确使能 - **速度限制:** 首次运行将速度设置为较低值(建议 ≤ 最大速度的 20%) - **运行模式:** servo_move 需在运行模式下,配合含有外部点指令的作业文件使用 建议先在**仿真环境或空载低速条件**下测试,确认无误后再用于实际生产。 ::: ### ServoMovePara 参数说明 | 参数 | 类型 | 说明 | | ----------- | ---------------------- | ------------------------------------------------------- | | robotNum | int | 控制第几个机器人 | | clearBuffer | bool | 是否清除之前发送的、未开始插补计算的点位 | | targetMode | int | 0-独立点;1-连续轨迹 | | sendMode | int | 0-一次传输完全部轨迹;1-一次传输部分点位 | | runMode | int | 0-接收完再运动;1-边接收边运动 | | sum | int | 总传输次数 | | count | int | 当前第几次传输 | | coord | int | 0-关节坐标系;1-直角坐标系 | | size | int | 本次传输的点位数 | | pos | `vector>` | 二维数组,一维为点位数,二维为 7 个关节角度或笛卡尔坐标 | | axisvel | `vector>` | 每个轴的速度 | | axisacc | `vector>` | 每个轴的加速度 | | timeStamp | `vector` | 到达该点位的时间(单位 ms) | ### 使用前提 运行模式下,需要在控制器上运行包含**外部点指令**的作业文件(外部点指令负责接收 servo_move 传输的数据)。 ServoMovePara 结构体说明: ```cpp struct ServoMovePara { ///< 传输参数 int robotNum; ///< 控制第几个机器人 bool clearBuffer; ///< 是否清除之前发送的,未开始插补计算的点位 int targetMode; ///< 0-独立点 1-连续轨迹 int sendMode; ///< 0-一次传输完全部轨迹 1-一次传输部分点位 int runMode; ///< 0-接收完再运动 1-边接受边运动 int sum; ///< 总传输次数 int count; ///< 当前是第几次传输 ///< 运动参数 int coord; ///< 0-关节 1-直角 int size; ///< 本次传输的点位数 std::vector> pos; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个关节角度或笛卡尔坐标 std::vector> axisvel; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个轴的速度 std::vector> axisacc; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个轴的加速度 std::vector timeStamp; ///< 长度为本次传输的点位数,表示到达该点位的时间,单位ms }; ``` ## 示例:使用连续点位轨迹,一次性传输完全部轨迹点位 PS:在使用 servo_move 接口时,需要在运行模式下运行包含有外部点指令的作业文件(外部点指令是接收 servo_move 传输数据的) ```py def test_7000(socketFd): print('开启测试7000.....') socket_7000 = aa.connect_robot("192.168.1.13", "7000") servomovepara = aa.ServoMovePara() pos = aa.VectorVectorDouble() time = aa.VectorDouble() time_pos = [50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550] #到达目标点位的时间戳 for value in time_pos: time.append(value) axis_pos = [[0,0,0,0,0,0,0], [0,0,0,0,0,1,0], [0,0,0,0,0,2,0], [0,0,0,0,0,3,0], [0,0,0,0,0,4,0], [0,0,0,0,0,5,0], [0,0,0,0,0,6,0], [0,0,0,0,0,7,0], [0,0,0,0,0,8,0], [0,0,0,0,0,9,0], [0,0,0,0,0,10,0]] #目标点位 for value in axis_pos: pos.append(value) for k in range(11): servomovepara.pos = pos for j in range(11): servomovepara.timeStamp = time servomovepara.runMode = 0 #默认固定传输0 servomovepara.clearBuffer = True #使用连续运动时,clearBuffer,targetMode,sendMode,runMode需要按照这个固定格式赋值 servomovepara.targetMode = 1 #连续轨迹 servomovepara.coord = 0 # 0-关节坐标 1-直角坐标 servomovepara.size = 11 #传输的目标点位长度 result = aa.servo_move(socket_7000, servomovepara) print("return " , result) ``` --- # 变更日志 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html TODO:待补充 --- # 数据结构 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/04.%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html TODO:待补充 — 结构体定义参见 nrc_interface.py 中的类定义。 --- # 错误码表 > 原文:https://open.inexbot.com/zh/04.%E4%B8%8A%E4%BD%8D%E6%9C%BA/03.Python/04.%E5%8F%82%E8%80%83/%E9%94%99%E8%AF%AF%E7%A0%81%E8%A1%A8.html TODO:待补充 — 参考 C++ 错误码表。 --- # 5000 端口通讯(2207) > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/01.5000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29.html ## 说明 控制器使用 5000 端口进行文件传输,主要用于上传、下载、备份作业文件和配置文件。 ### 上传流程 若要向控制器上传文件,则上位机通过 `0x1D00` 请求上传文件,控制器通过 `0x1D01` 回复上传请求,当控制器同意上传时,上位机通过 `0x1D04` 上传文件,上传完毕后,上位机通过 `0x1D05` 告诉控制器上传结束,控制器通过 `0x1D06` 回复确认接收成功。 ### 下载流程 若要下载控制器中的文件,则上位机通过 `0x1D02` 请求下载文件,控制器通过 `0x1D03` 回复下载请求,当控制器同意下载时,控制器通过 `0x1D07` 向上位机传输其申请下载的文件,并且上位机通过 `0x1D08` 回复控制器接收结果,下载完毕后,控制器通过 `0x1D09` 告诉上位机下载结束,上位机通过 `0x1D0A` 回复确认接收成功。 --- ## 命令列表 | 命令字 | 功能 | 方向 | |--------|------|------| | 0x1D00 | 上位机请求上传文件 | 上位机 → 控制器 | | 0x1D01 | 控制器回复上传请求 | 控制器 → 上位机 | | 0x1D02 | 上位机请求下载文件 | 上位机 → 控制器 | | 0x1D03 | 控制器回复下载请求 | 控制器 → 上位机 | | 0x1D04 | 上位机向控制器上传文件 | 上位机 → 控制器 | | 0x1D05 | 上位机告诉控制器上传结束 | 上位机 → 控制器 | | 0x1D06 | 控制器回复确认接收成功 | 控制器 → 上位机 | | 0x1D07 | 控制器向上位机发送申请下载的文件 | 控制器 → 上位机 | | 0x1D08 | 上位机回复接收结果 | 上位机 → 控制器 | | 0x1D09 | 控制器告诉上位机下载完成 | 控制器 → 上位机 | | 0x1D0A | 上位机回复确认接收成功 | 上位机 → 控制器 | | 0x1D0B | 下载连接断开 | - | | 0x1D10 | 上位机请求备份文件 | 上位机 → 控制器 | | 0x1D11 | 控制器回复备份请求 | 控制器 → 上位机 | | 0x1D12 | 上位机发送下载 log 文件完成 | 上位机 → 控制器 | | 0x1D13 | 上位机发送下载 eni 文件完成 | 上位机 → 控制器 | --- ## 详细命令说明 ### 0x1D00 上位机请求上传文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 上位机发送文件的文件名 | | size | int | 上位机发送文件的文件大小 | **请求示例:** ```json { "name": "vxWorks", "size": 4096 } ``` --- ### 0x1D01 控制器回复上传请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 是否同意上传文件请求 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意上传文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes" } ``` --- ### 0x1D02 上位机请求下载文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要下载的作业文件名称 | **说明:** 参数 name 是作业文件在控制器中的作业文件路径加上名字。在 0x5533 和 0x5534 中系统有向上位机发送路径和名字。示教器提示开始同步作业文件。 **请求示例:** ```json { "name": "job/R1/WWWWW.JBR" } ``` --- ### 0x1D03 控制器回复下载请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 系统是否同意下载文件请求 | | name | string | 需要下载的作业文件名称 | | size | int | 此作业文件的文件大小 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意下载文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes", "name": "job/R1/WWWWW.JBR", "size": 217 } ``` --- ### 0x1D04 上位机向控制器上传文件 **方向:** 上位机 → 控制器 **说明:** 上传文件数据 --- ### 0x1D05 上位机告诉控制器上传结束 **方向:** 上位机 → 控制器 --- ### 0x1D06 控制器回复确认接收成功 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否上传成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 上传成功 | | false | 上传失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D07 控制器向上位机发送申请下载的文件 **方向:** 控制器 → 上位机 **说明:** 传输下载文件数据 --- ### 0x1D08 上位机回复接收结果 **方向:** 上位机 → 控制器 --- ### 0x1D09 控制器告诉上位机下载完成 **方向:** 控制器 → 上位机 --- ### 0x1D0A 上位机回复确认接收成功 **方向:** 上位机 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否下载成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 下载成功 | | false | 下载失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D0B 下载连接断开 **说明:** 断开下载连接 --- ### 0x1D10 上位机请求备份文件 **方向:** 上位机 → 控制器 --- ### 0x1D11 控制器回复备份请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 回复备份文件名 | **响应示例:** ```json { "answer": "controller.tar.gz" } ``` --- ### 0x1D12 上位机发送下载 log 文件完成 **方向:** 上位机 → 控制器 --- ### 0x1D13 上位机发送下载 eni 文件完成 **方向:** 上位机 → 控制器 --- # 机器人运动 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/01.%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%BF%90%E5%8A%A8.html ## 机器人运行状态的查询与回复 ### 示教器查询机器人的运行状态 **命令字:** 0x2304 **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ----------- | ------ | ---- | ------------------------------------------------------------ | | robot | int | 是 | 选择机器人,取值范围 [1, 4] | | jobfilename | string | 是 | 作业文件名(不包括后缀名) | | suffix | string | 是 | 文件扩展名:.JBR 主程序/.JBP 后台局部程序/.JBPG 后台全局程序 | **请求示例:** ```json { "robot": 1, "jobfilename": "AAA", "suffix": ".JBR" } ``` ### 控制器回复机器人运行状态 **命令字:** 0x9103 **响应参数:** | 参数名 | 类型 | 描述 | | -------------- | ---- | -------------------------------- | | robot | int | 机器人编号,取值范围 [1, 4] | | status | int | 运行状态:0-停止,1-暂停,2-运行 | | continueRun | int | 是否存在断点执行:0/1 | | currentRun | bool | 是否存在当前行运行:false/true | | mainProgramRun | int | 主程序是否运行:0/1 | **响应示例:** ```json { "robot": 1, "status": 0, "continueRun": 0, "currentRun": false, "mainProgramRun": 0 } ``` --- ## 机器人运动控制 ### 机器人关节运动 MOVJ **命令字:** 0x4501 **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ------ | --------- | ---- | ---------------------------------------------------------- | | robot | int | 是 | 选择机器人,取值范围 [1, 4] | | vel | int | 是 | 速度百分比,取值范围 [1, 100] | | coord | int | 是 | 坐标系:0-关节坐标,1-直角坐标,2-用户坐标,3-工具坐标 | | pos | double[7] | 是 | 目标位置,前7位为机器人本体目标位置,后5位为外部轴目标位置 | **请求示例:** ```json { "robot": 1, "vel": 5, "coord": 0, "pos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7] } ``` ### 机器人直线运动 MOVL **命令字:** 0x4502 **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ------ | --------- | ---- | ---------------------------------------------------------- | | robot | int | 是 | 选择机器人,取值范围 [1, 4] | | vel | int | 是 | 速度 mm/s,取值范围 [1, 1000] | | coord | int | 是 | 坐标系:0-关节坐标,1-直角坐标,2-用户坐标,3-工具坐标 | | pos | double[7] | 是 | 目标位置,前7位为机器人本体目标位置,后5位为外部轴目标位置 | **请求示例:** ```json { "robot": 1, "vel": 5, "coord": 0, "pos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7] } ``` ### 机器人圆弧运动 MOVC **命令字:** 0x4503 **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | -------- | --------- | ---- | ------------------------------------------------------ | | robot | int | 是 | 选择机器人,取值范围 [1, 4] | | vel | int | 是 | 速度 mm/s,取值范围 [1, 1000] | | coord | int | 是 | 坐标系:0-关节坐标,1-直角坐标,2-用户坐标,3-工具坐标 | | isFull | bool | 是 | false-MOVC,true-MOVCA | | posOne | double[7] | 是 | 圆弧起始点,机器人本体点位 | | posTwo | double[7] | 是 | 圆弧经过的中间点,机器人本体点位 | | posThree | double[7] | 是 | 圆弧的目标点,机器人本体点位 | **请求示例:** ```json { "robot": 1, "vel": 5, "coord": 0, "isFull": false, "posOne": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], "posTwo": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], "posThree": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7] } ``` ### 机器人样条曲线运动 MOVS **命令字:** 0x4504 **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ------ | ----------- | ---- | ------------------------------------------------------ | | robot | int | 是 | 选择机器人,取值范围 [1, 4] | | vel | int | 是 | 速度 mm/s,取值范围 [1, 1000] | | coord | int | 是 | 坐标系:0-关节坐标,1-直角坐标,2-用户坐标,3-工具坐标 | | size | int | 是 | 样条曲线的点数目,要求至少4个点位 | | pos | double[][7] | 是 | 样条曲线的轨迹点位,二维数组 | **请求示例:** ```json { "robot": 1, "vel": 5, "coord": 0, "size": 4, "pos": [ [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7] ] } ``` --- ## 移动到目标点位 ### 移动到目标点位 **命令字:** 0x3003 GO_POSITION **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ------------ | ------ | ---- | ------------------------------------------------------------------------------------- | | robot | int | 是 | 机器人编号 | | positionName | string | 是 | 目标点位名:SetPosition_EntrancePoint/SetPosition_AuxiliaryPoint/SetPosition_JobPoint | | RobotPos | object | 是 | 机器人位置对象 | **RobotPos 内部参数:** | 参数名 | 类型 | 描述 | | ----------- | ---------- | --------------------------------------------------------------- | | ctype | int | 类型:NONE_TYPE=0/P_TYPE/E_TYPE/RP_TYPE/AP_TYPE/GP_TYPE/GE_TYPE | | data | double[21] | 位置数据数组,详见下方说明 | | key | string | 变量类型 | | paraVarData | array | 变量数组 | **data 数组说明:** | 索引位置 | 描述 | | -------------- | -------------------------------------------------------------------------- | | 第1、2位 | 坐标类型:0,0-关节坐标;1,1-直角坐标;2,1-工具坐标;3,1-用户坐标 | | 第3位 | 左右手:1-左,2-右,0-无左右手(默认0) | | 第4、5、6、7位 | 备用,默认0 | | 第8-14位 | 机器人本体坐标值(7位):关节坐标下为1-6轴角度值,其他坐标下为 x,y,z,a,b,c | | 第15-19位 | 外部轴坐标值(最大5个外部轴,不足补零) | **请求示例:** ```json { "robot": 1, "positionName": "SetPosition_JobPoint", "RobotPos": { "ctype": 0, "key": "", "data": [ 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.14159, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "paraVarData": [ { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.14159, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] } } ``` ::: tip 说明: 程序中无对应指令。 ::: ### 运动到作业文件点位 **命令字:** 0x3005 GO_JOBFILEPOSITION **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ---------- | ------ | ---- | ------------------------- | | robot | int | 是 | 机器人编号 | | jobName | string | 是 | 作业文件名称 | | suffixname | string | 是 | 作业文件后缀名(如 .JBR) | | posName | string | 是 | 点位名称 | **请求示例:** ```json { "robot": 1, "jobName": "Q1", "suffixname": ".JBR", "posName": "P001" } ``` ### 运动到用户坐标标定点位 **命令字:** 0x3006 GO_USERCALIBRATIONPOS **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ------- | ---- | ---- | -------------------------------- | | robot | int | 是 | 机器人编号 | | userNum | int | 是 | 用户编号 | | posType | int | 是 | 点位类型:0-原点,1-X 值,2-Y 值 | **请求示例:** ```json { "robot": 1, "userNum": 1, "posType": 0 } ``` ### 运动到复位点 **命令字:** 0x3007 GO_RESET_POSITION **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ------ | ---- | ---- | ---------- | | robot | int | 是 | 机器人编号 | **请求示例:** ```json { "robot": 1 } ``` --- ## 回零命令 ### 回零命令 **命令字:** 0x3002 GO_HOME **请求参数:** | 参数名 | 类型 | 必填 | 描述 | | ------ | ---- | ---- | ------------------------------------ | | robot | int | 是 | 机器人编号(1-4) | | type | int | 是 | 回零类型:0-机器人回零,1-外部轴回零 | **请求示例:** ```json { "robot": 1, "type": 1 } ``` --- # 外部轴运动 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/02.%E5%A4%96%E9%83%A8%E8%BD%B4%E8%BF%90%E5%8A%A8.html ## 机器人外部轴关节运动 MOVJEXT **命令字:** `0x4507` | 参数 | 类型 | 必填 | 说明 | 取值范围 | |------|------|------|------|----------| | robot | int | 是 | 选择机器人 | [1, 4] | | vel | int | 是 | 速度 | [1, 100],单位:% | | coord | int | 是 | 坐标系 | 0-关节坐标,1-直角坐标,2-用户坐标,3-工具坐标 | | pos | double[12] | 是 | 目标位置:前7位为机器人本体目标位置,后5位为外部轴目标位置 | - | **请求示例:** ```json { "robot": 1, "vel": 5, "coord": 0, "pos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 1.0, 2.0, 3.0, 4.0, 5.0] } ``` --- ## 机器人外部轴直线运动 MOVLEXT **命令字:** `0x4508` | 参数 | 类型 | 必填 | 说明 | 取值范围 | |------|------|------|------|----------| | robot | int | 是 | 选择机器人 | [1, 4] | | vel | int | 是 | 速度 | [1, 1000],单位:mm/s | | coord | int | 是 | 坐标系 | 0-关节坐标,1-直角坐标,2-用户坐标,3-工具坐标 | | pos | double[12] | 是 | 目标位置:前7位为机器人本体目标位置,后5位为外部轴目标位置 | - | **请求示例:** ```json { "robot": 1, "vel": 5, "coord": 0, "pos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 1.0, 2.0, 3.0, 4.0, 5.0] } ``` --- ## 机器人外部轴圆弧运动 MOVCEXT **命令字:** `0x4509` | 参数 | 类型 | 必填 | 说明 | 取值范围 | |------|------|------|------|----------| | robot | int | 是 | 选择机器人 | [1, 4] | | vel | int | 是 | 速度 | [1, 1000],单位:mm/s | | coord | int | 是 | 坐标系 | 0-关节坐标,1-直角坐标,2-用户坐标,3-工具坐标 | | posOne | double[12] | 是 | 圆弧起始点:前7位为机器人本体目标位置,后5位为外部轴目标位置 | - | | posTwo | double[12] | 是 | 圆弧经过的中间点:前7位为机器人本体目标位置,后5位为外部轴目标位置 | - | | posThree | double[12] | 是 | 圆弧的目标点:前7位为机器人本体目标位置,后5位为外部轴目标位置 | - | **请求示例:** ```json { "robot": 1, "vel": 5, "coord": 0, "posOne": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 1.0, 2.0, 3.0, 4.0, 5.0], "posTwo": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 1.0, 2.0, 3.0, 4.0, 5.0], "posThree": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 1.0, 2.0, 3.0, 4.0, 5.0] } ``` --- ## 外部轴移动到目标点 **命令字:** `0x3004` (GO_SYNCPOSITION) ### RobotPos 结构说明 | 字段 | 类型 | 说明 | |------|------|------| | ctype | int | P 类型:NONE_TYPE=0, P_TYPE, E_TYPE, RP_TYPE, AP_TYPE, GP_TYPE, GE_TYPE | | data | double[21] | 位置数据数组,详见下方数组索引说明 | | key | string | 变量类型 | | paraVarData | array | 变量数据数组 | ### data 数组索引说明 | 索引位置 | 含义 | 说明 | |----------|------|------| | 0, 1 | 坐标系标识 | 0 0-关节坐标,1 1-直角坐标,2 1-工具坐标,3 1-用户坐标 | | 2 | 左右手 | 1-左,2-右,0-无左右手(默认0) | | 3, 4, 5, 6 | 备用 | 默认0 | | 7 ~ 13 | 机器人本体坐标 | 7位,关节坐标下表示1-6轴角度值,其他坐标下表示 x,y,z,a,b,c | | 14 ~ 18 | 外部轴坐标 | 最大支持5个外部轴,只有关节值,不足补零 | ### 请求示例 ```json { "RobotPos": { "ctype": 0, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.141590, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.141590, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "robot": 1 } ``` --- # 机器人设置 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/03.%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%AE%BE%E7%BD%AE.html ## 点动速度设置 ### 设置关节轴点动速度 **命令字**: `0x2604 JOG_JOINTPARAMETER_SET` ```json { "AxisNum": 1, "minTrajectTime": { "minAccTime": 0.10, "minDecTime": 0.10 }, "MaxSpeed": 10, "MaxAcc": 10 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | AxisNum | int | 是 | 关节轴编号 | | minTrajectTime.minAccTime | float | 是 | 最小加速度时间 | | minTrajectTime.minDecTime | float | 是 | 最小减速度时间 | | MaxSpeed | float | 是 | 关节轴最大点动速度,单位:度°/s | | MaxAcc | float | 是 | 关节轴点动加速度,单位:度°/s² | ### 查询关节轴点动速度 **发送命令字**: `0x2605 JOG_JOINTPARAMETER_INQUIRE` ```json { "AxisNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | AxisNum | int | 是 | 关节轴编号 | **返回命令字**: `0x2606 JOG_JOINTPARAMETER_RESPOND` ```json { "AxisNum": 1, "MaxSpeed": 10, "MaxAcc": 10 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | AxisNum | int | 关节轴编号 | | MaxSpeed | float | 关节轴最大点动速度,单位:度°/s | | MaxAcc | float | 关节轴点动加速度,单位:度°/s² | ### 设置直角坐标点动速度 **命令字**: `0x2607 JOG_RECTPARAMETER_SET` ```json { "MaxSpeed": 10, "MaxAcc": 10 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | MaxSpeed | float | 是 | 关节轴最大点动速度,单位:mm/s | | MaxAcc | float | 是 | 关节轴点动加速度,单位:mm/s² | ### 查询直角坐标点动速度 **发送命令字**: `0x2608 JOG_RECTPARAMETER_INQUIRE` data: 空 **返回命令字**: `0x2609 JOG_RECTPARAMETER_RESPOND` ```json { "MaxSpeed": 10, "MaxAcc": 10 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | MaxSpeed | float | 关节轴最大点动速度,单位:mm/s | | MaxAcc | float | 关节轴点动加速度,单位:mm/s² | ## 点动灵敏度设置 ### 设置点动灵敏度 **命令字**: `0x260A JOG_SENSITIVITY_SET` ```json { "Sensitivity": 0.001 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | Sensitivity | float | 是 | 灵敏度,单位:度,范围:0.001 - 1 | ### 查询点动灵敏度 **发送命令字**: `0x260B JOG_SENSITIVITY_INQUIRE` data: 空 **返回命令字**: `0x260C JOG_SENSITIVITY_RESPOND` ```json { "Sensitivity": 0.001 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | Sensitivity | float | 灵敏度,单位:度,范围:0.001 - 1 | ## 当前位置获取 ### 坐标模式说明 | 坐标模式值 | 说明 | |------------|------| | -1 | 控制器当前坐标 | | 0 | 关节坐标 (Joint) | | 1 | 直角坐标 (Cart) | | 2 | 工具坐标 (Tool) | | 3 | 用户坐标 (User) | ### 获取当前位置 **发送命令字**: `0x2A02 CURRENTPOS_INQUIRE` ```json { "robot": 1, "coord": 2 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 (1, 2, 3, 4) | | coord | int | 是 | 坐标模式:-1-控制器当前坐标, 0-关节坐标, 1-直角坐标, 2-工具坐标, 3-用户坐标 | **返回命令字**: `0x2A03 CURRENTPOS_RESPOND` ```json { "robot": 1, "deg": 1, "pos": [0, 0.1, 2, 3.3, 44, 555.55, 0.0], "posDeg": [0.0, 0.0, 1, 2, 3.3, 44, 5.55], "coord": -1, "configuration": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 (1, 2, 3, 4) | | deg | int | 是否为 ACS 坐标系;0:是;1:不是 | | pos | array | 弧度点位值,坐标值用7位存储关节坐标下。前六位为 J1~J6轴角度值(度)或直角/工具/用户坐标 XYZ(毫米),四到六位为 ABC 坐标值(弧度),第七位保留 | | posDeg | array | 角度点位值,直角/工具/用户坐标下 ABC 弧度值转为角度值,其余状态数值与 pos 一致 | | coord | int | 坐标模式:-1-控制器当前坐标, 0-关节坐标, 1-直角坐标, 2-工具坐标, 3-用户坐标 | | configuration | int | 姿态或(SCARA)左右手 | ### 查询电机速度 **发送命令字**: `0x2A04 CURRENTVEL_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 (1, 2, 3, 4) | **返回命令字**: `0x2A05 CURRENTVEL_RESPOND` ```json { "robot": 1, "vel": [0, 0, 0, 0, 0, 0], "velSync": [0, 0, 0, 0, 0], "maxVel": [0, 0, 0, 0, 0, 0], "maxVelSync": [0, 0, 0, 0, 0] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 (1, 2, 3, 4) | | vel | array | 电机速度,4轴也发六个 | | velSync | array | 外部轴电机速度 | | maxVel | array | 最大电机速度 | | maxVelSync | array | 最大外部轴电机速度 | ### 查询电机扭矩 **发送命令字**: `0x2A06 CURRENTTORQ_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 (1, 2, 3, 4) | **返回命令字**: `0x2A07 CURRENTTORQ_RESPOND` ```json { "robot": 1, "torq": [0, 0, 0, 0, 0, 0], "theoTorq": [0, 0, 0, 0, 0, 0], "maxTorq": [0, 0, 0, 0, 0, 0], "maxTheoTorq": [0, 0, 0, 0, 0, 0], "maxTorqSync": [0, 0, 0, 0, 0], "torqSync": [0, 0, 0, 0, 0] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 (1, 2, 3, 4) | | torq | array | 电机扭矩 | | theoTorq | array | 理论电机扭矩 | | maxTorq | array | 电机最大扭矩 | | maxTheoTorq | array | 理论电机最大扭矩 | | maxTorqSync | array | 外部轴电机最大扭矩 | | torqSync | array | 外部轴电机扭矩 | ## 运行参数设置 ### 设置运行参数 **命令字**: `0x2801 INTERPOLATION_MODE_SET` ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "runDelayTime": 500, "stopTime": 240 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | absolutePosResolution | float | 是 | 绝对位置分辨率,范围:0.0001 - 0.1 度 | | interpolationMethod | int | 是 | 机器人插补方式:0-S 型, 1-梯形, 2-加加插补 | | runDelayTime | int | 是 | 运行延时时间,范围:500 - 20000 毫秒 | | stopTime | int | 是 | 暂停时间,范围:240 - 2000 毫秒 | ### 查询运行参数 **发送命令字**: `0x2802 INTERPOLATION_MODE_INQUIRE` data: 无 **返回命令字**: `0x2803 INTERPOLATION_MODE_RESPOND` ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "runDelayTime": 500, "stopTime": 240 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | absolutePosResolution | float | 绝对位置分辨率,单位:度 | | interpolationMethod | int | 机器人插补方式:0-S 型, 1-梯形, 2-加加插补 | | runDelayTime | int | 运行延时时间,单位:毫秒 | | stopTime | int | 暂停时间,单位:毫秒 | ## 查询机器人类型、数目 ### 查询机器人类型 **发送命令字**: `0x2E02 ROBOT_TYPE_INQUIRE` ```json { "data": null } ``` **返回命令字**: `0x2E03 ROBOT_TYPE_RESPOND` ```json { "type": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | 当前机器人类型 | **机器人类型对照表**: | 类型值 | 说明 | |--------|------| | 0 | 无 | | 1 | 通用六轴串联多关节 | | 2 | 四轴 SCARA | | 3 | 四轴码垛 | | 4 | 四轴串联多关节 | | 5 | 单轴 | | 6 | 五轴串联多关节 | | 7 | 6轴协作 | | 8 | 二轴 SCARA | | 9 | 三轴 SCARA | | 10 | 三轴直角 | | 11 | 三轴异形一 | | 12 | 七轴串联多关节 | | 13 | SCARA 异形一 | | 14 | 四轴码垛丝杆 | | ... | 更多类型略 | ### 查询机器人数目 **发送命令字**: `0x2E05 ROBOT_SUM_INQUIRE` ```json { "data": null } ``` **返回命令字**: `0x2E06 ROBOT_SUM_RESPOND` ```json { "sum": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | sum | int | 机器人数目 | ### 设置机器人通讯周期 **命令字**: `0x2E07 CONTROL_CYCLE_SET` ```json { "controlCycle": 1, "baudRate": "10K" } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | controlCycle | int | 是 | 通讯周期,范围:1, 2, 4, 8,控制器重启生效 | | baudRate | string | 是 | CAN_OPEN 的波特率 | ### 查询机器人通讯周期 **发送命令字**: `0x2E08 CONTROL_CYCLE_INQUIRE` ```json { "data": null } ``` **返回命令字**: `0x2E09 CONTROL_CYCLE_RESPOND` ```json { "controlCycle": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | controlCycle | int | 通讯周期 | ### 查询控制器功能限制情况 **发送命令字**: `0x2E0B CONTROLLER_LIMIT_INQUIRE` ```json { "data": null } ``` **返回命令字**: `0x2E0C CONTROLLER_LIMIT_RESPOND` ```json { "robotsum": 2, "maxRobotCount": 4, "robottypes": { "R_GENERAL_6S": false, "R_SCARA": true, "R_FOURAXIS_PALLET": true, "R_FOURAXIS": true, "R_GENERAL_1S": true, "R_GENERAL_5S": true, "R_GENERAL_6S_1": true, "R_SCARA_TWOAXIS": true, "R_SCARA_THREEAXIS": true, "R_THREE_CARTESIAN_COORDINATE": true, "R_THREE_CARTESIAN_COORDINATE_1": true, "R_GENERAL_7S": true, "R_SCARA_1": true, "R_FOURAXIS_PALLET_1": true, "R_FOUR_CARTESIAN_COORDINATE": true, "R_SIXAXIS_SPRAY_BBR": true, "R_FOUR_POLAR_COORDINATE_1": true, "R_GENERAL_6S_2": true, "R_GANTRY_WELD": true, "R_DELTA": true, "R_WINE_CHAMFER": true }, "craft": { "pallet": true, "weld": false, "lasercut": true, "polish": true, "spray": true, "search": true, "pun": true, "vision": true } } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robotsum | int | 机器人个数 | | maxRobotCount | int | 机器人最大数目 | | robottypes | object | 机器人类型解锁状态,true-已解锁, false-未解锁 | | craft | object | 工艺解锁状态,true-已解锁, false-未解锁 | **robottypes 类型说明**: | 类型键 | 说明 | |--------|------| | R_GENERAL_6S | 六轴串联多关节 | | R_SCARA | 四轴 SCARA | | R_FOURAXIS_PALLET | 四轴连杆码垛 | | R_FOURAXIS | 四轴串联多关节 | | R_GENERAL_1S | 一轴通用 | | R_GENERAL_5S | 五轴串联多关节 | | R_GENERAL_6S_1 | 六轴协作 | | R_SCARA_TWOAXIS | 二轴 SCARA | | R_SCARA_THREEAXIS | 三轴 SCARA | | R_THREE_CARTESIAN_COORDINATE | 三轴直角 | | R_THREE_CARTESIAN_COORDINATE_1 | 三轴直角异型1 | | R_GENERAL_7S | 七轴串联多关节 | | R_SCARA_1 | 四轴 SCARA 异型1 | | R_FOURAXIS_PALLET_1 | 四轴码垛丝杆 | | R_FOUR_CARTESIAN_COORDINATE | 四轴直角 | | R_SIXAXIS_SPRAY_BBR | 六轴喷涂 | | R_FOUR_POLAR_COORDINATE_1 | 四轴极坐标异型 | | R_GENERAL_6S_2 | 六轴异型1 | | R_GANTRY_WELD | 龙门焊接 | | R_DELTA | 并联机器人 | | R_WINE_CHAMFER | 酒槽机型 | **craft 工艺说明**: | 工艺键 | 说明 | |--------|------| | pallet | 码垛工艺 | | weld | 焊接工艺 | | lasercut | 激光切割工艺 | | polish | 打磨工艺 | | spray | 喷涂工艺 | | search | 寻位跟踪工艺 | | pun | 冲压工艺 | | vision | 视觉工艺 | ### 查询从站列表 **发送命令字**: `0x2E0E SLAVETYPE_LIST_INQUIRE` data: 无 **返回命令字**: `0x2E0F SLAVETYPE_LIST_RESPOND` ```json { "IONum": [0, 0, 0, 0, 0, 0, 1, 2], "servoNum": [1, 2, 3, 4, 5, 6, 0, 0], "slaveType": ["摩通", "摩通", "摩通", "摩通", "摩通", "摩通", "IO板R4C_PWM", "摩通"], "slaveTypeEnglish": ["mt", "mt", "mt", "mt", "mt", "mt", "inexbot_IO_R4C_PWM", "mt_MSR1616A"] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | IONum | array | IO 编号 | | servoNum | array | 伺服编号 | | slaveType | array | 伺服型号(中文) | | slaveTypeEnglish | array | 伺服型号(英文)/ IO 型号 | ## 设置双机协作机器人 ### 设置协作机器人个数 **命令字**: `0x2E11 COROBOT_SET` ```json { "cooperativeRobot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | cooperativeRobot | int | 是 | 协作机器人个数,0表示无 | ### 查询协作机器人个数 **发送命令字**: `0x2E12 COROBOT_INQUIRE` ```json { "data": null } ``` **返回命令字**: `0x2E13 COROBOT_RESPOND` ```json { "cooperativeRobot": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | cooperativeRobot | int | 协作机器人个数,0表示无 | ## 机器人类型及映射 ### 设置机器人类型及映射 **命令字**: `0x2E14 ROBOTTYPE_AXISMAP_SET` ```json { "sum": 1, "robot": [ { "robotType": "R_SCARA", "servoMap": [1, 2, 3, 4], "syncSum": 2, "syncGroupSum": 1, "syncType": [2, 0, 0], "syncMap": [[5, 6], [7, 8]] } ], "servoSum": 0 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | sum | int | 是 | 机器人个数 | | robot | array | 是 | 机器人配置数组 | | robot[].robotType | string | 是 | 机器人类型 | | robot[].servoMap | array | 是 | 伺服映射 | | robot[].syncSum | int | 是 | 外部轴个数 | | robot[].syncGroupSum | int | 是 | 外部轴组数 | | robot[].syncType | array | 是 | 外部轴组类型 | | robot[].syncMap | array | 是 | 外部轴映射 | | servoSum | int | 是 | 伺服个数 | ### 查询机器人类型及映射 **发送命令字**: `0x2E15 ROBOTTYPE_AXISMAP_INQUIRE` ```json { "data": null } ``` **返回命令字**: `0x2E16 ROBOTTYPE_AXISMAP_RESPOND` ```json { "servoSum": 6, "sum": 1, "robot": [ { "note": "", "robotType": "R_SCARA", "servoMap": [1, 2, 3, 4], "syncSum": 2, "syncGroupSum": 1, "syncType": [2, 0, 0], "syncMap": [[5, 6]] } ] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | servoSum | int | 伺服个数 | | sum | int | 机器人个数 | | robot | array | 机器人配置数组 | | robot[].note | string | 备注 | | robot[].robotType | string | 机器人类型 | | robot[].servoMap | array | 伺服映射 | | robot[].syncSum | int | 外部轴个数 | | robot[].syncGroupSum | int | 外部轴组数 | | robot[].syncType | array | 外部轴类型 | | robot[].syncMap | array | 外部轴映射 | ### 设置从动轴 **命令字**: `0x2E17 DRIVENSHAFT_SET` ```json { "robot": [ { "axis": [ { "sum": 2, "data": [ { "num": 1, "reducRatio": 1.0, "encoder": 17, "dir": 1 }, { "num": 1, "reducRatio": 1.0, "encoder": 17, "dir": 1 } ] }, { "sum": 2, "data": [ { "num": 1, "reducRatio": 1.0, "encoder": 17, "dir": 1 }, { "num": 1, "reducRatio": 1.0, "encoder": 17, "dir": 1 } ] } ], "sync": [ [ { "sum": 2, "data": [ { "num": 1, "reducRatio": 1.0, "encoder": 17, "dir": 1 }, { "num": 1, "reducRatio": 1.0, "encoder": 17, "dir": 1 } ] } ] ] } ] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | array | 是 | 机器人从动轴配置 | | robot[].axis | array | 是 | 从动轴配置 | | robot[].axis[].sum | int | 是 | 从动轴数量 | | robot[].axis[].data | array | 是 | 从动轴数据 | | robot[].axis[].data[].num | int | 是 | 从动轴编号 | | robot[].axis[].data[].reducRatio | float | 是 | 减速比 | | robot[].axis[].data[].encoder | int | 是 | 编码器位数 | | robot[].axis[].data[].dir | int | 是 | 相对主电机方向 (1 or -1) | | robot[].sync | array | 是 | 外部轴从动轴配置 | ### 查询从动轴 **发送命令字**: `0x2E18 DRIVENSHAFT_INQUIRE` data: 无 **返回命令字**: `0x2E19 DRIVENSHAFT_RESPOND` data: 同设置 ## ENI 查询 ### 查询 ENI 名称 **发送命令字**: `0x2E1B ENINAME_INQUIRE` data: 无 **返回命令字**: `0x2E1C ENINAME_RESPOND` ```json { "ENIName": "eni-RC-6-mecat-1-1000.xml", "isHaveENI": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | ENIName | string | ENI 文件名 | | isHaveENI | int | 1-识别到 ENI 文件, 0-未找到对应 ENI, -1-无 ENI | ## DH 参数 ### 设置 DH 参数 **命令字**: `0x3A01 DHPARAMETER_SET` ```json { "CoupleCoe": { "Couple_Coe_1_2": 0.0, "Couple_Coe_2_3": 0.0, "Couple_Coe_3_2": 0.0, "Couple_Coe_3_4": 0.0, "Couple_Coe_4_5": 0.0, "Couple_Coe_4_6": 0.0, "Couple_Coe_5_6": 0.0 }, "Link": [ {"a": 3.0, "d": 3.0}, {"a": 3.0, "d": 0.0}, {"a": 3.0}, {"d": 3.0}, {"d": 0.0, "theta": 90.0}, {"d": 3.0} ], "upsideDown": false } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | CoupleCoe | object | 是 | 耦合比参数 | | CoupleCoe.Couple_Coe_1_2 | float | 是 | 1/2耦合比 | | CoupleCoe.Couple_Coe_2_3 | float | 是 | 2/3耦合比 | | CoupleCoe.Couple_Coe_3_2 | float | 是 | 3/2耦合比 | | CoupleCoe.Couple_Coe_3_4 | float | 是 | 3/4耦合比 | | CoupleCoe.Couple_Coe_4_5 | float | 是 | 4/5耦合比 | | CoupleCoe.Couple_Coe_4_6 | float | 是 | 4/6耦合比 | | CoupleCoe.Couple_Coe_5_6 | float | 是 | 5/6耦合比 | | Link | array | 是 | 杆长配置,不同机器人不一样 | | Link[].a | float | 否 | DH 参数 a | | Link[].d | float | 否 | DH 参数 d | | Link[].theta | float | 否 | DH 参数 theta(五轴方向) | | upsideDown | bool | 是 | 是否倒装 | ### 查询 DH 参数 **发送命令字**: `0x3A02 DHPARAMETER_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **返回命令字**: `0x3A03 DHPARAMETER_RESPOND` ```json { "CoupleCoe": { "Couple_Coe_1_2": 0.0, "Couple_Coe_2_3": 0.0, "Couple_Coe_3_2": 0.0, "Couple_Coe_3_4": 0.0, "Couple_Coe_4_5": 0.0, "Couple_Coe_4_6": 0.0, "Couple_Coe_5_6": 0.0 }, "Link": [ {"a": 3.0, "alpha": 90.0, "d": 3.0, "theta": 0.0}, {"a": 3.0, "alpha": 0.0, "d": 0.0, "theta": 90.0}, {"a": 3.0, "alpha": 90.0, "d": 0.0, "theta": 0.0}, {"a": 0.0, "alpha": 90.0, "d": 3.0, "theta": 0.0}, {"a": 0.0, "alpha": -90.0, "d": 0.0, "theta": 90.0}, {"a": 0.0, "alpha": 0.0, "d": 3.0, "theta": 0.0} ], "angleToDistance": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "distanceToAngle": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "robotType": 1, "upsideDown": false } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | CoupleCoe | object | 耦合比参数 | | Link | array | 杆长 DH 参数 | | Link[].a | float | DH 参数 a | | Link[].alpha | float | DH 参数 alpha | | Link[].d | float | DH 参数 d | | Link[].theta | float | DH 参数 theta | | angleToDistance | array | 角度到距离转换系数 | | distanceToAngle | array | 距离到角度转换系数 | | robotType | int | 机器人类型 | | upsideDown | bool | 是否倒装 | ## 关节参数 ### 设置关节参数 **命令字**: `0x3B01 JOINTPARAMETER_SET` ```json { "Joint": { "AxisDirection": 1.0, "AxisNum": 5, "BackLash": 0.0, "DeRatedVel": -36.0, "Direction": 1.0, "EncoderResolution": 17, "MaxAcc": 1.0, "MaxDeRotSpeed": -1.0, "MaxDecel": -1.0, "MaxJerkAcc": 1.0, "MaxJerkDec": -1.0, "MaxRotSpeed": 1.0, "NegSWLimit": -1.0, "PosSWLimit": 1.0, "RatedDeRotSpeed": -6.0, "RatedRotSpeed": 6.0, "RatedVel": 36.0, "ReducRatio": 1.0, "reduce_ratio_enable": true } } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | Joint.AxisDirection | float | 是 | 关节实际方向 | | Joint.AxisNum | int | 是 | 关节编号(1代表 J1) | | Joint.BackLash | float | 是 | 齿轮反向间隙 | | Joint.DeRatedVel | float | 是 | 关节额定反速度 | | Joint.Direction | float | 是 | 模型方向 | | Joint.EncoderResolution | int | 是 | 编码器位数 | | Joint.MaxAcc | float | 是 | 最大加速度 | | Joint.MaxDeRotSpeed | float | 是 | 最大反转速 | | Joint.MaxDecel | float | 是 | 关节最大减速度 | | Joint.MaxJerkAcc | float | 是 | 最大加加速度 | | Joint.MaxJerkDec | float | 是 | 最大减减速度 | | Joint.MaxRotSpeed | float | 是 | 最大正转速 | | Joint.NegSWLimit | float | 是 | 关节反限位 | | Joint.PosSWLimit | float | 是 | 关节正限位 | | Joint.RatedDeRotSpeed | float | 是 | 额定反转速 | | Joint.RatedRotSpeed | float | 是 | 额定正转速 | | Joint.RatedVel | float | 是 | 关节额定正速度 | | Joint.ReducRatio | float | 是 | 减速比 | | Joint.reduce_ratio_enable | bool | 是 | 编码器是否经过减速机 | ### 查询关节参数 **发送命令字**: `0x3B02 JOINTPARAMETER_INQUIRE` ```json { "AxisNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | AxisNum | int | 是 | 关节编号(1代表 J1) | **返回命令字**: `0x3B03 JOINTPARAMETER_RESPOND` 同 0x3B01 设置格式 ## 笛卡尔参数 ### 设置笛卡尔坐标参数 **命令字**: `0x3B04 DECAREPARAMETER_SET` ```json { "Decare": { "MaxVel": 1000.0, "MaxAcc": 3000.0, "MaxDec": 3000.0, "MaxJerk": 10000.0, "MaxAttitudeVel": 1000.0, "SpeedLimitMode": 0, "MaxSpeed": 5000.0 } } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | Decare.MaxVel | float | 是 | 最大速度,范围:[1, 5000] mm/s | | Decare.MaxAcc | float | 是 | 最大加速度,范围:[1, 15] 倍 | | Decare.MaxDec | float | 是 | 最大减速度,范围:[-15, -1] 倍 | | Decare.MaxJerk | float | 是 | 最大加加速度 | | Decare.MaxAttitudeVel | float | 是 | 姿态运动最大速度,范围:[1, 1000] 度/s | | Decare.SpeedLimitMode | int | 是 | 速度限制方式:0-位姿, 1-位置 | | Decare.MaxSpeed | float | 是 | 最大速度 | ### 查询笛卡尔坐标参数 **发送命令字**: `0x3B05 DECAREPARAMETER_INQUIRE` data: 无 **返回命令字**: `0x3B06 DECAREPARAMETER_RESPOND` ```json { "Decare": { "MaxAttitudeVel": 1000, "MaxAcc": 3000, "MaxDec": 3000, "MaxJerk": 10000, "MaxSpeed": 5000.0, "SpeedLimitMode": 0 } } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | Decare.MaxAttitudeVel | float | 姿态运动最大速度 | | Decare.MaxAcc | float | 最大加速度 | | Decare.MaxDec | float | 最大减速度 | | Decare.MaxJerk | float | 最大加加速度 | | Decare.MaxSpeed | float | 最大速度 | | Decare.SpeedLimitMode | int | 速度限制方式:0-位姿, 1-位置 | ## 编码器多圈值溢出计数功能 ### 设置编码器溢出参数 **命令字**: `0x3B07 ENCODE_OVERFLOW_PARM_SET` ```json { "robot": 1, "robotAxis": [ { "enable": 0, "axisSlaveSum": 1, "encode": [ {"max": "2147483647", "mix": "-2147483648"}, {"max": "2147483647", "mix": "-2147483648"} ] }, { "enable": 0, "axisSlaveSum": 1, "encode": [ {"max": "2147483647", "mix": "-2147483648"}, {"max": "2147483647", "mix": "-2147483648"} ] }, { "enable": 0, "axisSlaveSum": 1, "encode": [ {"max": "2147483647", "mix": "-2147483648"}, {"max": "2147483647", "mix": "-2147483648"} ] } ] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | robotAxis | array | 是 | 机器人轴配置(外部轴使用 syncAxis) | | robotAxis[].enable | int | 是 | 使能标志 | | robotAxis[].axisSlaveSum | int | 是 | 从动轴数量 | | robotAxis[].encode | array | 是 | 编码器配置数组 | | robotAxis[].encode[].max | string | 是 | 编码器最大值 | | robotAxis[].encode[].mix | string | 是 | 编码器最小值 | ### 查询编码器溢出参数 **发送命令字**: `0x3B08 ENCODE_OVERFLOW_PARM_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **返回命令字**: `0x3B09 ENCODE_OVERFLOW_PARM_RESPOND` data:同0x3B07 ## 编码器清零 ### 编码器清零 **命令字**: `0x3301 ENCODER_RESET` ```json { "axis": 0, "clearEncoder": true } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | axis | int | 是 | 关节轴编号:'0'代表全部轴,'1'代表轴1,'2'代表轴2 | | clearEncoder | bool | 是 | 是否清除多圈值 | **返回命令字**: `0x3303 ENCODER_RESET_RESPOND` ```json { "axis": 0, "result": 1, "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | axis | int | 关节轴编号 | | result | int | 操作结果:0-失败, 1-成功 | | robot | int | 机器人编号 | ### 查询编码器欠压状态 **发送命令字**: `0x3305 ENCODER_UNDERVOL_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 (1-4) | **返回命令字**: `0x3306 ENCODER_UNDERVOL_RESPOND` ```json { "robot": 1, "encoderUndervoltage": [false, true, false, true, false, true, false], "encoderUndervoltageSync": [false, true, false, true, false] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | encoderUndervoltage | array | 各轴欠压报警状态,false-不欠压, true-欠压 | | encoderUndervoltageSync | array | 外部轴欠压报警状态,false-不欠压, true-欠压 | ## 零点偏移 ### 设置零点偏移 **命令字**: `0x3307 ENCODER_ZERO_OFFSET_SET` ```json { "robot": 1, "mode": 0, "axis": 0, "value": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | mode | int | 是 | 零点偏移方式:0-角度, 1-编码值 | | axis | int | 是 | 关节轴编号:'0'代表全部轴 | | value | array | 是 | 零点偏移值,对应各轴的角度/编码值,范围:-360~360 | ### 设置单圈值 **命令字**: `0x3308 ENCODER_ZERO_SET` ```json { "robot": 1, "value": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 (1-4) | | value | array | 是 | 六个关节脉冲值,单位:inc,范围:十位整数 | ### 查询单圈值 **发送命令字**: `0x3309 ENCODER_ZERO_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 (1-4) | **返回命令字**: `0x330A ENCODER_ZERO_RESPOND` ```json { "robot": 1, "value": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | value | array | 关节位置角度数据,几轴就返回几个 | ## 示教器获取电机编码器值 ### 获取电机编码器值 **发送命令字**: `0x330B GET_ENCODER_VALUE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **返回命令字**: `0x330C RECEIVE_ENCODER_VALUE` ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0, 0] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | value | array | 电机编码器值 | ## 预置机器人 ### 设置预置机器人 **命令字**: `0x3E01 PRESET_ROBOT_SET` > 提前导入预置参数文件~/robot/preset/robot 中,如 R_SCARA_4ZSCARA.json ```json { "name": "R_SCARA", "presetRobotName": "4ZSCARA.json" } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | name | string | 是 | 机器人名称 | | presetRobotName | string | 是 | 预置机器人文件名 | ### 查询预置机器人 **发送命令字**: `0x3E02 PRESET_ROBOT_INQUIRE` ```json { "name": "R_GENERAL_6S" } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | name | string | 是 | 机器人名称 | **返回命令字**: `0x3E03 PRESET_ROBOT_RESPOND` ```json { "listnum": 2, "nameList": ["lianjiang604", "", "yyyy"] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | listnum | int | 列表数量 | | nameList | array | 预置机器人名称列表 | ### 查询预置参数 **发送命令字**: `0x3E04 PRESET_ROBOTPARAMETER_INQUIRE` ```json { "name": "R_GENERAL_6S", "presetRobotName": "XX" } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | name | string | 是 | 机器人名称 | | presetRobotName | string | 是 | 预置机器人名称 | **返回命令字**: `0x3E05 PRESET_ROBOTPARAMETER_RESPOND` ```json { "Joint": [ { "axisDirection": 1.0, "axisNum": 1, "backLash": 0.0, "ratedReverseSpeed": -221.895679444570, "direction": 1.0, "encoderResolution": 17, "maxAcc": 2.50, "maxDeRotSpeed": -1.0, "maxDec": -2.50, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "reverseLimit": -150.0, "positiveLimit": 150.0, "ratedReverseRPM": -3000.0, "ratedRPM": 3000.0, "ratedSpeed": 221.895679444570, "reducRatio": 81.11920, "maxReverseRPM": -1, "isReduceRatioEnable": 1 } ], "L1": 435.0, "L2": 765.5220, "L3": 4.3150, "L4": 635.120, "L5": 156.0, "L6": -0.220, "L7": -60.2670, "L8": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "dynamicLimit": { "max": 456.0, "min": 0.0 }, "fiveAxisDirection": 0, "mountAngle": 0, "angleToDistance": [0, 1, 2, 3], "distanceToAngle": [0, 1, 2, 3], "angleToDistanceSync": [0, 1, 2, 3], "distanceToAngleSync": [0, 1, 2, 3], "pitch": 0.0, "upsideDown": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | Joint | array | 关节参数数组 | | Joint[].axisDirection | float | 关节实际方向 | | Joint[].axisNum | int | 关节编号 | | Joint[].backLash | float | 齿轮反向间隙 | | Joint[].ratedReverseSpeed | float | 额定反速度 | | Joint[].direction | float | 模型方向 | | Joint[].encoderResolution | int | 编码器位数 | | Joint[].maxAcc | float | 最大加速度 | | Joint[].maxDeRotSpeed | float | 额定反速度 | | Joint[].maxDec | float | 最大减速度 | | Joint[].maxJerkAcc | float | 最大加加速度 | | Joint[].maxJerkDec | float | 最大减减速度 | | Joint[].maxRPM | float | 最大正转速 | | Joint[].reverseLimit | float | 反限位 | | Joint[].positiveLimit | float | 正限位 | | Joint[].ratedReverseRPM | float | 额定反转速 | | Joint[].ratedRPM | float | 额定正转速 | | Joint[].ratedSpeed | float | 额定正速度 | | Joint[].reducRatio | float | 减速比 | | Joint[].maxReverseRPM | float | 最大反转速 | | Joint[].isReduceRatioEnable | int | 编码器是否经过减速机 | | L1-L8 | float | 杆长参数 | | couplingRatio* | float | 耦合比参数 | | dynamicLimit | object | 动态限制参数 | | fiveAxisDirection | int | 五轴方向 | | mountAngle | int | 安装角度 | | angleToDistance | array | 角度到距离转换系数 | | distanceToAngle | array | 距离到角度转换系数 | | pitch | float | pitch 值 | | upsideDown | int | 是否倒装 | ## 干涉区 ### 设置干涉区范围 **命令字**: `0x3F07 ROBOT_INTERFERRANGE_SET` ```json { "num": 1, "param": { "enable": false, "isInInterfer": 1, "maxX": "", "maxY": "", "maxZ": "", "minX": "", "minY": "", "minZ": "", "port": 0, "value": 1, "workType": 0 }, "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | num | int | 是 | 工艺号 | | param.enable | bool | 是 | 干涉区使能 | | param.isInInterfer | int | 是 | 干涉区功能:在区域内/在区域外 | | param.maxX | string | 是 | 最大 X 坐标,单位:mm | | param.maxY | string | 是 | 最大 Y 坐标,单位:mm | | param.maxZ | string | 是 | 最大 Z 坐标,单位:mm | | param.minX | string | 是 | 最小 X 坐标,单位:mm | | param.minY | string | 是 | 最小 Y 坐标,单位:mm | | param.minZ | string | 是 | 最小 Z 坐标,单位:mm | | param.port | int | 是 | 输出 IO 端口 | | param.value | int | 是 | 输出 IO 端口值 | | param.workType | int | 是 | 干涉区功能:状态输出/禁止运动 | ### 查询干涉区范围 **发送命令字**: `0x3F08 ROBOT_INTERFERRANGE_INQUIRE` ```json { "robot": 1, "num": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | num | int | 是 | 工艺号 | **返回命令字**: `0x3F09 ROBOT_INTERFERRANGE_RESPOND` data: 同0x3F07 ### 标定干涉点 **命令字**: `0x3F0A ROBOT_INTERFERRANGE_CALIBRATION` ```json { "robot": 1, "num": 1, "pos": 1, "calibrationState1": 1, "calibrationState2": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | num | int | 是 | 工艺号 | | pos | int | 是 | 标定位置:P1点-1, P2点-2 | | calibrationState1 | int | 是 | P1点标定状态:1-已标定, 0-未标定 | | calibrationState2 | int | 是 | P2点标定状态 | ### 标定完成 **命令字**: `0x3F0B ROBOT_INTERFERRANGE_CALCULATE` ```json { "robot": 1, "num": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | num | int | 是 | 工艺号 | ### 移动到标定点 **命令字**: `0x3F0C ROBOT_INTERFERRANGE_MOVE` ```json { "robot": 1, "num": 1, "pos": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | num | int | 是 | 工艺号 | | pos | int | 是 | 标定位置:P1点-1, P2点-2 | ## 跟随误差(电流驱动) ### 查询跟随误差 **发送命令字**: `0x2A08 CURRENTTRACKINGERROR_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **返回命令字**: `0x2A09 CURRENTTRACKINGERROR_RESPOND` ```json { "trackingError": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "trackingErrorSync": [0.0, 0.0, 0.0, 0.0, 0.0], "MaxTrackingError": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "MaxTrackingErrorSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | trackingError | array | 当前误差 | | trackingErrorSync | array | 当前外部轴误差 | | MaxTrackingError | array | 最大误差 | | MaxTrackingErrorSync | array | 最大外部轴误差 | | robot | int | 当前机器人 | ## 负载率 ### 查询电机负载率 **发送命令字**: `0x2A0A MOTOR_LOAD_RATE_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **返回命令字**: `0x2A0B MOTOR_LOAD_RATE_RESPOND` ```json { "motorOverloadSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "motorOverload": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | motorOverloadSync | array | 外部轴负载率 | | robot | int | 当前机器人 | | motorOverload | array | 机器人负载率 | ## 位置点坐标系转换 ### 位置点坐标系转换 **命令字**: `0x2A12 POS_TRANS_COORD` ```json { "robot": 1, "name": "P001", "pos": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "targetCoord": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | name | string | 是 | 变量名 | | pos | array | 是 | 要转换的坐标,共14位:
第1位:坐标系 (0-关节, 1-直角, 2-工具, 3-用户)
第2位:单位制 (0-弧度制, 1-角度制)
第3位:手型 (0-无, 1-手左, 2-右手, 0~8形态)
第4位:工具坐标编号
第5位:用户坐标编号
第6-7位:预留
第8-14位:J1~J7 / xyzabc | | targetCoord | int | 是 | 目标坐标系:0-关节坐标, 1-直角坐标, 2-工具坐标, 3-用户坐标 | **返回命令字**: `0x2A13 POS_TRANS_COORD_RESPOND` ```json { "name": "P001", "pos": [1, 1, 0, 0, 0, 0, 0, 459.62120, -0.1010, 796.79160, 3.141592653590, 0.0, 0.0, 0.0], "posDeg": [1, 1, 0, 0, 0, 0, 0, 459.62120, -0.1010, 796.79160, 180.0, 0.0, 0.0, 0.0], "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 变量名 | | pos | array | 转换后的弧度制坐标值 | | posDeg | array | 转换后的角度值 | | robot | int | 机器人编号 | ## 跟随误差 ### 设置跟随误差 **命令字**: `0x2A14 TRACKINTERROR_SET` ```json { "staticTrackingError": [1, 2, 3, 4, 5, 6], "dynamicTrackingError": [1, 2, 3, 4, 5, 6], "staticTrackingErrorSync": [1, 2, 3], "dynamicTrackingErrorSync": [1, 2, 3] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | staticTrackingError | array | 是 | 静态跟随误差,范围:1~20000000 | | dynamicTrackingError | array | 是 | 动态跟随误差,范围:1~20000000 | | staticTrackingErrorSync | array | 是 | 静态跟随误差外部轴,范围:1~20000000 | | dynamicTrackingErrorSync | array | 是 | 动态跟随误差外部轴,范围:1~20000000 | ### 查询跟随误差 **发送命令字**: `0x2A15 TRACKINTERROR_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **返回命令字**: `0x2A16 TRACKINTERROR_RESPOND` ```json { "staticTrackingError": [1, 2, 3, 4, 5, 6], "dynamicTrackingError": [1, 2, 3, 4, 5, 6], "staticTrackingErrorSync": [1, 2, 3], "dynamicTrackingErrorSync": [1, 2, 3] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | staticTrackingError | array | 静态跟随误差 | | dynamicTrackingError | array | 动态跟随误差 | | staticTrackingErrorSync | array | 静态跟随误差外部轴 | | dynamicTrackingErrorSync | array | 动态跟随误差外部轴 | ## 电机过载保护 ### 设置电机过载保护 **命令字**: `0x2A17 SET_TORQ_LIMIT` ```json { "robot_num": 1, "torq_limit_enable": false, "torq_limit_min_ensure_time": 10, "torq_limit_robot": [25, 26, 27, 28, 29, 80], "torq_limit_sync": [70] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_num | int | 是 | 机器人号 | | torq_limit_enable | bool | 是 | 使能开关:true-开启, false-关闭 | | torq_limit_min_ensure_time | int | 是 | 过载保护最小确定时间 | | torq_limit_robot | array | 是 | 每个关节的扭矩限制值 | | torq_limit_sync | array | 是 | 外部轴扭矩限制值 | ### 查询电机过载保护 **发送命令字**: `0x2A18 INQUIRE_TORQ_LIMIT` ```json { "robot_num": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_num | int | 是 | 机器人号 (1-4) | **返回命令字**: `0x2A19 RESPOND_TORQ_LIMIT` ```json { "robot_num": 1, "torq_limit_enable": false, "torq_limit_robot": [10, 20, 30], "torq_limit_sync": [10, 20, 30] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot_num | int | 机器人号 | | torq_limit_enable | bool | 使能状态 | | torq_limit_robot | array | 电机转矩过载值,初始值9999需修改 | | torq_limit_sync | array | 电机转矩过载值外部轴 | ## 轴速度 ### 查询轴速度 **发送命令字**: `0x2A22 AXISACTUALVEL_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 (1-4) | **返回命令字**: `0x2A23 AXISACTUALVEL_RESPOND` ```json { "robot": 1, "actualLineVel": 0.0, "maxActualLineVel": 0.0, "axisActualVel": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], "maxAxisActualVel": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], "axisActualVelSync": [1.0, 2.0, 3.0, 4.0, 5.0], "maxAxisActualVelSync": [1.0, 2.0, 3.0, 4.0, 5.0] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人号 | | actualLineVel | float | 末端线速度当前速度 | | maxActualLineVel | float | 末端线速度最大速度 | | axisActualVel | array | 1-7轴当前轴速度 | | maxAxisActualVel | array | 1-7轴最大轴速度 | | axisActualVelSync | array | 外部轴当前轴速度 | | maxAxisActualVelSync | array | 外部轴最大轴速度 | ## 速度模式状态设置及获取 ### 设置速度 **命令字**: `0x2601 SPEED_SET` ```json { "robot": 1, "speed": 5 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围:[1, 4] | | speed | int | 是 | 速度值,运动模式速度范围:1-100 | ### 查询速度 **发送命令字**: `0x2602 SPEED_INQUIRE` ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **说明**: 速度值101代表0.1°微动档,102代表0.01°微动档。可配合0x2101切至运行模式调整全局速度。 **返回命令字**: `0x2603 SPEED_RESPOND` ```json { "robot": 1, "speed": 5 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | speed | int | 当前速度值 | ## 机器人切换 ### 切换机器人 **命令字**: `0x5001 ROBOT_SWITCH` ```json { "mode": 0, "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | mode | int | 是 | 模式:0-单机模式, 1-多机模式 | | robot | int | 是 | 机器人号 | ### 查询当前机器人 **发送命令字**: `0x5002 ROBOT_INQUIRE` data: 无 **返回命令字**: `0x5003 ROBOT_RESPOND` ```json { "mode": 0, "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | mode | int | 模式:0-单机模式, 1-多机模式 | | robot | int | 当前机器人号 | ## 点动模式状态设置及获取 ### 开始点动 **命令字**: `0x2901 JOG_OPERATION_MOVE` ```json { "axis": 1, "direction": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | axis | int | 是 | 要操作的轴号,外部轴从8开始 | | direction | int | 是 | 方向:1-正向, -1-反向 | **axis 轴号说明**: | 当前坐标系 | axis=1 | axis=2 | axis=3 | axis=4 | axis=5 | axis=6 | axis=7 | |------------|-------|-------|-------|-------|-------|-------|--------| | 直角坐标系 | X 轴 | Y 轴 | Z 轴 | A 轴 | B 轴 | C 轴 | psi 轴 | | 工具坐标系 | TX 轴 | TY 轴 | TZ 轴 | TA 轴 | TB 轴 | TC 轴 | psi 轴 | | 用户坐标系 | UX 轴 | UY 轴 | UZ 轴 | UA 轴 | UB 轴 | UC 轴 | psi 轴 | ### 停止点动 **命令字**: `0x2902 JOG_OPERATION_STOP` ```json { "axis": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | axis | int | 是 | 要操作的轴号,外部轴从8开始 | ## 示教器设置角度幅度 ### 设置角度幅度 **命令字**: `0x50A4 ISDEG_PARAM_SET` ```json { "isDeg": false } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | isDeg | bool | 是 | 单位制:false-弧度制, true-角度制 | ## 标记圆心(未开放,定义中) **命令字**: `0x8160 SIGN_WINE_CIRCLE_CENTER` ```json {} ``` **说明**: 此功能暂未开放,定义中。 --- # 外部轴设置 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/04.%E5%A4%96%E9%83%A8%E8%BD%B4%E8%AE%BE%E7%BD%AE.html --- ## 1. 变位机坐标校正计算设置 **命令 ID**: 0x7001 SYNCPOSITIONER_CALIBRATION_SET **说明**: 变位机坐标校正计算设置,发送如下指令 **发送**: ```json { "calibrateNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | calibrateNum | int | 是 | 变位机组号,可选值:1, 2, 3 | **控制器返回**: **命令 ID**: 0x7004 SYNCPOSITIONER_CALIBRATION_RESULT ```json { "result": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | result | bool | 外部轴数据计算是否成功 | --- ## 2. 标定点坐标 **命令 ID**: 0x7002 SYNCPOSITIONER_CALIBRATION_INQUIRE **说明**: 标定点坐标,发送如下指令 **发送**: ```json { "syncPositionerNum": 1, "pointNum": 0 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | syncPositionerNum | int | 是 | 变位机组号,可选值:1, 2, 3 | | pointNum | int | 是 | 取值范围:0~3 或 5 | **控制器回复**: **命令 ID**: 0x7003 SYNCPOSITIONER_CALIBRATION_RESPOND ```json { "syncPositionerNum": 1, "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | syncPositionerNum | int | 变位机组号,可选值:1, 2, 3 | | pointNum | int | 取值范围:0~3 或 5 | | pos | array | 当前点位 | --- ## 3. 查询所有外部轴的标定结果 **命令 ID**: 0x7005 SYNCPOSITIONER_TYPEANDCALIBRATIONRESULT_INQUIRE **说明**: 查询所有外部轴的标定结果 **发送**: ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **返回外部轴的标定结果**: **命令 ID**: 0x7006 SYNCPOSITIONER_TYPEANDCALIBRATIONRESULT_RESPOND ```json { "robot": 1, "calibrateResult": [false, false, true], "syncType": [1, 1, 1] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人号 | | calibrateResult | array | 是否已标定,数组表示外部轴组号是否已标定 | | syncType | array | 同步类型 | --- ## 4. 标定结果查询 **命令 ID**: 0x7007 SYNCPOSITIONER_COORD_INQUIRE **说明**: 标定结果查询(示教器无此功能) **发送**: ```json { "syncPositionerNum": 1, "coordNum": 0 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | syncPositionerNum | int | 是 | 变位机组号 | | coordNum | int | 是 | 获取标定结果 | **回复**: **命令 ID**: 0x7008 SYNCPOSITIONER_COORD_RESPOND ```json { "syncPositionerNum": 1, "coordNum": 1, "pos": [0, 0, 0, 0, 0, 0] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | syncPositionerNum | int | 变位机组号 | | coordNum | int | 标定结果编号 | | pos | array | 当前点位 | --- ## 5. 设置当前协作外部轴组号 **命令 ID**: 0x7009 SYNCPOSITIONER_COORDNUM_SWITCH **说明**: 设置当前协作外部轴组号 **发送**: ```json { "curSyncPositionerNum": 3 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | curSyncPositionerNum | int | 是 | 当前协作外部轴组号 | **查询当前协作外部轴组号**: **命令 ID**: 0x700A SYNCPOSITIONER_COORDNUM_INQUIRE **说明**: 无需发送数据 **控制器回复**: **命令 ID**: 0x700B SYNCPOSITIONER_COORDNUM_RESPOND ```json { "curSyncPositionerNum": 2 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | curSyncPositionerNum | int | 当前协作外部轴组号 | --- ## 6. 设置地轨参数 **命令 ID**: 0x700D SYNCTRACK_SET **说明**: 设置地轨参数,示教盒发送下面命令 **发送**: ```json { "calibrateResult": true, "xConversionRatio": 1.0, "yConversionRatio": 1.0, "zConversionRatio": 1.0 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | calibrateResult | bool | 是 | 是否协作 | | xConversionRatio | float | 是 | x 方向转换比 | | yConversionRatio | float | 是 | y 方向转换比 | | zConversionRatio | float | 是 | z 方向转换比 | **查询**: **命令 ID**: 0x700E SYNCTRACK_INQUIRE **控制器回复**: **命令 ID**: 0x700F SYNCTRACK_RESPOND ```json { "calibrateResult": true, "xConversionRatio": 1.0, "yConversionRatio": 1.0, "zConversionRatio": 1.0 } ``` --- ## 7. 当前位置查询 **命令 ID**: 0x7012 SYNC_POS_INQUIRE **说明**: 外部轴设置界面,示教盒发送下面命令 **发送**: ```json { "robot": 1, "coord": 0 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | coord | int | 是 | 坐标模式
- -1: 控制器当前坐标
- 0: 关节坐标
- 1: 直角坐标
- 2: 工具坐标
- 3: 用户坐标 | **控制器回复**: **命令 ID**: 0x7013 SYNC_POS_RESPOND **说明**: 复位点设置界面,控制器收到当前位置查询时发送 ```json { "robot": 1, "coord": 0, "configuration": 1, "pos": [0, 0.1, 2, 3.3, 44, 555.55, 66.6, 77.77], "posDeg": [0, 0.1, 2, 3.3, 44, 555.55, 66.6, 77.77], "posSync": [0, 0.1, 2, 3.3, 44, 555.55, 66.6, 77.77] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人号 | | coord | int | 坐标模式
- -1: 控制器当前坐标
- 0: 关节坐标
- 1: 直角坐标
- 2: 工具坐标
- 3: 用户坐标 | | configuration | int | 姿态或左右手 | | pos | array | 当前位置(弧度制) | | posDeg | array | 当前位置(角度制) | | posSync | array | 外部轴当前位置 | --- ## 8. 双机协作使能 **设置双机协作使能指令**: **命令 ID**: 0x7015 COOPERATIVE_SET ```json { "cooperativeRobot": 0 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | cooperativeRobot | int | 是 | 协作设置
- 0: 无协作
- 1: 协作 | **获取协作状态**: **命令 ID**: 0x7016 COOPERATIVE_INQUIRE **回复协作状态**: **命令 ID**: 0x7017 COOPERATIVE_RESPOND ```json { "cooperativeRobot": 0 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | cooperativeRobot | int | 协作状态
- 0: 无协作
- 1: 协作 | --- ## 9. 外部轴关节参数设置 **命令 ID**: 0x7021 JOINTPARAMETER_SYNCPOSITIONER_SET **说明**: 外部轴关节参数设置 ### 单轴变位机 ```json { "Joint": [ { "BackLash": 0.0, "DeRatedVel": -30000.0, "Direction": 1.0, "EncoderResolution": 17.0, "MaxAcc": 1.0, "MaxDeRotSpeed": -1.0, "MaxDecel": -1.0, "MaxRotSpeed": 1.0, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "NegSWLimit": -360.0, "PosSWLimit": 720.0, "RatedDeRotSpeed": -5000.0, "RatedRotSpeed": 5000.0, "RatedVel": 30000.0, "ReducRatio": 1.0, "syncAxisNum": 1, "syncGroupNum": 1 } ], "syncGroupNum": 1 } ``` ### 双轴变位机 ```json { "Joint": [ { "BackLash": 0.0, "DeRatedVel": -18000.0, "Direction": 1.0, "EncoderResolution": 17.0, "MaxAcc": 1.0, "MaxDeRotSpeed": -1.0, "MaxDecel": -1.0, "MaxRotSpeed": 1.0, "NegSWLimit": -100.0, "PosSWLimit": 100.0, "RatedDeRotSpeed": -3000.0, "RatedRotSpeed": 3000.0, "RatedVel": 18000.0, "ReducRatio": 1.0, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "syncAxisNum": 1, "syncGroupNum": 2 }, { "BackLash": 0.0, "DeRatedVel": -12000.0, "Direction": -1.0, "EncoderResolution": 17.0, "MaxAcc": 1.0, "MaxDeRotSpeed": -1.0, "MaxDecel": -1.0, "MaxRotSpeed": 1.0, "NegSWLimit": -80.0, "PosSWLimit": 80.0, "RatedDeRotSpeed": -2000.0, "RatedRotSpeed": 2000.0, "RatedVel": 12000.0, "ReducRatio": 1.0, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "syncAxisNum": 2, "syncGroupNum": 2 } ], "syncGroupNum": 2 } ``` **Joint 参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | BackLash | float | 齿轮反向间隙 | | DeRatedVel | float | 额定负向速度 | | Direction | float | 正反向:1.0表示正向 | | EncoderResolution | float | 编码器分辨率(位数) | | MaxAcc | float | 最大加速度 | | MaxDeRotSpeed | float | 最大反转速度 | | MaxDecel | float | 最大减速度 | | MaxRotSpeed | float | 最大正转速度 | | maxJerkAcc | float | 最大加加速度 | | maxJerkDec | float | 最大减减速度 | | NegSWLimit | float | 反向限位角度 | | PosSWLimit | float | 正向限位角度 | | RatedDeRotSpeed | float | 额定反转速 | | RatedRotSpeed | float | 额定正转速 | | RatedVel | float | 额定速度 | | ReducRatio | float | 关节减速比 | | syncAxisNum | int | 轴数 | | syncGroupNum | int | 同步组号 | **根级参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | syncGroupNum | int | 同步组号 | **查询关节参数**: **命令 ID**: 0x7022 JOINTPARAMETER_SYNCPOSITIONER_INQUIRE ```json { "syncGroupNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | syncGroupNum | int | 是 | 同步组号 | **关节参数返回**: **命令 ID**: 0x7023 JOINTPARAMETER_SYNCPOSITIONER_RESPOND **说明**: 同 0x7021 --- ## 10. 外部轴点动关节速度设置 **命令 ID**: 0x7024 JOG_JOINTPARAMETER_SYNCPOSITIONER_SET **说明**: 外部轴点动关节速度设置 ### 单轴变位机 ```json { "syncGroupNum": 1, "syncJog": [ { "MaxAcc": 800.0, "MaxSpeed": 40.0 } ] } ``` ### 双轴变位机 ```json { "syncGroupNum": 2, "syncJog": [ {"MaxAcc": 400.0, "MaxSpeed": 20.0}, {"MaxAcc": 800.0, "MaxSpeed": 40.0} ] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | syncGroupNum | int | 外部轴组号 | | syncJog[].MaxAcc | float | 最大加速度 (°/s) | | syncJog[].MaxSpeed | float | 最大速度 (°/s) | **查询外部轴点动关节速度**: **命令 ID**: 0x7025 JOG_JOINTPARAMETER_SYNCPOSITIONER_INQUIRE ```json { "syncGroupNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | syncGroupNum | int | 是 | 外部轴组号 | **外部轴点动关节速度参数返回**: **命令 ID**: 0x7026 JOG_JOINTPARAMETER_SYNCPOSITIONER_RESPOND **说明**: 同 0x7024 --- ## 11. 编码器多圈值溢出计数功能 **命令 ID**: 0x7027 SYNCENCODE_OVERFLOW_PARM_SET **发送**: ```json { "robot": 1, "syncAxis": [ { "encode": [ { "encoderRange": 0, "encoderType": 0, "max": "0.0", "min": "0.0" } ] } ], "syncGroupNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | syncGroupNum | int | 是 | 同步组编号 | | syncAxis[].encode | array | 是 | 编码器相关设置 | | syncAxis[].encode[].encoderRange | int | 是 | 编码器范围设置 | | syncAxis[].encode[].encoderType | int | 是 | 多圈值类型 | | syncAxis[].encode[].max | string | 是 | 编码器测量的最大值 | | syncAxis[].encode[].min | string | 是 | 编码器测量的最小值 | **查询**: **命令 ID**: 0x7028 SYNCENCODE_OVERFLOW_PARM_INQUIRE ```json { "robot": 1, "syncGroupNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | syncGroupNum | int | 是 | 外部轴组号 | **返回**: **命令 ID**: 0x7029 SYNCENCODE_OVERFLOW_PARM_RESPOND **说明**: 同 0x7027,其中 encode 里面多了 encoderResolution 参数返回编码器位数 --- ## 12. 编码器多圈值开关传输通信协议 **命令 ID**: 0x7030 SYNCENCODE_OVERFLOW_ENABLE_PARM_SET **发送**: ```json { "robot": 1, "syncAxis": [ { "enable": 1 } ], "syncGroupNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | syncGroupNum | int | 是 | 外部轴组号 | | syncAxis[].enable | int | 是 | 编码器多圈值溢出计数功能开关 | --- ## 13. 外部轴零点参数设置 **命令 ID**: 0x7031 SYNCPOSITIONER_ENCODER_RESET **发送**: ```json { "axis": 1, "clearEncoder": false } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | axis | int | 是 | 外部轴编号
- 0: 全部外部轴
- 1: 外部轴1
- 2: 外部轴2 | | clearEncoder | bool | 是 | 清除编码器
- true: 清多圈值
- false: 标零点 | **零点设置成功后控制器返回**: **命令 ID**: 0x7033 SYNCPOSITIONER_ENCODER_RESET_RESPOND ```json { "axis": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | axis | int | 外部轴编号
- 0: 全部外部轴
- 1: 外部轴1
- 2: 外部轴2 | --- ## 14. 外部轴零点偏移 **命令 ID**: 0x7034 SYNCPOSITIONER_ENCODER_ZERO_OFFSET_SET **说明**: 示教器无此功能 **发送**: ```json { "robot": 1, "axis": 0, "allValue": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | axis | int | 是 | 外部轴编号
- 0: 全部外部轴
- 1: 外部轴1
- 2: 外部轴2 | | allValue | array | 是 | 设置的值放在对应的数组位置上 | --- ## 15. 单圈值设置 **命令 ID**: 0x7035 SYNCPOSITIONER_SINGLE_ENCODER_RESET **发送**: ```json { "robot": 1, "allValue": [1, 2, 3, 4, 5] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | allValue | array | 是 | 设置的值放在对应的数组位置上 | **查询外部轴单圈值**: **命令 ID**: 0x7036 SYNCPOSITIONER_SINGLE_ENCODER_INQUIRE ```json { "robot": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **控制器回复**: **命令 ID**: 0x7037 SYNCPOSITIONER_SINGLE_ENCODER_RESPOND ```json { "robot": 1, "allValue": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人号 | | allValue | array | 单圈值,数组元素对应各轴 | --- ## 16. 外部轴标定结果设置 **命令 ID**: 0x7041 SYNCPOSITIONER_CALIBRATION_RESULT_SET **说明**: 示教器无此功能 **发送**: ```json { "syncPositionerNum": 1, "resultArray": [ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | syncPositionerNum | int | 是 | 外部轴组号 | | resultArray | array | 是 | 标定结果数组 | **外部轴标定结果查询**: **命令 ID**: 0x7042 SYNCPOSITIONER_CALIBRATION_RESULT_INQUIRE ```json { "syncPositionerNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | syncPositionerNum | int | 是 | 外部轴组号 | **外部轴标定结果返回**: **命令 ID**: 0x7043 SYNCPOSITIONER_CALIBRATION_RESULT_RESPOND ```json { "calibrateResult": true, "resultArray": [ [524.340205626059, -82.982822853146, 643.197959948330, -3.141346895452, 0.0, 2.382157019678] ], "syncPositionerNum": 1 } ``` **参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | calibrateResult | bool | 是否已标定 | | resultArray | array | 标定结果数组 | | syncPositionerNum | int | 外部轴组号 | --- # 队列模式运动通讯 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/05.%E9%98%9F%E5%88%97%E6%A8%A1%E5%BC%8F%E8%BF%90%E5%8A%A8%E9%80%9A%E8%AE%AF.html ## 1. socket 控制追加模式运动 ### 1.1 开启/关闭 socket 直接控制运动模式 开启后会进入特殊的运行模式,关闭后需要手动切回示教模式。 **消息 ID**: `0x50B1 DIRECTMOTION_MODE_SET` #### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号(1, 2, 3, 4) | | open | boolean | 是 | true=开启, false=关闭 | #### 请求示例 ```json { "robot": 1, "open": true } ``` --- ### 1.2 控制器返回开启成功/失败 **消息 ID**: `0x50B3 DIRECTMOTION_MODE_RESPOND` #### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | number | 机器人编号 | | open | boolean | 当前状态 | #### 响应示例 ```json { "robot": 1, "open": true } ``` --- ### 1.3 发送作业文件指令队列 **消息 ID**: `0x50B4 DIRECTMOTION_INSERT_INSTRVEC` #### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号 | | data | array | 是 | 指令 JSON 列表 | #### data 数组元素参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | number | 是 | 指令类型:1=点到,2=直线,3=圆弧,4=整圆 | | positionId | string | 条件 | 全局点位(使用全局 GP 点时必填) | | RobotPos | object | 条件 | 自定义点位(使用自动点位时必填) | | ParaACC | object | 是 | 加速度参数 | | ParaDEC | object | 是 | 减速度参数 | | ParaV | object | 是 | 速度参数 | | ParaPL | object | 是 | 平滑参数 | | ParaTIME | object | 是 | 提前执行时间(ms) | | ParaSPIN | object | 否 | 圆弧和整圆指令:0=姿态不变 1=六轴不转 2=六轴旋转 | | ParaSYNC | object | 否 | 变位机是否同步 | | imovecoord | string | 否 | 移动坐标系 | | ctype | number | 否 | 坐标系类型 | | length | number | 否 | 长度 | | radius | number | 否 | 半径 | | margin | number | 否 | 边界 | | offsetAxis | number | 否 | 轴偏移 | | polish | number | 否 | 打磨参数 | | polishAngle | number | 否 | 打磨角度 | | polishID | number | 否 | 打磨 ID | | posidname | string | 否 | 点位名称 | | posidtype | number | 否 | 点位类型 | | logout | boolean | 否 | 登出 | | para | number | 否 | 预留参数 | | side | number | 否 | 侧面 | | userParamInt | number | 否 | 用户自定义整数 | | userParamString | string | 否 | 用户自定义字符串 | | width | number | 否 | 宽度 | #### ParaACC / ParaDEC / ParaV / ParaPL / ParaTIME / ParaSPIN / ParaSYNC 参数结构 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | data | number | 是 | 参数值 | | m_vUnit | number | 条件 | 速度单位(ParaV 时必填):0=cm/s 1=mm/s 2=百分比 | | secondvalue | number | 否 | 第二值 | | value | number | 否 | 旧版参数值 | | varname | string | 否 | 变量名 | #### RobotPos 参数结构 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ctype | number | 是 | 坐标系类型:0-关节 1-直角 2-工具 3-用户 | | data | array | 是 | 位置数据数组 | | key | string | 否 | 键名 | | paraVarData | array | 否 | 参数变量数据 | #### data 数组坐标说明(ctype 决定坐标系) | 索引 | 名称 | 说明 | |------|------|------| | 0 | 坐标系 | 0-关节、1-直角、2-工具、3-用户 | | 1 | 单位 | 角度-0、弧度-1 | | 2 | 形态 | 形态值 | | 3 | 工具工艺号 | 工具编号 | | 4 | 用户工艺号 | 用户编号 | | 5-6 | 预留 | 预留字段 | | 7 | J1/X | X 坐标值 | | 8 | J2/Y | Y 坐标值 | | 9 | J3 | J3值 | | 10 | J4 | J4值 | | 11 | J5 | J5值 | | 12 | J6 | J6值 | | 13 | J7 | J7值 | | 14-19 | 预设值 | 预设位置数据 | --- ### 1.4 案例一:采用全局 GP 点 ```json { "data": [ { "ParaACC": { "data": 25.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 25.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 25.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GP0015", "radius": 0.0, "side": 0.0, "type": 1, "userParamInt": 0, "userParamString": "", "width": 0.0 }, { "ParaACC": { "data": 100.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 100.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1000.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GP0001", "radius": 0.0, "side": 0.0, "type": 2, "userParamInt": 0, "userParamString": "", "width": 0.0 } ], "robot": 1 } ``` --- ### 1.5 案例二:采用自动点位 ```json { "data": [ { "ParaACC": { "data": 10.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 10.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 1, "data": [ 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.999998884198, 1.999999207078, 2.999999330055, 3.999999217981, 4.999999652293, 5.999998732478, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 8.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.999998884198, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.999999207078, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 2.999999330055, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.999999217981, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.999999652293, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 5.999998732478, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "", "radius": 0.0, "side": 0.0, "type": 1, "userParamInt": 0, "userParamString": "", "width": 0.0 } ], "robot": 1 } ``` --- ### 1.6 暂停追加运行 **消息 ID**: `0x50B7 DIRECTMOTION_MODE_SUSPEND` #### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号(1, 2, 3, 4) | #### 请求示例 ```json { "robot": 1 } ``` --- ### 1.7 开始追加运行(暂停后使用) **消息 ID**: `0x50B8 DIRECTMOTION_MODE_START` #### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号(1, 2, 3, 4) | #### 请求示例 ```json { "robot": 1 } ``` --- ### 1.8 停止追加运行 **消息 ID**: `0x50B9 DIRECTMOTION_MODE_STOP` #### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号(1, 2, 3, 4) | #### 请求示例 ```json { "robot": 1 } ``` --- ### 1.9 设置队列模式停止不下电 **消息 ID**: `0x50BA` #### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号(1, 2, 3, 4) | #### 请求示例 ```json { "robot": 1 } ``` --- # 3D 鼠标控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/06.3D%E9%BC%A0%E6%A0%87%E6%8E%A7%E5%88%B6.html ## 设置灵敏度发送 **0x7301 THREED_MOUSE_SET** ```json { "ABC": 4 or 5 or 6, "mouseSen": [128, 128, 128, 128] } ``` | 参数 | 类型 | 说明 | |------|------|------| | ABC | int | 姿态 ABC | | mouseSen | int[4] | 鼠标灵敏度 xyz 和姿态灵敏度(0-300) | --- ## 获取灵敏度 **0x7302 THREED_MOUSE_INQUIRE** data: 无 --- ## 控制器回复 **0x7303 THREED_MOUSE_RESPOND** ```json { "ABC": 4 or 5 or 6, "mouseSen": [128, 128, 128, 128] } ``` | 参数 | 类型 | 说明 | |------|------|------| | ABC | int | 姿态 ABC | | mouseSen | int[4] | 鼠标灵敏度 xyz 和姿态灵敏度(0-300) | --- ## 3D 鼠标零点标记零点发送 **0x7304 THREED_MOUSE_SETZERO** data: 无 --- ## 获取零点标记状态 **0x7305 THREED_MOUSE_SETZERO_INQUIRE** data: 无 --- ## 控制器回复 **0x7306 THREED_MOUSE_SETZERO_RESPOND** ```json { "zeroTagged": 0 or 1 or 2 } ``` | 参数 | 类型 | 说明 | |------|------|------| | zeroTagged | int | 0:未标记,1:已标记,2:通讯失败 | --- ## 3D 鼠标正方向标记设置 **0x7307 THREED_MOUSE_SIGN_DIRECTION** ```json { "axis": 1 or 2 or 3 } ``` | 参数 | 类型 | 说明 | |------|------|------| | axis | int | 1表示标记 X 正方向,2:Y,3:Z | --- ## 获取3D 鼠标正方向标记状态 **0x7308 THREED_MOUSE_SIGN_DIRECTION_INQUIRE** data: 无 --- ## 获取3D 鼠标正方向标记状态,控制器回复 **0x7309 THREED_MOUSE_SIGN_DIRECTION_RESPOND** ```json { "xTagged": 0 or 1 or 2, "yTagged": 0 or 1 or 2, "zTagged": 0 or 1 or 2 } ``` | 参数 | 类型 | 说明 | |------|------|------| | xTagged | int | X 正方向 0:失败,1:成功,2:标定中 | | yTagged | int | Y 正方向 0:失败,1:成功,2:标定中 | | zTagged | int | Z 正方向 0:失败,1:成功,2:标定中 | --- ## 退出页面时示教器发送 **0x730A PAGE_BACK** ```json { "pageBack": 1 } ``` | 参数 | 类型 | 说明 | |------|------|------| | pageBack | int | 3D 鼠标点标记方向但未标记,直接切换界面时通知控制器退出标记方向线程 | --- ## 设置3D 鼠标端口号 **0x730B THREED_MOUSE_SET_PORT** ```json { "port": 1 } ``` | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | port | int | 端口号 | 1-10 | --- ## 查询3D 鼠标端口号 **0x730C THREED_MOUSE_INQUIRE_PORT** ```json {} ``` --- ## 返回查询结果 **0x730D THREED_MOUSE_RESPOND_PORT** ```json { "port": 1 } ``` | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | port | int | 端口号 | 1-10 | --- # 标定 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/07.%E6%A0%87%E5%AE%9A.html ## 工具手标定 ### 0x3801 TOOLCALIBRATION_SET 设置工具手标定 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | toolNum | int | 工具手号 | | calibrationPointNum | int | 设置6点标定或7点标定 | ```json { "toolNum": 2, "calibrationPointNum": 6 } ``` --- ### 0x3804 TOOLCALIBRATION_RESULT 标定计算完成回复 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | result | bool | 计算是否成功 | ```json { "result": true } ``` --- ### 0x3802 TOOLCALIBRATION_INQUIRE 查询标定点数据 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 下标0~6 | | toolNum | int | 工具手号 | ```json { "pointNum": 2, "toolNum": 1 } ``` --- ### 0x3803 TOOLCALIBRATION_RESPOND 返回标定点数据 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 下标0~6 | | pos | array[6] | 位置数据 [x,y,z,rx,ry,rz] | ```json { "pointNum": 2, "pos": [0, 0, 0, 0, 0, 0] } ``` --- ### 0x3815 TOOL_CALIBRATION_POINTS_STATUS_INQUIRE 查询标定状态 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | toolNum | int | 工具手号 | ```json { "toolNum": 2 } ``` --- ### 0x3816 TOOL_CALIBRATION_POINTS_STATUS_RESPOND 返回标定状态 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | status | array[7] | 标定状态:1=已标定,0=待标定 | ```json { "status": [1, 0, 1, 0, 1, 0, 1] } ``` --- ### 0x3817 TOOL_CALIBRATION_POINTS_STATUS_CLEAR 清除标定 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 下标0~6 | | toolNum | int | 工具手号 | ```json { "pointNum": 2, "toolNum": 1 } ``` --- ### 0x3805 TOOLPARAMETER_SET 设置工具手参数 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | tool.A | float | 绕 A 轴旋转角度 | | tool.B | float | 绕 B 轴旋转角度 | | tool.C | float | 绕 C 轴旋转角度 | | tool.note | string | 注释 | | tool.payload_inertia | float | 负载惯量 | | tool.payload_mass | float | 负载质量 | | tool.payload_mass_center_X | float | 负载质心 X | | tool.payload_mass_center_Y | float | 负载质心 Y | | tool.payload_mass_center_Z | float | 负载质心 Z | | tool.x | float | X 轴偏移 | | tool.y | float | Y 轴偏移 | | tool.z | float | Z 轴偏移 | | toolNum | int | 工具手号 | ```json { "tool": { "A": 3.0, "B": 3.0, "C": 3.0, "note": "", "payload_inertia": 5.0, "payload_mass": 4.0, "payload_mass_center_X": 6.0, "payload_mass_center_Y": 7.0, "payload_mass_center_Z": 8.0, "x": 1.0, "y": 2.0, "z": 3.0 }, "toolNum": 1 } ``` --- ### 0x3806 TOOLPARAMETER_INQUIRE 查询工具手参数 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | toolNum | int | 工具手号 | ```json { "toolNum": 2 } ``` --- ### 0x3807 TOOLPARAMETER_RESPOND 返回工具手参数 响应格式同 0x3805 --- ### 0x380A TOOLNUMBER_SWITCH 切换工具手 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人编号 1-4 | | curToolNum | int | 当前工具手号 | ```json { "robot": 1, "curToolNum": 2 } ``` --- ### 0x380B TOOLNUMBER_INQUIRE 查询当前工具手 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人编号 1-4 | ```json { "robot": 1 } ``` --- ### 0x380C TOOLNUMBER_RESPOND 返回当前工具手 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人编号 1-4 | | curToolNum | int | 当前工具手号 | ```json { "robot": 1, "curToolNum": 2 } ``` --- ### 0x3812 TOOL_CALIBRATION_POINTS_POS_INQUIRE 查询已标定点数据 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 下标0~6,共7个点 | | toolNum | int | 工具手号 | ```json { "pointNum": 0, "toolNum": 1 } ``` --- ### 0x3813 TOOL_CALIBRATION_POINTS_POS_RESPOND 返回已标定点数据 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 下标0~6 | | pos | array[6] | 位置数据 [x,y,z,rx,ry,rz] | ```json { "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` --- ## 用户坐标校正 ### 0x3C01 USERCALIBRATION_CALC 用户坐标校正设置 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | userNum | int | 用户坐标号 | ```json { "userNum": 1 } ``` --- ### 0x3C02 USERCALIBRATION_RESULT 用户坐标校正结果返回 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | result | bool | true=标定成功,false=标定失败 | | status.O | bool | O 点状态 | | status.X | bool | X 点状态 | | status.Y | bool | Y 点状态 | ```json { "result": true, "status": { "O": false, "X": false, "Y": false } } ``` --- ### 0x3C03 USERCALIBRATION_RECORD 标记用户原点、X、Y 值 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | userNum | int | 用户坐标号 | | inquire | string | 取值 "O", "X", "Y" 或 "OXY" | | posZero | array[6] | 标记原点(弧度制),当 inquire 为"OXY"时存在 | | posX | array[6] | 标记 X 值(弧度制),当 inquire 为"OXY"时存在 | | posY | array[6] | 标记 Y 值(弧度制),当 inquire 为"OXY"时存在 | ```json { "userNum": 1, "inquire": "X", "posZero": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posX": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posY": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ### 0x3C04 USERCALIBRATION_RECORD_RESPOND 标记结果回复 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | userNum | int | 用户坐标号 | | inquire | string | 取值 "O", "X", "Y" | | status | bool | 状态 | | pos | array[6] | 弧度制位置数据 | | posDeg | array[6] | 角度制位置数据 | ```json { "userNum": 1, "inquire": "X", "status": true, "pos": [0, 0, 0, 0, 0, 0], "posDeg": [0, 0, 0, 0, 0, 0] } ``` --- ### 0x3C07 USERPARAMETER_SET 用户坐标设置 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pos | array[6] | 用户坐标位置 [x,y,z,rx,ry,rz] | | userNum | int | 用户坐标号 | ```json { "pos": [460.0, 0.0, 637.0, 0.0, 3.10, 3.0], "userNum": 1 } ``` --- ### 0x3C08 USERPOSDATA_INQUIRE 用户坐标查询 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | userNum | int | 用户坐标号 | | inquire | string | 查询类型:"Calibration", "O", "X", "Y" | ```json { "userNum": 1, "inquire": "Calibration" } ``` --- ### 0x3C09 USERPOSDATA_RESPOND 用户坐标查询回复 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | userNum | int | 用户坐标号 | | inquire | string | 查询类型 | | status | bool | 状态 | | pos | array[6] | 弧度制位置数据 | | posDeg | array[6] | 角度制位置数据 | ```json { "userNum": 1, "inquire": "Calibration", "status": false, "pos": [0, 0, 0, 0, 0, 0], "posDeg": [0, 0, 0, 0, 0, 0] } ``` --- ### 0x3C0A USERCOORDINATE_SWITCH 用户坐标号设置 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人编号 1-4 | | userNum | int | 用户坐标号 | ```json { "robot": 1, "userNum": 1 } ``` --- ### 0x3C0B USERCOORDINATE_INQUIRE 用户坐标号查询 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人编号 1-4 | ```json { "robot": 1 } ``` --- ### 0x3C0C USERCOORDINATE_RESPOND 用户坐标号查询回复 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人编号 1-4 | | curUserNum | int | 当前用户坐标号 | ```json { "robot": 1, "curUserNum": 1 } ``` --- ### 0x3C0D USERANNOTATION_SET 用户注释设置 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | note | string | 注释内容 | | userNum | int | 用户坐标号 | ```json { "note": "纳博特", "userNum": 1 } ``` --- ### 0x3C0E USERANNOTATION_INQUIRE 用户注释查询 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | userNum | int | 用户坐标号 | ```json { "userNum": 1 } ``` --- ### 0x3C0F USERANNOTATION_RESPOND 用户注释查询回复 响应格式同 0x3C0D --- ## 20点标定 ### 0x7101 CALIBRATION_20POINTS_SET 20点标定完成,发送标定数据 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | calNum | int | 标定编号(暂为默认值) | | noCalZero | bool | 20点不标定零点 | ```json { "calNum": 1, "noCalZero": true } ``` --- ### 0x7102 CALIBRATION_20POINTS_INQUIRE 点击标定点数据 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | toolNum | int | 工具手坐标系 1-3 | | pointNum | int | 取值0~19,共20个点 | ```json { "toolNum": 1, "pointNum": 0 } ``` --- ### 0x7103 CALIBRATION_20POINTS_RESPOND 返回标定点数据 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 取值0~19,共20个点 | | pos | array[6] | 点位数据 [x,y,z,rx,ry,rz] | ```json { "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` --- ### 0x7104 CALIBRATION_20POINTS_RESULT 标定计算完成 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | result | bool | 计算是否正确 | | distance | float | 计算距离值 | ```json { "result": true, "distance": 2.04 } ``` --- ### 0x7105 CALIBRATION_20POINTS_RESULT_APPLY 将标定结果设置为工具手 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | toolNum | int | 工具手坐标系 1-3 | ```json { "toolNum": 1 } ``` --- ### 0x7106 CALIBRATION_20POINTS_RESULT_APPLY_OK 设置成功回复 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | apply | bool | 设置是否成功 | ```json { "apply": true } ``` --- ### 0x7107 CALIBRATION_20POINTS_STATUS_INQUIRE 查询标定点状态 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | calNum | int | 工具手号 | ```json { "calNum": 1 } ``` > **注意:** 底层是共用标定点状态,不区分工具手号 --- ### 0x7108 CALIBRATION_20POINTS_STATUS_RESPOND 返回标定点状态 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | status | array[20] | 标定点状态:1=已标定,0=未标定 | ```json { "status": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` --- ### 0x7109 CALIBRATION_20POINTS_STATUS_CLEAR 清除标定状态 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 取值:0-19单个点,20=所有点 | ```json { "pointNum": 0 } ``` --- ### 0x710a CALIBRATION_20POINTS_POS_INQUIRE 查询已标定点数据 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 取值0~19,共20个点 | ```json { "pointNum": 0 } ``` --- ### 0x710b CALIBRATION_20POINTS_POS_RESPOND 返回已标定点数据 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 取值0~19,共20个点 | | pos | array[6] | 点位数据 [x,y,z,rx,ry,rz] | ```json { "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` --- ### 0x710c CALIBRATION_20POINTS_POS_RUN 运动到标定点(暂不开放) **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人编号 | ```json { "robot": 1 } ``` --- ### 0x710d CALIBRATION_20POINTS_CANCALIBRATION_INQUIRE 获取是否可以打开标定界面 无请求参数 --- ### 0x710e CALIBRATION_20POINTS_CANCALIBRATION_RESPOND 是否可以打开标定界面 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | canCalibration | bool | 是否可以打开 | ```json { "canCalibration": true } ``` --- ## 4点标定(SCARA) ### 0x7201 CALIBRATION_4POINTS_SET 设置距离输入值,计算并返回结果 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | ParamOf4Points | array[2] | L1, L2 杆长 | ```json { "ParamOf4Points": [0, 0] } ``` --- ### 0x7202 CALIBRATION_4POINTS_INQUIRE 点击标定按钮 **请求参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 取值0~3,共4个点 | | status | int | 1=已标记,0=未标记 | ```json { "pointNum": 0, "status": 1 } ``` --- ### 0x7203 CALIBRATION_4POINTS_RESPOND 返回标定点数据 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | pointNum | int | 取值0~3,共4个点 | | pos | array[6] | 点位数据 [x,y,z,rx,ry,rz] | ```json { "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` --- ### 0x7204 CALIBRATION_4POINTS_RESULT 计算完成 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | result | bool | 计算结果 | | length | array[2] | 长度 [L1, L2] | | dtheta | array[2] | 偏移角度 | ```json { "result": true, "length": [0, 0], "dtheta": [0, 0] } ``` --- ### 0x7205 CALIBRATION_4POINTS_RESULT_APPLY 将结果填入 DH 参数 无请求参数 --- ### 0x7206 CALIBRATION_4POINTS_RESULT_APPLY_OK 设置成功回复 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | apply | bool | 设置是否成功 | ```json { "apply": true } ``` --- ### 0x7207 CALIBRATION_4POINTS_STATUS_INQUIRE 查询4点标定点状态 无请求参数 --- ### 0x7208 CALIBRATION_4POINTS_STATUS_RESPOND 返回4点标定状态 **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | result | bool | 计算结果 | | status | array[4] | 标定点状态:1=已标定,0=未标定 | | length | array[2] | 长度 [L1, L2] | | dtheta | array[2] | 偏移角度 | ```json { "result": true, "status": [0, 0, 0, 0], "length": [0, 0], "dtheta": [0, 0] } ``` --- # 力学功能 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/01.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6/08.%E5%8A%9B%E5%AD%A6%E5%8A%9F%E8%83%BD.html --- ## 1. 碰撞检测 ### 碰撞检测开关设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x7406 | COLLISION_DETECTION_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | switch | bool | 是 | 碰撞检测开关 | ```json { "switch": true } ``` ### 获取碰撞检测开关状态 | 字段 | 类型 | 描述 | |------|------|------| | 0x7407 | COLLISION_DETECTION_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7408 | COLLISION_DETECTION_RESPOND | | **响应参数:** | 参数名 | 类型 | 描述 | |--------|------|------| | is_identification | bool | 辨识状态 | | restrart_switch | bool | 重启开关 | | switch | bool | 碰撞检测开关 | ```json { "is_identification": true, "restrart_switch": true, "switch": true } ``` ### 碰撞检测参数设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x7409 | COLLISION_DETECTION_PARAM_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | Co_De_para | array[double] | 是 | 阈值,数组长度6 | | error_enable_time | double | 是 | 误差允许时间 | | pos_delay_time | double | 是 | 指令位置响应时间 | ```json { "Co_De_para": [3.0, 4.0, 5.0, 6.0, 7.0, 8.0], "error_enable_time": 2.0, "pos_delay_time": 1.0 } ``` ### 获取碰撞检测参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x740A | COLLISION_DETECTION_PARAM_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x740B | COLLISION_DETECTION_PARAM_RESPOND | | **响应参数:** 同 0x7409 --- ## 2. 力矩前馈 ### 力矩前馈开关设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x740C | TORQ_FEEDBACK_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | torqFeedback | bool | 是 | 力矩前馈开关 | ```json { "torqFeedback": true } ``` ### 查询力矩前馈状态 | 字段 | 类型 | 描述 | |------|------|------| | 0x740D | TORQ_FEEDBACK_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x740E | TORQ_FEEDBACK_RESPOND | | **响应参数:** 同 0x740C --- ## 3. 拖动示教 ### 查询拖动示教 | 字段 | 类型 | 描述 | |------|------|------| | 0x7501 | DRAG_TRAJ_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7502 | DRAG_TRAJ_RESPOND | | **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | TrajName | array[string] | 是 | 轨迹名列表 | ```json { "TrajName": ["RRR", "TTT"] } ``` ### 拖动示教参数设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x7504 | DRAG_PARAM_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | DecareLimit | double | 是 | 笛卡尔空间线速度限制 | | JointVelLimit | double | 是 | 关节空间速度限制 | | drag_mode | int | 是 | 拖动模式:0-自由拖动,1-位置拖动,2-姿态拖动 | | frictionOffset | array[double] | 是 | 1-6关节摩擦力补偿校正系数 | | dragCoefficient | array[double] | 是 | 关节超限阻力系数,长度6,范围[1,100] | ```json { "DecareLimit": 1.0, "JointVelLimit": 2.0, "drag_mode": 0, "frictionOffset": [3.0, 3.0, 3.0, 3.0, 3.0, 3.0], "dragCoefficient": [5.0, 5.0, 5.0, 5.0, 5.0, 5.0] } ``` ### 获取拖动示教参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x7505 | DRAG_PARAM_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7506 | DRAG_PARAM_RESPOND | | **响应参数:** 同 0x7504 --- ## 4. 拖拽轨迹相关 ### 拖动示教轨迹回放参数设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x7507 | DRAG_TRAJ_PARAM_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | MaxSamplingNum | double | 是 | 最大采样点数 | | SamplingInterval | double | 是 | 采样间隔 | | Start | bool | 是 | false-结束,true-开始 | ```json { "MaxSamplingNum": 3000.0, "SamplingInterval": 0.030, "Start": false } ``` ### 查询拖拽轨迹参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x7508 | DRAG_TRAJ_PARAM_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7509 | DRAG_TRAJ_PARAM_RESPOND | | **响应参数:** 同 0x7507 ### 查询轨迹是否被记录 | 字段 | 类型 | 描述 | |------|------|------| | 0x750A | DRAG_TRAJ_RECORD_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x750B | DRAG_TRAJ_RECORD_RESPOND | | **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | record | bool | 是 | 拖拽轨迹是否被记录 | ```json { "record": true } ``` ### 轨迹回放 | 字段 | 类型 | 描述 | |------|------|------| | 0x750C | DRAG_TRAJ_PLAYBACK | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | trajName | string | 是 | 轨迹名 | | vel | int | 是 | 轨迹回放速度,示教器固定发送100 | ```json { "trajName": "", "vel": 100 } ``` ### 保存轨迹 | 字段 | 类型 | 描述 | |------|------|------| | 0x750D | DRAG_TRAJ_SAVE | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | TrajName | string | 是 | 轨迹名 | ```json { "TrajName": "SSSSS" } ``` ### 删除轨迹 | 字段 | 类型 | 描述 | |------|------|------| | 0x750E | DRAG_TRAJ_DELETE | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | TrajName | string | 是 | 轨迹名 | ```json { "TrajName": "SSSSS" } ``` ### 拖拽模式设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x750F | DRAG_MODE | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | mode | int | 是 | 拖拽模式:0-无,1-3D 鼠标,2-力矩 | | port | int | 是 | 外部触发信号端口号 | | value | int | 是 | 外部触发信号值 | ```json { "mode": 2, "port": 3, "value": 1 } ``` ### 查询拖拽模式 | 字段 | 类型 | 描述 | |------|------|------| | 0x7510 | DRAG_MODE_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7511 | DRAG_MODE_RESPOND | | **响应参数:** 同 0x750F --- ## 5. 外部按键 ### 查询功能控制参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x9114 | FUNCTIONALCONTROL_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x9115 | FUNCTIONALCONTROL_RESPOND | | > 数组下标说明:0-拖拽模式,1-点动模式,2-开始轨迹采集,3-结束轨迹采集,4-开始轨迹回放,5-上使能,6-下使能,7-夹爪开,8-夹爪关,9-保存轨迹 **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | IoInPortArr | array[int] | 是 | 触发端口(DIN),数组长度11 | | hardwareTypeArr | array[int] | 是 | 硬件类型:0-IO,数组长度11 | | modeArr | array[int] | 是 | 触发方式:0-长按触发端口,1-短按触发端口,数组长度11 | | parameterArr | array[int] | 是 | 参数:0-触发端口关闭时触发,1-触发端口打开时触发,数组长度11 | ```json { "IoInPortArr": [1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10], "hardwareTypeArr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "modeArr": [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0], "parameterArr": [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0] } ``` ### 状态提示查询 | 字段 | 类型 | 描述 | |------|------|------| | 0x9116 | STATUSPROMPT_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x9117 | STATUSPROMPT_RESPOND | | > 数组下标说明:0-拖拽模式,1-点动模式,2-开始轨迹采集,3-结束轨迹采集,4-开始轨迹回放,5-上使能,6-下使能,7-夹爪开,8-夹爪关 **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | IoDoutPortArr | array[int] | 是 | 触发端口(DOUT),数组长度11 | | hardwareTypeArr | array[int] | 是 | 硬件类型:0-IO,数组长度11 | | parameterArr | array[int] | 是 | 参数:0-触发端口关闭,1-触发端口打开,2-闪烁,数组长度11 | ```json { "IoDoutPortArr": [1, 2, 3, 4, 5, 0, 6, 7, 0, 0, 0], "hardwareTypeArr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "parameterArr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` ### 设置外部按键参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x9118 | EXTERNKEYPARA_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | _isFunctionalControl | bool | 是 | true-设置功能控制参数,false-设置状态提示参数 | | hardwareTypeArr | array[int] | 是 | 硬件类型:0-IO,数组长度11 | | isClearTrack | int | 是 | 保存后是否清除轨迹 | | modeArr | array[int] | 是 | 触发方式:0-长按触发端口,1-短按触发端口,数组长度11 | | parameterArr | array[int] | 是 | 参数,数组长度11 | | portArr | array[int] | 是 | 触发端口,数组长度11 | ```json { "_isFunctionalControl": true, "hardwareTypeArr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "isClearTrack": 1, "modeArr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "parameterArr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "portArr": [1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10] } ``` --- ## 6. 动力学参数 > 动力学辨识只支持正装普通6轴,空载,辨识相关参数设置 ### 轨迹参数设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x7601 | TRAJECTORY_PARAM_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | traSize | double | 是 | 轨迹范围 | | traVel | double | 是 | 轨迹速度 | ```json { "traSize": 10.0, "traVel": 100.0 } ``` ### 查询辨识轨迹参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x7602 | TRAJECTORY_PARAM_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7603 | TRAJECTORY_PARAM_RESPOND | | **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | traSize | double | 是 | 轨迹范围,范围0-100 | | traVel | double | 是 | 轨迹速度,范围0-100 | | alreadyIden | bool | 是 | true-已辨识,false-未辨识 | ```json { "traSize": 50.0, "traVel": 50.0, "alreadyIden": false } ``` ### 查询轨迹 Z 轴最大最小值 | 字段 | 类型 | 描述 | |------|------|------| | 0x7609 | TRAJECTORY_ZMAXMIN | | > 0x7601设置会返回0x7609 **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | zMax | double | 是 | 当前轨迹 Z 最大值 | | zMin | double | 是 | 当前轨迹 Z 最小值 | ```json { "zMax": 100.0, "zMin": 100.0 } ``` ### 确定轨迹安全测试 | 字段 | 类型 | 描述 | |------|------|------| | 0x7604 | SAFE_CHECK_SET | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7605 | SAFE_CHECK_RESPOND | | **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | Finish | int | 是 | 确定安全 | ```json { "Finish": 1 } ``` ### 开始辨识 | 字段 | 类型 | 描述 | |------|------|------| | 0x7606 | IDENTITY_SET | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x7607 | IDENTITY_RESPOND | | **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | error | array[double] | 是 | 误差数组,共发10次 | ```json { "error": [100.0, 100.0, 100.0, 100.0, 100.0, 100.0] } ``` ### 辨识完成 | 字段 | 类型 | 描述 | |------|------|------| | 0x7608 | IDENTITY_FINISH | | > 控制器主动发送,十次后发送 Finish 表示完成 **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | Finish | int | 是 | 完成标识 | ```json { "Finish": 1 } ``` ### 辨识错误停止 | 字段 | 类型 | 描述 | |------|------|------| | 0x760A | IDENTITY_ERRORSTOP | | **响应参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | ErrorStop | int | 是 | 错误停止标识 | ```json { "ErrorStop": 1 } ``` --- ## 7. 负载使能 ### 设置负载参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x8130 | PAYLOAD_PARA_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | axis1_actual_torq_conversion_ratio | double | 是 | 1轴实际力矩转换比 | | axis2_actual_torq_conversion_ratio | double | 是 | 2轴实际力矩转换比 | | axis3_actual_torq_conversion_ratio | double | 是 | 3轴实际力矩转换比 | | axis4_actual_torq_conversion_ratio | double | 是 | 4轴实际力矩转换比 | | axis5_actual_torq_conversion_ratio | double | 是 | 5轴实际力矩转换比 | | axis6_actual_torq_conversion_ratio | double | 是 | 6轴实际力矩转换比 | | payload_enable | bool | 是 | 负载使能 | ```json { "axis1_actual_torq_conversion_ratio": 6.4120, "axis2_actual_torq_conversion_ratio": 6.4120, "axis3_actual_torq_conversion_ratio": 11.7730, "axis4_actual_torq_conversion_ratio": 11.7730, "axis5_actual_torq_conversion_ratio": 33.4450, "axis6_actual_torq_conversion_ratio": 33.3380, "payload_enable": true } ``` ### 查询负载参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x8131 | PAYLOAD_PARA_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x8132 | PAYLOAD_PARA_RESPOND | | **响应参数:** 同 0x8130 --- ## 8. 自适应加减速度 ### 设置自适应加减速度参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x8140 | AUTO_MODIFY_ACC_PARA_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | arm_inertia | array[double] | 是 | 关节1~3臂体惯量,数组长度3 | | auto_modify_acc_enable | bool | 是 | 使能 | | joint1_mass | double | 是 | 关节1质量 | | joint1_mass_center_to_motor_distance | double | 是 | 关节1质心到电机距离 | | joint2_mass | double | 是 | 关节2质量 | | joint2_mass_center_to_motor_distance | double | 是 | 关节2质心到电机距离 | | joint4_mass | double | 是 | 关节4质量 | ```json { "arm_inertia": [4.0, 5.0, 6.0], "auto_modify_acc_enable": true, "joint1_mass": 1.0, "joint1_mass_center_to_motor_distance": 7.0, "joint2_mass": 2.0, "joint2_mass_center_to_motor_distance": 8.0, "joint4_mass": 3.0 } ``` ### 查询自适应加减速度参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x8141 | AUTO_MODIFY_ACC_PARA_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x8142 | AUTO_MODIFY_ACC_PARA_RESPOND | | **响应参数:** 同 0x8140 ### 阈值参数设置 | 字段 | 类型 | 描述 | |------|------|------| | 0x8147 | AUTO_MODIFY_ACC_THRESHOLD_PARA_SET | | **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | acc_threshold_lowlimit | array[double] | 是 | 加速度阈值下限,数组长度4 | | acc_threshold_lowlimit_value | array[double] | 是 | 加速度阈值下限值,数组长度4 | | acc_threshold_uplimit | array[double] | 是 | 加速度阈值上限,数组长度4 | | acc_threshold_uplimit_value | array[double] | 是 | 加速度阈值上限值,数组长度4 | | vel_threshold_lowlimit | array[double] | 是 | 速度阈值下限,数组长度4 | | vel_threshold_lowlimit_value | array[double] | 是 | 速度阈值下限值,数组长度4 | | vel_threshold_uplimit | array[double] | 是 | 速度阈值上限,数组长度4 | | vel_threshold_uplimit_value | array[double] | 是 | 速度阈值上限值,数组长度4 | ```json { "acc_threshold_lowlimit": [13.0, 14.0, 15.0, 16.0], "acc_threshold_lowlimit_value": [13.0, 14.0, 15.0, 16.0], "acc_threshold_uplimit": [5.0, 6.0, 7.0, 8.0], "acc_threshold_uplimit_value": [5.0, 6.0, 7.0, 8.0], "vel_threshold_lowlimit": [9.0, 10.0, 11.0, 12.0], "vel_threshold_lowlimit_value": [9.0, 10.0, 11.0, 12.0], "vel_threshold_uplimit": [1.0, 2.0, 3.0, 4.0], "vel_threshold_uplimit_value": [1.0, 2.0, 3.0, 4.0] } ``` ### 查询阈值参数 | 字段 | 类型 | 描述 | |------|------|------| | 0x8148 | AUTO_MODIFY_ACC_THRESHOLD_PARA_INQUIRE | | **请求参数:** 无 ### 控制器回复 | 字段 | 类型 | 描述 | |------|------|------| | 0x8149 | AUTO_MODIFY_ACC_THRESHOLD_PARA_RESPOND | | **响应参数:** 同 0x8147 --- # 系统状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/02.%E7%8A%B6%E6%80%81%E6%8E%A7%E5%88%B6/01.%E7%B3%BB%E7%BB%9F%E7%8A%B6%E6%80%81.html ## 控制器初始化是否完成 ### 查询是否完成 **命令字**:0x4305 `CONTROLLER_INIT_FINISH_INQUIRE` ```json {} ``` ### 控制器回复 **命令字**:0x4306 `CONTROLLER_INIT_FINISH_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | finishinit | bool | true:完成,false:未完成 | ```json { "finishinit": true } ``` --- ## 控制器 IP 设置 ### 控制器 IP 设置 **命令字**:0x4301 `CONTROLLER_IP_SET` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | name | string | 网卡名称 | | address | string | IP 地址 | | gateway | string | 网关 | | dns | string | DNS 服务器 | ```json { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ``` ### 查询控制器 IP **命令字**:0x4302 `CONTROLLER_IP_INQUIRE` 无参数 ### 控制器回复 **命令字**:0x4303 `CONTROLLER_IP_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | num | int | 网卡数量 | | network | array | 网卡信息数组 | ```json { "num": 1, "network": [ { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" }, { "name": "p2p1", "address": "192.168.1.14", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ] } ``` --- ## 控制器 License ### 获取控制器 ID **命令字**:0x5052 `IDENTIFY_NUMBER_INQUIRE` ### 控制器回复 **命令字**:0x5053 `IDENTIFY_NUMBER_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | controllerID | string | 控制器 ID | ```json { "controllerID": "4DC9F0249098C82E" } ``` ### 获取控制器剩余使用天数 **命令字**:0x5055 `USE_REST_DAYS_INQUIRE` ### 控制器回复 **命令字**:0x5056 `USE_REST_DAYS_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | restdays | int | 剩余天数,-1:无限期使用,0:使用期限已到 | | year | int | 过期年份 | | mon | int | 过期月份 | | day | int | 过期日 | ```json { "restdays": 30, "year": 1, "mon": 1, "day": 1 } ``` ### 更新序列号 **命令字**:0x5057 `LICENSE_SERIAL_SET` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | license | string | 控制器序列号 | ```json { "license": "ACOCWKBZHSKBEJHI" } ``` ### 控制器回复 **命令字**:0x5059 `LICENSE_SERIAL_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | result | string | 密钥更新成功,控制器即将重启 | | ivalid | string | 无效的密钥 | | error | string | 存在破解嫌疑,拒绝解锁 | ```json { "result": "success", "ivalid": "无效的密钥!", "error": "存在破解嫌疑,拒绝解锁!" } ``` ### 查询图片版本 **命令字**:0x505A `IMAGE_VERSION_INQUIRE`(示教器无此功能) ### 返回查询结果 **命令字**:0x505B `IMAGE_VERSION_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | result | bool | 查询是否成功 | | version | int | 版本号(查询成功时返回) | ```json { "result": true, "version": xx } ``` ### 控制器发送(无权使用提示) **命令字**:0x505C `DISABLE_CONTROLLER` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | reason | string | 控制器无权使用提示信息 | ```json { "reason": "" } ``` ### 控制器发送(剩余天数提醒) **命令字**:0x505F `REST_DAYS_REMIND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | restDays | int | 控制器发送剩余使用天数 | ```json { "restDays": 0 } ``` --- ## 版本号获取 示教器需要获取当前控制器版本号时,发送下面命令: **命令字**:0x3402 `VERSIONNUM_INQUIRE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | version | string | 版本号内容 | | servoVersion | string | 伺服版本 | | ocmVersion | string | 静态库版本 | | ioVersion | string | IO 板版本 | ```json { "version": "v1.0-rc1-67-gf34dae7", "servoVersion": xx, "ocmVersion": xx, "ioVersion": xx } ``` ### 控制器收到查询命令时,发送下面命令 **命令字**:0x3403 `VERSIONNUM_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | configFileVersionMismatch | bool | 配置文件是否匹配,false:不匹配;true:匹配 | | jobFileVersion | string | 作业文件版本 | | rtlVersion | string | 控制器版本 | | sysClock | string | 系统时钟,格式:YYYY.MM.DD HH:MM:SS | | version | string | 版本号内容 | | servoVersion | string | 伺服版本(久同控制器返回空字符串) | | ocmVersion | string | 静态库版本(久同控制器返回空字符串) | | ioVersion | string | IO 版本号(久同控制器返回空字符串) | | nodka_c1201 | object | C1201控制器专用节点 | ```json { "configFileVersionMismatch": false, "jobFileVersion": "5.2.0", "rtlVersion": "22.08.0", "sysClock": "2023.11.10 13:29:25", "version": "v1.0-rc1-67-gf34dae7", "servoVersion": "", "ocmVersion": "", "ioVersion": "", "nodka_c1201": { "deviceId": "", "hw_version": "", "fw_version": "", "drv_version": "" } } ``` **nodka_c1201 节点参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | deviceId | string | 设备 ID | | hw_version | string | 硬件版本号 | | fw_version | string | 固件版本号 | | drv_version | string | 驱动版本号 | --- ## 版本核验 ### 查询是否存在当前版本的示教器程序 **命令字**:0x3404 `EXIST_TEACHBOX_EQUAL_QTTP_INQUIRE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | MD5 | string | 示教器程序的 MD5值 | ```json { "MD5": "xx" } ``` ### 返回查询结果 **命令字**:0x3405 `EXIST_TEACHBOX_EQUAL_QTTP_RESPOND` 如果未查询到,则需要上传当前版本的程序。 **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | backuppath | string | 示教器程序路径 | ```json { "backuppath": "xx" } ``` ### 查询是否存在与控制器版本匹配的示教器程序 **命令字**:0x3406 `EXIST_CONTROLLER_MATCHED_QTTP_INQUIRE` 无参数 ### 返回查询结果 **命令字**:0x3407 `EXIST_CONTROLLER_MATCHED_QTTP_RESPOND` 若结果为是,则弹框让客户选择是否自动升级。 **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | backuppath | string | 示教器程序路径 | ```json { "backuppath": "xx" } ``` --- ## 重启控制器 重启控制器时,示教器发送: **命令字**:0x5061 `REBOOT_CONTROLLER` 无参数 --- ## 恢复出厂设置 恢复出厂设置时,示教器发送: **命令字**:0x5064 `RETURN_FACTORY_SET` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | clearConfigFile | bool | 清除所有系统配置文件 | | clearExtendedFile | bool | 清除所有扩展文件 | ```json { "clearConfigFile": true, "clearExtendedFile": true } ``` --- ## 系统自动备份 ### 备份系统 示教器发送: **命令字**:0x5065 `CONTROLLER_BACKUP_INQUIRE` 无参数 ### 控制器回复 **命令字**:0x5066 `CONTROLLER_BACKUP_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | backUpNum | int | 备份数 | | backUpName | array | 备份系统的名字,最多十个 | ```json { "backUpNum": 1, "backUpName": ["string", "string", "string"] } ``` ### 恢复系统 示教器发送: **命令字**:0x5067 `CONTROLLER_BACKUP_RESTORE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | backUpOneName | string | 需要恢复的系统名称 | ```json { "backUpOneName": "string" } ``` ### 控制器回复 **命令字**:0x5068 `CONTROLLER_BACKUP_RESTORE_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | success | bool | true:系统恢复成功,false:系统恢复失败 | ```json { "success": true } ``` --- ## 伺服参数 ### 通过控制器设置伺服内部参数 **命令字**:0x5071 `SERVO_INSIDE_PARM_SET` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号 | | servoNum | int | 伺服号 | | 参数名 | object | 伺服参数名 | ```json { "robot": 1, "servoNum": 1, "参数名": { "value": "", "unit": "", "upLimit": "", "lowLimit": "" } } ``` ### 示教器查询 **命令字**:0x5072 `SERVO_INSIDE_PARM_INQUIRE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号 | | servoNum | int | 伺服号 | ```json { "robot": 1, "servoNum": 1 } ``` ### 控制器返回 **命令字**:0x5073 `SERVO_INSIDE_PARM_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号 | | servoNum | int | 伺服号 | | sendNum | int | 发送编号 | | totalNum | int | 总数 | | servo | array | 具体伺服参数数组 | ```json { "robot": 1, "servoNum": 1, "sendNum": 1, "totalNum": 1, "servo": [ { "name": "电机额定功率", "value": 3000 }, { "name": "电机额定转速", "value": 4000 } ] } ``` --- ## 文件传输 ### 请求上传某文件 **命令字**:0x5501 `REQUEST_UPLOAD_FILE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | name | string | 文件名称 | | size | int | 文件大小 | ```json { "name": "vxWorks", "size": 4096 } ``` ### 同意上传请求/拒绝上传请求 **命令字**:0x5502 `REQUEST_UPLOAD_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | answer | string | "yes":同意上传,"busy":控制器忙碌 | ```json { "answer": "yes" } ``` ### 请求下载某文件 **命令字**:0x5504 `REQUEST_DOWNLOAD_FILE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | name | string | 文件名称 | ```json { "name": "log.0" } ``` ### 同意下载请求/拒绝下载请求 **命令字**:0x5505 `REQUEST_DOWNLOAD_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | answer | string | "yes":同意下载,"busy":控制器忙碌,"nofile":无此文件 | | name | string | 作业文件全路径 | | size | int | 如果拒绝,则 size 无效 | ```json { "answer": "yes", "name": "log.0", "size": 4096 } ``` --- ## 文件传输网络异常中断(仅示教器) **命令字**:0x5525 `DownLoadInterrupt` 无参数 ```json {} ``` --- ## 示教器查询控制器配置文件目录 **命令字**:0x5507 `CONFIG_FILE_INQUIRY` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | isExport | bool | true:表示导出配置,false 表示导入配置 | ```json { "isExport": true } ``` --- ## 控制器向示教器发送配置文件目录 **命令字**:0x5508 `CONFIG_FILE_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | filenum | int | 配置文件数量 | | filelist | array | 配置文件名称列表 | ```json { "filenum": 2, "filelist": ["xxx.json", "yyy.json"] } ``` --- ## 发送文件二进制数据 **命令字**:0x5511 `UploadFileData`(告诉控制器文件发送完成) **命令字**:0x5512 `UploadFileDone`(循环给控制器发送文件) ### 控制器回复 **命令字**:0x5513 `ReceiveUploadFinish` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | finish | bool | true 表示上传成功,false 表示失败 | ```json { "finish": true } ``` --- ## 示教器请求获取日志文件列表 **命令字**:0x5542 `LOGFILE_LIST_INQUIRE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | num | int | 表示获取最近多少个文件,可选值:5、30、100 | ```json { "num": 5 } ``` ### 控制器回复日志文件列表 **命令字**:0x5543 `LOGFILE_LIST_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | absolutepath | string | 日志所在目录 | | logfilenum | int | 注意,这个数和上面的 num 不一定相等 | | logfilelist | array | 日志列表 | ```json { "absolutepath": "log/", "logfilenum": 3, "logfilelist": ["logInfo.0", "logInfo.1", "logInfo.2"] } ``` --- ## ENI 文件列表查询 **命令字**:0x5545 `ENIFILE_LIST_INQUIRE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | num | int | 表示获取最近多少个文件,可选值:5、30、100 | ```json { "num": 5 } ``` ### 控制器回复 ENI 文件列表 **命令字**:0x5546 `ENIFILE_LIST_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | absolutepath | string | 文件所在目录 | | ENIfilenum | int | 注意,这个数和上面的 num 不一定相等 | ```json { "absolutepath": "log/", "ENIfilenum": 3 } ``` --- ## 示教器发送表示已接受完成 **命令字**:0x5544 `DownLoadControlLogFileFinish` --- ## 示教器请求获取作业文件列表 **命令字**:0x5532 `JOBFILE_LIST_INQUIRE` ### 控制器回复作业文件目录及数量 **命令字**:0x5533 `JOBFILE_SUM_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | absolutepath | array | 作业文件路径 | | jobfilenum | array | 各作业文件路径下的作业文件数量 | ```json { "absolutepath": ["/job/R1/", "/job/R2/", "/job/R3/", "/job/R4/"], "jobfilenum": [2, 33, 233, 666] } ``` ### 控制器回复作业文件列表 **命令字**:0x5534 `JOBFILE_LIST_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号 | | listnum | int | 最多10个 | | jobfilelist | array | 作业文件列表 | ```json { "robot": 1, "listnum": 2, "jobfilelist": [ { "name": "xxx.JBR", "MD5": "123" }, { "name": "yyy.JBR", "MD5": "132" } ] } ``` ### 接受完成发送给示教盒 **命令字**:0x5535 `JOBFILE_LIST_FINISH` 无参数。当四个机器人发送完毕后发送给示教盒 --- ## 示教器查询 Lua 脚本列表 **命令字**:0x5552 `LUASCRIPT_LIST_INQUIRE` 无参数 ### 控制器回复 Lua 脚本列表 **命令字**:0x5553 `LUASCRIPT_LIST_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | absolutepath | string | Lua 脚本所在目录 | | sum | int | 列表总数 | | scriptlist | array | 脚本列表 | ```json { "absolutepath": "lua/", "sum": 3, "scriptlist": ["ww.lua", "ee.lua"] } ``` --- ## 信息提示 ### 错误提示 **命令字**:0x2B03 `ERROR_CODE` ### 警告提示 **命令字**:0x2B04 `WARNING_CODE` ### 消息条提示 **命令字**:0x2B05 `INFO_CODE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | data | string | 消息条内容 | | type | int | 消息代码 | ```json { "data": "示例", "type": 1234 } ``` ### 弹窗提示 **命令字**:0x2B06 `POPUP_CODE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | count | int | 弹窗按钮数量,最大为3 | | text1 | string | 弹窗居中显示的主文本 | | text2 | string | 按钮1的文本 | | text3 | string | 按钮2的文本 | | text4 | string | 按钮3的文本 | | kind | int | 弹窗提示种类,1为消息,2为警告,3为报错 | | node | string | 机器人序号1-4 | | Tips | bool | 弹窗呼出为 true | ```json { "count": 1, "text1": "示例", "text2": "示例", "text3": "示例", "text4": "示例", "kind": 1, "node": "1", "Tips": true } ``` ### 弹窗交互反馈 根据用户对弹窗的操作进行相应设置: **命令字**:0x2B07 `GET_OPTION` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | node | string | 机器人序号1-4 | | option | int | 1-3,对应弹窗选项1-3的内容 | ```json { "node": "1", "option": 1 } ``` --- ## 控制器时间查询 ### 时间查询 **命令字**:0x5742 `CONTROLLER_TIME_INQUIRE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | type | int | 1:获取系统开始时间至现在秒数,0:显示时间 | | format | int | 1:获取北京时间,0:获取时间戳 | ```json { "type": 0, "format": 0 } ``` ### 返回查询结果 **命令字**:0x5743 `CONTROLLER_TIME_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | tType | int | 1:获取系统开始时间至现在秒数,0:显示时间 | | format | int | 1:获取北京时间,0:获取时间戳 | | date | object | format 为1时用格林威治标准时间表示 | | year | int | 日期中的年份 | | mon | int | 日期中的月份 | | day | int | 日期中的天 | | hour | int | 时间中的小时 | | min | int | 时间中的分钟 | | sec | int | 时间中的秒数 | | msec | int | 时间中的毫秒数 | | timestamp | object | 以秒和纳秒的形式记录时间戳 | | s | int | 时间戳中的秒数 | | ns | int | 时间戳中的纳秒数 | ```json { "tType": 0, "format": 0, "date": { "year": 2023, "mon": 1, "day": 1, "hour": 1, "min": 1, "sec": 1, "msec": 1 }, "timestamp": { "s": 1, "ns": 1 } } ``` --- ## 复制机器人参数 **命令字**:0x9111 `COPY_ROBOT_PARAM` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | mainRobot | int | 被复制参数的机器人的机器人号 | | copyToRobot | array | 数组下标为机器人几;数组元素:1:需要复制,0:无需复制 | ```json { "mainRobot": 1, "copyToRobot": [0, 1, 0, 1] } ``` --- ## 接收和发送信息 // 0x95XX 被上位机服务功能占有 ### 服务器发送错误 **命令字**:0x6010 `SEVERO_ERROR` ### 发送机器人错误 **命令字**:0x6020 `ROBOT_ERROR` ### 发送控制器错误 **命令字**:0x6030 `CONTROLLER_ERROR` ### 发送内存错误 **命令字**:0x6040 `MEMORY_ERROR` ### 警告类型 **命令字**:0x6110 `WARNING_TYPE` ### 消息类型 **命令字**:0x6210 `INFO_TYPE` --- ## 硬盘状态 ### 硬件状态查询 **命令字**:0x50D2 `HARDDISK_STATUS_INQUIRE` 无参数 ```json {} ``` ### 硬件状态查询后控制器返回 **命令字**:0x50D3 `HARDDISK_STATUS_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | Estimated_Available_Time | int | 预计可用时间,单位 h | | get_harddisk_warning_time | int | 硬盘预警时间,单位 h | ```json { "Estimated_Available_Time": 200, "get_harddisk_warning_time": 500 } ``` ### 设置硬盘预警时间 **命令字**:0x50D4 `HARDDISK_WARNING_TIME_SET` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | set_harddisk_warning_time | int | 硬盘预警时间,单位 h | ```json { "set_harddisk_warning_time": 500 } ``` --- ## 操作参数 ### 操作参数设置 **命令字**:0x50A1 `OPERATE_PARAM_SET` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | OutageKeepFunctionFlag | bool | 断电保持功能 | | checkServoStatusWordMaxTime | int | 伺服响应时间,单位 ms,范围1-1000 | | runModeAutoManBegFlag | bool | 切到运行模式自动上电 | | remoteUseReserveModeFlag | bool | 预约模式 | | remoteAllowContinueRunFlag | bool | 远程 IO 断点执行 | | remoteAllowCurrentRunFlag | bool | 远程 IO 当前行执行 | | remoteSwitchModeEnable | bool | 无示教器切远程模式 | | allowReserveRunningPro | bool | 远程 IO 程序运行中再次预约 | | SetSafeScreenTeachInvalidFlag | bool | 示教模式安全光幕不生效 | | keepStepRunFlag | int | 单步/回零/复位点/运行操作方式,0:单击运行,1:按下运行 | | defaultRunningSpeed | int | 运行模式开机默认速度 | | language | string | 语言选项:"chinese"、"english"、"korean" | | craftSelect | string | 工艺选择:general-通用工艺,special-专用工艺,punch-冲压工艺,pallet-码垛工艺,weld-焊接工艺,cut-切割工艺 | | switch_only_note | bool | 指令插入只显示点位注释,true 只显示注释,false 都显示 | ```json { "OutageKeepFunctionFlag": false, "checkServoStatusWordMaxTime": 100, "runModeAutoManBegFlag": false, "remoteUseReserveModeFlag": false, "remoteAllowContinueRunFlag": true, "remoteAllowCurrentRunFlag": false, "remoteSwitchModeEnable": false, "allowReserveRunningPro": false, "SetSafeScreenTeachInvalidFlag": false, "keepStepRunFlag": 0, "defaultRunningSpeed": 1, "language": "chinese", "craftSelect": "general", "switch_only_note": false } ``` ### 查询 **命令字**:0x50A2 `OPERATE_PARAM_INQUIRE` 无参数 ### 控制器返回 **命令字**:0x50A3 `OPERATE_PARAM_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | rebootRunEnable | bool | 断电保持功能 | | defaultRunningSpeed | int | 运行模式开机默认速度 | | runModeAutoManBegFlag | bool | 切到运行模式自动上电 | | remoteUseReserveModeFlag | bool | 预约模式 | | remoteAllowContinueRunFlag | bool | 远程 IO 断点执行 | | remoteAllowCurrentRunFlag | bool | 远程 IO 当前行执行 | | remoteSwitchModeEnable | bool | 无示教器切远程模式 | | allowReserveRunningPro | bool | 远程 IO 程序运行中再次预约 | | SetSafeScreenTeachInvalidFlag | bool | 示教模式安全光幕不生效 | | keepStepRunFlag | int | 单步/回零/复位点/运行操作方式,0:单击运行,1:按下运行 | | craftSelect | string | 工艺选择 | | switch_only_note | bool | 指令插入只显示点位注释 | ```json { "rebootRunEnable": false, "defaultRunningSpeed": 1, "runModeAutoManBegFlag": false, "remoteUseReserveModeFlag": false, "remoteAllowContinueRunFlag": true, "remoteAllowCurrentRunFlag": false, "remoteSwitchModeEnable": false, "allowReserveRunningPro": false, "SetSafeScreenTeachInvalidFlag": false, "keepStepRunFlag": 0, "craftSelect": "general", "switch_only_note": false } ``` --- ## 切换系统 **命令字**:0x5101 `SWITCH_MASTER` 无参数 --- ## 获取支持的语言 ### 查询语言支持 **命令字**:0x50A5 `LANGUAGE_SUPPORT_INQUIRE` 无参数 ```json {} ``` ### 返回查询结果 **命令字**:0x50A6 `LANGUAGE_SUPPORT_RESPOND` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | language | array | 支持的语言列表 | | language_used | string | 当前使用的语言 | ```json { "language": ["Chinese", "Korean", "English"], "language_used": "Chinese" } ``` ### 比对示教器和控制器当前语言 **命令字**:0x50A7 `TEACHBOX_LANGUAGE` **参数说明**: | 参数 | 类型 | 说明 | |------|------|------| | teachbox_language | string | 示教器当前语言 | ```json { "teachbox_language": "Chinese" } ``` --- ## 拔出示教盒 ### 拔出示教器发送 **命令字**:0x7277 `TEACHBOXSTATE_CLOSE` 无参数 ```json {} ``` ### 插入示教盒恢复通信 **命令字**:0x7278 `TEACHBOXSTATE_OPEN` 无参数 ```json {} ``` --- # 全局变量 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/02.%E7%8A%B6%E6%80%81%E6%8E%A7%E5%88%B6/02.%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F.html ## 1. 当前位置模式 | 值 | 模式 | 说明 | |---|---|---| | -1 | 控制器当前坐标 | 控制器当前坐标 | | 0 | 关节坐标(Joint) | 关节坐标系 | | 1 | 直角坐标(Angle) | 直角坐标系 | | 2 | 工具坐标(Tool) | 工具坐标系 | | 3 | 用户坐标(User) | 用户坐标系 | ## 2. 获取全局位置变量点位 **命令**: `0x5602 GLOBAL_ALLPOSITION_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | **示例请求**: ```json { "robot": 1 } ``` **控制器回复**: `0x5603 GLOBAL_ALLPOSITION_RESPOUND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | robot | int | 机器人号 | | globalPosition | object | 全局点位列表 | | note | object | 注释列表 | **示例响应**: ```json { "robot": 1, "globalPosition": { "GP0001": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "GP0003": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6] }, "note": { "GP0001": "qqqq", "GP0002": "", "GP0003": "www" } } ``` > **说明:** 如果是四轴机器人,最后两位补0。 ## 3. 设置全局点位 **命令**: `0x5604 GLOBAL_POSITION_SET` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | posName | string | 是 | 点位名称 | | pos | array | 是 | 点位数据(14元素) | | note | string | 否 | 注释 | **pos 数组说明** (共14元素): | 索引 | 说明 | |---|---| | 0 | 坐标系: 0-关节, 1-直角, 2-工具, 3-用户 | | 1 | 单位: 0-弧度制, 1-角度制 | | 2 | 姿态: 0-无, 1-手左, 2-右手 | | 3 | 工具坐标编号 | | 4 | 用户坐标编号 | | 5-6 | 预留位 | | 7-13 | 位置数据: J1~J7 / xyzabc | **示例请求**: ```json { "robot": 1, "posName": "GP0001", "pos": [1, 0, 0, 0, 0, 0, 0, 459, 0, 796, 3.141, 0, 0, 0], "note": "data" } ``` ## 4. 查询全局点位 **命令**: `0x5605 GLOBAL_POSITION_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | posName | string | 是 | 点位名称 | **示例请求**: ```json { "robot": 1, "posName": "GP0001" } ``` **控制器回复**: `0x5606 GLOBAL_POSITION_RESPOUND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | note | string | 注释 | | posName | string | 变量名 | | posValue | array | 弧度制点位 | | posValueDeg | array | 角度制点位 | | robot | int | 机器人号 | **示例响应**: ```json { "note": "", "posName": "GP0001", "posValue": [1.0, 1.0, 8.0, 0.0, 0.0, 0.0, 0.0, 377.5550, 1.3950, 718.3910, 3.104225101352, 0.106517442432, 0.024713861787, 0.0], "posValueDeg": [1.0, 1.0, 8.0, 0.0, 0.0, 0.0, 0.0, 377.5550, 1.3950, 718.3910, 177.858996966040, 6.102999895881, 1.415999975865, 0.0], "robot": 1 } ``` ## 5. 设置全局数值变量 **命令**: `0x5607 GLOBAL_VARIANT_SET` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | varName | string | 是 | 变量名称 | | varType | int | 是 | 变量类型: 0-int, 1-double, 2-bool, 3-string | | varValue | double | 否 | 变量值(数值类型使用) | | varString | string | 否 | 变量值(string 类型使用) | | varNote | string | 否 | 注释 | **示例请求**: ```json { "varName": "GI001", "varType": 1, "varValue": 14.0, "varString": "oooo", "varNote": "aaa" } ``` ## 6. 获取全局数值变量列表 **命令**: `0x5608 GLOBAL_VARIANT_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | varType | int | 是 | 变量类型: 1-布尔型, 2-int 型, 3-double 型 | **示例请求**: ```json { "varType": 1 } ``` **控制器回复**: `0x5609 GLOBAL_VARIANT_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | varType | int | 变量类型 | | varNum | int | 数值变量个数 (0-100) | | varList | array | 数值变量列表 | **varList 数组元素**: | 参数 | 类型 | 说明 | |---|---|---| | varName | string | 变量名字 | | varValue | mixed | 变量值 | | varNote | string | 注释 | **示例响应**: ```json { "varType": 1, "varNum": 2, "varList": [ { "varName": "I001", "varValue": 3, "varNote": "QQQ" }, { "varName": "D002", "varValue": 8.4, "varNote": "hhha" } ] } ``` ## 7. 请求全局数值注释 **命令**: `0x5610 GLOBAL_ALLVARIANT_NOTE_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | varType | int | 是 | 变量类型: 1-bool, 2-int, 3-double, 4-string | **示例请求**: ```json { "varType": 1 } ``` **控制器回复**: `0x5611 GLOBAL_ALLVARIANT_NOTE_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | varNote | object | 注释列表 | | varType | int | 变量类型 | **示例响应**: ```json { "varNote": { "GB001": "III", "GB002": "SDFSF" }, "varType": 1 } ``` ## 8. 查询单个全局变量 **命令**: `0x560B GLOBAL_VARIANT_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | varType | int | 是 | 变量类型: 0-int, 1-double, 2-bool, 3-string | | varName | string | 是 | 变量名称 | | identity | string | 否 | 来源标识 | **identity 取值说明**: | 值 | 说明 | |---|---| | VariableReview | 监控界面的全局变量 | | NumerlcalVarWidget | 全局数值变量界面 | **示例请求**: ```json { "varType": 1, "varName": "GI001", "identity": "VariableReview" } ``` **控制器回复**: `0x560C GLOBAL_VARIANT_RESPOUND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | varType | int | 变量类型 | | varName | string | 变量名称 | | varValue | mixed | 变量值 | | varString | string | 字符串值(string 类型) | | identity | string | 来源标识 | | varNote | string | 注释 | **示例响应**: ```json { "varType": 1, "varName": "GI001", "varValue": 666, "varString": "i'm a string", "identity": "VariableReview", "varNote": "跳伞模拟器" } ``` ## 9. 局部变量位置变量 P 点查询 **命令**: `0x5612 LOCAL_POS_P_VAR_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | varname | string | 是 | 点位名称 | | initialValue | bool | 是 | 是否为初始值 | **示例请求**: ```json { "robot": 1, "varname": "P0001", "initialValue": true } ``` **控制器回复**: `0x5613 LOCAL_POS_P_VAR_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | robot | int | 机器人号 | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值 | | pos | array | 点位(弧度制) | | posDeg | array | 点位(角度制) | **示例响应**: ```json { "robot": 1, "jobname": "Q1", "varname": "P0001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6] } ``` ## 10. 局部变量位置变量 E 点查询 **命令**: `0x5615 LOCAL_POS_E_VAR_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | varname | string | 是 | 点位名称 | | initialValue | bool | 是 | 是否为初始值 | **示例请求**: ```json { "robot": 1, "varname": "E0001", "initialValue": true } ``` **控制器回复**: `0x5616 LOCAL_POS_E_VAR_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | robot | int | 机器人号 | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值 | | pos | array | 点位(弧度制,11元素) | | posDeg | array | 点位(角度制,11元素) | **示例响应**: ```json { "robot": 1, "jobname": "Q1", "varname": "E001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } ``` ## 11. 局部变量数值变量查询 **命令**: `0x5618 LOCAL_VALUE_VAR_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | vartype | int | 是 | 变量类型: 0-int, 1-double, 2-bool, 3-string | | varname | string | 是 | 变量名称 | | initialValue | bool | 是 | 是否为初始值 | | identify | string | 否 | 来源标识 | **identify 取值说明**: | 值 | 说明 | |---|---| | CommandInsert | 插入指令界面变量 | | VariableReview | 监控界面数值变量 | **示例请求**: ```json { "robot": 1, "vartype": 1, "varname": "I001", "initialValue": true, "identify": "CommandInsert" } ``` **控制器回复**: `0x5619 LOCAL_VALUE_VAR_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | robot | int | 机器人号 | | jobname | string | 作业文件名称 | | vartype | int | 变量类型: 1-bool, 2-int, 3-double | | varname | string | 变量名称 | | value | mixed | 变量值(数值类型) | | string | string | 变量值(字符串类型) | | identify | string | 来源标识 | **示例响应**: ```json { "robot": 1, "jobname": "Q1", "vartype": 1, "varname": "I001", "value": 2, "string": "i'm a string", "identify": "CommandInsert" } ``` ## 12. 全局外部轴变量 > **说明:** 全局外部轴变量结构: 点位信息(7) + 机器人位置(7) + 外部轴位置(5) + 预留(2) = 21元素 ### 12.1 设置全局外部轴变量 **命令**: `0x561a GLOBAL_EXTPOS_VAR_SET` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | varname | string | 是 | 点位名称 | | pos | array | 是 | 点位数据(21元素) | | note | string | 否 | 备注 | **pos 数组说明**: | 索引范围 | 说明 | |---|---| | 0-6 | 点位信息 | | 7-13 | robot 位置 | | 14-18 | sync 外部轴位置 | | 19-20 | 预留 | **示例请求**: ```json { "robot": 1, "varname": "GE001", "pos": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 0, 0], "note": "qqq" } ``` ### 12.2 查询全局外部轴变量 **命令**: `0x561b GLOBAL_EXTPOS_VAR_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | varname | string | 是 | 点位名称 | | initialValue | bool | 是 | 是否为初始值 | **示例请求**: ```json { "robot": 1, "varname": "GE0001", "initialValue": true } ``` **控制器回复**: `0x561c GLOBAL_EXTPOS_VAR_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | note | string | 注释 | | varname | string | 变量名称 | | initialValue | bool | 是否为初始值 | | posValue | array | GP + 外部点(弧度制) | | posValueDeg | array | GP + 外部点(角度制) | **示例响应**: ```json { "note": "", "varname": "GE001", "initialValue": true, "posValue": [0.0, 0.0, 0.0, 0.0], "posValueDeg": [0.0, 0.0, 0.0, 0.0] } ``` ### 12.3 获取全部全局外部轴点位 **命令**: `0x561d GLOBAL_ALLEXTPOS_VAR_INQUIRE` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | **示例请求**: ```json { "robot": 1 } ``` **控制器回复**: `0x561e GLOBAL_ALLEXTPOS_VAR_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | robot | int | 机器人号 | | globalExtPosition | object | 点位列表 | | note | object | 注释列表 | **示例响应**: ```json { "robot": 1, "globalExtPosition": { "GE001": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "GE003": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6] }, "note": { "GE001": "qqqq", "GE002": "", "GE003": "www" } } ``` ## 13. 机器人点位坐标系转换 **命令**: `0x2A12 POS_TRANS_COORD` **请求参数**: | 参数 | 类型 | 必填 | 说明 | |---|---|---|---| | robot | int | 是 | 机器人号 | | name | string | 是 | 点名字 | | pos | array | 是 | 点位数据(21元素) | | targetCoord | int | 是 | 目标坐标系: 0-关节, 1-直角, 2-工具, 3-用户 | **示例请求**: ```json { "robot": 1, "name": "P001", "pos": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "targetCoord": 1 } ``` **控制器回复**: `0x2A13 POS_TRANS_COORD_RESPOND` **响应参数**: | 参数 | 类型 | 说明 | |---|---|---| | name | string | 点名字 | | pos | array | 点位信息(通用21位数据,弧度制) | | posDeg | array | 点位信息(通用21位数据,角度制) | | robot | int | 机器人号 | **示例响应**: ```json { "name": "P001", "pos": [1, 1, 0, 0, 0, 0, 0, 459.62120, -0.1010, 796.79160, 3.141592653590, 0.0, 0.0, 0.0], "posDeg": [1, 1, 0, 0, 0, 0, 0, 459.62120, -0.1010, 796.79160, 180.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- # 远程 IO 控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/02.%E7%8A%B6%E6%80%81%E6%8E%A7%E5%88%B6/03.%E8%BF%9C%E7%A8%8BIO%E6%8E%A7%E5%88%B6.html ## 1. IO 功能界面设置 ### 1.1 IO 功能界面设置(示教盒发送) **命令码**: `0x2F01 IO_CONTROL_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | inPort | object | 是 | 远程 IO 功能端口绑定 | | inValue | object | 是 | 端口值,IO 参数,0:低电平有效,1:高电平有效 | | program | array | 是 | 远程 IO 程序 DIN 和 value 绑定,共10个 | | robot | int | 是 | 机器人号 | **inPort 对象参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | start | int | 启动,绑定端口 | | stop | int | 停止,绑定端口 | | pause | int | 暂停,绑定端口 | | faultReset | int | 清除报警,绑定端口 | | clearoutagekeep | int | 清除断电保持数据,绑定端口 | **inValue 对象参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | start | int | 启动 | | stop | int | 停止 | | pause | int | 暂停 | | faultReset | int | 清除报警 | | clearoutagekeep | int | 清除断电保持数据 | **program 数组参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | port | int | 端口号 | | value | int | 端口值,0或1 | **请求示例**: ```json { "inPort": { "clearoutagekeep": 16, "faultReset": 4, "pause": 3, "start": 1, "stop": 2 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"port": 5, "value": 1}, {"port": 6, "value": 0}, {"port": 7, "value": 0}, {"port": 8, "value": 1}, {"port": 9, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1} ], "robot": 1 } ``` --- ### 1.2 IO 功能界面查询(示教盒发送) **命令码**: `0x2F02 IO_CONTROL_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **请求示例**: ```json { "robot": 1 } ``` --- ### 1.3 IO 功能界面响应(控制器返回) **命令码**: `0x2F03 IO_CONTROL_RESPOND` **参数说明**: 同 1.1 IO 功能界面设置 **响应示例**: ```json { "inPort": { "clearoutagekeep": 16, "faultReset": 4, "pause": 3, "start": 1, "stop": 2 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"port": 5, "value": 1}, {"port": 6, "value": 0}, {"port": 7, "value": 0}, {"port": 8, "value": 1}, {"port": 9, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1} ], "robot": 1 } ``` --- ## 2. 复位点设置 ### 2.1 复位点位置参数设置(示教盒发送) **命令码**: `0x2F04 IO_CONTROL_RESETPOS_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | pos | array | 是 | 机器人位置(7个元素) | | posSync | array | 是 | 外部轴位置(5个元素) | | robot | int | 是 | 机器人号 | **请求示例**: ```json { "pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- ### 2.2 复位点 IO 参数设置(示教盒发送) **命令码**: `0x2F14 IO_CONTROL_RESETPORT_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | selectPiontOrFile | int | 是 | 0:复位点,1:复位程序 | | inPort | int | 是 | 复位开始,IO 触发端口 | | inValue | int | 是 | 复位开始,IO 参数 | | outPort | int | 是 | 复位结束,IO 输出端口 | | safeEnable | bool | 是 | 安全使能 | | returnway | int | 是 | 0:关节插补,1:直线插补 | **请求示例**: ```json { "robot": 1, "selectPiontOrFile": 0, "inPort": 0, "inValue": 1, "outPort": 0, "safeEnable": true, "returnway": 0 } ``` --- ### 2.3 安全点误差参数设置 **命令码**: `0x2F15 IO_CONTROL_RESETSAFEDEV_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | deviation | array | 是 | 机器人位置偏差(7个元素) | | deviationSync | array | 是 | 外部轴偏差(5个元素) | | robot | int | 是 | 机器人号 | **请求示例**: ```json { "deviation": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 1.0], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0], "robot": 1 } ``` --- ### 2.4 安全点位置通知 **命令码**: `0x2F16 IO_CONTROL_NOTIS_SAFEPOS` **说明**: 运行作业文件时,开始安全使能,不在安全点时控制器返回发送 **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 当前机器人 | | isSync | bool | 是 | false:机器人不在安全区,true:外部轴不在安全区 | | currentPos | array | 是 | 当前坐标 | | safePos | array | 是 | 复位点位 | **响应示例**: ```json { "robot": 1, "isSync": false, "currentPos": [0, 0.1, 2, 3.3, 44, 555.55, 6, 7.7, 88], "safePos": [0, 0.1, 2, 3.3, 88, 555.55, 6, 7.7, 88] } ``` --- ### 2.5 回复位 **命令码**: `0x2F17 RECOVERY_SITE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **请求示例**: ```json { "robot": 1 } ``` --- ### 2.6 复位点设置查询(示教盒发送) **命令码**: `0x2F05 IO_CONTROL_RESET_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **请求示例**: ```json { "robot": 1 } ``` --- ### 2.7 复位点设置响应(控制器返回) **命令码**: `0x2F06 IO_CONTROL_RESET_RESPOND` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | selectPiontOrFile | int | 是 | 0选择的是点,1选择的程序 | | returnWay | int | 是 | 0表示选择的是 movj,1表示的是 movl | | inPort | int | 是 | 复位开始,IO 触发端口 | | inValue | int | 是 | 复位开始,IO 参数 | | outPort | int | 是 | 复位结束,IO 输出端口 | | safeEnable | bool | 是 | 安全使能 | | pos | array | 是 | 复位点坐标 | | posSync | array | 是 | 外部轴复位点坐标 | | deviation | array | 是 | 安全点范围 | | deviationSync | array | 是 | 外部轴安全点范围 | **响应示例**: ```json { "robot": 1, "selectPiontOrFile": 1, "returnWay": 1, "inPort": 0, "inValue": 1, "outPort": 0, "safeEnable": true, "pos": [0, 0.1, 2, 3.3, 44, 555.55, 6, 7.7, 88], "posSync": [0, 0.1, 2, 3.3, 44, 555.55, 6, 7.7, 88], "deviation": [0, 0.1, 2, 3.3, 44, 555.55, 6, 7.7, 88], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0] } ``` --- ### 2.8 当前位置查询(示教盒发送) **命令码**: `0x2F07 IO_CONTROL_POS_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | coord | int | 是 | 坐标模式:-1-控制器当前坐标,0-关节坐标,1-直角坐标,2-工具坐标,3-用户坐标 | **请求示例**: ```json { "robot": 1, "coord": 0 } ``` --- ### 2.9 当前位置响应(控制器返回) **命令码**: `0x2F08 IO_CONTROL_POS_RESPOND` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | coord | int | 是 | 坐标模式 | | pos | array | 是 | 弧度点位 | | posDeg | array | 是 | 角度点位 | | configuration | int | 是 | 形态 | **响应示例**: ```json { "robot": 1, "coord": 1, "pos": [0, 0.1, 2, 3.3, 44, 555.55], "posDeg": [0, 0.1, 2, 3.3, 44, 555.55], "configuration": 1 } ``` --- ### 2.10 双机位置查询(MOVJDOUBLE 指令) **命令码**: `0x2F10 IO_CONTROL_DOUBLE_POS_INQUIRE` **说明**: MOVJDOUBLE 指令在双机下需要同时查询第一和第二个机器人位置 **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot1 | int | 是 | 机器人1 | | coord1 | int | 是 | 机器人1坐标:1-直角坐标,2-工具坐标,3-用户坐标 | | robot2 | int | 是 | 机器人2 | | coord2 | int | 是 | 同机器人1 | **请求示例**: ```json { "robot1": 1, "coord1": 1, "robot2": 2, "coord2": 1 } ``` --- ### 2.11 双机位置响应 **命令码**: `0x2F11 IO_CONTROL_DOUBLE_POS_RESPOND` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | pos1Deg | array | 是 | 机器人1轴1-7当前位置(角度表示) | | pos1 | array | 是 | 机器人1轴1-7当前位置(弧度表示) | | pos2Deg | array | 是 | 机器人2轴1-7当前位置(角度表示) | | pos2 | array | 是 | 机器人2轴1-7当前位置(弧度表示) | **响应示例**: ```json { "pos1Deg": [0, 1.1, 2, 3.3, 4.4, 5.5, 6.6], "pos1": [0, 1.1, 2, 3.3, 4.4, 5.5, 6.6], "pos2Deg": [0, 1.1, 2, 3.3, 4.4, 5.5, 6.6], "pos2": [0, 1.1, 2, 3.3, 4.4, 5.5, 6.6] } ``` --- ### 2.12 打开作业文件 **命令码**: `0x3114` **说明**: 复位程序固定是 RobotResetProgram,后缀是.ResetPro **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobName | string | 是 | 作业文件名称(固定:RobotResetProgram) | | robot | int | 是 | 机器人号 | | suffixname | string | 是 | 作业文件后缀(固定:.ResetPro) | **请求示例**: ```json { "jobName": "RobotResetProgram", "robot": 1, "suffixname": ".ResetPro" } ``` --- ### 2.13 插入指令 **命令码**: `0x3121` --- ### 2.14 保存作业文件 **命令码**: `0x3120` **说明**: 复位程序固定是 RobotResetProgram,后缀是.ResetPro **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobname | string | 是 | 作业文件名称(固定:RobotResetProgram) | | robot | int | 是 | 机器人号 | | suffix | string | 是 | 作业文件后缀(固定:.ResetPro) | **请求示例**: ```json { "jobname": "RobotResetProgram", "robot": 1, "suffix": ".ResetPro" } ``` --- ## 3. 状态提示设置界面 ### 3.1 状态提示设置(示教盒发送) **命令码**: `0x2F09 IO_CONTROL_OUTPUT_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | outPut | array | 是 | 输出配置数组,每个元素对应一个机器人 | | remoteOut | int | 是 | 远程模式 | | remoteOut_value | int | 是 | 远程模式值:0、1、3(闪烁) | | runOut | int | 是 | 运行模式 | | runOut_value | int | 是 | 运行模式值 | | startUp | int | 是 | 开机提示 | | startUp_value | int | 是 | 开机提示值 | | teachOut | int | 是 | 示教模式 | | teachOut_value | int | 是 | 示教模式值 | **outPut 数组元素参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | IOenable | int | 使能 DOUT 绑定 | | IOenable_value | int | 值:0、1、3(闪烁) | | continuable | int | 可继续执行 DOUT 绑定 | | continuable_value | int | 值:0、1、3(闪烁) | | fault | int | 报错提示 DOUT 绑定 | | faultIsFickler | int | 值:0、1、3(闪烁) | | mainJobFirstLine | int | 主程序首行 DOUT 绑定 | | mainJobFirstLine_value | int | 值 | | pause | int | 暂停 DOUT 绑定 | | pause_value | int | 值 | | quickStopOut1 | int | 紧急急停1DOUT 绑定 | | quickStopOut2 | int | 紧急急停2DOUT 绑定 | | quickStopOutValue1 | int | 值 | | quickStopOutValue2 | int | 值 | | running | int | 运行 DOUT 绑定 | | running_value | int | 值 | | stop | int | 停止 DOUT 绑定 | | stop_value | int | 值 | | teachBoxStateOut | int | 拔出示教盒 DOUT 绑定 | | teachBoxStateOutValue | int | 值 | **请求示例**: ```json { "outPut": [ { "IOenable": 1, "IOenable_value": 1, "continuable": 3, "continuable_value": 1, "fault": 5, "faultIsFickler": 1, "mainJobFirstLine": 7, "mainJobFirstLine_value": 1, "pause": 9, "pause_value": 1, "quickStopOut1": 11, "quickStopOut2": 12, "quickStopOutValue1": 1, "quickStopOutValue2": 1, "running": 15, "running_value": 1, "stop": 17, "stop_value": 1, "teachBoxStateOut": 0, "teachBoxStateOutValue": 1 }, {}, {}, {} ], "remoteOut": 1, "remoteOut_value": 1, "runOut": 2, "runOut_value": 1, "startUp": 3, "startUp_value": 1, "teachOut": 4, "teachOut_value": 1 } ``` --- ### 3.2 状态提示查询(示教盒发送) **命令码**: `0x2F0A IO_CONTROL_OUTPUT_INQUIRE` **说明**: data: 无 --- ### 3.3 状态提示响应(控制器返回) **命令码**: `0x2F0B IO_CONTROL_OUTPUT_RESPOND` **说明**: data:同 0x2F09 --- ## 4. IO 复位设置界面 ### 4.1 IO 输出复位设置(示教盒发送) **命令码**: `0x2F0D IO_CONTROL_IORESET_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | type | int | 是 | 1-IO 复位,2-切模式停止,3-程序报错停止 | | enable | array | 是 | 16个元素,值为0或1,包含复位值及是否复位 | | value | array | 是 | 16个元素,值为0或1,包含复位值及是否复位 | **请求示例**: ```json { "robot": 1, "type": 1, "enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "value": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` --- ### 4.2 IO 输出复位查询(示教盒发送) **命令码**: `0x2F0E IO_CONTROL_IORESET_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | type | int | 是 | 类型 | **请求示例**: ```json { "robot": 1, "type": 1 } ``` --- ### 4.3 IO 输出复位响应(控制器返回) **命令码**: `0x2F0F IO_CONTROL_IORESET_RESPOND` **说明**: data:同 0x2F0D --- ## 5. IO 功能状态界面 ### 5.1 IO 功能状态查询(示教盒发送) **命令码**: `0x2F12 IO_FUNCTION_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | int | 是 | 1-数字输入,2-数字输出,3-模拟输入,4-模拟输出 | **请求示例**: ```json { "type": 1 } ``` --- ### 5.2 IO 功能状态响应(控制器返回) **命令码**: `0x2F13 IO_FUNCTION_RESPOND` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | int | 是 | 类型 | | IOFunction | array | 是 | 数字有16个,模拟有8个 | **响应示例**: ```json { "type": 1, "IOFunction": [ "远程:机器人1启动 机器人1视觉:触发端口", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ] } ``` --- ## 6. 远程模式界面 ### 6.1 预约执行状态查询(示教盒发送) **命令码**: `0x2F1B RESERVE_EXE_STATE_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **请求示例**: ```json { "robot": 1 } ``` --- ### 6.2 预约执行状态响应(控制器返回) **命令码**: `0x2F1C RESERVE_EXE_STATE_RESPOND` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | current | object | 是 | 当前运行状态 | | queue | array | 是 | 队列(10个元素) | **current 对象参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | station | int | 工作站(程序编号) | | name | string | 程序名 | | runtime | int | 当前运行的已运行次数 | | times | int | 当前运行的运行总数 | | count | int | 运行总数 | | status | int | 运行状态:0-无预约,1-预约中,2-运行中,3-已预约,4-程序暂停 | **queue 数组元素参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | station | int | 工作站(程序编号) | | name | string | 程序名 | | times | int | 运行次数 | | count | int | 运行总数 | | status | int | 状态 | **响应示例**: ```json { "robot": 1, "current": { "station": 1, "name": "Q1", "runtime": 1, "times": 3, "count": 1, "status": 2 }, "queue": [ {"station": 1, "name": "Q4", "times": 2, "count": 0, "status": 1}, {"station": 1, "name": "Q1", "times": 6, "count": 0, "status": 1}, {"station": 1, "name": "Q3", "times": 1, "count": 0, "status": 1}, {"station": 1, "name": "", "times": 1, "count": 0, "status": 0}, {"station": 1, "name": "", "times": 2, "count": 0, "status": 0} ] } ``` --- ### 6.3 运行总数清零 **命令码**: `0x2F1D RESERVE_EXE_STATE_CLEAR` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **请求示例**: ```json { "robot": 1 } ``` --- ## 7. IO 型号设置 ### 7.1 IO 型号设置(示教盒发送) **命令码**: `0x2F21 IO_TYPE_SET` **说明**: 重启生效 **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | simuNum | int | 是 | 虚拟 IO 数量 | | serialAnalog | object | 是 | 串口模拟量配置 | **serialAnalog 对象参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | type | string | 可选:SUPER_ANAIO、DAC_ANAIO | | port | int | 端口号 | | baudRate | int | 波特率 | **请求示例**: ```json { "simuNum": 0, "serialAnalog": { "type": "SUPER_ANAIO", "port": 1, "baudRate": 115200 } } ``` --- ### 7.2 IO 型号查询(示教盒发送) **命令码**: `0x2F22 IO_TYPE_INQUIRE` --- ### 7.3 IO 型号响应(控制器返回) **命令码**: `0x2F23 IO_TYPE_RESPOND` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | num | int | 是 | IO 板数量 | | type | array | 是 | IO 板类型列表 | | portNum | array | 是 | 端口配置 | | simuNum | int | 是 | 虚拟 IO 数量 | | serialAnalog | object | 是 | 串口模拟量配置 | **响应示例**: ```json { "num": 3, "type": ["IO板R1", "盟通", "虚拟IO"], "portNum": [[16, 16, 2, 2], [20, 16, 4, 2], [16, 16, 0, 0]], "simuNum": 1, "serialAnalog": { "type": "SUPER_ANAIO", "port": 1, "baudRate": 115200 } } ``` --- ## 8. 远程状态提示 ### 8.1 远程状态提示设置 **命令码**: `0x2F24 IO_REMOTEOUTPUT_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | outPut | array | 是 | 输出配置数组 | | robot | int | 是 | 机器人号 | **outPut 数组元素参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | outagerecover | int | 断电保持数据恢复 DOUT1-2端口绑定 | | outagerecover_value | int | DOUT1-2端口值:0、1、2(2代表闪烁) | | program1~program10 | int | 远程 IO 程序 DOUT 端口绑定 | | program_value1~program_value10 | int | 远程 IO 程序 DOUT 输出端口值:0、1、2(2代表闪烁) | **请求示例**: ```json { "outPut": [{ "outagerecover": 2, "outagerecover_value": 0, "program1": 1, "program2": 2, "program3": 3, "program4": 0, "program5": 0, "program6": 0, "program7": 0, "program8": 63, "program9": 64, "program10": 0, "program_value1": 1, "program_value2": 1, "program_value3": 1, "program_value4": 0, "program_value5": 0, "program_value6": 0, "program_value7": 0, "program_value8": 0, "program_value9": 2, "program_value10": 0 }], "robot": 1 } ``` --- ### 8.2 远程状态提示查询 **命令码**: `0x2F25 IO_REMOTEOUTPUT_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **请求示例**: ```json { "robot": 1 } ``` --- ### 8.3 远程状态提示响应 **命令码**: `0x2F26 IO_REMOTEOUTPUT_RESPOND` **说明**: 内容同 0x2F24 --- ## 9. 安全监测设置 ### 9.1 安全监测设置(示教盒发送) **命令码**: `0x2F31 IO_SAFE_CHECK_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | | safeScreen | object | 是 | 安全光幕配置 | | quickStop | object | 是 | 快速停止配置 | **safeScreen 对象参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | enable | bool | 使能安全光幕 | | port1 | int | 安全光幕1 DIN 序号(1~16) | | value1 | int | IO 电平参数:0-低电平,1-高电平 | | port2 | int | 安全光幕2 DIN 序号(1~16) | | value2 | int | IO 电平参数:0-低电平,1-高电平 | **quickStop 对象参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | enable | bool | 使能 | | port1 | int | 紧急停止1 DIN 序号(1~16) | | value1 | int | IO 电平参数:0-低电平,1-高电平 | | port2 | int | 紧急停止2 DIN 序号(1~16) | | value2 | int | IO 电平参数:0-低电平,1-高电平 | | time | int | 快速停止时间(50~200ms) | | shieldFlag1 | bool | 屏蔽紧急停止1 | | shieldFlag2 | bool | 屏蔽紧急停止2 | | shieldTime | int | 屏蔽时间(秒,10位整数) | **请求示例**: ```json { "robot": 1, "safeScreen": { "enable": false, "port1": 0, "value1": 1, "port2": 0, "value2": 1 }, "quickStop": { "enable": false, "port1": 15, "value1": 1, "port2": 15, "value2": 1, "time": 60, "shieldFlag1": false, "shieldFlag2": false, "shieldTime": 30 } } ``` --- ### 9.2 安全监测查询(示教盒发送) **命令码**: `0x2F32 IO_SAFE_CHECK_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人号 | **请求示例**: ```json { "robot": 1 } ``` --- ### 9.3 安全监测响应(控制器返回) **命令码**: `0x2F33 IO_SAFE_CHECK_RESPOND` **说明**: 同 0x2F31 --- ## 10. IO 触发消息设置 ### 10.1 IO 触发消息设置(DIN) **命令码**: `0x2F41 DIN_TRIGGER_MSG_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | enable | array | 是 | 每有一块 IO 板增加16个数据:1-使能端口报警,2-不使能 | | value | array | 是 | 每有一块 IO 板增加16个数据:端口电平状态,1-高电平,0-低电平 | | msg | array | 是 | 每有一块 IO 板增加16个数据:消息内容 | **请求示例**: ```json { "enable": [1, 1, 0, 0, 0, 0, 1, 1], "value": [0, 1, 1, 0, 0, 1, 1], "msg": ["", "qwer", "", "asd", ""] } ``` --- ### 10.2 IO 触发消息查询 **命令码**: `0x2F42 DIN_TRIGGER_MSG_INQUIRE` **说明**: data: 无 --- ### 10.3 IO 触发消息响应 **命令码**: `0x2F43 DIN_TRIGGER_MSG_RESPOND` **说明**: 同 0x2F41 --- ### 10.4 IO 数字输出 DOUT 设置 **命令码**: `0x2F44 DOUT_TRIGGER_MSG_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | enable | array | 是 | 每有一块 IO 板增加16个数据:1-使能端口报警,2-不使能 | | value | array | 是 | 每有一块 IO 板增加16个数据:端口电平状态,1-高电平,0-低电平 | | msg | array | 是 | 每有一块 IO 板增加16个数据:消息内容 | **请求示例**: ```json { "enable": [1, 1, 0, 0, 0, 0, 1, 1], "value": [0, 1, 1, 0, 0, 1, 1], "msg": ["", "qwer", "", "asd", ""] } ``` --- ### 10.5 IO 数字输出查询 **命令码**: `0x2F45 DOUT_TRIGGER_MSG_INQUIRE` **说明**: data: 无 --- ### 10.6 IO 数字输出响应 **命令码**: `0x2F46 DOUT_TRIGGER_MSG_RESPOND` **说明**: 同 0x2F44 --- ## 11. 配置文件修改查询操作 ### 11.1 修改 DIN 注释配置文件 **命令码**: `0x2F47 DIN_ANNOTATION_NAME_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | name | array | 是 | 每有一块 IO 板增加16个数据 | **请求示例**: ```json { "name": ["", "qwer", "", "asd", ""] } ``` --- ### 11.2 查询 DIN 配置文件 **命令码**: `0x2F48 DIN_ANNOTATION_NAME_INQUIRE` --- ### 11.3 返回 DIN 配置文件 **命令码**: `0x2F49 DIN_ANNOTATION_NAME_RESPOND` --- ### 11.4 设置 DOUT **命令码**: `0x2F4A DOUT_ANNOTATION_NAME_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | name | array | 是 | 每有一块 IO 板增加16个数据 | **请求示例**: ```json { "name": ["", "dsad", "wa"] } ``` --- ### 11.5 示教器 DOUT 查询 **命令码**: `0x2F4B DOUT_ANNOTATION_NAME_INQUIRE` --- ### 11.6 控制器返回 DOUT 数据 **命令码**: `0x2F4C DOUT_ANNOTATION_NAME_RESPOND` --- ### 11.7 设置 AIN 端口注释名称 **命令码**: `0x2F4D AIN_ANNOTATION_NAME_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | name | array | 是 | 每有一块 IO 板增加16个数据 | **请求示例**: ```json { "name": ["", "asd", "ayt", ""] } ``` --- ### 11.8 示教器查询 AIN 参数 **命令码**: `0x2F4E AIN_ANNOTATION_NAME_INQUIRE` **说明**: data: 无 --- ### 11.9 示教器返回查询结果 **命令码**: `0x2F4F AIN_ANNOTATION_NAME_RESPOND` --- ### 11.10 设置 AOUT 端口注释名称 **命令码**: `0x2F50 AOUT_ANNOTATION_NAME_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | name | array | 是 | 每有一块 IO 板增加16个数据 | **请求示例**: ```json { "name": ["", "das", "dsf", "ty"] } ``` --- ### 11.11 示教器查询 AOUT 参数配置文件 **命令码**: `0x2F51 AOUT_ANNOTATION_NAME_INQUIRE` --- ### 11.12 示教器返回查询结果 **命令码**: `0x2F52 AOUT_ANNOTATION_NAME_RESPOND` --- # 数字输入输出 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/02.%E7%8A%B6%E6%80%81%E6%8E%A7%E5%88%B6/04.%E6%95%B0%E5%AD%97%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA.html ## 1. GPIO_DOUT_SET - 设置数字输出 **命令码**: `0x3601` 示教器设置 DOUT 时发送此命令。 ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | port | int | 是 | 端口号,从 1 开始 | | status | int | 是 | 端口状态:0=低电平,1=高电平 | ### 请求示例 ```json { "port": 1, "status": 1 } ``` --- ## 2. GPIO_DOUT_INQUIRE - 查询数字输出状态 **命令码**: `0x3602` 示教器查询 DOUT 状态时发送此命令。 ### 请求参数 无 --- ## 3. GPIO_DOUT_RESPOND - 查询数字输出状态响应 **命令码**: `0x3603` 控制器收到查询请求后返回此命令。 ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | status | array | 是 | 每个输出端口的状态数组 | **status 数组元素说明**: | 值 | 说明 | |----|------| | 0 | 低电平 | | 1 | 高电平 | | -1 | 无此端口 | ### 响应示例 ```json { "status": [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1] } ``` --- ## 4. GPIO_DIN_INQUIRE - 查询数字输入状态 **命令码**: `0x3605` 示教器查询 DIN 状态时发送此命令。 ### 请求参数 无 --- ## 5. GPIO_DIN_RESPOND - 查询数字输入状态响应 **命令码**: `0x3606` 控制器收到查询请求后返回此命令。 ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | status | array | 是 | 每个输入端口的状态数组 | **status 数组元素说明**: | 值 | 说明 | |----|------| | 0 | 低电平 | | 1 | 高电平 | | -1 | 无此端口 | ### 响应示例 ```json { "status": [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1] } ``` --- ## 6. ANALOG_OUT_SET - 设置模拟输出 **命令码**: `0x3607` 示教器设置 AOUT 时发送此命令。 ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | port | int | 是 | 端口号,从 1 开始 | | value | float | 是 | 端口电压值(如 1.33 表示 1.33V) | ### 请求示例 ```json { "port": 1, "value": 1.33 } ``` --- ## 7. ANALOG_OUT_INQUIRE - 查询模拟输出状态 **命令码**: `0x3608` 示教器查询 AOUT 状态时发送此命令。 ### 请求参数 无 --- ## 8. ANALOG_OUT_RESPOND - 查询模拟输出状态响应 **命令码**: `0x3609` 控制器收到查询请求后返回此命令。 ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | value | array | 是 | 每个模拟输出端口的值数组 | **value 数组元素说明**: | 值 | 说明 | |----|------| | 0 | 低电平 | | 1 | 高电平 | | -1 | 无此端口 | ### 响应示例 ```json { "value": [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1] } ``` --- ## 9. ANALOG_IN_INQUIRE - 查询模拟输入状态 **命令码**: `0x360A` 示教器查询 AIN 状态时发送此命令。 ### 请求参数 无 --- ## 10. ANALOG_IN_RESPOND - 查询模拟输入状态响应 **命令码**: `0x360B` 控制器收到查询请求后返回此命令。 ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | value | array | 是 | 每个模拟输入端口的值数组 | **value 数组元素说明**: | 值 | 说明 | |----|------| | 0 | 低电平 | | 1 | 高电平 | | -1 | 无此端口 | ### 响应示例 ```json { "value": [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1] } ``` --- ## 11. FORCE_DIN_SET - 设置强制数字输入 **命令码**: `0x360C` 示教器设置强制数字输入时发送此命令。 ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | port | int | 是 | 端口号 | | enable | bool | 是 | 是否开启强制输入 | | status | int | 是 | 设置端口的高低电平:0=低电平,1=高电平 | ### 请求示例 ```json { "port": 1, "enable": true, "status": 0 } ``` --- ## 12. FORCE_DIN_INQUIRE - 查询强制数字输入状态 **命令码**: `0x360D` 示教器查询强制输入状态时发送此命令。 ### 请求参数 无 --- ## 13. FORCE_DIN_RESPOND - 查询强制数字输入状态响应 **命令码**: `0x360E` 控制器收到查询请求后返回此命令。 ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | port | int | 是 | 端口号 | | enable | bool | 是 | 是否开启强制输入 | | status | int | 是 | 设置端口的高低电平:0=低电平,1=高电平 | ### 响应示例 ```json { "port": 1, "enable": true, "status": 0 } ``` --- ## 14. FORCE_ANALOG_IN_SET - 设置强制模拟输入 **命令码**: `0x3611` 示教器设置强制模拟输入时发送此命令。 ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | port | int | 是 | 端口号 | | enable | bool | 是 | 是否开启强制输入 | | status | int | 是 | 设置端口的模拟值 | ### 请求示例 ```json { "port": 1, "enable": true, "status": 0 } ``` --- ## 15. FORCE_ANALOG_IN_INQUIRE - 查询强制模拟输入状态 **命令码**: `0x3612` 示教器查询强制模拟输入状态时发送此命令。 ### 请求参数 无 --- ## 16. FORCE_ANALOG_IN_RESPOND - 查询强制模拟输入状态响应 **命令码**: `0x3613` 控制器收到查询请求后返回此命令。 ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | port | int | 是 | 端口号 | | enable | bool | 是 | 是否开启强制输入 | | status | int | 是 | 设置端口的模拟值 | ### 响应示例 ```json { "port": 1, "enable": true, "status": 0 } ``` --- # 伺服状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/02.%E7%8A%B6%E6%80%81%E6%8E%A7%E5%88%B6/05.%E4%BC%BA%E6%9C%8D%E7%8A%B6%E6%80%81.html ## 1. 伺服连接状态 ### 1.1 查询伺服连接状态 | 项目 | 值 | |------|-----| | 命令字 | 0x5042 SERVO_CONNECT_INQUIRE | ```json {} ``` ### 1.2 收到查询连接状态时,返回 | 项目 | 值 | |------|-----| | 命令字 | 0x5043 SERVO_CONNECT_RESPOND | | servoType | 0 | ```json { "servoType": 0 } ``` ## 2. 伺服状态设置及获取 ### 2.1 上位机改变伺服的状态 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | status | int | 伺服状态 | 0: 真实伺服, 1: 虚拟伺服, 2: 无伺服 | | 项目 | 值 | |------|-----| | 命令字 | 0x2001 SERVO_STATUS_SET | ```json { "robot": 1, "status": 0 } ``` ### 2.2 上位机查询伺服状态 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | 项目 | 值 | |------|-----| | 命令字 | 0x2002 SERVO_STATUS_INQUIRE | ```json { "robot": 1 } ``` ### 2.3 控制器回复伺服状态 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | mode | int | 运行模式 | 0: 单机模式, 1: 多机模式 | | status | int | 伺服状态 | 0: 停止, 1: 就绪, 2: 错误, 3: 运行 | | 项目 | 值 | |------|-----| | 命令字 | 0x2003 SERVO_STATUS_RESPOND | ```json { "mode": 0, "robot": 1, "status": 0 } ``` ## 3. 操作模式状态设置及获取 操作模式说明: | 模式值 | 名称 | 说明 | |--------|------|------| | 0 | 示教模式 (Teach) | - | | 1 | 远程模式 (Circle) | - | | 2 | 运行模式 (Repeat) | - | ### 3.1 上位机设置当前控制器操作模式 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | mode | int | 操作模式 | 0: 示教模式, 1: 远程模式, 2: 运行模式 | | 项目 | 值 | |------|-----| | 命令字 | 0x2101 OPERATION_MODE_SET | ```json { "mode": 0 } ``` ### 3.2 上位机查询操作模式 | 项目 | 值 | |------|-----| | 命令字 | 0x2102 OPERATION_MODE_INQUIRE | ```json {} ``` ### 3.3 控制器回复操作模式 | 参数 | 类型 | 说明 | |------|------|------| | mode | int | 操作模式 | | 项目 | 值 | |------|-----| | 命令字 | 0x2103 OPERATION_MODE_RESPOND | ```json { "mode": 0 } ``` ### 3.4 上位机改变示教的操作模式 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | teachType | int | 示教类型 | 0: 点动(单动), 1: 拖拽示教, 2: 点动(联动) | | 项目 | 值 | |------|-----| | 命令字 | 0x2104 TEACHTYPE_SET | ```json { "teachType": 0 } ``` ### 3.5 上位机查询示教类型 | 项目 | 值 | |------|-----| | 命令字 | 0x2105 TEACHTYPE_INQUIRE | ```json {} ``` ### 3.6 控制器回复示教类型 | 参数 | 类型 | 说明 | |------|------|------| | teachType | int | 示教类型 | | 项目 | 值 | |------|-----| | 命令字 | 0x2106 TEACHTYPE_RESPOND | ```json { "teachType": 0 } ``` ## 4. 坐标模式状态设置及获取 坐标模式说明: | 模式值 | 名称 | 说明 | |--------|------|------| | 0 | 关节坐标 (Joint) | - | | 1 | 直角坐标 (Cart) | - | | 2 | 工具坐标 (Tool) | - | | 3 | 用户坐标 (User) | - | ### 4.1 上位机改变当前坐标模式 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | coord | int | 坐标模式 | 0: 关节坐标, 1: 直角坐标, 2: 工具坐标, 3: 用户坐标 | | 项目 | 值 | |------|-----| | 命令字 | 0x2201 COORD_MODE_SET | ```json { "robot": 1, "coord": 0 } ``` ### 4.2 上位机查询坐标模式 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | 项目 | 值 | |------|-----| | 命令字 | 0x2202 COORD_MODE_INQUIRE | ```json { "robot": 1 } ``` ### 4.3 控制器回复坐标模式 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | coord | int | 坐标模式 | 0: 关节坐标, 1: 直角坐标, 2: 工具坐标, 3: 用户坐标 | | 项目 | 值 | |------|-----| | 命令字 | 0x2203 COORD_MODE_RESPOND | ```json { "robot": 1, "coord": 0 } ``` ## 5. 伺服上下电状态设置及获取 ### 5.1 示教器改变当前上下电状态 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | deadman | int | 上下电状态 | 0: DEADMAN 下电, 1: DEADMAN 上电 | | 项目 | 值 | |------|-----| | 命令字 | 0x2301 DEADMAN_STATUS_SET | ```json { "deadman": 0 } ``` ### 5.2 示教器查询上下电状态 | 项目 | 值 | |------|-----| | 命令字 | 0x2302 DEADMAN_STATUS_INQUIRE | ```json {} ``` ### 5.3 控制器回复上下电状态 | 参数 | 类型 | 说明 | |------|------|------| | deadman | int | 上下电状态 | | 项目 | 值 | |------|-----| | 命令字 | 0x2303 DEADMAN_STATUS_RESPOND | ```json { "deadman": 0 } ``` ### 5.4 上位机设置上下电模式 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | deadmanMode | int | 触发模式 | 0: 软件触发, 1: 硬件触发 | | deadmanPortOne | int | 上使能端口 IO 端口号 | 每个端口最多可分配16个 IO 序号 | | deadmanPortTwo | int | 下使能端口 IO 端口号 | - | | 项目 | 值 | |------|-----| | 命令字 | 0x2304 DEADMAN_MODE_SET | ```json { "deadmanMode": 1, "deadmanPortOne": 9, "deadmanPortTwo": 0 } ``` ### 5.5 上位机查询上下电模式 | 项目 | 值 | |------|-----| | 命令字 | 0x2305 DEADMAN_MODE_INQUIRE | ```json {} ``` ### 5.6 控制器回复上下电模式 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | deadmanMode | int | 触发模式 | 0: 软件触发, 1: 硬件触发 | | deadmanPortOne | int | 上使能端口 IO 端口号 | 每个端口最多可分配16个 IO 序号 | | deadmanPortTwo | int | 下使能端口 IO 端口号 | - | | 项目 | 值 | |------|-----| | 命令字 | 0x2306 DEADMAN_MODE_RESPOND | ```json { "deadmanMode": 1, "deadmanPortOne": 9, "deadmanPortTwo": 0 } ``` ### 5.7 伺服上使能(示教盒无该指令) | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | 项目 | 值 | |------|-----| | 命令字 | 0x2311 MAN_BEG_OPERATION | ```json { "robot": 1 } ``` ### 5.8 机器人紧急停止 > 注:原2314为伺服下电,程序中不存在 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | 项目 | 值 | |------|-----| | 命令字 | 0x2314 MAN_END_OPERATION | ```json { "robot": 1 } ``` ## 6. 清除伺服错误 ### 6.1 示教器清除伺服错误 | 参数 | 类型 | 说明 | 取值范围 | |------|------|------|----------| | robot | int | 选择机器人 | [1, 4] | | 项目 | 值 | |------|-----| | 命令字 | 0x3201 FAULT_RESET | ```json { "robot": 1 } ``` ### 6.2 清除伺服错误后,返回清除结果 | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人 | | clearErrflag | bool | true: 清除伺服错误成功, false: 清除失败 | | 项目 | 值 | |------|-----| | 命令字 | 0x3202 FAULT_RESET_RESULT | ```json { "robot": 1, "clearErrflag": true } ``` --- # 码垛工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/01.%E7%A0%81%E5%9E%9B%E5%B7%A5%E8%89%BA.html ## 完整码垛 ### 设置抓手参数 **0x4201 PAL_GRIPPER_PARM_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | gripperNum | int | 否 | 抓手个数,范围1~4 | | gripper | array | 否 | 抓手工具号数组,范围1~9 | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 2, "gripper": [1, 3, 4, 0] } } ``` ### 查询抓手参数 **0x4202 PAL_GRIPPER_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回抓手参数 **0x4203 PAL_GRIPPER_PARM_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craftID | int | 工艺号 | | gripperNum | int | 抓手个数,范围1~4 | | gripper | array | 抓手工具号数组,范围1~9 | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 2, "gripper": [1, 3, 4, 0] } } ``` ### 设置托盘参数 **0x4204 PAL_PALLET_PARM_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | userNum | int | 是 | 用户编号 | ```json { "robot": 1, "craftID": 1, "pallet": { "userNum": 1 } } ``` ### 查询托盘参数 **0x4205 PAL_PALLET_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回托盘参数 **0x4206 PAL_PALLET_PARM_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craftID | int | 工艺号 | | userNum | int | 用户编号 | ```json { "robot": 1, "craftID": 1, "pallet": { "userNum": 1 } } ``` ### 设置位置参数 **0x4207 PAL_POS_PARM_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | enterPos | array | 是 | 入口点,6个 double 值 | | floorNum | int | 否 | 标记层标号 | | shiftPos | array | 否 | 辅助点,6个 double 值 | | realPos | array | 否 | 工件点,6个 double 值 | ```json { "robot": 1, "craftID": 1, "pallet": { "enterPos": [0, 1.1, 222, 3.14159, 0, 0.008], "floorNum": 1, "shiftPos": [0, 1.1, 222, 3.14159, 0, 0.008], "realPos": [0, 1.1, 222, 3.14159, 0, 0.008] } } ``` ### 查询位置参数 **0x4208 PAL_POS_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回位置参数 **0x4209 PAL_POS_PARM_RESPOND** 返回数据同0x4207。 ### 设置工件参数 **0x420A PAL_WORKPIECE_PARM_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | workpieceLength | double | 否 | 工件长度 | | workpieceWidth | double | 否 | 工件宽度 | | workpieceHeight | double | 否 | 工件高度 | | workpieceGapX | double | 否 | X 方向间隙 | | workpieceGapY | double | 否 | Y 方向间隙 | ```json { "robot": 1, "craftID": 2, "pallet": { "workpieceLength": 1, "workpieceWidth": 2, "workpieceHeight": 3, "workpieceGapX": 4, "workpieceGapY": 5 } } ``` ### 查询工件参数 **0x420B PAL_WORKPIECE_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回工件参数 **0x420C PAL_WORKPIECE_PARM_RESPOND** 返回数据同0x420A。 ### 设置接近参数(2207示教无此功能) **0x420D PAL_APPRO_PARM_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | workpieceApproEnable | bool | 否 | 是否启用接近 | | workpieceApproMode | int | 否 | 接近模式:0-下降接近,1-接近下降 | | workpieceApproLenX | double | 否 | X 方向接近长度 | | workpieceApproLenY | double | 否 | Y 方向接近长度 | | workpieceApproLenZ | double | 否 | Z 方向接近长度 | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceApproEnable": false, "workpieceApproMode": 0, "workpieceApproLenX": 0, "workpieceApproLenY": 0, "workpieceApproLenZ": 0 } } ``` ### 查询接近参数 **0x420E PAL_APPRO_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回接近参数 **0x420F PAL_APPRO_PARM_RESPOND** 返回数据同0x420D。 ### 设置重叠模式参数 **0x4210 PAL_OVERLAP_PARM_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | floorSum | int | 否 | 层数 | | overlapType | int | 否 | 重叠类型:0-相同,1-交替,2-自定义 | | layHeightOffset | double | 否 | 放货点高度补偿 | | fixedLayHeight | bool | 否 | 固定放货点高度 | | fixedSupHeight | bool | 否 | 固定辅助点高度 | | columnLay | bool | 否 | 竖直方向排列 | | floorAutoJustified | bool | 否 | 层自动对齐 | | poseAutorotation | bool | 否 | 姿态自动旋转 | | fixedEnterPoint | bool | 否 | 固定入口点位置 | | graphicNum | array | 否 | 图形编号 | | heightRevise | array | 否 | 高度修正 | ```json { "robot": 1, "craftID": 1, "pallet": { "floorSum": 1, "overlapType": 0, "layHeightOffset": 0.0, "fixedLayHeight": false, "fixedSupHeight": false, "columnLay": false, "floorAutoJustified": false, "poseAutorotation": false, "fixedEnterPoint": false, "graphicNum": [1, 2, 1, 2], "heightRevise": [1.1, -2.2] } } ``` ### 查询重叠模式参数 **0x4211 PAL_OVERLAP_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回重叠模式参数 **0x4212 PAL_OVERLAP_PARM_RESPOND** 返回数据同0x4210。 ### 设置平面模式参数 **0x4213 PAL_PLANE_PARM_SET** #### 行列模式 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | graphic | int | 是 | 图像编号 | | graphicType | int | 是 | 图形类型:0-行列,1-纵横交错,2-回字型,3-五花垛,4-自定义 | | autoCalculate | bool | 否 | 自动计算 | | numX | double | 否 | X 方向个数 | | numY | double | 否 | Y 方向个数 | | rotationAngleSingle | double | 否 | 工件旋转角度 | | rotationAngleWhole | double | 否 | 整体旋转角度 | | transLenX | double | 否 | X 平移补偿 | | transLenY | double | 否 | Y 平移补偿 | ```json { "craftID": 2, "graphic": 1, "pallet": { "graphicType": 0, "ranks": { "autoCalculate": true, "numX": 1.0, "numY": 1.0, "rotationAngleSingle": 180.0, "rotationAngleWhole": 90.0 }, "transLenX": 2.0, "transLenY": 3.0 }, "robot": 1 } ``` #### 纵横交错模式 ```json { "craftID": 2, "graphic": 1, "pallet": { "graphicType": 1, "intertwining": { "numX": 3.0, "numY": 3.0, "rotationAngleSingle": -90.0, "rotationAngleWhole": 90.0 }, "transLenX": 0.0, "transLenY": 0.0 }, "robot": 1 } ``` #### 回字型模式 ```json { "craftID": 2, "graphic": 1, "pallet": { "gearType": { "rotationAngleSingle": -90.0, "rotationAngleWhole": 180.0 }, "graphicType": 2, "transLenX": 0.0, "transLenY": 0.0 }, "robot": 1 } ``` #### 五花垛模式 ```json { "craftID": 2, "graphic": 1, "pallet": { "graphicType": 3, "transLenX": 0.0, "transLenY": 0.0, "wideType": { "A_C_columns": 5.0, "A_rows": 1.0, "B_columns": 3.0, "B_rows": 2.0, "C_rows": 4.0, "rotationAngleSingle": 180.0, "rotationAngleWhole": 90.0 } }, "robot": 1 } ``` #### 自定义模式 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | graphic | int | 是 | 图像编号 | | graphicType | int | 是 | 图形类型(4-自定义) | | transLenX | double | 否 | X 平移补偿 | | transLenY | double | 否 | Y 平移补偿 | | count | int | 是 | 层工件数 | | sum | int | 是 | 层工件总数 | | start | int | 是 | 起始编号 | | eachVec | array | 是 | 每层数据 | ```json { "craftID": 1, "graphic": 1, "pallet": { "custom": { "count": 2, "eachVec": [ { "X": 1.0, "Y": 2.0, "dir": 0, "h": 4.0, "t": 3.0 }, { "X": 5.0, "Y": 6.0, "dir": 0, "h": 8.0, "t": 7.0 } ], "start": 1, "sum": 2 }, "graphicType": 4, "transLenX": 11.0, "transLenY": 22.0 }, "robot": 1 } ``` ### 查询平面模式参数 **0x4214 PAL_PLANE_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | graphic | int | 是 | 图像编号 | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 返回平面模式参数 **0x4215 PAL_PLANE_PARM_RESPOND** 返回数据同0x4213。 ### 请求转换为平面模式自定义模板 **0x4216 PAL_PLANE_CUSTOM_TRANS_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | graphic | int | 是 | 图像编号 | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 返回转换为平面模式自定义模板后对应参数 **0x4217 PAL_PLANE_CUSTOM_TRANS_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craftID | int | 工艺号 | | graphic | int | 图像编号 | | graphicType | int | 图形类型(此处只能取3) | | transLenX | double | X 平移补偿 | | transLenY | double | Y 平移补偿 | | autoTransLenX | double | X 自动平移距离 | | autoTransLenY | double | Y 自动平移距离 | | sum | int | 工件总数 | | start | int | 起始编号 | | count | int | 当前层工件数 | | eachVec | array | 工件位置数组 | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "graphicType": 3, "transLenX": 2.2, "transLenY": -3.3, "autoTransLenX": 4.4, "autoTransLenY": 5.5, "custom": { "sum": 20, "start": 1, "count": 10, "eachVec": [ {"X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0}, {"X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0}, {"X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0} ] } } } ``` ### 请求平面模式预览 **0x4218 PAL_PLANE_PREVIEW_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | graphic | int | 是 | 图像编号 | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 返回平面模式预览参数 **0x4219 PAL_PLANE_PREVIEW_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craftID | int | 工艺号 | | graphic | int | 图像编号 | | workpieceLength | double | 工件长度 | | workpieceWidth | double | 工件宽度 | | sum | int | 工件总数 | | start | int | 起始编号 | | count | int | 当前层工件数 | | eachVec | array | 工件位置数组 | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "workpieceLength": 1, "workpieceWidth": 1, "sum": 20, "start": 1, "count": 10, "eachVec": [ {"X": 0, "Y": 0, "t": 0}, {"X": 0, "Y": 0, "t": 0}, {"X": 0, "Y": 0, "t": 0} ] } } ``` ### 查询完整码垛平面模式自动计算结果 **0x422A PAL_AUTO_CALCULATE_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回自动计算结果 **0x422B PAL_AUTO_CALCULATE_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | numX | double | X 方向个数 | | numY | double | Y 方向个数 | ```json { "pallet": { "ranks": { "numX": 0, "numY": 0 } } } ``` ### 设置码垛状态 **0x421A PAL_STATE_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | curLayerNum | int | 否 | 当前层数 | | curLayerPalletedWpNum | int | 否 | 当前层已码工件数 | ```json { "robot": 1, "craftID": 1, "pallet": { "curLayerNum": 1, "curLayerPalletedWpNum": 5 } } ``` ### 查询码垛状态 **0x421B PAL_STATE_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回码垛状态 **0x421C PAL_STATE_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craftID | int | 工艺号 | | totalWpNum | int | 总工件数 | | totalLayerNum | int | 总层数 | | curPalletedWpSum | int | 当前已码总工件数 | | curLayerNum | int | 当前层数 | | curLayerPalletedWpNum | int | 当前层已码工件数 | | curLayerWpSum | int | 当前层总工件数 | ```json { "robot": 1, "craftID": 1, "pallet": { "totalWpNum": 20, "totalLayerNum": 2, "curPalletedWpSum": 5, "curLayerNum": 1, "curLayerPalletedWpNum": 5, "curLayerWpSum": 10 } } ``` ### 复制码垛参数 **0x421D PAL_PARM_COPY** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID_source | int | 是 | 源工艺号 | | craftID_target | int | 是 | 目标工艺号 | ```json { "robot": 1, "craftID_source": 1, "craftID_target": 2 } ``` ### 清空码垛参数 **0x421E PAL_PARM_CLEAR** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 复制层图形参数 **0x421F PAL_GRAPHIC_COPY** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID_source | int | 是 | 源工艺号 | | craftID_target | int | 是 | 目标工艺号 | | graphic_source | int | 是 | 源图形编号 | | graphic_target | int | 是 | 目标图形编号 | ```json { "craftID_source": 1, "craftID_target": 1, "graphic_source": 1, "graphic_target": 2, "robot": 1 } ``` ### 切换使用码垛类型 **0x4221 PAL_SIMPLE_SWTICH** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | usePalletType | int | 是 | 码垛类型:0-简易,1-完整,2-未定义 | ```json { "robot": 1, "craftID": 1, "usePalletType": 0 } ``` ### 查询当前使用码垛类型 **0x4222 PAL_IS_SIMPLE_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回码垛类型 **0x4223 PAL_IS_SIMPLE_RESPOND** 返回数据同0x4221。 ## 简易码垛 ### 设置简易码垛位置 **0x4224 PAL_SIMPLE_POS_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | O | array | 是 | 工件起始点,6个 double 值 | | X | array | 是 | 列点,6个 double 值 | | Y | array | 是 | 行点,6个 double 值 | | Z | array | 是 | 高度点,6个 double 值 | | acrossCorner | array | 否 | 对角点,6个 double 值 | | enter | array | 是 | 入口点,6个 double 值 | | numX | int | 是 | 行数 | | numY | int | 是 | 列数 | | numZ | int | 是 | 层数 | | shift | array | 否 | 辅助点,6个 double 值 | | useAcrossCorner | bool | 否 | 使用对角末端 | ```json { "O": [456.905, -53.268, 637.0, 3.142, 0.0, 0.116], "X": [456.905, -53.268, 637.0, 3.142, 0.0, 0.116], "Y": [456.905, -53.268, 637.0, 3.142, 0.0, 0.116], "Z": [456.905, -53.268, 637.0, 3.142, 0.0, 0.116], "acrossCorner": [456.905, -53.268, 637.0, 3.142, 0.0, 0.116], "craftID": 6, "enter": [456.905, -53.268, 637.0, 3.142, 0.0, 0.116], "numX": 2, "numY": 1, "numZ": 3, "robot": 1, "shift": [456.905, -53.268, 637.0, 3.142, 0.0, 0.116], "useAcrossCorner": true } ``` ### 查询简易码垛位置设置 **0x4225 PAL_SIMPLE_POS_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回简易码垛位置 **0x4226 PAL_SIMPLE_POS_RESPOND** 返回数据同0x4224。 ### 设置简易码垛抓手参数 **0x4227 PAL_SIMPLE_GRIPPER_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | gripperNum | int | 否 | 抓手个数,范围1~4 | | gripper | array | 否 | 抓手工具号数组,范围1~9 | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 2, "gripper": [1, 3, 4, 0] } } ``` ### 查询简易码垛抓手参数 **0x4228 PAL_SIMPLE_GRIPPER_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 返回简易码垛抓手参数 **0x4229 PAL_SIMPLE_GRIPPER_RESPOND** 返回数据同0x4227。 ### 码垛复位 **0x422C PAR_PARM_RESET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | ```json { "robot": 1, "craftID": 1 } ``` ### 码垛自定义模式拖拽和旋转预览 **0x4232 PAL_PLANE_CUSTOM_ROTATE_PREVIEW_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftID | int | 是 | 工艺号 | | graphic | int | 是 | 图形编号 | | count | int | 是 | 工件数 | | start | int | 是 | 起始编号 | | sum | int | 是 | 总数 | | eachVec | array | 是 | 位置数组 | | rotationAngleWhole | double | 否 | 整体旋转角度 | | transLenX | double | 否 | X 平移补偿 | | transLenY | double | 否 | Y 平移补偿 | ```json { "craftID": 1, "graphic": 1, "pallet": { "count": 2, "eachVec": [ {"X": 0.0, "Y": 0.0, "t": 0.0}, {"X": 0.0, "Y": 0.0, "t": 0.0} ], "start": 1, "sum": 2 }, "robot": 1, "rotationAngleWhole": 0, "transLenX": 0.0, "transLenY": 0.0 } ``` ### 返回拖拽旋转预览结果 **0x4233 PAL_PLANE_CUSTOM_ROTATE_PREVIEW_RESPOND** ```json { "craftID": 1, "graphic": 1, "pallet": { "count": 2, "eachVec": [ {"X": 0.0, "Y": 0.0, "t": 0.0}, {"X": 0.0, "Y": 0.0, "t": 0.0} ], "start": 1, "sum": 2 }, "robot": 1 } ``` ## 点位调试界面 ### 获取全部工件数据 **0x4242 PAL_POINTDEBUG_FLOORDATA_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craft | int | 是 | 工艺号 | | layer | int | 是 | 层号 | | clear | int | 否 | 1-清空缓存,0-不清 | ```json { "robot": 1, "craft": 1, "layer": 1, "clear": 0 } ``` ### 返回全部工件数据 **0x4243 PAL_POINTDEBUG_FLOORDATA_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craft | int | 工艺号 | | layer | int | 层号 | | sumLayer | int | 总层数 | | L | double | 工件长度 | | W | double | 工件宽度 | | over | int | 超限状态:0-无超限,1-入口点超限,2-辅助点超限,3-工件点超限 | | overLayer | int | 超限层号 | | overNum | int | 超限工件号 | | sum | int | 层工件总数 | | count | int | 当前层工件数 | | start | int | 起始编号 | | eachVec | array | 工件数组 | ```json { "robot": 1, "craft": 1, "layer": 1, "sumLayer": 10, "length": { "L": 10, "W": 10 }, "overLimit": { "over": 1, "layer": 1, "num": 2 }, "pallet": { "sum": 25, "count": 10, "start": 1, "eachVec": [ {"X": 0, "Y": 0, "Z": 0, "t": 0, "over": 0}, {"X": 0, "Y": 0, "Z": 0, "t": 0, "over": 0} ] } } ``` ### 整体偏移 **0x4244 PAL_POINTDEBUG_FLOORWHOLETRANS** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craft | int | 是 | 工艺号 | | layer | int | 是 | 层号 | | rotationAngle | double | 否 | 偏移角度 | | transLenX | double | 否 | X 偏移 | | transLenY | double | 否 | Y 偏移 | | transLenZ | double | 否 | Z 偏移 | ```json { "craft": 1, "layer": 1, "robot": 1, "rotationAngle": 95.0, "transLenX": 1.0, "transLenY": 2.0, "transLenZ": 24.0 } ``` ### 应用到相同层 **0x4245 PAL_POINTDEBUG_APPLYSAMEFLOOR** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craft | int | 是 | 工艺号 | | layer | int | 是 | 层号 | ```json { "craft": 1, "layer": 2, "robot": 1 } ``` ### 修改单个工件位置 **0x4247 PAL_POINTDEBUG_ONEPOS_SET** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craft | int | 是 | 工艺号 | | layer | int | 是 | 层号 | | num | int | 是 | 工件编号 | | mode | int | 是 | 模式:0-直接设置 xyz,1-使用机器人当前位置 | | X | double | 否 | 工件 X 坐标 | | Y | double | 否 | 工件 Y 坐标 | | Z | double | 否 | 工件 Z 坐标 | | angle | double | 否 | 工件角度 | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1, "mode": 0, "X": 0.1, "Y": 0.1, "Z": 0.1, "angle": 0 } ``` ### 获取单个工件位置 **0x4248 PAL_POINTDEBUG_ONEPOS_INQUIRE** 前置得先使用0x4242,才能调用0x4248。 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craft | int | 是 | 工艺号 | | layer | int | 是 | 层号 | | num | int | 是 | 工件编号 | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1 } ``` ### 返回单个工件位置 **0x4249 PAL_POINTDEBUG_ONEPOS_RESPOND** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craft | int | 工艺号 | | layer | int | 层号 | | num | int | 当前工件编号 | | X | double | 工件 X 坐标 | | Y | double | 工件 Y 坐标 | | Z | double | 工件 Z 坐标 | | t | double | 工件角度 | | over | int | 超限状态 | | overLimit | object | 超限详情 | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1, "X": 0.1, "Y": 0.1, "Z": 0.1, "t": 0, "over": 0, "overLimit": { "over": 1, "layer": 1, "num": 2 } } ``` ### 保存点位调试数据到文件 **0x424A PAL_POINTDEBUG_SAVEBUFFERDATA** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craft | int | 是 | 工艺号 | ```json { "robot": 1, "craft": 1 } ``` ### 运动到工件某位置 **0x424D PAL_POINTDEBUG_MOVETOPOS** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craft | int | 是 | 工艺号 | | layer | int | 是 | 层号 | | num | int | 是 | 工件编号 | | type | int | 是 | 点位类型:0-入口点,1-辅助点,2-工件点 | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1, "type": 0 } ``` --- # 打磨工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/02.%E6%89%93%E7%A3%A8%E5%B7%A5%E8%89%BA.html --- ## 1. 打磨工艺参数设置 **0x4601 POLISH_PARAM_SET** ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号 | | craftID | number | 是 | 工艺编号 | | polish | object | 是 | 打磨参数对象 | ### polish 对象参数 | 参数名 | 类型 | 必填 | 默认值 | 说明 | |--------|------|------|--------|------| | toolWear | number | 否 | 0.0 | 工具磨损补偿 | | startToolOffset | object | 否 | - | 起点工具补偿 | | endToolOffset | object | 否 | - | 终点工具补偿 | | autoFeed | object | 否 | - | 自动补偿 | ### startToolOffset / endToolOffset 对象参数 | 参数名 | 类型 | 必填 | 默认值 | 说明 | |--------|------|------|--------|------| | X | number | 否 | 0.0 | X 方向补偿 | | Y | number | 否 | 0.0 | Y 方向补偿 | | Z | number | 否 | 0.0 | Z 方向补偿 | ### autoFeed 对象参数 | 参数名 | 类型 | 必填 | 默认值 | 说明 | |--------|------|------|--------|------| | value | number | 否 | 0.0 | 自动补偿值 | | cycle | number | 否 | 0 | 自动补偿周期(次) | ### 请求示例 ```json { "robot": 1, "craftID": 1, "polish": { "toolWear": 0.0, "startToolOffset": { "X": 0.0, "Y": 0.0, "Z": 0.0 }, "endToolOffset": { "X": 0.0, "Y": 0.0, "Z": 0.0 }, "autoFeed": { "value": 0.0, "cycle": 0 } } } ``` --- ## 2. 查询打磨工艺参数 **0x4602 POLISH_PARAM_INQUIRE** ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | number | 是 | 机器人编号 | | craftID | number | 是 | 工艺编号(范围:1-9) | ### 请求示例 ```json { "robot": 1, "craftID": 1 } ``` --- ## 3. 返回打磨工艺参数 **0x4603 POLISH_PARAM_RESPOND** ### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | number | 机器人编号 | | craftID | number | 工艺编号 | | polish | object | 打磨参数对象(结构同0x4601) | ### polish 对象参数 | 参数名 | 类型 | 说明 | |--------|------|------| | toolWear | number | 工具磨损补偿 | | startToolOffset | object | 起点工具补偿(X, Y, Z) | | endToolOffset | object | 终点工具补偿(X, Y, Z) | | autoFeed | object | 自动补偿(value, cycle) | ### 响应示例 ```json { "robot": 1, "craftID": 1, "polish": { "toolWear": 0.0, "startToolOffset": { "X": 0.0, "Y": 0.0, "Z": 0.0 }, "endToolOffset": { "X": 0.0, "Y": 0.0, "Z": 0.0 }, "autoFeed": { "value": 0.0, "cycle": 0 } } } ``` --- # 电批工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/03.%E7%94%B5%E6%89%B9%E5%B7%A5%E8%89%BA.html ## 修改电批参数 **0x5731 SCREWDRIVER_PARM_SET** ### 父级参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | proNum | int | 是 | 程序号 | | torqueCorrection | int | 否 | 扭力补正值,范围:-10 ~ 10 | | tighten | object | 是 | 拧紧参数,详见下表 | | loosen | object | 是 | 拧松参数,详见下表 | ### tighten(拧紧)参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | rotationDir | int | 是 | 旋转方向:0=CW,1=CCW | | targetTorque | double | 是 | 目标扭力,单位 mN·m | | rounds | array[double] | 是 | 步骤 0-9 的圈数,范围:0-20.0 | | speed | array[double] | 是 | 步骤 0-9 的速度,范围:10-1500 | | tightenMode | int | 否 | 拧紧模式:0=标准,1=攻丝,2=高速 | | initDetectionAmountFlag | bool | 否 | 是否开启初始检出量 | | initDetectionAmount | double | 否 | 初始检出量 (mN·m),范围:0-10 | | initTapTorqueFlag | bool | 否 | 是否开启初始攻丝扭力 | | initTapTorque | double | 否 | 初始攻丝扭力 (mN·m),范围:10-700 | | torqueHoldTimeFlag | bool | 否 | 是否开启扭力保持时间 | | torqueHoldTime | double | 否 | 扭力保持时间 (sec) | | antiLimitFlag | bool | 否 | 是否开启 -侧许可圈数 | | antiLimit | double | 否 | -侧许可圈数,范围:-10-0 | | positiveLimitFlag | bool | 否 | 是否开启 +侧许可圈数 | | positiveLimit | double | 否 | +侧许可圈数,范围:0-10 | | addTightenAngleFlag | bool | 否 | 是否开启增加拧紧角度 (°) | | addTightenAngle | double | 否 | 增加拧紧角度,范围:-360-360 | | floatTightenAngleFlag | bool | 否 | 是否开启浮高后拧紧角度 (°) | | floatTightenAngle | double | 否 | 浮高后拧紧角度 (°),范围:0-360 | | velSwitchTorqueRatioFlag | bool | 否 | 是否开启速度切换扭力 | | velSwitchTorqueRatio | double | 否 | 速度切换扭力比值 (%) | | speedAfterSwitchFlag | bool | 否 | 是否开启切换后速度 | | speedAfterSwitch | double | 否 | 切换后速度 (rpm),范围:10-1000 | ### loosen(拧松)参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | rounds | array[double] | 是 | 步骤 0-1 圈数,范围:-20.0-20.0 | | speed | array[double] | 是 | 步骤 0-1 速度,范围:10-1000 | | rotationDir | int | 是 | 旋转方向:0=CW,1=CCW | ### 示例 ```json { "proNum": 1, "torqueCorrection": 0, "tighten": { "rotationDir": 0, "targetTorque": 1.1, "rounds": [1, 2, 3, 4, 5, 6, 7, 8, 9], "speed": [1, 2, 3, 4, 5, 6, 7, 8, 9], "tightenMode": 0, "initDetectionAmountFlag": true, "initDetectionAmount": 0, "initTapTorqueFlag": true, "initTapTorque": 0, "torqueHoldTimeFlag": true, "torqueHoldTime": 0, "antiLimitFlag": true, "antiLimit": -10, "positiveLimitFlag": true, "positiveLimit": 10, "addTightenAngleFlag": true, "addTightenAngle": 360, "floatTightenAngleFlag": true, "floatTightenAngle": 360, "velSwitchTorqueRatioFlag": true, "velSwitchTorqueRatio": 1, "speedAfterSwitchFlag": true, "speedAfterSwitch": 10 }, "loosen": { "rounds": [1.0, 2.0, 3.0], "speed": [1.0, 2.0, 3.0], "rotationDir": 0 } } ``` --- ## 示教器查询电批参数 **0x5732 SCREWDRIVER_PARM_INQUIRE** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | proNum | int | 是 | 程序号 | ### 示例 ```json { "proNum": 1 } ``` --- ## 发送电批参数 **0x5733 SCREWDRIVER_PARM_RESPOND** data 字段同 `0x5731` 协议。 --- ## 电批 IO 状态查询 **0x5735 SCREWDRIVER_IOSTATUS_INQUIRE** 无请求参数。 ### 示例 ```json {} ``` --- ## 发送 IO 状态 **0x5736 SCREWDRIVER_IOSTATUS_RESPOND** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | input | array[int] | 是 | 输入 IO 列表 | | output | array[int] | 是 | 输出 IO 列表 | ### 示例 ```json { "input": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "output": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } ``` --- ## 电批锁定结果查询 **0x5738 SCREWDRIVER_TWISTRES_INQUIRE** 无请求参数。 ### 示例 ```json {} ``` --- ## 发送锁定结果 **0x5739 SCREWDRIVER_TWISTRES_RESPOND** ### 父级参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | screwDriver | object | 是 | 电批锁定结果数据 | ### screwDriver 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | count | int | 是 | 数量 | | start | int | 是 | 起始值 | | sum | int | 是 | 拧紧结果程序总数量 | | proNum | array[int] | 是 | 程序号列表 | | rounds | array[double] | 是 | 圈数列表 | | torque | array[double] | 是 | 扭力值列表 | | tightenTime | array[double] | 是 | 拧紧时间列表 | | result | array[int] | 是 | 结果列表 | | error | array[int] | 是 | 报错详情列表 | ### 示例 ```json { "screwDriver": { "count": 10, "start": 1, "sum": 10, "proNum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "rounds": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], "torque": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], "tightenTime": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], "result": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "error": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } } ``` --- # 视觉工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/04.%E8%A7%86%E8%A7%89%E5%B7%A5%E8%89%BA.html ## 设置视觉参数 *0x4101 VISION_PARAMETER_SET* ```json { "cameraType": "customize", "robot": 1, "vision": { "protocol": { "addDataInitialPara": "GD001", "addDataNum": 5, "angleUnit": 0, "endMark": "$", "failFlag": "NG", "frameHeader": "@", "hasTCS": true, "hasUCS": false, "separator": ",", "singleTarget": false, "successFlag": "OK", "timeOut": 30, "type": 1 }, "socket": { "IP": "192.168.1.120", "camera_data_type": 0, "portNum": 1, "portOne": 5050, "portTwo": 0, "server": true }, "trigger": { "IOPort": 0, "duration": 1000, "intervals": 35, "triggerMode": 2, "triggerOnce": true, "triggerStr": "TRG" }, "userCoordNum": 2 }, "visionNum": 0 } ``` **参数说明:** | 参数分类 | 参数名 | 类型 | 说明 | |---------|--------|------|------| | cameraType | - | string | 相机类型,默认"customize" | | robot | - | int | 机器人编号 | | vision.protocol | addDataInitialPara | string | 附加数据起始变量 | | vision.protocol | addDataNum | int | 附加数据个数 | | vision.protocol | angleUnit | int | 0: 角度;1: 弧度 | | vision.protocol | endMark | string | 结束符 | | vision.protocol | failFlag | string | 失败发送标志符 | | vision.protocol | frameHeader | string | 帧头 | | vision.protocol | hasTCS | bool | 接收坐标系 工具 | | vision.protocol | hasUCS | bool | 接收坐标系 用户 | | vision.protocol | separator | string | 分割符 | | vision.protocol | singleTarget | bool | 单目标使能 | | vision.protocol | successFlag | string | 成功发送标志符 | | vision.protocol | timeOut | int | 超时时间 | | vision.protocol | type | int | 0: 2D, 1: 2D+高度, 2: 3D | | vision.socket | IP | string | 相机 IP | | vision.socket | camera_data_type | int | 0: 机器人坐标, 1: 像素坐标 | | vision.socket | portNum | int | 端口数 | | vision.socket | portOne | int | 端口1 | | vision.socket | portTwo | int | 端口2 | | vision.socket | server | bool | true: 服务端, false: 客户端 | | vision.trigger | IOPort | int | 触发方式 绑定 IO 端口 | | vision.trigger | duration | int | 持续时间 | | vision.trigger | intervals | int | 触发周期 | | vision.trigger | triggerMode | int | 1: IO, 2: Ethernet | | vision.trigger | triggerOnce | bool | true: 单次, false: 多次 | | vision.trigger | triggerStr | string | 触发字符串 | | vision | userCoordNum | int | 手眼标定用户坐标系 | | - | visionNum | int | 工艺号,从0开始 | --- ## 查询视觉参数 *0x4102 VISION_PARAMETER_INQUIRE* ```json { "robot": 1, "visionNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号,从0开始 | --- ## 返回查询视觉参数结果 *0x4103 VISION_PARAMETER_RESPOND* ```json { "cameraList": { "currentName": "customize", "listNum": 0 }, "protocol": { "addDataInitialPara": "GD002", "addDataNum": 4, "angleUnit": 1, "endMark": "*", "failFlag": "N", "frameHeader": "#", "hasTCS": true, "hasUCS": true, "separator": ".", "singleTarget": true, "successFlag": "OK", "timeOut": 31, "type": 2 }, "socket": { "IP": "192.168.1.14", "camera_data_type": 1, "portNum": 2, "portOne": 5052, "portTwo": 5051, "server": false }, "trigger": { "IOPort": 2, "duration": 100, "intervals": 35, "triggerMode": 2, "triggerOnce": false, "triggerStr": "TG" }, "userCoordNum": 100 } ``` **返回参数说明:** | 参数分类 | 参数名 | 类型 | 说明 | |---------|--------|------|------| | cameraList | currentName | string | 当前相机名称 | | cameraList | listNum | int | 默认值配置 | | protocol | (同设置) | - | 协议参数,详见上方 | | socket | (同设置) | - | Socket 参数,详见上方 | | trigger | (同设置) | - | 触发参数,详见上方 | | - | userCoordNum | int | 用户坐标系编号 | --- ## 视觉位置参数设置 *0x4104 VISION_POS_PARAMETER_SET* ```json { "position": { "angleDirection": 1, "cameraPoint": [0.0, 0.0, 100.0, 0.0, 0.0, 0.0], "datumPoint": [0.0, 0.0, 0.0, 3.140, 0.0, 0.0, 0.0], "excursion": { "Xexcursion": 1.0, "Yexcursion": 2.0, "Zexcursion": 3.0, "angle": 4.0 }, "recvPointsType": 0, "scale": 1.0 }, "robot": 1, "visionNum": 0 } ``` **参数说明:** | 参数分类 | 参数名 | 类型 | 说明 | |---------|--------|------|------| | position | angleDirection | int | 角度方向,1或-1 | | position | cameraPoint | array | 第一位 X 值,第二位 Y 值,第三位高度,第四位角度。
若参数类型是2D 和2D+H,则保存4元数组[x,y,H,angle]。
若为3D,则保存6元数组[x,y,z,a,b,c]。 | | position | datumPoint | array | 基准点 x,y,z,a,b,c | | position.excursion | Xexcursion | float | X 方向偏移 | | position.excursion | Yexcursion | float | Y 方向偏移 | | position.excursion | Zexcursion | float | Z 方向偏移 | | position.excursion | angle | float | 角度偏移 | | position | recvPointsType | int | 接受位置类型:0: 点,1: 轨迹 | | position | scale | float | 比例系数 | | - | robot | int | 机器人编号 | | - | visionNum | int | 工艺号,从0开始 | --- ## 视觉位置参数查询 *0x4105 VISION_POS_PARAMETER_INQUIRE* ```json { "robot": 1, "visionNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号,从0开始 | --- ## 返回0x4105查询结果 *0x4106 VISION_POS_PARAMETER_RESPOND* 同:0x4104 --- ## 查询视觉调试点位列表 *0x4107 VISION_DEBUGGING_POS_INQUIRE* ```json { "robot": 1, "visionNum": 1, "conveyorNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号,从0开始 | | conveyorNum | int | 传送带工艺号,从1开始 | --- ## 返回视觉调试点位列表 *0x4108 VISION_DEBUGGING_POS_RESPOND* ```json { "robot": 1, "visionNum": 1, "originPos": [ {"X": 0.0, "Y": 0.0, "Z": 0.0, "angle": 0.0}, {"X": 0.0, "Y": 0.0, "Z": 0.0, "angle": 0.0}, {"X": 0.0, "Y": 0.0, "Z": 0.0, "angle": 0.0} ], "currentPos": [ {"X": 0.0, "Y": 0.0, "Z": 0.0, "angle": 0.0}, {"X": 0.0, "Y": 0.0, "Z": 0.0, "angle": 0.0}, {"X": 0.0, "Y": 0.0, "Z": 0.0, "angle": 0.0} ] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号,从0开始 | | originPos | array | 原始位置列表 | | currentPos | array |当前位置列表 | --- ## 清空视觉调试点位列表 *0x4109 VISION_DEBUGGING_POS_CLEAR* ```json { "robot": 1, "visionNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号,从0开始 | --- ## 拍照 *0x410A VISION_DEBUGGING_TAKE_PICTURE* > 拍照前要上电 ```json { "robot": 1, "visionNum": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | --- ## 计算偏移 *0x410B VISION_DEBUGGING_CALCULATE* 返回0x4108 ```json { "robot": 1, "visionNum": 0, "conveyorNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | conveyorNum | int | 传送带工艺号 | --- ## 运动至该点 *0x410C VISION_DEBUGGING_POS_MOVE* ```json { "robot": 1, "visionNum": 1, "type": 1, "posNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | type | int | 0: 试拍照点,1: 位置调试点,2: 抓取姿态基准点 | | posNum | int | 点位编号,1-20 | --- ## 标定抓取姿态 *0x4110 VISION_GESTURE_CALIBRATION_SET* > 标定后,要用0x4104重新写入 ```json { "robot": 1, "visionNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | --- ## 返回标定结果 *0x4111 VISION_GESTURE_CALIBRATION_RESPOND* ```json { "datumPoint": [0, 0, 0, 0, 0, 0], "datumPointDeg": [0, 0, 0, 0, 0, 0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | datumPoint | array | 基准点弧度制 | | datumPointDeg | array | 基准点角度制 | --- ## 清除抓取姿态标定 *0x4116 VISION_GESTURE_CALIBRATION_CLEAR* > 清空后,要用0x4104重新写入 ```json { "robot": 1, "visionNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | --- ## 试拍照 *0x4112 VISION_TRY_TAKE_PICTURE* ```json { "visionNum": 1, "robot": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | visionNum | int | 工艺号 | | robot | int | 机器人编号 | --- ## 返回拍照结果 *0x4113 VISION_TAKE_PICTURE_RESPOND* ```json { "cameraData": "", "cameraPoint": [0, 0, 0, 0, 0, 0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | cameraData | string | 相机数据 | | cameraPoint | array | 相机点位。3D 相机6个数值,否则4个 | --- ## 视觉 IP 参数查询 *0x4114 VISION_IPPARAM_INQUIRE* ```json { "visionNum": 1, "robot": 1, "server": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | visionNum | int | 工艺号 | | robot | int | 机器人编号 | | server | bool | true: 服务端, false: 客户端 | --- ## 返回0x4114查询结果 *0x4115 VISION_IPPARAM_RESPOND* ```json { "visionNum": 1, "robot": 1, "server": true, "IP": "192.168.1.120" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | visionNum | int | 工艺号 | | robot | int | 机器人编号 | | server | bool | true: 服务端, false: 客户端 | | IP | string | IP 地址 | --- ## 视觉标定参数设置 *0x4117 VISION_CALIBRATION_PARAM_SET* ```json { "robot": 1, "visionNum": 1, "calibration": { "point_num": 9, "calibrated": false, "point": [ { "pixel_pos": [1, 2, 3, 4, 5, 6, 7], "robot_pos": [1, 2, 3, 4, 5, 6, 7] }, { "pixel_pos": [1, 2, 3, 4, 5, 6, 7], "robot_pos": [1, 2, 3, 4, 5, 6, 7] } ] } } ``` **参数说明:** | 参数分类 | 参数名 | 类型 | 说明 | |---------|--------|------|------| | - | robot | int | 机器人编号 | | - | visionNum | int | 工艺号 | | calibration | point_num | int | 标定点个数 | | calibration | calibrated | bool | 是否已标定 | | calibration.point | pixel_pos | array | 像素坐标 | | calibration.point | robot_pos | array | 机器人坐标 | --- ## 视觉标定参数查询 *0x4118 VISION_CALIBRATION_PARAM_INQUIRE* ```json { "robot": 1, "visionNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | --- ## 返回0x4118查询结果 *0x4119 VISION_CALIBRATION_PARAM_RESPOND* ```json { "calibration": { "calibrated": false, "point": [ { "pixel_pos": [0, 0, 0, 0, 0, 0, 0], "pixel_pos_deg": [0, 0, 0, 0, 0, 0, 0], "robot_pos": [0, 0, 0, 0, 0, 0, 0], "robot_pos_deg": [0, 0, 0, 0, 0, 0, 0] } ], "point_num": 6 }, "robot": 1, "visionNum": 0 } ``` **返回参数说明:** | 参数分类 | 参数名 | 类型 | 说明 | |---------|--------|------|------| | calibration | calibrated | bool | 是否已标定 | | calibration | point_num | int | 标定点个数 | | calibration.point | pixel_pos | array | 像素坐标弧度 | | calibration.point | pixel_pos_deg | array | 像素坐标角度 | | calibration.point | robot_pos | array | 机器人坐标弧度 | | calibration.point | robot_pos_deg | array | 机器人坐标角度 | | - | robot | int | 机器人编号 | | - | visionNum | int | 工艺号 | --- ## 标定该点 *0x411A VISION_CALIBRATION_MARK_POINT* ```json { "robot": 1, "visionNum": 1, "point_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | point_num | int | 标定点编号 | --- ## 返回响应标定该点的数据 *0x411B VISION_CALIBRATION_MARK_RESPOND* ```json { "robot": 1, "visionNum": 0, "point_num": 1, "pixel_pos": [1, 2, 3, 4, 5, 6, 7], "robot_pos": [1, 2, 3, 4, 5, 6, 7], "pixel_pos_deg": [1, 2, 3, 40, 50, 60, 7], "robot_pos_deg": [1, 2, 3, 40, 50, 60, 7] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 视觉工艺号 | | point_num | int | 标定点编号 | | pixel_pos | array | 像素坐标 | | robot_pos | array | 机器人坐标 | | pixel_pos_deg | array | 像素坐标角度制 | | robot_pos_deg | array | 机器人坐标角度制 | --- ## 运动到该点 *0x411C VISION_CALIBRATION_MOVE_TO_POINT* ```json { "robot": 1, "visionNum": 1, "point_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | point_num | int | 标定点编号 | --- ## 清除该点数据 *0x411D VISION_CALIBRATION_REMOVE_POINT* ```json { "robot": 1, "visionNum": 1, "point_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | point_num | int | 标定点编号 | --- ## 自动标定运行计算 *0x411E VISION_CALIBRATION_AUTO_RUN_AND_CALCULATION* ```json { "robot": 1, "visionNum": 1, "caculate_type": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | caculate_type | int | 0: 眼在手上 | --- ## 自动标定:返回像素坐标 *0x4120 VISION_CALIBRATION_CAMERA_DATA_RESPOND* ```json { "robot": 1, "visionNum": 1, "point_num": 1, "pixel_pos": [1, 2, 3, 4, 5, 6, 7], "pixel_pos_deg": [1, 2, 3, 40, 50, 60, 7] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | point_num | int | 点号 | | pixel_pos | array | 像素坐标 | | pixel_pos_deg | array | 像素坐标角度制 | --- ## 标定计算结果 *0x4121 VISION_CALIBRATION_CALC_RESPOND* ```json { "robot": 1, "visionNum": 1, "result": false } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | | result | bool | true: 成功, false: 错误 | --- ## 取消自动标定 *0x4122 VISION_CALIBRATION_CANCEL_CALCULATION* ```json { "robot": 1, "visionNum": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | --- ## 设置视觉范围 *0x3F04 VISION_RANGE_SET* ```json { "robot": 1, "visionNum": 0, "visionRange": { "maxX": "0", "maxY": "1.1", "maxZ": "222", "minX": "0.003", "minY": "0", "minZ": "0" } } ``` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号,1~4 | | visionNum | int | 工艺号,0~8 | | visionRange.maxX | string | X 最大值,未设置则为空字符串"" | | visionRange.maxY | string | Y 最大值 | | visionRange.maxZ | string | Z 最大值 | | visionRange.minX | string | X 最小值 | | visionRange.minY | string | Y 最小值 | | visionRange.minZ | string | Z 最小值 | --- ## 查询视觉范围 *0x3F05 VISION_RANGE_INQUIRE* ```json { "robot": 1, "visionNum": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | visionNum | int | 工艺号 | --- ## 返回查询视觉范围结果 *0x3F06 VISION_RANGE_RESPOND* ```json { "maxX": "", "maxY": "1.1", "maxZ": "222", "minX": "0.003", "minY": "0", "minZ": "0" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | maxX | string | X 最大值,未设置则为空字符串"" | | maxY | string | Y 最大值 | | maxZ | string | Z 最大值 | | minX | string | X 最小值 | | minY | string | Y 最小值 | | minZ | string | Z 最小值 | --- ## 位置标定协议 *0x4128 VISION_RANGE_CALIBRATION_POS_INQUIRE* ```json { "robotid": 1, "craftid": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robotid | int | 机器人编号,1~4 | | craftid | int | 工艺号,0~99 | --- ## 回复0x4128 *0x4129 VISION_RANGE_CALIBRATION_POS_RESPOND* ```json { "robotid": 1, "craftid": 0, "pos": [0, 0, 0, 0, 0, 0, 0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robotid | int | 机器人编号 | | craftid | int | 工艺号 | | pos | array | 当前位置 | --- #########################以下2207版本无该功能############################# ## 标定结果保存 > 保存自动标定第2种类型标定的工具手结果 *0x4123 VISION_CALIBRATION_SAVE_RESULT* ```json { "robot": 1, "tool_num": 1, "tool_hand": [0, 0, 0, 0, 0, 0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | tool_num | int | 工具编号 | | tool_hand | array | 工具手数据 | --- ## 手眼标定:根据 socket 数据计算转换矩阵 *0x4124 VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA* ```json { "robot": 1, "vision_num": 1, "calculation_type": 0, "base_robot_pos": [0, 0, 0, 0, 0, 0], "mark_pos": [ { "robot_pos": [0, 0, 0, 0, 0, 0], "camera_pos": [0, 0, 0, 0, 0, 0] } ] } ``` **参数说明:** | 参数分类 | 参数名 | 类型 | 说明 | |---------|--------|------|------| | - | robot | int | 机器人编号 | | - | vision_num | int | 工艺号,从0开始 | | - | calculation_type | int | 0: 眼在手上不变姿态的手眼标定
1: 眼在手上变姿态的手眼标定
2: 眼在手外的手眼标定 | | - | base_robot_pos | array | 直角坐标 | | mark_pos | robot_pos | array | 直角坐标 | | mark_pos | camera_pos | array | 相机坐标 | --- ## 视觉标定结果响应 *0x4125 VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA_RESPOND* ```json { "robot": 1, "vision_num": 1, "result": true, "matrix": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | vision_num | int | 工艺号,从0开始 | | result | bool | true: 成功, false: 错误 | | matrix | array | 转换矩阵 | --- # 焊接工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/05.%E7%84%8A%E6%8E%A5%E5%B7%A5%E8%89%BA.html ## 焊接装置 设置焊接装置时,发送: *0x4001 WELDEQUIPMENT_SET* ```json { "basic_functions": { "arc_detection_time": 1.3, "arc_depletion_detection_time": 1.3, "arc_detection_ensure_time": 1.3, "pre_give_gas_time": 1.5, "close_time": 1.9, "weld_interruption_detection": 1, "arc_fly": 1 }, "micro_adjustment": { "single_adjustment_current": 3, "single_adjustment_voltage": 4, "single_adjustment_speed": 5, "swing_weld_frequency": 6, "swing_weld_range": 1.1 }, "restart": { "restart_times": 1, "restart_distance": 2, "restart_speed": 3, "re_arc_times": 4, "restart_enable": false, "re_arc_enable": false, "restart_mode": 0 }, "antiCollision": { "enable": false, "inputPort": 1, "inputValue": 1, "stopTime": 80, "outputPort": 2, "outputValue": 1, "shieldFlag": false, "shieldTime": 30 }, "other": { "break_back_time": 1.2, "weld_finish_time": 1.3, "break_back_enable": false, "weld_finish_function": true, "simulation_set_zero": false }, "collisionButtonFlag": { "error_enable_switch": true } } ``` ### basic_functions 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | arc_detection_time | double | 起弧检测时间 | | arc_depletion_detection_time | double | 电弧耗尽检测时间 | | arc_detection_ensure_time | double | 起弧确认检测时间 | | pre_give_gas_time | double | 提前送气时间 | | close_time | double | 延后关气时间 | | weld_interruption_detection | int | 焊接中断检测 | | arc_fly | int | 飞行起弧 | ### micro_adjustment 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | single_adjustment_current | int | 焊接电流单次调整量 | | single_adjustment_voltage | int | 焊接电压单次调整量 | | single_adjustment_speed | int | 焊接速度单次调整量 | | swing_weld_frequency | int | 摆焊频率单次调整量 | | swing_weld_range | double | 摆焊幅度单次调整量 | ### restart 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | restart_times | int | 再启动次数 | | restart_distance | int | 再启动距离 | | restart_speed | int | 再启动速度 | | re_arc_times | int | 再起弧次数 | | restart_enable | bool | 再启动使能 | | re_arc_enable | bool | 再起弧使能 | | restart_mode | int | 再启动模式:0-自动再启动,1-半自动再启动,2-停机 | ### antiCollision 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | enable | bool | 防碰撞功能使能 | | inputPort | int | 防碰撞 IO 端口 | | inputValue | int | 防碰撞触发电平 | | stopTime | int | 防碰撞快速停止时间 | | outputPort | int | 防碰撞输出提示端口 | | outputValue | int | 防碰撞输出提示电平 | | shieldFlag | bool | 屏蔽防碰撞使能 | | shieldTime | int | 屏蔽时间 | ### other 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | break_back_time | double | 断弧回抽时间 | | weld_finish_time | double | 焊接完成回抽时间 | | break_back_enable | bool | 断弧回抽使能 | | weld_finish_function | bool | 焊接完成回抽功能 | | simulation_set_zero | bool | 灭弧模拟量置零功能 | ### collisionButtonFlag 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | error_enable_switch | bool | 拖拽点动模式切换开关 | 查询焊接装置时,发送: *0x4002 WELDEQUIPMENT_INQUIRE* data:无 收到查询焊接装置时,返回: *0x4003 WELDEQUIPMENT_RESPOND* 同0x4001 --- ## 设置电流电压匹配 设置电流电压匹配时,发送: *0x4004 CURVOLMATCH_SET* ```json { "current_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_current": [1, 2, 3, 4, 5, 6, 7, 8] }, "voltage_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_voltage": [1, 2, 3, 4, 5, 6, 7, 8] }, "robot": 1 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | current_control.set_voltage | array | 设置电流 | | current_control.actual_current | array | 实际电流 | | voltage_control.set_voltage | array | 设置电压 | | voltage_control.actual_voltage | array | 实际电压 | | robot | int | 机器人编号 | 查询电流电压匹配时,发送: *0x4005 CURVOLMATCH_INQUIRE* data:无 收到查询电流电压匹配时,返回: *0x4006 CURVOLMATCH_RESPOND* ```json { "current_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_current": [1, 2, 3, 4, 5, 6, 7, 8] }, "voltage_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_voltage": [1, 2, 3, 4, 5, 6, 7, 8] }, "IO": { "AO_setcurrent": 0, "AO_setvoltage": 0 }, "robot": 1 } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | current_control.set_voltage | array | 设置电流 | | current_control.actual_current | array | 实际电流 | | voltage_control.set_voltage | array | 设置电压 | | voltage_control.actual_voltage | array | 实际电压 | | IO.AO_setcurrent | int | 电流输出端口 | | IO.AO_setvoltage | int | 电压输出端口 | | robot | int | 机器人编号 | --- ## 焊接参数 设置焊接参数时,发送: *0x4007 WELDPARAMETER_SET* ```json { "num": 1, "notes": "示例", "arcoff_parameters": { "arcoff_voltage": 1.1, "arcoff_current": 1.1, "arcoff_time": 1.1, "ramp_time": 1.1, "ramp_distance": 1.1, "ramp_enable": true, "ramp_mode": 1 }, "weld_parameters": { "weld_current": 1.1, "weld_voltage": 1.1 }, "arcon_parameters": { "arcon_current": 1.1, "arcon_voltage": 1.1, "arcon_time": 1.1, "arcon_ramp_time": 1.1, "arcon_ramp_distance": 1.1, "arcon_ramp_enable": true, "arcon_ramp_mode": 1, "arcon_use_param": true, "arcoff_use_param": true } } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | 参数序号,从1开始 | | notes | string | 注释 | ### arcoff_parameters(收弧参数) | 参数名 | 类型 | 说明 | |--------|------|------| | arcoff_voltage | double | 收弧电压 | | arcoff_current | double | 收弧电流 | | arcoff_time | double | 收弧时间 | | ramp_time | double | 渐变时间 | | ramp_distance | double | 渐变距离 | | ramp_enable | bool | 渐变使能 | | ramp_mode | int | 收弧渐变方式:0-时间渐变,1-距离渐变 | ### weld_parameters(焊接参数) | 参数名 | 类型 | 说明 | |--------|------|------| | weld_current | double | 焊接电流 | | weld_voltage | double | 焊接电压 | ### arcon_parameters(起弧参数) | 参数名 | 类型 | 说明 | |--------|------|------| | arcon_current | double | 起弧电流 | | arcon_voltage | double | 起弧电压 | | arcon_time | double | 起弧时间 | | arcon_ramp_time | double | 渐变时间 | | arcon_ramp_distance | double | 渐变距离 | | arcon_ramp_enable | bool | 起弧渐变使能 | | arcon_ramp_mode | int | 起弧渐变方式:0-时间渐变,1-距离渐变 | | arcon_use_param | bool | 起弧参数使能 | | arcoff_use_param | bool | 收弧参数使能 | 查询焊接参数时,发送: *0x4008 WELDPARAMETER_INQUIRE* ```json { "num": 1, "robot": 1 } ``` 收到查询焊接参数时,返回: *0x4009 WELDPARAMETER_RESPOND* 同0x4007 --- ## 摆焊参数 设置摆焊参数时,发送: *0x400B WEAVPARAMETER_SET* ```json { "num": 1, "parameter": { "horizontal_angle": 5.0, "init_direction": 1, "isMove": 1, "left_standing_time": 4.0, "note": "AA", "right_standing_time": 3.0, "vertical_angle": 6.0, "weaving_ampli": 2.0, "weaving_freq": 1.0, "weaving_type": 1 } } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | 参数序号,从1开始 | ### parameter | 参数名 | 类型 | 说明 | |--------|------|------| | horizontal_angle | double | 水平偏角:-180 ~ +180 | | init_direction | int | 起始方向:0-正方向(+1),1-负方向(-1) | | isMove | int | 移动模式:0-移动,1-停留 | | left_standing_time | double | 左停留时间 | | note | string | 注释 | | right_standing_time | double | 右停留时间 | | vertical_angle | double | 竖直偏角:-180 ~ +180 | | weaving_ampli | double | 摆动幅度:0-50 | | weaving_freq | double | 摆动频率 | | weaving_type | int | 摆动类型:0-正弦,1-Z 字形,2-圆形摆,3-外部轴定点摆 | 查询摆焊参数时,发送: *0x400C WEAVPARAMETER_INQUIRE* ```json { "num": 1 } ``` 收到查询摆焊参数时,返回: *0x400D WEAVPARAMETER_RESPOND* 同0x400B --- ## 电流电压匹配实际值 设置电流电压匹配参数实际值,修改值就会发送,无需保存: *0x400E WELDFACTCURVOL_SET* ```json { "type": 0, "value": 4.13 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | 0-电流控制匹配,2-电压控制匹配 | | value | double | 值 | 控制器返回: *0x400F WELDFACTCURVOL_RESPOND* ```json { "result": 1, "robot": 1 } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | result | int | 1-设置成功,0-设置失败 | | robot | int | 机器人编号 | 开始进行模拟量匹配:建立电流电压匹配界面会发送 true,离开 false *0x4010 WELD_CURVOLMATCH_START* ```json { "start": true } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | start | bool | true-开始,false-结束 | --- ## 焊接 IO 接口 设置焊接 IO 接口时,发送: *0x4011 WELDIOPORT_SET* ```json { "Ain": { "Voltage": 2, "electric": 1 }, "Aout": { "given_electric_current": 1, "given_setvoltage": 2 }, "Din": { "arc_success": 1, "seek_success": 2 }, "Dout": { "arc_signal": 1, "gas_detection": 4, "positioning_mode": 5, "wire_feed": 2, "wire_feed_back": 3 } } ``` ### Ain(输入模拟量) | 参数名 | 类型 | 说明 | |--------|------|------| | Voltage | int | 焊接电压 | | electric | int | 焊接电流 | ### Aout(输出模拟量) | 参数名 | 类型 | 说明 | |--------|------|------| | given_electric_current | int | 给定电流信号 | | given_setvoltage | int | 给定电压信号 | ### Din(数字输入) | 参数名 | 类型 | 说明 | |--------|------|------| | arc_success | int | 起弧成功 | | seek_success | int | 寻位成功 | ### Dout(数字输出) | 参数名 | 类型 | 说明 | |--------|------|------| | arc_signal | int | 起弧成功信号 | | gas_detection | int | 气体检测信号 | | positioning_mode | int | 寻位模式 | | wire_feed | int | 点动送丝信号 | | wire_feed_back | int | 反向送丝信号 | 查询焊接 IO 接口时,发送: *0x4012 WELDIOPORT_INQUIRE* ```json {} ``` 控制器收到查询焊接 IO 接口时,返回: *0x4013 WELDIOPORT_RESPOND* data:同0x4011 查询焊接状态时,发送: *0x4015 WELDMONITOR_INQUIRE* data:无 控制器收到查询焊接状态时,返回: *0x4016 WELDSTATE_RESPOND* ```json { "antiCollision": { "shieldFlag": true }, "weldEnabled": true, "spotWeldEnabled": true, "feedWire": true, "aspiration": true, "returnWire": true, "pistolSwitch": 0, "arcingSuccess": 1, "handWireFeed": -1, "weldCurrent": 1.0, "weldVoltage": 2.0, "weldRunTime": 3.3, "weldRunDutyRatio": 4.4, "robot": 1 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | antiCollision.shieldFlag | bool | 屏蔽防碰撞 | | weldEnabled | bool | 焊接使能 | | spotWeldEnabled | bool | 点焊使能 | | feedWire | bool | 送丝 | | aspiration | bool | 送气 | | returnWire | bool | 退丝 | | pistolSwitch | int | 焊枪开关状态:0-低(红),1-高(绿),-1-无(灰) | | arcingSuccess | int | 引弧成功 | | handWireFeed | int | 手动送丝 | | weldCurrent | double | 焊接电流 | | weldVoltage | double | 焊接电压 | | weldRunTime | double | 焊接时间 | | weldRunDutyRatio | double | 焊接占空比 | | robot | int | 机器人编号 | --- ## 点焊参数 点焊参数设置: *0x4017 WELD_SHOTPARM_SET* ```json { "spotWeldCurrent": 0, "spotWeldVoltage": 0, "spotWeldMaxTime": 0 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | spotWeldCurrent | double | 点焊电流 | | spotWeldVoltage | double | 点焊电压 | | spotWeldMaxTime | double | 点焊最大时间:1-10 | --- ## 电流电压直接设置 *0x4018 WELD_CURVOL_DIRECTSET* ```json { "type": 1, "value": 1 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | 1-设置电流,2-设置电压 | | value | double | 值 | --- ## 设置焊机模式 监控设置焊机模式: *0x401A WELD_HANDOP_SET* ```json { "type": 1, "value": 0, "robot": 1 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | 1-焊接使能,2-手动起弧,3-手动点焊,4-送丝,5-退丝,6-送气,7-故障复位 | | value | int | bool 型 | | robot | int | 机器人编号 | 焊机参数查询: *0x401B WELD_HANDOP_INQUIRE* data:无 焊机参数数据返回: *0x401C WELD_HANDOP_RESPOND* ```json { "weldEnabled": true, "spotWeldEnabled": true, "spotWeldCurrent": 33.3, "spotWeldVoltage": -20.2, "spotWeldMaxTime": 0.5, "newCurrent": 33.3, "newVoltage": -20.2, "feedWire": true, "returnWire": true, "aspiration": true } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | weldEnabled | bool | 焊接使能 | | spotWeldEnabled | bool | 点焊使能 | | spotWeldCurrent | double | 点焊电流 | | spotWeldVoltage | double | 点焊电压 | | spotWeldMaxTime | double | 点焊最大时间:0-1秒 | | newCurrent | double | 设置电流 | | newVoltage | double | 设置电压 | | feedWire | bool | 送丝 | | returnWire | bool | 退丝 | | aspiration | bool | 送气 | --- ## 焊机选择设置 *0x401D WELD_MACHINE_CHOOSE_SET* ```json { "controlMode": 1, "monufactor": "瑞凌", "weldingMode": 1, "commMode": "ModBus RTU", "slaveIP": "192.168.1.15", "slaveid": 1, "port": 21, "baudRate": 115200, "RILAND": { "materialWireDiameterGasSelect": 1 } } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | controlMode | int | 0-模拟控制,1-数字控制 | | monufactor | string | 焊机厂家 | | weldingMode | int | 0-分别,1-一元化 | | commMode | string | 通讯方式:CAN,ModBus RTU,Modbus TCP,EtherCAT | | slaveIP | string | 从站 IP | | slaveid | int | 从站 ID | | port | int | 端口号 | | baudRate | int | 波特率 | | RILAND.materialWireDiameterGasSelect | int | 材料/丝径/气体选择 | 查询: *0x401E WELD_MACHINE_CHOOSE_INQUIRE* data:无 返回: *0x401F WELD_MACHINE_CHOOSE_RESPOND* ```json { "controlMode": 0, "monufactor": "麦格米特", "weldingMode": 0, "commMode": "CAN", "slaveIP": "192.168.1.14", "slaveid": 1, "port": 2, "baudRate": 115200, "monufactorList": ["麦格米特", "美佳尼克", "欢颜"], "RILAND": { "materialWireDiameterGasSelect": 1 } } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | controlMode | int | 0-模拟控制,1-数字控制 | | monufactor | string | 焊机厂家 | | weldingMode | int | 0-分别,1-一元化 | | commMode | string | 通讯方式 | | slaveIP | string | 从站 IP | | slaveid | int | 从站 ID | | port | int | 端口号 | | baudRate | int | 波特率 | | monufactorList | array | 焊机厂家列表 | | RILAND.materialWireDiameterGasSelect | int | 材料/丝径/气体选择 | --- ## 焊机通讯状态查询 *0x4022 WELD_MACHINE_CONNECT_STATUS_INQUIRE* data:无 返回: *0x4023 WELD_MACHINE_CONNECT_STATUS_RESPOND* ```json { "welder": [ { "status": 0 } ] } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | welder[].status | int | 焊机通讯状态 | --- ## 焊接参数、摆焊参数注释查询 *0x4024 WELDPARAMETERNOTES_INQUIRE* ```json {} ``` 返回: *0x4025 WELDPARAMETERNOTES_RESPOND* ```json { "weldNotes": ["112", "223", "", ""], "weavParameterNotes": ["112", "223", "", ""] } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | weldNotes | array | 焊接参数注释 | | weavParameterNotes | array | 摆焊参数注释 | --- ## 焊接微调整查询 *0x4029 WELDADJUSTMENT_INQUIRE* ```json {} ``` 返回: *0x402A WELDADJUSTMENT_RESPOND* ```json { "weav": { "left_stay_time": [0, 1.0], "right_stay_time": [0, 1.0], "swing_amplitude": [0, 1.0], "swing_frequency": [0, 1.0] }, "weld": { "weld_current": [0.0, 0.0], "weld_voltage": [0.0, 0.0] } } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | weav.left_stay_time | array | 左停留时间:[最小值, 最大值] | | weav.right_stay_time | array | 右停留时间:[最小值, 最大值] | | weav.swing_amplitude | array | 摆焊振幅:[最小值, 最大值] | | weav.swing_frequency | array | 摆焊频率:[最小值, 最大值] | | weld.weld_current | array | 焊接电流:[最小值, 最大值] | | weld.weld_voltage | array | 焊接电压:[最小值, 最大值] | --- ## 焊接微调整 注:运行模式使用,需要在焊接装备-微调整设参 *0x402B WELDADJUSTMENT_SET* ```json { "name": "weld_current", "type": 0 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 参数名:weld_current-焊接电流,weld_voltage-焊接电压 | | type | int | 0-增加,1-减少,2-将参数存入配置文件 | --- ## 相贯线焊接标定工件坐标系 坐标标定设置: *0x4051 CYLDINTERSEC_WELDING_CALIBRATION_SET* ```json { "workPieceNum": 1 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | workPieceNum | int | 工件号 | 相贯线点击标定该点: *0x4052 CYLDINTERSEC_WELDING_CALIBRATION_INQUIRE* ```json { "workPieceNum": 1, "pointNum": 0 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | workPieceNum | int | 工件号 | | pointNum | int | 点号:0~5 | 回复: *0x4053 CYLDINTERSEC_WELDING_CALIBRATION_RESPOND* ```json { "workPieceNum": 1, "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | workPieceNum | int | 工件号 | | pointNum | int | 点号:0~5 | | pos | array | 当前标定的点位 | 标定结果返回: *0x4054 CYLDINTERSEC_WELDING_CALIBRATION_RESULT* ```json { "result": true, "workPieceNum": 1, "cylinderIntersectLineParam": { "R": 7.873846098073, "alpha": 39.072395710472, "e": 9.866955106008, "r": 2.527536958062 }, "WorkPieceCoord": [459.926870686929, -2.5264800349, 632.105073382516, -0.000000248216, 0.000000069098, 2.768560904971] } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | result | bool | 标定结果 | | workPieceNum | int | 工件号 | | cylinderIntersectLineParam.R | double | 相贯线参数 R | | cylinderIntersectLineParam.alpha | double | 相贯线参数 alpha | | cylinderIntersectLineParam.e | double | 相贯线参数 e | | cylinderIntersectLineParam.r | double | 相贯线参数 r | | WorkPieceCoord | array | 工件坐标系 | --- ## 相贯线工件参数设置 *0x4055 CYLDINTERSEC_WELDING_PARAMETER_SET* ```json { "workPieceNum": 1, "cylinderIntersectLineParam": { "R": 0, "r": 0, "e": 0, "alpha": 0 }, "WorkPieceCoord": [0, 0, 0, 0, 0, 0] } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | workPieceNum | int | 工件号 | | cylinderIntersectLineParam.R | double | 相贯线参数 R | | cylinderIntersectLineParam.r | double | 相贯线参数 r | | cylinderIntersectLineParam.e | double | 相贯线参数 e | | cylinderIntersectLineParam.alpha | double | 相贯线参数 alpha | | WorkPieceCoord | array | 工件坐标系 | 相贯线工件参数查询: *0x4056 CYLDINTERSEC_WELDING_PARAMETER_INQUIRE* ```json { "workPieceNum": 1 } ``` 相贯线工件参数回复: *0x4057 CYLDINTERSEC_WELDING_PARAMETER_RESPOND* 同:0x4055 --- ## 相贯线焊枪参数设置 *0x4061 CYLDINTERSEC_WELDINGGUN_PARAMETER_SET* ```json { "WeldingGunParam": { "alpha": 1.0, "beta": 2.0, "gama": 3.0, "pos_hf_hq": [4.0, 5.0, 6.0] }, "startAngle": 7.0, "totalAngle": 8.0, "workPieceNum": 1 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | WeldingGunParam.alpha | double | 焊枪角度 alpha | | WeldingGunParam.beta | double | 焊枪角度 beta | | WeldingGunParam.gama | double | 焊枪角度 gama | | WeldingGunParam.pos_hf_hq | array | 焊枪位置 | | startAngle | double | 起始角度 | | totalAngle | double | 总角度 | | workPieceNum | int | 工件号 | 相贯线焊枪参数查询: *0x4062 CYLDINTERSEC_WELDINGGUN_PARAMETER_INQUIRE* ```json { "workPieceNum": 1 } ``` 相贯线焊枪参数回复: *0x4063 CYLDINTERSEC_WELDINGGUN_PARAMETER_RESPOND* 同:0x4061 --- ## 相贯线工艺标志量设置 区分有无变位机的相贯线工艺的标志量设置: *0x4065 CYLDINTERSEC_WITHSYNCPOSFLAG_SET* ```json { "workPieceNum": 1, "withSyncPosFlag": 1 } ``` ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | workPieceNum | int | 工艺号 | | withSyncPosFlag | int | 0-不带变位机,1-带变位机 | 坐标标定查询: *0x4066 CYLDINTERSEC_WITHSYNCPOSFLAG_INQUIRE* ```json { "workPieceNum": 1 } ``` 回复: *0x4067 CYLDINTERSEC_WITHSYNCPOSFLAG_RESPOND* ```json { "workPieceNum": 1, "withSyncPosFlag": 1 } ``` ### 返回参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | workPieceNum | int | 工艺号 | | withSyncPosFlag | int | 0-不带变位机,1-带变位机 | --- # 调高器 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/06.%E6%BF%80%E5%85%89%E5%88%87%E5%89%B2%E5%B7%A5%E8%89%BA/%E8%B0%83%E9%AB%98%E5%99%A8.html --- ## 0x91A1 跟随开命令请求 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | thirdLevelPerforationEnable | bool | 否 | 三级穿孔使能 | | secondPerforationEnable | bool | 否 | 二次穿孔使能 | | perforationMode | int | 否 | 穿孔模式:0-直接穿孔 1-分段穿孔 2-渐近穿孔 | **示例** ```json { "robot": 1, "thirdLevelPerforationEnable": false, "secondPerforationEnable": false, "perforationMode": 1 } ``` --- ## 0x91A2 跟随关命令请求 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **示例** ```json { "robot": 1 } ``` --- ## 0x91A3 跟随停命令请求 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **示例** ```json { "robot": 1 } ``` --- ## 0x91A4 调高器点动 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | direction | int | 是 | 方向:0-下降 1-上升 (100ms 内发送) | | speedLevel | int | 否 | 速度等级:0-低速 1-中速 2-高速 | **示例** ```json { "robot": 1, "direction": 1, "speedLevel": 1 } ``` --- ## 0x91AF 停止点动 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **示例** ```json { "robot": 1 } ``` --- ## OperationStatus 状态枚举 ```cpp enum class OperationStatus { STOP_ = 0x00, // 停止 MENU_SETTING_ = 0x01, // 菜单设定中 MOTOR_CALIBRATION_ = 0x02, // 电机标定中 CAPACITANCE_CALIBRATION_ = 0x03, // 电容标定中 AUTO_TUNING_ = 0x04, // 自动整定中 HOME_ = 0x05, // 回零 FOLLOW_ = 0x06, // 跟随 ASCEND_ = 0x07, // 上升 DESCEND_ = 0x08, // 下降 EMERGENCY_TOP_ = 0x09, // 急停 FROG_LEAP_ = 0x0A // 蛙跳 }; ``` --- ## 0x91A7 请求调高器相关信息 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **示例** ```json { "robot": 1 } ``` --- ## 0x91A8 返回调高器相关信息 **响应参数** | 参数名 | 类型 | 说明 | |--------|------|------| | status | int | OperationStatus 状态值 | | capacitance_value | int | 电容值 | | position | int | 位置值 | | height | int | 高度值 | | version | int | 版本号 | | stop_coordinate | int | 停止坐标 | | air_moving_board_delay | int | 气动板延时 | | back_to_center_coordinate | int | 归中坐标 | | cutting_plate_delay | int | 切割板延时 | | perforation_plate_delay | int | 穿孔板延时 | | zaxis_coordinate | int | Z 轴坐标 | **示例** ```json { "status": 0, "capacitance_value": 0, "position": 0, "height": 0, "version": 0, "stop_coordinate": 1, "air_moving_board_delay": 1, "back_to_center_coordinate": 1, "cutting_plate_delay": 1, "perforation_plate_delay": 1, "zaxis_coordinate": 1 } ``` --- ## 0x91A9 设置跟随等级 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | cuttingTrackLevel | int | 否 | 切割轨迹跟随等级,范围(0, 30] | | rAngleTrackLevel | int | 否 | R 角跟随等级 | **示例** ```json { "cuttingTrackLevel": 30, "rAngleTrackLevel": 0 } ``` --- ## 0x91B0 设置高度 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | cuttingHeight | int | 否 | 切割高度,单位μm,范围200-9999 | **示例** ```json { "cuttingHeight": 0 } ``` --- ## 0x91AA 电容标定 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | int | 否 | 标定类型:0-电机标定 1-电容标定/坡口切割标定 | | isBevelCutting | bool | 否 | 是否为坡口切割标定 | | calibrationProtection | bool | 否 | 标定保护 | | zAxisAngle | int | 否 | Z 轴角度 | **示例** ```json { "type": 0, "isBevelCutting": false, "calibrationProtection": false, "zAxisAngle": 0 } ``` --- ## 0x91B0 CNC 发送实时 Z 轴速度 **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | cncSpeed | int | 否 | Z 轴速度,单位:μm/ms | **示例** ```json { "cncSpeed": 100 } ``` --- # 喷涂工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/07.%E5%96%B7%E6%B6%82%E5%B7%A5%E8%89%BA.html ## 1 模拟量设置 ### 1.1 设置 **消息 ID**: 0x4701 `SPRAY_ANALOGGROUP_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 模拟量组号 | | flow | float | 是 | 流量 | | sector | float | 是 | 扇形 | | atom | float | 是 | 雾化 | | note | string | 否 | 注释 | **请求示例**: ```json { "robot": 1, "ID": 1, "flow": 1.1, "sector": 2.2, "atom": 3.3, "note": "" } ``` ### 1.2 查询 **消息 ID**: 0x4702 `SPRAY_ANALOGROUP_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 模拟量组号 | **请求示例**: ```json { "robot": 1, "ID": 1 } ``` ### 1.3 返回 **消息 ID**: 0x4703 `SPRAY_ANALOGROUP_RESPOND` **返回参数**: 同设置 (0x4701) --- ## 2 数字量设置 ### 2.1 数字量参数设置 **消息 ID**: 0x4704 `SPRAY_DIGIT_PARM_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 参数组号 | | signalPort | int[] | 是 | 信号输出端口 | | signalValue | int[] | 是 | 端口值 | | colorPort | int[] | 否 | 颜色端口 | | colorValue | int[] | 否 | 颜色值 | | colorRGB | string[] | 否 | RGB 颜色值 | **signalPort 端口定义**: | 索引 | 端口功能 | |------|----------| | 1 | 开枪 | | 2 | 流量 | | 3 | 扇形 | | 4 | 雾化 | | 5 | 空气吹洗 | | 6 | 清洗溶剂 | **请求示例**: ```json { "robot": 1, "ID": 1, "signalPort": [1, 2, 3, 4, 5, 6], "signalValue": [1, 1, 1, 1, 1, 1], "colorPort": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "colorValue": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "colorRGB": ["66CCFF", "", "", "", "", "", "", "", "", ""] } ``` ### 2.2 查询 **消息 ID**: 0x4705 `SPRAY_DIGIT_PARM_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 参数组号 | **请求示例**: ```json { "robot": 1, "ID": 1 } ``` ### 2.3 返回 **消息 ID**: 0x4706 `SPRAY_DIGIT_PARM_RESPOND` **返回参数**: 同设置 (0x4704) ### 2.4 时序设置 **消息 ID**: 0x4707 `SPRAY_SEQUENTIAL_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 时序组号 | | openGun | int[] | 是 | 开枪时序 | | change | int[] | 是 | 换料时序 | **请求示例**: ```json { "robot": 1, "ID": 1, "openGun": [1, 2, 3, 4, 5, 6, 7, 8], "change": [1, 2, 3, 4, 5, 6, 7] } ``` ### 2.5 查询 **消息 ID**: 0x4708 `SPRAY_SEQUENTIAL_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 时序组号 | **请求示例**: ```json { "robot": 1, "ID": 1 } ``` ### 2.6 返回 **消息 ID**: 0x4709 `SPRAY_SEQUENTIAL_RESPOND` **返回参数**: 同设置 (0x4707) --- ## 3 轨迹参数设置 ### 3.1 设置 **消息 ID**: 0x470A `SPRAY_TRAJECTORY_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 轨迹组号 | | type | int | 是 | 类型:0-平面,1-立体,2-自定义 | | kind | int | 是 | 种类,从1开始 | | layer | int | 是 | 层数 | | append | int | 是 | 追加次数 | | closeGunInTransition | bool | 是 | 转折处不喷 | | pos | float[][] | 条件 | 自定义轨迹点(type=2时可不发) | | custom | object | 条件 | 自定义轨迹参数(type=0/1时可不发) | **custom 参数说明**: | 参数名 | 类型 | 说明 | |--------|------|------| | segmentSum | int | 轨迹段数 | | segmentType | int[] | 每段轨迹类型:0-直线,1-圆弧 | | startPos | float[] | 起点(弧度制) | | startPosDeg | float[] | 起点(角度制) | | middlePos | float[][][] | 中间轨迹点,分3段,每段最多2个点 | | middlePosDeg | float[][][] | 中间轨迹点(角度制) | | endPos | float[] | 终点(弧度制) | | endPosDeg | float[] | 终点(角度制) | **请求示例**: ```json { "robot": 1, "ID": 1, "type": 1, "kind": 1, "layer": 1, "append": 0, "closeGunInTransition": false, "pos": [ [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6] ], "custom": { "segmentSum": 2, "segmentType": [0, 1, 0], "startPos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "startPosDeg": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "middlePos": [ [[1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]], [[1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6]], [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]] ], "middlePosDeg": "同上,角度制", "endPos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "endPosDeg": "同上,角度制" } } ``` ### 3.2 查询 **消息 ID**: 0x470B `SPRAY_TRAJECTORY_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | ID | int | 是 | 轨迹组号 | **请求示例**: ```json { "robot": 1, "ID": 1 } ``` ### 3.3 返回 **消息 ID**: 0x470C `SPRAY_TRAJECTORY_RESPOND` **返回参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | ID | int | 轨迹组号 | | type | int | 类型:0-平面,1-立体,2-自定义 | | kind | int | 种类 | | layer | int | 层数 | | append | int | 追加次数 | | closeGunInTransition | bool | 转折处不喷 | | pos | float[][] | 轨迹点 | | custom | object | 自定义轨迹参数 | **返回示例**: ```json { "robot": 1, "ID": 1, "type": 1, "kind": 1, "layer": 1, "append": 0, "closeGunInTransition": false, "pos": [ [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6] ], "custom": { "segmentSum": 2, "segmentType": [0, 1, 0], "startPos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "startPosDeg": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "middlePos": [ [[1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]], [[1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6]], [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]] ], "middlePosDeg": [ [[1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]], [[1.1, 2.2, 3.3, 4.4, 5.5, 6.6], [1.1, 2.2, 3.3, 4.4, 5.5, 6.6]], [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]] ], "endPos": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "endPosDeg": [1.1, 2.2, 3.3, 4.4, 5.5, 6.6] } } ``` --- ## 4 手动操作 ### 4.1 选择和按钮设置 **消息 ID**: 0x4711 `SPRAY_HAND_OPERATION_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | type | int | 是 | 操作类型 | | value | int | 是 | 值 | **type 类型定义**: | type 值 | 说明 | |--------|------| | 1 | 喷枪 | | 2 | 时序组号 | | 3 | 除尘 | | 4 | 喷漆 | | 5 | 清洗 | | 6 | 油量测试 | | 7 | 颜色切换 | **请求示例**: ```json { "robot": 1, "type": 1, "value": 1 } ``` ### 4.2 查询 **消息 ID**: 0x4712 `SPRAY_HAND_OPERATION_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **请求示例**: ```json { "robot": 1 } ``` ### 4.3 返回 **消息 ID**: 0x4713 `SPRAY_HAND_OPERATION_RESPOND` **返回参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | gun | int | 喷枪编号 | | sequential | int | 时序组号 | | dust | int | 除尘使能 | | paint | int | 喷漆使能 | | oilTest | int | 油量测试 | | color | int | 颜色切换 | **返回示例**: ```json { "robot": 1, "gun": 1, "sequential": 1, "dust": 0, "paint": 0, "oilTest": 0, "color": 1 } ``` ### 4.4 模拟量设置 **消息 ID**: 0x4714 `SPRAY_CUR_ANALOG_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | anaID | int | 是 | 模拟量组号 | | flow | float | 是 | 流量 | | sector | float | 是 | 扇形 | | atom | float | 是 | 雾化 | **请求示例**: ```json { "robot": 1, "anaID": 1, "flow": 1.1, "sector": 2.2, "atom": 3.3 } ``` ### 4.5 查询 **消息 ID**: 0x4715 `SPRAY_CUR_ANALOG_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | anaID | int | 是 | 模拟量组号:-1查询组号,0-99切换组号 | **请求示例**: ```json { "robot": 1, "anaID": -1 } ``` ### 4.6 返回 **消息 ID**: 0x4716 `SPRAY_CUR_ANALOG_RESPOND` **返回参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | anaID | int | 模拟量组号 | | flow | float | 流量 | | sector | float | 扇形 | | atom | float | 雾化 | **返回示例**: ```json { "robot": 1, "anaID": 1, "flow": 1.1, "sector": 2.2, "atom": 3.3 } ``` ### 4.7 油量测试时间设置 **消息 ID**: 0x4717 `SPRAY_CUR_OILTIME_SET` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | oilTime | float | 是 | 油量测试时间(秒) | **请求示例**: ```json { "robot": 1, "oilTime": 0.5 } ``` ### 4.8 查询 **消息 ID**: 0x4718 `SPRAY_CUR_OILTIME_INQUIRE` **参数说明**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **请求示例**: ```json { "robot": 1 } ``` ### 4.9 返回 **消息 ID**: 0x4719 `SPRAY_CUR_OILTIME_RESPOND` **返回参数**: | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | oilTime | float | 油量测试时间(秒) | **返回示例**: ```json { "robot": 1, "oilTime": 0.5 } ``` --- # 新版冲压工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/08.%E6%96%B0%E7%89%88%E5%86%B2%E5%8E%8B%E5%B7%A5%E8%89%BA.html ## 程序运行 ### 主界面 #### 前站料况设置 **0x8000 PUNCH_SET_WORKPIECE_CONDITION** ```json { "prev_device_num": 1, "prev_station_work_condition": 0, "local_device_num": 1, "local_station_work_condition": 0, "fixture_num": 1, "fixture_station_work_condition": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | prev_device_num | int | 前站设备号 | | prev_station_work_condition | int | 前站料况:0无料,1有料已冲,2有料未冲 | | local_device_num | int | 本站设备号 | | local_station_work_condition | int | 本站料况:0无料,1有料已冲,2有料未冲 | | fixture_num | int | 治具号 | | fixture_station_work_condition | int | 治具料况:0无料,1有料已冲,2有料未冲 | --- #### 夹具料况查询 **0x8001 PUNCH_INQUIRE_WORKPIECE_CONDITION** ```json { "prev_device_num": 1, "local_device_num": 1, "fixture_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | prev_device_num | int | 前站设备号 | | local_device_num | int | 本站设备号 | | fixture_num | int | 治具号 | --- #### 返回0x8001查询结果 **0x8002 PUNCH_RESPOND_WORKPIECE_CONDITION** ```json { "prev_device_num": 1, "prev_station_work_condition": 0, "local_device_num": 1, "local_station_work_condition": 0, "fixture_num": 1, "fixture_station_work_condition": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | prev_device_num | int | 前站设备号 | | prev_station_work_condition | int | 前站料况:0无料,1有料已冲,2有料未冲 | | local_device_num | int | 本站设备号 | | local_station_work_condition | int | 本站料况:0无料,1有料已冲,2有料未冲 | | fixture_num | int | 治具号 | | fixture_station_work_condition | int | 治具料况:0无料,1有料已冲,2有料未冲 | --- #### 控制类型设置 **0x8003 PUNCH_SET_CONTROL_MODE** ```json { "control_mode": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | control_mode | int | 控制模式:0单机,1联机 | --- #### 控制类型查询 **0x8004 PUNCH_INQUIRE_CONTROL_MODE** data:无 --- #### 控制类型返回 **0x8005 PUNCH_RESPOND_CONTROL_MODE** ```json { "control_mode": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | control_mode | int | 控制模式:0单机,1联机 | --- #### 生产数量查询 **0x8006 PUNCH_INQUIRE_PRODUCE_TARGET_WASTE_NUM** data:无 --- #### 生产数量返回 **0x8007 PUNCH_RESPOND_PRODUCE_TARGET_WASTE_NUM** ```json { "produce_num": 100, "target_num": 100, "waste_num": 100 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | produce_num | int | 当前运行次数 | | target_num | int | 目标运行次数 | | waste_num | int | 废料数目 | --- #### 生产数量清零 **0x8008 PUNCH_CLEAR_PRODUCE_TARGET_WASTE_NUM** ```json { "produce_num": 0, "target_num": 100, "waste_num": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | produce_num | int | 当前运行次数(清零为0) | | target_num | int | 目标运行次数 | | waste_num | int | 废料数目(清零为0) | --- #### 冲压使能设置 **0x8009 PUNCH_SET_SHIELD_CHECK_RUN_WITHOUT_PIECE_PUNCH_ENABLE** ```json { "punch_enable": true, "run_without_workpiece_enable": true, "shiled_check_enable": true, "simu_top_point": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | punch_enable | bool | 冲压使能 | | run_without_workpiece_enable | bool | 无料运行开关 | | shiled_check_enable | bool | 屏蔽检测开关 | | simu_top_point | bool | 虚拟上死点开关 | --- #### 冲压使能查询 **0x800A PUNCH_INQUIRE_SHIELD_CHECK_RUN_WITHOUT_PIECE_PUNCH_ENABLE** data:无 --- #### 冲压使能返回 **0x800B PUNCH_RESPOND_SHIELD_CHECK_RUN_WITHOUT_PIECE_PUNCH_ENABLE** ```json { "punch_enable": true, "run_without_workpiece_enable": true, "shiled_check_enable": true, "simu_top_point": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | punch_enable | bool | 冲压使能 | | run_without_workpiece_enable | bool | 无料运行开关 | | shiled_check_enable | bool | 屏蔽检测开关 | | simu_top_point | bool | 虚拟上死点开关 | --- #### 单机试运行 **0x800C PUNCH_SINGLE_RUN_TEST** ```json { "single_run_test": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | single_run_test | int | 单机试运行命令(固定为1) | --- #### 模内逃跑测试 **0x800D PUNCH_ESCAPE_FROM_MOULD** ```json { "escape_from_mould": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | escape_from_mould | int | 模内逃跑测试命令(固定为1) | --- #### 设置治具1,2动作 **0x800E PUNCH_SET_FIXTURE_ACTION** ```json { "fixture1_action": 0, "fixture2_action": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | fixture1_action | int | 治具1动作:0关,1开 | | fixture2_action | int | 治具2动作:0关,1开 | --- #### 查询治具1,2动作 **0x800F PUNCH_INQUIRE_FIXTURE_ACTION** data:无 --- #### 接收治具1,2动作 **0x8010 PUNCH_RESPOND_FIXTURE_ACTION** ```json { "fixture1_action": 0, "fixture2_action": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | fixture1_action | int | 治具1动作:0关,1开 | | fixture2_action | int | 治具2动作:0关,1开 | --- #### 联机状态复位 **0x8011 PUNCH_ONLINE_STATUS_RESET** ```json { "online_status_reset": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | online_status_reset | int | 联机状态复位命令(固定为1) | --- #### 暂停 **0x8012 PUNCH_JOBFILE_OPERATION** ```json { "function_num": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | function_num | int | 功能号:0启动,1暂停,2停止,3回到待机点后暂停,4清料流程 | --- ### 状态窗口 #### 运行周期 **0x8013 PUNCH_INQUIRE_RUN_STATUS** ```json { "robot": 1, "prev_puncher_num": 1, "local_puncher_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | prev_puncher_num | int | 前站冲床编号 | | local_puncher_num | int | 本站冲床编号 | --- **0x8014 PUNCH_RESPOND_RUN_STATUS** ```json { "prev_puncher_num": 1, "local_puncher_num": 1, "run_cycle": 10, "fixture_check": true, "prev_station_type": 0, "online_work_type": 0, "local_station_type": 0, "communition_status": true, "robot_sum": 0, "current_robot_num": 1, "local_top_point": true, "prev_top_point": true, "local_punch_success": true, "prev_punch_success": true, "local_workpiece_condition": 0, "prev_workpiece_condition": 0, "local_in_interfere_zone": false, "prev_in_interfere_zone": false, "in_prev_interfere_zone": false, "in_local_interfere_zone": false, "fixture_workpece_condition": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | prev_puncher_num | int | 前站冲床编号 | | local_puncher_num | int | 本站冲床编号 | | run_cycle | int | 运行周期 | | fixture_check | bool | 治具检测:true 不检测,false 正常检测 | | prev_station_type | int | 前站类型:0上料机,1放料台,2冲床,3翻转台,4空中接力 | | online_work_type | int | 联机工位:0单机,1上料,2搬运,3下料 | | local_station_type | int | 本站类型:0上料机,1放料台,2冲床,3翻转台,4空中接力 | | communition_status | bool | 通讯状态:false 通讯异常,true 通讯正常 | | robot_sum | int | 机器人总数:0,1,2,3 | | current_robot_num | int | 当前机器人编号:1,2,3 | | local_top_point | bool | 本站上死点:false off,true on | | prev_top_point | bool | 前站上死点:false off,true on | | local_punch_success | bool | 本站冲床成功:false off,true on | | prev_punch_success | bool | 前站冲床成功:false off,true on | | local_workpiece_condition | int | 本站料况:0无料,1有料未冲,2有料已冲 | | prev_workpiece_condition | int | 前站料况:0无料,1有料未冲,2有料已冲 | | local_in_interfere_zone | bool | 后站在干涉区:false off,true on | | prev_in_interfere_zone | bool | 前站在干涉区:false off,true on | | in_prev_interfere_zone | bool | 在前站干涉区:false off,true on | | in_local_interfere_zone | bool | 在本站干涉区:false off,true on | | fixture_workpece_condition | int | 抓手料况:0无料,1有料未冲,2有料已冲 | --- #### 四个弹窗 **0x8015 PUNCH_SEND_ERROR_INFO** ```json { "type": 0, "open_close": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | 类型:0取料失败,1放料失败1,2放疗失败2,3首模完成 | | open_close | int | 操作:0关闭弹窗,1弹出弹窗 | --- #### 弹窗按键 **0x8016 PUNCH_RECEIVE_ERROR_DEAL** ```json { "type": 0, "deal_method": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | 类型:0取料失败,1放料失败,2冲压失败,3人工处理,5有无料启动 | | deal_method | int | 处理方式:0重新放料/重新放料/人工冲压/人工冲压,1放弃本料/放弃本料/继续运行/继续运行 | --- ## 工艺 ### 工艺参数 #### 选中工艺号 **0x8017 PUNCH_CHOOSE_CRAFT_NUM** ```json { "current_chosed_craft_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | current_chosed_craft_num | int | 选中当前工艺号(1,2,3,4) | --- #### 应用到联机 **0x8018 PUNCH_APPLY_TO_ONLINE** ```json { "current_chosed_craft_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | current_chosed_craft_num | int | 当前选中工艺号 | --- #### 当前选中工艺号查询 **0x8019 PUNCH_INQUIRE_CURRENT_CRAFT_NUM** data:无 --- #### 当前选中工艺号返回 **0x801A PUNCH_RESPOND_CURRENT_CRAFT_NUM** ```json { "current_chosed_craft_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | current_chosed_craft_num | int | 当前选中工艺号(1,2,3,4) | --- #### 基本设置修改 **0x801B PUNCH_SET_CRAFT_BASE_PARAM** ```json { "craft_num": 1, "first_speed_percent": 100, "interp_mode": 0, "escape_speed_percent": 100, "default_program": "name" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | craft_num | int | 工艺号 | | first_speed_percent | int | 首模速度比(1-100) | | interp_mode | int | 模内逃跑插补方式:0关节,1直线 | | escape_speed_percent | int | 模内逃跑速度比(1-100) | | default_program | string | 程序名 | --- **0x801C PUNCH_INQUIRE_CRAFT_BASE_PARAM** ```json { "craft_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | craft_num | int | 工艺号 | --- **0x801D PUNCH_RESPOND_CRAFT_BASE_PARAM** ```json { "craft_num": 1, "first_speed_percent": 100, "interp_mode": 0, "escape_speed_percent": 100, "default_program": "name" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | craft_num | int | 工艺号 | | first_speed_percent | int | 首模速度比(1-100) | | interp_mode | int | 模内逃跑:0关节,1直线 | | escape_speed_percent | int | 模内逃跑速度比(1-100) | | default_program | string | 程序名 | --- #### 联机设置 **0x801E PUNCH_SET_ONLINE_PARAM** ```json { "online_station_type": 0, "next_IP": "192.168.0.120", "online_direction": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | online_station_type | int | 联机工位:0单机,1上料,2搬运,3下料 | | next_IP | string | 下站 IP | | online_direction | int | 联机方向:0反向,1正向 | --- **0x801F PUNCH_INQUIRE_ONLINE_PARAM** data:无 --- **0x8020 PUNCH_RESPOND_ONLINE_PARAM** ```json { "online_station_type": 0, "local_IP": "192.168.0.120", "next_IP": "192.168.0.120", "online_direction": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | online_station_type | int | 联机工位:0单机,1上料,2搬运,3下料 | | local_IP | string | 本站 IP | | next_IP | string | 下站 IP | | online_direction | int | 联机方向:0反向,1正向 | --- #### 通讯状态 **0x8021 PUNCH_INQUIRE_COMMU_STATUS_ROBOT_NUM** data:无 --- **0x8022 PUNCH_RESPOND_COMMU_STATUS_ROBOT_NUM** ```json { "cummunity_status": 1, "robot_sum": 1, "current_robot_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | cummunity_status | int | 通讯状态:0通讯异常,1通讯正常 | | robot_sum | int | 机器人总数 | | current_robot_num | int | 当前机器人编号 | --- #### 前站冲床联机设置 **0x8023 PUNCH_SET_PREV_STATION_PUNCHER_PARAM** ```json { "prev_station_has_puncher": 0, "puncher_num": 1, "puncher_sum": 1, "dout_fetch_finish": 0, "dout_lay_finish": 0, "prev_station_fetch_enable": 0, "prev_station_lay_enable": 0, "fetch_delay_signal": 100, "lay_delay_signal": 100, "control_punch_enable": 0, "top_point": 0, "punch_time": 100, "puncher_type": 0, "punch_singal_param": 0, "delay_reset_time": 100, "punch_timeout_time": 100, "react_timeout_time": 100, "punch_success_confirm_time": 100, "punch_mould_check": 0, "top_point_check_when_start": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | prev_station_has_puncher | int | 前站有冲床:0 off,1 on | | puncher_num | int | 冲床编号 | | puncher_sum | int | 最大冲床数 | | dout_fetch_finish | int | 输出取料完成:0 off,1 on | | dout_lay_finish | int | 输出放料完成:0 off,1 on | | prev_station_fetch_enable | int | 前站允许取料:0 off,1 on | | prev_station_lay_enable | int | 前站允许放料:0 off,1 on | | fetch_delay_signal | int | 取料迟滞信号 | | lay_delay_signal | int | 放料迟滞信号 | | control_punch_enable | int | 允许控制冲压:0 off,1 on | | top_point | int | 上死点:0 off,1 on | | punch_time | int | 冲压时长 | | puncher_type | int | 冲床类型:0,1,2,3 | | punch_singal_param | int | 冲压信号参数:0上死点复位,1延迟复位 | | delay_reset_time | int | 延迟复位时间 | | punch_timeout_time | int | 冲压超时设置 | | react_timeout_time | int | 反应超时设置 | | punch_success_confirm_time | int | 冲压成功确认时间 | | punch_mould_check | int | 冲压模内检测:0 off,1 on | | top_point_check_when_start | int | 启动时上死点检测:0 off,1 on | --- **0x8024 PUNCH_INQUIRE_PREV_STATION_PUNCHER_PARAM** ```json { "puncher_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | puncher_num | int | 冲床编号 | --- **0x8025 PUNCH_RESPOND_PREV_STATION_PUNCHER_PARAM** ```json { "prev_station_has_puncher": 0, "puncher_num": 1, "puncher_sum": 1, "dout_fetch_finish": 0, "dout_lay_finish": 0, "prev_station_fetch_enable": 0, "prev_station_lay_enable": 0, "fetch_delay_signal": 100, "lay_delay_signal": 100, "control_punch_enable": 0, "puncher_type": 0, "punch_singal_param": 0, "delay_reset_time": 100, "punch_timeout_time": 100, "react_timeout_time": 100, "punch_success_confirm_time": 100, "punch_mould_check": 0, "top_point_check_when_start": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | prev_station_has_puncher | int | 前站有冲床:0 off,1 on | | puncher_num | int | 冲床编号 | | puncher_sum | int | 最大冲床数 | | dout_fetch_finish | int | 输出取料完成:0 off,1 on | | dout_lay_finish | int | 输出放料完成:0 off,1 on | | prev_station_fetch_enable | int | 前站允许取料:0 off,1 on | | prev_station_lay_enable | int | 前站允许放料:0 off,1 on | | fetch_delay_signal | int | 取料迟滞信号 | | lay_delay_signal | int | 放料迟滞信号 | | control_punch_enable | int | 允许控制冲压:0 off,1 on | | puncher_type | int | 冲床类型:0,1,2,3 | | punch_singal_param | int | 冲压信号参数:0延迟复位,1上死点复位 | | delay_reset_time | int | 延迟复位时间 | | punch_timeout_time | int | 冲压超时设置 | | react_timeout_time | int | 反应超时设置 | | punch_success_confirm_time | int | 冲压成功确认时间 | | punch_mould_check | int | 冲压模内检测:0 off,1 on | | top_point_check_when_start | int | 启动时上死点检测:0 off,1 on | --- #### 强制冲压 **0x8026 PUNCH_FORCE_PUNCH** ```json { "puncher_num": 1, "force_punch": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | puncher_num | int | 冲床编号 | | force_punch | int | 强制冲压:0前站,1本站 | --- #### 本站冲床联机设置 ##### 本站参数设置 **0x8027 PUNCH_SET_LOCAL_STATION_PUNCHER_PARAM** ```json { "local_station_type": 1, "puncher_num": 1, "puncher_sum": 1, "puncher_type": 0, "punch_singal_param": 1, "delay_reset_time": 100, "punch_timeout_time": 100, "react_timeout_time": 100, "punch_success_confirm_time": 100, "punch_mould_check": 0, "dout_fetch_finish": 0, "dout_lay_finish": 0, "local_station_fetch_enable": 0, "local_station_lay_enable": 0, "fetch_delay_signal": 100, "lay_delay_signal": 100, "top_point_check_when_start": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | local_station_type | int | 本站类型:1放料台,2冲床,3翻转台,4空中接力 | | puncher_num | int | 冲床编号 | | puncher_sum | int | 最大冲床数 | | puncher_type | int | 冲床类型:0齿轮,1气动,2油压,3自定义 | | punch_singal_param | int | 冲压信号参数:1上死点复位,0延迟复位 | | delay_reset_time | int | 延迟复位时间 | | punch_timeout_time | int | 冲压超时设置 | | react_timeout_time | int | 反应超时设置 | | punch_success_confirm_time | int | 冲压成功确认时间 | | punch_mould_check | int | 冲压模内检测:0 off,1 on | | dout_fetch_finish | int | 输出取料完成:0 off,1 on | | dout_lay_finish | int | 输出放料完成:0 off,1 on | | local_station_fetch_enable | int | 本站允许取料:0 off,1 on | | local_station_lay_enable | int | 本站允许放料:0 off,1 on | | fetch_delay_signal | int | 取料迟滞信号 | | lay_delay_signal | int | 放料迟滞信号 | | top_point_check_when_start | int | 启动时上死点检测:0 off,1 on | --- **0x8028 PUNCH_INQUIRE_LOCAL_STATION_PUNCHER_PARAM** ```json { "puncher_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | puncher_num | int | 冲床编号 | --- **0x8029 PUNCH_RESPOND_LOCAL_STATION_PUNCHER_PARAM** ```json { "local_station_type": 1, "puncher_num": 1, "puncher_sum": 1, "force_punch": 1, "puncher_type": 0, "punch_singal_param": 0, "delay_reset_time": 100, "punch_timeout_time": 100, "react_timeout_time": 100, "punch_success_confirm_time": 100, "punch_mould_check": 0, "local_station_fetch_enable": 0, "local_station_lay_enable": 0, "fetch_delay_signal": 100, "lay_delay_signal": 100, "top_point_check_when_start": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | local_station_type | int | 本站类型:1放料台,2冲床,3翻转台,4空中接力 | | puncher_num | int | 冲床编号 | | puncher_sum | int | 最大冲床数 | | force_punch | int | 强制冲压 | | puncher_type | int | 冲床类型:0齿轮,1气动,2油压,3自定义 | | punch_singal_param | int | 冲压信号参数:0上死点复位,1延迟复位 | | delay_reset_time | int | 延迟复位时间 | | punch_timeout_time | int | 冲压超时设置 | | react_timeout_time | int | 反应超时设置 | | punch_success_confirm_time | int | 冲压成功确认时间 | | punch_mould_check | int | 冲压模内检测:0 off,1 on | | local_station_fetch_enable | int | 本站允许取料:0 off,1 on | | local_station_lay_enable | int | 本站允许放料:0 off,1 on | | fetch_delay_signal | int | 取料迟滞信号 | | lay_delay_signal | int | 放料迟滞信号 | | top_point_check_when_start | int | 启动时上死点检测:0 off,1 on | --- #### 投料机参数设置 **0x802A PUNCH_SET_FEEDER_PARAM** ```json { "feeder_signal_type": 0, "feeder_send_piece_to_puncher": 0, "request_call_feed_enable": 0, "request_call_feed_timeout": 100, "request_call_feed_continued_time": 100 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | feeder_signal_type | int | 投料机信号类型:0上升沿,1常通信号,2不检测 | | feeder_send_piece_to_puncher | int | 投料机将料送到冲床:0 off,1 on | | request_call_feed_enable | int | 启用呼叫投料:0 off,1 on | | request_call_feed_timeout | int | 呼叫投料超时设置 | | request_call_feed_continued_time | int | 呼叫投料延时时间 | --- **0x802B PUNCH_INQUIRE_FEEDER_PARAM** data:无 --- **0x802C PUNCH_RESPOND_FEEDER_PARAM** ```json { "feeder_signal_type": 0, "feeder_send_piece_to_puncher": 0, "request_call_feed_enable": 0, "request_call_feed_timeout": 100, "request_call_feed_continued_time": 100 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | feeder_signal_type | int | 投料机信号类型:0上升沿,1常通信号,2不检测 | | feeder_send_piece_to_puncher | int | 投料机将料送到冲床:0 off,1 on | | request_call_feed_enable | int | 启用呼叫投料:0 off,1 on | | request_call_feed_timeout | int | 呼叫投料超时设置 | | request_call_feed_continued_time | int | 呼叫投料延时时间 | --- #### 测试 **0x802D PUNCH_REQUEST_FEEDING_TEST** ```json { "start_test": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | start_test | int | 开始测试(固定为1) | --- ### IO 设置 #### 修改保存 **0x802E PUNCH_SET_IO_PORT_VALUE** ```json { "prev_station_puncher_top_point": [[0, 1], [0, 1]], "local_station_puncher_top_point": [[0, 1], [0, 1]], "prev_station_puncher_bottom_point": [[0, 1], [0, 1]], "local_station_puncher_bottom_point": [[0, 1], [0, 1]], "prev_station_puncher_emergency_stop": [[0, 1], [0, 1]], "local_station_puncher_emergency_stop": [[0, 1], [0, 1]], "puncher_check_mould": [[0, 1], [0, 1]], "prev_once_punch_check": [[0, 1], [0, 1]], "local_once_punch_check": [[0, 1], [0, 1]], "fixture_check_one": [[0, 1]], "fixture_check_two": [[0, 1]], "feed_signal": [[0, 1]], "prev_station_fetch_enable": [[0, 1]], "local_station_lay_enable": [[0, 1]], "in_standby1": [[0, 1]], "in_standby2": [[0, 1]], "in_standby3": [[0, 1]], "in_standby4": [[0, 1]], "prev_station_punch_signal": [[0, 1], [0, 1]], "local_station_punch_signal": [[0, 1], [0, 1]], "emergency_stop_prev_station_puncher": [[0, 1], [0, 1]], "emergency_stop_local_station_puncher": [[0, 1], [0, 1]], "fixture1": [[0, 1]], "fixture2": [[0, 1]], "request_feed": [[0, 1]], "turn_table_fetch_success": [[0, 1]], "turn_table_lay_success": [[0, 1]], "prev_station_interfere_zone": [[0, 1]], "local_station_interfere_zone": [[0, 1]], "fixture_standby1": [[0, 1]], "fixture_standby2": [[0, 1]], "out_standby1": [[0, 1]], "out_standby2": [[0, 1]], "out_standby3": [[0, 1]], "out_standby4": [[0, 1]] } ``` > **说明:** 数组第0位为 port(范围0-16),数组第1位为 value(范围0或1) **输入信号:** | 参数名 | 说明 | |--------|------| | prev_station_puncher_top_point | 冲床上死点前站 | | local_station_puncher_top_point | 冲床上死点本站 | | prev_station_puncher_bottom_point | 冲床下死点前站 | | local_station_puncher_bottom_point | 冲床下死点本站 | | prev_station_puncher_emergency_stop | 冲床急停前站 | | local_station_puncher_emergency_stop | 冲床急停本站 | | puncher_check_mould | 冲床模内检测 | | prev_once_punch_check | 前站单次冲压检测 | | local_once_punch_check | 本站单次冲压检测 | | fixture_check_one | 治具检验一 | | fixture_check_two | 治具检验二 | | feed_signal | 投料信号 | | prev_station_fetch_enable | 前站允许取料 | | local_station_lay_enable | 本站允许放料 | | in_standby1 | 辅助输入1 | | in_standby2 | 辅助输入2 | | in_standby3 | 辅助输入3 | | in_standby4 | 辅助输入4 | **输出信号:** | 参数名 | 说明 | |--------|------| | prev_station_punch_signal | 冲压信号前站 | | local_station_punch_signal | 冲压信号本站 | | emergency_stop_prev_station_puncher | 急停冲床前站 | | emergency_stop_local_station_puncher | 急停冲床本站 | | fixture1 | 治具1 | | fixture2 | 治具2 | | request_feed | 请求投料 | | turn_table_fetch_success | 翻转台取料成功 | | turn_table_lay_success | 翻转台放料成功 | | prev_station_interfere_zone | 前站干涉区输出 | | local_station_interfere_zone | 本站干涉区输出 | | fixture_standby1 | 治具辅助选择一 | | fixture_standby2 | 治具辅助选择二 | | out_standby1 | 辅助输出1 | | out_standby2 | 辅助输出2 | | out_standby3 | 辅助输出3 | | out_standby4 | 辅助输出4 | --- **0x802F PUNCH_INQUIRE_IO_PORT_VALUE** data:无 --- **0x8030 PUNCH_RESPOND_IO_PORT_VALUE** 同0x802E --- #### IO 状态 **0x8031 PUNCH_MODIFY_IO_OUT_STATUS_VALUE** ```json { "modify_port": 0, "puncher_num": 1, "value": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | modify_port | int | 辅助输出端口号(1.2.3.4...) | | puncher_num | int | 冲床编号(1,2,3,4) | | value | int | 值(0或1) | --- **0x8032 PUNCH_INQUIRE_IO_PORT_VALUE_STATUS** data:无 --- **0x8033 PUNCH_RESPOND_IO_PORT_VALUE_STATUS** ```json { "prev_station_puncher_top_point": [[0, 1], [0, 1]], "local_station_puncher_top_point": [[0, 1], [0, 1]], "prev_station_puncher_bottom_point": [[0, 1], [0, 1]], "local_station_puncher_bottom_point": [[0, 1], [0, 1]], "prev_station_puncher_emergency_stop": [[0, 1], [0, 1]], "local_station_puncher_emergency_stop": [[0, 1], [0, 1]], "puncher_check_mould": [[0, 1]], "fixture_check_one": [[0, 1]], "fixture_check_two": [[0, 1]], "feed_signal": [[0, 1]], "prev_station_fetch_enable": [[0, 1]], "local_station_lay_enable": [[0, 1]], "in_standby1": [[0, 1]], "in_standby2": [[0, 1]], "in_standby3": [[0, 1]], "in_standby4": [[0, 1]], "prev_once_punch_check": [[0, 1]], "local_once_punch_check": [[0, 1]], "prev_station_punch_signal": [[0, 1], [0, 1]], "local_station_punch_signal": [[0, 1], [0, 1]], "emergency_stop_prev_station_puncher": [[0, 1], [0, 1]], "emergency_stop_local_station_puncher": [[0, 1], [0, 1]], "fixture1": [[0, 1]], "fixture2": [[0, 1]], "request_feed": [[0, 1]], "turn_table_fetch_success": [[0, 1]], "turn_table_lay_success": [[0, 1]], "prev_station_interfere_zone": [[0, 1]], "local_station_interfere_zone": [[0, 1]], "fixture_standby1": [[0, 1]], "fixture_standby2": [[0, 1]], "out_standby1": [[0, 1]], "out_standby2": [[0, 1]], "out_standby3": [[0, 1]], "out_standby4": [[0, 1]] } ``` > **说明:** 数组第0位为 port(范围0-16),数组第1位为 value(范围0或1) --- ## 干涉区 ### 标记干涉区 **0x8034 PUNCH_SIGN_INTERFERE_ZONE** ```json { "interfere_zone_sign": "prev_interfere_zone" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | interfere_zone_sign | string | 标记干涉区:prev_interfere_zone(前站冲床),local_interfere_zone(本站冲床) | --- ### 返回标记结果 **0x8035 PUNCH_RESPOND_SIGN_INTERFERE_ZONE** ```json { "interfere_zone_sign": "prev_interfere_zone", "prev_station_interfere_zone_X": 0.0, "prev_station_interfere_zone_Y": 0.0, "local_station_interfere_zone_X": 0.0, "local_station_interfere_zone_Y": 0.0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | interfere_zone_sign | string | 标记干涉区:prev_interfere_zone(前站冲床),local_interfere_zone(本站冲床) | | prev_station_interfere_zone_X | float | 前站干涉区 X 坐标 | | prev_station_interfere_zone_Y | float | 前站干涉区 Y 坐标 | | local_station_interfere_zone_X | float | 本站干涉区 X 坐标 | | local_station_interfere_zone_Y | float | 本站干涉区 Y 坐标 | --- ### 保存数值 **0x8036 PUNCH_SET_INTERFERE_ZONE_VALUE** ```json { "interfere_zone_enable": 0, "prev_station_x_min": 1.1, "prev_station_x_max": 2.2, "prev_station_y_min": 3.3, "prev_station_y_max": 4.4, "local_station_x_min": 5.5, "local_station_x_max": 6.6, "local_station_y_min": 7.7, "local_station_y_max": 8.8 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | interfere_zone_enable | int | 干涉区使能(0或1) | | prev_station_x_min | float | 前站干涉区 x 最小 | | prev_station_x_max | float | 前站干涉区 x 最大 | | prev_station_y_min | float | 前站干涉区 y 最小 | | prev_station_y_max | float | 前站干涉区 y 最大 | | local_station_x_min | float | 本站干涉区 x 最小 | | local_station_x_max | float | 本站干涉区 x 最大 | | local_station_y_min | float | 本站干涉区 y 最小 | | local_station_y_max | float | 本站干涉区 y 最大 | --- **0x8037 PUNCH_INQUIRE_INTERFERE_ZONE_VALUE** data:无 --- **0x8038 PUNCH_RESPOND_INTERFERE_ZONE_VALUE** ```json { "interfere_zone_enable": 0, "prev_station_x_min": 0.0, "prev_station_x_max": 0.0, "prev_station_y_min": 0.0, "prev_station_y_max": 0.0, "local_station_x_min": 0.0, "local_station_x_max": 0.0, "local_station_y_min": 0.0, "local_station_y_max": 0.0 } ``` > **说明:** -9999表示未标记 | 参数名 | 类型 | 说明 | |--------|------|------| | interfere_zone_enable | int | 干涉区使能(0或1) | | prev_station_x_min | float | 前站干涉区 x 最小 | | prev_station_x_max | float | 前站干涉区 x 最大 | | prev_station_y_min | float | 前站干涉区 y 最小 | | prev_station_y_max | float | 前站干涉区 y 最大 | | local_station_x_min | float | 本站干涉区 x 最小 | | local_station_x_max | float | 本站干涉区 x 最大 | | local_station_y_min | float | 本站干涉区 y 最小 | | local_station_y_max | float | 本站干涉区 y 最大 | --- ### 治具设置 **0x8039 PUNCH_SET_FIXTURE_PARAM** ```json { "fetch_before_time": 100.0, "lay_before_time": 100.0, "fixture1_type": 0, "fixture1_open_delay_error_report_time": 100.0, "fixture1_close_delay_error_report_time": 100.0, "fixture2_type": 0, "fixture2_open_delay_error_report_time": 100.0, "fixture2_close_delay_error_report_time": 100.0, "standby1": 0, "standby1_keep_time": 100.0, "standby2": 0, "standby2_keep_time": 100.0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | fetch_before_time | float | 取料前置延时 | | lay_before_time | float | 放料前置延时 | | fixture1_type | int | 治具一类型选择:0吸盘,1电磁铁,2气缸 | | fixture1_open_delay_error_report_time | float | 治具一通延迟报警 | | fixture1_close_delay_error_report_time | float | 治具一断延迟报警 | | fixture2_type | int | 治具二类型选择:0吸盘,1电磁铁,2气缸 | | fixture2_open_delay_error_report_time | float | 治具二通延迟报警 | | fixture2_close_delay_error_report_time | float | 治具二断延迟报警 | | standby1 | int | 辅助选择一:0不启用,1启用 | | standby1_keep_time | float | 辅助点一持续时间 | | standby2 | int | 辅助选择二:0不启用,1启用 | | standby2_keep_time | float | 辅助点二持续时间 | --- **0x803A PUNCH_INQUIRE_FIXTURE_PARAM** data:无 --- **0x803B PUNCH_RESPOND_FIXTURE_PARAM** ```json { "fetch_before_time": 100.0, "lay_before_time": 100.0, "fixture1_type": 0, "fixture1_open_delay_error_report_time": 100.0, "fixture1_close_delay_error_report_time": 100.0, "fixture2_type": 0, "fixture2_open_delay_error_report_time": 100.0, "fixture2_close_delay_error_report_time": 100.0, "standby1": 0, "standby1_keep_time": 100.0, "standby2": 0, "standby2_keep_time": 100.0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | fetch_before_time | float | 取料前置延时 | | lay_before_time | float | 放料前置延时 | | fixture1_type | int | 治具一类型选择:0吸盘,1电磁铁,2气缸 | | fixture1_open_delay_error_report_time | float | 治具一通延迟报警 | | fixture1_close_delay_error_report_time | float | 治具一断延迟报警 | | fixture2_type | int | 治具二类型选择:0吸盘,1电磁铁,2气缸 | | fixture2_open_delay_error_report_time | float | 治具二通延迟报警 | | fixture2_close_delay_error_report_time | float | 治具二断延迟报警 | | standby1 | int | 辅助选择一:0不启用,1启用 | | standby1_keep_time | float | 辅助点一持续时间 | | standby2 | int | 辅助选择二:0不启用,1启用 | | standby2_keep_time | float | 辅助点二持续时间 | --- ## 冲压工艺 ### 新建模板 #### 确定 **0x803C PUNCH_CREATE_TEMPLATE** ```json { "new_template_name": "name", "use_ext": false, "use_pallet": false, "pallet_type": 0, "pallet_ID": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | new_template_name | string | 程序名 | | use_ext | bool | 外部轴使能 | | use_pallet | bool | 码垛使能 | | pallet_type | int | 码垛类型:0前站码垛,1本站码垛 | | pallet_ID | int | 码垛工艺号 | --- ### 模板编辑2 #### 总确定 **0x803D PUNCH_CONFIRM_CREATE_TEMPLATE** ```json { "create_confirm": 1, "pick_keep_time": 10, "lay_keep_time": 10 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | create_confirm | int | 确认创建(固定为1) | | pick_keep_time | int | 取料点持续时间(ms) | | lay_keep_time | int | 放料点持续时间(ms) | --- **0x803E PUNCH_INQUIRE_PICK_LAY_DELAY_TIME** data:无 --- **0x803F PUNCH_RESPOND_PICK_LAY_DELAY_TIME** ```json { "pick_keep_time": 10, "lay_keep_time": 10, "pallet_type": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | pick_keep_time | int | 取料点持续时间(ms) | | lay_keep_time | int | 放料点持续时间(ms) | | pallet_type | int | 码垛类型:0前站码垛,1本站码垛 | --- ### 轨迹参数设置 **0x8040 PUNCH_SAVE_TRAJECTORY_PARAM** ```json { "traj_num": 1, "interp_mode": 0, "vel": 10, "pl": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | traj_num | int | 轨迹号 | | interp_mode | int | 插补方式:0关节,1直线 | | vel | int | 速度(%) | | pl | int | 平滑度 | --- ### 轨迹参数查询 **0x8041 PUNCH_INQUIRE_TRAJECTORY_PARAM** ```json { "traj_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | traj_num | int | 轨迹号 | --- ### 轨迹参数接收 **0x8042 PUNCH_RESPOND_TRAJECTORY_PARAM** ```json { "interp_mode": 0, "vel": 10, "pl": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | interp_mode | int | 插补方式:0关节,1直线 | | vel | int | 速度(%) | | pl | int | 平滑度 | --- ### 标记点位 **0x8043 PUNCH_SIGN_CHOSED_POS_VALUE** ```json { "chosed_pos_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | chosed_pos_num | int | 点位编号:1取料待机,2取料上方,3取料点,4放料待机,5放料上方,6放料点 | --- ### 选中点位坐标查询 **0x8044 PUNCH_INQUIRE_CHOSED_POS_VALUE** ```json { "chosed_pos_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | chosed_pos_num | int | 点位编号:1取料待机,2取料上方,3取料点,4放料待机,5放料上方,6放料点 | --- ### 选中点位坐标返回 **0x8045 PUNCH_RESPOND_CHOSED_POS_VALUE** ```json { "chosed_pos_num": 1, "pos_value": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "ext_pos_value": [0.0, 0.0, 0.0, 0.0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | chosed_pos_num | int | 点位编号:1取料待机,2取料上方,3取料点,4放料待机,5放料上方,6放料点 | | pos_value | array | 位置坐标值 | | ext_pos_value | array | 外部轴位置坐标值 | --- ### 移动到选中点位 **0x8046 PUNCH_MOVE_TO_POS** ```json { "chosed_pos_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | chosed_pos_num | int | 点位编号:1取料待机,2取料上方,3取料点,4放料待机,5放料上方,6放料点 | --- ### 取消 **0x8047 PUNCH_CANCLE_CREATE_TEMPLATE** ```json { "cancle": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | cancle | int | 取消创建(固定为1) | --- ### 模板指令 (指令编辑同作业文件:插入、修改、删除、操作、变量) --- ### 辅助程序编辑 #### 模板编辑1 **0x804A PUNCH_TRANSFER_TEMPLATE_JOBFILE** ```json { "old_name": "old_name", "new_name": "new_name" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | old_name | string | 原程序名 | | new_name | string | 新程序名 | --- **0x804B PUNCH_TRANSFER_TEMPLATE_JOBFILE** ```json { "modify": 1, "jobfile_name": "name", "pick_keep_time": 10, "lay_keep_time": 10 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | modify | int | 修改标识(固定为1) | | jobfile_name | string | 程序名 | | pick_keep_time | int | 取料点持续时间 | | lay_keep_time | int | 放料点持续时间 | --- **0x804C INQUIRE** ```json { "puncher_num": 1, "prev_local_station": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | puncher_num | int | 冲床编号 | | prev_local_station | int | 前站本站:0前站,1本站 | --- **0x804D RESPOND** ```json { "puncher_num": 1, "prev_local_station": 0, "top_point": 0, "punch_time": 100 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | puncher_num | int | 冲床编号 | | prev_local_station | int | 前站本站:0前站,1本站 | | top_point | int | 上死点(0或1) | | punch_time | int | 冲压时长 | --- ### 可变气缸设置 **0x804E SET** ```json { "trigger_conditions": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "reset_mode": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "trigger_delay_time": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "reset_delay_time": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "trigger_puncher_num": [1, 2, 3, 4, 1, 1, 1, 1, 1, 1], "reset_puncher_num": [1, 2, 3, 4, 1, 1, 1, 1, 1, 1], "port": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "value": [1, 1, 1, 1, 1, 1, 1, 0, 1, 1], "enable": [true, true, true, true, true, true, true, true, true, false] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | trigger_conditions | array | 触发条件 | | reset_mode | array | 复位方式 | | trigger_delay_time | array | 触发延时 | | reset_delay_time | array | 复位延时 | | trigger_puncher_num | array | 触发冲床号 | | reset_puncher_num | array | 复位冲床号 | | port | array | IO 端口 | | value | array | 有效值 | | enable | array | 使能开关 | --- **0x804F INQUIRE** data:无 --- **0x8050 RESPOND** ```json { "trigger_puncher_num": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "reset_puncher_num": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "trigger_conditions": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "reset_mode": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "trigger_delay_time": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "reset_delay_time": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "port": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "value": [1, 1, 1, 1, 1, 1, 1, 0, 1, 1], "enable": [true, true, true, true, true, true, true, true, true, false] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | trigger_puncher_num | array | 触发冲床号 | | reset_puncher_num | array | 复位冲床号 | | trigger_conditions | array | 触发条件 | | reset_mode | array | 复位方式 | | trigger_delay_time | array | 触发延时 | | reset_delay_time | array | 复位延时 | | port | array | IO 端口 | | value | array | 有效值 | | enable | array | 使能开关 | --- ### 程序运行阶段监控 **0x8051 查询** data:无 --- **0x8052 回复** ```json { "program": "QQQ", "stage": "本站放料前处理", "judge": [ {"后机不在干涉区": true, "放料迟滞时间": false, "本站在上死点": true}, {"放料迟滞时间": false, "本站在上死点": false, "本站料已取": true} ] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | program | string | 程序名 | | stage | string | 当前阶段 | | judge | array | 判断条件列表 | --- ### 总线类型设置 **0x8101** ```json { "bustype": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | bustype | int | 总线类型:0 EtherCAT,1 canOpen | --- **0x8102 查询** data:无 --- **0x8103 回复** ```json { "bustype": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | bustype | int | 总线类型:0 EtherCAT,1 canOpen | --- ### canOpen 通讯参数设置 **0x8104** ```json { "canopen_servo": 0, "canopen_sum": 1, "canopen_cycle": 1, "canopen_baudrate": "500K" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | canopen_servo | int | 舵机数量(0-3) | | canopen_sum | int | 总数(1-7) | | canopen_cycle | int | 周期(1,2,4,8,16) | | canopen_baudrate | string | 波特率(500K) | --- **0x8105 查询** data:无 --- **0x8106 回复** ```json { "canopen_servo": 0, "canopen_sum": 1, "canopen_cycle": 1, "canopen_baudrate": "500K" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | canopen_servo | int | 舵机数量(0-3) | | canopen_sum | int | 总数(1-7) | | canopen_cycle | int | 周期(1,2,4,8,16) | | canopen_baudrate | string | 波特率(500K) | --- ### 传感器参数设置 **0x8111** ```json { "detect_enable": true, "switch_modify_value_by_recorded": true, "back_off_distance": 10.0, "back_off_vel": 10.0, "back_off_acc": 10.0, "rated_Fx_positive": 10.0, "rated_Fy_positive": 10.0, "rated_Fz_positive": 10.0, "rated_Mx_positive": 10.0, "rated_My_positive": 10.0, "rated_Mz_positive": 10.0, "rated_Fx_negative": 10.0, "rated_Fy_negative": 10.0, "rated_Fz_negative": 10.0, "rated_Mx_negative": 10.0, "rated_My_negative": 10.0, "rated_Mz_negative": 10.0, "enable_Fx": false, "enable_Fy": false, "enable_Fz": false, "enable_Mx": false, "enable_My": false, "enable_Mz": false, "rated_Fx_positive_GD_num": 1, "rated_Fy_positive_GD_num": 1, "rated_Fz_positive_GD_num": 1, "rated_Tx_positive_GD_num": 1, "rated_Ty_positive_GD_num": 1, "rated_Tz_positive_GD_num": 1, "rated_Fx_negative_GD_num": 1, "rated_Fy_negative_GD_num": 1, "rated_Fz_negative_GD_num": 1, "rated_Tx_negative_GD_num": 1, "rated_Ty_negative_GD_num": 1, "rated_Tz_negative_GD_num": 1, "actual_Fx_GD_num": 1, "actual_Fy_GD_num": 1, "actual_Fz_GD_num": 1, "actual_Tx_GD_num": 1, "actual_Ty_GD_num": 1, "actual_Tz_GD_num": 1, "rFx_Zero_without_load_GD_num": 1, "rFy_Zero_without_load_GD_num": 1, "rFz_Zero_without_load_GD_num": 1, "rTx_Zero_without_load_GD_num": 1, "rTy_Zero_without_load_GD_num": 1, "rTz_Zero_without_load_GD_num": 1, "rFx_Zero_with_load_GD_num": 1, "rFy_Zero_with_load_GD_num": 1, "rFz_Zero_with_load_GD_num": 1, "rTx_Zero_with_load_GD_num": 1, "rTy_Zero_with_load_GD_num": 1, "rTz_Zero_with_load_GD_num": 1, "rFx_qupi_GD_num": 1, "rFy_qupi_GD_num": 1, "rFz_qupi_GD_num": 1, "rTx_qupi_GD_num": 1, "rTy_qupi_GD_num": 1, "rTz_qupi_GD_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | detect_enable | bool | 检测使能 | | switch_modify_value_by_recorded | bool | 按记录值修改开关 | | back_off_distance | float | 回退距离 | | back_off_vel | float | 回退速度 | | back_off_acc | float | 回退加速度 | | rated_Fx_positive | float | Fx 正向额定值 | | rated_Fy_positive | float | Fy 正向额定值 | | rated_Fz_positive | float | Fz 正向额定值 | | rated_Mx_positive | float | Mx 正向额定值 | | rated_My_positive | float | My 正向额定值 | | rated_Mz_positive | float | Mz 正向额定值 | | rated_Fx_negative | float | Fx 负向额定值 | | rated_Fy_negative | float | Fy 负向额定值 | | rated_Fz_negative | float | Fz 负向额定值 | | rated_Mx_negative | float | Mx 负向额定值 | | rated_My_negative | float | My 负向额定值 | | rated_Mz_negative | float | Mz 负向额定值 | | enable_Fx | bool | Fx 使能 | | enable_Fy | bool | Fy 使能 | | enable_Fz | bool | Fz 使能 | | enable_Mx | bool | Mx 使能 | | enable_My | bool | My 使能 | | enable_Mz | bool | Mz 使能 | | rated_Fx_positive_GD_num | int | Fx 正向额定值 GD 编号 | | rated_Fy_positive_GD_num | int | Fy 正向额定值 GD 编号 | | rated_Fz_positive_GD_num | int | Fz 正向额定值 GD 编号 | | rated_Tx_positive_GD_num | int | Tx 正向额定值 GD 编号 | | rated_Ty_positive_GD_num | int | Ty 正向额定值 GD 编号 | | rated_Tz_positive_GD_num | int | Tz 正向额定值 GD 编号 | | rated_Fx_negative_GD_num | int | Fx 负向额定值 GD 编号 | | rated_Fy_negative_GD_num | int | Fy 负向额定值 GD 编号 | | rated_Fz_negative_GD_num | int | Fz 负向额定值 GD 编号 | | rated_Tx_negative_GD_num | int | Tx 负向额定值 GD 编号 | | rated_Ty_negative_GD_num | int | Ty 负向额定值 GD 编号 | | rated_Tz_negative_GD_num | int | Tz 负向额定值 GD 编号 | | actual_Fx_GD_num | int | 实际 Fx GD 编号 | | actual_Fy_GD_num | int | 实际 Fy GD 编号 | | actual_Fz_GD_num | int | 实际 Fz GD 编号 | | actual_Tx_GD_num | int | 实际 Tx GD 编号 | | actual_Ty_GD_num | int | 实际 Ty GD 编号 | | actual_Tz_GD_num | int | 实际 Tz GD 编号 | | rFx_Zero_without_load_GD_num | int | 无负载 Fx 零点 GD 编号 | | rFy_Zero_without_load_GD_num | int | 无负载 Fy 零点 GD 编号 | | rFz_Zero_without_load_GD_num | int | 无负载 Fz 零点 GD 编号 | | rTx_Zero_without_load_GD_num | int | 无负载 Tx 零点 GD 编号 | | rTy_Zero_without_load_GD_num | int | 无负载 Ty 零点 GD 编号 | | rTz_Zero_without_load_GD_num | int | 无负载 Tz 零点 GD 编号 | | rFx_Zero_with_load_GD_num | int | 带负载 Fx 零点 GD 编号 | | rFy_Zero_with_load_GD_num | int | 带负载 Fy 零点 GD 编号 | | rFz_Zero_with_load_GD_num | int | 带负载 Fz 零点 GD 编号 | | rTx_Zero_with_load_GD_num | int | 带负载 Tx 零点 GD 编号 | | rTy_Zero_with_load_GD_num | int | 带负载 Ty 零点 GD 编号 | | rTz_Zero_with_load_GD_num | int | 带负载 Tz 零点 GD 编号 | | rFx_qupi_GD_num | int | 去皮 Fx GD 编号 | | rFy_qupi_GD_num | int | 去皮 Fy GD 编号 | | rFz_qupi_GD_num | int | 去皮 Fz GD 编号 | | rTx_qupi_GD_num | int | 去皮 Tx GD 编号 | | rTy_qupi_GD_num | int | 去皮 Ty GD 编号 | | rTz_qupi_GD_num | int | 去皮 Tz GD 编号 | --- **0x8112 查询** data:无 --- **0x8113 回复** (参数同0x8111设置) --- ### 传感器实际值查询 **0x8114** data:无 --- **0x8115 回复** ```json { "actual_value": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | actual_value | array | 实际力矩值列表 | --- ### 标记和查询空载力矩值 **0x8116** ```json { "sign": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | sign | bool | 标记标识 | --- **0x8117 回复** ```json { "sign_value_without_load": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | sign_value_without_load | array | 空载力矩值 | --- ### 标记和查询带载力矩值 **0x8118** ```json { "sign": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | sign | bool | 标记标识 | --- **0x8119 回复** ```json { "sign_value_with_load": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | sign_value_with_load | array | 带载力矩值 | --- ### 设置去皮使能 **0x811C** ```json { "switch_modify_value_by_recorded": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | switch_modify_value_by_recorded | bool | 按记录值修改开关 | --- **0x811D 查询** data:无 --- **0x811E 回复** ```json { "switch_modify_value_by_recorded": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | switch_modify_value_by_recorded | bool | 按记录值修改开关 | --- ### 传感器去皮值查询 **0x8121** data:无 --- **0x8122 回复** ```json { "qupi_value": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | qupi_value | array | 去皮值 | --- ### 设置其他参数 **0x8123** ```json { "filter_param_Q": 0.0001, "filter_param_R": 0.1, "force_sensor_sign_value_without_load_data_time": 500, "force_sensor_sign_value_with_load_data_time": 500, "force_sensor_sign_value_without_load_data_range": 0.5, "force_sensor_sign_value_with_load_data_range": 0.5 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | filter_param_Q | float | 滤波参数 Q | | filter_param_R | float | 滤波参数 R | | force_sensor_sign_value_without_load_data_time | int | 空载力矩标记数据时间(ms) | | force_sensor_sign_value_with_load_data_time | int | 带载力矩标记数据时间(ms) | | force_sensor_sign_value_without_load_data_range | float | 空载力矩标记数据范围 | | force_sensor_sign_value_with_load_data_range | float | 带载力矩标记数据范围 | --- **0x8124 查询** data:无 --- **0x8125 回复** (参数同0x8123设置) --- ### 标记床板水平位置 **0x8126** data:无 --- **0x8127 查询是否已标记床板水平位置** data:无 --- **0x8128 回复** ```json { "already_sign_standard_pos": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | already_sign_standard_pos | bool | 是否已标记床板水平位置 | --- ### 查询当前床板姿态值 **0x8129** data:无 --- **0x812A 回复** ```json { "pos_A_degree": 18, "pos_B_degree": 20 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | pos_A_degree | int | 床板姿态 A 角度 | | pos_B_degree | int | 床板姿态 B 角度 | --- ### 生成传感器数据文件 **0x812B** data:无 --- ### 设置负载参数 **0x8130** ```json { "payload_enable": true, "axis1_rated_torq": 0.5, "axis2_rated_torq": 0.5, "axis3_rated_torq": 0.5, "axis4_rated_torq": 0.5, "axis5_rated_torq": 0.5, "axis6_rated_torq": 0.5, "payload_num": 1, "payload_mass": 3.1, "payload_X": 78.5, "payload_Y": 78.5, "payload_Z": 78.5, "payload_name": "name" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | payload_enable | bool | 负载使能 | | axis1_rated_torq | float | 轴1额定扭矩 | | axis2_rated_torq | float | 轴2额定扭矩 | | axis3_rated_torq | float | 轴3额定扭矩 | | axis4_rated_torq | float | 轴4额定扭矩 | | axis5_rated_torq | float | 轴5额定扭矩 | | axis6_rated_torq | float | 轴6额定扭矩 | | payload_num | int | 负载编号(1-10) | | payload_mass | float | 负载质量 | | payload_X | float | 负载 X 坐标 | | payload_Y | float | 负载 Y 坐标 | | payload_Z | float | 负载 Z 坐标 | | payload_name | string | 负载名称 | --- **0x8131 查询** data:无 --- **0x8132 回复** (参数同0x8130设置) --- ### 查询某编号负载参数 **0x8133** ```json { "payload_num": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | payload_num | int | 负载编号(1-10) | --- **0x8134 回复** ```json { "payload_num": 1, "payload_mass": 3.1, "payload_X": 78.5, "payload_Y": 78.5, "payload_Z": 78.5, "payload_name": "name" } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | payload_num | int | 负载编号 | | payload_mass | float | 负载质量 | | payload_X | float | 负载 X 坐标 | | payload_Y | float | 负载 Y 坐标 | | payload_Z | float | 负载 Z 坐标 | | payload_name | string | 负载名称 | --- ### 设置自适应加减速度参数 **0x8140** ```json { "auto_modify_acc_enable": true, "arm_inertia": [0.0, 0.0, 0.0], "joint1_mass": 5.5, "joint2_mass": 0.153, "joint1_mass_center_to_motor_distance": 0.05, "joint2_mass_center_to_motor_distance": 0.05 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | auto_modify_acc_enable | bool | 自适应加减速度使能 | | arm_inertia | array | 臂惯性 | | joint1_mass | float | 关节1质量 | | joint2_mass | float | 关节2质量 | | joint1_mass_center_to_motor_distance | float | 关节1质心到电机距离 | | joint2_mass_center_to_motor_distance | float | 关节2质心到电机距离 | --- **0x8141 查询** data:无 --- **0x8142 回复** (参数同0x8140设置) --- ### 设置自适应加减速度负载参数 **0x8143** ```json { "payload_mass": true, "payload_inertia": 0.0, "payload_mass_center_X": 5.5, "payload_mass_center_Y": 0.153, "payload_mass_center_Z": 0.05 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | payload_mass | bool | 负载质量使能 | | payload_inertia | float | 负载惯性 | | payload_mass_center_X | float | 负载质心 X | | payload_mass_center_Y | float | 负载质心 Y | | payload_mass_center_Z | float | 负载质心 Z | --- **0x8144 查询** data:无 --- **0x8145 回复** (参数同0x8143设置) --- # 传送带跟踪 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/09.%E4%BC%A0%E9%80%81%E5%B8%A6%E8%B7%9F%E8%B8%AA.html ## 传送带参数 ### 设置传送带参数 **0x4801 TRACK_CONVEYOR_CONVEYORPARAM_SET** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | conveyorID | int | 传送带工艺号 | | robot | int | 机器人编号 | | compensation.encoderVal | double | 跟踪补偿编码器值 | | compensation.time | double | 跟踪补偿时间 | | conveyor.encoderDirection | int | 编码器方向:1-正向;-1-反向 | | conveyor.encoderResolution | double | 编码器分辨率 | | conveyor.maxEncoderVal | double | 编码器计数最大值 | | conveyor.minEncoderVal | double | 编码器计数最小值 | | conveyor.posRecordMode | int | 传送带位置模式:0-编码器;1-恒速设置 | | conveyor.speed | double | 当传送带位置模式为恒速设置时的速度 | | conveyor.userCoord | int | 用户坐标系1~9 | | track.height | int | 追踪目标高度:0-传感器感知;1-跟踪指令示教 | | track.track_on_run_mode_with_target_overrun | int | 目标超限运行方式:0-等待下一个目标;1-跳行到跟踪结束运行 | ```json { "compensation": { "encoderVal": 66, "time": 10.0 }, "conveyor": { "encoderDirection": 1, "encoderResolution": 44.330, "maxEncoderVal": 2147483647.0, "minEncoderVal": -2147483648.0, "posRecordMode": 0, "speed": 9.0, "userCoord": 4 }, "conveyorID": 1, "robot": 1, "track": { "height": 1, "track_on_run_mode_with_target_overrun": 1 } } ``` ### 查询传送带参数 **0x4802 TRACK_CONVEYOR_CONVEYORPARAM_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 返回传送带参数 **0x4803 TRACK_CONVEYOR_CONVEYORPARAM_RESPOND** 响应参数(字段说明参见0x4801): ```json { "compensation": { "encoderVal": 88, "time": 40.0 }, "conveyor": { "encoderDirection": -1, "encoderResolution": 44.0, "encoderValue": 0.0, "maxEncoderVal": 2147483612.0, "minEncoderVal": -2147483612.0, "posRecordMode": 0, "speed": 0.0, "userCoord": 2 }, "conveyorID": 2, "robot": 1, "track": { "height": 0, "track_on_run_mode_with_target_overrun": 0 } } ``` --- ## 参数识别 ### 设置参数识别 **0x4804 TRACK_CONVEYOR_POSCHECKPARAM_SET** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | conveyorID | int | 传送带工艺号 | | robot | int | 机器人编号 | | detectSrc.type | int | 工件检测信号源:0-视觉;1-IO;2-全局变量 | | detectSrc.globalVar | string | 当工件检测信号源为2-全局变量时生效 | | detectSrc.DI_capturePos | int | 当工件检测信号源为1-IO 时生效 | | detectSrc.visionID | int | 视觉工艺号 | | detectSrc.vision_io_filter_type | int | 视觉 IO 信号过滤:0-信号触发过滤;1-信号消失过滤 | | detectSrc.vision_latch_encoder_value_type | int | 视觉锁存编码器值:0-触发锁存;1-收到数据锁存 | | identification.communication | int | 视觉通讯方式:0-以太网;1-Modbus | | identification.sensorTrg | int | 传感器触发方式:0-低电平触发;1-高电平触发 | | identification.type | int | 工件识别方式:0-视觉;1-传感器 | ```json { "conveyorID": 1, "detectSrc": { "type": 0, "globalVar": "GB018", "DI_capturePos": 9, "visionID": 3, "vision_io_filter_type": 0, "vision_latch_encoder_value_type": 1 }, "identification": { "communication": 1, "sensorTrg": 1, "type": 0 }, "robot": 1 } ``` ### 查询工件识别参数 **0x4805 TRACK_CONVEYOR_POSCHECKPARAM_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 返回工件识别参数 **0x4806 TRACK_CONVEYOR_POSCHECKPARAM_RESPOND** 数据同0x4804 --- ## 实时查询 ### 实时查询编码器值和传送带速度 **0x4807 TRACK_CONVEYOR_REALTIME_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 响应实时查询 **0x4808 TRACK_CONVEYOR_REALTIME_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | conveyorID | int | 传送带工艺号 | | robot | int | 机器人编号 | | conveyor.encoderValue | double | 编码器值(int64类型) | | conveyor.speed | double | 传送带速度 | ```json { "conveyor": { "encoderValue": 72361.0, "speed": 0.0 }, "conveyorID": 1, "robot": 1 } ``` --- ## 传送带坐标系标定 ### 查询用户坐标系 **0x480E TRACK_CONVEYOR_USERCOORD_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 响应用户坐标系查询 **0x480F TRACK_CONVEYOR_USERCOORD_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | userCoord | int | 用户坐标号 | | userFrame | array | 弧度制用户坐标系 | | userFrameDeg | array | 角度制用户坐标系 | ```json { "robot": 1, "conveyorID": 1, "userCoord": 1, "userFrame": [1, 2, 3, 1.1, 1.2, 1.3], "userFrameDeg": [1, 2, 3, 90, 90, 90] } ``` ### 计算用户坐标系 **0x4810 TRACK_CONVEYOR_USERCOORD_CALCULATE** 使用0x4811标定3次后0x4810计算用户坐标系,会且返回0x3C02{"result":true}查看标定是否成功 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 标定取坐标 **0x4811 TRACK_CONVEYOR_USERCOORD_CALIBRATION** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | posNum | int | 标定次数(标定3次:1,2,3) | ```json { "robot": 1, "conveyorID": 1, "posNum": 1 } ``` ### 查询已标定的点坐标 **0x4812 RACK_CONVEYOR_CALIBRATION_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | posNum | int | 查询标定数值(1,2,3) | ```json { "robot": 1, "conveyorID": 1, "posNum": 1 } ``` ### 返回标定的点坐标 **0x4813 TRACK_CONVEYOR_CALIBRATION_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | posNum | int | 标定点数 | | posX | double | x 坐标 | | posY | double | y 坐标 | | encodorValue | int | 编码器数值(int64类型) | ```json { "posNum": 1, "posX": 1.0, "posY": 1.0, "encodorValue": 72329 } ``` ### 清空标定值 **0x4814 TRACK_CONVEYOR_CALIBRATION_CLEAR** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | posNum | int | 标定点序号 | 返回0x4813格式 ```json { "robot": 1, "conveyorID": 1, "posNum": 1 } ``` ### 取消标定 **0x4815 TRACK_CONVEYOR_CALIBRATION_CANCEL** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 传感器位置标定 > 注:使用视觉识别工件则无需标定,直接跳过。传感器则0x4804需要设为传感器和传感器触发的方式。 ### 传感器位置查询 **0x4816 TRACK_CONVEYOR_SENSORPOS_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 响应传感器位置查询 **0x4817 TRACK_CONVEYOR_SENSORPOS_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | sensorPos | object | 弧度制传感器位置 | | sensorPosDeg | object | 角度制传感器位置 | ```json { "robot": 1, "conveyorID": 1, "sensorPos": { "X": 1.0, "Y": 1.0, "Z": 1.0, "A": 1.0, "B": 1.0, "C": 1.0 }, "sensorPosDeg": { "X": 1.0, "Y": 1.0, "Z": 1.0, "A": 90, "B": 90, "C": 90 } } ``` ### 传感器位置开始标定查询 **0x4818 TRACK_CONVEYOR_SENSORPOS_CALIBRATION_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 响应传感器位置标定参数查询 **0x4819 TRACK_CONVEYOR_SENSORPOS_CALIBRATION_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | sensorCalibration.IO_encodorCircles | int | IO 编码器圈数 | | sensorCalibration.IO_encodorValue | int | 传感器编码器数值(int64类型) | | sensorCalibration.IO_time | int | IO 时间 | | sensorCalibration.calib_X | double | 标定点 UX | | sensorCalibration.calib_Y | double | 标定点 UY | | sensorCalibration.calib_encodorCircles | int | 标定编码器圈数 | | sensorCalibration.calib_encodorValue | int | 标定点编码器数值(int64类型) | | sensorCalibration.calib_time | int | 标定时间 | ```json { "sensorCalibration": { "IO_encodorCircles": 0, "IO_encodorValue": 441797, "IO_time": 0, "calib_X": 16.945789025163, "calib_Y": -7.513256884209, "calib_encodorCircles": 0, "calib_encodorValue": 472018, "calib_time": 0 } } ``` ### 传感器位置参数标定 **0x481A TRACK_CONVEYOR_SENSORPOS_CALIBRATE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | 响应返回0x4819格式 ```json { "robot": 1, "conveyorID": 1 } ``` ### 传感器跟踪抓取姿态参数查询 **0x481C TRACK_CONVEYOR_SENSOR_GRABGESTURE_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 响应传感器跟踪抓取姿态查询 **0x481D TRACK_CONVEYOR_SENSOR_GRABGESTURE_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | grabGesture | object | 弧度制抓取姿态 | | grabGesture.Z | double | 抓取姿态 UZ(单位 mm) | | grabGesture.A | double | UA(单位 rad) | | grabGesture.B | double | UB(单位 rad) | | grabGesture.C | double | UC(单位 rad) | | grabGestureDeg | object | 角度制抓取姿态 | | grabGestureDeg.Z | double | 抓取姿态(单位 mm) | | grabGestureDeg.A | double | UA(单位°) | | grabGestureDeg.B | double | UB(单位°) | | grabGestureDeg.C | double | UC(单位°) | ```json { "robot": 1, "conveyorID": 1, "grabGesture": { "Z": 1, "A": 3.14, "B": 3.14, "C": 3.14 }, "grabGestureDeg": { "Z": 1, "A": 180, "B": 180, "C": 180 } } ``` ### 传感器跟踪抓取姿态标定 **0x481E TRACK_CONVEYOR_SENSOR_GRABGESTURE_CALIBRATE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | 响应返回0x481D 格式 ```json { "robot": 1, "conveyorID": 1 } ``` ### 清空标定值 **0x4820 TRACK_CONVEYOR_SENSORPOS_CALIBRATION_CLEAR** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | type | int | 0-清空传感器位置标定参数;1-清空抓取姿态参数 | - 若 type 为0:返回0x4819 - 若 type 为1:返回0x481D ```json { "robot": 1, "conveyorID": 1, "type": 0 } ``` ### 取消标定 **0x4821 TRACK_CONVEYOR_SENSORPOS_CALIBRATION_CANCEL** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 计算传感器位置 **0x4822 TRACK_CONVEYOR_SENSORPOS_CALCULATE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | 无响应返回 ```json { "robot": 1, "conveyorID": 1 } ``` ### 手动设置传感器位置坐标 **0x4823 TRACK_CONVEYOR_SENSORPOS_SET** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | conveyorID | int | 传送带工艺号 | | robot | int | 机器人编号 | | sensorPos | object | 传感器位置坐标 | ```json { "conveyorID": 1, "robot": 1, "sensorPos": { "X": 300.0, "Y": 500.0, "Z": 0.0, "A": 2.0, "B": 3.0, "C": 1.0 } } ``` --- ## 传送带跟踪位置参数 ### 设置传送带跟踪位置参数 **0x4830 TRACK_CONVEYOR_POSITION_SET** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | position.trackStartXPoint | double | 跟踪开始 X 点 | | position.trackRangeXMax | double | 跟踪范围 X 最大 | | position.trackRangeYMin | double | 跟踪范围 Y 最小 | | position.trackRangeYMax | double | 跟踪范围 Y 最大 | | position.trackRangeZMin | double | 跟踪范围 Z 最小 | | position.trackRangeZMax | double | 跟踪范围 Z 最大 | | position.receLatestPos | double | 最迟接收位置 | ```json { "robot": 1, "conveyorID": 1, "position": { "trackStartXPoint": 123.123, "trackRangeXMax": 213.213, "trackRangeYMin": 132.132, "trackRangeYMax": 321.321, "trackRangeZMin": 231.231, "trackRangeZMax": 312.312, "receLatestPos": 123.321 } } ``` ### 查询传送带跟踪位置参数 **0x4831 TRACK_CONVEYOR_POSITION_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 返回传送带跟踪位置参数 **0x4832 TRACK_CONVEYOR_POSITION_RESPOND** > 注:返回数据的 position 参数里多了 posToMove 是0x4833标定点 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | conveyorID | int | 传送带工艺号 | | robot | int | 机器人编号 | | position | object | 位置参数对象 | ```json { "conveyorID": 1, "position": { "posToMove": [ [460.0, -0.0, 637.0, 3.141592653590, 0.0, 0.0], [673.357147963110, 0.0, 636.999999229013, -3.141592653590, -0.000000002140, 0.0], [673.357147430654, -18.080268801310, 637.000001461924, 3.141592653455, 0.000000005033, 0.000000000544], [673.357149063614, 52.919529211370, 636.999998014958, -3.141592653427, 0.000000002068, -0.000000006378], [673.357147022746, 52.919529050977, 624.778829506012, -3.141592653511, 0.000000000996, -0.000000006378], [460.000000414210, 0.0, 653.669918424025, -3.141592653590, 0.000000009006, 0.0], [504.163633239677, 0.0, 636.999998392068, -3.141592653590, 0.000000009404, 0.0] ], "receLatestPos": 504.1640, "trackRangeXMax": 673.3570, "trackRangeYMax": 52.920, "trackRangeYMin": -18.080, "trackRangeZMax": 653.670, "trackRangeZMin": 624.7790, "trackStartXPoint": 460.0 }, "robot": 1 } ``` ### 标定位置 **0x4833 TRACK_CONVEYOR_POSITION_CALIBRATION** > 注:需要用0x4830写入保持 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | type | int | 标定类型 | type 类型说明: | type 值 | 描述 | |--------|------| | 1 | 跟踪开始 X 点 | | 2 | 跟踪范围 X 最大 | | 3 | 跟踪范围 Y 最小 | | 4 | 跟踪范围 Y 最大 | | 5 | 跟踪范围 Z 最小 | | 6 | 跟踪范围 Z 最大 | | 7 | 最迟接收位置 | ```json { "robot": 1, "conveyorID": 1, "type": 1 } ``` ### 返回标定位置 **0x4834 TRACK_CONVEYOR_POSITION_CALIBRATION_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | type | int | 序号 | | value | double | 标定的 x/y/z 坐标值 | ```json { "robot": 1, "conveyorID": 1, "type": 1, "value": 2.33 } ``` ### 运动到指定的位置 **0x4837 TRACK_CONVEYOR_POSITION_TO_MOVE** > 注:先0x4831再0x4837 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | type | int | 标定类型(遵循0x4833说明) | ```json { "robot": 1, "conveyorID": 1, "type": 1 } ``` --- ## 传送带参数管理 ### 复制传送带参数 **0x4835 TRACK_CONVEYOR_PARAM_COPY** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | srcConveyorID | int | 源传送带工艺号 | | dstConveyorID | int | 目标传送带工艺号 | > 注:案例是1复制到2 ```json { "robot": 1, "srcConveyorID": 1, "dstConveyorID": 2 } ``` ### 清空传送带参数 **0x4836 TRACK_CONVEYOR_PARAM_CLEAR** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 等待点 ### 设置保存等待点 **0x483A TRACK_CONVEYOR_WAITPOINT_SET** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | conveyorID | int | 传送带工艺号 | | robot | int | 机器人编号 | | delayDetectTime | double | 延时检测时间(s) | | isWait | bool | 无工件时是否到指定点等待 | | pos | array | 直角坐标(欧拉角弧度) | ```json { "conveyorID": 1, "delayDetectTime": 0.50, "isWait": false, "pos": [ 679.5430, -229.9020, -25.2720, 3.14159260, 0.0, 0.436454478601 ], "robot": 1 } ``` ### 查询等待点 **0x483B TRACK_CONVEYOR_WAITPOINT_INQUIRE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 响应查询 **0x483C TRACK_CONVEYOR_WAITPOINT_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | conveyorID | int | 传送带工艺号 | | robot | int | 机器人编号 | | delayDetectTime | double | 无工件时是否到指定点等待 | | isWait | bool | 无工件时是否到指定点等待 | | pos | array | 直角坐标(欧拉角弧度) | | posDeg | array | 直角坐标(欧拉角角度) | ```json { "conveyorID": 1, "delayDetectTime": 2.50, "isWait": false, "pos": [ 679.5430, -209.9020, -25.2720, 3.14159260, 0.0, 0.436454478601, null ], "posDeg": [ 679.5430, -209.9020, -25.2720, 179.999996929531, 0.0, 25.006999573420, 0.0 ], "robot": 1 } ``` ### 标定等待点 **0x483D TRACK_CONVEYOR_WAITPOINT_CALIBRATE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` ### 响应标定 **0x483E TRACK_CONVEYOR_WAITPOINT_CALIBRATE_RESPOND** 响应参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | | pos | array | 直角坐标(欧拉角弧度) | | posDeg | array | 直角坐标(欧拉角角度) | ```json { "robot": 1, "conveyorID": 1, "pos": [1, 2, 3, 4, 5, 6, 7], "posDeg": [1, 2, 3, 4, 5, 6, 7] } ``` ### 运动到等待点 **0x483F TRACK_CONVEYOR_WAITPOINT_CALIBRATE_MOVE** 请求参数: | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人编号 | | conveyorID | int | 传送带工艺号 | ```json { "robot": 1, "conveyorID": 1 } ``` --- # 寻位跟踪工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/03.%E5%B7%A5%E8%89%BA/10.%E5%AF%BB%E4%BD%8D%E8%B7%9F%E8%B8%AA%E5%B7%A5%E8%89%BA.html ## 设置激光器参数 设置激光器配置参数 **0x4130 TRACK_LASER_PARAM_SET** ```json { "fileNum": 1, "laserParam": { "communication": 1, "devid": 1, "ip": "192.168.1.3", "port": 502, "responseTimeout": 0.3, "scaleFactor": 0.01, "timeLimit": 500.0, "timePeriod": 50.0, "vendor": "创想" }, "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | fileNum | int | 是 | 激光器文件号 | | robot | int | 是 | 机器人编号 | | laserParam.communication | int | 是 | 通讯方式:0-modbus tcp,1-ethernet tcp | | laserParam.devid | int | 是 | 设备号 | | laserParam.ip | string | 是 | IP 地址 | | laserParam.port | int | 是 | 端口号 | | laserParam.responseTimeout | float | 否 | 响应超时 | | laserParam.scaleFactor | float | 否 | 激光器放回值比例系数 | | laserParam.timeLimit | float | 否 | 读写超时时间(ms) | | laserParam.timePeriod | float | 否 | 读写周期(ms) | | laserParam.vendor | string | 否 | 激光器厂家 | --- 查询激光器参数 **0x4131 TRACK_LASER_PARAM_INQUIRE** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | --- 返回的响应激光器参数 **0x4132 TRACK_LASER_PARAM_RESPOND** ```json { "fileNum": 1, "laserParam": { "commLog": false, "communication": 0, "devid": 88, "ip": "192.168.1.3", "netstate": false, "port": 502, "responseTimeout": 0.3, "scaleFactor": 0.01, "timeLimit": 500.0, "timePeriod": 50, "vendor": "创想", "vendorlist": [ "通用", "创想", "锐博视", "睿牛", "同舟科技", "中科宏伟", "全视智能", "省工智能", "康普曼", "青东" ] }, "robot": 1 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | fileNum | int | 激光器文件号 | | robot | int | 机器人编号 | | laserParam.commLog | bool | 通讯日志 | | laserParam.communication | int | 通讯方式:0-modbus tcp,1-ethernet tcp | | laserParam.devid | int | 设备号 | | laserParam.ip | string | IP 地址 | | laserParam.netstate | bool | 网络状态 | | laserParam.port | int | 端口号 | | laserParam.responseTimeout | float | 响应超时 | | laserParam.scaleFactor | float | 激光器放回值比例系数 | | laserParam.timeLimit | float | 读写超时时间(ms) | | laserParam.timePeriod | float | 读写周期(ms) | | laserParam.vendor | string | 激光器厂家 | | laserParam.vendorlist | array | 激光器厂家列表 | --- ## 激光器标定 标定记录查询 **0x4140 SENSOR_LASER_CALIBRATE_INQUIRE** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | --- 返回0x4140查询结果 **0x4141 SENSOR_LASER_CALIBRATE_RESPOND** ```json { "robot": 1, "fileNum": 1, "recordResult": { "point1": false, "point2": false, "point3": false, "point4": false, "point5": false, "point6": false, "point7": false } } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | fileNum | int | 激光器文件号 | | recordResult.point1~7 | bool | 各标定点记录结果 | --- 记录标定点 **0x4142 SENSOR_LASER_CALIBRATE_RECORD** ```json { "robot": 1, "fileNum": 1, "pointNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | | pointNum | int | 是 | 标定点编号(范围1~7) | --- 查询标定结果 **0x4143 SENSOR_LASER_CALIBRATE_RECORD_RESPOND** ```json { "robot": 1, "fileNum": 1, "pointNum": 1, "recordResult": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | fileNum | int | 激光器文件号 | | pointNum | int | 标定点编号 | | recordResult | bool | 记录结果 | --- 运动到标定点 **0x4144 SENSOR_LASER_CALIBRATE_MOVETO** ```json { "robot": 1, "fileNum": 1, "pointNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | | pointNum | int | 是 | 标定点编号 | --- 计算标定结果 **0x4145 SENSOR_LASER_CALIBRATE_CALCULATE** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | --- 返回0x4145计算结果 **0x4146 SENSOR_LASER_CALIBRATE_CALCULATE_RESPOND** ```json { "robot": 1, "fileNum": 1, "result": true } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | fileNum | int | 激光器文件号 | | result | bool | 计算结果 | --- 清空标定记录 **0x4147 SENSOR_LASER_CALIBRATE_CLEAR** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | 返回0x4141 --- 取消标定 **0x4148 SENSOR_LASER_CALIBRATE_CANCEL** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | --- 查询激光器是否标定 **0x4149 SENSOR_LASER_CALIBRATE_RESULT_INQUIRE** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | --- 响应0x4149查询结果 **0x414A SENSOR_LASER_CALIBRATE_RESULT_RESPOND** ```json { "robot": 1, "fileNum": 1, "laserCalibrated": false } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | fileNum | int | 激光器文件号 | | laserCalibrated | bool | 是否已标定 | --- ## 设置寻位类型 **0x4133 LOCATING_SENSORTYPE_SET** ```json { "fileNum": 77, "robot": 1, "sensorType": 0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | fileNum | int | 是 | 激光器文件号 | | robot | int | 是 | 机器人编号 | | sensorType | int | 是 | 寻位类型:0-线激光,1-电弧 | --- 查询寻位类型 **0x4134 LOCATING_SENSORTYPE_INQUIRE** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | --- 响应寻位类型 **0x4135 LOCATING_SENSORTYPE_RESPOND** ```json { "robot": 1, "fileNum": 1, "sensorType": 0 } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | fileNum | int | 激光器文件号 | | sensorType | int | 寻位类型:0-线激光,1-电弧 | --- ## 设置跟踪类型 **0x4169 TRACK_SENSORTYPE_SET** ```json { "robot": 1, "fileNum": 1, "sensorType": 0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | | sensorType | int | 是 | 跟踪类型:0-线激光,1-电弧,2-弧压 | --- 查询跟踪类型 **0x4170 TRACK_SENSORTYPE_INQUIRE** ```json { "robot": 1, "fileNum": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | --- 返回0x4170查询结果 **0x4171 TRACK_SENSORTYPE_RESPOND** 同0x4169 --- ## 设置激光跟踪参数表 **0x4136 TRACK_LASER_TRACKPARAM_SET** ```json { "fileNum": 1, "robot": 1, "tableid": 98, "trackParam": { "compensateX": 1.0, "compensateY": 2.0, "compensateZ": 3.0, "din_end": 0, "dout_part_move": -1, "endPoint": { "interval": 6.0, "scanPeriod": 5.0 }, "filter": { "level": 4, "type": 1 }, "laserTaskId": 7, "positionHold": { "distance": 100.0, "switchon": false }, "scanErrorLength": 8.0, "sensitivity": 3, "trackMode": 0 } } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | fileNum | int | 是 | 激光器文件号 | | robot | int | 是 | 机器人编号 | | tableid | int | 是 | 跟踪模式 | | trackParam.compensateX | float | 否 | x 方向补偿量 | | trackParam.compensateY | float | 否 | y 方向补偿量 | | trackParam.compensateZ | float | 否 | z 方向补偿量 | | trackParam.din_end | int | 否 | 跟踪结束输入 IO | | trackParam.dout_part_move | int | 否 | 工件旋转输出 IO | | trackParam.endPoint.interval | float | 否 | 结束点扫描区间 | | trackParam.endPoint.scanPeriod | float | 否 | 结束点扫描周期 | | trackParam.filter.level | int | 否 | 滤波等级 | | trackParam.filter.type | int | 否 | 滤波方式:0-无,1-滑动平均滤波 | | trackParam.laserTaskId | int | 否 | 激光器任务号 | | trackParam.positionHold.distance | float | 否 | 寻位保持触发距离 | | trackParam.positionHold.switchon | bool | 否 | 寻位保存功能:true 开启,false 关闭 | | trackParam.scanErrorLength | float | 否 | 扫描错误确认距离 | | trackParam.sensitivity | int | 否 | 灵敏度 | | trackParam.trackMode | int | 否 | 跟踪模式:0-绝对式,1-定点增量式,2-行走增量式 | --- 查询激光跟踪参数 **0x4137 TRACK_LASER_TRACKPARAM_INQUIRE** ```json { "robot": 1, "fileNum": 1, "tableid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | | tableid | int | 是 | 参数表编号 | --- 响应激光跟踪参数 **0x4138 TRACK_LASER_TRACKPARAM_RESPOND** Data:同0x4136 --- ## 寻位参数表 设置寻位参数 **0x4139 TRACK_LASER_SEARCHPARAM_SET** ```json { "fileNum": 1, "robot": 1, "searchParam": { "compensateX": 2.0, "compensateY": 3.0, "compensateZ": 4.0, "dynamic": { "distance": 5.0, "pointIndex": 7, "speed": 6.0 }, "laserTaskId": 1, "storeType": 1 }, "tableid": 3 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | fileNum | int | 是 | 寻位文件号 | | robot | int | 是 | 机器人编号 | | tableid | int | 是 | 参数表编号 | | searchParam.compensateX | float | 否 | x 方向补偿量 | | searchParam.compensateY | float | 否 | y 方向补偿量 | | searchParam.compensateZ | float | 否 | z 方向补偿量 | | searchParam.dynamic.distance | float | 否 | 动态寻位距离 | | searchParam.dynamic.pointIndex | int | 否 | 动态寻位选择 | | searchParam.dynamic.speed | float | 否 | 动态寻位速度 | | searchParam.laserTaskId | int | 否 | 激光器任务号 | | searchParam.storeType | int | 否 | 寻位类型:0-基准寻位,1-修正寻位 | --- 查询寻位参数 **0x413A TRACK_LASER_SEARCHPARAM_INQUIRE** ```json { "robot": 1, "fileNum": 1, "tableid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | | tableid | int | 是 | 参数表编号 | --- 回复寻位参数 **0x413B TRACK_LASER_SEARCHPARAM_RESPOND** Data:同0x4139 --- 复制寻位参数(复制前要0x413D 清空) **0x413C TRACK_SEAMTRACK_PARAM_COPY** ```json { "dstFileNum": 4, "fileNum": 1, "function": 1, "robot": 1, "sensorType": 0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | dstFileNum | int | 是 | 复制到的文件号 | | fileNum | int | 是 | 复制的文件号 | | function | int | 是 | 0-跟踪,1-寻位 | | robot | int | 是 | 机器人编号 | | sensorType | int | 是 | 跟踪类型:0-线激光,1-电弧,2-弧压;寻位类型:0-线激光,1-电弧 | --- 清空寻位参数 **0x413D TRACK_SEAMTRACK_PARAM_CLEAR** ```json { "robot": 1, "fileNum": 1, "sensorType": 0, "function": 0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | fileNum | int | 是 | 激光器文件号 | | sensorType | int | 是 | 跟踪类型:0-线激光,1-电弧,2-弧压;寻位类型:0-线激光,1-电弧 | | function | int | 是 | 0-跟踪,1-寻位 | > 注:清空完成,要查询一次参数 --- ## 电弧跟踪 设置通讯参数 **0x4150 TRACK_ARC_COMMPARAM_SET** ```json { "robot": 1, "craftid": 1, "sampling": { "dataType": 0, "period": 20 } } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | | sampling.dataType | int | 是 | 数据类型:0-电流,1-电压 | | sampling.period | int | 是 | 采样周期(0~1000) | --- 查询通讯参数 **0x4151 TRACK_ARC_COMMPARAM_INQUIRE** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | --- 响应通讯参数查询 **0x4152 TRACK_ARC_COMMPARAM_RESPOND** ```json { "robot": 1, "craftid": 1, "sampling": { "dataType": 0, "period": 20 } } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 机器人编号 | | craftid | int | 跟踪文件号 | | sampling.dataType | int | 数据类型:0-电流,1-电压 | | sampling.period | int | 采样周期(0~1000) | --- 设置左右补偿参数 **0x4153 TRACK_ARC_LATERALCOMPENPARAM_SET** ```json { "craftid": 1, "robot": 1, "lateralCompensation": { "accFactor": 5.0, "algorithmType": 0, "beginCycleNum": 1, "factor": 2.0, "maxSingleLen": 4.0, "switchon": false, "threshold": 3.0 } } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | craftid | int | 是 | 跟踪文件号 | | robot | int | 是 | 机器人编号 | | lateralCompensation.accFactor | float | 否 | 补偿加速度倍数(0.1~10) | | lateralCompensation.algorithmType | int | 否 | 偏差提取类型:0-均值 | | lateralCompensation.beginCycleNum | int | 否 | 开始采样周期数(1~1000) | | lateralCompensation.factor | float | 否 | 纠偏因数(0.001~1000) | | lateralCompensation.maxSingleLen | float | 否 | 每次最大补偿量(0~10) | | lateralCompensation.switchon | bool | 否 | 补偿开关 | | lateralCompensation.threshold | float | 否 | 补偿阈值(0~1000) | --- 查询左右补偿参数 **0x4154 TRACK_ARC_LATERALCOMPENPARAM_INQUIRE** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | --- 返回左右参数查询 **0x4155 TRACK_ARC_LATERALCOMPENPARAM_RESPOND** 同:0x4153 --- 设置高低补偿参数 **0x4156 TRACK_ARC_VERTICALCOMPENPARAM_SET** ```json { "craftid": 1, "robot": 1, "verticalCompensation": { "accFactor": 1, "algorithmType": 0, "beginCycleNum": 5, "factor": 4, "maxSingleLen": 2, "switchon": true, "threshold": 3 } } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | craftid | int | 是 | 跟踪文件号 | | robot | int | 是 | 机器人编号 | | verticalCompensation.accFactor | float | 否 | 补偿加速度倍数 | | verticalCompensation.algorithmType | int | 否 | 偏差提取类型 | | verticalCompensation.beginCycleNum | int | 否 | 开始采集周期数 | | verticalCompensation.factor | float | 否 | 纠偏因数 | | verticalCompensation.maxSingleLen | float | 否 | 每次最大补偿量 | | verticalCompensation.switchon | bool | 否 | 补偿开关 | | verticalCompensation.threshold | float | 否 | 补偿阈值 | --- 查询高低补偿参数 **0x4157 TRACK_ARC_VERTICALCOMPENPARAM_INQUIRE** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | --- 返回高低补偿参数查询 **0x4158 TRACK_ARC_VERTICALCOMPENPARAM_RESPOND** 同:0x4156 --- ## 触摸寻位参数 **0x4160 SEARCH_TOUCH_PARAM_SET** ```json { "craftid": 1, "robot": 1, "touchSearch": { "2ndAutoDistance": 8.0, "2ndAutoReturn": true, "2ndAutoVel": 9.0, "2ndDeviationLimit": 10.0, "2ndDistance": 6.0, "2ndSwitchon": false, "2ndVel": 7.0, "autoDistance": 3.0, "autoReturn": true, "autoVel": 4.0, "baseFlag": true, "compensation": 11.0, "deviationLimit": 5.0, "distance": 1.0, "isChangePose": false, "vel": 2.0 } } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | craftid | int | 是 | 寻位文件号 | | robot | int | 是 | 机器人编号 | | touchSearch.2ndAutoDistance | float | 否 | 二次自动返回距离 | | touchSearch.2ndAutoReturn | bool | 否 | 二次自动返回使能 | | touchSearch.2ndAutoVel | float | 否 | 二次自动返回速度 | | touchSearch.2ndDeviationLimit | float | 否 | 二次超偏差范围 | | touchSearch.2ndDistance | float | 否 | 二次寻位距离 | | touchSearch.2ndSwitchon | bool | 否 | 二次寻位使能 | | touchSearch.2ndVel | float | 否 | 二次寻位速度 | | touchSearch.autoDistance | float | 否 | 自动返回距离 | | touchSearch.autoReturn | bool | 否 | 自动返回使能 | | touchSearch.autoVel | float | 否 | 自动返回速度 | | touchSearch.baseFlag | bool | 否 | 基准寻位开关 | | touchSearch.compensation | float | 否 | 运动向量补偿 | | touchSearch.deviationLimit | float | 否 | 超偏差范围 | | touchSearch.distance | float | 否 | 寻位距离 | | touchSearch.isChangePose | bool | 否 | 是否变姿态 | | touchSearch.vel | float | 否 | 寻位速度 | --- 查询参数 **0x4161 SEARCH_TOUCH_PARAM_INQUIRE** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 寻位文件号 | --- 响应查询 **0x4162 SEARCH_TOUCH_PARAM_RESPOND** 参数同0x4160 --- ## 弧压追踪 弧压跟踪参数设置 **0x4163 ARC_VOLTAGE_TRACK_PARAMETERS_SET** ```json { "base_calc": { "collect_time": 5.0, "method": 0, "vol_inc": 4.0, "voltage": 3.0 }, "collection": { "analog_port": 1, "equipment": 0, "invalid_data_time": 2.0, "period": 1 }, "craftid": 1, "pid": { "dev_shreshold": 9.0, "kd": 8.0, "ki": 7.0, "kp": 6.0, "max_iout": 10.0, "max_out": 11.0 }, "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | craftid | int | 是 | 跟踪文件号 | | robot | int | 是 | 机器人编号 | | base_calc.collect_time | float | 否 | 焊接开始计算时间(s) | | base_calc.method | int | 否 | 基准电压获取方式:0-焊接计算,1-手动计算 | | base_calc.vol_inc | float | 否 | 计算增量 | | base_calc.voltage | float | 否 | 基准电压(=计算量+计算增量) | | collection.analog_port | int | 否 | 弧压采集模拟端口(AIN-1...) | | collection.equipment | int | 否 | 弧压采集设备:0-焊机,1-弧压模块 | | collection.invalid_data_time | float | 否 | 无效数据时间(s) | | collection.period | int | 否 | 采样周期(ms) | | pid.dev_shreshold | float | 否 | 偏差阈值 | | pid.kd | float | 否 | 微分系数 | | pid.ki | float | 否 | 积分系数 | | pid.kp | float | 否 | 比例系数 | | pid.max_iout | float | 否 | 积分限幅 | | pid.max_out | float | 否 | 输出限幅 | --- 弧压跟踪参数查询 **0x4164 ARC_VOLTAGE_TRACK_PARAMETERS_INQUIRE** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | --- 响应弧压跟踪参数查询 **0x4165 ARC_VOLTAGE_TRACK_PARAMETERS_RESPOND** 同:0x4163 --- 弧压跟踪基准电压计算开启 **0x4166 ARC_VOLTAGE_TRACK_BASEVOLTAGE_CALC_START** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | --- 弧压跟踪基准电压计算关闭 **0x4167 ARC_VOLTAGE_TRACK_BASEVOLTAGE_CALC_END** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | --- 计算弧压跟踪基准电压 **0x4168 ARC_VOLTAGE_TRACK_BASEVOLTAGE_CALC** ```json { "robot": 1, "craftid": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | --- 返回0x4168计算结果 **ARC_VOLTAGE_TRACK_BASEVOLTAGE_CALCURESULTS_GET** ```json { "basic_calc": { "voltage": 0.0 } } ``` | 参数名 | 类型 | 说明 | |--------|------|------| | basic_calc.voltage | float | 基准电压 | --- 修改弧压跟踪小窗参数 **0x416B ARC_VOLTAGE_TRACK_WINDOWSPARAM_SET** ```json { "base_calc": { "vol_inc": 4.0, "voltage": 3.0 }, "craftid": 3, "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | craftid | int | 是 | 跟踪文件号 | | base_calc.vol_inc | float | 否 | 计算增量 | | base_calc.voltage | float | 否 | 基准电压 | --- # 作业文件设置 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/04.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6/01.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6%E8%AE%BE%E7%BD%AE.html ## 1. 作业文件执行状态设置 ### 1.1 作业文件执行模式 | 模式值 | 模式名称 | 说明 | |--------|----------|------| | 0 | step | 步进模式 | | 1 | stop | 停止模式 | | 2 | restart | 重启模式 | ### 1.2 设置作业文件执行模式 **命令字**: 0x2401 `JOBEXE_MODE_SET` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | int | 是 | 作业文件执行状态:0=step,1=stop | | robot | int | 是 | 机器人编号,取值范围 [1, 4] | **请求示例**: ```json { "type": 0, "robot": 1 } ``` ### 1.3 无文件运行 **命令字**: 0x2402 `RUNJOB_NOFILE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | **请求示例**: ```json { "robot": 1 } ``` ### 1.4 反向运行 **命令字**: 0x2403 `REVERSEORDER_RUN` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | switch | bool | 是 | false=正序,true=倒序 | **请求示例**: ```json { "switch": true } ``` ### 1.5 查询正序倒序状态 **命令字**: 0x2405 `REVERSEORDER_RUN_INQUIRE` **请求示例**: ```json {} ``` **响应命令字**: 0x2406 `REVERSEORDER_RUN_RESPOND` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | switch | bool | 是 | false=正序,true=倒序 | **响应示例**: ```json { "switch": false } ``` ## 2. 开始运行作业文件 ### 2.1 发送开始运行命令 **命令字**: 0x2501 `JOBSEND_DONE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | | jobname | string | 是 | 作业文件名 | | line | int | 是 | 作业文件指令行数,不能为零,不能超过总行数 | | globalStart | bool | 是 | 是否为多机模式 | | continueRun | int | 是 | 1=继续运行,0=不继续运行 | | startOver | int | 是 | 1=重头运行,0=继续运行 | **continueRun 和 startOver 组合说明**: | continueRun | startOver | 执行方式 | |--------------|-----------|----------| | 1 | false | 断点执行 | | 0 | true | 从头运行 | | 0 | false | 当前行运行 | **请求示例**: ```json { "robot": 1, "jobname": "aaa", "line": 1, "globalStart": false, "continueRun": 0, "startOver": 0 } ``` ### 2.2 停止运行作业文件 **命令字**: 0x2503 `STOP_JOB_RUN` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | **请求示例**: ```json { "robot": 1 } ``` ## 3. 当前行运行设置与获取 ### 3.1 设置当前行运行 **命令字**: 0x9104 `CURRENTROWRUN_SET` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | | jobfilename | string | 是 | 作业文件名 | | num | int | 是 | 行号 | **请求示例**: ```json { "robot": 1, "jobfilename": "AAA", "num": 1 } ``` ### 3.2 查询当前行 **命令字**: 0x9105 `CURRENTROWRUN_INQUIRE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | **请求示例**: ```json { "robot": 1 } ``` ### 3.3 机器人运行状态响应 **命令字**: 0x9106 `CURRENTROWRUN_RESPOND` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | | jobfilename | string | 是 | 作业文件名 | | num | int | 是 | 行号 | **响应示例**: ```json { "robot": 1, "jobfilename": "AAA", "num": 1 } ``` ### 3.4 清除运行状态 **说明**: 在导入程序成功后,示教器会发送此协议请求重置程序运行状态 **命令字**: 0x9107 `CLEARCONTINUERUN` **请求示例**: ```json {} ``` **响应命令字**: 0x9108 `CLEARCONTINUERUN_RESPOND` **响应示例**: ```json {} ``` ## 4. 循环次数 ### 4.1 设置机器人循环次数 **命令字**: - 0x2304 `DEADMAN_MODE_SET` - 0x5011 `CYCLE_INDEX_SET` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | | index | int | 是 | 循环次数索引 | **请求示例**: ```json { "robot": 1, "index": 1 } ``` ### 4.2 查询机器人循环次数 **命令字**: 0x5012 `CYCLE_COUNT_INQUIRE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | **请求示例**: ```json { "robot": 1 } ``` ### 4.3 循环次数响应 **命令字**: 0x5013 `CYCLE_COUNT_RESPOND` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | | count | int | 是 | 当前已运行次数 | | index | int | 是 | 循环次数索引(0=无限循环) | **响应示例**: ```json { "robot": 1, "count": 0, "index": 1 } ``` ## 5. 运行时间 ### 5.1 查询机器人运行时间 **命令字**: 0x5022 `RUNNING_TIME_INQUIRE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | **请求示例**: ```json { "robot": 1 } ``` ### 5.2 运行时间响应 **命令字**: 0x5023 `RUNNING_TIME_RESPOND` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | | time | int | 是 | 当前已运行时间 | **响应示例**: ```json { "robot": 1, "time": 0 } ``` ## 6. 程序指令顺序 ### 6.1 查询指令列表 **命令字**: 0x5092 `COMMAND_LIST_INQUIRE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **请求示例**: ```json { "robot": 1 } ``` ### 6.2 返回指令个数 **命令字**: 0x5093 `COMMAND_LIST_RESPOND` **说明**: 最多有两个返回信号 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobname | array | 是 | 文件名列表 | | num | array | 是 | 行号列表 | | sendednum | int | 是 | 已发送数量 | | totalnum | int | 是 | 总数 | **响应示例**: ```json { "jobname": ["SSS", "SSS"], "num": [2, 1], "sendednum": 2, "totalnum": 2 } ``` ## 7. 全局后台自启动 ### 7.1 设置全局后台自启动 **命令字**: 0x50c1 `GLOBAL_PTHREAD_SELFSTART_SET` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | name | string | 是 | 全局后台名字 | **请求示例**: ```json { "robot": 1, "name": "Q1" } ``` ### 7.2 查询全局后台自启动 **命令字**: 0x50c2 `GLOBAL_PTHREAD_SELFSTART_INQUIRE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | **请求示例**: ```json { "robot": 1 } ``` ### 7.3 全局后台自启动响应 **命令字**: 0x50c3 `GLOBAL_PTHREAD_SELFSTART_RESPOND` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | name | string | 是 | 全局后台名字 | **响应示例**: ```json { "robot": 1, "name": "Q1" } ``` ### 7.4 开始全局后台自启 **命令字**: 0x50c4 `GLOBAL_PTHREAD_RUN_CONTROL` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | type | int | 是 | 1=开始,0=停止 | **请求示例**: ```json { "robot": 1, "type": 1 } ``` ### 7.5 查询全局后台自启状态 **命令字**: 0x50c5 `GLOBAL_PTHREAD_RUNSTATUS_INQUIRE` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 当前机器人编号 | | hasRun | bool | 是 | 自启状态,true=启动,false=停止 | | runName | int | 是 | 1=获取全局后台运行状态 | **请求示例**: ```json { "robot": 1, "hasRun": true, "runName": 1 } ``` ### 7.6 全局后台自启状态响应 **命令字**: 0x50c6 `GLOBAL_PTHREAD_RUNSTATUS_RESPOND` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 当前机器人编号 | | hasRun | bool | 是 | 自启状态,true=启动,false=停止 | **响应示例**: ```json { "robot": 1, "hasRun": false } ``` ## 8. 获取当前打开程序 ### 8.1 请求获取当前打开程序 **命令字**: 0x3a04 上位机下发,获取当前打开程序 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1, 4] | **请求示例**: ```json { "robot": 1 } ``` ### 8.2 控制器响应 **命令字**: 0x3a05 控制器收到 0x3a04 命令后发送 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | openedJobName | string | 是 | 当前打开的作业文件 | **响应示例**: ```json { "openedJobName": "asd" } ``` --- # 作业文件传输 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/04.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6/02.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93.html > 用于无作业文件指令运行,向作业文件里插入指令,请使用 0x3121 ## 0x3001 FILE_INSTRUCTION 示教器发送作业文件指令时使用此命令。 ```json { "robot": 1, // 机器人号 "cmd->toJson()" // 指令json列表 } ``` ## 作业文件收发过程 ### 场景一:控制器中的作业文件少于示教器,则需要示教器向控制器上传作业文件 #### 步骤 1:示教器向控制器发送获取控制器 ID 指令 **0x5052 IDENTIFY_NUMBER_INQUIRE** 控制器回复:**0x5053 IDENTIFY_NUMBER_RESPOND** ```json { "controllerID": "4DC9F0249098C82E" // 控制器ID } ``` | 参数 | 类型 | 描述 | |------|------|------| | controllerID | string | 控制器 ID | 获取到连接的控制器 ID 之后,在同步作业文件时需判断此 ID 是否已知。已知则判断路径 `dir/controllerID` 是否存在,若存在则不做操作;若不存在则创建工作文件路径,格式:`dir/controllerID/robotJob/R1`。多个机器人则表示 R1-4。 #### 步骤 2:示教器向控制器发送获取作业文件列表指令 **0x5532 JOBFILE_LIST_INQUIRE** 控制器回复:**0x5533 JOBFILE_SUM_RESPOND** ```json { "absolutepath": ["/job/R1/", "/job/R2/", "/job/R3/", "/job/R4/"], // 作业文件的文件夹列表 "jobfilenum": [2, 33, 233, 666] // 作业文件夹中包含的文件个数 } ``` | 参数 | 类型 | 描述 | |------|------|------| | absolutepath | array | 作业文件的文件夹列表 | | jobfilenum | array | 各作业文件夹中包含的文件个数 | 此时开启停止下载计时器,设定5秒,作用为判断下载文件过程中是否等待超时。 #### 步骤 3:控制器主动向示教器发送作业文件列表 **0x5534 JOBFILE_LIST_RESPOND** ```json { "robot": 1, "listnum": 2, // 最多10个 "jobfilelist": [ { "name": "xxx.JBR", // 作业文件名字 "MD5": "123" // MD5值,用于判断文件是否相同 }, { "name": "yyy.JBR", "MD5": "132" } ] } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | listnum | int | 列表数量,最多10个 | | jobfilelist | array | 作业文件列表 | 控制器回复的参数作用是于本地的作业文件作比较。若文件相同,判断 MD5值是否相同,若 MD5值相同则不做处理,不同则需要删除本地文件并重新下载。记录需要下载的文件:文件名和路径存储在下载作业文件列表中(加绝对路径),若文件不同,也需记录需要被下载的文件到列表中。 #### 步骤 4:文件传输连接 关于文件下载与上传,需要示教器连接 **5000 端口**进行文件传输(指令等命令传输走 6000 端口)。 #### 步骤 5:示教器与控制器文件传输网络已连接,开始进行文件传输 #### 步骤 6:示教器发送需要上传的作业文件的名字与大小 **0x5501 REQUEST_UPLOAD_FILE** ```json { "name": "vxWorks", // 示教器发送文件的文件名 "size": 4096 // 示教器发送文件的大小 } ``` | 参数 | 类型 | 描述 | |------|------|------| | name | string | 示教器发送文件的文件名 | | size | int | 示教器发送文件的大小 | 示教器开始请求上传文件,等待控制器回复。 #### 步骤 7:控制器回复是否同意上传 **0x5502 REQUEST_UPLOAD_RESPOND** ```json { "answer": "yes" // "yes" 表示同意上传文件请求,"busy" 表示控制器忙碌 } ``` | 参数 | 类型 | 描述 | |------|------|------| | answer | string | yes=同意上传,busy=控制器忙碌 | #### 步骤 8:示教器接受 "yes" 开始发送文件 **0x5512** 文件写入二进制流,采取切片循环发送,若剩余文件大小超过规定数值(2*1024),则每次发送规定数据大小,直到剩余文件大小小于规定的每次发送数据大小,将剩余文件数据发送完毕。 #### 步骤 9:控制器接收文件完毕 **0x5513 RECEIVE_UPLOAD_FINISH** ```json { "finish": true // 等待下载计时器停止,导入新上传文件 } ``` | 参数 | 类型 | 描述 | |------|------|------| | finish | bool | true=等待下载计时器停止,导入新上传文件 | #### 步骤 10:若有多个作业文件需要同步到控制器中则需要重复步骤 6~9 --- ### 场景二:控制器中的作业文件多于示教器,则需要示教器向控制器下载作业文件 1~5 上传下载一样通信,示教器与控制器文件传输网络已连接,开始进行文件传输。 #### 步骤 1:示教器向控制器发送获取控制器 ID 指令 **0x5052 IDENTIFY_NUMBER_INQUIRE** 控制器回复:**0x5053 IDENTIFY_NUMBER_RESPOND** ```json { "controllerID": "4DC9F0249098C82E" // 控制器ID } ``` | 参数 | 类型 | 描述 | |------|------|------| | controllerID | string | 控制器 ID | 获取到连接的控制器 ID 之后,在同步作业文件时需判断此 ID 是否已知。已知则判断路径 `dir/controllerID` 是否存在,若存在则不做操作;若不存在则创建工作文件路径,格式:`dir/controllerID/robotJob/R1`。多个机器人则表示 R1-4。 #### 步骤 2:示教器向控制器发送获取作业文件列表指令 **0x5532 JOBFILE_LIST_INQUIRE** 控制器回复:**0x5533 JOBFILE_SUM_RESPOND** ```json { "absolutepath": ["/job/R1/", "/job/R2/", "/job/R3/", "/job/R4/"], // 作业文件的文件夹列表 "jobfilenum": [2, 33, 233, 666] // 作业文件夹中包含的文件个数 } ``` | 参数 | 类型 | 描述 | |------|------|------| | absolutepath | array | 作业文件的文件夹列表 | | jobfilenum | array | 各作业文件夹中包含的文件个数 | 此时开启停止下载计时器,设定5秒,作用为判断下载文件过程中是否等待超时。 #### 步骤 3:控制器主动向示教器发送作业文件列表 **0x5534 JOBFILE_LIST_RESPOND** ```json { "robot": 1, "listnum": 2, // 最多10个 "jobfilelist": [ { "name": "xxx.JBR", // 作业文件名字 "MD5": "123" // MD5值,用于判断文件是否相同 }, { "name": "yyy.JBR", "MD5": "132" } ] } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | listnum | int | 列表数量,最多10个 | | jobfilelist | array | 作业文件列表 | 控制器回复的参数作用是于本地的作业文件作比较。若文件相同,判断 MD5值是否相同,若 MD5值相同则不做处理,不同则需要删除本地文件并重新下载。记录需要下载的文件:文件名和路径存储在下载作业文件列表中(加绝对路径),若文件不同,也需记录需要被下载的文件到列表中。 #### 步骤 4:文件传输连接 关于文件下载与上传,需要示教器连接 **5000 端口**进行文件传输(指令等命令传输走 6000 端口)。 #### 步骤 5:示教器与控制器文件传输网络已连接,开始进行文件传输 #### 步骤 6:示教器开始发送列表中的作业文件名称 **0x5504** ```json { "name": "job/R1/WWWWW.JBR" // 需要下载的作业文件名称 } ``` | 参数 | 类型 | 描述 | |------|------|------| | name | string | 需要下载的作业文件名称(包含路径) | 参数 name 是作业文件在控制器中的作业文件路径加上名字。在 0x5533 和 0x5534 中控制器有向示教器发送路径和名字。示教器提示开始同步作业文件。 #### 步骤 7:控制器回复 **0x5505** ```json { "answer": "yes", // 控制器是否同意下载 "name": "job/R1/WWWWW.JBR", // 需要被下载的作业文件名称 "size": 217 // 此作业文件的大小 } ``` | 参数 | 类型 | 描述 | |------|------|------| | answer | string | 控制器是否同意下载 | | name | string | 需要被下载的作业文件名称 | | size | int | 此作业文件的大小 | #### 步骤 8:控制器主动发送 **0x5522** #### 步骤 9:查看示教器是否接收参数成功 **0x5523** ```json { "finish": true // 示教器接收成功 } ``` | 参数 | 类型 | 描述 | |------|------|------| | finish | bool | 示教器接收成功 | 以上过程代表一个作业文件下载完成。若有多个作业文件需要下载,则在 0x5534 中存入的列表减一,继续重复以上过程。 --- # 作业文件指令 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/04.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6/03.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6%E6%8C%87%E4%BB%A4.html #### 删除作业文件时,发送: *0x3111 JOBFILE_DELETE ```json { "robot": 1, "jobfilename": "Q", "suffixname": ".JBR" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | jobfilename | string | 作业文件名称 | | suffixname | string | 作业文件后缀名 | #### 重命名作业文件时,发送: *0x3112 JOBFILE_RENAME ```json { "robot": 1, "lastname": "Q", "newname": "W", "suffixname": ".JBR" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | lastname | string | 修改前文件名 | | newname | string | 修改后文件名 | | suffixname | string | 文件后缀名 | #### 新建作业文件 *0x3113 JOBFILE_CREATE ```json { "robot": 1, "jobName": "xxxx", "suffixname": ".JBR", "time": "JAN 24 18:32:12:2018" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | jobName | string | 新建作业文件名 | | suffixname | string | 作业文件后缀名 | | time | string | std::localtime | #### 打开作业文件 *0x3114 JOBFILE_OPEN ```json { "robot": 1, "jobName": "xxxx", "suffixname": ".JBR" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | jobName | string | 作业文件名 | | suffixname | string | 作业文件后缀名 | #### 复制作业文件 *0x3115 JOBFILE_COPY ```json { "robot": 1, "oldjobName": "xxxx", "newjobName": "xxxx", "suffixname": ".JBR" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | oldjobName | string | 旧作业文件名 | | newjobName | string | 复制后新文件名 | | suffixname | string | 作业文件后缀名 | #### 清空当前机器人作业文件 *0x3116 JOBFILE_CLEAR ```json { "robot": 1 } ``` #### 设置作业文件为主程序 *0x3117 JOBFILE_MAINJOB_SET ```json { "robot": 1, "jobName": "xxx" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | jobName | string | 主程序文件名,空表示没有 | *0x3118 JOBFILE_MAINJOB_INQUIRE ```json { "robot": 1 } ``` *0x3119 JOBFILE_MAINJOB_RESPOND ```json { "robot": 1, "jobName": "xxx" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | jobName | string | 主程序文件名,空表示没有 | #### 保存作业文件 *0x3120 JOB_SAVE ```json { "robot": 1, "jobname": "xxx", "suffix": ".JBR", "time": "JAN 24 18:32:12:2018" } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | jobname | string | 文件名 | | suffix | string | 文件后缀名 | | time | string | 保存时间 | ### 程序运行状态 #### 上位机查询程序运行状态时,发送: *0x3D02 PROGRAMRUN_STATUS_INQUIRE ```json { "robot": 1 } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,表示机器人1,2,3,4 | #### 控制器回复: *0x3D03 PROGRAMRUN_STATUS_RESPOND - 命令字:0x2304 DEADMAN_MODE_SET ```json { "robot": 1, "status": 0 } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | status | int | 程序运行状态:0-停止 1-暂停 2-运行 | ### 插入指令 *0x3121 JOB_INSERT_INSTR ```json { "robot": 1, "pos": 1, "savejobfile": true, "cmd": {"t":"moj","acc":20}cmd->toJson() } ``` | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | pos | int | 指令插入行号 | | savejobfile | bool | 是否保存作业文件 | | cmd | object | 插入指令 JSON 列表,JSON 的格式下方/**指令**/中 | /**********************以下为插入指令中的运动控制类**********************/ #### MOVJ 插入点到点 ```json { "ParaACC": { "data": 25.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 25.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 25.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GP0015", "radius": 0.0, "side": 0.0, "type": 1, "userParamInt": 0, "userParamString": "", "width": 0.0 } > 必填加速度 > 必填减速度 > 必填平滑 > 圆弧和整圆指令,0=姿态不变 1=六轴不转 2=六轴旋转 > 外部轴指令,变位机是否同步 > 必填,提前执行,自然数(ms) > 必填,速度 > 必填,速度单位:0=cm/s 1=mm/s 2=百分比 > 必填,全局点位 > 必填 1=点到,2=直线,3=圆弧,4=整圆 ``` ​ ​ #### MOVL 插入直线 ```json { "ParaACC": { "data": 100.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 100.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1000.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GP0001", "radius": 0.0, "side": 0.0, "type": 2, "userParamInt": 0, "userParamString": "", "width": 0.0 } > 必填加速度 > 必填减速度 > 必填平滑 > 圆弧和整圆指令,0=姿态不变 1=六轴不转 2=六轴旋转 > 外部轴指令,变位机是否同步 > 必填,提前执行,自然数(ms) > 必填,速度 > 必填,速度单位:0=cm/s 1=mm/s 2=百分比 > 必填,全局点位 > 必填 1=点到,2=直线,3=圆弧,4=整圆 ``` #### MOVC 插入圆弧 ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GP0001", "radius": 0.0, "side": 0.0, "type": 3, "userParamInt": 0, "userParamString": "", "width": 0.0 } > 圆弧和整圆指令,0=姿态不变 1=六轴不转 2=六轴旋转 > 必填,速度单位:0=cm/s 1=mm/s 2=百分比 > 必填 1=点到,2=直线,3=圆弧,4=整圆 ``` #### MOVCA 插入整圆 ```json { "ParaACC": { "data": 100.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 100.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1000.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GP0001", "radius": 0.0, "side": 0.0, "type": 4, "userParamInt": 0, "userParamString": "", "width": 0.0 } > 必填 1=点到,2=直线,3=圆弧,4=整圆 ``` #### MOVS 插入曲线 "cmd": ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 1, "data": [ 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0004", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 8.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "P0004", "radius": 0.0, "side": 0.0, "type": 6, "userParamInt": 0, "userParamString": "", "width": 0.0 } > MOVS在枚举数列type中为6 ``` #### IMOV 增量 "cmd": ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 3, "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "RP0001", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "RF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "RP0001", "radius": 0.0, "side": 0.0, "type": 5, "userParamInt": 0, "userParamString": "", "width": 0.0 } > IMOV在枚举数列type中为5 ``` #### MOVJEXT 插入外部轴点到点 "cmd": ```json { "ParaACC": { "data": 10.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 10.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 8.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "E0001", "radius": 0.0, "side": 0.0, "type": 32, "userParamInt": 0, "userParamString": "", "width": 0.0 } > 速度 MOVJEXT单位为百分比 范围:1~100 整数 ``` #### MOVLEXT "cmd": ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0002", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 8.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "E0002", "radius": 0.0, "side": 0.0, "type": 33, "userParamInt": 0, "userParamString": "", "width": 0.0 } > MOVLEXT 在枚举数列type中为33 ``` #### MOVCEXT "cmd": ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0003", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 8.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "E0003", "radius": 0.0, "side": 0.0, "type": 34, "userParamInt": 0, "userParamString": "", "width": 0.0 } > MOVCEXT 在枚举数列type中为34 ``` #### SPEED 全局速度 "cmd": ```json { "logout": false, "paraSpeed": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 30, "userParamInt": 0, "userParamString": "" } > 是否注销 > 全局速度值   范围:1~200 > SPEED 在枚举数列type中为30 > 二次开发自定义节点 > 二次开发自定义节点 ``` #### SAMOV 定点移动 "cmd": ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 4, "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 99999.0, 99999.0, 99999.0, 99999.0, 99999.0, 99999.0, 99999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "AP0001", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 99999.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 99999.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 99999.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 99999.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 99999.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 99999.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 99999.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "RF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "AP0001", "radius": 0.0, "side": 0.0, "type": 58, "userParamInt": 0, "userParamString": "", "width": 0.0 } > SAMOV 在枚举数列type中为58 ``` #### MOVJDOUBLE 双机点到点 "cmd": { "ParaACC": { "data": 58.0,            //加速度数值 "secondvalue": 0, "value": 0, "varname": "" },//加速度调整比率(1~100) "ParaDEC": { "data": 58.0,             //减速度数值 "secondvalue": 0, "value": 0, "varname": "" },//减速度调整比率(1~100) "ParaPL": { "data": 0.0,              //平滑数值 "secondvalue": 0, "value": 0, "varname": "" },//定位等级,范围0~5 "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" },//姿态参数 0=姿态不变 1=六轴不转 2=六轴旋转 "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" },//机器人与外部轴是否同步   0 = 否,1 = 是 "ParaTIME": { "data": 88.0,             //提前执行时间数值 "secondvalue": 0, "value": 0, "varname": "" },//提前执行,自然数(ms) "ParaV": { "data": 58.0,            //速度数值 "m_vUnit": 2,//速度单位:0=cm/s 1=mm/s 2=百分比 "secondvalue": 0, "value": 0, "varname": "" #### 速度 MOVJDOUBLE 单位为百分比 范围:1~100 整数 "ctype": 0, "imovecoord": "UF", //移动坐标:关节坐标 RF、直角坐标 BF、工具坐标 TF、用户坐标 UF "length": 0.0,//长度 "logout": false, "margin": 0.0,//边缘 "offsetAxis": 0, "para": 0, "polish": 0,//打磨次数(1~99) "polishAngle": 0.0,//打磨角度(-180~+180) "polishID": 1,//打磨 ID(1~99) "posidname": "", "posidtype": 0, "positionId": "GE0023",                //点位名称 "radius": 0.0, "side": 0.0, #### MOVJDOUBLE 在枚举数列 type 中为54 "userParamInt": 0, "userParamString": "", "width": 0.0 } #### MOVLDOUBLE 双机直线 "cmd": { "ParaACC": { "data": 2.50, "secondvalue": 0, "value": 0, "varname": "" },//加速度调整比率(1~100) "ParaDEC": { "data": 2.50, "secondvalue": 0, "value": 0, "varname": "" },//减速度调整比率(1~100) "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" },//定位等级,范围0~5 "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" },//姿态参数 0=姿态不变 1=六轴不转 2=六轴旋转 "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" },//机器人与外部轴是否同步   0 = 否,1 = 是 "ParaTIME": { "data": 88.0, "secondvalue": 0, "value": 0, "varname": "" },//提前执行,自然数(ms) "ParaV": { "data": 25.0, "m_vUnit": 1,//速度单位:0=cm/s 1=mm/s 2=百分比 "secondvalue": 0, "value": 0, "varname": "" #### 速度 MOVLDOUBLE 单位为 mm/s 范围:2~1000 整数 "ctype": 0, "imovecoord": "UF",//移动坐标:关节坐标 RF、直角坐标 BF、工具坐标 TF、用户坐标 UF "length": 0.0,//长度 "logout": false, "margin": 0.0,//边缘 "offsetAxis": 0, "para": 0, "polish": 0,//打磨次数(1~99) "polishAngle": 0.0,//打磨角度(-180~+180) "polishID": 1,//打磨 ID(1~99) "posidname": "", "posidtype": 0, "positionId": "GE0069",//位置名称 "radius": 0.0,//半径参数 "side": 0.0, #### MOVLDOUBLE 在枚举数列 type 中为55 "userParamInt": 0, "userParamString": "", "width": 0.0 } #### MOVCDOUBLE 双机圆弧 "cmd": { "ParaACC": { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" },//加速度调整比率(1~100) "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" },//减速度调整比率(1~100) "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 8.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF", //移动坐标:关节坐标 RF、直角坐标 BF、工具坐标 TF、用户坐标 UF "length": 0.0,//长度 "logout": false, "margin": 0.0,//边缘 "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GE0002", "radius": 0.0, "side": 0.0, #### MOVCDOUBLE 在枚举数列 type 中为56 "userParamInt": 0, "userParamString": "", "width": 0.0 } #### MOVCADOUBLE 双机整圆 "cmd": { "ParaACC": { "data": 3.0,            //加速度数值 "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 2.50,             //减速度数值 "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0,            //平滑数值 "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 7.0,              //提前执行时间数值 "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 25.0,             //速度数值 "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ctype": 0, "imovecoord": "UF",       //移动坐标:关节坐标 RF、直⻆坐标 BF、⼯具坐标 TF、⽤⼾坐标 UF "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "GE0693",          //点位名称 "radius": 0.0, "side": 0.0, #### MOVCADOUBLE 在枚举数列 type 中为57 "userParamInt": 0, "userParamString": "", "width": 0.0 } #### MOVCOMM 外部点 "cmd": ```json { "_pParaACC":{"data":20.0,"secondvalue":0,"value":0,"varname":""}, "_pParaDEC":{"data":20.0,"secondvalue":0,"value":0,"varname":""}, "_pParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "_pParaTIME":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "_pParaV":{"data":10.0, "m_vUnit":2, "secondvalue":0,"value":0,"varname":""}, MovJ 单位为百分比 范围:1~100 整数 MovL  单位为mm/s 范围:2~1000 整数 MovS   单位为mm/s 范围:2~1000 整数 "logout":false, "moveType":"MovJ", "type":99, "userParamInt":0, "userParamString":"" } > 运动加速度 > 运动减速度 > 平滑过渡 (0~5) > 提前执行,自然数(ms) > 速度单位:0=cm/s 1=mm/s 2=百分比 > 速度  MOVCOMM 根据插补方式不同 > 插补类型 ``` #### EXTMOV 外部轴随动 "cmd":{"_pVarName":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "extaxle":1,//外部轴编号 "logout":false, "movtype":0, //运动类型 0 =随线速度动  1 = 恒速运动 "speedproportionfactor":1.0,//速度比例系数  K:外部轴速度(°/s)=K*线速度(mm/s) #### EXTMOV 在枚举数列 type 中为142 "userParamInt":0, "userParamString":"" } #### ENDEXTMOV 外部轴随动停止(在插入外部轴随动时自动紧跟插入,不可修改) "cmd": ```json { "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "extaxle": 1, "logout": false, "movtype": 0, "speedproportionfactor": 0.0, "type": 143, "userParamInt": 0, "userParamString": "" } > 外部轴编号 > 运动类型 0 =随线速度动  1 = 恒速运动 > 速度比例系数  K:外部轴速度(°/s)=K*线速度(mm/s) > ENDEXTMOV 在枚举数列type中为143 ``` #### GEARIN 电子齿轮 "cmd": ```json { "followAxle": 1, "logout": false, "mainAxle": 1, "proportionfactor": 2.0, "type": 146, "userParamInt": 0, "userParamString": "" } > 随动轴 > 主轴 可选机器人的 J1~J6 轴 > 比例关系 K:随动轴速(°/s)=K*主轴速(°/s) > GEARIN 在枚举数列type中为146 ``` #### ENDGEARIN 电子齿轮停止(紧跟电子齿轮命令插入) "cmd": ```json { "followAxle": 1, "logout": false, "mainAxle": 1, "proportionfactor": 1.0, "type": 148, "userParamInt": 0, "userParamString": "" } > 随动轴 > 主轴 可选机器人的 J1~J6 轴 > 比例关系 K:随动轴速(°/s)=K*主轴速(°/s) > ENDGEARIN 在枚举数列type中为148 ``` #### MRESET 复位外部轴多圈转动量 "cmd": ```json { "exterAxis": 0, "logout": false, "type": 147, "userParamInt": 0, "userParamString": "" } > 外部轴个数 > MRESET 在枚举数列type中为147 ``` #### //DRAG_TRAJECTORY 拖拽轨迹 "cmd": ```json { "logout": false, "trackName": "##NNNN$$", "trackSpeed": 55, "type": 170, "userParamInt": 0, "userParamString": "" } > 自行设置的轨迹名称 > 轨迹回放速率 单位:百分比 范围:0~500 > DRAG_TRAJECTORY 在枚举数列type中为170 ``` #### SWITCHPAYLOAD 切换负载编号 "cmd": ```json { "_pVarName": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 220, "userParamInt": 0, "userParamString": "" } > SWITCHPAYLOAD 在枚举数列type中为220 ``` #### //MOVARCH 门型运动 "cmd": ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 1, "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0005", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 0, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "P0005", "radius": 0.0, "side": 0.0, "type": 233, "userParamInt": 0, "userParamString": "", "width": 0.0 } > SWITCHPAYLOAD 在枚举数列type中为233 ``` #### /**********************以上为插入指令中的运动控制类**********************/ #### /**********************以下为插入指令中的输入输出类**********************/ #### DIN IO 输入 "cmd": ```json { "ParaGroup": { "data":0.0, "secondvalue":0, "value":0, "varname":"" }, "ParaGroupNum":{"data":1.0,"secondvalue":0,"value":0,"varname":""}, "ParaGroupTime":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaGroupValue":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "errorHanding":0, "groupType":"IN#", "logout":false, "portId":-1, 例:IO板1:1~16 IO板2:17~32 IO板3:33~48 IO板4:48~64 4路输入范围1~4  每块IO板分配4个组号 8路输入范围1~2  每块IO板分配2个组号 "rate":0, "sum":0, "type":17, "userParamInt":0, "userParamString":"" } > din dout 类型 IN# IGH# IG# OT# OGH# OG# > 输入组号 1路输入范围1~16每块IO板分配16个组号, > DIN 在枚举数列type中为17 ``` #### DOUT IO 输出 将 IO 板上对应的 IO 端口置高或置低 "cmd": ```json { "ParaGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaGroupNum":{"data":1.0,"secondvalue":0,"value":0,"varname":""}, INT-I001~I100  GINT-GI001~GI990 BOOL-B001~B100  GBOOL-GB001~GB990, "ParaGroupTime":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaGroupValue":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "errorHanding":0, "groupType":"OT#", "logout":false, "portId":-1, 例:IO板1:1~16 IO板2:17~32 IO板3:33~48 IO板4:48~64 4路输入范围1~4  每块IO板分配4个组号 8路输入范围1~2  每块IO板分配2个组号 "rate":0, "sum":0, "type":16, "userParamInt":0, "userParamString":"" } > din ain 变量名字 自定义变量无变量名 其余根据变量来源有 > 状态保持时间 到时间后置零 范围 >0 > 变量来源数值 手动选择端口值 按二进制输出,每个端口二进制增 加1,例:选择端口1 值为0000 0001,  选择端口1~3   值为0000 0111 > din dout 类型 IN# IGH# IG# OT# OGH# OG# > 输出组号 1路输入范围1~16每块IO板分配16个组号, > DOUT 在枚举数列type中为16 ``` #### AIN 模拟输入 "cmd": ```json { "ParaGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaGroupNum":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaGroupTime":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaGroupValue":{"data":0.0,"secondvalue":0,"value":1,"varname":"D001"}, "errorHanding":0, "groupType":"", "logout":false, "portId":1, 例:IO板1:1~16 IO板2:17~32 IO板3:33~48 IO板4:48~64 4路输入范围1~4  每块IO板分配4个组号 8路输入范围1~2  每块IO板分配2个组号 "rate":0, "sum":0, "type":21, "userParamInt":0, "userParamString":"" } > din ain 变量名字 > 输出组号 1路输入范围1~16每块IO板分配16个组号, > AIN 在枚举数列type中为21 ``` #### AOUT 模拟输出 "cmd": ```json { "ParaGroup": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupTime": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupValue": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "errorHanding": 0, "groupType": "", "logout": false, "portId": 1, "rate": 0, "sum": 0, "type": 20, "userParamInt": 0, "userParamString": "" } > AOUT 在枚举数列type中为20 ``` #### PULSEOUT 脉冲输出 "cmd": ```json { "ParaGroup": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupTime": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupValue": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "errorHanding": 0, "groupType": "", "logout": false, "portId": -1, "rate": 100, "sum": 100, "type": 22, "userParamInt": 0, "userParamString": "" } > 脉冲频率 范围:1~1000000 整数 > 脉冲个数  范围:大于0整数 > PULSEOUT 在枚举数列type中为22 ``` #### READ_DOUT 读取输出 "cmd": ```json { "ParaGroup": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupNum": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupTime": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaGroupValue": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "errorHanding": 0, "groupType": "OT#", "logout": false, "portId": -1, "rate": 0, "sum": 0, "type": 97, "userParamInt": 0, "userParamString": "" } > READ_DOUT在枚举数列type中为97 ``` #### /**********************以上为插入指令中的输入输出类**********************/ #### /**********************以下为插入指令中的定时器类**********************/ #### TIMER 延时 "cmd": ```json { "logout": false, "paraTime": { "data": 0.01, "secondvalue": 0, "value": 0, "varname": "" }, "type": 7, "userParamInt": 0, "userParamString": "" } > 延时持续时间 > READ_DOUT在枚举数列type中为7 ``` #### /**********************以上为插入指令中的定时器类**********************/ #### /**********************以下为插入指令中的运算类**********************/ #### ADD 加 "cmd": ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":42, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > ADD在枚举数列type中为42 ``` #### SUB 减 "cmd": ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup": { "data":0.0, "secondvalue":0, "value":1, "varname":"I001" }, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":43, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > SUB在枚举数列type中为43 ``` #### MUL 乘 "cmd": ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":44, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > MUL在枚举数列type中为44 ``` #### DIV 除 "cmd": ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":45, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > DIV在枚举数列type中为45 ``` #### MOD 模 "cmd": ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":46, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > MOD在枚举数列type中为46 ``` #### SIN 正弦 cmd: ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":100, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > SIN在枚举数列type中为100 ``` #### COS 余弦 cmd: ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":101, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > COS在枚举数列type中为101 ``` #### ATAN 反正切 ```json { "desType":2, "desValue":"0", DOUBLE D001~D100  GINT GI001~GI990  GDOUBLE GD001~GD990, "key":"I000", GINT GI001~GI990  GDOUBLE GD001~GD990, "logout":false, "paraSourceGroup":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}, "paraValueGroup":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "type":102, "userParamInt":0, "userParamString":"" } > 变量值来源 0-自定义 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > 变量参数 自定义变量参数范围无限制 ,INT I001~I100 > 变量名INT I001~I100  DOUBLE D001~D100 > ATAN在枚举数列type中为102 ``` #### LOGICAL_OP  逻辑运算 { "cmd": ```json { "logicalType": 0, "logout": false, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupStore": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 119, "userParamInt": 0, "userParamString": "" } > 参数1 > 结果 > 参数2 > LOGICAL_OP在枚举数列type中为119 ``` #### /**********************以上为插入指令中的运算类**********************/ #### /**********************以下为插入指令中的条件控制类**********************/ #### CALL 调用子程序 执行该命令时,跳转到被调用的子程序,子程序执行完毕后回到主程序 CALL 命令后一行继续执行 "cmd": ```json { "jobName": "CVCXV", "lineNoToCall": 0, "logout": false, "type": 15, "userParamInt": 0, "userParamString": "" } > 子程序名 > 是否注释 > CALL 在枚举数列type中为119 ``` #### CALL_LUAFILE 调用 Lua 文件 "cmd": ```json { "logout": false, "luaStringIstructionsn": "", "luafileName": "demo.lua", "textEditType": true, "type": 219, "userParamInt": 0, "userParamString": "" } > lua文件名 > CALL_LUAFILE 在枚举数列type中为119 ``` #### IF 如果 ELSEIF ELSE "cmd": ```json { "ifconditionArrayFINAL": { "conditionGroup": [[{ "desValue":"0", I001~I100   D001~D100  B001~B100  GI001~GI990    GD001~GD990  GB001~GB990 DIN 每块IO板16个数字输入 例 DIN24  24 = 16 + 8 24表示IO2板的8号口 IO1板16 + IO2板 8 AIN每块IO板2个模拟输入 例 AIN3 3=2+1  表示IO2板1号口 IO1板2+IO2板1, "key":"I001", DIN 每块IO板16个数字输入 例 DIN24  24 = 16 + 8 24表示IO2板的8号口 IO1板16 + IO2板 8 AIN每块IO板2个模拟输入 例 AIN3 3=2+1  表示IO2板1号口 IO1板2+IO2板1, "logicType":1, "paraGroupOne":变量1 { "data":0.0, "secondvalue":0, "value":1, "varname":"I001" }, "paraGroupTwo":{"data":0.0,"secondvalue":0,"value":0,"varname":""}变量2 }]]}, "logout":false, "type":9, "userParamInt":0, "userParamString":"" } > 比较变量值 自定义变量范围[-999999,999999] > 参数名 I001~I100   D001~D100  B001~B100  GI001~GI990    GD001~GD990  GB001~GB990 > 比较方式 1:== 2:< 3:> 4:<= 5:>= 6:!= > IF在枚举数列type中为9 ELSE10 ELSEIF11 ``` IF 和 ENDIF 配对使用,不能单独删除或更改,会导致程序运行出错 ELSE IF 不可脱离 IF 单独使用 #### WAIT 等待 "cmd": ```json { "logout": false, "m_filterTime": -1.0, "now": 0, "paraTime": { "data": -1.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 8, "userParamInt": 0, "userParamString": "", "waitConditionFinal": { "conditionGroup": [ [ { "desValue": "0", "key": "I001", "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ] } } > 参数1 > 参数2 ``` #### WHILE 循环 WHILE 和 ENDWHILE 必须配对使用,不能单独删除,会导致程序运行出错 "cmd": ```json { "logout":false, "type":13, "userParamInt":0, "userParamString":"", "whileconditionArrayFINAL": { "conditionGroup": [[{ "desValue":"0", "key":"I001", DIN 每块IO板16个数字输入 例 DIN24  24 = 16 + 8 24表示IO2板的8号口 IO1板16 + IO2板 8 AIN每块IO板2个模拟输入 例 AIN3 3=2+1  表示IO2板1号口 IO1板2+IO2板1, "logicType":1, "paraGroupOne": { "data":0.0, "secondvalue":0, "value":1, "varname":"I001" }, "paraGroupTwo":{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} }]]}} > WHILE在枚举数列type中为13 > 参数名 > 参数名 I001~I100   D001~D100  B001~B100  GI001~GI990    GD001~GD990  GB001~GB990 > 比较方式 1:== 2:< 3:> 4:<= 5:>= 6:!= > 参数1 > 参数2 ``` #### ENDWHILE 结束循环 "cmd":{ "logout":false, #### ENDWHILE 在枚举数列 type 中为14 "pos":6, "robot":1, "time":"2021.05.18 02:46:05" #### LABEL 标签 "cmd": ```json { "jumpConditionFlag": false, "label": "[$DSFSF$]", "logout": false, "type": 50, "userParamInt": 0, "userParamString": "" } > 标签名 只能字母开头 > LABLE在枚举数列type中为50 ``` #### JUMP 跳转 JUMP 必须与 LABEL 配合使用,运行到 JUMP 指令后,若设定了判断条件,则直接跳转到对应的 LABEL 指令后运行 LABEL 下一行指令 "cmd": ```json { "jumpCondition": { "conditionGroup": [ [ { "desValue": "0", "key": "I001", "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ] }, "jumpConditionFlag": true, "label": "[$DSFSF$]", "logout": false, "type": 51, "userParamInt": 0, "userParamString": "" } > 参数名 > 参数名 > 比较方式 1:== 2:< 3:> 4:<= 5:>= 6:!= > 变量参数1 > 变量参数2 > 对应标签 > JUMP 在枚举数列type中为51 ``` #### UNTIL 直到 当条件满足时,无论机器人是否运行,立即暂停并开始 ENDUNTIL 指令下面的一条指令 UNTIL 和 ENDUNTIL 一一对应,需同时删除,否则程序会报错 "cmd": ```json { "logout": false, "type": 85, "untilconditionArrayFINAL": { "conditionGroup": [ [ { "desValue": "0", "key": "I001", "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ] }, "userParamInt": 0, "userParamString": "" } > UNTIL 在枚举数列type中为85 ``` #### ENDUNTIL 停止直到 满足直到条件后运行该指令下一行的指令 "cmd":{ "userParamInt":0, "userParamString":"", "logout":false, #### ENDUNTIL 在枚举数列 type 中为86 #### CRAFTLINE  工艺跳行 专用工艺指令,程序中运行该指令后,在专用工艺界面会跳转到对应的行数 "cmd":{ "line":3, //专用工艺界面中对应的指令行数 "logout":false, "type":87,//CRAFTLINE  在枚举数列 type 中为87 "userParamInt":0, "userParamString":"" }, #### CMDNOTE  指令注释 "cmd":{ "logout":false, "note":"##YYYY$$", //YYYY 为注释内容 "type":125, "userParamInt":0, "userParamString":"" }, //CMDNOTE  在枚举数列 type 中为125 #### POS_REACHABLE 是否可达判断 "cmd": { "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 6,     //变量类型  3:B  6: GB "varname": "GB001"   //状态存入变量名称 },//判断能否通过插补运行到位置点 能-1  不能-0 "logout": false, "moveType": 0, "positionId": "GP0001",    //位置变量名称  GP/P 点位 "type": 131,//POS_REACHABLE 在枚举数列 type 中为131 "userParamInt": 0, "userParamString": "" } #### CLKSTART  计时开始 "cmd": ```json { "ID": 1, "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" }, "logout": false, "type": 126, "userParamInt": 0, "userParamString": "" } > 计时序号 > 存入变量 > 注销 > CLKSTART 在枚举数列type中为126 ``` #### CLKSTOP  计时停止 "cmd": ```json { "ID": 1, "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 127, "userParamInt": 0, "userParamString": "" } > 要停止的计时序号 1~32 > CLKSTOP  在枚举数列type中为127 ``` #### CLKRESET  计时复位 "cmd": ```json { "ID": 1, "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 128, "userParamInt": 0, "userParamString": "" } > 要复位的计时序号 1~32 > CLKRESET  在枚举数列type中为128 ``` #### READLINEAR  读取线速度 "cmd": ```json { "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001" }, "logout": false, "type": 144, "userParamInt": 0, "userParamString": "" } > READLINEAR  在枚举数列type中为144 ``` #### STOPREADLINEAR 读取线速度停止 "cmd": ```json { "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 145, "userParamInt": 0, "userParamString": "" } > STOPREADLINEAR 在枚举数列type中为145 ``` #### CALL_LUASTRING 调用 lua 语句 "cmd": ```json { "logout": false, "luaStringIstructionsn": "", "luafileName": "", "textEditType": true, "type": 231, "userParamInt": 0, "userParamString": "" } > lua语句 > CALL_LUASTRING 在枚举数列type中为145 ``` #### WAIT_POS 等到运动到点 "cmd": ```json { "accurary": 0.1, "logout": false, "maxTime": 200, "minTime": 20, "type": 234, "userParamInt": 0, "userParamString": "", "waitType": 0 } > 精度 度(0.0001-0.1) > 最大等待时间 > 最小等待时间 > WAIT_POS 在枚举数列type中为234 ``` #### /**********************以上为插入指令中的条件控制类**********************/ #### /**********************以下为插入指令中的变量类**********************/ #### SET 赋值 ```json { "boolValue": false, "doubleValue": 0.0, "intValue": 0, "key": "I000", "logout": false, "strValue": "0", "type": 41, "userParamInt": 0, "userParamString": "", "varType": 0, "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GI001" } } > 是否注销 > SET 指令值 > 变量 > 当value=0是,值在此填 > 是否内嵌变量 > 0-非字符串的手填值 7-字符串手填值 8-局部或全局变量 > 当value=7,值在此填 当value=8 填变量名 GI001 GB GD I001等 > 变量值 下方参数注释如上 ``` #### FORCESET  写入文件 在程序运行过程中,所有的计算、赋值操作均是对缓存中的数值进行更改的,并不会存入 系统文件中,即当程序运行停止后所有全局变量的值都会还原。 若要强制将内容中的全局数值变量写入文件中,则可以使用 FORCESET 指令 "cmd": ```json { "logout": false, "type": 41, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GI001" } } > FORCESET  在枚举数列type中为41 > 变量名 ``` #### /**********************以上为插入指令中的变量类**********************/ #### /**********************以下为插入指令中的字符串类**********************/ #### STRING_SPELL 字符串追加 "cmd": ```json { "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "endIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "nonVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "separator": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "startIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 224, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 7, "varname": "5" } } > STRING_SPELL 在枚举数列type中为224 > STRING_SPELL 字符串追加,变量 > STRING_SPELL 字符串追加,变量值 ``` #### STRING_SLIC 索引截取 "cmd": ```json { "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "endIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "nonVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "separator": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "startIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 225, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 7, "varname": "5" } } > STRING_SLICE起始索引 > STRING_SLIC 在枚举数列type中为225 > 数据存放的变量 ``` #### STRING_SPLIT 字符串分隔符拆分 "cmd": ```json { "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "endIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "nonVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "separator": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "startIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 224, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 7, "varname": "5" } } > 记录提取数据的数量 > 查询的数据依次存放的首地址 > 分隔符的类型 > 被提取的字符串变量名 ``` #### STRING_LOCATE 字符串定位 "cmd": ```json { "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "endIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "nonVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "separator": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "startIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 224, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 7, "varname": "5" } } > 记录提取数据的数量 > 查询的数据依次存放的首地址 > 待索引变量,需要搜索的字符 > 变量,定位字符所在的变量 ``` #### STRING_LENGTH 字符串长度 "cmd": ```json { "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "endIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "nonVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "separator": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "startIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 224, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 7, "varname": "5" } } > 数据存放的变量,计算结果存储的变量 > 变量,待计算长度的变量 ``` #### STRING_TO 字符串转非字符串 "cmd": ```json { "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "endIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "nonVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "separator": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "startIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 224, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 7, "varname": "5" } } > 非字符串变量,转译的目标变量 > 字符串变量,需要转译的字符串 ``` #### TO_STRING 非字符串转字符串 "cmd": ```json { "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "endIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "nonVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "separator": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "startIndex": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 224, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 7, "varname": "5" } } > 非字符串变量,需要转译的变量 > 字符串变量,转译的目标变量 ``` #### /**********************以上为插入指令中的变量类**********************/ #### /**********************以下为插入指令中的坐标系类**********************/ #### SWITCHTOOL 切换工具手 "cmd": { "CoordA": 1, "CoordB": 1, "CoordC": 1, "_variable": { "data": 0.0,                   //手填值 (选择工具手的编号) "secondvalue": 1, "value": 1, "varname": "GI001"            //变量类型 (选择工具手的编号) }, "coordType": 0, "logout": false,//注销 "type": 47,//在枚举数列 type 中为47 "userParamInt": 0,//二次开发自定义参数 "userParamString": ""//二次开发自定义参数 } #### SWITCHUSER 切换用户坐标 "cmd": { "CoordA": 1, "CoordB": 1, "CoordC": 1, "_variable": { "data": 66.0,                     //手填值 (选择工具手的编号) "secondvalue": 0, "value": 0, "varname": ""                     //变量类型 (选择工具手的编号) }, "coordType": 1, "logout": false, #### SWITCHUSER 在枚举数列 type 中为48 "userParamInt": 0, "userParamString": "" } #### USERCOORD_TRANS 用户坐标转换 "cmd": ```json { "CoordA": 3, "CoordB": 4, "CoordC": 5, "coordType": 0, "logout": false, "type": 115, "userParamInt": 0, "userParamString": "" } > 用户坐标A  1~999整数 > 用户坐标B  1~999整数 > 用户坐标C  1~999整数 > USERCOORD_TRANS在枚举数列type中为115 ``` #### SWITCHSYNC 切换外部轴 "cmd": ```json { "logout": false, "syncgroup": 3, "type": 49, "userParamInt": 0, "userParamString": "" } > 外部轴组号0~3  0-无外部轴 1-3:外部轴组号 > SWITCHSYNC在枚举数列type中为49 ``` #### /**********************以上为插入指令中的坐标系类**********************/ #### /**********************以下为插入指令中的网络通讯类**********************/ #### SENDMSG  发送数据 "cmd": ```json { "ID": 1, "logout": false, "sendChar": "2", "type": 92, "userParamInt": 0, "userParamString": "" } > 工艺号1~9 > XXXXX为发送的字符信息 > SENDMSG  在枚举数列type中为92 ``` #### PARSEMSG  解析数据 "cmd": { "ID": 1,        //ID 工艺 "clearCache": 1,         //解析后清除缓存器 "dataStorage": {    //数据存在数 "data": 0.0,          //手填值 "secondvalue": 0, "value": 4,        //变量类型选择    1;I  4: GI "varname": "GI021"   //变量名字 }, "dataVariable": {        //数据存放的首个变量 "data": 0.0, "secondvalue": 0, "value": 2,       //变量类型选择   1;I  2:D  4:GI  5:GD  8: S "varname": "D004"   //变量名称 }, "logout": false,//是否注销 #### PARSEMSG 在枚举数列 type 中为94 "userParamInt": 0,//二次开发自定义参数 "userParamString": ""//二次开发自定义参数 } #### READCOMM  读取 "cmd": ```json { "ID": 6, "commType": 0, "logout": false, "m_varname": "I008", "positionId": "GP0007", "type": 108, "userParamInt": 0, "userParamString": "" } > 工艺号1~9 > 通讯方式 0-Ethernet 1-Modbus > 变量名点位存放个数 I001~I100 GI001~GI990 > 点位存放首个变量 > READCOMM  在枚举数列type中为108 ``` #### OPENMSG  打开数据 "cmd": ```json { "ID": 9, "logout": false, "type": 113, "userParamInt": 0, "userParamString": "" } > 工艺号1~9 > OPENMSG  在枚举数列type中为113 ``` #### CLOSEMSG 关闭数据 "cmd": ```json { "ID": 1, "logout": false, "type": 114, "userParamInt": 0, "userParamString": "" } > 工艺号1~9 > CLOSEMSG在枚举数列type中为114 ``` #### PRINTMSG 输出字符 "cmd": ```json { "logout": false, "printChar": "11", "printType": 0, "type": 118, "userParamInt": 0, "userParamString": "" } > 输出字符 > PRINTMSG 在枚举数列type中为118 ``` #### MSG_CONNECTION_STATUS 获取信息连接状态 "cmd": ```json { "ID": 1, "logout": false, "type": 93, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 6, "varname": "GB012" } } > 网络设置的工艺号  1~9 > MSG_CONNECTION_STATUS在枚举数列type中为93 > 状态存入变量名 ``` #### /**********************以上为插入指令中的网络通讯类**********************/ #### /**********************以下为插入指令中的位置变量类**********************/ #### USERFRAME_SET  用户坐标修改 {"cmd": ```json {"ID":1, "coord":"UX", "logout":false, "m_newValue":"", "m_varName":"GD001", "type":95,在枚举数列type中为95, "userParamInt":0, "userParamString":"", "varType":4 } > 用户坐标编号 1~999整数 > 用户坐标参数 UX,UY,UZ,UA,UB,UC > 手填变量值 范围[-50000,50000] > 变量名 I001~I100 GI001~GI990 B001~B100  GB001~GB990 > 变量对应的类型(0:手填值,1:I变量,2:D变量,3:GI变量,4:GD变量 ``` #### TOOLFRAME_SET  工具坐标修改 "cmd": { "ID": 1,                     //用户坐标编号1~999整数 "coord": "TX",             //用户坐标参数 TX,TY,TZ,TA,TB,TC "logout": false, "m_newValue": "",         //手填变量值 "m_varName": "GD001",    //变量 I001~I100 GI001~GI990 D001~B100  GD001~GB990 #### TOOLFRAME_SET 在枚举数列 type 中为96 "userParamInt": 0, "userParamString": "", "varType": 4          //变量对应的类型(0:手填值,1:I 变量,2:D 变量,3:GI 变量,4:GD 变量 } #### READPOS 读取点位 "cmd": { "axis": 2,                  //位置变量轴 1~6--1~6轴 8~13--O1~O6 "coord": "BF",            //位置变量坐标系 RF-关节坐标 BF-直角坐标 TF-工具坐标 UF-用户坐标 "logout": false, "posidname": "", "posidtype": 0,//0-位置变量名固定 P001 G001 1-位置变量名不固定 P$I001 P$GI001  G$I001 G$GI001 "positionId": "GP0001",   //读取的点位(不填为当前位置 当位置变量类型选择局部位置变量或全局位置变 量,这里选择对应的变 量名。若选择 P$INT、P$GINT、G$INT、 G$GINT,在这里选择对应的整型变量名。例 选择 P$INT,变量 名 I001,I001=33,则得到的位置变量为 P033 #### READPOS 在枚举数列 type 中为90 "userParamInt": 0, "userParamString": "", "varname": "GD001"         //读取到的值存放的变量 } #### POSADD  点位加 "cmd": { "axis": 3,           //位置变量轴 1~6--1~6轴 8~13--O1~O6 #### 运算类型 0-ADDTYPE 点位加 1-SUBTYPE 点位减 2-SETTYPE 点位改 "coord": "BF",          //位置变量坐标系 RF-关节坐标 BF-直角坐标 TF-工具坐标 UF-用户坐标 "datatype": 0, //变量值类型 0-手填值 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE "desData": "87",         //位置变量值 "logout": false, //注释 "posidname": "", "posidtype": 0, //0-位置变量名固定 P001 G001 1-位置变量名不固定 P$I001 P$GI001  G$I001 G$GI001 "positionId": "GP0001",       //位置变量名 P001 GP001 E001 GP001 I001 GI001 "type": 91, //POSCAL  在枚举数列 type 中为91 "userParamInt": 0, "userParamString": "" } #### POSSUB  点位减 "cmd": { "axis": 3,          //位置变量轴 1~6--1~6轴 8~13--O1~O6 #### 运算类型 0-ADDTYPE 点位加 1-SUBTYPE 点位减 2-SETTYPE 点位改 "coord": "BF",     //位置变量坐标系 RF-关节坐标 BF-直角坐标 TF-工具坐标 UF-用户坐标 "datatype": 0, //变量值类型 0-手填值 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE "desData": "87",         //位置变量值 范围[-50000,50000] "logout": false, "posidname": "", "posidtype": 0,//0-位置变量名固定 P001 G001 1-位置变量名不固定 P$I001 P$GI001  G$I001 G$GI001 "positionId": "GP0001",       //位置变量名 "type": 91, //POSCAL  在枚举数列 type 中为91 "userParamInt": 0, "userParamString": "" } #### POSSET  点位改 "cmd": { "axis": 3,          //位置变量轴 1~6--1~6轴 8~13--O1~O6 #### 运算类型 0-ADDTYPE 点位加 1-SUBTYPE 点位减 2-SETTYPE 点位改 "coord": "BF",          //位置变量坐标系 RF-关节坐标 BF-直角坐标 TF-工具坐标 UF-用户坐标 "datatype": 0,//变量值类型 0-手填值 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE "desData": "87",         //位置变量值 "logout": false, "posidname": "", "posidtype": 0,//0-位置变量名固定 P001 G001 1-位置变量名不固定 P$I001 P$GI001  G$I001 G$GI001 "positionId": "GP0001",       //位置变量名 P001 GP001 E001 GP001 I001 GI001 "type": 91,//POSCAL  在枚举数列 type 中为91 "userParamInt": 0, "userParamString": "" } #### COPYPOS  复制点位 "cmd": { "cpaxles": [ 1, 2, 6 ],                              //选择复制的轴号 "cpaxletype": 1, "cpdposId": "GE0001",           //目标位置变量名 "cpdposname": "", "cpdpostype": 0, "cpposId": "GP0065",                //源目标变量名 "cpposname": "", "cppostype": 0, "logout": false, #### COPYPOS 在枚举数列 type 中为116 "userParamInt": 0, "userParamString": "" } #### POSADDALL 点位全加 "cmd": { "calData": ["3", "6", "8", "5", "7", "2", "[-]", "1", "2", "3", "4", "5", "[-]", "[-]"],    //坐标位置机器人本体+外部轴 "caltype": 0,//0-全加 1-全减 2-全改 "coord": "TF",     //位置变量坐标系 RF-关节坐标 BF-直角坐标 TF-工具坐标 UF-用户坐标 "datatype": [0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2],      //点位数据类型 "logout": false, "posidname": "",//空为固定变量名  其余为 P$INT   P$GINT  GP$INT GP$GINT  E$INT E$GINT  GE$INT  GE$GINT "posidtype": 0,//0-位置变量名固定 局部 P 点 全局 P 点 局部 E 点全局 E 点  1-位置变量名不固定 P$INT P$GINT  GP$INT GP$GINT  E$INT E$GINT  GE$INT  GE$GINT "positionId": "GE0002",     //位置变量名 "type": 138,//POSCALALL 在枚举数列 type 中为138 "userParamInt": 0, "userParamString": "" } #### POSSUBALL 点位全减 ```json { "cmd": { "calData": [ "3", "6", "8", "5", "7", "2", "[-]", "1", "2", "3", "4", "5", "[-]", "[-]" ], "caltype": 1, "coord": "TF", "datatype": [ 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2 ], "logout": false, "posidname": "", "posidtype": 0, "positionId": "GE0002", "type": 138, "userParamInt": 0, "userParamString": "" }, "pos": 1, "robot": 1, "savejobfile": true } > 坐标位置机器人本体+外部轴 > 0-全加 1-全减 2-全改 > 位置变量坐标系 RF-关节坐标 BF-直角坐标 TF-工具坐标 UF-用户坐标 > 点位数据类型 > 空为固定变量名  其余为P$INT   P$GINT  GP$INT GP$GINT  E$INT E$GINT  GE$INT  GE$GINT > 位置变量名 > POSCALALL 在枚举数列type中为138 ``` #### POSSETALL 点位全改 "cmd": { "calData": ["3", "6", "8", "5", "7", "2", "[-]", "1", "2", "3", "4", "5", "[-]", "[-]"],    //坐标位置机器人本体+外部轴 "caltype": 2,//0-全加 1-全减 2-全改 "coord": "TF",    //位置变量坐标系 RF-关节坐标 BF-直角坐标 TF-工具坐标 UF-用户坐标 "datatype": [0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2],      //点位数据类型 "logout": false, "posidname": "", "posidtype": 0, "positionId": "GE0002",     //位置变量名 "type": 138,//POSCALALL 在枚举数列 type 中为138 "userParamInt": 0, "userParamString": "" } #### TOFFSETON  轨迹偏移开始 "cmd": ```json { "calData": [ "34", "35", "36", "37", "38", "39", "40" ], "coord": "RF", "datatype": [ 0, 0, 0, 0, 0, 0, 0 ], "logout": false, "tool": -1, "type": 139, "user": -1, "userParamInt": 0, "userParamString": "" } > 轴参数 手填值范围[-50000,50000] > 位置变量坐标系 RF-关节坐标 BF-直角坐标 > 变量类型 0-手填值 1-INT 2-DOUBLE 3-GINT 4-GDOUBLE > TOFFSETON  在枚举数列type中为139 ``` #### TOFFSETOFF 轨迹偏结束 "cmd": ```json { "calData": [ "0", "0", "0", "0", "0", "0", "0" ], "coord": "RF", "datatype": [ 0, 0, 0, 0, 0, 0, 0 ], "logout": false, "tool": -1, "type": 140, "user": -1, "userParamInt": 0, "userParamString": "" } > TOFFSETOFF 在枚举数列type中为140 ``` #### READPOSMSG  读取点位信息 "cmd": ```json { "logout": false, "message": 0, "positionId": "GP0041", "type": 171, "userParamInt": 0, "userParamString": "", "varName": "I042", "varType": 0 } > 信息读取值  0-工具号 1-用户坐标号 2-坐标系 3-姿态角度/弧度 4-形态 > 变量名 P001 GP001 E001 GE001 > READPOSMSG  在枚举数列type中为171 > 目标变量名 ``` #### POS_STRETCH 点位拉伸 "cmd": ```json { "logout": false, "position1Id": "GP0043", "position1OutId": "GP0047", "position2Id": "", "position2OutId": "GP0048", "position3Id": "GP0044", "stretchL1": 45.0, "stretchL2": 46.0, "stretchType": 0, "type": 173, "userParamInt": 0, "userParamString": "" } > 起点 > 输出起点位置,偏移后的起点位置 > 圆弧中间点 > 输出终点位置 > 终点 > 起点偏移 > 终点偏移 > 拉伸类型 > POS_STRETCH ``` #### 设置点位信息 SETPOSMSG "cmd": { "logout": false, "posData": ["GI001", "1", "3", "GI001", "GI001"],       //坐标系,角度/弧度,形态,工具号,用户坐标号 "posDataType": [1, 0, 0, 1, 1],                        //值类型 "posidname": "", "posidtype": 0, "positionId": "GP0069",                               //位置变量 "type": 208, "userParamInt": 0, "userParamString": "" } #### /**********************以上为插入指令中的位置变量类**********************/ #### /**********************以上为插入指令中的程序控制类**********************/ #### PTHREAD_START  开启线程 "cmd": ```json { "jobName": "AVC", "localOrGlobal": 0, "logout": false, "type": 88, "userParamInt": 0, "userParamString": "" } > 后台任务程序文件名 > 0-局部后台 1-全局后台 > PTHREAD_START在枚举数列type中为88 ``` #### PTHREAD_END  退出线程 "cmd":{ "jobName":"PPPPPP", //后台任务程序文件名 "localOrGlobal":0, //0-局部后台  1-全局后台 "logout":false, //PTHREAD_END 在枚举数列 type 中为88 "type":89, "userParamInt":0, "userParamString":"" } #### PAUSERUN  暂停运行 "cmd": { "jobname": "AAA",     //当选取局部后台类型时 选择的程序名 "logout": false, "programtype": 2,     //0:全部  1:主程序   2:局部后台 "type": 109,//PAUSERUN  在枚举数列 type 中为109 "userParamInt": 0, "userParamString": "" } #### COUNTINUERUM 继续运行 "cmd": { "jobname": "AAA",       //局部后台的文件名称 "logout": false, "programtype": 2,       //1:主程序   2:局部后台 "type": 110, //STOPRUN  在枚举数列 type 中为111 "userParamInt": 0, "userParamString": "" } #### STOPRUN  停止运行 "cmd": { "jobname": "",//当选取局部后台类型时 选择的程序名 "logout": false, "programtype": 0,//程序类型 0-全部程序 1-主程序 2-局部后台程序 "type": 111, //STOPRUN  在枚举数列 type 中为111 "userParamInt": 0, "userParamString": "" } #### RESTRATRUN  重新运行 "cmd":{ "jobname":"", //当选取局部后台类型时 选择的程序名 "logout":false, "programtype":0, //程序类型 0-全部程序 1-主程序 3-局部后台程序 "type":117,//RESTRATRUN  在枚举数列 type 中为117 "userParamInt": 0, "userParamString": ""} #### WINDOW 弹窗指令 "cmd": ```json { "count": 3, "logout": false, "text1": "1", "text2": "3", "text3": "5", "text4": "7", "type": 209, "userParamInt": 0, "userParamString": "", "value1": 4, "value2": 6, "value3": 8, "variable": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" } } > 选择数量 > 提示内容 > 选项1内容 > 选项2内容 > 选项3内容 > WINDOW 弹窗指令 > 选项1对应变量值 > 选项2对应变量值 > 选项3对应变量值 > 绑定变量 ``` #### PTHREAD_STATE 线程状态 "cmd": { "jobName": "XXX",           //程序名称 "localOrGlobal": 0,      //程序类型0:局部后台  1:全局后台  2:主程序 "logout": false, "m_VariableValue": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"      //存入变量类型 }, "type": 210, "userParamInt": 0, "userParamString": "" } #### /**********************以上为插入指令中的程序控制类**********************/ #### /**********************以下为插入指令中的 MODBUS 类**********************/ #### MODBUS_OPEN 打开 modbus 连接 "cmd": ```json { "ID": 1, "addressNumber": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "addressType": "", "dataType": "short", "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "firstAddress": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 211, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > MODBUS_OPEN 打开modbus连接 ``` #### MODBUS_CLOSE 关闭 modbus 连接 ```json { "ID": 1, "addressNumber": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "addressType": "", "dataType": "short", "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "firstAddress": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 212, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > 212MODBUS_CLOSE 关闭modbus连接 ``` #### MODBUS_CONNECTION_STATUS MODBUS 连接状态 ```json { "ID": 1, "addressNumber": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "addressType": "", "dataType": "short", "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "firstAddress": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 213, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > 213MODBUS_CONNECTION_STATUS MODBUS连接状态 > 状态存入变量名 ``` #### MODBUS_READ modbus 读操作 ```json { "ID": 1, "addressNumber": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "addressType": "", "dataType": "short", "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "firstAddress": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 214, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > 读从站地址个数 > 地址类型 > 数据类型 > 数据存放的首个变量 > 从站寄存器首个地址 > 214MODBUS_READ modbus读操作 ``` #### MODBUS_WRITE modbus 写操作 ```json { "ID": 1, "addressNumber": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "addressType": "", "dataType": "short", "dataVariable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "firstAddress": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "type": 215, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > 写从站地址个数 > 地址类型 > 数据类型 > 数据存放的首个变量 > 写从站地址个数 > 215MODBUS_WRITE modbus写操作 ``` #### /**********************以上为插入指令中的 MODBUS 类**********************/ #### /**********************以下为插入指令中的 FINSTCP 类**********************/ #### FINSTCP_OPEN 打开 FINSTCP 连接 "cmd": ```json { "ID": 1, "logout": false, "type": 216, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > 216FINSTCP_OPEN 打开FINSTCP连接 ``` #### FINSTCP_CLOSE 断开 FINSTCP 连接 "cmd": ```json { "ID": 1, "logout": false, "type": 217, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > 217FINSTCP_CLOSE 断开FINSTCP连接 ``` #### FINSTCP_CONNECTION_STATUS FINSTCP 连接状态 "cmd": ```json { "ID": 1, "logout": false, "type": 218, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } > 工艺号 > 状态存入变量名 ``` #### /**********************以上为插入指令中的 FINSTCP 类**********************/ #### /**********************以下为插入指令中的码垛控制类**********************/ #### PALON   码垛开始 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 69, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > PALON   在枚举数列type中为69 ``` #### PALGRIPPER  切换抓手 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 70, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > 抓手2 > PALGRIPPER 在枚举数列type中为70 ``` #### PALENTER  码垛入口点 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 72, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > 加速度参数 1~100 > 减速度参数 1~100 > 平滑过度参数0-5 > 提前执行 自然数 > //速度单位 0-cm/s 1-mm/s 2-% > 速度 1~100 > 插补方式 MovJ-关节 MovL-直线 MovC-圆弧 > PLAENTER  在枚举数列type中为72 > xy路径优化 0-关闭 1-打开 > z路径优化 0-关闭 1-打开 ``` #### PALSHIFT  码垛辅助点 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 73, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > 加速度参数 1~100 > 减速度参数 1~100 > PALSHIFT  在枚举数列type中为73 > xy路径优化 0-关闭 1-打开 > z路径优化 0-关闭 1-打开 ``` #### PALREAL  码垛工件点 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 74, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > PALREAL  在枚举数列type中为74 ``` #### PALCLEAR  码垛复位 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 75, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > PALCLEAR  在枚举数列type中为75 ``` #### PALOFF  码垛结束判断 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 76, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > 结束判断变量名 [-]-无 B001 GB001 > PALOFF  在枚举数列type中为76 ``` #### PAL_POS 获取工件点位 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 222, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > PAL_POS 获取工件点位  在枚举数列type中为222 ``` #### PALSIMPLESET 简易码垛 "cmd": ```json { "ID": 1, "MULTIPAL": 0, "NUM": 0, "PalPOS_pointType": 0, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaLINE": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSTRAIGHT": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "Posture": 0, "STACKTYPE": 0, "_pCurrentLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "_pLayNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pLayersNum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "_pPalOffvarName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pSerialNum": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pTecNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "_pWorkpieceSum": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "getPointPosPos": 0, "logout": false, "m_getPointPosId": "[-]", "m_getPointPosname": "[-]", "m_numVariableType": [ 0, 0, 0 ], "m_pointVariableType": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "moveType": "MovC", "offsetAxis": 0, "pointVariableName": [ "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]" ], "tool": 0, "type": 223, "userParamInt": 0, "userParamString": "", "variableData": [ "", "", "" ], "xyOpt": 0, "zOpt": 0 } > 工艺号 > 多重码垛  0-关闭 1-打开 > PALSIMPLESET 简易码垛 在枚举数列type中为223 ``` #### /**********************以上为插入指令中的码垛控制类**********************/ #### /**********************以下为插入指令中的焊接控制类**********************/ #### ARCON 焊接开始 ARCOFF 焊接结束 ARCSET 焊接结束 WVON 摆焊开始 WVOFF 摆焊结束 FEEDWIRE 送丝 REFP 摆焊参考点 SPOTWELD 点焊 "cmd":{ "anamorphismFlag":0,//使用起弧渐变 "arcParameterId":1, //要使用的焊接参数工艺号 "current":0.0,//设置焊接电流 "feedtime":0.0,//延时时间,送丝时间 "generatingOfArcAgainFlag":0,//使用再起弧 "generatingOfArcCurrent":99999.0, //起弧电流 "generatingOfArcTime":99999.0, //起弧时间 "generatingOfArcVoltage":1.0, //起弧电压 "logout":false, //是否注销 "positionId":"", //位置 ID "preventStickingWireFlag":0,//防粘丝 "quenchingAnamorphismFlag":0,//灭弧渐变 "quenchingOfArcCurrent":99999.0,//灭弧电流 "quenchingOfArcTime":99999.0,//收弧时间 "quenchingOfArcVoltage":99999.0, //灭弧电压 "refpPointNum":0, //REFP 参考点 "startUpAgainFlag":0, //使用再启动 #### ARCON 在枚举数列 type 中为23 "useTemp":1, //临时参数,1:使用临时参数,0:不使用 "userParamInt":0, // "userParamString":"", // "voltage":0.0, //设置焊接电压 "weldCurrent":99999.0,//焊接电流 "weldVoltage":99999.0,//焊接电压 "RobotPos"://REFP 指令时存在 ```json {"ctype":1, "data":[1.0,1.0,0.0,0.0,0.0,0.0,0.0,36.0,0.0,6.0,3.141590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0], "key":"P0002", "paraVarData": [{"data":1.0, "secondvalue":0, "value":0, "varname":"" },{"data":1.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":36.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":6.0,"secondvalue":0,"value":0,"varname":""},{"data":3.141590,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""}]}, ``` } #### CIL  相贯线 "cmd": ```json { "ParaACC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 10.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 1, "data": [ 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "paraVarData": [ { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 8.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "ctype": 0, "imovecoord": "UF", "length": 0.0, "logout": false, "margin": 0.0, "offsetAxis": 0, "para": 1, "polish": 0, "polishAngle": 0.0, "polishID": 1, "posidname": "", "posidtype": 0, "positionId": "P0001", "radius": 0.0, "side": 0.0, "type": 28, "userParamInt": 0, "userParamString": "", "width": 0.0 } > 加速度参数 1~100 > 减速度参数 1~100 > 平滑等级 [0,5] > 提前执行时间  ms > 局部位置变量/全局位置变量 P0001 GP0001 > 移动坐标:关节坐标RF、直角坐标BF、工具坐标TF、用户坐标UF > CIL  在枚举数列type中为28 ``` #### TIGWELDON  鱼鳞焊开始 "cmd":{ "l2":5.0, //空走距离  [0.01,9999]  单位:mm "logout":false, "timeOFTIG":1.0, //点焊时间  [0.01,10]  单位:s  电焊距离 [0.1,9999] 单位:mm "type":65, //TIGWELDON  在枚举数列 type 中为65 "typeOFTIG":1,//1-按点焊时间设置 2-按点焊距离设置 "userParamInt":0, "userParamString":"" } #### TIGWELDOFF  鱼鳞焊结束 执行该指令后结束鱼鳞焊轨迹 "cmd":{ "l2":0.0, //空走距离  [0.01,9999]  单位:mm "logout":false, "type":66, //TIGWELDOFF  在枚举数列 type 中为66 "userParamInt":0, "userParamString":"" } #### ARCBUILTIN 焊机内置工艺 "cmd": ```json { "ID": 1, "Value": [ 5.0, 6.0, 7.0, 8.0, 9.0 ], "logout": false, "type": 168, "userParamInt": 0, "userParamString": "" } > 内置工艺号 > 参数ABCDE > ARCBUILTIN在枚举数列type中为168 ``` #### WELDPATHSTART 初始焊道记录开始 "cmd": ```json { "_varName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "aOffset": 0.0, "bOffset": 0.0, "cOffset": 0.0, "initialPath": 0, "logout": false, "targetPath": 0, "type": 176, "usePath": 0, "userParamInt": 0, "userParamString": "", "xOffset": 0.0, "yOffset": 0.0, "zOffset": 0.0 } > WELDPATHSTART在枚举数列type中为176 ``` #### WELDPATHSTOP 初始焊道记录结束 "cmd": ```json { "_varName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "aOffset": 0.0, "bOffset": 0.0, "cOffset": 0.0, "initialPath": 0, "logout": false, "targetPath": 0, "type": 177, "usePath": 0, "userParamInt": 0, "userParamString": "", "xOffset": 0.0, "yOffset": 0.0, "zOffset": 0.0 } > WELDPATHSTOP在枚举数列type中为177 ``` #### WELDPATHOFFSET 焊道偏移计算 "cmd": ```json { "_varName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "aOffset": 0.0, "bOffset": 0.0, "cOffset": 0.0, "initialPath": 0, "logout": false, "targetPath": 0, "type": 178, "usePath": 0, "userParamInt": 0, "userParamString": "", "xOffset": 0.0, "yOffset": 0.0, "zOffset": 0.0 } > A轴偏移 > B轴偏移 > C轴偏移 > 计算结果存入 > WELDPATHOFFSET在枚举数列type中为178 > X轴偏移 > Y轴偏移 > Z轴偏移 ``` #### WELDPATHCOUNT 焊道数计算 "cmd": ```json { "_varName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "aOffset": 0.0, "bOffset": 0.0, "cOffset": 0.0, "initialPath": 0, "logout": false, "targetPath": 0, "type": 179, "usePath": 0, "userParamInt": 0, "userParamString": "", "xOffset": 0.0, "yOffset": 0.0, "zOffset": 0.0 } > 计算结果存入变量类型 > A轴偏移 > B轴偏移 > C轴偏移 > 计算结果存入 > WELDPATHCOUNT 在枚举数列type中为179 > 选择使用焊道 > X轴偏移 > Y轴偏移 > Z轴偏移 ``` #### STARTOFFSETWELD 运行偏移焊道 "cmd": ```json { "_varName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "aOffset": 0.0, "bOffset": 0.0, "cOffset": 0.0, "initialPath": 0, "logout": false, "targetPath": 0, "type": 180, "usePath": 0, "userParamInt": 0, "userParamString": "", "xOffset": 0.0, "yOffset": 0.0, "zOffset": 0.0 } > A轴偏移 > B轴偏移 > C轴偏移 > STARTOFFSETWELD 在枚举数列type中为180 > X轴偏移 > Y轴偏移 > Z轴偏移 ``` #### GOTO_WELD_START_POS 运行焊接初始点 "cmd": ```json { "_varName": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "aOffset": 0.0, "bOffset": 0.0, "cOffset": 0.0, "initialPath": 0, "logout": false, "targetPath": 0, "type": 180, "usePath": 0, "userParamInt": 0, "userParamString": "", "xOffset": 0.0, "yOffset": 0.0, "zOffset": 0.0 } > A轴偏移 > B轴偏移 > C轴偏移 > STARTOFFSETWELD 在枚举数列type中为180 > X轴偏移 > Y轴偏移 > Z轴偏移 ``` #### /**********************以上为插入指令中的焊接控制类**********************/ #### /**********************以下为插入指令中的视觉命令类**********************/ #### VISION_RUN 视觉开始 "cmd": ```json { "ID": 1, "M_STRPOSNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "m_positionId": "", "posidname": "", "posidtype": 0, "type": 77, "userParamInt": 0, "userParamString": "" } > 工艺号 > VISION_RUN 在枚举数列type中为77 > 二次开发自定义节点 > 二次开发自定义节点 ``` #### VISION_TRG 视觉触发 "cmd": ```json { "ID": 1, "M_STRPOSNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "m_positionId": "", "posidname": "", "posidtype": 0, "type": 78, "userParamInt": 0, "userParamString": "" } > 工艺号 > 是否注销 > VISION_TRG 在枚举数列type中为78 > 二次开发自定义节点 > 二次开发自定义节点 ``` #### VISION_POSNUM 获取视觉位置个数 "cmd": ```json { "ID": 1, "M_STRPOSNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "m_positionId": "", "posidname": "", "posidtype": 0, "type": 79, "userParamInt": 0, "userParamString": "" } > 工艺号 > 全局数值变量 1-99整数 > VISION_RUN 在枚举数列type中为79 > 二次开发自定义节点 > 二次开发自定义节点 ``` #### VISON_POS 获取视觉个数 "cmd": ```json { "ID": 1, "M_STRPOSNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "m_positionId": "", "posidname": "", "posidtype": 0, "type": 80, "userParamInt": 0, "userParamString": "" } > 工艺号 > 全局位置变量 1-9999整数 > VISON_POS 在枚举数列type中为80 > 二次开发自定义节点 > 二次开发自定义节点 ``` #### VISION_CLEAR 清除视觉位置信息 "cmd": ```json { "ID": 1, "M_STRPOSNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "m_positionId": "", "posidname": "", "posidtype": 0, "type": 81, "userParamInt": 0, "userParamString": "" } > 工艺号 > VISION_CLEAR 在枚举数列type中为81 > 二次开发自定义节点 > 二次开发自定义节点 ``` #### VISION_END 视觉结束 "cmd": ```json { "ID": 1, "M_STRPOSNUM": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "m_positionId": "", "posidname": "", "posidtype": 0, "type": 82, "userParamInt": 0, "userParamString": "" } > 工艺号 > VISION_END 在枚举数列type中为82 > 二次开发自定义节点 > 二次开发自定义节点 ``` #### /**********************以上为插入指令中的视觉命令类**********************/ #### /**********************以下为插入指令中的激光类**********************/ #### LASER_ON 激光开始 "cmd": ```json { "ID": 1, "logout": false, "type": 59, "userParamInt": 0, "userParamString": "" } > 激光工艺号1-9 > LASER_ON 在枚举数列type中为59 ``` #### LASER_OFF 激光结束 ```json { "cmd": { "ID":1, "logout":false, "type":60, "userParamInt":0, "userParamString":"" } LASER_CIRCLE 切割圆 "cmd": { "ParaACC":{"data":4.0,"secondvalue":0,"value":0,"varname":""}, "ParaDEC":{"data":3.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaSPIN":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaSYNC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaTIME":{"data":6.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":2.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "RobotPos": { "ctype":1, "data":[0.0,0.0,0.0,7.0,8.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0], "key":"P0001", "paraVarData":[{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":7.0,"secondvalue":0,"value":0,"varname":""},{"data":8.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""}]}, "ctype":0, "imovecoord":"UF", "length":0.0, "logout":false, "margin":5.0, "offsetAxis":0, "para":0, "polish":0, "polishAngle":0.0, "polishID":1, "posidname":"", "posidtype":0, "positionId":"P0001", "radius":1.0, "side":0.0, "type":61, "userParamInt":0, "userParamString":"", "width":0.0 } #### /**********************以上为插入指令中的激光类**********************/ #### /**********************以上为插入指令中的传送带类**********************/ #### CONVEYOR_CHECKPOS 传送带工件检测开始 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "logout":false, "m_positionId":"", "m_postype":0, "posidname":"", "posidtype":0, "removeType":0, "type":105, "userParamInt":0, "userParamString":"" } #### CONVEYOR_CHECKEND 传送带工件检测结束 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "logout":false, "m_positionId":"", "m_postype":0, "posidname":"", "posidtype":0, "removeType":0, "type":106, "userParamInt":0, "userParamString":"" } #### CONVEYOR_ON 传送带跟踪开始 "cmd": { "ID":3, "ParaACC":{"data":5.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":4.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "RobotPos": { "ctype":1, "data":[1.0,1.0,8.0,6.0,7.0,0.0,0.0,19998.0,0.0,19998.0,3.141590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0], "key":"P0002", "paraVarData":[{"data":1.0,"secondvalue":0,"value":0,"varname":""},{"data":1.0,"secondvalue":0,"value":0,"varname":""},{"data":8.0,"secondvalue":0,"value":0,"varname":""},{"data":6.0,"secondvalue":0,"value":0,"varname":""},{"data":7.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":19998.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":19998.0,"secondvalue":0,"value":0,"varname":""},{"data":3.141590,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""}]}, "logout":false, "m_positionId":"P0002", "m_postype":0, "posidname":"", "posidtype":0, "removeType":0, "type":103, "userParamInt":0, "userParamString":"" } #### CONVEYOR_OFF 传送带跟踪结束 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "logout":false, "m_positionId":"", "m_postype":0, "posidname":"", "posidtype":0, "removeType":0, "type":104, "userParamInt":0, "userParamString":"" } #### CONVEYOR_POS 获取传送带跟踪位置 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "logout":false, "m_positionId":"", "m_postype":0, "posidname":"", "posidtype":0, "removeType":0, "type":172, "userParamInt":0, "userParamString":"" } #### CONVEYOR_CLEAR 删除传送带跟踪目标 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "logout":false, "m_positionId":"", "m_postype":0, "posidname":"", "posidtype":0, "removeType":0, "type":221, "userParamInt":0, "userParamString":"" } #### /**********************以上为插入指令中的传送带类**********************/ #### /**********************以下为插入指令中的喷涂工艺类**********************/ #### SPRAY_ON 喷涂开始 "cmd": { "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaDEC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaTIME":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV": { "data":0.0, "m_vUnit":1, "secondvalue":0, "value":0, "varname":"" }, "anaID":3, "atom":0.0, "colorID":1, "flow":0.0, "gunID":1, "logout":false, "point":1, "sector":0.0, "seqID":2, "traID":1, "type":120, "userParamInt":0, "userParamString":"" } #### SPRAY_OFF 喷涂结束 "cmd": { "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaDEC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaTIME":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV": { "data":0.0, "m_vUnit":1, "secondvalue":0, "value":0, "varname":"" }, "anaID":3, "atom":0.0, "colorID":1, "flow":0.0, "gunID":1, "logout":false, "point":1, "sector":0.0, "seqID":2, "traID":1, "type":121, "userParamInt":0, "userParamString":"" } #### SPRAY_CHANGE 喷涂换色 "cmd": { "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaDEC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaTIME":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV": { "data":0.0, "m_vUnit":1, "secondvalue":0, "value":0, "varname":"" }, "anaID":3, "atom":0.0, "colorID":1, "flow":0.0, "gunID":1, "logout":false, "point":1, "sector":0.0, "seqID":2, "traID":1, "type":122, "userParamInt":0, "userParamString":"" } #### SPRAY_MOVE 喷涂轨迹 "cmd": { "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaDEC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaTIME":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV": { "data":0.0, "m_vUnit":1, "secondvalue":0, "value":0, "varname":"" }, "anaID":3, "atom":0.0, "colorID":1, "flow":0.0, "gunID":1, "logout":false, "point":1, "sector":0.0, "seqID":2, "traID":1, "type":123, "userParamInt":0, "userParamString":"" } #### SPRAY_STARTPOS 喷涂起始位置 "cmd": { "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaDEC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaTIME":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV": { "data":0.0, "m_vUnit":1, "secondvalue":0, "value":0, "varname":"" }, "anaID":3, "atom":0.0, "colorID":1, "flow":0.0, "gunID":1, "logout":false, "point":1, "sector":0.0, "seqID":2, "traID":1, "type":124, "userParamInt":0, "userParamString":"" } #### /**********************以上为插入指令中的喷涂工艺类**********************/ #### /**********************以下为插入指令中的打磨工艺类**********************/ #### POLISH_EDGE 棱边打磨 "cmd": { "ParaACC":{"data":4.0,"secondvalue":0,"value":0,"varname":""}, "ParaDEC":{"data":5.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":3.0,"secondvalue":0,"value":0,"varname":""}, "ParaSPIN":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaSYNC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaTIME":{"data":6.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":2.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "RobotPos": { "ctype":1, "data":[1.0,1.0,3.0,5.0,4.0,0.0,0.0,19998.0,0.0,19998.0,3.141592653590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0], "key":"P0002", "paraVarData":[{"data":1.0,"secondvalue":0,"value":0,"varname":""},{"data":1.0,"secondvalue":0,"value":0,"varname":""},{"data":3.0,"secondvalue":0,"value":0,"varname":""},{"data":5.0,"secondvalue":0,"value":0,"varname":""},{"data":4.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":19998.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":19998.0,"secondvalue":0,"value":0,"varname":""},{"data":3.141592653590,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""}]}, "ctype":0, "imovecoord":"UF", "length":0.0, "logout":false, "margin":0.0, "offsetAxis":0, "para":0, "polish":8, "polishAngle":7.0, "polishID":9, "posidname":"", "posidtype":0, "positionId":"P0002", "radius":0.0, "side":0.0, "type":107, "userParamInt":0, "userParamString":"" } #### POLISH_CONTINUE 继续打磨 "cmd": { "angle":12, "logout":false, "polishID":10, "time":13, "times":11, "type":129, "userParamInt":0, "userParamString":"" } #### POLISH_OFF 结束打磨 "cmd": { "angle":0, "logout":false, "polishID":14, "time":0, "times":0, "type":130, "userParamInt":0, "userParamString":"" } #### /**********************以上为插入指令中的打磨工艺类**********************/ #### /**********************以下为插入指令中的寻位跟踪类**********************/ #### LASERTRACK_ON 激光追踪开始 "cmd": { "ID":1, "delay":3.0, "logout":false, "segmentParam":2, "type":83, "userParamInt":0, "userParamString":"" } #### LASERTRACK_OFF 激光追踪结束 "cmd": { "ID":1, "delay":3.0, "logout":false, "segmentParam":2, "type":84, "userParamInt":0, "userParamString":"" } #### SEARCH_START 寻位开始 "cmd": { "ID":5, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "artifactType":0, "calculType":0, "coordNum":1, "delay":0.0, "length":0.0, "logout":false, "pointEffet":0, "posidname":"", "posidtype":0, "position1Id":"", "position2Id":"", "position3Id":"", "position4Id":"", "position5Id":"", "position6Id":"", "positionOutId":"", "searchParacoordinate":1, "senseType":1, "tableID":1, "type":149, "userParamInt":0, "userParamString":"" } #### SEARCH_STATIC 静态寻位 "cmd": { "ID":5, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "artifactType":0, "calculType":0, "coordNum":1, "delay":0.0, "length":0.0, "logout":false, "pointEffet":0, "posidname":"", "posidtype":0, "position1Id":"", "position2Id":"", "position3Id":"", "position4Id":"", "position5Id":"", "position6Id":"", "positionOutId":"", "searchParacoordinate":1, "senseType":1, "tableID":1, "type":149, "userParamInt":0, "userParamString":"" } #### SEARCH_DYNAMIC 动态寻位 "cmd": { "ID":1, "ParaACC": { "data":10.0, "secondvalue":0, "value":0, "varname":"" }, "ParaPL":{"data":1.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":10.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "RobotPos":{"ctype":1,"data":[0.0,0.0,8.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0], "key":"P0001", "paraVarData":[{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":8.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""},{"data":0.0,"secondvalue":0,"value":0,"varname":""}]}, "artifactType":0, "calculType":0, "coordNum":1, "delay":0.0, "length":0.0, "logout":false, "pointEffet":0, "posidname":"", "posidtype":0, "position1Id":"P0001", "position2Id":"", "position3Id":"", "position4Id":"", "position5Id":"", "position6Id":"", "positionOutId":"", "searchParacoordinate":1, "senseType":1, "tableID":1, "type":151, "userParamInt":0, "userParamString":"" } #### SEARCH_CALC 寻位计算 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "artifactType":1, "calculType":0, "coordNum":1, "delay":0.0, "length":0.0, "logout":false, "pointEffet":0, "posidname":"", "posidtype":0, "position1Id":"GP0010", "position2Id":"GP0011", "position3Id":"GP0012", "position4Id":"", "position5Id":"", "position6Id":"", "positionOutId":"GP0013", "searchParacoordinate":1, "senseType":1, "tableID":1, "type":152, "userParamInt":0, "userParamString":"" } #### SEARCH_END 寻位结束 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "artifactType":1, "calculType":0, "coordNum":1, "delay":0.0, "length":0.0, "logout":false, "pointEffet":0, "posidname":"", "posidtype":0, "position1Id":"GP0010", "position2Id":"GP0011", "position3Id":"GP0012", "position4Id":"", "position5Id":"", "position6Id":"", "positionOutId":"GP0013", "searchParacoordinate":1, "senseType":1, "tableID":1, "type":153, "userParamInt":0, "userParamString":"" } #### SEARCH_OFFSET 寻位偏移 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "artifactType":1, "calculType":0, "coordNum":1, "delay":0.0, "length":0.0, "logout":false, "pointEffet":0, "posidname":"", "posidtype":0, "position1Id":"GP0010", "position2Id":"GP0011", "position3Id":"GP0012", "position4Id":"", "position5Id":"", "position6Id":"", "positionOutId":"GP0013", "searchParacoordinate":1, "senseType":1, "tableID":1, "type":154, "userParamInt":0, "userParamString":"" } #### SEARCH_OFFSETEND 寻位偏移结束 "cmd": { "ID":1, "ParaACC":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaPL":{"data":0.0,"secondvalue":0,"value":0,"varname":""}, "ParaV":{"data":0.0,"m_vUnit":1,"secondvalue":0,"value":0,"varname":""}, "artifactType":1, "calculType":0, "coordNum":1, "delay":0.0, "length":0.0, "logout":false, "pointEffet":0, "posidname":"", "posidtype":0, "position1Id":"GP0010", "position2Id":"GP0011", "position3Id":"GP0012", "position4Id":"", "position5Id":"", "position6Id":"", "positionOutId":"GP0013", "searchParacoordinate":1, "senseType":1, "tableID":1, "type":155, "userParamInt":0, "userParamString":"" } #### ARCTRACKON 电弧跟踪开始 "cmd": { "ID":16, "isArcTracking":true, "logout":false, "type":156, "userParamInt":0, "userParamString":"" } #### ARCTRACKOFF 电弧跟踪结束 "cmd": { "ID":17, "isArcTracking":false, "logout":false, "type":157, "userParamInt":0, "userParamString":"" } #### /**********************以上为插入指令中的寻位跟踪类**********************/ ### 指令的增删查改 #### 修改指令 *0x3122 JOB_MODIFY_INSTR { "pos":1, "cmd":{ cmd->toJson() } "paraFlag": 0, "time":"2020.02.26 10:11:06" "savejobfile":false } "cmd":{ "RobotPos":{"ctype":69, "data":[0.0,0.0,8.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0], "key":4521986}, "acc":2.0, "ctype":0, "dec":10.0, "imovecoord":"UF", "length":0.0, "logout":false, "margin":0.0, "para":0, "pl":0.0, "polish":0, "polishAngle":0.0, "polishID":1, "positionId":4521986, "radius":0.0, "side":0.0, "spin":0, "sync":0, "time":0, "type":57, "vUnit":1, "velocity":10.0, "userParamInt":0, "userParamString":"", "width":0.0}, "paraFlag":1, "pos":4, "robot":1, "time":"2021.04.15 00:04:15" } > LASER_OFF 在枚举数列type中为60 > 加速度 > 减速度 > ms > 补差 > 中心点 > LASER_CIRCLE 在枚举数列type中为61 > 工艺号1-9 > CONVEYOR_CHECKPOS 在枚举数列type中为105 > 工艺号1-9 > CONVEYOR_CHECKEND 在枚举数列type中为106 > 工艺号 > ACC 1-100 > V 2-1000 > CONVEYOR_ON 在枚举数列type中为103 > 工艺号1-9 > CONVEYOR_OFF 在枚举数列type中为104 > 工艺号1-9 > 全局位置变量 > CONVEYOR_POS 在枚举数列type中为172 > 工艺号1-9 > 删除范围 0:全部目标 1:本次目标 > CONVEYOR_CLEAR 在枚举数列type中为221 > 模拟量组号 > 雾化模拟量 > 流量模拟量 > 枪 > 扇化模拟量 > 时序组号 > SPRAY_ON在枚举数列type中为120 > 模拟量组号 > 雾化模拟量 > 流量模拟量 > 枪 > 扇化模拟量 > 时序组号 > SPRAY_OFF在枚举数列type中为121 > 模拟量组号 > 雾化模拟量 > 颜色1-10 > 流量模拟量 > 枪 > 扇化模拟量 > 时序组号 > SPRAY_CHANGE在枚举数列type中为122 > 喷涂加速度 > 喷涂减速度 > 喷涂PL 0-5 > 喷涂速度,2-1000mm/s > 模拟量组号 > 雾化模拟量 > 流量模拟量 > 枪 > 扇化模拟量 > 时序组号 > 轨迹组号1-99 > SPRAY_MOVE 在枚举数列type中为123 > 变姿加速度 > 变姿减速度 > 提前执行,自然数ms > 速度2-1000mm/s > 模拟量组号 > 雾化模拟量 > 流量模拟量 > 枪 > 扇化模拟量 > 时序组号 > 轨迹组号 > SPRAY_STARTPOS 在枚举数列type中为124 > ACC 比率(1-100) > DEC 比率(1-100) > PL 范围(0-5) > V 范围1-1000 > 点位 > 打磨次数1-99 > 打磨角度-180-180 > ID 1-99 > 点位 > POLISH_EDGE 在枚举数列type中为107 > 角度-180-180 > 工艺号1-99 > 提前执行,自然数ms > 次数1-99 > POLISH_CONTINUE 在枚举数列type中为129 > 工艺号 > POLISH_OFF 在枚举数列type中为130 > 跟踪文件号1-99 > 参数表延时0-10 > 跟踪参数表号1-99 > LASERTRACK_ON 在枚举数列type中为83 > 跟踪文件号1-99 > LASERTRACK_OFF 在枚举数列type中为84 > 寻位文件号 > SEARCH_START 在枚举数列type中为149 > 寻位文件号 > 参数表延时0-10 > 输出位置 > 寻位参数表号1-99 > SEARCH_START 在枚举数列type中为149 > SEARCH_DYNAMIC 在枚举数列type中为151 > 点1 > 点2 > 点3 > 点4 > 点5 > 点6 > 输出结果 > SEARCH_CALC 在枚举数列type中为152 > 寻位文件号 > SEARCH_END 在枚举数列type中为153 > 偏移量 > SEARCH_OFFSET 在枚举数列type中为154 > SEARCH_END 在枚举数列type中为155 > 跟踪文件名 > true:电压,false:弧压 > ARCTRACKON 在枚举数列type中为156 > 跟踪文件名 > true:电压,false:弧压 > ARCTRACKOFF 在枚举数列type中为157 > 修改指令索引 > 修改入指令json列表 > 0:默认,1:批量修改,2:批量修改结束 > std::localtime > 修改单条指令,采取0x3123删除现有指令然后0x3121重新在当前行插入修改后指令 > 批量修改 > 加速度调整比率(1~100) > 减速度调整比率(1~100) > 移动坐标:关节坐标RF、直角坐标BF、工具坐标TF、用户坐标UF > 长度 > 边缘 > 定位等级,范围0~5 > 打磨次数(1~99) > 打磨角度(-180~+180) > 打磨ID(1~99) > 位置名称 > 半径参数 > 姿态参数 0=姿态不变 1=六轴不转 2=六轴旋转 > 机器人与外部轴是否同步   0 = 否,1 = 是 > 提前执行,自然数(ms) > MOVCADOUBLE 在枚举数列type中为57 > 速度单位:0=cm/s 1=mm/s 2=百分比 > 速度 > 0:默认,1:批量修改,2:批量修改结束 ``` #### 删除指令 *0x3123 JOB_ERASE_INSTR ```json { "robot":1, "pos":1, "time":"2020.02.26 10:11:06" "savejobfile":false } > 修改指令索引 > std::localtime ``` #### 插入 Position *0x3124 JOB_INSERT_POS ```json {​ ​  "robot": 1, ​  "robotpos": {​ ​    "ctype": 1, ​    "data": [​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0​ ​    ], ​    "key": "P0014", ​    "paraVarData": [​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      }​ ​    ] ​  },​ ​  "time": "2024.06.19 11:08:48"​ ​} > 当前机器人号​ > E类型​ > 共二十一位,第一二位表示坐标 第三位 左右手 1-左 2-右,第4,5位备用 第6,7位备用,第8位及后面保存坐标值(14位 7+7)​ > 点位​ > 共二十一位,第一二位表示坐标 第三位 左右手 1-左 2-右,第4,5位备用 第6,7位备用,第8位及后面保存坐标值(14位 7+7​ ``` #### 修改 Positon *0x3125 JOB_MODIFY_POS ```json {​ ​  "robot": 1, ​  "robotpos": {​ ​    "ctype": 1, ​    "data": [​ ​      1,​ ​      1,​ ​      8,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      205.798,​ ​      -0.1,​ ​      964.486,​ ​      -3.141,​ ​      0.523,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0,​ ​      0​ ​    ], ​    "key": "P00014",​ ​    "paraVarData": [​ ​      {​ ​        "data": 1,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 1,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 8,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 205.798,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": -0.1,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 964.486,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": -3.141,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0.523,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      },​ ​      {​ ​        "data": 0,​ ​        "secondvalue": 0,​ ​        "value": 0,​ ​        "varname": ""​ ​      }​ ​    ] ​  },​ ​  "time": "2024.06.19 11:23:25"​ ​} > 当前机器人​ > 局部变量--修改点位 点位类型 机器人P-80,带变位机E-69 > 类型​ > 共二十一位,第一二位表示坐标 第三位 左右手 1-左 2-右,第4,5位备用 第6,7位备用,第8位及后面保存坐标值(14位 7+7)​ > 共二十一位,第一二位表示坐标 第三位 左右手 1-左 2-右,第4,5位备用 第6,7位备用,第8位及后面保存坐标值(14位 7+7)​ ``` #### 修改局部数值变量 *0x3127 JOB_MODIFY_VALUEVAR ```json { "robot": 1, "varType": 1, "varName": "D002", "varValue": 3.3, "time": "2020.02.26 10:11:06" } > int=0, double=1, Boolean=2 ``` #### 类型 String ```json { "robot": 1, "varName": "S007", "varString": "data", "varType": 3 } ``` ### 指令跳转 #### 当控制器运行完一条指令时,向示教器发送跳转: *0x3501 INSTRUCTION_COMPLETION - 命令字:0x2304 DEADMAN_MODE_SET ```json {  "robot":1,  "jobname":"Q1"  "num":3  } ``` > 注:"robot": 表示机器人1,2,3,4 "jobname": 作业文件名称 "num": 行号 #### 当控制器执行 CRAFTLINE 指令时,向示教器发送跳转: *0x3502 CRAFT_JUMP_LINE_NUM - 命令字:0x2304 DEADMAN_MODE_SET ```json {   "robot":1,   "num":2  } ``` > 注:"robot": 表示机器人1,2,3,4 "num": 行号 #### 当示教器与控制器建立网络连接时,示教器查询当前运行到哪一行: *0x3503 INSTRUCTION_SHOW_INQUIRE - 命令字:0x2304 DEADMAN_MODE_SET ```json {     "robot":1  } ``` > 注:"robot": 表示机器人1,2,3,4 #### 控制器返回查询结果: *0x3504 INSTRUCTION_SHOW_RESPOND - 命令字:0x2304 DEADMAN_MODE_SET ```json { "robot": 1, "jobname": "Q1", "num": 3 } ``` > 注:"robot": 表示机器人1,2,3,4 "jobname": 作业文件名称 "num": 行号 - 命令字:0x2304 DEADMAN_MODE_SET ```cpp ### 查询当前形态值 **命令字:** 0x312a **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 机器人编号(1-4) | | hand_set | bool | 是 | true-手动位置,false-当前位置 | **请求示例:** ```JSON { "robot": 2, "hand_set": true } ```cpp ### 控制器返回形态值 **命令字:** 0x312b **请求参数:** | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 机器人编号(1-4) | | configuration | int | 是 | 形态值 | **请求示例:** ```JSON { "configuration": 2, "robot": 2 } --- # 自启动程序运行 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/04.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6/04.%E8%87%AA%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C.html ## 示教器设置 **寄存器:** `0x5081` `SELF_START_RUN_SET` ### 参数说明 | 参数名 | 类型 | 必填 | 说明 | 示例值 | |---------|--------|------|--------------|--------| | robot | int | 是 | 机器人号 | 1 | | enable | bool | 是 | 是否使能 | false | | count | int | 是 | 运行次数 | 1 | | speed | int | 是 | 运行速度 | 15 | | jobname | string | 是 | 作业文件名字 | "Q1" | ### JSON 示例 ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` --- ## 查询 **寄存器:** `0x5082` `SELF_START_RUN_INQUIRE` ### 参数说明 | 参数名 | 类型 | 必填 | 说明 | 示例值 | |--------|------|------|----------|--------| | robot | int | 是 | 机器人号 | 1 | ### JSON 示例 ```json { "robot": 1 } ``` --- ## 控制器返回 **寄存器:** `0x5083` `SELF_START_RUN_RESPOND` ### 参数说明 | 参数名 | 类型 | 必填 | 说明 | 示例值 | |---------|--------|------|--------------|--------| | robot | int | 是 | 机器人号 | 1 | | enable | bool | 是 | 是否使能 | false | | count | int | 是 | 运行次数 | 1 | | speed | int | 是 | 运行速度 | 15 | | jobname | string | 是 | 作业文件名字 | "Q1" | ### JSON 示例 ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` --- # Lua 程序 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/05.%E5%A4%96%E9%83%A8%E6%8E%A7%E5%88%B6%E4%B8%8E%E9%80%9A%E8%AE%AF%E6%96%B9%E5%BC%8F/01.Lua%E7%A8%8B%E5%BA%8F.html Lua 文件存放在 `~/robot/job/lua` 目录内。 上传文件和查看文件列表用 SCP 的方式。 ## 运行程序 **上位机发送:0x2511** ```json { "fileName": "xxx.lua" } ``` **控制器返回:0x2512** ```json { "fileName": "xxx.lua", "result": true, "error": "错误原因" } ``` | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | fileName | string | 是 | Lua 文件名 | | result | bool | 是 | 运行是否成功 | | error | string | 是 | 错误原因,成功时为空字符串 | --- ## 停止程序 **上位机发送:0x2513** ```json { "fileName": "xxx.lua" } ``` | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | fileName | string | 是 | Lua 文件名 | --- ## 当前运行 **上位机发送:0x2515** ```json {} ``` **控制器回复:0x2516** ```json { "fileNames": [ { "fileName": "xxx.lua", "status": 1 } ] } ``` | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | fileNames | array | 是 | 运行中的文件列表 | | fileNames[].fileName | string | 是 | Lua 文件名 | | fileNames[].status | int | 是 | 1-暂停,2-运行 | --- # 远程程序设置 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/05.%E5%A4%96%E9%83%A8%E6%8E%A7%E5%88%B6%E4%B8%8E%E9%80%9A%E8%AE%AF%E6%96%B9%E5%BC%8F/02.%E8%BF%9C%E7%A8%8B%E7%A8%8B%E5%BA%8F%E8%AE%BE%E7%BD%AE.html ## 远程模式连接状态 ### 查询 Modbus、外部 IO 连接状态 **命令字**: `0x5032 REMOTE_CONNECT_INQUIRE` 请求包体: ```json {} ``` ### 返回连接状态 **命令字**: `0x5033 REMOTE_CONNECT_RESPOND` | 参数 | 类型 | 描述 | |------|------|------| | ModbusConnect | bool | Modbus 连接状态:`false` 未连接,`true` 已连接 | | ExternIOConnect | bool | 外部 IO 连接状态:`false` 未连接,`true` 已连接 | | type | int | 连接类型:0:NAN, 1:RTU, 2:TCP | 响应包体: ```json { "ModbusConnect": false, "ExternIOConnect": true, "type": 2 } ``` ## 远程作业文件设置 ### 设置远程作业文件 **命令字**: `0x2C01 REMOTE_JOBFILE_SET` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | jobFile | array | 作业文件列表 | **jobFile 数组元素**: | 参数 | 类型 | 描述 | |------|------|------| | name | string | 作业文件名称 | | times | int | 运行次数 | 请求包体: ```json { "robot": 1, "jobFile": [ {"name": "Q1", "times": 1}, {"name": "Q2", "times": 1}, {"name": "Q3", "times": 1}, {"name": "Q4", "times": 1}, {"name": "Q5", "times": 1} // ... 最多 10 个 ] } ``` ### 获取远程作业文件 **命令字**: `0x2C02 REMOTE_JOBFILE_INQUIRE` 请求包体: ```json { "robot": 1 } ``` ### 返回作业文件查询结果 **命令字**: `0x2C03 REMOTE_JOBFILE_RESPOND` 响应包体: ```json { "robot": 1, "jobFile": [ {"name": "Q1", "times": 3}, {"name": "Q2", "times": 3}, {"name": "", "times": 1}, {"name": "Q4", "times": 2}, {"name": "", "times": 1} ] } ``` ## 远程模式参数设置 ### 设置远程模式参数 **命令字**: `0x2C04 REMOTE_PARA_SET` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | remoteDefaultSpeed | int | 远程模式速度,范围 1~100 | | reserveIsStart | int | 预约并启动:`1` 启动,`0` 关闭 | | reserveTrgTime | int | 确认启动时间,范围 200~1000ms | | waitingTime | int | IO 重复触发时间 | 请求包体: ```json { "robot": 1, "remoteDefaultSpeed": 15, "reserveIsStart": 1, "reserveTrgTime": 200, "waitingTime": 500 } ``` ### 查询远程模式参数 **命令字**: `0x2C05 REMOTE_PARA_INQUIRE` 请求包体: ```json { "robot": 1 } ``` ### 返回远程模式参数查询结果 **命令字**: `0x2C06 REMOTE_PARA_RESPOND` 响应包体: ```json { "robot": 1, "remoteDefaultSpeed": 15, "reserveIsStart": 1, "reserveTrgTime": 200, "waitingTime": 500 } ``` --- # TCP 通讯 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/05.%E5%A4%96%E9%83%A8%E6%8E%A7%E5%88%B6%E4%B8%8E%E9%80%9A%E8%AE%AF%E6%96%B9%E5%BC%8F/03.TCP%E9%80%9A%E8%AE%AF.html ## 设置网络参数 *0x4180 MSGCOMM_PARAM_SET* ### 客户端 **请求参数** | 字段 | 类型 | 描述 | |------|------|------| | frameHeader | string | 帧头 | | ip | string | IP 地址 | | numberSystem | int | 0: 十进制, 1: 十六进制 | | port | int | 端口号 | | separator | string | 分隔符 | | terminator | string | 结束符 | | craft | int | 工艺号 (1~9) | | robot | int | 机器人号 | | type | int | 0: 服务器, 1: 客户端 | **请求示例** ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 1, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "robot": 1, "type": 1 } ``` ### 服务端 **请求参数** | 字段 | 类型 | 描述 | |------|------|------| | frameHeader | string | 帧头 | | ip | string | IP 地址 | | numberSystem | int | 0: 十进制, 1: 十六进制 | | port | int | 端口号 | | separator | string | 分隔符 | | terminator | string | 结束符 | | craft | int | 工艺号 (1~9) | | robot | int | 机器人号 | | type | int | 0: 服务器, 1: 客户端 | **请求示例** ```json { "craft": 3, "robot": 1, "server": { "frameHeader": "@A", "ip": "192.168.1.14", "numberSystem": 0, "port": 9001, "separator": "B", "terminator": "C" }, "type": 0 } ``` --- ## 查询网络参数 *0x4181 MSGCOMM_PARAM_INQUIRE* **请求参数** | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | craft | int | 工艺号 | | type | int | 0: 服务器, 1: 客户端 | **请求示例** ```json { "robot": 1, "craft": 1, "type": 2 } ``` --- ## 响应网络参数查询 *0x4182 MSGCOMM_PARAM_RESPOND* ### 客户端 **响应参数** | 字段 | 类型 | 描述 | |------|------|------| | frameHeader | string | 帧头 | | ip | string | IP 地址 | | numberSystem | int | 0: 十进制, 1: 十六进制 | | port | int | 端口号 | | separator | string | 分隔符 | | terminator | string | 结束符 | | craft | int | 工艺号 | | netState | bool | true: 连接, false: 断开 | | robot | int | 机器人号 | | type | int | 0: 服务器, 1: 客户端 | **响应示例** ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 0, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "netState": false, "robot": 1, "type": 1 } ``` ### 服务端 **响应参数** | 字段 | 类型 | 描述 | |------|------|------| | frameHeader | string | 帧头 | | ip | string | IP 地址 | | numberSystem | int | 0: 十进制, 1: 十六进制 | | port | int | 端口号 | | separator | string | 分隔符 | | terminator | string | 结束符 | | craft | int | 工艺号 | | netState | bool | true: 连接, false: 断开 | | robot | int | 机器人号 | | type | int | 0: 服务器, 1: 客户端 | **响应示例** ```json { "craft": 1, "netState": false, "robot": 1, "server": { "frameHeader": "@", "ip": "192.168.1.14", "numberSystem": 0, "port": 22, "separator": ",", "terminator": "!" }, "type": 0 } ``` --- ## 连接 MSGCOMM 网络 *0x4183 MSGCOMM_DEVICE_CONNECT* **请求参数** | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | craft | int | 工艺号 | **请求示例** ```json { "robot": 1, "craft": 1 } ``` --- ## 关闭 MSGCOMM 网络 *0x4184 MSGCOMM_DEVICE_CLOSE* **请求参数** | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | craft | int | 工艺号 | **请求示例** ```json { "robot": 1, "craft": 1 } ``` --- # Modbus > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/05.%E5%A4%96%E9%83%A8%E6%8E%A7%E5%88%B6%E4%B8%8E%E9%80%9A%E8%AE%AF%E6%96%B9%E5%BC%8F/04.Modbus.html ## 1. 设置 Modbus 程序 **命令字:** `0x5701` `EXTERN_PROGRAM_SET` ```json { "robot": 1, "programid": 1, "jobname": "xxxx" } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 机器人编号,范围 1-4 | | programid | int | 是 | 程序 ID,范围 1-300 | | jobname | string | 是 | 作业文件名(不含后缀) | --- ## 2. 查询 Modbus 程序 **命令字:** `0x5702` `EXTERN_PROGRAM_INQUIRE` ```json { "robot": 1, "startprogramid": 1, "num": 10 } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 机器人编号,范围 1-4 | | startprogramid | int | 是 | 程序起始 ID | | num | int | 是 | 需要获取的程序个数,范围 1-10 | --- ## 3. 查询 Modbus 程序响应 **命令字:** `0x5703` `EXTERN_PROGRAM_RESPOND` ```json { "robot": 1, "startprogramid": 1, "jobnamelist": ["xxx", "", "yyyy"] } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 机器人编号,范围 1-4 | | startprogramid | int | 是 | 程序起始 ID | | jobnamelist | array | 是 | 作业文件名列表,共 10 个元素,没有则填空字符串 | --- ## 4. 设置控制器的 Modbus 类型 **命令字:** `0x5711` ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "port": 502 }, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` | 参数分类 | 参数名 | 类型 | 必填 | 描述 | |----------|--------|------|------|------| | RTU | baudrate | string | 是 | Modbus RTU 通信的波特率 | | RTU | port | int | 是 | Modbus RTU 通信的串口号 | | RTU | slaveId | int | 是 | Modbus RTU 通信的从设备 ID | | TCP | IP | string | 是 | Modbus TCP 通信的服务器 IP 地址 | | TCP | port | int | 是 | Modbus TCP 通信的端口号 | | 通用 | master-slave | string | 是 | 主从模式:0 表示主模式,1 表示从模式 | | 通用 | scancycle | int | 是 | 扫描周期,单位:毫秒 | | 通用 | stoprun | bool | 是 | 运行停止标志:0 表示未停止,1 表示停止 | | 通用 | type | string | 是 | 通信类型,可选 RTU 或 TCP | --- ## 5. 查询控制器的 Modbus 类型 **命令字:** `0x5712` ```json {} ``` 控制器响应(0x5713): ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "port": 502 }, "enable": true, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` | 参数分类 | 参数名 | 类型 | 必填 | 描述 | |----------|--------|------|------|------| | RTU | baudrate | string | 是 | Modbus RTU 通信的波特率 | | RTU | port | int | 是 | Modbus RTU 通信的串口号 | | RTU | slaveId | int | 是 | Modbus RTU 通信的从设备 ID | | TCP | IP | string | 是 | Modbus TCP 通信的服务器 IP 地址 | | TCP | port | int | 是 | Modbus TCP 通信的端口号 | | 通用 | enable | bool | 是 | 是否启用 Modbus 通信 | | 通用 | master-slave | string | 是 | 主从模式:0 表示主模式,1 表示从模式 | | 通用 | scancycle | int | 是 | 扫描周期,单位:毫秒 | | 通用 | stoprun | bool | 是 | 运行停止标志:0 表示未停止,1 表示停止 | | 通用 | type | string | 是 | 通信类型,可选 RTU 或 TCP | --- ## 6. 控制器 Modbus 使能 **命令字:** `0x5714` ```json { "enable": false } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | enable | bool | 是 | 是否启用 Modbus 通信:false 禁用,true 启用 | --- ## 7. 设置 Modbus 心跳检测 **命令字:** `0x5715` `MODBUS_CHECKHEART_SET` ```json { "checkheart": true } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | checkheart | bool | 是 | Modbus 心跳检测开关 | --- ## 8. 查询 Modbus 心跳检测 **命令字:** `0x5716` `MODBUS_CHECKHEART_INQUIRE` ```json {} ``` 控制器响应(0x5717): ```json { "checkheart": true } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | checkheart | bool | 是 | Modbus 心跳检测状态:true 开启,false 关闭 | --- ## 9. 查询控制器作为从站是否连接 **命令字:** `0x5718` 请求: ```json {} ``` 响应: ```json { "ModbusConnect": false } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | ModbusConnect | bool | 是 | 连接状态:false 未连接,true 已连接 | --- ## 10. 控制器作为主站的参数设置 **命令字:** `0x5719` ```json { "masterStation": { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 2, "slaveId": 1, "stopBit": 1 }, "TCP": { "IP": "192.168.10.56", "port": 503 }, "processNumber": 1, "type": "TCP" }, "startAddress": false } ``` | 参数分类 | 参数名 | 类型 | 必填 | 描述 | |----------|--------|------|------|------| | masterStation | type | string | 是 | 通信类型:RTU 或 TCP | | masterStation | processNumber | int | 是 | 工艺号 | | masterStation.RTU | baudrate | int | 是 | 波特率 | | masterStation.RTU | checkBit | string | 是 | 校验位:如 "E"(偶校验)、"O"(奇校验)、"N"(无校验) | | masterStation.RTU | dataBit | int | 是 | 数据位 | | masterStation.RTU | port | int | 是 | 串口号 | | masterStation.RTU | slaveId | int | 是 | 从设备 ID | | masterStation.RTU | stopBit | int | 是 | 停止位 | | masterStation.TCP | IP | string | 是 | TCP 服务器 IP 地址 | | masterStation.TCP | port | int | 是 | TCP 端口号 | | 通用 | startAddress | bool | 是 | 起始地址开关 | --- ## 11. 查询控制器作为主站时的信息 **命令字:** `0x5744` ```json { "processNumber": 2 } ``` | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | --- ## 12. 查询主站信息响应 **命令字:** `0x5745` ```json { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 3, "slaveId": 56, "stopBit": 1 }, "TCP": { "IP": "192.168.1.14", "port": 503 }, "modbus_state": false, "response_time_out": 100, "startAddress": true, "type": "RTU" } ``` | 参数分类 | 参数名 | 类型 | 必填 | 描述 | |----------|--------|------|------|------| | RTU | baudrate | int | 是 | 波特率 | | RTU | checkBit | string | 是 | 校验位 | | RTU | dataBit | int | 是 | 数据位 | | RTU | port | int | 是 | 串口号 | | RTU | slaveId | int | 是 | 从设备 ID | | RTU | stopBit | int | 是 | 停止位 | | TCP | IP | string | 是 | TCP 服务器 IP 地址 | | TCP | port | int | 是 | TCP 端口号 | | 通用 | modbus_state | bool | 是 | MODBUS 状态 | | 通用 | response_time_out | int | 是 | 响应超时时间,单位:毫秒 | | 通用 | startAddress | bool | 是 | 起始地址开关 | | 通用 | type | string | 是 | 通信类型:RTU 或 TCP | --- ## 13. 命令字汇总 | 命令字 | 功能 | 方向 | |--------|------|------| | 0x5701 | 设置 Modbus 程序 | 上位机 → 控制器 | | 0x5702 | 查询 Modbus 程序 | 上位机 → 控制器 | | 0x5703 | 查询 Modbus 程序响应 | 控制器 → 上位机 | | 0x5711 | 设置控制器 Modbus 类型 | 上位机 → 控制器 | | 0x5712 | 查询控制器 Modbus 类型 | 上位机 → 控制器 | | 0x5713 | 查询控制器 Modbus 类型响应 | 控制器 → 上位机 | | 0x5714 | 控制器 Modbus 使能 | 上位机 → 控制器 | | 0x5715 | 设置 Modbus 心跳检测 | 上位机 → 控制器 | | 0x5716 | 查询 Modbus 心跳检测 | 上位机 → 控制器 | | 0x5717 | 查询 Modbus 心跳检测响应 | 控制器 → 上位机 | | 0x5718 | 查询从站连接状态 | 上位机 → 控制器 | | 0x5719 | 设置主站参数 | 上位机 → 控制器 | | 0x5744 | 查询主站信息 | 上位机 → 控制器 | | 0x5745 | 查询主站信息响应 | 控制器 → 上位机 | --- # 泰科相关参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/06.%E5%85%B6%E4%BB%96/01.%E6%B3%B0%E7%A7%91%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0.html ## 1. 防抱闸压紧使能 | 消息类型 | 命令码 | 说明 | |---------|--------|------| | 设置 | 0x7701 BRAKE_AVOIDCRUSHED_SET | 设置防抱闸压紧使能 | | 查询 | 0x7702 BRAKE_AVOIDCRUSHED_INQUIRE | 查询防抱闸压紧使能状态 | | 控制器回复 | 0x7703 BRAKE_AVOIDCRUSHED_RESPOND | 返回防抱闸压紧使能状态 | **设置请求:** ```json { "enable": true } ``` | 参数 | 类型 | 必填 | 说明 | |-----|------|------|------| | enable | boolean | 是 | 防抱闸压紧使能:true 使能,false 关闭 | **查询响应:** ```json { "enable": 1 } ``` | 参数 | 类型 | 说明 | |-----|------|------| | enable | int | 防抱闸压紧使能状态:1 使能,0 关闭 | --- ## 2. 延时参数 | 消息类型 | 命令码 | 说明 | |---------|--------|------| | 设置 | 0x7704 BRAKE_AVOIDCRUSHED_DELAY_SET | 设置延时参数 | | 查询 | 0x7705 BRAKE_AVOIDCRUSHED_DELAY_INQUIRE | 查询延时参数 | | 控制器回复 | 0x7706 BRAKE_AVOIDCRUSHED_DELAY_RESPOND | 返回延时参数 | **设置请求:** ```json { "enableDelay": 0.5, "brakeOnDelay": 0.5, "brakeOffDelay": 0.5 } ``` | 参数 | 类型 | 必填 | 说明 | |-----|------|------|------| | enableDelay | float | 是 | 使能延时(单位:秒) | | brakeOnDelay | float | 是 | 开抱闸延时(单位:秒) | | brakeOffDelay | float | 是 | 抱闸关闭后延时(单位:秒) | **查询响应:** ```json { "enableDelay": 0.5, "brakeOnDelay": 0.5, "brakeOffDelay": 0.5 } ``` | 参数 | 类型 | 说明 | |-----|------|------| | enableDelay | float | 使能延时(单位:秒) | | brakeOnDelay | float | 开抱闸延时(单位:秒) | | brakeOffDelay | float | 抱闸关闭后延时(单位:秒) | --- ## 3. 抱闸参数 | 消息类型 | 命令码 | 说明 | |---------|--------|------| | 设置 | 0x7707 BRAKE_AVOIDCRUSHED_PARAM_SET | 设置抱闸参数 | | 查询 | 0x7708 BRAKE_AVOIDCRUSHED_PARAM_INQUIRE | 查询抱闸参数 | | 控制器回复 | 0x7709 BRAKE_AVOIDCRUSHED_PARAM_SRESPOND | 返回抱闸参数 | **设置请求:** ```json { "jointNum": 1, "EncodeNum": 1, "Encode1Resolusion": 55555, "Encode2Resolusion": 55555, "BrakeType": 1, "Distance": 111, "CheckDistance": 111, "CheckTorq": 111 } ``` | 参数 | 类型 | 必填 | 说明 | |-----|------|------|------| | jointNum | int | 是 | 关节数(范围:1-6) | | EncodeNum | int | 是 | 编码器个数(1 或 2) | | Encode1Resolusion | int | 是 | 编码器1分辨率 | | Encode2Resolusion | int | 是 | 编码器2分辨率 | | BrakeType | int | 是 | 抱闸类型:1 插销式,2 刹片式 | | Distance | int | 是 | 运动距离 | | CheckDistance | int | 是 | 检测距离 | | CheckTorq | int | 是 | 检测力矩 | **查询请求:** ```json { "jointNum": 1 } ``` | 参数 | 类型 | 必填 | 说明 | |-----|------|------|------| | jointNum | int | 是 | 关节数(范围:1-6) | **查询响应:** ```json { "jointNum": 1, "EncodeNum": 1, "Encode1Resolusion": 55555, "Encode2Resolusion": 55555, "BrakeType": 1, "Distance": 111, "CheckDistance": 111, "CheckTorq": 111 } ``` | 参数 | 类型 | 说明 | |-----|------|------| | jointNum | int | 关节数(范围:1-6) | | EncodeNum | int | 编码器个数(1 或 2) | | Encode1Resolusion | int | 编码器1分辨率 | | Encode2Resolusion | int | 编码器2分辨率 | | BrakeType | int | 抱闸类型:1 插销式,2 刹片式 | | Distance | int | 运动距离 | | CheckDistance | int | 检测距离 | | CheckTorq | int | 检测力矩 | --- ## 4. 静态力矩 | 消息类型 | 命令码 | 说明 | |---------|--------|------| | 查询 | 0x770B BRAKE_AVOIDCRUSHED_RECORDTORQ_INQUIRE | 获取静态力矩 | | 控制器回复 | 0x770C BRAKE_AVOIDCRUSHED_RECORDTORQ_RESPOND | 返回静态力矩数据 | **查询请求:** 无 data 字段 **查询响应:** ```json { "torq": [1.1, 22.2, -33.3, -4.5, -105, 126] } ``` | 参数 | 类型 | 说明 | |-----|------|------| | torq | float[] | 1-6 轴关节的静态力矩数组 | --- ## 5. 思迪尔抛光(扩展) | 消息类型 | 命令码 | 说明 | |---------|--------|------| | 控制器回复 | 0x7801 SIDIER_POLISH_START_RESPOND | 思迪尔抛光开始响应 | **响应数据:** ```json { "start": true, "times": 1 } ``` | 参数 | 类型 | 说明 | |-----|------|------| | start | boolean | 是否开始抛光 | | times | int | 抛光次数 | --- # 恩普伺服 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/06.%E5%85%B6%E4%BB%96/02.%E6%81%A9%E6%99%AE%E4%BC%BA%E6%9C%8D.html ## 碰撞检测 **0x3203 NEP_FUNCTION_SET** 请求参数: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | collisionDetectionFlag | bool | 是 | 碰撞检测使能 | | dragTeachFlag | bool | 是 | 拖动示教使能 | | collisionThreshold | int[6] | 是 | 各轴碰撞阈值 | 请求示例: ```json { "robot": 1, "collisionDetectionFlag": true, "dragTeachFlag": false, "collisionThreshold": [1300, 1300, 1300, 1300, 1300, 1300] } ``` ## 拖动示教 **0x3204 NEP_FUNCTION_INQUIRE** 请求参数: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | 请求示例: ```json { "robot": 1 } ``` **0x3205 NEP_FUNCTION_RESPOND** 响应参数: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | collisionDetectionFlag | bool | 是 | 碰撞检测使能 | | dragTeachFlag | bool | 是 | 拖动示教使能 | | collisionThreshold | int[6] | 是 | 各轴碰撞阈值 | 响应示例: ```json { "robot": 1, "collisionDetectionFlag": true, "dragTeachFlag": false, "collisionThreshold": [1300, 1300, 1300, 1300, 1300, 1300] } ``` ## 碰撞清除 **0x3206 NEP_FUNCTION_CLEAR** 请求参数: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | 请求示例: ```json { "robot": 1 } ``` **0x3207 NEP_FUNCTION_CLEAR_RESPOND** 控制器回复响应参数: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号 | | clear | bool | 是 | true: 碰撞清除成功 false: 碰撞清除失败 | 响应示例: ```json { "robot": 1, "clear": true } ``` --- # 数据上传 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/02.6000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29/06.%E5%85%B6%E4%BB%96/03.%E6%95%B0%E6%8D%AE%E4%B8%8A%E4%BC%A0.html ## 设置数据上传开关 **命令码**: `0x5721` `DATAUPLOAD_ENABLE_SET` ### 发送 ```json { "robot": 1, "enable": true } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | enable | bool | 数据是否上传(true-上传,false-不上传) | --- ## 查询数据传输状态 **命令码**: `0x5722` `DATAUPLOAD_ENABLE_INQUIRE` ### 发送 ```json { "robot": 1 } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | --- ## 返回数据传输状态 **命令码**: `0x5723` `DATAUPLOAD_ENABLE_RESPOND` ### 响应 ```json { "robot": 1, "enable": true } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | enable | bool | 数据是否上传(true-上传,false-不上传) | --- ## 设置数据传输参数 **命令码**: `0x5724` `DATAUPLOAD_PARM_SET` ### 发送 ```json { "robot": 1, "uploadMode": "FTP", "fileSuffix": ".csv", "serverIP": "192.168.1.100", "serverPort": 21, "username": "admin", "password": "password", "filepath": "/data", "dataCollectTime": 60.0, "dataUploadTime": 300.0, "sendInfoFileFlag": true } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | uploadMode | string | 上传方式(如 FTP) | | fileSuffix | string | 文件格式(如 .csv) | | serverIP | string | 服务器 IP 地址 | | serverPort | int | 端口号 | | username | string | 用户名 | | password | string | 密码 | | filepath | string | 路径 | | dataCollectTime | double | 数据采集周期(秒) | | dataUploadTime | double | 数据上传周期(秒) | | sendInfoFileFlag | bool | 是否发送说明文件 | --- ## 查询数据传输参数 **命令码**: `0x5725` `DATAUPLOAD_PARM_INQUIRE` ### 发送 ```json { "robot": 1 } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | --- ## 返回数据传输参数 **命令码**: `0x5726` `DATAUPLOAD_PARM_RESPOND` ### 响应 返回参数同 `0x5724`(设置数据传输参数) --- ## 设置上传数据格式 **命令码**: `0x5727` `DATAUPLOAD_FORMAT_SET` ### 发送 ```json { "robot": 1, "type": 1, "format": "datafile" } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | type | int | 数据类型(1, 2, 3, 4) | | format | string | 说明文档文件名 | --- ## 查询数据格式 **命令码**: `0x5728` `DATAUPLOAD_FORMAT_INQUIRE` ### 发送 ```json { "robot": 1, "type": 1 } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | type | int | 数据类型(1, 2, 3, 4) | --- ## 返回数据格式 **命令码**: `0x5729` `DATAUPLOAD_FORMAT_RESPOND` ### 响应 ```json { "robot": 1, "type": 1, "format": "datafile" } ``` | 参数 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | type | int | 数据类型(1, 2, 3, 4) | | format | string | 说明文档文件名 | --- # 7000 端口通讯(2207) > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/03.7000-%E7%AB%AF%E5%8F%A3%E9%80%9A%E8%AE%AF%282207%29.html 控制器为服务端,默认端口号为7000。 本协议所规定的所有数据包均符合本格式定义,采用标准的 TLV(Type,Length,Value)格式,有固定起始包头和 CRC 校验。 ## 数据包格式 | 项目 | 长度(Byte) | 说明 | |------|-----------|------| | SyncByte | 2 | 0x4E66固定包头 | | Length | 2 | 16进制长度0-0xffff;不包含数据头和命令字,不包含 CRC 段 | | Command | 2 | 命令字 | | data | Length | 数据段(主要为 JSON 数据格式) | | CRC | 4 | 对不含包头数据做 CRC 校验(CRC32) | ## 配置文件设置 在配置文件 controller.json 中,`hostComputerService`节点下: - `socketType`:socket 类型,可选择"TCP"和"UDP",默认为"TCP" - `checkCRC`:是否进行 CRC 检测,选择 false 时,不检测 CRC,但注意 CRC 所占用的4个字节的数据仍要发送;默认为 true,检测 CRC --- ## 查询状态 **命令字:0x9512** ```json { "channel": 1, "stop": 1, "robot": 1, "mode": 0, "interval": 10, "queryType": [ "realPosACS", "realPosMCS", "realPosPCS", "realPosUCS", "axisVel", "axisAcc", "torque", "electric", "numGVar", "IO", "serialNum", "runControlPosRunNum", "detailedMotionPos" ], "typeCfg": { "numGVar": ["GD001", "GA001", "GI001", "GI333"], "IO": ["DI1", "DI16", "DO1", "DO3", "DO17"], "detailedMotionPos": { "num": 10, "optional": ["ACS", "MCS", "time", "reset"] } } } ``` ### 参数说明 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | channel | int | 是 | 最多9个通道 | | stop | int | 否 | 为1时,停止之前的持续发送,下面的数据可不发 | | robot | int | 是 | 机器人编号 | | mode | int | 是 | 0:应答(请求一次回复一次),1:持续(请求一次持续回复) | | interval | int | 否 | ms,仅 mode 为持续时有效,范围10-60000 | | queryType | array | 否 | 查询类型数组,可选值见下表 | | typeCfg | object | 否 | 查询内容配置,仅需要查询相关类型数据时有效 | ### queryType 可选值 | 值 | 说明 | |----|------| | realPosACS | 实时坐标位置-关节坐标 | | realPosMCS | 实时坐标位置-直角坐标 | | realPosPCS | 实时坐标位置-工具坐标 | | realPosUCS | 实时坐标位置-用户坐标 | | axisVel | 轴速度 | | axisAcc | 轴加速度 | | torque | 力矩 | | electric | 电流 | | numGVar | 数值变量 | | IO | IO 端口 | | serialNum | 序列号 | | runControlPosRunNum | 运动控制当前轨迹已运行了点位数 | | detailedMotionPos | 详细运动点位,该项每个机器人同一时刻仅支持一个通道查询 | ### typeCfg 详细说明 | 参数 | 类型 | 说明 | |------|------|------| | numGVar | array | 可查询的变量名数组,如["GD001", "GA001", "GI001", "GI333"] | | IO | array | 可查询的 IO 名数组,如["DI1", "DI16", "DO1", "DO3", "DO17"],最大数量不应大于 IO 个数 | | detailedMotionPos | object | 详细运动点位配置 | | detailedMotionPos.num | int | 每帧数据回复的点位数目 | | detailedMotionPos.optional | array | 可选参数:ACS(关节坐标)、MCS(直角坐标)、time(时间戳)、reset(重置点位记录) | --- ## 查询返回 **命令字:0x9513** ```json { "channel": 1, "robot": 1, "replyData": { "realPosACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosMCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosPCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosUCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "torque": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "electric": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "numGVar": { "GD001": 0.1, "GA001": true, "GI001": 33, "GI333": -55 }, "IO": { "DI1": 1, "DI16": 0, "DO1": 0, "DO3": 1, "DO17": -1 }, "runControlPosRunNum": 0, "serialNum": 1, "detailedMotionPos": { "num": 10, "data": [ { "time": [123456, 654321], "ACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "MCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] } ] } } } ``` ### 参数说明 > 坐标说明:机器人(前7个)+ 外部轴(后5个)。无外部轴时,坐标个数为轴数;有外部轴时,坐标个数为7+外部轴个数 | 参数 | 类型 | 说明 | |------|------|------| | channel | int | 通道号 | | robot | int | 机器人编号 | | replyData | object | 查询返回的数据对象,未查询的字段不会回复 | --- ## 运动控制 **命令字:0x9521** ### 模式1:独立点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet" }, "targetPos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] } ``` ### 模式2:独立点位 - 每次传输部分点位(接收完轨迹再运动) ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 0, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet", "timeout": 100 }, "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] } ``` ### 模式3:连续轨迹 - 一次传输完全部轨迹点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 1, "sendMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 }, { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` ### 模式4:连续轨迹 - 每次传输部分点位(接收完轨迹再运动) ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 1, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "timeout": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` ### 运动控制参数说明 | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | clearBuffer | int | 为1时,清空运动轨迹缓存队列;若为0,可不发该字段 | | end | int | 为1时,停止之前的持续传输;若为0,可不发该字段 | | targetMode | int | 0:独立点位,1:连续轨迹 | | sendMode | int | 0:一次传输完全部轨迹点位,1:每次传输部分点位 | | runMode | int | 仅每次传输部分点位时有效,0:接收完轨迹再运动,1:边接收边运动 | | sum | int | 仅"接收完轨迹再运动"时有效,总共要发的帧数 | | count | int | 仅"接收完轨迹再运动"时有效,当前为第几帧 | ### cfg 配置参数说明 | 参数 | 类型 | 说明 | |------|------|------| | coord | string | 坐标类型,如"ACS" | | extMove | int | 1表示外部轴运动;0或不写表示没有 | | sync | int | 0或不写表示外部轴不同步,1表示外部轴同步 | | speed | int | 速度,若不写则使用默认值 | | acc | int | 加速度,若不写则使用默认值 | | pl | int | 速度等级,仅"独立点位"、使用"targetVec"节点时有效,默认值5 | | moveMode | string | 运动模式,可选"TeachSet"、"MOVJ"、"MOVL"、"MOVS",默认值"TeachSet" | | timeout | int | ms,超时时间,若不写则不检测超时,范围10-10000,仅"接收完轨迹再运动"时有效 | ### targetVec 点位参数说明 | 参数 | 类型 | 说明 | |------|------|------| | pos | array | 坐标数组:机器人(前7个)+ 外部轴(后5个) | | axisVel | array | 轴速度,仅连续轨迹模式有效 | | axisAcc | array | 轴加速度,仅连续轨迹模式有效 | | timeStamp | int | ms,运行到该点位时相对于起始点的时间,仅连续轨迹模式有效 | > **注意:** `targetPos`和`targetVec`节点同时存在时,仅`targetPos`节点生效 --- ## 运动控制的回复 **命令字:0x9523** ```json { "robot": 1, "success": false, "size": 1, "cause": "timeout" } ``` ### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | success | bool | 是否成功接收 | | size | int | 运动轨迹缓存队列的当前轨迹数目,仅当 success 为 true 时有该项 | | cause | string | 失败原因,成功时为空;可选值:busy(当前有未传输完成的数据)、timeout(接收超时)、dataErr(数据错误)、termination(发送端终止了正在传输的数据) | --- ## 变量、IO 控制 **命令字:0x9531** ```json { "numGVar": { "GA001": true, "GI033": 6, "GD666": -2.33 }, "IO": { "DO1": 1, "DO13": 0 } } ``` ### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | numGVar | object | 数值变量,键为变量名,值为变量值 | | IO | object | IO 端口,键为 IO 名,值为 IO 状态(0或1) | --- ## 开关伺服点位运动控制 **命令字:0x95A1** > 该功能和"运动控制"功能不可同时使用 ```json { "robot": 1, "switch": true } ``` ### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | switch | bool | true:开启,false:关闭 | --- ## 开关回复 **命令字:0x95A3** ```json { "robot": 1, "success": false, "cause": "busy" } ``` ### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | success | bool | 是否成功 | | cause | string | 失败原因,成功时为空;可选值:dataErr(接收到的数据错误)、startupErr(启动失败)、busy(当前通道被占用) | --- ## 点位发送 **命令字:0x95A4** ```json { "robot": 1, "end": 1, "sum": 10, "count": 1, "PosVec": [ [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] ] } ``` ### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | end | int | 为1时,停止之前的持续传输,下面的数据可不发;若为0,可不发该字段;在点位未传输完毕时,会清空之前接收到的数据,重新等待新的点位队列 | | sum | int | 总共要发的帧数 | | count | int | 当前为第几帧 | | PosVec | array | 坐标数组,坐标格式:机器人(前7个)+ 外部轴(后5个) | --- ## 点位发送的回复 **命令字:0x95A6** ```json { "robot": 1, "success": false, "cause": "dataErr" } ``` ### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号 | | success | bool | 是否成功接收 | | cause | string | 失败原因,成功时为空;可选值:notStart(未开启伺服点位运动控制模式)、dataErr(数据错误)、termination(发送端终止了正在传输的数据)、cacheFull(缓存区已满,最大缓存6条轨迹) | --- # 附录 命令字列表(2207) > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/01.%E5%8D%8F%E8%AE%AE/04.%E9%99%84%E5%BD%95-%E5%91%BD%E4%BB%A4%E5%AD%97%E5%88%97%E8%A1%A8%282207%29.html ## 1. 心跳类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7266 | 心跳检查包格式 | 心跳 | | 0x7267 | 心跳回应包格式 | 心跳 | ## 2. 示教盒状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7277 | 控制器发送示教盒状态 | 拔出示教盒 | | 0x7278 | 插入示教盒恢复通信 | 插入示教盒 | ## 3. 伺服状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2001 | 示教器需要改变伺服状态的时候 | 伺服状态设置及获取 | | 0x2002 | 示教器查询示教状态发送给控制器的命令 | 伺服状态查询 | | 0x2003 | 控制器收到查询命令,或者当前伺服状态发生改变时 | 伺服状态响应 | ## 4. 操作模式状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2101 | 示教器需要设置当前控制器操作模式的时候 | 操作模式状态设置及获取 | | 0x2102 | 示教器查询示教状态发送命令 | 操作模式查询 | | 0x2103 | 控制器收到查询命令,或者当前操作发生改变时,发送命令 | 操作模式响应 | | 0x2104 | 示教器改变示教的操作模式的时候 | 操作模式改变 | | 0x2105 | 示教器查询示教状态发送命令 | 操作模式查询 | | 0x2106 | 示教器查询示教状态返回命令 | 操作模式查询返回 | ## 5. 坐标模式状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2201 | 示教器需要改变当前控制器操作模式的时候 | 坐标模式状态设置及获取 | | 0x2202 | 示教器查询示教状态发送命令 | 坐标模式查询 | | 0x2203 | 控制器收到查询命令,或者当前坐标状态发生改变时 | 坐标模式响应 | ## 6. 伺服上下电状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2301 | 示教器需要改变当前控制器操作模式的时候 | 伺服上下电状态设置及获取 | | 0x2302 | 示教器查询示教状态发送命令 | 上下电状态查询 | | 0x2303 | 控制器收到查询命令,或者当前上下电标状态发生改变时 | 上下电状态响应 | | 0x2304 | 示教器查询示教状态发送命令 | 上下电状态查询 | | 0x2305 | 控制器收到查询命令,或者当前上下电标状态发生改变时 | 上下电状态响应 | | 0x2306 | 控制器收到查询命令,或者当前上下电标状态发生改变时 | 上下电状态响应 | | 0x2314 | 机器人紧急停止 | 紧急停止 | ## 7. 作业文件执行状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2401 | 示教器需要改变当前控制器作业文件执行模式的时候 | 作业文件执行状态设置 | | 0x2402 | 使用无文件运行开关的时候 | 无文件运行 | | 0x2403 | 使用反向运行开关的时候 | 反向运行 | | 0x2405 | 查询正序倒序 | 正序倒序查询 | | 0x2406 | 反向当前正序还是倒序 | 正序倒序设置 | ## 8. 作业文件发送类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2501 | 示教器给控制器发送作业文件完毕的时候 | 作业文件发送完毕 | | 0x2503 | 停止正在运行的作业文件 | 停止作业文件 | ## 9. 速度模式状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2601 | 示教器需要改变当前控制器速度的时候 | 速度模式状态设置及获取 | | 0x2602 | 示教器查询示教速度发送命令 | 速度查询 | | 0x2603 | 控制器收到查询命令,或者当前速度状态发生改变时 | 速度响应 | | 0x2604 | 设置关节轴点动速度时,发送 | 点动速度设置 | | 0x2605 | 查询关节轴点动速度时,发送 | 点动速度查询 | | 0x2606 | 收到查询关节点动速度时,返回 | 点动速度返回 | | 0x2607 | 设置直角坐标点动速度时,发送 | 直角坐标点动速度设置 | | 0x2608 | 查询直角坐标节轴点动速度时,发送 | 直角坐标点动速度查询 | | 0x2609 | 收到查询直角坐标点动速度时,返回 | 直角坐标点动速度返回 | | 0x260A | 设置时发送 | 点动灵敏度设置 | | 0x260B | 获取时发送 | 点动灵敏度查询 | | 0x260C | 返回 | 点动灵敏度返回 | ## 10. 运行参数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2801 | 设置时发送 | 运行参数设置 | | 0x2802 | 获取时发送 | 运行参数获取 | | 0x2803 | 返回 | 运行参数返回 | ## 11. 点动模式状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2901 | 示教器需要执行点动操作的时候 | 点动模式状态设置及获取 | | 0x2902 | 示教器停止执行点动操作的时候 | 点动模式停止 | ## 12. 当前位置获取类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2A02 | 示教器需要获取当前位置的时候 | 当前位置获取 | | 0x2A03 | 控制器收到查询命令时 | 当前位置返回 | | 0x2A04 | 查询电机速度 | 电机速度查询 | | 0x2A05 | 返回查询结果 | 电机速度返回 | | 0x2A06 | 查询电机扭矩 | 电机扭矩查询 | | 0x2A07 | 返回查询结果 | 电机扭矩返回 | | 0x2A08 | 跟随误差(电流驱动) | 跟随误差(电流驱动) | | 0x2A09 | 返回跟随误差 | 跟随误差返回 | | 0x2A0A | 电机负载率查询 | 电机负载率接口 | | 0x2A0B | 返回负载率 | 电机负载率返回 | | 0x2A12 | 位置点坐标系转换 | 位置点坐标系转换 | | 0x2A13 | 控制器返回 | 坐标系转换返回 | | 0x2A14 | 跟随误差查询 | 跟随误差 | | 0x2A15 | 返回跟随误差 | 跟随误差返回 | | 0x2A16 | 返回跟随误差 | 跟随误差返回 | ## 13. 信息提示类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2B01 | 信息提示 | 信息提示 | | 0x2B03 | 错误提示 | 错误提示 | | 0x2B04 | 警告提示 | 警告提示 | | 0x2B05 | 确认提示 | 确认提示 | ## 14. 远程作业文件设置类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2C01 | 设置远程作业文件 | 远程作业文件设置 | | 0x2C02 | 获取远程作业文件 | 远程作业文件获取 | | 0x2C03 | 控制器收到示教盒查询作业文件名字时,返回 | 作业文件名返回 | ## 15. 示教盒设置伺服映射类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2D01 | 示教盒设置伺服映射,发送 (临时) | 示教盒设置伺服映射 | | 0x2D02 | 示教盒向控制器查询伺服映射,发送 (临时) | 伺服映射查询 | | 0x2D03 | 控制器回复 (临时) | 伺服映射回复 | | 0x2D05 | 示教盒向控制器查询伺服映射可选项 (临时) | 伺服映射可选项查询 | | 0x2D06 | 控制器回复 (临时) | 伺服映射可选项回复 | ## 16. 查询机器人类型、数目类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2E02 | 示教盒向控制器查询机器人类型时,发送 | 查询机器人类型、数目 | | 0x2E03 | 控制器收到示教盒查询机器人类型时,发送 | 机器人类型返回 | | 0x2E05 | 示教盒向控制器查询机器人数目时,发送 | 机器人数目查询 | | 0x2E06 | 控制器收到示教盒查询机器人数目时,发送 | 机器人数目返回 | | 0x2E07 | 示教器设置机器人通讯周期,示教盒发送 | 机器人通讯周期设置 | | 0x2E08 | 示教盒向控制器查询机器人通讯周期时,发送 | 机器人通讯周期查询 | | 0x2E09 | 控制器收到示教盒查询机器人通讯周期时,发送 | 机器人通讯周期返回 | | 0x2E0B | 示教盒向控制器查询控制器功能限制情况,发送 | 功能限制查询 | | 0x2E0C | 控制器回复 | 功能限制返回 | | 0x2E0E | 示教盒向控制器查询从站列表,发送 | 从站列表查询 | | 0x2E0F | 控制器回复 | 从站列表返回 | | 0x2E11 | 示教盒向控制器设置协作机器人个数,发送 | 设置双机协作机器人 | | 0x2E12 | 示教盒向控制器查询协作机器人个数,发送 | 协作机器人个数查询 | | 0x2E13 | 控制器回复 | 协作机器人个数返回 | | 0x2E14 | 示教器设置机器人类型及映射 | 示教器设置机器人类型及映射 | | 0x2E15 | 查询机器人类型及映射 | 类型及映射查询 | | 0x2E16 | 回复机器人类型及映射 | 类型及映射回复 | | 0x2E17 | 示教器设置从动轴 | 从动轴设置 | | 0x2E18 | 从动轴查询 | 从动轴查询 | | 0x2E19 | 从动轴回复 | 从动轴回复 | | 0x2E1B | ENI 查询 | ENI 查询 | | 0x2E1C | ENI 回复 | ENI 回复 | ## 17. IO 功能界面设置类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2F01 | IO 功能界面设置时,示教盒 | IO 功能界面设置 | | 0x2F02 | IO 功能界面查询设置时,示教盒 | IO 功能界面查询 | | 0x2F03 | IO 功能界面,控制器收到查询时 | IO 功能界面返回 | | 0x2F04 | 界面设置时,修改复位点位置参数,示教盒 | 复位点设置 | | 0x2F14 | 复位点设置界面,修改复位点 io 参数,示教盒 | 复位点 IO 参数设置 | | 0x2F15 | 读取安全点误差参数 | 安全点误差读取 | | 0x2F16 | 不在安全点时,控制器发送 | 安全点状态通知 | | 0x2F17 | 回复位 | 安全点状态返回 | | 0x2F05 | 复位点设置界面查询设置时,示教盒 | 复位点查询 | | 0x2F06 | 复位点设置界面,控制器收到查询时 | 复位点查询返回 | | 0x2F07 | 复位点设置界面,当前位置查询,示教盒 | 当前位置查询 | | 0x2F08 | 复位点设置界面,控制器收到当前位置查询时 | 当前位置返回 | | 0x2F09 | 设置时,示教盒 | 状态提示设置界面 | | 0x2F0A | 查询设置时,示教盒 | 状态提示查询 | | 0x2F0B | 状态提示设置界面,控制器收到查询时 | 状态提示返回 | | 0x2F0D | 复位设置时,示教盒 | IO 输出设置界面 | | 0x2F0E | 查询设置时,示教盒 | IO 输出查询 | | 0x2F0F | IO 输出设置界面,控制器收到查询时 | IO 输出返回 | | 0x2F12 | IO 功能状态界面,示教盒 | IO 功能状态界面 | | 0x2F13 | IO 功能状态界面,控制器收到查询时 | IO 功能状态返回 | | 0x2F1B | 远程模式界面,示教盒查询预约执行状态时,发送 | 远程模式界面 | | 0x2F1C | 控制器返回 | 远程模式状态返回 | | 0x2F21 | IO 型号设置 示教盒发送 | IO 型号设置 | | 0x2F22 | IO 型号查询 示教盒发送 | IO 型号查询 | | 0x2F23 | IO 型号返回 控制器发送 | IO 型号返回 | ## 18. 安全监测设置类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2F31 | 安全监测设置 示教盒发送 | 安全监测设置 | | 0x2F32 | 示教盒查询安全监测时,发送 | 安全监测查询 | | 0x2F33 | 控制器返回 | 安全监测返回 | ## 19. IO 触发消息设置类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2F41 | IO 触发消息设置 DIN | IO 触发消息设置 | | 0x2F42 | 查询 | IO 触发消息查询 | | 0x2F43 | 控制器返回 | IO 触发消息返回 | | 0x2F44 | DOUT 设置 | DOUT 触发消息设置 | | 0x2F45 | 查询 | DOUT 触发消息查询 | | 0x2F46 | 控制器返回 | DOUT 触发消息返回 | ## 20. 配置文件修改查询操作类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x2F47 | 修改 din 注释配置文件 | 配置文件的修改查询操作 | | 0x2F48 | 查询 din 配置文件 | DIN 配置文件查询 | | 0x2F49 | 返回 din 配置文件 | DIN 配置文件返回 | | 0x2F4A | 设置 dout | DOUT 设置 | | 0x2F4B | 示教器 dout 查询 | DOUT 查询 | | 0x2F4C | 控制器返回 dout 数据 | DOUT 返回 | | 0x2F4D | 读取 din 参数,修改 ain 参数 | AIN 参数修改 | | 0x2F4E | 示教器查询 ain 参数 | AIN 参数查询 | | 0x2F4F | 示教器返回查询结果 | AIN 参数返回 | | 0x2F50 | 修改 aout 注释参数文件 | AOUT 注释修改 | | 0x2F51 | 示教器查询 aout 参数配置文件 | AOUT 参数查询 | | 0x2F52 | 控制器返会查询结果 | AOUT 参数返回 | ## 21. 作业文件指令类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3001 | 示教器发送作业文件指令的时候 | 作业文件指令 | | 0x3121 | 用于无作业文件指令运行,向作业文件里插入指令 | 插入指令 | | 0x3002 | 回零命令 | 回零 | | 0x3003 | 回零状态返回 | 回零状态 | | 0x3004 | 回零完成 | 回零完成 | ## 22. 作业文件改变类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3111 | 删除作业文件时,发送 | 作业文件改变 | | 0x3112 | 重命名作业文件时,发送 | 重命名作业文件 | | 0x3113 | 新建作业文件 | 新建作业文件 | | 0x3114 | 打开作业文件 | 打开作业文件 | | 0x3115 | 复制作业文件 | 复制作业文件 | | 0x3116 | 清空当前机器人作业文件 | 清空作业文件 | | 0x3121 | 插入指令 | 插入指令 | | 0x3122 | 修改指令 | 修改指令 | | 0x3123 | 删除指令 | 删除指令 | | 0x3124 | 插入 Position | 插入 Position | | 0x3125 | 修改 Position | 修改 Position | | 0x3127 | 修改局部数值变量 | 修改局部数值变量 | ## 23. 清除伺服错误类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3201 | 示教器清除伺服错误的时候 | 清除伺服错误 | | 0x3203 | 碰撞检测+拖动示教 | 恩普伺服 | | 0x3204 | 伺服参数返回 | 恩普伺服参数 | | 0x3205 | 伺服参数设置 | 恩普伺服设置 | | 0x3206 | 伺服参数查询 | 恩普伺服查询 | | 0x3207 | 伺服参数返回 | 恩普伺服返回 | ## 24. 标零点类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3301 | 示教器对编码器清零的时候 | 标零点 | | 0x3303 | 清零结束后,控制器返回下面命令 | 标零点返回 | | 0x3305 | 零点偏移查询 | 零点偏移 | | 0x3306 | 零点偏移返回 | 零点偏移返回 | | 0x3307 | 零点偏移设置 | 零点偏移 | | 0x3308 | 单圈值查询 | 单圈值 | | 0x3309 | 单圈值返回 | 单圈值返回 | | 0x330A | 单圈值设置 | 单圈值设置 | ## 25. 版本号获取类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3402 | 示教器需要获取当前控制器版本号的时候 | 版本号获取 | | 0x3403 | 控制器收到查询命令时 | 版本号返回 | ## 26. 指令跳转类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3501 | 当控制器运行完一条指令时,向示教器发送跳转 | 指令跳转 | | 0x3501 | 当控制器运行完一条指令时,向示教器发送跳转 | 指令跳转 | | 0x3502 | 当控制器执行 CRAFTLINE 指令时,向示教器发送跳转 | CRAFTLINE 跳转 | | 0x3503 | 当示教器与控制器建立网络连接时,示教器查询当前运行到哪一行 | 行号查询 | | 0x3504 | 当示教器与控制器建立网络连接时,控制器返内容回 | 行号返回 | ## 27. Din Dout 状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3601 | 示教器设置 DOUT 的时候 | DOUT 设置 | | 0x3602 | 示教器查询 DOUT 状态的时候 | DOUT 查询 | | 0x3603 | 控制器收到查询 DOUT 状态时 | DOUT 返回 | | 0x3605 | 示教器查询 DIN 状态的时候 | DIN 查询 | | 0x3606 | 控制器收到查询 DIN 状态时 | DIN 返回 | | 0x3607 | 示教器设置 AOUT 的时候 | AOUT 设置 | | 0x3608 | 示教器查询 AOUT 状态的时候 | AOUT 查询 | | 0x3609 | 控制器收到查询 AOUT 状态时 | AOUT 返回 | | 0x360A | 示教器查询 DIN 状态的时候 | DIN 查询 | | 0x360B | 控制器收到查询 DIN 状态时 | DIN 返回 | ## 28. 工具手标定类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3801 | 七个点标定完,发送标定数据的时候 | 工具手标定 | | 0x3802 | 查询标定点数据的时候 | 标定点查询 | | 0x3803 | 返回询标定点数据的时候 | 标定点返回 | | 0x3804 | 标定计算完成的时候 | 标定计算完成 | | 0x3814 | 查询已标状态 | 已标状态查询 | | 0x3815 | 返回标记状态 | 已标状态返回 | | 0x3816 | 清除标记状态 | 清除标记 | | 0x3805 | 设置工具手参数的时候 | 工具手参数设置 | | 0x3806 | 查询工具手参数的时候 | 工具手参数查询 | | 0x3807 | 返回工具手参数的时候 | 工具手参数返回 | | 0x380A | 切换工具手的时候 | 工具手切换 | | 0x380B | 查询当前工具手的时候 | 当前工具手查询 | | 0x380C | 返回当前工具手的时候 | 当前工具手返回 | | 0x3812 | 查询已经标定点数据的时候 | 已标定点查询 | | 0x3813 | 返回已经标定点数据的时候 | 已标定点返回 | ## 29. DH 参数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3A01 | DH 参数设置,发送如下指令 | DH 参数 | | 0x3A02 | DH 参数查询,发送如下指令 | DH 参数查询 | | 0x3A03 | DH 参数返回,发送如下指令 | DH 参数返回 | ## 30. 关节参数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3B01 | 关节参数设置,发送如下指令 | 关节参数 | | 0x3B02 | 关节参数查询,发送如下指令 | 关节参数查询 | | 0x3B03 | 关节参数返回,发送如下指令 | 关节参数返回 | | 0x3B04 | 笛卡尔坐标参数设置,发送如下指令 | 笛卡尔坐标参数 | | 0x3B05 | 笛卡尔坐标参数查询,发送如下指令 | 笛卡尔坐标参数查询 | | 0x3B06 | 笛卡尔坐标参数返回,发送如下指令 | 笛卡尔坐标参数返回 | | 0x3B07 | 编码器多圈值溢出计数功能设置 | 编码器多圈值溢出计数功能 | | 0x3B08 | 编码器多圈值溢出计数功能查询 | 编码器多圈值溢出计数功能查询 | | 0x3B09 | 编码器多圈值溢出计数功能返回 | 编码器多圈值溢出计数功能返回 | ## 31. 用户坐标标定类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3C01 | 用户坐标校正设置,发送如下指令 | 用户坐标标定 | | 0x3C02 | 用户坐标校正查询,发送如下指令 | 用户坐标标定查询 | | 0x3C03 | 用户坐标校正回复 | 用户坐标校正返回 | | 0x3C04 | 数据返回格式 | 数据返回格式 | | 0x3C07 | 用户坐标设置,发送如下指令 | 用户坐标设置 | | 0x3C08 | 用户坐标查询,发送如下指令 | 用户坐标查询 | | 0x3C09 | 查询回复格式 | 用户坐标返回 | | 0x3C0A | 用户坐标号设置,发送如下指令 | 用户坐标号设置 | | 0x3C0B | 用户坐标号查询,发送如下指令 | 用户坐标号查询 | | 0x3C0C | 用户坐标号查询返回 | 用户坐标号返回 | | 0x3C0D | 用户注释设置,发送如下指令 | 用户注释设置 | | 0x3C0E | 用户注释查询,发送如下指令 | 用户注释查询 | | 0x3C0F | 用户注释查询返回 | 用户注释返回 | ## 32. 查询程序运行状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3D02 | 查询程序运行状态时,发送 | 查询程序运行状态 | | 0x3D03 | 查询程序运行状态时回复 | 程序运行状态返回 | ## 33. 预置机器人类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3E01 | 预置机器人 | 预置机器人 | | 0x3E02 | 预置机器人设置 | 预置机器人设置 | | 0x3E03 | 预置机器人返回 | 预置机器人返回 | ## 34. 机器人范围类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x3F01 | 设置机器人范围时,发送 | 机器人范围 | | 0x3F02 | 查询机器人范围时,发送 | 机器人范围查询 | | 0x3F03 | 收到查询机器人范围时,返回 | 机器人范围返回 | | 0x3F04 | 设置视觉范围时,发送 | 视觉范围 | | 0x3F05 | 查询视觉范围时,发送 | 视觉范围查询 | | 0x3F06 | 收到查询视觉范围时,返回 | 视觉范围返回 | | 0x3F07 | 设置干涉区范围时,发送 | 干涉区范围 | | 0x3F08 | 查询干涉区范围时,发送 | 干涉区范围查询 | | 0x3F09 | 收到干涉区范围时,返回 | 干涉区范围返回 | ## 35. 焊接装置类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4001 | 设置焊接装置时,发送 | 焊接装置 | | 0x4002 | 查询焊接装置时,发送 | 焊接装置查询 | | 0x4003 | 收到查询焊接装置时,返回 | 焊接装置返回 | | 0x4004 | 设置电流电压匹配时,发送 | 电流电压匹配 | | 0x4005 | 查询电流电压匹配时,发送 | 电流电压匹配查询 | | 0x4006 | 收到查询电流电压匹配时,返回 | 电流电压匹配返回 | | 0x4007 | 设置焊接参数时,发送 | 焊接参数 | | 0x4008 | 查询焊接参数时,发送 | 焊接参数查询 | | 0x4009 | 收到查询焊接参数时,返回 | 焊接参数返回 | | 0x400A | 焊接参数返回 | 焊接参数返回 | | 0x400B | 设置摆焊参数时,发送 | 摆焊参数 | | 0x400C | 查询摆焊参数时,发送 | 摆焊参数查询 | | 0x400D | 收到查询摆焊参数时,返回 | 摆焊参数返回 | | 0x400E | 设置电流电压匹配参数实际值,发送 | 电流电压匹配参数实际值 | | 0x400F | 设置电流电压匹配参数实际值,控制器返回 | 电流电压匹配参数返回 | | 0x4010 | 开始进行模拟量匹配 | 开始进行模拟量匹配 | | 0x4011 | 设置焊接 IO 接口时,发送 | 焊接 IO 接口 | | 0x4012 | 查询焊接 IO 接口时,发送 | 焊接 IO 接口查询 | | 0x4013 | 控制器收到查询焊接 IO 接口时,返回 | 焊接 IO 接口返回 | | 0x4015 | 查询焊接状态时,发送 | 焊接状态 | | 0x4016 | 控制器收到查询焊接状态时,返回 | 焊接状态返回 | | 0x4017 | 点焊参数设置 | 点焊参数 | | 0x4018 | 电流电压直接设置 | 电流电压直接设置 | | 0x401A | 设置焊机模式 | 焊机 | | 0x401B | 焊机参数查询 | 焊机参数查询 | | 0x401C | 焊机参数数据返回 | 焊机参数返回 | | 0x401D | 焊机选择设置 | 焊机选择设置 | | 0x401E | 查询 | 焊机选择查询 | | 0x401F | 返回 | 焊机选择返回 | | 0x4022 | 焊机通讯状态查询 | 焊机通讯状态查询 | | 0x4023 | 返回 | 焊机通讯状态返回 | ## 36. 相贯线焊接标定工件坐标系类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4051 | 坐标标定设置,发送如下指令 | 相贯线焊接标定工件坐标系 | | 0x4052 | 坐标标定查询,发送如下指令 | 坐标标定查询 | | 0x4053 | 回复 | 坐标标定返回 | | 0x4054 | 数据返回格式 | 数据返回格式 | | 0x4055 | 相贯线工件参数设置,发送如下指令 | 相贯线工件参数设置 | | 0x4056 | 相贯线工件参数查询,发送如下指令 | 相贯线工件参数查询 | | 0x4057 | 相贯线工件参数查询,回复指令 | 相贯线工件参数返回 | | 0x4061 | 相贯线焊枪参数设置,发送指令 | 相贯线焊枪参数设置 | | 0x4062 | 相贯线焊枪参数查询,发送指令 | 相贯线焊枪参数查询 | | 0x4063 | 相贯线焊枪参数查询,回复指令 | 相贯线焊枪参数返回 | | 0x4065 | 区分有无变位机的相贯线工艺的标志量设置,发送如下指令 | 相贯线工艺标志设置 | | 0x4066 | 坐标标定查询,发送如下指令 | 相贯线标定查询 | | 0x4067 | 回复 | 相贯线标定返回 | ## 37. 视觉参数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4101 | 设置视觉参数 | 视觉参数 | | 0x4102 | 视觉参数设置 | 视觉参数设置 | | 0x4103 | 视觉参数查询 | 视觉参数查询 | | 0x4104 | 视觉参数返回 | 视觉参数返回 | | 0x4105 | 视觉参数使能 | 视觉参数使能 | | 0x4106 | 视觉参数使能返回 | 视觉参数使能返回 | | 0x4107 | 查询视觉调试点位列表 | 视觉调试 | | 0x4108 | 返回视觉调试点位列表 | 视觉调试点位返回 | | 0x4109 | 清空视觉调试点位列表 | 清空视觉调试点位 | | 0x410A | 拍照 | 视觉拍照 | | 0x410B | 计算偏移 | 视觉计算偏移 | | 0x410C | 运动至该点 | 视觉运动至点 | | 0x4110 | 视觉参数设置 | 视觉参数设置 | | 0x4111 | 视觉参数查询 | 视觉参数查询 | | 0x4112 | 视觉参数返回 | 视觉参数返回 | | 0x4113 | 视觉参数使能 | 视觉参数使能 | | 0x4114 | 查询网络 ip | 查询网络 ip | | 0x4115 | 查询网络 ip 响应 | 网络 ip 返回 | ## 38. 激光传感器类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4130 | 设置激光器参数 | 设置激光器参数 | | 0x4131 | 查询激光跟踪参数 | 查询激光跟踪参数 | | 0x4132 | 响应激光跟踪参数 | 激光跟踪参数返回 | | 0x4133 | 设置寻位/跟踪类型 | 设置寻位/跟踪类型 | | 0x4134 | 查询寻位/跟踪类型 | 查询寻位/跟踪类型 | | 0x4136 | 设置跟踪参数表 | 设置跟踪参数表 | | 0x4137 | 查询跟踪参数 | 查询跟踪参数 | | 0x4138 | 回复 | 跟踪参数返回 | | 0x4139 | 寻位参数表设置 | 寻位参数表设置 | | 0x413A | 查询 | 寻位参数表查询 | | 0x413B | 回复 | 寻位参数表返回 | | 0x413C | 复制 | 寻位参数表复制 | | 0x413D | 清空 | 寻位参数表清空 | | 0x4140 | 激光传感器标定,标定记录查询 | 激光传感器标定 | | 0x4141 | 返回 | 激光传感器标定返回 | | 0x4142 | 记录标定点 | 记录标定点 | | 0x4143 | 标定点记录返回 | 标定点记录返回 | | 0x4144 | 运动到标定点 | 运动到标定点 | | 0x4145 | 计算标定结果 | 计算标定结果 | | 0x4146 | 标定结果返回 | 标定结果返回 | | 0x4147 | 清空标定记录 | 清空标定记录 | | 0x4148 | 取消标定 | 取消标定 | ## 39. 电弧跟踪类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4150 | 设置通讯参数 | 电弧跟踪 | | 0x4151 | 查询通讯参数 | 电弧跟踪通讯参数查询 | | 0x4152 | 响应通讯参数查询 | 电弧跟踪通讯参数返回 | | 0x4153 | 设置补偿参数 | 电弧跟踪补偿参数设置 | | 0x4154 | 查询补偿参数 | 电弧跟踪补偿参数查询 | | 0x4155 | 响应补偿参数查询 | 电弧跟踪补偿参数返回 | ## 40. 电弧寻位类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4160 | 设置参数 | 电弧寻位 | | 0x4161 | 查询参数 | 电弧寻位参数查询 | | 0x4162 | 响应查询 | 电弧寻位参数返回 | | 0x4163 | 查询激光器是否标定 | 激光器标定查询 | | 0x4164 | 响应 | 激光器标定状态返回 | ## 41. 传送带类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4801 | 传送带跟踪设置传送带参数 | 传送带 | | 0x4802 | 查询传送带参数 | 传送带参数查询 | | 0x4803 | 返回传送带参数 | 传送带参数返回 | | 0x4804 | 设置工件识别参数 | 工件识别参数设置 | | 0x4805 | 查询工件识别参数 | 工件识别参数查询 | | 0x4806 | 返回工件识别参数 | 工件识别参数返回 | | 0x4807 | 实时查询编码器值和传送带速度 | 实时查询 | | 0x4808 | 响应实时查询 | 实时查询返回 | | 0x4810 | 传送带坐标系标定计算用户坐标系 | 传送带坐标系标定 | | 0x4811 | 标定取坐标 | 标定取坐标 | | 0x4812 | 查询已标定的点坐标 | 已标定坐标查询 | | 0x4813 | 返回标定的点坐标 | 已标定坐标返回 | | 0x4814 | 清空标定值 | 清空标定值 | | 0x4815 | 取消标定 | 取消标定 | | 0x4816 | 传感器位置标定传感器位置查询 | 传感器位置标定 | | 0x4817 | 响应传感器位置查询 | 传感器位置返回 | | 0x4818 | 传感器位置开始标定及参数查询 | 传感器位置标定开始 | | 0x4819 | 响应传感器位置标定参数查询 | 传感器位置标定参数返回 | | 0x481A | 传感器位置参数标定 | 传感器位置参数标定 | | 0x481C | 传感器跟踪抓取姿态参数查询 | 抓取姿态参数查询 | | 0x481D | 响应传感器跟踪抓取姿态查询 | 抓取姿态参数返回 | | 0x481E | 传感器跟踪抓取姿态标定 | 抓取姿态标定 | | 0x4820 | 清空标定值 | 清空标定值 | | 0x4821 | 取消标定 | 取消标定 | | 0x4822 | 计算传感器位置 | 计算传感器位置 | | 0x4830 | 设置传送带跟踪位置参数 | 传送带跟踪位置参数设置 | | 0x4831 | 查询传送带跟踪位置参数 | 传送带跟踪位置参数查询 | | 0x4832 | 返回传送带跟踪位置参数 | 传送带跟踪位置参数返回 | | 0x4833 | 标定位置 | 标定位置 | | 0x4834 | 返回标定位置 | 标定位置返回 | | 0x4835 | 复制传送带参数 | 复制传送带参数 | | 0x4836 | 清空传送带参数 | 清空传送带参数 | | 0x4837 | 运动到指定的位置 | 运动到指定位置 | ## 42. MSG 通讯类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4180 | MSG 通讯设置网络参数 | MSG 通讯 | | 0x4181 | 查询网络参数 | 网络参数查询 | | 0x4182 | 响应网络参数查询 | 网络参数返回 | | 0x4183 | 连接 MSGCOMM 网络 | 连接 MSGCOMM | | 0x4184 | 关闭 MSGCOMM 网络 | 关闭 MSGCOMM | ## 43. 码垛工艺类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4201 | 码垛工艺设置抓手参数 | 码垛工艺 | | 0x4202 | 查询抓手参数 | 抓手参数查询 | | 0x4203 | 返回抓手参数 | 抓手参数返回 | | 0x4204 | 设置托盘参数 | 托盘参数设置 | | 0x4205 | 查询托盘参数 | 托盘参数查询 | | 0x4206 | 返回托盘参数 | 托盘参数返回 | | 0x4207 | 设置位置参数 | 位置参数设置 | | 0x4208 | 查询位置参数 | 位置参数查询 | | 0x4209 | 返回位置参数 | 位置参数返回 | | 0x420A | 设置工件参数 | 工件参数设置 | | 0x420B | 查询工件参数 | 工件参数查询 | | 0x420C | 返回工件参数 | 工件参数返回 | | 0x420D | 设置接近参数 | 接近参数设置 | | 0x420E | 查询接近参数 | 接近参数查询 | | 0x420F | 返回接近参数 | 接近参数返回 | | 0x4210 | 设置重叠模式参数 | 重叠模式参数设置 | | 0x4211 | 查询重叠模式参数 | 重叠模式参数查询 | | 0x4212 | 返回重叠模式参数 | 重叠模式参数返回 | | 0x4213 | 设置平面模式参数 | 平面模式参数设置 | | 0x4214 | 查询平面模式参数 | 平面模式参数查询 | | 0x4215 | 返回平面模式参数 | 平面模式参数返回 | | 0x4216 | 请求转换为平面模式自定义模板 | 平面模式转换请求 | | 0x4217 | 返回转换为平面模式自定义模板后对应参数 | 平面模式转换返回 | | 0x4218 | 请求平面模式预览 | 平面模式预览请求 | | 0x4219 | 返回平面模式预览参数 | 平面模式预览返回 | | 0x421A | 设置码垛状态 | 码垛状态设置 | | 0x421B | 查询码垛状态 | 码垛状态查询 | | 0x421C | 返回码垛状态 | 码垛状态返回 | | 0x421D | 复制码垛参数 | 复制码垛参数 | | 0x421E | 清空码垛参数 | 清空码垛参数 | | 0x421F | 复制层图形参数 | 复制层图形参数 | | 0x4221 | 切换使用码垛类型 | 码垛类型切换 | | 0x4222 | 查询当前使用码垛类型 | 码垛类型查询 | | 0x4223 | 返回 | 码垛类型返回 | | 0x4224 | 设置简易码垛位置设置 | 简易码垛位置设置 | | 0x4225 | 查询简易码垛位置设置 | 简易码垛位置查询 | | 0x4226 | 返回 | 简易码垛位置返回 | | 0x4227 | 设置简易码垛抓手参数 | 简易码垛抓手参数设置 | | 0x4228 | 查询简易码垛抓手参数 | 简易码垛抓手参数查询 | | 0x4229 | 返回简易码垛抓手参数 | 简易码垛抓手参数返回 | | 0x422A | 复制简易码垛参数 | 复制简易码垛参数 | | 0x422B | 清空简易码垛参数 | 清空简易码垛参数 | | 0x422C | 码垛复位 | 码垛复位 | | 0x4232 | 码垛自定义模式拖拽和旋转,不保存查询,发送 | 码垛自定义模式 | | 0x4233 | 控制器返回 | 码垛自定义模式返回 | | 0x4242 | 点位调试界面获取全部工件数据 | 工件数据获取 | | 0x4243 | 控制器回复 | 工件数据返回 | | 0x4244 | 整体偏移 | 整体偏移 | | 0x4245 | 应用到相同层 | 应用到相同层 | | 0x4247 | 修改单个工件位置 | 单个工件位置修改 | | 0x4248 | 获取单个工件位置 | 单个工件位置获取 | | 0x4249 | 控制器回复单个工件位置 | 单个工件位置返回 | | 0x424A | 将点位调试内容从缓存保存到文件中 | 点位保存 | | 0x424D | 运动到工件某位置 | 运动到工件位置 | ## 44. 控制器 ip 设置类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4301 | 控制器 ip 设置 | 控制器 ip 设置 | | 0x4302 | 控制器 ip 设置返回 | 控制器 ip 设置返回 | | 0x4303 | 控制器 ip 查询 | 控制器 ip 查询 | | 0x4305 | 控制器初始化是否完成查询是否完成 | 控制器初始化是否完成查询 | | 0x4306 | 控制器回复 | 控制器初始化状态返回 | ## 45. 激光切割工艺类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4401 | 激光切割工艺 IO 端口设置 | 激光切割工艺 | | 0x4402 | IO 端口查询 | IO 端口查询 | | 0x4403 | 控制器返回 | IO 端口返回 | | 0x4404 | 全局参数设置 | 全局参数设置 | | 0x4405 | 全局参数查询 | 全局参数查询 | | 0x4406 | 控制器返回 | 全局参数返回 | | 0x4407 | 模拟量匹配设置 | 模拟量匹配设置 | | 0x4408 | 模拟量匹配查询 | 模拟量匹配查询 | | 0x4409 | 控制器返回 | 模拟量匹配返回 | | 0x440A | 切割参数设置 | 切割参数设置 | | 0x440B | 切割参数查询 | 切割参数查询 | | 0x440C | 控制器返回 | 切割参数返回 | | 0x440E | 状态查看查询 | 状态查看查询 | | 0x440F | 控制器返回 | 状态查看返回 | | 0x4410 | 点射参数设置 | 点射参数设置 | | 0x4411 | 手动操作 | 手动操作 | | 0x4412 | 手动操作当前状态 | 手动操作状态 | | 0x4413 | 控制器返回 | 手动操作返回 | | 0x4417 | 模拟量匹配中的发送 | 模拟量匹配发送 | | 0x4419 | 控制器返回 | 模拟量匹配返回 | ## 46. 机器人运动类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4501 | 机器人关节运动 MOVJ | 机器人运动 | | 0x4502 | 机器人直线运动 MOVL | 机器人运动 | | 0x4503 | 机器人圆弧运动 MOVC | 机器人运动 | | 0x4504 | 机器人样条曲线运动 MOVS | 机器人运动 | ## 47. 打磨类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4601 | 打磨 | 打磨 | | 0x4602 | 打磨参数设置 | 打磨参数设置 | | 0x4603 | 打磨参数返回 | 打磨参数返回 | ## 48. 喷涂类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x4701 | 喷涂模拟量设置 | 喷涂 | | 0x4702 | 查询 | 喷涂模拟量查询 | | 0x4703 | 返回 | 喷涂模拟量返回 | | 0x4704 | 数字量设置 | 喷涂数字量设置 | | 0x4705 | 查询 | 喷涂数字量查询 | | 0x4706 | 返回 | 喷涂数字量返回 | | 0x4707 | 时序设置 | 喷涂时序设置 | | 0x4708 | 查询 | 喷涂时序查询 | | 0x4709 | 返回 | 喷涂时序返回 | | 0x470A | 轨迹参数设置 | 喷涂轨迹参数设置 | | 0x470B | 查询 | 喷涂轨迹参数查询 | | 0x470C | 返回 | 喷涂轨迹参数返回 | | 0x4711 | 手动操作中的选择和按钮 | 喷涂手动操作 | | 0x4712 | 查询 | 手动操作查询 | | 0x4713 | 返回 | 手动操作返回 | | 0x4714 | 手动操作中的模拟量设置 | 喷涂手动模拟量设置 | | 0x4715 | 查询 | 喷涂手动模拟量查询 | | 0x4716 | 返回 | 喷涂手动模拟量返回 | | 0x4717 | 手动操作中的油量测试时间 | 油量测试时间设置 | | 0x4718 | 查询 | 油量测试时间查询 | | 0x4719 | 返回 | 油量测试时间返回 | ## 49. 切换机器人类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5001 | 切换机器人时,发送 | 切换机器人 | | 0x5002 | 查询机器人时,发送 | 机器人查询 | | 0x5003 | 收到查询机器人时,返回 | 机器人返回 | ## 50. 循环次数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5011 | 设置循环次数时,发送 | 循环次数 | | 0x5012 | 查询循环次数时,发送 | 循环次数查询 | | 0x5013 | 收到查询循环次数时,返回 | 循环次数返回 | ## 51. 运行时间类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5022 | 查询运行时间时,发送 | 运行时间 | | 0x5023 | 收到查询运行时间时,返回 | 运行时间返回 | ## 52. 远程模式连接状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5032 | 远程模式连接状态,查询连接状态时,发送 | 远程模式连接状态 | | 0x5033 | 收到查询连接状态时,返回 | 远程模式连接状态返回 | ## 53. 伺服连接状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5042 | 伺服连接状态查询 | 伺服连接状态 | | 0x5043 | 收到查询连接状态时,返回 | 伺服连接状态返回 | ## 54. 控制器 License 类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5052 | 控制器 License,获取控制器 ID | 控制器 License | | 0x5053 | 控制器回复 | License 返回 | | 0x5055 | 获取剩余使用天数 | 剩余使用天数查询 | | 0x5056 | 控制器回复 | 剩余使用天数返回 | | 0x5057 | 更新 license | License 更新 | | 0x5059 | 控制器回复 | License 更新返回 | | 0x505C | 发送 | 发送 | | 0x505F | 发送 | 发送 | ## 55. 重启控制器类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5061 | 重启控制器时,发送 | 重启控制器 | | 0x5064 | 恢复出厂设置 | 恢复出厂设置 | ## 56. 伺服参数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5071 | 通过控制器设置伺服内部参数 | 伺服参数 | | 0x5072 | 查询 | 伺服参数查询 | | 0x5073 | 返回 | 伺服参数返回 | ## 57. 自启动程序类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5081 | 自启动程序运行设置 | 自启动程序 | | 0x5082 | 查询 | 自启动程序查询 | | 0x5083 | 返回 | 自启动程序返回 | ## 58. 程序指令顺序类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5092 | 程序指令顺序查询 | 程序指令顺序 | | 0x5093 | 返回指令个数(最多有两个返回信号) | 指令个数返回 | ## 59. 操作参数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x50A1 | 操作参数设置 | 操作参数设置 | | 0x50A2 | 查询 | 操作参数查询 | | 0x50A3 | 控制器返回 | 操作参数返回 | | 0x50A4 | 示教器设置角度幅度 | 角度幅度设置 | ## 60. 文件传输类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5501 | 请求上传某文件 | 文件传输 | | 0x5502 | 同意上传请求,拒绝上传请求 | 上传响应 | | 0x5504 | 请求下载某文件 | 下载请求 | | 0x5505 | 同意下载请求,拒绝下载请求 | 下载响应 | | 0x5525 | 文件传输网络异常中断 | 文件传输中断 | | 0x5507 | 示教器查询控制器配置文件目录 | 配置文件目录查询 | | 0x5508 | 控制器向示教器发送配置文件目录的文件数量及名称 | 配置文件目录返回 | | 0x5542 | 示教器请求获取日志文件列表 | 日志文件列表请求 | | 0x5543 | 控制器回复日志文件列表 | 日志文件列表返回 | | 0x5532 | 示教器请求获取作业文件列表 | 作业文件列表请求 | | 0x5533 | 控制器回复作业文件列表 | 作业文件列表返回 | | 0x5534 | ReceiveJobListByRobot | 按机器人获取作业文件列表 | | 0x5535 | ReceiveFinish | 接收完成 | ## 61. 全局变量类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5602 | GetAllGlobalPosition | 全局变量 | | 0x5603 | ReceiveAllGlobalPosition | 全局变量返回 | | 0x5604 | SetGlobalPosition | 全局位置设置 | | 0x5605 | GetGlobalPosition | 全局位置获取 | | 0x5606 | 控制器回复 | 全局位置返回 | | 0x5607 | SetGlobalVariant | 全局变量设置 | | 0x5608 | GetGlobalVariant | 全局变量获取 | | 0x5609 | ReceiveGlobalVariant | 全局变量返回 | | 0x560B | 查询一个全局变量 | 全局变量查询 | | 0x560C | 控制器回复 | 全局变量查询返回 | | 0x5612 | 局部变量位置变量 P 点查询 | P 点查询 | | 0x5613 | 返回 | P 点返回 | | 0x5615 | 局部变量位置变量 E 点查询 | E 点查询 | | 0x5616 | 返回 | E 点返回 | | 0x5618 | 局部变量数值变量查询 | 数值变量查询 | | 0x5619 | 返回 | 数值变量返回 | ## 62. Modbus 类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5701 | 设置 Modbus 程序 | Modbus | | 0x5702 | 查询 Modbus 程序 | Modbus 程序查询 | | 0x5703 | 查询 Modbus 程序时,控制器返回的值 | Modbus 程序返回 | | 0x5711 | 设置 modbus 参数 | Modbus 参数设置 | | 0x5712 | 查询 modbus 参数 | Modbus 参数查询 | | 0x5713 | 控制器返回 | Modbus 参数返回 | | 0x5714 | modbus 使能 | Modbus 使能 | | 0x5718 | Modbus 查询 | Modbus 查询 | | 0x5719 | 发送 | Modbus 发送 | ## 63. 数据上传类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5721 | 设置使能 | 数据上传 | | 0x5722 | 查询数据传输状态 | 数据传输状态查询 | | 0x5723 | 返回数据传输状态 | 数据传输状态返回 | | 0x5724 | 设置数据传输数据 | 数据传输数据设置 | | 0x5725 | 查询数据传输数据 | 数据传输数据查询 | | 0x5726 | 返回数据传输数据 | 数据传输数据返回 | | 0x5727 | 设置数据格式 | 数据格式设置 | | 0x5728 | 查询数据格式 | 数据格式查询 | | 0x5729 | 返回数据格式 | 数据格式返回 | ## 64. 电批类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x5731 | 修改电批参数 | 电批 | | 0x5732 | 示教器查询电批参数 | 电批参数查询 | | 0x5733 | 发送电批参数 | 电批参数发送 | | 0x5736 | 发送 IO 状态 | 电批 IO 状态发送 | | 0x5738 | 电批锁定结果查询 | 电批锁定结果查询 | | 0x5739 | 发送锁定结果 | 电批锁定结果发送 | ## 65. 示教器查询机器人的运行状态类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x9102 | 示教器查询机器人的运行状态 | 示教器查询机器人的运行状态 | | 0x9103 | 发送机器人运行状态(0x95XX 被上位机服务功能占有) | 机器人运行状态发送 | ## 66. 错误消息类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x6010 | 服务器发送错误 | 服务器错误 | | 0x6020 | 发送机器人错误 | 机器人错误 | | 0x6030 | 发送控制器错误 | 控制器错误 | | 0x6040 | 发送内存错误 | 内存错误 | ## 67. 警告和消息类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x6110 | 警告类型 | 警告类型 | | 0x6210 | 消息类型 | 消息类型 | ## 68. 外部轴类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7001 | 变位机坐标校正设置,发送如下指令 | 外部轴 | | 0x7002 | 变位机坐标校正查询,发送如下指令 | 外部轴坐标校正查询 | | 0x7003 | 回复 | 外部轴坐标校正返回 | | 0x7004 | 数据返回格式 | 数据返回格式 | | 0x7005 | 查询所有外部轴的标定结果 | 外部轴标定结果查询 | | 0x7006 | 返回外部轴的标定结果 | 外部轴标定结果返回 | | 0x7007 | 变位机坐标系查询,发送如下指令 | 变位机坐标系查询 | | 0x7008 | 回复 | 变位机坐标系返回 | | 0x700D | 设置地轨参数,示教盒 | 地轨参数设置 | | 0x700E | 地轨参数查询 | 地轨参数查询 | | 0x700F | 控制器回复 | 地轨参数返回 | | 0x7012 | 外部轴设置界面,当前位置查询,示教盒 | 外部轴当前位置查询 | | 0x7013 | 复位点设置界面,控制器收到当前位置查询时 | 外部轴当前位置返回 | | 0x7015 | 设置双机协作使能指令 | 双机协作使能设置 | | 0x7016 | 获取协作状态 | 协作状态获取 | | 0x7017 | 回复协作状态 | 协作状态返回 | | 0x7021 | 外部轴关节参数设置,发送如下指令 | 外部轴关节参数设置 | | 0x7022 | 关节参数查询,发送如下指令 | 外部轴关节参数查询 | | 0x7023 | 关节参数返回,发送如下指令 | 外部轴关节参数返回 | | 0x7024 | 外部轴点动关节速度设置,发送如下指令 | 外部轴点动速度设置 | | 0x7025 | 外部轴点动关节速度查询 | 外部轴点动速度查询 | | 0x7026 | 外部轴点动关节速度参数返回,发送如下指令 | 外部轴点动速度返回 | | 0x7027 | 编码器多圈值溢出计数功能设置 | 外部轴编码器溢出设置 | | 0x7028 | 查询 | 外部轴编码器溢出查询 | | 0x7029 | 返回 | 外部轴编码器溢出返回 | | 0x7031 | 外部轴零点参数设置,发送如下指令 | 外部轴零点参数设置 | | 0x7033 | 零点设置成功后控制器返回 | 外部轴零点设置返回 | | 0x7034 | 外部轴零点偏移 | 外部轴零点偏移 | | 0x7035 | 外部轴单圈值设置,发送指令 | 外部轴单圈值设置 | | 0x7041 | 外部轴标定结果设置 | 外部轴标定结果设置 | | 0x7042 | 外部轴标定结果查询 | 外部轴标定结果查询 | | 0x7043 | 外部轴标定结果返回 | 外部轴标定结果返回 | ## 69. 点标定类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7101 | 20个点标定完,发送标定数据的时候 | 点标定 | | 0x7102 | 标定点数据的时候 | 点标定数据 | | 0x7103 | 返回标定点数据的时候 | 点标定数据返回 | | 0x7104 | 标定计算完成的时候 | 点标定计算完成 | | 0x7105 | 将标定结果设置零点 | 点标定设置零点 | | 0x7106 | 成功 | 点标定成功 | | 0x7107 | 查询标定点状态的时候 | 点标定状态查询 | | 0x7108 | 返回询标定点状态据的时候 | 点标定状态返回 | | 0x7109 | 清除标定状态 | 清除点标定状态 | | 0x710A | 查询已经标定点数据的时候 | 已标定点查询 | | 0x710B | 返回已经标定点数据的时候 | 已标定点返回 | | 0x710C | 收到某号机器人定点标定数据,并执行 movj | 定点标定数据执行 | ## 70. 杆长标定类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7201 | 4个点标定完,发送标定数据的时候。设置距离输入值,计算并返回结果 | 杆长标定 | | 0x7202 | 查询标定点数据 | 杆长标定点查询 | | 0x7203 | 返回标定点数据 | 杆长标定点返回 | | 0x7204 | 计算完成发送下面指令 | 杆长计算完成 | | 0x7205 | 杆长标定返回 | 杆长标定返回 | | 0x7206 | 杆长标定设置 | 杆长标定设置 | ## 71. 3D 鼠标控制类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7301 | 3D 鼠标控制 | 3D 鼠标控制 | | 0x7302 | 3D 鼠标参数设置 | 3D 鼠标参数设置 | | 0x7303 | 3D 鼠标参数查询 | 3D 鼠标参数查询 | | 0x7304 | 3D 鼠标参数返回 | 3D 鼠标参数返回 | | 0x7305 | 3D 鼠标使能设置 | 3D 鼠标使能设置 | | 0x7306 | 3D 鼠标使能查询 | 3D 鼠标使能查询 | | 0x7307 | 3D 鼠标使能返回 | 3D 鼠标使能返回 | | 0x7308 | 3D 鼠标位置获取 | 3D 鼠标位置获取 | | 0x7309 | 3D 鼠标位置返回 | 3D 鼠标位置返回 | | 0x730A | 3D 鼠标按钮状态 | 3D 鼠标按钮状态 | ## 72. 动力学相关类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7401 | 动力学参数设置 | 动力学相关 | | 0x7402 | 动力学参数查询 | 动力学参数查询 | | 0x7403 | 动力学参数返回 | 动力学参数返回 | | 0x7404 | 动力学模型设置 | 动力学模型设置 | | 0x7405 | 动力学模型查询 | 动力学模型查询 | | 0x7406 | 动力学模型返回 | 动力学模型返回 | | 0x7407 | 动力学参数使能 | 动力学参数使能 | | 0x7408 | 动力学参数使能查询 | 动力学参数使能查询 | | 0x7409 | 动力学参数使能返回 | 动力学参数使能返回 | | 0x740A | 动力学计算 | 动力学计算 | | 0x740B | 动力学计算返回 | 动力学计算返回 | | 0x740C | 力矩前馈设置 | 力矩前馈 | | 0x740D | 力矩前馈查询 | 力矩前馈查询 | | 0x740E | 力矩前馈返回 | 力矩前馈返回 | ## 73. 拖动相关类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7501 | 拖动参数设置 | 拖动相关 | | 0x7502 | 拖动参数查询 | 拖动参数查询 | | 0x7503 | 拖动参数返回 | 拖动参数返回 | | 0x7504 | 拖动模式设置 | 拖动模式设置 | | 0x7505 | 拖动模式查询 | 拖动模式查询 | | 0x7506 | 拖动模式返回 | 拖动模式返回 | ## 74. 辨识相关类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7601 | 辨识参数设置 | 辨识相关 | | 0x7602 | 辨识参数查询 | 辨识参数查询 | | 0x7603 | 辨识参数返回 | 辨识参数返回 | | 0x7604 | 辨识开始 | 辨识开始 | | 0x7605 | 辨识停止 | 辨识停止 | | 0x7606 | 辨识状态 | 辨识状态 | | 0x7607 | 辨识结果 | 辨识结果 | | 0x7608 | 辨识结果返回 | 辨识结果返回 | | 0x7609 | 辨识使能 | 辨识使能 | | 0x760A | 辨识使能返回 | 辨识使能返回 | ## 75. 泰科相关参数类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7701 | 泰科参数设置 | 泰科相关参数 | | 0x7702 | 泰科参数查询 | 泰科参数查询 | | 0x7703 | 泰科参数返回 | 泰科参数返回 | | 0x7704 | 泰科模型设置 | 泰科模型设置 | | 0x7705 | 泰科模型查询 | 泰科模型查询 | | 0x7706 | 泰科模型返回 | 泰科模型返回 | | 0x7707 | 泰科使能设置 | 泰科使能设置 | | 0x7708 | 泰科使能查询 | 泰科使能查询 | | 0x7709 | 泰科使能返回 | 泰科使能返回 | | 0x770B | 泰科状态查询 | 泰科状态查询 | | 0x770C | 泰科状态返回 | 泰科状态返回 | ## 76. 扩展功能类 | 命令字 | 功能 | 功能类型 | |--------|------|----------| | 0x7801 | 扩展功能 | 扩展功能 | --- # 变更日志 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/01.RTL-22.07/02.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html TODO:待补充 --- # 系统 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/01.%E7%B3%BB%E7%BB%9F.html ## 状态 ### 查询初始化状态 系统开机需要进行初始化,否则系统将无法使用。 **命令字:** `0x1000` - 无需发送数据 **控制器回复** **命令字:** `0x1001` | 字段 | 类型 | 说明 | |------|------|------| | finishinit | bool | 初始化是否完成,true 完成,false 未完成 | ```json { "finishinit": true } ``` ### 查询是否为 T5 系统 **命令字:** `0x1002` - 无需发送数据 **控制器回复** **命令字:** `0x1003` | 字段 | 类型 | 说明 | |------|------|------| | T5_system | bool | 是否为 T5 系统,true 是,false 不是 | ```json { "T5_system": false } ``` ### 查询硬件系统发布版本 **命令字:** `0x1004` - 无需发送数据 **控制器回复** **命令字:** `0x1005` | 字段 | 类型 | 说明 | |------|------|------| | result | bool | 查询是否成功,true 成功,false 失败 | | version | string | 版本号(若查询成功则返回) | ```json { "result": true, "version": "xx" } ``` ## 版本升级 系统开机时需要查询当前版本号,若出现不匹配则需要进行版本升级。 ### 查询当前系统版本号 **命令字:** `0x1010` | 字段 | 类型 | 说明 | |------|------|------| | version | string | 版本号内容 | ```json { "version": "v1.0-rc1-67-gf34dae7" } ``` **控制器回复** **命令字:** `0x1011` | 字段 | 类型 | 说明 | |------|------|------| | configFileVersionMismatch | bool | 配置文件是否匹配,false 不匹配,true 匹配 | | jobFileVersion | string | 作业文件版本 | | rtlVersion | string | 控制器版本 | | sysClock | string | 系统时钟,格式如 "2023.11.10 13:29:25" | | version | string | 版本号内容,若查询时发送的 version 为空字符串则返回同样内容 | | controllerFunction | string | 控制器功能版本,默认 "BASE" | | controllerProject | string | 项目版本号,默认 "1.0.0" | | controllerModel | string | 控制器型号,默认 "C1102" | | controllerMaster | string | 主站类型,默认 "EtherCAT" | | controllerFactory | string | 厂家,默认 "INEXBOT" | ```json { "configFileVersionMismatch": false, "jobFileVersion": "5.2.0", "rtlVersion": "22.08.0", "sysClock": "2023.11.10 13:29:25", "version": "v1.0-rc1-67-gf34dae7", "controllerFunction": "BASE", "controllerProject": "1.0.0", "controllerModel": "C1102", "controllerMaster": "EtherCAT", "controllerFactory": "INEXBOT" } ``` ## 日志 ### 查询崩溃日志文件 **命令字:** `0x1020` - 无需发送数据 **控制器回复** **命令字:** `0x1021` | 字段 | 类型 | 说明 | |------|------|------| | absolutepath | string | 路径 | | dumpLogfilenum | int | 文件数量 | | dumpLogfilelist | string[] | 日志文件列表 | ```json { "absolutepath": "", "dumpLogfilenum": 3, "dumpLogfilelist": ["", "", "", ""] } ``` ### 请求获取日志文件列表 **命令字:** `0x1022` | 字段 | 类型 | 说明 | |------|------|------| | num | int | 表示获取最近多少个文件,可取 5、30、100 | ```json { "num": 5 } ``` **控制器回复** **命令字:** `0x1023` | 字段 | 类型 | 说明 | |------|------|------| | absolutepath | string | 日志所在目录 | | logfilenum | int | 日志数目(与 num 不一定相等) | | logfilelist | string[] | 日志列表 | ```json { "absolutepath": "log/", "logfilenum": 3, "logfilelist": ["logInfo.0", "logInfo.1", "logInfo.2"] } ``` ## 恢复出厂设置 **命令字:** `0x1030` | 字段 | 类型 | 说明 | |------|------|------| | clearFactoryIO | bool | 清除所有 IO,true 清除,false 未清除 | | clearFactoryRobot | bool | 清除所有机器人,true 清除,false 未清除 | | clearFactoryToolhand | bool | 清除所有工具手,true 清除,false 未清除 | | clearConfigFile | bool | 清除所有系统配置文件,true 清除,false 未清除 | | clearExtendedFile | bool | 清除所有扩展文件,true 清除,false 未清除 | ```json { "clearFactoryIO": true, "clearFactoryRobot": true, "clearFactoryToolhand": true, "clearConfigFile": true, "clearExtendedFile": true } ``` ## 重启、关机 ### 重启控制器 **命令字:** `0x1031` - 无需发送数据 ### 关机 **命令字:** `0x1032` - 无需发送数据 ### 查询断电保持恢复状态 **命令字:** `0x1033` - 无需发送数据 **控制器回复** **命令字:** `0x1034` | 字段 | 类型 | 说明 | |------|------|------| | rebootKeepRecoveryFlag | bool | 断电保持恢复标志,true 恢复成功,false 未执行断电保持恢复 | | rebootKeepJobFileName | string | 断电保持恢复的程序名字,程序命名首字母不得为数字 | ```json { "rebootKeepRecoveryFlag": false, "rebootKeepJobFileName": "xxxx" } ``` ## IP 设置 ### 控制器 IP 设置 **命令字:** `0x1040` | 字段 | 类型 | 说明 | |------|------|------| | name | string | 网口名称 | | address | string | 设置控制器 IP | | gateway | string | 设置控制器网关 | | dns | string | 设置控制器 DNS | ```json { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ``` ### 查询连接 IP **命令字:** `0x1041` - 无需发送数据 **控制器回复** **命令字:** `0x1042` | 字段 | 类型 | 说明 | |------|------|------| | num | int | 网口数目 | | network | array | 网络信息列表 | | network[].name | string | 网口名称 | | network[].address | string | 控制器 IP | | network[].gateway | string | 控制器网关 | | network[].dns | string | 控制器 DNS | ```json { "num": 2, "network": [ { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" }, { "name": "p2p1", "address": "192.168.1.14", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ] } ``` ## 时间设置 ### 发送时间查询 **命令字:** `0x1050` | 字段 | 类型 | 说明 | |------|------|------| | type | int | 时间类型:0 现实时间,1 获取系统开始时间至现在秒数 | | format | int | 格式:0 获取时间戳,1 获取北京时间 | ```json { "type": 0, "format": 0 } ``` **控制器回复** **命令字:** `0x1051` | 字段 | 类型 | 说明 | |------|------|------| | tType | int | 时间类型:0 现实时间,1 系统开始时间至现在秒数 | | format | int | 格式:0 时间戳,1 北京时间 | | date | object | 日期和时间信息 | | date.year | int | 年份 | | date.mon | int | 月份 | | date.day | int | 日期 | | date.hour | int | 小时 | | date.min | int | 分钟 | | date.sec | int | 秒数 | | date.msec | int | 毫秒数 | | timestamp | object | 时间戳(format 为 0 时显示) | | timestamp.s | int | 时间戳秒数 | | timestamp.ns | int | 时间戳纳秒数 | ```json { "tType": 0, "format": 0, "date": { "year": 2023, "mon": 1, "day": 1, "hour": 1, "min": 1, "sec": 1, "msec": 1 }, "timestamp": { "s": 1, "ns": 1 } } ``` ### 查询语言支持 **命令字:** `0x1052` - 无需发送数据 **控制器回复** **命令字:** `0x1053` | 字段 | 类型 | 说明 | |------|------|------| | language | string[] | 控制器能够支持的所有语言,目前支持:Chinese 中文、Korean 韩文、English 英文 | | language_used | string | 控制器当前使用的语言 | ```json { "language": ["Chinese", "Korean", "English"], "language_used": "Chinese" } ``` ### 查询上位机当前语言 **命令字:** `0x1054` | 字段 | 类型 | 说明 | |------|------|------| | teachbox_language | string | 上位机当前使用的语言 | ```json { "teachbox_language": "Chinese" } ``` ## 系统保养 ### 系统保养查询 **命令字:** `0x1060` - 无需发送数据 **控制器回复** **命令字:** `0x1061` | 字段 | 类型 | 说明 | |------|------|------| | controller_ID | string | 控制器 ID | | controller_total_time | int | 控制器通电总时间,单位为小时 | | controller_spent_time | int | 控制器距离上次保养时长,单位为小时 | | controller_cycle_time | int | 控制器保养间隔周期,单位为小时 | | robot_total_time | int | 机器人通电总时间,单位为小时 | | robot_spent_time | int | 机器人距离上次保养时长,单位为小时 | | robot_cycle_time | int | 机器人保养间隔周期,单位为小时 | ```json { "controller_ID": "4DC9F0249098C82E", "controller_total_time": 0, "controller_spent_time": 0, "controller_cycle_time": 0, "robot_total_time": 0, "robot_spent_time": 0, "robot_cycle_time": 0 } ``` ### 系统保养提示 **命令字:** `0x1062` | 字段 | 类型 | 说明 | |------|------|------| | exist | bool | 判断保养文件是否存在,true 存在,false 不存在 | | controlTimeStatus | bool | 控制器保养状态,true 保养,false 不保养 | | robotTimeStatus | bool | 机器人保养状态,true 保养,false 不保养 | ```json { "exist": true, "controlTimeStatus": true, "robotTimeStatus": true } ``` ## 文件 ### 查询控制器配置文件目录 **命令字:** `0x1070` | 字段 | 类型 | 说明 | |------|------|------| | isExport | bool | 导入导出配置,true 导出配置,false 导入配置 | ```json { "isExport": true } ``` **控制器回复** **命令字:** `0x1071` | 字段 | 类型 | 说明 | |------|------|------| | filelist | string[] | 配置文件名称列表 | | filenum | int | 配置文件数量 | ```json { "filelist": ["xxx.json", "yyy.json"], "filenum": 2 } ``` ## 系统备份 ### 查询是否存在当前版本示教器程序 **命令字:** `0x1090` | 字段 | 类型 | 说明 | |------|------|------| | config_md5 | string | config.db 文件 MD5 值 | | pinyin_md5 | string | Pinyin.db 文件 MD5 值,null 表示没有这个文件或者文件大小是 0 | | pro_md5 | string | 示教器程序文件的 MD5 值 | | pro_name | string | 示教器程序文件的名称,可选 Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "config_md5": "2803f92ecdecfd3c178b0998b9391a4d", "pinyin_md5": "null", "pro_md5": "ce407851346d030dad5207948f55ed6c", "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1091` | 字段 | 类型 | 说明 | |------|------|------| | path | object | 文件路径信息 | | path.config | string | config.db 文件上传路径 | | path.dir | string | 所有文件的路径 | | path.pinyin | string | Pinyin.db 文件上传路径,空字符串表示不需要上传 | | path.pro | string | Qt-tp 文件上传路径 | ```json { "path": { "config": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "dir": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "pinyin": "", "pro": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6" } } ``` ### 查询是否存在与控制器版本匹配的示教器程序 **命令字:** `0x1092` | 字段 | 类型 | 说明 | |------|------|------| | pro_name | string | 示教器程序名称,可选 Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1093` | 字段 | 类型 | 说明 | |------|------|------| | backuppath | string | 备份路径 | ### 请求备份程序文件 **命令字:** `0x1094` | 字段 | 类型 | 说明 | |------|------|------| | backup_dir | string | 备份文件的原路径 | | pro_name | string | 程序名称,Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "backup_dir": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1095` | 字段 | 类型 | 说明 | |------|------|------| | backuppath | string | 自动备份的路径 | ```json { "backuppath": "" } ``` ### 请求自动备份 **命令字:** `0x1096` - 无需发送数据 **控制器回复** **命令字:** `0x1097` | 字段 | 类型 | 说明 | |------|------|------| | backUpNum | int | 备份系统数,最多 10 个 | | backUpName | string[] | 备份系统的名字 | ```json { "backUpNum": 1, "backUpName": ["string", "string", "string……"] } ``` ### 请求系统恢复 **命令字:** `0x1098` | 字段 | 类型 | 说明 | |------|------|------| | backUpOneName | string | 需要恢复的系统名称 | ```json { "backUpOneName": "xxxx" } ``` **控制器回复** **命令字:** `0x1099` | 字段 | 类型 | 说明 | |------|------|------| | success | bool | 系统恢复是否成功,true 成功,false 失败 | | backUpName | string[] | 备份系统的名字,最多 10 个 | ```json { "success": true } ``` ### 保存厂家参数 **命令字:** `0x109A` - 无需发送数据 **控制器回复** **命令字:** `0x109B` | 字段 | 类型 | 说明 | |------|------|------| | success | bool | 是否保存成功,true 成功,false 失败 | ```json { "success": true } ``` ## 密钥 ### 系统限制设置 **命令字:** `0x10B0` | 字段 | 类型 | 说明 | |------|------|------| | pallet | bool | 设置码垛功能限制 | | welding | bool | 设置焊接功能限制 | | laserCut | bool | 设置激光切割功能限制 | | polish | bool | 设置打磨功能限制 | | spray | bool | 设置喷涂功能限制 | | search | bool | 设置寻位功能限制 | | vision | bool | 设置视觉功能限制 | | conveyor | bool | 设置传送带功能限制 | | clear_data | bool | 清除数据 | ```json { "pallet": true, "welding": true, "laserCut": true, "polish": true, "spray": true, "search": true, "vision": true, "conveyor": true, "clear_data": true } ``` ### 查询控制器功能限制 **命令字:** `0x10B1` - 无需发送数据 **控制器回复** **命令字:** `0x10B2` | 字段 | 类型 | 说明 | |------|------|------| | maxRobotCount | int | 机器人最大数目 | | crafts | string[] | 已解锁的工艺列表 | | robotTypes | string[] | 已解锁的机器人类型 | 工艺类型值: - `C_Pallet`:码垛工艺 - `C_Welding`:焊接工艺 - `C_Lasercut`:激光切割工艺 - `C_Polish`:打磨工艺 - `C_Spray`:喷涂工艺 - `C_Search`:寻位跟踪工艺 - `C_Vision`:视觉工艺 机器人类型值: - `R_NULL`:未选择机器人类型 - `R_GENERAL_6S`:六轴串联多关节 - `R_GENERAL_6S_1`:六轴协作 - `R_SIXAXIS_SPRAY_BBR`:六轴喷涂机器人 - `R_GENERAL_6S_2`:六轴异型二 - `R_GENERAL_5S`:五轴机器人 - `R_SCARA`:四轴 SCARA 机器人 - `R_SCARA_1`:四轴 SCARA 异型一机器人 - `R_FOURAXIS_PALLET`:四轴连杆码垛机器人 - `R_FOURAXIS_PALLET_1`:四轴码垛丝杆机器人 - `R_FOURAXIS`:四轴机器人 - `R_FOUR_CARTESIAN_COORDINATE`:四轴直角机器人 - `R_FOUR_POLAR_COORDINATE_1`:四轴极坐标异形机器人 - `R_SCARA_THREEAXIS`:三轴 SCARA 机器人 - `R_THREE_CARTESIAN_COORDINATE`:三轴直角机器人 - `R_THREE_CARTESIAN_COORDINATE_1`:三轴异形一机器人 - `R_SCARA_TWOAXIS`:二轴 SCARA 机器人 - `R_GENERAL_7S`:七轴通用机器人 - `R_GENERAL_1S`:一轴机器人 - `R_GANTRY_WELD`:五轴龙门焊接机器人 - `R_DELTA`:delta 机器人(四轴并联机器人) - `R_WINE_CHAMFER`:酒槽机型 - `R_GANTRY_WELD_2`:五轴龙门焊接机器人类型 2 - `R_FOUR_CARTESIAN_COORDINATE_1`:四轴直角异型一机器人 - `R_GANTRY_WELD_6`:六轴龙门焊接机器人 - `FIVE_AXLE_MIXED`:五轴混动机器人 - `R_SCARA_FOURAXIS_2`:四轴 SCARA 异型 2 - `R_SIX_AXLE_ABNORMITY_3`:六轴异型三 - `R_SCARA_THREEAXIS_1`:三轴 SCARA 异型 1 - `R_DELTA_2D_`:delta 2D 并联机器人模型 - `R_GANTRY_WELD_3`:五轴龙门焊接机器人类型 3 - `R_GENERAL_3S_1`:三轴串联异形一 - `R_GENERAL_5S_COLLABORATIVE_`:五轴协作机器人 - `R_SCARA_3_`:四轴 SCARA 异型三机器人 - `R_GENERAL_6S_CBBARA_`:六轴串联-CBBARA - `R_HEAVY_DUTY_FOUR_AXIS_`:高格立柱旋转四轴 ```json { "crafts": [ "C_Pallet", "C_Welding", "C_Lasercut", "C_Polish", "C_Spray", "C_Search", "C_Vision" ], "maxRobotCount": 4, "robotTypes": [ "R_GENERAL_6S", "R_SCARA", "R_FOURAXIS_PALLET", "R_FOURAXIS", "R_GENERAL_1S", "R_GENERAL_5S", "R_GENERAL_6S_1", "R_SCARA_TWOAXIS", "R_SCARA_THREEAXIS", "R_THREE_CARTESIAN_COORDINATE", "R_THREE_CARTESIAN_COORDINATE_1", "R_GENERAL_7S", "R_SCARA_1", "R_FOURAXIS_PALLET_1", "R_SIXAXIS_SPRAY_BBR", "R_FOUR_CARTESIAN_COORDINATE", "R_FOUR_POLAR_COORDINATE_1", "R_GENERAL_6S_2", "R_GANTRY_WELD", "R_DELTA", "R_WINE_CHAMFER", "R_GANTRY_WELD_2", "R_FOUR_CARTESIAN_COORDINATE_1", "R_GANTRY_WELD_6", "FIVE_AXLE_MIXED", "R_SCARA_FOURAXIS_2", "R_SIX_AXLE_ABNORMITY_3", "R_SCARA_THREEAXIS_1", "R_DELTA_2D_", "R_GANTRY_WELD_3", "R_GENERAL_3S_1", "R_GENERAL_5S_COLLABORATIVE_", "R_SCARA_3_" ] } ``` ### 查询控制器 ID **命令字:** `0x10B3` - 无需发送数据 **控制器回复** **命令字:** `0x10B4` | 字段 | 类型 | 说明 | |------|------|------| | controllerID | string | 控制器 ID | ```json { "controllerID": "4DC9F0249098C82E" } ``` > **说明:** 获取到连接的控制器 ID 之后,在同步作业文件时需判断此 ID 是否已知。已知则判断路径 "dir/controllerID" 是否存在,若存在则不做操作;若不存在则创建工作文件路径,格式:"dir/controllerID/robotJob/R1"。多个机器人则表示 R1-4。 ### 获取控制器剩余使用天数 **命令字:** `0x10B5` - 无需发送数据 **控制器回复** **命令字:** `0x10B6` | 字段 | 类型 | 说明 | |------|------|------| | restdays | int | 剩余使用天数,-1 无限期使用,0 使用期限已到,其余表示剩余多少天 | | year | int | 过期年份 | | mon | int | 过期月份 | | day | int | 过期日 | ```json { "restdays": 30, "year": 1, "mon": 1, "day": 1 } ``` ### 控制器发送剩余使用天数 **命令字:** `0x10B7` | 字段 | 类型 | 说明 | |------|------|------| | restDays | int | 剩余使用天数 | ```json { "restDays": 0 } ``` ### 控制器序列号更新 **命令字:** `0x10B8` | 字段 | 类型 | 说明 | |------|------|------| | license | string | 控制器序列号 | ```json { "license": "ACOCWKBZHSKBEJHI" } ``` **控制器回复** **命令字:** `0x10B9` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 更新结果,"success" 成功,"ivalid" 非法密钥,"notInit" 未初始化 | | ivalid | string | 无效的密钥 | | error | string | 存在破解嫌疑,拒绝解锁 | ```json { "result": "success", "ivalid": "无效的密钥!", "error": "存在破解嫌疑,拒绝解锁!" } ``` > 密钥更新成功后,控制器即将重启。 ### 控制器无权使用信息 **命令字:** `0x10BA` | 字段 | 类型 | 说明 | |------|------|------| | reason | string | 控制器无权使用原因 | ```json { "reason": "" } ``` ### 获取控制器基础信息 **命令字:** `0x10C0` - 无需发送数据 **控制器回复** **命令字:** `0x10C1` | 字段 | 类型 | 说明 | |------|------|------| | controllerID | string | 控制器 ID | | controllerModel | string | 控制器型号 | ```json { "controllerID": "1234567890ABCDEF", "controllerModel": "C2201" } ``` ### 获取控制器支持的机器人类型和工艺 **命令字:** `0x10C2` - 无需发送数据 **控制器回复** **命令字:** `0x10C3` | 字段 | 类型 | 说明 | |------|------|------| | maxRobotSum | int | 最大机器人总数,范围 [0,4] | | robotTypeEn | string[] | 支持的机器人类型英文 | | robotTypeCn | string[] | 支持的机器人类型中文 | | craftTypeEn | string[] | 支持的所有工艺英文 | | craftTypeCn | string[] | 支持的所有工艺中文 | ```json { "maxRobotSum": 4, "robotTypeEn": ["RobotA", "RobotB"], "robotTypeCn": ["机器人A", "机器人B"], "craftTypeEn": ["pallet", "weld"], "craftTypeCn": ["码垛", "焊接"] } ``` ### 获取控制器授权信息 **命令字:** `0x10C4` - 无需发送数据 **控制器回复** **命令字:** `0x10C5` | 字段 | 类型 | 说明 | |------|------|------| | isInit | bool | 是否初始化 | | expirationDate | object | 到期日期 | | expirationDate.year | int | 到期年份 | | expirationDate.month | int | 到期月份 | | expirationDate.day | int | 到期日 | | maxRobotSum | int | 最大机器人数,范围 [0,4] | | robotType | string[] | 机器人类型 | | craftType | string[] | 工艺类型 | ```json { "isInit": true, "expirationDate": { "year": 2038, "month": 1, "day": 31 }, "maxRobotSum": 4, "robotType": ["RobotA", "RobotB"], "craftType": ["pallet", "weld"] } ``` ### 传输初始化密钥 **命令字:** `0x10C6` | 字段 | 类型 | 说明 | |------|------|------| | permissionType | string | 许可类型 | | license | string | 密钥 | ```json { "permissionType": "01", "license": "DSFPSKDGSJDFSGDSGJDSDF" } ``` **控制器回复** **命令字:** `0x10C7` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 密钥结果,"success" 成功,"ivalid" 非法密钥,"deviceAbnormal" 控制器异常 | | data | string | 控制器数据 | ```json { "result": "success", "data": "123ABC" } ``` ### 传输解密密钥 **命令字:** `0x10C8` | 字段 | 类型 | 说明 | |------|------|------| | license | string | 密钥 | ```json { "license": "DSFPSKDGSJDFSGDSGJDSDF" } ``` **控制器回复** **命令字:** `0x10C9` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 结果,"success" 成功,"ivalid" 非法密钥,"notInit" 未初始化 | ```json { "result": "success" } ``` ### 获取离线权限文件内容 **命令字:** `0x10CA` - 无需发送数据 **控制器回复** **命令字:** `0x10CB` | 字段 | 类型 | 说明 | |------|------|------| | data | string | 权限文件内容 | ```json { "data": "xxxxxxxx" } ``` --- # 报错 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/02.%E6%8A%A5%E9%94%99.html ## 概述 控制器通过 JSON 协议向上位机上报各类错误、警告和消息提示。上位机也可以通过协议命令清除伺服错误。本章详细说明错误码的分类体系、上报机制和处理流程。 --- ## 错误码分类 系统错误码按照功能域和严重程度进行分类,便于快速定位和处理问题。 ### 按严重程度分类 | 种类 | kind 值 | 说明 | 典型场景 | |------|---------|------|----------| | 消息 | 0 | 普通信息提示,不影响系统运行 | 日志记录、操作成功提示、状态变更通知 | | 警告 | 1 | 警告信息,系统可继续运行但需关注 | 参数配置缺失、备份提醒、接近限位 | | 报错 | 2 | 严重错误,通常需要人工干预才能恢复 | 伺服故障、急停触发、碰撞检测、通信中断 | ### 按功能域分类 | 错误域 | 错误码范围 | 说明 | |--------|-----------|------| | 系统错误 | 0x0000 - 0x0FFF | 系统初始化、配置、版本相关的错误 | | 伺服错误 | 0x1000 - 0x1FFF | 伺服驱动、编码器、电机相关的错误 | | 运动控制错误 | 0x2000 - 0x3FFF | 运动规划、插补、轨迹相关的错误 | | 程序执行错误 | 0x4000 - 0x5FFF | 作业程序解析、执行、变量操作相关的错误 | | 通信错误 | 0x6000 - 0x6FFF | 网络通信、协议解析、端口连接相关的错误 | | 安全错误 | 0x7000 - 0x7FFF | 安全门、急停、光幕等安全设备相关的错误 | | IO 错误 | 0x8000 - 0x8FFF | 数字/模拟输入输出相关的错误 | | 工艺错误 | 0x9000 - 0x9FFF | 焊接、码垛、切割等工艺相关的错误 | ### 常见错误码 | 错误码 | 说明 | 种类 | 处理建议 | |--------|------|------|----------| | 16385 | 机器人参数配置文件不存在 | 警告(1) | 检查配置文件,系统已自动创建默认配置 | | 21764 | 自动备份成功 | 消息(0) | 无需处理,仅为通知 | | 28680 | 指令不存在 | 报错(2) | 检查发送的命令字是否正确 | --- ## 错误上报机制 ### 上报方式 控制器通过以下命令字主动向上位机推送提示信息: | 命令字 | 功能 | 方向 | |--------|------|------| | `0x1110` | 错误提示上报 | 控制器 → 上位机 | | `0x1111` | 警告提示上报 | 控制器 → 上位机 | | `0x1112` | 消息提示上报 | 控制器 → 上位机 | | `0x1113` | 弹窗提示上报 | 控制器 → 上位机 | ### 错误信息字段说明 每个错误/警告/消息都包含以下核心字段: | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 产生错误的机器人编号。0 表示与特定机器人无关(系统级错误) | | `kind` | int | 严重程度:0=消息,1=警告,2=报错 | | `code` | int | 错误编码,用于唯一标识错误类型 | | `data` | string | 人类可读的错误描述信息 | | `param` | int[] | 错误附带的参数,根据具体错误码有不同含义(如轴号、指令字等) | --- ## 清错 清除伺服错误时使用。 ### 清除伺服错误 **命令字:** `0x1100` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x1101` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [1, 4] | | clearErrorFlag | bool | 是否清除成功,true 清除伺服错误成功,false 清除失败 | ```json { "robot": 1, "clearErrorFlag": true } ``` ### 错误处理流程 典型的错误处理流程如下: 1. **错误发生**:控制器检测到异常,通过 `0x1110`/`0x1111`/`0x1112` 上报错误/警告/消息 2. **错误识别**:上位机收到上报后解析 `code` 和 `kind` 字段,确定错误类型和严重程度 3. **错误分类处理**: - **消息(kind=0)**:记录日志,无需特殊处理 - **警告(kind=1)**:提示用户注意,记录日志 - **报错(kind=2)**: - 显示错误弹窗或提示 - 判断是否需要停机或停止当前运动 - 如为伺服错误,可发送 `0x1100` 清错命令 4. **清错操作**:上位机发送 `0x1100` 清除伺服错误,控制器回复 `0x1101` 告知清除结果 5. **恢复运行**:错误清除后,上位机可重新使能并继续执行 > **注意:** 并非所有错误都可以通过 `0x1100` 清除。部分硬件故障、安全联锁错误需要物理排除故障后才能恢复。 --- ## 信息提示 控制器向上位机发送错误提示/警告提示/消息提示/弹窗提示。 ### 错误提示 **命令字:** `0x1110` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者错误内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的错误对应不同的内容 | | code | int | 消息编码 | | param | int[] | 消息内容参数,根据具体编码的不同会有不同个数,预留 5 个 | ```json { "code": 28680, "data": "指令[0x5743]不存在", "kind": 2, "param": [22339, 3], "robot": 0 } ``` ### 警告提示 **命令字:** `0x1111` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者警告内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的警告对应不同的内容 | | code | int | 消息编码 | | param | int[] | 消息内容参数,根据具体编码的不同会有不同个数,预留 5 个 | ```json { "code": 16385, "data": "机器人1参数配置文件不存在,已创建,请配置参数", "kind": 1, "param": [1], "robot": 1 } ``` ### 消息提示 **命令字:** `0x1112` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者消息内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的消息对应不同的内容 | | code | int | 消息编码 | ```json { "code": 21764, "data": "自动备份成功", "kind": 0, "robot": 0 } ``` ### 弹窗提示 **命令字:** `0x1113` | 字段 | 类型 | 说明 | |------|------|------| | count | int | 弹窗按钮数量,最大为 3 | | text1 | string | 弹窗居中显示的主文本 | | text2 | string | 按钮 1 的文本 | | text3 | string | 按钮 2 的文本 | | text4 | string | 按钮 3 的文本 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | node | int | 机器人序号,取值范围 [1, 4] | | Tips | bool | 弹窗呼出,true 表示呼出 | ```json { "count": 1, "text1": "示例", "text2": "示例", "text3": "示例", "text4": "示例", "kind": 1, "node": 1, "Tips": true } ``` ### 弹窗交互反馈 根据用户对弹窗的操作进行相应设置。 **命令字:** `0x1114` | 字段 | 类型 | 说明 | |------|------|------| | node | int | 机器人序号,取值范围 [1, 4] | | option | int | 对应弹窗选项 1-3 的内容,取值范围 [1, 3] | ```json { "node": 1, "option": 1 } ``` --- # 操作参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/03.%E6%93%8D%E4%BD%9C%E5%8F%82%E6%95%B0.html ## 概述 操作参数用于配置控制器的运行行为,包括运行模式、预约模式、语言、工艺选择、安全相关等全局设置。上位机通过 `0x1300` 设置参数,通过 `0x1301` 查询参数,控制器通过 `0x1302` 回复当前参数值。 --- ## 参数分类 ### 运行模式参数 控制机器人的启动行为和运行模式切换。 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电:true 自动上电,false 不自动上电 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式:true 允许,false 不允许 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式:0 单击运行,1 按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | ### 预约与执行参数 控制远程 IO 的程序预约和执行行为。 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式:true 预约模式,false 非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行:true 断电执行,false 断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行:true 当前行执行,false 非当前行执行 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约:true 允许,false 不允许 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列:true 清空,false 不清空 | ### 安全与保护参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效:true 不生效,false 生效 | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位:true 保持,false 不保持 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应超时时间,范围 [0, 100],单位 ms | ### 坐标系与工艺参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标:0 直角坐标系,1 大地坐标系 | | `craftSelect` | string | "general" | 工艺选择:"general" 通用,"special" 专用,"punch" 冲压,"pallet" 码垛,"weld" 焊接,"cut" 切割 | | `autoSetUserAndTool` | bool | false | 点位形态/工具手/用户值设置方式:true 自动,false 手动 | ### 其他参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `language` | string | "chinese" | 默认语言:"chinese" 中文,"english" 英文,"korean" 韩文 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位:0 倍数值,1 数值 | | `quickInsert` | bool | false | 快捷指令打开标志:true 打开,false 关闭 | --- ## 1. 运行参数设置 ### 读/写操作说明 操作参数遵循"设置-查询-回复"的标准模式: | 操作 | 命令字(下发) | 命令字(回复) | 说明 | |------|---------------|---------------|------| | 设置参数 | `0x1300` | - | 上位机设置运行参数,控制器保存后生效 | | 查询参数 | `0x1301` | `0x1302` | 上位机查询当前运行参数值,控制器回复 | **命令字:** `0x1300` ### 参数列表 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电;true: 自动上电;false:不自动上电 | | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式;true: 预约模式;false:非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行;true: 断电执行;false:断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行;true: 当前行执行;false:非当前行执行 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式;true: 允许;false:不允许 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约;true: 允许;false:不允许 | | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效;true: 不生效;false:生效 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式;0:单击运行;1:按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | | `language` | string | "chinese" | 设置默认语言;"chinese":中文;"english":英文;"korean":韩文 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位;0: 倍数值;1: 数值 | | `craftSelect` | string | "general" | 工艺选择;"general":通用工艺;"special":专用工艺;"punch":冲压工艺;"pallet":码垛工艺;"weld":焊接工艺;"cut":切割工艺 | | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标;0: 直角坐标系;1: 大地坐标系 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列;true: 清空;false:不清空 | | `autoSetUserAndTool` | bool | false | 点位形态/工具手/用户值设置方式;true: 自动;false: 手动 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应时间;取值范围 [0, 100],单位 ms | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位;true: 保持;false: 不保持 | | `quickInsert` | bool | false | 快捷指令打开标志;true: 打开;false: 关闭 | ### 请求示例 ```json { "runModeAutoManBegFlag": false, "remoteUseReserveModeFlag": false, "remoteAllowContinueRunFlag": true, "remoteAllowCurrentRunFlag": false, "remoteSwitchModeEnable": false, "allowReserveRunningPro": false, "SetSafeScreenTeachInvalidFlag": false, "keepStepRunFlag": 0, "defaultRunningSpeed": 1, "language": "chinese", "accUnitMode": 0, "craftSelect": "general", "base_coord_of_user_coord_": 0, "remote_io_reset_clear_all_reserve_program_status_flag": true, "autoSetUserAndTool": false, "checkServoStatusWordMaxTime": 0, "OutageKeepFunctionFlag": true, "quickInsert": false } ``` ### 参数生效说明 - 大部分参数设置后**立即生效** - `language` 参数设置后需要重新加载界面才能看到语言变化 - `craftSelect` 参数设置后可能触发工艺相关的模块初始化 - 参数保存在控制器配置文件中,**断电后保持** --- ## 2. 运行参数查询 **命令字:** `0x1301` **请求参数:** 无 **命令字:** `0x1302` ### 参数列表 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电;true: 自动上电;false:不自动上电 | | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式;true: 预约模式;false:非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行;true: 断电执行;false:断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行;true: 当前行执行;false:非当前行执行 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式;true: 允许;false:不允许 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约;true: 允许;false:不允许 | | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效;true: 不生效;false:生效 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式;0:单击运行;1:按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位;0: 倍数值;1: 数值 | | `craftSelect` | string | "general" | 工艺选择;"general":通用工艺;"special":专用工艺;"punch":冲压工艺;"pallet":码垛工艺;"weld":焊接工艺;"cut":切割工艺 | | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标;0: 直角坐标系;1: 大地坐标系 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列;true: 清空;false:不清空 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应时间;取值范围 [0, 100],单位 ms | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位;true: 保持;false: 不保持 | | `quickInsert` | bool | false | 快捷指令打开标志;true: 打开;false: 关闭 | ### 响应示例 ```json { "runModeAutoManBegFlag": false, "remoteUseReserveModeFlag": false, "remoteAllowContinueRunFlag": true, "remoteAllowCurrentRunFlag": false, "remoteSwitchModeEnable": false, "allowReserveRunningPro": false, "SetSafeScreenTeachInvalidFlag": false, "keepStepRunFlag": 0, "defaultRunningSpeed": 1, "accUnitMode": 0, "craftSelect": "general", "base_coord_of_user_coord_": 0, "remote_io_reset_clear_all_reserve_program_status_flag": true, "checkServoStatusWordMaxTime": 0, "OutageKeepFunctionFlag": true, "quickInsert": false } ``` --- # 示教器与上位机的通讯连接 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/04.%E7%A4%BA%E6%95%99%E5%99%A8%E4%B8%8E%E4%B8%8A%E4%BD%8D%E6%9C%BA%E7%9A%84%E9%80%9A%E8%AE%AF%E8%BF%9E%E6%8E%A5.html ## 心跳 > **说明:** 不管什么通讯模式,都应设计心跳模式,确保通讯状态正常。示教盒定期发送心跳检查包给控制器,并等待控制器回应。客户端收到心跳包后需要回复心跳回应包,包数据为检查包所携带的时间戳。示教盒收到回应包后检查数据是否正确。数据不正确或超时为收到回应,则认为连接可能中断。 ### 收到心跳 | 属性 | 类型 | 说明 | |------|------|------| | time | int | 时间戳 | **命令字**:`0x1200` ```json { "time": 123 } ``` ### 回应心跳 | 属性 | 类型 | 说明 | |------|------|------| | time | int | 时间戳 | **命令字**:`0x1201` ```json { "time": 123 } ``` ## 示教器关机 > **说明:** 拔出示教器发送 **命令字**:`0x1210` | 属性 | 类型 | 说明 | |------|------|------| | date | - | 无 | ## 示教器开机 > **说明:** 插入示教盒恢复通信 **命令字**:`0x1211` | 属性 | 类型 | 说明 | |------|------|------| | date | - | 无 | --- # 5000端口协议 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/05.5000%E7%AB%AF%E5%8F%A3%E5%8D%8F%E8%AE%AE.html ## 说明 5000端口协议主要作用于上传、下载、备份文件。 - 若要向控制器上传文件,则上位机通过0x1D00请求上传文件,控制器通过0x1D01回复上传请求,当控制器同意上传时,上位机通过0x1D04上传文件,上传完毕后,上位机通过0x1D05告诉控制器上传结束,控制器通过0x1D06回复确认接收成功。 - 若要下载控制器中的文件,则上位机通过0x1D02请求下载文件,控制器通过0x1D03回复下载请求,当控制器同意下载时,控制器通过0x1D07向上位机传输其申请下载的文件,并且上位机通过0x1D08回复控制器接收结果,下载完毕后,控制器通过0x1D09告诉上位机下载结束,上位机通过0x1D0A 回复确认接收成功。 --- ## 文件传输流程 ### 上传文件流程 ```text 上位机 控制器 | | |--- 0x1D00 请求上传 -------->| |<-- 0x1D01 回复上传请求 -----| | | | (若 answer="yes") | |--- 0x1D04 上传文件数据 ---->| |--- 0x1D04 上传文件数据 ---->| |--- ... (可能多次分包) | |--- 0x1D05 上传结束 -------->| |<-- 0x1D06 确认接收 ---------| ``` ### 下载文件流程 ```text 上位机 控制器 | | |--- 0x1D02 请求下载 -------->| |<-- 0x1D03 回复下载请求 -----| | | | (若 answer="yes") | |<-- 0x1D07 下载文件数据 -----| |--- 0x1D08 回复接收 -------->| |<-- 0x1D07 下载文件数据 -----| |--- 0x1D08 回复接收 -------->| |<-- ... (可能多次分包) | |<-- 0x1D09 下载完成 ---------| |--- 0x1D0A 确认接收 -------->| ``` ### 备份文件流程 ```text 上位机 控制器 | | |--- 0x1D10 请求备份 -------->| |<-- 0x1D11 回复备份文件名 ---| | | | (然后按下载流程下载备份文件) | ``` --- ## 传输机制说明 ### 分包传输 大文件传输时,数据会分为多个数据包进行传输: - **上传 (0x1D04)**:上位机将文件内容分多次发送,每次发送一个数据包 - **下载 (0x1D07)**:控制器将文件内容分多次发送,上位机每次通过 `0x1D08` 回复接收状态 ### 错误处理 在文件传输过程中可能出现的异常情况: | 场景 | 处理方式 | |------|----------| | 控制器忙碌 | `0x1D01` 或 `0x1D03` 返回 `answer: "busy"`,上位机应稍后重试 | | 传输中断 | 通过 `0x1D0B` 断开连接,上位机需要重新发起传输请求 | | 接收失败 | `0x1D06` 或 `0x1D0A` 返回 `finish: false`,需要重新传输 | | 磁盘空间不足 | 控制器在 `0x1D01` 或 `0x1D03` 阶段拒绝请求 | ### 文件类型与路径 | 文件类型 | 路径示例 | 说明 | |----------|----------|------| | 作业文件 | `job/R1/WWWWW.JBR` | 机器人 1 的作业程序文件 | | 系统配置 | `config/` | 系统参数配置文件 | | 日志文件 | `log/` | 系统运行日志 | | 备份文件 | `controller.tar.gz` | 控制器全量备份包 | | ENI 文件 | `eni/` | 网络配置文件 | > **注意:** 下载作业文件时,文件名需包含完整的控制器内部路径。 --- ## 命令列表 | 命令字 | 功能 | 方向 | |--------|------|------| | 0x1D00 | 上位机请求上传文件 | 上位机 → 控制器 | | 0x1D01 | 控制器回复上传请求 | 控制器 → 上位机 | | 0x1D02 | 上位机请求下载文件 | 上位机 → 控制器 | | 0x1D03 | 控制器回复下载请求 | 控制器 → 上位机 | | 0x1D04 | 上位机向控制器上传文件 | 上位机 → 控制器 | | 0x1D05 | 上位机告诉控制器上传结束 | 上位机 → 控制器 | | 0x1D06 | 控制器回复确认接收成功 | 控制器 → 上位机 | | 0x1D07 | 控制器向上位机发送申请下载的文件 | 控制器 → 上位机 | | 0x1D08 | 上位机回复接收结果 | 上位机 → 控制器 | | 0x1D09 | 控制器告诉上位机下载完成 | 控制器 → 上位机 | | 0x1D0A | 上位机回复确认接收成功 | 上位机 → 控制器 | | 0x1D0B | 下载连接断开 | - | | 0x1D10 | 上位机请求备份文件 | 上位机 → 控制器 | | 0x1D11 | 控制器回复备份请求 | 控制器 → 上位机 | | 0x1D12 | 上位机发送下载 log 文件完成 | 上位机 → 控制器 | | 0x1D13 | 上位机发送下载 eni 文件完成 | 上位机 → 控制器 | --- ## 详细命令说明 ### 0x1D00 上位机请求上传文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 上位机发送文件的文件名 | | size | int | 上位机发送文件的文件大小 | **请求示例:** ```json { "name": "vxWorks", "size": 4096 } ``` --- ### 0x1D01 控制器回复上传请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 是否同意上传文件请求 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意上传文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes" } ``` --- ### 0x1D02 上位机请求下载文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要下载的作业文件名称 | **说明:** 参数 name 是作业文件在控制器中的作业文件路径加上名字。在0x5533和0x5534中系统有向上位机发送路径和名字。示教器提示开始同步作业文件。 **请求示例:** ```json { "name": "job/R1/WWWWW.JBR" } ``` --- ### 0x1D03 控制器回复下载请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 系统是否同意下载文件请求 | | name | string | 需要下载的作业文件名称 | | size | int | 此作业文件的文件大小 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意下载文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes", "name": "job/R1/WWWWW.JBR", "size": 217 } ``` --- ### 0x1D04 上位机向控制器上传文件 **方向:** 上位机 → 控制器 **说明:** 上传文件数据 --- ### 0x1D05 上位机告诉控制器上传结束 **方向:** 上位机 → 控制器 --- ### 0x1D06 控制器回复确认接收成功 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否上传成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 上传成功 | | false | 上传失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D07 控制器向上位机发送申请下载的文件 **方向:** 控制器 → 上位机 **说明:** 传输下载文件数据 --- ### 0x1D08 上位机回复接收结果 **方向:** 上位机 → 控制器 --- ### 0x1D09 控制器告诉上位机下载完成 **方向:** 控制器 → 上位机 --- ### 0x1D0A 上位机回复确认接收成功 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否下载成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 下载成功 | | false | 下载失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D0B 下载连接断开 **说明:** 断开下载连接 --- ### 0x1D10 上位机请求备份文件 **方向:** 上位机 → 控制器 --- ### 0x1D11 控制器回复备份请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 回复备份文件名 | **响应示例:** ```json { "answer": "controller.tar.gz" } ``` --- ### 0x1D12 上位机发送下载 log 文件完成 **方向:** 上位机 → 控制器 --- ### 0x1D13 上位机发送下载 eni 文件完成 **方向:** 上位机 → 控制器 --- # 7000 端口协议 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/06.7000%E7%AB%AF%E5%8F%A3%E5%8D%8F%E8%AE%AE.html ## 概述 ### 数据帧结构 | 项目 | 长度 (Byte) | 说明 | |------|------------|------| | SyncByte | 2 | `0x4E66` 固定包头 | | Length | 2 | 16进制长度 `0`–`0xffff`;不包含数据头和命令字,不包含 CRC 段 | | Command | 2 | 命令字 | | data | Length | 数据段(主要为 JSON 数据格式) | | CRC | 4 | 对不含包头数据做 CRC 校验(CRC32) | ### 通讯协议配置 7000 端口可选择 **TCP** 和 **UDP** 两种通讯协议,通过进入控制器后台修改配置文件 `config/controller.json`,在 `hostComputerService` 节点下: - `socketType`:socket 类型,可选 `"TCP"` 或 `"UDP"`,默认为 `"TCP"` - `checkCRC`:是否进行 CRC 检测;`false` 时不检测 CRC(但 CRC 所占用的 4 个字节仍需发送),默认为 `true` > 查询状态可设置为 UDP 通讯进行数据获取,最小周期可达 1ms。 --- ## 命令字总览 | 命令字 | 方向 | 功能 | |--------|------|------| | `0x1E00` | 上位机 → 控制器 | 查询状态 | | `0x1E01` | 控制器 → 上位机 | 查询状态回复 | | `0x1E02` | 上位机 → 控制器 | 运动控制 | | `0x1E03` | 控制器 → 上位机 | 运动控制回复 | | `0x1E04` | 上位机 → 控制器 | 变量、IO 控制 | | `0x1E10` | 上位机 → 控制器 | 开关伺服点位运动控制 | | `0x1E11` | 控制器 → 上位机 | 开关伺服点位运动控制回复 | | `0x1E12` | 上位机 → 控制器 | 点位发送 | | `0x1E13` | 控制器 → 上位机 | 点位发送回复 | --- ## 1. 查询状态(`0x1E00`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `channel` | int | 通道;最多 9 个通道,默认为 `1` | | `stop` | int | 停止发送;为 `1` 时停止之前的持续发送,下面的数据可不发 | | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `mode` | int | 请求回复模式;`0`:应答(请求一次回复一次),`1`:持续(请求一次持续回复) | | `interval` | int | 持续回复间隔时间(ms);仅 `mode=1` 时有效,范围 `[1, 60000]` | | `queryType` | string[] | 查询运行参数列表,无需查询的不写 | | `typeCfg` | object | 查询内容配置,仅需要查询相关类型数据时有效 | #### `queryType` 可选值 | 值 | 说明 | |----|------| | `realPosACS` | 实时坐标位置(关节坐标系) | | `realPosMCS` | 实时坐标位置(直角坐标系) | | `realPosPCS` | 实时坐标位置(工具坐标系) | | `realPosUCS` | 实时坐标位置(用户坐标系) | | `axisVel` | 轴速度 | | `axisAcc` | 轴加速度 | | `torque` | 力矩 | | `electric` | 电流 | | `numGVar` | 数值变量 | | `IO` | IO 端口 | | `serialNum` | 序列号 | | `runControlPosRunNum` | 运动控制当前轨迹已运行点位数 | | `detailedMotionPos` | 详细运动点位(每个机器人同一时刻仅支持一个通道查询) | #### `typeCfg` 配置说明 - `numGVar`:查询全局变量(int 类型),如 `["GD001", "GA001", "GI001", "GI333"]` - `IO`:查询 IO 端口(string 类型),如 `["DI1", "DI16", "DO1", "DO3", "DO17"]`;若查询的 IO 不存在,返回 `-1`;可查询最大数量不应大于 IO 个数 - `detailedMotionPos`: - `num`:每帧数据回复的点位数目(int) - `optional`:可选参数(string[]),可选 `"ACS"`、`"MCS"`、`"time"`、`"reset"` ### 请求示例 ```json { "channel": 1, "stop": 1, "robot": 1, "mode": 0, "interval": 10, "queryType": [ "realPosACS", "realPosMCS", "realPosPCS", "realPosUCS", "axisVel", "axisAcc", "torque", "electric", "numGVar", "IO", "serialNum", "runControlPosRunNum", "detailedMotionPos" ], "typeCfg": { "numGVar": ["GD001", "GA001", "GI001", "GI333"], "IO": ["DI1", "DI16", "DO1", "DO3", "DO17"], "detailedMotionPos": { "num": 10, "optional": ["ACS", "MCS", "time", "reset"] } } } ``` --- ## 2. 查询状态回复(`0x1E01`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `channel` | int | 通道;最多 9 个通道 | | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `replyData` | object | 回复查询的结果;未查询的不会回复 | #### 坐标数据说明 坐标格式:**机器人(前 7 个)+ 外部轴(后 5 个)** - 无外部轴时,坐标个数为轴数 - 有外部轴时,坐标个数为 `7 + 外部轴个数` #### `replyData` 字段详情 | 字段 | 说明 | |------|------| | `realPosACS` | 实时坐标位置(关节坐标系),float 数组 | | `realPosMCS` | 实时坐标位置(直角坐标系),float 数组 | | `realPosPCS` | 实时坐标位置(工具坐标系),float 数组 | | `realPosUCS` | 实时坐标位置(用户坐标系),float 数组 | | `axisVel` | 轴速度,float 数组 | | `axisAcc` | 轴加速度,float 数组 | | `torque` | 力矩,float 数组 | | `electric` | 电流,float 数组 | | `numGVar` | 全局变量键值对,如 `{"GD001": 0.1, "GA001": true, "GI001": 33}` | | `IO` | IO 状态键值对,如 `{"DI1": 1, "DO1": 0}`;若 IO 不存在返回 `-1` | | `runControlPosRunNum` | 运动控制当前轨迹已运行点位数 | | `serialNum` | 序列号;每次回复加 1,每个通道互相独立 | | `detailedMotionPos` | 详细运动点位 | #### `detailedMotionPos` 详情 - `num`:每帧数据回复的点位数目(int) - `data`:点位数组,每个点位包含: - `ACS`:关节坐标,float 数组 - `MCS`:直角坐标,float 数组 - `time`:时间戳 `[秒, 纳秒]`,如 `[123456, 654321]` ### 回复示例 ```json { "channel": 1, "robot": 1, "replyData": { "realPosACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosMCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosPCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosUCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "torque": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "electric": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "numGVar": {"GD001": 0.1, "GA001": true, "GI001": 33, "GI333": -55}, "IO": {"DI1": 1, "DI16": 0, "DO1": 0, "DO3": 1, "DO17": -1}, "runControlPosRunNum": 0, "serialNum": 1, "detailedMotionPos": { "num": 10, "data": [ { "time": [123456, 654321], "ACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "MCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] } ] } } } ``` --- ## 3. 运动控制(`0x1E02`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `clearBuffer` | int | 清空运动轨迹缓存队列;`1`:清空(不影响当前正在传输的数据),`0` 时可不发 | | `targetMode` | int | 运动模式;`0`:独立点位,`1`:连续轨迹 | | `sendMode` | int | `0`:一次传输完全部轨迹点位,`1`:每次传输部分点位 | | `runMode` | int | 每次传输部分点位时有效;`0`:接收完轨迹再运动,`1`:边接收边运动 | | `end` | int | `1`:停止之前的持续传输,下面的数据可不发;`0` 时可不发此字段 | | `sum` | int | 仅"接收完轨迹再运动"时有效;总共要发的帧数 | | `count` | int | 仅"接收完轨迹再运动"时有效;当前为第几帧 | | `cfg` | object | 运动配置(仅需第一帧设置,且仅第一帧有效) | | `targetPos` | float[] | 单目标点(使用此节点只走一个目标点) | | `targetVec` | object[] | 多目标点(按顺序走完所有点位;与 `targetPos` 同时存在时,仅 `targetPos` 生效) | #### `cfg` 字段详情 | 字段 | 类型 | 说明 | |------|------|------| | `coord` | string | 坐标系,如 `"ACS"` | | `extMove` | int | 是否有外部轴运动;`1`:有,`0` 或不写:无 | | `sync` | int | 外部轴是否同步;`0` 或不写:不同步,`1`:同步 | | `speed` | int | 速度设定;不写则使用默认值 | | `acc` | int | 加速度设定;不写则使用默认值 | | `pl` | int | 不写则默认 `5`;仅"独立点位"且使用 `targetVec` 时有效 | | `moveMode` | string | 运动模式;可选 `"TeachSet"`、`"MOVJ"`、`"MOVL"`、`"MOVS"`,默认 `"TeachSet"`;仅"独立点位"且使用 `targetVec` 时有效 | | `timeout` | int | 超时时间(ms),不写则不检测超时,范围 `10–10000`;仅"接收完轨迹再运动"时有效 | ### 示例一:独立点位 · 一次传输全部点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet" }, "targetPos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] // targetPos 和 targetVec 同时存在时,仅 targetPos 生效 } ``` ### 示例二:独立点位 · 每次传输部分点位 · 接收完轨迹再运动 ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 0, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet", "timeout": 100 }, "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] } ``` ### 示例三:连续轨迹 · 一次传输全部点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 1, "sendMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 }, { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` > `timeStamp`:运行到该点位时相对于起始点的时间(ms) ### 示例四:连续轨迹 · 每次传输部分点位 · 接收完轨迹再运动 ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 1, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "timeout": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` --- ## 4. 运动控制回复(`0x1E03`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `success` | bool | `true`:成功,`false`:失败 | | `size` | int | 运动轨迹缓存队列的当前轨迹数目;仅 `success=true` 时有该项 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"busy"` | 当前有未传输完成的数据 | | `"timeout"` | 接收超时 | | `"dataErr"` | 数据错误 | | `"termination"` | 发送端终止了正在传输的数据 | ### 回复示例 ```json { "robot": 1, "success": false, "size": 1, "cause": "timeout" } ``` --- ## 5. 变量、IO 控制(`0x1E04`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `numGVar` | object | 设置变量;`GA` 为 bool 型,`GI` 为 int 型,`GD` 为 double 型 | | `IO` | object | 设置 IO 口;`1`/`0` 表示 IO 口状态 | ### 请求示例 ```json { "numGVar": { "GA001": true, "GI033": 6, "GD666": -2.33 }, "IO": { "DO1": 1, "DO13": 0 } } ``` --- ## 6. 开关伺服点位运动控制(`0x1E10`) > **注意:** 该功能和"运动控制"功能(`0x1E02`)不可同时使用。 ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `switch` | bool | `true`:开启,`false`:关闭 | ### 请求示例 ```json { "robot": 1, "switch": true } ``` --- ## 7. 开关伺服点位运动控制回复(`0x1E11`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `success` | bool | `true`:成功,`false`:失败 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"busy"` | 当前通道被占用 | | `"dataErr"` | 数据错误 | | `"startupErr"` | 启动失败 | ### 回复示例 ```json { "success": false, "cause": "busy" } ``` --- ## 8. 点位发送(`0x1E12`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `end` | int | `1`:停止之前的持续传输,下面的数据可不发;`0` 时可不发此字段。在点位未传输完毕时,会清空之前接收到的数据,重新等待新的点位队列 | | `sum` | int | 总共要发的帧数 | | `count` | int | 当前的帧数 | | `PosVec` | float[][] | 点位坐标数组;格式:机器人(前 7 个)+ 外部轴(后 5 个) | ### 请求示例 ```json { "robot": 1, "end": 1, "sum": 10, "count": 1, "PosVec": [ [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] ] } ``` --- ## 9. 点位发送回复(`0x1E13`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `success` | bool | `true`:接收成功,`false`:接收失败 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"notStart"` | 未开启伺服点位运动控制模式 | | `"dataErr"` | 数据错误 | | `"termination"` | 发送端终止了正在传输的数据 | | `"cacheFull"` | 缓存区已满(最大缓存 6 条轨迹) | ### 回复示例 ```json { "robot": 1, "success": false, "cause": "dataErr" } ``` ## 附录一:TLV 协议格式详解 ### TLV 结构 7000 端口协议采用 **TLV(Type-Length-Value)** 封装的二进制帧结构,由以下字段组成: | 字段 | 偏移 | 长度 (Byte) | 说明 | |------|------|------------|------| | SyncByte | 0 | 2 | 同步头/魔数,固定值 `0x4E66`,用于帧同步 | | Length | 2 | 2 | 数据长度,大端序(Big-Endian),范围 `0`–`0xFFFF`;表示 Data 段的字节数 | | Command | 4 | 2 | 命令字,大端序,标识该帧的功能类型 | | Data | 6 | Length | 数据段,JSON 格式的 UTF-8 编码字符串 | | CRC | 6 + Length | 4 | CRC32 校验值,大端序;对 Command + Data 段计算 | ### 帧结构图示 ```text +----------+----------+----------+-----------+------------+ | SyncByte | Length | Command | Data | CRC | | 2 Bytes | 2 Bytes | 2 Bytes | N Bytes | 4 Bytes | +----------+----------+----------+-----------+------------+ | | CRC 校验范围 | +----------+--------------------------------------------+ ``` ### 字节序说明 - **Length**:大端序(Big-Endian),即高位字节在前 - **Command**:大端序 - **CRC**:大端序 ### 示例:查询状态帧 上位机发送查询状态请求(命令字 `0x1E00`): ```text | 0x4E 0x66 | 0x00 0x3C | 0x1E 0x00 | {...JSON...} | CRC32 | ``` 其中: - `SyncByte = 0x4E66` - `Length = 0x003C`(60 字节,即 JSON 数据的长度) - `Command = 0x1E00` - `Data` = 60 字节的 JSON 字符串 - `CRC` = 对 Command + Data 共 62 字节的 CRC32 校验值 ## 附录二:CRC32 校验说明 ### 校验范围 CRC 校验覆盖 **Command(2 字节)+ Data(Length 字节)**,不包含 SyncByte 和 Length 字段,也不包含 CRC 自身。 ### 校验算法 使用标准 **CRC-32** 算法,多项式为 `0x04C11DB7`。 ### 校验配置 通过修改配置文件 `config/controller.json` 中 `hostComputerService.checkCRC` 字段: - `true`(默认):启用 CRC 校验,数据帧必须包含正确的 CRC 值 - `false`:不进行 CRC 校验,但 CRC 所占用的 4 个字节仍需发送(可填充任意值) ### CRC 计算示例(伪代码) ```text function calcCRC32(data, length): crc = 0xFFFFFFFF for i in range(length): crc = crc ^ data[i] for j in range(8): if (crc & 1): crc = (crc >> 1) ^ 0xEDB88320 else: crc = crc >> 1 return crc ^ 0xFFFFFFFF ``` ## 附录三:通讯建立与握手流程 ### TCP 模式下的连接建立 1. **上位机发起 TCP 连接**:连接到控制器的 7000 端口(默认 IP 为控制器 IP) 2. **TCP 三次握手完成**:建立可靠的 TCP 连接 3. **数据帧传输**:按照 TLV 格式发送/接收数据帧 4. **心跳维持**:通过持续查询状态或定时发送数据保持连接 ### UDP 模式下的通讯 1. **无连接通讯**:UDP 模式下无需建立连接,直接发送数据帧 2. **端口绑定**:上位机绑定本地端口,控制器回复到该端口 3. **丢包处理**:UDP 不保证可靠传输,适合高频状态查询(最小周期 1ms) 4. **推荐用途**:高频状态查询场景使用 UDP,运动控制使用 TCP ### 持续模式下的通讯(mode=1) 1. 发送查询状态请求(`0x1E00`,`mode=1`),设置 `interval`(回复间隔) 2. 控制器按照 `interval` 周期持续回复状态数据(`0x1E01`) 3. 发送 `stop=1` 的请求停止持续回复 4. 每个通道独立维护 `serialNum`(序列号),每次回复递增 1 ## 附录四:命令字编址规则 ### 命令字结构 7000 端口的命令字采用 2 字节(16 位)编码,按功能分为以下段: | 范围 | 功能类别 | 说明 | |------|----------|------| | `0x1E00`–`0x1E0F` | 状态查询与控制 | 基本状态查询、运动控制、IO/变量控制 | | `0x1E10`–`0x1E1F` | 伺服点位运动 | 开关伺服、点位发送与接收 | ### 命令字对应关系 | 命令字 | 方向 | 功能 | |--------|------|------| | `0x1E00` | 上位机 → 控制器 | 查询状态 | | `0x1E01` | 控制器 → 上位机 | 查询状态回复 | | `0x1E02` | 上位机 → 控制器 | 运动控制 | | `0x1E03` | 控制器 → 上位机 | 运动控制回复 | | `0x1E04` | 上位机 → 控制器 | 变量、IO 控制 | | `0x1E10` | 上位机 → 控制器 | 开关伺服点位运动控制 | | `0x1E11` | 控制器 → 上位机 | 开关伺服点位运动控制回复 | | `0x1E12` | 上位机 → 控制器 | 点位发送 | | `0x1E13` | 控制器 → 上位机 | 点位发送回复 | ### 命令字编址规则 - 请求命令字为偶数(如 `0x1E00`、`0x1E02`) - 回复命令字为对应的奇数(如 `0x1E01`、`0x1E03`) - 上位机 → 控制器方向为偶数命令字 - 控制器 → 上位机方向为奇数命令字 ## 附录五:常见通讯配置示例 ### 示例 1:TCP 模式高频状态查询 上位机通过 TCP 连接 7000 端口,以 10ms 间隔持续查询机器人实时位置: ```json { "channel": 1, "stop": 0, "robot": 1, "mode": 1, "interval": 10, "queryType": ["realPosACS", "realPosMCS", "axisVel", "axisAcc"] } ``` ### 示例 2:UDP 模式最低延迟查询 将配置文件 `socketType` 设置为 `"UDP"`,以 1ms 间隔查询,用于高速数据采集: ```json { "channel": 1, "robot": 1, "mode": 1, "interval": 1, "queryType": ["realPosACS", "torque", "electric"] } ``` ### 示例 3:单次查询全局变量和 IO ```json { "channel": 1, "robot": 1, "mode": 0, "queryType": ["numGVar", "IO"], "typeCfg": { "numGVar": ["GD001", "GI001"], "IO": ["DI1", "DI2", "DO1", "DO2"] } } ``` ### 示例 4:运动控制 - 单点位运动 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 0, "cfg": { "coord": "MCS", "extMove": 0, "speed": 50, "acc": 80 }, "targetPos": [100.0, 200.0, 300.0, 0.0, 0.0, 0.0, 0.0] } ``` ### 推荐配置 | 场景 | 协议 | 间隔 | checkCRC | 说明 | |------|------|------|----------|------| | 实时监控(低延迟) | UDP | 1–5ms | false | 丢包容忍,最低延迟 | | 实时监控(可靠) | TCP | 10–20ms | true | 保证数据完整 | | 运动控制 | TCP | 按需 | true | 需可靠传输 | | 批量数据采集 | TCP | 50–100ms | true | 低频持续采集 | --- # 其他 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/07.%E5%85%B6%E4%BB%96.html ## 自定义接口 **说明:** rtl-24.03 控制器为客户提供 15 个空的接口,可供客户自定义使用。 ### 协议号列表 | 序号 | 协议号 | |------|----------| | 1 | 0x1F00 | | 2 | 0x1F01 | | 3 | 0x1F02 | | 4 | 0x1F03 | | 5 | 0x1F04 | | 6 | 0x1F05 | | 7 | 0x1F06 | | 8 | 0x1F07 | | 9 | 0x1F08 | | 10 | 0x1F09 | | 11 | 0x1F0A | | 12 | 0x1F0B | | 13 | 0x1F0C | | 14 | 0x1F0D | | 15 | 0x1F0E | --- # 安全参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/08.%E5%AE%89%E5%85%A8%E5%8F%82%E6%95%B0.html > **说明:** 安全参数用于配置机器人各轴的软限位角度范围,是保障机器人运动安全的关键配置。 --- ## 概述 安全参数主要用于设置机器人各关节轴的软限位(正向最大角度和负向最大角度)。当机器人关节运动超出设定的软限位范围时,控制器将触发安全保护机制,停止当前运动并上报错误。 ### 安全参数分类 | 类别 | 说明 | 相关命令 | |------|------|----------| | 关节软限位 | J1-J6 各轴正向/负向最大角度限制 | `0x1400`/`0x1401`/`0x1402` | | 安全 IO | 安全门、急停、光幕等安全输入信号 | 参见 IO 协议文档 | | 速度限制 | 各轴最大速度、笛卡尔最大速度 | 参见运动控制文档 | | 工作空间限制 | 笛卡尔空间范围限制 | 参见干涉区文档 | --- ## 关节软限位 ### 功能说明 关节软限位是在控制器软件层面设置的各轴运动范围限制。与机械限位(物理挡块)不同,软限位由控制器实时监控,当关节角度超出软限位范围时: 1. 控制器立即停止当前运动 2. 上报软限位错误提示 3. 需要手动将机器人移回安全工作范围后才能恢复 > **注意:** 软限位值应在机械限位范围内设置,否则软限位将无法起到保护作用。默认情况下,各轴软限位范围为 [-360°, 360°](即 [-2π, 2π] 弧度)。 ### 配置建议 | 轴 | 典型范围 | 说明 | |----|----------|------| | J1 | [-170°, 170°] | 基座旋转轴 | | J2 | [-90°, 155°] | 大臂俯仰轴 | | J3 | [-80°, 90°] | 小臂俯仰轴 | | J4 | [-180°, 180°] | 手腕旋转轴 | | J5 | [-120°, 120°] | 手腕俯仰轴 | | J6 | [-360°, 360°] | 手腕末端旋转轴 | --- ## 安全 IO 概述 安全 IO 是机器人控制系统中的关键安全信号入口,包括: | 安全信号 | 说明 | 触发后行为 | |----------|------|-----------| | 急停 (E-Stop) | 紧急停止按钮信号 | 立即切断伺服电源,所有运动停止 | | 安全门 (Safety Gate) | 安全门/围栏状态信号 | 根据模式:示教模式下允许操作,运行模式下触发急停 | | 安全光幕 (Light Curtain) | 安全光幕遮挡信号 | 类似安全门,检测到遮挡时触发安全停止 | | 使能开关 (Enable Switch) | 三段式使能开关 | 示教器上的安全使能装置 | ### 安全信号优先级 安全信号的优先级从高到低为: 1. **急停**:最高优先级,硬件级别切断伺服电源 2. **安全门/光幕**:软件级别,根据运行模式处理 3. **软限位**:软件级别,仅限制运动范围 --- ## 设置安全参数(上位机 → 控制器) **命令字:** `0x1400` | 参数 | 类型 | 说明 | |----------|--------|--------------------------| | `J1 Max` | double | J1 轴正向最大角度,弧度 | | `J1 Min` | double | J1 轴负向最大角度,弧度 | | `J2 Max` | double | J2 轴正向最大角度,弧度 | | `J2 Min` | double | J2 轴负向最大角度,弧度 | | `J3 Max` | double | J3 轴正向最大角度,弧度 | | `J3 Min` | double | J3 轴负向最大角度,弧度 | | `J4 Max` | double | J4 轴正向最大角度,弧度 | | `J4 Min` | double | J4 轴负向最大角度,弧度 | | `J5 Max` | double | J5 轴正向最大角度,弧度 | | `J5 Min` | double | J5 轴负向最大角度,弧度 | | `J6 Max` | double | J6 轴正向最大角度,弧度 | | `J6 Min` | double | J6 轴负向最大角度,弧度 | | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "J1 Max": 3.14, "J1 Min": -3.14, "J2 Max": 3.14, "J2 Min": -3.14, "J3 Max": 3.14, "J3 Min": -3.14, "J4 Max": 3.14, "J4 Min": -3.14, "J5 Max": 3.14, "J5 Min": -3.14, "J6 Max": 3.14, "J6 Min": -3.14, "robot": 1 } ``` ### 使用注意事项 1. **单位转换**:安全参数中的角度单位为**弧度**,设置时需要将度数值转换为弧度值(乘以 π/180) 2. **范围检查**:Max 值必须大于 Min 值,否则设置将无效 3. **即时生效**:参数设置后立即生效,无需重启控制器 4. **多机器人**:每个机器人(robot 1-4)需要单独设置安全参数 --- ## 查询安全参数(上位机 → 控制器) **命令字:** `0x1401` | 参数 | 类型 | 说明 | |---------|------|---------------------------| | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "robot": 1 } ``` --- ## 安全参数回复(控制器 → 上位机) **命令字:** `0x1402` | 参数 | 类型 | 说明 | |----------|--------|--------------------------| | `J1 Max` | double | J1 轴正向最大角度,弧度 | | `J1 Min` | double | J1 轴负向最大角度,弧度 | | `J2 Max` | double | J2 轴正向最大角度,弧度 | | `J2 Min` | double | J2 轴负向最大角度,弧度 | | `J3 Max` | double | J3 轴正向最大角度,弧度 | | `J3 Min` | double | J3 轴负向最大角度,弧度 | | `J4 Max` | double | J4 轴正向最大角度,弧度 | | `J4 Min` | double | J4 轴负向最大角度,弧度 | | `J5 Max` | double | J5 轴正向最大角度,弧度 | | `J5 Min` | double | J5 轴负向最大角度,弧度 | | `J6 Max` | double | J6 轴正向最大角度,弧度 | | `J6 Min` | double | J6 轴负向最大角度,弧度 | | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "J1 Max": 3.14, "J1 Min": -3.14, "J2 Max": 3.14, "J2 Min": -3.14, "J3 Max": 3.14, "J3 Min": -3.14, "J4 Max": 3.14, "J4 Min": -3.14, "J5 Max": 3.14, "J5 Min": -3.14, "J6 Max": 3.14, "J6 Min": -3.14, "robot": 1 } ``` --- ## 安全验证流程 建议按照以下流程进行安全参数配置和验证: 1. **读取当前参数**:通过 `0x1401` 查询现有安全参数配置 2. **确认机械限位**:确认各轴机械限位的实际范围 3. **设置软限位**:通过 `0x1400` 设置软限位,确保在机械限位范围内 4. **慢速验证**:以低速手动移动机器人到各轴极限位置,确认软限位生效 5. **观察报警**:确认超出软限位时控制器正确上报错误 6. **保存配置**:参数自动保存在控制器中,断电不丢失 --- # 语言 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/09.%E8%AF%AD%E8%A8%80.html ## 查询语言支持 **命令字:** `0x1052` **请求参数:** 无 **控制器回复** **命令字:** `0x1053` | 字段 | 类型 | 说明 | |------|------|------| | language | string[] | 控制器支持的语言列表 | | language_used | string | 控制器当前使用的语言 | **语言取值:** | 语言代码 | 说明 | |----------|------| | Chinese | 中文 | | Korean | 韩文 | | English | 英文 | **响应示例:** ```json { "language": ["Chinese", "Korean", "English"], "language_used": "Chinese" } ``` ## 查询上位机当前语言 **命令字:** `0x1054` **请求参数:** | 字段 | 类型 | 说明 | |------|------|------| | teachbox_language | string | 上位机当前使用的语言 | **请求示例:** ```json { "teachbox_language": "Chinese" } ``` ## 支持的语言类型 | 语言代码 | 说明 | |----------|------| | Chinese | 中文 | | Korean | 韩文 | | English | 英文 | --- # DH 参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/01.%E5%8F%82%E6%95%B0%E8%AE%BE%E7%BD%AE/01.DH%E5%8F%82%E6%95%B0.html ## 机器人基础参数 > **说明:** 包含有 DH 参数、关节参数、笛卡尔参数等机器人基础参数的设置与查询 --- ## 1. 上位机设置当前机器人 DH 参数 **命令字:** `0x20C0` ### 1.1 六轴串联机器人(存在耦合时动态限位生效) | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | L8 | double | 0.0 | L8杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | dynamicLimit | object | - | J2+J3范围限制 | | dynamicLimit.max | double | 0.0 | J2+J3最大值,范围[-500,500] | | dynamicLimit.min | double | 0.0 | J2+J3最小值,范围[-500,500] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "L8": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "dynamicLimit": { "max": 0.0, "min": 0.0 }, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.2 六轴协作机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | threeAxisDirection | double | -90.0 | 三轴方向,范围-90,0度 | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1, "threeAxisDirection": -90.0 } ``` --- ### 1.3 六轴喷涂机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 0.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | L8 | double | 0.0 | L8杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 0.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "L8": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.4 六轴异型二 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.5 五轴串联多关节 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.6 四轴 SCARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio34": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.7 四轴 SCARA 异型1 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "couplingRatio34": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.8 四轴连杆码垛 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 0.0 | 偏置值,默认为0,范围[-4000,4000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | maxDynamicLimit | double | 0.0 | J2+J3最大值,范围[-1000,1000] | | minDynamicLimit | double | 0.0 | J2+J3最小值,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 0.0, "couplingRatio23": 0.0, "couplingRatio34": 0.0, "maxDynamicLimit": 0.0, "minDynamicLimit": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.9 四轴码垛丝杆 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | amplificationRatio | double | 100.0 | 放大比,范围[1,1000] | | conversionRatio2 | double | 100.0 | 二轴转换比,范围[1,1000] | | conversionRatio3 | double | 100.0 | 三轴转换比,范围[1,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "amplificationRatio": 100.0, "conversionRatio2": 100.0, "conversionRatio3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.10 四轴串联多关节 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "couplingRatio23": 0.0, "couplingRatio34": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.11 四轴直角机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.12 四轴极坐标异型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | conversionRatio2 | double | 100.0 | 二轴转换比,范围[-4000,4000] | | conversionRatio3 | double | 100.0 | 三轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "conversionRatio2": 100.0, "conversionRatio3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.13 三轴 SCARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.14 三轴直角机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.15 三轴直角异型1 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | conversionRatio2 | double | 100.0 | 二轴转换比,范围[-4000,4000] | | conversionRatio3 | double | 100.0 | 三轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "conversionRatio2": 100.0, "conversionRatio3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.16 二轴 SCARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L2": 120.0, "L3": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.17 七轴串联多关节 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | Link | object | - | DH 参数列表 | | Link.L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | Link.L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | Link.L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | Link.L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | Link.L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | Link.L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "Link": { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0 }, "mountAngle": false, "robot": 1 } ``` --- ### 1.18 龙门焊接模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.19 四轴并联机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 110.0 | L2杆长,范围[-4000,4000](需小于 L3) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 110.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.20 酒槽机型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | L9 | double | 120.0 | L9杆长,范围[-4000,4000] | | L10 | double | 120.0 | L10杆长,范围[-4000,4000] | | L11 | double | 120.0 | L11杆长,范围[-4000,4000] | | L12 | double | 120.0 | 滑动电动缸导程,范围[-4000,4000] | | L13 | double | 120.0 | 顶升电动缸导程,范围[-4000,4000] | | L14 | double | 120.0 | 喷料距离,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "L8": 120.0, "L9": 120.0, "L10": 120.0, "L11": 120.0, "L12": 120.0, "L13": 120.0, "L14": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.21 龙门焊接2模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.22 四轴直角异型一 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | Link | object | - | DH 参数列表 | | Link.L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | Link.L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | Link.conversionRatio | array | [100.0, 100.0] | 轴转换比,范围[1,1000],长度2(一轴、四轴转换比) | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "Link": { "L1": 120.0, "L2": 120.0, "conversionRatio": [100.0, 100.0] }, "mountAngle": false, "robot": 1 } ``` --- ### 1.23 六轴龙门焊接模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | fiveAxisDirection | double | 0.0 | 五轴方向,范围-90,0度(0为竖直向下,-90为水平向右) | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "couplingRatio45": 0.0, "couplingRatio56": 0.0, "fiveAxisDirection": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.24 五轴混动机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | L9 | double | 0.0 | L9杆长,范围[-4000,4000] | | L10 | double | 120.0 | L10杆长,范围[-4000,4000] | | conversionratio_J1 | double | 100.0 | 1轴转换比,范围[-4000,4000] | | conversionratio_J2 | double | 100.0 | 2轴转换比,范围[-4000,4000] | | conversionratio_J3 | double | 100.0 | 3轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "L8": 120.0, "L9": 0.0, "L10": 120.0, "conversionratio_J1": 100.0, "conversionratio_J2": 100.0, "conversionratio_J3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.25 四轴 SCARA 异型2 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 100.0 | 1轴螺距,范围[-1000,0),(0,1000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 3轴螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 100.0, "L2": 120.0, "L3": 120.0, "couplingRatio34": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.26 六轴异型三 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | L9 | double | 120.0 | L9杆长,范围[-4000,4000] | | L10 | double | 120.0 | L10杆长,范围[-4000,4000] | | L11 | double | 120.0 | L11杆长,范围[-4000,4000] | | L12 | double | 120.0 | L12杆长,范围[-4000,4000] | | L13 | double | 120.0 | L13杆长,范围[-4000,4000] | | L14 | double | 120.0 | L14杆长,范围[-4000,4000] | | L15 | double | 120.0 | L15杆长,范围[-4000,4000] | | L16 | double | 120.0 | L16杆长,范围[-4000,4000] | | L17 | double | 120.0 | L17杆长,范围[-4000,4000] | | L18 | double | 120.0 | L18杆长,范围[-4000,4000] | | L19 | double | 120.0 | L19杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "L8": 120.0, "L9": 120.0, "L10": 120.0, "L11": 120.0, "L12": 120.0, "L13": 120.0, "L14": 120.0, "L15": 120.0, "L16": 120.0, "L17": 120.0, "L18": 120.0, "L19": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.27 三轴 SCARA 异型一 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.28 delta2D 并联机器人模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 110.0 | L2杆长,范围[-4000,4000](需小于 L3) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 110.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.29 龙门焊接3模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | threeAxisDirection | double | 90.0 | 四轴方向,范围0,90度(四轴方向为0时,L4应填0) | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1, "threeAxisDirection": 90.0 } ``` --- ### 1.30 三轴串联异型一 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | threeAxisDirection | double | 90.0 | 三轴方向,范围0,90度 | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "mountAngle": false, "robot": 1, "threeAxisDirection": 90.0 } ``` --- ### 1.31 五轴协作机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | -120.0 | L2杆长,范围[-4000,4000](请填负值) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | -120.0 | L6杆长,范围[-4000,4000](请填负值) | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": -120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": -120.0, "L7": 120.0, "L8": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.32 四轴 SCARA 异型3 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "couplingRatio12": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.33 六轴串联-CBBARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | -120.0 | L2杆长,范围[-4000,4000](请填负值) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 0.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": -120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 0.0, "L7": 0.0, "L8": 120.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.34 高格立柱旋转四轴 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | conversionRatio1 | double | 100.0 | 1轴转换比,范围[-4000,4000] | | conversionRatio2 | double | 100.0 | 3轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "conversionRatio1": 100.0, "conversionRatio2": 100.0, "mountAngle": false, "robot": 1 } ``` --- ## 2. 上位机查询当前机器人 DH 参数 **命令字:** `0x20C1` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robot": 1 } ``` --- ## 3. 控制器回复上位机当前机器人 DH 参数 **命令字:** `0x20C2` > **说明:** 回复内容与设置内容类似,额外包含 robotType(机器人类型)、angleToDistance(角度转距离列表)、distanceToAngle(距离转角度列表)等字段。 ### 3.1 六轴串联机器人(robotType: 1) | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1~L8 | double | - | 杆长参数,同设置 | | couplingRatio12~56 | double | - | 耦合比参数,同设置 | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | dynamicLimit | object | - | J2+J3范围限制 | | dynamicLimit.max | double | 0.0 | J2+J3最大值,范围[-500,500] | | dynamicLimit.min | double | 0.0 | J2+J3最小值,范围[-500,500] | | mountAngle | bool | false | 机器人正装或倒装 | | robot | int | 1 | 当前机器人号,范围[1,4] | | angleToDistance | array | [1.0,...] | 机器人角度转距离列表,长度为当前机器人轴数 | | angleToDistanceSync | array | [27.775,...] | 机器人外部轴角度转距离列表,长度为外部轴总轴数 | | distanceToAngle | array | [1.0,...] | 机器人距离转角度列表,长度为当前机器人轴数 | | distanceToAngleSync | array | [0.036,...] | 机器人外部轴距离转角度列表 | | robotType | int | 1 | 当前机器人类型 | **angleToDistanceSync 计算公式:** - 旋转轴值都为1 - 直线轴公式:1 * 轴方向转换比 / 360 **distanceToAngleSync 计算公式:** - 旋转轴值都为1 - 直线轴公式:1 / 轴方向转换比 * 360 **回复示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "L8": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "dynamicLimit": { "max": 0.0, "min": 0.0 }, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1, "angleToDistance": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "angleToDistanceSync": [27.775, 27.775, 1.0], "distanceToAngle": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "distanceToAngleSync": [0.03600360036, 0.03600360036, 1.0], "robotType": 1 } ``` --- ### 3.2 机器人类型对照表 | robotType | 机器人类型 | |-----------|-----------| | 1 | 六轴串联机器人 | | 2 | 四轴 SCARA | | 3 | 四轴连杆码垛 | | 4 | 四轴串联多关节 | | 6 | 五轴串联多关节 | | 7 | 六轴协作机器人 | | 8 | 二轴 SCARA | | 9 | 三轴 SCARA | | 10 | 三轴直角机器人 | | 11 | 三轴直角异型1 | | 12 | 七轴串联多关节 | | 13 | 四轴 SCARA 异型1 | | 14 | 四轴码垛丝杆 | | 15 | 六轴喷涂机器人 | | 16 | 四轴直角机器人 | | 17 | 四轴极坐标异型 | | 18 | 六轴异型二 | | 19 | 龙门焊接模型 | | 20 | 四轴并联机器人 | | 21 | 酒槽机型 | | 22 | 龙门焊接2模型 | | 23 | 四轴直角异型一 | | 24 | 六轴龙门焊接模型 | | 25 | 五轴混动机器人 | | 26 | 四轴 SCARA 异型2 | | 27 | 六轴异型三 | | 28 | 三轴 SCARA 异型一 | | 29 | delta2D 并联机器人模型 | | 30 | 龙门焊接3模型 | | 31 | 三轴串联异型一 | | 32 | 五轴协作机器人 | | 33 | 四轴 SCARA 异型3 | | 34 | 六轴串联-CBBARA | | 35 | 高格立柱旋转四轴 | > 其他类型的回复 JSON 结构与设置时类似,额外增加 angleToDistance、distanceToAngle、robotType 字段。 --- ## 4. 上位机请求保存预置机器人参数 **命令字:** `0x20C3` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 预置机器人自定义保存名称 | **请求示例 JSON:** ```json { "name": "AAA" } ``` > 预置文件格式:当前机器人类型+"_"+自定义保存名称 **控制器回复:** ```json {} ``` --- ## 5. 上位机发送设置机器人关节参数 **命令字:** `0x20C5` | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | axis | int | 1 | 机器人轴编号,范围[1,7] | | axisDirection | int | 1 | 关节实际方向,范围[-1,1] | | backLash | double | 0.0 | 齿轮反向间隙,范围[0,9999.999] | | direction | int | -1.0 | 模型方向,范围[-1,1] | | encoderResolution | int | 17 | 编码器位数,范围[1,100] | | isReduceRatioEnable | bool | true | 编码器是否经过减速机 | | maxAcc | double | 6.0 | 最大加速度,范围[1,10000] | | maxDec | double | -6.0 | 最大减速度,范围[-10000,-1] | | maxJerkAcc | double | 1.0 | 最大加加速度,范围[1,20000](插补方式为加加速度时生效) | | maxJerkDec | double | -1.0 | 最大减减速度,范围[-20000,-1](插补方式为加加速度时生效) | | maxRPM | double | 1.0 | 最大正转速,范围[1,5] | | maxReverseRPM | double | -1.0 | 最大反转速,范围[-5,-1] | | positiveLimit | double | 160.0 | 关节正限位,范围[1,3000]° | | ratedRPM | double | 3600.0 | 额定正转速,范围[1,10000]rpm | | ratedReverseRPM | double | -3600.0 | 额定反转速,范围[-10000,-1]rpm(值为额定正速度的负值) | | ratedReverseSpeed | double | -270.0540 | 额定反速度,单位°/s(公式:额定反速度 / 减速比 * 6 * 角度转距离值) | | ratedSpeed | double | 270.0540 | 额定正速度,单位°/s(公式:额定正速度 / 减速比 * 6 * 角度转距离值) | | reducRatio | double | 79.9840 | 减速比,范围(0,1000] | | reverseLimit | double | -160.0 | 关节反限位,范围[-3000,-1]° | | robot | int | 1 | 当前机器人,范围[1,4] | **示例 JSON:** ```json { "axis": 1, "axisDirection": 1, "backLash": 0.0, "direction": -1.0, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 6.0, "maxDec": -6.0, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 160.0, "ratedRPM": 3600.0, "ratedReverseRPM": -3600.0, "ratedReverseSpeed": -270.0540, "ratedSpeed": 270.0540, "reducRatio": 79.9840, "reverseLimit": -160.0, "robot": 1 } ``` --- ## 6. 上位机查询机器人关节参数 **命令字:** `0x20C6` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | axis | int | 机器人轴编号,范围[1,7] | **请求示例 JSON:** ```json { "axis": 1 } ``` --- **命令字:** `0x20C7`(控制器回复) > 回复参数同设置参数一致。 --- ## 7. 上位机发送设置机器人笛卡尔参数 **命令字:** `0x20C8` | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | maxAcc | double | 7.50 | 最大加速度,范围[1,10000] | | maxAttitudeVel | double | 500.0 | 姿态运动最大速度,范围[1,1000]°/s | | maxDec | double | -7.50 | 最大减速度,范围[-10000,-1] | | maxJerk | double | 10000.0 | 最大加加速度,范围[1,20000] | | maxSpeed | double | 2000.0 | 最大速度,范围[1,5000]mm/s | | robot | int | 1 | 当前机器人号,范围[1,4] | | speedLimitMode | int | 0 | 速度限制方式,范围[0,1](0表示位姿,1表示位置) | **示例 JSON:** ```json { "maxAcc": 7.50, "maxAttitudeVel": 500.0, "maxDec": -7.50, "maxJerk": 10000.0, "maxSpeed": 2000.0, "robot": 1, "speedLimitMode": 0 } ``` --- ## 8. 上位机查询机器人笛卡尔参数 **命令字:** `0x20C9` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robot": 1 } ``` --- **命令字:** `0x20CA`(控制器回复) > 回复参数同设置参数一致。 --- ## 9. 上位机设置机器人关节多圈值参数 **命令字:** `0x20CB` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | | robotAxis | array | 关节多圈值参数列表,长度为当前机器人轴数 | ### robotAxis 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | axisSlaveSum | int | 从动轴数量,范围[0,3] | | enable | int | 编码器多圈值溢出计数功能,范围[0,1](0关闭,1开启) | | encode | array | 编码器最大值最小值列表,长度为关节从动轴数量+1 | ### encode 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | max | string | 编码器最大值,范围[-2^32,2^32] | | min | string | 编码器最小值,范围[-2^32,2^32](不得大于编码器最大值) | **示例 JSON:** ```json { "robot": 1, "robotAxis": [ { "axisSlaveSum": 0, "enable": 1, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] } ] } ``` --- ## 10. 上位机查询机器人编码器多圈值参数 **命令字:** `0x20CC` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robot": 1 } ``` --- **命令字:** `0x20CD`(控制器回复) > 回复参数同设置参数一致。 --- ## 11. 上位机申请另存为预置机器人参数文件 **命令字:** `0x20CE` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 机器人类型名称 | | presetRobotName | string | 预置机器人参数自定义名称 | **示例 JSON:** ```json { "name": "R_GENERAL_6S", "presetRobotName": "AAA" } ``` --- ## 12. 上位机查询预置机器人文件列表 **命令字:** `0x20CF` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 机器人类型名称 | **请求示例 JSON:** ```json { "name": "R_GENERAL_6S" } ``` --- **命令字:** `0x20D0`(控制器回复) | 参数名 | 类型 | 说明 | |--------|------|------| | listnum | int | 预置机器人数量 | | nameList | array | 预置机器人自定义名称列表 | **回复示例 JSON:** ```json { "listnum": 2, "nameList": ["AAA.json", "BBB.json"] } ``` --- ## 13. 上位机发送获取预置参数请求 **命令字:** `0x20D1` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 机器人类型名称 | | presetRobotName | string | 预置机器人参数自定义名称 | **请求示例 JSON:** ```json { "name": "R_GENERAL_6S", "presetRobotName": "AAA.json" } ``` --- ## 14. 控制器回复机器人已保存的预置机器人参数 **命令字:** `0x20D2` | 参数名 | 类型 | 说明 | |--------|------|------| | DH | object | 保存的预置机器人 DH 参数 | | Joint | array | 保存的预置机器人关节参数列表 | ### DH 参数 | 参数名 | 类型 | 说明 | |--------|------|------| | L1~L8 | double | 杆长参数 | | angleToDistance | array | 机器人角度转距离列表 | | couplingRatio12~56 | double | 耦合比参数 | | distanceToAngle | array | 机器人距离转角度列表 | | dynamicLimit | object | J2+J3范围限制 | | fiveAxisDirection | double | 五轴方向 | | mountAngle | bool | 机器人正装或倒装 | | robotType | int | 当前机器人类型 | ### Joint 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | axisDirection | int | 关节实际方向 | | axisNum | int | 机器人轴编号 | | backLash | double | 齿轮反向间隙 | | direction | int | 模型方向 | | encoderResolution | int | 编码器位数 | | isReduceRatioEnable | bool | 编码器是否经过减速机 | | maxAcc | double | 最大加速度 | | maxDec | double | 最大减速度 | | maxJerkAcc | double | 最大加加速度 | | maxJerkDec | double | 最大减减速度 | | maxRPM | double | 最大正转速 | | maxReverseRPM | double | 最大反转速 | | positiveLimit | double | 关节正限位 | | ratedRPM | double | 额定正转速 | | ratedReverseRPM | double | 额定反转速 | | ratedReverseSpeed | double | 额定反速度 | | ratedSpeed | double | 额定正速度 | | reducRatio | double | 减速比 | | reverseLimit | double | 关节反限位 | **回复示例 JSON:** ```json { "DH": { "L1": 390.0, "L2": 450.872, "L3": 99.462, "L4": 471.29, "L5": 123.0, "L6": -0.544, "L7": -0.0, "L8": 0.0, "angleToDistance": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "distanceToAngle": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "dynamicLimit": { "max": 20.0, "min": -20.0 }, "fiveAxisDirection": 90, "mountAngle": false, "robotType": 1 }, "Joint": [ { "axisDirection": 1, "axisNum": 1, "backLash": 0.0, "direction": -1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 6.0, "maxDec": -6.0, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 160.0, "ratedRPM": 3600.0, "ratedReverseRPM": -3600.0, "ratedReverseSpeed": -270.05401080216, "ratedSpeed": 270.05401080216, "reducRatio": 79.984, "reverseLimit": -160.0 }, { "axisDirection": 1, "axisNum": 2, "backLash": 0.0, "direction": 1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 3.75, "maxDec": -3.75, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 100.0, "ratedRPM": 3600.0, "ratedReverseRPM": -3600.0, "ratedReverseSpeed": -196.690858428112, "ratedSpeed": 196.690858428112, "reducRatio": 109.817, "reverseLimit": -100.0 }, { "axisDirection": 1, "axisNum": 3, "backLash": 0.0, "direction": 1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 90.0, "ratedRPM": 5000.0, "ratedReverseRPM": -5000.0, "ratedReverseSpeed": -299.604522030919, "ratedSpeed": 299.604522030919, "reducRatio": 100.132, "reverseLimit": -75.0 }, { "axisDirection": 1, "axisNum": 4, "backLash": 0.0, "direction": -1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 190.0, "ratedRPM": 5000.0, "ratedReverseRPM": -5000.0, "ratedReverseSpeed": -252.175009456563, "ratedSpeed": 252.175009456563, "reducRatio": 118.965, "reverseLimit": -190.0 }, { "axisDirection": 1, "axisNum": 5, "backLash": 0.0, "direction": 1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 20.0, "ratedRPM": 4500.0, "ratedReverseRPM": -4500.0, "ratedReverseSpeed": -337.491562710932, "ratedSpeed": 337.491562710932, "reducRatio": 80.002, "reverseLimit": -200.0 }, { "axisDirection": 1, "axisNum": 6, "backLash": 0.0, "direction": -1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 360.0, "ratedRPM": 4500.0, "ratedReverseRPM": -4500.0, "ratedReverseSpeed": -337.622388115692, "ratedSpeed": 337.622388115692, "reducRatio": 79.971, "reverseLimit": -360.0 } ] } ``` --- ## 15. 上位机发送酒槽机型标记圆心请求 **命令字:** `0x20D3` ```json {} ``` --- # 运动控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/02.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6.html ## 伺服状态 ### 说明 - 伺服状态的设置与查询,当前已连接伺服方式的查询 - 当前伺服状态为伺服错误时,无法通过0x3000命令修改伺服状态 - 上位机设置机器人伺服状态 --- #### 上位机设置机器人伺服状态 **命令字:** `0x3000` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | state | int | [0,1] | 伺服状态;0表示伺服停止,1表示伺服就绪 | ```json { "robot": 1, "state": 1 } ``` --- #### 上位机查询机器人伺服状态 **命令字:** `0x3001` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人伺服状态 **命令字:** `0x3002` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,1] | 0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 当前机器人号 | | state | int | [0,3] | 伺服状态;0表示伺服停止,1表示伺服就绪,2表示伺服错误,3表示伺服运行 | ```json { "mode": 0, "robot": 1, "state": 0 } ``` --- #### 上位机查询机器人伺服连接方式 **命令字:** `0x3003` ```json {} ``` --- #### 控制器回复上位机机器人伺服连接方式 **命令字:** `0x3004` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | servoType | int | [0,1] | 0表示实际伺服,1表示虚拟伺服 | ```json { "robot": 1, "servoType": 0 } ``` --- ### 查询伺服连接状态 **命令字:** `0x3005` **控制器回复** | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1,4] | | servoType | int | 当前机器人伺服连接状态:0 实际伺服,1 虚拟伺服 | ```json { "robot": 1, "servoType": 0 } ``` --- ## 操作模式 ### 说明 - 机器人当前操作模式的设置与查询 - 操作模式默认为示教模式 --- #### 上位机设置当前机器人操作模式 **命令字:** `0x3010` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,2] | 操作模式;0表示示教模式,1表示远程模式,2表示运行模式 | ```json { "mode": 0 } ``` --- #### 上位机查询当前机器人操作模式 **命令字:** `0x3011` ```json {} ``` --- #### 控制器回复上位机当前机器人操作模式 **命令字:** `0x3012` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,2] | 操作模式;0表示示教模式,1表示远程模式,2表示运行模式 | ```json { "mode": 0 } ``` --- ## 示教模式 ### 说明 - 示教模式类型的设置与查询 - 拖拽模式运动时切换为点动模式会失败 --- #### 上位机设置当前示教模式类型 **命令字:** `0x3020` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | teachType | int | [0,2] | 示教模式类型;0表示点动(单动),1表示拖拽示教,2表示点动(联动) | ```json { "teachType": 0 } ``` --- #### 上位机查询当前示教模式类型 **命令字:** `0x3021` ```json {} ``` --- #### 控制器回复上位机当前示教模式类型 **命令字:** `0x3022` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | type | int | [0,2] | 示教模式类型;0表示点动(单动),1表示拖拽示教,2表示点动(联动) | ```json { "type": 0 } ``` --- ## 使能 ### 说明 - 使能状态与触发模式的设置与查询 - 触发模式设置为硬件触发时,上下使能端口不能都为0 --- #### 上位机设置使能状态 **命令字:** `0x3030` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadman | int | [0,1] | 上下使能开关;0表示下使能,1表示上使能 | | deadmanmode | int | - | 使能触发方式;默认为0,即软件触发 | ```json { "deadman": 1, "deadmanmode": 0 } ``` --- #### 上位机查询使能状态 **命令字:** `0x3031` ```json {} ``` --- #### 控制器回复上位机使能状态 **命令字:** `0x3032` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadman | int | [0,1] | 上下使能开关;0表示下使能,1表示上使能 | ```json { "deadman": 1 } ``` --- #### 上位机设置机器人使能触发模式 **命令字:** `0x3033` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadmanPortOne | int | [0,端口总数] | 使能端口1(上使能端口) | | deadmanPortTwo | int | [0,端口总数] | 使能端口2(下使能端口),和上使能端口不能同时为0 | | mode | int | [0,1] | 使能触发模式;0为软件触发,1为硬件触发 | | robot | int | [1,4] | 当前机器人号 | ```json { "deadmanPortOne": 14, "deadmanPortTwo": 2, "mode": 0, "robot": 1 } ``` --- #### 上位机查询机器人使能触发方式 **命令字:** `0x3034` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人使能触发方式 **命令字:** `0x3035` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadmanPortOne | int | [0,端口总数] | 使能端口1(上使能端口) | | deadmanPortTwo | int | [0,端口总数] | 使能端口2(下使能端口) | | mode | int | [0,1] | 使能触发模式;0为软件触发,1为硬件触发 | | robot | int | [1,4] | 当前机器人号 | ```json { "deadmanPortOne": 14, "deadmanPortTwo": 2, "mode": 0, "robot": 1 } ``` --- #### 上位机请求伺服上使能 **命令字:** `0x3036` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求伺服下使能 **命令字:** `0x3037` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- ## 点动坐标模式 ### 说明 - 机器人点动运行坐标模式的设置与查询 --- #### 上位机设置机器人点动坐标模式 **命令字:** `0x3040` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coordinate | int | [0,3] | 点动坐标模式;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | robot | int | [1,4] | 当前机器人号 | ```json { "coordinate": 1, "robot": 1 } ``` --- #### 上位机查询机器人点动坐标模式 **命令字:** `0x3041` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人点动坐标模式 **命令字:** `0x3042` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coordinate | int | [0,3] | 点动坐标模式;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | robot | int | [1,4] | 当前机器人号 | ```json { "coordinate": 1, "robot": 1 } ``` --- ## 机器人速度 ### 说明 - 包括有点动模式和定距移动速度的设置与查询 --- #### 上位机请求设置机器人速度参数 **命令字:** `0x3050` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | type | int | [0,2] | 当前速度模式;0表示点动速度,1表示关节坐标定距移动,2表示直角坐标定距移动 | | speed | int | [1,100] | 全局速度(%) | | mocroDotSpeedACS | double | (0,2000] | 关节坐标定距移动(°);仅当前点动坐标为关节坐标时使用 | | mocroDotSpeedMCS | double | (0,2000] | 直角坐标定距移动(mm);当前点动坐标不为关节坐标时使用 | ```json { "robot": 1, "type": 0, "speed": 5, "mocroDotSpeedACS": 0.1, "mocroDotSpeedMCS": 0.1 } ``` --- #### 上位机查询机器人速度参数 **命令字:** `0x3051` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人速度参数 **命令字:** `0x3052` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | type | int | [0,2] | 当前速度模式;0表示点动速度,1表示关节坐标定距移动,2表示直角坐标定距移动 | | speed | int | [1,100] | 全局速度 | | mocroDotSpeedACS | double | (0,2000] | 关节坐标定距移动(°) | | mocroDotSpeedMCS | double | (0,2000] | 直角坐标定距移动(mm) | ```json { "robot": 1, "type": 0, "speed": 5, "mocroDotSpeedACS": 0.1, "mocroDotSpeedMCS": 0.1 } ``` --- ## 运动到点 ### 说明 - 包含有回零、运动到标记点、关节直线运动等操作 - 机器人运动前需将伺服改为使能状态,否则发送以下命令机器人也不会动作 --- #### 上位机请求机器人回零 **命令字:** `0x3070` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | isWithExternal | int | [0,1] | 是否包含外部轴 | | robot | int | [1,4] | 当前机器人号 | ```json { "isWithExternal": 0, "robot": 1 } ``` --- #### 上位机请求机器人运行到目标点 **命令字:** `0x3071` **RobotPos 对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | P 点类型;0表示 NONE_TYPE,1表示 P_TYPE,2表示 E_TYPE,3表示 RP_TYPE,4表示 AP_TYPE,5表示 GP_TYPE,6表示 GE_TYPE | | data | array | 点位数据列表 | | key | string | 变量名称 | | note | string | 变量注释 | | paraVarData | array | 点位列表,对"data"节点数据进行进一步说明 | **data 列表说明:** - 第一二位:坐标类型(0,0表示关节坐标,1,1表示直角坐标,2,1工具坐标,3,1用户坐标) - 第三位:左右手(1表示左手,2表示右手,0表示无左右手) - 第四五六七位:备用,默认位0 - 第八至十四位:机器人本体坐标值(7位) - 第十五至十九位:外部轴坐标值(最大支持五个外部轴) **paraVarData 元素:** | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | data | double | - | 同"data"节点 | | secondvalue | int | [0,1] | 0表示位置变量名固定(如 P001),1表示不固定(如 P[I001]) | | value | int | [0,17] | 数值类型;0表示数值类型;1表示 int 变量;2表示 double 变量;3表示 bool 变量;4表示全局 int 变量;5表示全局 double 变量;6表示全局 bool 变量;7表示 string 常量;8表示 string 变量;9表示全局 string 变量;10表示 P 点变量;11表示全局 P 点变量;12表示 E 点变量;13表示全局 E 点变量 | | varname | string | - | 使用的变量名称 | | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | positionName | string | - | 目标点位名 | | robot | int | [1,4] | 当前机器人号 | ```json { "RobotPos": { "ctype": 0, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 470.7460, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 817.3340, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "positionName": "MoveToGetPoint", "robot": 1 } ``` --- #### 上位机请求机器人外部轴运行到目标点 **命令字:** `0x3072` **RobotPos 对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | P 点类型;0表示 NONE_TYPE,1表示 P_TYPE,2表示 E_TYPE,3表示 RP_TYPE,4表示 AP_TYPE,5表示 GP_TYPE,6表示 GE_TYPE | | data | array | 点位数据列表(长度21) | | key | string | 变量名称 | | note | string | 变量注释 | | paraVarData | array | 点位列表 | | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "RobotPos": { "ctype": 0, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 470.7460, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 817.3340, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "robot": 1 } ``` --- #### 上位机请求机器人运行到程序点 **命令字:** `0x3073` | 参数名 | 类型 | 说明 | |--------|------|------| | job | string | 程序名称 | | robot | int | 当前机器人号 | | suffix | string | 程序文件后缀;.JBR 表示主程序,.JBP 表示后台局部程序,.JBPG 表示后台全局程序 | | var | string | 点位名称 | ```json { "job": "WWW", "robot": 1, "suffix": ".JBR", "var": "P0001" } ``` --- #### 上位机请求机器人运行到用户坐标标定点 **命令字:** `0x3074` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | posType | int | [0,2] | 移动到点类型;0表示原点,1表示 X 值,2表示 Y 值 | | robot | int | [1,4] | 当前机器人号 | | userNum | int | [1,999] | 当前用户坐标坐标号 | ```json { "posType": 0, "robot": 1, "userNum": 1 } ``` --- #### 上位机请求机器人运行到复位点(不含外部轴) **命令字:** `0x3075` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求机器人运行到复位点(含外部轴) **命令字:** `0x3076` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求机器人点到点运动到点 **命令字:** `0x3077` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度7,机器人本体坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人直线运动到点 **命令字:** `0x3078` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度7,机器人本体坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人圆弧运动到点 **命令字:** `0x3079` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | isFull | bool | - | false 表示 MOVC,true 表示 MOVCA | | posOne | array | 圆弧起始点位置信息(长度7) | | | posTwo | array | 圆弧经过中间点位置信息(长度7) | | | posThree | array | 圆弧目标点位置信息(长度7) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "isFull": false, "posOne": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "posTwo": [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0], "posThree": [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人样条曲线运动到点 **命令字:** `0x307A` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 样条曲线的轨迹点位二维数组;一维表示轨迹上的目标点位,二维机器人本体坐标(长度7) | | | robot | int | [1,4] | 当前机器人号 | | size | int | - | 样条曲线的点数目,最小为4 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [ [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 25.5, 0.0, 0.0, 0.0, 0.0, 0.0] ], "robot": 1, "size": 4, "vel": 5 } ``` --- #### 上位机请求机器人外部轴点到点运动到点 **命令字:** `0x307B` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人外部轴直线运动到点 **命令字:** `0x307C` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人外部轴圆弧运动到点 **命令字:** `0x307D` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | posOne | array | 圆弧起始点位置信息(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | posTwo | array | 圆弧经过中间点位置信息(长度12) | | | posThree | array | 圆弧目标点位置信息(长度12) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "posOne": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "posTwo": [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0, 14.2, 0.0, 0.0, 0.0, 0.0], "posThree": [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0, 21.3, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人目标点可达性判断 **命令字:** `0x307F` **协议名:** `eRobotArrivalJudgeInquire` **说明:** - 该命令用于判定某个目标点位是否可被当前机器人按指定运动方式到达。 - 适用于上位机在执行运动前先进行可达性预判,避免无效或不可实现的目标点。 - `movetype` 可使用 `MOVEJ`、`MOVEL` 或其他控制器支持的运动类型字符串。 | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人编号 | | pos | array | 目标点位坐标/姿态数组,长度通常为6(x, y, z, a, b, c) | | movetype | string | 运动类型字符串,例如 `MOVJ`、`MOVL` | ```json { "POS_REACHABLE": { "robotNum": 1, "pos": [x, y, z, a, b, c], "movetype": "MOVJ" } } ``` **含义:** - `robotNum`:当前机器人编号。 - `pos`:待判断目标点位的坐标/姿态数组。 - `movetype`:目标运动类型字符串,用于判断该点位在当前机器人上是否可按该运动方式到达。 --- #### 控制器回复上位机机器人目标点可达性判断结果 **命令字:** `0x3080` **协议名:** `eRobotArrivalJudgeRespound` **说明:** - 控制器根据上位机发送的目标点和运动类型,返回是否可达的布尔判定结果。 - 该返回值仅表示目标点在当前配置下是否满足可达性判断,不代表运动已执行。 | 参数名 | 类型 | 说明 | |--------|------|------| | ret | bool | 是否可达;`true` 表示可到达,`false` 表示不可到达或不满足到位判断条件 | ```json { "ret": true } ``` 或者 ```json { "ret": false } ``` **含义:** - `ret`:布尔值。 - `true`:目标点可被当前机器人按该运动方式到达。 - `false`:目标点不可达,或不满足当前到位判断条件。 --- #### 上位机请求机器人门控运动 **命令字:** `0x3081` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | ParaACC | double | - | 加速度 | | ParaDEC | double | - | 减速度 | | ParaV | double | - | 速度 | | ParaPL | int | [0,5] | 平滑 | | aheadtype | int | [0,2] | 提前执行类型;0表示时间,1表示距离,2表示进度 | | ParaAHEAD | double | - | 提前执行值 | | offsetAxis | int | [0,2] | 走门型的轴 | | axis_offset_type | int | [0,1] | 偏移轴的偏移方式;0表示最大高度,1表示最大坐标 | | para_line_or_coord_max | double | - | 偏移轴最大坐标或者最大偏移量 | | para_straight_up_dis | double | - | 垂直上升距离 | | para_straight_down_dis | double | - | 垂直下降距离 | | ParaSPIN | int | [0,1] | 门型运动方式;0表示关节,1表示直线 | | pos | array | 长度14,前7位为机器人本体坐标,后7位为外部轴坐标 | 目标位置 | | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | ```json { "robot": 1, "ParaACC": 100.0, "ParaDEC": 100.0, "ParaV": 10, "ParaPL": 0, "aheadtype": 0, "ParaAHEAD": 5, "offsetAxis": 2, "axis_offset_type": 0, "para_line_or_coord_max": 1000, "para_straight_up_dis": 10, "para_straight_down_dis": 10, "ParaSPIN": 0, "pos": [791.9649933992308, -122.76709767976902, 360.000035291658, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "coord": 1 } ``` --- ## 运动参数 ### 说明 - 上位机设置机器人运动参数 --- #### 上位机设置机器人运动参数 **命令字:** `0x3090` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | absolutePosResolution | double | [0.0001,0.1] | 绝对位置分辨率(°) | | interpolationMethod | int | [0,2] | 机器人插补方式;0表示 S 型插补,1表示梯形插补,2表示加加速度插补 | | minTrajectTime | object | - | 最小加/减速度时间 | | minTrajectTime.minAccTime | double | [0.05,1] | 最小加速度时间(s) | | minTrajectTime.minDecTime | double | [0.05,1] | 最小减速度时间(s) | | runDelayTime | int | [500,20000] | 运行延时时间(ms) | | stopTime | int | [240,2000] | 暂停时间(ms) | ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "minTrajectTime": { "minAccTime": 0.10, "minDecTime": 0.10 }, "runDelayTime": 500, "stopTime": 240 } ``` --- #### 上位机查询机器人运动参数 **命令字:** `0x3091` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人运动参数 **命令字:** `0x3092` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | absolutePosResolution | double | [0.0001,0.1] | 绝对位置分辨率(°) | | interpolationMethod | int | [0,2] | 机器人插补方式;0表示 S 型插补,1表示梯形插补,2表示加加速度插补 | | minTrajectTime | object | - | 最小加/减速度时间 | | minTrajectTime.minAccTime | double | [0.05,1] | 最小加速度时间(s) | | minTrajectTime.minDecTime | double | [0.05,1] | 最小减速度时间(s) | | runDelayTime | int | [500,20000] | 运行延时时间(ms) | | stopTime | int | [240,2000] | 暂停时间(ms) | ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "minTrajectTime": { "minAccTime": 0.10, "minDecTime": 0.10 }, "runDelayTime": 500, "stopTime": 240 } ``` --- ## 点动 ### 说明 - 包括有关节/直角点动速度的设置与查询,点动灵敏度的设置与查询,开启/关闭点动操作 --- #### 上位机请求进行点动操作 **命令字:** `0x30A0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | [1,12] | 当前需要运动的轴 | | direction | int | [-1,1] | 轴移动方向;-1表示负方向移动,1表示正方向移动 | | robot | int | [1,4] | 当前机器人号 | **axis 参数说明:** - 关节坐标时:表示对应的轴,从8开始为外部轴 - 直角坐标时:按顺序分别表示 X 轴、Y 轴、Z 轴、A 轴、B 轴、C 轴 - 工具坐标时:按顺序分别表示 TX 轴、TY 轴、TZ 轴、TA 轴、TB 轴、TC 轴 - 用户坐标时:按顺序分别表示 UX 轴、UY 轴、UZ 轴、UA 轴、UB 轴、UC 轴 ```json { "axis": 1, "direction": 1, "robot": 1 } ``` --- #### 上位机请求停止点动操作 **命令字:** `0x30A1` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | [1,12] | 当前需要停止运动的轴 | | robot | int | [1,4] | 当前机器人号 | **axis 参数说明:** - 关节坐标时:表示对应的轴,从8开始为外部轴 - 直角坐标时:按顺序分别表示 X 轴、Y 轴、Z 轴、A 轴、B 轴、C 轴 - 工具坐标时:按顺序分别表示 TX 轴、TY 轴、TZ 轴、TA 轴、TB 轴、TC 轴 - 用户坐标时:按顺序分别表示 UX 轴、UY 轴、UZ 轴、UA 轴、UB 轴、UC 轴 ```json { "axis": 1, "robot": 1 } ``` --- #### 上位机设置机器人轴关节点动速度 **命令字:** `0x30A2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | - | 当前设置关节点动速度的轴号;范围[1,轴数] | | maxAcc | double | [1,1000] | 关节轴点动加速度(°/s) | | maxSpeed | double | [1,100] | 关节轴最大点动速度(°/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "axis": 1, "maxAcc": 800.0, "maxSpeed": 40.0, "robot": 1 } ``` --- #### 上位机查询机器人轴关节点动速度 **命令字:** `0x30A3` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | - | 需要查询关节点动速度的轴号;范围[1,轴数] | | robot | int | [1,4] | 当前机器人号 | ```json { "axis": 1, "robot": 1 } ``` --- #### 控制器回复上位机机器人轴关节点动速度 **命令字:** `0x30A4` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | - | 当前设置关节点动速度的轴号 | | maxAcc | double | [1,1000] | 关节轴点动加速度(°/s) | | maxSpeed | double | [1,100] | 关节轴最大点动速度(°/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "axis": 1, "maxAcc": 800.0, "maxSpeed": 40.0, "robot": 1 } ``` --- #### 上位机设置机器人直角点动速度 **命令字:** `0x30A5` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | maxAcc | double | [1,4000] | 直角轴点动加速度(mm/s²) | | maxSpeed | double | [1,250] | 直角轴最大点动速度(mm/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "maxAcc": 1500.0, "maxSpeed": 200.0, "robot": 1 } ``` --- #### 上位机查询机器人直角点动速度 **命令字:** `0x30A6` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人直角点动速度 **命令字:** `0x30A7` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | maxAcc | double | [1,4000] | 直角轴点动加速度(mm/s²) | | maxSpeed | double | [1,250] | 直角轴最大点动速度(mm/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "maxAcc": 1500.0, "maxSpeed": 200.0, "robot": 1 } ``` --- #### 上位机设置机器人点动灵敏度 **命令字:** `0x30A8` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | sensitivity | double | [0.001,1] | 点动灵敏度 | ```json { "robot": 1, "sensitivity": 0.0010 } ``` --- #### 上位机查询机器人点动灵敏度 **命令字:** `0x30A9` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人点动灵敏度 **命令字:** `0x30AA` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | sensitivity | double | [0.001,1] | 点动灵敏度 | ```json { "robot": 1, "sensitivity": 0.0010 } ``` --- ## 点位坐标转换 ### 说明 - 机器人在各个坐标的值相互转换 --- #### 上位机请求转换坐标值 **命令字:** `0x30C0` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要转换坐标的点位名称 | | pos | array | 点位数据列表 | | robot | int | 当前机器人号 | | targetCoord | int | 目标转换坐标;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | **pos 列表说明:** - 第一二位:坐标类型(0,0表示关节坐标,1,1表示直角坐标,2,1工具坐标,3,1用户坐标) - 第三位:当前点位姿态 - 第四位:当前点位的工具手号 - 第五位:当前点位的用户坐标号 - 第六七位:备用 - 后七位:当前点在当前坐标系下的位置信息 ```json { "name": "P0002", "pos": [0, 0.0, 8.0, 0.0, 1.0, 0.0, 0.0, 0.0, 10.20, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "targetCoord": 1 } ``` --- #### 控制器回复上位机转换后的坐标值 **命令字:** `0x30C1` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要转换坐标的点位名称 | | pos | array | 点位数据列表(弧度制) | | posDeg | array | 点位数据列表(角度制) | | result | bool | 转换是否成功 | | robot | int | 当前机器人号 | ```json { "name": "P0002", "pos": [1, 1, 8.0, 0.0, 1.0, 0.0, 0.0, 387.623217660095, 0.0, 894.038513201144, -3.14159265359, 0.178023583703, 0.0, 0.0], "posDeg": [1, 1, 8.0, 0.0, 1.0, 0.0, 0.0, 387.623217660095, 0.0, 894.038513201144, -180.0, 10.2, 0.0, 0.0], "result": true, "robot": 1 } ``` --- #### 上位机发送获取任意工具手下位置 **命令字:** `0x30C2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | toolNum | int | [0,9] | 目标工具手 | | toolNowNum | int | [0,9] | 当前工具手;0是无工具手 | | pos | array | 需要转换的点位;元素为 double 类型数组 | | ```json { "robot": 1, "toolNum": 1, "toolNowNum": 0, "pos": [[19998, 0, 19998, 180, 0, 0, 0], [19998, 0, 19998, 180, 0, 0, 0]] } ``` --- #### 控制器返回目标工具手坐标 **命令字:** `0x30C3` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | toolNum | int | [0,9] | 目标工具手 | ```json { "robot": 1, "toolNum": 1, "pos": [[19998, 0, 19998, 180, 0, 0, 0], [19998, 0, 19998, 180, 0, 0, 0]] } ``` --- ## 机器人切换 ### 说明 - 切换当前使用的机器人 --- #### 上位机请求切换当前使用机器人 **命令字:** `0x30D0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | isMultiRobot | bool | - | 是否为双机协作 | | mode | int | [0,1] | 当前机器人模式;0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 需要切换到的机器人号 | ```json { "isMultiRobot": false, "mode": 0, "robot": 1 } ``` --- #### 上位机查询当前使用机器人号 **命令字:** `0x30D1` ```json {} ``` --- #### 控制器回复上位机当前使用机器人号 **命令字:** `0x30D2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,1] | 当前机器人模式;0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 当前机器人号 | ```json { "mode": 0, "robot": 1 } ``` --- #### 上位机设置角度制或弧度制 **命令字:** `0x30D3` | 参数名 | 类型 | 说明 | |--------|------|------| | isDeg | bool | 是否为角度制;false 表示弧度制,true 表示角度制 | ```json { "isDeg": false } ``` --- #### 上位机设置机器人运动队列停止但不下使能 **命令字:** `0x30D4` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复当前机器人当前为角度制还是弧度制 **命令字:** `0x30D5` | 参数名 | 类型 | 说明 | |--------|------|------| | tmpDeg | bool | 是否为角度制;false 表示弧度制,true 表示角度制 | > 注:此为0x30D3的回复,只有切换角度/弧度时才会回复 ```json { "tmpDeg": false } ``` --- ## 关节理论力矩 ### 说明 - 获取当前机器人关节理论力矩相关通讯 --- #### 上位机获取当前机器人关节理论力矩 **命令字:** `0x20B3` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复当前机器人关节理论力矩 **命令字:** `0x20B4` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号 | | JointTorques | double[] | 各关节理论力矩,第 i 个元素为第 i 个关节的理论力矩 | ```json { "robot": 1, "JointTorques": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 最大加速度 ### 说明 - 最大加速度相关通讯 --- #### 上位机查询轴最大加速度 **命令字:** `0x20E0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 查询的轴号 | ```json { "joint_num": 1 } ``` #### 控制器回复轴最大加速度 **命令字:** `0x20E1` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 轴号 | | max_acc | double | - | 轴最大加速度 | > 注:此为 0x20E0 的回复 ```json { "joint_num": 1, "max_acc": 0.0 } ``` --- #### 上位机请求测量关节最大加速度 **命令字:** `0x20E2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 测量的轴号 | ```json { "joint_num": 1 } ``` #### 上位机请求结束测量关节最大加速度 **命令字:** `0x20E3` > 注:无请求参数 ```json { } ``` #### 上位机请求应用关节最大加速度 **命令字:** `0x20E4` > 注:无请求参数 ```json { } ``` #### 上位机请求导出关节最大加速度数据 **命令字:** `0x20E5` > 注:无请求参数 ```json { } ``` --- #### 上位机查询测量加速度参数 **命令字:** `0x20E6` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 查询的轴号 | ```json { "joint_num": 1 } ``` #### 上位机设置测量加速度参数 **命令字:** `0x20E7` | 参数名 | 类型 | 说明 | |--------|------|------| | joint_num | int | 轴号 | | jitter_ratio_thresh | int |速度抖动比值 | | jitter_ratio_thresh_enable | bool | 是否启用速度抖动比值 | | overshoot_limit_percent | double | 速度超调百分比 | | overshoot_limit_percent_enable | bool | 是否启用速度超调百分比 | | range_max | double | 量程上限 | | range_min | double | 量程下限 | | segment_length | double | 均速段长度 | | settling_time_limit | double | 最大调节时间 | | settling_time_limit_enable | bool | 是否启用最大调节时间 | | torque_fluctuation_limit | int | 大转矩差分标准 | | torque_fluctuation_limit_enable | bool | 是否启用大转矩差分标准 | | torque_hf_thresh | int | 转矩高频比值 | | torque_hf_thresh_enable | bool | 是否启用转矩高频比值 | | torque_limit | double | 转矩幅度 | ```json { "jitter_ratio_thresh": 0, "jitter_ratio_thresh_enable": true, "joint_num": 1, "overshoot_limit_percent": 1.0, "overshoot_limit_percent_enable": true, "range_max": 0.0, "range_min": 0.0, "segment_length": 20.0, "settling_time_limit": 20.0, "settling_time_limit_enable": true, "torque_fluctuation_limit": 0, "torque_fluctuation_limit_enable": true, "torque_hf_thresh": 0, "torque_hf_thresh_enable": true, "torque_limit": 2000.0 } ``` #### 控制器回复测量加速度参数 **命令字:** `0x20E8` | 参数名 | 类型 | 说明 | |--------|------|------| | joint_num | int | 轴号 | | jitter_ratio_thresh | int | 速度抖动比值 | | jitter_ratio_thresh_enable | bool | 是否启用速度抖动比值 | | overshoot_limit_percent | double | 速度超调百分比 | | overshoot_limit_percent_enable | bool | 是否启用速度超调百分比 | | range_max | double | 量程上限 | | range_min | double | 量程下限 | | segment_length | double | 均速段长度 | | settling_time_limit | double | 最大调节时间 | | settling_time_limit_enable | bool | 是否启用最大调节时间 | | torque_fluctuation_limit | int | 大转矩差分标准 | | torque_fluctuation_limit_enable | bool | 是否启用大转矩差分标准 | | torque_hf_thresh | int | 转矩高频比值 | | torque_hf_thresh_enable | bool | 是否启用转矩高频比值 | | torque_limit | double | 转矩幅度 | > 注:此为 0x20E6 查询后的控制器回复 ```json { "jitter_ratio_thresh": 0, "jitter_ratio_thresh_enable": true, "joint_num": 1, "overshoot_limit_percent": 1, "overshoot_limit_percent_enable": true, "range_max": 0, "range_min": 0, "segment_length": 20, "settling_time_limit": 20, "settling_time_limit_enable": true, "torque_fluctuation_limit": 0, "torque_fluctuation_limit_enable": true, "torque_hf_thresh": 0, "torque_hf_thresh_enable": true, "torque_limit": 2000 } ``` --- ## 安装位置 ### 说明 - 机器人安装位置(安装方式与安装角度)的设置与查询 - 安装角度偏移量为以正装为初始安装方式后绕自身坐标轴旋转的角度 - 正装 = (0°,0°,0°);倒装 = (0°,180°,0°) --- #### 上位机设置安装角度 **命令字:** `0x20E9` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountAngle | array | - | 安装角度偏移列表,长度3;依次为绕 X/Y/Z 轴旋转偏移角度(°) | ```json { "mountAngle": [0.0, 0.0, 0.0] } ``` --- #### 上位机查询安装角度 **命令字:** `0x20EA` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountMethod | int | - | 安装方式 | ```json { "mountMethod": -1 } ``` --- #### 控制器回复安装角度 **命令字:** `0x20EB` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountAngle | array | - | 安装角度偏移列表,长度3;依次为绕 X/Y/Z 轴旋转偏移角度(°) | ```json { "mountAngle": [0, 0, 0] } ``` --- # 状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/03.%E7%8A%B6%E6%80%81.html ## 碰撞检测状态 ### 查询碰撞检测状态 **命令字:** `0x3200` | 字段 | 类型 | 说明 | |------|------|------| | clear | int | 是否清除理论扭矩和实际扭矩差别,范围 [0, 1] | ```json { "clear": 0 } ``` **控制器回复** **命令字:** `0x3201` | 字段 | 类型 | 说明 | |------|------|------| | Difference_torq | double[] | 理论与反馈差值列表,长度为 7 | | actual_torq | double[] | 扭矩反馈值列表,长度为 7 | | detect_torq | double[] | 碰撞检测阈值列表,长度为 7 | | max_torq | double[] | 插值峰值列表,长度为 7 | | target_torq | double[] | 扭矩理论值列表,长度为 7 | ```json { "Difference_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "actual_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "detect_torq": [50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 0.0], "max_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "target_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` ## 指令运行百分比 ### 查询运动指令已完成百分比 **命令字:** `0x3202` - 无需发送数据 **控制器回复** **命令字:** `0x3203` | 字段 | 类型 | 说明 | |------|------|------| | completionRatio | double | 运行百分比,取值范围 [0, 1],最大值为 1 | ```json { "completionRatio": 0.11 } ``` ## 当前位置 ### 查询机器人坐标位置 **命令字:** `0x3210` | 字段 | 类型 | 说明 | |------|------|------| | coord | int | 查询当前坐标的位置,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "coord": 0, "robot": 1 } ``` **控制器回复** **命令字:** `0x3212` | 字段 | 类型 | 说明 | |------|------|------| | configuration | int | 当前位置形态值,范围 [0, 8] | | coord | int | 当前位置坐标类型,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | pos | double[] | 获取到的弧度制当前位置信息 | | posDeg | double[] | 获取到的角度制当前位置信息 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "configuration": 8, "coord": 0, "pos": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "posDeg": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "robot": 1 } ``` **控制器回复** **命令字:** `0x3213` | 字段 | 类型 | 说明 | |------|------|------| | coord | int | 当前位置坐标类型,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | isDeg | int | 是否为角度制,范围 [0, 1] | | position | double[] | 获取到的弧度制当前位置信息 | | positionDeg | double[] | 获取到的角度制当前位置信息 | | posture | int | 当前位置形态值,范围 [0, 8] | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "coord": 0, "isDeg": 0, "position": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "positionDeg": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "posture": 8, "robot": 1 } ``` > **说明:** 控制器回复上位机机器人坐标位置(0x3211) ### 查询双机协作下机器人坐标位置 **命令字:** `0x3214` | 字段 | 类型 | 说明 | |------|------|------| | coord1 | int | 获取机器人 1 位置的坐标类型,范围 [0, 3]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标 | | coord2 | int | 获取机器人 2 位置的坐标类型,范围 [0, 3]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标 | | robot1 | int | 双机协作第一个机器人号,范围 [1, 4],默认为 1 | | robot2 | int | 双机协作第二个机器人号,范围 [1, 4],默认为 2 | ```json { "coord1": 1, "coord2": 1, "robot1": 1, "robot2": 2 } ``` **控制器回复** **命令字:** `0x3215` | 字段 | 类型 | 说明 | |------|------|------| | coord1 | int | 机器人 1 位置的坐标类型,范围 [0, 3] | | coord2 | int | 机器人 2 位置的坐标类型,范围 [0, 3] | | pos1 | double[] | 机器人 1 弧度制下的坐标 | | pos1Deg | double[] | 机器人 1 角度制下的坐标 | | pos2 | double[] | 机器人 2 弧度制下的坐标 | | pos2Deg | double[] | 机器人 2 角度制下的坐标 | | robot1 | int | 双机协作第一个机器人号,默认为 1 | | robot2 | int | 双机协作第二个机器人号,默认为 2 | ```json { "coord1": 0, "coord2": 0, "pos1": [-0.0, 0.0, 3.077931758984, -0.0, 0.0, -0.0, 0.0], "pos1Deg": [-0.0, 0.0, 3.077931758984, -0.0, 0.0, -0.0, 0.0], "pos2": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pos2Deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot1": 1, "robot2": 2 } ``` ## 电机负载值 ### 查询机器人电机扭矩过载值 **命令字:** `0x3220` | 字段 | 类型 | 说明 | |------|------|------| | robot_num | int | 查询机器人号,范围 [1, 4] | ```json { "robot_num": 1 } ``` **控制器回复** **命令字:** `0x3221` | 字段 | 类型 | 说明 | |------|------|------| | torq_limit_enable | bool | 电机过载保护使能 | | torq_limit_min_ensure_time | double | 电机过载保护最小确认时间,范围 [10, 9999],单位 ms | | torq_limit_robot | double[] | 电机扭矩过载值列表,单位 ‰,长度为当前机器人的轴数量 | | torq_limit_sync | double[] | 外部轴电机扭矩过载值列表,单位 ‰,长度为当前机器人绑定的外部轴数量 | ```json { "torq_limit_enable": false, "torq_limit_min_ensure_time": 10, "torq_limit_robot": [800.0, 1400.0, 1000.0, 1200.0, 800.0, 700.0], "torq_limit_sync": [-0.0, -0.0, 0.0, 0.0, -0.0] } ``` ## 轴速度 ### 查询机器人轴速度 **命令字:** `0x3230` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3231` | 字段 | 类型 | 说明 | |------|------|------| | actualLineVel | double | 机器人末端当前线速度,单位 mm/s | | axisActualVel | double[] | 机器人各轴当前速度列表,单位 °/s,长度为 7 | | axisActualVelSync | double[] | 机器人外部轴各轴当前速度列表,单位 °/s,长度为 5 | | maxActualLineVel | double | 机器人末端最大线速度,单位 mm/s | | maxAxisActualVel | double[] | 机器人各轴最大速度列表,单位 °/s,长度为 7 | | maxAxisActualVelSync | double[] | 机器人外部轴各轴最大速度列表,单位 °/s,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "actualLineVel": 0.0, "axisActualVel": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "axisActualVelSync": [0.0, 0.0, 0.0, 0.0, 0.0], "maxActualLineVel": 0.0, "maxAxisActualVel": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "maxAxisActualVelSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ## 福德伺服温度 > 福德伺服专属功能 ### 查询福德伺服温度是否存在 **命令字:** `0x3250` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3251` | 字段 | 类型 | 说明 | |------|------|------| | IsExist | bool | 福德伺服温度是否存在 | ```json { "IsExist": false } ``` ### 控制器向示教器发送延时时间响应 **命令字:** `0x3252` | 字段 | 类型 | 说明 | |------|------|------| | delaytime | double | 延迟时间,单位 s | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "delaytime": 4, "robot": 1 } ``` ## 电机状态 > 电机参数查询,伺服温度仅福德伺服温度存在时可用 ### 查询机器人电机转速 **命令字:** `0x3260` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3261` | 字段 | 类型 | 说明 | |------|------|------| | maxVel | double[] | 机器人最大电机转速列表,单位 rpm,长度为 7 | | maxVelSync | double[] | 机器人外部轴最大电机转速列表,单位 rpm,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | vel | double[] | 机器人当前电机转速列表,单位 rpm,长度为 7 | | velSync | double[] | 机器人外部轴当前电机转速列表,单位 rpm,长度为 5 | | slave_vel | double[][] | 机器人主轴及从动轴电机速度列表,单位 rpm,7 个元素各包含 4 个元素(第 1 位主轴,2-4 位从动轴) | | slave_max_vel | double[][] | 机器人主轴及从动轴最大电机速度列表,单位 rpm | | slave_vel_sync | double[][] | 机器人外部轴主轴及从动轴电机速度列表,单位 rpm,5 个元素各包含 4 个元素 | | slave_max_vel_sync | double[][] | 机器人外部轴主轴及从动轴最大电机速度列表,单位 rpm | ```json { "maxVel": [0, 0, 0, 0, 0, 0, 0], "maxVelSync": [0, 0, 0, 0, 0], "robot": 1, "vel": [0, 0, 0, 0, 0, 0, 0], "velSync": [0, 0, 0, 0, 0], "slave_vel": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_vel": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_vel_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_vel_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人电机扭矩 **命令字:** `0x3262` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3263` | 字段 | 类型 | 说明 | |------|------|------| | maxTheoTorq | double[] | 机器人最大电机理论扭矩列表,单位 ‰,长度为 7 | | maxTorq | double[] | 机器人最大电机扭矩列表,单位 ‰,长度为 7 | | maxTorqSync | double[] | 机器人外部轴最大电机扭矩列表,单位 ‰,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | theoTorq | double[] | 机器人当前电机理论扭矩列表,单位 ‰,长度为 7 | | torq | double[] | 机器人当前电机扭矩列表,单位 ‰,长度为 7 | | torqSync | double[] | 机器人外部轴当前电机扭矩列表,单位 ‰,长度为 5 | | slave_torq | double[][] | 机器人主轴及从动轴电机扭矩列表,单位 ‰,7 个元素各包含 4 个元素(第 1 位主轴,2-4 位从动轴) | | slave_max_torq | double[][] | 机器人主轴及从动轴电机最大扭矩列表,单位 ‰ | | slave_torq_sync | double[][] | 机器人外部轴主轴及从动轴电机扭矩列表,单位 ‰,5 个元素各包含 4 个元素 | | slave_max_torq_sync | double[][] | 机器人外部轴主轴及从动轴最大电机扭矩列表,单位 ‰ | ```json { "maxTheoTorq": [0, 0, 0, 0, 0, 0, 0], "maxTorq": [0, 0, 0, 0, 0, 0, 0], "maxTorqSync": [0, 0, 0, 0, 0], "robot": 1, "theoTorq": [0, 0, 0, 0, 0, 0, 0], "torq": [0, 0, 0, 0, 0, 0, 0], "torqSync": [0, 0, 0, 0, 0], "slave_torq": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_torq": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_torq_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_torq_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人电机负载率 **命令字:** `0x3264` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3265` | 字段 | 类型 | 说明 | |------|------|------| | externalOverload | double[] | 机器人外部轴当前电机负载列表,单位 ‰,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | robotOverload | double[] | 机器人当前电机负载列表,单位 ‰,长度为 7 | | slave_motor_rbt_over_load | double[][] | 机器人主轴及从动轴电机负载列表,单位 ‰,7 个元素各包含 4 个元素(第 1 位主轴,2-3 位从动轴) | | slave_motor_sync_over_load | double[][] | 机器人外部轴主轴及从动轴电机负载列表,单位 ‰,5 个元素各包含 4 个元素 | ```json { "externalOverload": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "robotOverload": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "slave_motor_rbt_over_load": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_motor_sync_over_load": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人编码器位置 **命令字:** `0x3266` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3267` | 字段 | 类型 | 说明 | |------|------|------| | reality | double[] | 机器人编码器位置实际值列表,长度为 7 | | realitySync | double[] | 机器人外部轴编码器位置实际值列表,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | target | double[] | 机器人编码器位置目标值列表,长度为 7 | | targetSync | double[] | 机器人外部轴编码器位置目标值列表,长度为 5 | | slave_reality | double[][] | 机器人主轴及从动轴编码器位置实际值列表,7 个元素各包含 4 个元素 | | slave_target | double[][] | 机器人主轴及从动轴编码器位置目标值列表 | | slave_reality_sync | double[][] | 机器人外部轴主轴及从动轴编码器位置实际值列表,5 个元素各包含 4 个元素 | | slave_target_sync | double[][] | 机器人外部轴主轴及从动轴编码器位置目标值列表 | ```json { "reality": [0, 0, 0, 0, 0, 0, 0], "realitySync": [0, 0, 0, 0, 0], "robot": 1, "target": [0, 0, 0, 0, 0, 0, 0], "targetSync": [0, 0, 0, 0, 0], "slave_reality": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_target": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_reality_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_target_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ## PDO 操作 说明:存在5个元素,为机器人的5个外部轴;元素存在4个元素,第1位:主轴,2-4:从动轴 ### 上位机发送写入 PDO **命令字:** `0x2056` | 字段 | 类型 | 说明 | |------|------|------| | axisNum | uint | 从站编号 | | index | uint | 命令字编码 | | subindex | uint | 子命令编码 | | size | uint | 位数 | | value | - | 写入的值 | ```json { "axisNum": 1, "index": 0x0006, "subindex": 0, "size": 16, "value": 6 } ``` ## 电机电流查询 ### 查询机器人电机电流 **命令字:** `0x3268` - 无需发送数据 **控制器回复** **命令字:** `0x3269` | 字段 | 类型 | 说明 | |------|------|------| | current | double[] | 机器人电机电流列表,单位‰,长度为7 | | max_current | double[] | 机器人最大电机电流列表,单位‰,长度为7 | | robot | int | 当前机器人号,范围 [1,4] | | sync_current | double[] | 机器人外部轴电机电流列表,单位‰,长度为5 | | sync_max_current | double[] | 机器人外部轴最大电机电流列表,单位‰,长度为5 | | slave_current | double[][] | 机器人主轴及从动轴电机最大电流列表,存在7个元素,元素存在4个元素 | | slave_max_current | double[][] | 机器人外部轴主轴及从动轴电机电流列表,存在7个元素 | | slave_sync_max_current | double[][] | 机器人外部轴主轴及从动轴电机最大电流列表,存在5个元素 | ```json { "current": [0,0,0,0,0,0,0], "max_current": [0,0,0,0,0,0,0], "robot": 1, "sync_current": [0,0,0,0,0], "sync_max_current": [0,0,0,0,0], "slave_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_max_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_sync_max_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] } ``` ## 电机温度查询 ### 查询机器人电机温度 **命令字:** `0x326A` - 无需发送数据 **控制器回复** **命令字:** `0x326B` | 字段 | 类型 | 说明 | |------|------|------| | temperature | double[] | 机器人电机温度列表,单位°/C,长度为7 | | maxTemperature | double[] | 机器人最大电机温度列表,单位°/C | | temperatureSync | double[] | 机器人外部轴电机温度列表,单位°/C | | maxtemperatureSync | double[] | 机器人外部轴最大电机温度列表,单位°/C | | slave_temperature | double[][] | 机器人主轴及从动轴伺服温度列表,存在7个元素 | | slave_temperature_max | double[][] | 机器人主轴及从动轴伺服最大温度列表,存在7个元素 | | slave_temperature_sync_out | double[][] | 机器人外部轴主轴及从动轴伺服温度列表,存在5个元素 | | slave_temperature_sync_out_max | double[][] | 机器人外部轴主轴及从动轴伺服最大温度列表,存在5个元素 | ```json { "temperature": [0.0,0.0,0.0,0.0,0.0,0.0,0.0], "maxTemperature": [0.0,0.0,0.0,0.0,0.0,0.0,0.0], "temperatureSync": [0.0,0.0,0.0,0.0,0.0], "maxtemperatureSync": [0.0,0.0,0.0,0.0,0.0], "slave_temperature": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_max": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_sync_out": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_sync_out_max": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] } ``` ## 系统运行状态 ### 查询机器人运行状态 **命令字:** 0x3000 - 无需发送数据 **控制器回复** **命令字:** 0x3001 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | status | int | 运行状态码 | | errorCode | int | 错误码,0表示无错误 | | programName | string | 当前运行的程序名 | --- ## 状态码说明 ### 运行状态码 | 状态码 | 状态名称 | 说明 | |--------|----------|------| | 0 | 空闲 (IDLE) | 机器人未运行,等待指令 | | 1 | 运行中 (RUNNING) | 程序正在执行 | | 2 | 暂停 (PAUSED) | 程序被暂停,可恢复 | | 3 | 停止 (STOPPED) | 程序被停止 | | 4 | 错误 (ERROR) | 发生错误,需复位 | | 5 | 回零中 (HOMING) | 正在执行回零操作 | | 6 | 示教模式 (TEACH) | 处于示教/手动模式 | | 7 | 急停 (EMERGENCY_STOP) | 急停按钮被按下 | ### 伺服状态 | 状态值 | 说明 | |--------|------| | 0 | 伺服关闭 (Servo OFF) | | 1 | 伺服开启 (Servo ON) | | 2 | 伺服使能中 (Enabling) | ### 程序运行状态 | 状态值 | 说明 | |--------|------| | 0 | 未运行 | | 1 | 运行中 | | 2 | 暂停 | | 3 | 单步执行 | | 4 | 已停止 | ### 电机状态码 | 状态码 | 名称 | 说明 | |--------|------|------| | 0 | 正常 | 电机工作正常 | | 1 | 过载警告 | 负载超过额定值但未报警 | | 2 | 过载报警 | 负载超过保护阈值 | | 3 | 过热警告 | 温度超过警告阈值 | | 4 | 过热报警 | 温度超过保护阈值 | | 5 | 通讯异常 | 与驱动器通讯中断 | | 6 | 跟随误差过大 | 实际位置与指令位置偏差超限 | ## 安全状态查询 ### 查询安全回路状态 **命令字:** 0x3004 - 无需发送数据 **控制器回复** **命令字:** 0x3005 | 字段 | 类型 | 说明 | |------|------|------| | emergencyStop | bool | 急停状态:true=急停中, false=正常 | | safetyDoor | bool | 安全门状态:true=门开, false=门关 | | enableSwitch | bool | 使能开关:true=按下, false=松开 | ## 程序状态查询 ### 查询程序运行详细信息 **命令字:** 0x3006 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1,4] | **控制器回复** **命令字:** 0x3007 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号 | | progName | string | 当前程序名 | | lineNumber | int | 当前执行行号 | | cycleCount | int | 循环次数 | | progStatus | int | 程序状态:0=未运行, 1=运行中, 2=暂停, 3=单步, 4=停止 | ## 常用状态查询组合 ### 检查机器人是否可以开始工作 步骤1 - 查询安全回路 (0x3004 -> 0x3005): 检查 emergencyStop=false, safetyDoor=false 步骤2 - 查询伺服状态: 检查各轴伺服已开启 步骤3 - 查询程序状态 (0x3006 -> 0x3007): 检查 progStatus=0 (空闲) ### 监控电机健康状况 步骤1 - 查询电机温度 (0x326A -> 0x326B) 步骤2 - 查询电机负载 (0x3264 -> 0x3265) 步骤3 - 查询电机扭矩 (0x3262 -> 0x3263) 步骤4 - 查询碰撞检测 (0x3200 -> 0x3201) --- # 工具手 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/04.%E5%B7%A5%E5%85%B7%E6%89%8B.html ## 概述 工具手标定是工业机器人坐标系管理的核心功能,用于建立机器人末端工具的坐标系(Tool Coordinate System, TCS)。 ### 什么是工具坐标系 - **法兰盘中心**:默认工具坐标系的原点,法兰盘中心指向法兰盘定位孔方向为+X 方向,垂直法兰向外为+Z 方向,根据右手法则判定 Y 方向 - **工具中心点(TCP)**:工具坐标系的原点,通常是工具的工作点(如焊丝尖端、吸盘中心等) - **工具坐标系特点**:新的工具坐标系相对于默认的工具坐标系变化得到,位置和方向始终同法兰盘保持绝对的位置和姿态关系 ### 为什么要建立工具坐标系 1. **确立工具的 TCP 点**:方便调整工具状态 - 例如:焊接时,将 TCP 定义到焊丝尖端,程序记录的位置便是焊丝尖端的位置 2. **确定工具进给方向**:方便工具位置调整 - 例如:手爪的前进方向可以直接移动过去 ### 适用场景 **需要使用工具手的情况**: - 机器人工作时 X、Y、Z 轴需要绕着 A、B、C 姿态轴旋转 - 典型工艺:焊接、打磨、喷涂、切割等 **无需使用工具手的情况**: - 机器人本身仅做 Z 轴姿态旋转 - 工具末梢位于机器人6轴法兰中心延长线上 ### 标定方式选择指南 | 场景 | 推荐方式 | 说明 | |------|----------|------| | 已激光标定 + 使用焊枪 | 6点标定 | 校准工具手尺寸+姿态,C轴精度较好 | | 未激光标定 + 使用焊枪 | 12点标定 | 校准零点+工具手尺寸 | | 标定码垛夹爪 | 直接填写尺寸或6点标定 | 优先选择直接填工具尺寸 | | 零点丢失 | 20点标定 | 校准零点+工具手尺寸 | | 6点标定后A/B轴旋转误差大 | 7点标定 | 校准工具手尺寸+姿态,A/B轴精度较好 | ### 工具手参数说明 | 参数 | 说明 | 单位 | |------|------|------| | X轴 | 工具末端相对于法兰中心,沿直角坐标系X轴方向的偏移长度 | mm | | Y轴 | 工具末端相对于法兰中心,沿直角坐标系Y轴方向的偏移长度 | mm | | Z轴 | 工具末端相对于法兰中心,沿直角坐标系Z轴方向的偏移长度 | mm | | A轴 | 工具末端相对于法兰中心,绕直角坐标系X轴方向旋转角度 | °/rad | | B轴 | 工具末端相对于法兰中心,绕直角坐标系Y轴方向旋转角度 | °/rad | | C轴 | 工具末端相对于法兰中心,绕直角坐标系Z轴方向的旋转角度 | °/rad | --- ## 工具手参数 ### 上位机设置工具手参数 **命令字:** `0x3500` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | B | double | 绕 B 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | C | double | 绕 C 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **请求示例:** ```json { "parameter": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.170 }, "robot": 1, "tool": 1 } ``` ### 上位机查询工具手参数 **命令字:** `0x3501` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **请求示例:** ```json { "robot": 1, "tool": 1 } ``` ### 控制器回复上位机工具手参数 **命令字:** `0x3502` **参数列表(弧度制):** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | [-3.1416,3.1416] | | B | double | 绕 B 轴旋转 | [-3.1416,3.1416] | | C | double | 绕 C 轴旋转 | [-3.1416,3.1416] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | **参数列表(角度制):** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | [-180,180] | | B | double | 绕 B 轴旋转 | [-180,180] | | C | double | 绕 C 轴旋转 | [-180,180] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **响应示例:** ```json { "parameter": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.17 }, "parameterDeg": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.17 }, "robot": 1, "tool": 1 } ``` ## 工具号 ### 上位机请求切换工具号 **命令字:** `0x3510` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 需要切换的工具手号,0表示无工具手 | [0,999] | **请求示例:** ```json { "robot": 1, "tool": 0 } ``` ### 上位机查询工具手号 **命令字:** `0x3511` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | **请求示例:** ```json { "robot": 1 } ``` ### 控制器回复上位机工具手号 **命令字:** `0x3512` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | curToolNum | int | 当前已选中工具手号 | [0,999] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 与已选中工具手号一致,选中工具号为0时值为1 | [1,999] | **响应示例:** ```json { "curToolNum": 0, "robot": 1, "tool": 1 } ``` ## 工具标定 > 六点法和七点法标定,包含有标定 N 号点、获取标定点位置信息、点位标定状态。 > 标定计算前需标定好所有点,先用0x3521标定每一个点,所有的点位标定完成后用0x3520计算标定结果。 > 查询 N 号点位置信息时需 N 号点已标定。 ### 标定方式详解 #### 6点标定 6点标定用于校准工具手尺寸和姿态,标定结果旋转 C 轴精度较好。 **标定步骤**: 1. **TC1标定**:机器人5轴垂直向下,工具手末梢对准标定锥尖端 2. **TC2标定**:在第一点的基础上 C 轴旋转180度 3. **TC3标定**:在第一点的基础上 B 轴角度在35度 4. **TC4标定**:机器人回到零点,然后工具手末梢垂直 5. **TC5标定**:在第四点的基础上动 X- 6. **TC6标定**:在第五点的基础上动 Y+ **计算**:六个点标定结束后,点击"计算"会算出计算结果,如果计算结果大于1的话就需要重新标定。 #### 7点标定 7点标定用于校准工具手尺寸和姿态,标定结果旋转 A、B 轴精度较好。 **标定步骤**: 1. **TC1**:工具手末梢垂直对准参考点 2. **TC2**:将机器人切换一个姿势,末端正对参考点 3. **TC3**:将机器人切换一个姿势,末端正对参考点 4. **TC4**:将机器人切换一个姿势,末端正对参考点 5. **TC5**:将工具末端垂直且正对参考点(同 TC1) 6. **TC6**:在 TC5的基础上,沿笛卡尔坐标系 X 轴负方向移动任意距离 7. **TC7**:在 TC6的基础上,沿笛卡尔坐标系 Y 轴正方向移动任意距离 **注意事项**:进行数据量取前请将法兰盘平行于水平面! #### 12点标定 12点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。 **标定步骤**: 1. **TC1**:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端 2. **TC2**:在第一个点的基础上,通过直角坐标系将 C 旋转180度 3. **TC3**:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端 4. **TC4**:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度 5. **TC5**:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度 6. **TC6**:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+、J5大于-90度 7. **TC7**:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度 8. **TC8**:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度 9. **TC9**:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度 10. **TC10**:回到第一个点,通过关节坐标系点动五轴,使五轴向上、J5小于-90度 11. **TC11**:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度 12. **TC12**:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度 **计算**:标定完成后点击计算,计算出标定结果,如果计算出来的数值较大的话,就需要重新标定。 #### 15点标定 15点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。 **标定步骤**: 1. **TC1**:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端 2. **TC2**:在第一个点的基础上,通过直角坐标系将 C 旋转180度 3. **TC3**:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端 4. **TC4**:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度 5. **TC5**:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度 6. **TC6**:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+,J5大于-90度 7. **TC7**:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度 8. **TC8**:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度 9. **TC9**:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度 10. **TC10**:机器人回到第一个点,通过关节坐标系点动五轴使五轴向上,J5小于-90度 11. **TC11**:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度 12. **TC12**:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度 13. **TC13**:机器人回到零点位置,调整机器人姿态,使机器人末端工具尖端竖直朝下,将标定尖端与标定锥对齐 14. **TC14**:在第十三点的基础上,通过直角坐标系做 X-,机器人位移一段距离 15. **TC15**:在第十四点的基础上,通过直角坐标系做 Y+,机器人位移一段距离 #### 20点标定 **标定步骤**: 1. **TC1**:机器人工具手末端垂直参考点 2. **TC2**:在第一点的基础上动 A+ 3. **TC3**:在第一点的基础上动 A+ 40度 4. **TC4**:在第一点的基础上动 A+ 60度 5. **TC5**:在第一点基础上动 A- 20度 6. **TC6**:在第一点基础上动 A- 40度 7. **TC7**:在第一点基础上动 A- 60度 8. **TC8**:在第一点基础上动 B+ 20度 9. **TC9**:在第一点基础上动 B+ 30度 10. **TC10**:在第一点基础上动 B+ 40度 11. **TC11**:在第一点基础上动 B- 20度 12. **TC12**:在第一点基础上动 B- 30度 13. **TC13**:在第一点基础上动 B- 40度 14. **TC14**:在第一点基础上动 C+ 30度 15. **TC15**:在第一点基础上动 C+ 50度 16. **TC16**:在第一点基础上动 C+ 70度 17. **TC17**:在第一点基础上动 C+ 90度 18. **TC18**:在第一点基础上动 C- 30度 19. **TC19**:在第一点基础上动 C- 60度 20. **TC20**:第二十点在第一点基础上动 C- 90度 **注意事项**: - 进行数据量取前请将法兰盘平行于水平面! - 标定过程中请保持参考点固定,否则标定误差增大 ### 验证标定精度 示教模式下,工具手标定的末梢对准标定锥,在两个尖端对准的情况下,选中标定的工具手工具手编号,然后在直角坐标系下点动 A、B、C 轴,看尖端是否对准、偏了多少 mm。 ### API接口 #### 上位机标定计算请求 **命令字:** `0x3520` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | **请求示例:** ```json { "robot": 1, "tool": 1, "calibrationType": 7 } ``` #### 上位机标定 N 号点请求 **命令字:** `0x3521` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 4, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机 N 号点标定信息 **命令字:** `0x3522` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | position | `array` | 标定点直角坐标信息列表 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "calibrationType": 7, "point": 1, "position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0], "robot": 1 } ``` #### 控制器回复上位机标定计算完成结果 **命令字:** `0x3523` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | result | bool | 标定计算结果 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "result": true, "robot": 1 } ``` #### 上位机查询 N 号点位置信息 **命令字:** `0x3524` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 4, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机 N 号点位置信息 **命令字:** `0x3525` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | position | `array` | 标定点直角坐标信息列表 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "calibrationType": 7, "point": 1, "position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0], "robot": 1 } ``` #### 上位机查询全部点标定状态 **命令字:** `0x3526` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机全部点标定状态 **命令字:** `0x3527` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | robot | int | 当前机器人号 | [1,4] | | status | `array` | 点位标定状态列表,1表示已标定,0表示未标定 | 六点法长度6,七点法长度7 | **响应示例:** ```json { "calibrationType": 7, "robot": 1, "status": [1, 1, 1, 0, 0, 1, 1] } ``` #### 上位机请求清除 N 号点标定状态 **命令字:** `0x3528` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 0, "robot": 1, "tool": 1 } ``` ## 常见问题 **Q: 什么是工具坐标系?** A: 工具坐标系是机器人末端工具的坐标系,原点是 TCP(工具中心点),用于确定工具的位姿。 **Q: 为什么要建立工具坐标系?** A: 1. 确立工具的 TCP 点,方便调整工具状态;2. 确定工具进给方向,方便工具位置调整。 **Q: 什么情况下需要使用工具手标定?** A: 需要用到绕 X、绕 Y、绕 Z 的姿态旋转时,需要进行工具手标定,例如焊接工艺、打磨工艺、喷涂工艺等。 **Q: 什么情况下无需使用工具手?** A: 机器人本身仅做 Z 轴姿态旋转,且工具末梢位于机器人6轴法兰中心延长线上;此时可以不设置工具手参数。 **Q: 如何选择工具手标定方式?** A: 1. 已做过激光标定+使用焊枪:使用6点标定;2. 未做过激光标定+使用焊枪:使用12点标定;3. 标定码垛夹抓:优先选择直接填工具尺寸;4. 零点丢失:使用20点标定;5. 6点标定后 A、B 轴旋转误差大:使用7点标定。 **Q: 标定失败,计算结果大于1怎么办?** A: 可能原因:标定点位置不准确、标定过程中参考点移动、机器人姿态不正确。解决方案:重新标定,确保参考点固定,检查机器人姿态是否正确,使用更精确的标定工具。 **Q: 标定后 A、B 轴旋转误差大怎么办?** A: 可能原因:6点标定精度不够、标定点分布不合理。解决方案:更换7点标定,重新标定,确保标定点分布合理。 **Q: 标定后 C 轴旋转误差大怎么办?** A: 可能原因:标定点位置不准确、参考点移动。解决方案:重新标定,确保参考点固定。 --- ## 工具手坐标系变换 ### 坐标系变换链 机器人系统中各坐标系之间的变换关系如下: 基座坐标系(Base) -> 关节变换(J1~J6) -> 法兰坐标系(Flange) -> 工具坐标系(TCP) 其中工具坐标系(TCP)由法兰坐标系经过工具手参数变换得到。 ### 工具手变换矩阵 工具手参数 (X, Y, Z, A, B, C) 定义了一个从法兰坐标系到工具坐标系的齐次变换矩阵: 平移部分由 (X, Y, Z) 定义,单位 mm。 旋转部分由 (A, B, C) 定义,遵循 ZYX 欧拉角顺序(先绕 Z 轴转 C,再绕 Y 轴转 B,最后绕 X 轴转 A)。 ### 变换矩阵计算 工具手变换矩阵 T_tool 的计算公式: T_tool = Trans(X,Y,Z) * RotX(A) * RotY(B) * RotZ(C) 其中: - Trans(X,Y,Z) 是平移变换矩阵 - RotX(A) 是绕 X 轴旋转 A 弧度的旋转矩阵 - RotY(B) 是绕 Y 轴旋转 B 弧度的旋转矩阵 - RotZ(C) 是绕 Z 轴旋转 C 弧度的旋转矩阵 ### 坐标变换应用 #### 获取TCP在基座坐标系下的位姿 TCP 在基座坐标系下的位姿 = T_base_to_flange * T_tool 其中 T_base_to_flange 是基座坐标系到法兰坐标系的变换矩阵,由正运动学计算得到。 #### 工具手参数对运动的影响 1. **平移影响**:设置工具手 X/Y/Z 偏移后,机器人将 TCP 点移动到目标位置而不是法兰中心 2. **旋转影响**:设置工具手 A/B/C 后,直角坐标系的旋转轴将围绕 TCP 点旋转 3. **速度影响**:线速度从法兰中心速度转换为 TCP 点速度 ### 切换工具手的坐标变换 当运行时切换工具手号时,系统会自动: 1. 读取新工具手的 (X, Y, Z, A, B, C) 参数 2. 重新计算工具手变换矩阵 T_tool 3. 后续所有运动指令基于新的 TCP 进行计算 ### 工具手负载参数对动力学的影响 负载参数 (payloadMass, payloadMassCenterX/Y/Z, payloadInertia) 用于: 1. **前馈补偿**:根据负载质量和质心位置计算前馈力矩 2. **碰撞检测**:修正碰撞检测阈值,防止误报 3. **力控模式**:在力控制中补偿负载重力和惯性 ### 坐标系变换示例 假设工具手参数为 X=-68, Y=3, Z=162, A=0, B=0, C=0(仅平移): TCP 相对于法兰的位置偏移为 (-68, 3, 162) mm 当法兰位于基座坐标 (500, 200, 800) 时,TCP 位于基座坐标 (432, 203, 962) ### 工具手参数校验 | 校验项 | 方法 | 标准 | |--------|------|------| | TCP位置 | 四/六点法标定后检查 | 标定距离 < 1mm | | 姿态精度 | 绕A/B/C轴旋转检查尖端偏移 | < 2mm | | 负载质心 | 实际测量与参数对比 | 偏差 < 50mm | | 负载质量 | 称重对比 | 偏差 < 1kg | --- # 用户坐标 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/05.%E7%94%A8%E6%88%B7%E5%9D%90%E6%A0%87.html ## 概述 用户坐标系是机器人在工件或工装上定义的局部坐标系,用于简化编程和操作。通过在不同工件上定义用户坐标系,可以使同一程序在不同工位间复用,大幅提高编程效率。 --- ## 坐标系层次 机器人系统中存在多层坐标系,从全局到局部的关系如下: ```text 大地坐标系 (World) └── 基坐标系 (Base/Robot) └── 用户坐标系 (User) ← 本章内容 └── 工具坐标系 (Tool) ``` | 坐标系 | 说明 | 默认原点 | |--------|------|----------| | 大地坐标系 | 车间地面的绝对参考系 | 固定在地面 | | 基坐标系 | 机器人底座上的参考系 | 机器人底座中心 | | 用户坐标系 | 工件/工装上的局部参考系 | 用户通过标定定义 | | 工具坐标系 | 工具末端 (TCP) 的参考系 | 工具法兰中心 | ### 用户坐标系的作用 1. **编程简化**:在工件上定义坐标系后,可以直接使用工件的长宽高方向编程 2. **程序复用**:同一程序应用于不同位置的工件时,只需切换用户坐标系 3. **偏移补偿**:通过修改用户坐标系偏移量实现工位微调 4. **多工位管理**:支持最多 999 个用户坐标系,满足多工位需求 --- ## 用户坐标标定 ### 标定方法 用户坐标系通过**三点法**进行标定: 1. **原点 (O)**:定义用户坐标系的原点位置 2. **X 轴方向点 (X)**:定义用户坐标系 X 轴正方向 3. **Y 轴方向点 (Y)**:定义用户坐标系 Y 轴正方向(Z 轴由右手定则确定) > **标定要求:** 原点、X 点、Y 点不能共线,否则标定失败。 ### 标定流程 1. 通过 `0x3562` 发送标定点位置信息(原点/X/Y) 2. 通过 `0x3560` 请求标定计算 3. 控制器回复 `0x3561` 告知计算结果 4. 通过 `0x3570` 查询标定后的位置信息验证 --- ### 0x3560 上位机请求用户坐标标定计算 **说明:** 上位机请求用户坐标标定计算 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 1 } ``` --- ### 0x3561 控制器回复用户坐标标定计算结果 **说明:** 控制器回复上位机用户坐标标定计算结果 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | result | bool | 标定计算是否成功 | | robot | int | 当前机器人号,范围[1,4] | **响应示例:** ```json { "result": true, "robot": 1 } ``` --- ### 0x3562 上位机请求当前用户坐标标定原点/X 值/Y 值 **说明:** 上位机请求当前用户坐标标定原点/X 值/Y 值 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | posX | double[] | 标记的 X 值位置信息列表,当`require`为`"OXY"`时该节点存在 | | posY | double[] | 标记的 Y 值位置信息列表,当`require`为`"OXY"`时该节点存在 | | posZero | double[] | 标记的原点位置信息列表,当`require`为`"OXY"`时该节点存在 | | require | string | 标记点信息,取值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;取值为`"OXY"`时,标记所有点 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "posX": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "posY": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "posZero": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "require": "OXY", "robot": 1, "user": 1 } ``` --- ### 0x3563 控制器回复当前用户坐标标定原点/X 值/Y 值 **说明:** 控制器回复上位机当前用户坐标标定原点/X 值/Y 值 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 弧度制下的位置信息列表 | | positionDeg | double[] | 角度制下的位置信息列表 | | require | string | 标记点信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值 | | robot | int | 当前机器人号,范围[1,4] | | status | bool | 标定状态,`true`表示已标定,`false`表示未标定 | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "position": [470.746, 0.0, 817.334, 3.141, 0.0, 0.0], "positionDeg": [470.746, 0.0, 817.334, 179.966043450592, 0.0, 0.0], "require": "O", "robot": 1, "status": true, "user": 1 } ``` --- ### 0x3570 上位机查询用户坐标标定点位置信息 **说明:** 上位机查询用户坐标标定点位置信息 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | require | string | 需要查询的位置信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;值为`"Calibration"`时表示计算后的位置信息 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "require": "X", "robot": 1, "user": 1 } ``` --- ### 0x3571 控制器回复用户坐标标定点位置信息 **说明:** 控制器回复上位机用户坐标标定点位置信息 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 弧度制下的位置信息列表;`require`为`"Calibration"`时为弧度制下偏移量 | | positionDeg | double[] | 角度制下的位置信息列表;`require`为`"Calibration"`时为角度制下偏移量 | | require | string | 查询的位置信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;值为`"Calibration"`时表示计算后的位置信息 | | robot | int | 当前机器人号,范围[1,4] | | status | bool | 标定状态,`true`表示已标定,`false`表示未标定;`require`为`"Calibration"`时该节点不存在 | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "positionDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "require": "X", "robot": 1, "status": false, "user": 1 } ``` --- ## 用户坐标号 ### 0x3580 上位机请求切换用户坐标 **说明:** 上位机请求切换用户坐标 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 需要切换到的用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 3 } ``` > **注意:** 切换用户坐标系后,所有后续运动指令将基于新的用户坐标系执行。确保目标用户坐标系已正确标定。 --- ### 0x3581 上位机查询当前已选中的用户坐标号 **说明:** 上位机查询当前已选中用户坐标号 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 0x3582 控制器回复已选中的用户坐标号 **说明:** 控制器回复上位机已选中的用户坐标号 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "robot": 1, "user": 3 } ``` --- ## 用户坐标注释 ### 0x3590 上位机请求设置用户坐标注释 **说明:** 上位机请求设置用户坐标注释 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | note | string | 需要设置的注释 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "note": "AAA", "robot": 1, "user": 1 } ``` --- ### 0x3591 上位机查询用户坐标号注释 **说明:** 上位机查询用户坐标号注释 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 1 } ``` --- ### 0x3592 控制器回复用户坐标号注释 **说明:** 控制器回复上位机用户坐标号注释 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | note | string | 当前用户坐标注释 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "note": "AAA", "robot": 1, "user": 1 } ``` --- ### 0x3593 上位机设置用户坐标偏移量 **说明:** 上位机设置用户坐标偏移量 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 设置的偏移量列表,按顺序分别为 X 值,Y 值,Z 值,A 值,B 值,C 值 | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "position": [5.0, 0.0, 0.0, 0.0, 0.0, 0.0], "user": 1 } ``` ### 偏移量用途 偏移量用于在不重新标定的情况下微调用户坐标系的位置: - **X/Y/Z 偏移**:平移用户坐标系原点 - **A/B/C 偏移**:旋转用户坐标系方向(欧拉角) > **典型场景:** 工装更换后工件位置发生微小偏移,通过调整偏移量即可恢复精度,无需重新标定。 --- # 零点 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/06.%E9%9B%B6%E7%82%B9.html ## 概述 零点是机器人各关节轴的基准参考位置。准确的零点标定是保证机器人运动精度的基础。本章说明零点相关的所有协议命令,包括零点标定流程、零点偏移设置、编码器状态查询和多圈值/单圈值管理。 --- ## 零点标定流程 ### 标准零点标定步骤 零点标定的完整流程如下: 1. **编码器状态检查**:通过 `0x3603` 查询编码器状态,确认无欠压报警 2. **标记无间隙方向**:通过 `0x3600` 请求标记无间隙方向(消除传动间隙对零点的影响) 3. **清除多圈值**:通过 `0x3601` 清除轴多圈值,将当前编码器位置重置 4. **移动机器人到零点**:手动将机器人各轴移动到机械零点位置 5. **设置零点偏移**:通过 `0x3605` 设置零点偏移值(度数值或偏移量) 6. **设置单圈值**:通过 `0x3606` 微调各轴单圈值 7. **验证零点**:查询单圈值确认零点设置正确 ### 零点标定类型 | 标定方式 | mode 值 | 说明 | 适用场景 | |----------|---------|------|----------| | 度数方式 | 0 | 直接设置各轴的目标角度值 | 已知精确零点角度时的快速标定 | | 偏移量方式 | 1 | 设置各轴相对于当前编码器位置的偏移量 | 机械零点定位后的微调标定 | ### 零点精度要求 - 零点精度直接影响机器人的**绝对定位精度** - 各轴零点偏差应在 **±0.01°** 以内 - 零点标定后应通过运行验证程序确认精度 - 更换电机、编码器或减速机后需要重新标定零点 ### 零点标定注意事项 - 标定前确认机器人**各轴无负载** - 标定前确认编码器**无欠压报警** - 标定时各轴应处于**无间隙方向** - 标定完成后建议**保存配置并重启验证** --- ## 请求标记无间隙方向 **命令字:** `0x3600` - 无需发送数据 --- ## 清除轴多圈值 ### 请求清除轴多圈值 **命令字:** `0x3601` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 需要清除多圈值的轴,范围 [0, 7],0 表示清除所有轴多圈值 | | clear | bool | 是否清除多圈值 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "axis": 0, "clear": true, "robot": 1 } ``` **控制器回复** **命令字:** `0x3602` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 清除多圈值的轴,范围 [0, 7] | | result | int | 清除多圈值结果,范围 [0, 1] | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "axis": 0, "result": 1, "robot": 1 } ``` --- ## 编码器状态 ### 查询编码器状态 **命令字:** `0x3603` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3604` | 字段 | 类型 | 说明 | |------|------|------| | encoderUndervoltage | bool[] | 欠压报警列表,false 表示不欠压,true 表示欠压,长度为当前机器人轴数 | | encoderUnderVoltageExternal | bool[] | 外部轴欠压报警列表,false 表示不欠压,true 表示欠压,长度为当前机器人外部轴轴数 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "encoderUndervoltage": [false, false, false, false, false, false], "encoderUnderVoltageExternal": [false, false, false, false, false], "robot": 1 } ``` --- ## 零点偏移 ### 设置零点偏移 **命令字:** `0x3605` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 设置零点偏移的轴,范围 [0, 7],0 表示设置全部轴 | | mode | int | 零点偏移方式:0 表示度数,1 表示偏移量 | | robot | int | 当前机器人号,范围 [1, 4] | | value | double[] | 零点偏移值列表,长度为 7;当 mode 为度数时范围 [-360, 360] | ```json { "axis": 0, "mode": 0, "robot": 1, "value": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 单圈值 ### 设置单圈值 **命令字:** `0x3606` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 设置的各轴单圈值列表,范围 [-2^31, 2^31-1] | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0] } ``` ### 查询单圈值 **命令字:** `0x3607` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3608` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 各轴单圈值列表,范围 [-2^31, 2^31-1] | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0] } ``` --- ## 多圈值 > 零点偏移为编码器时 ### 查询多圈值 **命令字:** `0x330B` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x330C` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 电机编码器值列表 | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0, 0] } ``` --- # 复位点 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/07.%E5%A4%8D%E4%BD%8D%E7%82%B9.html ## 概述 上位机与控制器通过复位点协议进行通信,用于设置和查询机器人复位点位置、复位 IO 参数、安全位置等相关配置。 ### 复位点概念 复位点是机器人在特定条件下需要返回的安全参考位置。典型的应用场景包括: - **安全事件后复位**:急停或安全门触发后,机器人需要先回到复位点才能继续运行 - **程序异常中断后复位**:程序执行中断后,机器人需要回到复位点重新开始 - **断电重启后复位**:断电后重新上电,机器人需要从复位点开始运行 ### 复位形式 | 形式 | selectPiontOrFile 值 | 说明 | |------|---------------------|------| | 复位点 | 0 | 机器人移动到预设的复位点关节位置 | | 复位程序 | 1 | 机器人执行预设的复位程序 | ### 插补方式 | 方式 | returnWay 值 | 说明 | |------|-------------|------| | 关节插补 | 0 | 各轴以关节插补方式同时移动到复位点 | | 直线插补 | 1 | 末端以直线路径移动到复位点(需要逆解) | --- ## 复位点配置参数总览 | 参数类别 | 参数 | 说明 | |----------|------|------| | 位置参数 | `pos` / `posSync` | 本体轴/外部轴复位点位置 | | 安全参数 | `deviation` / `deviationSync` | 各轴安全范围偏差 | | IO 参数 | `inPort` / `inValue` / `outPort` | 开始/结束 IO 信号 | | 控制参数 | `returnWay` / `safeEnable` / `selectPiontOrFile` | 插补方式/安全使能/复位形式 | ### 安全使能 (safeEnable) 当 `safeEnable` 为 `true` 时: - 机器人在安全事件后**必须手动回到安全点位置**才能重新运行 - 控制器通过 `0x3665` 上报当前不在安全位置的机器人状态 --- ## 1. 上位机设置复位点位置 **命令字:** `0x3660` ### 请求参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | pos | double[] | 7 | 机器人复位点位置列表 | | posSync | double[] | 5 | 机器人外部轴复位点位置列表 | | robot | int | 1 | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "pos": [10.20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- ## 2. 上位机查询复位点位置 **命令字:** `0x3661` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "robot": 1 } ``` --- ## 3. 控制器回复上位机复位点位置 **命令字:** `0x3662` ### 响应参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | deviation | double[] | 7 | 机器人各轴安全范围,范围[0,10] | | deviationSync | double[] | 5 | 机器人外部轴各轴安全范围,范围[0,10] | | inPort | int | 1 | 开始 DIN | | inValue | int | 1 | 开始 DIN 参数,范围[0,1] | | outPort | int | 1 | 结束 DOUT | | pos | double[] | 7 | 机器人复位点位置列表 | | posSync | double[] | 5 | 外部轴复位点位置列表 | | returnWay | int | 1 | 插补方式:0-关节插补,1-直线插补 | | robot | int | 1 | 当前机器人号,范围[1,4] | | safeEnable | bool | 1 | 安全使能:安全使能开始时,机器人必须手动回到安全点位置才能重新运行 | | selectPiontOrFile | int | 1 | 机器人复位形式:0-复位点,1-复位程序 | ### 响应示例 ```json { "deviation": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0], "inPort": 0, "inValue": 1, "outPort": 0, "pos": [10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posSync": [0.0, 0.0, 0.0, 0.0, 0.0], "returnWay": 0, "robot": 1, "safeEnable": false, "selectPiontOrFile": 0 } ``` --- ## 4. 上位机设置复位 IO 参数 **命令字:** `0x3663` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | inPort | int | 开始 DIN | | inValue | int | 开始 DIN 参数,范围[0,1] | | outPort | int | 结束 DOUT | | returnWay | int | 插补方式:0-关节插补,1-直线插补 | | robot | int | 当前机器人号,范围[1,4] | | safeEnable | bool | 安全使能:安全使能开始时,机器人必须手动回到安全点位置才能重新运行 | | selectPiontOrFile | int | 机器人复位形式:0-复位点,1-复位程序 | ### 请求示例 ```json { "inPort": 0, "inValue": 1, "outPort": 0, "returnWay": 0, "robot": 1, "safeEnable": false, "selectPiontOrFile": 0 } ``` --- ## 5. 上位机设置复位点安全位置 **命令字:** `0x3664` ### 请求参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | deviation | double[] | 7 | 机器人各轴安全范围,范围[0,10] | | deviationSync | double[] | 5 | 机器人外部轴各轴安全范围,范围[0,10] | | robot | int | 1 | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "deviation": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0], "robot": 1 } ``` --- ## 6. 控制器回复上位机当前不在安全位置 **命令字:** `0x3665` ### 响应参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | currentPos | double[] | 6 | 当前机器人位置列表,长度为当前机器人轴数 | | isSync | bool | 1 | 是否为外部轴 | | robot | int | 1 | 当前机器人号,范围[1,4] | | safePos | double[] | 6 | 复位点位置列表 | ### 响应示例 ```json { "currentPos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "isSync": false, "robot": 1, "safePos": [10.2, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 复位点配置流程 建议按以下顺序配置复位点: 1. **设置复位点位置** (`0x3660`):定义复位点的各轴关节角度 2. **设置安全范围** (`0x3664`):定义各轴允许的偏差范围 3. **设置 IO 参数** (`0x3663`):配置复位开始/结束的 IO 信号条件 4. **查询验证** (`0x3661`/`0x3662`):查询当前配置,确认参数正确 > **注意:** `returnWay` 选择直线插补时,需确保复位点位置在机器人的可达工作空间内,否则可能导致逆解失败。 --- # 标定 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/08.%E6%A0%87%E5%AE%9A.html ## 四点标定 说明:机器人末梢移动到并标定四个点,计算后可得杆长度和轴零点偏移,若认可计算结果,可将计算结果填入 DH 参数。 ### 上位机四点标定计算请求 **命令字:** `0x3700` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | ParamOf4Points | double[] | 长度为2,L1和 L2长度。两参数分别为机器人末梢从标记点 A 移动到标记点 C 时 X 的移动距离和 Y 的移动距离 | ```json { "ParamOf4Points": [85.0, 70.0] } ``` ### 上位机 N 号点标定请求 **命令字:** `0x3701` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | pointNum | int | 范围[0,3],标定点编号 | | status | int | 范围[0,1],标定状态。0表示取消标定,1表示标定 | ```json { "pointNum": 0, "status": 1 } ``` ### 控制器回复上位机 N 号点标定位置信息 **命令字:** `0x3702` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | pointNum | int | 范围[0,3],标定点编号 | | pos | double[] | 长度为4,位置信息列表 | ```json { "pointNum": 0, "pos": [0.0, 0.0, 0.0, 0.0] } ``` ### 控制器回复上位机标定计算结果 **命令字:** `0x3703` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | dtheta | double[] | 长度为2,轴零点偏移列表。值全为-1表示计算失败 | | length | double[] | 长度为2,杆长度列表。值全为-1表示计算失败 | | result | bool | 是否计算成功 | ```json { "dtheta": [-1.0, -1.0], "length": [-1.0, -1.0], "result": false } ``` ### 上位机请求将计算结果填入 DH 参数 **命令字:** `0x3704` ```json {} ``` ### 控制器回复上位机填入 DH 参数结果 **命令字:** `0x3705` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | apply | bool | 计算结果填入是否成功 | ```json { "apply": true } ``` ### 上位机查询标定信息 **命令字:** `0x3706` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | dtheta | double[] | 长度为2,轴零点偏移列表。null 表示没有计算结果 | | length | double[] | 长度为2,杆长度列表。null 表示没有计算结果 | | result | bool | 是否计算成功 | | status | int[] | 点位标定状态列表。0表示未标定,1表示已标定 | ```json { "dtheta": [null, null], "length": [null, null], "result": false, "status": [0, 1, 0, 1] } ``` ## 20点标定 说明:一种用于校准机器人的方法,通过在特定的20个点上进行标定,以确保机器人的准确性和稳定性。 ### 上位机标定计算请求 **命令字:** `0x3710` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | noCalZero | bool | 是否为校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "noCalZero": false, "robot": 1, "tool": 1 } ``` ### 上位机标定 N 号点请求 **命令字:** `0x3711` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 1, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机 N 号点标定信息 **命令字:** `0x3712` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | position | double[] | 标定点关节坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrationType": 20, "point": 1, "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ### 控制器回复上位机标定计算完成结果 **命令字:** `0x3713` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | distance | double | 标定计算结果。结果为-1表示计算失败,结果>10则请重新标定 | | result | bool | 标定计算是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "distance": 464.473876425245, "result": true, "robot": 1 } ``` ### 上位机发送设置标定结果为零点 **命令字:** `0x3714` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 12, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机标定结果为零点设置结果 **命令字:** `0x3715` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | apply | bool | 设置为零点是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "apply": true, "robot": 1 } ``` ### 上位机查询全部点标定状态 **命令字:** `0x3716` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手号 | ```json { "calibrationType": 20, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机全部点标定状态 **命令字:** `0x3717` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | status | int[] | 点位标定状态列表。1表示已标定,0表示未标定。长度为当前使用标点法 | ```json { "calibrationType": 20, "robot": 1, "status": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] } ``` ### 上位机请求清除 N 号点标定状态 **命令字:** `0x3718` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 范围[0,20],标定点编号。20表示清除所有点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 20, "robot": 1, "tool": 1 } ``` ### 上位机查询 N 号点位置信息 **命令字:** `0x3719` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 1, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机 N 号点位置信息 **命令字:** `0x371A` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | position | double[] | 标定点关节坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrationType": 20, "point": 1, "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ### 上位机请求移动到计算结果位置 **命令字:** `0x371B` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人号 | ```json { "robot": 1 } ``` ### 上位机查询是否可以打开标定页面 **命令字:** `0x371C` ```json {} ``` ### 控制器回复上位机是否可以打开标定页面 **命令字:** `0x371D` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | canCalibration | bool | 上位机是否可以打开标定页面 | ```json { "canCalibration": true } ``` ## 外部轴标定 说明:包含有旋转轴标定和直线轴(地轨)协同参数。 ### 上位机外部旋转轴标定计算请求 **命令字:** `0x3730` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateNum | int | 范围[1,3],当前轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrateNum": 1, "robot": 1 } ``` ### 上位机外部轴标定 N 号点请求 **命令字:** `0x3731` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[1,3],当前轴组号 | | pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 1, "pointNum": 0, "robot": 1 } ``` ### 控制器回复上位机外部轴 N 号点标定信息 **命令字:** `0x3732` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[1,3],当前轴组号 | | pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] | | pos | double[] | 标定点直角坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 1, "pointNum": 0, "pos": [470.746, 0.0, 817.334, 3.14159265359, 0.0, 0.0], "robot": 1 } ``` ### 控制器回复上位机外部轴标定计算结果 **命令字:** `0x3733` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | result | bool | 外部轴标定计算是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "result": true, "robot": 1 } ``` ### 上位机查询机器人绑定外部轴标定状态 **命令字:** `0x3734` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复上位机机器人绑定外部轴标定状态 **命令字:** `0x3735` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool[] | 长度为3,机器人绑定外部轴标定状态。true 表示已标定,false 表示未标定 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrateResult": [false, false, false], "robot": 1 } ``` ### 上位机设置当前协作外部轴组号 **命令字:** `0x3736` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[0,2],协作外部轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 0, "robot": 1 } ``` ### 上位机查询当前协作外部轴组号 **命令字:** `0x3737` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复上位机当前协作外部轴组号 **命令字:** `0x3738` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[0,2],协作外部轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 0, "robot": 1 } ``` ### 上位机设置地轨协同参数 **命令字:** `0x3739` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool | 地轨是否协同。协同:当启用地址是确定 | | conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。超过当前轴数的部分默认为1.0 | | trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。超过当前轴数的部分默认为0 | ```json { "calibrateResult": true, "conversionRatio": [58.0, 1.0, 1.0], "trackMap": [1, 0, 0] } ``` ### 上位机查询当前机器人地轨协同参数 **命令字:** `0x373A` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复当前机器人地轨协同参数 **命令字:** `0x373B` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool | 地轨是否协同 | | conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。初始化为9999 | | robot | int | 当前机器人号 | | trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。初始化为0 | ```json { "calibrateResult": false, "conversionRatio": [9999, 9999, 9999], "robot": 1, "trackMap": [0, 0, 0] } ``` ### 上位机发送设置外部轴标定结果 **命令字:** `0x373C` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | | resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 | ```json { "syncPositionerNum": 1, "resultArray": [ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] } ``` ### 上位机查询外部轴标定结果 **命令字:** `0x373D` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | ```json { "syncPositionerNum": 1 } ``` ### 控制器回复上位机外部轴标定结果 **命令字:** `0x373E` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | | calibrateResult | bool | 外部轴标定计算结果 | | resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 | ```json { "syncPositionerNum": 1, "calibrateResult": false, "resultArray": [ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] } ``` ### 上位机发送设置地轨方向校准系数 **命令字:** `0x373F` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` ### 上位机查询地轨方向校准系数 **命令字:** `0x3740` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | ```json { "axis_num": 1 } ``` ### 控制器回复地轨方向校准系数 **命令字:** `0x3741` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` ### 上位机标定轴 N 号点请求 **命令字:** `0x3742` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | | point_num | int | 范围[1,2],当前标定点编号 | ```json { "axis_num": 1, "point_num": 1 } ``` ### 上位机请求地轨移动到标记点 **命令字:** `0x3743` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | | point_num | int | 范围[1,2],当前标定点编号 | ```json { "axis_num": 1, "point_num": 1 } ``` ### 上位机地轨标定点计算请求 **命令字:** `0x3744` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | ```json { "axis_num": 1 } ``` ### 控制器回复上位机标定计算结果 **命令字:** `0x3745` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` --- ## 标定算法参数 ### 四点标定算法 四点标定通过四个已知位置的标定点,利用几何关系计算出机器人杆长和轴零点偏移。 #### 算法原理 1. 机器人末梢移动到四个标定点(标记点 A, B, C, D) 2. 通过最小二乘法求解杆长 L1, L2 和轴零点偏移 dtheta1, dtheta2 3. 计算结果可填入 DH 参数,修正运动学模型 #### 算法参数 (ParamOf4Points) | 参数 | 说明 | 单位 | |------|------|------| | L1 | 机器人末梢从标记点A移动到C时X方向移动距离 | mm | | L2 | 机器人末梢从标记点A移动到C时Y方向移动距离 | mm | ### 20点标定算法 20点标定通过在不同姿态下的大量采样点,利用非线性优化算法求解完整的运动学参数。 #### 优化目标 最小化所有标定点的位置误差:min sum(||P_actual_i - P_target||) 其中 P_actual_i 是第 i 个标定点的实际位置,P_target 是标记点位置。 #### 收敛条件 | 条件 | 阈值 | 说明 | |------|------|------| | 标定距离 | < 10mm | 标定计算结果 distance < 10 表示标定成功 | | 计算成功 | result=true | 优化算法成功收敛 | #### 标定点方法选择 | calibrationType | 方法 | 标定点数 | 校准内容 | 适用场景 | |-----------------|------|----------|----------|----------| | 2 | 2点法 | 2 | 简单校准 | 快速校准 | | 12 | 12点法 | 12 | 零点+工具手 | 未激光标定+焊枪 | | 15 | 15点法 | 15 | 零点+工具手(精确) | 高精度场景 | | 20 | 20点法(校准零点) | 20 | 零点+工具手 | 零点丢失 | | 21 | 21点法(不校准零点) | 21 | 仅工具手 | 零点已校准 | ### 标定算法参数调节 | 参数 | 说明 | 推荐值 | |------|------|--------| | 标定点分布 | 标定点应覆盖尽可能大的工作空间 | 全工作空间的60%以上 | | 姿态多样性 | 各标定点的姿态应有明显差异 | 各轴角度变化 > 20度 | | 参考点稳定性 | 参考点在标定过程中不允许移动 | 固定偏差 < 0.1mm | --- ## 自动标定流程 ### 四点标定流程 #### 标定步骤 1. **准备阶段** - 确认机器人处于手动/示教模式 - 安装标定工具(如标定锥) - 设置固定参考点 2. **标定阶段** - 移动机器人末梢到标记点 A,发送标定请求(0x3701, pointNum=0, status=1) - 沿 X 方向移动 L1 距离到标记点 C,发送标定请求(0x3701, pointNum=2, status=1) - 沿 Y 方向移动 L2 距离到标记点 B,发送标定请求(0x3701, pointNum=1, status=1) - 移动机器人末梢到标记点 D,发送标定请求(0x3701, pointNum=3, status=1) 3. **计算阶段** - 发送标定计算请求(0x3700),传入 ParamOf4Points=[L1, L2] - 控制器返回计算结果(0x3703),包含杆长 length 和零点偏移 dtheta - 检查 result 是否为 true,dtheta 和 length 是否不为 -1 4. **应用阶段** - 如认可结果,发送填入 DH 参数请求(0x3704) - 控制器返回应用结果(0x3705) #### 标定数据流 标定点1~4 -> 几何计算 -> 杆长 L1+L2 + 零点偏移 dtheta1+dtheta2 -> 填入 DH 参数 -> 验证 ### 20点标定流程 #### 标定步骤 1. **准备阶段** - 设置参考点(固定标记点) - 选择标定方法类型 (calibrationType=20) - 选择工具手编号 2. **标定阶段(循环20次)** - 移动机器人到第 i 个标定点 - 发送标定请求(0x3711, point=i) - 控制器返回标定点信息(0x3712) 3. **计算阶段** - 全部20点标定完成后,发送计算请求(0x3710) - 控制器返回计算结果(0x3713),包含 distance 和 result - 检查 result=true 且 distance < 10 4. **应用阶段** - 如认可结果,发送设置为零点请求(0x3714) - 控制器返回设置结果(0x3715) #### 标定状态查询 可随时查询各标定点的完成情况: - 查询全部点状态(0x3716/0x3717): 返回 status 数组,1=已标定,0=未标定 - 查询 N 号点位置(0x3719/0x371A): 返回该点的关节坐标 ### 外部轴标定流程 #### 旋转轴标定 1. 设置协作外部轴组号(0x3736) 2. 移动机器人到标定点1,发送标定请求(0x3731, pointNum=0) 3. 旋转外部轴到不同角度,移动机器人到标定点2~5,逐一标定 4. 发送计算请求(0x3730)获取标定结果(0x3733) #### 地轨标定 1. 设置地轨协同参数(0x3739):包含转换比(conversionRatio)和各轴方向(trackMap) 2. 移动地轨到标记点1,发送标定请求(0x3742, point_num=1) 3. 移动地轨到标记点2,发送标定请求(0x3742, point_num=2) 4. 发送计算请求(0x3744)获取方向校准系数(0x3745) ### 自动标定安全检查 | 检查项 | 方法 | 标准 | |--------|------|------| | 参考点固定 | 标定前后检查参考点位置 | 偏差 < 1mm | | 碰撞风险 | 标定路径上无障碍物 | 手动确认路径安全 | | 伺服状态 | 标定前确认伺服开启 | 各轴伺服正常 | | 急停可用 | 确保急停按钮可用 | 紧急情况可中断 | --- # 干涉区 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/09.%E5%B9%B2%E6%B6%89%E5%8C%BA.html ## 概述 干涉区是用于多机器人协作或机器人与外部设备交互时,防止碰撞的安全区域机制。通过定义笛卡尔空间中的矩形区域,控制器可以实时监控机器人末端/工具是否进入或离开指定的干涉区,并根据配置执行相应的动作(状态输出或禁止运动)。 --- ## 干涉区概念 ### 干涉区定义 干涉区是笛卡尔空间中的一个**轴对齐矩形区域(AABB)**,由最小坐标点 (minX, minY, minZ) 和最大坐标点 (maxX, maxY, minZ) 定义。控制器实时计算机器人末端(TCP)位置,判断其是否在干涉区内。 ### 干涉区类型 | 类型 | workType 值 | 说明 | 典型应用 | |------|------------|------|----------| | 状态输出 | 0 | 机器人在区域内时输出 IO 信号 | 通知外部设备机器人已到达工作区域 | | 禁止运动 | 1 | 机器人在区域内时禁止运动 | 防止两台机器人进入对方的作业空间 | ### 区域判断 | 判断方式 | isInInterfer 值 | 说明 | |----------|----------------|------| | 在区域内 | 1 | 当机器人末端在区域内时触发 | | 在区域外 | 0 | 当机器人末端在区域外时触发 | ### 干涉区应用场景 1. **多机器人协作**:定义各机器人的专属工作区域,防止同时进入同一区域 2. **机器人与外部设备**:定义设备的安全区域,机器人进入时降低速度或停止 3. **工位管理**:定义不同工位的边界,通过 IO 信号通知 PLC 机器人的位置 4. **安全围栏**:定义虚拟围栏,机器人越界时停止运动 --- ## 干涉区数量与编号 - 每个机器人支持最多 **99 个干涉区**(工艺号 1-99) - 每个干涉区独立配置,互不影响 - 干涉区坐标系基于**当前选中的用户坐标系** --- ## 干涉区范围 ### 上位机设置干涉区范围 **命令字:** `0x3800` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 工艺号 | | param | object | - | 干涉区参数 | | robot | int | [1,4] | 当前机器人号 | **param 参数:** | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | varName | string | GB001-GB999 | 用于干涉区输出值 | | enable | bool | - | 干涉区使能 | | isInInterfer | int | [0,1] | 在区域内/外:0表示在区域外,1表示在区域内 | | maxX | double | [-9999,9999] mm | 最大 X | | maxY | double | [-9999,9999] mm | 最大 Y | | maxZ | double | [-9999,9999] mm | 最大 Z | | minX | double | [-9999,9999] mm | 最小 X | | minY | double | [-9999,9999] mm | 最小 Y | | minZ | double | [-9999,9999] mm | 最小 Z | | port | int | - | 输出 IO 端口 | | value | int | [0,1] | 输出参数 | | workType | int | [0,1] | 起作用方式:0表示状态输出,1表示禁止运动 | **示例:** ```json { "num": 1, "param": { "enable": false, "isInInterfer": 1, "maxX": "1101.05", "maxY": "183.569", "maxZ": "1024.13", "minX": "833.956", "minY": "-173.017", "minZ": "944.358", "port": 0, "value": 0, "workType": 0 }, "robot": 1 } ``` ### 配置建议 - `minX` < `maxX`,`minY` < `maxY`,`minZ` < `maxZ`,否则干涉区无效 - 干涉区应设置在机器人可达工作空间内 - 多个干涉区可以重叠,重叠区域的判断结果取并集 --- ### 上位机查询干涉区范围 **命令字:** `0x3801` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "robot": 1 } ``` --- ### 控制器回复上位机干涉区参数/干涉点标记结果 **命令字:** `0x3802` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 工艺号 | | param | object | - | 干涉区参数 | | robot | int | [1,4] | 当前机器人号 | **param 参数:** | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | calibrationState1 | int | [0,1] | 标记点1是否标定:0表示未标定,1表示已标定 | | calibrationState2 | int | [0,1] | 标记点2是否标定:0表示未标定,1表示已标定 | | enable | bool | - | 干涉区使能 | | isInInterfer | int | [0,1] | 在区域内/外:0表示在区域外,1表示在区域内 | | maxX | double | [-9999,9999] mm | 最大 X | | maxY | double | [-9999,9999] mm | 最大 Y | | maxZ | double | [-9999,9999] mm | 最大 Z | | minX | double | [-9999,9999] mm | 最小 X | | minY | double | [-9999,9999] mm | 最小 Y | | minZ | double | [-9999,9999] mm | 最小 Z | | point1Data | double[] | - | 标记点1标记位置信息列表 | | point2Data | double[] | - | 标记点2标记位置信息列表 | | port | int | - | 输出 IO 端口 | | value | int | [0,1] | 输出参数 | | workType | int | [0,1] | 起作用方式:0表示状态输出,1表示禁止运动 | **示例:** ```json { "num": 1, "param": { "calibrationState1": 0, "calibrationState2": 0, "enable": false, "isInInterfer": 1, "maxX": "1101.05", "maxY": "183.569", "maxZ": "1024.13", "minX": "833.956", "minY": "-173.017", "minZ": "944.358", "point1Data": [0, 0, 0, 0, 0, 0], "point2Data": [0, 0, 0, 0, 0, 0], "port": 0, "value": 0, "workType": 0 }, "robot": 1 } ``` --- ## 干涉点 ### 干涉点概念 干涉点用于辅助定义干涉区的位置。通过示教标记两个对角点(标记点1和标记点2),控制器可以自动计算干涉区的边界范围。这是一种便捷的干涉区定义方式。 ### 标记点标定流程 1. 通过 `0x3810` 发送标记请求,指定标记点号 (1 或 2) 2. 手动将机器人移动到目标位置 3. 控制器记录当前位置作为标记点 4. 完成两个标记点后,通过 `0x3811` 请求计算干涉区范围 --- ### 上位机请求标记干涉点 **命令字:** `0x3810` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | calibrationState1 | int | [0,1] | 标记点1状态:0表示进行标定,1表示取消标定 | | calibrationState2 | int | [0,1] | 标记点2状态:0表示进行标定,1表示取消标定 | | num | int | [1,99] | 工艺号 | | pos | int | [1,2] | 标记点号:1表示标记点1,2表示标记点2 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "calibrationState1": 1, "calibrationState2": 1, "num": 1, "pos": 1, "robot": 1 } ``` --- ### 上位机请求标记完成计算 **命令字:** `0x3811` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "robot": 1 } ``` --- ### 上位机请求移动到标记点 **命令字:** `0x3812` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | pos | int | [1,2] | 需要移动到的标记点号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "pos": 1, "robot": 1 } ``` --- # 跟随误差&电机过载保护 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/10.%E8%B7%9F%E9%9A%8F%E8%AF%AF%E5%B7%AE&%E7%94%B5%E6%9C%BA%E8%BF%87%E8%BD%BD%E4%BF%9D%E6%8A%A4.html ## 概述 跟随误差和电机过载保护是机器人运动控制中的关键安全监测机制。本章说明跟随误差的概念、监测参数设置、电机过载保护配置以及速度碰撞检测功能。 --- ## 跟随误差概念 ### 什么是跟随误差 **跟随误差**是指控制器下发的**指令位置**与伺服驱动器反馈的**实际位置**之间的偏差。它是衡量伺服系统跟踪性能的核心指标。 - **静态误差**:机器人静止时的指令位置与实际位置偏差 - **动态误差**:机器人运动时的指令位置与实际位置偏差 ### 跟随误差过大的原因 | 原因 | 说明 | 排查方向 | |------|------|----------| | 负载过重 | 电机输出扭矩不足以驱动负载 | 减轻负载或调整加减速参数 | | 加减速过大 | 指令加速度超过电机能力 | 降低加速度参数 | | 机械卡滞 | 机械传动部分存在阻力 | 检查减速机、导轨等机械部件 | | 伺服参数不当 | 伺服增益等参数设置不合理 | 调整伺服 PID 参数 | | 编码器故障 | 编码器反馈异常 | 检查编码器连接和状态 | ### 跟随误差保护机制 当跟随误差超过设定的**最大跟随误差上限**时,控制器将: 1. 立即停止当前运动(紧急停止) 2. 上报跟随误差过大错误(kind=2) 3. 需要清除错误后才能重新使能 --- ## 1. 最大跟随误差上限 ### 1.1 上位机设置最大跟随误差参数上限 **命令字:** `0x3860` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | maxDynamicDeviations | int[6] | 最大动态误差 | [1, 2×10⁷] ‱° | | maxStaticDeviations | int[6] | 最大静态误差 | [1, 2×10⁷] ‱° | > **单位说明:** ‱° 表示万分之一度(0.0001°),例如 5000000 表示 500° 的跟随误差阈值。 **请求示例:** ```json { "maxDynamicDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000], "maxStaticDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000] } ``` ### 参数配置建议 - **动态误差**通常设置为**静态误差的 2-5 倍**,因为运动时允许更大的跟随偏差 - 对于**高精度应用**(如激光切割),应设置更小的跟随误差阈值 - 对于**重负载应用**,可适当增大阈值以避免频繁触发保护 - **各轴独立设置**,通常 J1-J3 轴负载较大,可设置较大阈值 --- ### 1.2 上位机查询最大跟随误差参数上限 **命令字:** `0x3861` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 1.3 控制器回复上位机最大跟随误差参数上限 **命令字:** `0x3862` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | maxDynamicDeviations | int[6] | 最大动态误差 | [1, 2×10⁷] ‱° | | maxStaticDeviations | int[6] | 最大静态误差 | [1, 2×10⁷] ‱° | | robot | int | 当前机器人号 | [1, 4] | **响应示例:** ```json { "maxDynamicDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000], "maxStaticDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000], "robot": 1 } ``` --- ## 2. 当前跟随误差(监控) ### 2.1 上位机查询当前跟随误差 **命令字:** `0x3870` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 2.2 控制器回复上位机当前跟随误差 **命令字:** `0x3871` **参数列表:** | 参数名 | 类型 | 说明 | 维度 | |--------|------|------|------| | curDeviations | double[7] | 当前机器人误差列表 | 单位 ‱° | | curExternalDeviations | double[5] | 当前外部轴误差列表 | 单位 ‱° | | maxDeviations | double[7] | 最大机器人误差列表 | 单位 ‱° | | maxExternalDeviations | double[5] | 最大外部轴误差列表 | 单位 ‱° | | robot | int | 当前机器人号 | [1, 4] | > **说明:** `maxDeviations` 记录的是历史最大误差值,可用于分析运动过程中的峰值误差。 **响应示例:** ```json { "curDeviations": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "curExternalDeviations": [0.0, 0.0, 0.0, 0.0, 0.0], "maxDeviations": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "maxExternalDeviations": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- ## 3. 电机过载保护 ### 功能说明 电机过载保护用于监测电机扭矩是否长时间超出安全范围。当电机扭矩持续超过设定的 `robotLimit` 值超过 `minLimiteTime` 时间时,触发过载保护。 ### 保护机制 1. 实时监测各轴电机扭矩 2. 当扭矩超过 `robotLimit` 时开始计时 3. 持续时间超过 `minLimiteTime` 则触发过载保护 4. 停止运动并上报过载错误 --- ### 3.1 上位机设置电机过载保护参数 **命令字:** `0x3880` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | enable | bool | 电机过载保护使能 | true/false | | minLimiteTime | int | 电机过载保护最小确认时间 | [10, 9999] ‰ | | robotLimit | int[6] | 电机扭矩过载值列表 | [0, 9999) ‰ 或 mNm | | robot | int | 当前机器人号 | [1, 4] | > **单位说明:** `minLimiteTime` 单位为千分之一秒(‰),如 10 表示 10ms。`robotLimit` 为相对于电机额定扭矩的千分比。 **请求示例:** ```json { "enable": false, "minLimiteTime": 10, "robot": 1, "robotLimit": [999, 999, 999, 999, 999, 999] } ``` --- ### 3.2 上位机查询电机过载保护参数 **命令字:** `0x3881` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 3.3 控制器回复上位机电机过载保护参数 **命令字:** `0x3882` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | enable | bool | 电机过载保护使能 | true/false | | minLimiteTime | int | 电机过载保护最小确认时间 | [10, 9999] ‰ | | robotLimit | int[6] | 电机扭矩过载值列表 | [0, 9999) ‰ 或 mNm | | robot | int | 当前机器人号 | [1, 4] | **响应示例:** ```json { "enable": false, "minLimiteTime": 10, "robot": 1, "robotLimit": [999, 999, 999, 999, 999, 999] } ``` --- ## 4. 伺服速度碰撞检测 ### 功能说明 速度碰撞检测通过监测伺服电机的实际速度与指令速度的偏差来判断是否发生碰撞。当实际速度与指令速度的偏差超过允许范围并持续一定时间时,判定为碰撞发生。 ### 工作原理 - 控制器持续比较**指令速度**与**实际速度** - 计算速度偏差 = |实际速度 - 指令速度| - 当速度偏差 > `speed_enable_error` 且持续时间 > `speed_delay_time` 时触发碰撞检测 --- ### 4.1 设置伺服速度碰撞检测参数 **命令字:** `0x40A0` **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | switch | bool | 速度碰撞检测开关 | | speed_delay_time | int | 伺服速度延迟时间 | | speed_enable_error | double | 伺服速度允许误差 | **请求示例:** ```json { "switch": true, "speed_delay_time": 10, "speed_enable_error": 10 } ``` --- ### 4.2 上位机获取伺服速度碰撞检测参数 **命令字:** `0x40A1` **参数列表:** 无 --- ### 4.3 控制器回复伺服速度碰撞检测参数 **命令字:** `0x40A2` **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | switch | bool | 速度碰撞检测开关 | | speed_delay_time | int | 伺服速度延迟时间 | | speed_enable_error | double | 伺服速度允许误差 | **响应示例:** ```json { "switch": true, "speed_delay_time": 10, "speed_enable_error": 10 } ``` --- # 动力学 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/11.%E5%8A%A8%E5%8A%9B%E5%AD%A6.html ### 负载使能 - 说明 - 力矩拖拽时需要打开负载使能并修改实际力矩转换比 - 实际力矩转换比为从 Nm 单位的值转换为伺服0x6077的值的比例关系,该比例关系通常由伺服厂家提供 - 传感器参数由传感器厂家提供,质心 X 和质心 Y 通常为0,质心 Z 为传感器高度的一半 - 上位机设置负载使能参数 **命令字:** `0x4000` - "axis1_actual_torq_conversion_ratio":8.5470 - 一轴实际力矩转换比;double 类型 - "axis2_actual_torq_conversion_ratio":8.6960 - 二轴实际力矩转换比;double 类型 - "axis3_actual_torq_conversion_ratio":10.0 - 三轴实际力矩转换比;double 类型 - "axis4_actual_torq_conversion_ratio":10.0 - 四轴实际力矩转换比;double 类型 - "axis5_actual_torq_conversion_ratio":10.0 - 五轴实际力矩转换比;double 类型 - "axis6_actual_torq_conversion_ratio":10.0 - 六轴实际力矩转换比;double 类型 - "payload_enable":false ```json { "axis1_actual_torq_conversion_ratio":8.5470, "axis2_actual_torq_conversion_ratio":8.6960, "axis3_actual_torq_conversion_ratio":10.0, "axis4_actual_torq_conversion_ratio":10.0, "axis5_actual_torq_conversion_ratio":10.0, "axis6_actual_torq_conversion_ratio":10.0, "payload_enable":false } ``` - 负载使能;bool 类型 - 上位机查询负载使能参数 ```json {} ``` **命令字:** `0x4001` - 控制器回复上位机负载使能参数 ### 查询负载使能参数(实际力矩转换比) **命令字:** `0x4002` **控制器回复** | 字段 | 类型 | 说明 | |------|------|------| | axis1_actual_torq_conversion_ratio | double | 一轴实际力矩转换比 | | axis2_actual_torq_conversion_ratio | double | 二轴实际力矩转换比 | | axis3_actual_torq_conversion_ratio | double | 三轴实际力矩转换比 | | axis4_actual_torq_conversion_ratio | double | 四轴实际力矩转换比 | | axis5_actual_torq_conversion_ratio | double | 五轴实际力矩转换比 | | axis6_actual_torq_conversion_ratio | double | 六轴实际力矩转换比 | | payload_enable | bool | 负载使能 | ```json { "axis1_actual_torq_conversion_ratio": 8.5470, "axis2_actual_torq_conversion_ratio": 8.6960, "axis3_actual_torq_conversion_ratio": 10.0, "axis4_actual_torq_conversion_ratio": 10.0, "axis5_actual_torq_conversion_ratio": 10.0, "axis6_actual_torq_conversion_ratio": 10.0, "payload_enable": false } ``` - 负载使能;bool 类型 - 上位机设置负载使能工艺号 **命令字:** `0x4003` - "payload_num":1 ```json { "payload_num":1 } ``` - 负载使能工艺号;int 类型 - 控制器回复上位机负载使能工艺号 **命令字:** `0x4004` - "payload_num":1 ```json { "payload_num":1 } ``` ### 外部按键 - 负载使能工艺号;int 类型 - 说明 - 可通过 IO 触发相应的功能,按队列顺序分别为拖拽模式、点动模式、开始轨迹采集、结束轨迹采集、开始轨迹回放、停止轨迹回放、上使能、下使能、夹爪开、夹爪关、保存轨迹、快捷指令1、快捷指令2、快捷指令3、快捷指令4、快捷指令5 - 快捷指令范围[0,9],0表示未选择,1表示点到点指令,2表示直线指令,3表示圆弧指令,4表示整圆指令,5表示曲线指令,6表示焊接开始指令,7表示焊接结束指令,8表示摆焊开始指令,9表示摆焊结束指令 - 上位机查询功能控制参数 ```json {} ``` **命令字:** `0x4020` - 控制器回复上位机功能控制参数 **命令字:** `0x4021` - "IoInPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "fastCommand":[0,0,0,0,0] - 快捷指令功能选择列表;int 类型,范围[0,9] - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "isClearTrack":0 - 保存后清除轨迹;int 类型,范围[0,1] - 0表示清除,1表示不清除 - "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发参数列表;int 类型,范围[0,1] - "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发方式列表;int 类型,范围[0,2] - 0表示长按,1表示短按,2表示置位 - "craft":{ - "weldBeadSize":2 - 多层多道焊当前焊道数;int 类型;取值范围:1-99 - "dragTeachSelectCraft":0 ```json { "IoInPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "fastCommand":[0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "isClearTrack":0, "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "craft": { "weldBeadSize":2 }, "dragTeachSelectCraft":0 } ``` - 拖拽示教工艺选择;int 类型;取值范围[0,1] - 上位机查询状态提示参数 ```json {} ``` **命令字:** `0x4022` - 控制器回复上位机状态提示参数 **命令字:** `0x4023` - "IoDoutPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "parameterArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ```json { "IoDoutPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` - 端口触发参数列表;int 类型,范围[0,2] - 0表示0,1表示1,2表示闪烁 - 上位机设置功能控制或状态提示参数 **命令字:** `0x4024` - "_isFunctionalControl":true - 是否为功能控制参数;bool 类型 - true 表示设置功能控制参数,false 表示设置状态提示参数 - "fastCommand":[0,0,0,0,0] - 快捷指令功能选择列表;int 类型,范围[0,9] - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "isClearTrack":0 - 保存后清除轨迹;int 类型,范围[0,1] - 0表示清除,1表示不清除 - "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发方式列表;int 类型,范围[0,2] - 分别表示"长按""短按""置位" - "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发参数列表;int 类型 - 功能控制时范围[0,1] - 状态提示参数时范围[0,2],2表示"闪烁" - "portArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "dragTeachSelectCraft":0 ```json { "_isFunctionalControl":true, "fastCommand":[0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "isClearTrack":0, "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "portArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "dragTeachSelectCraft":0 } ``` - 拖拽示教工艺选择;int 类型;取值范围[0,1] - 控制器发送快捷插入指令 **命令字:** `0x4025` - "fastCommandSelectd":1 - 已选择快捷功能;int 类型,范围[0,9] - 取值在[1,5]时"pos"和"posture"节点存在 - "name":11 - 快捷功能号;int 类型,范围[11,15] - 分别表示快捷功能1~5 - "pos":[0.0,0.0,0.0,0.0,0.0,0.0,0.0] - 插入指令位置信息列表;double 类型 - 长度为7 - "posture":8 ```json { "fastCommandSelectd":1, "name":11, "pos":[0.0,0.0,0.0,0.0,0.0,0.0,0.0], "posture":8 } ``` ### 动力学参数 - 插入指令位置姿态;int 类型,范围[0,9] - 说明 - 需要进行力矩拖拽时必须先进行一次动力学辨识 - 上位机设置动力学参数 **命令字:** `0x4030` - "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0] - 动力学参数列表;double 类型 - 第1位表示质量,第2位表示质心 X,第3位表示质心 Y,第4位表示质心 Z,第5位表示惯性张量 XX,第6位表示惯性张量 XY,第7位表示惯性张量 XZ,第8位表示惯性张量 YY,第9位表示惯性张量 YZ,第10位表示惯性张量 ZZ,第11位表示动摩擦系数,第12位表示静摩擦系数 - "joint_num":6 ```json { "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0], "joint_num":6 } ``` - 机器人轴数;int 类型 - 上位机查询动力学参数 ```json {} ``` **命令字:** `0x4031` - 控制器回复上位机动力学参数 **命令字:** `0x4032` - "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0] - 动力学参数列表;double 类型 - 第1位表示质量,第2位表示质心 X,第3位表示质心 Y,第4位表示质心 Z,第5位表示惯性张量 XX,第6位表示惯性张量 XY,第7位表示惯性张量 XZ,第8位表示惯性张量 YY,第9位表示惯性张量 YZ,第10位表示惯性张量 ZZ,第11位表示动摩擦系数,第12位表示静摩擦系数 - "joint_num":6 ```json { "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0], "joint_num":6 } ``` - 机器人轴数;int 类型 - 上位机请求参数辨识 ```json {} ``` **命令字:** `0x4033` - 控制器回复上位机参数辨识结果 **命令字:** `0x4034` - "finish":false ```json { "finish":false } ``` - 辨识结束;bool 类型 - 上位机请求开始辨识 ```json {} ``` **命令字:** `0x4035` - 控制器回复上位机辨识误差值 **命令字:** `0x4036` - "error":[0.0,0.0,0.0,0.0,0.0,0.0] ```json { "error":[0.0,0.0,0.0,0.0,0.0,0.0] } ``` - 转矩误差列表;double 类型 - 控制器回复上位机辨识结果 **命令字:** `0x4037` - "finish":1 ```json { "finish":1 } ``` - 辨识结果;int 类型 - 控制器辨识过程中错误停止发送给上位机 **命令字:** `0x4038` - "ErrorStop":1 ```json { "ErrorStop":1 } ``` ### 负载辨识 - 错误停止;int 类型 - 上位机请求负载辨识数据 **命令字:** `0x4040` - data:无 - 上位机请求辨识计算负载质量和质心 **命令字:** `0x4041` - data:无 - 上位机请求辨识计算惯量 **命令字:** `0x4042` - data:无 - 控制器回复负载辨识结果(负载质量和质心 / 惯量) 或负载数据 **命令字:** `0x4043` - "result":true - 负载辨识结果;bool 类型; - true:负载辨识成功(显示数据);false:负载辨识失败 - "mass":3.6 - 质量;double 类型;kg - "massCenterX":0.53 - 质心 X;double 类型;m - "massCenterY":2.3 - 质心 Y;double 类型;m - "massCenterZ":1.3 - 质心 Z;double 类型;m - "Ixx":0.0 - 惯量 X;double 类型;kg·m² - "Iyy":0.0 - 惯量 Y;double 类型;kg·m² - "Izz":0.0 ```json { "result":true, "mass":3.6, "massCenterX":0.53, "massCenterY":2.3, "massCenterZ":1.3, "Ixx":0.0, "Iyy":0.0, "Izz":0.0 } ``` - 惯量 Z;double 类型;kg·m² - 上位机请求保存负载数据到对应工具手 **命令字:** `0x4044` - "targetTool":1 ```json { "targetTool":1 } ``` - 需要保存到工具手号;int 类型;取值范围[1,999] - 控制器回复保存负载数据到对应工具手 **命令字:** `0x4045` - "result":true ```json "result":true ``` - 保存是否成功;bool 类型 - true:保存成功;false:保存失败 - 上位机请求空载辨识 **命令字:** `0x4046` - data:无 - 控制器回复回应空载辨识 **命令字:** `0x4047` - "result":true ```json { "result":true } ``` - 空载辨识结果;bool 类型; - true:空载辨识成功;false:空载辨识失败 - 上位机请求下载空载配置文件数据 **命令字:** `0x4048` - data:无 - 控制器回复下载空载配置文件数据 **命令字:** `0x4049` - "name":"config/identification_xxxxx.json" ```json { "name":"config/identification_xxxxx.json" } ``` ### 软浮动参数 - 配置文件在控制器的路径;string 类型 - xxxx 为 bios 获取的时间 - 上位机获取软浮动参数 **命令字:** `0x404A` - "softfloat":{} - "num":0 ```json { "softfloat": { "num":0 } } ``` - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - 控制器回复软浮动参数 **命令字:** `0x404B` - "softfloat":{} - "num":0 - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - "percentage"[j][k]:[] - 含义对应 关节 直角 工具 用户;类型 int;范围 j(0-3) k(0-6) - 每种坐标系中分别的柔软度百分比(例:关节 j1 j2 j3 ...;直角 X Y Z A..) - "coord":0 - 含义对应 工艺号选择的坐标系类型(关节 直角 工具 用户); 类型 int;范围0-3 - "note":"xxxx" ```json { "softfloat": { "num":0, "percentage": [ [],[]...... ] "coord":0, "note":"xxxx" } } ``` - 含义注释;类型 string - 上位机发送设置软浮动参数 - 0x404C - "softfloat":{} - "num":0 - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - "percentage"[j]:[] - 含义对应 关节 直角 工具 用户;类型 int;范围 j(0-3) - 每种坐标系中分别的柔软度百分比 - "coord":0 - 含义对应 工艺号选择的坐标系类型(关节 直角 工具 用户); 类型 int;范围0-3 - "note":"xxxx" ```json { "softfloat": { "num":0, "percentage": [ ...... ] "coord":0, "note":"xxxx" } } ``` ### 安全状态 - 含义注释;类型 string - 上位机查询安全状态(测试辨识轨迹是否安全) ```json {} ``` **命令字:** `0x407A` - 控制器回复上位机安全状态 **命令字:** `0x407B` ```json { "finish":1 } ``` - "finish":1 - 辨识结果;int 类型 - 上位机请求设置辨识轨迹参数 **命令字:** `0x4077` - "traSize":10.0 - 辨识轨迹范围;int 类型,范围[1,100] - 第一次请填入较小数值 - "traVel":100.0 ```json { "traSize":10.0, "traVel":100.0 } ``` - 辨识轨迹速度;int 类型,范围[1,100] - 请先用低速测试安全,辨识用100 - 上位机查询辨识轨迹参数 ```json {} ``` **命令字:** `0x4078` - 控制器回复上位机辨识轨迹参数 **命令字:** `0x4079` - "alreadyIden":false - 是否已完成辨识;bool 类型 - "traSize":10.0 - 辨识轨迹范围;int 类型,范围[1,100] - "traVel":10.0 ```json { "alreadyIden":false, "traSize":10.0, "traVel":10.0 } ``` - 辨识轨迹速度;int 类型,范围[1,100] - 控制器回复上位机当前轨迹 Z 最值 **命令字:** `0x407C` - "zMax":636.712935786949 - 当前轨迹 Z 最大值;double 类型 - "zMin":505.396403159378 ```json { "zMax":636.712935786949, "zMin":505.396403159378 } ``` ### 自适应加减速 - 当前轨迹 Z 最小值;double 类型 - 说明 - 上位机设置自适应加减速阈值参数 **命令字:** `0x4050` - "Inertia_or_mass_or_both":[0,0,0,0,0,0] - 各轴限制条件列表;int 类型,范围[0,2] - 0表示"惯量",1表示"质量",2表示"并行" - "Load_or_center":[0,0,0,0,0,0] - 各轴参考点列表;int 类型,范围[0,1] - 0表示"负载",1表示"旋转中心" - "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]] - 各轴惯量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度的值 - "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴惯量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度的值 - "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], - 各轴质量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度的值 - "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴质量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度的值 - "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度对应惯量的值 - "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量加速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度对应惯量的值 - "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴质量速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度对应质量的值 - "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] ```json { "Inertia_or_mass_or_both":[0,0,0,0,0,0], "Load_or_center":[0,0,0,0,0,0], "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] } ``` - 各轴质量加速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度对应质量的值 - 上位机查询自适应加减速阈值参数 ```json {} ``` **命令字:** `0x4051` - 控制器回复上位机自适应加减速阈值参数 **命令字:** `0x4052` - "Inertia_or_mass_or_both":[0,0,0,0,0,0] - 各轴限制条件列表;int 类型,范围[0,2] - 0表示"惯量",1表示"质量",2表示"并行" - "Load_or_center":[0,0,0,0,0,0] - 各轴参考点列表;int 类型,范围[0,1] - 0表示"负载",1表示"旋转中心" - "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]] - 各轴惯量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度的值 - "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴惯量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度的值 - "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], - 各轴质量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度的值 - "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴质量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度的值 - "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度对应惯量的值 - "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量加速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度对应惯量的值 - "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴质量速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度对应质量的值 - "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] ```json { "Inertia_or_mass_or_both":[0,0,0,0,0,0], "Load_or_center":[0,0,0,0,0,0], "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] } ``` - 各轴质量加速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度对应质量的值 - 上位机设置自适应加减速参数 **命令字:** `0x4053` - "arm_inertia":[0.0,0.0,0.0] - 关节臂体惯量列表;double 类型,范围[0,99999.9]0.001kgm^2 - 分别表示为"关节1臂体惯量","关节2臂体惯量","关节3臂体惯量" - "auto_modify_acc_enable":false - 自适应加减速使能;bool 类型 - "joint1_mass":0.0 - 关节1质量;double 类型,范围[0,99999.9]kg - "joint1_mass_center_to_motor_distance":0.0 - 关节1质心到电机距离;double 类型,范围[0,99999.9]m - "joint2_mass":0.0 - 关节2质量;double 类型,范围[0,99999.9]kg - "joint2_mass_center_to_motor_distance":0.0 - 关节2质心到电机距离;double 类型,范围[0,99999.9]m - "joint4_mass":0.0 ```json { "arm_inertia":[0.0,0.0,0.0], "auto_modify_acc_enable":false, "joint1_mass":0.0, "joint1_mass_center_to_motor_distance":0.0, "joint2_mass":0.0, "joint2_mass_center_to_motor_distance":0.0, "joint4_mass":0.0 } ``` - 关节4质量;double 类型,范围[0,99999.9]kg - 上位机查询自适应加减速参数 ```json {} ``` **命令字:** `0x4054` - 控制器回复上位机自适应加减速参数 **命令字:** `0x4055` - "arm_inertia":[0.0,0.0,0.0] - 关节臂体惯量列表;double 类型,范围[0,99999.9]0.001kgm^2 - 分别表示为"关节1臂体惯量","关节2臂体惯量","关节3臂体惯量" - "auto_modify_acc_enable":false - 自适应加减速使能;bool 类型 - "joint1_mass":0.0 - 关节1质量;double 类型,范围[0,99999.9]kg - "joint1_mass_center_to_motor_distance":0.0 - 关节1质心到电机距离;double 类型,范围[0,99999.9]m - "joint2_mass":0.0 - 关节2质量;double 类型,范围[0,99999.9]kg - "joint2_mass_center_to_motor_distance":0.0 - 关节2质心到电机距离;double 类型,范围[0,99999.9]m - "joint4_mass":0.0 ```json { "arm_inertia":[0.0,0.0,0.0], "auto_modify_acc_enable":false, "joint1_mass":0.0, "joint1_mass_center_to_motor_distance":0.0, "joint2_mass":0.0, "joint2_mass_center_to_motor_distance":0.0, "joint4_mass":0.0 } ``` - 关节4质量;double 类型,范围[0,99999.9]kg - 上位机设置位置环比参数 **命令字:** `0x4056` - "Dynamic_sendServoParam":false - 位置环比发送使能;bool 类型 - "PositionalComparison": - 位置环比参数列表 - "inertiaMax":9999.0 - 惯量最大值;double 类型,范围(0,100000]0.001kgm^2 - "inertiaMin":8.0 - 惯量最小值;double 类型,范围[0,100000)0.001kgm^2 - 惯量最小值必须小于惯量最大值 - "max":8.0 - 位置环比例增益1最小值;double 类型,范围[0,100000) - 位置环比例增益1最小值必须小于位置环比例增益1最大值 - "min":9999.0 ```json { "Dynamic_sendServoParam":false, "PositionalComparison": { "inertiaMax":9999.0, "inertiaMin":8.0, "max":8.0, "min":9999.0 } } ``` - 位置环比例增益1最大值;double 类型,范围(0,100000] - "max"与"min"参数在实现时写反了,后续进行修改 - 上位机查询位置环比参数 ```json {} ``` **命令字:** `0x4057` - 控制器回复上位机位置环比参数 **命令字:** `0x4058` - "Dynamic_sendServoParam":false - 位置环比发送使能;bool 类型 - "PositionalComparison": - 位置环比参数列表 - "inertiaMax":9999.0 - 惯量最大值;double 类型,范围(0,100000]0.001kgm^2 - "inertiaMin":8.0 - 惯量最小值;double 类型,范围[0,100000)0.001kgm^2 - 惯量最小值必须小于惯量最大值 - "max":8.0 - 位置环比例增益1最小值;double 类型,范围[0,100000) - 位置环比例增益1最小值必须小于位置环比例增益1最大值 - "min":9999.0 ```json { "Dynamic_sendServoParam":false, "PositionalComparison": { "inertiaMax":9999.0, "inertiaMin":8.0, "max":8.0, "min":9999.0 } } ``` ### 拖动模式 - 位置环比例增益1最大值;double 类型,范围(0,100000] - "max"与"min"参数在实现时写反了,后续进行修改 - 说明 - 上位机设置拖拽模式参数 **命令字:** `0x4074` - "mode":2 - 拖动方式;int 类型,范围[0,3] - 0表示无,1表示3D 鼠标,2表示力矩,3表示位置 - "port":0 - 外部触发信号端口;int 类型 - 范围为当前绑定的 IO 端口数 - "value":0 ```json { "mode":2, "port":0, "value":0 } ``` - 外部触发信号参数;int 类型,范围[0,1] - 上位机查询拖拽模式参数 ```json {} ``` **命令字:** `0x4075` - 控制器回复上位机拖拽模式参数 **命令字:** `0x4076` - "mode":2 - 拖动方式;int 类型,范围[0,3] - 0表示无,1表示3D 鼠标,2表示力矩,3表示位置 - "port":0 - 外部触发信号端口;int 类型 - 范围为当前绑定的 IO 端口数 - "value":0 ```json { "mode":2, "port":0, "value":0 } ``` - 外部触发信号参数;int 类型,范围[0,1] - 上位机设置力矩参数 **命令字:** `0x4085` - "DecareLimit":2.50 - 笛卡尔空间线速度限制;double 类型,范围[0,∞)m/s - "JointVelLimit":1.0 - 关节空间速度限制;double 类型,范围[0,∞)°/s - "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0] - 超限阻力系数;double 类型,范围[1,100] - "drag_mode":0 - 拖动模式;int 类型,范围[0,2] - 0表示自由拖动,1表示位置拖动,2表示姿态拖动 - "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0] - 关节摩擦力补偿矫正系数;double 类型,范围[0,0.99] - "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0] - 关节目标扭矩矫正系数;double 类型,范围[0,1] - "waitCycle":5.0 ```json { "DecareLimit":2.50, "JointVelLimit":1.0, "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode":0, "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle":5.0 } ``` - 下发给伺服力矩参数等待周期;double 类型,范围[1,10] - 上位机查询力矩参数 ```json {} ``` **命令字:** `0x4086` - 控制器回复上位机力矩参数 **命令字:** `0x4087` - "DecareLimit":2.50 - 笛卡尔空间线速度限制;double 类型,范围[0,∞)m/s - "JointVelLimit":1.0 - 关节空间速度限制;double 类型,范围[0,∞)°/s - "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0] - 超限阻力系数;double 类型,范围[1,100] - "drag_mode":0 - 拖动模式;int 类型,范围[0,2] - 0表示自由拖动,1表示位置拖动,2表示姿态拖动 - "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0] - 关节摩擦力补偿矫正系数;double 类型,范围[0,0.99] - "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0] - 关节目标扭矩矫正系数;double 类型,范围[0,1] - "waitCycle":5.0 ```json { "DecareLimit":2.50, "JointVelLimit":1.0, "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode":0, "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle":5.0 } ``` ### 力学功能 - 下发给伺服力矩参数等待周期;double 类型,范围[1,10] - 说明 - 设置碰撞检测开关需要先进行动力学辨识 - 上位机设置碰撞检测开关 **命令字:** `0x407D` - "switch":true ```json { "switch":true } ``` - 碰撞检测开关;bool 类型 - 上位机查询碰撞检测开关 ```json {} ``` **命令字:** `0x407E` - 控制器回复上位机碰撞检测开关 **命令字:** `0x407F` - "is_identification":false - 机器人是否已动力学辨识;bool 类型 - true 表示已动力学辨识,1表示未进行动力学辨识 - "restrart_switch":false - 机器人碰撞后重启开关;bool 类型 - "switch":true ```json { "is_identification":false, "restrart_switch":false, "switch":false } ``` - 碰撞检测开关;bool 类型 - 上位机设置碰撞检测参数 **命令字:** `0x4080` - "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值(点动);double 类型,范围[1,10000]‰ - "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值(点动);double 类型,范围[1,10000]‰ - "error_enable_time":1.0 - 误差允许时间;double 类型,范围[0,99]ms - "pos_delay_time":1.0 ```json { "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0], "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0], "error_enable_time":1.0, "pos_delay_time":1.0 } ``` - 指令位置响应时间;double 类型,范围(0,99]ms - 上位机查询碰撞检测参数 ```json {} ``` **命令字:** `0x4081` - 控制器回复上位机碰撞检测参数 **命令字:** `0x4082` - "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值列表(点动);double 类型,范围[1,10000]‰ - "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值列表(点动);double 类型,范围[1,10000]‰ - "error_enable_time":1.0 - 误差允许时间;double 类型,范围[0,99]ms - "pos_delay_time":1.0 ```json { "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0], "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0], "error_enable_time":1.0, "pos_delay_time":1.0 } ``` - 指令位置响应时间;double 类型,范围(0,99]ms - 上位机设置机器人力矩前馈 **命令字:** `0x4010` - "torqFeedback":false ```json { "torqFeedback":false } ``` - 力矩前馈开关;bool 类型 - 上位机查询机器人力矩前馈 ```json {} ``` **命令字:** `0x4011` - 控制器回复上位机机器人力矩前馈 **命令字:** `0x4012` ```json { "torqFeedback":false } ``` ### 轨迹管理 - "torqFeedback":false - 力矩前馈开关;bool 类型 - 说明 - 轨迹保存结果通过0x4070返回 - 上位机查询拖拽轨迹是否被记录 ```json {} ``` **命令字:** `0x408B` - 控制器回复上位机拖拽轨迹记录结果 **命令字:** `0x4070` - "record":false ```json { "record":false } ``` - 轨迹是否被记录;bool 类型 - 上位机请求轨迹回放 **命令字:** `0x4071` - "trajName":"AAA" - 需要回放的轨迹名称;string 类型 - "vel":100 ```json { "trajName":"AAA", "vel":100 } ``` - 轨迹回放运行速度;int 类型,范围[1,100] - 上位机请求保存拖拽轨迹 **命令字:** `0x4072` - "TrajName":"AAA" ```json { "TrajName":"AAA" } ``` - 需要保存的轨迹名称;string 类型 - 若为空则保存失败 - 上位机请求删除拖拽轨迹 **命令字:** `0x4073` - "TrajName":"AAA" ```json { "TrajName":"AAA" } ``` - 需要删除的轨迹名称;string 类型 - 上位机查询拖拽轨迹列表 ```json {} ``` **命令字:** `0x4083` - 控制器回复上位机拖拽轨迹列表 **命令字:** `0x4084` - "TrajName":["AAA"] ```json { "TrajName":["AAA"] } ``` - 已保存轨迹列表;string 类型 - 长度为当前已保存轨迹数量,若无轨迹,则该节点不存在 - 上位机设置轨迹记录参数 **命令字:** `0x4088` - "MaxSamplingNum":300.0 - 最大采样点数;double 类型,范围(200,1200) - "SamplingInterval":0.030 - 采样间隔;double 类型,范围[0.03,1] - "Start":true ```json { "MaxSamplingNum":300.0, "SamplingInterval":0.030, "Start":true } ``` - 开始/停止记录;bool 类型 - true 表示开始记录,false 表示停止记录 - false 时"MaxSamplingNum"和"SamplingInterval"可以不存在 - 上位机查询轨迹记录参数 ```json {} ``` **命令字:** `0x4089` - 控制器回复上位机轨迹记录参数 - 0x408A - "MaxSamplingNum":300.0 - 最大采样点数;double 类型,范围(200,1200) - "SamplingInterval":0.030 - 采样间隔;double 类型,范围[0.03,1] - "Start":false ```json { "MaxSamplingNum":300.0, "SamplingInterval":0.030, "Start":false } ``` - 开始/停止记录;bool 类型 - true 表示开始记录,false 表示停止记录 - 上位机查询拖拽轨迹文件列表 ```json {} ``` **命令字:** `0x408C` - 控制器回复上位机拖拽轨迹文件列表 **命令字:** `0x408D` - "absolutepath":"dragPos/" - 控制器中拖拽轨迹文件存放地址;string 类型 - "trajectory_filelist":["AAA","JJ","drag_traj_details.json"] ```json { "absolutepath":"dragPos/", "trajectory_filelist":["AAA","JJ","drag_traj_details.json"] } ``` - 拖拽轨迹文件列表;string 类型 - "drag_traj_details.json"为轨迹记录信息文件 --- # 遥操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/12.%E9%81%A5%E6%93%8D%E4%BD%9C.html ## 3D 鼠标 ### 上位机设置3D 鼠标参数 **命令字:** `0x4600` | 参数名 | 类型 | 范围 | 说明 | |-----------|------------|-----------|----------------------------------------------------------------------| | ABC | int | [4,6] | 姿态控制:4表示已选中 A,5表示已选中 B,6表示已选中 C | | mouseSen | double[4] | [0,300] | 3D 鼠标灵敏度列表,分别为 X 方向灵敏度、Y 方向灵敏度、Z 方向灵敏度、姿态灵敏度 | **请求示例:** ```json { "ABC": 4, "mouseSen": [128.0, 128.0, 128.0, 128.0] } ``` ### 上位机查询3D 鼠标参数 **命令字:** `0x4601` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标参数 **命令字:** `0x4602` | 参数名 | 类型 | 范围 | 说明 | |----------|-----------|----------|---------------------------------------------------| | ABC | int | [4,6] | 姿态控制:4表示已选中 A,5表示已选中 B,6表示已选中 C | | enable | bool | - | 3D 鼠标使能 | | mouseSen | double[4] | [0,300] | 3D 鼠标灵敏度列表,分别为 X/Y/Z 方向灵敏度和姿态灵敏度 | **响应示例:** ```json { "ABC": 4, "enable": false, "mouseSen": [128.0, 128.0, 128.0, 128.0] } ``` ### 上位机请求标记3D 鼠标零点 **命令字:** `0x4603` **请求示例:** ```json {} ``` ### 上位机查询3D 鼠标零点标记状态 **命令字:** `0x4604` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标零点标记状态 **命令字:** `0x4605` | 参数名 | 类型 | 范围 | 说明 | |-------------|------|----------|----------------------------------------| | zeroTagged | int | [0,1] | 3D 鼠标零点标记状态:0表示未标记,1表示已标记 | **响应示例:** ```json { "zeroTagged": 0 } ``` ### 上位机请求标记3D 鼠标正方向 **命令字:** `0x4606` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------------------------------| | axis | int | [1,3] | 标记的方向:1表示 X 方向,2表示 Y 方向,3表示 Z 方向 | **请求示例:** ```json { "axis": 1 } ``` ### 上位机查询3D 鼠标标记正方向状态 **命令字:** `0x4607` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标标记正方向状态 **命令字:** `0x4608` | 参数名 | 类型 | 范围 | 说明 | |----------|------|----------|--------------------------------------------------| | xTagged | int | [0,2] | X 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | | yTagged | int | [0,2] | Y 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | | zTagged | int | [0,2] | Z 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | **响应示例:** ```json { "xTagged": 2, "yTagged": 0, "zTagged": 0 } ``` ### 上位机设置3D 鼠标参数页面返回 **命令字:** `0x4609` | 参数名 | 类型 | 说明 | |-----------|------|-----------------------------| | pageBack | int | 上位机页面离开3D 鼠标参数页面 | **请求示例:** ```json { "pageBack": 1 } ``` ### 上位机设置3D 鼠标端口号 **命令字:** `0x460A` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------| | port | int | [1,10] | 3D 鼠标端口号 | **请求示例:** ```json { "port": 1 } ``` ### 上位机查询3D 鼠标端口号 **命令字:** `0x460B` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标端口号 **命令字:** `0x460C` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------| | port | int | [1,10] | 3D 鼠标端口号 | **响应示例:** ```json { "port": 1 } ``` --- ## 六维力传感器 ### 说明 六维力传感器安装在机器人末端,通过传感器末端感应区获取受力的变化。 六维力传感器的基础参数在0x4000里设置,包括有传感器质量和质心,标零计算前需要提前写入,否则会导致标零计算结果错误。 使用六维力传感器进行力矩拖拽和位置拖拽需要在安装好传感器后进行空载标零,若需要安装额外拖把,则需要在标零后进行负载计算。 使用六维力传感器进行力矩拖拽,在各轴扭矩转换数据超出关节摩擦力补偿阈值时进行摩擦力补偿。 ### 上位机请求计算六维力传感器负载参数 **命令字:** `0x4620` **请求示例:** ```json {} ``` ### 上位机查询六维力传感器负载参数的计算结果 **命令字:** `0x4621` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器计算的负载参数 **命令字:** `0x4622` | 参数名 | 类型 | 单位 | 说明 | |---------------------|--------|------|------------------------------------------------------------| | isFinished | bool | - | 负载计算轨迹是否运行结束(仅回复0x4620时存在) | | runSuccess | bool | - | 负载参数是否计算成功(仅回复0x4620时存在) | | payloadMass | double | kg | 计算得到的负载块质量(仅回复0x4621时存在) | | payloadMassCenterX | double | m | 计算得到的负载块质心 X(仅回复0x4621时存在) | | payloadMassCenterY | double | m | 计算得到的负载块质心 Y(仅回复0x4621时存在) | | payloadMassCenterZ | double | m | 计算得到的负载块质心 Z(仅回复0x4621时存在) | **响应示例:** ```json { "isFinished": true, "runSuccess": true, "payloadMass": 0.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.0 } ``` ### 上位机查询六维力传感器数据 **命令字:** `0x4623` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器数据 **命令字:** `0x4624` | 参数名 | 类型 | 单位 | 说明 | |--------------------|---------|------|------------------------------------------------------------------------| | fxData | double | N | 传感器 X 方向受力原始数据 | | fyData | double | N | 传感器 Y 方向受力原始数据 | | fzData | double | N | 传感器 Z 方向受力原始数据 | | mxData | double | Nm | 传感器 X 方向力矩原始数据 | | myData | double | Nm | 传感器 Y 方向力矩原始数据 | | mzData | double | Nm | 传感器 Z 方向力矩原始数据 | | peelOffValue | object | - | 传感器去皮数据,传感器标零后该节点存在 | | fxDataSubBase | double | N | 传感器 X 方向受力去皮数据 | | fyDataSubBase | double | N | 传感器 Y 方向受力去皮数据 | | fzDataSubBase | double | N | 传感器 Z 方向受力去皮数据 | | mxDataSubBase | double | Nm | 传感器 X 方向力矩去皮数据 | | myDataSubBase | double | Nm | 传感器 Y 方向力矩去皮数据 | | mzDataSubBase | double | Nm | 传感器 Z 方向力矩去皮数据 | | sensorConnect | bool | - | 传感器连接状态:true 表示已连接,false 表示未连接 | | torqueConvertData | object | - | 六维力传感器额外力导致的各轴扭矩值,机器人进入力矩拖拽时该节点存在 | | axis1Data | double | ‰ | 1轴扭矩转换数据 | | axis2Data | double | ‰ | 2轴扭矩转换数据 | | axis3Data | double | ‰ | 3轴扭矩转换数据 | | axis4Data | double | ‰ | 4轴扭矩转换数据 | | axis5Data | double | ‰ | 5轴扭矩转换数据 | | axis6Data | double | ‰ | 6轴扭矩转换数据 | **响应示例:** ```json { "fxData": -7.48328, "fyData": 4.0964, "fzData": 34.09224, "mxData": 0.4361, "myData": -0.01078, "mzData": 0.1176, "peelOffValue": { "fxDataSubBase": 0.324231194364, "fyDataSubBase": -0.550949927519, "fzDataSubBase": 5.315393681562, "mxDataSubBase": 0.254721004374, "myDataSubBase": -0.23501051027, "mzDataSubBase": 0.003892025499 }, "sensorConnect": true, "torqueConvertData": { "axis1Data": 4.350304342178, "axis2Data": -31.252106163066, "axis3Data": -67.928968119182, "axis4Data": 8.274872052417, "axis5Data": 15.919933464577, "axis6Data": 0.318515582768 } } ``` ### 上位机请求六维力传感器标零 **命令字:** `0x4625` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器标零结果 **命令字:** `0x4626` | 参数名 | 类型 | 说明 | |------------|------|--------------------| | isFinished | bool | 标零轨迹是否运行结束 | | isSaved | bool | 标零数据是否保存成功 | **响应示例:** ```json { "isFinished": true, "isSaved": true } ``` ### 上位机请求将六维力传感器负载计算结果存入到工具手 **命令字:** `0x4627` | 参数名 | 类型 | 范围 | 说明 | |------------|------|-----------|--------------------| | targetTool | int | [1,999] | 要存入到的工具手号 | **请求示例:** ```json { "targetTool": 5 } ``` ### 控制器回复上位机六维力传感器负载计算结果存入到工具手结果 **命令字:** `0x4628` | 参数名 | 类型 | 说明 | |--------|------|------------------| | result | bool | 数据存入是否成功 | **响应示例:** ```json { "result": true } ``` ### 上位机设置关节摩擦力补偿阈值 **命令字:** `0x4629` | 参数名 | 类型 | 范围 | 说明 | |------------------------|------|------------|--------------------| | sensorJointThreshold1 | int | [1,999999] | 1轴关节摩擦力补偿阈值 | | sensorJointThreshold2 | int | [1,999999] | 2轴关节摩擦力补偿阈值 | | sensorJointThreshold3 | int | [1,999999] | 3轴关节摩擦力补偿阈值 | | sensorJointThreshold4 | int | [1,999999] | 4轴关节摩擦力补偿阈值 | | sensorJointThreshold5 | int | [1,999999] | 5轴关节摩擦力补偿阈值 | | sensorJointThreshold6 | int | [1,999999] | 6轴关节摩擦力补偿阈值 | **请求示例:** ```json { "sensorJointThreshold1": 50, "sensorJointThreshold2": 50, "sensorJointThreshold3": 50, "sensorJointThreshold4": 50, "sensorJointThreshold5": 50, "sensorJointThreshold6": 50 } ``` ### 上位机查询关节摩擦力补偿系数 **命令字:** `0x462A` **请求示例:** ```json {} ``` ### 控制器回复上位机关节摩擦力补偿系数 **命令字:** `0x462B` | 参数名 | 类型 | 范围 | 说明 | |------------------------|------|------------|--------------------| | sensorJointThreshold1 | int | [1,999999] | 1轴关节摩擦力补偿阈值 | | sensorJointThreshold2 | int | [1,999999] | 2轴关节摩擦力补偿阈值 | | sensorJointThreshold3 | int | [1,999999] | 3轴关节摩擦力补偿阈值 | | sensorJointThreshold4 | int | [1,999999] | 4轴关节摩擦力补偿阈值 | | sensorJointThreshold5 | int | [1,999999] | 5轴关节摩擦力补偿阈值 | | sensorJointThreshold6 | int | [1,999999] | 6轴关节摩擦力补偿阈值 | **响应示例:** ```json { "sensorJointThreshold1": 50, "sensorJointThreshold2": 50, "sensorJointThreshold3": 50, "sensorJointThreshold4": 50, "sensorJointThreshold5": 50, "sensorJointThreshold6": 50 } ``` ### 上位机设置传感器基础参数 **命令字:** `0x4630` | 参数名 | 类型 | 说明 | |--------------------|--------|------------| | sensorMass | double | 传感器质量 | | sensorMassCenterX | double | 传感器质心 X | | sensorMassCenterY | double | 传感器质心 Y | | sensorMassCenterZ | double | 传感器质心 Z | **请求示例:** ```json { "sensorMass": 0, "sensorMassCenterX": 0, "sensorMassCenterY": 0, "sensorMassCenterZ": 0 } ``` ### 上位机获取传感器基础参数 **命令字:** `0x4631` **请求示例:** ```json {} ``` ### 控制器回复传感器基础参数 **命令字:** `0x4632` | 参数名 | 类型 | 说明 | |--------------------|--------|------------| | sensorMass | double | 传感器质量 | | sensorMassCenterX | double | 传感器质心 X | | sensorMassCenterY | double | 传感器质心 Y | | sensorMassCenterZ | double | 传感器质心 Z | **响应示例:** ```json { "sensorMass": 0, "sensorMassCenterX": 0, "sensorMassCenterY": 0, "sensorMassCenterZ": 0 } ``` ### 传感器去皮数据清零 **命令字:** `0x4633` **请求示例:** ```json {} ``` ### 传感器数据标定 **命令字:** `0x4634` **请求示例:** ```json {} ``` ### 控制器回复传感器数据标定结果 **命令字:** `0x4635` | 参数名 | 类型 | 说明 | |------------|------|--------------| | runSuccess | bool | 轨迹运行结果 | | isFinished | bool | 标定结束 | **响应示例:** ```json { "runSuccess": true, "isFinished": true } ``` ### 上位机设置六维力传感器通讯参数 **命令字:** `0x462C` | 参数名 | 类型 | 范围/取值 | 说明 | |-------------------------------|--------|------------------------------------|----------------------------------------------------------------------| | EtherCAT.mapNum | int | - | 已选择通讯设备号:0表示未选择 | | modbus.RTU.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | modbus.RTU.checkBit | string | 'N','E','O' | 校验位 | | modbus.RTU.dataBit | int | [5,8] | 数据位 | | modbus.RTU.stopBit | int | [1,2] | 停止位 | | modbus.RTU.addressNum | int | [0,125] | 从站地址个数 | | modbus.RTU.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.RTU.baudRate | int | - | 波特率 | | modbus.RTU.firstAddress | int | (0,65535] | 寄存器首地址 | | modbus.RTU.port | int | (0,65535] | 端口号 | | modbus.RTU.slaveID | int | (0,65535] | 从站 ID | | modbus.TCP.IP | string | - | IP 地址 | | modbus.TCP.port | int | (0,65535] | 端口号 | | modbus.TCP.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.TCP.firstAddress | int | [0,65535] | 寄存器首地址 | | modbus.TCP.addressNum | int | [0,125] | 从站地址个数 | | modbus.TCP.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | YDirection | int | 1/-1 | 传感器 Y 方向:1表示 Y 正方向朝左,-1表示 Y 正方向朝右 | | originDataInitialPara | int | [0,999] | 原始数据起始变量:0表示无,其他数值表示存放到全局变量位置,依次存放六个传感器原始数据 | | sensorCommunicationType | int | [0,1] | 传感器通讯类型:0表示 EtherCAT,1表示 Modbus RTU | | sensorConnectStatus | bool | - | 传感器通讯使能(该节点可单独进行设置) | | sensorDragEnable | bool | - | 传感器拖拽使能:false 表示传感器数据不参与力矩拖拽计算 | | startupAutoConnectSensor | bool | - | 开机连接传感器 | **请求示例:** ```json { "etherCat": { "mapNum": 0 }, "modbus": { "RTU": { "endian": 1, "checkBit": "N", "dataBit": 5, "stopBit": 1, "addressNum": 1, "addressType": 0, "baudRate": 115200, "firstAddress": 1, "port": 1, "slaveID": 1 }, "TCP": { "IP": "192.168.1.14", "port": 503, "addressType": 0, "firstAddress": 1, "addressNum": 1, "endian": 1 } }, "YDirection": 1, "originDataInitialPara": 0, "sensorCommunicationType": 0, "sensorConnectStatus": false, "sensorDragEnable": true, "startupAutoConnectSensor": true } ``` ### 上位机查询六维力传感器通讯参数 **命令字:** `0x462D` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器通讯参数 **命令字:** `0x462E` | 参数名 | 类型 | 范围/取值 | 说明 | |-------------------------------|--------|------------------------------------|----------------------------------------------------------------------| | EtherCAT.mapNum | int | - | 已选择通讯设备号:0表示未选择 | | modbus.RTU.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | modbus.RTU.checkBit | string | 'N','E','O' | 校验位 | | modbus.RTU.dataBit | int | [5,8] | 数据位 | | modbus.RTU.stopBit | int | [1,2] | 停止位 | | modbus.RTU.addressNum | int | [0,125] | 从站地址个数 | | modbus.RTU.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.RTU.baudRate | int | - | 波特率 | | modbus.RTU.firstAddress | int | (0,65535] | 寄存器首地址 | | modbus.RTU.port | int | (0,65535] | 端口号 | | modbus.RTU.slaveID | int | (0,65535] | 从站 ID | | modbus.TCP.IP | string | - | IP 地址 | | modbus.TCP.port | int | (0,65535] | 端口号 | | modbus.TCP.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.TCP.firstAddress | int | [0,65535] | 寄存器首地址 | | modbus.TCP.addressNum | int | [0,125] | 从站地址个数 | | modbus.TCP.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | YDirection | int | 1/-1 | 传感器 Y 方向:1表示 Y 正方向朝左,-1表示 Y 正方向朝右 | | originDataInitialPara | int | [0,999] | 原始数据起始变量:0表示无,其他数值表示存放到全局变量位置,依次存放六个传感器原始数据 | | sensorCommunicationType | int | [0,1] | 传感器通讯类型:0表示 EtherCAT,1表示 Modbus RTU | | sensorConnectStatus | bool | - | 传感器通讯使能(该节点可单独进行设置) | | sensorDragEnable | bool | - | 传感器拖拽使能:false 表示传感器数据不参与力矩拖拽计算 | | startupAutoConnectSensor | bool | - | 开机连接传感器 | **响应示例:** ```json { "etherCat": { "mapNum": 0 }, "modbus": { "RTU": { "endian": 1, "checkBit": "N", "dataBit": 5, "stopBit": 1, "addressNum": 1, "addressType": 0, "baudRate": 115200, "firstAddress": 1, "port": 1, "slaveID": 1 }, "TCP": { "IP": "192.168.1.14", "port": 503, "addressType": 0, "firstAddress": 1, "addressNum": 1, "endian": 1 } }, "YDirection": 1, "originDataInitialPara": 0, "sensorCommunicationType": 0, "sensorConnectStatus": false, "sensorDragEnable": true, "startupAutoConnectSensor": true } ``` ### 上位机设置六维力传感器导纳拖拽参数 **命令字:** `0x408E` | 参数名 | 类型 | 范围 | 说明 | |---------------------|------------|---------------------------|--------------------------------| | dragDamper | double[6] | 前三位[0,100],后三位[0,50] | 阻尼系数列表,直角坐标系下 XYZABC | | dragInPosMaxAngleVel| double | (0,90] | 拖拽最大角速度,单位:°/s | | dragInPosMaxVel | double | (0,2] | 拖拽最大线速度,单位:m/s | | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | | dragMass | double[6] | 前三位[5,100],后三位[0.3,30] | 质量系数列表 | | dragChangeRate | double[6] | - | 变化率阈值 | | dragTh.xyz | double | - | 位置启动阈值 | | dragTh.abc | double | - | 姿态启动阈值 | **请求示例:** ```json { "dragDamper": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "dragInPosMaxAngleVel": 5.0, "dragInPosMaxVel": 2.0, "dragInPosMode": 0, "dragMass": [5.0, 5.0, 5.0, 0.30, 0.30, 0.30], "dragChangeRate": [10, 10, 10, 5, 5, 5], "dragTh": { "xyz": 5, "abc": 1 } } ``` ### 上位机查询六维力传感器导纳拖拽参数 **命令字:** `0x408F` | 参数名 | 类型 | 范围 | 说明 | |---------------|------|----------|--------------------------------------------------| | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | **请求示例:** ```json { "dragInPosMode": 0 } ``` ### 控制器回复上位机六维力传感器导纳拖拽参数 **命令字:** `0x4090` | 参数名 | 类型 | 范围 | 说明 | |---------------------|------------|---------------------------|--------------------------------| | dragDamper | double[6] | 前三位[0,100],后三位[0,50] | 阻尼系数列表,直角坐标系下 XYZABC | | dragInPosMaxAngleVel| double | (0,90] | 拖拽最大角速度,单位:°/s | | dragInPosMaxVel | double | (0,2] | 拖拽最大线速度,单位:m/s | | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | | dragMass | double[6] | 前三位[5,100],后三位[0.3,30] | 质量系数列表 | | dragChangeRate | double[6] | - | 变化率阈值 | | dragTh.xyz | double | - | 位置启动阈值 | | dragTh.abc | double | - | 姿态启动阈值 | **响应示例:** ```json { "dragDamper": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "dragInPosMaxAngleVel": 5.0, "dragInPosMaxVel": 2.0, "dragInPosMode": 0, "dragMass": [5.0, 5.0, 5.0, 0.30, 0.30, 0.30], "dragChangeRate": [10, 10, 10, 5, 5, 5], "dragTh": { "xyz": 5, "abc": 1 } } ``` --- ## 关节扭矩传感器拖拽 ### 设置关节传感器参数 **命令字:** `0x4636` | 参数名 | 类型 | 说明 | |--------------------|------|--------------| | jointSensorSwitch | bool | 开启传感器 | **请求示例:** ```json { "jointSensorSwitch": true } ``` ### 获取传感器参数 **命令字:** `0x4637` **请求示例:** ```json {} ``` ### 返回传感器参数 **命令字:** `0x4638` | 参数名 | 类型 | 说明 | |--------------------|------|------------------------------| | jointSensorSwitch | bool | 传感器已开启:true 表示开启,false 表示未开启 | **响应示例:** ```json { "jointSensorSwitch": true } ``` ### 获取传感器数据 **命令字:** `0x4639` **请求示例:** ```json {} ``` ### 返回传感器数据 **命令字:** `0x463A` | 参数名 | 类型 | 说明 | |--------------------|--------|------------------| | jointSensorConnect | bool | 传感器连接状态:true 表示连接,false 表示未连接 | | axis1Data | double | 一轴传感器数据 | | axis2Data | double | 二轴传感器数据 | | axis3Data | double | 三轴传感器数据 | | axis4Data | double | 四轴传感器数据 | | axis5Data | double | 五轴传感器数据 | | axis6Data | double | 六轴传感器数据 | **响应示例:** ```json { "jointSensorConnect": true, "axis1Data": 1, "axis2Data": 1, "axis3Data": 1, "axis4Data": 1, "axis5Data": 1, "axis6Data": 1 } ``` --- # 独立轴 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/13.%E7%8B%AC%E7%AB%8B%E8%BD%B4.html ## 独立轴参数 ### 设置独立轴界面参数 **命令字:** `0x2800` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | | angularDistanceConversionRatioValue | double | 转换比 | | isTrack | bool | 是否是地轨 | | encoderBitLineditValue | double | 编码器位数 | | inverseLimitValue | double | 反限位 | | maximumPositiveSpeedValue | double | 最大正转速;单位:倍率 | | maximumReverseSpeedValue | double | 最大反转速;单位:倍率 | | motorDir | int | 电机方向;1:正,-1:负 | | positiveLimitValue | double | 正限位 | | ratedPositiveSpeedValue | double | 额定正转速;单位:rpm | | ratedReverseSpeedValue | double | 额定反转速;单位:rpm | | reductionRatioValue | double | 减速比 | | maxAccValue | double | 最大加速度;单位:速度的倍率 | | maxDecValue | double | 最大减速度;单位:速度的倍率 | | selectBindServo | uint | 选择需要绑定的伺服编号 | **请求示例:** ```json { "independentAxisParameter": { "axisNum": 0, "angularDistanceConversionRatioValue": 0.0, "isTrack": false, "encoderBitLineditValue": 0.0, "inverseLimitValue": 0.0, "maximumPositiveSpeedValue": 0.0, "maximumReverseSpeedValue": 0.0, "motorDir": 0, "positiveLimitValue": 0.0, "ratedPositiveSpeedValue": 0.0, "ratedReverseSpeedValue": 0.0, "reductionRatioValue": 0.0, "maxAccValue": 0.0, "maxDecValue": 0.0, "selectBindServo": 0 } } ``` ### 上位机查询独立轴界面参数 **命令字:** `0x2801` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴界面参数 **命令字:** `0x2802` 返回参数同 `0x2800` 设置命令。 ### 上位机查询独立轴总数 **命令字:** `0x2803` **参数说明:** 无请求参数。 ### 控制器返回独立轴总数 **命令字:** `0x2804` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisSum | int | 独立轴总数 | **响应示例:** ```json { "axisSum": 2 } ``` ### 上位机删除某一个独立轴参数 **命令字:** `0x2805` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ## 独立轴位置 ### 上位机查询独立轴位置 **命令字:** `0x2806` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 控制器返回独立轴位置 **命令字:** `0x2807` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | currentPos | double | 当前位置 | **响应示例:** ```json { "currentPos": 210.01 } ``` ### 独立轴0点标定 **命令字:** `0x2808` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ## 轴独立控制弹窗 ### 独立控制轴 PV 运动 **命令字:** `0x30E0` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | | vel | int | 轴速度;单位:rpm | [-6000,6000] | | dir | int | 运动方向;1:正,-1:反向 | - | | acc | double | 加速度 | - | | dec | double | 减速度 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1, "vel": 50, "dir": 1, "acc": 50.0, "dec": 50.0 } ``` ### 独立控制轴 PV 停止 **命令字:** `0x30E1` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1 } ``` ### 取消轴独立控制运动 **命令字:** `0x30E4` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1 } ``` ### 独立轴回零 **命令字:** `0x30E5` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 独立轴回零停止 **命令字:** `0x30E6` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 独立轴点动 **命令字:** `0x30E7` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | vel | int | 速度;单位:rpm | - | | acc | double | 加速度 | - | | dec | double | 减速度 | - | | dir | int | 运动方向;1:正,-1:反向 | - | **请求示例:** ```json { "axisNum": 2, "vel": 5, "acc": 50.0, "dec": 50.0, "dir": 1 } ``` ## 独立轴状态 ### 上位机查询独立轴状态 **命令字:** `0x30E8` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴状态 **命令字:** `0x30E9` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | | currentPos | double | 当前位置 | | currentVel | double | 当前速度;单位:rpm | | currentTorque | double | 当前力矩 | | status | int | 运行状态;0-停止,1-运动中,2-回零中,3-报警 | | servoOn | bool | 伺服使能状态;true-使能,false-未使能 | | alarmCode | int | 报警代码;0 表示无报警 | **响应示例:** ```json { "axisNum": 1, "currentPos": 120.5, "currentVel": 100.0, "currentTorque": 0.5, "status": 1, "servoOn": true, "alarmCode": 0 } ``` ## 独立轴控制 ### 独立轴伺服使能 **命令字:** `0x30EA` > **说明:** 控制独立轴伺服电机的使能/去使能状态。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | enable | bool | 伺服使能;true-使能,false-去使能 | - | **请求示例:** ```json { "axisNum": 1, "enable": true } ``` ### 独立轴复位 **命令字:** `0x30EB` > **说明:** 复位独立轴的报警状态。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 独立轴停止 **命令字:** `0x30EC` > **说明:** 停止独立轴的所有运动(包括点动、回零、定位运动)。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ## 独立轴定位运动 ### 独立轴绝对位置运动 **命令字:** `0x30ED` > **说明:** 控制独立轴运动到指定的绝对位置。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | targetPos | double | 目标位置 | 受正反限位限制 | | vel | double | 运动速度;单位:rpm | [0, 6000] | | acc | double | 加速度 | > 0 | | dec | double | 减速度 | > 0 | **请求示例:** ```json { "axisNum": 1, "targetPos": 200.0, "vel": 100.0, "acc": 50.0, "dec": 50.0 } ``` ### 独立轴相对位置运动 **命令字:** `0x30EE` > **说明:** 控制独立轴以当前位置为基准,运动指定的相对距离。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | relativePos | double | 相对位移量;正值正向运动,负值反向运动 | 受正反限位限制 | | vel | double | 运动速度;单位:rpm | [0, 6000] | | acc | double | 加速度 | > 0 | | dec | double | 减速度 | > 0 | **请求示例:** ```json { "axisNum": 1, "relativePos": 50.0, "vel": 80.0, "acc": 40.0, "dec": 40.0 } ``` ### 独立轴定位运动停止 **命令字:** `0x30EF` > **说明:** 停止独立轴的定位运动(绝对/相对位置运动)。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ## 独立轴配置 ### 上位机查询独立轴软限位 **命令字:** `0x2809` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴软限位 **命令字:** `0x280A` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | | positiveLimit | double | 正限位值 | | inverseLimit | double | 反限位值 | | enableLimit | bool | 软限位使能状态 | **响应示例:** ```json { "axisNum": 1, "positiveLimit": 500.0, "inverseLimit": -500.0, "enableLimit": true } ``` ## 独立轴运动说明 ### 运动控制模式 独立轴提供以下几种运动控制方式: | 控制方式 | 命令字 | 说明 | |----------|--------|------| | PV 运动 | `0x30E0` | 速度控制模式,以指定速度和方向持续运动 | | 点动 | `0x30E7` | Jog 模式,按住时持续运动,松开停止 | | 绝对定位 | `0x30ED` | 运动到指定的绝对位置后停止 | | 相对定位 | `0x30EE` | 从当前位置运动指定的相对距离后停止 | | 回零 | `0x30E5` | 回到零点位置 | ### 运动停止方式 | 停止方式 | 命令字 | 说明 | |----------|--------|------| | PV 停止 | `0x30E1` | 停止 PV 运动 | | 取消运动 | `0x30E4` | 取消独立控制运动 | | 回零停止 | `0x30E6` | 停止回零操作 | | 通用停止 | `0x30EC` | 停止所有运动 | | 定位停止 | `0x30EF` | 停止定位运动 | ### 操作流程 1. 首先通过 `0x30EA` 使能伺服 2. 查询 `0x30E9` 确认伺服已使能且无报警 3. 发送运动命令(PV、点动、定位等) 4. 通过 `0x30E9` 监控运行状态 5. 运动完成后发送停止命令 6. 必要时通过 `0x30EA` 去使能伺服 --- # 程序增删改查 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/01.%E7%A8%8B%E5%BA%8F%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5.html ## 1 程序删除 **命令字:** `0x5000` **说明:** 上位机下发删除程序 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | jobfilename | string | 是 | 作业文件名称 | | suffixname | string | 是 | 作业文件后缀名 | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "jobfilename": "QQQQ", "suffixname": ".JBR" } ``` --- ## 2 程序重命名 **命令字:** `0x5001` **说明:** 将原有程序的名字更改,上位机下发重命名程序 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | lastname | string | 是 | 修改前程序名 | | newname | string | 是 | 修改后程序名 | | suffixname | string | 是 | 程序后缀名 | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "lastname": "QQQQ", "newname": "WWWW", "suffixname": ".JBR" } ``` --- ## 3 程序创建 **命令字:** `0x5002` **说明:** - 程序的新建需要在示教模式下 - 程序的运行需要再运行模式下,并且伺服就绪,上电没有报错 - 上位机下发新建程序 | 参数 | 类型 | 必填 | 说明 | | |------|------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | | jobName | string | 是 | 新建程序名,命名首字母不得为数字 | | | suffix | string | 是 | 程序后缀名 | | | time | string | 是 | 插入指令的时间,格式如 `2025.03.11 20:28:23` | | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "jobName": "TTT", "suffixname": ".JBR", "time": "2025.03.11 20:28:23" } ``` ### 3.1 控制器发送新建作业指令(0x5004) **说明:** 控制器发送给示教器外部按键触发的新建作业 **命令字:** `0x5004` | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | jobName | string | 是 | 需要新建的作业名称 | ```json { "jobName": "文件1" } ``` --- ## 4 程序文件列表查询 **说明:** 上位机下发查询程序文件列表,若成功将会返回 `0x5011`、`0x5012`、`0x5013` 三个命令字 - 使用时,在接收到 `0x5011` 后,开启计时,设定5秒,作用为判断下载文件过程中是否等待超时 - 返回 `0x5012` 时,每个机器人会单独发送,并且每次发送文件数量为五个 - 文件发送完成后,返回 `0x5013` 作为发送完成的标志 ### 4.1 查询程序文件列表(0x5010) **命令字:** `0x5010` **说明:** 上位机下发查询程序文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | ### 4.2 返回程序文件总数(0x5011) **命令字:** `0x5011` **说明:** 控制器返回程序文件总数,获取所有机器人的程序文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | absolutepath | string 数组 | 是 | 程序文件的文件夹列表,如 `{"/job/R1/","/job/R2/","/job/R3/","/job/R4/"}`,当只有一个机器人时,其余位置填空字符串 | | jobfilenum | int 数组 | 是 | 程序文件夹中包含的文件个数,分别对应机器人1,2,3,4,数量包含复位程序;当只有一个机器人时,其余位置为0 | **备注:** 复位程序 - 当点击复位时执行复位程序或者移动到复位点,具体操作看用户设置 ```json { "absolutepath": ["/job/R1/", "/job/R2/", "/job/R3/", "/job/R4/"], "jobfilenum": [4, 1, 1, 1] } ``` ### 4.3 返回程序文件列表(0x5012) **命令字:** `0x5012` **说明:** 控制器主动向上位机发送指令,向上位机回复时每个机器人分开发送 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | listnum | int | 是 | 发送的程序文件数量,单次最多发送5个,范围[0,5] | | jobfilelist | object 数组 | 是 | 程序文件数组,元素个数为 `listnum` 的值 | **jobfilelist 元素结构:** | 参数 | 类型 | 说明 | |------|------|------| | name | string | 程序文件名,如 `xxx.JBR` | | MD5 | string | MD5值,用于判断文件是否相同 | **备注:** `RobotResetProgram.ResetPro` 为复位程序 ```json { "robot": 1, "listnum": 2, "jobfilelist": [ { "name": "RobotResetProgram.ResetPro", "MD5": "e4b21ca518cd2d2eecd4b3f463c02ab1" }, { "name": "yyy.JBR", "MD5": "5b172a7a37a07aa6ccec1c60cfd5db7d" } ] } ``` ### 4.4 程序文件列表查询结束(0x5013) **命令字:** `0x5013` **说明:** 标志着程序文件列表查询结束,控制器返回程序文件列表查询结束的标识 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | --- ## 5 Lua 文件列表查询 ### 5.1 查询 Lua 文件列表(0x5020) **命令字:** `0x5020` **说明:** 上位机发送查询 lua 文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | ### 5.2 返回 Lua 文件列表(0x5021) **命令字:** `0x5021` **说明:** 控制器返回 lua 文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | absolutepath | string | 是 | lua 脚本所在目录,如 `lua/` | | sum | int | 是 | 列表总数 | | scriptlist | string 数组 | 是 | lua 文件列表 | ```json { "absolutepath": "lua/", "sum": 2, "scriptlist": ["ww.lua", "ee.lua"] } ``` --- # 指令-运动控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/01.%E6%8C%87%E4%BB%A4-%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 外部轴运动 **说明**:与外部轴有关的运动指令,必须是在存在外部轴的前提下才可以使用。 --- ### MOVJEXT - 外部轴点到点运动 **指令类型**:type = 33 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 100] | % | 速度(m_vUnit 必须为2) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量;1:绑定变量,0:非绑定变量 | | RobotPos | object | - | - | 点位信息(当使用绑定变量点位时,不使用该节点) | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s | | 2 | 百分比(仅可使用2) | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 33, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### MOVLEXT - 外部轴直线运动 **指令类型**:type = 34 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSYNC | int | 0或1 | - | 变位机同步;0:否,1:同步 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 34, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### MOVCEXT - 外部轴圆弧运动 **指令类型**:type = 35 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSYNC | int | 0或1 | - | 变位机同步;0:否,1:同步 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 35, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EXTMOV - 外部轴随动运动 **指令类型**:type = 144 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | _pVarName | double | [-2000, 0) ∪ (0, 2000] | 速度值 | | extaxle | int | 1, 2, 3 | 外部轴编号;1:O1,2:O2,3:O3 | | movtype | int | 0, 1, 2 | 外部轴随动方式;0:随线速度动,1:恒速运动,2:绑定变量 | | p_move_type | object | - | 当 movtype 为2时,绑定的变量为该节点 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "_pVarName": { "data": 2.90, "secondvalue": 0, "value": 0, "varname": "" }, "extaxle": 1, "logout": false, "movtype": 2, "p_move_type": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "p_speed_proportion_factor": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 144, "userParamInt": 0, "userParamString": "" } ``` --- ### ENDEXTMOV - 外部轴随动停止运动 **指令类型**:type = 145 #### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 145, "userParamInt": 0, "userParamString": "" } ``` --- ### GEARIN - 电子齿轮 **指令类型**:type = 148 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | followAxle | int | 1, 2, 3 | 随动轴;1=O1,2=O2,3=O3 | | mainAxle | int | 1-6 | 主轴;J1~J6轴对应1-6 | | proportionfactor | double | (0, 1000] | 比例关系(k);随动轴速(°/s)=K*主轴速(°/s) | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "followAxle": 1, "logout": false, "mainAxle": 2, "proportionfactor": 3.0, "type": 148, "userParamInt": 0, "userParamString": "" } ``` --- ### ENDGEARIN - 电子齿轮停止 **指令类型**:type = 150 #### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 150, "userParamInt": 0, "userParamString": "" } ``` --- ### MRESET - 复位外部轴多圈转动量 **指令类型**:type = 149 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | exterAxis | int | 0, 1, 2, 3 | 外部轴个数;0为全部轴,1=O1,2=O2,3=O3 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 149, "userParamInt": 0, "userParamString": "", "exterAxis": 1 } ``` --- ## 双机运动 **说明**:需要先设置成双机模式。 --- ### MOVJDOUBLE - 双机点到点运动 **指令类型**:type = 59 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 100] | % | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 59, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVLDOUBLE - 双机直线运动 **指令类型**:type = 56 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 56, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVCDOUBLE - 双机圆弧运动 **指令类型**:type = 57 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 57, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVCADOUBLE - 双机整圆运动 **指令类型**:type = 58 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaSPIN | int | 0, 1, 2 | - | 姿态参数;0:姿态不变,1:六轴不转,2:六轴旋转 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 58, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ## 外部点运动 **说明**:使用 MODBUS 或者 TCP 发送过来的点位信息来运动。 --- ### MOVCOMM - 外部点运动 **指令类型**:type = 101 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [2, 1000]或[1, 100] | mm/s 或% | 速度;根据 m_vUnit 和 moveType 确定范围 | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | moveType | string | MovJ/MovL/MovS/MovC | - | 插补方式;MovJ:关节,MovL:直线,MovS:曲线,MovC:圆弧 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | #### m_vUnit 速度单位说明 | m_vUnit 值 | 单位 | 适用插补方式 | 速度范围 | |-----------|------|--------------|----------| | 1 | mm/s | 直线、曲线、圆弧 | [2, 1000] | | 2 | % | 关节 | [1, 100] | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 101, "logout": false, "userParamInt": 0, "userParamString": "", "moveType": "MovS" } ``` --- ## 拖拽轨迹运动 **说明**:使用原本的拖拽轨迹来运动。 --- ### DRAG_TRAJECTORY - 拖拽轨迹 **指令类型**:type = 174 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | trackName | string | - | - | 轨迹名称;开头##,结束$$ | | trackSpeed | double | 0~500 | % | 轨迹回放速率 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 174, "userParamInt": 0, "userParamString": "", "trackName": "##RRR$$", "trackSpeed": 3 } ``` --- ## 切换负载编号 **说明**:不切换工具手,只切换负载编号。 --- ### SWITCHPAYLOAD - 切换负载编号 **指令类型**:type = 219 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | _pVarName | object | - | 负载编号参数 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 负载编号范围 | 范围 | 说明 | |------|------| | 1-999 | int 类型 | #### 示例 ```json { "logout": false, "type": 219, "userParamInt": 0, "userParamString": "", "_pVarName": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" } } ``` --- ## 外部基准点运动 **说明**:外部基准点是指将空间中的一点作为本体的控制点。 --- ### EIMOVL - 外部基准点直线 **指令类型**:type = 233 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 233, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EIMOVC - 外部基准点圆弧 **指令类型**:type = 233 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 233, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EIMOVCA - 外部基准点整圆 **指令类型**:type = 235 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaSPIN | int | 0 | - | 姿态参数;0:姿态不变 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 235, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- # 指令-通用运动 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/02.%E6%8C%87%E4%BB%A4-%E9%80%9A%E7%94%A8%E8%BF%90%E5%8A%A8.html ## 1. MOVJ 点到点运动 **说明**:点到点运动为关节运动,单位为%。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,100] | % | 速度,m_vUnit 必须为2 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 1 | - | 指令类型,1表示 MOVJ 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 1, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 2. MOVL 直线运动 **说明**:直线运动速度单位为 mm。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 2 | - | 指令类型,2表示 MOVL 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### m_vUnit 速度单位说明 | 值 | 单位 | |----|------| | 0 | cm/s | | 1 | mm/s | | 2 | 百分比 | > 直线运动时只能使用 1 (mm/s)。 ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 2, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 3. MOVC 圆弧运动 **说明**:使用时需要一条直线或点到点指令和两条圆弧指令,这三个点确定一个圆弧。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSPIN | double | 0或1 | - | 姿态参数:0=示教姿态,1=姿态倾角不变 | | type | int | 3 | - | 指令类型,3表示 MOVC 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 3, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 4. MOVCA 插入整圆 **说明**:整圆运动需要一条点到点或者直线运动,加两个整圆运动指令。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSPIN | double | 0,1,2 | - | 姿态参数:0=姿态不变,1=六轴不转,2=六轴旋转 | | type | int | 4 | - | 指令类型,4表示 MOVCA 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 4, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 5. MOVS 插入曲线 **说明**:曲线运动为 S 型运动轨迹,需要一条点到点或直线指令,再加四条曲线运动指令。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 6 | - | 指令类型,6表示 MOVS 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 6, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 6. IMOV 增量运动 **说明**:增量运动为在当前位置的基础上,各轴增加多少。此时的点位信息为各轴增加多少。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,100] | % | 速度,m_vUnit 必须为2 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 5 | - | 指令类型,5表示 IMOV 指令 | | imovecoord | string | - | - | 移动坐标:RF=关节坐标,BF=直角坐标,TF=工具坐标,UF=用户坐标 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 5, "logout": false, "imovecoord": "RF", "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 7. MOVARCH 门型运动 **说明**:门型运动为从当前位置抬升或降低到指定高度,随后在该平面上移动到目标点的上方或下方,最后抬升或降低到目标点。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaSPIN | double | [0,1] | - | 关节运动方式:0=关节,1=直角 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 231 | - | 指令类型,231表示 MOVARCH 指令 | | offsetAxis | int | [0,2] | - | 位移轴:0=X,1=Y,2=Z | | para_line_or_coord_max_ | double | - | - | 最大坐标值或最大高度值 | | axis_offset_type_ | int | 0或1 | - | 偏移方式:1=最大坐标,0=最大高度 | | para_straight_up_ | double | - | - | 垂直上升距离 | | para_straight_down_ | double | - | - | 垂直下降距离 | | use_arch_params_table_enable_ | int | 0或1 | - | 是否使用参数表 | | arch_param_group_index_ | int | [0,6] | - | 参数表组号 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 231, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0, "offsetAxis": 0, "para_line_or_coord_max_": 0.0, "axis_offset_type_": 1, "para_straight_up_": 0.0, "para_straight_down_": 0.0, "use_arch_params_table_enable_": 0, "arch_param_group_index_": 0 } ``` --- ## 8. MOVARCHEXT 扩展门型运动 **说明**:门型运动为从当前位置抬升或降低到指定高度,随后在该平面上移动到目标点的上方或下方,最后抬升或降低到目标点。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 275 | - | 指令类型,275表示 MOVARCHEXT 指令 | | offsetAxis | int | [0,2] | - | 位移轴:0=X,1=Y,2=Z | | para_straight_up_ | double | - | - | 垂直上升距离 | | para_straight_down_ | double | - | - | 垂直下降距离 | | use_arch_params_table_enable_ | int | 0或1 | - | 是否使用参数表 | | arch_param_group_index_ | int | [0,6] | - | 参数表组号 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### 点位信息说明 - **RobotPos**:目标点点位信息 - **RobotPos1**:接近点点位信息 - **RobotPos2**:转移点点位信息 当使用绑定变量点位时,不使用对应节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 275, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0, "offsetAxis": 0, "para_straight_up_": 0.0, "para_straight_down_": 0.0, "use_arch_params_table_enable_": 0, "arch_param_group_index_": 0 } ``` --- ## 9. SPEED 全局速度 **说明**:可使用该指令设置全局速度。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | type | int | 31 | - | 指令类型,31表示 SPEED 指令 | | paraSpeed | int | [1,200] | % | 全局速度 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | ### JSON 示例 ```json { "type": 31, "paraSpeed": { "data": 150.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "userParamInt": 0, "userParamString": "" } ``` --- ## 10. SAMOV 定点移动 **说明**:定点移动可以使用不同的坐标系移动。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [2,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 59 | - | 指令类型,59表示 SAMOV 指令 | | imovecoord | string | - | - | 移动坐标:RF=关节坐标,BF=直角坐标,TF=工具坐标,UF=用户坐标 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "AP0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 59, "logout": false, "imovecoord": "RF", "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- # 指令-输入输出类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/03.%E6%8C%87%E4%BB%A4-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B1%BB.html --- ## DIN IO 输入 **说明**:输入是相对于控制器而言,由外部到控制器。IO 输入的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | DIN 在枚举数列 type 中为17 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输入 | | ParaGroupValue | object | 端口值存入;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | din 类型;1路输入:IN#,4路输入:IGH#,8路输入:IG# | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **示例**: ```json { "logout": false, "type": 17, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "groupType": "IGH#" } ``` --- ## DOUT IO 输出 **说明**:将 IO 板上对应的 IO 端口置高或置低。IO 输出的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | DOUT 在枚举数列 type 中为16 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输出 | | ParaGroupValue | object | 端口值输出;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | dout 类型;1路输出:OT#,4路输出:OGH#,8路输出:OG# | | errorHanding | int | 1:计时结束停止,0:输出值保持 | | ParaGroupTime | object | 时间;double 类型;范围[0,9999] | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **ParaGroupTime 结构**: ```json {"data":3.0,"secondvalue":0,"value":0,"varname":""} ``` **示例**: ```json { "logout": false, "type": 16, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "errorHanding": 1, "groupType": "OT#", "ParaGroupTime": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## AIN 模拟输入 **说明**:输入是相对于控制器而言,由外部到控制器。模拟输入的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | AIN 在枚举数列 type 中为21 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupValue | object | 变量值;double 类型 | | portId | int | 模拟输入口;int 类型;取值范围1-IO 板数*2 | **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"D001"} ``` **示例**: ```json { "logout": false, "type": 21, "userParamInt": 0, "userParamString": "", "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "D001"}, "portId": 4 } ``` --- ## AOUT 模拟输出 **说明**:输出是由控制器控制 IO 板的值。模拟输出的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | AOUT 在枚举数列 type 中为20 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupValue | object | 变量值;double 类型;范围[0,10] | | portId | int | 模拟输入口;int 类型;取值范围1-IO 板数*2 | **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"D001"} ``` **示例**: ```json { "logout": false, "type": 20, "userParamInt": 0, "userParamString": "", "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "D001"}, "portId": 4 } ``` --- ## PULSEOUT 脉冲输出 **说明**:按照设定的脉冲频率与个数,在 R1 PWMIO 板上的 DB9端子的引脚4(PWM+)上进行输出。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | PULSEOUT 在枚举数列 type 中为22 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | rate | int | 频率;int 类型;范围[1,1000000] | | sum | int | 个数;int 类型;范围大于零 | **示例**: ```json { "logout": false, "type": 22, "userParamInt": 0, "userParamString": "", "rate": 10, "sum": 100 } ``` --- ## READ_DOUT 读取输出 **说明**:将数字输出端口的状态通过变量读取,然后将2进制转为10进制数值并存入目标变量中。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | READ_DOUT 在枚举数列 type 中为99 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输出 | | ParaGroupValue | object | 端口值输出;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | dout 类型;1路输出:OT#,4路输出:OGH#,8路输出:OG# | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **示例**: ```json { "logout": false, "type": 99, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "groupType": "IGH#" } ``` --- # 指令-运算类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/04.%E6%8C%87%E4%BB%A4-%E8%BF%90%E7%AE%97%E7%B1%BB.html --- ## 加 (ADD) **说明**:参数1与参数2相加的值存入结果变量 **指令名**:ADD | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | ADD 在枚举序列中为43 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 43, "userParamInt": 0, "userParamString": "" } ``` --- ## 减 (SUB) **说明**:参数1与参数2相减的值存入结果变量 **指令名**:SUB | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | SUB 在枚举序列中为44 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 44, "userParamInt": 0, "userParamString": "" } ``` --- ## 乘 (MUL) **说明**:参数1与参数2相乘的值存入结果变量 **指令名**:MUL | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | MUL 在枚举序列中为45 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 45, "userParamInt": 0, "userParamString": "" } ``` --- ## 除 (DIV) **说明**:参数1与参数2相除的值存入结果变量(除数不可为零) **指令名**:DIV | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | DIV 在枚举序列中为46 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 46, "userParamInt": 0, "userParamString": "" } ``` --- ## 模 (MOD) **说明**:进行模运算,将模运算的结果存入到选择的结果变量 **指令名**:MOD | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量,全局或局部变量 | | type | int | MOD 在枚举序列中为47 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 47, "userParamInt": 0, "userParamString": "" } ``` --- ## 正弦 (SIN) **说明**:正弦运算(sin),A = sin(B),B 为弧度制 rad **指令名**:SIN | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | SIN 在枚举序列中为102 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 102, "userParamInt": 0, "userParamString": "" } ``` --- ## 余弦 (COS) **说明**:余弦运算(cos),A = cos(B),B 为弧度制 rad **指令名**:COS | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | COS 在枚举序列中为103 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 103, "userParamInt": 0, "userParamString": "" } ``` --- ## 反正弦 (ANTN) **说明**:反正弦运算(arcsin),A = arcsin(B),B 为弧度制 rad **指令名**:ANTN | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | ANTN 在枚举序列中为104 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 104, "userParamInt": 0, "userParamString": "" } ``` --- ## 逻辑运算 (LOGICAL_OP) **说明**:逻辑运算(与、或、非) **指令名**:LOGICAL_OP | 字段 | 类型 | 说明 | |------|------|------| | logicalType | int | 运算类型;取值范围:0(与)、1(或)、2(非) | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraGroupOne | object | 变量1;int 类型变量或 double 类型变量或 bool 类型或 IO 输入,全局或局部变量 | | paraGroupStore | object | 结果变量;int 类型变量或 double 类型变量或 bool 类型,全局或局部变量 | | paraGroupTwo | object | 参数2;int 类型变量或 double 类型变量或 bool 类型或 IO 输入,全局或局部变量 | | type | int | LOGICAL_OP 在枚举序列中为121 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraGroupOne/paraGroupStore/paraGroupTwo 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "logicalType": 1, "logout": false, "paraGroupOne": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "paraGroupStore": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraGroupTwo": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 121, "userParamInt": 0, "userParamString": "" } ``` --- --- # 指令-条件控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/05.%E6%8C%87%E4%BB%A4-%E6%9D%A1%E4%BB%B6%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 调用子程序 (CALL) **说明**:调用另一个程序,被调用的程序运行完后返回主程序 CALL 指令的下一行继续运行。 **指令名**:CALL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | callInParaVarData | array | 否 | 输入参数个数及选择;有0-12个元素。元素格式:`{"data":0.0,"secondvalue":0,"value":2,"varname":"D001"}` | | callOutParaVarData | array | 否 | 输出参数个数及选择;有0-12个元素。元素格式:`{"data":0.0,"secondvalue":0,"value":2,"varname":"D001"}` | | jobName | string | 是 | 调用程序名称,不能是本身,调用的程序中须有参数声明 | | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL 在枚举数列中为15 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**:有两个参数 ```json { "callInParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D002" } ], "callOutParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD003" }, { "data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD004" } ], "jobName": "QQQQ", "logout": false, "type": 15, "userParamInt": 0, "userParamString": "" } ``` --- ## 退出 (RETURN) **说明**:退出当前运行的作业文件,例如:子程序、后台程序。 **指令名**:RETURN | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | RETURN 在枚举数列中为251 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 251, "userParamInt": 0, "userParamString": "" } ``` --- ## 调用 Lua 文件 (CALL_LUAFILE) **说明**:参数定义好之后,直接上传 Lua 文件,然后插入调用 Lua 文件指令,指令运行结束后会把写好的所有参数变量传入和输出。 **指令名**:CALL_LUAFILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL_LUAFILE 在枚举数列中为218 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | inParaVarData | array | 否 | 传入参数个数及选择;元素个数[0-12]。元素格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}` | | luafileName | string | 是 | 调用的 lua 文件 | | outParaVarData | array | 否 | 输出参数个数及选择;元素个数[0-12]。元素格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}` | | textEditType | bool | 否 | 文本编译类型;true:文本类型,false:语句类型 | **示例**: ```json { "logout": false, "type": 218, "userParamInt": 0, "userParamString": "", "inParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" } ], "luafileName": "demo.lua", "outParaVarData": [ { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" } ], "textEditType": true } ``` --- ## 如果 (IF) **说明**:通过判断条件是否成立来执行下一目标的指令,判断条件不满足时,执行 ELSEIF 语句。IF 和 ENDIF 配对使用,不能单独删除或更改,会导致程序运行出错。ELSE IF 不可脱离 IF 单独使用。ELSE 不可脱离 IF 单独使用。 **指令名**:IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | IF 在枚举数列中为9 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ifconditionArrayFINAL | object | 是 | 表示 if 判断;{}内的为 if 判断的数据 | **ifconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **conditionGroup 元素结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | logicType | int | if 判断条件比较方式;1:==,2:<,3:>,4:<=,5:>=,6:!= | | paraGroupOne | object | 变量1,格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I002"}` | | paraGroupTwo | object | 变量2,格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I002"}` | **示例**: ```json { "logout": false, "type": 9, "userParamInt": 0, "userParamString": "", "ifconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1, 0] } } ``` ### 结束如果 (END IF) **指令名**:END IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | END IF 在枚举数列中为12 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 12, "userParamInt": 0, "userParamString": "" } ``` ### 否则如果 (ELSE IF) **指令名**:ELSE IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ELSE IF 在枚举数列中为11 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ifconditionArrayFINAL | object | 是 | 表示 if 判断;{}内的为 if 判断的数据 | **ifconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 11, "userParamInt": 0, "userParamString": "", "ifconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1, 0] } } ``` ### 否则 (ELSE) **指令名**:ELSE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ELSE 在枚举数列中为10 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 10, "userParamInt": 0, "userParamString": "" } ``` --- ## 等待 (WAIT) **说明**:条件成立之前程序处于等待状态,条件成立后继续执行等待指令后面的指令。 **指令名**:WAIT | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WAIT 在枚举数列中为8 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | m_filterTime | double | 否 | 滤波时间,输入信号需满足的时间;[0,9999]s。滤波时间要小于等待时间 | | paraTime | object | 否 | 等待时间;double 类型;[0.01,9999]s | | para_wait_result_ | object | 否 | 等待结果,满足条件为 true;bool 类型 | | waitConditionFinal | object | 否 | {}内为参与判断的条件和变量 | | wait_value_check_ | bool | 否 | 是否接受结果;true:存在"para_wait_result_"节点,false:不存在 | **waitConditionFinal 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 8, "userParamInt": 0, "userParamString": "", "m_filterTime": 66.0, "paraTime": { "data": 77.0, "secondvalue": 0, "value": 0, "varname": "" }, "para_wait_result_": { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B005" }, "waitConditionFinal": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } } ], [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" } } ], [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I007" } } ] ], "logic": [1, 0] }, "wait_value_check_": true } ``` --- ## WHILE 循环 (WHILE) **说明**:判断条件为真是反复执行循环语句里面的指令。插入 WHILE 指令的同时会同时插入 ENDWHILE 指令。若要删除 WHILE 指令请同时删掉其对应的 ENDWHILE 指令,否则会导致程序无法运行。当程序的开头为 WHILE 且最后一样指令为 ENDWHILE 时,请在程序的开头或结尾插入一条 TIMER(延时)指令。否则当 WHILE 指令的条件不满足时会导致程序陷入死机。当 WHILE 内部的指令没有运动类指令或在某种情况下可能会陷入死循环时,请在 WHILE 与 ENDWHILE 间插入一条 TIMER(延时)指令,否则当 WHILE 指令的条件满足时可能会导致程序陷入死机。当 WHILE 指令的条件满足时,会循环运行 WHILE 与 ENDWHILE 两条指令之间的指令。在运行到 WHILE 指令之前若判断条件不满足,在运行到 WHILE 指令时会直接跳转到 ENDWHILE 指令而不运行 WHILE 与 ENDWHILE 之间的指令;若在运行 WHILE 与 ENDWHILE 之间的指令过程中,判断条件变成不满足,会继续运行,直到运行到 ENDWHILE 行,不再循环而是继续运行 ENDWHILE 下面的指令。 **指令名**:WHILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WHILE 在枚举数列中为13 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | whileconditionArrayFINAL | object | 是 | 表示 while 判断;{}内的为 while 判断的数据 | **whileconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | while 判断与 while 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 13, "userParamInt": 0, "userParamString": "", "whileconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } } ], [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" } } ], [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I007" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" } }, { "logicType": 4, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I008" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I009" } } ] ], "logic": [0, 1], "logicGroup": [null, null, [0]] } } ``` ### 结束循环 (ENDWHILE) **指令名**:ENDWHILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ENDWHILE 在枚举数列中为14 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 14, "userParamInt": 0, "userParamString": "" } ``` --- ## LABEL 标签 (LABEL) **说明**:指定跳转目标行的标签。同一程序无法插入两条标签名相同的标签指令。标签指令不支持上移、下移操作。 **指令名**:LABEL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | LABEL 在枚举数列中为51 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | label | string | 是 | 标签名;格式:`[$......$]` | **示例**: ```json { "logout": false, "type": 51, "userParamInt": 0, "userParamString": "", "label": "[$EAFF$]" } ``` --- ## JUMP 跳转 (JUMP) **说明**:跳转至指定标签号的指令行。判断条件成立则跳转到 LABEL 指令行,若判断条件不成立则忽略 JUMP 指令,继续运行 JUMP 指令的下一行指令。JUMP 指令必须与 LABEL(标签)指令配合使用。JUMP 指令不可跨程序跳转。例如主程序里面插入 LABEL [$Q1$]指令,在子程序插入 JUMP [$Q1$]指令,程序运行会报错。 **指令名**:JUMP | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | JUMP 在枚举数列中为52 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | jumpCondition | object | 否 | 表示 if 判断;{}内的为 if 判断的数据 | | jumpConditionFlag | bool | 否 | 是否使用判断条件;true:使用,false:不使用 | | label | string | 是 | 标签名;格式:`[$......$]` | **jumpCondition 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 52, "userParamInt": 0, "userParamString": "", "jumpCondition": { "conditionGroup": [ [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" }, "paraGroupTwo": { "data": 89.0, "secondvalue": 0, "value": 0, "varname": "" } }, { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 88.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I089" }, "paraGroupTwo": { "data": 78.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1], "logicGroup": [[0]] }, "jumpConditionFlag": true, "label": "[$EAFF$]" } ``` --- ## UNTIL 直到 (UNTIL) **说明**:条件不成立时重复执行 UNTIL 和 ENDUNTIL 之间的指令,条件成立时直接跳到 ENDUNTIL 下面的指令运行。UNTIL 指令插入的同时会插入 ENDUNTIL 指令。若要删除 UNTIL 指令请同时删掉其对应的 ENDUNTIL 指令,否则会导致程序无法运行。 **指令名**:UNTIL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | UNTIL 在枚举数列中为87 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | untilconditionArrayFINAL | object | 是 | {}内的为判断的数据 | **untilconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 87, "userParamInt": 0, "userParamString": "", "untilconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" } }, { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" } } ] ], "logic": [0], "logicGroup": [[1]] } } ``` ### 停止直到 (ENDUNTIL) **指令名**:ENDUNTIL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ENDUNTIL 在枚举数列中为88 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 88, "userParamInt": 0, "userParamString": "" } ``` --- ## 工艺跳行 (CRAFTLINE) **说明**:只用于专用工艺,程序中插入该指令设置对应行数,在专用工艺界面运行程序时会先跳转到对应的行数。 **指令名**:CRAFTLINE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CRAFTLINE 在枚举数列中为89 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | line | int | 是 | 专用工艺界面中对应的指令行数;[1,999] | **示例**: ```json { "logout": false, "type": 89, "userParamInt": 0, "userParamString": "", "line": 3 } ``` --- ## 指令注释 (CMDNOTE) **说明**:专用工艺指令,程序中运行该指令后,在专用工艺界面会跳转到对应的行数。 **指令名**:CMDNOTE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CMDNOTE 在枚举数列中为127 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | note | string | 是 | 注释内容;格式:`##.......$$` | **示例**: ```json { "logout": false, "type": 127, "userParamInt": 0, "userParamString": "", "note": "##ADSDDD$$" } ``` --- ## 到达判断 (POS_REACHABLE) **说明**:判断目标点是否能到达,点位能够到达选择的状态存入的变量置1,不能到达置0。 **指令名**:POS_REACHABLE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | POS_REACHABLE 在枚举数列中为133 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | moveType | int | 否 | 运动类型;0-MOVJ,1-MOVL | | positionId | string | 是 | 位置变量名 | | _pVarName | object | 是 | 状态存入变量 | **示例**: ```json { "logout": false, "type": 133, "userParamInt": 0, "userParamString": "", "moveType": 0, "positionId": "GP0001", "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 6, "varname": "GB001" } } ``` --- ## 计时 (CLKSTART / CLKSTOP / CLKRESET) **说明**:运行该指令开始计时,并将时间记录到局部或者全局 DOUBLE 变量。停止对应序号的计时器计时,停止后已存入变量的值不会归零。 ### 计时开始 (CLKSTART) **指令名**:CLKSTART | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKSTART 在枚举数列中为128 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | | _pVarName | object | 是 | 存入变量 | **示例**: ```json { "logout": false, "type": 128, "userParamInt": 0, "userParamString": "", "ID": 5, "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" } } ``` ### 计时停止 (CLKSTOP) **指令名**:CLKSTOP | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKSTOP 在枚举数列中为129 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | **示例**: ```json { "logout": false, "type": 129, "userParamInt": 0, "userParamString": "", "ID": 5 } ``` ### 计时复位 (CLKRESET) **指令名**:CLKRESET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKRESET 在枚举数列中为130 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | **示例**: ```json { "logout": false, "type": 130, "userParamInt": 0, "userParamString": "", "ID": 5 } ``` --- ## 读取线速度 (READLINEAR / STOPREADLINEAR) **说明**:机器人运行的时候实时读取机器人线速度,将读取到的速度存入到变量。插入读取线速度指令时会同时插入读取线速度停止,如果要删除读取线速度指令请将对应线速度停止指令删除,否则程序会报错。 ### 读取线速度 (READLINEAR) **指令名**:READLINEAR | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | READLINEAR 在枚举数列中为146 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | _pVarName | object | 是 | 变量;int 类型或 double 类型 | **示例**: ```json { "logout": false, "type": 146, "userParamInt": 0, "userParamString": "", "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI003" } } ``` ### 停止读取线速度 (STOPREADLINEAR) **指令名**:STOPREADLINEAR | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | STOPREADLINEAR 在枚举数列中为147 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 147, "userParamInt": 0, "userParamString": "" } ``` --- ## 调用 Lua 语句 (CALL_LUASTRING) **说明**:通过调用 Lua 语句来实现相应的功能或操作。 **指令名**:CALL_LUASTRING | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL_LUASTRING 在枚举数列中为230 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | textEditType | bool | 否 | 文本编译类型;true:文本类型,false:语句类型 | | variable | object | 否 | lua 语句变量 | **示例**: ```json { "logout": false, "type": 230, "userParamInt": 0, "userParamString": "", "textEditType": false, "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" } } ``` --- ## 参数声明 (PARAM_DECLARATION) **说明**:声明要输入或者输出的参数,输入参数将被子程序接收并使用,输出参数将返回给主程序使用。 **指令名**:PARAM_DECLARATION | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | PARAM_DECLARATION 在枚举数列中为237 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | declareInParaVarData | array | 否 | 输入参数变量;元素个数为输入参数个数;参数个数[0,12] | | declareInParaVarValues | array | 否 | 输入参数默认值;元素个数为输入参数个数;参数个数[0,12] | | declareInParaVarnote | array | 否 | 输入参数注释;元素个数为输入参数个数;参数个数[0,12] | | declareOutParaVarData | array | 否 | 输出参数值;元素个数为输出参数个数;参数个数[0,12] | | declareOutParaVarnote | array | 否 | 输出参数注释;元素个数为输出参数个数;参数个数[0,12] | **示例**: ```json { "logout": false, "type": 237, "userParamInt": 0, "userParamString": "", "declareInParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } ], "declareInParaVarValues": [ { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D002" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D003" } ], "declareInParaVarnote": [ "000", "111", "222" ], "declareOutParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B001" }, { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B002" } ], "declareOutParaVarnote": [ "333", "4444" ] } ``` --- ## 等到运动到点 (WAIT_POS) **说明**:MOV 指令执行结束并不代表伺服运行结束,仅为点位下发结束,此指令等待伺服电机运行精准到点,再执行下一个指令。此指令必须在运动指令后执行此指令才生效。此指令只能仅支持前台程序,后台无运动指令自然也不需要使用。此指令不支持提前执行。如果机器人在最小等待时间和最大等待时间之间,运动到点了,就会退出等待,执行下一条指令。 **指令名**:WAIT_POS | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WAIT_POS 在枚举数列中为238 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | accurary | double | 是 | 精度;[0.0001,0.1]度/秒 | | waitType | int | 否 | 等待类型;0:位置,1:速度 | | maxTime | int | 是 | 最大等待时间;[20,20000] | | minTime | int | 是 | 最小等待时间;[20,20000] | **示例**: ```json { "logout": false, "type": 238, "userParamInt": 0, "userParamString": "", "accurary": 0.10, "maxTime": 200, "minTime": 20, "waitType": 0 } ``` --- ## 碰撞检测 (DETECTCOLLISION_SET / DETECTCOLLISION_RESET) **说明**:碰撞检测设置:调用临时参数,方便及时调整碰撞检测阈值。碰撞检测设置指令只是临时参数,只对碰撞检测设置指令下面的运动指令有效,不插入碰撞检测设置指令时调用人机协作-力学功能界面的碰撞检测阈值(指令)参数。碰撞检测参数复位:复位临时使用的碰撞检测阈值,执行此条指令后会调用人机协作-力学功能界面的碰撞检测阈值(指令)参数。 ### 碰撞检测设置 (DETECTCOLLISION_SET) **指令名**:DETECTCOLLISION_SET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | DETECTCOLLISION_SET 在枚举数列中为243 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | axis_1_ | double | 否 | 1轴;[1,10000] | | axis_2_ | double | 否 | 2轴;[1,10000] | | axis_3_ | double | 否 | 3轴;[1,10000] | | axis_4_ | double | 否 | 4轴;[1,10000] | | axis_5_ | double | 否 | 5轴;[1,10000] | | axis_6_ | double | 否 | 6轴;[1,10000] | | axis_7_ | double | 否 | 7轴;[1,10000] | | collision_detection_enable_ | int | 否 | 碰撞检测使能;1:使能,0:关闭使能 | | temp_parameters_enable_ | int | 否 | 使用临时参数;1:使用,0:不使用 | **示例**: ```json { "logout": false, "type": 243, "userParamInt": 0, "userParamString": "", "axis_1_": 10.0, "axis_2_": 20.0, "axis_3_": 30.0, "axis_4_": 40.0, "axis_5_": 50.0, "axis_6_": 60.0, "axis_7_": 0.0, "collision_detection_enable_": 1, "temp_parameters_enable_": 1 } ``` ### 碰撞检测参数复位 (DETECTCOLLISION_RESET) **指令名**:DETECTCOLLISION_RESET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | DETECTCOLLISION_RESET 在枚举数列中为244 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 244, "userParamInt": 0, "userParamString": "" } ``` --- ## Switch 条件分支 (Switch / Case / Default / EndSwitch) **说明**:当 SWITCH 的参数值与某个 CASE 值匹配,则会跳到对应的 CASE 语句块中执行相应的指令,执行完该语句块则会跳出 SWITCH;若 SWITCH 的参数值不与任何一个 CASE 匹配则运行 DEFAULT 语句。 ### Switch (Switch) **指令名**:Switch | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Switch 在枚举数列中为247 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | variable_switch_ | object | 是 | 变量;int 类型 | **示例**: ```json { "logout": false, "type": 247, "userParamInt": 0, "userParamString": "", "variable_switch_": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` ### Case (Case) **指令名**:Case | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Case 在枚举数列中为248 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | switch_case | int | 是 | case 的值 | **示例**: ```json { "logout": false, "type": 248, "userParamInt": 0, "userParamString": "", "switch_case": 22 } ``` ### Default (Default) **指令名**:Default | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Default 在枚举数列中为249 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 249, "userParamInt": 0, "userParamString": "" } ``` ### EndSwitch (EndSwitch) **指令名**:EndSwitch | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | EndSwitch 在枚举数列中为250 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 250, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-字符串类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/06.%E6%8C%87%E4%BB%A4-%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%B1%BB.html --- ## 1. 字符串追加 (STRING_SPELL) **说明**:在原有字符串变量或者新的字符变量中追加需要的字符,就构成了一个新的字符串变量。 **指令名**:STRING_SPELL **type 值**:223 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串追加在枚举数列中为 223 | 223 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 变量类型及名称;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | variableValue | object | 追加的字符变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"GS001"}` | ### JSON 示例 ```json { "logout": false, "type": 223, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"}, "variableValue": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "GS001"} } ``` --- ## 2. 索引截取 (STRING_SLICE) **说明**:截取一个字符串变量中的其中一部分字符串,并把截取到部分字符串存到指定的变量。 **指令名**:STRING_SLICE **type 值**:224 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,索引截取在枚举数列中为 224 | 224 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | startIndex | object | 起始索引位置;int 类型手填值或者变量,全局或局部 | `{"data":2.0,"secondvalue":0,"value":0,"varname":""}` | | endIndex | object | 结束索引位置;int 类型手填值或者变量,全局或局部 | `{"data":8.0,"secondvalue":0,"value":0,"varname":""}` | | dataVariable | object | 查询的数据依次存放的位置;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GS[I001]"}` | | variable | object | 被截取的字符串变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | ### JSON 示例 ```json { "logout": false, "type": 224, "userParamInt": 0, "userParamString": "", "startIndex": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "endIndex": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GS[I001]"}, "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 3. 字符串分隔符拆分 (STRING_SPLIT) **说明**:将字符串变量中的其中一个字符拆分,并把拆分的字符依次存放到指定变量中。 **指令名**:STRING_SPLIT **type 值**:225 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串分隔符拆分在枚举数列中为 225 | 225 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | separator | object | 分隔符;string 类型的手填值或变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"GS001"}` | | variable | object | 被提取的字符串变量名;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"S[I001]"}` | | dataVariable | object | 查询的数据依次存放的首位置;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | dataStorage | object | 记录提取数据的数量;string 类型的手填"0"或者 int 类型变量,全局或局部。string 类型的手填"0"表示不使用 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[I001]"}` | ### JSON 示例 ```json { "dataStorage": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[I001]"}, "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"}, "logout": false, "separator": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "GS001"}, "type": 225, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "S[I001]"} } ``` --- ## 4. 字符串定位 (STRING_LOCATE) **说明**:查询字符串变量里面的一种字符所在的位置,并把位置和数量存到指定变量。 > **注意:** > - 如果待索引变量在一个字符串里面是不连续的字符,在执行定位查询指令时,字符的位置和个数是无法读取出来的 > - 如果待索引变量在一个字符串里面是连续的字符,在执行定位查询指令时,读取出来的字符位置是第一个索引变量的位置,数据存放个数为1 **指令名**:STRING_LOCATE **type 值**:226 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串定位在枚举数列中为 226 | 226 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 被提取的字符串变量名;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | startIndex | object | 需要搜索的字符;string 类型手填值或变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":7,"varname":"RRRR"}` | | dataVariable | object | 查询的数据依次存放的首位置;int 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | | dataStorage | object | 记录提取数据的数量;string 类型的手填"0"或者 int 类型变量,全局或局部。string 类型的手填"0"表示不使用 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[GI001]"}` | ### JSON 示例 ```json { "dataStorage": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[GI001]"}, "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "startIndex": {"data": 0.0, "secondvalue": 0, "value": 7, "varname": "RRRR"}, "type": 226, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 5. 字符串长度 (STRING_LENGTH) **说明**:计算一个字符串变量的长度,并把计算的长度存到变量。 **指令名**:STRING_LENGTH **type 值**:227 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串长度在枚举数列中为 227 | 227 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 定位字符所在的变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | dataVariable | object | 计算结果存储的结果;int 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | ### JSON 示例 ```json { "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "type": 227, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 6. 字符串转非字符串 (STRING_TO) **说明**:字符串变量转换成非字符串变量。 > **转换规则**:字符串变量转换成非字符串变量时只会将字符串变量的数值部分转译到非字符串变量。在转译过程中会从字符串变量的第一个字符开始转译,直到检测到的字符是非数值的字符时转译结束,将检测到的数值部分的字符转译到非字符变量。如果检测到的第一个字符就是非数值的字符,那字符串无法转译成功。 **指令名**:STRING_TO **type 值**:228 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串转非字符串在枚举数列中为 228 | 228 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 待计算长度的变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | nonVariable | object | 转译的目标变量;int 类型或 double 类型或 bool 类型变量,局部或全局 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | ### JSON 示例 ```json { "nonVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "type": 228, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 7. 非字符串转字符串 (TO_STRING) **说明**:非字符串变量转换成字符串变量。 **指令名**:TO_STRING **type 值**:229 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,非字符串转字符串在枚举数列中为 229 | 229 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 转译的目标变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | nonVariable | object | 需要转译的变量;int 类型或 double 类型或 bool 类型变量,局部或全局 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[GI001]"}` | ### JSON 示例 ```json { "nonVariable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[GI001]"}, "logout": false, "type": 229, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- # 指令-定时器类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/07.%E6%8C%87%E4%BB%A4-%E5%AE%9A%E6%97%B6%E5%99%A8%E7%B1%BB.html ## 延时 **说明**:延时设置的值,到达设置的时间后程序继续运行 | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | logout | bool | 是 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | paraTime | object | 是 | 延时持续时间 | {"data":500.0,"secondvalue":0,"value":0,"varname":""} | | paraTime.data | double | 否 | 延时值;取值范围(0,9999];单位 s | 500.0 | | paraTime.value | int | 否 | 变量值(备用) | 0 | | paraTime.secondvalue | int | 否 | 变量值(备用) | 0 | | paraTime.varname | string | 否 | 变量名(使用变量时填) | "" | | type | int | 是 | TIMER 在枚举数列中为7 | 7 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | "" | **命令字**:TIMER **JSON 示例**: ```json { "logout": false, "paraTime": { "data": 500.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 7, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-变量类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/08.%E6%8C%87%E4%BB%A4-%E5%8F%98%E9%87%8F%E7%B1%BB.html --- ## 1. 赋值 (SET) ### 说明 给定义的整型、浮点型、布尔型和字符串变量赋值。字符串追加指令。 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 指令类型,值为 41 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variable | object | 变量;int 类型或 bool 类型或 double 类型或 string 类型变量,全局或局部 | | variableValue | object | 变量值;手填值或 bool 类型或 int 类型或 double 类型变量 | ### variable 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### variableValue 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### 示例 ```json { "logout": false, "type": 41, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GD009" } } ``` --- ## 2. 写入文件 (FORCESET) ### 说明 将缓存的数据存入硬盘。在程序运行过程中,所有的计算、赋值操作均是对缓存中的数值进行更改的,并不会存入系统文件中。若要强制将内存中的全局数值变量写入文件中,则可以使用 FORCESET 指令。 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 指令类型,值为 42 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variable | object | 变量名;int 类型或 bool 类型或 double 类型,全局 | ### variable 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### 示例 ```json { "logout": false, "type": 42, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GI001" } } ``` --- # 指令-坐标系类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/09.%E6%8C%87%E4%BB%A4-%E5%9D%90%E6%A0%87%E7%B3%BB%E7%B1%BB.html --- ## 1. 切换工具手 (SWITCHTOOL) **说明:** 切换工具手,0为无工具手 **指令名:** `SWITCHTOOL` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `_variable` | object | - | 变量类型;手填 int 类型或 int 类型,全局或局部 | | `_variable.data` | float | - | 数据值 | | `_variable.secondvalue` | int | - | 副值 | | `_variable.value` | int | [0, 999] | 工具手编号 | | `_variable.varname` | string | - | 变量名 | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 48 | 切换工具手在枚举数列 type 中为48 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "_variable": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009" }, "logout": false, "type": 48, "userParamInt": 0, "userParamString": "" } ``` --- ## 2. 切换用户坐标 (SWITCHUCOORD) **说明:** 切换用户坐标 **指令名:** `SWITCHUCOORD` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `_variable` | object | - | 变量类型;手填 int 类型或 int 类型,全局或局部 | | `_variable.data` | float | - | 数据值 | | `_variable.secondvalue` | int | - | 副值 | | `_variable.value` | int | [0, 999] | 用户坐标编号 | | `_variable.varname` | string | - | 变量名 | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 49 | 切换用户坐标在枚举数列 type 中为49 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "_variable": { "data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]" }, "logout": false, "type": 49, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. 用户坐标转换 (USERCOORD_TRANS) **说明:** 将 B、C 用户坐标系叠加(×),结果置入 A 用户坐标系 **指令名:** `USERCOORD_TRANS` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `CoordA` | int | [1, 999] | 用户坐标 A;结果存入该用户坐标系,这里是用户坐标系序号 | | `CoordB` | int | [1, 999] | 用户坐标 B | | `CoordC` | int | [1, 999] | 用户坐标 C | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 117 | 用户坐标转换在枚举数列 type 中为117 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "CoordA": 8, "CoordB": 18, "CoordC": 28, "logout": false, "type": 117, "userParamInt": 0, "userParamString": "" } ``` --- ## 4. 切换外部轴 (SWITCHSYNC) **说明:** 在程序运行中切换当前使用的外部轴 **指令名:** `SWITCHSYNC` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `syncgroup` | int | [1, 3] | 要切换到的外部轴的组号 | | `type` | int | 50 | 切换外部轴在枚举数列 type 中为50 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "logout": false, "syncgroup": 2, "type": 50, "userParamInt": 0, "userParamString": "" } ``` --- --- # 指令-网络通讯类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/10.%E6%8C%87%E4%BB%A4-%E7%BD%91%E7%BB%9C%E9%80%9A%E8%AE%AF%E7%B1%BB.html --- ## 发送数据 **说明**:向个网络设备发送字符串信息或者变量值 **指令名**:SENDMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | sendChar | 发送的字符消息 | string | - | | type | 发送数据在枚举数列 type 中为94 | int | 94 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 7, "logout": false, "sendChar": "UUUUUU", "type": 94, "userParamInt": 0, "userParamString": "" } ``` --- ## 解析数据 **说明**:该指令用来解析外部设备传来的一组数据,并将数据存入多个变量 **指令名**:PARSEMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | clearCache | 解析后是否清楚缓存区,0:否,1:是 | int | [0,1] | | dataStorage | 记录提取数据的数量;手填值 int 类型0或 int 类型变量,全局或局部;手填值0表示不记录提取数据的数量 | object | - | | dataVariable | 查询的数据依次存放的首位置;int 类型或 double 类型或 string 类型变量,全局或局部 | object | - | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 解析数据在枚举数列 type 中为96 | int | 96 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 3, "clearCache": 1, "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009" }, "dataVariable": { "data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]" }, "logout": false, "type": 96, "userParamInt": 0, "userParamString": "" } ``` --- ## 读取 **说明**:读取通过以太网或 Modbus 通讯发送点位,并将点位存入到变量 **指令名**:READCOMM | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | commType | 通讯方式,0:ETHERENT 通讯,1:MODBUS 通讯 | int | [0,1] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | m_varname | 点位存放个数;int 类型变量,全局或局部 | string | - | | positionId | 点位存放首个变量;P:点位局部变量,GP:点位全局变量 | string | - | | type | 读取在枚举数列 type 中为110 | int | 110 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 6, "commType": 1, "logout": false, "m_varname": "I001", "positionId": "GP0001", "type": 110, "userParamInt": 0, "userParamString": "" } ``` --- ## 打开数据 **说明**:打开网络通讯 **指令名**:OPENMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 读取在枚举数列 type 中为115 | int | 115 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 5, "logout": false, "type": 115, "userParamInt": 0, "userParamString": "" } ``` --- ## 关闭数据 **说明**:关闭网络通讯 **指令名**:CLOSEMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 关闭数据在枚举数列 type 中为116 | int | 116 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 7, "logout": false, "type": 116, "userParamInt": 0, "userParamString": "" } ``` --- ## 输出字符 **说明**:通过打印提示条的方式输出定义的信息内容 **指令名**:PRINTMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | printChar | 输出字符 | string | - | | printType | 输出信息类型,0:消息,1:警告,2:错误 | int | [0,2] | | type | 输出字符在枚举数列 type 中为120 | int | 120 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "logout": false, "printChar": "阿斯vca", "printType": 2, "type": 120, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取信息连接状态 **说明**:获取网络设置里某个工艺号的连接状态 **指令名**:MSG_CONNECTION_STATUS | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 获取信息连接状态在枚举数列 type 中为95 | int | 95 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | | variable | 状态存入变量名;bool 类型变量,全局或局部 | object | - | **JSON 示例**: ```json { "ID": 5, "logout": false, "type": 95, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[GI001]" } } ``` --- # 指令-位置变量类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/11.%E6%8C%87%E4%BB%A4-%E4%BD%8D%E7%BD%AE%E5%8F%98%E9%87%8F%E7%B1%BB.html --- ## 用户坐标修改 (USERFRAME_SET) **说明**:修改或者读取用户坐标系某一轴的数值 **指令名**:USERFRAME_SET | **ID**:888 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | coord | string | UX、UY、UZ、UA、UB、UC、UCUSTOM(UX、UY、UZ) | 用户坐标参数。UX、UY、UZ、UA、UB、UC:读取用户坐标系某一轴的数值;UCUSTOM(UX、UY、UZ):自定义,括号中为自定义选中的用户坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | m_varName | string | int 或 double 类型变量,全局或局部 | 变量。写入时可手填 int 类型;取值范围[-2000,2000]。写入时:直接手填数值修改坐标轴的数值,变量赋值的形式修改坐标轴的数值。读取时:用变量的形式将选择的坐标轴的数值读取出来 | | mode | int | [0,1] | 修改方式。0:读取用户坐标某一轴的值,1:修改用户坐标某一轴的值 | | type | int | 97 | 用户坐标修改在枚举数列 type 中为97 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varType | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | ### JSON 示例 ```json { "ID": 888, "coord": "UCUSTOM(UX、UY、UZ)", "logout": false, "m_varName": "I001", "mode": 1, "type": 97, "userParamInt": 0, "userParamString": "", "varType": 1 } ``` --- ## 工具坐标修改 (TOOLFRAME_SET) **说明**:修改或者读取工具手某一轴的参数 **指令名**:TOOLFRAME_SET | **ID**:55 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | coord | string | TX、TY、TZ、TA、TB、TC、TCUSTOM(TZ、TA) | 工具坐标参数。TX、TY、TZ、TA、TB、TC:读取工具坐标系某一轴的数值;TCUSTOM(TZ、TA):自定义,括号中为自定义选中的工具坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | m_newValue | string | - | (未在说明中描述) | | m_varName | string | int 或 double 类型变量,全局或局部 | 变量。写入时可手填 int 类型;取值范围[-2000,2000] | | mode | int | [0,1] | 修改方式。0:读取工具坐标某一轴的值,1:修改工具坐标某一轴的值 | | type | int | 98 | 工具坐标修改在枚举数列 type 中为98 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varType | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | ### JSON 示例 ```json { "ID": 55, "coord": "TCUSTOM(TZ、TA)", "logout": false, "m_newValue": "", "m_varName": "I001", "mode": 1, "type": 98, "userParamInt": 0, "userParamString": "", "varType": 1 } ``` --- ## 读取点位 (READPOS) **说明**:将位置变量的某个轴的值读入到浮点型变量 **指令名**:READPOS | **type**:92 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE 变量名 | 位置变量名。当字符串为空时表示当前读取的是机器人当前位置的坐标。P,GP,E,GE:将点位存入变量,读取时只需要选择想要读取的目标变量即可 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 92 | 读取点位在枚举数列 type 中为92 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varname | string | int 类型变量名 | 目标变量名 | ### JSON 示例 ```json { "axis": 1, "coord": "RF", "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 92, "userParamInt": 0, "userParamString": "", "varname": "D001" } ``` --- ## 点位加 (POSADD) **说明**:在不同坐标系下给位置变量的某一个变量轴增加数值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人一轴的正限位是180°,目标点位一轴的坐标是150°,在设置参数是给变量轴一轴赋值50°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位加指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSADD | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位加在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 5, "caltype": 0, "coord": "RF", "datatype": 1, "desData": "GI001", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位减 (POSSUB) **说明**:在不同坐标系下给位置变量的某一个变量轴减少数值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人二轴的负限位是-50°,目标点位二轴的坐标是30°,在设置参数时给变量轴二轴赋值100°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位减指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSSUB | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位减在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 3, "caltype": 1, "coord": "RF", "datatype": 0, "desData": "666", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位改 (POSSET) **说明**:在不同坐标系下将位置变量的某一个变量轴直接修改点位坐标值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人三轴的正限位是100°,在设置参数时给变量轴二轴赋值120°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位改指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSSET | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位改在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 6, "caltype": 2, "coord": "RF", "datatype": 0, "desData": "666", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 复制点位 (COPYPOS) **说明**:将一个位置变量的点位数据复制到另一个位置变量 **注意**:最大支持连接5个外部轴,在复制外部轴点位时只支持 O1、O2、O3、O4、O5轴的复制,如果在设置参数时勾选了 O6、O7轴,在执行复制点位时 O6、O7轴不生效 **指令名**:COPYPOS | **type**:118 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | cpaxles | int[] | 数组,每个元素代表相应轴号 | 选择需要复制的坐标轴数据 | | cpaxletype | int | [0,1] | 表示是否所有坐标轴数据都复制。0:表示所有坐标轴数据都复制,此时没有"cpaxles"节点;1:看"cpaxles"节点选择了什么 | | cpdposname | string | P 或 E,局部或全局 | 目标位置变量名 | | cpdpostype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | cpposname | string | P,GP,E,GE 变量名 | 源位置变量名。当字符串为空时表示当前读取的是机器人当前位置的坐标 | | cppostype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 118 | 复制点位在枚举数列 type 中为118 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "cpaxles": [2, 4, 6], "cpaxletype": 1, "cpdposname": "GE$GI001", "cpdpostype": 1, "cpposname": "P$GI001", "cppostype": 1, "logout": false, "type": 118, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全加 (POSADDALL) **说明**:在不同坐标系下给位置变量的若干个变量轴增加数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSADDALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的增加值 | 轴增加数值。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全加在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 0, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全减 (POSSUBALL) **说明**:在不同坐标系下给位置变量的若干个变量轴减少数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSSUBALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的增加值 | 轴增加数值(负值为减)。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全减在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 1, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全改 (POSSETALL) **说明**:在不同坐标系下给位置变量的若干个变量轴直接修改为指定数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSSETALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的目标值 | 轴目标数值。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全改在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 2, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 轨迹偏移 (TOFFSETON / TOFFSETOFF) ### 轨迹偏移开始 **说明**: - 该指令能够对机器人的运行轨迹进行实时偏移 - 轨迹偏移结束指令后的运动轨迹不再偏移 - 程序的第一条指令不能使用偏移指令 **指令名**:TOFFSETON | **type**:141 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 7个元素,取值范围[-50000,50000] | 轴增加数值。每个元素为每个轴的增加值;可手填也可为 int 或 double 变量类型,全局或局部 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 7个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | tool | int | [-1,999] | 工具手。-1:不使用;0:当前;1-999:对应的工具手 | | type | int | 141 | 轨迹偏移开始在枚举数列 type 中为141 | | user | int | [-1,999] | 用户。-1:不使用;0:当前;1-999:对应的用户 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I001", "I002", "I003", "I004", "I005", "I006", "I007"], "coord": "TF", "datatype": [1, 1, 1, 1, 1, 1, 1], "logout": false, "tool": 666, "type": 141, "user": -1, "userParamInt": 0, "userParamString": "" } ``` --- ### 轨迹偏移结束 **指令名**:TOFFSETOFF | **type**:142 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 142 | 轨迹偏移结束在枚举数列 type 中为142 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 142, "userParamInt": 0, "userParamString": "" } ``` --- ## 读取点位信息 (READPOSMSG) **说明**:将目标位置的工具号、用户坐标号、坐标系、姿态角度/弧度、形态信息的值读入到一个整型变量 **指令名**:READPOSMSG | **type**:175 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | message | int | [0,4] | 信息读取值。0:工具号;1:用户坐标号;2:坐标系;3:姿态角度/弧度;4:形态 | | positionId | string | - | 位置变量 ID | | type | int | 175 | 读取点位信息在枚举数列 type 中为175 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varName | string | int 类型变量名 | 目标变量名 | | varType | int | - | 变量类型 | ### message 参数详细说明 | 值 | 说明 | |----|------| | 0 | 工具号:读取目标变量的工具手编号 | | 1 | 用户坐标号:读取目标变量的用户坐标编号 | | 2 | 坐标系["0"关节坐标,"1"直角坐标,"2"工具坐标,"3"用户坐标] | | 3 | 姿态角度/弧度:读取目标位置姿态轴的姿态值 | | 4 | 形态:读取目标点位的形态值 | ### JSON 示例 ```json { "logout": false, "message": 4, "positionId": "GP0001", "type": 175, "userParamInt": 0, "userParamString": "", "varName": "I001", "varType": 0 } ``` --- ## 点位拉伸 (POS_STRETCH) **说明**:通过设置起点和终点的偏移量来拉伸或者缩短轨迹的长度和圆弧的轨迹形状 **指令名**:POS_STRETCH | **type**:177 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | position1Id | string | P、GP | 拉伸轨迹的起始点 | | position1OutId | string | P、GP | 输出起点位置,偏移的起点位置 | | position2Id | string | P、GP | 圆弧轨迹中间点 | | position2OutId | string | P、GP | 将偏移后的终点点位存入到选择的位置变量 | | position3Id | string | P、GP | 拉伸轨迹的终点 | | stretchL1 | double | [-10000,10000] | 设置偏移量,改变轨迹起始点的点位 | | stretchL2 | double | [-10000,10000] | 设置偏移量,改变轨迹终点的点位 | | stretchType | int | [0,1] | 拉伸类型。0:直线;1:曲线 | | type | int | 177 | 点位拉伸在枚举数列 type 中为177 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "position1Id": "GP0001", "position1OutId": "GP0006", "position2Id": "GP0002", "position2OutId": "GP0007", "position3Id": "GP0003", "stretchL1": 4.0, "stretchL2": 5.0, "stretchType": 1, "type": 177, "userParamInt": 0, "userParamString": "" } ``` --- ## 设置点位信息 (SETPOSMSG) **说明**:通过设置起点和终点的偏移量来拉伸或者缩短轨迹的长度和圆弧的轨迹形状 **指令名**:SETPOSMSG | **type**:207 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posData | string[] | 5个元素 | 位置数据数组。元素1:坐标系(0-3);元素2:姿态(0-角度/1-弧度);元素3:形态参数(0-8);元素4:工具编号(0-999);元素5:用户编号(0-999) | | posDataType | int[] | 5个元素 | 表示"posData"节点的各个元素是否使用。1:使用;2:不使用 | | posidname | string | P、GP、E、GE | 位置标量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 207 | 设置点位信息在枚举数列 type 中为207 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### posData 数组元素说明 | 索引 | 内容 | 取值范围 | 说明 | |------|------|----------|------| | 0 | 坐标系 | [0,3] | "0"关节坐标,"1"直角坐标,"2"工具坐标,"3"用户坐标 | | 1 | 姿态 | [0,1] | 0:角度;1:弧度 | | 2 | 形态参数 | [0,8] | 设置目标位置的形态参数 | | 3 | 工具编号 | [0,999] | 设置目标位置的工具编号。"0"表示无工具手 | | 4 | 用户编号 | [0,999] | 设置目标位置的用户编号。"0"表示无用户 | ### JSON 示例 ```json { "logout": false, "posData": ["GI002", "GI003", "I004", "GI005", "GI006"], "posDataType": [1, 1, 1, 1, 1], "posidname": "GP$GI001", "posidtype": 1, "type": 207, "userParamInt": 0, "userParamString": "" } ``` --- ## 计算目标形态值 (SOLVE_CONFIGURATION) **说明**:机器人从 A 点(当前实际位置)运动到 B 点时,可以计算出机器人能以多少种形态从 A 到 B **指令名**:SOLVE_CONFIGURATION | **type**:232 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P、GP、E、GE | 目标点。可以选择的位置变量类型 | | type | int | 232 | 计算目标形态值在枚举数列 type 中为232 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varName | object | INT 或 GINT 变量 | 形态值首个变量。将计算出来的形态值存入到选择的目标变量,通过选择的首变量顺延保存计算出来的形态 | | varNumber | object | INT 或 GINT 变量 | 形态值个数。将计算出来的形态值个数存入到选择的目标变量 | ### JSON 示例 ```json { "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 232, "userParamInt": 0, "userParamString": "", "varName": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "varNumber": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"} } ``` --- # 指令-程序控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/12.%E6%8C%87%E4%BB%A4-%E7%A8%8B%E5%BA%8F%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 开启线程 **说明**:开启全局后台或者局部后台任务 **指令名**:PTHREAD_START **type 值**:90 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 后台任务程序文件名 | | localOrGlobal | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "localOrGlobal": 0, "logout": false, "type": 90, "userParamInt": 0, "userParamString": "" } ``` --- ## 退出线程 **说明**:关闭已经开启的后台任务 **指令名**:PTHREAD_END **type 值**:91 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 后台任务程序文件名 | | localOrGlobal | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "localOrGlobal": 0, "logout": false, "type": 91, "userParamInt": 0, "userParamString": "" } ``` --- ## 暂停运行 **说明**:暂停主程序和局部后台程序运行 **指令名**:PAUSERUN **type 值**:111 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 当选取局部后台类型时选择的程序名 | | programtype | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "programtype": 2, "logout": false, "type": 111, "userParamInt": 0, "userParamString": "" } ``` --- ## 继续运行 **说明**:继续运行已暂停的主程序或者局部后台程序 **指令名**:CONTINUERUN **type 值**:112 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 当选取局部后台类型时选择的程序名 | | programtype | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "programtype": 2, "logout": false, "type": 112, "userParamInt": 0, "userParamString": "" } ``` --- ## 停止运行 **说明**:停止正在运行的程序,程序运行到停止运行指令时伺服下电 **指令名**:STOPRUN **type 值**:113 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "logout": false, "type": 113, "userParamInt": 0, "userParamString": "" } ``` --- ## 重新运行 **说明**:停止正在运行的程序,程序运行到停止运行指令时伺服下电 **指令名**:RESTRATRUN **type 值**:117 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "logout": false, "type": 117, "userParamInt": 0, "userParamString": "" } ``` --- ## 弹窗指令 **说明**:运行指令时弹出所填写的提示内容窗口,按钮数量为选项数量,点击按钮会将变量值存入绑定的变量 **指令名**:WINDOW **type 值**:208 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | | count | int | 选项数量,取值范围[0,3] | | text1 | string | 提示内容 | | text2 | string | 选项1内容 | | text3 | string | 选项2内容 | | text4 | string | 选项3内容 | | value1 | int | 选项1对应变量值 | | value2 | int | 选项2对应变量值 | | value3 | int | 选项3对应变量值 | | variable | object | 绑定变量,结构:{data, secondvalue, value, varname} | **variable 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | float | 数据值 | | secondvalue | int | 次要值 | | value | int | 变量值 | | varname | string | 变量名 | **请求示例**: ```json { "logout": false, "type": 208, "userParamInt": 0, "userParamString": "", "count": 3, "text1": "AAAAA", "text2": "1", "text3": "2", "text4": "3", "value1": 1111, "value2": 2222, "value3": 3333, "variable": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` --- ## 线程状态 **说明**:查看当前所执行的线程程序的状态,停止等于1,暂停等于2,运行等于3 **指令名**:PTHREAD_STATE **type 值**:209 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | | jobName | string | 当选取后台类型时选择的程序名 | | localOrGlobal | int | 程序类型:0-局部后台,1-全局后台,2-主程序 | | m_VariableValue | object | 存入变量,结构:{data, secondvalue, value, varname} | **m_VariableValue 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | float | 数据值 | | secondvalue | int | 次要值 | | value | int | 变量值 | | varname | string | 变量名 | **请求示例**: ```json { "logout": false, "type": 209, "userParamInt": 0, "userParamString": "", "jobName": "SFDFF", "localOrGlobal": 0, "m_VariableValue": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` --- # 指令-MODBUS 类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/13.%E6%8C%87%E4%BB%A4-MODBUS%E7%B1%BB.html --- ## MODBUS_OPEN - 打开 Modbus 连接 ### 说明 打开 Modbus 通讯连接 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_OPEN 在枚举数列 type 中为210 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 5, "logout": false, "modType": "Master", "type": 210, "userParamInt": 0, "userParamString": "" } ``` --- ## MODBUS_CLOSE - 关闭 Modbus 连接 ### 说明 断开 Modbus 通讯连接 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_CLOSE 在枚举数列 type 中为211 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 9, "logout": false, "modType": "Master", "type": 211, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## MODBUS_CONNECTION_STATUS - 获取 Modbus 连接状态 ### 说明 将 Modbus 通讯连接的状态存入变量,连接成功该变量值被赋值为1,连接失败选择的该变量被赋值为0 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | 获取 Modbus 连接状态在枚举数列 type 中为212 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 1, "logout": false, "modType": "Master", "type": 212, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[GI001]"} } ``` --- ## MODBUS_READ - Modbus 读状态 ### 说明 读取 Modbus 中对应地址的数值。将获取到的状态存入到变量(bool 类型变量或绑定变量,全局或局部)。 **地址类型说明:** | 地址类型 | 说明 | |----------|------| | 3x | 读取 Modbus 中对应地址的值 | | 4x | 同3x | | 3x-bit | 读取所选地址中所存值得任一 bit 的状态 | | 4x-bit | 同3x-bit | | 0x | 可读可写的设备类型,相当于操作 PLC 的输出点 | | 1x | 只读设备类型,相当于操作 PLC 的输入点 | **地址类型为3X-bit 时从站地址个数范围是[0,16]** **地址类型为3X-bit,存到变量时候的17位为符号位,0表示正数,1表示负数** **读取字符时会将读取到的所有值存入到一个变量,它跟整型、浮点型、布尔型变量不一样,不会根据设置的首地址,读从站地址个数顺延存入其它变量** ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | addressNumber | object | 是 | 读从站地址个数。手填或者 int 类型变量或绑定变量,全局或局部。读取的地址个数,如果设置的读从站地址个数为3,执行读指令后会从 Modbus 首地址开始读取3个地址(包含首地址一共读3个) | | addressType | string | 是 | 地址类型。可选取值:3x,4x,3x-bit,4x-bit,0x,1x | | dataType | string | 是 | 数据类型。当数据存放的首个变量选 I 或 GI 时,从站的数据类型可选 short 和 ushort(分别对应短整型和无符号短整型,前者范围为[-32768,32767],后者的范围为[0,65535])。数据存放首个变量选 I 或 GI 数据类型时需要和从站的数据类型一致,否则可能导致数据出错 | | dataVariable | object | 是 | 数据存放的首个变量。所有变量或绑定变量都可。将读取到的参数存放到变量,如果选择的首个变量为 I001,读取的地址个数为3,执行读指令会把参数值依次存入到 I001、I002、I003 | | firstAddress | object | 是 | 从站寄存器首地址。手填或 int 类型变量或绑定变量,全局或局部。根据指令参数里面设置的首地址读取参数值,如果参数里面设置的首地址是5,在执行读指令后会从 Modbus 第5个地址开始读 | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_READ 在枚举数列 type 中为213 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 3, "addressNumber": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "addressType": "4x-bit", "dataType": "short", "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[GI001]"}, "firstAddress": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "modType": "Master", "type": 213, "userParamInt": 0, "userParamString": "" } ``` --- ## MODBUS_WRITE - Modbus 写操作 ### 说明 该指令用于通过 Modbus 将变量写入从站寄存器中对应位置的地址中 **地址类型说明:** | 地址类型 | 说明 | |----------|------| | 4x | 将变量里的值写入地址码 | | 4x-bit | 将变量组成16位二进制码写入地址码中 | | 0x | 将变量值写入地址码,只有"0","1"两种状态,变量有值的话写入1,变量没值写入0 | ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | addressNumber | object | 是 | 读从站地址个数。手填或者 int 类型变量或绑定变量,全局或局部。读取的地址个数,如果设置的读从站地址个数为3,执行读指令后会从 Modbus 首地址开始读取3个地址(包含首地址一共读3个) | | addressType | string | 是 | 地址类型。可选取值:4x,4x-bit,0x | | dataVariable | object | 是 | 数据存放的首个变量,写入的变量类型。手填或者所有变量或绑定变量都可 | | firstAddress | object | 是 | 从站寄存器首地址。手填或 int 类型变量或绑定变量,全局或局部。开始写入的第一个地址,如果首地址为5,执行写指令会从 modbus 第5个地址开始写入 | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_WRITE 在枚举数列 type 中为214 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 5, "addressNumber": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "addressType": "0x", "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "firstAddress": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "logout": false, "modType": "Master", "type": 214, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-FINSTCP 类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/14.%E6%8C%87%E4%BB%A4-FINSTCP%E7%B1%BB.html ## 1. 打开 FINSTCP 连接 **指令名**: FINSTCP_OPEN **说明**: 用于在运行模式下打开 FINSTCP 通讯连接 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 215 | 打开 FINSTCP 连接在枚举数列 type 中为210 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量对象,包含 data、secondvalue、value、varname 等属性 | ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 215, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ``` --- ## 2. 断开 FINSTCP 连接 **指令名**: FINSTCP_CLOSE **说明**: 在运行模式下断开 FINSTCP 通讯连接 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 216 | FINSTCP_CLOSE 在枚举数列 type 中为216 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 9, "logout": false, "type": 216, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. FINSTCP 连接状态 **指令名**: FINSTCP_CONNECTION_STATUS **说明**: 在运行模式下获取 FINSTCP 连接状态 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 217 | FINSTCP_CONNECTION_STATUS 在枚举数列 type 中为217 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量对象 | ### variable 对象 | 参数名 | 类型 | 说明 | |--------|------|------| | data | float | 数据值 | | secondvalue | int | 第二个值 | | value | int | 状态值;6表示连接 | | varname | string | 变量名,如"GB[I001]" | ### 返回值说明 FINSTCP 的连接状态;bool 类型变量或绑定变量,全局或局部 - `true`:连接 - `false`:未连接 ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 217, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]" } } ``` --- # 指令-码垛控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/15.%E6%8C%87%E4%BB%A4-%E7%A0%81%E5%9E%9B%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 1. 码垛开始 (PALON) **说明**:码垛开始的判断,可通过修改变量控制码第几层第几个工件。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | STACKTYPE | int | 码垛类型,取值范围[0,1]
0:码垛
1:卸垛 | | _pCurrentLayersNum | 变量对象 | 当前层码垛数;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _pLayersNum | 变量对象 | 当前码垛层;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _pWorkpieceSum | 变量对象 | 当前已码总数;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _stackSequence | int | 单层码垛/卸垛顺序,取值范围[0,1]
0:正序
1:倒序 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALON 在枚举数列 type 中为70 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 1, "STACKTYPE": 0, "_pCurrentLayersNum": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "_pLayersNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "_pWorkpieceSum": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "[-]"}, "_stackSequence": 1, "logout": false, "type": 70, "userParamInt": 0, "userParamString": "" } ``` --- ## 2. 切换抓手 (PALGRIPPER) **说明**:选取抓手。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | tool | int | 抓手编号,取值范围[1,4] | | type | int | PALGRIPPER 在枚举数列 type 中为71 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "logout": false, "tool": 3, "type": 71, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. 码垛入口点 (PLAENTER) **说明**:选取抓手,码垛入口点。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | Posture | int | 姿态,取值范围[0,2]
0:关闭
1:手动写入
自动计算姿态 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | para_posture_ | 变量对象 | 姿态手动写入值;int 类型或 double 类型变量或绑定变量,全局或局部 | | type | int | PLAENTER 在枚举数列 type 中为73 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | xyOpt | int | 优化 XY 轴运动路径,取值范围[0,1]
0:关闭
1:打开 | | zOpt | int | 优化 Z 轴运动路径,取值范围[0,1]
0:关闭
1:打开
优化 Z 轴运动路径,需在码垛前插入一个固定点 | ### 示例 ```json { "ID": 1, "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaV": {"data": 300.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": ""}, "Posture": 1, "logout": false, "moveType": "MovC", "para_posture_": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI005"}, "type": 73, "offsetAxis": 2, "userParamInt": 0, "userParamString": "", "xyOpt": 1, "zOpt": 1 } ``` --- ## 4. 码垛辅助点 (PALSHIFT) **说明**:码垛辅助点。 **高度规则说明**: - 当入口点高度比固定点低时,入口点在高度上会和固定点、辅助点处于同一值线上(侧视同一直线,俯视不是同一直线,XY 轴不变) - 当入口点高度位于固定点与辅助点之间时,入口点高度不变 - 当入口点高度位于固定点、辅助点之上时,入口点高度将优化到与固定点水平的高度 - 当入口点、辅助点高度都高于固定点时,入口点高度将优化到与辅助点水平高度 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | type | int | PALSHIFT 在枚举数列 type 中为74 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 4, "varname": "GI001"}, "logout": false, "moveType": "MovArch", "type": 74, "offsetAxis": 2, "userParamInt": 0, "userParamString": "" } ``` --- ## 5. 码垛接近点 (PALAPPRO) **说明**:码垛接近点是辅助点和工件点之间的过渡点,也是接近方式要走到的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | type | int | PALAPPRO 在枚举数列 type 中为76 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 2, "varname": "D[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "I001"}, "moveType": "MovL", "type": 76, "offsetAxis": 2, "userParamInt": 0, "userParamString": "" } ``` --- ## 6. 码垛工件点 (PALREAL) **说明**:码垛工件所在的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | type | int | PALREAL 在枚举数列 type 中为75 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 4, "varname": "GI001"}, "logout": false, "moveType": "MovArch", "offsetAxis": 2, "type": 75, "userParamInt": 0, "userParamString": "" } ``` --- ## 7. 码垛复位 (PALCLEAR) **说明**:码垛开始后的数据初始化。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALCLEAR 在枚举数列 type 中为77 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "logout": false, "type": 77, "userParamInt": 0, "userParamString": "" } ``` --- ## 8. 码垛结束判断 (PALOFF) **说明**:判断码垛是否结束。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | _pPalOffvarName | 变量对象 | 结束判断变量;bool 类型变量或绑定变量,全局或局部
true:结束
false:未结束 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALOFF 在枚举数列 type 中为78 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "_pPalOffvarName": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]"}, "logout": false, "type": 78, "userParamInt": 0, "userParamString": "" } ``` --- ## 9. 获取工件点位 (PAL_POS) **说明**:获取指定工件的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | PalPOS_pointType | int | 获取点位类型,取值范围[0,2]
0:入口点
1:辅助点
2:工件点 | | _pLayNum | 变量对象 | 工件所在层;手填值或 int 类型变量或绑定变量 | | _pSerialNum | 变量对象 | 工件编号;手填值或 int 类型变量或绑定变量 | | _pTecNUM | 变量对象 | 码垛工艺号;手填值或 int 类型变量或绑定变量;取值范围[1,99] | | getPointPosPos | int | m_getPointPosname 节点绑定的变量类型,取值范围[1,2]
1:位置变量名固定,如:P0001、G001
2:位置变量名不固定,如:P$I001、P$GI001、G$I001、G$GI001 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | m_getPointPosname | string | 节点绑定的变量名 | | tool | int | 工具编号 | | type | int | PAL_POS 在枚举数列 type 中为221 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "PalPOS_pointType": 2, "_pLayNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "_pSerialNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "_pTecNUM": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "getPointPosPos": 2, "logout": false, "m_getPointPosname": "GP$GI001", "tool": 0, "type": 221, "userParamInt": 0, "userParamString": "" } ``` --- ## 10. 简易码垛 (PALSIMPLESET) **说明**:简易码垛。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | _pTecNUM | 变量对象 | 码垛参数存放的工艺号;手填值或 int 类型,变量或绑定变量,全局或局部;取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | m_numVariableType | int 数组 | 行数、列数、层数是否为绑定变量;取值范围[0,1]
0:手填值或变量
1:绑定变量 | | m_pointVariableType | int 数组 | 变量类型,取值范围[1,3]
目前只有第二位到第七位使用
第一位:无
第二位:起始工件点
第三位:列末点
第四位:行末端
第五位:高末端
第六位:辅助点
第七位:入口点
1:位置变量名固定,如:P0001、G001
2:位置变量名不固定,如:P$I001、P$GI001、G$I001、G$GI001
3:不使用 | | pointVariableName | string 数组 | 点位变量名数组
第二位:起始工件点
第三位:列末端
第四位:行末端
第五位:高末端
第六位:辅助点
第七位:入口点
目前只有第二位到第七位使用 | | type | int | 简易码垛在枚举数列 type 中为222 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variableData | string 数组 | 绑定变量数据 | ### 示例 ```json { "_pTecNUM": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "m_numVariableType": [0, 1, 0], "m_pointVariableType": [0, 1, 1, 2, 2, 2, 2, 0, 0, 0], "pointVariableName": ["[-]", "GP0001", "GP0002", "GP$I001", "P$I001", "GP$I003", "P$GI003", "[-]", "[-]", "[-]"], "type": 222, "userParamInt": 0, "userParamString": "", "variableData": ["GI003", "GI[I004]", "GI005"] } ``` --- # 指令-焊接控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/16.%E6%8C%87%E4%BB%A4-%E7%84%8A%E6%8E%A5%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 焊接开始 **说明:** 该指令可执行起弧操作。选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。焊接开始要和焊接结束一起使用。 **指令名:** ARCON **type:** 23 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anamorphismFlag | int | [0,1] | 使用起弧渐变标志;0:不使用,1:使用 | | arconUseAbled | int | [0,2] | 使用起弧参数标志;0:不使用临时参数,1:使用,2:不使用 | | generatingOfArcAgainFlag | int | [0,1] | 再起弧标志;0:不使用,1:使用 | | generatingOfArcCurrent | double | [0-1000]A | 起弧电流;99999.0:不使用临时变量,使用工艺配置参数 | | generatingOfArcTime | double | [0-5]s | 起弧时间;99999.0:不使用临时变量,使用工艺配置参数 | | generatingOfArcVoltage | double | [-1000,1000]V | 起弧电压;99999.0:不使用临时变量,使用工艺配置参数 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | startUpAgainFlag | int | [0,1] | 使用再启动标志;0:不使用,1:使用 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的焊接参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldCurrent | double | [0-1000]A | 焊接电流 | | weldVoltage | double | - | 焊接电压 | **JSON 示例:** ```json { "anamorphismFlag": 1, "arconUseAbled": 1, "generatingOfArcAgainFlag": 1, "generatingOfArcCurrent": 3.0, "generatingOfArcTime": 2.0, "generatingOfArcVoltage": 36.0, "logout": false, "startUpAgainFlag": 1, "type": 23, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "weldCurrent": 89.0, "weldVoltage": 78.0 } ``` --- ## ARCOFF 焊接结束 **说明:** 该指令可执行灭弧操作,选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。焊接开始要和焊接结束一起使用。 **指令名:** ARCOFF **type:** 24 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcoffUseAbled | int | [0,2] | 使用收弧参数标志;0:不使用临时参数,1:使用,2:不使用 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | quenchingAnamorphismFlag | int | [0,2] | 使用收弧渐变;0:不使用临时参数,1:使用,2:不使用 | | quenchingOfArcCurrent | double | [0,1000]A | 收弧电流 | | quenchingOfArcTime | double | [0,5]s | 收弧时间 | | quenchingOfArcVoltage | double | [-1000,1000]V | 收弧电压 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 要使用的焊接参数工艺号 | **JSON 示例:** ```json { "arcoffUseAbled": 1, "logout": false, "quenchingAnamorphismFlag": 1, "quenchingOfArcCurrent": 2.0, "quenchingOfArcTime": 3.0, "quenchingOfArcVoltage": 1.0, "type": 24, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## ARCSET 焊接设置 **说明:** 该指令可以设置焊接时的电流电压。 **指令名:** ARCSET **type:** 25 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcsetRamp | int | [0,1] | 渐变方式;0:不使用,1:时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的焊接参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldSetCurrent | object | [0,1000]A | 设置焊接电流;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSetRampTime | object | [0,100000]ms | 渐变时间;int 类型手填值或变量,全局或局部 | | weldSetVoltage | object | - | 设置焊接电压 | **JSON 示例:** ```json { "arcsetRamp": 1, "logout": false, "type": 25, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "weldSetCurrent": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "weldSetRampTime": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI001"}, "weldSetVoltage": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## WVON 摆焊开始 **说明:** 该指令执行时开始摆焊,执行该指令前请先运行焊接开始 ARCON 指令。不使用临时参数时,date 应设为99999。 **指令名:** WVON **type:** 26 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的摆焊参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldLeftDwellTime | object | [0,15]s | 左停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldRightDwellTime | object | [0,15]s | 右停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingAmplitude | object | (0,50]mm | 摆动幅度;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingFrequency | object | (0,20]HZ | 摆动频率;double 类型手填值,double 类型或 int 类型变量,全局或局部 | **JSON 示例:** ```json { "logout": false, "type": 26, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006"}, "weldLeftDwellTime": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "weldRightDwellTime": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[I001]"}, "weldSwingAmplitude": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "weldSwingFrequency": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GD001"} } ``` --- ## WVOFF 摆焊结束 **说明:** 该指令执行时结束摆焊。 **指令名:** WVOFF **type:** 27 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 27, "userParamInt": 0, "userParamString": "" } ``` --- ## WVSET 摆焊设置 **说明:** 该指令可执行灭弧操作,选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。 **指令名:** WVSET **type:** 28 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的摆焊参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldLeftDwellTime | object | [0,15]s | 左停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldRightDwellTime | object | [0,15]s | 右停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingAmplitude | object | (0,50]mm | 摆动幅度;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingFrequency | object | (0,20]HZ | 摆动频率;double 类型手填值,double 类型或 int 类型变量,全局或局部 | **JSON 示例:** ```json { "logout": false, "type": 28, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "weldLeftDwellTime": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D009"}, "weldRightDwellTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "weldSwingAmplitude": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009"}, "weldSwingFrequency": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"} } ``` --- ## CIL 相贯线 **说明:** 相贯线指令方式与 MOVC 相似。 **指令名:** CIL **type:** 29 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1,100]% | 加速度变量;double 类型 | | ParaDEC | object | [1,100]% | 减速度变量;double 类型 | | ParaPL | object | [0,5] | 平滑变量;double 类型 | | ParaTIME | object | 自然数 | 提前执行时间变量;double 类型 | | ParaV | object | [1,1000]mm/s | 速度变量;double 类型;m_vUnit:0=cm/s 1=mm/s 2=百分比 | | RobotPos | object | - | 点位信息;当使用绑定变量点位时,不使用该节点 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | para | int | [0,3] | ID | | posidtype | int | 0/1 | 点位是否为绑定变量;1:绑定变量,0:非绑定变量 | | positionId | string | - | 非绑定变量时的点位名 | | posidname | string | - | 绑定变量时的点位名 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[GI001]"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "D001"}, "RobotPos": { "ctype": 1, "data": [2.0, 1.0, 8.0, 0.0, 0.0, 0.0, 0.0, 490.0, 0.0, 647.0, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 490.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 647.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "logout": false, "para": 2, "polish": 0, "type": 29, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## TIGWELDON 鱼鳞焊开始 **说明:** 执行该指令开始鱼鳞焊轨迹,执行该指令前请先运行焊接开始 ARCON 指令。 **指令名:** TIGWELDON **type:** 66 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | headTailType | int | [0,3] | 首位段;0:首尾段焊接优化空走距离,1:首尾段空走优化空走距离,2:首段焊接,3:首段空走 | | l1 | double | [0.01,9999] | 焊接距离;typeOFTIG 节点值为2时需要此节点 | | l1speed | double | [1,200]% | 焊接速度;typeOFTIG 节点值为2时需要此节点 | | l2 | double | [0.01,9999]mm | 空走距离 | | l2speed | double | [1,1000]% | 空走速度 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | timeOFTIG | double | [0.01,6]s | 点焊时间;typeOFTIG 节点值为1时需要此节点 | | typeOFTIG | int | [0,1] | 参数类型;1:点焊时间,2:焊接距离 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "headTailType": 2, "l1": 5.0, "l1speed": 6.0, "l2": 200.0, "l2speed": 569.0, "logout": false, "timeOFTIG": 6.0, "type": 66, "typeOFTIG": 1, "userParamInt": 0, "userParamString": "" } ``` --- ## TIGWELDOFF 鱼鳞焊结束 **说明:** 执行该指令后结束鱼鳞焊轨迹。 **指令名:** TIGWELDOFF **type:** 67 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 67, "userParamInt": 0, "userParamString": "" } ``` --- ## FEEDWIRE 送丝 **说明:** 执行该指令可在参数时间内打开送丝信号。 **指令名:** FEEDWIRE **type:** 69 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | feedtime | double | (0,10]s | 送丝时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "feedtime": 9.0, "logout": false, "type": 69, "userParamInt": 0, "userParamString": "" } ``` --- ## ARCBUILTIN 焊机内置工艺 **说明:** 该指令目前可配合奥太焊机使用。 **指令名:** ARCBUILTIN **type:** 172 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | 焊机内置工艺号 | | Value | array | [-999999,999999] | 参数 A-E;元素分别为$builtin_a 调用、$builtin_b 调用、$builtin_c 调用、$builtin_d 调用、$builtin_e 调用 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "ID": 6, "Value": [369.0, 239.0, 896.0, 456.0, 789.0], "logout": false, "type": 172, "userParamInt": 0, "userParamString": "" } ``` --- ## REFP 摆焊参考点 **说明:** 焊机内置工艺。 **指令名:** REFP **type:** 178 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | RobotPos | object | - | 点位信息;当使用绑定变量点位时,不使用该节点 | | autoCorrection | int | [0,1] | 摆焊轨迹自动修正使能;0:否,1:是 | | correctionSpeed | double | [2,9999]mm/s | 摆焊轨迹自动修正速度 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | positionId | string | - | 参考点变量名;字符串以 P 开头 | | refpPointNum | int | [1,2] | 参考点 | | startUpAgainFlag | int | - | 再启动标志 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "RobotPos": { "ctype": 1, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 490.0, 0.0, 647.0, 3.14160, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0002", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 490.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 647.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.14160, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "autoCorrection": 1, "correctionSpeed": 869.0, "logout": false, "positionId": "P0002", "refpPointNum": 1, "startUpAgainFlag": 0, "type": 178, "userParamInt": 0, "userParamString": "" } ``` --- ## SPOTWELD 点焊 **说明:** 该指令执行时机器人开始执行点焊操作。 **指令名:** SPOTWELD **type:** 179 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcParameterId | int | [1,99] | 焊接参数标号 | | feedtime | double | (0,1000]s | 焊接时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "arcParameterId": 17, "feedtime": 200.0, "logout": false, "type": 179, "userParamInt": 0, "userParamString": "" } ``` --- ## MP_OFFSET_ON 多层多道焊偏转开始 **说明:** 多层多道焊偏转开始。 **指令名:** MP_OFFSET_ON **type:** 245 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | craft_number | object | [1,999] | 工艺号;手填 int 类型,int 类型变量或绑定变量,全局或局部 | | head_indent | object | [-1000,1000] | 头部缩进;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | head_multi_indent | object | [0,1] | 头部倍数缩进使能;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:不生效,1:生效 | | left_right_offset | object | [-1000,1000] | 左右偏移;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | offset_pass | object | [0,99] | 偏移焊道号;int 类型手填值,全局或局部 int 类型变量或绑定变量 | | push_angle | object | [-1000,1000] | 推角;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | tail_indent | object | [-1000,1000] | 尾部缩进;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | tail_multi_indent | object | [0,1] | 尾部倍数缩进使能;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:不生效,1:生效 | | tilt_angle | object | [-1000,1000] | 倾斜角;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | trace_data | object | [1,9] | 跟踪路径数据;int 类型手填值,全局或局部 int 类型变量或绑定变量;0:表示不使用 | | up_down_offset | object | [-1000,1000] | 高低偏移;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | weld_dir | object | [0,1] | 焊接方向;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:正方向,1:负方向 | **JSON 示例:** ```json { "craft_number": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI003"}, "head_indent": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "head_multi_indent": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GB[I001]"}, "left_right_offset": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "logout": false, "offset_pass": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "offset_weld_count": {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, "push_angle": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005"}, "tail_indent": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "tail_multi_indent": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GB[GI006]"}, "tilt_angle": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006"}, "trace_data": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "type": 245, "up_down_offset": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004"}, "use_temp": 1, "userParamInt": 0, "userParamString": "", "weld_dir": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "B007"} } ``` --- ## MP_OFFSET_OFF 多层多道焊偏移结束 **说明:** 点焊。 **指令名:** MP_OFFSET_OFF **type:** 246 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 246, "userParamInt": 0, "userParamString": "" } ``` --- ## GET_OFFSET_WELD_COUNT 获取偏转焊道数 **说明:** 点焊。 **指令名:** GET_OFFSET_WELD_COUNT **type:** 252 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | craft_number | object | - | 工艺号 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | offset_weld_count | object | - | 偏转焊道数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "craft_number": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI009"}, "logout": false, "offset_weld_count": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "type": 252, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-视觉命令类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/17.%E6%8C%87%E4%BB%A4-%E8%A7%86%E8%A7%89%E5%91%BD%E4%BB%A4%E7%B1%BB.html ## 视觉开始 **说明**:执行视觉开始指令后控制器与相机连接 **指令名**:VISION_RUN | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_RUN 在枚举数列 type 中为79 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 14, "logout": false, "type": 79, "userParamInt": 0, "userParamString": "" } ``` --- ## 视觉触发 **说明**:执行视觉触发指令后等待视觉服务器的返回值(发送的位置数据),获取到位置数据后继续运行下一条指令 **指令名**:VISION_TRG | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_TRG 在枚举数列 type 中为80 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 23, "logout": false, "type": 80, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉位置个数 **说明**:记录相机发送的点位个数,将点位个数存入到选择的变量 **指令名**:VISION_POSNUM | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | M_STRPOSNUM | object | 是 | 全局数值变量,全局 int 变量或绑定变量,取值范围[1,990] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_POSNUM 在枚举数列 type 中为81 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **M_STRPOSNUM 结构**: ```json {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"} ``` **JSON 示例**: ```json { "ID": 31, "M_STRPOSNUM": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "type": 81, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉位置 **说明**:执行此条指令可以将相机发送的点位信息存入到变量 **指令名**:VISION_POS | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | dataVariable | object | 是 | 附加数值首个变量,全局 int 变量或绑定变量,取值范围[1,990] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidname | string | 否 | 点位变量名称,如"GP$GI001" | | posidtype | int | 否 | posidname 节点是绑定点位还是点位:0=点位;1=绑定点位 | | type | int | 是 | VISION_POS 在枚举数列 type 中为82 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **dataVariable 结构**: ```json {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[I001]"} ``` **JSON 示例**: ```json { "ID": 38, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[I001]"}, "logout": false, "posidname": "GP$GI001", "posidtype": 1, "type": 82, "userParamInt": 0, "userParamString": "" } ``` --- ## 清除视觉位置信息 **说明**:清除当前工艺号里相机发送的点位信息 **指令名**:VISION_CLEAR | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_CLEAR 在枚举数列 type 中为83 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 17, "logout": false, "type": 83, "userParamInt": 0, "userParamString": "" } ``` --- ## 视觉结束 **说明**:结束视觉工艺,控制器与相机断开连接 **指令名**:VISION_END | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_END 在枚举数列 type 中为84 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 1, "logout": false, "type": 84, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉轨迹位置 **说明**:当相机发送的数据为多个点位时可选择不同点位存储方式运行轨迹 **指令名**:VISION_TRACE | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | M_POINTSTORAGENUM | object | 是 | 点位存放数,int 类型全局或局部变量或绑定变量 | | dataVariable | object | 否 | 附加数据首个变量,int/double/string 类型全局或局部变量或绑定变量;不使用时为`{"data":0.0,"secondvalue":0,"value":0,"varname":""}` | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | pointStoragePosType | int | 是 | 点位存放位置:0=外部点队列;1=变量 | | posidname | string | 是 | 点位存放的首个变量,全局或局部点位变量或绑定变量 | | posidtype | int | 是 | posidname 节点是绑定点位还是点位:0=点位;1=绑定点位 | | type | int | 是 | VISION_TRACE 在枚举数列 type 中为236 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 17, "M_POINTSTORAGENUM": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[GI001]"}, "logout": false, "pointStoragePosType": 1, "posidname": "P$GI001", "posidtype": 1, "type": 236, "userParamInt": 0, "userParamString": "" } ``` --- ## 飞拍开始 **说明**:机器人工具手运动经过拍照点时,快速触发相机拍照,在拍照过程中物体或相机处于运动状态 **指令名**:ONFLY_INIT | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | Delay | object | 是 | 记录坐标延时,全局或局部 double 类型手填值或 int/double 类型变量或绑定变量,取值范围[0,1000] | | axisNum | object | 否 | 轴,string 类型手填值或 int 类型全局或局部变量或绑定变量 | | _posIdType | int | 是 | phonePos 节点是点位变量还是绑定点位变量:0=点位变量;1=绑定点位变量 | | IOPort | object | 否 | IO 端口,int 类型或绑定变量类型,取值范围[1,1000] | | IOValue | object | 否 | 端口值,bool 类型手填值或变量或绑定变量 | | cameraTriggerDelayTime | object | 是 | 相机触发延时,double 类型手填值或 int 类型,取值范围[0,1000] | | craftID | object | 是 | 工艺号,int 类型,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | triggerAngleSpacing | object | 否 | 触发角度间隔,double 类型手填值或 int/double 类型全局或局部变量或绑定变量,取值范围[-360,360] | | triggerCount | object | 否 | 触发次数,int 类型手填值或全局或局部绑定变量或变量,取值范围[0,10];不使用时`{"data":0.0,"secondvalue":0,"value":1,"varname":"[-]"}` | | triggerStartPos | object | 否 | 触发起始位置,double 类型手填值或全局或局部 int/double 类型变量或绑定变量 | | phonePos | string | 是 | 拍照点,string 类型,全局或局部 P 点位或 E 点位变量或绑定变量 | | radius | object | 是 | 拍照点范围半径,取值范围[0.001,1000] | | type | int | 是 | ONFLY_INIT 在枚举数列 type 中为239 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | visionCraftID | object | 否 | 视觉工艺号 | ### triggerType=0 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "_posIdType": 1, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "phonePos": "P$GI001", "radius": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "triggerType": 0, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` ### triggerType=1 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "IOPort": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "DIN[I003]"}, "IOValue": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]"}, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "triggerType": 1, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` ### triggerType=2 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "axisNum": {"data": 0.0, "secondvalue": 0, "value": 7, "varname": "J6"}, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "triggerAngleSpacing": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "triggerCount": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "triggerStartPos": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "triggerType": 2, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` --- ## 飞拍结束 **说明**:结束视觉工艺,控制器与相机断开连接 **指令名**:VISION_END | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | craftID | object | 是 | 工艺号,int 类型,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_END 在枚举数列 type 中为240 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "craftID": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"}, "logout": false, "type": 240, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取飞拍打开状态 **说明**:获取飞拍任务是否打开,将获取的状态存入选择的变量 **指令名**:ONFLY_GET_STATUS | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | Result | object | 是 | 结果,全局或局部 bool 变量或局部变量 | | craftID | object | 是 | 工艺号,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | ONFLY_GET_STATUS 在枚举数列 type 中为241 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "Result": {"data": 0.0, "secondvalue": 0, "value": 6, "varname": "GB001"}, "craftID": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "type": 241, "userParamInt": 0, "userParamString": "" } ``` --- ## 飞拍计算工具手 **说明**:飞拍计算工具手作用于机械臂夹持工件时可能出现偏心位置,工件有旋转角。通过计算获取并切换新的工具手之后,工件中心放置到放料位置点,不偏心无旋转 **指令名**:ONFLY_CALC_TOOL | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | craftID | object | 是 | 工艺号,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,99] | | grabTool | object | 是 | 抓取工具手,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,999] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | newTool | object | 是 | 新工具手,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,999] | | type | int | 是 | ONFLY_CALC_TOOL 在枚举数列 type 中为242 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "craftID": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "grabTool": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "logout": false, "newTool": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I006]"}, "type": 242, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-激光类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/18.%E6%8C%87%E4%BB%A4-%E6%BF%80%E5%85%89%E7%B1%BB.html ## 激光开始 - **说明**:激光开始 - **指令名**:LASER_ON - **ID**:5 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | VISION_RUN 在枚举数列 type 中为60 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 60, "userParamInt": 0, "userParamString": "" } ``` --- ## 激光结束 - **说明**:激光结束 - **指令名**:LASER_OFF ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | LASER_OFF 在枚举数列 type 中为61 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 61, "userParamInt": 0, "userParamString": "" } ``` --- ## 切割圆 - **说明**:切割圆 - **指令名**:LASER_CIRCLE - **type**:62 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | ParaACC | object | 加速度;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaDEC | object | 减速度;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaTIME | object | 提前运行时间;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;单位 ms | | ParaV | object | 速度参数 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | margin | double | 补差;取值范围[0,500]mm | | posidname | string | 中心点;P 或 GP 变量或绑定变量 | | posidtype | int | 点位是否为绑定变量;0或1;1:绑定变量,0:非绑定变量 | | radius | double | 半径;取值范围[1,3000]mm | | type | int | LASER_CIRCLE 在枚举数列 type 中为62 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[GI001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "D001"}, "logout": false, "margin": 360.0, "posidname": "GP$I001", "posidtype": 1, "radius": 28.0, "type": 62, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-传送类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/19.%E6%8C%87%E4%BB%A4-%E4%BC%A0%E9%80%81%E7%B1%BB.html --- ## 传送带工件检测开始 **指令名**:CONVEYOR_CHECKPOS **说明**:传送带工件检测开始 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_CHECKPOS 在枚举数列 type 中为107 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 107, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带工件检测结束 **指令名**:CONVEYOR_CHECKEND **说明**:传送带工件检测结束 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_CHECKEND 在枚举数列 type 中为108 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 108, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带跟踪开始 **指令名**:CONVEYOR_ON **说明**:传送带跟踪开始 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | ParaACC | object | 是 | 加速度,double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaV | object | 是 | 速度,double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[2,1000]mm/s | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | m_positionId | string | 否 | 点位,如:"GP0001";当填点位变量时使用,其余时刻为空 | | m_postype | int | 否 | 当点位为工件点时值为1;取值范围[0,1] | | posidname | string | 否 | 点位,如:GP$I001;当填的点位值为点位绑定变量时使用,其余时刻为空 | | posidtype | int | 否 | 点位类型:0=点位类型不为绑定点位变量;1=点位类型为绑定点位变量 | | type | int | 是 | 枚举值,CONVEYOR_ON 在枚举数列 type 中为105 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI007" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "GD003" }, "logout": false, "m_positionId": "", "m_postype": 1, "posidname": "", "posidtype": 0, "type": 105, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带跟踪结束 **指令名**:CONVEYOR_OFF **说明**:传送带跟踪结束 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_OFF 在枚举数列 type 中为106 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 106, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取传送带跟踪位置 **指令名**:CONVEYOR_POS **说明**:获取传送带跟踪位置 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | dataVariable | object | 否 | 视觉附加数据收个变量,int 类型或 double 类型或 string 类型全局或局部或全局变量或绑定变量;不使用时各个值都为空 | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | m_positionId | string | 是 | 全局位置变量,GP 变量;取值范围 GP00001-GP9999 | | type | int | 是 | 枚举值,CONVEYOR_POS 在枚举数列 type 中为176 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "dataVariable": { "data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]" }, "logout": false, "m_positionId": "GP0019", "type": 176, "userParamInt": 0, "userParamString": "" } ``` --- ## 删除传送带跟踪目标 **指令名**:CONVEYOR_CLEAR **说明**:删除传送带跟踪目标 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | removeType | int | 是 | 删除范围:0=全部目标;1=本次目标;取值范围[0,1] | | type | int | 是 | 枚举值,CONVEYOR_CLEAR 在枚举数列 type 中为220 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "removeType": 1, "type": 220, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-喷涂工艺类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/20.%E6%8C%87%E4%BB%A4-%E5%96%B7%E6%B6%82%E5%B7%A5%E8%89%BA%E7%B1%BB.html --- ## 喷涂开始 **指令名:SPRAY_ON** **type 值:122** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | [0, 99] | 模拟量组号 | | atom | double | [0, 10] | 雾化模拟量(V),模拟量组号为0时修改 | | colorID | int | - | 颜色 ID | | flow | double | [0, 10] | 流量模拟量(V),模拟量组号为0时修改 | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | sector | double | [0, 10] | 扇形模拟量(V),模拟量组号为0时修改 | | seqID | int | [1, 99] | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 122 | SPRAY_ON 在枚举序列 type 中为122 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 0, "atom": 6.0, "colorID": 1, "flow": 8.0, "gunID": 2, "logout": false, "point": 1, "sector": 7.0, "seqID": 39, "traID": 1, "type": 122, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂结束 **指令名:SPRAY_OFF** **type 值:123** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | - | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 123 | SPRAY_OFF 在枚举序列 type 中为123 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 1, "colorID": 1, "gunID": 2, "logout": false, "point": 1, "seqID": 1, "traID": 1, "type": 123, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂换色 **指令名:SPRAY_CHANGE** **type 值:124** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | - | 模拟量组号 | | colorID | int | [1, 10] | 颜色 | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | [1, 99] | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 124 | SPRAY_CHANGE 在枚举序列 type 中为124 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 1, "colorID": 9, "gunID": 2, "logout": false, "point": 1, "seqID": 98, "traID": 1, "type": 124, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂轨迹 **指令名:SPRAY_MOVE** **type 值:125** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1, 100]% | 喷涂加速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaDEC | object | [1, 100]% | 喷涂减速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaPL | object | [1, 100]% | 喷涂 PL:int 类型手填值或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2, 1000]mm/s | 喷涂速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | - | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | [1, 99] | 时序组号 | | traID | int | [1, 99] | 轨迹组号 | | type | int | 125 | SPRAY_MOVE 在枚举序列 type 中为125 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D009"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "anaID": 1, "colorID": 1, "gunID": 1, "logout": false, "point": 1, "seqID": 1, "traID": 98, "type": 125, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂起始位置 **指令名:SPRAY_STARTPOS** **type 值:126** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1, 100]% | 喷涂加速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaDEC | object | [1, 100]% | 喷涂减速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaTIME | object | - | 提前执行时间:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2, 1000]mm/s | 喷涂速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | - | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | [0, 1] | 点位姿态:0-绝对标记点,1-仅姿态 | | seqID | int | - | 时序组号 | | traID | int | [1, 99] | 轨迹组号 | | type | int | 126 | SPRAY_STARTPOS 在枚举序列 type 中为126 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 2, "varname": "D[GI001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "anaID": 1, "colorID": 1, "gunID": 1, "logout": false, "point": 1, "seqID": 1, "traID": 98, "type": 126, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-打磨工艺类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/21.%E6%8C%87%E4%BB%A4-%E6%89%93%E7%A3%A8%E5%B7%A5%E8%89%BA%E7%B1%BB.html --- ## 棱边打磨 **指令名:POLISH_EDGE** **说明:** 棱边打磨 **type:** 109(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | ParaACC | double/int | 加速度 | [1,100]% | | ParaAHEAD | double/int | 提前执行,与 aheadtype 有关 | [1,100]% | | ParaDEC | double/int | 减速度 | [1,100]% | | ParaPL | int | 平滑 | [0,5] | | ParaTIME | double/int | 提前执行时间 | - | | ParaV | double/int | 速度 | [1,1000] mm/s | | aheadtype | int | 提前类型 | 0:提前时间;1:提前距离;2:提前进度 | | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polish | int | 打磨次数 | [1,99] | | polishAngle | double | 角度 | [-180,180] 度 | | polishID | int | 打磨工艺号 | [1,99] | | posidname | string | 点位 | P 或 GP 绑定变量 | | posidtype | int | 点位类型 | 0:点位变量;1:点位绑定变量 | | positionId | string | 点位 | 当 posidtype 为 0 时使用 | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "ParaAHEAD": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI008"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "I001"}, "aheadtype": 2, "logout": false, "polish": 89, "polishAngle": 70.0, "polishID": 30, "posidname": "GP$GI001", "posidtype": 1, "positionId": "", "type": 109, "userParamInt": 0, "userParamString": "" } ``` --- ## 打磨继续 **指令名:POLISH_CONTINUE** **说明:** 打磨继续 **type:** 131(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | angle | double | 角度 | [-180,180] 度 | | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polishID | int | 工艺号 | [1,99] | | time | double | 提前执行时间 | - | | times | int | 打磨次数 | [1,99] | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "angle": 99, "logout": false, "polishID": 21, "time": 999, "times": 19, "type": 131, "userParamInt": 0, "userParamString": "" } ``` --- ## 打磨结束 **指令名:POLISH_OFF** **说明:** 打磨结束 **type:** 132(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polishID | int | 工艺号 | [1,99] | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "logout": false, "polishID": 18, "type": 132, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-寻位跟踪类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/22.%E6%8C%87%E4%BB%A4-%E5%AF%BB%E4%BD%8D%E8%B7%9F%E8%B8%AA%E7%B1%BB.html --- ## 激光追踪开始 **说明**:激光追踪开始 **指令名**:LASERTRACK_ON **type 值**:85 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | delay | double | [0,10] | 参数表延时 | | segmentParam | int | [1,99] | 跟踪参数表号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,LASERTRACK_ON 在枚举数列中为 85 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 2, "delay": 4.0, "logout": false, "segmentParam": 3, "type": 85, "userParamInt": 0, "userParamString": "" } ``` --- ## 激光追踪结束 **说明**:激光追踪结束 **指令名**:LASERTRACK_OFF **type 值**:86 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,LASERTRACK_OFF 在枚举数列中为 86 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 2, "logout": false, "type": 86, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位开始 **说明**:寻位开始 **指令名**:SEARCH_START **type 值**:151 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | senseType | int | [0,1] | 传感类型:0=线激光;1=触碰 | | type | int | - | 枚举值,SEARCH_START 在枚举数列中为 151 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 19, "logout": false, "senseType": 1, "type": 151, "userParamInt": 0, "userParamString": "" } ``` --- ## 静态寻位 **说明**:静态寻位 **指令名**:SEARCH_STATIC **type 值**:152 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | delay | double | [0,10] | 参数表延时 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidtype | int | [0,1] | 点位类型:0=点位变量;1=点位绑定变量 | | positionOutId | string | - | 输出位置,E 或 P 或 GP 或 GE 点位变量或绑定变量 | | tableID | int | [1,99] | 寻位参数表号 | | type | int | - | 枚举值,SEARCH_STATIC 在枚举数列中为 152 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 18, "delay": 9.0, "logout": false, "posidname": "", "posidtype": 1, "positionOutId": "E$I001", "tableID": 31, "type": 152, "userParamInt": 0, "userParamString": "" } ``` --- ## 动态寻位 **说明**:动态寻位 **指令名**:SEARCH_DYNAMIC **type 值**:153 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | ParaACC | object | [1,100] | 加速度:double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量 | | ParaPL | object | [0,5] | 平滑:int 类型手填值或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2,1000] mm/s | 速度:double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量 | | delay | double | [0,10] | 参数表延时 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | pointEffet | int | [0,1] | 点位作用:0=准备点;1=寻位开始点 | | posidname | string | - | 点位位置数据:P 或 E 或 GP 或 GE 变量或绑定变量 | | posidtype | int | [0,1] | 点位类型:0=点位变量;1=点位绑定变量 | | positionOutId | string | - | 输出位置:E 或 P 或 GP 或 GE 点位变量或绑定变量 | | sync | int | [0,1] | SYNC:0=否;1=是 | | tableID | int | [1,99] | 寻位参数表号 | | type | int | - | 枚举值,SEARCH_DYNAMIC 在枚举数列中为 153 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例(寻位开始点) ```json { "ID": 20, "delay": 5.0, "logout": false, "pointEffet": 1, "posidname": "GE$I001", "posidtype": 1, "positionOutId": "GP0001", "sync": 1, "tableID": 22, "type": 153, "userParamInt": 0, "userParamString": "" } ``` ### JSON 示例(准备点) ```json { "ID": 20, "ParaACC": {"data": 58.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaPL": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaV": {"data": 78.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": ""}, "logout": false, "pointEffet": 0, "posidname": "GE$I001", "posidtype": 1, "sync": 1, "type": 153, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位计算 **说明**:寻位计算 **指令名**:SEARCH_CALC **type 值**:154 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calculType | int | [0,11] | 计算方式:0=1维偏转;1=2维偏转;2=2维偏转+旋转;3=3点计算投影点;4=4点确定两条直线计算交点;5=3点计算用户坐标系;6=4点确定两条直线计算交点;7=6点计算用户坐标系;8=2点简易触碰寻位;9=3维偏移+旋转;10=平面两点计算新用户坐标系;11=4点计算平面用户坐标系 | | coordNum | int | [1,999] | 输出用户坐标系 | | length | double | mm | 长度 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidtype | int | [0,1] | 节点是否绑定变量:0=点位变量;1=点位绑定变量 | | position1Id | string | - | 点1:P 或 E 或 GE 或 GP | | position2Id | string | - | 点2:P 或 E 或 GE 或 GP | | position3Id | string | - | 点3:P 或 E 或 GE 或 GP | | position4Id | string | - | 点4:P 或 E 或 GE 或 GP | | position5Id | string | - | 点5:P 或 E 或 GE 或 GP | | position6Id | string | - | 点6:P 或 E 或 GE 或 GP | | positionOutId | string | - | 输出结果:P 或 GP 或 E 或 GE | | searchParacoordinate | int | [1,999] | 输入用户坐标系 | | type | int | - | 枚举值,SEARCH_CALC 在枚举数列中为 154 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calculType": 9, "coordNum": 1, "length": 56.0, "logout": false, "posidtype": 0, "position1Id": "GP0001", "position2Id": "GP0002", "position3Id": "", "position4Id": "", "position5Id": "", "position6Id": "", "positionOutId": "GP0096", "searchParacoordinate": 1, "type": 154, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位结束 **说明**:寻位结束 **指令名**:SEARCH_END **type 值**:155 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,SEARCH_END 在枚举数列中为 155 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 20, "logout": false, "type": 155, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位偏移 **说明**:寻位偏移 **指令名**:SEARCH_OFFSET **type 值**:156 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | position1Id | string | - | 偏移量:P 或 GP | | type | int | - | 枚举值,SEARCH_OFFSET 在枚举数列中为 156 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "position1Id": "GP0036", "type": 156, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位偏移结束 **说明**:寻位偏移结束 **指令名**:SEARCH_OFFSETEND **type 值**:157 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,SEARCH_OFFSETEND 在枚举数列中为 157 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 157, "userParamInt": 0, "userParamString": "" } ``` --- ## 电弧跟踪开始 **说明**:电弧跟踪开始 **指令名**:ARCTRACKON **type 值**:158 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | p_trace_path_num | object | [1,9] | 跟踪路径数据:int 类型手填值或 int 类型全局或局部变量或绑定变量;值为0时表示不使用 | | type | int | - | 枚举值,ARCTRACKON 在枚举数列中为 158 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "p_trace_path_num": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI036]"}, "type": 158, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I026]"} } ``` --- ## 电弧跟踪结束 **说明**:电弧跟踪结束 **指令名**:ARCTRACKOFF **type 值**:159 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCTRACKOFF 在枚举数列中为 159 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 159, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"} } ``` --- ## 弧压跟踪开始 **说明**:弧压跟踪开始 **指令名**:ARCTRACKON **type 值**:160 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCTRACKON 在枚举数列中为 160 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 160, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI099"} } ``` --- ## 弧压跟踪结束 **说明**:弧压跟踪结束 **指令名**:ARCVTRACKOFF **type 值**:161 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCVTRACKOFF 在枚举数列中为 161 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 161, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"} } ``` --- # 程序操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/03.%E7%A8%8B%E5%BA%8F%E6%93%8D%E4%BD%9C.html ## 程序打开 正式执行程序之前需要打开程序。 **命令字:** `0x5100` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | jobName | string | 新建作业文件名 | | suffixname | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | ```json { "robot": 1, "jobName": "xxxx", "suffixname": ".JBR" } ``` ## 程序复制 复制后程序的后缀是一样的。 **命令字:** `0x5101` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | oldjobName | string | 旧文件名 | | newjobName | string | 复制后文件名 | | suffixname | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | ```json { "robot": 1, "oldjobName": "QQQQ", "newjobName": "WWWW", "suffixname": ".JBR" } ``` ## 程序清除 会清除当前机器人的所有程序,但不会清除复位程序。 **命令字:** `0x5102` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | lock_enable | bool | 是否清空作业文件使能,true 清空使能,false 清空不使能 | ```json { "robot": 1, "lock_enable": true } ``` ## 获取当前打开程序 **命令字:** `0x5103` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5104` | 字段 | 类型 | 说明 | |------|------|------| | openedJobName | string | 当前打开的作业文件,空表示没有 | ```json { "openedJobName": "asd" } ``` ## 主程序 主程序可以认为是特殊的前台程序,只有前台程序可以设置成主程序。 ### 设置作业文件为主程序 **命令字:** `0x5110` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名,空字符串表示取消主程序 | ```json { "robot": 1, "jobName": "xxx" } ``` ### 查询主程序 **命令字:** `0x5111` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5112` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名,空表示没有 | ```json { "robot": 1, "jobName": "xxx" } ``` ## 程序保存 程序进行修改、插入、删除后需要使用该协议进行保存。 **命令字:** `0x5120` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobname | string | 作业文件名 | | suffix | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | | time | string | 时间戳,格式如 "2024.08.08 14:16:39" | ```json { "robot": 1, "jobname": "xxxx", "suffix": ".JBR", "time": "2024.08.08 14:16:39" } ``` ## 同步程序打开 > 功能可能有问题,只有在 6001 打开时同步到 6000 的操作 控制器打开程序后通知上位机,告知上位机该程序已在控制器打开。 **命令字:** `0x3130` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前反馈的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名 | ```json { "robot": 1, "jobName": "" } ``` ## 发送程序指令 为无作业文件的指令插入。运行方式与作业运行方式一样,但是需要将 "noFileRun" 节点的值写为 true。 **命令字:** `0x5122` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | cmd | object | 插入的指令详情,格式为 cmd->toJson(),见指令页面 | ```json { "robot": 1, "cmd": {} } ``` ## 程序同步 上位机发送给控制器,通知示教器同步作业文件。 **命令字:** `0x1222` - 无需发送数据 **控制器响应** **命令字:** `0x1223` | 字段 | 类型 | 说明 | |------|------|------| | finished | bool | true 成功,false 失败 | ```json { "finished": true } ``` ### 控制器通知示教器同步作业文件 **命令字:** `0x1224` - 无需发送数据 **示教器响应** **命令字:** `0x1225` | 字段 | 类型 | 说明 | |------|------|------| | finished | bool | true 成功,false 失败 | ```json { "finished": true } ``` --- # 注释 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/04.%E6%B3%A8%E9%87%8A.html ## 变量 变量/绑定变量的 JSON 结构: ```json { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" } ``` | 参数 | 类型 | 说明 | |------|------|------| | data | float | 数值型数据 | | secondvalue | int | 是否为绑定变量,0=否,1=是(格式:GD[GI0002]) | | value | int | 数据类型,0=数值型(填 data 节点),7=字符串(填 varname 节点),8=变量或绑定变量(填 varname 节点) | | varname | string | 字符串类型或变量名 | ## 点位 ```json { "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "paraVarData": [ {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] } } ``` | 参数 | 类型 | 说明 | |------|------|------| | ctype | int | 点位类型,1=P,2=E,3=S,4=R,5=GP,6=GE | | key | string | 点位名称 | | note | string | 点位注释 | | data | array | 21位数组,详见下方说明 | | paraVarData | array | 21位参数变量数组,结构同变量节点 | **data 数组说明(21位):** | 位 | 说明 | |----|------| | 第1位 | 坐标系:0=关节,1=直角,2=工具,3=用户 | | 第2位 | 单位:0=角度制,1=弧度制 | | 第3位 | 左右手(形态):0=任意,1=左,2=右 | | 第4位 | 工具号 | | 第5位 | 用户号 | | 第6~7位 | 备用 | | 第8~21位 | 坐标值(7位内部轴 + 7位外部轴) | > 注:不存在的节点默认为 0 或 "" --- # 程序运行控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/05.%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E6%8E%A7%E5%88%B6.html ## 程序运行总数清零 **命令字:** `0x5600` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 运行程序 对程序进行操作。 ### 发送开始运行程序 **命令字:** `0x5601` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | jobname | string | 程序名 | | suffixname | string | 程序名后缀名称,取值:.JBR 主程序,.JBP 后台局部程序,.JBPG 后台全局程序 | | stepRunSum | int | 一共多少步(可选) | | callerName | string | 访问者名字(可选) | | stepRun | bool | 是否单步运行(可选) | | index | int | 索引(可选) | | noFileRun | bool | 无文件运行(可选) | | notJudgeSafePos | bool | 不判断安全位置(可选) | | line | int | 程序开始运行的行号 | | globalStart | bool | 是否为多机模式 | | continueRun | int | 是否为继续运行:0 不继续运行,1 继续运行 | | startOver | int | 是否为重头运行:0 继续运行,1 重头运行 | ```json { "robot": 1, "jobname": "TTT", "suffixname": ".JBR", "stepRunSum": 2, "callerName": "tttt", "stepRun": false, "index": 0, "noFileRun": false, "notJudgeSafePos": false, "line": 1, "globalStart": false, "continueRun": 0, "startOver": 0 } ``` > 注:可选字段不使用无影响 ### 下发停止程序 **命令字:** `0x5602` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 程序执行状态设置 上位机需要改变当前控制器程序执行模式时发送。 **命令字:** `0x5603` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | type | int | 程序执行状态:0 单步运行,1 暂停,2 停止但不下电,5 停止但不下电(停止优先使用) | ```json { "robot": 1, "type": 5 } ``` > **注意:** 对于单步,没有全部机器人;对于暂停和停止,只有多机模式下有全部机器人,此时将 "robot" 节点设置成 0 ## 使用无文件运行开关 **命令字:** `0x5604` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 正序倒序运动 ### 设置反向运行 **命令字:** `0x5610` | 字段 | 类型 | 说明 | |------|------|------| | switch | bool | 是否反向顺序运行 | ```json { "switch": false } ``` ### 查询正序倒序 **命令字:** `0x5611` - 无需发送数据 **控制器回复** **命令字:** `0x5612` | 字段 | 类型 | 说明 | |------|------|------| | switch | bool | 是否反向顺序运行 | ```json { "switch": false } ``` ## 循环次数 ### 设置循环次数 **命令字:** `0x5620` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | index | int | 总循环次数,0 表示无限循环 | ```json { "robot": 1, "index": 1 } ``` ### 查询循环次数 **命令字:** `0x5621` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5622` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | index | int | 总循环次数,0 表示无限循环 | | count | int | 当前已运行次数 | ```json { "robot": 1, "count": 0, "index": 1 } ``` ## 全局线程 ### 全局线程自启动设置 **命令字:** `0x5630` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | name | string | 全局后台程序名 | ```json { "robot": 1, "name": "Q1" } ``` ### 全局线程自启动查询 **命令字:** `0x5631` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 全局线程自启动接收 **命令字:** `0x5632` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | name | string | 全局后台程序名 | ```json { "robot": 1, "name": "Q1" } ``` ### 全局线程启动控制 **命令字:** `0x5633` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | type | int | 启动控制:0 表示停止,1 开始 | ```json { "robot": 1, "type": 1 } ``` ### 全局线程启动状态查询 **命令字:** `0x5634` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | runName | int | 1 表示获取全局后台运行状态 | ```json { "robot": 1, "hasRun": true, "runName": 1 } ``` **控制器回复** | 命令字 | 类型 | 说明 | |--------|------|------| | 0x50c6 | - | GLOBAL_PTHREAD_RUNSTATUS_RESPOND | | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool[] | 自启状态数组,true 表示启动,false 表示停止 | ```json { "robot": 1, "hasRun": [false, true] } ``` ## 追加运动模式 追加运动模式是在不使用程序的条件下运行程序。 使用方法: 1. 打开追加运动模式 2. 追加运动模式插入指令向量 3. 追加运动模式设置 ### 打开追加运动模式 **命令字:** `0x5640` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | open | bool | 是否开启追加运动模式,true 打开,false 关闭 | ```json { "robot": 1, "open": true } ``` ### 查询追加运动模式 **命令字:** `0x5641` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5642` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | open | bool | 是否开启追加运动模式,true 打开,false 关闭 | ```json { "robot": 1, "open": true } ``` ### 追加运动插入指令向量 **命令字:** `0x5643` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | isContinue | bool | true 只接收并存储 pos,false 接收 pos 并使得机器人执行所有 pos | | data | array | 指令 JSON 列表,格式为 cmd->toJson() | ```json { "data": [ { "cmd": "toJson()" }, { "cmd": "toJson()" }, { "cmd": "toJson()" } ], "isContinue": false, "robot": 1 } ``` > 指令详情请参阅指令页面 ### 追加运动模式挂起(暂停) **命令字:** `0x5644` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 追加运动模式启动 **命令字:** `0x5645` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 追加运动模式停止 **命令字:** `0x5646` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [0, 3] | ```json { "robot": 0 } ``` ## 自启动 自启动程序,设置后开机自启动。 ### 设置自启动程序 **命令字:** `0x5647` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | enable | bool | 是否使能,true 使能,false 不使用 | | count | int | 运行次数 | | speed | int | 运行速度 | | jobname | string | 程序名字 | ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` ### 查询自启动程序 **命令字:** `0x5648` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5649` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | enable | bool | 是否使能 | | count | int | 运行次数 | | speed | int | 运行速度 | | jobname | string | 程序名字 | ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` > 需补充试运行和单步相关内容 ### 查询全局后台自启状态 **命令字:** `0x50c5` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool | 自启状态,true 启动,false 停止 | | runName | int | 1:获取全局后台运行状态 | ```json { "robot": 1, "hasRun": true, "runName": 1 } ``` **控制器回复** **命令字:** `0x50c6` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool | 自启状态,true 启动,false 停止 | ```json { "robot": 1, "hasRun": false } ``` --- # 程序状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/06.%E7%A8%8B%E5%BA%8F%E7%8A%B6%E6%80%81.html ## 程序行号 当控制器开始运行一条指令时,向上位机发送: **命令字:** `0x5400` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | num | int | 已运行指令数量 | ```json { "robot": 1, "jobname": "Q1", "num": 3 } ``` ## CRAFTLINE 指令跳转 当控制器执行 CRAFTLINE 指令时,向示教器发送跳转: **命令字:** `0x5401` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | num | int | 已运行指令数量 | ```json { "robot": 1, "num": 2 } ``` ## 查询当前行号 当示教器与控制器建立网络连接时,上位机查询当前运行到哪一行: **命令字:** `0x5402` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5403` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | num | int | 行号 | ```json { "robot": 1, "jobname": "Q1", "num": 3 } ``` ## 程序运行状态 程序状态包括:暂停、运行、停止。 ### 查询程序运行状态 **命令字:** `0x5410` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5411` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | status | int | 程序运行状态:0 停止,1 暂停,2 运行 | ```json { "robot": 1, "status": 0 } ``` ### 查询机器人运行状态 **命令字:** `0x5412` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | ```json { "robot": 1, "jobfilename": "" } ``` **控制器回复** **命令字:** `0x5413` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | status | int | 运行状态:0 停止,1 暂停,2 运行 | | continueRun | int | 是否从当前行运行:0 从头运行,1 从当前行运行 | | currentRun | bool | 当前是否运行 | | mainProgramRun | int | 主程序是否运行 | ```json { "robot": 1, "status": 0, "continueRun": 0, "currentRun": false, "mainProgramRun": 0 } ``` ### 设置当前行 **命令字:** `0x5414` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | | num | int | 行号 | ```json { "robot": 1, "jobfilename": "", "num": 1 } ``` ### 查询当前行 **命令字:** `0x5415` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5416` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | | num | int | 行号 | ```json { "robot": 1, "jobfilename": "", "num": 1 } ``` ### 清除运行状态 上位机在导入程序成功后发送此协议请求重置程序运行状态: **命令字:** `0x5417` - 无需发送数据 **控制器回复** **命令字:** `0x5418` - 无需回复数据 ### 查询运动队列剩余指令数量 **命令字:** `0x5419` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x541A` | 字段 | 类型 | 说明 | |------|------|------| | sum | int | 运动队列的行号数量 | ```json { "sum": 4 } ``` ### 查询运动队列剩余指令数量 **命令字:** `0x541a` **控制器回复** | 字段 | 类型 | 说明 | |------|------|------| | sum | int | 运动队列的行号 | ```json { "sum": 4 } ``` --- # 指令操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/07.%E6%8C%87%E4%BB%A4%E6%93%8D%E4%BD%9C.html ## 1 外部轴 ### 1.1 外部轴位置查询 **说明:** 机器人+变位机同步插入指令时的位置查询 **命令字:** `0x5300` **上位机发送:** ```json { "robot": 1, "coord": 0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | coord | int | 是 | 控制器当前坐标:0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | --- ### 1.2 外部轴位置接收 **说明:** 机器人+变位机同步插入指令时的位置接收 **命令字:** `0x5301` **控制器返回:** ```json { "robot": 1, "coord": 0, "configuration": 1, "position": [0, 0.1, 2, 3.3, 44, 555.55, 66.6], "positionDeg": [0, 0.1, 2, 3.3, 44, 555.55, 66.6], "externalPosition": [0, 0.1, 2, 3.3, 44] } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | coord | int | 是 | 控制器当前坐标:0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | | configuration | int | 是 | 姿态或左右手 | | position | double[] | 是 | 当前位置(弧度制),7位考虑双机情况 | | positionDeg | double[] | 是 | 当前位置(角度制) | | externalPosition | double[] | 是 | 外部轴当前位置,5位 | --- ## 2 历史指令列表 ### 2.1 历史指令列表查询 **命令字:** `0x5310` **上位机发送:** ```json { "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | --- ### 2.2 指令列表查询 **命令字:** `0x5301` **上位机发送:** ```json { "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | --- ### 2.3 历史指令列表返回 **命令字:** `0x5311` **控制器返回:** ```json { "robot": 1, "jobname": ["请求权", "请求权"], "num": [2, 1], "sendednum": 2, "totalnum": 2 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | jobname | string[] | 是 | 程序名数组,单次上限50 | | num | int[] | 是 | 历史行号数组,单次上限50,数组顺序为程序执行反序 | | sendednum | int | 是 | 此次发送数量 | | totalnum | int | 是 | 总计发送数量 | --- ## 3 局部点 **说明:** 局部点为不同程序内的数据,不同程序的局部点不相关。 ### 3.1 插入局部点位 **命令字:** `0x5320` **上位机发送:** ```json { "robot": 1, "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "paraVarData": [ {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0} ] }, "time": "2024.11.06 10:10:34" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | robotpos | object | 是 | 点位信息 | | time | string | 是 | 时间戳,格式如:`2024.11.06 10:10:34` | **robotpos 子对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | 类型 | | key | string | 点位标识 | | note | string | 备注 | | data | double[] | 位置数据数组 | | paraVarData | object[] | 参数变量数据 | --- ### 3.2 修改局部点位 **命令字:** `0x5321` **上位机发送:** ```json { "robot": 1, "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "paraVarData": [ {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0} ] }, "time": "2024.11.06 10:14:31" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | robotpos | object | 是 | 点位信息 | | time | string | 是 | 时间戳,格式如:`2024.11.06 10:14:31` | --- ### 3.3 修改数值局部变量 **命令字:** `0x5322` **上位机发送:** ```json { "robot": 1, "time": "2024.11.06 10:18:24", "varName": "D007", "varNote": "", "varType": 1, "varString": "RRR", "varValue": 0.0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | time | string | 是 | 时间戳 | | varName | string | 是 | 变量名,局部数值型变量:I001, D001, B001, S001 | | varNote | string | 否 | 注释 | | varType | int | 是 | 变量类型:0-int, 1-double, 2-bool, 3-string | | varValue | double | 是 | 数值型值 | | varString | string | 是 | 字符型值 | --- ## 4 语法检查 ### 4.1 获取语法检查结果 **命令字:** `0x9121` **上位机发送:** ```json { "robot_id": 1, "job_name": "QQQ", "suffix": ".JBR" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_id | int | 是 | 机器人号 | | job_name | string | 是 | 作业名 | | suffix | string | 是 | 程序后缀:`.JBR` 主程序、`.JBP` 后台局部程序、`.JBPG` 后台全局程序 | --- ### 4.2 语法检查结果返回 **命令字:** `0x9121` **控制器返回:** ```json { "robot_id": 1, "job_name": "QQQ", "suffix": ".JBR", "result": "true", "cur_error_command_num": 5 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_id | int | 是 | 机器人号 | | job_name | string | 是 | 作业名 | | suffix | string | 是 | 程序后缀 | | result | bool | 是 | 检查结果:true-成功,false-失败 | | cur_error_command_num | int | 否 | 失败时行号 | --- ## 5 快捷指令 **说明:** 快捷指令的是否使用在操作参数中有节点表示。 ### 5.1 设置快捷指令 **命令字:** `0x50E0` **上位机发送:** ```json { "quickInsert": [ [0, 0], [0, 1], [0, 2], [0, 3], [0, 5], [-1, -1], [-1, -1], [-1, -1] ] } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | quickInsert | array | 是 | 快捷指令数组,共8个元素,每个元素第一位代表指令类型,第二位代表指令 | --- ### 5.2 查询快捷指令 **命令字:** `0x50E0` **上位机发送:** ```json {} ``` **说明:** data 为空对象。 --- ### 5.3 返回快捷指令 **命令字:** `0x50E2` **控制器返回:** (同 0x50E0 格式) --- # 远程程序 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/08.%E8%BF%9C%E7%A8%8B%E7%A8%8B%E5%BA%8F.html ## 预约执行状态 远程模式界面,上位机查询预约执行状态时,发送。 **命令字:** `0x5500` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复预约执行状态查询结果。 **命令字:** `0x5501` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | current | object | 当前任务状态 | | current.station | int | 工位编号 | | current.name | string | 程序名称 | | current.runtime | int | 运行时间 | | current.times | int | 运行次数 | | current.count | int | 已运行次数 | | current.status | int | 状态:0-无预约,1-预约中,2-运行中,3-已预约,4-程序暂停 | | queue | array | 预约队列 | | queue[].station | int | 工位编号 | | queue[].name | string | 程序名称 | | queue[].times | int | 运行次数 | | queue[].count | int | 已运行次数 | | queue[].status | int | 状态 | ### 响应示例 ```json { "robot": 1, "current": { "station": 1, "name": "Q1", "runtime": 1, "times": 3, "count": 1, "status": 2 }, "queue": [ { "station": 1, "name": "Q4", "times": 2, "count": 0, "status": 1 }, { "station": 1, "name": "Q1", "times": 6, "count": 0, "status": 1 }, { "station": 1, "name": "Q3", "times": 1, "count": 0, "status": 1 }, { "station": 1, "name": "", "times": 1, "count": 0, "status": 0 }, { "station": 1, "name": "", "times": 2, "count": 0, "status": 0 } ] } ``` ## 远程状态 上位机发送远程控制设置。 **命令字:** `0x5510` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | remotectl | bool | 是 | 远程控制的状态 | ### 请求示例 ```json { "remotectl": false } ``` 上位机发送远程控制查询。 **命令字:** `0x5511` date:无 控制器回复查询。 **命令字:** `0x5512` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | remotectl | bool | 远程控制的状态 | ### 响应示例 ```json { "remotectl": false } ``` ## 远程程序 上位机发送设置远程程序。 **命令字:** `0x5520` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | jobFile | array | 是 | 程序列表 | | jobFile[].name | string | 是 | 程序名称 | | jobFile[].times | int | 是 | 运行次数 | | interpolationMethod | int | 否 | 插补方法 | | absolutePosResolution | double | 否 | 绝对位置分辨率 | | stopTime | int | 否 | 暂停时间 | | runDelayTime | int | 否 | 运行延时时间 | | remoteDefaultSpeed | int | 否 | 远程模式速度 1-100% | ### 请求示例 ```json { "robot": 1, "jobFile": [ {"name": "Q1", "times": 3}, {"name": "Q2", "times": 3}, {"name": "", "times": 1}, {"name": "Q4", "times": 2}, {"name": "", "times": 1} ], "interpolationMethod": 4, "absolutePosResolution": 0.06, "stopTime": 5, "runDelayTime": 600, "remoteDefaultSpeed": 1 } ``` 上位机发送获取远程程序。 **命令字:** `0x5521` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器收到上位机查询程序名字时回复。 **命令字:** `0x5522` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobFile | array | 程序列表 | | jobFile[].name | string | 程序名称 | | jobFile[].times | int | 运行次数 | | remoteProgramNum | int | 远程程序个数 | ### 响应示例 ```json { "jobFile": [ {"name": "Q1", "times": 3}, {"name": "Q2", "times": 3}, {"name": "", "times": 1}, {"name": "Q4", "times": 2}, {"name": "", "times": 1}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0} ], "remoteProgramNum": 10, "robot": 1 } ``` ## 远程模式参数设置 上位机发送远程模式参数设置。 **命令字:** `0x5530` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | waitingTime | double | 否 | IO 重复触发时间 | | reserveIsStart | int | 否 | 预约 IO 后自动启动运行:0-关,1-开 | | interpolationMethod | int | 否 | 插补方法 | | reserveTrgTime | double | 否 | 远程模式 IO 预约并启动时间(毫秒) | | absolutePosResolution | int | 否 | 绝对位置分辨率 | | stopTime | int | 否 | 暂停时间 | | runDelayTime | int | 否 | 运行延时时间 | | remoteDefaultSpeed | int | 否 | 远程模式速度 1-100% | ### 请求示例 ```json { "robot": 1, "waitingTime": 1, "reserveIsStart": 0, "interpolationMethod": 4, "reserveTrgTime": 200, "absolutePosResolution": 0.06, "stopTime": 5, "runDelayTime": 600, "remoteDefaultSpeed": 1 } ``` 上位机发送远程模式参数查询。 **命令字:** `0x5531` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复查询结果。 **命令字:** `0x5532` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | remoteDefaultSpeed | int | 远程模式速度 1-100% | | remoteProgramNum | int | 远程程序个数 | | reserveIsStart | bool | 预约 IO 后自动启动运行:0-关,1-开 | | waitingTime | int | IO 重复触发时间 | ### 响应示例 ```json { "remoteDefaultSpeed": 1.0, "remoteProgramNum": 10, "reserveIsStart": false, "waitingTime": 500 } ``` ## 远程 IO 功能界面设置 上位机发送设置 IO 功能界面。 **命令字:** `0x5540` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | remoteProgramNum | int | 是 | 远程 IO 数功能 | | inPort | object | 否 | IO 触发端口绑定 | | inPort.clearoutagekeep | int | 否 | 清除断电保存数据,绑定 IO 端口:0-无,1-端口1 | | inPort.faultReset | int | 否 | 清除报警,绑定 IO 端口 | | inPort.pause | int | 否 | 暂停,绑定 IO 端口 | | inPort.start | int | 否 | 启动,绑定 IO 端口 | | inPort.stop | int | 否 | 停止,绑定 IO 端口 | | inValue | object | 否 | IO 参数 | | inValue.clearoutagekeep | int | 否 | 清除断电保存数据,绑定 IO 端口触发所需状态:0-低电平有效,1-高电平有效 | | inValue.faultReset | int | 否 | 清除报警,绑定 IO 端口触发所需状态 | | inValue.pause | int | 否 | 暂停,绑定 IO 端口触发所需状态 | | inValue.start | int | 否 | 启动,绑定 IO 端口触发所需状态 | | inValue.stop | int | 否 | 停止,绑定 IO 端口触发所需状态 | | program | array | 否 | 程序列表 | | program[].port | int | 否 | 端口 | | program[].value | int | 否 | 值 | ### 请求示例 ```json { "inPort": { "clearoutagekeep": 0, "faultReset": 0, "pause": 0, "start": 8, "stop": 0 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1} ], "remoteProgramNum": 10, "robot": 1 } ``` IO 功能界面查询设置时,上位机发送下面命令。 **命令字:** `0x5541` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` IO 功能界面,控制器收到查询时回复。 **命令字:** `0x5542` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | remoteProgramNum | int | 远程 IO 数功能 | | inPort | object | IO 触发端口绑定:0-无,1-端口1 | | inPort.clearoutagekeep | int | 清除断电保存数据,绑定 IO 端口 | | inPort.faultReset | int | 清除报警,绑定 IO 端口 | | inPort.pause | int | 暂停,绑定 IO 端口 | | inPort.start | int | 启动,绑定 IO 端口 | | inPort.stop | int | 停止,绑定 IO 端口 | | inValue | object | IO 参数:0-低电平有效,1-高电平有效 | | inValue.clearoutagekeep | int | 清除断电保存数据,绑定 IO 端口触发所需状态 | | inValue.faultReset | int | 清除报警,绑定 IO 端口触发所需状态 | | inValue.pause | int | 暂停,绑定 IO 端口触发所需状态 | | inValue.start | int | 启动,绑定 IO 端口触发所需状态 | | inValue.stop | int | 停止,绑定 IO 端口触发所需状态 | | program | array | 程序列表 | | program[].name | string | 程序名称 | | program[].port | int | 端口 | | program[].value | int | 值 | | reserveTrgTime | int | IO 重复触发屏蔽时间 | ### 响应示例 ```json { "inPort": { "clearoutagekeep": 0, "faultReset": 0, "pause": 0, "start": 0, "stop": 0 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"name": "Q1", "port": 0, "value": 1}, {"name": "Q2", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "Q4", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1} ], "remoteProgramNum": 10, "reserveTrgTime": 500, "robot": 1 } ``` ## 远程 IO 状态 上位机发送远程状态提示设置。 **命令字:** `0x5550` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | output | array | 是 | 输出端口列表 | | output[].program1 ~ program10 | int | 否 | 远程 IO 程序 1-10 的输出端口编号 | | output[].program_value1 ~ program_value10 | int | 否 | 对应每个远程 IO 程序的输出端口值 | ### 请求示例 ```json { "robot": 1, "output": [ { "program1": 1, "program2": 2, "program3": 3, "program4": 4, "program5": 5, "program6": 6, "program7": 7, "program8": 8, "program9": 9, "program10": 10, "program_value1": 1, "program_value2": 2, "program_value3": 3, "program_value4": 4, "program_value5": 5, "program_value6": 6, "program_value7": 7, "program_value8": 8, "program_value9": 9, "program_value10": 10 } ] } ``` 上位机查询远程状态提示设置。 **命令字:** `0x5551` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复查询结果。 **命令字:** `0x5552` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | output | array | 输出端口列表 | | output[].program1 ~ program10 | int | 远程 IO 程序 1-10 的输出端口编号 | | output[].program_value1 ~ program_value10 | int | 对应每个远程 IO 程序的输出端口值 | ### 响应示例 ```json { "robot": 1, "output": [ { "program1": 1, "program2": 2, "program3": 3, "program4": 4, "program5": 5, "program6": 6, "program7": 7, "program8": 8, "program9": 9, "program10": 10, "program_value1": 1, "program_value2": 2, "program_value3": 3, "program_value4": 4, "program_value5": 5, "program_value6": 6, "program_value7": 7, "program_value8": 8, "program_value9": 9, "program_value10": 10 } ] } ``` ## 远程模式连接状态 查询 Modbus、外部 IO 连接状态时,发送。 **命令字:** `0x5560` date:无 收到查询连接状态时,返回。 **命令字:** `0x5561` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | ModbusConnect | bool | Modbus 连接状态:false-未连接,true-已连接 | | ExternIOConnect | bool | 外部 IO 连接状态:false-未连接,true-已连接 | | type | int | 类型:0-NAN,1-RTU,2-TCP | ### 响应示例 ```json { "ModbusConnect": false, "ExternIOConnect": true, "type": 2 } ``` 控制器发送,是否通过 IO 修改了作业文件(外部按键触发修改作业文件时,控制器发送给上位机)。 **命令字:** `0x5562` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | isModify | bool | 是否通过 IO 修改了作业文件:true-是,false-否 | ### 响应示例 ```json { "isModify": false } ``` --- # 总线 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/01.%E6%80%BB%E7%BA%BF.html ## 概述 本控制器支持多种工业现场总线协议,包括 EtherCAT、CANopen 等。通过总线可以实现与伺服驱动器、IO 模块、传感器等从站设备的高速实时通信。 ### 支持的总线类型 | 总线类型 | 说明 | 典型用途 | |----------|------|----------| | EtherCAT | 基于以太网的实时总线 | 伺服控制、高速 IO | | CANopen | 基于 CAN 的现场总线 | 传感器、编码器、分布式 IO | ### 总线架构 ```text ┌─────────────┐ │ 控制器 │ (主站) └──────┬──────┘ │ EtherCAT / CAN bus │ ┌────┴────┬─────────┬──────────┐ │ │ │ │ ┌─┴──┐ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ │伺服│ │伺服 │ │ IO │ │交换 │ │ 1 │ │ 2 │ │模块 │ │ 机 │ └────┘ └─────┘ └─────┘ └─────┘ ``` ### EtherCAT 主站功能 | 功能 | 说明 | |------|------| | 从站扫描 | 自动识别总线上的从站设备 | | ENI 配置 | 通过 EtherCAT 网络信息文件配置从站 | | DC 时钟同步 | 分布式时钟同步,实现各从站精确同步 | | PDO 映射 | 过程数据对象映射,定义实时数据交换内容 | | 从站状态管理 | 监控从站运行状态,支持在线/离线检测 | --- ## CanOpen ### 0x7000 上位机查询该硬件的 can 支持的功能 **命令字:** `0x7000` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 端口号 | | function | Int | 该硬件 can 支持的功能,范围[0,3]
0-标准帧,1-扩展帧,2-远程帧,3-过滤 id | **请求示例:** ```json { "canPort": 1, "function": 0 } ``` --- ### 0x7001 控制器回复上位机查询该硬件的 can 支持的功能结果 **命令字:** `0x7001` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 端口号 | | support | Bool | 该硬件的 can 是否支持这功能 | **响应示例:** ```json { "canPort": 1, "support": true } ``` --- ### 0x7002 上位机设置 can 参数 **命令字:** `0x7002` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canBaud | UInt | can 通讯波特率(bps),常用值:125k, 250k, 500k, 1M | | canPort | UInt | can 通讯端口 | | enableRecvFiltert | Bool | 是否开启过滤 ID;开启后仅接收过滤 ID 匹配的帧 | | frameFormat | Int | 帧格式,范围[0,1]
0-标准帧(11位 ID),1-扩展帧(29位 ID) | | recvFilterId | UInt | 设置过滤 ID,仅 enableRecvFiltert=true 时生效 | **请求示例:** ```json { "canBaud": 500000, "canPort": 1, "enableRecvFiltert": true, "frameFormat": 0, "recvFilterId": 0x181 } ``` --- ### 0x7003 上位机请求接收一帧 can 数据 **命令字:** `0x7003` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | **请求示例:** ```json { "canPort": 1 } ``` --- ### 0x7004 控制器回复上位机接收一帧 can 数据结果 **命令字:** `0x7004` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | | data | UChar[] | 接收到的数据,长度为 Length 节点的值 | | Length | UInt | 接收到的数据长度 | | recvCanID | UInt | 接收到的帧 ID | **响应示例:** ```json { "canPort": 1, "data": [0x10, 0x20, 0x30], "Length": 3, "recvCanID": 0x181 } ``` --- ### 0x7005 上位机请求发送一帧数据 **命令字:** `0x7005` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | | data | UChar[] | 需要发送的数据 | | sendCanID | UInt | 发送帧的 ID | | sendLen | UInt | 发送的数据长度,范围[1,8] | | useRemoteFrame | Bool | 是否使用远程帧;远程帧用于请求对方发送数据 | **请求示例:** ```json { "canPort": 1, "data": [0x10, 0x20], "sendCanID": 0x201, "sendLen": 2, "useRemoteFrame": false } ``` --- ## EtherCAT 总线配置 ### ENI 文件管理 ENI(EtherCAT Network Information)文件是 EtherCAT 总线配置的核心文件,描述了总线上所有从站的型号、数量、排列顺序及 PDO 映射信息。ENI 文件通常由专用配置工具生成(如 INEXBOT EC-Config),导入控制器后生效。 --- ### 0x7010 上位机查询 ENI 文件列表 **命令字:** `0x7010` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | num | Int | 获取 ENI 文件数目,范围[1,10]
1-获取当前使用的 ENI 文件,10-获取所有 ENI 文件 | **请求示例:** ```json { "num": 10 } ``` --- ### 0x7011 控制器回复上位机 ENI 文件列表 **命令字:** `0x7011` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIfilelist | String[] | 控制器 ENI 文件列表 | | ENIfilenum | Int | ENI 文件数目 | | absolutepath | String | 控制器中 ENI 文件所在文件夹 | **响应示例:** ```json { "ENIfilelist": [ "INEXBOT-IO-R4-1.xml", "DST_X503-1.json", "DST_X503-1.xml", "KunWeiTech_FT_Sensors-1.xml", "P140000107-1.0.1.1-ECXML-1.xml" ], "ENIfilenum": 5, "absolutepath": "eni/" } ``` --- ### 0x7012 上位机查询 ENI 参数 **命令字:** `0x7012` **请求参数:**(无) ```json {} ``` --- ### 0x7013 控制器回复上位机 ENI 参数 **命令字:** `0x7013` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIName | String | 当前使用的 ENI 文件名称 | | isHaveENI | Int | ENI 文件识别结果,范围[-1,1]
-1-无 ENI 文件,0-未识别到对应 ENI,1-识别到 ENI 文件 | **响应示例:** ```json { "ENIName": "eni-RC-6-mecat-1-1000.xml", "isHaveENI": 1 } ``` --- ### 0x7014 上位机设置当前使用的 ENI 文件 **命令字:** `0x7014` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIName | String | 要激活的 ENI 文件名 | **请求示例:** ```json { "ENIName": "eni-RC-6-mecat-1-1000.xml" } ``` > ⚠️ 切换 ENI 文件后,控制器需要重新初始化 EtherCAT 总线。切换前请确认机器人处于安全状态。 --- ## 从站管理 ### 0x7020 上位机查询从站列表 **命令字:** `0x7020` **请求参数:**(无) ```json {} ``` --- ### 0x7021 控制器回复上位机从站列表 **命令字:** `0x7021` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | IONum | Int[] | IO 从站列表(0-非 IO 从站,非0-IO 从站索引) | | servoNum | Int[] | 伺服从站列表(0-非伺服从站,非0-伺服索引) | | switchNum | Int[] | 交换机列表(0-非交换机,非0-交换机索引) | | slaveType | String[] | 从站中文名称列表 | | slaveTypeEnglish | String[] | 从站英文名称列表 | **响应示例:** ```json { "IONum": [0, 0, 0, 0, 0, 0], "servoNum": [1, 2, 3, 4, 5, 6], "switchNum": [0, 0, 0, 0, 0, 0], "slaveType": ["禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E"], "slaveTypeEnglish": ["hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e"] } ``` > 从站列表按总线拓扑顺序排列(从站 0 为离主站最近的设备),`servoNum`、`IONum`、`switchNum` 分别表示该位置的从站类型和编号。 --- ## 从站状态监控 ### 0x7023 上位机查询从站状态 **命令字:** `0x7023` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveIndex | int | 从站索引号,-1 表示查询所有从站 | **请求示例:** ```json { "slaveIndex": -1 } ``` --- ### 0x7024 控制器回复从站状态 **命令字:** `0x7024` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveStates | object[] | 从站状态列表 | | slaveStates[].index | int | 从站索引 | | slaveStates[].ethercatState | int | EtherCAT 状态机:1-INIT,2-PREOP,4-SAFEOP,8-OP | | slaveStates[].online | bool | 在线状态:true-在线,false-离线 | | slaveStates[].errorCode | int | 错误码,0-正常 | | slaveStates[].txErrors | int | 发送错误计数 | | slaveStates[].rxErrors | int | 接收错误计数 | | slaveStates[].alStatusCode | int | AL 状态码(应用层状态码) | #### EtherCAT 状态机说明 | 状态 | 值 | 说明 | |------|---|------| | INIT | 1 | 初始化状态,仅完成基础通讯 | | PREOP | 2 | 预运行状态,可进行邮箱通讯和参数配置 | | SAFEOP | 4 | 安全运行状态,可进行输入数据读取,输出保持安全值 | | OP | 8 | 运行状态,可进行完整的输入/输出数据交换 | **响应示例:** ```json { "slaveStates": [ { "index": 0, "ethercatState": 8, "online": true, "errorCode": 0, "txErrors": 0, "rxErrors": 0, "alStatusCode": 0 }, { "index": 1, "ethercatState": 8, "online": true, "errorCode": 0, "txErrors": 0, "rxErrors": 0, "alStatusCode": 0 } ] } ``` --- ### 0x7025 控制器主动上报从站状态变化 **命令字:** `0x7025` 当任何从站状态发生变化(在线/离线、状态机切换、错误发生)时,控制器主动推送。 **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveIndex | int | 从站索引 | | oldState | int | 旧状态 | | newState | int | 新状态 | | errorCode | int | 错误码 | | timestamp | string | 状态变化时间 | **响应示例:** ```json { "slaveIndex": 2, "oldState": 8, "newState": 4, "errorCode": 0, "timestamp": "2024-03-15T14:30:05Z" } ``` --- ## 总线状态监控 ### 0x7026 上位机查询总线状态 **命令字:** `0x7026` **请求参数:**(无) ```json {} ``` --- ### 0x7027 控制器回复总线状态 **命令字:** `0x7027` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | busState | int | 总线状态:0-未初始化,1-初始化中,2-运行中,3-错误 | | cycleTime | int | 总线周期时间(us) | | slaveCount | int | 已识别的从站总数 | | onlineCount | int | 在线从站数 | | dcInSync | bool | DC 时钟同步状态 | | masterState | int | 主站状态码 | **响应示例:** ```json { "busState": 2, "cycleTime": 1000, "slaveCount": 6, "onlineCount": 6, "dcInSync": true, "masterState": 8 } ``` --- ### 0x7022 上位机请求控制器切换系统 **命令字:** `0x7022` **请求参数:**(无) ```json {} ``` > 切换系统用于在多个 ENI 配置方案之间切换,切换后控制器重新初始化总线。 --- ## 常见问题 ### 总线故障排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 从站离线 | 网线松动或断开 | 检查 EtherCAT 网线连接 | | 从站离线 | 从站设备断电 | 检查从站电源 | | 从站不在 OP 状态 | ENI 文件与实际从站不匹配 | 确认 ENI 文件与硬件配置一致 | | 从站不在 OP 状态 | 从站固件版本不兼容 | 升级从站固件或更新 ESI 文件 | | 总线初始化失败 | ENI 文件损坏 | 重新导入有效的 ENI 文件 | | DC 同步失败 | 从站不支持 DC | 在配置工具中禁用该从站的 DC 功能 | | 总线周期超时 | 从站数量过多 | 减少不必要的从站,或增大周期时间 | | 通讯错误累积 | 电磁干扰 | 检查屏蔽和接地 | ### 维护建议 - 定期检查从站在线状态(`0x7023`),监控 `txErrors`/`rxErrors` 计数 - 总线运行中勿插拔网线或从站设备 - 更换从站设备后需确认 ENI 配置匹配 - 保持 ENI 文件与硬件配置同步更新 --- # IO > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/02.IO.html ## 状态提示 > **说明:** 提示端口范围最大均为当前绑定的 IO 数量;输出方式范围均为[0,2],0为0,1为1,2为闪烁 ### 上位机设置状态提示参数 **命令字:** `0x7100` > **说明:** 此命令的通讯协议与控制器回复命令 `0x7102` 一致。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | outPut | array | 机器人状态提示参数列表,长度为4 | | remoteOut | int | 远程模式状态提示端口 | | remoteOut_value | int | 远程模式状态输出方式,范围[0,2] | | runOut | int | 运动模式状态提示端口 | | runOut_value | int | 运动模式状态输出方式,范围[0,2] | | startUp | int | 开机状态提示端口 | | startUp_value | int | 开机状态输出方式,范围[0,2] | | teachOut | int | 示教模式状态提示端口 | | teachOut_value | int | 示教模式状态输出方式,范围[0,2] | **请求示例:** ```json { "outPut": [ { "IOenable":5, "IOenable_value":1, "continuable":8, "continuable_value":1, "fault":4, "faultIsFickler":1, "mainJobFirstLine":9, "mainJobFirstLine_value":2, "pause":2, "pause_value":1, "quickStopOut1":6, "quickStopOut2":7, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":1, "running_value":1, "stop":3, "stop_value":1, "teachBoxStateOut":17, "teachBoxStateOutValue":2 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":1, "mainJobFirstLine":24, "mainJobFirstLine_value":0, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 } ], "remoteOut":19, "remoteOut_value":2, "runOut":20, "runOut_value":2, "startUp":18, "startUp_value":0, "teachOut":21, "teachOut_value":2 } ``` ### 上位机查询状态提示参数 **命令字:** `0x7101` **请求示例:** ```json {} ``` ### 控制器回复上位机状态提示参数 **命令字:** `0x7102` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | outPut | array | 机器人状态提示参数列表,长度为4 | | remoteOut | int | 远程模式状态提示端口 | | remoteOut_value | int | 远程模式状态输出方式,范围[0,2] | | runOut | int | 运动模式状态提示端口 | | runOut_value | int | 运动模式状态输出方式,范围[0,2] | | startUp | int | 开机状态提示端口 | | startUp_value | int | 开机状态输出方式,范围[0,2] | | teachOut | int | 示教模式状态提示端口 | | teachOut_value | int | 示教模式状态输出方式,范围[0,2] | **响应示例:** ```json { "outPut": [ { "IOenable":5, "IOenable_value":1, "continuable":8, "continuable_value":1, "fault":4, "faultIsFickler":1, "mainJobFirstLine":9, "mainJobFirstLine_value":2, "pause":2, "pause_value":1, "quickStopOut1":6, "quickStopOut2":7, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":1, "running_value":1, "stop":3, "stop_value":1, "teachBoxStateOut":17, "teachBoxStateOutValue":2 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":1, "mainJobFirstLine":24, "mainJobFirstLine_value":0, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 } ], "remoteOut":19, "remoteOut_value":2, "runOut":20, "runOut_value":2, "startUp":18, "startUp_value":0, "teachOut":21, "teachOut_value":2 } ``` ## IO 复位 > **说明:** "enable"与"value"节点长度均为128,实际有效数据为当前 IO 的总端口数,超过部分默认为0 ### 上位机设置 IO 复位参数 **命令字:** `0x7110` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 是否复位;bool 类型,长度128 | | robot | int | 需要设置的机器人号,范围[1,4] | | type | int | 需要设置的复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | | value | array | 输出端口复位值;int 类型,范围[0,1],长度128 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "robot":1, "type":1, "value":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` ### 上位机查询 IO 复位参数 **命令字:** `0x7111` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 需要查询的机器人号,范围[1,4] | | type | int | 需要查询的复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | **请求示例:** ```json { "robot":1, "type":1 } ``` ### 控制器回复上位机 IO 复位参数 **命令字:** `0x7112` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 是否复位;bool 类型,长度128 | | robot | int | 机器人号,范围[1,4] | | type | int | 复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | | value | array | 输出端口复位值;int 类型,范围[0,1],长度128 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "robot":1, "type":1, "value":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` ## IO 功能状态 ### 上位机查询 IO 功能状态 **命令字:** `0x7120` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | IO 状态类型,范围[1,4]
1:数字输入
2:数字输出
3:模拟输入
4:模拟输出 | **请求示例:** ```json { "type":1 } ``` ### 控制器回复上位机 IO 功能状态 **命令字:** `0x7121` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | IOFunction | array | IO 功能列表;string 类型,长度为当前 IO 端口数量 | | type | int | IO 状态类型,范围[1,4]
1:数字输入
2:数字输出
3:模拟输入
4:模拟输出 | **响应示例:** ```json { "IOFunction":["","","","","拖拽:拖拽示教外部触发信号 ","","","", "","","","","","使能硬接线端口1 ","安全:机器人1紧急停止1 安全:机器人2紧急停止1 ","", "","远程:机器人1启动 远程:机器人1程序1选择 ","","","","","","", "","","","","","","",""], "type":1 } ``` ## IO 配置 > **说明:** 串口模拟 IO 参数(若 EtherCAT IO 板有模拟 IO,则该串口模拟 IO 将无效) ### 上位机设置 IO 配置参数 **命令字:** `0x7130` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | serialAnalog | object | 串行模拟参数 | | serialAnalog.baudRate | int | 波特率 | | serialAnalog.port | int | 端口号,范围(0,65535] | | serialAnalog.type | string | 模拟类型
"DAC_ANAIO":DAC 模拟 IO 板
"SUPER_ANAIO":格控模拟 IO 板 | | simuNum | int | 虚拟 IO 数量,范围[0,4] | **请求示例:** ```json { "serialAnalog": { "baudRate":115200, "port":2, "type":"SUPER_ANAIO" }, "simuNum":2 } ``` ### 上位机查询 IO 配置参数 **命令字:** `0x7131` **请求示例:** ```json {} ``` ### 控制器回复上位机 IO 配置参数 **命令字:** `0x7132` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | IO 数量(包含实体 IO 和虚拟 IO 的总数量) | | portNum | array | 各 IO 端口数二维数组;int 类型
一维为 IO 号,二维依次为:数字输入端口数、数字输出端口数、模拟输入端口数、模拟输出端口数 | | serialAnalog | object | 串行模拟参数 | | serialAnalog.baudRate | int | 波特率 | | serialAnalog.port | int | 端口号,范围(0,65535] | | serialAnalog.type | string | 模拟类型 | | simuNum | int | 虚拟 IO 数量,范围[0,4] | | type | array | 已连接 IO 板型号列表;string 类型 | **响应示例:** ```json { "num":2, "portNum": [ [16,16,2,2], [16,16,2,2] ], "serialAnalog": { "baudRate":115200, "port":2, "type":"SUPER_ANAIO" }, "simuNum":2, "type":["虚拟IO","虚拟IO"] } ``` ## 安全设置 ### 上位机设置安全设置参数 **命令字:** `0x7140` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | quickStop | object | 紧急停止参数 | | quickStop.enable | bool | 紧急停止使能 | | quickStop.port1 | int | 紧急停止1数字输入端口 | | quickStop.port2 | int | 紧急停止2数字输入端口 | | quickStop.shieldFlag1 | bool | 屏蔽紧急停止1 | | quickStop.shieldFlag2 | bool | 屏蔽紧急停止2 | | quickStop.shieldTime | int | 屏蔽紧急停止时间,范围[0,100000)s | | quickStop.time | double | 快速停止时间,范围[50,200]ms | | quickStop.value1 | int | 紧急停止1数字输入参数,范围[0,1] | | quickStop.value2 | int | 紧急停止2数字输入参数,范围[0,1] | | robot | int | 需要设置的机器人号,范围[1,4] | | safeScreen | object | 安全光幕参数 | | safeScreen.enable | bool | 安全光幕使能 | | safeScreen.port1 | int | 安全光幕1数字输入端口 | | safeScreen.port2 | int | 安全光幕2数字输入端口 | | safeScreen.value1 | int | 安全光幕1数字输入参数,范围[0,1] | | safeScreen.value2 | int | 安全光幕2数字输入参数,范围[0,1] | **请求示例:** ```json { "quickStop": { "enable":true, "port1":15, "port2":0, "shieldFlag1":false, "shieldFlag2":true, "shieldTime":30, "time":60.0, "value1":1, "value2":1 }, "robot":1, "safeScreen": { "enable":true, "port1":8, "port2":0, "value1":1, "value2":1 } } ``` ### 上位机查询安全设置参数 **命令字:** `0x7141` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 需要查询的机器人号,范围[1,4] | **请求示例:** ```json { "robot":1 } ``` ### 控制器回复上位机安全设置参数 **命令字:** `0x7142` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | quickStop | object | 紧急停止参数 | | quickStop.enable | bool | 紧急停止使能 | | quickStop.port1 | int | 紧急停止1数字输入端口 | | quickStop.port2 | int | 紧急停止2数字输入端口 | | quickStop.shieldFlag1 | bool | 屏蔽紧急停止1 | | quickStop.shieldFlag2 | bool | 屏蔽紧急停止2 | | quickStop.shieldTime | int | 屏蔽紧急停止时间,范围[0,100000)s | | quickStop.time | double | 快速停止时间,范围[50,200]ms | | quickStop.value1 | int | 紧急停止1数字输入参数,范围[0,1] | | quickStop.value2 | int | 紧急停止2数字输入参数,范围[0,1] | | robot | int | 机器人号,范围[1,4] | | safeScreen | object | 安全光幕参数 | | safeScreen.enable | bool | 安全光幕使能 | | safeScreen.port1 | int | 安全光幕1数字输入端口 | | safeScreen.port2 | int | 安全光幕2数字输入端口 | | safeScreen.value1 | int | 安全光幕1数字输入参数,范围[0,1] | | safeScreen.value2 | int | 安全光幕2数字输入参数,范围[0,1] | **响应示例:** ```json { "quickStop": { "enable":true, "port1":15, "port2":0, "shieldFlag1":false, "shieldFlag2":true, "shieldTime":30, "time":60.0, "value1":1, "value2":1 }, "robot":1, "safeScreen": { "enable":true, "port1":8, "port2":0, "value1":1, "value2":1 } } ``` ## 端口触发信息 > **说明:** 在端口被触发时控制器向上位机发送设置的信息进行提示 ### 上位机设置数字输入端口触发信息 **命令字:** `0x7150` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2]
0:消息
1:警告
2:错误,长度32 | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机查询数字输入端口触发信息 **命令字:** `0x7151` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入触发信息 **命令字:** `0x7152` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机设置数字输出端口触发信息 **命令字:** `0x7153` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机查询数字输出端口触发信息 **命令字:** `0x7154` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出触发信息 **命令字:** `0x7155` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ## 端口名称 > **说明:** 对端口名称进行重命名 ### 上位机设置数字输入端口名称 **命令字:** `0x7160` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的数字输入端口名称列表;string 类型 | **请求示例:** ```json { "name":["AAA","","","","","","","","","","","","","BBB","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机查询数字输入端口名称 **命令字:** `0x7161` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入端口名称 **命令字:** `0x7162` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的数字输入端口名称列表;string 类型 | **响应示例:** ```json { "name":["AAA","","","","","","","","","","","","","BBB","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机设置数字输出端口名称 **命令字:** `0x7163` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的数字输出端口名称列表;string 类型 | **请求示例:** ```json { "name":["","","","","","VV","","","","","","","","","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机查询数字输出端口名称 **命令字:** `0x7164` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出端口名称 **命令字:** `0x7165` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的数字输出端口名称列表;string 类型 | **响应示例:** ```json { "name":["","","","","","VV","","","","","","","","","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机设置模拟输入端口名称 **命令字:** `0x7166` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的模拟输入端口名称列表;string 类型 | **请求示例:** ```json { "name":["","UY","",""] } ``` ### 上位机查询模拟输入端口名称 **命令字:** `0x7167` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输入端口名称 **命令字:** `0x7168` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的模拟输入端口名称列表;string 类型 | **响应示例:** ```json { "name":["","UY","",""] } ``` ### 上位机设置模拟输出端口名称 **命令字:** `0x7169` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的模拟输出端口名称列表;string 类型 | **请求示例:** ```json { "name":["TY","","",""] } ``` ### 上位机查询模拟输出端口名称 **命令字:** `0x716A` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输出端口名称 **命令字:** `0x716B` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的模拟输出端口名称列表;string 类型 | **响应示例:** ```json { "name":["TY","","",""] } ``` ## 输入输出 ### 上位机设置数字输出值 **命令字:** `0x7180` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | int | 要设置的端口号 | | status | int | 要设置的数字输出值,范围[0,2]
0:输出0
1:输出1
2:将输出值翻转(例:原本输出1现在输出0) | **请求示例:** ```json { "port":1, "status":1 } ``` ### 上位机查询数字输出值 **命令字:** `0x7181` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出值 **命令字:** `0x7182` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | status | array | 数字输出状态列表;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "status":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0] } ``` ### 上位机查询数字输入值 **命令字:** `0x7183` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入值 **命令字:** `0x7184` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | status | array | 数字输入状态列表;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "status":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0] } ``` ### 上位机设置模拟输出值 **命令字:** `0x7185` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | int | 要设置的端口号 | | value | double | 要设置的模拟输出值(该节点数值不小于0) | **请求示例:** ```json { "port":1, "value":8.880 } ``` ### 上位机查询模拟输出值 **命令字:** `0x7186` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输出值 **命令字:** `0x7187` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | value | array | 模拟输出当前值;double 类型 | **响应示例:** ```json { "value":[8.87939453125,0.0,0.0,0.0] } ``` ### 上位机查询模拟输入值 **命令字:** `0x7188` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输入值 **命令字:** `0x7189` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | value | array | 模拟输入当前值;double 类型 | **响应示例:** ```json { "value":[9.99755859375,0.0,0.0,0.0] } ``` ## 强制输入 ### 上位机设置强制数字输入 **命令字:** `0x7190` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | int | 是否强制数字输入,范围[0,1] | | port | int | 强制数字输入的端口号 | | status | int | 强制数字输入的当前值 | **请求示例:** ```json { "enable":1, "port":1, "status":0 } ``` ### 上位机查询强制数字输入端口 **命令字:** `0x7191` **请求示例:** ```json {} ``` ### 控制器回复上位机强制数字输入端口 **命令字:** `0x7192` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | array | 强制数字输入的端口号;int 类型 | | status | array | 强制数字输入的值;int 类型 | **响应示例:** ```json { "port":[2,6,12], "status":[0,1,0] } ``` ### 上位机设置强制模拟输入 **命令字:** `0x7193` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | int | 是否强制模拟输入,范围[0,1] | | port | int | 强制模拟输入的端口号 | | status | double | 强制模拟输入的当前值(该节点数值不小于0) | **请求示例:** ```json { "enable":1, "port":2, "status":9.0 } ``` ### 上位机查询强制模拟输入端口 **命令字:** `0x7194` **请求示例:** ```json {} ``` ### 控制器回复上位机强制模拟输入端口 **命令字:** `0x7195` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | array | 强制数字输入的端口号;int 类型 | | status | array | 强制数字输入的值;double 类型 | **响应示例:** ```json { "port":[1,2], "status":[5.0,9.0] } ``` --- # 其他外设 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/03.%E5%85%B6%E4%BB%96%E5%A4%96%E8%AE%BE.html ## 编码器 ### 说明 上位机设置外部轴编码器溢值参数 **命令字:** `0x7200` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalAxis | array | - | 外部轴编码器最大值最小值参数列表,长度为当前外部轴轴数 | | encode | array | - | 编码器最大值最小值参数列表,长度为该轴从动轴数目+1 | | max | double | [-2^32, 2^32] | 编码器最大值 | | min | double | [-2^32, 2^32] | 编码器最小值 | | externalGroupNum | int | [1, 3] | 要设置参数的轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 请求示例 ```json { "externalAxis": [ { "encode": [ { "max": "100.0", "min": "-100.0" } ] } ], "externalGroupNum": 1, "robot": 2 } ``` --- ### 说明 上位机查询外部轴编码器溢值参数 **命令字:** `0x7201` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalGroupNum | int | [1, 3] | 要查询参数的轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 请求示例 ```json { "externalGroupNum": 1, "robot": 2 } ``` --- ### 说明 控制器回复上位机外部轴编码器溢值参数 **命令字:** `0x7202` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalAxis | array | - | 外部轴编码器最大值最小值参数列表,长度为当前外部轴轴数 | | enable | int | [0, 1] | 编码器多圈值溢出计数功能;0表示未开启,1表示已开启 | | encode | array | - | 编码器最大值最小值参数列表,长度为该轴从动轴数目+1 | | max | double | [-2^32, 2^32] | 编码器最大值 | | min | double | [-2^32, 2^32] | 编码器最小值 | | externalGroupNum | int | [1, 3] | 轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 响应示例 ```json { "externalAxis": [ { "enable": 0, "encode": [ { "max": "100.0", "min": "-100.0" } ] } ], "externalGroupNum": 1, "robot": 2 } ``` --- ## 外部接口 ### 说明 上位机查询外部接口数量 **命令字:** `0x7220` #### 请求示例 ```json {} ``` --- ### 说明 控制器回复上位机外部接口数量 **命令字:** `0x7221` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | canPortSum | int | 已连接 CAN 端口数量 | | encodorPortSum | int | 已连接编码器端口数量 | | pwmPortSum | int | 已连接 PWM 端口数量 | #### 响应示例 ```json { "canPortSum": 1, "encodorPortSum": 2, "pwmPortSum": 4 } ``` --- ## 硬盘 ### 说明 上位机查询硬盘状态 **命令字:** `0x7230` #### 请求示例 ```json {} ``` --- ### 说明 控制器回复上位机硬盘状态 **命令字:** `0x7231` #### 参数列表 | 字段名 | 类型 | 单位 | 说明 | |--------|------|------|------| | Estimated Available Time | int | h | 预计可用时间 | | get_harddisk_warning_time | int | h | 硬盘预警时间 | #### 响应示例 ```json { "Estimated Available Time": 200, "get_harddisk_warning_time": 500 } ``` --- ### 说明 上位机设置硬盘预警时间 **命令字:** `0x7232` #### 参数列表 | 字段名 | 类型 | 范围 | 单位 | 说明 | |--------|------|------|------|------| | set_harddisk_warning_time | int | (0, 9999) | h | 硬盘预警时间 | #### 请求示例 ```json { "set_harddisk_warning_time": 50 } ``` --- ## 伺服内部参数 ### 说明 控制器发送伺服内部参数时会十个参数为一组,分多次发送给上位机 ### 上位机设置伺服参数 **命令字:** `0x7240` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1, 4] | 当前机器人号 | | servoNum | int | - | 需要设置的轴号 | | servo | object | - | 伺服内部参数列表;不同机型获取到参数不一致 | | value | int/double | - | 设置的参数值 | | temporary_save | int | [0, 1] | 是否为临时储存;0表示非临时储存,1表示临时储存 | #### 请求示例 ```json { "robot": 1, "servo": { "位置指令低通滤波器截止频率": { "value": 100.0 }, "位置环比例增益1": { "value": 1000.0 }, "位置环比例增益2": { "value": 1000.0 }, "位置环积分时间常数": { "value": 5000.0 }, "功率回路设定": { "value": 196616.0 }, "故障停止选项": { "value": 6.0 }, "电机反电势系数": { "value": 53.0 }, "电机抱闸保持力矩": { "value": 1000.0 }, "电机抱闸制动保持延迟时间": { "value": 100.0 }, "电机抱闸制动允许延迟时间": { "value": 500.0 }, "电机抱闸制动时间": { "value": 60.0 } }, "servoNum": 1, "temporary_save": 0 } ``` --- ### 上位机查询伺服内部参数 **命令字:** `0x7241` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号 | | servoNum | int | 需要查询的轴号 | #### 请求示例 ```json { "robot": 1, "servoNum": 1 } ``` --- ### 控制器回复上位机伺服内部参数 **命令字:** `0x7242` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号 | | servoNum | int | 查询的轴号 | | sendNum | int | 已发送参数数量 | | totalNum | int | 内部参数的总数量 | | servo | object | 伺服内部参数列表;不同机型获取到参数不一致 | #### servo 对象参数 | 字段名 | 类型 | 说明 | |--------|------|------| | hex | bool | 是否为十六进制 | | index | int | 地址 | | lowLimit | int | 最小限制 | | unit | string | 单位 | | upLimit | int | 最大限制 | | value | int/double | 参数值 | #### 响应示例 ```json { "robot": 1, "sendNum": 10, "servo": { "位置指令低通滤波器截止频率": { "hex": false, "index": 8299, "lowLimit": 1, "unit": "0.1HZ", "upLimit": 1000, "value": 100 }, "位置环比例增益1": { "hex": false, "index": 8256, "lowLimit": 0, "unit": "‰", "upLimit": 600000, "value": 1000 }, "位置环比例增益2": { "hex": false, "index": 8258, "lowLimit": 0, "unit": "‰", "upLimit": 600000, "value": 1000 }, "位置环积分时间常数": { "hex": false, "index": 8259, "lowLimit": 125, "unit": "us", "upLimit": 600000, "value": 5000 }, "功率回路设定": { "hex": true, "index": 8236, "lowLimit": 0, "unit": "", "upLimit": 196623, "value": 196616 }, "故障停止选项": { "hex": true, "index": 8339, "lowLimit": 0, "unit": "", "upLimit": 197379, "value": 0 }, "电机反电势系数": { "hex": false, "index": 8390, "lowLimit": 1, "unit": "mV/rpm", "upLimit": 10000, "value": 53 }, "电机抱闸保持力矩": { "hex": false, "index": 8756, "lowLimit": 1, "unit": "mNm", "upLimit": 600000, "value": 1000 }, "电机抱闸制动保持延迟时间": { "hex": false, "index": 8250, "lowLimit": 0, "unit": "ms", "upLimit": 10000, "value": 100 }, "电机抱闸制动允许延迟时间": { "hex": false, "index": 8254, "lowLimit": 0, "unit": "ms", "upLimit": 10000, "value": 500 } }, "servoNum": 1, "totalNum": 38 } ``` --- ## 星辰一号 ### 上位机查询编码器范围 **命令字:** `0x7250` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | #### 请求示例 ```json { "encodorPort": 1 } ``` --- ### 控制器回复上位机编码器范围 **命令字:** `0x7251` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | | encodorMax | int | 编码器范围最大值 | | encodorMin | int | 编码器范围最小值 | #### 响应示例 ```json { "encoderMax": 100, "encoderMin": 0, "encodorPort": 1 } ``` --- ### 上位机查询编码器值 **命令字:** `0x7252` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | #### 请求示例 ```json { "encodorPort": 1 } ``` --- ### 控制器回复上位机编码器值 **命令字:** `0x7253` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | | encodorValue | int | 编码器值 | #### 响应示例 ```json { "encodorPort": 1, "encodorValue": 5 } ``` --- ## PWM ### 上位机设置 PWM 参数 **命令字:** `0x7260` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | pwmPort | UInt | - | PWM 端口 | | duty | double | - | PWM 占空比 | | freq | double | - | PWM 频率 | | pwmOutTimeMs | UInt | [1000, 5000] ms | PWM 输出时间;输入0时则一直输出 PWM | #### 请求示例 ```json { "duty": 50, "freq": 1000, "pwmOutTimeMs": 1000, "pwmPort": 1 } ``` --- ### 上位机查询 PWM 参数 **命令字:** `0x7261` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | pwmPort | UInt | PWM 端口 | #### 请求示例 ```json { "pwmPort": 1 } ``` --- ### 控制器回复上位机 PWM 参数 **命令字:** `0x7262` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | pwmPort | UInt | PWM 端口 | | duty | double | PWM 占空比 | | freq | double | PWM 频率 | #### 响应示例 ```json { "duty": 50, "freq": 1000, "pwmPort": 1 } ``` --- ### 控制器回复上位机输出时间结果 **命令字:** `0x7263` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | ok | bool | 输出时间结果 | #### 响应示例 ```json { "ok": true } ``` --- # Modbus > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/04.Modbus.html ## 1. 上位机设置 modbus 主站参数 **命令字:** `0x7300` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | masterStation | object | 是 | 主站参数,包含 RTU 参数和 TCP 参数 | | startAddress | bool | 否 | 地址偏移;true 表示地址不变,false 表示地址自动-1 | #### masterStation 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 主站类型;取值"TCP","RTU" | | processNumber | int | 是 | 需要设置的工艺号;范围[1,9] | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | checkBit | string | 是 | 校验位;取值"N","E","O" | | dataBit | int | 是 | 数据位;范围[5,8] | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | | stopBit | int | 是 | 停止位;范围[0,1] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址 | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 请求示例 ```json { "masterStation": { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 2, "slaveId": 1, "stopBit": 1 }, "TCP": { "IP": "192.168.1.14", "endian_type": 1, "port": 503 }, "processNumber": 1, "type": "TCP" }, "startAddress": false } ``` --- ## 2. 上位机查询 modbus 参数 **命令字:** `0x7301` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 需要查询的工艺号;范围[1,9] | ### 请求示例 ```json { "processNumber": 1 } ``` --- ## 3. 控制器回复上位机 modbus 参数 **命令字:** `0x7302` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 主站类型;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | modbus_state | bool | 是 | Modbus 连接状态;true 表示已连接,false 表示未连接 | | response_time_out | int | 是 | 读写响应时间;单位 ms | | startAddress | bool | 是 | 地址偏移;true 表示地址不变,false 表示地址自动-1 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | checkBit | string | 是 | 校验位;取值"N","E","O" | | dataBit | int | 是 | 数据位;范围[5,8] | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | | stopBit | int | 是 | 停止位;范围[0,1] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址 | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 响应示例 ```json { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 2, "slaveId": 1, "stopBit": 1 }, "TCP": { "IP": "192.168.1.14", "endian_type": 1, "port": 503 }, "modbus_state": false, "response_time_out": 100, "startAddress": false, "type": "TCP" } ``` --- ## 4. 上位机查询 modbus 连接状态 **命令字:** `0x7303` ### 请求示例 ```json {} ``` --- ## 5. 控制器回复上位机 modbus 连接状态 **命令字:** `0x7304` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ModbusConnect | bool | 是 | modbus 连接状态;true 表示已连接,false 表示未连接 | ### 响应示例 ```json { "ModbusConnect": false } ``` --- ## 6. 上位机设置 modbus 从站参数 **命令字:** `0x7305` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 通讯方式;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 | | scancycle | int | 是 | 扫描周期;范围[8,1000]ms | | stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址(默认值) | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 请求示例 ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "endian_type": 0, "port": 502 }, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` --- ## 7. 上位机查询 modbus 从站参数 **命令字:** `0x7306` ### 请求示例 ```json {} ``` --- ## 8. 控制器回复上位机 modbus 从站参数 **命令字:** `0x7307` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 通讯方式;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | enable | bool | 是 | 连接使能 | | master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 | | scancycle | int | 是 | 扫描周期;范围[8,1000]ms | | stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址(默认值) | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 响应示例 ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "endian_type": 0, "port": 502 }, "enable": false, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` --- ## 9. 上位机设置 modbus 从站连接使能 **命令字:** `0x7308` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | enable | bool | 是 | modbus 从站连接使能 | ### 请求示例 ```json { "enable": true } ``` --- ## 10. 上位机设置 modbus 从站心跳检测使能 **命令字:** `0x7309` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | checkheart | bool | 是 | 心跳检测使能 | ### 请求示例 ```json { "checkheart": true } ``` --- ## 11. 上位机查询 modbus 从站心跳检测使能 **命令字:** `0x703A` ### 请求示例 ```json {} ``` --- ## 12. 控制器回复上位机 modbus 从站心跳检测使能 **命令字:** `0x703B` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | checkheart | bool | 是 | 心跳检测使能 | ### 响应示例 ```json { "checkheart": true } ``` --- ## 13. 上位机设置 modbus 程序 **命令字:** `0x703C` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobname | string | 是 | 已选程序名称 | | programid | int | 是 | 程序序号;范围[1,300] | | robot | int | 是 | 当前机器人号 | ### 请求示例 ```json { "jobname": "AA", "programid": 1, "robot": 1 } ``` --- ## 14. 上位机查询 modbus 程序 **命令字:** `0x703D` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | num | int | 是 | 查询数量;固定为10 | | robot | int | 是 | 当前机器人号 | | startprogramid | int | 是 | 查询序列起始程序序号;范围[1,30] | ### 请求示例 ```json { "num": 10, "robot": 1, "startprogramid": 1 } ``` --- ## 15. 控制器回复上位机 modbus 程序 **命令字:** `0x703E` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobnamelist | array | 是 | 程序名称列表;长度为10 | | robot | int | 是 | 当前机器人号 | | startprogramid | int | 是 | 序列起始程序序号;范围[1,30] | | sum | int | 是 | 可选程序总数 | ### 响应示例 ```json { "jobnamelist": ["AA", "", "", "", "", "", "", "", "", ""], "robot": 1, "startprogramid": 1, "sum": 300 } ``` ## 16. 上位机 Modbus 读线圈(功能码 01H) **命令字:** `0x7310` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `1`(01H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 2000] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 1, "address": 0, "quantity": 10 } ``` ## 17. 控制器回复 Modbus 读线圈(功能码 01H) **命令字:** `0x7311` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `1`(01H) | | data | int[] | 是 | 读取到的线圈状态数组;值为 `0` 或 `1` | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 1, "data": [0, 1, 1, 0, 0, 1, 0, 1, 1, 0], "success": true } ``` ## 18. 上位机 Modbus 读输入状态(功能码 02H) **命令字:** `0x7312` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `2`(02H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 2000] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 2, "address": 100, "quantity": 16 } ``` ## 19. 控制器回复 Modbus 读输入状态(功能码 02H) **命令字:** `0x7313` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `2`(02H) | | data | int[] | 是 | 读取到的输入状态数组;值为 `0` 或 `1` | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 2, "data": [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1], "success": true } ``` ## 20. 上位机 Modbus 读保持寄存器(功能码 03H) **命令字:** `0x7314` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `3`(03H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 125] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 3, "address": 200, "quantity": 5 } ``` ## 21. 控制器回复 Modbus 读保持寄存器(功能码 03H) **命令字:** `0x7315` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `3`(03H) | | data | int[] | 是 | 读取到的保持寄存器值数组;范围 [0, 65535] | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 3, "data": [1234, 5678, 910, 1112, 1314], "success": true } ``` ## 22. 上位机 Modbus 读输入寄存器(功能码 04H) **命令字:** `0x7316` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `4`(04H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 125] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 4, "address": 300, "quantity": 8 } ``` ## 23. 控制器回复 Modbus 读输入寄存器(功能码 04H) **命令字:** `0x7317` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `4`(04H) | | data | int[] | 是 | 读取到的输入寄存器值数组;范围 [0, 65535] | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 4, "data": [100, 200, 300, 400, 500, 600, 700, 800], "success": true } ``` ## 24. 上位机 Modbus 写单个线圈(功能码 05H) **命令字:** `0x7318` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `5`(05H) | | address | int | 是 | 线圈地址 | | value | int | 是 | 写入值;`0` 或 `1` | ### 请求示例 ```json { "processNumber": 1, "functionCode": 5, "address": 10, "value": 1 } ``` ## 25. 控制器回复 Modbus 写单个线圈(功能码 05H) **命令字:** `0x7319` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `5`(05H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 5, "success": true } ``` ## 26. 上位机 Modbus 写单个保持寄存器(功能码 06H) **命令字:** `0x731A` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `6`(06H) | | address | int | 是 | 寄存器地址 | | value | int | 是 | 写入值;范围 [0, 65535] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 6, "address": 200, "value": 9999 } ``` ## 27. 控制器回复 Modbus 写单个保持寄存器(功能码 06H) **命令字:** `0x731B` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `6`(06H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 6, "success": true } ``` ## 28. 上位机 Modbus 写多个线圈(功能码 0FH) **命令字:** `0x731C` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `15`(0FH) | | address | int | 是 | 起始地址 | | data | int[] | 是 | 写入的线圈值数组;每个元素为 `0` 或 `1` | ### 请求示例 ```json { "processNumber": 1, "functionCode": 15, "address": 20, "data": [1, 0, 1, 0, 1, 1, 0, 0, 1, 0] } ``` ## 29. 控制器回复 Modbus 写多个线圈(功能码 0FH) **命令字:** `0x731D` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `15`(0FH) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 15, "success": true } ``` ## 30. 上位机 Modbus 写多个保持寄存器(功能码 10H) **命令字:** `0x731E` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `16`(10H) | | address | int | 是 | 起始地址 | | data | int[] | 是 | 写入的寄存器值数组;每个元素范围 [0, 65535] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 16, "address": 200, "data": [100, 200, 300, 400, 500] } ``` ## 31. 控制器回复 Modbus 写多个保持寄存器(功能码 10H) **命令字:** `0x731F` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `16`(10H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 16, "success": true } ``` ## Modbus 功能码汇总 | 功能码 | 名称 | 命令字(请求) | 命令字(回复) | 说明 | |--------|------|---------------|---------------|------| | 01H | 读线圈 | `0x7310` | `0x7311` | 读取从站线圈状态(位操作,读/写) | | 02H | 读输入状态 | `0x7312` | `0x7313` | 读取从站离散输入状态(位操作,只读) | | 03H | 读保持寄存器 | `0x7314` | `0x7315` | 读取从站保持寄存器(16 位操作,读/写) | | 04H | 读输入寄存器 | `0x7316` | `0x7317` | 读取从站输入寄存器(16 位操作,只读) | | 05H | 写单个线圈 | `0x7318` | `0x7319` | 写从站单个线圈状态 | | 06H | 写单个保持寄存器 | `0x731A` | `0x731B` | 写从站单个保持寄存器 | | 0FH | 写多个线圈 | `0x731C` | `0x731D` | 写从站多个线圈状态 | | 10H | 写多个保持寄存器 | `0x731E` | `0x731F` | 写从站多个保持寄存器 | ## Modbus 通讯说明 ### 主站操作流程 1. **设置主站参数**:通过 `0x7300` 设置 Modbus 主站参数(TCP/RTU 模式、端口、从站 ID 等) 2. **建立连接**:主站参数设置后,通讯自动建立(TCP 模式)或通过串口建立(RTU 模式) 3. **查询状态**:通过 `0x7303` 查询连接状态,通过 `0x7304` 获取回复 4. **读写操作**:使用功能码命令(`0x7310`-`0x731F`)进行读写操作 5. **断开连接**:TCP 模式下可关闭连接,RTU 模式下串口保持打开 ### 从站操作流程 1. **设置从站参数**:通过 `0x7305` 设置从站参数 2. **使能连接**:通过 `0x7308` 使能从站连接 3. **心跳检测**:通过 `0x7309` 设置心跳使能 ### 地址偏移说明 - `startAddress` 为 `false` 时,写入的地址会自动减 1(适用于多数 PLC,如西门子等起始地址为 1 的设备) - `startAddress` 为 `true` 时,写入的地址保持不变(适用于起始地址为 0 的设备) ### 注意事项 - 每次读写操作需确保 Modbus 连接已建立,否则操作将失败 - 读取数量受 Modbus 协议限制:线圈/输入状态最多 2000 个,寄存器最多 125 个 - 写多个线圈函数会自动将数据打包为 Modbus 协议格式发送 - TCP 模式的 Float 大小端通过 `endian_type` 参数控制 --- # Tcp 通讯 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/05.Tcp%E9%80%9A%E8%AE%AF.html ## 上位机设置 Tcp 通讯参数 **命令字:** `0x7320` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | client | object | 否 | 客户端参数,当 `type` 为 1 时该节点存在 | | client.frameHeader | string | 否 | 数据帧头,留空为没有 | | client.ip | string | 否 | 需要连接的服务器 IP | | client.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | client.port | int | 否 | 通讯端口,范围 (0, 65535] | | client.separator | string | 否 | 数据分隔符 | | client.terminator | string | 否 | 数据帧尾,留空为没有 | | server | object | 否 | 服务器参数,当 `type` 为 0 时该节点存在 | | server.frameHeader | string | 否 | 数据帧头,留空为没有 | | server.ip | string | 否 | 当前用作服务器 IP | | server.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | server.port | int | 否 | 通讯端口,范围 (0, 65535] | | server.separator | string | 否 | 数据分隔符 | | server.terminator | string | 否 | 数据帧尾,留空为没有 | | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 当前机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件 | ### 请求示例 ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 0, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "robot": 1, "server": { "frameHeader": "@", "ip": "192.168.0.229", "numberSystem": 0, "port": 9001, "separator": ",", "terminator": "!" }, "type": 1 } ``` --- ## 上位机查询 Tcp 通讯参数 **命令字:** `0x7321` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件;为 2 时控制器发送服务器参数 | ### 请求示例 ```json { "craft": 1, "robot": 1, "type": 2 } ``` --- ## 控制器回复 Tcp 通讯参数 **命令字:** `0x7322` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | client | object | 否 | 客户端参数,当 `type` 为 1 时该节点存在 | | client.frameHeader | string | 否 | 数据帧头,留空为没有 | | client.ip | string | 否 | 需要连接的服务器 IP | | client.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | client.port | int | 否 | 通讯端口,范围 (0, 65535] | | client.separator | string | 否 | 数据分隔符 | | client.terminator | string | 否 | 数据帧尾,留空为没有 | | server | object | 否 | 服务器参数,当 `type` 为 0 时该节点存在 | | server.frameHeader | string | 否 | 数据帧头,留空为没有 | | server.ip | string | 否 | 当前用作服务器 IP | | server.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | server.port | int | 否 | 通讯端口,范围 (0, 65535] | | server.separator | string | 否 | 数据分隔符 | | server.terminator | string | 否 | 数据帧尾,留空为没有 | | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 当前机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件 | ### 响应示例 ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 0, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "robot": 1, "server": { "frameHeader": "@", "ip": "192.168.0.229", "numberSystem": 0, "port": 9001, "separator": ",", "terminator": "!" }, "type": 1 } ``` --- ## 上位机请求连接 Tcp 通讯 **命令字:** `0x7323` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` --- ## 上位机请求断开 Tcp 通讯 **命令字:** `0x7324` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` ## 上位机查询 Tcp 通讯连接状态 **命令字:** `0x7325` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` ## 控制器回复 Tcp 通讯连接状态 **命令字:** `0x7326` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | status | int | 是 | 连接状态;0-未连接,1-已连接 | ### 响应示例 ```json { "craft": 1, "robot": 1, "status": 1 } ``` ## 上位机发送 Tcp 数据 **命令字:** `0x7327` > **说明:** 上位机通过已建立的 TCP 连接向对端发送字符串数据。发送前需确保 TCP 连接已建立。 ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | data | string | 是 | 要发送的字符串数据 | ### 请求示例 ```json { "craft": 1, "robot": 1, "data": "Hello, this is a test message!" } ``` ## 控制器主动推送 Tcp 接收数据 **命令字:** `0x7328` > **说明:** 当 TCP 连接接收到对端发来的数据时,控制器会主动向上位机推送接收到的数据。 ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | data | string | 是 | 接收到的字符串数据 | ### 推送示例 ```json { "craft": 1, "robot": 1, "data": "Received message from peer" } ``` ## TCP 通讯协议说明 ### 数据帧格式 TCP 通讯支持自定义数据帧格式,通过设置 `frameHeader`(帧头)、`separator`(分隔符)和 `terminator`(帧尾)来定义数据帧的边界: - **帧头(`frameHeader`)**:数据帧的起始标记,留空表示无帧头 - **分隔符(`separator`)**:数据域之间的分隔字符,用于解析多个数据字段 - **帧尾(`terminator`)**:数据帧的结束标记,留空表示无帧尾 - **数据进制(`numberSystem`)**:接收数据时的解析进制,`0` 为十进制,`1` 为十六进制 ### 连接管理流程 1. **设置参数**:通过 `0x7320` 设置 TCP 通讯参数(服务器/客户端模式、IP、端口等) 2. **建立连接**:通过 `0x7323` 请求建立 TCP 连接 3. **数据收发**:通过 `0x7327` 发送数据,通过 `0x7328` 接收推送数据 4. **查询状态**:通过 `0x7325` 查询连接状态 5. **断开连接**:通过 `0x7324` 请求断开 TCP 连接 ### 服务器模式(type=0) 当 `type` 为 `0` 时,控制器作为 TCP 服务器,绑定 `server.ip` 和 `server.port`,等待客户端连接。 ### 客户端模式(type=1) 当 `type` 为 `1` 时,控制器作为 TCP 客户端,主动连接 `client.ip` 和 `client.port` 指定的服务器。 ### 配置文件模式(type=2) 当 `type` 为 `2` 时,控制器读取配置文件中的 TCP 通讯参数,上位机可通过 `0x7321` 查询配置。 ### 注意事项 - 通讯双方的数据帧格式(帧头、分隔符、帧尾)必须保持一致,否则可能导致数据解析错误 - 进制设置仅影响接收数据的解析,发送数据始终以原始字符串形式发送 - 同一工艺号同时只能维持一种连接模式(服务器或客户端) --- # 数据上传 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/06.%E6%95%B0%E6%8D%AE%E4%B8%8A%E4%BC%A0.html ## 概述 数据上传功能用于将控制器运行过程中采集的数据(如关节角度、速度、力矩、IO 状态等)按照配置的格式和周期上传至远程服务器。支持 FTP 上传方式,可自定义文件格式、采集周期和上传周期。 ### 工作流程 ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 控制器 │ │ 上位机 │ │ FTP 服务器│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ 配置上传参数 │ │<──────────────│ 0x7333 │ │ │ │ │ 周期采集数据 │ │ │──────┐ │ │ │ │ (采集) │ │ │<─────┘ │ │ │ │ │ │ 上传周期到达 │ │ │──────────────────────────────>│ FTP 上传 │ │ │ ``` ### 核心概念 | 概念 | 说明 | |------|------| | 采集周期 | 控制器从机器人读取数据的频率 | | 上传周期 | 将采集到的数据打包上传至服务器的频率 | | 数据文件 | 包含机器人运行数据的文件(csv/txt) | | 说明文档 | 包含数据列定义的辅助文件 | --- ## 1. 数据传输开关 ### 1.1 上位机设置数据传输开关 **命令字:** `0x7330` | 参数名 | 类型 | 描述 | |--------|------|------| | enable | bool | 数据传输开关,true-开启,false-关闭 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "enable": true, "robot": 1 } ``` > 开启数据传输后,控制器按配置的采集周期开始采集数据,并按上传周期发送至服务器。 ### 1.2 上位机查询数据传输开关 **命令字:** `0x7331` | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` ### 1.3 控制器回复数据传输开关 **命令字:** `0x7332` | 参数名 | 类型 | 描述 | |--------|------|------| | enable | bool | 数据传输开关 | | robot | int | 当前机器人号 | ```json { "enable": false, "robot": 1 } ``` --- ## 2. 数据上传参数 ### 2.1 上位机设置数据上传参数 **命令字:** `0x7333` | 参数名 | 类型 | 范围/取值 | 描述 | |--------|------|-----------|------| | dataCollectTime | double | [0.001, 999999] 秒 | 数据采集周期,即每隔多少秒采集一次数据 | | dataUploadTime | double | [0.001, 999999] 秒 | 数据上传周期,即每隔多少秒上传一次数据文件 | | fileSuffix | string | "csv" / "txt" | 文件格式。csv 为逗号分隔值,txt 为空格或制表符分隔 | | filepath | string | - | FTP 服务器上的文件存放路径,如 "/robot_data/" | | password | string | - | FTP 登录密码 | | robot | int | [1, 4] | 机器人号 | | sendInfoFileFlag | bool | - | 是否发送说明文档。true-每次上传同时发送说明文档 | | serverIP | string | - | FTP 服务器 IP 地址 | | serverPort | int | (0, 65535] | FTP 服务器端口,默认 21 | | uploadMode | string | 默认 "FTP" | 上传方式,当前仅支持 "FTP" | | username | string | - | FTP 登录用户名 | ### 参数配置建议 | 参数 | 推荐值 | 说明 | |------|--------|------| | dataCollectTime | 0.01~1.0 s | 高频采集用于精细运动分析,低频用于长期监控 | | dataUploadTime | 30~300 s | 上传间隔应考虑文件大小和网络带宽 | | fileSuffix | "csv" | csv 格式兼容性好,易于 Excel 等工具打开 | | sendInfoFileFlag | true | 首次上传建议开启,便于理解数据列含义 | ```json { "dataCollectTime": 1.0, "dataUploadTime": 30.0, "fileSuffix": "csv", "filepath": "/robot_data/", "password": "123456", "robot": 1, "sendInfoFileFlag": true, "serverIP": "192.168.1.14", "serverPort": 21, "uploadMode": "FTP", "username": "admin" } ``` ### 2.2 上位机查询数据上传参数 **命令字:** `0x7334` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | robot | int | [1, 4] | 机器人号 | ```json { "robot": 1 } ``` ### 2.3 控制器回复数据上传参数 **命令字:** `0x7335` | 参数名 | 类型 | 范围/取值 | 描述 | |--------|------|-----------|------| | dataCollectTime | double | [0.001, 999999]s | 数据采集周期 | | dataUploadTime | double | [0.001, 999999]s | 数据上传周期 | | fileSuffix | string | "csv" / "txt" | 文件格式 | | filepath | string | - | 文件路径 | | password | string | - | 密码 | | robot | int | [1, 4] | 机器人号 | | sendInfoFileFlag | bool | - | 是否发送说明文档 | | serverIP | string | - | 服务器 IP | | serverPort | int | (0, 65535] | 端口号 | | uploadMode | string | 默认 "FTP" | 上传方式 | | username | string | - | 用户名 | ```json { "dataCollectTime": 1.0, "dataUploadTime": 30.0, "fileSuffix": "csv", "filepath": "/robot_data/", "password": "123456", "robot": 1, "sendInfoFileFlag": true, "serverIP": "192.168.1.14", "serverPort": 21, "uploadMode": "FTP", "username": "admin" } ``` --- ## 3. 数据格式 > **说明:** 上位机设置与查询分四次进行,分别对应说明文档文件名、说明文档文件内容、数据文档文件名、数据文档文件内容的格式。 ### 3.1 上位机设置数据格式 **命令字:** `0x7336` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | format | string | - | 数据格式模板,支持占位符 | | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | #### type 取值说明 | 值 | 描述 | 应用场景 | |----|------|----------| | 1 | 说明文档文件名 | 定义发送的说明文档的文件命名规则 | | 2 | 说明文档文件内容 | 定义说明文档中数据列的名称与排列 | | 3 | 数据文档文件名 | 定义数据文件的文件命名规则 | | 4 | 数据文档文件内容 | 定义数据文件中每行数据的排列格式 | #### 格式模板占位符 格式字符串中使用以下占位符,上传时自动替换为实际值: | 占位符 | 替换内容 | 示例输出 | |--------|----------|----------| | `$Y%` | 4 位年份 | 2024 | | `$m%` | 2 位月份 | 03 | | `$d%` | 2 位日期 | 15 | | `$H%` | 2 位小时(24小时制) | 14 | | `$M%` | 2 位分钟 | 30 | | `$S%` | 2 位秒 | 00 | | `$R%` | 机器人号 | 1 | | `$N%` | 递增序号 | 001 | | `TEXT` | 普通文本(原样输出) | Robot-R1 | #### type=1 示例(说明文档文件名) ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%_Info.txt", "robot": 1, "type": 1 } ``` > 生成的说明文档文件名示例:`Robot-R1_2024-03-15_14-30-00_Info.txt` #### type=3 示例(数据文档文件名) ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%", "robot": 1, "type": 3 } ``` > 生成的数据文件名示例:`Robot-R1_2024-03-15_14-30-00.csv` ### 3.2 上位机查询数据格式 **命令字:** `0x7337` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | ```json { "robot": 1, "type": 1 } ``` ### 3.3 控制器回复数据格式 **命令字:** `0x7338` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | format | string | - | 数据格式模板 | | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%", "robot": 1, "type": 1 } ``` --- ## 4. 触发方式 ### 定时触发 数据上传默认采用定时触发方式,由 `dataUploadTime` 控制上传间隔。 - 控制器内部维护一个上传定时器 - 定时器到达 `dataUploadTime` 时,将采集缓冲区数据写入文件并上传 - 上传完成后重置定时器,进入下一周期 ### 条件触发(手动触发) **命令字:** `0x7339` 除了定时触发外,上位机可随时发送命令触发一次即时上传。 #### 请求参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人号,范围 [1, 4] | | command | string | "upload_now"-立即上传,"clear_buffer"-清空采集缓冲区 | #### 请求示例 ```json { "robot": 1, "command": "upload_now" } ``` --- ## 5. 上传内容定义 ### 数据文件内容(type=4) type=4 的格式定义决定了数据文件中每行的数据排列。格式字符串由变量名和分隔符组成。 #### 可用数据变量 | 变量名 | 说明 | 数据类型 | |--------|------|----------| | `$JT1%` ~ `$JT6%` | 关节 1~6 的角度 | double (°) | | `$JV1%` ~ `$JV6%` | 关节 1~6 的速度 | double (°/s) | | `$JTQ1%` ~ `$JTQ6%` | 关节 1~6 的力矩 | double (Nm) | | `$TCX%` / `$TCY%` / `$TCZ%` | TCP 位置 X/Y/Z | double (mm) | | `$TRX%` / `$TRY%` / `$TRZ%` | TCP 姿态 RX/RY/RZ | double (°) | | `$DI1%` ~ `$DIN%` | 数字输入 | int (0/1) | | `$DO1%` ~ `$DON%` | 数字输出 | int (0/1) | | `$TS%` | 时间戳 | int (ms) | #### 请求示例(type=4) ```json { "format": "$TS%,$JT1%,$JT2%,$JT3%,$JT4%,$JT5%,$JT6%,$TCX%,$TCY%,$TCZ%", "robot": 1, "type": 4 } ``` > 生成的数据行示例:`12345,10.5,-20.3,45.0,0.5,30.2,-90.0,500.1,100.0,250.5` ### 说明文档内容(type=2) type=2 定义说明文档中数据列标题。通常与 type=4 的数据排列一一对应。 ```json { "format": "时间戳(ms),关节1(deg),关节2(deg),关节3(deg),关节4(deg),关节5(deg),关节6(deg),TCP_X(mm),TCP_Y(mm),TCP_Z(mm)", "robot": 1, "type": 2 } ``` --- ## 6. 上传状态反馈 ### 控制器上报上传状态 **命令字:** `0x733A` 每次上传操作完成后,控制器主动上报上传结果。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | status | int | 上传状态,0-成功,1-失败,2-上传中 | | fileName | string | 上传的文件名 | | fileSize | int | 文件大小(字节) | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "robot": 1, "status": 0, "fileName": "Robot-R1_2024-03-15_14-30-00.csv", "fileSize": 20480, "errorMsg": "" } ``` --- ## 7. 常见问题 ### 上传失败排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 上传失败 | FTP 服务器地址错误 | 检查 `serverIP` 和 `serverPort` | | 上传失败 | 用户名/密码错误 | 检查 `username` 和 `password` | | 上传失败 | 路径不存在 | 确认 FTP 服务器上 `filepath` 目录存在 | | 上传失败 | 网络不通 | 用 ping 测试控制器与 FTP 服务器连通性 | | 文件为空 | 采集周期过大 | 减小 `dataCollectTime`,增大 `dataUploadTime` | | 文件为空 | 数据变量未配置 | 检查 type=4 格式是否包含有效变量 | | 文件命名错乱 | 格式占位符错误 | 确认占位符语法正确 | ### 性能建议 - 长时间运行建议设置较大的上传周期(如 300s),避免产生过多小文件 - 高频采集(dataCollectTime < 0.01s)时注意控制器内存占用 - FTP 服务器应有足够的磁盘空间,定期清理历史数据文件 - `sendInfoFileFlag` 改为 false 可减少上传数据量(仅首次需要说明文档) --- # finsTCP > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/07.finsTCP.html ## 概述 FINS(Factory Interface Network Service)是欧姆龙(Omron)PLC 的专用通信协议,FINS/TCP 是通过 TCP/IP 网络封装 FINS 命令的通信方式。本控制器通过 FINS/TCP 协议与欧姆龙 PLC 进行数据交互,支持读写 PLC 的 DM 数据区。 ### 协议栈结构 ```text ┌─────────────────────┐ │ FINS 命令/响应 │ ← 应用层 ├─────────────────────┤ │ FINS 帧头 │ ← FINS Header (10字节) ├─────────────────────┤ │ TCP 封装 │ ← TCP/IP 传输层 └─────────────────────┘ ``` ### 数据区映射 | 数据类型 | PLC 地址区 | 本机映射 | 说明 | |----------|------------|----------|------| | DM 区 | DM0 ~ DM9999 | 全局变量区 | 数据存储区,支持读写 | | 布尔量 | - | 全局布尔变量 | 本机与 PLC DM 区按位映射 | --- ## 1. 上位机设置 finsTCP 参数 **命令字:** `0x7340` ### 参数列表 | 参数名 | 类型 | 说明 | 范围/格式 | |--------|------|------|-----------| | IP | string | PLC 的 IP 地址 | 标准 IPv4 格式 | | PLCReadAddress | string | PLC 读取首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | PLCWriteAddress | string | PLC 写入首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | craftNum | int | 工艺号 | 范围 [1, 9] | | localReadAddress | int[] | 本机读取首地址列表 | 范围 [1, 990],第一位为全局布尔首地址,第二位为全局整型首地址 | | localWriteAddress | int[] | 本机写入首地址列表 | 范围 [1, 990],第一位为全局布尔首地址,第二位为全局整型首地址 | | port | int | 端口号 | 范围 [0, 65535],欧姆龙默认 9600 | ### 配置说明 - **PLCReadAddress**:控制器从 PLC 的此地址开始读取数据到本机 `localReadAddress` - **PLCWriteAddress**:控制器将本机 `localWriteAddress` 的数据从此地址开始写入 PLC - **localReadAddress[0]**:全局布尔变量起始地址,**localReadAddress[1]**:全局整型变量起始地址 - 读写数据长度在 PLC 侧可配置,本机侧根据实际变量数量自动计算 ### 请求示例 ```json { "IP": "192.168.1.10", "PLCReadAddress": "DM2000", "PLCWriteAddress": "DM1000", "craftNum": 1, "localReadAddress": [500, 500], "localWriteAddress": [100, 100], "port": 9600 } ``` --- ## 2. 上位机查询 finsTCP 参数 **命令字:** `0x7341` ### 参数列表 | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | craftNum | int | 查询的工艺号名称 | 范围 [1, 9] | ### 请求示例 ```json { "craftNum": 1 } ``` --- ## 3. 控制器回复上位机 finsTCP 参数 **命令字:** `0x7342` ### 参数列表 | 参数名 | 类型 | 说明 | 范围/格式 | |--------|------|------|-----------| | IP | string | IP 地址 | - | | PLCReadAddress | string | PLC 读取首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | PLCWriteAddress | string | PLC 写入首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | craftNum | int | 工艺号 | 范围 [1, 9] | | localReadAddress | int[] | 本机读取首地址列表 | 范围 [1, 990] | | localWriteAddress | int[] | 本机写入首地址列表 | 范围 [1, 990] | | port | int | 端口号 | 范围 [0, 65535] | | status | int | 通讯状态 | 0-未连接,1-已连接 | ### 响应示例 ```json { "IP": "192.168.1.10", "PLCReadAddress": "DM2000", "PLCWriteAddress": "DM1000", "craftNum": 1, "localReadAddress": [500, 500], "localWriteAddress": [100, 100], "port": 9600, "status": 0 } ``` --- ## 4. 上位机请求连接通讯 **命令字:** `0x7343` 发送此命令后,控制器尝试与 PLC 建立 FINS/TCP 通信连接。 ### 请求示例 ```json {} ``` ### 连接流程 1. 上位机发送连接命令 `0x7343` 2. 控制器通过 TCP 三次握手与 PLC 建立连接 3. 控制器发送 FINS 节点地址数据发送(CLIENT TO SERVER)命令注册节点 4. 连接成功后控制器回复状态 `0x7345`(status=1) 5. 开始周期性地将本机数据写入 PLC,并从 PLC 读取数据 --- ## 5. 上位机请求断开通讯 **命令字:** `0x7344` 发送此命令后,控制器断开与 PLC 的 FINS/TCP 连接,停止数据交换。 ### 请求示例 ```json {} ``` --- ## 6. 控制器发送 finsTCP 通讯连接状态 **命令字:** `0x7345` ### 参数列表 | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | status | int | 通讯连接状态 | 0-未连接,1-已连接 | ### 响应示例 ```json { "status": 0 } ``` --- ## 7. 控制器发送 fins 打开的程序名称 **命令字:** `0x7346` ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | programName | string | 打开的程序名称 | ### 响应示例 ```json "AAA" ``` --- ## 8. FINS 协议帧格式 ### FINS 命令帧结构 FINS 命令帧由 FINS Header + FINS Command 组成,封装在 TCP 数据中。 | 字节偏移 | 长度(字节) | 字段名 | 说明 | |----------|------------|--------|------| | 0 | 4 | ICF | 信息控制字段 | | 4 | 4 | RSV | 保留字段(固定 0x00) | | 8 | 2 | GCT | 网关计数(通常 0x02) | | 10 | 1 | DNA | 目标网络地址(0x00=本地) | | 11 | 1 | DA1 | 目标节点号 | | 12 | 1 | DA2 | 目标单元号(0x00=CPU单元) | | 13 | 1 | SNA | 源网络地址 | | 14 | 1 | SA1 | 源节点号 | | 15 | 1 | SA2 | 源单元号 | | 16 | 2 | SID | 服务标识(请求/响应匹配用) | | 18 | 2 | MRC | 主请求码 | | 20 | 2 | SRC | 子请求码 | | 22 | N | Data | 命令数据(变长) | ### 常用命令码 | MRC | SRC | 命令名称 | 说明 | |-----|-----|----------|------| | 0x01 | 0x01 | MEMORY AREA READ | 读取指定存储区数据 | | 0x01 | 0x02 | MEMORY AREA WRITE | 向指定存储区写入数据 | | 0x01 | 0x03 | MEMORY AREA FILL | 填充存储区数据 | | 0x01 | 0x04 | MULTIPLE MEMORY AREA READ | 批量读取多个存储区 | | 0x02 | 0x01 | PARAMETER AREA READ | 读取参数区 | | 0x02 | 0x02 | PARAMETER AREA WRITE | 写入参数区 | | 0x04 | 0x01 | RUN | 切换到运行模式 | | 0x04 | 0x02 | STOP | 切换到停止模式 | | 0x05 | 0x01 | CPU UNIT DATA READ | 读取 CPU 单元数据 | | 0x06 | 0x01 | CONNECTION DATA READ | 读取连接数据 | ### 存储区代码 FINS 协议通过存储区代码标识不同的数据区域: | 代码 | 区域名称 | 说明 | 字节/字 | |------|----------|------|---------| | 0x82 | DM 区 | 数据存储器,16位字 | 2 字节/字 | | 0xB0 | CIO 区 | 核心 I/O 区,位可访问 | 2 字节/字 | | 0xB1 | WR 区 | 工作继电器区 | 2 字节/字 | | 0xB2 | HR 区 | 保持继电器区 | 2 字节/字 | | 0xB3 | AR 区 | 辅助继电器区 | 2 字节/字 | --- ## 9. 读写操作详解 ### 上位机请求读取 PLC 数据 **命令字:** `0x7347` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | areaCode | int | 是 | 存储区代码,如 0x82 表示 DM 区 | | startAddress | int | 是 | 读取起始地址(字地址) | | wordCount | int | 是 | 读取字数,范围 [1, 512] | | craftNum | int | 否 | 工艺号,范围 [1, 9];不填则使用当前连接工艺 | #### 请求示例 ```json { "areaCode": 130, "startAddress": 2000, "wordCount": 10, "craftNum": 1 } ``` --- ### 控制器回复 PLC 读取数据 **命令字:** `0x7348` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | areaCode | int | 存储区代码 | | startAddress | int | 起始地址 | | words | int[] | 读取到的字数据(每个字 0~65535) | | status | int | 读取状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "areaCode": 130, "startAddress": 2000, "words": [100, 200, 300, 150, 250, 50, 75, 125, 500, 1000], "status": 0 } ``` --- ### 上位机请求写入 PLC 数据 **命令字:** `0x7349` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | areaCode | int | 是 | 存储区代码,如 0x82 表示 DM 区 | | startAddress | int | 是 | 写入起始地址(字地址) | | words | int[] | 是 | 要写入的字数据,每个字范围 [0, 65535] | | craftNum | int | 否 | 工艺号,范围 [1, 9] | #### 请求示例 ```json { "areaCode": 130, "startAddress": 1000, "words": [10, 20, 30, 40, 50], "craftNum": 1 } ``` --- ### 控制器回复 PLC 写入结果 **命令字:** `0x734A` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | areaCode | int | 存储区代码 | | startAddress | int | 起始地址 | | status | int | 写入状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "areaCode": 130, "startAddress": 1000, "status": 0 } ``` --- ## 10. 通讯错误码 | 错误码 | 说明 | 处理建议 | |--------|------|----------| | 0x0000 | 正常完成 | - | | 0x0101 | 连接失败(TCP 层) | 检查 IP、端口和网络连通性 | | 0x0102 | 节点注册失败 | 检查 PLC 的 FINS 节点地址配置 | | 0x0201 | 不支持的存储区代码 | 确认 areaCode 正确 | | 0x0202 | 地址超出范围 | 确认 startAddress 和 wordCount 在有效范围 | | 0x0203 | 数据长度错误 | 确认 words 数组长度与 wordCount 一致 | | 0x0301 | PLC 处于不可操作状态 | 将 PLC 切换到监视/运行模式 | | 0x0302 | 写入被禁止 | 检查 PLC 的写保护设置 | | 0x0401 | 命令超时 | 增大超时时间或检查网络负载 | | 0x0402 | 响应格式异常 | 检查 PLC 固件版本兼容性 | --- ## 11. 通讯时序 ### 典型数据交互周期 ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 上位机 │ │ 控制器 │ │ PLC │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ 0x7343 连接请求 │ │ │───────────────────>│ │ │ │ TCP Connect │ │ │───────────────────>│ │ │ FINS Node Reg │ │ │───────────────────>│ │ 0x7345 连接成功 │ │ │<───────────────────│ │ │ │ │ │ │◄──── 循环读写 ────►│ │ │ (DM 区周期交换) │ │ │ │ ``` ### 周期性数据交换 连接建立后,控制器以固定周期执行以下数据交换: 1. **写入阶段**:将 `localWriteAddress` 的全局变量数据写入 PLC 的 `PLCWriteAddress` 起始的 DM 区 2. **读取阶段**:从 PLC 的 `PLCReadAddress` 起始的 DM 区读取数据到 `localReadAddress` 的全局变量 布尔量以位为单位映射到 DM 区的对应位,整型以 16 位字为单位映射。 --- ## 12. 常见问题 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 连接不上 PLC | IP 地址错误 | 确认 PLC IP 地址,可用 ping 测试 | | 连接不上 PLC | 端口错误 | 欧姆龙 PLC 默认端口为 9600 | | 连接不上 PLC | PLC 不在同一网段 | 检查网络配置 | | 读写数据不正确 | 地址偏移 | 确认 DM 起始地址与 PLC 程序一致 | | 读写数据不正确 | 数据长度不匹配 | 核对本机变量数量和 PLC 数据长度配置 | | 通讯中断 | 网络故障 | 检查网络设备状态,查看 `0x7345` 状态码 | | 通讯中断 | PLC 模式变更 | 确认 PLC 处于监视/运行模式 | --- # OPCUA > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/08.OPCUA.html ## 概述 OPC UA(Open Platform Communications Unified Architecture)是一种工业自动化领域的跨平台通信协议,支持数据访问、报警与事件、历史数据等功能。本控制器支持作为 OPC UA **客户端**连接远程服务器,同时也可作为 OPC UA **服务器**供其他设备访问,实现双向数据交互。 ### 核心功能 | 功能 | 说明 | |------|------| | 连接管理 | 支持客户端/服务器双模式,可独立启停 | | 节点读写 | 读写 OPC UA 服务器中的变量节点 | | 订阅监控 | 订阅节点数据变化,实时推送更新 | | 安全认证 | 支持用户名/密码认证方式 | ### 工作模式 - **客户端模式**:控制器作为 OPC UA 客户端,连接外部 OPC UA 服务器,读写对方提供的变量节点 - **服务器模式**:控制器作为 OPC UA 服务器,开放本地变量供外部客户端访问 --- ## 上位机设置 OPCUA 参数 **命令字:** `0x7350` ### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | client | object | 否 | 客户端参数 | | client.enable | bool | 是 | 客户端连接使能,true-开启,false-关闭 | | client.ip | string | 是 | OPC UA 服务器 IP 地址 | | client.port | int | 是 | 服务器端口号,范围 [0, 65535],默认 4840 | | client.resource | string | 否 | 服务器资源路径/名称 | | client.username | string | 否 | 登录用户名(需服务器支持) | | client.password | string | 否 | 登录密码 | | client.security | string | 否 | 安全策略,可选 "None" / "Basic256Sha256" / "Basic128Rsa15" | | server | object | 否 | 服务器参数 | | server.enable | bool | 是 | 服务器使能,true-开启,false-关闭 | | server.ip | string | 是 | 控制器用作服务器时的 IP 地址 | | server.port | int | 是 | 服务器端口号,范围 [0, 65535],默认 4840 | ### 配置说明 - `client.enable` 和 `server.enable` 可以同时开启,控制器将同时运行客户端和服务端 - 客户端模式下,`client.ip` 和 `client.port` 必须指向有效的 OPC UA 服务器 - 若服务器需要认证,需同时填写 `client.username` 和 `client.password` - 安全策略选择需与目标服务器支持的策略一致 ### 请求示例 ```json { "client": { "enable": true, "ip": "192.168.1.240", "port": 49400, "resource": "ProsysServer", "username": "admin", "password": "123456", "security": "None" }, "server": { "enable": true, "ip": "192.168.0.229", "port": 4840 } } ``` --- ## 上位机查询 OPCUA 参数 **命令字:** `0x7351` ### 请求示例 ```json {} ``` --- ## 控制器回复上位机 OPCUA 参数 **命令字:** `0x7352` ### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | client | object | 客户端参数 | | client.enable | bool | 连接使能 | | client.ip | string | 服务器 IP 地址 | | client.port | int | 端口号 | | client.resource | string | 服务器名称 | | client.connected | bool | 客户端连接状态,true-已连接,false-未连接 | | server | object | 服务器参数 | | server.enable | bool | 服务器使能 | | server.ip | string | 控制器用作服务器时的 IP 地址 | | server.port | int | 端口号 | | server.connected | bool | 是否有客户端连接,true-有客户端连接,false-无连接 | ### 响应示例 ```json { "client": { "enable": true, "ip": "192.168.1.240", "port": 49400, "resource": "ProsysServer", "connected": true }, "server": { "enable": true, "ip": "192.168.0.229", "port": 4840, "connected": false } } ``` --- ## OPC UA 节点读写 控制器作为客户端连接 OPC UA 服务器后,可读写服务器中的变量节点。 ### 上位机请求读取节点 **命令字:** `0x7353` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | nodeId | string | 是 | 目标节点的 NodeId,如 "ns=2;s=Temperature" | | nodeIdType | int | 否 | NodeId 类型,0-字符串,1-数字,2-GUID,3-Opaque,默认 0 | | namespace | int | 否 | 命名空间索引,默认 0 | #### 节点标识说明 OPC UA 节点通过以下方式定位: | 标识方式 | 格式示例 | 说明 | |----------|----------|------| | 字符串 ID | `ns=2;s=MyVariable` | 使用字符串标识 | | 数字 ID | `ns=2;i=1001` | 使用数字标识 | | GUID | `ns=2;g=ABC123...` | 使用 GUID | | 浏览路径 | `/Objects/MyDevice/Temperature` | 使用路径浏览 | #### 请求示例 ```json { "nodeId": "ns=2;s=Temperature", "nodeIdType": 0, "namespace": 2 } ``` --- ### 控制器回复节点读取结果 **命令字:** `0x7354` ##### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | nodeId | string | 读取的节点 ID | | value | variant | 节点当前值 | | dataType | string | 数据类型,如 "Int32" / "Double" / "Boolean" / "String" | | timestamp | string | 数据时间戳(ISO 8601 格式) | | status | int | 读取状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(仅失败时返回) | ##### 响应示例 ```json { "nodeId": "ns=2;s=Temperature", "value": 25.6, "dataType": "Double", "timestamp": "2024-03-15T10:30:00Z", "status": 0 } ``` --- ### 上位机请求写入节点 **命令字:** `0x7355` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | nodeId | string | 是 | 目标节点的 NodeId | | value | variant | 是 | 要写入的值 | | dataType | string | 是 | 写入值的数据类型 | #### 请求示例 ```json { "nodeId": "ns=2;s=SetPoint", "value": 100.0, "dataType": "Double" } ``` --- ### 控制器回复节点写入结果 **命令字:** `0x7356` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | nodeId | string | 写入的节点 ID | | status | int | 写入状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(仅失败时返回) | #### 响应示例 ```json { "nodeId": "ns=2;s=SetPoint", "status": 0 } ``` --- ### 批量读写节点 **命令字:** `0x7357` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | operations | object[] | 是 | 批量操作列表 | | operations[].opType | string | 是 | 操作类型,"read"-读取,"write"-写入 | | operations[].nodeId | string | 是 | 节点 ID | | operations[].value | variant | 否 | 写入值(opType="write" 时必填) | #### 请求示例 ```json { "operations": [ { "opType": "read", "nodeId": "ns=2;s=Temperature" }, { "opType": "read", "nodeId": "ns=2;s=Pressure" }, { "opType": "write", "nodeId": "ns=2;s=SetPoint", "value": 50.0 } ] } ``` --- ## OPC UA 订阅机制 订阅功能允许控制器持续监控 OPC UA 服务器中的指定节点,当节点值发生变化时,服务器主动推送更新数据,无需轮询。 ### 上位机创建订阅 **命令字:** `0x7358` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 订阅唯一标识符,用于后续管理 | | publishingInterval | int | 是 | 发布间隔(毫秒),服务器以此周期检查并推送变化数据 | | lifetimeCount | int | 否 | 订阅生存周期计数,默认 10000 | | maxKeepAliveCount | int | 否 | 最大保活计数,默认 3000 | | monitoredItems | object[] | 是 | 监控项列表 | | monitoredItems[].nodeId | string | 是 | 要监控的节点 ID | | monitoredItems[].samplingInterval | int | 是 | 采样间隔(毫秒) | | monitoredItems[].queueSize | int | 否 | 队列大小,默认 1 | | monitoredItems[].discardOldest | bool | 否 | 队列满时是否丢弃最旧数据,默认 true | | monitoredItems[].deadbandType | int | 否 | 死区类型,0-无,1-绝对值,2-百分比 | | monitoredItems[].deadbandValue | double | 否 | 死区值,仅当值变化超过此阈值时才触发通知 | #### 订阅参数建议 | 参数 | 推荐值 | 说明 | |------|--------|------| | publishingInterval | 100~1000 ms | 发布周期,越小实时性越好但网络负载越大 | | samplingInterval | publishingInterval 的 1/2 ~ 1/5 | 采样周期应小于发布周期 | | queueSize | 1~10 | 数据变化队列,应对突发变化 | | lifetimeCount | ≥ 3 × maxKeepAliveCount | 订阅有效期,超时无保活则自动清理 | | deadbandValue | 根据精度需求设定 | 变化阈值,过滤微小波动 | #### 请求示例 ```json { "subscriptionId": "sub_temp_001", "publishingInterval": 200, "lifetimeCount": 10000, "maxKeepAliveCount": 3000, "monitoredItems": [ { "nodeId": "ns=2;s=Temperature", "samplingInterval": 100, "queueSize": 5, "discardOldest": true, "deadbandType": 1, "deadbandValue": 0.5 }, { "nodeId": "ns=2;s=Pressure", "samplingInterval": 200, "queueSize": 1 } ] } ``` --- ### 控制器上报订阅数据 **命令字:** `0x7359` 当订阅的节点数据发生变化时,控制器主动推送数据至上位机。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | subscriptionId | string | 订阅 ID | | dataChanges | object[] | 变化的数据列表 | | dataChanges[].nodeId | string | 节点 ID | | dataChanges[].value | variant | 节点当前值 | | dataChanges[].timestamp | string | 时间戳 | | sequenceNumber | int | 序列号,递增 | #### 响应示例 ```json { "subscriptionId": "sub_temp_001", "dataChanges": [ { "nodeId": "ns=2;s=Temperature", "value": 26.8, "timestamp": "2024-03-15T10:30:01Z" } ], "sequenceNumber": 42 } ``` --- ### 上位机修改订阅 **命令字:** `0x735A` 修改已有订阅的监控项或发布参数。 #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 要修改的订阅 ID | | publishingInterval | int | 否 | 新的发布间隔 | | addItems | object[] | 否 | 新增监控项列表 | | removeItems | string[] | 否 | 移除监控项的 nodeId 列表 | #### 请求示例 ```json { "subscriptionId": "sub_temp_001", "publishingInterval": 500, "addItems": [ { "nodeId": "ns=2;s=Humidity", "samplingInterval": 500 } ], "removeItems": ["ns=2;s=Pressure"] } ``` --- ### 上位机删除订阅 **命令字:** `0x735B` 停止并删除指定订阅。 #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 要删除的订阅 ID | #### 请求示例 ```json { "subscriptionId": "sub_temp_001" } ``` --- ## 连接状态管理 ### 控制器主动上报连接状态 **命令字:** `0x735C` 当 OPC UA 客户端或服务器连接状态发生变化时,控制器主动推送状态更新。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | role | string | 角色,"client" / "server" | | status | int | 状态码:0-已断开,1-连接中,2-已连接,3-连接失败 | | errorMsg | string | 错误描述(连接失败时返回) | | timestamp | string | 状态变化时间 | #### 响应示例 ```json { "role": "client", "status": 2, "timestamp": "2024-03-15T10:29:55Z" } ``` --- ## 常见问题 ### 连接失败排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 客户端无法连接 | IP/端口错误 | 检查 `client.ip` 和 `client.port` 是否正确 | | 客户端无法连接 | 安全策略不匹配 | 确认 `client.security` 与服务器一致 | | 客户端无法连接 | 网络不通 | 用 ping 测试网络连通性 | | 节点读取失败 | NodeId 格式错误 | 确认 `nodeId` 格式,如 `ns=2;s=xxx` | | 节点读取失败 | 命名空间索引错误 | 确认 `namespace` 值匹配服务器实际命名空间 | | 写入失败 | 权限不足 | 确认服务器对目标节点开放了写入权限 | | 订阅无数据推送 | 发布间隔过大 | 减小 `publishingInterval` 值 | | 订阅无数据推送 | 死区设置过大 | 减小 `deadbandValue` 或关闭死区 | ### 性能建议 - 批量操作优先使用批量读写命令(`0x7357`),减少通信开销 - 订阅监控项不宜过多,建议单个订阅不超过 50 个节点 - 采样间隔应根据数据变化频率合理设置,避免过度采样 - 发布间隔不宜过小,推荐 100ms ~ 1000ms --- # EIP > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/09.EIP.html ## 概述 EIP(EtherNet/IP)是一种基于标准以太网的工业通信协议,由 ODVA 组织维护。它使用 CIP(Common Industrial Protocol,通用工业协议)作为应用层协议,支持实时 I/O 数据和显式消息通信。本控制器通过 EtherNet/IP 与支持该协议的设备进行数据交互。 ### 通讯模式 | 模式 | 说明 | 特点 | |------|------|------| | 显式消息(Explicit Messaging) | 基于 TCP,请求/应答模式 | 非实时,用于配置和诊断 | | 隐式消息(Implicit Messaging) | 基于 UDP,生产者/消费者模式 | 实时,用于周期性 I/O 数据交换 | ### CIP 协议层次 ```text ┌────────────────────────────┐ │ 应用对象 (CIP Objects) │ ├────────────────────────────┤ │ CIP 通用工业协议 │ ├───────────┬────────────────┤ │ 显式消息 │ 隐式消息(I/O) │ │ (TCP) │ (UDP) │ ├───────────┴────────────────┤ │ TCP/IP 协议栈 │ ├────────────────────────────┤ │ 以太网物理层 │ └────────────────────────────┘ ``` --- ## 0x7360 上位机设置设备参数配置 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | type | int | 是 | 输入/输出路数 | 1 / 4 / 8 / 12 / 16 | | grouptype | int | 是 | 组号的方式 | 0: 手填,1: 全局 int 类型变量,2: 全局 int 类型绑定变量 | | group | int | 是 | 组号中的数字 | - | | addtype | int | 是 | 数值存入的方式 | 0: 全局 int 类型变量,1: 全局 int 类型绑定变量,2: 全局 double 类型变量,3: 全局 double 类型绑定变量 | | add | int | 是 | 数值存入的数字 | - | | num | int | 是 | 编号 | 1-10: 输出,11-20: 输入 | | value | - | 是 | 值 | - | | able | bool | 是 | 使能开关 | true: 使能,false: 不使能 | ### 参数详解 - **type**:定义每路输入/输出的数据位宽。例如 type=16 时每路包含 16 个位信号 - **grouptype**:定义组号的来源方式。手填(0)直接使用 group 值;全局变量方式(1/2)从对应变量中读取组号 - **addtype**:定义数据存入的目标类型。int 变量存储整数,double 变量存储浮点数 - **num**:1~10 为输出信号,11~20 为输入信号,与外部设备的 I/O 映射对应 ### 请求示例 ```json { "type": 4, "grouptype": 1, "group": 3, "addtype": 2, "add": 100, "num": 5, "value": 1, "able": true } ``` ### 响应 控制器响应并返回设备参数。响应数据结构与请求一致。 --- ## 0x7361 上位机获取设备参数配置 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前所有设备参数配置列表。 --- ## 0x7362 上位机修改设备参数配置 > 参数格式同 0x7360。可修改已配置的设备参数,支持部分字段修改。 --- ## 0x7363 上位机设置连接参数 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | enable | bool | 是 | 连接开关 | true: 打开连接开关,false: 关闭连接开关 | | writenum | int | 是 | 输出(写入)数据长度 | [0, 256] | | readnum | int | 是 | 输入(读取)数据长度 | [0, 256] | | scancycle | int | 是 | 扫描周期(ms) | 建议 [1, 100] | | outtimecycle | int | 是 | 超时周期(ms) | 应为扫描周期的倍数 | | networkname | string | 是 | 选取的网口的名称 | 如 "eth0", "eth1" | | writetype | int | 是 | 本机输出数据的类型 | 0: 全局 bool 类型变量,1: 全局 bool 类型绑定变量 | | writeadd | int | 是 | 本机输出数据的起始地址 | 全局变量地址 | | readtype | int | 是 | 本机输入数据的类型 | 0: 全局 bool 类型变量,1: 全局 bool 类型绑定变量 | | readadd | int | 是 | 本机输入数据的起始地址 | 全局变量地址 | ### 参数详解 - **writenum / readnum**:定义输出/输入数据的长度(以 bool 为单位)。实际数据量 = writenum/readnum × 位宽 - **scancycle**:控制器获取/发送 EtherNet/IP 数据的周期,单位毫秒 - **outtimecycle**:通讯超时判定周期,若超过此时间未收到对端数据则判定超时。建议设置为 scancycle × 4 - **networkname**:指定使用的物理网口,需与设备实际连接的网络接口一致 ### 请求示例 ```json { "enable": true, "writenum": 64, "readnum": 64, "scancycle": 10, "outtimecycle": 40, "networkname": "eth0", "writetype": 0, "writeadd": 200, "readtype": 0, "readadd": 300 } ``` --- ## 0x7364 上位机获取连接参数配置 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前的连接参数配置。数据结构与 0x7363 请求一致。 --- ## 0x7365 上位机修改连接参数 > 参数格式同 0x7363。 --- ## 0x7366 上位机向控制器获取连接状态 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前的连接状态信息。 #### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | connected | bool | 连接状态,true-已连接,false-未连接 | | linkSpeed | int | 链路速度(Mbps) | | packetTx | int | 发送数据包计数 | | packetRx | int | 接收数据包计数 | | timeoutCount | int | 超时计数 | | lastError | string | 最近一次错误描述 | #### 响应示例 ```json { "connected": true, "linkSpeed": 100, "packetTx": 15230, "packetRx": 15128, "timeoutCount": 0, "lastError": "" } ``` --- ## 0x7367 控制器返回读取数据的状态 控制器在周期性通讯中,主动推送输入数据的状态变化。 #### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | 输入编号,范围 11-20 | | value | int/bool/double | 输入当前值 | | timestamp | int | 数据更新时间戳(ms) | --- ## 0x7368 读取数据的状态设置 上位机可主动设置输入数据的状态值(用于调试或模拟)。 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | num | int | 是 | 编号信息 | 0-9: 输出,10-19: 输入 | | value | - | 是 | 设置的值 | 类型取决于 addtype 配置 | ### 请求示例 ```json { "num": 12, "value": 1 } ``` --- ## 0x7369 读取数据的状态设置 控制输入数据是否随 EtherNet/IP 接收数据实时更新。 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | state | bool | 是 | true: 输入数据跟随 EIP 接收数据实时更新,false: 冻结当前值 | ### 应用场景 - **state=true**:正常运行模式,输入数据实时反映外部设备状态 - **state=false**:调试/维护模式,冻结输入值,便于排查问题或手动模拟信号 ### 请求示例 ```json { "state": false } ``` --- ## CIP 连接管理 ### 连接建立流程 EtherNet/IP 使用 CIP 连接进行数据交换,连接建立过程如下: ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 上位机 │ │ 控制器 │ │ EIP 设备 │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ 0x7363 设置连接参数 │ │ │────────────────────>│ │ │ │ TCP 连接 │ │ │─────────────────────>│ │ │ 注册 Session │ │ │─────────────────────>│ │ │ Forward Open 请求 │ │ │─────────────────────>│ │ │ Forward Open 响应 │ │ │<─────────────────────│ │ │ │ │ │◄── 隐式消息(I/O) ──►│ │ │ (周期性数据交换) │ ``` ### 连接类型 | 连接类型 | 传输方式 | 触发方式 | 典型用途 | |----------|----------|----------|----------| | Exclusive Owner | 点到点 | 周期 | 控制器独占控制 I/O 设备 | | Input Only | 多播 | 周期 | 仅监听输入数据 | | Listen Only | 多播 | 周期 | 监听其他连接的输出数据 | ### Assembly 对象 Assembly 对象用于将离散 I/O 数据组合为一个数据块进行传输。 | Assembly 类型 | 实例 ID 范围 | 方向 | 说明 | |---------------|-------------|------|------| | Output Assembly | 100~199 | 本机 → 设备 | 输出数据集合 | | Input Assembly | 200~299 | 设备 → 本机 | 输入数据集合 | | Configuration Assembly | 300~399 | 本机 → 设备 | 配置数据集合 | --- ## 通讯状态监控 ### 控制器主动上报状态变化 **命令字:** `0x736A` 当 EtherNet/IP 连接状态发生变化时,控制器主动推送状态更新。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | status | int | 连接状态:0-空闲,1-连接中,2-运行中,3-超时,4-错误 | | elapsedMs | int | 当前连接已持续时间(毫秒) | | diagInfo | object | 诊断信息 | #### diagInfo 说明 | 字段 | 类型 | 描述 | |------|------|------| | sessionHandle | int | CIP Session 句柄 | | connectionId | int | CIP 连接 ID | | rpi | int | 请求包间隔 RPI(ms) | | openRetries | int | 连接打开重试次数 | | watchDogTimeout | int | 看门狗超时次数 | #### 响应示例 ```json { "status": 2, "elapsedMs": 3600000, "diagInfo": { "sessionHandle": 12345, "connectionId": 67890, "rpi": 10, "openRetries": 0, "watchDogTimeout": 0 } } ``` --- ## 常见问题 ### 连接问题排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 无法建立连接 | 网口选择错误 | 检查 `networkname` 是否与实际网口一致 | | 无法建立连接 | 设备 IP 不在同一网段 | 配置控制器网口 IP 与设备同网段 | | 数据不更新 | 扫描周期过大 | 减小 `scancycle` 值 | | 数据不更新 | state 设为 false | 将 `0x7369` 的 state 设为 true | | 频繁超时 | 网络负载过高 | 增大 `outtimecycle`,优化网络拓扑 | | 频繁超时 | 网络设备故障 | 检查交换机、网线等硬件 | | 数据错乱 | 数据长度不匹配 | 确认 `writenum`/`readnum` 与设备一致 | | 数据错乱 | 字节序不一致 | 检查设备的字节序设置 | ### 性能优化建议 - 扫描周期建议根据实际 I/O 点数和网络条件设置,通常 5~50ms - RPI(请求包间隔)应在 `scancycle` 的基础上考虑网络延迟余量 - 对于纯监控类数据,可适当增大扫描周期以降低网络负载 - 使用 `0x7366` 定期查询连接状态和通信统计,及时发现异常 --- # 码垛工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/01.%E7%A0%81%E5%9E%9B%E5%B7%A5%E8%89%BA.html ## 1 抓手 ### 1.1 上位机设置抓手参数 **说明:** 抓手设置就是设置码垛过程中用到的工具手。两个吸盘分别取料(一个吸盘吸完后再切换到另一个吸盘取料),那么要设置成两个抓手;两个吸盘同时取料,则设置成一个抓手;如果两个吸盘分别放料(一个吸盘放完后切换到另一个吸盘放料),此时需要设置两个抓手;两个吸盘同时放料,则设置成一个抓手。 **命令字:** `0x8000` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手数目 | [1,4] | | pallet.gripper | array | 抓手工具号数组,第 i 个数代表抓手 i 的工具号 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 2, "gripper": [1, 3, 4, 1] } } ``` ### 1.2 上位机查询抓手参数 **命令字:** `0x8001` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 1.3 控制器返回抓手参数 **命令字:** `0x8002` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手数目 | [1,4] | | pallet.gripper | array | 抓手工具号数组,第 i 个数代表抓手 i 的工具号 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 2, "gripper": [1, 3, 4, 1] } } ``` ## 2 托盘 ### 2.1 上位机设置托盘参数 **命令字:** `0x8010` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.userNum | int | 用户坐标系 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "userNum": 1 } } ``` ### 2.2 上位机查询托盘参数 **命令字:** `0x8011` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 2.3 控制器返回托盘参数 **命令字:** `0x8012` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.userNum | int | 用户坐标系 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "userNum": 1 } } ``` ### 2.4 上位机下发设置码垛托盘范围参数 **命令字:** `0x8013` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 表示要操作的机器人编号 | [1,4] | | craftID | int | 码垛工艺号 | - | | pallet.tray_preview | bool | 是否打开托盘预览 | true/false | | pallet.tray_length | double | 托盘长 | (1,50000) | | pallet.tray_width | double | 托盘宽 | (1,50000) | ```json { "robot": 1, "craftID": 1, "pallet": { "tray_preview": true, "tray_length": 1, "tray_width": 1 } } ``` ### 2.5 上位机查询码垛托盘范围参数 **命令字:** `0x8014` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 表示要操作的机器人编号 | [1,4] | | craftID | int | 码垛工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 2.6 控制器回复托盘范围参数 **命令字:** `0x8015` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 表示要操作的机器人编号 | [1,4] | | craftID | int | 码垛工艺号 | - | | pallet.tray_preview | bool | 是否打开托盘预览 | true/false | | pallet.tray_length | double | 托盘长 | (1,50000) | | pallet.tray_width | double | 托盘宽 | (1,50000) | ```json { "robot": 1, "craftID": 1, "pallet": { "tray_preview": true, "tray_length": 1, "tray_width": 1 } } ``` ## 3 位置 ### 3.1 上位机设置位置参数 **说明:** 位置设置可以设置码垛工件点、辅助点、入口点,请带抓手设置所选的工具手进行位置标记。 **命令字:** `0x8020` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorNum | int | 标记原点所在层 | - | | pallet.enterPos | array | 入口点,double 类型,6个元素 | - | | pallet.realPos | array | 工件点,double 类型,6个元素 | - | | pallet.shiftPos | array | 辅助点,double 类型,6个元素 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorNum": 1, "enterPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "realPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "shiftPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0] } } ``` ### 3.2 上位机查询位置参数 **命令字:** `0x8021` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 3.3 控制器返回位置参数 **命令字:** `0x8022` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorNum | int | 标记原点所在层 | - | | pallet.enterPos | array | 入口点,double 类型,6个元素 | - | | pallet.realPos | array | 工件点,double 类型,6个元素 | - | | pallet.shiftPos | array | 辅助点,double 类型,6个元素 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorNum": 1, "enterPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "realPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "shiftPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0] } } ``` ## 4 工件参数 ### 4.1 上位机设置工件参数 **命令字:** `0x8030` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceGapX | double | 托盘 X 方向间隙 | [0,9999]mm | | pallet.workpieceGapY | double | 托盘 Y 方向间隙 | [0,9999]mm | | pallet.workpieceHeight | double | 高(托盘 Z 方向) | [1,9999]mm | | pallet.workpieceLength | array | 长(托盘 Y 方向),double 类型 | [1,9999]mm | | pallet.workpieceWidth | array | 宽(托盘 X 方向),double 类型 | [1,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceGapX": 0.0, "workpieceGapY": 0.0, "workpieceHeight": 1.0, "workpieceLength": [1.0], "workpieceWidth": [1.0] } } ``` ### 4.2 上位机查询工件参数 **命令字:** `0x8031` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 4.3 控制器返回工件参数 **命令字:** `0x8032` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceGapX | double | 托盘 X 方向间隙 | [0,9999]mm | | pallet.workpieceGapY | double | 托盘 Y 方向间隙 | [0,9999]mm | | pallet.workpieceHeight | double | 高(托盘 Z 方向) | [1,9999]mm | | pallet.workpieceLength | array | 长(托盘 Y 方向),double 类型 | [1,9999]mm | | pallet.workpieceWidth | array | 宽(托盘 X 方向),double 类型 | [1,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceGapX": 0.0, "workpieceGapY": 0.0, "workpieceHeight": 1.0, "workpieceLength": [1.0], "workpieceWidth": [1.0] } } ``` ## 5 接近参数 ### 5.1 上位机设置接近参数 **命令字:** `0x8040` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceApproEnable | bool | 接近使能 | true/false | | pallet.workpieceApproMode | int | 接近方式 | 0:下降接近, 1:接近下降 | | pallet.workpieceApproLenX | double | 托盘 X 方向长度 | [0,9999]mm | | pallet.workpieceApproLenY | double | 托盘 Y 方向长度 | [0,9999]mm | | pallet.workpieceApproLenZ | double | 托盘 Z 方向长度 | [0,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceApproEnable": false, "workpieceApproMode": 0, "workpieceApproLenX": 0, "workpieceApproLenY": 0, "workpieceApproLenZ": 0 } } ``` ### 5.2 上位机查询接近参数 **命令字:** `0x8041` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 5.3 控制器返回接近参数 **命令字:** `0x8042` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceApproEnable | bool | 接近使能 | true/false | | pallet.workpieceApproMode | int | 接近方式 | 0:下降接近, 1:接近下降 | | pallet.workpieceApproLenX | double | 托盘 X 方向长度 | [0,9999]mm | | pallet.workpieceApproLenY | double | 托盘 Y 方向长度 | [0,9999]mm | | pallet.workpieceApproLenZ | double | 托盘 Z 方向长度 | [0,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceApproEnable": false, "workpieceApproMode": 0, "workpieceApproLenX": 0, "workpieceApproLenY": 0, "workpieceApproLenZ": 0 } } ``` ## 6 重叠模式参数 ### 6.1 设置重叠模式参数 **命令字:** `0x8050` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorSum | int | 层数 | [1,999] | | pallet.overlapType | int | 重复关系 | 0:相同, 1:交替, 2:自定义 | | pallet.layHeightOffset | double | 放货点高度补偿 | - | | pallet.fixedLayHeight | bool | 固定放货点高度 | true/false | | pallet.fixedSupHeight | bool | 固定辅助点高度 | true/false | | pallet.columnLay | bool | 竖直方向排列 | true/false | | pallet.floorAutoJustified | bool | 层自动对齐 | true/false | | pallet.poseAutorotation | bool | 姿态自动旋转 | true/false | | pallet.fixedEnterPoint | bool | 固定入口点位置 | true/false | | pallet.graphicNum | array | 图形编号 | [0,9] | | pallet.heightRevise | array | 高度修正 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorSum": 1, "overlapType": 0, "layHeightOffset": 0.0, "fixedLayHeight": false, "fixedSupHeight": false, "columnLay": false, "floorAutoJustified": false, "poseAutorotation": false, "fixedEnterPoint": false, "graphicNum": [1, 2, 1, 2], "heightRevise": [1.1, -2.2] } } ``` ### 6.2 上位机查询重叠模式参数 **命令字:** `0x8051` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 6.3 控制器返回重叠模式参数 **命令字:** `0x8052` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorSum | int | 层数 | [1,999] | | pallet.overlapType | int | 重复关系 | 0:相同, 1:交替, 2:自定义 | | pallet.layHeightOffset | double | 放货点高度补偿 | - | | pallet.fixedLayHeight | bool | 固定放货点高度 | true/false | | pallet.fixedSupHeight | bool | 固定辅助点高度 | true/false | | pallet.columnLay | bool | 竖直方向排列 | true/false | | pallet.floorAutoJustified | bool | 层自动对齐 | true/false | | pallet.poseAutorotation | bool | 姿态自动旋转 | true/false | | pallet.fixedEnterPoint | bool | 固定入口点位置 | true/false | | pallet.graphicNum | array | 图形编号 | [0,9] | | pallet.heightRevise | array | 高度修正 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorSum": 1, "overlapType": 0, "layHeightOffset": 0.0, "fixedLayHeight": false, "fixedSupHeight": false, "columnLay": false, "floorAutoJustified": false, "poseAutorotation": false, "fixedEnterPoint": false, "graphicNum": [1, 2, 1, 2], "heightRevise": [1.1, -2.2] } } ``` ## 7 平面模式参数 ### 7.1 设置平面模式参数 **命令字:** `0x8060` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.graphicType | int | 模版选择 | 0:行列, 1:纵横交错, 2:回字型, 3:五花垛, 4:自定义 | | pallet.transLenX | double | X 平移补偿 | [-9999,9999]mm | | pallet.transLenY | double | Y 平移补偿 | [-9999,9999]mm | | pallet.ranks.numX | int | x 方向个数 | [1,999] | | pallet.ranks.numY | int | y 方向个数 | [1,999] | | pallet.ranks.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.autoCalculate | bool | 自动计算 | true/false | | pallet.intertwining.numX | int | x 方向个数 | [1,999] | | pallet.intertwining.numY | int | y 方向个数 | [1,999] | | pallet.intertwining.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.intertwining.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.A_rows | int | A 区行数 | [0,999] | | pallet.wideType.B_rows | int | B 区行数 | [1,999] | | pallet.wideType.B_columns | int | B 区列数 | [1,999] | | pallet.wideType.C_rows | int | C 区行数 | [0,999] | | pallet.wideType.A_C_columns | int | A 区和 C 区列数 | [0,999] | | pallet.wideType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.custom.sum | int | 层工件总数 | - | | pallet.custom.start | int | 开始发送的工件号 | - | | pallet.custom.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.custom.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].t | double | 旋转角 | [-180,180] | | pallet.custom.eachVec[].dir | int | 接近方向 | 0:上, 1:下, 2:左, 3:右, 4:左上, 5:左下, 6:右上, 7:右下 | | pallet.custom.eachVec[].h | double | 高度修正 | [-9999,9999]mm | | pallet.custom.eachVec[].EntrySpeed | double | 接近速度 | 0或[1,100]% | | pallet.custom.eachVec[].LeaveSpeed | double | 离开速度 | 0或[1,100]% | **注意:** 每次最多发送十组,若工件总数大于10,则要多次发送,非第一次发送时 start 需要改变。例如,第一次发送10组,第二次发送时 start 为11。 ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "graphicType": 0, "transLenX": 2.2, "transLenY": -3.3, "ranks": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0, "autoCalculate": true }, "intertwining": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "gearType": { "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "wideType": { "A_rows": 1, "B_rows": 1, "B_columns": 1, "C_rows": 1, "A_C_columns": 1, "rotationAngleWhole": 0.0, "rotationAngleSingle": 0.0 }, "custom": { "sum": 20, "start": 1, "count": 10, "eachVec": [ { "X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0, "EntrySpeed": 60.0, "LeaveSpeed": 3.0 } ] } } } ``` ### 7.2 上位机查询平面模式参数 **命令字:** `0x8061` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 7.3 控制器返回平面模式参数 **命令字:** `0x8060` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.graphicType | int | 模版选择 | 0:行列, 1:纵横交错, 2:回字型, 3:五花垛, 4:自定义 | | pallet.transLenX | double | X 平移补偿 | [-9999,9999]mm | | pallet.transLenY | double | Y 平移补偿 | [-9999,9999]mm | | pallet.ranks.numX | int | x 方向个数 | [1,999] | | pallet.ranks.numY | int | y 方向个数 | [1,999] | | pallet.ranks.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.autoCalculate | bool | 自动计算 | true/false | | pallet.intertwining.numX | int | x 方向个数 | [1,999] | | pallet.intertwining.numY | int | y 方向个数 | [1,999] | | pallet.intertwining.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.intertwining.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.A_rows | int | A 区行数 | [0,999] | | pallet.wideType.B_rows | int | B 区行数 | [1,999] | | pallet.wideType.B_columns | int | B 区列数 | [1,999] | | pallet.wideType.C_rows | int | C 区行数 | [0,999] | | pallet.wideType.A_C_columns | int | A 区和 C 区列数 | [0,999] | | pallet.wideType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.custom.sum | int | 层工件总数 | - | | pallet.custom.start | int | 开始发送的工件号 | - | | pallet.custom.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.custom.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].t | double | 旋转角 | [-180,180] | | pallet.custom.eachVec[].dir | int | 接近方向 | 0:上, 1:下, 2:左, 3:右, 4:左上, 5:左下, 6:右上, 7:右下 | | pallet.custom.eachVec[].h | double | 高度修正 | [-9999,9999]mm | | pallet.custom.eachVec[].EntrySpeed | double | 接近速度 | 0或[1,100]% | | pallet.custom.eachVec[].LeaveSpeed | double | 离开速度 | 0或[1,100]% | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "graphicType": 0, "transLenX": 2.2, "transLenY": -3.3, "ranks": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0, "autoCalculate": true }, "intertwining": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "gearType": { "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "wideType": { "A_rows": 1, "B_rows": 1, "B_columns": 1, "C_rows": 1, "A_C_columns": 1, "rotationAngleWhole": 0.0, "rotationAngleSingle": 0.0 }, "custom": { "sum": 20, "start": 1, "count": 10, "eachVec": [ { "X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0, "EntrySpeed": 60.0, "LeaveSpeed": 3.0 } ] } } } ``` ### 7.4 请求转换为平面模式自定义模板 **命令字:** `0x8063` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 7.5 控制器返回转换为平面模式自定义模板后对应参数 **命令字:** `0x8064` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.graphicType | int | 模版选择(此处只能取3) | 3:自定义 | | pallet.transLenX | double | X 平移补偿 | [-9999,9999]mm | | pallet.transLenY | double | Y 平移补偿 | [-9999,9999]mm | | pallet.autoTransLenX | double | X 自动平移距离 | - | | pallet.autoTransLenY | double | Y 自动平移距离 | - | | pallet.custom | object | 自定义参数(同上) | - | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "graphicType": 3, "transLenX": 2.2, "transLenY": -3.3, "autoTransLenX": 4.4, "autoTransLenY": 5.5, "custom": { "sum": 20, "start": 1, "count": 10, "eachVec": [ { "X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0 } ] } } } ``` ### 7.6 上位机请求平面模式预览 **命令字:** `0x8065` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 7.7 控制器返回平面模式预览参数 **命令字:** `0x8066` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.workpieceLength | int | 每个工件的长度 | [0,9999]mm | | pallet.workpieceWidth | int | 每个工件的宽度 | [0,9999]mm | | pallet.sum | int | 层工件总数 | - | | pallet.start | int | 开始发送的工件号 | - | | pallet.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.tray.x | double | 托盘 x 坐标 | - | | pallet.tray.y | double | 托盘 y 坐标 | - | | pallet.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.eachVec[].t | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "workpieceLength": 1, "workpieceWidth": 1, "sum": 20, "start": 1, "count": 10, "tray": { "x": 0.0, "y": 0.0 }, "eachVec": [ { "X": 0, "Y": 0, "t": 0 } ] } } ``` ### 7.8 查询完整码垛平面模式自动计算结果 **命令字:** `0x806A` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 7.9 控制器返回完整码垛平面模式自动计算结果 **命令字:** `0x806B` | 参数名 | 类型 | 说明 | |--------|------|------| | pallet.ranks.numX | int | X 方向个数 | | pallet.ranks.numY | int | Y 方向个数 | ```json { "pallet": { "ranks": { "numX": 0, "numY": 0 } } } ``` ### 7.10 平面模式自定义模式预览(不保存参数和结果) **命令字:** `0x8067` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.workpieceLength | int | 每个工件的长度 | [0,9999]mm | | pallet.workpieceWidth | int | 每个工件的宽度 | [0,9999]mm | | pallet.sum | int | 层工件总数 | - | | pallet.start | int | 开始发送的工件号 | - | | pallet.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.tray.x | double | 托盘 x 坐标 | - | | pallet.tray.y | double | 托盘 y 坐标 | - | | pallet.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.eachVec[].t | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "workpieceLength": 1, "workpieceWidth": 1, "sum": 20, "start": 1, "count": 10, "tray": { "x": 0.0, "y": 0.0 }, "eachVec": [ { "X": 0, "Y": 0, "t": 0 } ] } } ``` ### 7.11 控制器返回平面模式自定义模式预览 **命令字:** `0x8068` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.workpieceLength | int | 每个工件的长度 | [0,9999]mm | | pallet.workpieceWidth | int | 每个工件的宽度 | [0,9999]mm | | pallet.sum | int | 层工件总数 | - | | pallet.start | int | 开始发送的工件号 | - | | pallet.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.tray.x | double | 托盘 x 坐标 | - | | pallet.tray.y | double | 托盘 y 坐标 | - | | pallet.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.eachVec[].t | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "workpieceLength": 1, "workpieceWidth": 1, "sum": 20, "start": 1, "count": 10, "tray": { "x": 0.0, "y": 0.0 }, "eachVec": [ { "X": 0, "Y": 0, "t": 0 } ] } } ``` ## 8 复制层图形参数 ### 8.1 复制层图形参数 **命令字:** `0x8069` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID_source | int | 要复制的工艺号 | - | | craftID_target | int | 复制到的工艺号 | - | | graphic_source | int | 要复制的图形层 | - | | graphic_target | int | 复制到的图形层 | - | ```json { "robot": 1, "craftID_source": 1, "craftID_target": 2, "graphic_source": 1, "graphic_target": 2 } ``` ## 9 码垛状态 ### 9.1 设置码垛状态 **命令字:** `0x80A0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.curLayerNum | int | 当前层数 | - | | pallet.curLayerPalletedWpNum | int | 当前层已码工件数 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "curLayerNum": 1, "curLayerPalletedWpNum": 5 } } ``` ### 9.2 上位机查询码垛状态 **命令字:** `0x80A1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 9.3 控制器返回码垛状态 **命令字:** `0x80A2` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craftID | int | 工艺号 | | graphic | int | 图形编号 | | pallet.totalWpNum | int | 总工件数 | | pallet.totalLayerNum | int | 总层数 | | pallet.curPalletedWpSum | int | 当前已码总工件数 | | pallet.curLayerNum | int | 当前层数 | | pallet.curLayerPalletedWpNum | int | 当前层已码工件数 | | pallet.curLayerWpSum | int | 当前层总工件数 | ```json { "robot": 1, "craftID": 1, "pallet": { "totalWpNum": 20, "totalLayerNum": 2, "curPalletedWpSum": 5, "curLayerNum": 1, "curLayerPalletedWpNum": 5, "curLayerWpSum": 10 } } ``` ## 10 码垛类型 ### 10.1 上位机切换使用码垛类型 **命令字:** `0x80B2` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | usePalletType | int | 码垛类型 | 0:简易, 1:完整, 2:未定义 | | craftNote | string | 标记 | - | ```json { "robot": 1, "craftID": 1, "usePalletType": 0, "craftNote": "" } ``` ### 10.2 上位机查询当前使用码垛类型 **命令字:** `0x80B3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 10.3 控制器返回当前使用码垛类型 **命令字:** `0x80B4` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | usePalletType | int | 码垛类型 | 0:简易, 1:完整, 2:未定义 | | craftNote | string | 标记 | - | ```json { "robot": 1, "craftID": 1, "usePalletType": 0, "craftNote": "" } ``` ## 11 简易码垛 ### 11.1 设置简易码垛位置 **命令字:** `0x80C0` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craftID | int | 工艺号 | | O | array | 工件起始点,直角坐标系下的末端位姿 | | X | array | 列末端,直角坐标系下的末端位姿 | | Y | array | 行末端,直角坐标系下的末端位姿 | | shift | array | 辅助点,直角坐标系下的末端位姿 | | enter | array | 入口点,直角坐标系下的末端位姿 | | numX | int | 行数 | | numY | int | 列数 | | numZ | int | 层数 | | useAcrossCorner | bool | 是否使用对角末端,true:是, false:否 | ```json { "robot": 1, "craftID": 1, "O": [1, 2, 3, 4, 5, 6], "X": [1, 2, 3, 4, 5, 6], "Y": [1, 2, 3, 4, 5, 6], "shift": [1, 2, 3, 4, 5, 6], "enter": [1, 2, 3, 4, 5, 6], "numX": 1, "numY": 1, "numZ": 1, "useAcrossCorner": true } ``` ### 11.2 上位机查询简易码垛位置 **命令字:** `0x80C1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 11.3 控制器返回简易码垛位置 **命令字:** `0x80C2` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craftID | int | 工艺号 | | O | array | 工件起始点(弧度制) | | ODeg | array | 工件起始点(角度制) | | X | array | 列末端(弧度制) | | XDeg | array | 列末端(角度制) | | Y | array | 行末端(弧度制) | | YDeg | array | 行末端(角度制) | | shift | array | 辅助点(弧度制) | | shiftDeg | array | 辅助点(角度制) | | enter | array | 入口点(弧度制) | | enterDeg | array | 入口点(角度制) | | acrossCorner | array | 对角末端(弧度制) | | acrossCornerDeg | array | 对角末端(角度制) | | numX | int | 行数 | | numY | int | 列数 | | numZ | int | 层数 | ```json { "robot": 1, "craftID": 1, "O": [1, 2, 3, 4, 5, 6], "ODeg": [1, 2, 3, 4, 5, 6], "X": [1, 2, 3, 4, 5, 6], "XDeg": [1, 2, 3, 4, 5, 6], "Y": [1, 2, 3, 4, 5, 6], "YDeg": [1, 2, 3, 4, 5, 6], "shift": [1, 2, 3, 4, 5, 6], "shiftDeg": [1, 2, 3, 4, 5, 6], "enter": [1, 2, 3, 4, 5, 6], "enterDeg": [1, 2, 3, 4, 5, 6], "acrossCorner": [1, 2, 3, 4, 5, 6], "acrossCornerDeg": [1, 2, 3, 4, 5, 6], "numX": 1, "numY": 1, "numZ": 1 } ``` ### 11.4 设置简易码垛抓手参数 **命令字:** `0x80C3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手个数 | [1,4] | | pallet.gripper | array | 抓手工具号数组 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 4, "gripper": [1, 3, 4, 1] } } ``` ### 11.5 上位机查询简易码垛抓手参数 **命令字:** `0x80C4` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 11.6 控制器返回简易码垛抓手参数 **命令字:** `0x80C5` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手个数 | [1,4] | | pallet.gripper | array | 抓手工具号数组 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 4, "gripper": [1, 3, 4, 1] } } ``` ## 12 码垛复位 ### 12.1 码垛复位 **命令字:** `0x80A3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | gripper | int | 抓手工具号 | [1,9] | ```json { "robot": 1, "craftID": 1 } ``` ## 13 复制与清空 ### 13.1 复制码垛参数 **命令字:** `0x80B0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID_source | int | 要复制的工艺号 | - | | craftID_target | int | 复制到的工艺号 | - | ```json { "robot": 1, "craftID_source": 1, "craftID_target": 2 } ``` ### 13.2 清空码垛参数 **命令字:** `0x80B1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ## 14 点位调试界面 ### 14.1 上位机获取当前层全部工件数据 **命令字:** `0x8080` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 当前层 | - | | clear | int | 是否清空缓存,1:清空缓存, 0:不清 | - | ```json { "robot": 1, "craft": 1, "layer": 1, "clear": 0 } ``` ### 14.2 控制器回复当前层全部工件数据 **命令字:** `0x8081` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craft | int | 工艺号 | | layer | int | 当前层 | | sumLayer | int | 总层数 | | length.L | int | 长 | | length.W | int | 宽 | | overLimit.over | int | 0:无超限, 1:入口点超限, 2:辅助点超限, 3:工件点超限 | | overLimit.layer | int | 超限层 | | overLimit.num | int | 超限工件号 | | pallet.sum | int | 层工件总数 | | pallet.count | int | 发送给控制器的层工件数 | | pallet.start | int | 开始发送的工件号 | | pallet.tray_length | double | 托盘长 | | pallet.tray_width | double | 托盘宽 | | pallet.tray.x | double | 托盘 x 坐标 | | pallet.tray.y | double | 托盘 y 坐标 | | pallet.eachVec[].X | double | X 坐标 | | pallet.eachVec[].Y | double | Y 坐标 | | pallet.eachVec[].Z | double | Z 坐标 | | pallet.eachVec[].t | double | 旋转角 | | pallet.eachVec[].over | int | 0:无超限, 1:入口点不可达, 2:辅助点不可达, 3:工件点不可达 | ```json { "robot": 1, "craft": 1, "layer": 1, "sumLayer": 10, "length": { "L": 10, "W": 10 }, "overLimit": { "over": 1, "layer": 1, "num": 2 }, "pallet": { "sum": 25, "count": 10, "start": 1, "tray_length": 5, "tray_width": 5, "tray": { "x": 0, "y": 0 }, "eachVec": [ { "X": 0, "Y": 0, "Z": 0, "t": 0, "over": 0 } ] } } ``` ### 14.3 码垛工艺号查询 **命令字:** `0x8082` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | ```json { "robot": 1, "craft": 1 } ``` ### 14.4 控制器回复码垛工艺号查询结果 **命令字:** `0x8083` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craft | int | 工艺号 | | _palletNumIsTooMore | bool | 码垛数量是否过多 | ```json { "robot": 1, "craft": 1, "_palletNumIsTooMore": true } ``` ### 14.5 上位机获取抓手对应工具手 **命令字:** `0x808B` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | gripper | int | 抓手号 | - | ```json { "robot": 1, "craft": 1, "gripper": 1 } ``` ### 14.6 控制器返回 **命令字:** `0x808C` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | tool | int | 工具手号 | - | ```json { "robot": 1, "craft": 1, "tool": 1 } ``` ### 14.7 上位机设置整体偏移 **命令字:** `0x8084` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 当前层 | - | | transLenX | double | X 偏移 | - | | transLenY | double | Y 偏移 | - | | transLenZ | double | Z 偏移 | - | | rotationAngle | double | 偏移角度 | - | ```json { "robot": 1, "craft": 1, "layer": 1, "transLenX": 0, "transLenY": 0, "transLenZ": 0, "rotationAngle": 0 } ``` ### 14.8 应用到相同层 **命令字:** `0x8085` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | ```json { "robot": 1, "craft": 1, "layer": 1 } ``` ### 14.9 修改单个工件位置 **命令字:** `0x8086` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | | num | int | 当前工件 | - | | mode | int | 设置方式 | 0:直接设置 xyz, 1:使用机器人当前位置 | | X | double | X 偏移 | [-9999,9999]mm | | Y | double | Y 偏移 | [-9999,9999]mm | | Z | double | Z 偏移 | [-9999,9999]mm | | angle | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1, "mode": 0, "X": 0.1, "Y": 0.1, "Z": 0.1, "angle": 0 } ``` ### 14.10 获取单个工件位置 **命令字:** `0x8087` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | | num | int | 当前工件 | - | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1 } ``` ### 14.11 控制器回复单个工件位置 **命令字:** `0x8088` | 参数名 | 类型 | 说明 | |--------|------|------| | ApproachMode | int | 接近方式 | | DepartureSpeed | double | 离开速度 | | EntryConfiguration | int | 入口配置 | | EntrySpeed | double | 接近速度 | | RealConfiguration | int | 实际配置 | | ShiftConfiguration | int | 辅助配置 | | X | double | X 坐标 | | Y | double | Y 坐标 | | Z | double | Z 坐标 | | craft | int | 工艺号 | | layer | int | 层 | | num | int | 当前工件 | | over | int | 超限标志 | | overLimit.layer | int | 超限层 | | overLimit.num | int | 超限工件号 | | overLimit.over | int | 超限类型 | | reference | int | 参考点 | | robot | int | 当前机器人 | | t | double | 旋转角 | ```json { "ApproachMode": 0, "DepartureSpeed": 0.0, "EntryConfiguration": 0, "EntrySpeed": 0.0, "RealConfiguration": 0, "ShiftConfiguration": 0, "X": 0.0, "Y": 0.0, "Z": 0.0, "craft": 7, "layer": 1, "num": 1, "over": 3, "overLimit": { "layer": 1, "num": 1, "over": 3 }, "reference": 1, "robot": 1, "t": 0.0 } ``` ### 14.12 将点位调试内容从缓存保存到文件中 **命令字:** `0x8089` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | gripper | int | 抓手号 | - | ```json { "robot": 1, "craft": 1, "gripper": 1 } ``` ### 14.13 运动到工件点/辅助点/入口点 **命令字:** `0x808A` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | | num | int | 当前工件 | - | | tool | int | 工具手 | - | | type | int | 运动到的点 | 0:入口点, 1:辅助点, 2:工件点 | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1, "tool": 1, "type": 0 } ``` ### 14.14 设置接近/离开方式 **命令字:** `0x80C7` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | approMoveType | int | 接近/离开方式 | - | ```json { "robot": 1, "craftID": 1, "approMoveType": 1 } ``` --- # 焊接工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/02.%E7%84%8A%E6%8E%A5%E5%B7%A5%E8%89%BA.html 焊接的相关通讯协议主要包含焊接装备、电流电压、焊接参数、摆焊参数、焊接 IO 端口、多层多道焊接、相贯线,关于焊接工艺的详细介绍请参考焊接工艺手册。 --- ## 1. 焊接装备 焊接装备设置包含基础功能、微调整、防碰撞、再启动/再启弧和其他模块。 ### 1.1 上位机设置焊接装备 **命令字:** `0x8300` 说明:焊接过程中,通过发生断弧、防碰撞、切模式停止等方式断弧时,此功能可在断弧处接着焊接。自动再启动、半自动再启动时要确保断弧处和回退目标位置之间没有障碍物。 #### basic_functions(基础功能) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | arc_detection_time | double | 电弧检测时间 | [0,5]s | | arc_depletion_detection_time | double | 电弧耗尽检测时间 | [0,5]s | | arc_detection_ensure_time | double | 电弧检测确认时间 | [0,5]s | | pre_give_gas_time | double | 提前送气时间 | [0,5]s | | close_time | double | 关气时间(负数为提前关气,正数为延后关气) | [-5,5]s | | weld_interruption_detection | bool | 焊接中断检测 | true:中断检测;false:不中断检测 | | arc_fly | bool | 飞行起弧 | true:飞行起弧;false:不飞行起弧 | | air_close_mode | int | 关气方式 | 0: 延迟关气,1: 提前关气 | #### micro_adjustment(微调整) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | single_adjustment_current | double | 焊接电流单次调整量 | [0,1000]A | | single_adjustment_voltage | double | 焊接电压单次调整量 | [-1000,1000]V | #### restart(再启动/再起弧) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | restart_times | int | 再启动次数 | [0,1000] | | restart_distance | double | 再启动距离 | [0,100]mm | | restart_speed | double | 再启动速度 | [0,100]mm/s | | re_arc_times | int | 再起弧次数 | [1,1000] | | restart_enable | bool | 再启动使能 | - | | re_arc_enable | bool | 再起弧使能 | - | | restart_mode | int | 再启动模式 | - | #### antiCollision(防碰撞) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | enable | bool | 防碰撞使能 | true: 开启;false:关闭 | | inputPort | int | 防碰撞 IO 端口 | - | | inputValue | int | 防碰撞出发电平 | 0/1 | | stopTime | double | 防碰撞快速停止时间 | [50,200]s | | outputPort | int | 防碰撞状态输出端口 | - | | outputValue | int | 防碰撞状态输出电平 | 0/1 | | shieldFlag | bool | 屏蔽防碰撞 | true: 开启;false:关闭 | | shieldTime | double | 屏蔽时间 | [0,1000000]s | #### other(其他) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | break_back_time | double | 断弧回抽时间 | [0,5]s | | weld_finish_time | double | 焊接完成回抽时间 | [0,5]s | | break_back_enable | bool | 断弧回抽使能 | true: 开启;false:关闭 | | weld_finish_function | bool | 焊接完成回抽功能 | true: 开启;false:关闭 | | simulation_set_zero | bool | 灭弧模拟量置零功能 | true: 开启;false:关闭 | | collisionButtonFlag.error_enable_switch | bool | 错误使能开关 | - | **示例:** ```json { "basic_functions": { "arc_detection_time": 1.1, "arc_depletion_detection_time": 1.1, "arc_detection_ensure_time": 1.1, "pre_give_gas_time": 1.1, "close_time": 1.1, "weld_interruption_detection": true, "arc_fly": true, "air_close_mode": 0 }, "micro_adjustment": { "single_adjustment_current": 1.1, "single_adjustment_voltage": 1.1 }, "restart": { "restart_times": 1, "restart_distance": 1.1, "restart_speed": 1.1, "re_arc_times": 1, "restart_enable": true, "re_arc_enable": true, "restart_mode": 1 }, "antiCollision": { "enable": false, "inputPort": 0, "inputValue": 1, "stopTime": 60, "outputPort": 0, "outputValue": 1, "shieldFlag": false, "shieldTime": 30 }, "other": { "break_back_time": 1.1, "weld_finish_time": 1.1, "break_back_enable": true, "weld_finish_function": true, "simulation_set_zero": true }, "collisionButtonFlag": { "error_enable_switch": true } } ``` ### 1.2 上位机查询焊接装备 **命令字:** `0x8301` 说明:拖拽点动模式切换开关 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 1.3 控制器回复焊接装备 **命令字:** `0x8302` 返回参数同"上位机设置焊接装备",参见上方表格及示例。 --- ## 2. 电流电压 ### 2.1 电流电压匹配设置 **命令字:** `0x8310` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | #### current_control(电流控制) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | set_current | double[] | 设置电流 | [0,10]A | | actual_current | double[] | 实际电流 | [0,999]A | #### voltage_control(电压控制) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | set_voltage | double[] | 设置电压 | [0,10]V | | actual_voltage | double[] | 实际电压 | [0,999]V | ```json { "current_control": { "set_current": [1, 2, 3, 4, 5, 6, 7, 8], "actual_current": [1, 2, 3, 4, 5, 6, 7, 8] }, "voltage_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_voltage": [1, 2, 3, 4, 5, 6, 7, 8] }, "robot": 1 } ``` ### 2.2 上位机查询电压电流匹配 **命令字:** `0x8311` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 2.3 控制器回复电流电压匹配 **命令字:** `0x8312` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | set_current | int[] | 设置电流 | [0,10]A | | actual_current | int[] | 实际电流 | [0,999]A | | set_voltage | int[] | 设置电压 | [0,10]V | | actual_voltage | int[] | 实际电压 | [0,999]V | | AO_setcurrent | int | 电流输出端口 | - | | AO_setvoltage | int | 电压输出端口 | - | ```json { "current_control": { "set_current": [1, 2, 3, 4, 5, 6, 7, 8], "actual_current": [1, 2, 3, 4, 5, 6, 7, 8] }, "voltage_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_voltage": [1, 2, 3, 4, 5, 6, 7, 8] }, "IO": { "AO_setcurrent": 0, "AO_setvoltage": 0 }, "robot": 1 } ``` ### 2.4 上位机设置电流电压匹配参数实际值 **命令字:** `0x8313` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | type | int | 参数类型(电压1=0, 电压2=1, 电流1=2, 电流2=3) | [0,3] | | value | double | 参数值 | [0,999]A/V | | robot | int | 机器人号 | [1,4] | ```json { "type": 0, "value": 4.13, "robot": 1 } ``` ### 2.5 控制器返回设置是否成功 **命令字:** `0x8314` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | result | int | 设置结果(1:成功,0:失败) | - | | robot | int | 当前机器人 | [1,4] | ```json { "result": 1, "robot": 1 } ``` ### 2.6 开始进行电流电压匹配 **命令字:** `0x8315` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | start | bool | 是否开始进行匹配 | true:开始, false:结束 | | robot | int | 当前机器人 | [1,4] | ```json { "start": true, "robot": 1 } ``` ### 2.7 手动操作电流电压设置 **命令字:** `0x8316` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | type | int | 选择设置电流/电压 | 1:设置电流,2:设置电压 | | value | double | 值 | - | ```json { "robot": 1, "type": 1, "value": 1 } ``` --- ## 3. 焊接参数 ### 3.1 上位机设置焊接参数 **命令字:** `0x8320` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号(从1开始,可设置1-99个) | [1,99] | | notes | string | 注释 | - | | robot | int | 当前机器人 | [1,4] | #### arcoff_parameters(收弧参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | arcoff_use_param | bool | 是否使用收弧参数 | true:使用;false:不使用 | | arcoff_voltage | double | 收弧电压 | [-1000,1000]V | | arcoff_current | double | 收弧电流 | [0,1000]A | | arcoff_time | double | 收弧时间 | [0,5]s | | ramp_time | double | 渐变时间 | [0,100000]ms | | ramp_enable | bool | 渐变使能 | - | | ramp_mode | int | 收弧渐变方式 | 0:时间渐变 | #### weld_parameters(焊接参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | weld_current | double | 焊接电流 | [0,1000]A | | weld_voltage | double | 焊接电压 | [-1000,1000]V | #### arcon_parameters(起弧参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | arcon_use_param | bool | 是否使用起弧参数 | true:使用;false:不使用 | | arcon_current | double | 起弧电流 | [0,1000]A | | arcon_voltage | double | 起弧电压 | [-1000,1000]V | | arcon_time | double | 起弧时间 | [0,5]s | | arcon_ramp_time | double | 渐变时间 | [0,1000000]ms | | arcon_ramp_enable | bool | 起弧渐变使能 | - | | arcon_ramp_mode | int | 起弧渐变方式 | 0:时间渐变 | ```json { "num": 1, "notes": "示例", "arcoff_parameters": { "arcoff_use_param": true, "arcoff_voltage": 1.1, "arcoff_current": 1.1, "arcoff_time": 1.1, "ramp_time": 1.1, "ramp_enable": true, "ramp_mode": 1 }, "weld_parameters": { "weld_current": 1.1, "weld_voltage": 1.1 }, "arcon_parameters": { "arcon_use_param": true, "arcon_current": 1.1, "arcon_voltage": 1.1, "arcon_time": 1.1, "arcon_ramp_time": 1.1, "arcon_ramp_enable": true, "arcon_ramp_mode": 1 } } ``` ### 3.2 上位机查询焊接参数 **命令字:** `0x8321` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号(从1开始) | [1,99] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 3.3 控制器回复焊接参数 **命令字:** `0x8322` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 参数序号(从1开始) | - | | notes | string | 注释 | - | | robot | int | 当前机器人 | [1,4] | #### arcoff_parameters(收弧参数) | 参数名 | 类型 | 说明 | |--------|------|------| | arcoff_voltage | double | 收弧电压 | | arcoff_current | double | 收弧电流 | | arcoff_time | double | 收弧时间 | | arcon_ramp_time | double | 渐变时间 | | arcon_ramp_distance | double | 渐变距离 | | arcon_ramp_enable | bool | 渐变使能 | | arcon_ramp_mode | int | 收弧渐变方式(0:时间渐变,1:距离渐变) | #### weld_parameters(焊接参数) | 参数名 | 类型 | 说明 | |--------|------|------| | weld_current | double | 焊接电流 | | weld_voltage | double | 焊接电压 | | weld_velocity | double | 焊接速度 | #### arcon_parameters(起弧参数) | 参数名 | 类型 | 说明 | |--------|------|------| | arcon_current | double | 起弧电流 | | arcon_voltage | double | 起弧电压 | | arcon_time | double | 起弧时间 | | arcon_ramp_time | double | 渐变时间 | | arcon_ramp_distance | double | 渐变距离 | | arcon_ramp_enable | bool | 起弧渐变使能 | | arcon_ramp_mode | int | 起弧渐变方式(0:时间渐变,1:距离渐变) | #### anti_adhesion_parameters(防粘丝参数) | 参数名 | 类型 | 说明 | |--------|------|------| | anti_adhesion_enable | bool | 防粘丝使能 | | anti_adhesion_times | int | 防粘丝次数 | | anti_adhesion_v | double | 防粘丝电压 | | anti_adhesion_i | double | 防粘丝电流 | | anti_adhesion_time | double | 防粘丝时间 | ```json { "num": 1, "notes": "示例", "arcoff_parameters": { "arcoff_voltage": 1.1, "arcoff_current": 1.1, "arcoff_time": 1.1, "arcon_ramp_time": 1.1, "arcon_ramp_distance": 1.1, "arcon_ramp_enable": true, "arcon_ramp_mode": 1 }, "weld_parameters": { "weld_current": 1.1, "weld_voltage": 1.1, "weld_velocity": 0.0 }, "arcon_parameters": { "arcon_current": 1.1, "arcon_voltage": 1.1, "arcon_time": 1.1, "arcon_ramp_time": 1.1, "arcon_ramp_distance": 1.1, "arcon_ramp_enable": true, "arcon_ramp_mode": 0 }, "anti_adhesion_parameters": { "anti_adhesion_enable": true, "anti_adhesion_times": 1, "anti_adhesion_v": 1.1, "anti_adhesion_i": 1.1, "anti_adhesion_time": 1.1 } } ``` --- ## 4. 摆焊参数 inexbot 摆焊支持七种摆动方式:正弦摆、Z 字摆、圆形摆、外部轴定点摆、L 型摆、三角摆、8字摆。摆动频率、摆动幅度、起始方向、水平偏角、竖直偏角等参数可调。 ### 4.1 上位机发送设置摆焊参数 **命令字:** `0x8330` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 摆焊文件序号(从1开始) | [1,99] | | note | string | 注释 | - | | robot | int | 当前机器人 | [1,4] | #### parameter(摆焊参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | weaving_type | int | 摆动类型 | [0,6],0:正弦,1:Z 字形,2:圆形摆,3:外部轴定点摆,4:L 型摆,5:三角摆,6:8字摆 | | weaving_freq | int | 摆动频率 | (0,20]Hz | | weaving_ampli | int | 摆动幅度 | (0,50]mm | | isMove | int | 是否移动/停留 | 0:停留,1:移动 | | right_standing_time | int | 右停留时间(选择 Z 字形摆、外部轴定点摆、L 型摆、三角摆时需要设置) | [0,15] | | left_standing_time | int | 左停留时间(选择 Z 字形摆、外部轴定点摆、L 型摆、三角摆时需要设置) | [0,15] | | init_direction | int | 起始方向 | 0:+1,1:-1 | | horizontal_angle | int | 水平偏角 | [-180,180] | | vertical_angle | int | 竖直偏角 | [-180,180] | | left_angle | int | 左仰角(选择 L 型摆、三角摆时需要设置) | [0,90] | | right_angle | int | 右仰角(选择 L 型摆、三角摆时需要设置) | [0,90] | ```json { "num": 1, "parameter": { "note": "示例", "weaving_type": 0, "weaving_freq": 20, "weaving_ampli": 50, "isMove": 0, "right_standing_time": 15, "left_standing_time": 15, "init_direction": 1, "horizontal_angle": 180, "vertical_angle": 180, "left_angle": 90, "right_angle": 90 }, "robot": 1 } ``` ### 4.2 上位机查询摆焊参数 **命令字:** `0x8331` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | num | int | 摆焊文件序号 | [1,99] | ```json { "robot": 1, "num": 1 } ``` ### 4.3 控制器返回摆焊参数 **命令字:** `0x8332` 返回参数同"上位机设置摆焊参数",参见上方表格及示例。 --- ## 5. 焊接 IO inexbot 控制系统通过数字化 IO 端口实现焊接工艺的精确控制,配合模拟信号接口完成焊接参数的闭环管理。 ### 5.1 上位机设置焊接 IO 接口 **命令字:** `0x8340` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | #### Din(数字输入,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | arc_success | int | 起弧成功 | | seek_success | int | 寻位成功 | | weld_enable | int | 远程焊接使能 | | wire_feed | int | 点动送丝 | | return_wire | int | 退丝 | | remote_gastest | int | 气体检测 | #### Dout(数字输出,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | arc_signal | int | 起弧成功信号 | | wire_feed | int | 点动送丝信号 | | wire_feed_back | int | 反向送丝信号 | | gas_detection | int | 气体检测信号 | | positioning_mode | int | 寻位模式 | | weld_enable | bool | 焊接使能 | #### Ain(模拟输入,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | electric | int | 焊接电流 | | voltage | int | 焊接电压 | #### Aout(模拟输出,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | given_electric_current | int | 给定电流信号 | | given_setvoltage | int | 给定电压信号 | ```json { "Din": { "arc_success": 0, "seek_success": 0, "weld_enable": 0, "wire_feed": 0, "return_wire": 0, "remote_gastest": 0 }, "Dout": { "arc_signal": 0, "wire_feed": 0, "wire_feed_back": 0, "gas_detection": 0, "positioning_mode": 0, "weld_enable": true }, "Ain": { "electric": 0, "voltage": 0 }, "Aout": { "given_electric_current": 0, "given_setvoltage": 0 }, "robot": 1 } ``` ### 5.2 上位机查询焊接 IO 接口 **命令字:** `0x8341` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 5.3 控制器回复焊接 IO 接口 **命令字:** `0x8342` 返回参数同"上位机设置焊接 IO 接口",参见上方表格及示例。 --- ## 6. 查询焊接状态 ### 6.1 上位机查询焊接状态 **命令字:** `0x8350` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人 | [1,4] | ```json { "robot": 1 } ``` ### 6.2 控制器返回焊接状态 **命令字:** `0x8351` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人 | [1,4] | #### antiCollision(防碰撞) | 参数名 | 类型 | 说明 | |--------|------|------| | shieldFlag | bool | 是否屏蔽防碰撞 | #### 焊接状态 | 参数名 | 类型 | 说明 | 取值 | |--------|------|------|------| | weldEnabled | bool | 焊接使能 | - | | spotWeldEnabled | bool | 点焊 | - | | feedWire | bool | 送丝 | - | | aspiration | bool | 送气 | - | | returnWire | bool | 退丝 | - | | pistolSwitch | int | 焊枪开关状态 | 0表示低(红),1表示高(绿),-1表示无(灰) | | arcingSuccess | int | 引弧成功 | 同上 | | handWireFeed | int | 手动送丝 | 同上 | | weldCurrent | double | 焊接电流 | - | | weldVoltage | double | 焊接电压 | - | | weldRunTime | double | 焊接时间 | - | | weldRunDutyRatio | double | 焊接占空比 | - | ```json { "antiCollision": { "shieldFlag": true }, "weldEnabled": true, "spotWeldEnabled": true, "feedWire": true, "aspiration": true, "returnWire": true, "pistolSwitch": 0, "arcingSuccess": 1, "handWireFeed": -1, "weldCurrent": 1.0, "weldVoltage": 2.0, "weldRunTime": 3.3, "weldRunDutyRatio": 4.4, "robot": 1 } ``` --- ## 7. 点焊参数 ### 7.1 上位机设置点焊参数 **命令字:** `0x8352` 说明:用户可以通过此命令手动设置点焊参数,包含:电焊电流、点焊电压、点焊最大时间。 | 参数名 | 类型 | 说明 | |--------|------|------| | spotWeldCurrent | double | 点焊电流 | | spotWeldVoltage | double | 点焊电压 | | spotWeldMaxTime | double | 点焊最大时间 | | robot | int | 机器人号(取值范围[1,4]) | ```json { "spotWeldCurrent": 0, "spotWeldVoltage": 0, "spotWeldMaxTime": 0, "robot": 1 } ``` --- ## 8. 焊机模式 ### 8.1 上位机设置焊机模式 **命令字:** `0x8360` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | type | int | 焊机模式 | 1:焊接使能,2:手动起弧,3:手动点焊,4:送丝,5:退丝,6:送气,7:故障复位 | | value | int | 是否开启对应的模式 | 1:开启,0:关闭 | | robot | int | 当前机器人 | [1,4] | ```json { "type": 1, "value": 0, "robot": 1 } ``` ### 8.2 上位机查询焊机模式 **命令字:** `0x8361` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 8.3 控制器返回焊机模式 **命令字:** `0x8362` | 参数名 | 类型 | 说明 | |--------|------|------| | weldEnabled | bool | 焊接使能 | | spotWeldEnabled | bool | 点焊使能 | | spotWeldCurrent | double | 点焊电流 | | spotWeldVoltage | double | 点焊电压 | | spotWeldMaxTime | double | 点焊最大时间 | | newCurrent | double | 设置电流 | | newVoltage | double | 设置电压 | | feedWire | bool | 送丝 | | returnWire | bool | 退丝 | | aspiration | bool | 送气 | | robot | int | 当前机器人(取值范围[1,4]) | ```json { "weldEnabled": true, "spotWeldEnabled": true, "spotWeldCurrent": 33.3, "spotWeldVoltage": -20.2, "spotWeldMaxTime": 0.5, "newCurrent": 33.3, "newVoltage": -20.2, "feedWire": true, "returnWire": true, "aspiration": true, "robot": 1 } ``` ### 8.4 焊接微调整 **命令字:** `0x8363` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | name | string | 焊接电流/电压 | - | | robot | int | 当前机器人 | [1,4] | | type | int | 操作类型 | 0:给定值增加,1:给定值减小,2:保存 | ```json { "name": "weld_current", "robot": 1, "type": 0 } ``` ### 8.5 上位机查询焊接微调整结果 **命令字:** `0x8364` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 8.6 控制器返回查询结果 **命令字:** `0x8365` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | #### weav(摆焊参数) | 参数名 | 类型 | 说明 | |--------|------|------| | left_stay_time | double[] | 左停留时间 | | right_stay_time | double[] | 右停留时间 | | swing_amplitude | double[] | 摆焊振幅 | | swing_frequency | double[] | 摆焊频率 | #### weld(焊接参数) | 参数名 | 类型 | 说明 | |--------|------|------| | weld_current | double[] | 焊接电流 | | weld_voltage | double[] | 焊接电压 | ```json { "robot": 1, "weav": { "left_stay_time": [0.0, 1.0], "right_stay_time": [0.0, 1.0], "swing_amplitude": [0.0, 1.0], "swing_frequency": [0.0, 1.0] }, "weld": { "weld_current": [0.0, 1.0], "weld_voltage": [0.0, 1.0] } } ``` --- ## 9. 焊机设置 ### 9.1 上位机设置焊机 **命令字:** `0x8370` 说明:用户可以通过以下命令字设置焊机。 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | controlMode | int | 控制模式 | 0:模拟控制,1:数字控制 | | monufactor | string | 焊机厂家 | 纳博特、麦格米特、深威智能、奥太、美佳尼克、瑞凌、肯倍 IF15、EWM、福尼斯 | | weldingMode | int | 焊机工作模式 | 0:分别,1:一元化 | | commMode | string | 通讯方式 | CAN、ModBus RTU、Modbus TCP | | slaveIP | string | 从站 IP(通讯方式为 Modbus TCP 时需要设置) | - | | slaveid | int | 从站 ID(通讯方式为 ModBus RTU 时需要设置) | - | | port | int | 端口号(通讯方式为 ModBus RTU、Modbus TCP 时需要设置) | (0,65535] | | baudRate | int | 波特率(通讯方式为 ModBus RTU 时需要设置) | - | | identifiedWelder | string | 已识别焊机 | - | | CANPort | string | CAN 通讯下的端口(通讯方式为 CAN 时需要设置) | - | | CANPortSum | int | CAN 通讯下的端口数量 | - | | welderNumber | int | 焊机编号 | - | | monufactorList | string[] | 可选择的焊机厂家清单 | 纳博特、麦格米特、深威智能、奥太、美佳尼克、瑞凌、肯倍 IF15、EWM、福尼斯、和宗 | | weldingvoltageCurve | int[] | 焊接电压曲线 | - | #### RILAND(瑞凌焊机参数) | 参数名 | 类型 | 说明 | |--------|------|------| | materialWireDiameterGasSelect | int | 材料/丝径/气体选择 | ```json { "welder": [ { "controlMode": 0, "monufactor": "麦格米特", "weldingMode": 0, "commMode": "CAN", "slaveIP": "192.168.1.14", "slaveid": 1, "port": 2, "baudRate": 38400, "identifiedWelder": "麦格米特1", "CANPort": 1, "CANPortSum": 0, "welderNumber": 1, "monufactorList": ["纳博特","麦格米特","深威智能","奥太","美佳尼克","瑞凌","肯倍IF15","EWM","福尼斯","和宗"], "weldingvoltageCurve": [0], "RILAND": { "materialWireDiameterGasSelect": 1 } } ] } ``` ### 9.2 上位机查询焊机选择 **命令字:** `0x8371` ### 9.3 控制器回复焊机选择 **命令字:** `0x8372` 返回参数同"上位机设置焊机",参见上方表格及示例。 ### 9.4 焊机通讯状态查询 **命令字:** `0x8373` ### 9.5 控制器返回焊机通讯状态 **命令字:** `0x8374` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | welder[].status | int | 焊机通讯状态 | 0:未通讯,1:已通讯 | ```json { "welder": [ { "status": 0 } ] } ``` ### 9.6 上位机查询焊接参数、摆焊参数中的注释 **命令字:** `0x8380` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | finishinit | bool | 控制器初始化完成标志 | true:完成,false:未完成 | | robot | int | 当前机器人 | [1,4] | ```json { "finishinit": true, "robot": 1 } ``` ### 9.7 控制器返回查询结果 **命令字:** `0x8381` | 参数名 | 类型 | 说明 | |--------|------|------| | weldNotes | string[] | 焊接参数注释 | | weavParameterNotes | string[] | 摆焊参数注释 | | robot | int | 当前机器人 | ```json { "robot": 1, "weldNotes": ["112", "223", "", ""], "weavParameterNotes": ["112", "223", "", ""] } ``` --- ## 10. 多层多道焊 ### 10.1 多层多道焊接参数设置 **命令字:** `0x8390` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | | sum | int | 焊道总数 | [1,999] | #### multipass(多层多道参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | note | string | 注释 | - | | weld_bead_num | int | 焊道数 | [1,99] | ```json { "multipass": [ { "note": "", "weld_bead_num": 6 } ], "num": 1, "robot": 1, "sum": 100 } ``` ### 10.2 上位机查询多层多道焊道参数 **命令字:** `0x8391` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 10.3 控制器回复多层多道焊道参数 **命令字:** `0x8392` 返回参数同"多层多道焊接参数设置",参见上方表格及示例。 ### 10.4 上位机设置多层多道焊道配置 **命令字:** `0x8393` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | #### weld_bead(焊道配置) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | head_indent | double | 头部缩进 | [-1000,1000]mm | | head_multi_indent | bool | 头部倍数缩进使能 | - | | left_right_offset | double | 左右偏移 | [-1000,1000]mm | | push_angle | double | 推角 | [-180,180] | | tail_indent | double | 尾部缩进 | [-1000,1000]mm | | tail_multi_indent | bool | 尾部倍数缩进使能 | - | | tilt_angle | double | 倾斜角 | [-180,180] | | up_down_offset | double | 高低偏移 | [-1000,1000]mm | | weld_dir | int | 焊接方向 | 0:+1,1:-1 | ```json { "num": 1, "robot": 1, "weld_bead": [ { "head_indent": 0.0, "head_multi_indent": false, "left_right_offset": 0.0, "push_angle": 0.0, "tail_indent": 0.0, "tail_multi_indent": false, "tilt_angle": 0.0, "up_down_offset": 0.0, "weld_dir": 0 } ] } ``` ### 10.5 上位机查询多层多道焊道配置 **命令字:** `0x8394` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 10.6 控制器回复多层多道焊道配置 **命令字:** `0x8395` 返回参数同"上位机设置多层多道焊道配置",参见上方表格及示例。 ### 10.7 多层多焊道参数清空 **命令字:** `0x8396` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 10.8 多层多焊道参数复制 **命令字:** `0x8397` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num_source | int | 复制的工艺号 | - | | num_target | int | 复制到的工艺号 | - | | robot | int | 当前机器人 | [1,4] | ```json { "num_source": 1, "num_target": 2, "robot": 1 } ``` ### 10.9 多层多焊道参数增加 **命令字:** `0x8398` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` --- ## 11. 焊缝数据库 ### 11.1 储存数据到焊缝数据库 **命令字:** `0x83A0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | weld_type | string | 焊缝类型 | - | | fillet_weld_leg_1 | double | 左焊脚高 | - | | fillet_weld_leg_2 | double | 右焊脚高 | - | | fillet_weld_leg_angle | double | 两条焊脚夹角 | [-180,180] | | weld_parameter_mode | string | 焊机工作模式 | "一元化"或"分别" | | welding_current | double | 焊接电流 | - | | welding_voltage | double | 焊接电压 | - | | welding_speed | double | 焊接速度 | - | | weld_bead_layer | int | 焊道总层数 | [1,99] | | weld_bead_number | int | 焊道总道数 | [1,99] | #### weld_bead(焊道参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | left_right_offset | double | 第 i 道焊缝左右偏移 | [-1000,1000] | | up_down_offset | double | 第 i 道焊缝高低偏移 | [-1000,1000] | ```json { "robot": 1, "weld_type": "V缝", "fillet_weld_leg_1": 10, "fillet_weld_leg_2": 10, "fillet_weld_leg_angle": 90, "weld_parameter_mode": "一元化", "welding_current": 160, "welding_voltage": 23, "welding_speed": 6, "weld_bead_layer": 4, "weld_bead_number": 10, "weld_bead": [ { "left_right_offset": 0.0, "up_down_offset": 0.0 } ] } ``` ### 11.2 匹配焊缝数据库中的数据 **命令字:** `0x83A1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | weld_type | string | 焊缝类型 | - | | fillet_weld_leg_1 | double | 左焊脚高 | - | | fillet_weld_leg_2 | double | 右焊脚高 | - | | fillet_weld_leg_angle | double | 两条焊脚夹角 | [-180,180] | | weld_parameter_mode | string | 焊机工作模式 | "一元化"或"分别" | | welding_current | double | 焊接电流 | - | | welding_voltage | double | 焊接电压 | - | | welding_speed | double | 焊接速度 | - | ```json { "robot": 1, "weld_type": "V缝", "fillet_weld_leg_1": 10, "fillet_weld_leg_2": 10, "fillet_weld_leg_angle": 90, "weld_parameter_mode": "一元化", "welding_current": 160, "welding_voltage": 23, "welding_speed": 6 } ``` ### 11.3 控制器回复数据库匹配结果 **命令字:** `0x83A2` 说明:回复数据库中匹配项的焊道总层数、总道数及每一层焊道数。 | 参数名 | 类型 | 说明 | |--------|------|------| | weld_database | array | 匹配数据库 | | total_layer | int | 第 i 项匹配项存在的焊道总层数 | | total_bead | int | 第 i 项匹配项存在的焊道总道数 | | layer | array | 焊道层信息 | | number | int | 第 i 项匹配项存在的第 k 层焊道数 | ```json { "weld_database": [ { "total_layer": 4, "total_bead": 10, "layer": [ { "number": 1 } ] } ] } ``` --- ## 12. 相贯线 ### 12.1 坐标标定设置 **命令字:** `0x83B0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.2 上位机查询坐标标定 **命令字:** `0x83B1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | pointNum | int | 标定点(共需要6个标定点) | [0,5] | ```json { "workPieceNum": 1, "pointNum": 0 } ``` ### 12.3 控制器回复坐标标定 **命令字:** `0x83B2` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | pointNum | int | 标定点(共需要6个标定点) | [0,5] | | pos | double[] | 该标定点的坐标(X,Y,Z,A,B,C) | - | ```json { "workPieceNum": 1, "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` ### 12.4 回复相贯线设置计算结果 **命令字:** `0x83B3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | result | bool | 是否有计算结果 | true:有,false:没有 | | workPieceNum | int | 工艺号 | [1,3] | #### cylinderIntersectLineParam(相贯线参数) | 参数名 | 类型 | 说明 | |--------|------|------| | R | double | 下圆柱半径 | | r | double | 上圆柱半径 | | e | double | 中心轴距 | | alpha | double | 中心轴夹角 | #### WorkPieceCoord | 参数名 | 类型 | 说明 | |--------|------|------| | - | double[] | X,Y,Z,A,B,C 值 | ```json { "result": true, "workPieceNum": 1, "cylinderIntersectLineParam": { "R": 0, "r": 0, "e": 0, "alpha": 0 }, "WorkPieceCoord": [0, 0, 0, 0, 0, 0] } ``` ### 12.5 相贯线工件参数设置 **命令字:** `0x83B4` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | #### cylinderIntersectLineParam(相贯线参数) | 参数名 | 类型 | 说明 | |--------|------|------| | R | double | 下圆柱半径 | | r | double | 上圆柱半径 | | e | double | 中心轴距 | | alpha | double | 中心轴夹角 | #### WorkPieceCoord | 参数名 | 类型 | 说明 | |--------|------|------| | - | double[] | X,Y,Z,A,B,C 值 | ```json { "workPieceNum": 1, "cylinderIntersectLineParam": { "R": 0, "r": 0, "e": 0, "alpha": 0 }, "WorkPieceCoord": [0, 0, 0, 0, 0, 0] } ``` ### 12.6 上位机查询相贯线工件参数 **命令字:** `0x83B5` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.7 控制器回复相贯线工件参数 **命令字:** `0x83B6` 返回参数同"相贯线工件参数设置",参见上方表格及示例。 ### 12.8 相贯线焊枪参数设置 **命令字:** `0x83B7` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | #### WeldingGunParam(焊枪参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | alpha | double | - | [-60,60] | | beta | double | - | [-60,60] | | gama | double | - | [-180,180] | | pos_hf_hq | double[] | 第三个量必须大于0 | - | | startAngle | double | - | [-180,180] | | totalAngle | double | - | [0,360] | ```json { "workPieceNum": 1, "WeldingGunParam": { "alpha": 0, "beta": 0, "gama": 0, "pos_hf_hq": [0, 0, 10] }, "startAngle": 0, "totalAngle": 360 } ``` ### 12.9 上位机查询相贯线焊枪参数 **命令字:** `0x83B8` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.10 控制器回复相贯线焊枪参数 **命令字:** `0x83B9` 返回参数同"相贯线焊枪参数设置",参见上方表格及示例。 ### 12.11 上位机设置有无变位机 **命令字:** `0x83BA` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | withSyncPosFlag | int | 是否有无变位机 | 0:无变位机,1:有变位机 | ```json { "workPieceNum": 1, "withSyncPosFlag": 1 } ``` ### 12.12 上位机查询有无变位机 **命令字:** `0x83BB` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.13 控制器回复有无变位机 **命令字:** `0x83BC` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | withSyncPosFlag | int | 是否有无变位机 | 0:无变位机,1:有变位机 | ```json { "workPieceNum": 1, "withSyncPosFlag": 1 } ``` --- # 传送带 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/03.%E4%BC%A0%E9%80%81%E5%B8%A6.html ## 0x8200 上位机发送,轨道传送位置设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | position | object | 位置参数对象 | - | | robot | int | 机器人号 | [1,4] | ### position 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | receLatestPos | double | 最迟接收 X 值 | | trackRangeXMax | double | 跟踪最大范围 | | trackStartXPoint | double | 跟踪开始 X 点 | ### 请求示例 ```json { "conveyorID": 1, "position": { "receLatestPos": 0.0, "trackRangeXMax": 0.0, "trackStartXPoint": 0.0 }, "robot": 1 } ``` --- ## 0x8201 上位机发送,轨道传送位置查询 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8202 控制器回复,轨道传送位置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | position | object | 位置参数对象 | - | | robot | int | 机器人号 | [1,4] | ### position 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | calibrationFlag | array | 标定标志,前三个分别表示"最迟接收坐标"、"跟踪最大范围坐标"、"跟踪开始坐标"是否被标定 | | posToMove | array | 前三个数组分别是最迟接收坐标、跟踪最大范围坐标、跟踪开始坐标 | | receLatestPos | double | 最迟接收 X 值 | | trackRangeXMax | double | 跟踪最大范围 | | trackStartXPoint | double | 跟踪开始 X 点 | ### 响应示例 ```json { "conveyorID": 1, "position": { "calibrationFlag": [0, 0, 0, 0, 0, 0, 0], "posToMove": [ [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] ], "receLatestPos": 0.0, "trackRangeXMax": 0.0, "trackStartXPoint": 0.0 }, "robot": 1 } ``` --- ## 0x8210 上位机发送,传送带传送参数设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyor | object | 传送带参数对象 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | track | object | 轨道参数对象 | - | ### conveyor 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | encoderDirection | int | 编码器方向:1正向,-1负向 | - | | encoderResolution | double | 分辨率(线/mm) | [0,10000] | | encoderValue | string | 编码器值 | - | | encoder_num | int | 编码器编号 | - | | encoder_sum | int | 编码器总数 | - | | maxEncoderVal | string | 编码器最大值 | - | | minEncoderVal | string | 编码器最小值 | - | | posRecordMode | int | 位置模式:0编码器,1恒速设置 | [0,1] | | speed | double | 编码器速度(mm/s) | - | ### track 子参数 | 参数名 | 类型 | 描述 | 单位 | |--------|------|------|------| | arch_height | int | 门型高度 | mm | | arch_straight_len | int | 门型直线距离 | mm | ### 请求示例 ```json { "conveyor": { "encoderDirection": 1, "encoderResolution": 44.33, "encoderValue": "0", "encoder_num": 1, "encoder_sum": 0, "maxEncoderVal": "2147483647", "minEncoderVal": "-2147483648", "posRecordMode": 0, "speed": 0.0 }, "conveyorID": 1, "robot": 1, "track": { "arch_height": 30, "arch_straight_len": 10 } } ``` --- ## 0x8211 上位机发送,查询传送带传送参数 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8212 控制器返回,传送带传送参数 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyor | object | 传送带参数对象 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | track | object | 轨道参数对象 | - | ### conveyor 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | encoderDirection | int | 编码器方向:1正向,-1负向 | - | | encoderResolution | double | 分辨率(线/mm) | [0,10000] | | encoderValue | string | 编码器值 | - | | encoder_num | int | 编码器编号 | - | | encoder_sum | int | 编码器总数 | - | | maxEncoderVal | string | 编码器最大值 | - | | minEncoderVal | string | 编码器最小值 | - | | posRecordMode | int | 位置模式:0编码器,1恒速设置 | [0,1] | | speed | double | 编码器速度(mm/s) | - | ### track 子参数 | 参数名 | 类型 | 描述 | 单位 | |--------|------|------|------| | arch_height | int | 门型高度 | mm | | arch_straight_len | int | 门型直线距离 | mm | ### 响应示例 ```json { "conveyor": { "encoderDirection": 1, "encoderResolution": 44.33, "encoderValue": "0", "encoder_num": 1, "encoder_sum": 0, "maxEncoderVal": "2147483647", "minEncoderVal": "-2147483648", "posRecordMode": 0, "speed": 0.0 }, "conveyorID": 1, "robot": 1, "track": { "arch_height": 30, "arch_straight_len": 10 } } ``` --- ## 0x8213 传送带传送位置检查参数设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | detectSrc | object | 检测源参数对象 | - | | robot | int | 机器人号 | [1,4] | ### detectSrc 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | DI_capturePos | int | 绑定触发信号 IO | 与当前 IO 数量有关 | | filter_data_missing_triggered_latch_data_ | bool | 是否过滤未触发锁存的信号 | - | | sensorTrg | int | 传感器触发方式:0下降沿触发,1上升沿触发 | [0,1] | | type | int | 检测和识别类型:0传感器,1视觉,2传感器+视觉,3全局变量+modbus,4全局变量+视觉 | [0,4] | | visionID | int | 视觉工艺号 | [1,9] | | vision_io_filter_type | int | 视觉过滤类型:0信号触发过滤,1信号触发过滤,2无过滤 | [0,2] | | vision_latch_encoder_value_type | int | 视觉锁存编码器值类型:0视觉触发锁存,1收到数据锁存 | [0,1] | ### 请求示例 ```json { "conveyorID": 1, "detectSrc": { "DI_capturePos": 0, "filter_data_missing_triggered_latch_data_": true, "sensorTrg": 0, "sensor_safe_trigger_interval": 1.0, "type": 2, "visionID": 1, "vision_io_filter_type": 0, "vision_latch_encoder_value_type": 1 }, "robot": 1 } ``` --- ## 0x8214 上位机发送,传送带传送位置检查参数查询 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8215 控制器回复,传送带传送位置检查参数接收 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | detectSrc | object | 检测源参数对象 | - | | robot | int | 机器人号 | [1,4] | ### detectSrc 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | DI_capturePos | int | 绑定触发信号 IO | 与当前 IO 数量有关 | | filter_data_missing_triggered_latch_data_ | bool | 是否过滤未触发锁存的信号 | - | | sensorTrg | int | 传感器触发方式:0下降沿触发,1上升沿触发 | [0,1] | | type | int | 检测和识别类型:0传感器,1视觉,2传感器+视觉,3全局变量+modbus,4全局变量+视觉 | [0,4] | | visionID | int | 视觉工艺号 | [1,9] | | vision_io_filter_type | int | 视觉过滤类型:0信号触发过滤,1信号触发过滤,2无过滤 | [0,2] | | vision_latch_encoder_value_type | int | 视觉锁存编码器值类型:0视觉触发锁存,1收到数据锁存 | [0,1] | ### 响应示例 ```json { "conveyorID": 1, "detectSrc": { "DI_capturePos": 0, "filter_data_missing_triggered_latch_data_": true, "sensorTrg": 0, "sensor_safe_trigger_interval": 1.0, "type": 2, "visionID": 1, "vision_io_filter_type": 0, "vision_latch_encoder_value_type": 1 }, "robot": 1 } ``` --- ## 0x8218 上位机发送,传送带用户坐标设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | sensorPos | object | 传感器位置 | - | | userCoord | int | 用户坐标系号 | [1,999] | | userFrame | array | 用户坐标系 | double 类型数组 | ### sensorPos 子参数 | 参数名 | 类型 | |--------|------| | X | double | | Y | double | | Z | double | | A | double | | B | double | | C | double | ### 请求示例 ```json { "conveyorID": 1, "robot": 1, "sensorPos": { "A": 0.0, "B": 0.0, "C": 0.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }, "userCoord": 1, "userFrame": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 0x8219 上位机发送,传送带用户坐标查询 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x821A 控制器回复,传送带用户坐标接收 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | sensorPos | object | 传感器位置(弧度) | - | | sensorPosDeg | object | 传感器位置(角度) | - | | userCoord | int | 用户坐标系号 | [1,999] | | userFrame | array | 用户坐标系(弧度) | double 类型数组 | | userFrameDeg | array | 用户坐标系(角度) | double 类型数组 | ### sensorPos / sensorPosDeg 子参数 | 参数名 | 类型 | |--------|------| | X | double | | Y | double | | Z | double | | A | double | | B | double | | C | double | ### 响应示例 ```json { "conveyorID": 1, "robot": 1, "sensorPos": { "A": 0.0, "B": 0.0, "C": 0.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }, "sensorPosDeg": { "A": 0.0, "B": 0.0, "C": 0.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }, "userCoord": 1, "userFrame": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "userFrameDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 0x821B 设置传送带过滤参数 > 命令字:0x821B ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | threshold_pos | array | 对应 xyzabc 的阈值 | - | | angle_filter_enable | bool | 视觉过滤的角度过滤使能 | - | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "threshold_pos": [10, 10, 10, 10, 10, 10], "angle_filter_enable": true } ``` --- ## 0x821C 查询传送带过滤参数 > 命令字:0x821C ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x821D 回复传送带过滤参数 > 命令字:0x821D ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | vision_filter_shreshold | object | 过滤阈值参数对象 | - | ### vision_filter_shreshold 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | angle_filter_enable | bool | 视觉过滤的角度过滤使能 | | threshold_pos | array | xyz 的过滤阈值(double 类型数组) | ### 响应示例 ```json { "robot": 1, "conveyorID": 1, "vision_filter_shreshold": { "angle_filter_enable": false, "threshold_pos": [10, 5, 5, 0.1, 0.1, 0.1] } } ``` --- ## 0x8226 传送带传感器标定 > 命令字:0x8226 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | posNum | int | 标定步骤的第几点 | [1,4] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "posNum": 1 } ``` --- ## 0x8227 取消传送带传感器标定 > 命令字:0x8227 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8229 查询传送带数据源和识别类型 > 命令字:0x8229 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8230 回复传送带数据源和识别类型 > 命令字:0x8230 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | detectSrc | object | 检测源参数对象 | - | | identification | object | 识别参数对象 | - | ### detectSrc 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | type | int | 数据源类型:0视觉,1IO,2全局变量 | [0,2] | ### identification 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | type | int | 识别类型:0视觉,1传感器 | [0,1] | ### 响应示例 ```json { "robot": 1, "conveyorID": 1, "detectSrc": { "type": 0 }, "identification": { "type": 0 } } ``` --- ## 0x8231 传感器传送带标定计算结果 > 命令字:0x8231 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8232 传送带视觉标定 > 命令字:0x8232 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "step": 1 } ``` --- ## 0x8233 查询传送带视觉标定数据 > 命令字:0x8233 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "step": 1 } ``` --- ## 0x8234 清除传送带标定数据 > 命令字:0x8234 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "step": 1 } ``` --- ## 0x8235 回复传送带标定数据 > 命令字:0x8235 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | | U1 | double | 第一步像素坐标的 X 坐标 | | | V1 | double | 第一步像素坐标的 Y 坐标 | | | encodorValue | string | 第一步的编码器值 | | | X2 | double | 第二步的 X 坐标 | | | Y2 | double | 第二步的 Y 坐标 | | | Z2 | double | 第二步的 Z 坐标 | | | X3 | double | 第三步的 X 坐标 | | | Y3 | double | 第三步的 Y 坐标 | | | Z3 | double | 第三步的 Z 坐标 | | | encoder_resolution | double | 第三步的编码器分辨率 | | | U4 | double | 第四步的像素坐标的 X 坐标 | | | V4 | double | 第四步的像素坐标的 Y 坐标 | | | X5 | double | 第五步的 X 坐标 | | | Y5 | double | 第五步的 Y 坐标 | | | Z5 | double | 第五步的 Z 坐标 | | | X6 | double | 第六步的 X 坐标 | | | Y6 | double | 第六步的 Y 坐标 | | | Z6 | double | 第六步的 Z 坐标 | | ### 各步骤请求示例 **第一步:** ```json { "robot": 1, "conveyorID": 1, "step": 1, "U1": 0, "V1": 0, "encodorValue": "0" } ``` **第二步:** ```json { "robot": 1, "conveyorID": 1, "step": 2, "X2": 0, "Y2": 0, "Z2": 0, "encodorValue": "0" } ``` **第三步:** ```json { "robot": 1, "conveyorID": 1, "step": 3, "X3": 0, "Y3": 0, "Z3": 0, "encodorValue": "0", "encoder_resolution": 0.0 } ``` **第四步:** ```json { "robot": 1, "conveyorID": 1, "step": 4, "U4": 0, "V4": 0, "encodorValue": "0" } ``` **第五步:** ```json { "robot": 1, "conveyorID": 1, "step": 5, "X5": 0, "Y5": 0, "Z5": 0, "encodorValue": "0" } ``` **第六步:** ```json { "robot": 1, "conveyorID": 1, "step": 6, "X6": 0, "Y6": 0, "Z6": 0 } ``` --- ## 0x8236 视觉传送带标定计算结果 > 命令字:0x8236 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8237 设置传送带进阶参数 > 命令字:0x8237 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | compensation | object | 补偿参数对象 | - | | compensation_acc_multiple | double | 偏差开始段加速度倍数 | - | | compensation_max_len | double | 单次补偿最大距离 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | exception | object | 异常参数对象 | - | | is_start_smoothly | bool | 平滑跟踪是否启动 | - | | obj_distribute_proportion | int | 多机:下一台机对象分配比例 | - | | robot | int | 机器人号 | [1,4] | | start_acc_multiple | double | 同步开始段加速度倍数 | - | | stop_acc_multiple | double | 同步结束段加速度倍数 | - | | sync_param | object | 同步 PID 参数对象 | - | ### compensation 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | distance | double | 编码器补偿距离 | | encoderVal | string | 编码器补偿编码器值 | | time | double | 编码器补偿时间 | ### exception 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | multiple_of_axis_max_vel | double | 警告并放弃同步的速度阈值倍数 | ### sync_param 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | kd | double | 同步 PID 比例系数 | | ki | double | 同步 PID 积分系数 | | kp | double | 同步 PID 微分系数 | | limit_acc_multiple | double | 同步 PID 限输出加速度倍率 | | max_out | double | 同步 PID 限幅 | ### 请求示例 ```json { "compensation": { "distance": 0.0, "encoderVal": "0", "time": 10.0 }, "compensation_acc_multiple": 20.0, "compensation_max_len": 8.0, "conveyorID": 1, "exception": { "multiple_of_axis_max_vel": 0.950 }, "is_start_smoothly": false, "obj_distribute_proportion": 100, "robot": 1, "start_acc_multiple": 20.0, "stop_acc_multiple": 20.0, "sync_param": { "kd": 0.050, "ki": 0.050, "kp": 0.40, "limit_acc_multiple": 0.40, "max_out": 0.60 } } ``` --- ## 0x8238 查询传送带进阶参数 > 命令字:0x8238 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8239 回复传送带进阶参数 > 命令字:0x8239 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | compensation | object | 补偿参数对象 | - | | compensation_acc_multiple | double | 偏差开始段加速度倍数 | - | | compensation_max_len | double | 单次补偿最大距离 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | exception | object | 异常参数对象 | - | | is_start_smoothly | bool | 平滑跟踪是否启动 | - | | obj_distribute_proportion | int | 多机:下一台机对象分配比例 | - | | robot | int | 机器人号 | [1,4] | | start_acc_multiple | double | 同步开始段加速度倍数 | - | | stop_acc_multiple | double | 同步结束段加速度倍数 | - | | sync_param | object | 同步 PID 参数对象 | - | ### compensation 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | distance | double | 编码器补偿距离 | | encoderVal | string | 编码器补偿编码器值 | | time | double | 编码器补偿时间 | ### exception 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | multiple_of_axis_max_vel | double | 警告并放弃同步的速度阈值倍数 | ### sync_param 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | kd | double | 同步 PID 比例系数 | | ki | double | 同步 PID 积分系数 | | kp | double | 同步 PID 微分系数 | | limit_acc_multiple | double | 同步 PID 限输出加速度倍率 | | max_out | double | 同步 PID 限幅 | ### 响应示例 ```json { "compensation": { "distance": 0.0, "encoderVal": "0", "time": 10.0 }, "compensation_acc_multiple": 20.0, "compensation_max_len": 8.0, "conveyorID": 1, "exception": { "multiple_of_axis_max_vel": 0.950 }, "is_start_smoothly": false, "obj_distribute_proportion": 100, "robot": 1, "start_acc_multiple": 20.0, "stop_acc_multiple": 20.0, "sync_param": { "kd": 0.050, "ki": 0.050, "kp": 0.40, "limit_acc_multiple": 0.40, "max_out": 0.60 } } ``` --- ## 0x823A 多机通讯测试 > 命令字:0x823A ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x823B 多机通讯测试数据回复 > 命令字:0x823B ### 参数说明 | 参数名 | 类型 | 描述 | |--------|------|------| | recvTargetData | string | 和相机设置的数据格式一致 | ### 响应示例 ```json { "recvTargetData": "xxx,xxx,xxx" } ``` > **注意:** 0x821E、0x821F 已删除(这两个命令字不再使用)。 --- ## 传送带同步原理 ### 同步跟踪基本流程 传送带同步跟踪系统通过编码器实时获取传送带位置,动态调整机器人轨迹,使机器人与移动中的工件保持同步。 #### 同步阶段 1. **检测与识别阶段**:传感器或视觉检测到工件,记录当前编码器值 2. **跟踪等待阶段**:工件进入跟踪范围内,机器人准备抓取 3. **同步运动阶段**:机器人与传送带同步运动,末端执行器与工件保持相对静止 4. **抓取/操作阶段**:在同步过程中完成抓取、放置等操作 5. **返回阶段**:操作完成后机器人返回初始位置 ### 同步位置关系 传送带跟踪中的关键位置参数: | 参数 | 说明 | 单位 | |------|------|------| | trackStartXPoint | 跟踪开始 X 点(工件进入跟踪范围的位置) | mm | | trackRangeXMax | 跟踪最大范围 X 值(工件超出此范围则放弃) | mm | | receLatestPos | 最迟接收 X 值(工件最晚被接收的位置) | mm | #### 跟踪窗口示意 在跟踪开始点和跟踪最大范围之间,机器人与传送带同步运动。超过跟踪最大范围或未在最迟接收位置前收到数据,则放弃该工件。 ### PID同步控制参数 同步过程中使用 PID 控制器实现平稳的传送带跟踪: | 参数 | 说明 | 典型值 | 调节 | |------|------|--------|------| | kp | 同步 PID 比例系数 | 0.2~0.8 | 增大可加快同步响应 | | ki | 同步 PID 积分系数 | 0.01~0.1 | 消除同步稳态误差 | | kd | 同步 PID 微分系数 | 0.01~0.1 | 减小同步超调 | | max_out | 同步 PID 限幅 | 0.3~1.0 | 限制最大同步速度 | | limit_acc_multiple | 同步 PID 限输出加速度倍率 | 0.2~0.8 | 防止加速度过大 | --- ## 位置补偿 ### 编码器位置补偿 编码器位置补偿用于修正由于编码器误差或机械传动导致的传送带位置偏差。 #### 补偿参数 | 参数 | 说明 | 单位 | |------|------|------| | compensation.distance | 编码器补偿距离 | mm | | compensation.encoderVal | 编码器补偿编码器值 | 脉冲数 | | compensation.time | 编码器补偿时间 | s | | compensation_acc_multiple | 偏差开始段加速度倍数 | - | | compensation_max_len | 单次补偿最大距离 | mm | #### 补偿公式 实际传送带位置 = 编码器原始值 / 编码器分辨率 + 补偿偏移量 其中补偿偏移量 = compensation.distance * (经过时间 / compensation.time) ### 同步开始/结束段加速度控制 | 参数 | 说明 | 典型值 | |------|------|--------| | start_acc_multiple | 同步开始段加速度倍数 | 10~50 | | stop_acc_multiple | 同步结束段加速度倍数 | 10~50 | | is_start_smoothly | 平滑跟踪是否启动 | true/false | 当 is_start_smoothly=true 时,机器人进入和退出同步的运动更加平滑,减少机械冲击。 ### 异常处理 | 参数 | 说明 | 典型值 | |------|------|------| | exception.multiple_of_axis_max_vel | 警告并放弃同步的速度阈值倍数 | 0.8~0.95 | 当同步所需速度超过 轴最大速度 * multiple_of_axis_max_vel 时,系统发出警告并放弃对该工件的同步跟踪。 ### 多机协同对象分配 | 参数 | 说明 | |------|------| | obj_distribute_proportion | 多机场景下分配给下一台机器人的对象比例(百分比) | 当多台机器人共享一条传送带时,通过此参数控制工件分配的负载均衡。 ### 视觉过滤参数 用于传送带跟踪中视觉数据的过滤: | 参数 | 说明 | |------|------| | threshold_pos | xyzabc 各轴的过滤阈值 | | angle_filter_enable | 角度过滤使能 | 当视觉返回的位置数据与上一次数据在各轴上的偏差超过阈值时,该数据被过滤丢弃。 ### 位置补偿调试 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 抓取位置偏前 | 编码器补偿过大 | 减小 compensation.distance | | 抓取位置偏后 | 编码器补偿不足或延迟 | 增大 compensation.distance 或 compensation.time | | 同步过程中抖动 | PID参数不当 | 降低 kp,增大 kd | | 同步启动冲击大 | start_acc_multiple 过大 | 降低加速度倍数或启用平滑跟踪 | | 频繁放弃工件 | 传送带速度太快 | 降低传送带速度或增大 trackRangeXMax | --- # 寻位跟踪 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/04.%E5%AF%BB%E4%BD%8D%E8%B7%9F%E8%B8%AA.html ## 跟踪 ### 跟踪传感器类型 #### 设置跟踪传感器类型 - **命令字:** `0x8740` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | fileNum | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | sensorType | int | [0,2] | 跟踪类型:0-线激光,1-电弧,2-弧压 | **请求示例:** ```json { "fileNum": 1, "robot": 1, "sensorType": 0 } ``` #### 查询跟踪传感器类型 - **命令字:** `0x8741` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | fileNum | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "fileNum": 1, "robot": 1 } ``` #### 返回跟踪传感器类型 - **命令字:** `0x8742` - **方向:** 上位机接收 - **data:** 同0x8740 --- ### 电弧通讯参数 #### 设置电弧通讯参数 - **命令字:** `0x874d` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | dataType | int | [0,1] | 采样数据类型:0-电流,1-电压 | | period | int | [0,1000]ms | 采样周期 | | std_low_weight_threshold | double | [3,20] | 噪声阈值,噪声超限后偏差权重降低 | **请求示例:** ```json { "craftid": 1, "robot": 1, "sampling": { "dataType": 0, "period": 20, "std_low_weight_threshold": 3.0 } } ``` #### 查询电弧通讯参数 - **命令字:** `0x874e` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧通讯参数 - **命令字:** `0x874f` - **方向:** 上位机接收 - **data:** 同0x874d --- ### 电弧补偿参数 #### 设置电弧跟踪左右补偿参数 - **命令字:** `0x8750` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | accFactor | double | [0.1,10] | 补偿加速度倍数,对应当前运动指令加速度 | | algorithmType | int | [0,1] | 偏差提取类型:0-均值,1-手填值 | | beginCycleNum | int | [1,100] | 开始采样周期数 | | differential | double | [0,1] | 微分系数 | | integral | double | [0,1] | 积分系数 | | maxSingleLen | double | [0,10] | 每次最大补偿量 | | scale | double | [0,1] | 比例系数 | | switchon | bool | true/false | 补偿开关:true-打开,false-关闭 | | deviation_dead_band | double | [0,20] | 偏差死区,死区内偏差不纠偏 | | filter_level | int | [1,9] | 偏差滤波等级 | **请求示例:** ```json { "craftid": 1, "lateralCompensation": { "accFactor": 1.0, "algorithmType": 0, "beginCycleNum": 4, "differential": 0.0, "integral": 0.00050, "maxSingleLen": 2.0, "scale": 0.050, "switchon": true, "deviation_dead_band": 0.0, "filter_level": 1 }, "robot": 1 } ``` #### 查询电弧跟踪左右补偿参数 - **命令字:** `0x8751` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧跟踪左右补偿参数 - **命令字:** `0x8752` - **方向:** 上位机接收(控制器返回) - **data:** 同0x8750 #### 设置电弧跟踪高低补偿参数 - **命令字:** `0x8753` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | accFactor | double | [0.1,10] | 补偿加速度倍数,对应当前运动指令加速度 | | algorithmType | int | [0,1] | 偏差提取类型:0-均值,1-手填值 | | beginCycleNum | int | [1,100] | 开始采样周期数 | | custom_value | double | [0,1000]A | 偏差提取类型手填值 | | differential | double | [0,1] | 微分系数 | | integral | double | [0,1] | 积分系数 | | maxSingleLen | double | [0,10] | 每次最大补偿量 | | scale | double | [0,1] | 比例系数 | | switchon | bool | true/false | 补偿开关:true-打开,false-关闭 | | deviation_dead_band | double | [0,20] | 偏差死区,死区内偏差不纠偏 | | filter_level | int | [1,9] | 偏差滤波等级 | | base_ema_alpha | double | [0,0.5] | 基准计算滤波系数,指数移动平均系数;基准选择自动时可修改,手填时置灰 | **请求示例:** ```json { "craftid": 1, "robot": 1, "verticalCompensation": { "accFactor": 1.0, "algorithmType": 0, "beginCycleNum": 4, "custom_value": 0.0, "differential": 0.0, "integral": 0.00050, "maxSingleLen": 0.50, "scale": 0.050, "switchon": true, "deviation_dead_band": 0.0, "filter_level": 1, "base_ema_alpha": 0.0 } } ``` #### 查询电弧跟踪高低补偿参数 - **命令字:** `0x8754` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧跟踪高低补偿参数 - **命令字:** `0x8755` - **方向:** 控制器发送 - **data:** 同0x8753 #### 设置电弧跟踪路径数据记录 - **命令字:** `0x8756` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | cycle | double | [1,1000000000]mm | 跟踪路径数据记录周期 | | type | int | [0,1] | 跟踪路径数据记录方式:0-距离,1-时间 | **请求示例:** ```json { "craftid": 1, "robot": 1, "track_path_record": { "cycle": 30.0, "type": 0 } } ``` #### 查询电弧跟踪路径数据记录 - **命令字:** `0x8757` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧跟踪路径数据记录 - **命令字:** `0x8758` - **方向:** 控制器发送 - **data:** 同0x8756 --- ## 寻位算法参数 寻位跟踪系统通过传感器实时采集焊缝位置偏差,结合 PID 控制算法对机器人轨迹进行动态补偿,确保焊枪始终对准焊缝中心。 ### 寻位偏差计算原理 系统通过采样传感器数据(电流/电压/激光轮廓)提取焊缝左右偏差和高低偏差: 1. **数据采集**:按采样周期采集传感器原始数据 2. **偏差提取**:根据算法类型(均值/手填值)计算当前周期的偏差值 3. **PID 补偿**:使用比例(P)、积分(I)、微分(D)控制算法计算补偿量 4. **运动叠加**:将补偿量叠加到当前运动指令上 ### PID 补偿算法参数详解 | 参数 | 说明 | 推荐范围 | 调节建议 | |------|------|----------|----------| | scale(比例系数 Kp) | 控制补偿响应速度 | 0.01~0.5 | 增大可加快响应但可能引起振荡 | | integral(积分系数 Ki) | 消除稳态误差 | 0.0001~0.01 | 增大可消除静差但可能引起超调 | | differential(微分系数 Kd) | 抑制振荡,预测趋势 | 0.0~0.5 | 增大可抑制振荡但可能引入噪声 | | maxSingleLen | 每次补偿量上限(mm) | 0.1~10 | 防止单步补偿过大导致抖动 | | accFactor | 补偿加速度倍数 | 0.1~10 | 控制补偿运动的加速度 | | beginCycleNum | 起始采样周期数 | 1~100 | 起始阶段采集多少个周期后开始补偿 | ### 算法类型说明 | 类型值 | 名称 | 说明 | |--------|------|------| | 0 | 均值法 | 取多个采样周期的偏差平均值作为当前偏差,平滑效果好 | | 1 | 手填值 | 使用预设的固定偏差值 custom_value,适用于已知偏差量场景 | --- ## 跟踪模式详解 ### 传感器类型与适用场景 | 传感器类型 | 值 | 适用工艺 | 优点 | 缺点 | |------------|-----|----------|------|------| | 线激光 | 0 | 焊接、切割 | 精度高,可同时获取左右和高低偏差 | 成本较高,对工件表面反光敏感 | | 电弧 | 1 | 焊接 | 成本低,不受弧光干扰 | 精度中等,需电弧稳定 | | 弧压 | 2 | 等离子切割 | 适合高度跟踪 | 仅能获取高低偏差 | ### 跟踪模式工作流程 #### 1. 初始化阶段 - 设置传感器类型(0x8740) - 配置电弧通讯参数(采样类型、周期、噪声阈值) - 设置左右/高低补偿参数(PID 参数、开关) #### 2. 运行阶段 1. 传感器持续采集数据 2. 系统按采样周期提取偏差 3. 根据算法类型计算当前偏差值 4. PID 控制器输出补偿量(受 maxSingleLen 限制) 5. 补偿量叠加到当前运动轨迹 #### 3. 数据记录(调试用) - 可通过 0x8756 设置路径数据记录 - 支持按距离或按时间两种记录方式 - 记录周期范围:1~1000000000 mm 或对应时间 ### 补偿策略选择 | 场景 | 建议参数 | 说明 | |------|----------|------| | 直线焊缝 | Kp=0.1, Ki=0.001, Kd=0 | 平稳跟踪,避免过调 | | 曲线焊缝 | Kp=0.2, Ki=0.005, Kd=0.05 | 需要更快响应 | | 薄板焊接 | Kp=0.05, Ki=0.0005, maxSingleLen=0.5 | 防止过补偿导致焊穿 | | 厚板多层焊 | Kp=0.3, Ki=0.01, maxSingleLen=3 | 允许较大补偿量 | ### 补偿数据流 传感器信号 -> 采样滤波 -> 偏差提取(算法类型) -> PID 计算(Kp, Ki, Kd) -> 限幅(maxSingleLen) -> 加速度平滑(accFactor) -> 轨迹叠加 -> 机器人运动 ### 故障排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 跟踪振荡 | Kp过大 | 减小比例系数 | | 跟踪滞后 | Kp过小或Ki过小 | 增大Kp或Ki | | 补偿超调 | Ki过大或maxSingleLen过大 | 减小Ki或限制单次补偿量 | | 噪声敏感 | 噪声阈值设置不当 | 增大噪声阈值或改用均值法 | | 补偿方向错误 | 传感器安装方向或编码器方向 | 检查传感器安装和参数符号 | --- # 视觉工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/05.%E8%A7%86%E8%A7%89%E5%B7%A5%E8%89%BA.html ## 试拍照(0x8125) **说明:** 上位机发送,试拍照 **命令字:** `0x8125` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | cali_camera_angle | bool | 是 | 是否记录工件旋转角度 | true: 记录, false: 不记录 | | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | ### 请求示例 ```json { "cali_camera_angle": false, "robot": 1, "visionNum": 0 } ``` --- ## 拍照结果(0x8126) **说明:** 控制器返回拍照结果 **命令字:** `0x8126` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | cameraPoint | double[6] | 是 | 相机坐标点 | - | | protocol.type | int | 是 | 数据解析类型 | 0: 2维, 1: 2维+高度, 2: 3维 | | camera_angle | double | 是 | 工件旋转角度 | [-180, 180] | | cameraData | string | 是 | 接收数据 | - | ### 响应示例 ```json { "cameraPoint": [0, 0, 0, 0, 0, 0], "protocol": { "type": 0 }, "camera_angle": 0, "cameraData": "" } ``` --- ## 视觉标定(0x8150) **说明:** 上位机发送,下发标定点及标定参数用于视觉标定(手眼标定) **命令字:** `0x8150` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | camera_position_by_robot | int | 是 | 相机相对机器人位置(标定方式) | 0: 眼在手上;1: 眼在手外 | | calibration | object | 是 | 标定数据 | - | | calibration.point_num | int | 是 | 标定点数量 | - | | calibration.point | array | 是 | 标定点集合 | - | | calibration.point[].pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位 | - | | calibration.point[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | eye_to_hand_calibration | object | 是 | 眼在手外标定参数 | - | | eye_to_hand_calibration.angle_setting | double | 是 | 角度设置 | - | | eye_to_hand_calibration.select_template | int | 是 | 选择模板 | - | | eye_to_hand_calibration.step_angle | double | 是 | 步进角度 | - | | eye_to_hand_calibration.step_setting | double | 是 | 步进设置 | - | | eye_to_hand_calibration.tool_num | int | 是 | 工具号 | - | ### 请求示例 ```json { "calibration": { "point": [ {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]} ], "point_num": 9 }, "camera_position_by_robot": 0, "eye_to_hand_calibration": { "angle_setting": 5.0, "select_template": 0, "step_angle": 5.0, "step_setting": 5.0, "tool_num": 1 }, "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定查询(0x8151) **说明:** 上位机发送,查询视觉标定数据 **命令字:** `0x8151` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | ### 响应示例 ```json { "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定数据(0x8152) **说明:** 控制器返回,获取到的视觉标定数据 **命令字:** `0x8152` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | camera_position_by_robot | int | 是 | 相机相对机器人位置(标定方式) | - | | target_pos_calibrated | bool | 是 | 目标点是否已标定 | true: 已标定, false: 未标定 | | calibration | object | 是 | 标定数据 | - | | calibration.calc_result | double | 是 | 标定计算结果 | - | | calibration.calibrated | bool | 是 | 是否已标定 | true: 已标定, false: 未标定 | | calibration.point_num | int | 是 | 标定点数量 | - | | calibration.point | array | 是 | 标定点集合 | - | | calibration.point[].pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - | | calibration.point[].pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - | | calibration.point[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | calibration.point[].robot_pos_deg | double[7] | 是 | 标定点机器人角度坐标,定长 7 位,姿态用角度单位 | - | | calibration.target_pos_calibrated | bool | 是 | 目标点是否已标定 | true: 已标定, false: 未标定 | | eye_to_hand_calibration | object | 是 | 眼在手外标定参数 | - | | eye_to_hand_calibration.angle_setting | double | 是 | 角度设置 | - | | eye_to_hand_calibration.select_template | int | 是 | 选择模板 | - | | eye_to_hand_calibration.step_angle | double | 是 | 步进角度 | - | | eye_to_hand_calibration.step_setting | double | 是 | 步进设置 | - | | eye_to_hand_calibration.tool_num | int | 是 | 工具号 | - | ### 请求示例 ```json { "calibration": { "calc_result": 0.0, "calibrated": false, "point": [ {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]} ], "point_num": 9, "target_pos_calibrated": false }, "camera_position_by_robot": 4, "eye_to_hand_calibration": { "angle_setting": 5.0, "select_template": 0, "step_angle": 5.0, "step_setting": 5.0, "tool_num": 1 }, "robot": 1, "target_pos_calibrated": false, "visionNum": 0 } ``` --- ## 视觉标定点查询(0x8153) **说明:** 上位机发送,查询标定点数据 **命令字:** `0x8153` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | ### 响应示例 ```json { "point_num": 1, "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定点数据(0x8154) **说明:** 控制器返回,标定点数据 **命令字:** `0x8154` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | | pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - | | pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - | | robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | robot_pos_deg | double[7] | 是 | 标定点机器人角度坐标,定长 7 位,姿态用角度单位 | - | ### 响应示例 ```json { "pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "point_num": 1, "robot": 1, "robot_pos": [557.984545757289, -5.704418391263, 1056.73931896607, -3.085566393119, 0.021842103824, -3.047913696756, 0.0], "robot_pos_deg": [557.984545757289, -5.704418391263, 1056.73931896607, -176.789931733112, 1.251460364796, -174.632591144215, 0.0], "visionNum": 0 } ``` --- ## 运行至标定点(0x8155) **说明:** 上位机发送,运行至该标定点 **命令字:** `0x8155` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | ### 请求示例 ```json { "point_num": 1, "robot": 1, "visionNum": 1 } ``` --- ## 清除标定点(0x8156) **说明:** 上位机发送,清除指定标定点 **命令字:** `0x8156` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | ### 请求示例 ```json { "point_num": 3, "robot": 1, "visionNum": 0 } ``` --- ## 眼在手外自动标定运行(0x8157) **说明:** 上位机发送,眼在手外自动标定运行 **命令字:** `0x8157` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | ### 请求示例 ```json { "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定像素数据(0x8158) **说明:** 控制器返回,标定点对应的像素坐标数据 **命令字:** `0x8158` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | | pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - | | pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - | ### 响应示例 ```json { "robot": 1, "visionNum": 0, "point_num": 1, "pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 手眼标定计算(0x8160) **说明:** 上位机发送,根据 socket 数据计算转换矩阵(手眼标定) **命令字:** `0x8160` `VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | camera_type | int | 是 | 相机类型 | 0: 2D;1: 3D(扩展,暂不支持) | | calculation_type | int | 是 | 标定计算类型 | 0: 眼在手上固定姿态的手眼标定(如眼在三轴直角机器人上);1: 眼在手上变姿态的手眼标定(如眼在四轴 SCARA、六轴串联上);2: 眼在手外的手眼标定 | | base_robot_pos | double[7] | 是 | 基准机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | mark_pos | array | 是 | 标定点集合(共 9 个点) | - | | mark_pos[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | mark_pos[].camera_pos | double[7] | 是 | 标定点像素坐标,定长 7 位 | - | ### 请求示例 ```json { "robot": 1, "camera_type": 0, "calculation_type": 0, "base_robot_pos": [0, 0, 0, 0, 0, 0, 0], "mark_pos": [ { "robot_pos": [0, 0, 0, 0, 0, 0, 0], "camera_pos": [0, 0, 0, 0, 0, 0, 0] }, { "robot_pos": [0, 0, 0, 0, 0, 0, 0], "camera_pos": [0, 0, 0, 0, 0, 0, 0] } ] } ``` --- ## 手眼标定计算回复(0x8161) **说明:** 控制器返回手眼标定计算结果(转换矩阵) **命令字:** `0x8161` `VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA_RESPOND` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | result | bool | 是 | 计算是否成功 | true: 成功, false: 失败 | | matrix | double[16] | 是 | 转换矩阵(4×4,行优先共 16 位) | - | ### 响应示例 ```json { "robot": 1, "result": true, "matrix": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` --- ## 视觉目标点计算(0x8162) **说明:** 上位机发送,计算视觉目标点的机器人坐标 **命令字:** `0x8162` `VISION_CALCULATE_TARGET_POS` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | camera_type | int | 是 | 相机类型 | 0: 2D;1: 3D | | calculation_type | int | 是 | 标定计算类型 | 0: 眼在手上;1: 眼在手外 | | robot_pos | double[7] | 是 | 机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | camera_pos | double[7] | 是 | 像素坐标,定长 7 位 | - | | matrix | double[16] | 是 | 手眼标定结果(4×4,行优先共 16 位) | - | ### 请求示例 ```json { "robot": 1, "camera_type": 0, "calculation_type": 0, "robot_pos": [0, 0, 0, 0, 0, 0, 0], "camera_pos": [0, 0, 0, 0, 0, 0, 0], "matrix": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` --- ## 视觉目标点计算回复(0x8163) **说明:** 控制器返回视觉目标点的机器人坐标 **命令字:** `0x8163` `VISION_CALCULATE_TARGET_POS_RESPOND` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | result | bool | 是 | 计算是否成功 | true: 成功, false: 失败 | | robot_pos | double[7] | 是 | 目标点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | ### 响应示例 ```json { "robot": 1, "result": true, "robot_pos": [0, 0, 0, 0, 0, 0, 0] } ``` --- ## 视觉触发方式 视觉触发决定了相机何时拍照并获取图像数据,系统支持多种触发方式以适应不同应用场景。 ### 触发方式对比 | 触发方式 | 实现方式 | 适用场景 | 优点 | 缺点 | |----------|----------|----------|------|------| | 软触发(命令触发) | 上位机发送拍照命令 0x8125 | 单次拍照、调试 | 灵活可控 | 延迟不可控 | | 硬触发(IO触发) | 通过数字IO信号触发相机 | 高速产线、固定工位 | 延迟低、一致性高 | 需额外接线 | | 连续触发 | 相机持续拍照 | 动态检测 | 无遗漏 | 数据量大 | | 编码器触发 | 通过编码器位置触发 | 传送带跟踪 | 位置精确 | 需要编码器 | ### 软触发完整流程 1. 上位机发送试拍照命令 0x8125(含 cali_camera_angle 标志) 2. 控制器转发拍照指令给相机 3. 相机拍照并返回图像数据 4. 控制器通过 0x8126 返回拍照结果(含 cameraData 和 cameraPoint) 5. 上位机解析结果数据进行后续处理 --- ## 视觉结果解析 视觉拍照后返回的数据需要根据不同协议类型进行解析。 ### 数据解析类型 | protocol.type | 名称 | 数据格式 | 适用场景 | |---------------|------|----------|----------| | 0 | 2维 | (X, Y, 角度) | 平面定位、抓取 | | 1 | 2维+高度 | (X, Y, Z, 角度) | 带高度信息的抓取 | | 2 | 3维 | (X, Y, Z, A, B, C) | 三维空间定位 | ### cameraData 解析 cameraData 为字符串类型,根据 protocol.type 不同,解析方式不同: #### 2维数据解析 (type=0) 格式: X,Y,Angle(逗号分隔),X/Y 为像素坐标或物理坐标,Angle 为工件旋转角度(度) #### 2维+高度 (type=1) 格式: X,Y,Z,Angle(逗号分隔),增加高度 Z 信息 #### 3维数据解析 (type=2) 格式: X,Y,Z,A,B,C(逗号分隔),完整的六自由度位姿数据 ### cameraPoint 说明 cameraPoint 为 double[6] 数组,表示拍照时相机在工作坐标系下的位置: - cameraPoint[0]~[2]:X, Y, Z 坐标 (mm) - cameraPoint[3]~[5]:A, B, C 姿态 (弧度) ### camera_angle 说明 工件旋转角度,单位为度,范围 [-180, 180]。仅在 cali_camera_angle=true 时有效返回实际角度。 --- ## 视觉坐标变换 ### 坐标系关系 像素坐标系 -> 相机坐标系 -> 工具坐标系 -> 基座坐标系 (分别通过相机内参、手眼矩阵、法兰变换进行转换) ### 手眼标定矩阵应用 手眼标定得到的 4x4 变换矩阵 matrix(16个元素,行优先),用于将相机坐标转换为机器人坐标。 矩阵格式为行优先的 4x4 齐次变换矩阵,包含旋转分量 R(3x3) 和平移分量 Tx,Ty,Tz。 ### 计算目标点机器人坐标 已知条件: - camera_pos:目标在相机坐标系下的位置 - matrix:手眼标定矩阵 - robot_pos:拍照时机器人的当前位置 计算步骤: 1. 将 camera_pos 通过 matrix 变换到机器人基坐标系下的偏移 2. 将偏移叠加到 robot_pos 上得到最终目标位置 3. 使用 0x8162/0x8163 命令进行此计算 ### 常见视觉配置校验 | 检查项 | 方法 | |--------|------| | 手眼标定精度 | 使用多个验证点检查重投影误差,一般要求 < 0.5mm | | 相机安装稳定性 | 在固定位置连续拍照多次,检查位置重复性 | | 光照条件 | 确保拍照区域光照均匀,避免反光或阴影 | --- # 变量 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/06.%E5%8F%98%E9%87%8F.html ## 获取当前位置 **命令字:** `0x6000` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x6001` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | globalPosition | object | 全局位置变量对象 | | note | object | 注释对象 | `globalPosition` 中每个点位数据为 `double[]` 类型,含义如下: | 位 | 说明 | |----|------| | 0 | 坐标类型:0 关节,1 直角,2 工具,3 用户 | | 1 | 角度制/弧度制:0 弧度制,1 角度制 | | 2 | 左右手:0 无,1 左,2 右 | | 3 | 工具坐标系 | | 4 | 用户坐标系 | | 5、6 | 扩展备用 | | 7~13 | 机器人坐标(共 7 位) | | 14~20 | 外部轴 | ```json { "globalPosition": { "GP0021": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0022": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0023": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0024": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0025": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0026": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0027": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0028": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0029": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0030": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0031": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0032": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0033": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0034": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0035": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0036": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0037": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0038": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0039": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0040": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, "note": { "GP0021": "", "GP0022": "", "GP0023": "", "GP0024": "", "GP0025": "", "GP0026": "", "GP0027": "", "GP0028": "", "GP0029": "", "GP0030": "", "GP0031": "", "GP0032": "", "GP0033": "", "GP0034": "", "GP0035": "", "GP0036": "", "GP0037": "", "GP0038": "", "GP0039": "", "GP0040": "" }, "robot": 1 } ``` ## 设置全局位置变量 > **注意:** 如果是四轴,最后两位补 0。 **命令字:** `0x6002` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | posName | string | 变量名称 | | pos | double[] | 变量数据 | | note | string | 注释 | ```json { "robot": 1, "posName": "GP0001", "pos": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 2, 3.3, 0, 0], "note": "qqq" } ``` ## 查询全局位置变量 **命令字:** `0x6003` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | posName | string | 点位名称 | | initialValue | bool | 初始化,可选发送或不发送 | ```json { "robot": 1, "posName": "GP0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6004` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | initialValue | bool | 初始化 | | posName | string | 点位名称 | | posValue | double[] | 点位数据(弧度制) | | posValueDeg | double[] | 点位数据(角度制) | | note | string | 注释 | ```json { "initialValue": true, "note": "qqq", "posName": "GP0001", "posValue": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posValueDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ## 局部变量 ### 局部变量位置变量 P 点查询 **命令字:** `0x6010` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | ```json { "robot": 1, "varname": "P0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6011` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | pos | double[] | 弧度制点位数据 | | posDeg | double[] | 角度制点位数据 | ```json { "robot": 1, "jobname": "Q1", "varname": "P0001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6] } ``` ### 局部变量位置变量 E 点查询 **命令字:** `0x6012` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | ```json { "robot": 1, "varname": "E0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6013` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | pos | double[] | 弧度制点位数据 | | posDeg | double[] | 角度制点位数据 | ```json { "robot": 1, "jobname": "Q1", "varname": "E0001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } ``` ### 局部变量查询 **命令字:** `0x6014` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | vartype | int | 变量类型:0 int 型,1 double 型,2 bool 型,3 string 型 | | varname | string | 变量名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | identify | string | CommandInsert:插入指令界面变量,VariableReview:监控界面数值变量 | ```json { "robot": 1, "vartype": 1, "varname": "I001", "initialValue": true, "identify": "CommandInsert" } ``` **控制器回复** **命令字:** `0x6015` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | vartype | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varname | string | 变量名称 | | value | double | 若变量为数值类型,通过 value 传输 | | string | string | 若变量为字符串类型,通过 string 传输 | | identify | string | CommandInsert:插入指令界面变量,VariableReview:监控界面数值变量 | ```json { "robot": 1, "jobname": "Q1", "vartype": 1, "varname": "I001", "value": 2, "string": "i'm a string", "identify": "CommandInsert" } ``` ## 全局变量 ### 设置全局变量 **命令字:** `0x6020` | 字段 | 类型 | 说明 | |------|------|------| | varName | string | 变量名称 | | varType | int | 变量类型:0 int 型,1 double 型,2 bool 型,3 string 型 | | varValue | double | 变量值 | | varString | string | 当 varType = 3 时使用此字段传输 | | varNote | string | 注释 | ```json { "varName": "GD001", "varType": 1, "varValue": 14.0, "varString": "oooo", "varNote": "aaa" } ``` ### 获取全局数值变量 **命令字:** `0x6021` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | ```json { "varType": 1 } ``` **控制器回复** **命令字:** `0x6022` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varNum | int | 数值变量个数,范围 [1, 100] | | varList | array | 变量列表 | | varList[].varName | string | 变量名称 | | varList[].varValue | double | 变量值 | | varList[].varNote | string | 注释 | ```json { "varType": 1, "varNum": 2, "varList": [ { "varName": "I001", "varValue": 3, "varNote": "QQQ" }, { "varName": "D002", "varValue": 8.4, "varNote": "hhha" } ] } ``` ### 全局变量注释查询 **命令字:** `0x6023` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | ```json { "varType": 1 } ``` **控制器回复** **命令字:** `0x6024` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varNote | object | 变量注释对象,键为变量名,值为注释内容 | ```json { "varNote": { "GI001": "9999" }, "varType": 1 } ``` ## 全局外部轴变量 ### 设置全局外部轴变量 **命令字:** `0x6025` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | pos | double[] | 点位数据,格式:点位信息(7) + 机器人位置(7) + 外部轴位置(5) + 预留(2) | | note | string | 注释 | ```json { "robot": 1, "varname": "GE0001", "pos": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4], "note": "qqq" } ``` ### 查询全局外部轴变量 **命令字:** `0x6026` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始化值,true:是,false:否 | ```json { "robot": 1, "varname": "GE001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6027` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始化值 | | note | string | 注释 | | posValue | double[] | GP + 外部点(角度制) | | posValueDeg | double[] | GP + 外部点(弧度制) | ```json { "initialValue": true, "note": "qqq", "posValue": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 0.0, 0.0], "posValueDeg": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 0.0, 0.0], "robot": 1, "varname": "GE001" } ``` ### 获取全部全局外部轴点位 **命令字:** `0x6028` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x6029` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | globalExtPosition | object | 点位列表,键为变量名,值为 double[] | | note | object | 注释列表,键为变量名,值为注释字符串 | ```json { "robot": 1, "globalExtPosition": { "GE001": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "GE003": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6] }, "note": { "GE001": "qqqq", "GE002": "", "GE003": "www" } } ``` ## 查询指定坐标下的位置 **命令字:** `0x602A` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | name | string | 点位名称 | | initialValue | bool | 是否为初始化值 | | targetCoord | int | 目标坐标系类型 | ```json { "initialValue": true, "name": "GP0001", "targetCoord": 3 } ``` **控制器回复** **命令字:** `0x602B` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,范围 [1,4] | | posName | string | 点位名称 | | result | int | 坐标系转换是否正确 | | pos | array | 位置信息,0~6 信息,7~13 机器人本体,14~18 外部轴(角度制) | | initialValue | bool | 是否为初始化值 | ```json { "robot": 1, "posName": "GP0001", "result": 0, "pos": [0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "initialValue": true } ``` ## 查询一个全局变量 **命令字:** `0x602C` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型 | | varName | string | 变量名称 | | identity | string | 来源标识:VariableReview 监控界面的全局变量,NumerlcalVarWidget 全局数值变量界面 | ```json { "varType": 1, "varName": "GI001", "identity": "VariableReview" } ``` **控制器回复** **命令字:** `0x602D` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型 | | varName | string | 变量名称 | | identity | string | 来源标识 | | varNote | string | 注释 | | varValue | double | 变量值 | ```json { "varType": 1, "varName": "GI001", "identity": "VariableReview", "varNote": "9999", "varValue": 16.0 } ``` --- # 拖拽示教 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/01.%E5%8D%8F%E8%AE%AE/07.%E6%8B%96%E6%8B%BD%E7%A4%BA%E6%95%99.html ## 1 拖动模式 ### 1.1 上位机设置拖拽模式参数 **命令字:** `0x4074` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | mode | int | [0,3] | 拖动方式:0-无,1-3D 鼠标,2-力矩,3-位置 | | port | int | 当前绑定 IO 端口数 | 外部触发信号端口 | | value | int | [0,1] | 外部触发信号参数 | ```json { "mode": 2, "port": 0, "value": 0 } ``` --- ### 1.2 上位机查询拖拽模式参数 **命令字:** `0x4075` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4076` | 参数名 | 类型 | 说明 | |--------|------|------| | mode | int | 拖动方式,范围[0,3] | | port | int | 外部触发信号端口 | | value | int | 外部触发信号参数,范围[0,1] | ```json { "mode": 2, "port": 0, "value": 0 } ``` --- ### 1.3 上位机设置力矩参数 **命令字:** `0x4085` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | DecareLimit | double | [0,∞) m/s | 笛卡尔空间线速度限制 | | JointVelLimit | double | [0,∞) °/s | 关节空间速度限制 | | dragCoefficient | double[6] | [1,100] | 超限阻力系数 | | drag_mode | int | [0,2] | 拖动模式:0-自由拖动,1-位置拖动,2-姿态拖动 | | frictionOffset | double[6] | [0,0.99] | 关节摩擦力补偿矫正系数 | | targetTorqCoefficient | double[6] | [0,1] | 关节目标扭矩矫正系数 | | waitCycle | double | [1,10] | 下发给伺服力矩参数等待周期 | ```json { "DecareLimit": 2.50, "JointVelLimit": 1.0, "dragCoefficient": [5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode": 0, "frictionOffset": [0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient": [1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle": 5.0 } ``` --- ### 1.4 上位机查询力矩参数 **命令字:** `0x4086` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4087` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | DecareLimit | double | [0,∞) m/s | 笛卡尔空间线速度限制 | | JointVelLimit | double | [0,∞) °/s | 关节空间速度限制 | | dragCoefficient | double[6] | [1,100] | 超限阻力系数 | | drag_mode | int | [0,2] | 拖动模式 | | frictionOffset | double[6] | [0,0.99] | 关节摩擦力补偿矫正系数 | | targetTorqCoefficient | double[6] | [0,1] | 关节目标扭矩矫正系数 | | waitCycle | double | [1,10] | 下发给伺服力矩参数等待周期 | ```json { "DecareLimit": 2.50, "JointVelLimit": 1.0, "dragCoefficient": [5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode": 0, "frictionOffset": [0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient": [1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle": 5.0 } ``` --- ## 2 轨迹管理 > **说明:** 轨迹保存结果通过0x4070返回。 ### 2.1 上位机查询拖拽轨迹是否被记录 **命令字:** `0x408B` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4070` | 参数名 | 类型 | 说明 | |--------|------|------| | record | bool | 轨迹是否被记录 | ```json { "record": false } ``` --- ### 2.2 上位机请求轨迹回放 **命令字:** `0x4071` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | trajName | string | - | 需要回放的轨迹名称 | | vel | int | [1,100] | 轨迹回放运行速度 | ```json { "trajName": "AAA", "vel": 100 } ``` --- ### 2.3 上位机请求保存拖拽轨迹 **命令字:** `0x4072` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string | 需要保存的轨迹名称,若为空则保存失败 | ```json { "TrajName": "AAA" } ``` --- ### 2.4 上位机请求删除拖拽轨迹 **命令字:** `0x4073` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string | 需要删除的轨迹名称 | ```json { "TrajName": "AAA" } ``` --- ### 2.5 上位机查询拖拽轨迹列表 **命令字:** `0x4083` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4084` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string[] | 已保存轨迹列表,长度为当前已保存轨迹数量,若无轨迹则该节点不存在 | ```json { "TrajName": ["AAA"] } ``` --- ### 2.6 上位机设置轨迹记录参数 **命令字:** `0x4088` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | MaxSamplingNum | double | (200,1200) | 最大采样点数 | | SamplingInterval | double | [0.03,1] | 采样间隔(秒) | | Start | bool | - | 开始/停止记录:true-开始记录,false-停止记录;false 时"MaxSamplingNum"和"SamplingInterval"可以不存在 | ```json { "MaxSamplingNum": 300.0, "SamplingInterval": 0.030, "Start": true } ``` --- ### 2.7 上位机查询轨迹记录参数 **命令字:** `0x4089` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x408A` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | MaxSamplingNum | double | (200,1200) | 最大采样点数 | | SamplingInterval | double | [0.03,1] | 采样间隔(秒) | | Start | bool | - | 开始/停止记录:true-开始记录,false-停止记录 | ```json { "MaxSamplingNum": 300.0, "SamplingInterval": 0.030, "Start": false } ``` --- ### 2.8 上位机查询拖拽轨迹文件列表 **命令字:** `0x408C` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x408D` | 参数名 | 类型 | 说明 | |--------|------|------| | absolutepath | string | 控制器中拖拽轨迹文件存放地址 | | trajectory_filelist | string[] | 拖拽轨迹文件列表,"drag_traj_details.json"为轨迹记录信息文件 | ```json { "absolutepath": "dragPos/", "trajectory_filelist": ["AAA","JJ","drag_traj_details.json"] } ``` --- # 变更日志 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/02.RTL-24.03/02.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html TODO:待补充 --- # 系统 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/01.%E7%B3%BB%E7%BB%9F.html ## 状态 ### 查询初始化状态 系统开机需要进行初始化,否则系统将无法使用。 **命令字:** `0x1000` - 无需发送数据 **控制器回复** **命令字:** `0x1001` | 字段 | 类型 | 说明 | |------|------|------| | finishinit | bool | 初始化是否完成,true 完成,false 未完成 | ```json { "finishinit": true } ``` ### 查询是否为 T5 系统 **命令字:** `0x1002` - 无需发送数据 **控制器回复** **命令字:** `0x1003` | 字段 | 类型 | 说明 | |------|------|------| | T5_system | bool | 是否为 T5 系统,true 是,false 不是 | ```json { "T5_system": false } ``` ### 查询硬件系统发布版本 **命令字:** `0x1004` - 无需发送数据 **控制器回复** **命令字:** `0x1005` | 字段 | 类型 | 说明 | |------|------|------| | result | bool | 查询是否成功,true 成功,false 失败 | | version | string | 版本号(若查询成功则返回) | ```json { "result": true, "version": "xx" } ``` ## 版本升级 系统开机时需要查询当前版本号,若出现不匹配则需要进行版本升级。 ### 查询当前系统版本号 **命令字:** `0x1010` | 字段 | 类型 | 说明 | |------|------|------| | version | string | 版本号内容 | ```json { "version": "v1.0-rc1-67-gf34dae7" } ``` **控制器回复** **命令字:** `0x1011` | 字段 | 类型 | 说明 | |------|------|------| | configFileVersionMismatch | bool | 配置文件是否匹配,false 不匹配,true 匹配 | | jobFileVersion | string | 作业文件版本 | | rtlVersion | string | 控制器版本 | | sysClock | string | 系统时钟,格式如 "2023.11.10 13:29:25" | | version | string | 版本号内容,若查询时发送的 version 为空字符串则返回同样内容 | | controllerFunction | string | 控制器功能版本,默认 "BASE" | | controllerProject | string | 项目版本号,默认 "1.0.0" | | controllerModel | string | 控制器型号,默认 "C1102" | | controllerMaster | string | 主站类型,默认 "EtherCAT" | | controllerFactory | string | 厂家,默认 "INEXBOT" | ```json { "configFileVersionMismatch": false, "jobFileVersion": "5.2.0", "rtlVersion": "22.08.0", "sysClock": "2023.11.10 13:29:25", "version": "v1.0-rc1-67-gf34dae7", "controllerFunction": "BASE", "controllerProject": "1.0.0", "controllerModel": "C1102", "controllerMaster": "EtherCAT", "controllerFactory": "INEXBOT" } ``` ## 日志 ### 查询崩溃日志文件 **命令字:** `0x1020` - 无需发送数据 **控制器回复** **命令字:** `0x1021` | 字段 | 类型 | 说明 | |------|------|------| | absolutepath | string | 路径 | | dumpLogfilenum | int | 文件数量 | | dumpLogfilelist | string[] | 日志文件列表 | ```json { "absolutepath": "", "dumpLogfilenum": 3, "dumpLogfilelist": ["", "", "", ""] } ``` ### 请求获取日志文件列表 **命令字:** `0x1022` | 字段 | 类型 | 说明 | |------|------|------| | num | int | 表示获取最近多少个文件,可取 5、30、100 | ```json { "num": 5 } ``` **控制器回复** **命令字:** `0x1023` | 字段 | 类型 | 说明 | |------|------|------| | absolutepath | string | 日志所在目录 | | logfilenum | int | 日志数目(与 num 不一定相等) | | logfilelist | string[] | 日志列表 | ```json { "absolutepath": "log/", "logfilenum": 3, "logfilelist": ["logInfo.0", "logInfo.1", "logInfo.2"] } ``` ## 恢复出厂设置 **命令字:** `0x1030` | 字段 | 类型 | 说明 | |------|------|------| | clearFactoryIO | bool | 清除所有 IO,true 清除,false 未清除 | | clearFactoryRobot | bool | 清除所有机器人,true 清除,false 未清除 | | clearFactoryToolhand | bool | 清除所有工具手,true 清除,false 未清除 | | clearConfigFile | bool | 清除所有系统配置文件,true 清除,false 未清除 | | clearExtendedFile | bool | 清除所有扩展文件,true 清除,false 未清除 | ```json { "clearFactoryIO": true, "clearFactoryRobot": true, "clearFactoryToolhand": true, "clearConfigFile": true, "clearExtendedFile": true } ``` ## 重启、关机 ### 重启控制器 **命令字:** `0x1031` - 无需发送数据 ### 关机 **命令字:** `0x1032` - 无需发送数据 ### 查询断电保持恢复状态 **命令字:** `0x1033` - 无需发送数据 **控制器回复** **命令字:** `0x1034` | 字段 | 类型 | 说明 | |------|------|------| | rebootKeepRecoveryFlag | bool | 断电保持恢复标志,true 恢复成功,false 未执行断电保持恢复 | | rebootKeepJobFileName | string | 断电保持恢复的程序名字,程序命名首字母不得为数字 | ```json { "rebootKeepRecoveryFlag": false, "rebootKeepJobFileName": "xxxx" } ``` ## IP 设置 ### 控制器 IP 设置 **命令字:** `0x1040` | 字段 | 类型 | 说明 | |------|------|------| | name | string | 网口名称 | | address | string | 设置控制器 IP | | gateway | string | 设置控制器网关 | | dns | string | 设置控制器 DNS | ```json { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ``` ### 查询连接 IP **命令字:** `0x1041` - 无需发送数据 **控制器回复** **命令字:** `0x1042` | 字段 | 类型 | 说明 | |------|------|------| | num | int | 网口数目 | | network | array | 网络信息列表 | | network[].name | string | 网口名称 | | network[].address | string | 控制器 IP | | network[].gateway | string | 控制器网关 | | network[].dns | string | 控制器 DNS | ```json { "num": 2, "network": [ { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" }, { "name": "p2p1", "address": "192.168.1.14", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ] } ``` ## 时间设置 ### 发送时间查询 **命令字:** `0x1050` | 字段 | 类型 | 说明 | |------|------|------| | type | int | 时间类型:0 现实时间,1 获取系统开始时间至现在秒数 | | format | int | 格式:0 获取时间戳,1 获取北京时间 | ```json { "type": 0, "format": 0 } ``` **控制器回复** **命令字:** `0x1051` | 字段 | 类型 | 说明 | |------|------|------| | tType | int | 时间类型:0 现实时间,1 系统开始时间至现在秒数 | | format | int | 格式:0 时间戳,1 北京时间 | | date | object | 日期和时间信息 | | date.year | int | 年份 | | date.mon | int | 月份 | | date.day | int | 日期 | | date.hour | int | 小时 | | date.min | int | 分钟 | | date.sec | int | 秒数 | | date.msec | int | 毫秒数 | | timestamp | object | 时间戳(format 为 0 时显示) | | timestamp.s | int | 时间戳秒数 | | timestamp.ns | int | 时间戳纳秒数 | ```json { "tType": 0, "format": 0, "date": { "year": 2023, "mon": 1, "day": 1, "hour": 1, "min": 1, "sec": 1, "msec": 1 }, "timestamp": { "s": 1, "ns": 1 } } ``` ### 查询语言支持 **命令字:** `0x1052` - 无需发送数据 **控制器回复** **命令字:** `0x1053` | 字段 | 类型 | 说明 | |------|------|------| | language | string[] | 控制器能够支持的所有语言,目前支持:Chinese 中文、Korean 韩文、English 英文 | | language_used | string | 控制器当前使用的语言 | ```json { "language": ["Chinese", "Korean", "English"], "language_used": "Chinese" } ``` ### 查询上位机当前语言 **命令字:** `0x1054` | 字段 | 类型 | 说明 | |------|------|------| | teachbox_language | string | 上位机当前使用的语言 | ```json { "teachbox_language": "Chinese" } ``` ## 系统保养 ### 系统保养查询 **命令字:** `0x1060` - 无需发送数据 **控制器回复** **命令字:** `0x1061` | 字段 | 类型 | 说明 | |------|------|------| | controller_ID | string | 控制器 ID | | controller_total_time | int | 控制器通电总时间,单位为小时 | | controller_spent_time | int | 控制器距离上次保养时长,单位为小时 | | controller_cycle_time | int | 控制器保养间隔周期,单位为小时 | | robot_total_time | int | 机器人通电总时间,单位为小时 | | robot_spent_time | int | 机器人距离上次保养时长,单位为小时 | | robot_cycle_time | int | 机器人保养间隔周期,单位为小时 | ```json { "controller_ID": "4DC9F0249098C82E", "controller_total_time": 0, "controller_spent_time": 0, "controller_cycle_time": 0, "robot_total_time": 0, "robot_spent_time": 0, "robot_cycle_time": 0 } ``` ### 系统保养提示 **命令字:** `0x1062` | 字段 | 类型 | 说明 | |------|------|------| | exist | bool | 判断保养文件是否存在,true 存在,false 不存在 | | controlTimeStatus | bool | 控制器保养状态,true 保养,false 不保养 | | robotTimeStatus | bool | 机器人保养状态,true 保养,false 不保养 | ```json { "exist": true, "controlTimeStatus": true, "robotTimeStatus": true } ``` ## 文件 ### 查询控制器配置文件目录 **命令字:** `0x1070` | 字段 | 类型 | 说明 | |------|------|------| | isExport | bool | 导入导出配置,true 导出配置,false 导入配置 | ```json { "isExport": true } ``` **控制器回复** **命令字:** `0x1071` | 字段 | 类型 | 说明 | |------|------|------| | filelist | string[] | 配置文件名称列表 | | filenum | int | 配置文件数量 | ```json { "filelist": ["xxx.json", "yyy.json"], "filenum": 2 } ``` ## 系统备份 ### 查询是否存在当前版本示教器程序 **命令字:** `0x1090` | 字段 | 类型 | 说明 | |------|------|------| | config_md5 | string | config.db 文件 MD5 值 | | pinyin_md5 | string | Pinyin.db 文件 MD5 值,null 表示没有这个文件或者文件大小是 0 | | pro_md5 | string | 示教器程序文件的 MD5 值 | | pro_name | string | 示教器程序文件的名称,可选 Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "config_md5": "2803f92ecdecfd3c178b0998b9391a4d", "pinyin_md5": "null", "pro_md5": "ce407851346d030dad5207948f55ed6c", "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1091` | 字段 | 类型 | 说明 | |------|------|------| | path | object | 文件路径信息 | | path.config | string | config.db 文件上传路径 | | path.dir | string | 所有文件的路径 | | path.pinyin | string | Pinyin.db 文件上传路径,空字符串表示不需要上传 | | path.pro | string | Qt-tp 文件上传路径 | ```json { "path": { "config": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "dir": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "pinyin": "", "pro": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6" } } ``` ### 查询是否存在与控制器版本匹配的示教器程序 **命令字:** `0x1092` | 字段 | 类型 | 说明 | |------|------|------| | pro_name | string | 示教器程序名称,可选 Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1093` | 字段 | 类型 | 说明 | |------|------|------| | backuppath | string | 备份路径 | ### 请求备份程序文件 **命令字:** `0x1094` | 字段 | 类型 | 说明 | |------|------|------| | backup_dir | string | 备份文件的原路径 | | pro_name | string | 程序名称,Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "backup_dir": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1095` | 字段 | 类型 | 说明 | |------|------|------| | backuppath | string | 自动备份的路径 | ```json { "backuppath": "" } ``` ### 请求自动备份 **命令字:** `0x1096` - 无需发送数据 **控制器回复** **命令字:** `0x1097` | 字段 | 类型 | 说明 | |------|------|------| | backUpNum | int | 备份系统数,最多 10 个 | | backUpName | string[] | 备份系统的名字 | ```json { "backUpNum": 1, "backUpName": ["string", "string", "string……"] } ``` ### 请求系统恢复 **命令字:** `0x1098` | 字段 | 类型 | 说明 | |------|------|------| | backUpOneName | string | 需要恢复的系统名称 | ```json { "backUpOneName": "xxxx" } ``` **控制器回复** **命令字:** `0x1099` | 字段 | 类型 | 说明 | |------|------|------| | success | bool | 系统恢复是否成功,true 成功,false 失败 | | backUpName | string[] | 备份系统的名字,最多 10 个 | ```json { "success": true } ``` ### 保存厂家参数 **命令字:** `0x109A` - 无需发送数据 **控制器回复** **命令字:** `0x109B` | 字段 | 类型 | 说明 | |------|------|------| | success | bool | 是否保存成功,true 成功,false 失败 | ```json { "success": true } ``` ## 密钥 ### 系统限制设置 **命令字:** `0x10B0` | 字段 | 类型 | 说明 | |------|------|------| | pallet | bool | 设置码垛功能限制 | | welding | bool | 设置焊接功能限制 | | laserCut | bool | 设置激光切割功能限制 | | polish | bool | 设置打磨功能限制 | | spray | bool | 设置喷涂功能限制 | | search | bool | 设置寻位功能限制 | | vision | bool | 设置视觉功能限制 | | conveyor | bool | 设置传送带功能限制 | | clear_data | bool | 清除数据 | ```json { "pallet": true, "welding": true, "laserCut": true, "polish": true, "spray": true, "search": true, "vision": true, "conveyor": true, "clear_data": true } ``` ### 查询控制器功能限制 **命令字:** `0x10B1` - 无需发送数据 **控制器回复** **命令字:** `0x10B2` | 字段 | 类型 | 说明 | |------|------|------| | maxRobotCount | int | 机器人最大数目 | | crafts | string[] | 已解锁的工艺列表 | | robotTypes | string[] | 已解锁的机器人类型 | 工艺类型值: - `C_Pallet`:码垛工艺 - `C_Welding`:焊接工艺 - `C_Lasercut`:激光切割工艺 - `C_Polish`:打磨工艺 - `C_Spray`:喷涂工艺 - `C_Search`:寻位跟踪工艺 - `C_Vision`:视觉工艺 机器人类型值: - `R_NULL`:未选择机器人类型 - `R_GENERAL_6S`:六轴串联多关节 - `R_GENERAL_6S_1`:六轴协作 - `R_SIXAXIS_SPRAY_BBR`:六轴喷涂机器人 - `R_GENERAL_6S_2`:六轴异型二 - `R_GENERAL_5S`:五轴机器人 - `R_SCARA`:四轴 SCARA 机器人 - `R_SCARA_1`:四轴 SCARA 异型一机器人 - `R_FOURAXIS_PALLET`:四轴连杆码垛机器人 - `R_FOURAXIS_PALLET_1`:四轴码垛丝杆机器人 - `R_FOURAXIS`:四轴机器人 - `R_FOUR_CARTESIAN_COORDINATE`:四轴直角机器人 - `R_FOUR_POLAR_COORDINATE_1`:四轴极坐标异形机器人 - `R_SCARA_THREEAXIS`:三轴 SCARA 机器人 - `R_THREE_CARTESIAN_COORDINATE`:三轴直角机器人 - `R_THREE_CARTESIAN_COORDINATE_1`:三轴异形一机器人 - `R_SCARA_TWOAXIS`:二轴 SCARA 机器人 - `R_GENERAL_7S`:七轴通用机器人 - `R_GENERAL_1S`:一轴机器人 - `R_GANTRY_WELD`:五轴龙门焊接机器人 - `R_DELTA`:delta 机器人(四轴并联机器人) - `R_WINE_CHAMFER`:酒槽机型 - `R_GANTRY_WELD_2`:五轴龙门焊接机器人类型 2 - `R_FOUR_CARTESIAN_COORDINATE_1`:四轴直角异型一机器人 - `R_GANTRY_WELD_6`:六轴龙门焊接机器人 - `FIVE_AXLE_MIXED`:五轴混动机器人 - `R_SCARA_FOURAXIS_2`:四轴 SCARA 异型 2 - `R_SIX_AXLE_ABNORMITY_3`:六轴异型三 - `R_SCARA_THREEAXIS_1`:三轴 SCARA 异型 1 - `R_DELTA_2D_`:delta 2D 并联机器人模型 - `R_GANTRY_WELD_3`:五轴龙门焊接机器人类型 3 - `R_GENERAL_3S_1`:三轴串联异形一 - `R_GENERAL_5S_COLLABORATIVE_`:五轴协作机器人 - `R_SCARA_3_`:四轴 SCARA 异型三机器人 - `R_GENERAL_6S_CBBARA_`:六轴串联-CBBARA - `R_HEAVY_DUTY_FOUR_AXIS_`:高格立柱旋转四轴 ```json { "crafts": [ "C_Pallet", "C_Welding", "C_Lasercut", "C_Polish", "C_Spray", "C_Search", "C_Vision" ], "maxRobotCount": 4, "robotTypes": [ "R_GENERAL_6S", "R_SCARA", "R_FOURAXIS_PALLET", "R_FOURAXIS", "R_GENERAL_1S", "R_GENERAL_5S", "R_GENERAL_6S_1", "R_SCARA_TWOAXIS", "R_SCARA_THREEAXIS", "R_THREE_CARTESIAN_COORDINATE", "R_THREE_CARTESIAN_COORDINATE_1", "R_GENERAL_7S", "R_SCARA_1", "R_FOURAXIS_PALLET_1", "R_SIXAXIS_SPRAY_BBR", "R_FOUR_CARTESIAN_COORDINATE", "R_FOUR_POLAR_COORDINATE_1", "R_GENERAL_6S_2", "R_GANTRY_WELD", "R_DELTA", "R_WINE_CHAMFER", "R_GANTRY_WELD_2", "R_FOUR_CARTESIAN_COORDINATE_1", "R_GANTRY_WELD_6", "FIVE_AXLE_MIXED", "R_SCARA_FOURAXIS_2", "R_SIX_AXLE_ABNORMITY_3", "R_SCARA_THREEAXIS_1", "R_DELTA_2D_", "R_GANTRY_WELD_3", "R_GENERAL_3S_1", "R_GENERAL_5S_COLLABORATIVE_", "R_SCARA_3_" ] } ``` ### 查询控制器 ID **命令字:** `0x10B3` - 无需发送数据 **控制器回复** **命令字:** `0x10B4` | 字段 | 类型 | 说明 | |------|------|------| | controllerID | string | 控制器 ID | ```json { "controllerID": "4DC9F0249098C82E" } ``` > **说明:** 获取到连接的控制器 ID 之后,在同步作业文件时需判断此 ID 是否已知。已知则判断路径 "dir/controllerID" 是否存在,若存在则不做操作;若不存在则创建工作文件路径,格式:"dir/controllerID/robotJob/R1"。多个机器人则表示 R1-4。 ### 获取控制器剩余使用天数 **命令字:** `0x10B5` - 无需发送数据 **控制器回复** **命令字:** `0x10B6` | 字段 | 类型 | 说明 | |------|------|------| | restdays | int | 剩余使用天数,-1 无限期使用,0 使用期限已到,其余表示剩余多少天 | | year | int | 过期年份 | | mon | int | 过期月份 | | day | int | 过期日 | ```json { "restdays": 30, "year": 1, "mon": 1, "day": 1 } ``` ### 控制器发送剩余使用天数 **命令字:** `0x10B7` | 字段 | 类型 | 说明 | |------|------|------| | restDays | int | 剩余使用天数 | ```json { "restDays": 0 } ``` ### 控制器序列号更新 **命令字:** `0x10B8` | 字段 | 类型 | 说明 | |------|------|------| | license | string | 控制器序列号 | ```json { "license": "ACOCWKBZHSKBEJHI" } ``` **控制器回复** **命令字:** `0x10B9` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 更新结果,"success" 成功,"ivalid" 非法密钥,"notInit" 未初始化 | | ivalid | string | 无效的密钥 | | error | string | 存在破解嫌疑,拒绝解锁 | ```json { "result": "success", "ivalid": "无效的密钥!", "error": "存在破解嫌疑,拒绝解锁!" } ``` > 密钥更新成功后,控制器即将重启。 ### 控制器无权使用信息 **命令字:** `0x10BA` | 字段 | 类型 | 说明 | |------|------|------| | reason | string | 控制器无权使用原因 | ```json { "reason": "" } ``` ### 获取控制器基础信息 **命令字:** `0x10C0` - 无需发送数据 **控制器回复** **命令字:** `0x10C1` | 字段 | 类型 | 说明 | |------|------|------| | controllerID | string | 控制器 ID | | controllerModel | string | 控制器型号 | ```json { "controllerID": "1234567890ABCDEF", "controllerModel": "C2201" } ``` ### 获取控制器支持的机器人类型和工艺 **命令字:** `0x10C2` - 无需发送数据 **控制器回复** **命令字:** `0x10C3` | 字段 | 类型 | 说明 | |------|------|------| | maxRobotSum | int | 最大机器人总数,范围 [0,4] | | robotTypeEn | string[] | 支持的机器人类型英文 | | robotTypeCn | string[] | 支持的机器人类型中文 | | craftTypeEn | string[] | 支持的所有工艺英文 | | craftTypeCn | string[] | 支持的所有工艺中文 | ```json { "maxRobotSum": 4, "robotTypeEn": ["RobotA", "RobotB"], "robotTypeCn": ["机器人A", "机器人B"], "craftTypeEn": ["pallet", "weld"], "craftTypeCn": ["码垛", "焊接"] } ``` ### 获取控制器授权信息 **命令字:** `0x10C4` - 无需发送数据 **控制器回复** **命令字:** `0x10C5` | 字段 | 类型 | 说明 | |------|------|------| | isInit | bool | 是否初始化 | | expirationDate | object | 到期日期 | | expirationDate.year | int | 到期年份 | | expirationDate.month | int | 到期月份 | | expirationDate.day | int | 到期日 | | maxRobotSum | int | 最大机器人数,范围 [0,4] | | robotType | string[] | 机器人类型 | | craftType | string[] | 工艺类型 | ```json { "isInit": true, "expirationDate": { "year": 2038, "month": 1, "day": 31 }, "maxRobotSum": 4, "robotType": ["RobotA", "RobotB"], "craftType": ["pallet", "weld"] } ``` ### 传输初始化密钥 **命令字:** `0x10C6` | 字段 | 类型 | 说明 | |------|------|------| | permissionType | string | 许可类型 | | license | string | 密钥 | ```json { "permissionType": "01", "license": "DSFPSKDGSJDFSGDSGJDSDF" } ``` **控制器回复** **命令字:** `0x10C7` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 密钥结果,"success" 成功,"ivalid" 非法密钥,"deviceAbnormal" 控制器异常 | | data | string | 控制器数据 | ```json { "result": "success", "data": "123ABC" } ``` ### 传输解密密钥 **命令字:** `0x10C8` | 字段 | 类型 | 说明 | |------|------|------| | license | string | 密钥 | ```json { "license": "DSFPSKDGSJDFSGDSGJDSDF" } ``` **控制器回复** **命令字:** `0x10C9` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 结果,"success" 成功,"ivalid" 非法密钥,"notInit" 未初始化 | ```json { "result": "success" } ``` ### 获取离线权限文件内容 **命令字:** `0x10CA` - 无需发送数据 **控制器回复** **命令字:** `0x10CB` | 字段 | 类型 | 说明 | |------|------|------| | data | string | 权限文件内容 | ```json { "data": "xxxxxxxx" } ``` --- # 报错 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/02.%E6%8A%A5%E9%94%99.html ## 概述 控制器通过 JSON 协议向上位机上报各类错误、警告和消息提示。上位机也可以通过协议命令清除伺服错误。本章详细说明错误码的分类体系、上报机制和处理流程。 --- ## 错误码分类 系统错误码按照功能域和严重程度进行分类,便于快速定位和处理问题。 ### 按严重程度分类 | 种类 | kind 值 | 说明 | 典型场景 | |------|---------|------|----------| | 消息 | 0 | 普通信息提示,不影响系统运行 | 日志记录、操作成功提示、状态变更通知 | | 警告 | 1 | 警告信息,系统可继续运行但需关注 | 参数配置缺失、备份提醒、接近限位 | | 报错 | 2 | 严重错误,通常需要人工干预才能恢复 | 伺服故障、急停触发、碰撞检测、通信中断 | ### 按功能域分类 | 错误域 | 错误码范围 | 说明 | |--------|-----------|------| | 系统错误 | 0x0000 - 0x0FFF | 系统初始化、配置、版本相关的错误 | | 伺服错误 | 0x1000 - 0x1FFF | 伺服驱动、编码器、电机相关的错误 | | 运动控制错误 | 0x2000 - 0x3FFF | 运动规划、插补、轨迹相关的错误 | | 程序执行错误 | 0x4000 - 0x5FFF | 作业程序解析、执行、变量操作相关的错误 | | 通信错误 | 0x6000 - 0x6FFF | 网络通信、协议解析、端口连接相关的错误 | | 安全错误 | 0x7000 - 0x7FFF | 安全门、急停、光幕等安全设备相关的错误 | | IO 错误 | 0x8000 - 0x8FFF | 数字/模拟输入输出相关的错误 | | 工艺错误 | 0x9000 - 0x9FFF | 焊接、码垛、切割等工艺相关的错误 | ### 常见错误码 | 错误码 | 说明 | 种类 | 处理建议 | |--------|------|------|----------| | 16385 | 机器人参数配置文件不存在 | 警告(1) | 检查配置文件,系统已自动创建默认配置 | | 21764 | 自动备份成功 | 消息(0) | 无需处理,仅为通知 | | 28680 | 指令不存在 | 报错(2) | 检查发送的命令字是否正确 | --- ## 错误上报机制 ### 上报方式 控制器通过以下命令字主动向上位机推送提示信息: | 命令字 | 功能 | 方向 | |--------|------|------| | `0x1110` | 错误提示上报 | 控制器 → 上位机 | | `0x1111` | 警告提示上报 | 控制器 → 上位机 | | `0x1112` | 消息提示上报 | 控制器 → 上位机 | | `0x1113` | 弹窗提示上报 | 控制器 → 上位机 | ### 错误信息字段说明 每个错误/警告/消息都包含以下核心字段: | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 产生错误的机器人编号。0 表示与特定机器人无关(系统级错误) | | `kind` | int | 严重程度:0=消息,1=警告,2=报错 | | `code` | int | 错误编码,用于唯一标识错误类型 | | `data` | string | 人类可读的错误描述信息 | | `param` | int[] | 错误附带的参数,根据具体错误码有不同含义(如轴号、指令字等) | --- ## 清错 清除伺服错误时使用。 ### 清除伺服错误 **命令字:** `0x1100` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x1101` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [1, 4] | | clearErrorFlag | bool | 是否清除成功,true 清除伺服错误成功,false 清除失败 | ```json { "robot": 1, "clearErrorFlag": true } ``` ### 错误处理流程 典型的错误处理流程如下: 1. **错误发生**:控制器检测到异常,通过 `0x1110`/`0x1111`/`0x1112` 上报错误/警告/消息 2. **错误识别**:上位机收到上报后解析 `code` 和 `kind` 字段,确定错误类型和严重程度 3. **错误分类处理**: - **消息(kind=0)**:记录日志,无需特殊处理 - **警告(kind=1)**:提示用户注意,记录日志 - **报错(kind=2)**: - 显示错误弹窗或提示 - 判断是否需要停机或停止当前运动 - 如为伺服错误,可发送 `0x1100` 清错命令 4. **清错操作**:上位机发送 `0x1100` 清除伺服错误,控制器回复 `0x1101` 告知清除结果 5. **恢复运行**:错误清除后,上位机可重新使能并继续执行 > **注意:** 并非所有错误都可以通过 `0x1100` 清除。部分硬件故障、安全联锁错误需要物理排除故障后才能恢复。 --- ## 信息提示 控制器向上位机发送错误提示/警告提示/消息提示/弹窗提示。 ### 错误提示 **命令字:** `0x1110` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者错误内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的错误对应不同的内容 | | code | int | 消息编码 | | param | int[] | 消息内容参数,根据具体编码的不同会有不同个数,预留 5 个 | ```json { "code": 28680, "data": "指令[0x5743]不存在", "kind": 2, "param": [22339, 3], "robot": 0 } ``` ### 警告提示 **命令字:** `0x1111` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者警告内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的警告对应不同的内容 | | code | int | 消息编码 | | param | int[] | 消息内容参数,根据具体编码的不同会有不同个数,预留 5 个 | ```json { "code": 16385, "data": "机器人1参数配置文件不存在,已创建,请配置参数", "kind": 1, "param": [1], "robot": 1 } ``` ### 消息提示 **命令字:** `0x1112` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者消息内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的消息对应不同的内容 | | code | int | 消息编码 | ```json { "code": 21764, "data": "自动备份成功", "kind": 0, "robot": 0 } ``` ### 弹窗提示 **命令字:** `0x1113` | 字段 | 类型 | 说明 | |------|------|------| | count | int | 弹窗按钮数量,最大为 3 | | text1 | string | 弹窗居中显示的主文本 | | text2 | string | 按钮 1 的文本 | | text3 | string | 按钮 2 的文本 | | text4 | string | 按钮 3 的文本 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | node | int | 机器人序号,取值范围 [1, 4] | | Tips | bool | 弹窗呼出,true 表示呼出 | ```json { "count": 1, "text1": "示例", "text2": "示例", "text3": "示例", "text4": "示例", "kind": 1, "node": 1, "Tips": true } ``` ### 弹窗交互反馈 根据用户对弹窗的操作进行相应设置。 **命令字:** `0x1114` | 字段 | 类型 | 说明 | |------|------|------| | node | int | 机器人序号,取值范围 [1, 4] | | option | int | 对应弹窗选项 1-3 的内容,取值范围 [1, 3] | ```json { "node": 1, "option": 1 } ``` --- # 操作参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/03.%E6%93%8D%E4%BD%9C%E5%8F%82%E6%95%B0.html ## 概述 操作参数用于配置控制器的运行行为,包括运行模式、预约模式、语言、工艺选择、安全相关等全局设置。上位机通过 `0x1300` 设置参数,通过 `0x1301` 查询参数,控制器通过 `0x1302` 回复当前参数值。 --- ## 参数分类 ### 运行模式参数 控制机器人的启动行为和运行模式切换。 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电:true 自动上电,false 不自动上电 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式:true 允许,false 不允许 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式:0 单击运行,1 按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | ### 预约与执行参数 控制远程 IO 的程序预约和执行行为。 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式:true 预约模式,false 非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行:true 断电执行,false 断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行:true 当前行执行,false 非当前行执行 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约:true 允许,false 不允许 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列:true 清空,false 不清空 | ### 安全与保护参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效:true 不生效,false 生效 | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位:true 保持,false 不保持 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应超时时间,范围 [0, 100],单位 ms | ### 坐标系与工艺参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标:0 直角坐标系,1 大地坐标系 | | `craftSelect` | string | "general" | 工艺选择:"general" 通用,"special" 专用,"punch" 冲压,"pallet" 码垛,"weld" 焊接,"cut" 切割 | | `autoSetUserAndTool` | bool | false | 点位形态/工具手/用户值设置方式:true 自动,false 手动 | ### 其他参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `language` | string | "chinese" | 默认语言:"chinese" 中文,"english" 英文,"korean" 韩文 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位:0 倍数值,1 数值 | | `quickInsert` | bool | false | 快捷指令打开标志:true 打开,false 关闭 | --- ## 1. 运行参数设置 ### 读/写操作说明 操作参数遵循"设置-查询-回复"的标准模式: | 操作 | 命令字(下发) | 命令字(回复) | 说明 | |------|---------------|---------------|------| | 设置参数 | `0x1300` | - | 上位机设置运行参数,控制器保存后生效 | | 查询参数 | `0x1301` | `0x1302` | 上位机查询当前运行参数值,控制器回复 | **命令字:** `0x1300` ### 参数列表 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电;true: 自动上电;false:不自动上电 | | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式;true: 预约模式;false:非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行;true: 断电执行;false:断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行;true: 当前行执行;false:非当前行执行 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式;true: 允许;false:不允许 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约;true: 允许;false:不允许 | | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效;true: 不生效;false:生效 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式;0:单击运行;1:按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | | `language` | string | "chinese" | 设置默认语言;"chinese":中文;"english":英文;"korean":韩文 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位;0: 倍数值;1: 数值 | | `craftSelect` | string | "general" | 工艺选择;"general":通用工艺;"special":专用工艺;"punch":冲压工艺;"pallet":码垛工艺;"weld":焊接工艺;"cut":切割工艺 | | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标;0: 直角坐标系;1: 大地坐标系 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列;true: 清空;false:不清空 | | `autoSetUserAndTool` | bool | false | 点位形态/工具手/用户值设置方式;true: 自动;false: 手动 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应时间;取值范围 [0, 100],单位 ms | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位;true: 保持;false: 不保持 | | `quickInsert` | bool | false | 快捷指令打开标志;true: 打开;false: 关闭 | ### 请求示例 ```json { "runModeAutoManBegFlag": false, "remoteUseReserveModeFlag": false, "remoteAllowContinueRunFlag": true, "remoteAllowCurrentRunFlag": false, "remoteSwitchModeEnable": false, "allowReserveRunningPro": false, "SetSafeScreenTeachInvalidFlag": false, "keepStepRunFlag": 0, "defaultRunningSpeed": 1, "language": "chinese", "accUnitMode": 0, "craftSelect": "general", "base_coord_of_user_coord_": 0, "remote_io_reset_clear_all_reserve_program_status_flag": true, "autoSetUserAndTool": false, "checkServoStatusWordMaxTime": 0, "OutageKeepFunctionFlag": true, "quickInsert": false } ``` ### 参数生效说明 - 大部分参数设置后**立即生效** - `language` 参数设置后需要重新加载界面才能看到语言变化 - `craftSelect` 参数设置后可能触发工艺相关的模块初始化 - 参数保存在控制器配置文件中,**断电后保持** --- ## 2. 运行参数查询 **命令字:** `0x1301` **请求参数:** 无 **命令字:** `0x1302` ### 参数列表 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电;true: 自动上电;false:不自动上电 | | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式;true: 预约模式;false:非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行;true: 断电执行;false:断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行;true: 当前行执行;false:非当前行执行 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式;true: 允许;false:不允许 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约;true: 允许;false:不允许 | | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效;true: 不生效;false:生效 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式;0:单击运行;1:按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位;0: 倍数值;1: 数值 | | `craftSelect` | string | "general" | 工艺选择;"general":通用工艺;"special":专用工艺;"punch":冲压工艺;"pallet":码垛工艺;"weld":焊接工艺;"cut":切割工艺 | | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标;0: 直角坐标系;1: 大地坐标系 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列;true: 清空;false:不清空 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应时间;取值范围 [0, 100],单位 ms | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位;true: 保持;false: 不保持 | | `quickInsert` | bool | false | 快捷指令打开标志;true: 打开;false: 关闭 | ### 响应示例 ```json { "runModeAutoManBegFlag": false, "remoteUseReserveModeFlag": false, "remoteAllowContinueRunFlag": true, "remoteAllowCurrentRunFlag": false, "remoteSwitchModeEnable": false, "allowReserveRunningPro": false, "SetSafeScreenTeachInvalidFlag": false, "keepStepRunFlag": 0, "defaultRunningSpeed": 1, "accUnitMode": 0, "craftSelect": "general", "base_coord_of_user_coord_": 0, "remote_io_reset_clear_all_reserve_program_status_flag": true, "checkServoStatusWordMaxTime": 0, "OutageKeepFunctionFlag": true, "quickInsert": false } ``` --- # 示教器与上位机的通讯连接 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/04.%E7%A4%BA%E6%95%99%E5%99%A8%E4%B8%8E%E4%B8%8A%E4%BD%8D%E6%9C%BA%E7%9A%84%E9%80%9A%E8%AE%AF%E8%BF%9E%E6%8E%A5.html ## 心跳 > **说明:** 不管什么通讯模式,都应设计心跳模式,确保通讯状态正常。示教盒定期发送心跳检查包给控制器,并等待控制器回应。客户端收到心跳包后需要回复心跳回应包,包数据为检查包所携带的时间戳。示教盒收到回应包后检查数据是否正确。数据不正确或超时为收到回应,则认为连接可能中断。 ### 收到心跳 | 属性 | 类型 | 说明 | |------|------|------| | time | int | 时间戳 | **命令字**:`0x1200` ```json { "time": 123 } ``` ### 回应心跳 | 属性 | 类型 | 说明 | |------|------|------| | time | int | 时间戳 | **命令字**:`0x1201` ```json { "time": 123 } ``` ## 示教器关机 > **说明:** 拔出示教器发送 **命令字**:`0x1210` | 属性 | 类型 | 说明 | |------|------|------| | date | - | 无 | ## 示教器开机 > **说明:** 插入示教盒恢复通信 **命令字**:`0x1211` | 属性 | 类型 | 说明 | |------|------|------| | date | - | 无 | --- # 5000端口协议 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/05.5000%E7%AB%AF%E5%8F%A3%E5%8D%8F%E8%AE%AE.html ## 说明 5000端口协议主要作用于上传、下载、备份文件。 - 若要向控制器上传文件,则上位机通过0x1D00请求上传文件,控制器通过0x1D01回复上传请求,当控制器同意上传时,上位机通过0x1D04上传文件,上传完毕后,上位机通过0x1D05告诉控制器上传结束,控制器通过0x1D06回复确认接收成功。 - 若要下载控制器中的文件,则上位机通过0x1D02请求下载文件,控制器通过0x1D03回复下载请求,当控制器同意下载时,控制器通过0x1D07向上位机传输其申请下载的文件,并且上位机通过0x1D08回复控制器接收结果,下载完毕后,控制器通过0x1D09告诉上位机下载结束,上位机通过0x1D0A 回复确认接收成功。 --- ## 文件传输流程 ### 上传文件流程 ```text 上位机 控制器 | | |--- 0x1D00 请求上传 -------->| |<-- 0x1D01 回复上传请求 -----| | | | (若 answer="yes") | |--- 0x1D04 上传文件数据 ---->| |--- 0x1D04 上传文件数据 ---->| |--- ... (可能多次分包) | |--- 0x1D05 上传结束 -------->| |<-- 0x1D06 确认接收 ---------| ``` ### 下载文件流程 ```text 上位机 控制器 | | |--- 0x1D02 请求下载 -------->| |<-- 0x1D03 回复下载请求 -----| | | | (若 answer="yes") | |<-- 0x1D07 下载文件数据 -----| |--- 0x1D08 回复接收 -------->| |<-- 0x1D07 下载文件数据 -----| |--- 0x1D08 回复接收 -------->| |<-- ... (可能多次分包) | |<-- 0x1D09 下载完成 ---------| |--- 0x1D0A 确认接收 -------->| ``` ### 备份文件流程 ```text 上位机 控制器 | | |--- 0x1D10 请求备份 -------->| |<-- 0x1D11 回复备份文件名 ---| | | | (然后按下载流程下载备份文件) | ``` --- ## 传输机制说明 ### 分包传输 大文件传输时,数据会分为多个数据包进行传输: - **上传 (0x1D04)**:上位机将文件内容分多次发送,每次发送一个数据包 - **下载 (0x1D07)**:控制器将文件内容分多次发送,上位机每次通过 `0x1D08` 回复接收状态 ### 错误处理 在文件传输过程中可能出现的异常情况: | 场景 | 处理方式 | |------|----------| | 控制器忙碌 | `0x1D01` 或 `0x1D03` 返回 `answer: "busy"`,上位机应稍后重试 | | 传输中断 | 通过 `0x1D0B` 断开连接,上位机需要重新发起传输请求 | | 接收失败 | `0x1D06` 或 `0x1D0A` 返回 `finish: false`,需要重新传输 | | 磁盘空间不足 | 控制器在 `0x1D01` 或 `0x1D03` 阶段拒绝请求 | ### 文件类型与路径 | 文件类型 | 路径示例 | 说明 | |----------|----------|------| | 作业文件 | `job/R1/WWWWW.JBR` | 机器人 1 的作业程序文件 | | 系统配置 | `config/` | 系统参数配置文件 | | 日志文件 | `log/` | 系统运行日志 | | 备份文件 | `controller.tar.gz` | 控制器全量备份包 | | ENI 文件 | `eni/` | 网络配置文件 | > **注意:** 下载作业文件时,文件名需包含完整的控制器内部路径。 --- ## 命令列表 | 命令字 | 功能 | 方向 | |--------|------|------| | 0x1D00 | 上位机请求上传文件 | 上位机 → 控制器 | | 0x1D01 | 控制器回复上传请求 | 控制器 → 上位机 | | 0x1D02 | 上位机请求下载文件 | 上位机 → 控制器 | | 0x1D03 | 控制器回复下载请求 | 控制器 → 上位机 | | 0x1D04 | 上位机向控制器上传文件 | 上位机 → 控制器 | | 0x1D05 | 上位机告诉控制器上传结束 | 上位机 → 控制器 | | 0x1D06 | 控制器回复确认接收成功 | 控制器 → 上位机 | | 0x1D07 | 控制器向上位机发送申请下载的文件 | 控制器 → 上位机 | | 0x1D08 | 上位机回复接收结果 | 上位机 → 控制器 | | 0x1D09 | 控制器告诉上位机下载完成 | 控制器 → 上位机 | | 0x1D0A | 上位机回复确认接收成功 | 上位机 → 控制器 | | 0x1D0B | 下载连接断开 | - | | 0x1D10 | 上位机请求备份文件 | 上位机 → 控制器 | | 0x1D11 | 控制器回复备份请求 | 控制器 → 上位机 | | 0x1D12 | 上位机发送下载 log 文件完成 | 上位机 → 控制器 | | 0x1D13 | 上位机发送下载 eni 文件完成 | 上位机 → 控制器 | --- ## 详细命令说明 ### 0x1D00 上位机请求上传文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 上位机发送文件的文件名 | | size | int | 上位机发送文件的文件大小 | **请求示例:** ```json { "name": "vxWorks", "size": 4096 } ``` --- ### 0x1D01 控制器回复上传请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 是否同意上传文件请求 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意上传文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes" } ``` --- ### 0x1D02 上位机请求下载文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要下载的作业文件名称 | **说明:** 参数 name 是作业文件在控制器中的作业文件路径加上名字。在0x5533和0x5534中系统有向上位机发送路径和名字。示教器提示开始同步作业文件。 **请求示例:** ```json { "name": "job/R1/WWWWW.JBR" } ``` --- ### 0x1D03 控制器回复下载请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 系统是否同意下载文件请求 | | name | string | 需要下载的作业文件名称 | | size | int | 此作业文件的文件大小 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意下载文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes", "name": "job/R1/WWWWW.JBR", "size": 217 } ``` --- ### 0x1D04 上位机向控制器上传文件 **方向:** 上位机 → 控制器 **说明:** 上传文件数据 --- ### 0x1D05 上位机告诉控制器上传结束 **方向:** 上位机 → 控制器 --- ### 0x1D06 控制器回复确认接收成功 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否上传成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 上传成功 | | false | 上传失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D07 控制器向上位机发送申请下载的文件 **方向:** 控制器 → 上位机 **说明:** 传输下载文件数据 --- ### 0x1D08 上位机回复接收结果 **方向:** 上位机 → 控制器 --- ### 0x1D09 控制器告诉上位机下载完成 **方向:** 控制器 → 上位机 --- ### 0x1D0A 上位机回复确认接收成功 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否下载成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 下载成功 | | false | 下载失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D0B 下载连接断开 **说明:** 断开下载连接 --- ### 0x1D10 上位机请求备份文件 **方向:** 上位机 → 控制器 --- ### 0x1D11 控制器回复备份请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 回复备份文件名 | **响应示例:** ```json { "answer": "controller.tar.gz" } ``` --- ### 0x1D12 上位机发送下载 log 文件完成 **方向:** 上位机 → 控制器 --- ### 0x1D13 上位机发送下载 eni 文件完成 **方向:** 上位机 → 控制器 --- # 7000 端口协议 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/06.7000%E7%AB%AF%E5%8F%A3%E5%8D%8F%E8%AE%AE.html ## 概述 ### 数据帧结构 | 项目 | 长度 (Byte) | 说明 | |------|------------|------| | SyncByte | 2 | `0x4E66` 固定包头 | | Length | 2 | 16进制长度 `0`–`0xffff`;不包含数据头和命令字,不包含 CRC 段 | | Command | 2 | 命令字 | | data | Length | 数据段(主要为 JSON 数据格式) | | CRC | 4 | 对不含包头数据做 CRC 校验(CRC32) | ### 通讯协议配置 7000 端口可选择 **TCP** 和 **UDP** 两种通讯协议,通过进入控制器后台修改配置文件 `config/controller.json`,在 `hostComputerService` 节点下: - `socketType`:socket 类型,可选 `"TCP"` 或 `"UDP"`,默认为 `"TCP"` - `checkCRC`:是否进行 CRC 检测;`false` 时不检测 CRC(但 CRC 所占用的 4 个字节仍需发送),默认为 `true` > 查询状态可设置为 UDP 通讯进行数据获取,最小周期可达 1ms。 --- ## 命令字总览 | 命令字 | 方向 | 功能 | |--------|------|------| | `0x1E00` | 上位机 → 控制器 | 查询状态 | | `0x1E01` | 控制器 → 上位机 | 查询状态回复 | | `0x1E02` | 上位机 → 控制器 | 运动控制 | | `0x1E03` | 控制器 → 上位机 | 运动控制回复 | | `0x1E04` | 上位机 → 控制器 | 变量、IO 控制 | | `0x1E10` | 上位机 → 控制器 | 开关伺服点位运动控制 | | `0x1E11` | 控制器 → 上位机 | 开关伺服点位运动控制回复 | | `0x1E12` | 上位机 → 控制器 | 点位发送 | | `0x1E13` | 控制器 → 上位机 | 点位发送回复 | --- ## 1. 查询状态(`0x1E00`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `channel` | int | 通道;最多 9 个通道,默认为 `1` | | `stop` | int | 停止发送;为 `1` 时停止之前的持续发送,下面的数据可不发 | | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `mode` | int | 请求回复模式;`0`:应答(请求一次回复一次),`1`:持续(请求一次持续回复) | | `interval` | int | 持续回复间隔时间(ms);仅 `mode=1` 时有效,范围 `[1, 60000]` | | `queryType` | string[] | 查询运行参数列表,无需查询的不写 | | `typeCfg` | object | 查询内容配置,仅需要查询相关类型数据时有效 | #### `queryType` 可选值 | 值 | 说明 | |----|------| | `realPosACS` | 实时坐标位置(关节坐标系) | | `realPosMCS` | 实时坐标位置(直角坐标系) | | `realPosPCS` | 实时坐标位置(工具坐标系) | | `realPosUCS` | 实时坐标位置(用户坐标系) | | `axisVel` | 轴速度 | | `axisAcc` | 轴加速度 | | `torque` | 力矩 | | `electric` | 电流 | | `numGVar` | 数值变量 | | `IO` | IO 端口 | | `serialNum` | 序列号 | | `runControlPosRunNum` | 运动控制当前轨迹已运行点位数 | | `detailedMotionPos` | 详细运动点位(每个机器人同一时刻仅支持一个通道查询) | #### `typeCfg` 配置说明 - `numGVar`:查询全局变量(int 类型),如 `["GD001", "GA001", "GI001", "GI333"]` - `IO`:查询 IO 端口(string 类型),如 `["DI1", "DI16", "DO1", "DO3", "DO17"]`;若查询的 IO 不存在,返回 `-1`;可查询最大数量不应大于 IO 个数 - `detailedMotionPos`: - `num`:每帧数据回复的点位数目(int) - `optional`:可选参数(string[]),可选 `"ACS"`、`"MCS"`、`"time"`、`"reset"` ### 请求示例 ```json { "channel": 1, "stop": 1, "robot": 1, "mode": 0, "interval": 10, "queryType": [ "realPosACS", "realPosMCS", "realPosPCS", "realPosUCS", "axisVel", "axisAcc", "torque", "electric", "numGVar", "IO", "serialNum", "runControlPosRunNum", "detailedMotionPos" ], "typeCfg": { "numGVar": ["GD001", "GA001", "GI001", "GI333"], "IO": ["DI1", "DI16", "DO1", "DO3", "DO17"], "detailedMotionPos": { "num": 10, "optional": ["ACS", "MCS", "time", "reset"] } } } ``` --- ## 2. 查询状态回复(`0x1E01`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `channel` | int | 通道;最多 9 个通道 | | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `replyData` | object | 回复查询的结果;未查询的不会回复 | #### 坐标数据说明 坐标格式:**机器人(前 7 个)+ 外部轴(后 5 个)** - 无外部轴时,坐标个数为轴数 - 有外部轴时,坐标个数为 `7 + 外部轴个数` #### `replyData` 字段详情 | 字段 | 说明 | |------|------| | `realPosACS` | 实时坐标位置(关节坐标系),float 数组 | | `realPosMCS` | 实时坐标位置(直角坐标系),float 数组 | | `realPosPCS` | 实时坐标位置(工具坐标系),float 数组 | | `realPosUCS` | 实时坐标位置(用户坐标系),float 数组 | | `axisVel` | 轴速度,float 数组 | | `axisAcc` | 轴加速度,float 数组 | | `torque` | 力矩,float 数组 | | `electric` | 电流,float 数组 | | `numGVar` | 全局变量键值对,如 `{"GD001": 0.1, "GA001": true, "GI001": 33}` | | `IO` | IO 状态键值对,如 `{"DI1": 1, "DO1": 0}`;若 IO 不存在返回 `-1` | | `runControlPosRunNum` | 运动控制当前轨迹已运行点位数 | | `serialNum` | 序列号;每次回复加 1,每个通道互相独立 | | `detailedMotionPos` | 详细运动点位 | #### `detailedMotionPos` 详情 - `num`:每帧数据回复的点位数目(int) - `data`:点位数组,每个点位包含: - `ACS`:关节坐标,float 数组 - `MCS`:直角坐标,float 数组 - `time`:时间戳 `[秒, 纳秒]`,如 `[123456, 654321]` ### 回复示例 ```json { "channel": 1, "robot": 1, "replyData": { "realPosACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosMCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosPCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosUCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "torque": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "electric": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "numGVar": {"GD001": 0.1, "GA001": true, "GI001": 33, "GI333": -55}, "IO": {"DI1": 1, "DI16": 0, "DO1": 0, "DO3": 1, "DO17": -1}, "runControlPosRunNum": 0, "serialNum": 1, "detailedMotionPos": { "num": 10, "data": [ { "time": [123456, 654321], "ACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "MCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] } ] } } } ``` --- ## 3. 运动控制(`0x1E02`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `clearBuffer` | int | 清空运动轨迹缓存队列;`1`:清空(不影响当前正在传输的数据),`0` 时可不发 | | `targetMode` | int | 运动模式;`0`:独立点位,`1`:连续轨迹 | | `sendMode` | int | `0`:一次传输完全部轨迹点位,`1`:每次传输部分点位 | | `runMode` | int | 每次传输部分点位时有效;`0`:接收完轨迹再运动,`1`:边接收边运动 | | `end` | int | `1`:停止之前的持续传输,下面的数据可不发;`0` 时可不发此字段 | | `sum` | int | 仅"接收完轨迹再运动"时有效;总共要发的帧数 | | `count` | int | 仅"接收完轨迹再运动"时有效;当前为第几帧 | | `cfg` | object | 运动配置(仅需第一帧设置,且仅第一帧有效) | | `targetPos` | float[] | 单目标点(使用此节点只走一个目标点) | | `targetVec` | object[] | 多目标点(按顺序走完所有点位;与 `targetPos` 同时存在时,仅 `targetPos` 生效) | #### `cfg` 字段详情 | 字段 | 类型 | 说明 | |------|------|------| | `coord` | string | 坐标系,如 `"ACS"` | | `extMove` | int | 是否有外部轴运动;`1`:有,`0` 或不写:无 | | `sync` | int | 外部轴是否同步;`0` 或不写:不同步,`1`:同步 | | `speed` | int | 速度设定;不写则使用默认值 | | `acc` | int | 加速度设定;不写则使用默认值 | | `pl` | int | 不写则默认 `5`;仅"独立点位"且使用 `targetVec` 时有效 | | `moveMode` | string | 运动模式;可选 `"TeachSet"`、`"MOVJ"`、`"MOVL"`、`"MOVS"`,默认 `"TeachSet"`;仅"独立点位"且使用 `targetVec` 时有效 | | `timeout` | int | 超时时间(ms),不写则不检测超时,范围 `10–10000`;仅"接收完轨迹再运动"时有效 | ### 示例一:独立点位 · 一次传输全部点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet" }, "targetPos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] // targetPos 和 targetVec 同时存在时,仅 targetPos 生效 } ``` ### 示例二:独立点位 · 每次传输部分点位 · 接收完轨迹再运动 ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 0, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet", "timeout": 100 }, "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] } ``` ### 示例三:连续轨迹 · 一次传输全部点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 1, "sendMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 }, { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` > `timeStamp`:运行到该点位时相对于起始点的时间(ms) ### 示例四:连续轨迹 · 每次传输部分点位 · 接收完轨迹再运动 ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 1, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "timeout": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` --- ## 4. 运动控制回复(`0x1E03`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `success` | bool | `true`:成功,`false`:失败 | | `size` | int | 运动轨迹缓存队列的当前轨迹数目;仅 `success=true` 时有该项 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"busy"` | 当前有未传输完成的数据 | | `"timeout"` | 接收超时 | | `"dataErr"` | 数据错误 | | `"termination"` | 发送端终止了正在传输的数据 | ### 回复示例 ```json { "robot": 1, "success": false, "size": 1, "cause": "timeout" } ``` --- ## 5. 变量、IO 控制(`0x1E04`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `numGVar` | object | 设置变量;`GA` 为 bool 型,`GI` 为 int 型,`GD` 为 double 型 | | `IO` | object | 设置 IO 口;`1`/`0` 表示 IO 口状态 | ### 请求示例 ```json { "numGVar": { "GA001": true, "GI033": 6, "GD666": -2.33 }, "IO": { "DO1": 1, "DO13": 0 } } ``` --- ## 6. 开关伺服点位运动控制(`0x1E10`) > **注意:** 该功能和"运动控制"功能(`0x1E02`)不可同时使用。 ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `switch` | bool | `true`:开启,`false`:关闭 | ### 请求示例 ```json { "robot": 1, "switch": true } ``` --- ## 7. 开关伺服点位运动控制回复(`0x1E11`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `success` | bool | `true`:成功,`false`:失败 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"busy"` | 当前通道被占用 | | `"dataErr"` | 数据错误 | | `"startupErr"` | 启动失败 | ### 回复示例 ```json { "success": false, "cause": "busy" } ``` --- ## 8. 点位发送(`0x1E12`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `end` | int | `1`:停止之前的持续传输,下面的数据可不发;`0` 时可不发此字段。在点位未传输完毕时,会清空之前接收到的数据,重新等待新的点位队列 | | `sum` | int | 总共要发的帧数 | | `count` | int | 当前的帧数 | | `PosVec` | float[][] | 点位坐标数组;格式:机器人(前 7 个)+ 外部轴(后 5 个) | ### 请求示例 ```json { "robot": 1, "end": 1, "sum": 10, "count": 1, "PosVec": [ [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] ] } ``` --- ## 9. 点位发送回复(`0x1E13`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `success` | bool | `true`:接收成功,`false`:接收失败 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"notStart"` | 未开启伺服点位运动控制模式 | | `"dataErr"` | 数据错误 | | `"termination"` | 发送端终止了正在传输的数据 | | `"cacheFull"` | 缓存区已满(最大缓存 6 条轨迹) | ### 回复示例 ```json { "robot": 1, "success": false, "cause": "dataErr" } ``` ## 附录一:TLV 协议格式详解 ### TLV 结构 7000 端口协议采用 **TLV(Type-Length-Value)** 封装的二进制帧结构,由以下字段组成: | 字段 | 偏移 | 长度 (Byte) | 说明 | |------|------|------------|------| | SyncByte | 0 | 2 | 同步头/魔数,固定值 `0x4E66`,用于帧同步 | | Length | 2 | 2 | 数据长度,大端序(Big-Endian),范围 `0`–`0xFFFF`;表示 Data 段的字节数 | | Command | 4 | 2 | 命令字,大端序,标识该帧的功能类型 | | Data | 6 | Length | 数据段,JSON 格式的 UTF-8 编码字符串 | | CRC | 6 + Length | 4 | CRC32 校验值,大端序;对 Command + Data 段计算 | ### 帧结构图示 ```text +----------+----------+----------+-----------+------------+ | SyncByte | Length | Command | Data | CRC | | 2 Bytes | 2 Bytes | 2 Bytes | N Bytes | 4 Bytes | +----------+----------+----------+-----------+------------+ | | CRC 校验范围 | +----------+--------------------------------------------+ ``` ### 字节序说明 - **Length**:大端序(Big-Endian),即高位字节在前 - **Command**:大端序 - **CRC**:大端序 ### 示例:查询状态帧 上位机发送查询状态请求(命令字 `0x1E00`): ```text | 0x4E 0x66 | 0x00 0x3C | 0x1E 0x00 | {...JSON...} | CRC32 | ``` 其中: - `SyncByte = 0x4E66` - `Length = 0x003C`(60 字节,即 JSON 数据的长度) - `Command = 0x1E00` - `Data` = 60 字节的 JSON 字符串 - `CRC` = 对 Command + Data 共 62 字节的 CRC32 校验值 ## 附录二:CRC32 校验说明 ### 校验范围 CRC 校验覆盖 **Command(2 字节)+ Data(Length 字节)**,不包含 SyncByte 和 Length 字段,也不包含 CRC 自身。 ### 校验算法 使用标准 **CRC-32** 算法,多项式为 `0x04C11DB7`。 ### 校验配置 通过修改配置文件 `config/controller.json` 中 `hostComputerService.checkCRC` 字段: - `true`(默认):启用 CRC 校验,数据帧必须包含正确的 CRC 值 - `false`:不进行 CRC 校验,但 CRC 所占用的 4 个字节仍需发送(可填充任意值) ### CRC 计算示例(伪代码) ```text function calcCRC32(data, length): crc = 0xFFFFFFFF for i in range(length): crc = crc ^ data[i] for j in range(8): if (crc & 1): crc = (crc >> 1) ^ 0xEDB88320 else: crc = crc >> 1 return crc ^ 0xFFFFFFFF ``` ## 附录三:通讯建立与握手流程 ### TCP 模式下的连接建立 1. **上位机发起 TCP 连接**:连接到控制器的 7000 端口(默认 IP 为控制器 IP) 2. **TCP 三次握手完成**:建立可靠的 TCP 连接 3. **数据帧传输**:按照 TLV 格式发送/接收数据帧 4. **心跳维持**:通过持续查询状态或定时发送数据保持连接 ### UDP 模式下的通讯 1. **无连接通讯**:UDP 模式下无需建立连接,直接发送数据帧 2. **端口绑定**:上位机绑定本地端口,控制器回复到该端口 3. **丢包处理**:UDP 不保证可靠传输,适合高频状态查询(最小周期 1ms) 4. **推荐用途**:高频状态查询场景使用 UDP,运动控制使用 TCP ### 持续模式下的通讯(mode=1) 1. 发送查询状态请求(`0x1E00`,`mode=1`),设置 `interval`(回复间隔) 2. 控制器按照 `interval` 周期持续回复状态数据(`0x1E01`) 3. 发送 `stop=1` 的请求停止持续回复 4. 每个通道独立维护 `serialNum`(序列号),每次回复递增 1 ## 附录四:命令字编址规则 ### 命令字结构 7000 端口的命令字采用 2 字节(16 位)编码,按功能分为以下段: | 范围 | 功能类别 | 说明 | |------|----------|------| | `0x1E00`–`0x1E0F` | 状态查询与控制 | 基本状态查询、运动控制、IO/变量控制 | | `0x1E10`–`0x1E1F` | 伺服点位运动 | 开关伺服、点位发送与接收 | ### 命令字对应关系 | 命令字 | 方向 | 功能 | |--------|------|------| | `0x1E00` | 上位机 → 控制器 | 查询状态 | | `0x1E01` | 控制器 → 上位机 | 查询状态回复 | | `0x1E02` | 上位机 → 控制器 | 运动控制 | | `0x1E03` | 控制器 → 上位机 | 运动控制回复 | | `0x1E04` | 上位机 → 控制器 | 变量、IO 控制 | | `0x1E10` | 上位机 → 控制器 | 开关伺服点位运动控制 | | `0x1E11` | 控制器 → 上位机 | 开关伺服点位运动控制回复 | | `0x1E12` | 上位机 → 控制器 | 点位发送 | | `0x1E13` | 控制器 → 上位机 | 点位发送回复 | ### 命令字编址规则 - 请求命令字为偶数(如 `0x1E00`、`0x1E02`) - 回复命令字为对应的奇数(如 `0x1E01`、`0x1E03`) - 上位机 → 控制器方向为偶数命令字 - 控制器 → 上位机方向为奇数命令字 ## 附录五:常见通讯配置示例 ### 示例 1:TCP 模式高频状态查询 上位机通过 TCP 连接 7000 端口,以 10ms 间隔持续查询机器人实时位置: ```json { "channel": 1, "stop": 0, "robot": 1, "mode": 1, "interval": 10, "queryType": ["realPosACS", "realPosMCS", "axisVel", "axisAcc"] } ``` ### 示例 2:UDP 模式最低延迟查询 将配置文件 `socketType` 设置为 `"UDP"`,以 1ms 间隔查询,用于高速数据采集: ```json { "channel": 1, "robot": 1, "mode": 1, "interval": 1, "queryType": ["realPosACS", "torque", "electric"] } ``` ### 示例 3:单次查询全局变量和 IO ```json { "channel": 1, "robot": 1, "mode": 0, "queryType": ["numGVar", "IO"], "typeCfg": { "numGVar": ["GD001", "GI001"], "IO": ["DI1", "DI2", "DO1", "DO2"] } } ``` ### 示例 4:运动控制 - 单点位运动 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 0, "cfg": { "coord": "MCS", "extMove": 0, "speed": 50, "acc": 80 }, "targetPos": [100.0, 200.0, 300.0, 0.0, 0.0, 0.0, 0.0] } ``` ### 推荐配置 | 场景 | 协议 | 间隔 | checkCRC | 说明 | |------|------|------|----------|------| | 实时监控(低延迟) | UDP | 1–5ms | false | 丢包容忍,最低延迟 | | 实时监控(可靠) | TCP | 10–20ms | true | 保证数据完整 | | 运动控制 | TCP | 按需 | true | 需可靠传输 | | 批量数据采集 | TCP | 50–100ms | true | 低频持续采集 | --- # 其他 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/07.%E5%85%B6%E4%BB%96.html ## 自定义接口 **说明:** rtl-24.03 控制器为客户提供 15 个空的接口,可供客户自定义使用。 ### 协议号列表 | 序号 | 协议号 | |------|----------| | 1 | 0x1F00 | | 2 | 0x1F01 | | 3 | 0x1F02 | | 4 | 0x1F03 | | 5 | 0x1F04 | | 6 | 0x1F05 | | 7 | 0x1F06 | | 8 | 0x1F07 | | 9 | 0x1F08 | | 10 | 0x1F09 | | 11 | 0x1F0A | | 12 | 0x1F0B | | 13 | 0x1F0C | | 14 | 0x1F0D | | 15 | 0x1F0E | --- # 安全参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/08.%E5%AE%89%E5%85%A8%E5%8F%82%E6%95%B0.html > **说明:** 安全参数用于配置机器人各轴的软限位角度范围,是保障机器人运动安全的关键配置。 --- ## 概述 安全参数主要用于设置机器人各关节轴的软限位(正向最大角度和负向最大角度)。当机器人关节运动超出设定的软限位范围时,控制器将触发安全保护机制,停止当前运动并上报错误。 ### 安全参数分类 | 类别 | 说明 | 相关命令 | |------|------|----------| | 关节软限位 | J1-J6 各轴正向/负向最大角度限制 | `0x1400`/`0x1401`/`0x1402` | | 安全 IO | 安全门、急停、光幕等安全输入信号 | 参见 IO 协议文档 | | 速度限制 | 各轴最大速度、笛卡尔最大速度 | 参见运动控制文档 | | 工作空间限制 | 笛卡尔空间范围限制 | 参见干涉区文档 | --- ## 关节软限位 ### 功能说明 关节软限位是在控制器软件层面设置的各轴运动范围限制。与机械限位(物理挡块)不同,软限位由控制器实时监控,当关节角度超出软限位范围时: 1. 控制器立即停止当前运动 2. 上报软限位错误提示 3. 需要手动将机器人移回安全工作范围后才能恢复 > **注意:** 软限位值应在机械限位范围内设置,否则软限位将无法起到保护作用。默认情况下,各轴软限位范围为 [-360°, 360°](即 [-2π, 2π] 弧度)。 ### 配置建议 | 轴 | 典型范围 | 说明 | |----|----------|------| | J1 | [-170°, 170°] | 基座旋转轴 | | J2 | [-90°, 155°] | 大臂俯仰轴 | | J3 | [-80°, 90°] | 小臂俯仰轴 | | J4 | [-180°, 180°] | 手腕旋转轴 | | J5 | [-120°, 120°] | 手腕俯仰轴 | | J6 | [-360°, 360°] | 手腕末端旋转轴 | --- ## 安全 IO 概述 安全 IO 是机器人控制系统中的关键安全信号入口,包括: | 安全信号 | 说明 | 触发后行为 | |----------|------|-----------| | 急停 (E-Stop) | 紧急停止按钮信号 | 立即切断伺服电源,所有运动停止 | | 安全门 (Safety Gate) | 安全门/围栏状态信号 | 根据模式:示教模式下允许操作,运行模式下触发急停 | | 安全光幕 (Light Curtain) | 安全光幕遮挡信号 | 类似安全门,检测到遮挡时触发安全停止 | | 使能开关 (Enable Switch) | 三段式使能开关 | 示教器上的安全使能装置 | ### 安全信号优先级 安全信号的优先级从高到低为: 1. **急停**:最高优先级,硬件级别切断伺服电源 2. **安全门/光幕**:软件级别,根据运行模式处理 3. **软限位**:软件级别,仅限制运动范围 --- ## 设置安全参数(上位机 → 控制器) **命令字:** `0x1400` | 参数 | 类型 | 说明 | |----------|--------|--------------------------| | `J1 Max` | double | J1 轴正向最大角度,弧度 | | `J1 Min` | double | J1 轴负向最大角度,弧度 | | `J2 Max` | double | J2 轴正向最大角度,弧度 | | `J2 Min` | double | J2 轴负向最大角度,弧度 | | `J3 Max` | double | J3 轴正向最大角度,弧度 | | `J3 Min` | double | J3 轴负向最大角度,弧度 | | `J4 Max` | double | J4 轴正向最大角度,弧度 | | `J4 Min` | double | J4 轴负向最大角度,弧度 | | `J5 Max` | double | J5 轴正向最大角度,弧度 | | `J5 Min` | double | J5 轴负向最大角度,弧度 | | `J6 Max` | double | J6 轴正向最大角度,弧度 | | `J6 Min` | double | J6 轴负向最大角度,弧度 | | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "J1 Max": 3.14, "J1 Min": -3.14, "J2 Max": 3.14, "J2 Min": -3.14, "J3 Max": 3.14, "J3 Min": -3.14, "J4 Max": 3.14, "J4 Min": -3.14, "J5 Max": 3.14, "J5 Min": -3.14, "J6 Max": 3.14, "J6 Min": -3.14, "robot": 1 } ``` ### 使用注意事项 1. **单位转换**:安全参数中的角度单位为**弧度**,设置时需要将度数值转换为弧度值(乘以 π/180) 2. **范围检查**:Max 值必须大于 Min 值,否则设置将无效 3. **即时生效**:参数设置后立即生效,无需重启控制器 4. **多机器人**:每个机器人(robot 1-4)需要单独设置安全参数 --- ## 查询安全参数(上位机 → 控制器) **命令字:** `0x1401` | 参数 | 类型 | 说明 | |---------|------|---------------------------| | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "robot": 1 } ``` --- ## 安全参数回复(控制器 → 上位机) **命令字:** `0x1402` | 参数 | 类型 | 说明 | |----------|--------|--------------------------| | `J1 Max` | double | J1 轴正向最大角度,弧度 | | `J1 Min` | double | J1 轴负向最大角度,弧度 | | `J2 Max` | double | J2 轴正向最大角度,弧度 | | `J2 Min` | double | J2 轴负向最大角度,弧度 | | `J3 Max` | double | J3 轴正向最大角度,弧度 | | `J3 Min` | double | J3 轴负向最大角度,弧度 | | `J4 Max` | double | J4 轴正向最大角度,弧度 | | `J4 Min` | double | J4 轴负向最大角度,弧度 | | `J5 Max` | double | J5 轴正向最大角度,弧度 | | `J5 Min` | double | J5 轴负向最大角度,弧度 | | `J6 Max` | double | J6 轴正向最大角度,弧度 | | `J6 Min` | double | J6 轴负向最大角度,弧度 | | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "J1 Max": 3.14, "J1 Min": -3.14, "J2 Max": 3.14, "J2 Min": -3.14, "J3 Max": 3.14, "J3 Min": -3.14, "J4 Max": 3.14, "J4 Min": -3.14, "J5 Max": 3.14, "J5 Min": -3.14, "J6 Max": 3.14, "J6 Min": -3.14, "robot": 1 } ``` --- ## 安全验证流程 建议按照以下流程进行安全参数配置和验证: 1. **读取当前参数**:通过 `0x1401` 查询现有安全参数配置 2. **确认机械限位**:确认各轴机械限位的实际范围 3. **设置软限位**:通过 `0x1400` 设置软限位,确保在机械限位范围内 4. **慢速验证**:以低速手动移动机器人到各轴极限位置,确认软限位生效 5. **观察报警**:确认超出软限位时控制器正确上报错误 6. **保存配置**:参数自动保存在控制器中,断电不丢失 --- # 语言 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/09.%E8%AF%AD%E8%A8%80.html ## 查询语言支持 **命令字:** `0x1052` **请求参数:** 无 **控制器回复** **命令字:** `0x1053` | 字段 | 类型 | 说明 | |------|------|------| | language | string[] | 控制器支持的语言列表 | | language_used | string | 控制器当前使用的语言 | **语言取值:** | 语言代码 | 说明 | |----------|------| | Chinese | 中文 | | Korean | 韩文 | | English | 英文 | **响应示例:** ```json { "language": ["Chinese", "Korean", "English"], "language_used": "Chinese" } ``` ## 查询上位机当前语言 **命令字:** `0x1054` **请求参数:** | 字段 | 类型 | 说明 | |------|------|------| | teachbox_language | string | 上位机当前使用的语言 | **请求示例:** ```json { "teachbox_language": "Chinese" } ``` ## 支持的语言类型 | 语言代码 | 说明 | |----------|------| | Chinese | 中文 | | Korean | 韩文 | | English | 英文 | --- # DH 参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/01.%E5%8F%82%E6%95%B0%E8%AE%BE%E7%BD%AE/01.DH%E5%8F%82%E6%95%B0.html ## 机器人基础参数 > **说明:** 包含有 DH 参数、关节参数、笛卡尔参数等机器人基础参数的设置与查询 --- ## 1. 上位机设置当前机器人 DH 参数 **命令字:** `0x20C0` ### 1.1 六轴串联机器人(存在耦合时动态限位生效) | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | L8 | double | 0.0 | L8杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | dynamicLimit | object | - | J2+J3范围限制 | | dynamicLimit.max | double | 0.0 | J2+J3最大值,范围[-500,500] | | dynamicLimit.min | double | 0.0 | J2+J3最小值,范围[-500,500] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "L8": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "dynamicLimit": { "max": 0.0, "min": 0.0 }, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.2 六轴协作机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | threeAxisDirection | double | -90.0 | 三轴方向,范围-90,0度 | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1, "threeAxisDirection": -90.0 } ``` --- ### 1.3 六轴喷涂机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 0.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | L8 | double | 0.0 | L8杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 0.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "L8": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.4 六轴异型二 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.5 五轴串联多关节 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio32 | double | 0.0 | 3/2耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.6 四轴 SCARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio34": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.7 四轴 SCARA 异型1 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "couplingRatio34": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.8 四轴连杆码垛 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 0.0 | 偏置值,默认为0,范围[-4000,4000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | maxDynamicLimit | double | 0.0 | J2+J3最大值,范围[-1000,1000] | | minDynamicLimit | double | 0.0 | J2+J3最小值,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 0.0, "couplingRatio23": 0.0, "couplingRatio34": 0.0, "maxDynamicLimit": 0.0, "minDynamicLimit": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.9 四轴码垛丝杆 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | amplificationRatio | double | 100.0 | 放大比,范围[1,1000] | | conversionRatio2 | double | 100.0 | 二轴转换比,范围[1,1000] | | conversionRatio3 | double | 100.0 | 三轴转换比,范围[1,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "amplificationRatio": 100.0, "conversionRatio2": 100.0, "conversionRatio3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.10 四轴串联多关节 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "couplingRatio23": 0.0, "couplingRatio34": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.11 四轴直角机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.12 四轴极坐标异型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | conversionRatio2 | double | 100.0 | 二轴转换比,范围[-4000,4000] | | conversionRatio3 | double | 100.0 | 三轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "conversionRatio2": 100.0, "conversionRatio3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.13 三轴 SCARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | couplingRatio23 | double | 0.0 | 2/3耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.14 三轴直角机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.15 三轴直角异型1 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | conversionRatio2 | double | 100.0 | 二轴转换比,范围[-4000,4000] | | conversionRatio3 | double | 100.0 | 三轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "conversionRatio2": 100.0, "conversionRatio3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.16 二轴 SCARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L2": 120.0, "L3": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.17 七轴串联多关节 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | Link | object | - | DH 参数列表 | | Link.L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | Link.L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | Link.L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | Link.L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | Link.L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | Link.L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "Link": { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0 }, "mountAngle": false, "robot": 1 } ``` --- ### 1.18 龙门焊接模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.19 四轴并联机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 110.0 | L2杆长,范围[-4000,4000](需小于 L3) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 110.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.20 酒槽机型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | L9 | double | 120.0 | L9杆长,范围[-4000,4000] | | L10 | double | 120.0 | L10杆长,范围[-4000,4000] | | L11 | double | 120.0 | L11杆长,范围[-4000,4000] | | L12 | double | 120.0 | 滑动电动缸导程,范围[-4000,4000] | | L13 | double | 120.0 | 顶升电动缸导程,范围[-4000,4000] | | L14 | double | 120.0 | 喷料距离,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "L8": 120.0, "L9": 120.0, "L10": 120.0, "L11": 120.0, "L12": 120.0, "L13": 120.0, "L14": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.21 龙门焊接2模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.22 四轴直角异型一 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | Link | object | - | DH 参数列表 | | Link.L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | Link.L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | Link.conversionRatio | array | [100.0, 100.0] | 轴转换比,范围[1,1000],长度2(一轴、四轴转换比) | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "Link": { "L1": 120.0, "L2": 120.0, "conversionRatio": [100.0, 100.0] }, "mountAngle": false, "robot": 1 } ``` --- ### 1.23 六轴龙门焊接模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | fiveAxisDirection | double | 0.0 | 五轴方向,范围-90,0度(0为竖直向下,-90为水平向右) | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "couplingRatio45": 0.0, "couplingRatio56": 0.0, "fiveAxisDirection": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.24 五轴混动机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | L9 | double | 0.0 | L9杆长,范围[-4000,4000] | | L10 | double | 120.0 | L10杆长,范围[-4000,4000] | | conversionratio_J1 | double | 100.0 | 1轴转换比,范围[-4000,4000] | | conversionratio_J2 | double | 100.0 | 2轴转换比,范围[-4000,4000] | | conversionratio_J3 | double | 100.0 | 3轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "L8": 120.0, "L9": 0.0, "L10": 120.0, "conversionratio_J1": 100.0, "conversionratio_J2": 100.0, "conversionratio_J3": 100.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.25 四轴 SCARA 异型2 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 100.0 | 1轴螺距,范围[-1000,0),(0,1000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | couplingRatio34 | double | 0.0 | 3/4耦合比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 3轴螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 100.0, "L2": 120.0, "L3": 120.0, "couplingRatio34": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.26 六轴异型三 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 120.0 | L6杆长,范围[-4000,4000] | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | L9 | double | 120.0 | L9杆长,范围[-4000,4000] | | L10 | double | 120.0 | L10杆长,范围[-4000,4000] | | L11 | double | 120.0 | L11杆长,范围[-4000,4000] | | L12 | double | 120.0 | L12杆长,范围[-4000,4000] | | L13 | double | 120.0 | L13杆长,范围[-4000,4000] | | L14 | double | 120.0 | L14杆长,范围[-4000,4000] | | L15 | double | 120.0 | L15杆长,范围[-4000,4000] | | L16 | double | 120.0 | L16杆长,范围[-4000,4000] | | L17 | double | 120.0 | L17杆长,范围[-4000,4000] | | L18 | double | 120.0 | L18杆长,范围[-4000,4000] | | L19 | double | 120.0 | L19杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 120.0, "L8": 120.0, "L9": 120.0, "L10": 120.0, "L11": 120.0, "L12": 120.0, "L13": 120.0, "L14": 120.0, "L15": 120.0, "L16": 120.0, "L17": 120.0, "L18": 120.0, "L19": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.27 三轴 SCARA 异型一 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.28 delta2D 并联机器人模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 110.0 | L2杆长,范围[-4000,4000](需小于 L3) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 110.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.29 龙门焊接3模型 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | conversionRatio_X | double | 100.0 | X 轴转换比,范围[-4000,4000] | | conversionRatio_Y | double | 100.0 | Y 轴转换比,范围[-4000,4000] | | conversionRatio_Z | double | 100.0 | Z 轴转换比,范围[-4000,4000] | | threeAxisDirection | double | 90.0 | 四轴方向,范围0,90度(四轴方向为0时,L4应填0) | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L4": 120.0, "L5": 120.0, "conversionRatio_X": 100.0, "conversionRatio_Y": 100.0, "conversionRatio_Z": 100.0, "mountAngle": false, "robot": 1, "threeAxisDirection": 90.0 } ``` --- ### 1.30 三轴串联异型一 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | threeAxisDirection | double | 90.0 | 三轴方向,范围0,90度 | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "mountAngle": false, "robot": 1, "threeAxisDirection": 90.0 } ``` --- ### 1.31 五轴协作机器人 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | -120.0 | L2杆长,范围[-4000,4000](请填负值) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | -120.0 | L6杆长,范围[-4000,4000](请填负值) | | L7 | double | 120.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": -120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": -120.0, "L7": 120.0, "L8": 120.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.32 四轴 SCARA 异型3 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | couplingRatio12 | double | 0.0 | 1/2耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | pitch | double | 80.0 | 螺距,范围[-1000,0),(0,1000] | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "couplingRatio12": 0.0, "mountAngle": false, "pitch": 80.0, "robot": 1 } ``` --- ### 1.33 六轴串联-CBBARA | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | -120.0 | L2杆长,范围[-4000,4000](请填负值) | | L3 | double | 120.0 | L3杆长,范围[-4000,4000] | | L4 | double | 120.0 | L4杆长,范围[-4000,4000] | | L5 | double | 120.0 | L5杆长,范围[-4000,4000] | | L6 | double | 0.0 | L6杆长,范围[-4000,4000] | | L7 | double | 0.0 | L7杆长,范围[-4000,4000] | | L8 | double | 120.0 | L8杆长,范围[-4000,4000] | | couplingRatio45 | double | 0.0 | 4/5耦合比,范围[-1000,1000] | | couplingRatio46 | double | 0.0 | 4/6耦合比,范围[-1000,1000] | | couplingRatio56 | double | 0.0 | 5/6耦合比,范围[-1000,1000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": -120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 0.0, "L7": 0.0, "L8": 120.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "mountAngle": false, "robot": 1 } ``` --- ### 1.34 高格立柱旋转四轴 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1 | double | 120.0 | L1杆长,范围[-4000,4000] | | L2 | double | 120.0 | L2杆长,范围[-4000,4000] | | conversionRatio1 | double | 100.0 | 1轴转换比,范围[-4000,4000] | | conversionRatio2 | double | 100.0 | 3轴转换比,范围[-4000,4000] | | mountAngle | bool | false | 机器人正装或倒装(false 正装,true 倒装) | | robot | int | 1 | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "conversionRatio1": 100.0, "conversionRatio2": 100.0, "mountAngle": false, "robot": 1 } ``` --- ## 2. 上位机查询当前机器人 DH 参数 **命令字:** `0x20C1` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robot": 1 } ``` --- ## 3. 控制器回复上位机当前机器人 DH 参数 **命令字:** `0x20C2` > **说明:** 回复内容与设置内容类似,额外包含 robotType(机器人类型)、angleToDistance(角度转距离列表)、distanceToAngle(距离转角度列表)等字段。 ### 3.1 六轴串联机器人(robotType: 1) | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | L1~L8 | double | - | 杆长参数,同设置 | | couplingRatio12~56 | double | - | 耦合比参数,同设置 | | fiveAxisDirection | double | 90.0 | 五轴方向,范围0,90度 | | dynamicLimit | object | - | J2+J3范围限制 | | dynamicLimit.max | double | 0.0 | J2+J3最大值,范围[-500,500] | | dynamicLimit.min | double | 0.0 | J2+J3最小值,范围[-500,500] | | mountAngle | bool | false | 机器人正装或倒装 | | robot | int | 1 | 当前机器人号,范围[1,4] | | angleToDistance | array | [1.0,...] | 机器人角度转距离列表,长度为当前机器人轴数 | | angleToDistanceSync | array | [27.775,...] | 机器人外部轴角度转距离列表,长度为外部轴总轴数 | | distanceToAngle | array | [1.0,...] | 机器人距离转角度列表,长度为当前机器人轴数 | | distanceToAngleSync | array | [0.036,...] | 机器人外部轴距离转角度列表 | | robotType | int | 1 | 当前机器人类型 | **angleToDistanceSync 计算公式:** - 旋转轴值都为1 - 直线轴公式:1 * 轴方向转换比 / 360 **distanceToAngleSync 计算公式:** - 旋转轴值都为1 - 直线轴公式:1 / 轴方向转换比 * 360 **回复示例 JSON:** ```json { "L1": 120.0, "L2": 120.0, "L3": 120.0, "L4": 120.0, "L5": 120.0, "L6": 120.0, "L7": 0.0, "L8": 0.0, "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "dynamicLimit": { "max": 0.0, "min": 0.0 }, "fiveAxisDirection": 90.0, "mountAngle": false, "robot": 1, "angleToDistance": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "angleToDistanceSync": [27.775, 27.775, 1.0], "distanceToAngle": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "distanceToAngleSync": [0.03600360036, 0.03600360036, 1.0], "robotType": 1 } ``` --- ### 3.2 机器人类型对照表 | robotType | 机器人类型 | |-----------|-----------| | 1 | 六轴串联机器人 | | 2 | 四轴 SCARA | | 3 | 四轴连杆码垛 | | 4 | 四轴串联多关节 | | 6 | 五轴串联多关节 | | 7 | 六轴协作机器人 | | 8 | 二轴 SCARA | | 9 | 三轴 SCARA | | 10 | 三轴直角机器人 | | 11 | 三轴直角异型1 | | 12 | 七轴串联多关节 | | 13 | 四轴 SCARA 异型1 | | 14 | 四轴码垛丝杆 | | 15 | 六轴喷涂机器人 | | 16 | 四轴直角机器人 | | 17 | 四轴极坐标异型 | | 18 | 六轴异型二 | | 19 | 龙门焊接模型 | | 20 | 四轴并联机器人 | | 21 | 酒槽机型 | | 22 | 龙门焊接2模型 | | 23 | 四轴直角异型一 | | 24 | 六轴龙门焊接模型 | | 25 | 五轴混动机器人 | | 26 | 四轴 SCARA 异型2 | | 27 | 六轴异型三 | | 28 | 三轴 SCARA 异型一 | | 29 | delta2D 并联机器人模型 | | 30 | 龙门焊接3模型 | | 31 | 三轴串联异型一 | | 32 | 五轴协作机器人 | | 33 | 四轴 SCARA 异型3 | | 34 | 六轴串联-CBBARA | | 35 | 高格立柱旋转四轴 | > 其他类型的回复 JSON 结构与设置时类似,额外增加 angleToDistance、distanceToAngle、robotType 字段。 --- ## 4. 上位机请求保存预置机器人参数 **命令字:** `0x20C3` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 预置机器人自定义保存名称 | **请求示例 JSON:** ```json { "name": "AAA" } ``` > 预置文件格式:当前机器人类型+"_"+自定义保存名称 **控制器回复:** ```json {} ``` --- ## 5. 上位机发送设置机器人关节参数 **命令字:** `0x20C5` | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | axis | int | 1 | 机器人轴编号,范围[1,7] | | axisDirection | int | 1 | 关节实际方向,范围[-1,1] | | backLash | double | 0.0 | 齿轮反向间隙,范围[0,9999.999] | | direction | int | -1.0 | 模型方向,范围[-1,1] | | encoderResolution | int | 17 | 编码器位数,范围[1,100] | | isReduceRatioEnable | bool | true | 编码器是否经过减速机 | | maxAcc | double | 6.0 | 最大加速度,范围[1,10000] | | maxDec | double | -6.0 | 最大减速度,范围[-10000,-1] | | maxJerkAcc | double | 1.0 | 最大加加速度,范围[1,20000](插补方式为加加速度时生效) | | maxJerkDec | double | -1.0 | 最大减减速度,范围[-20000,-1](插补方式为加加速度时生效) | | maxRPM | double | 1.0 | 最大正转速,范围[1,5] | | maxReverseRPM | double | -1.0 | 最大反转速,范围[-5,-1] | | positiveLimit | double | 160.0 | 关节正限位,范围[1,3000]° | | ratedRPM | double | 3600.0 | 额定正转速,范围[1,10000]rpm | | ratedReverseRPM | double | -3600.0 | 额定反转速,范围[-10000,-1]rpm(值为额定正速度的负值) | | ratedReverseSpeed | double | -270.0540 | 额定反速度,单位°/s(公式:额定反速度 / 减速比 * 6 * 角度转距离值) | | ratedSpeed | double | 270.0540 | 额定正速度,单位°/s(公式:额定正速度 / 减速比 * 6 * 角度转距离值) | | reducRatio | double | 79.9840 | 减速比,范围(0,1000] | | reverseLimit | double | -160.0 | 关节反限位,范围[-3000,-1]° | | robot | int | 1 | 当前机器人,范围[1,4] | **示例 JSON:** ```json { "axis": 1, "axisDirection": 1, "backLash": 0.0, "direction": -1.0, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 6.0, "maxDec": -6.0, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 160.0, "ratedRPM": 3600.0, "ratedReverseRPM": -3600.0, "ratedReverseSpeed": -270.0540, "ratedSpeed": 270.0540, "reducRatio": 79.9840, "reverseLimit": -160.0, "robot": 1 } ``` --- ## 6. 上位机查询机器人关节参数 **命令字:** `0x20C6` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | axis | int | 机器人轴编号,范围[1,7] | **请求示例 JSON:** ```json { "axis": 1 } ``` --- **命令字:** `0x20C7`(控制器回复) > 回复参数同设置参数一致。 --- ## 7. 上位机发送设置机器人笛卡尔参数 **命令字:** `0x20C8` | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | maxAcc | double | 7.50 | 最大加速度,范围[1,10000] | | maxAttitudeVel | double | 500.0 | 姿态运动最大速度,范围[1,1000]°/s | | maxDec | double | -7.50 | 最大减速度,范围[-10000,-1] | | maxJerk | double | 10000.0 | 最大加加速度,范围[1,20000] | | maxSpeed | double | 2000.0 | 最大速度,范围[1,5000]mm/s | | robot | int | 1 | 当前机器人号,范围[1,4] | | speedLimitMode | int | 0 | 速度限制方式,范围[0,1](0表示位姿,1表示位置) | **示例 JSON:** ```json { "maxAcc": 7.50, "maxAttitudeVel": 500.0, "maxDec": -7.50, "maxJerk": 10000.0, "maxSpeed": 2000.0, "robot": 1, "speedLimitMode": 0 } ``` --- ## 8. 上位机查询机器人笛卡尔参数 **命令字:** `0x20C9` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robot": 1 } ``` --- **命令字:** `0x20CA`(控制器回复) > 回复参数同设置参数一致。 --- ## 9. 上位机设置机器人关节多圈值参数 **命令字:** `0x20CB` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | | robotAxis | array | 关节多圈值参数列表,长度为当前机器人轴数 | ### robotAxis 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | axisSlaveSum | int | 从动轴数量,范围[0,3] | | enable | int | 编码器多圈值溢出计数功能,范围[0,1](0关闭,1开启) | | encode | array | 编码器最大值最小值列表,长度为关节从动轴数量+1 | ### encode 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | max | string | 编码器最大值,范围[-2^32,2^32] | | min | string | 编码器最小值,范围[-2^32,2^32](不得大于编码器最大值) | **示例 JSON:** ```json { "robot": 1, "robotAxis": [ { "axisSlaveSum": 0, "enable": 1, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "max": "32768", "min": "-32768" } ] } ] } ``` --- ## 10. 上位机查询机器人编码器多圈值参数 **命令字:** `0x20CC` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robot": 1 } ``` --- **命令字:** `0x20CD`(控制器回复) > 回复参数同设置参数一致。 --- ## 11. 上位机申请另存为预置机器人参数文件 **命令字:** `0x20CE` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 机器人类型名称 | | presetRobotName | string | 预置机器人参数自定义名称 | **示例 JSON:** ```json { "name": "R_GENERAL_6S", "presetRobotName": "AAA" } ``` --- ## 12. 上位机查询预置机器人文件列表 **命令字:** `0x20CF` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 机器人类型名称 | **请求示例 JSON:** ```json { "name": "R_GENERAL_6S" } ``` --- **命令字:** `0x20D0`(控制器回复) | 参数名 | 类型 | 说明 | |--------|------|------| | listnum | int | 预置机器人数量 | | nameList | array | 预置机器人自定义名称列表 | **回复示例 JSON:** ```json { "listnum": 2, "nameList": ["AAA.json", "BBB.json"] } ``` --- ## 13. 上位机发送获取预置参数请求 **命令字:** `0x20D1` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 机器人类型名称 | | presetRobotName | string | 预置机器人参数自定义名称 | **请求示例 JSON:** ```json { "name": "R_GENERAL_6S", "presetRobotName": "AAA.json" } ``` --- ## 14. 控制器回复机器人已保存的预置机器人参数 **命令字:** `0x20D2` | 参数名 | 类型 | 说明 | |--------|------|------| | DH | object | 保存的预置机器人 DH 参数 | | Joint | array | 保存的预置机器人关节参数列表 | ### DH 参数 | 参数名 | 类型 | 说明 | |--------|------|------| | L1~L8 | double | 杆长参数 | | angleToDistance | array | 机器人角度转距离列表 | | couplingRatio12~56 | double | 耦合比参数 | | distanceToAngle | array | 机器人距离转角度列表 | | dynamicLimit | object | J2+J3范围限制 | | fiveAxisDirection | double | 五轴方向 | | mountAngle | bool | 机器人正装或倒装 | | robotType | int | 当前机器人类型 | ### Joint 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | axisDirection | int | 关节实际方向 | | axisNum | int | 机器人轴编号 | | backLash | double | 齿轮反向间隙 | | direction | int | 模型方向 | | encoderResolution | int | 编码器位数 | | isReduceRatioEnable | bool | 编码器是否经过减速机 | | maxAcc | double | 最大加速度 | | maxDec | double | 最大减速度 | | maxJerkAcc | double | 最大加加速度 | | maxJerkDec | double | 最大减减速度 | | maxRPM | double | 最大正转速 | | maxReverseRPM | double | 最大反转速 | | positiveLimit | double | 关节正限位 | | ratedRPM | double | 额定正转速 | | ratedReverseRPM | double | 额定反转速 | | ratedReverseSpeed | double | 额定反速度 | | ratedSpeed | double | 额定正速度 | | reducRatio | double | 减速比 | | reverseLimit | double | 关节反限位 | **回复示例 JSON:** ```json { "DH": { "L1": 390.0, "L2": 450.872, "L3": 99.462, "L4": 471.29, "L5": 123.0, "L6": -0.544, "L7": -0.0, "L8": 0.0, "angleToDistance": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "couplingRatio12": 0.0, "couplingRatio23": 0.0, "couplingRatio32": 0.0, "couplingRatio34": 0.0, "couplingRatio45": 0.0, "couplingRatio46": 0.0, "couplingRatio56": 0.0, "distanceToAngle": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "dynamicLimit": { "max": 20.0, "min": -20.0 }, "fiveAxisDirection": 90, "mountAngle": false, "robotType": 1 }, "Joint": [ { "axisDirection": 1, "axisNum": 1, "backLash": 0.0, "direction": -1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 6.0, "maxDec": -6.0, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 160.0, "ratedRPM": 3600.0, "ratedReverseRPM": -3600.0, "ratedReverseSpeed": -270.05401080216, "ratedSpeed": 270.05401080216, "reducRatio": 79.984, "reverseLimit": -160.0 }, { "axisDirection": 1, "axisNum": 2, "backLash": 0.0, "direction": 1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 3.75, "maxDec": -3.75, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 100.0, "ratedRPM": 3600.0, "ratedReverseRPM": -3600.0, "ratedReverseSpeed": -196.690858428112, "ratedSpeed": 196.690858428112, "reducRatio": 109.817, "reverseLimit": -100.0 }, { "axisDirection": 1, "axisNum": 3, "backLash": 0.0, "direction": 1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 90.0, "ratedRPM": 5000.0, "ratedReverseRPM": -5000.0, "ratedReverseSpeed": -299.604522030919, "ratedSpeed": 299.604522030919, "reducRatio": 100.132, "reverseLimit": -75.0 }, { "axisDirection": 1, "axisNum": 4, "backLash": 0.0, "direction": -1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 190.0, "ratedRPM": 5000.0, "ratedReverseRPM": -5000.0, "ratedReverseSpeed": -252.175009456563, "ratedSpeed": 252.175009456563, "reducRatio": 118.965, "reverseLimit": -190.0 }, { "axisDirection": 1, "axisNum": 5, "backLash": 0.0, "direction": 1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 20.0, "ratedRPM": 4500.0, "ratedReverseRPM": -4500.0, "ratedReverseSpeed": -337.491562710932, "ratedSpeed": 337.491562710932, "reducRatio": 80.002, "reverseLimit": -200.0 }, { "axisDirection": 1, "axisNum": 6, "backLash": 0.0, "direction": -1, "encoderResolution": 17, "isReduceRatioEnable": true, "maxAcc": 7.5, "maxDec": -7.5, "maxJerkAcc": 1.0, "maxJerkDec": -1.0, "maxRPM": 1.0, "maxReverseRPM": -1.0, "positiveLimit": 360.0, "ratedRPM": 4500.0, "ratedReverseRPM": -4500.0, "ratedReverseSpeed": -337.622388115692, "ratedSpeed": 337.622388115692, "reducRatio": 79.971, "reverseLimit": -360.0 } ] } ``` --- ## 15. 上位机发送酒槽机型标记圆心请求 **命令字:** `0x20D3` ```json {} ``` --- ## 16. 机器人安装角度设置 **命令字:** `0x20D6` | 参数名 | 类型 | 说明 | |--------|------|------| | mountMethod | int | 安装方式:0-正装,1-倒装,2-侧装 | | mountAngle | int[] | 安装角度,角度值。示教器做了限制:正装 [0,0,0],倒装 [0,180,0],侧装随意 | **请求示例 JSON:** ```json { "mountMethod": 0, "mountAngle": [0, 0, 0] } ``` --- ## 17. 机器人安装角度获取 **命令字:** `0x20D7` | 参数名 | 类型 | 说明 | |--------|------|------| | mountMethod | int | 安装方式:0-正装,1-倒装,2-侧装,-1-当前安装角度 | **请求示例 JSON:** ```json { "mountMethod": 0 } ``` --- ## 18. 机器人安装角度返回 **命令字:** `0x20D8` | 参数名 | 类型 | 说明 | |--------|------|------| | mountMethod | int | 安装方式:0-正装,1-倒装,2-侧装 | | mountAngle | int[] | 安装角度,角度值 | **响应示例 JSON:** ```json { "mountMethod": 0, "mountAngle": [0, 0, 0] } ``` --- # 运动控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/02.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6.html ## 伺服状态 ### 说明 - 伺服状态的设置与查询,当前已连接伺服方式的查询 - 当前伺服状态为伺服错误时,无法通过0x3000命令修改伺服状态 - 上位机设置机器人伺服状态 --- #### 上位机设置机器人伺服状态 **命令字:** `0x3000` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | state | int | [0,1] | 伺服状态;0表示伺服停止,1表示伺服就绪 | ```json { "robot": 1, "state": 1 } ``` --- #### 上位机查询机器人伺服状态 **命令字:** `0x3001` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人伺服状态 **命令字:** `0x3002` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,1] | 0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 当前机器人号 | | state | int | [0,3] | 伺服状态;0表示伺服停止,1表示伺服就绪,2表示伺服错误,3表示伺服运行 | ```json { "mode": 0, "robot": 1, "state": 0 } ``` --- #### 上位机查询机器人伺服连接方式 **命令字:** `0x3003` ```json {} ``` --- #### 控制器回复上位机机器人伺服连接方式 **命令字:** `0x3004` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | servoType | int | [0,1] | 0表示实际伺服,1表示虚拟伺服 | ```json { "robot": 1, "servoType": 0 } ``` --- ### 查询伺服连接状态 **命令字:** `0x3005` **控制器回复** | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1,4] | | servoType | int | 当前机器人伺服连接状态:0 实际伺服,1 虚拟伺服 | ```json { "robot": 1, "servoType": 0 } ``` --- ## 操作模式 ### 说明 - 机器人当前操作模式的设置与查询 - 操作模式默认为示教模式 --- #### 上位机设置当前机器人操作模式 **命令字:** `0x3010` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,2] | 操作模式;0表示示教模式,1表示远程模式,2表示运行模式 | ```json { "mode": 0 } ``` --- #### 上位机查询当前机器人操作模式 **命令字:** `0x3011` ```json {} ``` --- #### 控制器回复上位机当前机器人操作模式 **命令字:** `0x3012` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,2] | 操作模式;0表示示教模式,1表示远程模式,2表示运行模式 | ```json { "mode": 0 } ``` --- ## 示教模式 ### 说明 - 示教模式类型的设置与查询 - 拖拽模式运动时切换为点动模式会失败 --- #### 上位机设置当前示教模式类型 **命令字:** `0x3020` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | teachType | int | [0,2] | 示教模式类型;0表示点动(单动),1表示拖拽示教,2表示点动(联动) | ```json { "teachType": 0 } ``` --- #### 上位机查询当前示教模式类型 **命令字:** `0x3021` ```json {} ``` --- #### 控制器回复上位机当前示教模式类型 **命令字:** `0x3022` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | type | int | [0,2] | 示教模式类型;0表示点动(单动),1表示拖拽示教,2表示点动(联动) | ```json { "type": 0 } ``` --- ## 使能 ### 说明 - 使能状态与触发模式的设置与查询 - 触发模式设置为硬件触发时,上下使能端口不能都为0 --- #### 上位机设置使能状态 **命令字:** `0x3030` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadman | int | [0,1] | 上下使能开关;0表示下使能,1表示上使能 | | deadmanmode | int | - | 使能触发方式;默认为0,即软件触发 | ```json { "deadman": 1, "deadmanmode": 0 } ``` --- #### 上位机查询使能状态 **命令字:** `0x3031` ```json {} ``` --- #### 控制器回复上位机使能状态 **命令字:** `0x3032` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadman | int | [0,1] | 上下使能开关;0表示下使能,1表示上使能 | ```json { "deadman": 1 } ``` --- #### 上位机设置机器人使能触发模式 **命令字:** `0x3033` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadmanPortOne | int | [0,端口总数] | 使能端口1(上使能端口) | | deadmanPortTwo | int | [0,端口总数] | 使能端口2(下使能端口),和上使能端口不能同时为0 | | mode | int | [0,1] | 使能触发模式;0为软件触发,1为硬件触发 | | robot | int | [1,4] | 当前机器人号 | ```json { "deadmanPortOne": 14, "deadmanPortTwo": 2, "mode": 0, "robot": 1 } ``` --- #### 上位机查询机器人使能触发方式 **命令字:** `0x3034` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人使能触发方式 **命令字:** `0x3035` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadmanPortOne | int | [0,端口总数] | 使能端口1(上使能端口) | | deadmanPortTwo | int | [0,端口总数] | 使能端口2(下使能端口) | | mode | int | [0,1] | 使能触发模式;0为软件触发,1为硬件触发 | | robot | int | [1,4] | 当前机器人号 | ```json { "deadmanPortOne": 14, "deadmanPortTwo": 2, "mode": 0, "robot": 1 } ``` --- #### 上位机请求伺服上使能 **命令字:** `0x3036` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求伺服下使能 **命令字:** `0x3037` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- ## 点动坐标模式 ### 说明 - 机器人点动运行坐标模式的设置与查询 --- #### 上位机设置机器人点动坐标模式 **命令字:** `0x3040` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coordinate | int | [0,3] | 点动坐标模式;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | robot | int | [1,4] | 当前机器人号 | ```json { "coordinate": 1, "robot": 1 } ``` --- #### 上位机查询机器人点动坐标模式 **命令字:** `0x3041` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人点动坐标模式 **命令字:** `0x3042` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coordinate | int | [0,3] | 点动坐标模式;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | robot | int | [1,4] | 当前机器人号 | ```json { "coordinate": 1, "robot": 1 } ``` --- ## 机器人速度 ### 说明 - 包括有点动模式和定距移动速度的设置与查询 --- #### 上位机请求设置机器人速度参数 **命令字:** `0x3050` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | type | int | [0,2] | 当前速度模式;0表示点动速度,1表示关节坐标定距移动,2表示直角坐标定距移动 | | speed | int | [1,100] | 全局速度(%) | | mocroDotSpeedACS | double | (0,2000] | 关节坐标定距移动(°);仅当前点动坐标为关节坐标时使用 | | mocroDotSpeedMCS | double | (0,2000] | 直角坐标定距移动(mm);当前点动坐标不为关节坐标时使用 | ```json { "robot": 1, "type": 0, "speed": 5, "mocroDotSpeedACS": 0.1, "mocroDotSpeedMCS": 0.1 } ``` --- #### 上位机查询机器人速度参数 **命令字:** `0x3051` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人速度参数 **命令字:** `0x3052` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | type | int | [0,2] | 当前速度模式;0表示点动速度,1表示关节坐标定距移动,2表示直角坐标定距移动 | | speed | int | [1,100] | 全局速度 | | mocroDotSpeedACS | double | (0,2000] | 关节坐标定距移动(°) | | mocroDotSpeedMCS | double | (0,2000] | 直角坐标定距移动(mm) | ```json { "robot": 1, "type": 0, "speed": 5, "mocroDotSpeedACS": 0.1, "mocroDotSpeedMCS": 0.1 } ``` --- ## 运动到点 ### 说明 - 包含有回零、运动到标记点、关节直线运动等操作 - 机器人运动前需将伺服改为使能状态,否则发送以下命令机器人也不会动作 --- #### 上位机请求机器人回零 **命令字:** `0x3070` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | isWithExternal | int | [0,1] | 是否包含外部轴 | | robot | int | [1,4] | 当前机器人号 | ```json { "isWithExternal": 0, "robot": 1 } ``` --- #### 上位机请求机器人运行到目标点 **命令字:** `0x3071` **RobotPos 对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | P 点类型;0表示 NONE_TYPE,1表示 P_TYPE,2表示 E_TYPE,3表示 RP_TYPE,4表示 AP_TYPE,5表示 GP_TYPE,6表示 GE_TYPE | | data | array | 点位数据列表 | | key | string | 变量名称 | | note | string | 变量注释 | | paraVarData | array | 点位列表,对"data"节点数据进行进一步说明 | **data 列表说明:** - 第一二位:坐标类型(0,0表示关节坐标,1,1表示直角坐标,2,1工具坐标,3,1用户坐标) - 第三位:左右手(1表示左手,2表示右手,0表示无左右手) - 第四五六七位:备用,默认位0 - 第八至十四位:机器人本体坐标值(7位) - 第十五至十九位:外部轴坐标值(最大支持五个外部轴) **paraVarData 元素:** | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | data | double | - | 同"data"节点 | | secondvalue | int | [0,1] | 0表示位置变量名固定(如 P001),1表示不固定(如 P[I001]) | | value | int | [0,17] | 数值类型;0表示数值类型;1表示 int 变量;2表示 double 变量;3表示 bool 变量;4表示全局 int 变量;5表示全局 double 变量;6表示全局 bool 变量;7表示 string 常量;8表示 string 变量;9表示全局 string 变量;10表示 P 点变量;11表示全局 P 点变量;12表示 E 点变量;13表示全局 E 点变量 | | varname | string | - | 使用的变量名称 | | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | positionName | string | - | 目标点位名 | | robot | int | [1,4] | 当前机器人号 | ```json { "RobotPos": { "ctype": 0, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 470.7460, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 817.3340, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "positionName": "MoveToGetPoint", "robot": 1 } ``` --- #### 上位机请求机器人外部轴运行到目标点 **命令字:** `0x3072` **RobotPos 对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | P 点类型;0表示 NONE_TYPE,1表示 P_TYPE,2表示 E_TYPE,3表示 RP_TYPE,4表示 AP_TYPE,5表示 GP_TYPE,6表示 GE_TYPE | | data | array | 点位数据列表(长度21) | | key | string | 变量名称 | | note | string | 变量注释 | | paraVarData | array | 点位列表 | | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "RobotPos": { "ctype": 0, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 470.7460, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 817.3340, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "robot": 1 } ``` --- #### 上位机请求机器人运行到程序点 **命令字:** `0x3073` | 参数名 | 类型 | 说明 | |--------|------|------| | job | string | 程序名称 | | robot | int | 当前机器人号 | | suffix | string | 程序文件后缀;.JBR 表示主程序,.JBP 表示后台局部程序,.JBPG 表示后台全局程序 | | var | string | 点位名称 | ```json { "job": "WWW", "robot": 1, "suffix": ".JBR", "var": "P0001" } ``` --- #### 上位机请求机器人运行到用户坐标标定点 **命令字:** `0x3074` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | posType | int | [0,2] | 移动到点类型;0表示原点,1表示 X 值,2表示 Y 值 | | robot | int | [1,4] | 当前机器人号 | | userNum | int | [1,999] | 当前用户坐标坐标号 | ```json { "posType": 0, "robot": 1, "userNum": 1 } ``` --- #### 上位机请求机器人运行到复位点(不含外部轴) **命令字:** `0x3075` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求机器人运行到复位点(含外部轴) **命令字:** `0x3076` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求机器人点到点运动到点 **命令字:** `0x3077` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度7,机器人本体坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人直线运动到点 **命令字:** `0x3078` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度7,机器人本体坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人圆弧运动到点 **命令字:** `0x3079` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | isFull | bool | - | false 表示 MOVC,true 表示 MOVCA | | posOne | array | 圆弧起始点位置信息(长度7) | | | posTwo | array | 圆弧经过中间点位置信息(长度7) | | | posThree | array | 圆弧目标点位置信息(长度7) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "isFull": false, "posOne": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "posTwo": [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0], "posThree": [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人样条曲线运动到点 **命令字:** `0x307A` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 样条曲线的轨迹点位二维数组;一维表示轨迹上的目标点位,二维机器人本体坐标(长度7) | | | robot | int | [1,4] | 当前机器人号 | | size | int | - | 样条曲线的点数目,最小为4 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [ [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 25.5, 0.0, 0.0, 0.0, 0.0, 0.0] ], "robot": 1, "size": 4, "vel": 5 } ``` --- #### 上位机请求机器人外部轴点到点运动到点 **命令字:** `0x307B` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人外部轴直线运动到点 **命令字:** `0x307C` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人外部轴圆弧运动到点 **命令字:** `0x307D` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | posOne | array | 圆弧起始点位置信息(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | posTwo | array | 圆弧经过中间点位置信息(长度12) | | | posThree | array | 圆弧目标点位置信息(长度12) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "posOne": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "posTwo": [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0, 14.2, 0.0, 0.0, 0.0, 0.0], "posThree": [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0, 21.3, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人目标点可达性判断 **命令字:** `0x307F` **协议名:** `eRobotArrivalJudgeInquire` **说明:** - 该命令用于判定某个目标点位是否可被当前机器人按指定运动方式到达。 - 适用于上位机在执行运动前先进行可达性预判,避免无效或不可实现的目标点。 - `movetype` 可使用 `MOVEJ`、`MOVEL` 或其他控制器支持的运动类型字符串。 | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人编号 | | pos | array | 目标点位坐标/姿态数组,长度通常为6(x, y, z, a, b, c) | | movetype | string | 运动类型字符串,例如 `MOVJ`、`MOVL` | ```json { "POS_REACHABLE": { "robotNum": 1, "pos": [x, y, z, a, b, c], "movetype": "MOVJ" } } ``` **含义:** - `robotNum`:当前机器人编号。 - `pos`:待判断目标点位的坐标/姿态数组。 - `movetype`:目标运动类型字符串,用于判断该点位在当前机器人上是否可按该运动方式到达。 --- #### 控制器回复上位机机器人目标点可达性判断结果 **命令字:** `0x3080` **协议名:** `eRobotArrivalJudgeRespound` **说明:** - 控制器根据上位机发送的目标点和运动类型,返回是否可达的布尔判定结果。 - 该返回值仅表示目标点在当前配置下是否满足可达性判断,不代表运动已执行。 | 参数名 | 类型 | 说明 | |--------|------|------| | ret | bool | 是否可达;`true` 表示可到达,`false` 表示不可到达或不满足到位判断条件 | ```json { "ret": true } ``` 或者 ```json { "ret": false } ``` **含义:** - `ret`:布尔值。 - `true`:目标点可被当前机器人按该运动方式到达。 - `false`:目标点不可达,或不满足当前到位判断条件。 --- #### 上位机请求机器人门控运动 **命令字:** `0x3081` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | ParaACC | double | - | 加速度 | | ParaDEC | double | - | 减速度 | | ParaV | double | - | 速度 | | ParaPL | int | [0,5] | 平滑 | | aheadtype | int | [0,2] | 提前执行类型;0表示时间,1表示距离,2表示进度 | | ParaAHEAD | double | - | 提前执行值 | | offsetAxis | int | [0,2] | 走门型的轴 | | axis_offset_type | int | [0,1] | 偏移轴的偏移方式;0表示最大高度,1表示最大坐标 | | para_line_or_coord_max | double | - | 偏移轴最大坐标或者最大偏移量 | | para_straight_up_dis | double | - | 垂直上升距离 | | para_straight_down_dis | double | - | 垂直下降距离 | | ParaSPIN | int | [0,1] | 门型运动方式;0表示关节,1表示直线 | | pos | array | 长度14,前7位为机器人本体坐标,后7位为外部轴坐标 | 目标位置 | | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | ```json { "robot": 1, "ParaACC": 100.0, "ParaDEC": 100.0, "ParaV": 10, "ParaPL": 0, "aheadtype": 0, "ParaAHEAD": 5, "offsetAxis": 2, "axis_offset_type": 0, "para_line_or_coord_max": 1000, "para_straight_up_dis": 10, "para_straight_down_dis": 10, "ParaSPIN": 0, "pos": [791.9649933992308, -122.76709767976902, 360.000035291658, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "coord": 1 } ``` --- ## 运动参数 ### 说明 - 上位机设置机器人运动参数 --- #### 上位机设置机器人运动参数 **命令字:** `0x3090` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | absolutePosResolution | double | [0.0001,0.1] | 绝对位置分辨率(°) | | interpolationMethod | int | [0,2] | 机器人插补方式;0表示 S 型插补,1表示梯形插补,2表示加加速度插补 | | minTrajectTime | object | - | 最小加/减速度时间 | | minTrajectTime.minAccTime | double | [0.05,1] | 最小加速度时间(s) | | minTrajectTime.minDecTime | double | [0.05,1] | 最小减速度时间(s) | | runDelayTime | int | [500,20000] | 运行延时时间(ms) | | stopTime | int | [240,2000] | 暂停时间(ms) | ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "minTrajectTime": { "minAccTime": 0.10, "minDecTime": 0.10 }, "runDelayTime": 500, "stopTime": 240 } ``` --- #### 上位机查询机器人运动参数 **命令字:** `0x3091` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人运动参数 **命令字:** `0x3092` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | absolutePosResolution | double | [0.0001,0.1] | 绝对位置分辨率(°) | | interpolationMethod | int | [0,2] | 机器人插补方式;0表示 S 型插补,1表示梯形插补,2表示加加速度插补 | | minTrajectTime | object | - | 最小加/减速度时间 | | minTrajectTime.minAccTime | double | [0.05,1] | 最小加速度时间(s) | | minTrajectTime.minDecTime | double | [0.05,1] | 最小减速度时间(s) | | runDelayTime | int | [500,20000] | 运行延时时间(ms) | | stopTime | int | [240,2000] | 暂停时间(ms) | ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "minTrajectTime": { "minAccTime": 0.10, "minDecTime": 0.10 }, "runDelayTime": 500, "stopTime": 240 } ``` --- ## 点动 ### 说明 - 包括有关节/直角点动速度的设置与查询,点动灵敏度的设置与查询,开启/关闭点动操作 --- #### 上位机请求进行点动操作 **命令字:** `0x30A0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | [1,12] | 当前需要运动的轴 | | direction | int | [-1,1] | 轴移动方向;-1表示负方向移动,1表示正方向移动 | | robot | int | [1,4] | 当前机器人号 | **axis 参数说明:** - 关节坐标时:表示对应的轴,从8开始为外部轴 - 直角坐标时:按顺序分别表示 X 轴、Y 轴、Z 轴、A 轴、B 轴、C 轴 - 工具坐标时:按顺序分别表示 TX 轴、TY 轴、TZ 轴、TA 轴、TB 轴、TC 轴 - 用户坐标时:按顺序分别表示 UX 轴、UY 轴、UZ 轴、UA 轴、UB 轴、UC 轴 ```json { "axis": 1, "direction": 1, "robot": 1 } ``` --- #### 上位机请求停止点动操作 **命令字:** `0x30A1` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | [1,12] | 当前需要停止运动的轴 | | robot | int | [1,4] | 当前机器人号 | **axis 参数说明:** - 关节坐标时:表示对应的轴,从8开始为外部轴 - 直角坐标时:按顺序分别表示 X 轴、Y 轴、Z 轴、A 轴、B 轴、C 轴 - 工具坐标时:按顺序分别表示 TX 轴、TY 轴、TZ 轴、TA 轴、TB 轴、TC 轴 - 用户坐标时:按顺序分别表示 UX 轴、UY 轴、UZ 轴、UA 轴、UB 轴、UC 轴 ```json { "axis": 1, "robot": 1 } ``` --- #### 上位机设置机器人轴关节点动速度 **命令字:** `0x30A2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | - | 当前设置关节点动速度的轴号;范围[1,轴数] | | maxAcc | double | [1,1000] | 关节轴点动加速度(°/s) | | maxSpeed | double | [1,100] | 关节轴最大点动速度(°/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "axis": 1, "maxAcc": 800.0, "maxSpeed": 40.0, "robot": 1 } ``` --- #### 上位机查询机器人轴关节点动速度 **命令字:** `0x30A3` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | - | 需要查询关节点动速度的轴号;范围[1,轴数] | | robot | int | [1,4] | 当前机器人号 | ```json { "axis": 1, "robot": 1 } ``` --- #### 控制器回复上位机机器人轴关节点动速度 **命令字:** `0x30A4` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | - | 当前设置关节点动速度的轴号 | | maxAcc | double | [1,1000] | 关节轴点动加速度(°/s) | | maxSpeed | double | [1,100] | 关节轴最大点动速度(°/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "axis": 1, "maxAcc": 800.0, "maxSpeed": 40.0, "robot": 1 } ``` --- #### 上位机设置机器人直角点动速度 **命令字:** `0x30A5` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | maxAcc | double | [1,4000] | 直角轴点动加速度(mm/s²) | | maxSpeed | double | [1,250] | 直角轴最大点动速度(mm/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "maxAcc": 1500.0, "maxSpeed": 200.0, "robot": 1 } ``` --- #### 上位机查询机器人直角点动速度 **命令字:** `0x30A6` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人直角点动速度 **命令字:** `0x30A7` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | maxAcc | double | [1,4000] | 直角轴点动加速度(mm/s²) | | maxSpeed | double | [1,250] | 直角轴最大点动速度(mm/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "maxAcc": 1500.0, "maxSpeed": 200.0, "robot": 1 } ``` --- #### 上位机设置机器人点动灵敏度 **命令字:** `0x30A8` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | sensitivity | double | [0.001,1] | 点动灵敏度 | ```json { "robot": 1, "sensitivity": 0.0010 } ``` --- #### 上位机查询机器人点动灵敏度 **命令字:** `0x30A9` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人点动灵敏度 **命令字:** `0x30AA` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | sensitivity | double | [0.001,1] | 点动灵敏度 | ```json { "robot": 1, "sensitivity": 0.0010 } ``` --- ## 点位坐标转换 ### 说明 - 机器人在各个坐标的值相互转换 --- #### 上位机请求转换坐标值 **命令字:** `0x30C0` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要转换坐标的点位名称 | | pos | array | 点位数据列表 | | robot | int | 当前机器人号 | | targetCoord | int | 目标转换坐标;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | **pos 列表说明:** - 第一二位:坐标类型(0,0表示关节坐标,1,1表示直角坐标,2,1工具坐标,3,1用户坐标) - 第三位:当前点位姿态 - 第四位:当前点位的工具手号 - 第五位:当前点位的用户坐标号 - 第六七位:备用 - 后七位:当前点在当前坐标系下的位置信息 ```json { "name": "P0002", "pos": [0, 0.0, 8.0, 0.0, 1.0, 0.0, 0.0, 0.0, 10.20, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "targetCoord": 1 } ``` --- #### 控制器回复上位机转换后的坐标值 **命令字:** `0x30C1` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要转换坐标的点位名称 | | pos | array | 点位数据列表(弧度制) | | posDeg | array | 点位数据列表(角度制) | | result | bool | 转换是否成功 | | robot | int | 当前机器人号 | ```json { "name": "P0002", "pos": [1, 1, 8.0, 0.0, 1.0, 0.0, 0.0, 387.623217660095, 0.0, 894.038513201144, -3.14159265359, 0.178023583703, 0.0, 0.0], "posDeg": [1, 1, 8.0, 0.0, 1.0, 0.0, 0.0, 387.623217660095, 0.0, 894.038513201144, -180.0, 10.2, 0.0, 0.0], "result": true, "robot": 1 } ``` --- #### 上位机发送获取任意工具手下位置 **命令字:** `0x30C2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | toolNum | int | [0,9] | 目标工具手 | | toolNowNum | int | [0,9] | 当前工具手;0是无工具手 | | pos | array | 需要转换的点位;元素为 double 类型数组 | | ```json { "robot": 1, "toolNum": 1, "toolNowNum": 0, "pos": [[19998, 0, 19998, 180, 0, 0, 0], [19998, 0, 19998, 180, 0, 0, 0]] } ``` --- #### 控制器返回目标工具手坐标 **命令字:** `0x30C3` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | toolNum | int | [0,9] | 目标工具手 | ```json { "robot": 1, "toolNum": 1, "pos": [[19998, 0, 19998, 180, 0, 0, 0], [19998, 0, 19998, 180, 0, 0, 0]] } ``` --- ## 机器人切换 ### 说明 - 切换当前使用的机器人 --- #### 上位机请求切换当前使用机器人 **命令字:** `0x30D0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | isMultiRobot | bool | - | 是否为双机协作 | | mode | int | [0,1] | 当前机器人模式;0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 需要切换到的机器人号 | ```json { "isMultiRobot": false, "mode": 0, "robot": 1 } ``` --- #### 上位机查询当前使用机器人号 **命令字:** `0x30D1` ```json {} ``` --- #### 控制器回复上位机当前使用机器人号 **命令字:** `0x30D2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,1] | 当前机器人模式;0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 当前机器人号 | ```json { "mode": 0, "robot": 1 } ``` --- #### 上位机设置角度制或弧度制 **命令字:** `0x30D3` | 参数名 | 类型 | 说明 | |--------|------|------| | isDeg | bool | 是否为角度制;false 表示弧度制,true 表示角度制 | ```json { "isDeg": false } ``` --- #### 上位机设置机器人运动队列停止但不下使能 **命令字:** `0x30D4` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复当前机器人当前为角度制还是弧度制 **命令字:** `0x30D5` | 参数名 | 类型 | 说明 | |--------|------|------| | tmpDeg | bool | 是否为角度制;false 表示弧度制,true 表示角度制 | > 注:此为0x30D3的回复,只有切换角度/弧度时才会回复 ```json { "tmpDeg": false } ``` --- ## 最大加速度 ### 说明 - 最大加速度相关通讯 --- #### 上位机查询轴最大加速度 **命令字:** `0x20E0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 查询的轴号 | ```json { "joint_num": 1 } ``` #### 控制器回复轴最大加速度 **命令字:** `0x20E1` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 轴号 | | max_acc | double | - | 轴最大加速度 | > 注:此为 0x20E0 的回复 ```json { "joint_num": 1, "max_acc": 0.0 } ``` --- #### 上位机请求测量关节最大加速度 **命令字:** `0x20E2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 测量的轴号 | ```json { "joint_num": 1 } ``` #### 上位机请求结束测量关节最大加速度 **命令字:** `0x20E3` > 注:无请求参数 ```json { } ``` #### 上位机请求应用关节最大加速度 **命令字:** `0x20E4` > 注:无请求参数 ```json { } ``` #### 上位机请求导出关节最大加速度数据 **命令字:** `0x20E5` > 注:无请求参数 ```json { } ``` --- #### 上位机查询测量加速度参数 **命令字:** `0x20E6` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | joint_num | int | - | 查询的轴号 | ```json { "joint_num": 1 } ``` #### 上位机设置测量加速度参数 **命令字:** `0x20E7` | 参数名 | 类型 | 说明 | |--------|------|------| | joint_num | int | 轴号 | | jitter_ratio_thresh | int |速度抖动比值 | | jitter_ratio_thresh_enable | bool | 是否启用速度抖动比值 | | overshoot_limit_percent | double | 速度超调百分比 | | overshoot_limit_percent_enable | bool | 是否启用速度超调百分比 | | range_max | double | 量程上限 | | range_min | double | 量程下限 | | segment_length | double | 均速段长度 | | settling_time_limit | double | 最大调节时间 | | settling_time_limit_enable | bool | 是否启用最大调节时间 | | torque_fluctuation_limit | int | 大转矩差分标准 | | torque_fluctuation_limit_enable | bool | 是否启用大转矩差分标准 | | torque_hf_thresh | int | 转矩高频比值 | | torque_hf_thresh_enable | bool | 是否启用转矩高频比值 | | torque_limit | double | 转矩幅度 | ```json { "jitter_ratio_thresh": 0, "jitter_ratio_thresh_enable": true, "joint_num": 1, "overshoot_limit_percent": 1.0, "overshoot_limit_percent_enable": true, "range_max": 0.0, "range_min": 0.0, "segment_length": 20.0, "settling_time_limit": 20.0, "settling_time_limit_enable": true, "torque_fluctuation_limit": 0, "torque_fluctuation_limit_enable": true, "torque_hf_thresh": 0, "torque_hf_thresh_enable": true, "torque_limit": 2000.0 } ``` #### 控制器回复测量加速度参数 **命令字:** `0x20E8` | 参数名 | 类型 | 说明 | |--------|------|------| | joint_num | int | 轴号 | | jitter_ratio_thresh | int | 速度抖动比值 | | jitter_ratio_thresh_enable | bool | 是否启用速度抖动比值 | | overshoot_limit_percent | double | 速度超调百分比 | | overshoot_limit_percent_enable | bool | 是否启用速度超调百分比 | | range_max | double | 量程上限 | | range_min | double | 量程下限 | | segment_length | double | 均速段长度 | | settling_time_limit | double | 最大调节时间 | | settling_time_limit_enable | bool | 是否启用最大调节时间 | | torque_fluctuation_limit | int | 大转矩差分标准 | | torque_fluctuation_limit_enable | bool | 是否启用大转矩差分标准 | | torque_hf_thresh | int | 转矩高频比值 | | torque_hf_thresh_enable | bool | 是否启用转矩高频比值 | | torque_limit | double | 转矩幅度 | > 注:此为 0x20E6 查询后的控制器回复 ```json { "jitter_ratio_thresh": 0, "jitter_ratio_thresh_enable": true, "joint_num": 1, "overshoot_limit_percent": 1, "overshoot_limit_percent_enable": true, "range_max": 0, "range_min": 0, "segment_length": 20, "settling_time_limit": 20, "settling_time_limit_enable": true, "torque_fluctuation_limit": 0, "torque_fluctuation_limit_enable": true, "torque_hf_thresh": 0, "torque_hf_thresh_enable": true, "torque_limit": 2000 } ``` --- ## 安装位置 ### 说明 - 机器人安装位置(安装方式与安装角度)的设置与查询 - 安装角度偏移量为以正装为初始安装方式后绕自身坐标轴旋转的角度 - 正装 = (0°,0°,0°);倒装 = (0°,180°,0°) --- #### 上位机设置安装角度 **命令字:** `0x20E9` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountAngle | array | - | 安装角度偏移列表,长度3;依次为绕 X/Y/Z 轴旋转偏移角度(°) | ```json { "mountAngle": [0.0, 0.0, 0.0] } ``` --- #### 上位机查询安装角度 **命令字:** `0x20EA` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountMethod | int | - | 安装方式 | ```json { "mountMethod": -1 } ``` --- #### 控制器回复安装角度 **命令字:** `0x20EB` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountAngle | array | - | 安装角度偏移列表,长度3;依次为绕 X/Y/Z 轴旋转偏移角度(°) | ```json { "mountAngle": [0, 0, 0] } ``` --- # 状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/03.%E7%8A%B6%E6%80%81.html ## 碰撞检测状态 ### 查询碰撞检测状态 **命令字:** `0x3200` | 字段 | 类型 | 说明 | |------|------|------| | clear | int | 是否清除理论扭矩和实际扭矩差别,范围 [0, 1] | ```json { "clear": 0 } ``` **控制器回复** **命令字:** `0x3201` | 字段 | 类型 | 说明 | |------|------|------| | Difference_torq | double[] | 理论与反馈差值列表,长度为 7 | | actual_torq | double[] | 扭矩反馈值列表,长度为 7 | | detect_torq | double[] | 碰撞检测阈值列表,长度为 7 | | max_torq | double[] | 插值峰值列表,长度为 7 | | target_torq | double[] | 扭矩理论值列表,长度为 7 | ```json { "Difference_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "actual_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "detect_torq": [50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 0.0], "max_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "target_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` ## 指令运行百分比 ### 查询运动指令已完成百分比 **命令字:** `0x3202` - 无需发送数据 **控制器回复** **命令字:** `0x3203` | 字段 | 类型 | 说明 | |------|------|------| | completionRatio | double | 运行百分比,取值范围 [0, 1],最大值为 1 | ```json { "completionRatio": 0.11 } ``` ## 当前位置 ### 查询机器人坐标位置 **命令字:** `0x3210` | 字段 | 类型 | 说明 | |------|------|------| | coord | int | 查询当前坐标的位置,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "coord": 0, "robot": 1 } ``` **控制器回复** **命令字:** `0x3212` | 字段 | 类型 | 说明 | |------|------|------| | configuration | int | 当前位置形态值,范围 [0, 8] | | coord | int | 当前位置坐标类型,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | pos | double[] | 获取到的弧度制当前位置信息 | | posDeg | double[] | 获取到的角度制当前位置信息 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "configuration": 8, "coord": 0, "pos": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "posDeg": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "robot": 1 } ``` **控制器回复** **命令字:** `0x3213` | 字段 | 类型 | 说明 | |------|------|------| | coord | int | 当前位置坐标类型,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | isDeg | int | 是否为角度制,范围 [0, 1] | | position | double[] | 获取到的弧度制当前位置信息 | | positionDeg | double[] | 获取到的角度制当前位置信息 | | posture | int | 当前位置形态值,范围 [0, 8] | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "coord": 0, "isDeg": 0, "position": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "positionDeg": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "posture": 8, "robot": 1 } ``` > **说明:** 控制器回复上位机机器人坐标位置(0x3211) ### 查询双机协作下机器人坐标位置 **命令字:** `0x3214` | 字段 | 类型 | 说明 | |------|------|------| | coord1 | int | 获取机器人 1 位置的坐标类型,范围 [0, 3]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标 | | coord2 | int | 获取机器人 2 位置的坐标类型,范围 [0, 3]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标 | | robot1 | int | 双机协作第一个机器人号,范围 [1, 4],默认为 1 | | robot2 | int | 双机协作第二个机器人号,范围 [1, 4],默认为 2 | ```json { "coord1": 1, "coord2": 1, "robot1": 1, "robot2": 2 } ``` **控制器回复** **命令字:** `0x3215` | 字段 | 类型 | 说明 | |------|------|------| | coord1 | int | 机器人 1 位置的坐标类型,范围 [0, 3] | | coord2 | int | 机器人 2 位置的坐标类型,范围 [0, 3] | | pos1 | double[] | 机器人 1 弧度制下的坐标 | | pos1Deg | double[] | 机器人 1 角度制下的坐标 | | pos2 | double[] | 机器人 2 弧度制下的坐标 | | pos2Deg | double[] | 机器人 2 角度制下的坐标 | | robot1 | int | 双机协作第一个机器人号,默认为 1 | | robot2 | int | 双机协作第二个机器人号,默认为 2 | ```json { "coord1": 0, "coord2": 0, "pos1": [-0.0, 0.0, 3.077931758984, -0.0, 0.0, -0.0, 0.0], "pos1Deg": [-0.0, 0.0, 3.077931758984, -0.0, 0.0, -0.0, 0.0], "pos2": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pos2Deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot1": 1, "robot2": 2 } ``` ## 电机负载值 ### 查询机器人电机扭矩过载值 **命令字:** `0x3220` | 字段 | 类型 | 说明 | |------|------|------| | robot_num | int | 查询机器人号,范围 [1, 4] | ```json { "robot_num": 1 } ``` **控制器回复** **命令字:** `0x3221` | 字段 | 类型 | 说明 | |------|------|------| | torq_limit_enable | bool | 电机过载保护使能 | | torq_limit_min_ensure_time | double | 电机过载保护最小确认时间,范围 [10, 9999],单位 ms | | torq_limit_robot | double[] | 电机扭矩过载值列表,单位 ‰,长度为当前机器人的轴数量 | | torq_limit_sync | double[] | 外部轴电机扭矩过载值列表,单位 ‰,长度为当前机器人绑定的外部轴数量 | ```json { "torq_limit_enable": false, "torq_limit_min_ensure_time": 10, "torq_limit_robot": [800.0, 1400.0, 1000.0, 1200.0, 800.0, 700.0], "torq_limit_sync": [-0.0, -0.0, 0.0, 0.0, -0.0] } ``` ## 轴速度 ### 查询机器人轴速度 **命令字:** `0x3230` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3231` | 字段 | 类型 | 说明 | |------|------|------| | actualLineVel | double | 机器人末端当前线速度,单位 mm/s | | axisActualVel | double[] | 机器人各轴当前速度列表,单位 °/s,长度为 7 | | axisActualVelSync | double[] | 机器人外部轴各轴当前速度列表,单位 °/s,长度为 5 | | maxActualLineVel | double | 机器人末端最大线速度,单位 mm/s | | maxAxisActualVel | double[] | 机器人各轴最大速度列表,单位 °/s,长度为 7 | | maxAxisActualVelSync | double[] | 机器人外部轴各轴最大速度列表,单位 °/s,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "actualLineVel": 0.0, "axisActualVel": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "axisActualVelSync": [0.0, 0.0, 0.0, 0.0, 0.0], "maxActualLineVel": 0.0, "maxAxisActualVel": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "maxAxisActualVelSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ## 福德伺服温度 > 福德伺服专属功能 ### 查询福德伺服温度是否存在 **命令字:** `0x3250` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3251` | 字段 | 类型 | 说明 | |------|------|------| | IsExist | bool | 福德伺服温度是否存在 | ```json { "IsExist": false } ``` ### 控制器向示教器发送延时时间响应 **命令字:** `0x3252` | 字段 | 类型 | 说明 | |------|------|------| | delaytime | double | 延迟时间,单位 s | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "delaytime": 4, "robot": 1 } ``` ## 电机状态 > 电机参数查询,伺服温度仅福德伺服温度存在时可用 ### 查询机器人电机转速 **命令字:** `0x3260` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3261` | 字段 | 类型 | 说明 | |------|------|------| | maxVel | double[] | 机器人最大电机转速列表,单位 rpm,长度为 7 | | maxVelSync | double[] | 机器人外部轴最大电机转速列表,单位 rpm,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | vel | double[] | 机器人当前电机转速列表,单位 rpm,长度为 7 | | velSync | double[] | 机器人外部轴当前电机转速列表,单位 rpm,长度为 5 | | slave_vel | double[][] | 机器人主轴及从动轴电机速度列表,单位 rpm,7 个元素各包含 4 个元素(第 1 位主轴,2-4 位从动轴) | | slave_max_vel | double[][] | 机器人主轴及从动轴最大电机速度列表,单位 rpm | | slave_vel_sync | double[][] | 机器人外部轴主轴及从动轴电机速度列表,单位 rpm,5 个元素各包含 4 个元素 | | slave_max_vel_sync | double[][] | 机器人外部轴主轴及从动轴最大电机速度列表,单位 rpm | ```json { "maxVel": [0, 0, 0, 0, 0, 0, 0], "maxVelSync": [0, 0, 0, 0, 0], "robot": 1, "vel": [0, 0, 0, 0, 0, 0, 0], "velSync": [0, 0, 0, 0, 0], "slave_vel": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_vel": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_vel_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_vel_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人电机扭矩 **命令字:** `0x3262` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3263` | 字段 | 类型 | 说明 | |------|------|------| | maxTheoTorq | double[] | 机器人最大电机理论扭矩列表,单位 ‰,长度为 7 | | maxTorq | double[] | 机器人最大电机扭矩列表,单位 ‰,长度为 7 | | maxTorqSync | double[] | 机器人外部轴最大电机扭矩列表,单位 ‰,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | theoTorq | double[] | 机器人当前电机理论扭矩列表,单位 ‰,长度为 7 | | torq | double[] | 机器人当前电机扭矩列表,单位 ‰,长度为 7 | | torqSync | double[] | 机器人外部轴当前电机扭矩列表,单位 ‰,长度为 5 | | slave_torq | double[][] | 机器人主轴及从动轴电机扭矩列表,单位 ‰,7 个元素各包含 4 个元素(第 1 位主轴,2-4 位从动轴) | | slave_max_torq | double[][] | 机器人主轴及从动轴电机最大扭矩列表,单位 ‰ | | slave_torq_sync | double[][] | 机器人外部轴主轴及从动轴电机扭矩列表,单位 ‰,5 个元素各包含 4 个元素 | | slave_max_torq_sync | double[][] | 机器人外部轴主轴及从动轴最大电机扭矩列表,单位 ‰ | ```json { "maxTheoTorq": [0, 0, 0, 0, 0, 0, 0], "maxTorq": [0, 0, 0, 0, 0, 0, 0], "maxTorqSync": [0, 0, 0, 0, 0], "robot": 1, "theoTorq": [0, 0, 0, 0, 0, 0, 0], "torq": [0, 0, 0, 0, 0, 0, 0], "torqSync": [0, 0, 0, 0, 0], "slave_torq": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_torq": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_torq_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_torq_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人电机负载率 **命令字:** `0x3264` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3265` | 字段 | 类型 | 说明 | |------|------|------| | externalOverload | double[] | 机器人外部轴当前电机负载列表,单位 ‰,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | robotOverload | double[] | 机器人当前电机负载列表,单位 ‰,长度为 7 | | slave_motor_rbt_over_load | double[][] | 机器人主轴及从动轴电机负载列表,单位 ‰,7 个元素各包含 4 个元素(第 1 位主轴,2-3 位从动轴) | | slave_motor_sync_over_load | double[][] | 机器人外部轴主轴及从动轴电机负载列表,单位 ‰,5 个元素各包含 4 个元素 | ```json { "externalOverload": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "robotOverload": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "slave_motor_rbt_over_load": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_motor_sync_over_load": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人编码器位置 **命令字:** `0x3266` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3267` | 字段 | 类型 | 说明 | |------|------|------| | reality | double[] | 机器人编码器位置实际值列表,长度为 7 | | realitySync | double[] | 机器人外部轴编码器位置实际值列表,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | target | double[] | 机器人编码器位置目标值列表,长度为 7 | | targetSync | double[] | 机器人外部轴编码器位置目标值列表,长度为 5 | | slave_reality | double[][] | 机器人主轴及从动轴编码器位置实际值列表,7 个元素各包含 4 个元素 | | slave_target | double[][] | 机器人主轴及从动轴编码器位置目标值列表 | | slave_reality_sync | double[][] | 机器人外部轴主轴及从动轴编码器位置实际值列表,5 个元素各包含 4 个元素 | | slave_target_sync | double[][] | 机器人外部轴主轴及从动轴编码器位置目标值列表 | ```json { "reality": [0, 0, 0, 0, 0, 0, 0], "realitySync": [0, 0, 0, 0, 0], "robot": 1, "target": [0, 0, 0, 0, 0, 0, 0], "targetSync": [0, 0, 0, 0, 0], "slave_reality": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_target": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_reality_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_target_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ## PDO 操作 说明:存在5个元素,为机器人的5个外部轴;元素存在4个元素,第1位:主轴,2-4:从动轴 ### 上位机发送写入 PDO **命令字:** `0x2056` | 字段 | 类型 | 说明 | |------|------|------| | axisNum | uint | 从站编号 | | index | uint | 命令字编码 | | subindex | uint | 子命令编码 | | size | uint | 位数 | | value | - | 写入的值 | ```json { "axisNum": 1, "index": 0x0006, "subindex": 0, "size": 16, "value": 6 } ``` ## 电机电流查询 ### 查询机器人电机电流 **命令字:** `0x3268` - 无需发送数据 **控制器回复** **命令字:** `0x3269` | 字段 | 类型 | 说明 | |------|------|------| | current | double[] | 机器人电机电流列表,单位‰,长度为7 | | max_current | double[] | 机器人最大电机电流列表,单位‰,长度为7 | | robot | int | 当前机器人号,范围 [1,4] | | sync_current | double[] | 机器人外部轴电机电流列表,单位‰,长度为5 | | sync_max_current | double[] | 机器人外部轴最大电机电流列表,单位‰,长度为5 | | slave_current | double[][] | 机器人主轴及从动轴电机最大电流列表,存在7个元素,元素存在4个元素 | | slave_max_current | double[][] | 机器人外部轴主轴及从动轴电机电流列表,存在7个元素 | | slave_sync_max_current | double[][] | 机器人外部轴主轴及从动轴电机最大电流列表,存在5个元素 | ```json { "current": [0,0,0,0,0,0,0], "max_current": [0,0,0,0,0,0,0], "robot": 1, "sync_current": [0,0,0,0,0], "sync_max_current": [0,0,0,0,0], "slave_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_max_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_sync_max_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] } ``` ## 电机温度查询 ### 查询机器人电机温度 **命令字:** `0x326A` - 无需发送数据 **控制器回复** **命令字:** `0x326B` | 字段 | 类型 | 说明 | |------|------|------| | temperature | double[] | 机器人电机温度列表,单位°/C,长度为7 | | maxTemperature | double[] | 机器人最大电机温度列表,单位°/C | | temperatureSync | double[] | 机器人外部轴电机温度列表,单位°/C | | maxtemperatureSync | double[] | 机器人外部轴最大电机温度列表,单位°/C | | slave_temperature | double[][] | 机器人主轴及从动轴伺服温度列表,存在7个元素 | | slave_temperature_max | double[][] | 机器人主轴及从动轴伺服最大温度列表,存在7个元素 | | slave_temperature_sync_out | double[][] | 机器人外部轴主轴及从动轴伺服温度列表,存在5个元素 | | slave_temperature_sync_out_max | double[][] | 机器人外部轴主轴及从动轴伺服最大温度列表,存在5个元素 | ```json { "temperature": [0.0,0.0,0.0,0.0,0.0,0.0,0.0], "maxTemperature": [0.0,0.0,0.0,0.0,0.0,0.0,0.0], "temperatureSync": [0.0,0.0,0.0,0.0,0.0], "maxtemperatureSync": [0.0,0.0,0.0,0.0,0.0], "slave_temperature": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_max": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_sync_out": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_sync_out_max": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] } ``` ## 系统运行状态 ### 查询机器人运行状态 **命令字:** 0x3000 - 无需发送数据 **控制器回复** **命令字:** 0x3001 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | status | int | 运行状态码 | | errorCode | int | 错误码,0表示无错误 | | programName | string | 当前运行的程序名 | --- ## 状态码说明 ### 运行状态码 | 状态码 | 状态名称 | 说明 | |--------|----------|------| | 0 | 空闲 (IDLE) | 机器人未运行,等待指令 | | 1 | 运行中 (RUNNING) | 程序正在执行 | | 2 | 暂停 (PAUSED) | 程序被暂停,可恢复 | | 3 | 停止 (STOPPED) | 程序被停止 | | 4 | 错误 (ERROR) | 发生错误,需复位 | | 5 | 回零中 (HOMING) | 正在执行回零操作 | | 6 | 示教模式 (TEACH) | 处于示教/手动模式 | | 7 | 急停 (EMERGENCY_STOP) | 急停按钮被按下 | ### 伺服状态 | 状态值 | 说明 | |--------|------| | 0 | 伺服关闭 (Servo OFF) | | 1 | 伺服开启 (Servo ON) | | 2 | 伺服使能中 (Enabling) | ### 程序运行状态 | 状态值 | 说明 | |--------|------| | 0 | 未运行 | | 1 | 运行中 | | 2 | 暂停 | | 3 | 单步执行 | | 4 | 已停止 | ### 电机状态码 | 状态码 | 名称 | 说明 | |--------|------|------| | 0 | 正常 | 电机工作正常 | | 1 | 过载警告 | 负载超过额定值但未报警 | | 2 | 过载报警 | 负载超过保护阈值 | | 3 | 过热警告 | 温度超过警告阈值 | | 4 | 过热报警 | 温度超过保护阈值 | | 5 | 通讯异常 | 与驱动器通讯中断 | | 6 | 跟随误差过大 | 实际位置与指令位置偏差超限 | ## 安全状态查询 ### 查询安全回路状态 **命令字:** 0x3004 - 无需发送数据 **控制器回复** **命令字:** 0x3005 | 字段 | 类型 | 说明 | |------|------|------| | emergencyStop | bool | 急停状态:true=急停中, false=正常 | | safetyDoor | bool | 安全门状态:true=门开, false=门关 | | enableSwitch | bool | 使能开关:true=按下, false=松开 | ## 程序状态查询 ### 查询程序运行详细信息 **命令字:** 0x3006 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1,4] | **控制器回复** **命令字:** 0x3007 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号 | | progName | string | 当前程序名 | | lineNumber | int | 当前执行行号 | | cycleCount | int | 循环次数 | | progStatus | int | 程序状态:0=未运行, 1=运行中, 2=暂停, 3=单步, 4=停止 | ## 常用状态查询组合 ### 检查机器人是否可以开始工作 步骤1 - 查询安全回路 (0x3004 -> 0x3005): 检查 emergencyStop=false, safetyDoor=false 步骤2 - 查询伺服状态: 检查各轴伺服已开启 步骤3 - 查询程序状态 (0x3006 -> 0x3007): 检查 progStatus=0 (空闲) ### 监控电机健康状况 步骤1 - 查询电机温度 (0x326A -> 0x326B) 步骤2 - 查询电机负载 (0x3264 -> 0x3265) 步骤3 - 查询电机扭矩 (0x3262 -> 0x3263) 步骤4 - 查询碰撞检测 (0x3200 -> 0x3201) --- # 工具手 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/04.%E5%B7%A5%E5%85%B7%E6%89%8B.html ## 概述 工具手标定是工业机器人坐标系管理的核心功能,用于建立机器人末端工具的坐标系(Tool Coordinate System, TCS)。 ### 什么是工具坐标系 - **法兰盘中心**:默认工具坐标系的原点,法兰盘中心指向法兰盘定位孔方向为+X 方向,垂直法兰向外为+Z 方向,根据右手法则判定 Y 方向 - **工具中心点(TCP)**:工具坐标系的原点,通常是工具的工作点(如焊丝尖端、吸盘中心等) - **工具坐标系特点**:新的工具坐标系相对于默认的工具坐标系变化得到,位置和方向始终同法兰盘保持绝对的位置和姿态关系 ### 为什么要建立工具坐标系 1. **确立工具的 TCP 点**:方便调整工具状态 - 例如:焊接时,将 TCP 定义到焊丝尖端,程序记录的位置便是焊丝尖端的位置 2. **确定工具进给方向**:方便工具位置调整 - 例如:手爪的前进方向可以直接移动过去 ### 适用场景 **需要使用工具手的情况**: - 机器人工作时 X、Y、Z 轴需要绕着 A、B、C 姿态轴旋转 - 典型工艺:焊接、打磨、喷涂、切割等 **无需使用工具手的情况**: - 机器人本身仅做 Z 轴姿态旋转 - 工具末梢位于机器人6轴法兰中心延长线上 ### 标定方式选择指南 | 场景 | 推荐方式 | 说明 | |------|----------|------| | 已激光标定 + 使用焊枪 | 6点标定 | 校准工具手尺寸+姿态,C轴精度较好 | | 未激光标定 + 使用焊枪 | 12点标定 | 校准零点+工具手尺寸 | | 标定码垛夹爪 | 直接填写尺寸或6点标定 | 优先选择直接填工具尺寸 | | 零点丢失 | 20点标定 | 校准零点+工具手尺寸 | | 6点标定后A/B轴旋转误差大 | 7点标定 | 校准工具手尺寸+姿态,A/B轴精度较好 | ### 工具手参数说明 | 参数 | 说明 | 单位 | |------|------|------| | X轴 | 工具末端相对于法兰中心,沿直角坐标系X轴方向的偏移长度 | mm | | Y轴 | 工具末端相对于法兰中心,沿直角坐标系Y轴方向的偏移长度 | mm | | Z轴 | 工具末端相对于法兰中心,沿直角坐标系Z轴方向的偏移长度 | mm | | A轴 | 工具末端相对于法兰中心,绕直角坐标系X轴方向旋转角度 | °/rad | | B轴 | 工具末端相对于法兰中心,绕直角坐标系Y轴方向旋转角度 | °/rad | | C轴 | 工具末端相对于法兰中心,绕直角坐标系Z轴方向的旋转角度 | °/rad | --- ## 工具手参数 ### 上位机设置工具手参数 **命令字:** `0x3500` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | B | double | 绕 B 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | C | double | 绕 C 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **请求示例:** ```json { "parameter": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.170 }, "robot": 1, "tool": 1 } ``` ### 上位机查询工具手参数 **命令字:** `0x3501` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **请求示例:** ```json { "robot": 1, "tool": 1 } ``` ### 控制器回复上位机工具手参数 **命令字:** `0x3502` **参数列表(弧度制):** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | [-3.1416,3.1416] | | B | double | 绕 B 轴旋转 | [-3.1416,3.1416] | | C | double | 绕 C 轴旋转 | [-3.1416,3.1416] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | **参数列表(角度制):** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | [-180,180] | | B | double | 绕 B 轴旋转 | [-180,180] | | C | double | 绕 C 轴旋转 | [-180,180] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **响应示例:** ```json { "parameter": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.17 }, "parameterDeg": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.17 }, "robot": 1, "tool": 1 } ``` ## 工具号 ### 上位机请求切换工具号 **命令字:** `0x3510` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 需要切换的工具手号,0表示无工具手 | [0,999] | **请求示例:** ```json { "robot": 1, "tool": 0 } ``` ### 上位机查询工具手号 **命令字:** `0x3511` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | **请求示例:** ```json { "robot": 1 } ``` ### 控制器回复上位机工具手号 **命令字:** `0x3512` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | curToolNum | int | 当前已选中工具手号 | [0,999] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 与已选中工具手号一致,选中工具号为0时值为1 | [1,999] | **响应示例:** ```json { "curToolNum": 0, "robot": 1, "tool": 1 } ``` ## 工具标定 > 六点法和七点法标定,包含有标定 N 号点、获取标定点位置信息、点位标定状态。 > 标定计算前需标定好所有点,先用0x3521标定每一个点,所有的点位标定完成后用0x3520计算标定结果。 > 查询 N 号点位置信息时需 N 号点已标定。 ### 标定方式详解 #### 6点标定 6点标定用于校准工具手尺寸和姿态,标定结果旋转 C 轴精度较好。 **标定步骤**: 1. **TC1标定**:机器人5轴垂直向下,工具手末梢对准标定锥尖端 2. **TC2标定**:在第一点的基础上 C 轴旋转180度 3. **TC3标定**:在第一点的基础上 B 轴角度在35度 4. **TC4标定**:机器人回到零点,然后工具手末梢垂直 5. **TC5标定**:在第四点的基础上动 X- 6. **TC6标定**:在第五点的基础上动 Y+ **计算**:六个点标定结束后,点击"计算"会算出计算结果,如果计算结果大于1的话就需要重新标定。 #### 7点标定 7点标定用于校准工具手尺寸和姿态,标定结果旋转 A、B 轴精度较好。 **标定步骤**: 1. **TC1**:工具手末梢垂直对准参考点 2. **TC2**:将机器人切换一个姿势,末端正对参考点 3. **TC3**:将机器人切换一个姿势,末端正对参考点 4. **TC4**:将机器人切换一个姿势,末端正对参考点 5. **TC5**:将工具末端垂直且正对参考点(同 TC1) 6. **TC6**:在 TC5的基础上,沿笛卡尔坐标系 X 轴负方向移动任意距离 7. **TC7**:在 TC6的基础上,沿笛卡尔坐标系 Y 轴正方向移动任意距离 **注意事项**:进行数据量取前请将法兰盘平行于水平面! #### 12点标定 12点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。 **标定步骤**: 1. **TC1**:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端 2. **TC2**:在第一个点的基础上,通过直角坐标系将 C 旋转180度 3. **TC3**:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端 4. **TC4**:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度 5. **TC5**:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度 6. **TC6**:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+、J5大于-90度 7. **TC7**:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度 8. **TC8**:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度 9. **TC9**:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度 10. **TC10**:回到第一个点,通过关节坐标系点动五轴,使五轴向上、J5小于-90度 11. **TC11**:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度 12. **TC12**:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度 **计算**:标定完成后点击计算,计算出标定结果,如果计算出来的数值较大的话,就需要重新标定。 #### 15点标定 15点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。 **标定步骤**: 1. **TC1**:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端 2. **TC2**:在第一个点的基础上,通过直角坐标系将 C 旋转180度 3. **TC3**:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端 4. **TC4**:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度 5. **TC5**:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度 6. **TC6**:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+,J5大于-90度 7. **TC7**:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度 8. **TC8**:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度 9. **TC9**:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度 10. **TC10**:机器人回到第一个点,通过关节坐标系点动五轴使五轴向上,J5小于-90度 11. **TC11**:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度 12. **TC12**:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度 13. **TC13**:机器人回到零点位置,调整机器人姿态,使机器人末端工具尖端竖直朝下,将标定尖端与标定锥对齐 14. **TC14**:在第十三点的基础上,通过直角坐标系做 X-,机器人位移一段距离 15. **TC15**:在第十四点的基础上,通过直角坐标系做 Y+,机器人位移一段距离 #### 20点标定 **标定步骤**: 1. **TC1**:机器人工具手末端垂直参考点 2. **TC2**:在第一点的基础上动 A+ 3. **TC3**:在第一点的基础上动 A+ 40度 4. **TC4**:在第一点的基础上动 A+ 60度 5. **TC5**:在第一点基础上动 A- 20度 6. **TC6**:在第一点基础上动 A- 40度 7. **TC7**:在第一点基础上动 A- 60度 8. **TC8**:在第一点基础上动 B+ 20度 9. **TC9**:在第一点基础上动 B+ 30度 10. **TC10**:在第一点基础上动 B+ 40度 11. **TC11**:在第一点基础上动 B- 20度 12. **TC12**:在第一点基础上动 B- 30度 13. **TC13**:在第一点基础上动 B- 40度 14. **TC14**:在第一点基础上动 C+ 30度 15. **TC15**:在第一点基础上动 C+ 50度 16. **TC16**:在第一点基础上动 C+ 70度 17. **TC17**:在第一点基础上动 C+ 90度 18. **TC18**:在第一点基础上动 C- 30度 19. **TC19**:在第一点基础上动 C- 60度 20. **TC20**:第二十点在第一点基础上动 C- 90度 **注意事项**: - 进行数据量取前请将法兰盘平行于水平面! - 标定过程中请保持参考点固定,否则标定误差增大 ### 验证标定精度 示教模式下,工具手标定的末梢对准标定锥,在两个尖端对准的情况下,选中标定的工具手工具手编号,然后在直角坐标系下点动 A、B、C 轴,看尖端是否对准、偏了多少 mm。 ### API接口 #### 上位机标定计算请求 **命令字:** `0x3520` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | **请求示例:** ```json { "robot": 1, "tool": 1, "calibrationType": 7 } ``` #### 上位机标定 N 号点请求 **命令字:** `0x3521` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 4, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机 N 号点标定信息 **命令字:** `0x3522` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | position | `array` | 标定点直角坐标信息列表 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "calibrationType": 7, "point": 1, "position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0], "robot": 1 } ``` #### 控制器回复上位机标定计算完成结果 **命令字:** `0x3523` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | result | bool | 标定计算结果 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "result": true, "robot": 1 } ``` #### 上位机查询 N 号点位置信息 **命令字:** `0x3524` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 4, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机 N 号点位置信息 **命令字:** `0x3525` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | position | `array` | 标定点直角坐标信息列表 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "calibrationType": 7, "point": 1, "position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0], "robot": 1 } ``` #### 上位机查询全部点标定状态 **命令字:** `0x3526` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机全部点标定状态 **命令字:** `0x3527` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | robot | int | 当前机器人号 | [1,4] | | status | `array` | 点位标定状态列表,1表示已标定,0表示未标定 | 六点法长度6,七点法长度7 | **响应示例:** ```json { "calibrationType": 7, "robot": 1, "status": [1, 1, 1, 0, 0, 1, 1] } ``` #### 上位机请求清除 N 号点标定状态 **命令字:** `0x3528` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 0, "robot": 1, "tool": 1 } ``` ## 常见问题 **Q: 什么是工具坐标系?** A: 工具坐标系是机器人末端工具的坐标系,原点是 TCP(工具中心点),用于确定工具的位姿。 **Q: 为什么要建立工具坐标系?** A: 1. 确立工具的 TCP 点,方便调整工具状态;2. 确定工具进给方向,方便工具位置调整。 **Q: 什么情况下需要使用工具手标定?** A: 需要用到绕 X、绕 Y、绕 Z 的姿态旋转时,需要进行工具手标定,例如焊接工艺、打磨工艺、喷涂工艺等。 **Q: 什么情况下无需使用工具手?** A: 机器人本身仅做 Z 轴姿态旋转,且工具末梢位于机器人6轴法兰中心延长线上;此时可以不设置工具手参数。 **Q: 如何选择工具手标定方式?** A: 1. 已做过激光标定+使用焊枪:使用6点标定;2. 未做过激光标定+使用焊枪:使用12点标定;3. 标定码垛夹抓:优先选择直接填工具尺寸;4. 零点丢失:使用20点标定;5. 6点标定后 A、B 轴旋转误差大:使用7点标定。 **Q: 标定失败,计算结果大于1怎么办?** A: 可能原因:标定点位置不准确、标定过程中参考点移动、机器人姿态不正确。解决方案:重新标定,确保参考点固定,检查机器人姿态是否正确,使用更精确的标定工具。 **Q: 标定后 A、B 轴旋转误差大怎么办?** A: 可能原因:6点标定精度不够、标定点分布不合理。解决方案:更换7点标定,重新标定,确保标定点分布合理。 **Q: 标定后 C 轴旋转误差大怎么办?** A: 可能原因:标定点位置不准确、参考点移动。解决方案:重新标定,确保参考点固定。 --- ## 工具手坐标系变换 ### 坐标系变换链 机器人系统中各坐标系之间的变换关系如下: 基座坐标系(Base) -> 关节变换(J1~J6) -> 法兰坐标系(Flange) -> 工具坐标系(TCP) 其中工具坐标系(TCP)由法兰坐标系经过工具手参数变换得到。 ### 工具手变换矩阵 工具手参数 (X, Y, Z, A, B, C) 定义了一个从法兰坐标系到工具坐标系的齐次变换矩阵: 平移部分由 (X, Y, Z) 定义,单位 mm。 旋转部分由 (A, B, C) 定义,遵循 ZYX 欧拉角顺序(先绕 Z 轴转 C,再绕 Y 轴转 B,最后绕 X 轴转 A)。 ### 变换矩阵计算 工具手变换矩阵 T_tool 的计算公式: T_tool = Trans(X,Y,Z) * RotX(A) * RotY(B) * RotZ(C) 其中: - Trans(X,Y,Z) 是平移变换矩阵 - RotX(A) 是绕 X 轴旋转 A 弧度的旋转矩阵 - RotY(B) 是绕 Y 轴旋转 B 弧度的旋转矩阵 - RotZ(C) 是绕 Z 轴旋转 C 弧度的旋转矩阵 ### 坐标变换应用 #### 获取TCP在基座坐标系下的位姿 TCP 在基座坐标系下的位姿 = T_base_to_flange * T_tool 其中 T_base_to_flange 是基座坐标系到法兰坐标系的变换矩阵,由正运动学计算得到。 #### 工具手参数对运动的影响 1. **平移影响**:设置工具手 X/Y/Z 偏移后,机器人将 TCP 点移动到目标位置而不是法兰中心 2. **旋转影响**:设置工具手 A/B/C 后,直角坐标系的旋转轴将围绕 TCP 点旋转 3. **速度影响**:线速度从法兰中心速度转换为 TCP 点速度 ### 切换工具手的坐标变换 当运行时切换工具手号时,系统会自动: 1. 读取新工具手的 (X, Y, Z, A, B, C) 参数 2. 重新计算工具手变换矩阵 T_tool 3. 后续所有运动指令基于新的 TCP 进行计算 ### 工具手负载参数对动力学的影响 负载参数 (payloadMass, payloadMassCenterX/Y/Z, payloadInertia) 用于: 1. **前馈补偿**:根据负载质量和质心位置计算前馈力矩 2. **碰撞检测**:修正碰撞检测阈值,防止误报 3. **力控模式**:在力控制中补偿负载重力和惯性 ### 坐标系变换示例 假设工具手参数为 X=-68, Y=3, Z=162, A=0, B=0, C=0(仅平移): TCP 相对于法兰的位置偏移为 (-68, 3, 162) mm 当法兰位于基座坐标 (500, 200, 800) 时,TCP 位于基座坐标 (432, 203, 962) ### 工具手参数校验 | 校验项 | 方法 | 标准 | |--------|------|------| | TCP位置 | 四/六点法标定后检查 | 标定距离 < 1mm | | 姿态精度 | 绕A/B/C轴旋转检查尖端偏移 | < 2mm | | 负载质心 | 实际测量与参数对比 | 偏差 < 50mm | | 负载质量 | 称重对比 | 偏差 < 1kg | --- # 用户坐标 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/05.%E7%94%A8%E6%88%B7%E5%9D%90%E6%A0%87.html ## 概述 用户坐标系是机器人在工件或工装上定义的局部坐标系,用于简化编程和操作。通过在不同工件上定义用户坐标系,可以使同一程序在不同工位间复用,大幅提高编程效率。 --- ## 坐标系层次 机器人系统中存在多层坐标系,从全局到局部的关系如下: ```text 大地坐标系 (World) └── 基坐标系 (Base/Robot) └── 用户坐标系 (User) ← 本章内容 └── 工具坐标系 (Tool) ``` | 坐标系 | 说明 | 默认原点 | |--------|------|----------| | 大地坐标系 | 车间地面的绝对参考系 | 固定在地面 | | 基坐标系 | 机器人底座上的参考系 | 机器人底座中心 | | 用户坐标系 | 工件/工装上的局部参考系 | 用户通过标定定义 | | 工具坐标系 | 工具末端 (TCP) 的参考系 | 工具法兰中心 | ### 用户坐标系的作用 1. **编程简化**:在工件上定义坐标系后,可以直接使用工件的长宽高方向编程 2. **程序复用**:同一程序应用于不同位置的工件时,只需切换用户坐标系 3. **偏移补偿**:通过修改用户坐标系偏移量实现工位微调 4. **多工位管理**:支持最多 999 个用户坐标系,满足多工位需求 --- ## 用户坐标标定 ### 标定方法 用户坐标系通过**三点法**进行标定: 1. **原点 (O)**:定义用户坐标系的原点位置 2. **X 轴方向点 (X)**:定义用户坐标系 X 轴正方向 3. **Y 轴方向点 (Y)**:定义用户坐标系 Y 轴正方向(Z 轴由右手定则确定) > **标定要求:** 原点、X 点、Y 点不能共线,否则标定失败。 ### 标定流程 1. 通过 `0x3562` 发送标定点位置信息(原点/X/Y) 2. 通过 `0x3560` 请求标定计算 3. 控制器回复 `0x3561` 告知计算结果 4. 通过 `0x3570` 查询标定后的位置信息验证 --- ### 0x3560 上位机请求用户坐标标定计算 **说明:** 上位机请求用户坐标标定计算 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 1 } ``` --- ### 0x3561 控制器回复用户坐标标定计算结果 **说明:** 控制器回复上位机用户坐标标定计算结果 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | result | bool | 标定计算是否成功 | | robot | int | 当前机器人号,范围[1,4] | **响应示例:** ```json { "result": true, "robot": 1 } ``` --- ### 0x3562 上位机请求当前用户坐标标定原点/X 值/Y 值 **说明:** 上位机请求当前用户坐标标定原点/X 值/Y 值 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | posX | double[] | 标记的 X 值位置信息列表,当`require`为`"OXY"`时该节点存在 | | posY | double[] | 标记的 Y 值位置信息列表,当`require`为`"OXY"`时该节点存在 | | posZero | double[] | 标记的原点位置信息列表,当`require`为`"OXY"`时该节点存在 | | require | string | 标记点信息,取值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;取值为`"OXY"`时,标记所有点 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "posX": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "posY": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "posZero": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "require": "OXY", "robot": 1, "user": 1 } ``` --- ### 0x3563 控制器回复当前用户坐标标定原点/X 值/Y 值 **说明:** 控制器回复上位机当前用户坐标标定原点/X 值/Y 值 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 弧度制下的位置信息列表 | | positionDeg | double[] | 角度制下的位置信息列表 | | require | string | 标记点信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值 | | robot | int | 当前机器人号,范围[1,4] | | status | bool | 标定状态,`true`表示已标定,`false`表示未标定 | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "position": [470.746, 0.0, 817.334, 3.141, 0.0, 0.0], "positionDeg": [470.746, 0.0, 817.334, 179.966043450592, 0.0, 0.0], "require": "O", "robot": 1, "status": true, "user": 1 } ``` --- ### 0x3570 上位机查询用户坐标标定点位置信息 **说明:** 上位机查询用户坐标标定点位置信息 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | require | string | 需要查询的位置信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;值为`"Calibration"`时表示计算后的位置信息 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "require": "X", "robot": 1, "user": 1 } ``` --- ### 0x3571 控制器回复用户坐标标定点位置信息 **说明:** 控制器回复上位机用户坐标标定点位置信息 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 弧度制下的位置信息列表;`require`为`"Calibration"`时为弧度制下偏移量 | | positionDeg | double[] | 角度制下的位置信息列表;`require`为`"Calibration"`时为角度制下偏移量 | | require | string | 查询的位置信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;值为`"Calibration"`时表示计算后的位置信息 | | robot | int | 当前机器人号,范围[1,4] | | status | bool | 标定状态,`true`表示已标定,`false`表示未标定;`require`为`"Calibration"`时该节点不存在 | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "positionDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "require": "X", "robot": 1, "status": false, "user": 1 } ``` --- ## 用户坐标号 ### 0x3580 上位机请求切换用户坐标 **说明:** 上位机请求切换用户坐标 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 需要切换到的用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 3 } ``` > **注意:** 切换用户坐标系后,所有后续运动指令将基于新的用户坐标系执行。确保目标用户坐标系已正确标定。 --- ### 0x3581 上位机查询当前已选中的用户坐标号 **说明:** 上位机查询当前已选中用户坐标号 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 0x3582 控制器回复已选中的用户坐标号 **说明:** 控制器回复上位机已选中的用户坐标号 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "robot": 1, "user": 3 } ``` --- ## 用户坐标注释 ### 0x3590 上位机请求设置用户坐标注释 **说明:** 上位机请求设置用户坐标注释 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | note | string | 需要设置的注释 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "note": "AAA", "robot": 1, "user": 1 } ``` --- ### 0x3591 上位机查询用户坐标号注释 **说明:** 上位机查询用户坐标号注释 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 1 } ``` --- ### 0x3592 控制器回复用户坐标号注释 **说明:** 控制器回复上位机用户坐标号注释 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | note | string | 当前用户坐标注释 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "note": "AAA", "robot": 1, "user": 1 } ``` --- ### 0x3593 上位机设置用户坐标偏移量 **说明:** 上位机设置用户坐标偏移量 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 设置的偏移量列表,按顺序分别为 X 值,Y 值,Z 值,A 值,B 值,C 值 | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "position": [5.0, 0.0, 0.0, 0.0, 0.0, 0.0], "user": 1 } ``` ### 偏移量用途 偏移量用于在不重新标定的情况下微调用户坐标系的位置: - **X/Y/Z 偏移**:平移用户坐标系原点 - **A/B/C 偏移**:旋转用户坐标系方向(欧拉角) > **典型场景:** 工装更换后工件位置发生微小偏移,通过调整偏移量即可恢复精度,无需重新标定。 --- # 零点 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/06.%E9%9B%B6%E7%82%B9.html ## 概述 零点是机器人各关节轴的基准参考位置。准确的零点标定是保证机器人运动精度的基础。本章说明零点相关的所有协议命令,包括零点标定流程、零点偏移设置、编码器状态查询和多圈值/单圈值管理。 --- ## 零点标定流程 ### 标准零点标定步骤 零点标定的完整流程如下: 1. **编码器状态检查**:通过 `0x3603` 查询编码器状态,确认无欠压报警 2. **标记无间隙方向**:通过 `0x3600` 请求标记无间隙方向(消除传动间隙对零点的影响) 3. **清除多圈值**:通过 `0x3601` 清除轴多圈值,将当前编码器位置重置 4. **移动机器人到零点**:手动将机器人各轴移动到机械零点位置 5. **设置零点偏移**:通过 `0x3605` 设置零点偏移值(度数值或偏移量) 6. **设置单圈值**:通过 `0x3606` 微调各轴单圈值 7. **验证零点**:查询单圈值确认零点设置正确 ### 零点标定类型 | 标定方式 | mode 值 | 说明 | 适用场景 | |----------|---------|------|----------| | 度数方式 | 0 | 直接设置各轴的目标角度值 | 已知精确零点角度时的快速标定 | | 偏移量方式 | 1 | 设置各轴相对于当前编码器位置的偏移量 | 机械零点定位后的微调标定 | ### 零点精度要求 - 零点精度直接影响机器人的**绝对定位精度** - 各轴零点偏差应在 **±0.01°** 以内 - 零点标定后应通过运行验证程序确认精度 - 更换电机、编码器或减速机后需要重新标定零点 ### 零点标定注意事项 - 标定前确认机器人**各轴无负载** - 标定前确认编码器**无欠压报警** - 标定时各轴应处于**无间隙方向** - 标定完成后建议**保存配置并重启验证** --- ## 请求标记无间隙方向 **命令字:** `0x3600` - 无需发送数据 --- ## 清除轴多圈值 ### 请求清除轴多圈值 **命令字:** `0x3601` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 需要清除多圈值的轴,范围 [0, 7],0 表示清除所有轴多圈值 | | clear | bool | 是否清除多圈值 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "axis": 0, "clear": true, "robot": 1 } ``` **控制器回复** **命令字:** `0x3602` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 清除多圈值的轴,范围 [0, 7] | | result | int | 清除多圈值结果,范围 [0, 1] | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "axis": 0, "result": 1, "robot": 1 } ``` --- ## 编码器状态 ### 查询编码器状态 **命令字:** `0x3603` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3604` | 字段 | 类型 | 说明 | |------|------|------| | encoderUndervoltage | bool[] | 欠压报警列表,false 表示不欠压,true 表示欠压,长度为当前机器人轴数 | | encoderUnderVoltageExternal | bool[] | 外部轴欠压报警列表,false 表示不欠压,true 表示欠压,长度为当前机器人外部轴轴数 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "encoderUndervoltage": [false, false, false, false, false, false], "encoderUnderVoltageExternal": [false, false, false, false, false], "robot": 1 } ``` --- ## 零点偏移 ### 设置零点偏移 **命令字:** `0x3605` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 设置零点偏移的轴,范围 [0, 7],0 表示设置全部轴 | | mode | int | 零点偏移方式:0 表示度数,1 表示偏移量 | | robot | int | 当前机器人号,范围 [1, 4] | | value | double[] | 零点偏移值列表,长度为 7;当 mode 为度数时范围 [-360, 360] | ```json { "axis": 0, "mode": 0, "robot": 1, "value": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 单圈值 ### 设置单圈值 **命令字:** `0x3606` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 设置的各轴单圈值列表,范围 [-2^31, 2^31-1] | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0] } ``` ### 查询单圈值 **命令字:** `0x3607` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3608` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 各轴单圈值列表,范围 [-2^31, 2^31-1] | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0] } ``` --- ## 多圈值 > 零点偏移为编码器时 ### 查询多圈值 **命令字:** `0x330B` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x330C` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 电机编码器值列表 | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0, 0] } ``` --- # 复位点 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/07.%E5%A4%8D%E4%BD%8D%E7%82%B9.html ## 概述 上位机与控制器通过复位点协议进行通信,用于设置和查询机器人复位点位置、复位 IO 参数、安全位置等相关配置。 ### 复位点概念 复位点是机器人在特定条件下需要返回的安全参考位置。典型的应用场景包括: - **安全事件后复位**:急停或安全门触发后,机器人需要先回到复位点才能继续运行 - **程序异常中断后复位**:程序执行中断后,机器人需要回到复位点重新开始 - **断电重启后复位**:断电后重新上电,机器人需要从复位点开始运行 ### 复位形式 | 形式 | selectPiontOrFile 值 | 说明 | |------|---------------------|------| | 复位点 | 0 | 机器人移动到预设的复位点关节位置 | | 复位程序 | 1 | 机器人执行预设的复位程序 | ### 插补方式 | 方式 | returnWay 值 | 说明 | |------|-------------|------| | 关节插补 | 0 | 各轴以关节插补方式同时移动到复位点 | | 直线插补 | 1 | 末端以直线路径移动到复位点(需要逆解) | --- ## 复位点配置参数总览 | 参数类别 | 参数 | 说明 | |----------|------|------| | 位置参数 | `pos` / `posSync` | 本体轴/外部轴复位点位置 | | 安全参数 | `deviation` / `deviationSync` | 各轴安全范围偏差 | | IO 参数 | `inPort` / `inValue` / `outPort` | 开始/结束 IO 信号 | | 控制参数 | `returnWay` / `safeEnable` / `selectPiontOrFile` | 插补方式/安全使能/复位形式 | ### 安全使能 (safeEnable) 当 `safeEnable` 为 `true` 时: - 机器人在安全事件后**必须手动回到安全点位置**才能重新运行 - 控制器通过 `0x3665` 上报当前不在安全位置的机器人状态 --- ## 1. 上位机设置复位点位置 **命令字:** `0x3660` ### 请求参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | pos | double[] | 7 | 机器人复位点位置列表 | | posSync | double[] | 5 | 机器人外部轴复位点位置列表 | | robot | int | 1 | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "pos": [10.20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- ## 2. 上位机查询复位点位置 **命令字:** `0x3661` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "robot": 1 } ``` --- ## 3. 控制器回复上位机复位点位置 **命令字:** `0x3662` ### 响应参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | deviation | double[] | 7 | 机器人各轴安全范围,范围[0,10] | | deviationSync | double[] | 5 | 机器人外部轴各轴安全范围,范围[0,10] | | inPort | int | 1 | 开始 DIN | | inValue | int | 1 | 开始 DIN 参数,范围[0,1] | | outPort | int | 1 | 结束 DOUT | | pos | double[] | 7 | 机器人复位点位置列表 | | posSync | double[] | 5 | 外部轴复位点位置列表 | | returnWay | int | 1 | 插补方式:0-关节插补,1-直线插补 | | robot | int | 1 | 当前机器人号,范围[1,4] | | safeEnable | bool | 1 | 安全使能:安全使能开始时,机器人必须手动回到安全点位置才能重新运行 | | selectPiontOrFile | int | 1 | 机器人复位形式:0-复位点,1-复位程序 | ### 响应示例 ```json { "deviation": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0], "inPort": 0, "inValue": 1, "outPort": 0, "pos": [10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posSync": [0.0, 0.0, 0.0, 0.0, 0.0], "returnWay": 0, "robot": 1, "safeEnable": false, "selectPiontOrFile": 0 } ``` --- ## 4. 上位机设置复位 IO 参数 **命令字:** `0x3663` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | inPort | int | 开始 DIN | | inValue | int | 开始 DIN 参数,范围[0,1] | | outPort | int | 结束 DOUT | | returnWay | int | 插补方式:0-关节插补,1-直线插补 | | robot | int | 当前机器人号,范围[1,4] | | safeEnable | bool | 安全使能:安全使能开始时,机器人必须手动回到安全点位置才能重新运行 | | selectPiontOrFile | int | 机器人复位形式:0-复位点,1-复位程序 | ### 请求示例 ```json { "inPort": 0, "inValue": 1, "outPort": 0, "returnWay": 0, "robot": 1, "safeEnable": false, "selectPiontOrFile": 0 } ``` --- ## 5. 上位机设置复位点安全位置 **命令字:** `0x3664` ### 请求参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | deviation | double[] | 7 | 机器人各轴安全范围,范围[0,10] | | deviationSync | double[] | 5 | 机器人外部轴各轴安全范围,范围[0,10] | | robot | int | 1 | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "deviation": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0], "robot": 1 } ``` --- ## 6. 控制器回复上位机当前不在安全位置 **命令字:** `0x3665` ### 响应参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | currentPos | double[] | 6 | 当前机器人位置列表,长度为当前机器人轴数 | | isSync | bool | 1 | 是否为外部轴 | | robot | int | 1 | 当前机器人号,范围[1,4] | | safePos | double[] | 6 | 复位点位置列表 | ### 响应示例 ```json { "currentPos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "isSync": false, "robot": 1, "safePos": [10.2, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 复位点配置流程 建议按以下顺序配置复位点: 1. **设置复位点位置** (`0x3660`):定义复位点的各轴关节角度 2. **设置安全范围** (`0x3664`):定义各轴允许的偏差范围 3. **设置 IO 参数** (`0x3663`):配置复位开始/结束的 IO 信号条件 4. **查询验证** (`0x3661`/`0x3662`):查询当前配置,确认参数正确 > **注意:** `returnWay` 选择直线插补时,需确保复位点位置在机器人的可达工作空间内,否则可能导致逆解失败。 --- # 标定 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/08.%E6%A0%87%E5%AE%9A.html ## 四点标定 说明:机器人末梢移动到并标定四个点,计算后可得杆长度和轴零点偏移,若认可计算结果,可将计算结果填入 DH 参数。 ### 上位机四点标定计算请求 **命令字:** `0x3700` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | ParamOf4Points | double[] | 长度为2,L1和 L2长度。两参数分别为机器人末梢从标记点 A 移动到标记点 C 时 X 的移动距离和 Y 的移动距离 | ```json { "ParamOf4Points": [85.0, 70.0] } ``` ### 上位机 N 号点标定请求 **命令字:** `0x3701` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | pointNum | int | 范围[0,3],标定点编号 | | status | int | 范围[0,1],标定状态。0表示取消标定,1表示标定 | ```json { "pointNum": 0, "status": 1 } ``` ### 控制器回复上位机 N 号点标定位置信息 **命令字:** `0x3702` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | pointNum | int | 范围[0,3],标定点编号 | | pos | double[] | 长度为4,位置信息列表 | ```json { "pointNum": 0, "pos": [0.0, 0.0, 0.0, 0.0] } ``` ### 控制器回复上位机标定计算结果 **命令字:** `0x3703` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | dtheta | double[] | 长度为2,轴零点偏移列表。值全为-1表示计算失败 | | length | double[] | 长度为2,杆长度列表。值全为-1表示计算失败 | | result | bool | 是否计算成功 | ```json { "dtheta": [-1.0, -1.0], "length": [-1.0, -1.0], "result": false } ``` ### 上位机请求将计算结果填入 DH 参数 **命令字:** `0x3704` ```json {} ``` ### 控制器回复上位机填入 DH 参数结果 **命令字:** `0x3705` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | apply | bool | 计算结果填入是否成功 | ```json { "apply": true } ``` ### 上位机查询标定信息 **命令字:** `0x3706` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | dtheta | double[] | 长度为2,轴零点偏移列表。null 表示没有计算结果 | | length | double[] | 长度为2,杆长度列表。null 表示没有计算结果 | | result | bool | 是否计算成功 | | status | int[] | 点位标定状态列表。0表示未标定,1表示已标定 | ```json { "dtheta": [null, null], "length": [null, null], "result": false, "status": [0, 1, 0, 1] } ``` ## 20点标定 说明:一种用于校准机器人的方法,通过在特定的20个点上进行标定,以确保机器人的准确性和稳定性。 ### 上位机标定计算请求 **命令字:** `0x3710` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | noCalZero | bool | 是否为校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "noCalZero": false, "robot": 1, "tool": 1 } ``` ### 上位机标定 N 号点请求 **命令字:** `0x3711` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 1, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机 N 号点标定信息 **命令字:** `0x3712` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | position | double[] | 标定点关节坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrationType": 20, "point": 1, "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ### 控制器回复上位机标定计算完成结果 **命令字:** `0x3713` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | distance | double | 标定计算结果。结果为-1表示计算失败,结果>10则请重新标定 | | result | bool | 标定计算是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "distance": 464.473876425245, "result": true, "robot": 1 } ``` ### 上位机发送设置标定结果为零点 **命令字:** `0x3714` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 12, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机标定结果为零点设置结果 **命令字:** `0x3715` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | apply | bool | 设置为零点是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "apply": true, "robot": 1 } ``` ### 上位机查询全部点标定状态 **命令字:** `0x3716` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手号 | ```json { "calibrationType": 20, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机全部点标定状态 **命令字:** `0x3717` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | status | int[] | 点位标定状态列表。1表示已标定,0表示未标定。长度为当前使用标点法 | ```json { "calibrationType": 20, "robot": 1, "status": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] } ``` ### 上位机请求清除 N 号点标定状态 **命令字:** `0x3718` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 范围[0,20],标定点编号。20表示清除所有点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 20, "robot": 1, "tool": 1 } ``` ### 上位机查询 N 号点位置信息 **命令字:** `0x3719` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 1, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机 N 号点位置信息 **命令字:** `0x371A` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | position | double[] | 标定点关节坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrationType": 20, "point": 1, "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ### 上位机请求移动到计算结果位置 **命令字:** `0x371B` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人号 | ```json { "robot": 1 } ``` ### 上位机查询是否可以打开标定页面 **命令字:** `0x371C` ```json {} ``` ### 控制器回复上位机是否可以打开标定页面 **命令字:** `0x371D` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | canCalibration | bool | 上位机是否可以打开标定页面 | ```json { "canCalibration": true } ``` ## 外部轴标定 说明:包含有旋转轴标定和直线轴(地轨)协同参数。 ### 上位机外部旋转轴标定计算请求 **命令字:** `0x3730` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateNum | int | 范围[1,3],当前轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrateNum": 1, "robot": 1 } ``` ### 上位机外部轴标定 N 号点请求 **命令字:** `0x3731` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[1,3],当前轴组号 | | pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 1, "pointNum": 0, "robot": 1 } ``` ### 控制器回复上位机外部轴 N 号点标定信息 **命令字:** `0x3732` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[1,3],当前轴组号 | | pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] | | pos | double[] | 标定点直角坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 1, "pointNum": 0, "pos": [470.746, 0.0, 817.334, 3.14159265359, 0.0, 0.0], "robot": 1 } ``` ### 控制器回复上位机外部轴标定计算结果 **命令字:** `0x3733` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | result | bool | 外部轴标定计算是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "result": true, "robot": 1 } ``` ### 上位机查询机器人绑定外部轴标定状态 **命令字:** `0x3734` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复上位机机器人绑定外部轴标定状态 **命令字:** `0x3735` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool[] | 长度为3,机器人绑定外部轴标定状态。true 表示已标定,false 表示未标定 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrateResult": [false, false, false], "robot": 1 } ``` ### 上位机设置当前协作外部轴组号 **命令字:** `0x3736` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[0,2],协作外部轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 0, "robot": 1 } ``` ### 上位机查询当前协作外部轴组号 **命令字:** `0x3737` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复上位机当前协作外部轴组号 **命令字:** `0x3738` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[0,2],协作外部轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 0, "robot": 1 } ``` ### 上位机设置地轨协同参数 **命令字:** `0x3739` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool | 地轨是否协同。协同:当启用地址是确定 | | conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。超过当前轴数的部分默认为1.0 | | trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。超过当前轴数的部分默认为0 | ```json { "calibrateResult": true, "conversionRatio": [58.0, 1.0, 1.0], "trackMap": [1, 0, 0] } ``` ### 上位机查询当前机器人地轨协同参数 **命令字:** `0x373A` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复当前机器人地轨协同参数 **命令字:** `0x373B` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool | 地轨是否协同 | | conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。初始化为9999 | | robot | int | 当前机器人号 | | trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。初始化为0 | ```json { "calibrateResult": false, "conversionRatio": [9999, 9999, 9999], "robot": 1, "trackMap": [0, 0, 0] } ``` ### 上位机发送设置外部轴标定结果 **命令字:** `0x373C` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | | resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 | ```json { "syncPositionerNum": 1, "resultArray": [ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] } ``` ### 上位机查询外部轴标定结果 **命令字:** `0x373D` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | ```json { "syncPositionerNum": 1 } ``` ### 控制器回复上位机外部轴标定结果 **命令字:** `0x373E` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | | calibrateResult | bool | 外部轴标定计算结果 | | resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 | ```json { "syncPositionerNum": 1, "calibrateResult": false, "resultArray": [ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] } ``` ### 上位机发送设置地轨方向校准系数 **命令字:** `0x373F` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` ### 上位机查询地轨方向校准系数 **命令字:** `0x3740` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | ```json { "axis_num": 1 } ``` ### 控制器回复地轨方向校准系数 **命令字:** `0x3741` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` ### 上位机标定轴 N 号点请求 **命令字:** `0x3742` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | | point_num | int | 范围[1,2],当前标定点编号 | ```json { "axis_num": 1, "point_num": 1 } ``` ### 上位机请求地轨移动到标记点 **命令字:** `0x3743` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | | point_num | int | 范围[1,2],当前标定点编号 | ```json { "axis_num": 1, "point_num": 1 } ``` ### 上位机地轨标定点计算请求 **命令字:** `0x3744` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | ```json { "axis_num": 1 } ``` ### 控制器回复上位机标定计算结果 **命令字:** `0x3745` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` ### 上位机设置联动主机编号 **命令字:** `0x3755` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | masterRobot | int | 范围[1,4],联动主机编号 | ```json { "masterRobot": 1 } ``` ### 控制器回复上位机联动主机编号 **命令字:** `0x3754` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | masterRobot | int | 范围[1,4],联动主机编号 | ```json { "masterRobot": 1 } ``` --- ## 标定算法参数 ### 四点标定算法 四点标定通过四个已知位置的标定点,利用几何关系计算出机器人杆长和轴零点偏移。 #### 算法原理 1. 机器人末梢移动到四个标定点(标记点 A, B, C, D) 2. 通过最小二乘法求解杆长 L1, L2 和轴零点偏移 dtheta1, dtheta2 3. 计算结果可填入 DH 参数,修正运动学模型 #### 算法参数 (ParamOf4Points) | 参数 | 说明 | 单位 | |------|------|------| | L1 | 机器人末梢从标记点A移动到C时X方向移动距离 | mm | | L2 | 机器人末梢从标记点A移动到C时Y方向移动距离 | mm | ### 20点标定算法 20点标定通过在不同姿态下的大量采样点,利用非线性优化算法求解完整的运动学参数。 #### 优化目标 最小化所有标定点的位置误差:min sum(||P_actual_i - P_target||) 其中 P_actual_i 是第 i 个标定点的实际位置,P_target 是标记点位置。 #### 收敛条件 | 条件 | 阈值 | 说明 | |------|------|------| | 标定距离 | < 10mm | 标定计算结果 distance < 10 表示标定成功 | | 计算成功 | result=true | 优化算法成功收敛 | #### 标定点方法选择 | calibrationType | 方法 | 标定点数 | 校准内容 | 适用场景 | |-----------------|------|----------|----------|----------| | 2 | 2点法 | 2 | 简单校准 | 快速校准 | | 12 | 12点法 | 12 | 零点+工具手 | 未激光标定+焊枪 | | 15 | 15点法 | 15 | 零点+工具手(精确) | 高精度场景 | | 20 | 20点法(校准零点) | 20 | 零点+工具手 | 零点丢失 | | 21 | 21点法(不校准零点) | 21 | 仅工具手 | 零点已校准 | ### 标定算法参数调节 | 参数 | 说明 | 推荐值 | |------|------|--------| | 标定点分布 | 标定点应覆盖尽可能大的工作空间 | 全工作空间的60%以上 | | 姿态多样性 | 各标定点的姿态应有明显差异 | 各轴角度变化 > 20度 | | 参考点稳定性 | 参考点在标定过程中不允许移动 | 固定偏差 < 0.1mm | --- ## 自动标定流程 ### 四点标定流程 #### 标定步骤 1. **准备阶段** - 确认机器人处于手动/示教模式 - 安装标定工具(如标定锥) - 设置固定参考点 2. **标定阶段** - 移动机器人末梢到标记点 A,发送标定请求(0x3701, pointNum=0, status=1) - 沿 X 方向移动 L1 距离到标记点 C,发送标定请求(0x3701, pointNum=2, status=1) - 沿 Y 方向移动 L2 距离到标记点 B,发送标定请求(0x3701, pointNum=1, status=1) - 移动机器人末梢到标记点 D,发送标定请求(0x3701, pointNum=3, status=1) 3. **计算阶段** - 发送标定计算请求(0x3700),传入 ParamOf4Points=[L1, L2] - 控制器返回计算结果(0x3703),包含杆长 length 和零点偏移 dtheta - 检查 result 是否为 true,dtheta 和 length 是否不为 -1 4. **应用阶段** - 如认可结果,发送填入 DH 参数请求(0x3704) - 控制器返回应用结果(0x3705) #### 标定数据流 标定点1~4 -> 几何计算 -> 杆长 L1+L2 + 零点偏移 dtheta1+dtheta2 -> 填入 DH 参数 -> 验证 ### 20点标定流程 #### 标定步骤 1. **准备阶段** - 设置参考点(固定标记点) - 选择标定方法类型 (calibrationType=20) - 选择工具手编号 2. **标定阶段(循环20次)** - 移动机器人到第 i 个标定点 - 发送标定请求(0x3711, point=i) - 控制器返回标定点信息(0x3712) 3. **计算阶段** - 全部20点标定完成后,发送计算请求(0x3710) - 控制器返回计算结果(0x3713),包含 distance 和 result - 检查 result=true 且 distance < 10 4. **应用阶段** - 如认可结果,发送设置为零点请求(0x3714) - 控制器返回设置结果(0x3715) #### 标定状态查询 可随时查询各标定点的完成情况: - 查询全部点状态(0x3716/0x3717): 返回 status 数组,1=已标定,0=未标定 - 查询 N 号点位置(0x3719/0x371A): 返回该点的关节坐标 ### 外部轴标定流程 #### 旋转轴标定 1. 设置协作外部轴组号(0x3736) 2. 移动机器人到标定点1,发送标定请求(0x3731, pointNum=0) 3. 旋转外部轴到不同角度,移动机器人到标定点2~5,逐一标定 4. 发送计算请求(0x3730)获取标定结果(0x3733) #### 地轨标定 1. 设置地轨协同参数(0x3739):包含转换比(conversionRatio)和各轴方向(trackMap) 2. 移动地轨到标记点1,发送标定请求(0x3742, point_num=1) 3. 移动地轨到标记点2,发送标定请求(0x3742, point_num=2) 4. 发送计算请求(0x3744)获取方向校准系数(0x3745) ### 自动标定安全检查 | 检查项 | 方法 | 标准 | |--------|------|------| | 参考点固定 | 标定前后检查参考点位置 | 偏差 < 1mm | | 碰撞风险 | 标定路径上无障碍物 | 手动确认路径安全 | | 伺服状态 | 标定前确认伺服开启 | 各轴伺服正常 | | 急停可用 | 确保急停按钮可用 | 紧急情况可中断 | --- # 干涉区 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/09.%E5%B9%B2%E6%B6%89%E5%8C%BA.html ## 概述 干涉区是用于多机器人协作或机器人与外部设备交互时,防止碰撞的安全区域机制。通过定义笛卡尔空间中的矩形区域,控制器可以实时监控机器人末端/工具是否进入或离开指定的干涉区,并根据配置执行相应的动作(状态输出或禁止运动)。 --- ## 干涉区概念 ### 干涉区定义 干涉区是笛卡尔空间中的一个**轴对齐矩形区域(AABB)**,由最小坐标点 (minX, minY, minZ) 和最大坐标点 (maxX, maxY, minZ) 定义。控制器实时计算机器人末端(TCP)位置,判断其是否在干涉区内。 ### 干涉区类型 | 类型 | workType 值 | 说明 | 典型应用 | |------|------------|------|----------| | 状态输出 | 0 | 机器人在区域内时输出 IO 信号 | 通知外部设备机器人已到达工作区域 | | 禁止运动 | 1 | 机器人在区域内时禁止运动 | 防止两台机器人进入对方的作业空间 | ### 区域判断 | 判断方式 | isInInterfer 值 | 说明 | |----------|----------------|------| | 在区域内 | 1 | 当机器人末端在区域内时触发 | | 在区域外 | 0 | 当机器人末端在区域外时触发 | ### 干涉区应用场景 1. **多机器人协作**:定义各机器人的专属工作区域,防止同时进入同一区域 2. **机器人与外部设备**:定义设备的安全区域,机器人进入时降低速度或停止 3. **工位管理**:定义不同工位的边界,通过 IO 信号通知 PLC 机器人的位置 4. **安全围栏**:定义虚拟围栏,机器人越界时停止运动 --- ## 干涉区数量与编号 - 每个机器人支持最多 **99 个干涉区**(工艺号 1-99) - 每个干涉区独立配置,互不影响 - 干涉区坐标系基于**当前选中的用户坐标系** --- ## 干涉区范围 ### 上位机设置干涉区范围 **命令字:** `0x3800` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 工艺号 | | param | object | - | 干涉区参数 | | robot | int | [1,4] | 当前机器人号 | **param 参数:** | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | varName | string | GB001-GB999 | 用于干涉区输出值 | | enable | bool | - | 干涉区使能 | | isInInterfer | int | [0,1] | 在区域内/外:0表示在区域外,1表示在区域内 | | maxX | double | [-9999,9999] mm | 最大 X | | maxY | double | [-9999,9999] mm | 最大 Y | | maxZ | double | [-9999,9999] mm | 最大 Z | | minX | double | [-9999,9999] mm | 最小 X | | minY | double | [-9999,9999] mm | 最小 Y | | minZ | double | [-9999,9999] mm | 最小 Z | | port | int | - | 输出 IO 端口 | | value | int | [0,1] | 输出参数 | | workType | int | [0,1] | 起作用方式:0表示状态输出,1表示禁止运动 | **示例:** ```json { "num": 1, "param": { "enable": false, "isInInterfer": 1, "maxX": "1101.05", "maxY": "183.569", "maxZ": "1024.13", "minX": "833.956", "minY": "-173.017", "minZ": "944.358", "port": 0, "value": 0, "workType": 0 }, "robot": 1 } ``` ### 配置建议 - `minX` < `maxX`,`minY` < `maxY`,`minZ` < `maxZ`,否则干涉区无效 - 干涉区应设置在机器人可达工作空间内 - 多个干涉区可以重叠,重叠区域的判断结果取并集 --- ### 上位机查询干涉区范围 **命令字:** `0x3801` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "robot": 1 } ``` --- ### 控制器回复上位机干涉区参数/干涉点标记结果 **命令字:** `0x3802` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 工艺号 | | param | object | - | 干涉区参数 | | robot | int | [1,4] | 当前机器人号 | **param 参数:** | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | calibrationState1 | int | [0,1] | 标记点1是否标定:0表示未标定,1表示已标定 | | calibrationState2 | int | [0,1] | 标记点2是否标定:0表示未标定,1表示已标定 | | enable | bool | - | 干涉区使能 | | isInInterfer | int | [0,1] | 在区域内/外:0表示在区域外,1表示在区域内 | | maxX | double | [-9999,9999] mm | 最大 X | | maxY | double | [-9999,9999] mm | 最大 Y | | maxZ | double | [-9999,9999] mm | 最大 Z | | minX | double | [-9999,9999] mm | 最小 X | | minY | double | [-9999,9999] mm | 最小 Y | | minZ | double | [-9999,9999] mm | 最小 Z | | point1Data | double[] | - | 标记点1标记位置信息列表 | | point2Data | double[] | - | 标记点2标记位置信息列表 | | port | int | - | 输出 IO 端口 | | value | int | [0,1] | 输出参数 | | workType | int | [0,1] | 起作用方式:0表示状态输出,1表示禁止运动 | **示例:** ```json { "num": 1, "param": { "calibrationState1": 0, "calibrationState2": 0, "enable": false, "isInInterfer": 1, "maxX": "1101.05", "maxY": "183.569", "maxZ": "1024.13", "minX": "833.956", "minY": "-173.017", "minZ": "944.358", "point1Data": [0, 0, 0, 0, 0, 0], "point2Data": [0, 0, 0, 0, 0, 0], "port": 0, "value": 0, "workType": 0 }, "robot": 1 } ``` --- ## 干涉点 ### 干涉点概念 干涉点用于辅助定义干涉区的位置。通过示教标记两个对角点(标记点1和标记点2),控制器可以自动计算干涉区的边界范围。这是一种便捷的干涉区定义方式。 ### 标记点标定流程 1. 通过 `0x3810` 发送标记请求,指定标记点号 (1 或 2) 2. 手动将机器人移动到目标位置 3. 控制器记录当前位置作为标记点 4. 完成两个标记点后,通过 `0x3811` 请求计算干涉区范围 --- ### 上位机请求标记干涉点 **命令字:** `0x3810` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | calibrationState1 | int | [0,1] | 标记点1状态:0表示进行标定,1表示取消标定 | | calibrationState2 | int | [0,1] | 标记点2状态:0表示进行标定,1表示取消标定 | | num | int | [1,99] | 工艺号 | | pos | int | [1,2] | 标记点号:1表示标记点1,2表示标记点2 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "calibrationState1": 1, "calibrationState2": 1, "num": 1, "pos": 1, "robot": 1 } ``` --- ### 上位机请求标记完成计算 **命令字:** `0x3811` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "robot": 1 } ``` --- ### 上位机请求移动到标记点 **命令字:** `0x3812` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | pos | int | [1,2] | 需要移动到的标记点号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "pos": 1, "robot": 1 } ``` --- # 跟随误差&电机过载保护 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/10.%E8%B7%9F%E9%9A%8F%E8%AF%AF%E5%B7%AE&%E7%94%B5%E6%9C%BA%E8%BF%87%E8%BD%BD%E4%BF%9D%E6%8A%A4.html ## 概述 跟随误差和电机过载保护是机器人运动控制中的关键安全监测机制。本章说明跟随误差的概念、监测参数设置、电机过载保护配置以及速度碰撞检测功能。 --- ## 跟随误差概念 ### 什么是跟随误差 **跟随误差**是指控制器下发的**指令位置**与伺服驱动器反馈的**实际位置**之间的偏差。它是衡量伺服系统跟踪性能的核心指标。 - **静态误差**:机器人静止时的指令位置与实际位置偏差 - **动态误差**:机器人运动时的指令位置与实际位置偏差 ### 跟随误差过大的原因 | 原因 | 说明 | 排查方向 | |------|------|----------| | 负载过重 | 电机输出扭矩不足以驱动负载 | 减轻负载或调整加减速参数 | | 加减速过大 | 指令加速度超过电机能力 | 降低加速度参数 | | 机械卡滞 | 机械传动部分存在阻力 | 检查减速机、导轨等机械部件 | | 伺服参数不当 | 伺服增益等参数设置不合理 | 调整伺服 PID 参数 | | 编码器故障 | 编码器反馈异常 | 检查编码器连接和状态 | ### 跟随误差保护机制 当跟随误差超过设定的**最大跟随误差上限**时,控制器将: 1. 立即停止当前运动(紧急停止) 2. 上报跟随误差过大错误(kind=2) 3. 需要清除错误后才能重新使能 --- ## 1. 最大跟随误差上限 ### 1.1 上位机设置最大跟随误差参数上限 **命令字:** `0x3860` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | maxDynamicDeviations | int[6] | 最大动态误差 | [1, 2×10⁷] ‱° | | maxStaticDeviations | int[6] | 最大静态误差 | [1, 2×10⁷] ‱° | > **单位说明:** ‱° 表示万分之一度(0.0001°),例如 5000000 表示 500° 的跟随误差阈值。 **请求示例:** ```json { "maxDynamicDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000], "maxStaticDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000] } ``` ### 参数配置建议 - **动态误差**通常设置为**静态误差的 2-5 倍**,因为运动时允许更大的跟随偏差 - 对于**高精度应用**(如激光切割),应设置更小的跟随误差阈值 - 对于**重负载应用**,可适当增大阈值以避免频繁触发保护 - **各轴独立设置**,通常 J1-J3 轴负载较大,可设置较大阈值 --- ### 1.2 上位机查询最大跟随误差参数上限 **命令字:** `0x3861` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 1.3 控制器回复上位机最大跟随误差参数上限 **命令字:** `0x3862` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | maxDynamicDeviations | int[6] | 最大动态误差 | [1, 2×10⁷] ‱° | | maxStaticDeviations | int[6] | 最大静态误差 | [1, 2×10⁷] ‱° | | robot | int | 当前机器人号 | [1, 4] | **响应示例:** ```json { "maxDynamicDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000], "maxStaticDeviations": [5000000, 5000000, 5000000, 5000000, 5000000, 5000000], "robot": 1 } ``` --- ## 2. 当前跟随误差(监控) ### 2.1 上位机查询当前跟随误差 **命令字:** `0x3870` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 2.2 控制器回复上位机当前跟随误差 **命令字:** `0x3871` **参数列表:** | 参数名 | 类型 | 说明 | 维度 | |--------|------|------|------| | curDeviations | double[7] | 当前机器人误差列表 | 单位 ‱° | | curExternalDeviations | double[5] | 当前外部轴误差列表 | 单位 ‱° | | maxDeviations | double[7] | 最大机器人误差列表 | 单位 ‱° | | maxExternalDeviations | double[5] | 最大外部轴误差列表 | 单位 ‱° | | robot | int | 当前机器人号 | [1, 4] | > **说明:** `maxDeviations` 记录的是历史最大误差值,可用于分析运动过程中的峰值误差。 **响应示例:** ```json { "curDeviations": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "curExternalDeviations": [0.0, 0.0, 0.0, 0.0, 0.0], "maxDeviations": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "maxExternalDeviations": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- ## 3. 电机过载保护 ### 功能说明 电机过载保护用于监测电机扭矩是否长时间超出安全范围。当电机扭矩持续超过设定的 `robotLimit` 值超过 `minLimiteTime` 时间时,触发过载保护。 ### 保护机制 1. 实时监测各轴电机扭矩 2. 当扭矩超过 `robotLimit` 时开始计时 3. 持续时间超过 `minLimiteTime` 则触发过载保护 4. 停止运动并上报过载错误 --- ### 3.1 上位机设置电机过载保护参数 **命令字:** `0x3880` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | enable | bool | 电机过载保护使能 | true/false | | minLimiteTime | int | 电机过载保护最小确认时间 | [10, 9999] ‰ | | robotLimit | int[6] | 电机扭矩过载值列表 | [0, 9999) ‰ 或 mNm | | robot | int | 当前机器人号 | [1, 4] | > **单位说明:** `minLimiteTime` 单位为千分之一秒(‰),如 10 表示 10ms。`robotLimit` 为相对于电机额定扭矩的千分比。 **请求示例:** ```json { "enable": false, "minLimiteTime": 10, "robot": 1, "robotLimit": [999, 999, 999, 999, 999, 999] } ``` --- ### 3.2 上位机查询电机过载保护参数 **命令字:** `0x3881` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 3.3 控制器回复上位机电机过载保护参数 **命令字:** `0x3882` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | enable | bool | 电机过载保护使能 | true/false | | minLimiteTime | int | 电机过载保护最小确认时间 | [10, 9999] ‰ | | robotLimit | int[6] | 电机扭矩过载值列表 | [0, 9999) ‰ 或 mNm | | robot | int | 当前机器人号 | [1, 4] | **响应示例:** ```json { "enable": false, "minLimiteTime": 10, "robot": 1, "robotLimit": [999, 999, 999, 999, 999, 999] } ``` --- ## 4. 伺服速度碰撞检测 ### 功能说明 速度碰撞检测通过监测伺服电机的实际速度与指令速度的偏差来判断是否发生碰撞。当实际速度与指令速度的偏差超过允许范围并持续一定时间时,判定为碰撞发生。 ### 工作原理 - 控制器持续比较**指令速度**与**实际速度** - 计算速度偏差 = |实际速度 - 指令速度| - 当速度偏差 > `speed_enable_error` 且持续时间 > `speed_delay_time` 时触发碰撞检测 --- ### 4.1 设置伺服速度碰撞检测参数 **命令字:** `0x40A0` **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | switch | bool | 速度碰撞检测开关 | | speed_delay_time | int | 伺服速度延迟时间 | | speed_enable_error | double | 伺服速度允许误差 | **请求示例:** ```json { "switch": true, "speed_delay_time": 10, "speed_enable_error": 10 } ``` --- ### 4.2 上位机获取伺服速度碰撞检测参数 **命令字:** `0x40A1` **参数列表:** 无 --- ### 4.3 控制器回复伺服速度碰撞检测参数 **命令字:** `0x40A2` **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | switch | bool | 速度碰撞检测开关 | | speed_delay_time | int | 伺服速度延迟时间 | | speed_enable_error | double | 伺服速度允许误差 | **响应示例:** ```json { "switch": true, "speed_delay_time": 10, "speed_enable_error": 10 } ``` --- # 动力学 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/11.%E5%8A%A8%E5%8A%9B%E5%AD%A6.html ### 转换比 - 说明 - 力矩拖拽时需要配置力矩转换比和传感器力矩转换比 - 转换比为伺服值的比例关系,通常由伺服厂家提供 - 上位机设置转换比参数 **命令字:** `0x4000` CONVERSION_RATIO_SET - "conversionRatioEnable":true - 是否开启使能;bool 类型,true 开启使能,false 关闭使能 - "jointActualTorqConversionRatio":[0,0,0,0,0,0,0] - 力矩转换比;double 类型,数组大小 7 - "jointSensorTorqConversionRatio":[0,0,0,0,0,0,0] - 传感器力矩转换比;double 类型,数组大小 7 ```json { "conversionRatioEnable": true, "jointActualTorqConversionRatio": [0, 0, 0, 0, 0, 0, 0], "jointSensorTorqConversionRatio": [0, 0, 0, 0, 0, 0, 0] } ``` - 上位机获取转换比参数 **命令字:** `0x4001` CONVERSION_RATIO_INQUIRE ```json {} ``` - 控制器返回转换比参数 **命令字:** `0x4002` CONVERSION_RATIO_RESPOND - "conversionRatioEnable":true - 是否开启使能;bool 类型,true 开启使能,false 关闭使能 - "jointActualTorqConversionRatio":[0,0,0,0,0,0] - 力矩转换比;double 类型,数组大小 7 - "jointSensorTorqConversionRatio":[0,0,0,0,0,0] - 传感器力矩转换比;double 类型,数组大小 7 - "motorRatedTorque":[0,0,0,0,0,0] - 电机额定力矩;double 类型,数组大小由关节轴数决定,仅当 sdo 从 6076 中读取到额定扭矩时存在该节点 ```json { "conversionRatioEnable": true, "jointActualTorqConversionRatio": [0, 0, 0, 0, 0, 0], "jointSensorTorqConversionRatio": [0, 0, 0, 0, 0, 0], "motorRatedTorque": [0, 0, 0, 0, 0, 0] } ``` - 负载使能;bool 类型 - 上位机设置负载使能工艺号 **命令字:** `0x4003` - "payload_num":1 ```json { "payload_num":1 } ``` - 负载使能工艺号;int 类型 - 控制器回复上位机负载使能工艺号 **命令字:** `0x4004` - "payload_num":1 ```json { "payload_num":1 } ``` ### 外部按键 - 负载使能工艺号;int 类型 - 说明 - 可通过 IO 触发相应的功能,按队列顺序分别为拖拽模式、点动模式、开始轨迹采集、结束轨迹采集、开始轨迹回放、停止轨迹回放、上使能、下使能、夹爪开、夹爪关、保存轨迹、快捷指令1、快捷指令2、快捷指令3、快捷指令4、快捷指令5 - 快捷指令范围[0,9],0表示未选择,1表示点到点指令,2表示直线指令,3表示圆弧指令,4表示整圆指令,5表示曲线指令,6表示焊接开始指令,7表示焊接结束指令,8表示摆焊开始指令,9表示摆焊结束指令 - 上位机查询功能控制参数 ```json {} ``` **命令字:** `0x4020` - 控制器回复上位机功能控制参数 **命令字:** `0x4021` - "IoInPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "fastCommand":[0,0,0,0,0] - 快捷指令功能选择列表;int 类型,范围[0,9] - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "isClearTrack":0 - 保存后清除轨迹;int 类型,范围[0,1] - 0表示清除,1表示不清除 - "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发参数列表;int 类型,范围[0,1] - "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发方式列表;int 类型,范围[0,2] - 0表示长按,1表示短按,2表示置位 - "craft":{ - "weldBeadSize":2 - 多层多道焊当前焊道数;int 类型;取值范围:1-99 - "dragTeachSelectCraft":0 ```json { "IoInPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "fastCommand":[0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "isClearTrack":0, "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "craft": { "weldBeadSize":2 }, "dragTeachSelectCraft":0 } ``` - 拖拽示教工艺选择;int 类型;取值范围[0,1] - 上位机查询状态提示参数 ```json {} ``` **命令字:** `0x4022` - 控制器回复上位机状态提示参数 **命令字:** `0x4023` - "IoDoutPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "parameterArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ```json { "IoDoutPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` - 端口触发参数列表;int 类型,范围[0,2] - 0表示0,1表示1,2表示闪烁 - 上位机设置功能控制或状态提示参数 **命令字:** `0x4024` - "_isFunctionalControl":true - 是否为功能控制参数;bool 类型 - true 表示设置功能控制参数,false 表示设置状态提示参数 - "fastCommand":[0,0,0,0,0] - 快捷指令功能选择列表;int 类型,范围[0,9] - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "isClearTrack":0 - 保存后清除轨迹;int 类型,范围[0,1] - 0表示清除,1表示不清除 - "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发方式列表;int 类型,范围[0,2] - 分别表示"长按""短按""置位" - "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发参数列表;int 类型 - 功能控制时范围[0,1] - 状态提示参数时范围[0,2],2表示"闪烁" - "portArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "dragTeachSelectCraft":0 ```json { "_isFunctionalControl":true, "fastCommand":[0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "isClearTrack":0, "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "portArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "dragTeachSelectCraft":0 } ``` - 拖拽示教工艺选择;int 类型;取值范围[0,1] - 控制器发送快捷插入指令 **命令字:** `0x4025` - "fastCommandSelectd":1 - 已选择快捷功能;int 类型,范围[0,9] - 取值在[1,5]时"pos"和"posture"节点存在 - "name":11 - 快捷功能号;int 类型,范围[11,15] - 分别表示快捷功能1~5 - "pos":[0.0,0.0,0.0,0.0,0.0,0.0,0.0] - 插入指令位置信息列表;double 类型 - 长度为7 - "posture":8 ```json { "fastCommandSelectd":1, "name":11, "pos":[0.0,0.0,0.0,0.0,0.0,0.0,0.0], "posture":8 } ``` ### 动力学参数 - 插入指令位置姿态;int 类型,范围[0,9] - 说明 - 需要进行力矩拖拽时必须先进行一次动力学辨识 - 上位机设置动力学参数 **命令字:** `0x4030` - "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0] - 动力学参数列表;double 类型 - 第1位表示质量,第2位表示质心 X,第3位表示质心 Y,第4位表示质心 Z,第5位表示惯性张量 XX,第6位表示惯性张量 XY,第7位表示惯性张量 XZ,第8位表示惯性张量 YY,第9位表示惯性张量 YZ,第10位表示惯性张量 ZZ,第11位表示动摩擦系数,第12位表示静摩擦系数 - "joint_num":6 ```json { "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0], "joint_num":6 } ``` - 机器人轴数;int 类型 - 上位机查询动力学参数 ```json {} ``` **命令字:** `0x4031` - 控制器回复上位机动力学参数 **命令字:** `0x4032` - "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0] - 动力学参数列表;double 类型 - 第1位表示质量,第2位表示质心 X,第3位表示质心 Y,第4位表示质心 Z,第5位表示惯性张量 XX,第6位表示惯性张量 XY,第7位表示惯性张量 XZ,第8位表示惯性张量 YY,第9位表示惯性张量 YZ,第10位表示惯性张量 ZZ,第11位表示动摩擦系数,第12位表示静摩擦系数 - "joint_num":6 ```json { "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0], "joint_num":6 } ``` - 机器人轴数;int 类型 - 上位机请求参数辨识 ```json {} ``` **命令字:** `0x4033` - 控制器回复上位机参数辨识结果 **命令字:** `0x4034` - "finish":false ```json { "finish":false } ``` - 辨识结束;bool 类型 - 上位机请求动力学辨识 - "goHome":true - 是否回零;bool 类型,true 回零,false 不用回零 - "frictionIdent":true - 是否摩擦力辨识;bool 类型,true 摩擦力辨识,false 不用辨识 - "dynamicsIdent":true - 是否动力学辨识;bool 类型,true 动力学辨识,false 不用辨识 - "dynamicsVerify":true - 是否误差标定辨识;bool 类型,true 误差标定辨识,false 不用辨识 ```json { "goHome": true, "frictionIdent": true, "dynamicsIdent": true, "dynamicsVerify": true } ``` **命令字:** `0x4035` IDENTITY_SET - 控制器回复上位机辨识误差值 **命令字:** `0x4036` - "error":[0.0,0.0,0.0,0.0,0.0,0.0] ```json { "error":[0.0,0.0,0.0,0.0,0.0,0.0] } ``` - 转矩误差列表;double 类型 - 控制器回复上位机辨识结果 **命令字:** `0x4037` - "finish":1 ```json { "finish":1 } ``` - 辨识结果;int 类型 - 控制器辨识过程中错误停止发送给上位机 **命令字:** `0x4038` - "ErrorStop":1 ```json { "ErrorStop":1 } ``` ### 负载辨识 - 错误停止;int 类型 - 上位机请求负载辨识数据 **命令字:** `0x4040` - data:无 - 上位机请求辨识计算负载质量和质心 **命令字:** `0x4041` - data:无 - 上位机请求辨识计算惯量 **命令字:** `0x4042` - data:无 - 控制器回复负载辨识结果(负载质量和质心 / 惯量) 或负载数据 **命令字:** `0x4043` - "result":true - 负载辨识结果;bool 类型; - true:负载辨识成功(显示数据);false:负载辨识失败 - "mass":3.6 - 质量;double 类型;kg - "massCenterX":0.53 - 质心 X;double 类型;m - "massCenterY":2.3 - 质心 Y;double 类型;m - "massCenterZ":1.3 - 质心 Z;double 类型;m - "Ixx":0.0 - 惯量 X;double 类型;kg·m² - "Iyy":0.0 - 惯量 Y;double 类型;kg·m² - "Izz":0.0 ```json { "result":true, "mass":3.6, "massCenterX":0.53, "massCenterY":2.3, "massCenterZ":1.3, "Ixx":0.0, "Iyy":0.0, "Izz":0.0 } ``` - 惯量 Z;double 类型;kg·m² - 上位机请求保存负载数据到对应工具手 **命令字:** `0x4044` - "targetTool":1 ```json { "targetTool":1 } ``` - 需要保存到工具手号;int 类型;取值范围[1,999] - 控制器回复保存负载数据到对应工具手 **命令字:** `0x4045` - "result":true ```json "result":true ``` - 保存是否成功;bool 类型 - true:保存成功;false:保存失败 - 上位机请求空载辨识 **命令字:** `0x4046` - data:无 - 控制器回复回应空载辨识 **命令字:** `0x4047` - "result":true ```json { "result":true } ``` - 空载辨识结果;bool 类型; - true:空载辨识成功;false:空载辨识失败 - 上位机请求下载空载配置文件数据 **命令字:** `0x4048` - data:无 - 控制器回复下载空载配置文件数据 **命令字:** `0x4049` - "name":"config/identification_xxxxx.json" ```json { "name":"config/identification_xxxxx.json" } ``` ### 软浮动参数 - 配置文件在控制器的路径;string 类型 - xxxx 为 bios 获取的时间 - 上位机获取软浮动参数 **命令字:** `0x404A` - "softfloat":{} - "num":0 ```json { "softfloat": { "num":0 } } ``` - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - 控制器回复软浮动参数 **命令字:** `0x404B` - "softfloat":{} - "num":0 - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - "percentage"[j][k]:[] - 含义对应 关节 直角 工具 用户;类型 int;范围 j(0-3) k(0-6) - 每种坐标系中分别的柔软度百分比(例:关节 j1 j2 j3 ...;直角 X Y Z A..) - "coord":0 - 含义对应 工艺号选择的坐标系类型(关节 直角 工具 用户); 类型 int;范围0-3 - "note":"xxxx" ```json { "softfloat": { "num":0, "percentage": [ [],[]...... ] "coord":0, "note":"xxxx" } } ``` - 含义注释;类型 string - 上位机发送设置软浮动参数 - 0x404C - "softfloat":{} - "num":0 - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - "percentage"[j]:[] - 含义对应 关节 直角 工具 用户;类型 int;范围 j(0-3) - 每种坐标系中分别的柔软度百分比 - "coord":0 - 含义对应 工艺号选择的坐标系类型(关节 直角 工具 用户); 类型 int;范围0-3 - "note":"xxxx" ```json { "softfloat": { "num":0, "percentage": [ ...... ] "coord":0, "note":"xxxx" } } ``` ### 安全状态 - 含义注释;类型 string - 上位机动力学辨识测试 - "goHome":true - 是否回零;bool 类型,true 回零,false 不用回零 - "frictionIdent":true - 是否摩擦力辨识;bool 类型,true 摩擦力辨识,false 不用辨识 - "dynamicsIdent":true - 是否动力学辨识;bool 类型,true 动力学辨识,false 不用辨识 - "dynamicsVerify":true - 是否误差标定辨识;bool 类型,true 误差标定辨识,false 不用辨识 ```json { "goHome": true, "frictionIdent": true, "dynamicsIdent": true, "dynamicsVerify": true } ``` **命令字:** `0x407A` SAFE_CHECK_SET - 控制器回复上位机安全状态 **命令字:** `0x407B` ```json { "finish":1 } ``` - "finish":1 - 辨识结果;int 类型 - 上位机请求设置辨识轨迹参数 **命令字:** `0x4077` - "traSize":10.0 - 辨识轨迹范围;int 类型,范围[1,100] - 第一次请填入较小数值 - "traVel":100.0 ```json { "traSize":10.0, "traVel":100.0 } ``` - 辨识轨迹速度;int 类型,范围[1,100] - 请先用低速测试安全,辨识用100 - 上位机查询辨识轨迹参数 ```json {} ``` **命令字:** `0x4078` - 控制器回复上位机辨识轨迹参数 **命令字:** `0x4079` - "alreadyIden":false - 是否已完成辨识;bool 类型 - "traSize":10.0 - 辨识轨迹范围;int 类型,范围[1,100] - "traVel":10.0 ```json { "alreadyIden":false, "traSize":10.0, "traVel":10.0 } ``` - 辨识轨迹速度;int 类型,范围[1,100] - 控制器回复上位机当前轨迹 Z 最值 **命令字:** `0x407C` - "zMax":636.712935786949 - 当前轨迹 Z 最大值;double 类型 - "zMin":505.396403159378 ```json { "zMax":636.712935786949, "zMin":505.396403159378 } ``` ### 自适应加减速 - 当前轨迹 Z 最小值;double 类型 - 说明 - 上位机设置自适应加减速阈值参数 **命令字:** `0x4050` - "Inertia_or_mass_or_both":[0,0,0,0,0,0] - 各轴限制条件列表;int 类型,范围[0,2] - 0表示"惯量",1表示"质量",2表示"并行" - "Load_or_center":[0,0,0,0,0,0] - 各轴参考点列表;int 类型,范围[0,1] - 0表示"负载",1表示"旋转中心" - "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]] - 各轴惯量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度的值 - "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴惯量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度的值 - "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], - 各轴质量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度的值 - "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴质量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度的值 - "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度对应惯量的值 - "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量加速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度对应惯量的值 - "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴质量速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度对应质量的值 - "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] ```json { "Inertia_or_mass_or_both":[0,0,0,0,0,0], "Load_or_center":[0,0,0,0,0,0], "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] } ``` - 各轴质量加速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度对应质量的值 - 上位机查询自适应加减速阈值参数 ```json {} ``` **命令字:** `0x4051` - 控制器回复上位机自适应加减速阈值参数 **命令字:** `0x4052` - "Inertia_or_mass_or_both":[0,0,0,0,0,0] - 各轴限制条件列表;int 类型,范围[0,2] - 0表示"惯量",1表示"质量",2表示"并行" - "Load_or_center":[0,0,0,0,0,0] - 各轴参考点列表;int 类型,范围[0,1] - 0表示"负载",1表示"旋转中心" - "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]] - 各轴惯量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度的值 - "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴惯量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度的值 - "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], - 各轴质量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度的值 - "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴质量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度的值 - "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度对应惯量的值 - "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量加速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度对应惯量的值 - "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴质量速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度对应质量的值 - "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] ```json { "Inertia_or_mass_or_both":[0,0,0,0,0,0], "Load_or_center":[0,0,0,0,0,0], "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] } ``` - 各轴质量加速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度对应质量的值 - 上位机设置自适应加减速参数 **命令字:** `0x4053` - "arm_inertia":[0.0,0.0,0.0] - 关节臂体惯量列表;double 类型,范围[0,99999.9]0.001kgm^2 - 分别表示为"关节1臂体惯量","关节2臂体惯量","关节3臂体惯量" - "auto_modify_acc_enable":false - 自适应加减速使能;bool 类型 - "joint1_mass":0.0 - 关节1质量;double 类型,范围[0,99999.9]kg - "joint1_mass_center_to_motor_distance":0.0 - 关节1质心到电机距离;double 类型,范围[0,99999.9]m - "joint2_mass":0.0 - 关节2质量;double 类型,范围[0,99999.9]kg - "joint2_mass_center_to_motor_distance":0.0 - 关节2质心到电机距离;double 类型,范围[0,99999.9]m - "joint4_mass":0.0 ```json { "arm_inertia":[0.0,0.0,0.0], "auto_modify_acc_enable":false, "joint1_mass":0.0, "joint1_mass_center_to_motor_distance":0.0, "joint2_mass":0.0, "joint2_mass_center_to_motor_distance":0.0, "joint4_mass":0.0 } ``` - 关节4质量;double 类型,范围[0,99999.9]kg - 上位机查询自适应加减速参数 ```json {} ``` **命令字:** `0x4054` - 控制器回复上位机自适应加减速参数 **命令字:** `0x4055` - "arm_inertia":[0.0,0.0,0.0] - 关节臂体惯量列表;double 类型,范围[0,99999.9]0.001kgm^2 - 分别表示为"关节1臂体惯量","关节2臂体惯量","关节3臂体惯量" - "auto_modify_acc_enable":false - 自适应加减速使能;bool 类型 - "joint1_mass":0.0 - 关节1质量;double 类型,范围[0,99999.9]kg - "joint1_mass_center_to_motor_distance":0.0 - 关节1质心到电机距离;double 类型,范围[0,99999.9]m - "joint2_mass":0.0 - 关节2质量;double 类型,范围[0,99999.9]kg - "joint2_mass_center_to_motor_distance":0.0 - 关节2质心到电机距离;double 类型,范围[0,99999.9]m - "joint4_mass":0.0 ```json { "arm_inertia":[0.0,0.0,0.0], "auto_modify_acc_enable":false, "joint1_mass":0.0, "joint1_mass_center_to_motor_distance":0.0, "joint2_mass":0.0, "joint2_mass_center_to_motor_distance":0.0, "joint4_mass":0.0 } ``` - 关节4质量;double 类型,范围[0,99999.9]kg - 上位机设置位置环比参数 **命令字:** `0x4056` - "Dynamic_sendServoParam":false - 位置环比发送使能;bool 类型 - "PositionalComparison": - 位置环比参数列表 - "inertiaMax":9999.0 - 惯量最大值;double 类型,范围(0,100000]0.001kgm^2 - "inertiaMin":8.0 - 惯量最小值;double 类型,范围[0,100000)0.001kgm^2 - 惯量最小值必须小于惯量最大值 - "max":8.0 - 位置环比例增益1最小值;double 类型,范围[0,100000) - 位置环比例增益1最小值必须小于位置环比例增益1最大值 - "min":9999.0 ```json { "Dynamic_sendServoParam":false, "PositionalComparison": { "inertiaMax":9999.0, "inertiaMin":8.0, "max":8.0, "min":9999.0 } } ``` - 位置环比例增益1最大值;double 类型,范围(0,100000] - "max"与"min"参数在实现时写反了,后续进行修改 - 上位机查询位置环比参数 ```json {} ``` **命令字:** `0x4057` - 控制器回复上位机位置环比参数 **命令字:** `0x4058` - "Dynamic_sendServoParam":false - 位置环比发送使能;bool 类型 - "PositionalComparison": - 位置环比参数列表 - "inertiaMax":9999.0 - 惯量最大值;double 类型,范围(0,100000]0.001kgm^2 - "inertiaMin":8.0 - 惯量最小值;double 类型,范围[0,100000)0.001kgm^2 - 惯量最小值必须小于惯量最大值 - "max":8.0 - 位置环比例增益1最小值;double 类型,范围[0,100000) - 位置环比例增益1最小值必须小于位置环比例增益1最大值 - "min":9999.0 ```json { "Dynamic_sendServoParam":false, "PositionalComparison": { "inertiaMax":9999.0, "inertiaMin":8.0, "max":8.0, "min":9999.0 } } ``` ### 拖动模式 - 位置环比例增益1最大值;double 类型,范围(0,100000] - "max"与"min"参数在实现时写反了,后续进行修改 - 说明 - 上位机设置拖拽模式参数 **命令字:** `0x4074` - "mode":2 - 拖动方式;int 类型,范围[0,3] - 0表示无,1表示3D 鼠标,2表示力矩,3表示位置 - "port":0 - 外部触发信号端口;int 类型 - 范围为当前绑定的 IO 端口数 - "value":0 ```json { "mode":2, "port":0, "value":0 } ``` - 外部触发信号参数;int 类型,范围[0,1] - 上位机查询拖拽模式参数 ```json {} ``` **命令字:** `0x4075` - 控制器回复上位机拖拽模式参数 **命令字:** `0x4076` - "mode":2 - 拖动方式;int 类型,范围[0,3] - 0表示无,1表示3D 鼠标,2表示力矩,3表示位置 - "port":0 - 外部触发信号端口;int 类型 - 范围为当前绑定的 IO 端口数 - "value":0 ```json { "mode":2, "port":0, "value":0 } ``` - 外部触发信号参数;int 类型,范围[0,1] - 上位机设置力矩参数 **命令字:** `0x4085` - "DecareLimit":2.50 - 笛卡尔空间线速度限制;double 类型,范围[0,∞)m/s - "JointVelLimit":1.0 - 关节空间速度限制;double 类型,范围[0,∞)°/s - "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0] - 超限阻力系数;double 类型,范围[1,100] - "drag_mode":0 - 拖动模式;int 类型,范围[0,2] - 0表示自由拖动,1表示位置拖动,2表示姿态拖动 - "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0] - 关节摩擦力补偿矫正系数;double 类型,范围[0,0.99] - "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0] - 关节目标扭矩矫正系数;double 类型,范围[0,1] - "waitCycle":5.0 ```json { "DecareLimit":2.50, "JointVelLimit":1.0, "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode":0, "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle":5.0 } ``` - 下发给伺服力矩参数等待周期;double 类型,范围[1,10] - 上位机查询力矩参数 ```json {} ``` **命令字:** `0x4086` - 控制器回复上位机力矩参数 **命令字:** `0x4087` - "DecareLimit":2.50 - 笛卡尔空间线速度限制;double 类型,范围[0,∞)m/s - "JointVelLimit":1.0 - 关节空间速度限制;double 类型,范围[0,∞)°/s - "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0] - 超限阻力系数;double 类型,范围[1,100] - "drag_mode":0 - 拖动模式;int 类型,范围[0,2] - 0表示自由拖动,1表示位置拖动,2表示姿态拖动 - "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0] - 关节摩擦力补偿矫正系数;double 类型,范围[0,0.99] - "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0] - 关节目标扭矩矫正系数;double 类型,范围[0,1] - "waitCycle":5.0 ```json { "DecareLimit":2.50, "JointVelLimit":1.0, "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode":0, "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle":5.0 } ``` ### 力学功能 - 下发给伺服力矩参数等待周期;double 类型,范围[1,10] - 说明 - 设置碰撞检测开关需要先进行动力学辨识 - 上位机设置碰撞检测开关 **命令字:** `0x407D` - "switch":true ```json { "switch":true } ``` - 碰撞检测开关;bool 类型 - 上位机查询碰撞检测开关 ```json {} ``` **命令字:** `0x407E` - 控制器回复上位机碰撞检测开关 **命令字:** `0x407F` - "is_identification":false - 机器人是否已动力学辨识;bool 类型 - true 表示已动力学辨识,1表示未进行动力学辨识 - "restrart_switch":false - 机器人碰撞后重启开关;bool 类型 - "switch":true ```json { "is_identification":false, "restrart_switch":false, "switch":false } ``` - 碰撞检测开关;bool 类型 - 上位机设置碰撞检测参数 **命令字:** `0x4080` - "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值(点动);double 类型,范围[1,10000]‰ - "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值(点动);double 类型,范围[1,10000]‰ - "error_enable_time":1.0 - 误差允许时间;double 类型,范围[0,99]ms - "pos_delay_time":1.0 ```json { "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0], "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0], "error_enable_time":1.0, "pos_delay_time":1.0 } ``` - 指令位置响应时间;double 类型,范围(0,99]ms - 上位机查询碰撞检测参数 ```json {} ``` **命令字:** `0x4081` - 控制器回复上位机碰撞检测参数 **命令字:** `0x4082` - "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值列表(点动);double 类型,范围[1,10000]‰ - "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值列表(点动);double 类型,范围[1,10000]‰ - "error_enable_time":1.0 - 误差允许时间;double 类型,范围[0,99]ms - "pos_delay_time":1.0 ```json { "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0], "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0], "error_enable_time":1.0, "pos_delay_time":1.0 } ``` - 指令位置响应时间;double 类型,范围(0,99]ms - 上位机设置机器人力矩前馈 **命令字:** `0x4010` - "torqFeedback":false ```json { "torqFeedback":false } ``` - 力矩前馈开关;bool 类型 - 上位机查询机器人力矩前馈 ```json {} ``` **命令字:** `0x4011` - 控制器回复上位机机器人力矩前馈 **命令字:** `0x4012` ```json { "torqFeedback":false } ``` ### 轨迹管理 - "torqFeedback":false - 力矩前馈开关;bool 类型 - 说明 - 轨迹保存结果通过0x4070返回 - 上位机查询拖拽轨迹是否被记录 ```json {} ``` **命令字:** `0x408B` - 控制器回复上位机拖拽轨迹记录结果 **命令字:** `0x4070` - "record":false ```json { "record":false } ``` - 轨迹是否被记录;bool 类型 - 上位机请求轨迹回放 **命令字:** `0x4071` - "trajName":"AAA" - 需要回放的轨迹名称;string 类型 - "vel":100 ```json { "trajName":"AAA", "vel":100 } ``` - 轨迹回放运行速度;int 类型,范围[1,100] - 上位机请求保存拖拽轨迹 **命令字:** `0x4072` - "TrajName":"AAA" ```json { "TrajName":"AAA" } ``` - 需要保存的轨迹名称;string 类型 - 若为空则保存失败 - 上位机请求删除拖拽轨迹 **命令字:** `0x4073` - "TrajName":"AAA" ```json { "TrajName":"AAA" } ``` - 需要删除的轨迹名称;string 类型 - 上位机查询拖拽轨迹列表 ```json {} ``` **命令字:** `0x4083` - 控制器回复上位机拖拽轨迹列表 **命令字:** `0x4084` - "TrajName":["AAA"] ```json { "TrajName":["AAA"] } ``` - 已保存轨迹列表;string 类型 - 长度为当前已保存轨迹数量,若无轨迹,则该节点不存在 - 上位机设置轨迹记录参数 **命令字:** `0x4088` - "MaxSamplingNum":300.0 - 最大采样点数;double 类型,范围(200,1200) - "SamplingInterval":0.030 - 采样间隔;double 类型,范围[0.03,1] - "Start":true ```json { "MaxSamplingNum":300.0, "SamplingInterval":0.030, "Start":true } ``` - 开始/停止记录;bool 类型 - true 表示开始记录,false 表示停止记录 - false 时"MaxSamplingNum"和"SamplingInterval"可以不存在 - 上位机查询轨迹记录参数 ```json {} ``` **命令字:** `0x4089` - 控制器回复上位机轨迹记录参数 - 0x408A - "MaxSamplingNum":300.0 - 最大采样点数;double 类型,范围(200,1200) - "SamplingInterval":0.030 - 采样间隔;double 类型,范围[0.03,1] - "Start":false ```json { "MaxSamplingNum":300.0, "SamplingInterval":0.030, "Start":false } ``` - 开始/停止记录;bool 类型 - true 表示开始记录,false 表示停止记录 - 上位机查询拖拽轨迹文件列表 ```json {} ``` **命令字:** `0x408C` - 控制器回复上位机拖拽轨迹文件列表 **命令字:** `0x408D` - "absolutepath":"dragPos/" - 控制器中拖拽轨迹文件存放地址;string 类型 - "trajectory_filelist":["AAA","JJ","drag_traj_details.json"] ```json { "absolutepath":"dragPos/", "trajectory_filelist":["AAA","JJ","drag_traj_details.json"] } ``` - 拖拽轨迹文件列表;string 类型 - "drag_traj_details.json"为轨迹记录信息文件 ### 额外负载参数 - 说明 - N 为机器人轴数,每行 10 个参数 - 上位机设置额外负载参数 **命令字:** `0x40AA` LINK_LOAD_DYNAMICS_PARAMS_SET - "loadDynamicsParams":[[0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0]] - 负载动力学参数;double 类型;N×10 数组,N 为机器人轴数 ```json { "loadDynamicsParams": [[0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0]] } ``` - 上位机获取额外负载参数 **命令字:** `0x40AB` LINK_LOAD_DYNAMICS_PARAMS_INQUIRE ```json {} ``` - 控制器返回额外负载参数 **命令字:** `0x40AC` LINK_LOAD_DYNAMICS_PARAMS_RESPOND - "loadDynamicsParams":[[0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0]] - 负载动力学参数;double 类型;N×10 数组,N 为机器人轴数 ```json { "loadDynamicsParams": [[0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0]] } ``` ### 本体动力学参数 - 上位机设置本体动力学参数 **命令字:** `0x40AD` LINK_BODY_DYNAMICS_PARAMS_SET - "isIdent":true - 动力学参数来源;bool 类型,true 辨识来源,false 全参来源 - "bodyDynamicsParams":[[0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0]] - 本体动力学参数;double 类型;N×11 数组,N 为机器人轴数,仅当 isIdent=false 时需要设置 ```json { "isIdent": true, "bodyDynamicsParams": [[0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0]] } ``` - 上位机获取本体动力学参数 **命令字:** `0x40AE` LINK_BODY_DYNAMICS_PARAMS_INQUIRE ```json {} ``` - 控制器返回本体动力学参数 **命令字:** `0x40AF` LINK_BODY_DYNAMICS_PARAMS_RESPOND - "isIdent":true - 动力学参数来源;bool 类型,true 辨识来源,false 全参来源 - "bodyDynamicsParams":[[0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0]] - 本体动力学参数;double 类型;N×11 数组,N 为机器人轴数 ```json { "isIdent": true, "bodyDynamicsParams": [[0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0]] } ``` ### 力矩前馈 - 上位机设置力矩前馈 **命令字:** `0x40B0` TORQUE_FEEDFORWARD_SET - "feedforwardEnable":true - 力矩前馈开关;bool 类型,true 开启,false 关闭 ```json { "feedforwardEnable": true } ``` - 上位机获取力矩前馈状态 **命令字:** `0x40B1` TORQUE_FEEDFORWARD_INQUIRE ```json {} ``` - 控制器返回力矩前馈状态 **命令字:** `0x40B2` TORQUE_FEEDFORWARD_RESPOND - "feedforwardEnable":true - 力矩前馈开关;bool 类型,true 开启,false 关闭 - "dynamicsParams":true - 动力学参数是否存在;bool 类型,true 存在,false 不存在 - "fricParams":true - 摩擦力参数是否存在;bool 类型,true 存在,false 不存在 - "torqOffset":true - 前馈 PDO 60B2 是否存在;bool 类型,true 存在,false 不存在 ```json { "feedforwardEnable": true, "dynamicsParams": true, "fricParams": true, "torqOffset": true } ``` ### 关节传感器标定 - 关节传感器标零开始 **命令字:** `0x40B3` JOINT_SENSOR_ZERO_MARK_SET ```json {} ``` - 关节传感器清零开始 **命令字:** `0x40B4` JOINT_SENSOR_CLEAR_ZERO_SET - "axisNum":0 - 清零轴号;int 类型,范围 [0,7],0 表示所有轴,1~7 对应轴清零 ```json { "axisNum": 0 } ``` - 关节传感器标定状态返回 **命令字:** `0x40B5` JOINT_SENSOR_MARK_RESPOND - "finish":true - 标定状态;bool 类型,true 标定完成,false 中断退出 ```json { "finish": true } ``` ### 3D 鼠标 - 3D 鼠标连接设置 **命令字:** `0x463D` THREED_MOUSE_CONNECT_STATE_SET - "mouseConnectStatus":true - 鼠标连接状态;bool 类型,true 连接,false 断开 ```json { "mouseConnectStatus": true } ``` ### 关节传感器数据 - 上位机获取关节传感器数据 **命令字:** `0x4639` JOINT_SENSOR_DATA_INQUIRE ```json {} ``` - 控制器返回关节传感器数据 **命令字:** `0x463A` JOINT_SENSOR_DATA_RESPOND - "sensorConnect":true - 传感器连接状态;bool 类型,true 连接,false 断开 - "originSensorData":[0,0,0,0,0,0] - 传感器原始数据;double 类型,数组大小由轴数决定 - "peeloffSensorData":[0,0,0,0,0,0] - 传感器去皮数据;double 类型,数组大小由轴数决定 - "errorSensorData":[0,0,0,0,0,0] - 传感器误差数据;double 类型,数组大小由轴数决定 ```json { "sensorConnect": true, "originSensorData": [0,0,0,0,0,0], "peeloffSensorData": [0,0,0,0,0,0], "errorSensorData": [0,0,0,0,0,0] } ``` --- # 遥操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/12.%E9%81%A5%E6%93%8D%E4%BD%9C.html ## 3D 鼠标 ### 上位机设置3D 鼠标参数 **命令字:** `0x4600` | 参数名 | 类型 | 范围 | 说明 | |-----------|------------|-----------|----------------------------------------------------------------------| | ABC | int | [4,6] | 姿态控制:4表示已选中 A,5表示已选中 B,6表示已选中 C | | mouseSen | double[4] | [0,300] | 3D 鼠标灵敏度列表,分别为 X 方向灵敏度、Y 方向灵敏度、Z 方向灵敏度、姿态灵敏度 | **请求示例:** ```json { "ABC": 4, "mouseSen": [128.0, 128.0, 128.0, 128.0] } ``` ### 上位机查询3D 鼠标参数 **命令字:** `0x4601` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标参数 **命令字:** `0x4602` | 参数名 | 类型 | 范围 | 说明 | |----------|-----------|----------|---------------------------------------------------| | ABC | int | [4,6] | 姿态控制:4表示已选中 A,5表示已选中 B,6表示已选中 C | | enable | bool | - | 3D 鼠标使能 | | mouseSen | double[4] | [0,300] | 3D 鼠标灵敏度列表,分别为 X/Y/Z 方向灵敏度和姿态灵敏度 | **响应示例:** ```json { "ABC": 4, "enable": false, "mouseSen": [128.0, 128.0, 128.0, 128.0] } ``` ### 上位机请求标记3D 鼠标零点 **命令字:** `0x4603` **请求示例:** ```json {} ``` ### 上位机查询3D 鼠标零点标记状态 **命令字:** `0x4604` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标零点标记状态 **命令字:** `0x4605` | 参数名 | 类型 | 范围 | 说明 | |-------------|------|----------|----------------------------------------| | zeroTagged | int | [0,1] | 3D 鼠标零点标记状态:0表示未标记,1表示已标记 | **响应示例:** ```json { "zeroTagged": 0 } ``` ### 上位机请求标记3D 鼠标正方向 **命令字:** `0x4606` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------------------------------| | axis | int | [1,3] | 标记的方向:1表示 X 方向,2表示 Y 方向,3表示 Z 方向 | **请求示例:** ```json { "axis": 1 } ``` ### 上位机查询3D 鼠标标记正方向状态 **命令字:** `0x4607` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标标记正方向状态 **命令字:** `0x4608` | 参数名 | 类型 | 范围 | 说明 | |----------|------|----------|--------------------------------------------------| | xTagged | int | [0,2] | X 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | | yTagged | int | [0,2] | Y 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | | zTagged | int | [0,2] | Z 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | **响应示例:** ```json { "xTagged": 2, "yTagged": 0, "zTagged": 0 } ``` ### 上位机设置3D 鼠标参数页面返回 **命令字:** `0x4609` | 参数名 | 类型 | 说明 | |-----------|------|-----------------------------| | pageBack | int | 上位机页面离开3D 鼠标参数页面 | **请求示例:** ```json { "pageBack": 1 } ``` ### 上位机设置3D 鼠标端口号 **命令字:** `0x460A` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------| | port | int | [1,10] | 3D 鼠标端口号 | **请求示例:** ```json { "port": 1 } ``` ### 上位机查询3D 鼠标端口号 **命令字:** `0x460B` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标端口号 **命令字:** `0x460C` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------| | port | int | [1,10] | 3D 鼠标端口号 | **响应示例:** ```json { "port": 1 } ``` --- ## 六维力传感器 ### 说明 六维力传感器安装在机器人末端,通过传感器末端感应区获取受力的变化。 六维力传感器的基础参数在0x4000里设置,包括有传感器质量和质心,标零计算前需要提前写入,否则会导致标零计算结果错误。 使用六维力传感器进行力矩拖拽和位置拖拽需要在安装好传感器后进行空载标零,若需要安装额外拖把,则需要在标零后进行负载计算。 使用六维力传感器进行力矩拖拽,在各轴扭矩转换数据超出关节摩擦力补偿阈值时进行摩擦力补偿。 ### 上位机请求计算六维力传感器负载参数 **命令字:** `0x4620` **请求示例:** ```json {} ``` ### 上位机查询六维力传感器负载参数的计算结果 **命令字:** `0x4621` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器计算的负载参数 **命令字:** `0x4622` | 参数名 | 类型 | 单位 | 说明 | |---------------------|--------|------|------------------------------------------------------------| | isFinished | bool | - | 负载计算轨迹是否运行结束(仅回复0x4620时存在) | | runSuccess | bool | - | 负载参数是否计算成功(仅回复0x4620时存在) | | payloadMass | double | kg | 计算得到的负载块质量(仅回复0x4621时存在) | | payloadMassCenterX | double | m | 计算得到的负载块质心 X(仅回复0x4621时存在) | | payloadMassCenterY | double | m | 计算得到的负载块质心 Y(仅回复0x4621时存在) | | payloadMassCenterZ | double | m | 计算得到的负载块质心 Z(仅回复0x4621时存在) | **响应示例:** ```json { "isFinished": true, "runSuccess": true, "payloadMass": 0.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.0 } ``` ### 上位机查询六维力传感器数据 **命令字:** `0x4623` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器数据 **命令字:** `0x4624` | 参数名 | 类型 | 单位 | 说明 | |--------------------|---------|------|------------------------------------------------------------------------| | fxData | double | N | 传感器 X 方向受力原始数据 | | fyData | double | N | 传感器 Y 方向受力原始数据 | | fzData | double | N | 传感器 Z 方向受力原始数据 | | mxData | double | Nm | 传感器 X 方向力矩原始数据 | | myData | double | Nm | 传感器 Y 方向力矩原始数据 | | mzData | double | Nm | 传感器 Z 方向力矩原始数据 | | peelOffValue | object | - | 传感器去皮数据,传感器标零后该节点存在 | | fxDataSubBase | double | N | 传感器 X 方向受力去皮数据 | | fyDataSubBase | double | N | 传感器 Y 方向受力去皮数据 | | fzDataSubBase | double | N | 传感器 Z 方向受力去皮数据 | | mxDataSubBase | double | Nm | 传感器 X 方向力矩去皮数据 | | myDataSubBase | double | Nm | 传感器 Y 方向力矩去皮数据 | | mzDataSubBase | double | Nm | 传感器 Z 方向力矩去皮数据 | | sensorConnect | bool | - | 传感器连接状态:true 表示已连接,false 表示未连接 | | torqueConvertData | object | - | 六维力传感器额外力导致的各轴扭矩值,机器人进入力矩拖拽时该节点存在 | | axis1Data | double | ‰ | 1轴扭矩转换数据 | | axis2Data | double | ‰ | 2轴扭矩转换数据 | | axis3Data | double | ‰ | 3轴扭矩转换数据 | | axis4Data | double | ‰ | 4轴扭矩转换数据 | | axis5Data | double | ‰ | 5轴扭矩转换数据 | | axis6Data | double | ‰ | 6轴扭矩转换数据 | **响应示例:** ```json { "fxData": -7.48328, "fyData": 4.0964, "fzData": 34.09224, "mxData": 0.4361, "myData": -0.01078, "mzData": 0.1176, "peelOffValue": { "fxDataSubBase": 0.324231194364, "fyDataSubBase": -0.550949927519, "fzDataSubBase": 5.315393681562, "mxDataSubBase": 0.254721004374, "myDataSubBase": -0.23501051027, "mzDataSubBase": 0.003892025499 }, "sensorConnect": true, "torqueConvertData": { "axis1Data": 4.350304342178, "axis2Data": -31.252106163066, "axis3Data": -67.928968119182, "axis4Data": 8.274872052417, "axis5Data": 15.919933464577, "axis6Data": 0.318515582768 } } ``` ### 上位机请求六维力传感器标零 **命令字:** `0x4625` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器标零结果 **命令字:** `0x4626` | 参数名 | 类型 | 说明 | |------------|------|--------------------| | isFinished | bool | 标零轨迹是否运行结束 | | isSaved | bool | 标零数据是否保存成功 | **响应示例:** ```json { "isFinished": true, "isSaved": true } ``` ### 上位机请求将六维力传感器负载计算结果存入到工具手 **命令字:** `0x4627` | 参数名 | 类型 | 范围 | 说明 | |------------|------|-----------|--------------------| | targetTool | int | [1,999] | 要存入到的工具手号 | **请求示例:** ```json { "targetTool": 5 } ``` ### 控制器回复上位机六维力传感器负载计算结果存入到工具手结果 **命令字:** `0x4628` | 参数名 | 类型 | 说明 | |--------|------|------------------| | result | bool | 数据存入是否成功 | **响应示例:** ```json { "result": true } ``` ### 上位机设置关节摩擦力补偿阈值 **命令字:** `0x4629` | 参数名 | 类型 | 范围 | 说明 | |------------------------|------|------------|--------------------| | sensorJointThreshold1 | int | [1,999999] | 1轴关节摩擦力补偿阈值 | | sensorJointThreshold2 | int | [1,999999] | 2轴关节摩擦力补偿阈值 | | sensorJointThreshold3 | int | [1,999999] | 3轴关节摩擦力补偿阈值 | | sensorJointThreshold4 | int | [1,999999] | 4轴关节摩擦力补偿阈值 | | sensorJointThreshold5 | int | [1,999999] | 5轴关节摩擦力补偿阈值 | | sensorJointThreshold6 | int | [1,999999] | 6轴关节摩擦力补偿阈值 | **请求示例:** ```json { "sensorJointThreshold1": 50, "sensorJointThreshold2": 50, "sensorJointThreshold3": 50, "sensorJointThreshold4": 50, "sensorJointThreshold5": 50, "sensorJointThreshold6": 50 } ``` ### 上位机查询关节摩擦力补偿系数 **命令字:** `0x462A` **请求示例:** ```json {} ``` ### 控制器回复上位机关节摩擦力补偿系数 **命令字:** `0x462B` | 参数名 | 类型 | 范围 | 说明 | |------------------------|------|------------|--------------------| | sensorJointThreshold1 | int | [1,999999] | 1轴关节摩擦力补偿阈值 | | sensorJointThreshold2 | int | [1,999999] | 2轴关节摩擦力补偿阈值 | | sensorJointThreshold3 | int | [1,999999] | 3轴关节摩擦力补偿阈值 | | sensorJointThreshold4 | int | [1,999999] | 4轴关节摩擦力补偿阈值 | | sensorJointThreshold5 | int | [1,999999] | 5轴关节摩擦力补偿阈值 | | sensorJointThreshold6 | int | [1,999999] | 6轴关节摩擦力补偿阈值 | **响应示例:** ```json { "sensorJointThreshold1": 50, "sensorJointThreshold2": 50, "sensorJointThreshold3": 50, "sensorJointThreshold4": 50, "sensorJointThreshold5": 50, "sensorJointThreshold6": 50 } ``` ### 上位机设置传感器基础参数 **命令字:** `0x4630` | 参数名 | 类型 | 说明 | |--------------------|--------|------------| | sensorMass | double | 传感器质量 | | sensorMassCenterX | double | 传感器质心 X | | sensorMassCenterY | double | 传感器质心 Y | | sensorMassCenterZ | double | 传感器质心 Z | **请求示例:** ```json { "sensorMass": 0, "sensorMassCenterX": 0, "sensorMassCenterY": 0, "sensorMassCenterZ": 0 } ``` ### 上位机获取传感器基础参数 **命令字:** `0x4631` **请求示例:** ```json {} ``` ### 控制器回复传感器基础参数 **命令字:** `0x4632` | 参数名 | 类型 | 说明 | |--------------------|--------|------------| | sensorMass | double | 传感器质量 | | sensorMassCenterX | double | 传感器质心 X | | sensorMassCenterY | double | 传感器质心 Y | | sensorMassCenterZ | double | 传感器质心 Z | **响应示例:** ```json { "sensorMass": 0, "sensorMassCenterX": 0, "sensorMassCenterY": 0, "sensorMassCenterZ": 0 } ``` ### 传感器去皮数据清零 **命令字:** `0x4633` **请求示例:** ```json {} ``` ### 传感器数据标定 **命令字:** `0x4634` **请求示例:** ```json {} ``` ### 控制器回复传感器数据标定结果 **命令字:** `0x4635` | 参数名 | 类型 | 说明 | |------------|------|--------------| | runSuccess | bool | 轨迹运行结果 | | isFinished | bool | 标定结束 | **响应示例:** ```json { "runSuccess": true, "isFinished": true } ``` ### 上位机设置六维力传感器通讯参数 **命令字:** `0x462C` | 参数名 | 类型 | 范围/取值 | 说明 | |-------------------------------|--------|------------------------------------|----------------------------------------------------------------------| | EtherCAT.mapNum | int | - | 已选择通讯设备号:0表示未选择 | | modbus.RTU.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | modbus.RTU.checkBit | string | 'N','E','O' | 校验位 | | modbus.RTU.dataBit | int | [5,8] | 数据位 | | modbus.RTU.stopBit | int | [1,2] | 停止位 | | modbus.RTU.addressNum | int | [0,125] | 从站地址个数 | | modbus.RTU.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.RTU.baudRate | int | - | 波特率 | | modbus.RTU.firstAddress | int | (0,65535] | 寄存器首地址 | | modbus.RTU.port | int | (0,65535] | 端口号 | | modbus.RTU.slaveID | int | (0,65535] | 从站 ID | | modbus.TCP.IP | string | - | IP 地址 | | modbus.TCP.port | int | (0,65535] | 端口号 | | modbus.TCP.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.TCP.firstAddress | int | [0,65535] | 寄存器首地址 | | modbus.TCP.addressNum | int | [0,125] | 从站地址个数 | | modbus.TCP.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | YDirection | int | 1/-1 | 传感器 Y 方向:1表示 Y 正方向朝左,-1表示 Y 正方向朝右 | | originDataInitialPara | int | [0,999] | 原始数据起始变量:0表示无,其他数值表示存放到全局变量位置,依次存放六个传感器原始数据 | | sensorCommunicationType | int | [0,1] | 传感器通讯类型:0表示 EtherCAT,1表示 Modbus RTU | | sensorConnectStatus | bool | - | 传感器通讯使能(该节点可单独进行设置) | | sensorDragEnable | bool | - | 传感器拖拽使能:false 表示传感器数据不参与力矩拖拽计算 | | startupAutoConnectSensor | bool | - | 开机连接传感器 | **请求示例:** ```json { "etherCat": { "mapNum": 0 }, "modbus": { "RTU": { "endian": 1, "checkBit": "N", "dataBit": 5, "stopBit": 1, "addressNum": 1, "addressType": 0, "baudRate": 115200, "firstAddress": 1, "port": 1, "slaveID": 1 }, "TCP": { "IP": "192.168.1.14", "port": 503, "addressType": 0, "firstAddress": 1, "addressNum": 1, "endian": 1 } }, "YDirection": 1, "originDataInitialPara": 0, "sensorCommunicationType": 0, "sensorConnectStatus": false, "sensorDragEnable": true, "startupAutoConnectSensor": true } ``` ### 上位机查询六维力传感器通讯参数 **命令字:** `0x462D` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器通讯参数 **命令字:** `0x462E` | 参数名 | 类型 | 范围/取值 | 说明 | |-------------------------------|--------|------------------------------------|----------------------------------------------------------------------| | EtherCAT.mapNum | int | - | 已选择通讯设备号:0表示未选择 | | modbus.RTU.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | modbus.RTU.checkBit | string | 'N','E','O' | 校验位 | | modbus.RTU.dataBit | int | [5,8] | 数据位 | | modbus.RTU.stopBit | int | [1,2] | 停止位 | | modbus.RTU.addressNum | int | [0,125] | 从站地址个数 | | modbus.RTU.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.RTU.baudRate | int | - | 波特率 | | modbus.RTU.firstAddress | int | (0,65535] | 寄存器首地址 | | modbus.RTU.port | int | (0,65535] | 端口号 | | modbus.RTU.slaveID | int | (0,65535] | 从站 ID | | modbus.TCP.IP | string | - | IP 地址 | | modbus.TCP.port | int | (0,65535] | 端口号 | | modbus.TCP.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.TCP.firstAddress | int | [0,65535] | 寄存器首地址 | | modbus.TCP.addressNum | int | [0,125] | 从站地址个数 | | modbus.TCP.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | YDirection | int | 1/-1 | 传感器 Y 方向:1表示 Y 正方向朝左,-1表示 Y 正方向朝右 | | originDataInitialPara | int | [0,999] | 原始数据起始变量:0表示无,其他数值表示存放到全局变量位置,依次存放六个传感器原始数据 | | sensorCommunicationType | int | [0,1] | 传感器通讯类型:0表示 EtherCAT,1表示 Modbus RTU | | sensorConnectStatus | bool | - | 传感器通讯使能(该节点可单独进行设置) | | sensorDragEnable | bool | - | 传感器拖拽使能:false 表示传感器数据不参与力矩拖拽计算 | | startupAutoConnectSensor | bool | - | 开机连接传感器 | **响应示例:** ```json { "etherCat": { "mapNum": 0 }, "modbus": { "RTU": { "endian": 1, "checkBit": "N", "dataBit": 5, "stopBit": 1, "addressNum": 1, "addressType": 0, "baudRate": 115200, "firstAddress": 1, "port": 1, "slaveID": 1 }, "TCP": { "IP": "192.168.1.14", "port": 503, "addressType": 0, "firstAddress": 1, "addressNum": 1, "endian": 1 } }, "YDirection": 1, "originDataInitialPara": 0, "sensorCommunicationType": 0, "sensorConnectStatus": false, "sensorDragEnable": true, "startupAutoConnectSensor": true } ``` ### 上位机设置六维力传感器导纳拖拽参数 **命令字:** `0x408E` | 参数名 | 类型 | 范围 | 说明 | |---------------------|------------|---------------------------|--------------------------------| | dragDamper | double[6] | 前三位[0,100],后三位[0,50] | 阻尼系数列表,直角坐标系下 XYZABC | | dragInPosMaxAngleVel| double | (0,90] | 拖拽最大角速度,单位:°/s | | dragInPosMaxVel | double | (0,2] | 拖拽最大线速度,单位:m/s | | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | | dragMass | double[6] | 前三位[5,100],后三位[0.3,30] | 质量系数列表 | | dragChangeRate | double[6] | - | 变化率阈值 | | dragTh.xyz | double | - | 位置启动阈值 | | dragTh.abc | double | - | 姿态启动阈值 | **请求示例:** ```json { "dragDamper": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "dragInPosMaxAngleVel": 5.0, "dragInPosMaxVel": 2.0, "dragInPosMode": 0, "dragMass": [5.0, 5.0, 5.0, 0.30, 0.30, 0.30], "dragChangeRate": [10, 10, 10, 5, 5, 5], "dragTh": { "xyz": 5, "abc": 1 } } ``` ### 上位机查询六维力传感器导纳拖拽参数 **命令字:** `0x408F` | 参数名 | 类型 | 范围 | 说明 | |---------------|------|----------|--------------------------------------------------| | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | **请求示例:** ```json { "dragInPosMode": 0 } ``` ### 控制器回复上位机六维力传感器导纳拖拽参数 **命令字:** `0x4090` | 参数名 | 类型 | 范围 | 说明 | |---------------------|------------|---------------------------|--------------------------------| | dragDamper | double[6] | 前三位[0,100],后三位[0,50] | 阻尼系数列表,直角坐标系下 XYZABC | | dragInPosMaxAngleVel| double | (0,90] | 拖拽最大角速度,单位:°/s | | dragInPosMaxVel | double | (0,2] | 拖拽最大线速度,单位:m/s | | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | | dragMass | double[6] | 前三位[5,100],后三位[0.3,30] | 质量系数列表 | | dragChangeRate | double[6] | - | 变化率阈值 | | dragTh.xyz | double | - | 位置启动阈值 | | dragTh.abc | double | - | 姿态启动阈值 | **响应示例:** ```json { "dragDamper": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "dragInPosMaxAngleVel": 5.0, "dragInPosMaxVel": 2.0, "dragInPosMode": 0, "dragMass": [5.0, 5.0, 5.0, 0.30, 0.30, 0.30], "dragChangeRate": [10, 10, 10, 5, 5, 5], "dragTh": { "xyz": 5, "abc": 1 } } ``` --- ## 关节扭矩传感器拖拽 ### 设置关节传感器参数 **命令字:** `0x4636` | 参数名 | 类型 | 说明 | |--------------------|------|--------------| | jointSensorSwitch | bool | 开启传感器 | **请求示例:** ```json { "jointSensorSwitch": true } ``` ### 获取传感器参数 **命令字:** `0x4637` **请求示例:** ```json {} ``` ### 返回传感器参数 **命令字:** `0x4638` | 参数名 | 类型 | 说明 | |--------------------|------|------------------------------| | jointSensorSwitch | bool | 传感器已开启:true 表示开启,false 表示未开启 | **响应示例:** ```json { "jointSensorSwitch": true } ``` ### 获取传感器数据 **命令字:** `0x4639` **请求示例:** ```json {} ``` ### 返回传感器数据 **命令字:** `0x463A` | 参数名 | 类型 | 说明 | |--------------------|--------|------------------| | jointSensorConnect | bool | 传感器连接状态:true 表示连接,false 表示未连接 | | axis1Data | double | 一轴传感器数据 | | axis2Data | double | 二轴传感器数据 | | axis3Data | double | 三轴传感器数据 | | axis4Data | double | 四轴传感器数据 | | axis5Data | double | 五轴传感器数据 | | axis6Data | double | 六轴传感器数据 | **响应示例:** ```json { "jointSensorConnect": true, "axis1Data": 1, "axis2Data": 1, "axis3Data": 1, "axis4Data": 1, "axis5Data": 1, "axis6Data": 1 } ``` --- # 独立轴 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/13.%E7%8B%AC%E7%AB%8B%E8%BD%B4.html ## 独立轴参数 ### 设置独立轴界面参数 **命令字:** `0x2800` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | | angularDistanceConversionRatioValue | double | 转换比 | | isTrack | bool | 是否是地轨 | | encoderBitLineditValue | double | 编码器位数 | | inverseLimitValue | double | 反限位 | | maximumPositiveSpeedValue | double | 最大正转速;单位:倍率 | | maximumReverseSpeedValue | double | 最大反转速;单位:倍率 | | motorDir | int | 电机方向;1:正,-1:负 | | positiveLimitValue | double | 正限位 | | ratedPositiveSpeedValue | double | 额定正转速;单位:rpm | | ratedReverseSpeedValue | double | 额定反转速;单位:rpm | | reductionRatioValue | double | 减速比 | | maxAccValue | double | 最大加速度;单位:速度的倍率 | | maxDecValue | double | 最大减速度;单位:速度的倍率 | | selectBindServo | uint | 选择需要绑定的伺服编号 | **请求示例:** ```json { "independentAxisParameter": { "axisNum": 0, "angularDistanceConversionRatioValue": 0.0, "isTrack": false, "encoderBitLineditValue": 0.0, "inverseLimitValue": 0.0, "maximumPositiveSpeedValue": 0.0, "maximumReverseSpeedValue": 0.0, "motorDir": 0, "positiveLimitValue": 0.0, "ratedPositiveSpeedValue": 0.0, "ratedReverseSpeedValue": 0.0, "reductionRatioValue": 0.0, "maxAccValue": 0.0, "maxDecValue": 0.0, "selectBindServo": 0 } } ``` ### 上位机查询独立轴界面参数 **命令字:** `0x2801` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴界面参数 **命令字:** `0x2802` 返回参数同 `0x2800` 设置命令。 ### 上位机查询独立轴总数 **命令字:** `0x2803` **参数说明:** 无请求参数。 ### 控制器返回独立轴总数 **命令字:** `0x2804` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisSum | int | 独立轴总数 | **响应示例:** ```json { "axisSum": 2 } ``` ### 上位机删除某一个独立轴参数 **命令字:** `0x2805` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ## 独立轴位置 ### 上位机查询独立轴位置 **命令字:** `0x2806` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 控制器返回独立轴位置 **命令字:** `0x2807` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | currentPos | double | 当前位置 | **响应示例:** ```json { "currentPos": 210.01 } ``` ### 独立轴0点标定 **命令字:** `0x2808` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ## 轴独立控制弹窗 ### 独立控制轴 PV 运动 **命令字:** `0x30E0` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | | vel | int | 轴速度;单位:rpm | [-6000,6000] | | dir | int | 运动方向;1:正,-1:反向 | - | | acc | double | 加速度 | - | | dec | double | 减速度 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1, "vel": 50, "dir": 1, "acc": 50.0, "dec": 50.0 } ``` ### 独立控制轴 PV 停止 **命令字:** `0x30E1` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1 } ``` ### 取消轴独立控制运动 **命令字:** `0x30E4` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1 } ``` ### 独立轴回零 **命令字:** `0x30E5` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 独立轴回零停止 **命令字:** `0x30E6` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 独立轴点动 **命令字:** `0x30E7` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | vel | int | 速度;单位:rpm | - | | acc | double | 加速度 | - | | dec | double | 减速度 | - | | dir | int | 运动方向;1:正,-1:反向 | - | **请求示例:** ```json { "axisNum": 2, "vel": 5, "acc": 50.0, "dec": 50.0, "dir": 1 } ``` ## 独立轴状态 ### 上位机查询独立轴状态 **命令字:** `0x30E8` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴状态 **命令字:** `0x30E9` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | | currentPos | double | 当前位置 | | currentVel | double | 当前速度;单位:rpm | | currentTorque | double | 当前力矩 | | status | int | 运行状态;0-停止,1-运动中,2-回零中,3-报警 | | servoOn | bool | 伺服使能状态;true-使能,false-未使能 | | alarmCode | int | 报警代码;0 表示无报警 | **响应示例:** ```json { "axisNum": 1, "currentPos": 120.5, "currentVel": 100.0, "currentTorque": 0.5, "status": 1, "servoOn": true, "alarmCode": 0 } ``` ## 独立轴控制 ### 独立轴伺服使能 **命令字:** `0x30EA` > **说明:** 控制独立轴伺服电机的使能/去使能状态。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | enable | bool | 伺服使能;true-使能,false-去使能 | - | **请求示例:** ```json { "axisNum": 1, "enable": true } ``` ### 独立轴复位 **命令字:** `0x30EB` > **说明:** 复位独立轴的报警状态。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 独立轴停止 **命令字:** `0x30EC` > **说明:** 停止独立轴的所有运动(包括点动、回零、定位运动)。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ## 独立轴定位运动 ### 独立轴绝对位置运动 **命令字:** `0x30ED` > **说明:** 控制独立轴运动到指定的绝对位置。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | targetPos | double | 目标位置 | 受正反限位限制 | | vel | double | 运动速度;单位:rpm | [0, 6000] | | acc | double | 加速度 | > 0 | | dec | double | 减速度 | > 0 | **请求示例:** ```json { "axisNum": 1, "targetPos": 200.0, "vel": 100.0, "acc": 50.0, "dec": 50.0 } ``` ### 独立轴相对位置运动 **命令字:** `0x30EE` > **说明:** 控制独立轴以当前位置为基准,运动指定的相对距离。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | relativePos | double | 相对位移量;正值正向运动,负值反向运动 | 受正反限位限制 | | vel | double | 运动速度;单位:rpm | [0, 6000] | | acc | double | 加速度 | > 0 | | dec | double | 减速度 | > 0 | **请求示例:** ```json { "axisNum": 1, "relativePos": 50.0, "vel": 80.0, "acc": 40.0, "dec": 40.0 } ``` ### 独立轴定位运动停止 **命令字:** `0x30EF` > **说明:** 停止独立轴的定位运动(绝对/相对位置运动)。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ## 独立轴配置 ### 上位机查询独立轴软限位 **命令字:** `0x2809` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴软限位 **命令字:** `0x280A` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | | positiveLimit | double | 正限位值 | | inverseLimit | double | 反限位值 | | enableLimit | bool | 软限位使能状态 | **响应示例:** ```json { "axisNum": 1, "positiveLimit": 500.0, "inverseLimit": -500.0, "enableLimit": true } ``` ## 独立轴运动说明 ### 运动控制模式 独立轴提供以下几种运动控制方式: | 控制方式 | 命令字 | 说明 | |----------|--------|------| | PV 运动 | `0x30E0` | 速度控制模式,以指定速度和方向持续运动 | | 点动 | `0x30E7` | Jog 模式,按住时持续运动,松开停止 | | 绝对定位 | `0x30ED` | 运动到指定的绝对位置后停止 | | 相对定位 | `0x30EE` | 从当前位置运动指定的相对距离后停止 | | 回零 | `0x30E5` | 回到零点位置 | ### 运动停止方式 | 停止方式 | 命令字 | 说明 | |----------|--------|------| | PV 停止 | `0x30E1` | 停止 PV 运动 | | 取消运动 | `0x30E4` | 取消独立控制运动 | | 回零停止 | `0x30E6` | 停止回零操作 | | 通用停止 | `0x30EC` | 停止所有运动 | | 定位停止 | `0x30EF` | 停止定位运动 | ### 操作流程 1. 首先通过 `0x30EA` 使能伺服 2. 查询 `0x30E9` 确认伺服已使能且无报警 3. 发送运动命令(PV、点动、定位等) 4. 通过 `0x30E9` 监控运行状态 5. 运动完成后发送停止命令 6. 必要时通过 `0x30EA` 去使能伺服 --- # 程序增删改查 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/01.%E7%A8%8B%E5%BA%8F%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5.html ## 1 程序删除 **命令字:** `0x5000` **说明:** 上位机下发删除程序 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | jobfilename | string | 是 | 作业文件名称 | | suffixname | string | 是 | 作业文件后缀名 | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "jobfilename": "QQQQ", "suffixname": ".JBR" } ``` --- ## 2 程序重命名 **命令字:** `0x5001` **说明:** 将原有程序的名字更改,上位机下发重命名程序 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | lastname | string | 是 | 修改前程序名 | | newname | string | 是 | 修改后程序名 | | suffixname | string | 是 | 程序后缀名 | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "lastname": "QQQQ", "newname": "WWWW", "suffixname": ".JBR" } ``` --- ## 3 程序创建 **命令字:** `0x5002` **说明:** - 程序的新建需要在示教模式下 - 程序的运行需要再运行模式下,并且伺服就绪,上电没有报错 - 上位机下发新建程序 | 参数 | 类型 | 必填 | 说明 | | |------|------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | | jobName | string | 是 | 新建程序名,命名首字母不得为数字 | | | suffix | string | 是 | 程序后缀名 | | | time | string | 是 | 插入指令的时间,格式如 `2025.03.11 20:28:23` | | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "jobName": "TTT", "suffixname": ".JBR", "time": "2025.03.11 20:28:23" } ``` ### 3.1 控制器发送新建作业指令(0x5004) **说明:** 控制器发送给示教器外部按键触发的新建作业 **命令字:** `0x5004` | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | jobName | string | 是 | 需要新建的作业名称 | ```json { "jobName": "文件1" } ``` --- ## 4 程序文件列表查询 **说明:** 上位机下发查询程序文件列表,若成功将会返回 `0x5011`、`0x5012`、`0x5013` 三个命令字 - 使用时,在接收到 `0x5011` 后,开启计时,设定5秒,作用为判断下载文件过程中是否等待超时 - 返回 `0x5012` 时,每个机器人会单独发送,并且每次发送文件数量为五个 - 文件发送完成后,返回 `0x5013` 作为发送完成的标志 ### 4.1 查询程序文件列表(0x5010) **命令字:** `0x5010` **说明:** 上位机下发查询程序文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | ### 4.2 返回程序文件总数(0x5011) **命令字:** `0x5011` **说明:** 控制器返回程序文件总数,获取所有机器人的程序文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | absolutepath | string 数组 | 是 | 程序文件的文件夹列表,如 `{"/job/R1/","/job/R2/","/job/R3/","/job/R4/"}`,当只有一个机器人时,其余位置填空字符串 | | jobfilenum | int 数组 | 是 | 程序文件夹中包含的文件个数,分别对应机器人1,2,3,4,数量包含复位程序;当只有一个机器人时,其余位置为0 | **备注:** 复位程序 - 当点击复位时执行复位程序或者移动到复位点,具体操作看用户设置 ```json { "absolutepath": ["/job/R1/", "/job/R2/", "/job/R3/", "/job/R4/"], "jobfilenum": [4, 1, 1, 1] } ``` ### 4.3 返回程序文件列表(0x5012) **命令字:** `0x5012` **说明:** 控制器主动向上位机发送指令,向上位机回复时每个机器人分开发送 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | listnum | int | 是 | 发送的程序文件数量,单次最多发送5个,范围[0,5] | | jobfilelist | object 数组 | 是 | 程序文件数组,元素个数为 `listnum` 的值 | **jobfilelist 元素结构:** | 参数 | 类型 | 说明 | |------|------|------| | name | string | 程序文件名,如 `xxx.JBR` | | MD5 | string | MD5值,用于判断文件是否相同 | **备注:** `RobotResetProgram.ResetPro` 为复位程序 ```json { "robot": 1, "listnum": 2, "jobfilelist": [ { "name": "RobotResetProgram.ResetPro", "MD5": "e4b21ca518cd2d2eecd4b3f463c02ab1" }, { "name": "yyy.JBR", "MD5": "5b172a7a37a07aa6ccec1c60cfd5db7d" } ] } ``` ### 4.4 程序文件列表查询结束(0x5013) **命令字:** `0x5013` **说明:** 标志着程序文件列表查询结束,控制器返回程序文件列表查询结束的标识 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | --- ## 5 Lua 文件列表查询 ### 5.1 查询 Lua 文件列表(0x5020) **命令字:** `0x5020` **说明:** 上位机发送查询 lua 文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | ### 5.2 返回 Lua 文件列表(0x5021) **命令字:** `0x5021` **说明:** 控制器返回 lua 文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | absolutepath | string | 是 | lua 脚本所在目录,如 `lua/` | | sum | int | 是 | 列表总数 | | scriptlist | string 数组 | 是 | lua 文件列表 | ```json { "absolutepath": "lua/", "sum": 2, "scriptlist": ["ww.lua", "ee.lua"] } ``` --- # 指令-运动控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/01.%E6%8C%87%E4%BB%A4-%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 外部轴运动 **说明**:与外部轴有关的运动指令,必须是在存在外部轴的前提下才可以使用。 --- ### MOVJEXT - 外部轴点到点运动 **指令类型**:type = 33 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 100] | % | 速度(m_vUnit 必须为2) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量;1:绑定变量,0:非绑定变量 | | RobotPos | object | - | - | 点位信息(当使用绑定变量点位时,不使用该节点) | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s | | 2 | 百分比(仅可使用2) | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 33, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### MOVLEXT - 外部轴直线运动 **指令类型**:type = 34 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSYNC | int | 0或1 | - | 变位机同步;0:否,1:同步 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 34, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### MOVCEXT - 外部轴圆弧运动 **指令类型**:type = 35 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSYNC | int | 0或1 | - | 变位机同步;0:否,1:同步 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 35, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EXTMOV - 外部轴随动运动 **指令类型**:type = 144 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | _pVarName | double | [-2000, 0) ∪ (0, 2000] | 速度值 | | extaxle | int | 1, 2, 3 | 外部轴编号;1:O1,2:O2,3:O3 | | movtype | int | 0, 1, 2 | 外部轴随动方式;0:随线速度动,1:恒速运动,2:绑定变量 | | p_move_type | object | - | 当 movtype 为2时,绑定的变量为该节点 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "_pVarName": { "data": 2.90, "secondvalue": 0, "value": 0, "varname": "" }, "extaxle": 1, "logout": false, "movtype": 2, "p_move_type": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "p_speed_proportion_factor": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 144, "userParamInt": 0, "userParamString": "" } ``` --- ### ENDEXTMOV - 外部轴随动停止运动 **指令类型**:type = 145 #### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 145, "userParamInt": 0, "userParamString": "" } ``` --- ### GEARIN - 电子齿轮 **指令类型**:type = 148 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | followAxle | int | 1, 2, 3 | 随动轴;1=O1,2=O2,3=O3 | | mainAxle | int | 1-6 | 主轴;J1~J6轴对应1-6 | | proportionfactor | double | (0, 1000] | 比例关系(k);随动轴速(°/s)=K*主轴速(°/s) | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "followAxle": 1, "logout": false, "mainAxle": 2, "proportionfactor": 3.0, "type": 148, "userParamInt": 0, "userParamString": "" } ``` --- ### ENDGEARIN - 电子齿轮停止 **指令类型**:type = 150 #### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 150, "userParamInt": 0, "userParamString": "" } ``` --- ### MRESET - 复位外部轴多圈转动量 **指令类型**:type = 149 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | exterAxis | int | 0, 1, 2, 3 | 外部轴个数;0为全部轴,1=O1,2=O2,3=O3 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 149, "userParamInt": 0, "userParamString": "", "exterAxis": 1 } ``` --- ## 双机运动 **说明**:需要先设置成双机模式。 --- ### MOVJDOUBLE - 双机点到点运动 **指令类型**:type = 59 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 100] | % | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 59, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVLDOUBLE - 双机直线运动 **指令类型**:type = 56 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 56, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVCDOUBLE - 双机圆弧运动 **指令类型**:type = 57 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 57, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVCADOUBLE - 双机整圆运动 **指令类型**:type = 58 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaSPIN | int | 0, 1, 2 | - | 姿态参数;0:姿态不变,1:六轴不转,2:六轴旋转 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 58, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ## 外部点运动 **说明**:使用 MODBUS 或者 TCP 发送过来的点位信息来运动。 --- ### MOVCOMM - 外部点运动 **指令类型**:type = 101 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [2, 1000]或[1, 100] | mm/s 或% | 速度;根据 m_vUnit 和 moveType 确定范围 | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | moveType | string | MovJ/MovL/MovS/MovC | - | 插补方式;MovJ:关节,MovL:直线,MovS:曲线,MovC:圆弧 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | #### m_vUnit 速度单位说明 | m_vUnit 值 | 单位 | 适用插补方式 | 速度范围 | |-----------|------|--------------|----------| | 1 | mm/s | 直线、曲线、圆弧 | [2, 1000] | | 2 | % | 关节 | [1, 100] | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 101, "logout": false, "userParamInt": 0, "userParamString": "", "moveType": "MovS" } ``` --- ## 拖拽轨迹运动 **说明**:使用原本的拖拽轨迹来运动。 --- ### DRAG_TRAJECTORY - 拖拽轨迹 **指令类型**:type = 174 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | trackName | string | - | - | 轨迹名称;开头##,结束$$ | | trackSpeed | double | 0~500 | % | 轨迹回放速率 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 174, "userParamInt": 0, "userParamString": "", "trackName": "##RRR$$", "trackSpeed": 3 } ``` --- ## 切换负载编号 **说明**:不切换工具手,只切换负载编号。 --- ### SWITCHPAYLOAD - 切换负载编号 **指令类型**:type = 219 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | _pVarName | object | - | 负载编号参数 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 负载编号范围 | 范围 | 说明 | |------|------| | 1-999 | int 类型 | #### 示例 ```json { "logout": false, "type": 219, "userParamInt": 0, "userParamString": "", "_pVarName": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" } } ``` --- ## 外部基准点运动 **说明**:外部基准点是指将空间中的一点作为本体的控制点。 --- ### EIMOVL - 外部基准点直线 **指令类型**:type = 233 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 233, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EIMOVC - 外部基准点圆弧 **指令类型**:type = 233 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 233, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EIMOVCA - 外部基准点整圆 **指令类型**:type = 235 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaSPIN | int | 0 | - | 姿态参数;0:姿态不变 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 235, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- # 指令-通用运动 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/02.%E6%8C%87%E4%BB%A4-%E9%80%9A%E7%94%A8%E8%BF%90%E5%8A%A8.html ## 1. MOVJ 点到点运动 **说明**:点到点运动为关节运动,单位为%。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,100] | % | 速度,m_vUnit 必须为2 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 1 | - | 指令类型,1表示 MOVJ 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 1, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 2. MOVL 直线运动 **说明**:直线运动速度单位为 mm。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 2 | - | 指令类型,2表示 MOVL 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### m_vUnit 速度单位说明 | 值 | 单位 | |----|------| | 0 | cm/s | | 1 | mm/s | | 2 | 百分比 | > 直线运动时只能使用 1 (mm/s)。 ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 2, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 3. MOVC 圆弧运动 **说明**:使用时需要一条直线或点到点指令和两条圆弧指令,这三个点确定一个圆弧。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSPIN | double | 0或1 | - | 姿态参数:0=示教姿态,1=姿态倾角不变 | | type | int | 3 | - | 指令类型,3表示 MOVC 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 3, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 4. MOVCA 插入整圆 **说明**:整圆运动需要一条点到点或者直线运动,加两个整圆运动指令。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSPIN | double | 0,1,2 | - | 姿态参数:0=姿态不变,1=六轴不转,2=六轴旋转 | | type | int | 4 | - | 指令类型,4表示 MOVCA 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 4, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 5. MOVS 插入曲线 **说明**:曲线运动为 S 型运动轨迹,需要一条点到点或直线指令,再加四条曲线运动指令。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 6 | - | 指令类型,6表示 MOVS 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 6, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 6. IMOV 增量运动 **说明**:增量运动为在当前位置的基础上,各轴增加多少。此时的点位信息为各轴增加多少。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,100] | % | 速度,m_vUnit 必须为2 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 5 | - | 指令类型,5表示 IMOV 指令 | | imovecoord | string | - | - | 移动坐标:RF=关节坐标,BF=直角坐标,TF=工具坐标,UF=用户坐标 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 5, "logout": false, "imovecoord": "RF", "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 7. MOVARCH 门型运动 **说明**:门型运动为从当前位置抬升或降低到指定高度,随后在该平面上移动到目标点的上方或下方,最后抬升或降低到目标点。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaSPIN | double | [0,1] | - | 关节运动方式:0=关节,1=直角 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 231 | - | 指令类型,231表示 MOVARCH 指令 | | offsetAxis | int | [0,2] | - | 位移轴:0=X,1=Y,2=Z | | para_line_or_coord_max_ | double | - | - | 最大坐标值或最大高度值 | | axis_offset_type_ | int | 0或1 | - | 偏移方式:1=最大坐标,0=最大高度 | | para_straight_up_ | double | - | - | 垂直上升距离 | | para_straight_down_ | double | - | - | 垂直下降距离 | | use_arch_params_table_enable_ | int | 0或1 | - | 是否使用参数表 | | arch_param_group_index_ | int | [0,6] | - | 参数表组号 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 231, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0, "offsetAxis": 0, "para_line_or_coord_max_": 0.0, "axis_offset_type_": 1, "para_straight_up_": 0.0, "para_straight_down_": 0.0, "use_arch_params_table_enable_": 0, "arch_param_group_index_": 0 } ``` --- ## 8. MOVARCHEXT 扩展门型运动 **说明**:门型运动为从当前位置抬升或降低到指定高度,随后在该平面上移动到目标点的上方或下方,最后抬升或降低到目标点。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 275 | - | 指令类型,275表示 MOVARCHEXT 指令 | | offsetAxis | int | [0,2] | - | 位移轴:0=X,1=Y,2=Z | | para_straight_up_ | double | - | - | 垂直上升距离 | | para_straight_down_ | double | - | - | 垂直下降距离 | | use_arch_params_table_enable_ | int | 0或1 | - | 是否使用参数表 | | arch_param_group_index_ | int | [0,6] | - | 参数表组号 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### 点位信息说明 - **RobotPos**:目标点点位信息 - **RobotPos1**:接近点点位信息 - **RobotPos2**:转移点点位信息 当使用绑定变量点位时,不使用对应节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 275, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0, "offsetAxis": 0, "para_straight_up_": 0.0, "para_straight_down_": 0.0, "use_arch_params_table_enable_": 0, "arch_param_group_index_": 0 } ``` --- ## 9. SPEED 全局速度 **说明**:可使用该指令设置全局速度。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | type | int | 31 | - | 指令类型,31表示 SPEED 指令 | | paraSpeed | int | [1,200] | % | 全局速度 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | ### JSON 示例 ```json { "type": 31, "paraSpeed": { "data": 150.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "userParamInt": 0, "userParamString": "" } ``` --- ## 10. SAMOV 定点移动 **说明**:定点移动可以使用不同的坐标系移动。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [2,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 59 | - | 指令类型,59表示 SAMOV 指令 | | imovecoord | string | - | - | 移动坐标:RF=关节坐标,BF=直角坐标,TF=工具坐标,UF=用户坐标 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "AP0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 59, "logout": false, "imovecoord": "RF", "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- # 指令-输入输出类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/03.%E6%8C%87%E4%BB%A4-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B1%BB.html --- ## DIN IO 输入 **说明**:输入是相对于控制器而言,由外部到控制器。IO 输入的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | DIN 在枚举数列 type 中为17 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输入 | | ParaGroupValue | object | 端口值存入;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | din 类型;1路输入:IN#,4路输入:IGH#,8路输入:IG# | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **示例**: ```json { "logout": false, "type": 17, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "groupType": "IGH#" } ``` --- ## DOUT IO 输出 **说明**:将 IO 板上对应的 IO 端口置高或置低。IO 输出的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | DOUT 在枚举数列 type 中为16 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输出 | | ParaGroupValue | object | 端口值输出;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | dout 类型;1路输出:OT#,4路输出:OGH#,8路输出:OG# | | errorHanding | int | 1:计时结束停止,0:输出值保持 | | ParaGroupTime | object | 时间;double 类型;范围[0,9999] | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **ParaGroupTime 结构**: ```json {"data":3.0,"secondvalue":0,"value":0,"varname":""} ``` **示例**: ```json { "logout": false, "type": 16, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "errorHanding": 1, "groupType": "OT#", "ParaGroupTime": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## AIN 模拟输入 **说明**:输入是相对于控制器而言,由外部到控制器。模拟输入的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | AIN 在枚举数列 type 中为21 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupValue | object | 变量值;double 类型 | | portId | int | 模拟输入口;int 类型;取值范围1-IO 板数*2 | **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"D001"} ``` **示例**: ```json { "logout": false, "type": 21, "userParamInt": 0, "userParamString": "", "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "D001"}, "portId": 4 } ``` --- ## AOUT 模拟输出 **说明**:输出是由控制器控制 IO 板的值。模拟输出的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | AOUT 在枚举数列 type 中为20 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupValue | object | 变量值;double 类型;范围[0,10] | | portId | int | 模拟输入口;int 类型;取值范围1-IO 板数*2 | **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"D001"} ``` **示例**: ```json { "logout": false, "type": 20, "userParamInt": 0, "userParamString": "", "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "D001"}, "portId": 4 } ``` --- ## PULSEOUT 脉冲输出 **说明**:按照设定的脉冲频率与个数,在 R1 PWMIO 板上的 DB9端子的引脚4(PWM+)上进行输出。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | PULSEOUT 在枚举数列 type 中为22 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | rate | int | 频率;int 类型;范围[1,1000000] | | sum | int | 个数;int 类型;范围大于零 | **示例**: ```json { "logout": false, "type": 22, "userParamInt": 0, "userParamString": "", "rate": 10, "sum": 100 } ``` --- ## READ_DOUT 读取输出 **说明**:将数字输出端口的状态通过变量读取,然后将2进制转为10进制数值并存入目标变量中。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | READ_DOUT 在枚举数列 type 中为99 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输出 | | ParaGroupValue | object | 端口值输出;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | dout 类型;1路输出:OT#,4路输出:OGH#,8路输出:OG# | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **示例**: ```json { "logout": false, "type": 99, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "groupType": "IGH#" } ``` --- # 指令-运算类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/04.%E6%8C%87%E4%BB%A4-%E8%BF%90%E7%AE%97%E7%B1%BB.html --- ## 加 (ADD) **说明**:参数1与参数2相加的值存入结果变量 **指令名**:ADD | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | ADD 在枚举序列中为43 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 43, "userParamInt": 0, "userParamString": "" } ``` --- ## 减 (SUB) **说明**:参数1与参数2相减的值存入结果变量 **指令名**:SUB | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | SUB 在枚举序列中为44 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 44, "userParamInt": 0, "userParamString": "" } ``` --- ## 乘 (MUL) **说明**:参数1与参数2相乘的值存入结果变量 **指令名**:MUL | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | MUL 在枚举序列中为45 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 45, "userParamInt": 0, "userParamString": "" } ``` --- ## 除 (DIV) **说明**:参数1与参数2相除的值存入结果变量(除数不可为零) **指令名**:DIV | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | DIV 在枚举序列中为46 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 46, "userParamInt": 0, "userParamString": "" } ``` --- ## 模 (MOD) **说明**:进行模运算,将模运算的结果存入到选择的结果变量 **指令名**:MOD | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量,全局或局部变量 | | type | int | MOD 在枚举序列中为47 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 47, "userParamInt": 0, "userParamString": "" } ``` --- ## 正弦 (SIN) **说明**:正弦运算(sin),A = sin(B),B 为弧度制 rad **指令名**:SIN | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | SIN 在枚举序列中为102 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 102, "userParamInt": 0, "userParamString": "" } ``` --- ## 余弦 (COS) **说明**:余弦运算(cos),A = cos(B),B 为弧度制 rad **指令名**:COS | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | COS 在枚举序列中为103 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 103, "userParamInt": 0, "userParamString": "" } ``` --- ## 反正弦 (ANTN) **说明**:反正弦运算(arcsin),A = arcsin(B),B 为弧度制 rad **指令名**:ANTN | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | ANTN 在枚举序列中为104 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 104, "userParamInt": 0, "userParamString": "" } ``` --- ## 逻辑运算 (LOGICAL_OP) **说明**:逻辑运算(与、或、非) **指令名**:LOGICAL_OP | 字段 | 类型 | 说明 | |------|------|------| | logicalType | int | 运算类型;取值范围:0(与)、1(或)、2(非) | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraGroupOne | object | 变量1;int 类型变量或 double 类型变量或 bool 类型或 IO 输入,全局或局部变量 | | paraGroupStore | object | 结果变量;int 类型变量或 double 类型变量或 bool 类型,全局或局部变量 | | paraGroupTwo | object | 参数2;int 类型变量或 double 类型变量或 bool 类型或 IO 输入,全局或局部变量 | | type | int | LOGICAL_OP 在枚举序列中为121 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraGroupOne/paraGroupStore/paraGroupTwo 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "logicalType": 1, "logout": false, "paraGroupOne": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "paraGroupStore": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraGroupTwo": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 121, "userParamInt": 0, "userParamString": "" } ``` --- --- # 指令-条件控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/05.%E6%8C%87%E4%BB%A4-%E6%9D%A1%E4%BB%B6%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 调用子程序 (CALL) **说明**:调用另一个程序,被调用的程序运行完后返回主程序 CALL 指令的下一行继续运行。 **指令名**:CALL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | callInParaVarData | array | 否 | 输入参数个数及选择;有0-12个元素。元素格式:`{"data":0.0,"secondvalue":0,"value":2,"varname":"D001"}` | | callOutParaVarData | array | 否 | 输出参数个数及选择;有0-12个元素。元素格式:`{"data":0.0,"secondvalue":0,"value":2,"varname":"D001"}` | | jobName | string | 是 | 调用程序名称,不能是本身,调用的程序中须有参数声明 | | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL 在枚举数列中为15 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**:有两个参数 ```json { "callInParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D002" } ], "callOutParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD003" }, { "data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD004" } ], "jobName": "QQQQ", "logout": false, "type": 15, "userParamInt": 0, "userParamString": "" } ``` --- ## 退出 (RETURN) **说明**:退出当前运行的作业文件,例如:子程序、后台程序。 **指令名**:RETURN | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | RETURN 在枚举数列中为251 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 251, "userParamInt": 0, "userParamString": "" } ``` --- ## 调用 Lua 文件 (CALL_LUAFILE) **说明**:参数定义好之后,直接上传 Lua 文件,然后插入调用 Lua 文件指令,指令运行结束后会把写好的所有参数变量传入和输出。 **指令名**:CALL_LUAFILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL_LUAFILE 在枚举数列中为218 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | inParaVarData | array | 否 | 传入参数个数及选择;元素个数[0-12]。元素格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}` | | luafileName | string | 是 | 调用的 lua 文件 | | outParaVarData | array | 否 | 输出参数个数及选择;元素个数[0-12]。元素格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}` | | textEditType | bool | 否 | 文本编译类型;true:文本类型,false:语句类型 | **示例**: ```json { "logout": false, "type": 218, "userParamInt": 0, "userParamString": "", "inParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" } ], "luafileName": "demo.lua", "outParaVarData": [ { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" } ], "textEditType": true } ``` --- ## 如果 (IF) **说明**:通过判断条件是否成立来执行下一目标的指令,判断条件不满足时,执行 ELSEIF 语句。IF 和 ENDIF 配对使用,不能单独删除或更改,会导致程序运行出错。ELSE IF 不可脱离 IF 单独使用。ELSE 不可脱离 IF 单独使用。 **指令名**:IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | IF 在枚举数列中为9 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ifconditionArrayFINAL | object | 是 | 表示 if 判断;{}内的为 if 判断的数据 | **ifconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **conditionGroup 元素结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | logicType | int | if 判断条件比较方式;1:==,2:<,3:>,4:<=,5:>=,6:!= | | paraGroupOne | object | 变量1,格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I002"}` | | paraGroupTwo | object | 变量2,格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I002"}` | **示例**: ```json { "logout": false, "type": 9, "userParamInt": 0, "userParamString": "", "ifconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1, 0] } } ``` ### 结束如果 (END IF) **指令名**:END IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | END IF 在枚举数列中为12 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 12, "userParamInt": 0, "userParamString": "" } ``` ### 否则如果 (ELSE IF) **指令名**:ELSE IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ELSE IF 在枚举数列中为11 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ifconditionArrayFINAL | object | 是 | 表示 if 判断;{}内的为 if 判断的数据 | **ifconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 11, "userParamInt": 0, "userParamString": "", "ifconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1, 0] } } ``` ### 否则 (ELSE) **指令名**:ELSE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ELSE 在枚举数列中为10 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 10, "userParamInt": 0, "userParamString": "" } ``` --- ## 等待 (WAIT) **说明**:条件成立之前程序处于等待状态,条件成立后继续执行等待指令后面的指令。 **指令名**:WAIT | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WAIT 在枚举数列中为8 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | m_filterTime | double | 否 | 滤波时间,输入信号需满足的时间;[0,9999]s。滤波时间要小于等待时间 | | paraTime | object | 否 | 等待时间;double 类型;[0.01,9999]s | | para_wait_result_ | object | 否 | 等待结果,满足条件为 true;bool 类型 | | waitConditionFinal | object | 否 | {}内为参与判断的条件和变量 | | wait_value_check_ | bool | 否 | 是否接受结果;true:存在"para_wait_result_"节点,false:不存在 | **waitConditionFinal 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 8, "userParamInt": 0, "userParamString": "", "m_filterTime": 66.0, "paraTime": { "data": 77.0, "secondvalue": 0, "value": 0, "varname": "" }, "para_wait_result_": { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B005" }, "waitConditionFinal": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } } ], [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" } } ], [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I007" } } ] ], "logic": [1, 0] }, "wait_value_check_": true } ``` --- ## WHILE 循环 (WHILE) **说明**:判断条件为真是反复执行循环语句里面的指令。插入 WHILE 指令的同时会同时插入 ENDWHILE 指令。若要删除 WHILE 指令请同时删掉其对应的 ENDWHILE 指令,否则会导致程序无法运行。当程序的开头为 WHILE 且最后一样指令为 ENDWHILE 时,请在程序的开头或结尾插入一条 TIMER(延时)指令。否则当 WHILE 指令的条件不满足时会导致程序陷入死机。当 WHILE 内部的指令没有运动类指令或在某种情况下可能会陷入死循环时,请在 WHILE 与 ENDWHILE 间插入一条 TIMER(延时)指令,否则当 WHILE 指令的条件满足时可能会导致程序陷入死机。当 WHILE 指令的条件满足时,会循环运行 WHILE 与 ENDWHILE 两条指令之间的指令。在运行到 WHILE 指令之前若判断条件不满足,在运行到 WHILE 指令时会直接跳转到 ENDWHILE 指令而不运行 WHILE 与 ENDWHILE 之间的指令;若在运行 WHILE 与 ENDWHILE 之间的指令过程中,判断条件变成不满足,会继续运行,直到运行到 ENDWHILE 行,不再循环而是继续运行 ENDWHILE 下面的指令。 **指令名**:WHILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WHILE 在枚举数列中为13 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | whileconditionArrayFINAL | object | 是 | 表示 while 判断;{}内的为 while 判断的数据 | **whileconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | while 判断与 while 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 13, "userParamInt": 0, "userParamString": "", "whileconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } } ], [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" } } ], [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I007" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" } }, { "logicType": 4, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I008" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I009" } } ] ], "logic": [0, 1], "logicGroup": [null, null, [0]] } } ``` ### 结束循环 (ENDWHILE) **指令名**:ENDWHILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ENDWHILE 在枚举数列中为14 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 14, "userParamInt": 0, "userParamString": "" } ``` --- ## LABEL 标签 (LABEL) **说明**:指定跳转目标行的标签。同一程序无法插入两条标签名相同的标签指令。标签指令不支持上移、下移操作。 **指令名**:LABEL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | LABEL 在枚举数列中为51 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | label | string | 是 | 标签名;格式:`[$......$]` | **示例**: ```json { "logout": false, "type": 51, "userParamInt": 0, "userParamString": "", "label": "[$EAFF$]" } ``` --- ## JUMP 跳转 (JUMP) **说明**:跳转至指定标签号的指令行。判断条件成立则跳转到 LABEL 指令行,若判断条件不成立则忽略 JUMP 指令,继续运行 JUMP 指令的下一行指令。JUMP 指令必须与 LABEL(标签)指令配合使用。JUMP 指令不可跨程序跳转。例如主程序里面插入 LABEL [$Q1$]指令,在子程序插入 JUMP [$Q1$]指令,程序运行会报错。 **指令名**:JUMP | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | JUMP 在枚举数列中为52 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | jumpCondition | object | 否 | 表示 if 判断;{}内的为 if 判断的数据 | | jumpConditionFlag | bool | 否 | 是否使用判断条件;true:使用,false:不使用 | | label | string | 是 | 标签名;格式:`[$......$]` | **jumpCondition 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 52, "userParamInt": 0, "userParamString": "", "jumpCondition": { "conditionGroup": [ [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" }, "paraGroupTwo": { "data": 89.0, "secondvalue": 0, "value": 0, "varname": "" } }, { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 88.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I089" }, "paraGroupTwo": { "data": 78.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1], "logicGroup": [[0]] }, "jumpConditionFlag": true, "label": "[$EAFF$]" } ``` --- ## UNTIL 直到 (UNTIL) **说明**:条件不成立时重复执行 UNTIL 和 ENDUNTIL 之间的指令,条件成立时直接跳到 ENDUNTIL 下面的指令运行。UNTIL 指令插入的同时会插入 ENDUNTIL 指令。若要删除 UNTIL 指令请同时删掉其对应的 ENDUNTIL 指令,否则会导致程序无法运行。 **指令名**:UNTIL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | UNTIL 在枚举数列中为87 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | untilconditionArrayFINAL | object | 是 | {}内的为判断的数据 | **untilconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 87, "userParamInt": 0, "userParamString": "", "untilconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" } }, { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" } } ] ], "logic": [0], "logicGroup": [[1]] } } ``` ### 停止直到 (ENDUNTIL) **指令名**:ENDUNTIL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ENDUNTIL 在枚举数列中为88 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 88, "userParamInt": 0, "userParamString": "" } ``` --- ## 工艺跳行 (CRAFTLINE) **说明**:只用于专用工艺,程序中插入该指令设置对应行数,在专用工艺界面运行程序时会先跳转到对应的行数。 **指令名**:CRAFTLINE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CRAFTLINE 在枚举数列中为89 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | line | int | 是 | 专用工艺界面中对应的指令行数;[1,999] | **示例**: ```json { "logout": false, "type": 89, "userParamInt": 0, "userParamString": "", "line": 3 } ``` --- ## 指令注释 (CMDNOTE) **说明**:专用工艺指令,程序中运行该指令后,在专用工艺界面会跳转到对应的行数。 **指令名**:CMDNOTE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CMDNOTE 在枚举数列中为127 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | note | string | 是 | 注释内容;格式:`##.......$$` | **示例**: ```json { "logout": false, "type": 127, "userParamInt": 0, "userParamString": "", "note": "##ADSDDD$$" } ``` --- ## 到达判断 (POS_REACHABLE) **说明**:判断目标点是否能到达,点位能够到达选择的状态存入的变量置1,不能到达置0。 **指令名**:POS_REACHABLE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | POS_REACHABLE 在枚举数列中为133 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | moveType | int | 否 | 运动类型;0-MOVJ,1-MOVL | | positionId | string | 是 | 位置变量名 | | _pVarName | object | 是 | 状态存入变量 | **示例**: ```json { "logout": false, "type": 133, "userParamInt": 0, "userParamString": "", "moveType": 0, "positionId": "GP0001", "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 6, "varname": "GB001" } } ``` --- ## 计时 (CLKSTART / CLKSTOP / CLKRESET) **说明**:运行该指令开始计时,并将时间记录到局部或者全局 DOUBLE 变量。停止对应序号的计时器计时,停止后已存入变量的值不会归零。 ### 计时开始 (CLKSTART) **指令名**:CLKSTART | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKSTART 在枚举数列中为128 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | | _pVarName | object | 是 | 存入变量 | **示例**: ```json { "logout": false, "type": 128, "userParamInt": 0, "userParamString": "", "ID": 5, "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" } } ``` ### 计时停止 (CLKSTOP) **指令名**:CLKSTOP | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKSTOP 在枚举数列中为129 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | **示例**: ```json { "logout": false, "type": 129, "userParamInt": 0, "userParamString": "", "ID": 5 } ``` ### 计时复位 (CLKRESET) **指令名**:CLKRESET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKRESET 在枚举数列中为130 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | **示例**: ```json { "logout": false, "type": 130, "userParamInt": 0, "userParamString": "", "ID": 5 } ``` --- ## 读取线速度 (READLINEAR / STOPREADLINEAR) **说明**:机器人运行的时候实时读取机器人线速度,将读取到的速度存入到变量。插入读取线速度指令时会同时插入读取线速度停止,如果要删除读取线速度指令请将对应线速度停止指令删除,否则程序会报错。 ### 读取线速度 (READLINEAR) **指令名**:READLINEAR | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | READLINEAR 在枚举数列中为146 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | _pVarName | object | 是 | 变量;int 类型或 double 类型 | **示例**: ```json { "logout": false, "type": 146, "userParamInt": 0, "userParamString": "", "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI003" } } ``` ### 停止读取线速度 (STOPREADLINEAR) **指令名**:STOPREADLINEAR | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | STOPREADLINEAR 在枚举数列中为147 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 147, "userParamInt": 0, "userParamString": "" } ``` --- ## 调用 Lua 语句 (CALL_LUASTRING) **说明**:通过调用 Lua 语句来实现相应的功能或操作。 **指令名**:CALL_LUASTRING | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL_LUASTRING 在枚举数列中为230 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | textEditType | bool | 否 | 文本编译类型;true:文本类型,false:语句类型 | | variable | object | 否 | lua 语句变量 | **示例**: ```json { "logout": false, "type": 230, "userParamInt": 0, "userParamString": "", "textEditType": false, "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" } } ``` --- ## 参数声明 (PARAM_DECLARATION) **说明**:声明要输入或者输出的参数,输入参数将被子程序接收并使用,输出参数将返回给主程序使用。 **指令名**:PARAM_DECLARATION | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | PARAM_DECLARATION 在枚举数列中为237 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | declareInParaVarData | array | 否 | 输入参数变量;元素个数为输入参数个数;参数个数[0,12] | | declareInParaVarValues | array | 否 | 输入参数默认值;元素个数为输入参数个数;参数个数[0,12] | | declareInParaVarnote | array | 否 | 输入参数注释;元素个数为输入参数个数;参数个数[0,12] | | declareOutParaVarData | array | 否 | 输出参数值;元素个数为输出参数个数;参数个数[0,12] | | declareOutParaVarnote | array | 否 | 输出参数注释;元素个数为输出参数个数;参数个数[0,12] | **示例**: ```json { "logout": false, "type": 237, "userParamInt": 0, "userParamString": "", "declareInParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } ], "declareInParaVarValues": [ { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D002" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D003" } ], "declareInParaVarnote": [ "000", "111", "222" ], "declareOutParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B001" }, { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B002" } ], "declareOutParaVarnote": [ "333", "4444" ] } ``` --- ## 等到运动到点 (WAIT_POS) **说明**:MOV 指令执行结束并不代表伺服运行结束,仅为点位下发结束,此指令等待伺服电机运行精准到点,再执行下一个指令。此指令必须在运动指令后执行此指令才生效。此指令只能仅支持前台程序,后台无运动指令自然也不需要使用。此指令不支持提前执行。如果机器人在最小等待时间和最大等待时间之间,运动到点了,就会退出等待,执行下一条指令。 **指令名**:WAIT_POS | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WAIT_POS 在枚举数列中为238 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | accurary | double | 是 | 精度;[0.0001,0.1]度/秒 | | waitType | int | 否 | 等待类型;0:位置,1:速度 | | maxTime | int | 是 | 最大等待时间;[20,20000] | | minTime | int | 是 | 最小等待时间;[20,20000] | **示例**: ```json { "logout": false, "type": 238, "userParamInt": 0, "userParamString": "", "accurary": 0.10, "maxTime": 200, "minTime": 20, "waitType": 0 } ``` --- ## 碰撞检测 (DETECTCOLLISION_SET / DETECTCOLLISION_RESET) **说明**:碰撞检测设置:调用临时参数,方便及时调整碰撞检测阈值。碰撞检测设置指令只是临时参数,只对碰撞检测设置指令下面的运动指令有效,不插入碰撞检测设置指令时调用人机协作-力学功能界面的碰撞检测阈值(指令)参数。碰撞检测参数复位:复位临时使用的碰撞检测阈值,执行此条指令后会调用人机协作-力学功能界面的碰撞检测阈值(指令)参数。 ### 碰撞检测设置 (DETECTCOLLISION_SET) **指令名**:DETECTCOLLISION_SET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | DETECTCOLLISION_SET 在枚举数列中为243 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | axis_1_ | double | 否 | 1轴;[1,10000] | | axis_2_ | double | 否 | 2轴;[1,10000] | | axis_3_ | double | 否 | 3轴;[1,10000] | | axis_4_ | double | 否 | 4轴;[1,10000] | | axis_5_ | double | 否 | 5轴;[1,10000] | | axis_6_ | double | 否 | 6轴;[1,10000] | | axis_7_ | double | 否 | 7轴;[1,10000] | | collision_detection_enable_ | int | 否 | 碰撞检测使能;1:使能,0:关闭使能 | | temp_parameters_enable_ | int | 否 | 使用临时参数;1:使用,0:不使用 | **示例**: ```json { "logout": false, "type": 243, "userParamInt": 0, "userParamString": "", "axis_1_": 10.0, "axis_2_": 20.0, "axis_3_": 30.0, "axis_4_": 40.0, "axis_5_": 50.0, "axis_6_": 60.0, "axis_7_": 0.0, "collision_detection_enable_": 1, "temp_parameters_enable_": 1 } ``` ### 碰撞检测参数复位 (DETECTCOLLISION_RESET) **指令名**:DETECTCOLLISION_RESET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | DETECTCOLLISION_RESET 在枚举数列中为244 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 244, "userParamInt": 0, "userParamString": "" } ``` --- ## Switch 条件分支 (Switch / Case / Default / EndSwitch) **说明**:当 SWITCH 的参数值与某个 CASE 值匹配,则会跳到对应的 CASE 语句块中执行相应的指令,执行完该语句块则会跳出 SWITCH;若 SWITCH 的参数值不与任何一个 CASE 匹配则运行 DEFAULT 语句。 ### Switch (Switch) **指令名**:Switch | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Switch 在枚举数列中为247 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | variable_switch_ | object | 是 | 变量;int 类型 | **示例**: ```json { "logout": false, "type": 247, "userParamInt": 0, "userParamString": "", "variable_switch_": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` ### Case (Case) **指令名**:Case | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Case 在枚举数列中为248 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | switch_case | int | 是 | case 的值 | **示例**: ```json { "logout": false, "type": 248, "userParamInt": 0, "userParamString": "", "switch_case": 22 } ``` ### Default (Default) **指令名**:Default | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Default 在枚举数列中为249 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 249, "userParamInt": 0, "userParamString": "" } ``` ### EndSwitch (EndSwitch) **指令名**:EndSwitch | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | EndSwitch 在枚举数列中为250 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 250, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-字符串类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/06.%E6%8C%87%E4%BB%A4-%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%B1%BB.html --- ## 1. 字符串追加 (STRING_SPELL) **说明**:在原有字符串变量或者新的字符变量中追加需要的字符,就构成了一个新的字符串变量。 **指令名**:STRING_SPELL **type 值**:223 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串追加在枚举数列中为 223 | 223 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 变量类型及名称;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | variableValue | object | 追加的字符变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"GS001"}` | ### JSON 示例 ```json { "logout": false, "type": 223, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"}, "variableValue": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "GS001"} } ``` --- ## 2. 索引截取 (STRING_SLICE) **说明**:截取一个字符串变量中的其中一部分字符串,并把截取到部分字符串存到指定的变量。 **指令名**:STRING_SLICE **type 值**:224 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,索引截取在枚举数列中为 224 | 224 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | startIndex | object | 起始索引位置;int 类型手填值或者变量,全局或局部 | `{"data":2.0,"secondvalue":0,"value":0,"varname":""}` | | endIndex | object | 结束索引位置;int 类型手填值或者变量,全局或局部 | `{"data":8.0,"secondvalue":0,"value":0,"varname":""}` | | dataVariable | object | 查询的数据依次存放的位置;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GS[I001]"}` | | variable | object | 被截取的字符串变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | ### JSON 示例 ```json { "logout": false, "type": 224, "userParamInt": 0, "userParamString": "", "startIndex": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "endIndex": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GS[I001]"}, "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 3. 字符串分隔符拆分 (STRING_SPLIT) **说明**:将字符串变量中的其中一个字符拆分,并把拆分的字符依次存放到指定变量中。 **指令名**:STRING_SPLIT **type 值**:225 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串分隔符拆分在枚举数列中为 225 | 225 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | separator | object | 分隔符;string 类型的手填值或变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"GS001"}` | | variable | object | 被提取的字符串变量名;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"S[I001]"}` | | dataVariable | object | 查询的数据依次存放的首位置;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | dataStorage | object | 记录提取数据的数量;string 类型的手填"0"或者 int 类型变量,全局或局部。string 类型的手填"0"表示不使用 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[I001]"}` | ### JSON 示例 ```json { "dataStorage": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[I001]"}, "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"}, "logout": false, "separator": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "GS001"}, "type": 225, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "S[I001]"} } ``` --- ## 4. 字符串定位 (STRING_LOCATE) **说明**:查询字符串变量里面的一种字符所在的位置,并把位置和数量存到指定变量。 > **注意:** > - 如果待索引变量在一个字符串里面是不连续的字符,在执行定位查询指令时,字符的位置和个数是无法读取出来的 > - 如果待索引变量在一个字符串里面是连续的字符,在执行定位查询指令时,读取出来的字符位置是第一个索引变量的位置,数据存放个数为1 **指令名**:STRING_LOCATE **type 值**:226 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串定位在枚举数列中为 226 | 226 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 被提取的字符串变量名;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | startIndex | object | 需要搜索的字符;string 类型手填值或变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":7,"varname":"RRRR"}` | | dataVariable | object | 查询的数据依次存放的首位置;int 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | | dataStorage | object | 记录提取数据的数量;string 类型的手填"0"或者 int 类型变量,全局或局部。string 类型的手填"0"表示不使用 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[GI001]"}` | ### JSON 示例 ```json { "dataStorage": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[GI001]"}, "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "startIndex": {"data": 0.0, "secondvalue": 0, "value": 7, "varname": "RRRR"}, "type": 226, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 5. 字符串长度 (STRING_LENGTH) **说明**:计算一个字符串变量的长度,并把计算的长度存到变量。 **指令名**:STRING_LENGTH **type 值**:227 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串长度在枚举数列中为 227 | 227 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 定位字符所在的变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | dataVariable | object | 计算结果存储的结果;int 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | ### JSON 示例 ```json { "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "type": 227, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 6. 字符串转非字符串 (STRING_TO) **说明**:字符串变量转换成非字符串变量。 > **转换规则**:字符串变量转换成非字符串变量时只会将字符串变量的数值部分转译到非字符串变量。在转译过程中会从字符串变量的第一个字符开始转译,直到检测到的字符是非数值的字符时转译结束,将检测到的数值部分的字符转译到非字符变量。如果检测到的第一个字符就是非数值的字符,那字符串无法转译成功。 **指令名**:STRING_TO **type 值**:228 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串转非字符串在枚举数列中为 228 | 228 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 待计算长度的变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | nonVariable | object | 转译的目标变量;int 类型或 double 类型或 bool 类型变量,局部或全局 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | ### JSON 示例 ```json { "nonVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "type": 228, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 7. 非字符串转字符串 (TO_STRING) **说明**:非字符串变量转换成字符串变量。 **指令名**:TO_STRING **type 值**:229 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,非字符串转字符串在枚举数列中为 229 | 229 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 转译的目标变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | nonVariable | object | 需要转译的变量;int 类型或 double 类型或 bool 类型变量,局部或全局 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[GI001]"}` | ### JSON 示例 ```json { "nonVariable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[GI001]"}, "logout": false, "type": 229, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- # 指令-定时器类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/07.%E6%8C%87%E4%BB%A4-%E5%AE%9A%E6%97%B6%E5%99%A8%E7%B1%BB.html ## 延时 **说明**:延时设置的值,到达设置的时间后程序继续运行 | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | logout | bool | 是 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | paraTime | object | 是 | 延时持续时间 | {"data":500.0,"secondvalue":0,"value":0,"varname":""} | | paraTime.data | double | 否 | 延时值;取值范围(0,9999];单位 s | 500.0 | | paraTime.value | int | 否 | 变量值(备用) | 0 | | paraTime.secondvalue | int | 否 | 变量值(备用) | 0 | | paraTime.varname | string | 否 | 变量名(使用变量时填) | "" | | type | int | 是 | TIMER 在枚举数列中为7 | 7 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | "" | **命令字**:TIMER **JSON 示例**: ```json { "logout": false, "paraTime": { "data": 500.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 7, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-变量类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/08.%E6%8C%87%E4%BB%A4-%E5%8F%98%E9%87%8F%E7%B1%BB.html --- ## 1. 赋值 (SET) ### 说明 给定义的整型、浮点型、布尔型和字符串变量赋值。字符串追加指令。 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 指令类型,值为 41 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variable | object | 变量;int 类型或 bool 类型或 double 类型或 string 类型变量,全局或局部 | | variableValue | object | 变量值;手填值或 bool 类型或 int 类型或 double 类型变量 | ### variable 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### variableValue 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### 示例 ```json { "logout": false, "type": 41, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GD009" } } ``` --- ## 2. 写入文件 (FORCESET) ### 说明 将缓存的数据存入硬盘。在程序运行过程中,所有的计算、赋值操作均是对缓存中的数值进行更改的,并不会存入系统文件中。若要强制将内存中的全局数值变量写入文件中,则可以使用 FORCESET 指令。 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 指令类型,值为 42 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variable | object | 变量名;int 类型或 bool 类型或 double 类型,全局 | ### variable 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### 示例 ```json { "logout": false, "type": 42, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GI001" } } ``` --- # 指令-坐标系类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/09.%E6%8C%87%E4%BB%A4-%E5%9D%90%E6%A0%87%E7%B3%BB%E7%B1%BB.html --- ## 1. 切换工具手 (SWITCHTOOL) **说明:** 切换工具手,0为无工具手 **指令名:** `SWITCHTOOL` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `_variable` | object | - | 变量类型;手填 int 类型或 int 类型,全局或局部 | | `_variable.data` | float | - | 数据值 | | `_variable.secondvalue` | int | - | 副值 | | `_variable.value` | int | [0, 999] | 工具手编号 | | `_variable.varname` | string | - | 变量名 | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 48 | 切换工具手在枚举数列 type 中为48 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "_variable": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009" }, "logout": false, "type": 48, "userParamInt": 0, "userParamString": "" } ``` --- ## 2. 切换用户坐标 (SWITCHUCOORD) **说明:** 切换用户坐标 **指令名:** `SWITCHUCOORD` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `_variable` | object | - | 变量类型;手填 int 类型或 int 类型,全局或局部 | | `_variable.data` | float | - | 数据值 | | `_variable.secondvalue` | int | - | 副值 | | `_variable.value` | int | [0, 999] | 用户坐标编号 | | `_variable.varname` | string | - | 变量名 | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 49 | 切换用户坐标在枚举数列 type 中为49 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "_variable": { "data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]" }, "logout": false, "type": 49, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. 用户坐标转换 (USERCOORD_TRANS) **说明:** 将 B、C 用户坐标系叠加(×),结果置入 A 用户坐标系 **指令名:** `USERCOORD_TRANS` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `CoordA` | int | [1, 999] | 用户坐标 A;结果存入该用户坐标系,这里是用户坐标系序号 | | `CoordB` | int | [1, 999] | 用户坐标 B | | `CoordC` | int | [1, 999] | 用户坐标 C | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 117 | 用户坐标转换在枚举数列 type 中为117 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "CoordA": 8, "CoordB": 18, "CoordC": 28, "logout": false, "type": 117, "userParamInt": 0, "userParamString": "" } ``` --- ## 4. 切换外部轴 (SWITCHSYNC) **说明:** 在程序运行中切换当前使用的外部轴 **指令名:** `SWITCHSYNC` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `syncgroup` | int | [1, 3] | 要切换到的外部轴的组号 | | `type` | int | 50 | 切换外部轴在枚举数列 type 中为50 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "logout": false, "syncgroup": 2, "type": 50, "userParamInt": 0, "userParamString": "" } ``` --- --- # 指令-网络通讯类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/10.%E6%8C%87%E4%BB%A4-%E7%BD%91%E7%BB%9C%E9%80%9A%E8%AE%AF%E7%B1%BB.html --- ## 发送数据 **说明**:向个网络设备发送字符串信息或者变量值 **指令名**:SENDMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | sendChar | 发送的字符消息 | string | - | | type | 发送数据在枚举数列 type 中为94 | int | 94 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 7, "logout": false, "sendChar": "UUUUUU", "type": 94, "userParamInt": 0, "userParamString": "" } ``` --- ## 解析数据 **说明**:该指令用来解析外部设备传来的一组数据,并将数据存入多个变量 **指令名**:PARSEMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | clearCache | 解析后是否清楚缓存区,0:否,1:是 | int | [0,1] | | dataStorage | 记录提取数据的数量;手填值 int 类型0或 int 类型变量,全局或局部;手填值0表示不记录提取数据的数量 | object | - | | dataVariable | 查询的数据依次存放的首位置;int 类型或 double 类型或 string 类型变量,全局或局部 | object | - | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 解析数据在枚举数列 type 中为96 | int | 96 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 3, "clearCache": 1, "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009" }, "dataVariable": { "data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]" }, "logout": false, "type": 96, "userParamInt": 0, "userParamString": "" } ``` --- ## 读取 **说明**:读取通过以太网或 Modbus 通讯发送点位,并将点位存入到变量 **指令名**:READCOMM | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | commType | 通讯方式,0:ETHERENT 通讯,1:MODBUS 通讯 | int | [0,1] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | m_varname | 点位存放个数;int 类型变量,全局或局部 | string | - | | positionId | 点位存放首个变量;P:点位局部变量,GP:点位全局变量 | string | - | | type | 读取在枚举数列 type 中为110 | int | 110 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 6, "commType": 1, "logout": false, "m_varname": "I001", "positionId": "GP0001", "type": 110, "userParamInt": 0, "userParamString": "" } ``` --- ## 打开数据 **说明**:打开网络通讯 **指令名**:OPENMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 读取在枚举数列 type 中为115 | int | 115 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 5, "logout": false, "type": 115, "userParamInt": 0, "userParamString": "" } ``` --- ## 关闭数据 **说明**:关闭网络通讯 **指令名**:CLOSEMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 关闭数据在枚举数列 type 中为116 | int | 116 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 7, "logout": false, "type": 116, "userParamInt": 0, "userParamString": "" } ``` --- ## 输出字符 **说明**:通过打印提示条的方式输出定义的信息内容 **指令名**:PRINTMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | printChar | 输出字符 | string | - | | printType | 输出信息类型,0:消息,1:警告,2:错误 | int | [0,2] | | type | 输出字符在枚举数列 type 中为120 | int | 120 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "logout": false, "printChar": "阿斯vca", "printType": 2, "type": 120, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取信息连接状态 **说明**:获取网络设置里某个工艺号的连接状态 **指令名**:MSG_CONNECTION_STATUS | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 获取信息连接状态在枚举数列 type 中为95 | int | 95 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | | variable | 状态存入变量名;bool 类型变量,全局或局部 | object | - | **JSON 示例**: ```json { "ID": 5, "logout": false, "type": 95, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[GI001]" } } ``` --- # 指令-位置变量类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/11.%E6%8C%87%E4%BB%A4-%E4%BD%8D%E7%BD%AE%E5%8F%98%E9%87%8F%E7%B1%BB.html --- ## 用户坐标修改 (USERFRAME_SET) **说明**:修改或者读取用户坐标系某一轴的数值 **指令名**:USERFRAME_SET | **ID**:888 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | coord | string | UX、UY、UZ、UA、UB、UC、UCUSTOM(UX、UY、UZ) | 用户坐标参数。UX、UY、UZ、UA、UB、UC:读取用户坐标系某一轴的数值;UCUSTOM(UX、UY、UZ):自定义,括号中为自定义选中的用户坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | m_varName | string | int 或 double 类型变量,全局或局部 | 变量。写入时可手填 int 类型;取值范围[-2000,2000]。写入时:直接手填数值修改坐标轴的数值,变量赋值的形式修改坐标轴的数值。读取时:用变量的形式将选择的坐标轴的数值读取出来 | | mode | int | [0,1] | 修改方式。0:读取用户坐标某一轴的值,1:修改用户坐标某一轴的值 | | type | int | 97 | 用户坐标修改在枚举数列 type 中为97 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varType | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | ### JSON 示例 ```json { "ID": 888, "coord": "UCUSTOM(UX、UY、UZ)", "logout": false, "m_varName": "I001", "mode": 1, "type": 97, "userParamInt": 0, "userParamString": "", "varType": 1 } ``` --- ## 工具坐标修改 (TOOLFRAME_SET) **说明**:修改或者读取工具手某一轴的参数 **指令名**:TOOLFRAME_SET | **ID**:55 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | coord | string | TX、TY、TZ、TA、TB、TC、TCUSTOM(TZ、TA) | 工具坐标参数。TX、TY、TZ、TA、TB、TC:读取工具坐标系某一轴的数值;TCUSTOM(TZ、TA):自定义,括号中为自定义选中的工具坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | m_newValue | string | - | (未在说明中描述) | | m_varName | string | int 或 double 类型变量,全局或局部 | 变量。写入时可手填 int 类型;取值范围[-2000,2000] | | mode | int | [0,1] | 修改方式。0:读取工具坐标某一轴的值,1:修改工具坐标某一轴的值 | | type | int | 98 | 工具坐标修改在枚举数列 type 中为98 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varType | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | ### JSON 示例 ```json { "ID": 55, "coord": "TCUSTOM(TZ、TA)", "logout": false, "m_newValue": "", "m_varName": "I001", "mode": 1, "type": 98, "userParamInt": 0, "userParamString": "", "varType": 1 } ``` --- ## 读取点位 (READPOS) **说明**:将位置变量的某个轴的值读入到浮点型变量 **指令名**:READPOS | **type**:92 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE 变量名 | 位置变量名。当字符串为空时表示当前读取的是机器人当前位置的坐标。P,GP,E,GE:将点位存入变量,读取时只需要选择想要读取的目标变量即可 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 92 | 读取点位在枚举数列 type 中为92 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varname | string | int 类型变量名 | 目标变量名 | ### JSON 示例 ```json { "axis": 1, "coord": "RF", "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 92, "userParamInt": 0, "userParamString": "", "varname": "D001" } ``` --- ## 点位加 (POSADD) **说明**:在不同坐标系下给位置变量的某一个变量轴增加数值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人一轴的正限位是180°,目标点位一轴的坐标是150°,在设置参数是给变量轴一轴赋值50°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位加指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSADD | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位加在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 5, "caltype": 0, "coord": "RF", "datatype": 1, "desData": "GI001", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位减 (POSSUB) **说明**:在不同坐标系下给位置变量的某一个变量轴减少数值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人二轴的负限位是-50°,目标点位二轴的坐标是30°,在设置参数时给变量轴二轴赋值100°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位减指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSSUB | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位减在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 3, "caltype": 1, "coord": "RF", "datatype": 0, "desData": "666", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位改 (POSSET) **说明**:在不同坐标系下将位置变量的某一个变量轴直接修改点位坐标值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人三轴的正限位是100°,在设置参数时给变量轴二轴赋值120°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位改指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSSET | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位改在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 6, "caltype": 2, "coord": "RF", "datatype": 0, "desData": "666", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 复制点位 (COPYPOS) **说明**:将一个位置变量的点位数据复制到另一个位置变量 **注意**:最大支持连接5个外部轴,在复制外部轴点位时只支持 O1、O2、O3、O4、O5轴的复制,如果在设置参数时勾选了 O6、O7轴,在执行复制点位时 O6、O7轴不生效 **指令名**:COPYPOS | **type**:118 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | cpaxles | int[] | 数组,每个元素代表相应轴号 | 选择需要复制的坐标轴数据 | | cpaxletype | int | [0,1] | 表示是否所有坐标轴数据都复制。0:表示所有坐标轴数据都复制,此时没有"cpaxles"节点;1:看"cpaxles"节点选择了什么 | | cpdposname | string | P 或 E,局部或全局 | 目标位置变量名 | | cpdpostype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | cpposname | string | P,GP,E,GE 变量名 | 源位置变量名。当字符串为空时表示当前读取的是机器人当前位置的坐标 | | cppostype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 118 | 复制点位在枚举数列 type 中为118 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "cpaxles": [2, 4, 6], "cpaxletype": 1, "cpdposname": "GE$GI001", "cpdpostype": 1, "cpposname": "P$GI001", "cppostype": 1, "logout": false, "type": 118, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全加 (POSADDALL) **说明**:在不同坐标系下给位置变量的若干个变量轴增加数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSADDALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的增加值 | 轴增加数值。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全加在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 0, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全减 (POSSUBALL) **说明**:在不同坐标系下给位置变量的若干个变量轴减少数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSSUBALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的增加值 | 轴增加数值(负值为减)。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全减在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 1, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全改 (POSSETALL) **说明**:在不同坐标系下给位置变量的若干个变量轴直接修改为指定数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSSETALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的目标值 | 轴目标数值。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全改在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 2, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 轨迹偏移 (TOFFSETON / TOFFSETOFF) ### 轨迹偏移开始 **说明**: - 该指令能够对机器人的运行轨迹进行实时偏移 - 轨迹偏移结束指令后的运动轨迹不再偏移 - 程序的第一条指令不能使用偏移指令 **指令名**:TOFFSETON | **type**:141 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 7个元素,取值范围[-50000,50000] | 轴增加数值。每个元素为每个轴的增加值;可手填也可为 int 或 double 变量类型,全局或局部 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 7个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | tool | int | [-1,999] | 工具手。-1:不使用;0:当前;1-999:对应的工具手 | | type | int | 141 | 轨迹偏移开始在枚举数列 type 中为141 | | user | int | [-1,999] | 用户。-1:不使用;0:当前;1-999:对应的用户 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I001", "I002", "I003", "I004", "I005", "I006", "I007"], "coord": "TF", "datatype": [1, 1, 1, 1, 1, 1, 1], "logout": false, "tool": 666, "type": 141, "user": -1, "userParamInt": 0, "userParamString": "" } ``` --- ### 轨迹偏移结束 **指令名**:TOFFSETOFF | **type**:142 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 142 | 轨迹偏移结束在枚举数列 type 中为142 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 142, "userParamInt": 0, "userParamString": "" } ``` --- ## 读取点位信息 (READPOSMSG) **说明**:将目标位置的工具号、用户坐标号、坐标系、姿态角度/弧度、形态信息的值读入到一个整型变量 **指令名**:READPOSMSG | **type**:175 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | message | int | [0,4] | 信息读取值。0:工具号;1:用户坐标号;2:坐标系;3:姿态角度/弧度;4:形态 | | positionId | string | - | 位置变量 ID | | type | int | 175 | 读取点位信息在枚举数列 type 中为175 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varName | string | int 类型变量名 | 目标变量名 | | varType | int | - | 变量类型 | ### message 参数详细说明 | 值 | 说明 | |----|------| | 0 | 工具号:读取目标变量的工具手编号 | | 1 | 用户坐标号:读取目标变量的用户坐标编号 | | 2 | 坐标系["0"关节坐标,"1"直角坐标,"2"工具坐标,"3"用户坐标] | | 3 | 姿态角度/弧度:读取目标位置姿态轴的姿态值 | | 4 | 形态:读取目标点位的形态值 | ### JSON 示例 ```json { "logout": false, "message": 4, "positionId": "GP0001", "type": 175, "userParamInt": 0, "userParamString": "", "varName": "I001", "varType": 0 } ``` --- ## 点位拉伸 (POS_STRETCH) **说明**:通过设置起点和终点的偏移量来拉伸或者缩短轨迹的长度和圆弧的轨迹形状 **指令名**:POS_STRETCH | **type**:177 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | position1Id | string | P、GP | 拉伸轨迹的起始点 | | position1OutId | string | P、GP | 输出起点位置,偏移的起点位置 | | position2Id | string | P、GP | 圆弧轨迹中间点 | | position2OutId | string | P、GP | 将偏移后的终点点位存入到选择的位置变量 | | position3Id | string | P、GP | 拉伸轨迹的终点 | | stretchL1 | double | [-10000,10000] | 设置偏移量,改变轨迹起始点的点位 | | stretchL2 | double | [-10000,10000] | 设置偏移量,改变轨迹终点的点位 | | stretchType | int | [0,1] | 拉伸类型。0:直线;1:曲线 | | type | int | 177 | 点位拉伸在枚举数列 type 中为177 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "position1Id": "GP0001", "position1OutId": "GP0006", "position2Id": "GP0002", "position2OutId": "GP0007", "position3Id": "GP0003", "stretchL1": 4.0, "stretchL2": 5.0, "stretchType": 1, "type": 177, "userParamInt": 0, "userParamString": "" } ``` --- ## 设置点位信息 (SETPOSMSG) **说明**:通过设置起点和终点的偏移量来拉伸或者缩短轨迹的长度和圆弧的轨迹形状 **指令名**:SETPOSMSG | **type**:207 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posData | string[] | 5个元素 | 位置数据数组。元素1:坐标系(0-3);元素2:姿态(0-角度/1-弧度);元素3:形态参数(0-8);元素4:工具编号(0-999);元素5:用户编号(0-999) | | posDataType | int[] | 5个元素 | 表示"posData"节点的各个元素是否使用。1:使用;2:不使用 | | posidname | string | P、GP、E、GE | 位置标量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 207 | 设置点位信息在枚举数列 type 中为207 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### posData 数组元素说明 | 索引 | 内容 | 取值范围 | 说明 | |------|------|----------|------| | 0 | 坐标系 | [0,3] | "0"关节坐标,"1"直角坐标,"2"工具坐标,"3"用户坐标 | | 1 | 姿态 | [0,1] | 0:角度;1:弧度 | | 2 | 形态参数 | [0,8] | 设置目标位置的形态参数 | | 3 | 工具编号 | [0,999] | 设置目标位置的工具编号。"0"表示无工具手 | | 4 | 用户编号 | [0,999] | 设置目标位置的用户编号。"0"表示无用户 | ### JSON 示例 ```json { "logout": false, "posData": ["GI002", "GI003", "I004", "GI005", "GI006"], "posDataType": [1, 1, 1, 1, 1], "posidname": "GP$GI001", "posidtype": 1, "type": 207, "userParamInt": 0, "userParamString": "" } ``` --- ## 计算目标形态值 (SOLVE_CONFIGURATION) **说明**:机器人从 A 点(当前实际位置)运动到 B 点时,可以计算出机器人能以多少种形态从 A 到 B **指令名**:SOLVE_CONFIGURATION | **type**:232 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P、GP、E、GE | 目标点。可以选择的位置变量类型 | | type | int | 232 | 计算目标形态值在枚举数列 type 中为232 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varName | object | INT 或 GINT 变量 | 形态值首个变量。将计算出来的形态值存入到选择的目标变量,通过选择的首变量顺延保存计算出来的形态 | | varNumber | object | INT 或 GINT 变量 | 形态值个数。将计算出来的形态值个数存入到选择的目标变量 | ### JSON 示例 ```json { "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 232, "userParamInt": 0, "userParamString": "", "varName": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "varNumber": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"} } ``` --- # 指令-程序控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/12.%E6%8C%87%E4%BB%A4-%E7%A8%8B%E5%BA%8F%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 开启线程 **说明**:开启全局后台或者局部后台任务 **指令名**:PTHREAD_START **type 值**:90 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 后台任务程序文件名 | | localOrGlobal | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "localOrGlobal": 0, "logout": false, "type": 90, "userParamInt": 0, "userParamString": "" } ``` --- ## 退出线程 **说明**:关闭已经开启的后台任务 **指令名**:PTHREAD_END **type 值**:91 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 后台任务程序文件名 | | localOrGlobal | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "localOrGlobal": 0, "logout": false, "type": 91, "userParamInt": 0, "userParamString": "" } ``` --- ## 暂停运行 **说明**:暂停主程序和局部后台程序运行 **指令名**:PAUSERUN **type 值**:111 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 当选取局部后台类型时选择的程序名 | | programtype | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "programtype": 2, "logout": false, "type": 111, "userParamInt": 0, "userParamString": "" } ``` --- ## 继续运行 **说明**:继续运行已暂停的主程序或者局部后台程序 **指令名**:CONTINUERUN **type 值**:112 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 当选取局部后台类型时选择的程序名 | | programtype | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "programtype": 2, "logout": false, "type": 112, "userParamInt": 0, "userParamString": "" } ``` --- ## 停止运行 **说明**:停止正在运行的程序,程序运行到停止运行指令时伺服下电 **指令名**:STOPRUN **type 值**:113 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "logout": false, "type": 113, "userParamInt": 0, "userParamString": "" } ``` --- ## 重新运行 **说明**:停止正在运行的程序,程序运行到停止运行指令时伺服下电 **指令名**:RESTRATRUN **type 值**:117 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "logout": false, "type": 117, "userParamInt": 0, "userParamString": "" } ``` --- ## 弹窗指令 **说明**:运行指令时弹出所填写的提示内容窗口,按钮数量为选项数量,点击按钮会将变量值存入绑定的变量 **指令名**:WINDOW **type 值**:208 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | | count | int | 选项数量,取值范围[0,3] | | text1 | string | 提示内容 | | text2 | string | 选项1内容 | | text3 | string | 选项2内容 | | text4 | string | 选项3内容 | | value1 | int | 选项1对应变量值 | | value2 | int | 选项2对应变量值 | | value3 | int | 选项3对应变量值 | | variable | object | 绑定变量,结构:{data, secondvalue, value, varname} | **variable 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | float | 数据值 | | secondvalue | int | 次要值 | | value | int | 变量值 | | varname | string | 变量名 | **请求示例**: ```json { "logout": false, "type": 208, "userParamInt": 0, "userParamString": "", "count": 3, "text1": "AAAAA", "text2": "1", "text3": "2", "text4": "3", "value1": 1111, "value2": 2222, "value3": 3333, "variable": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` --- ## 线程状态 **说明**:查看当前所执行的线程程序的状态,停止等于1,暂停等于2,运行等于3 **指令名**:PTHREAD_STATE **type 值**:209 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | | jobName | string | 当选取后台类型时选择的程序名 | | localOrGlobal | int | 程序类型:0-局部后台,1-全局后台,2-主程序 | | m_VariableValue | object | 存入变量,结构:{data, secondvalue, value, varname} | **m_VariableValue 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | float | 数据值 | | secondvalue | int | 次要值 | | value | int | 变量值 | | varname | string | 变量名 | **请求示例**: ```json { "logout": false, "type": 209, "userParamInt": 0, "userParamString": "", "jobName": "SFDFF", "localOrGlobal": 0, "m_VariableValue": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` --- # 指令-MODBUS 类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/13.%E6%8C%87%E4%BB%A4-MODBUS%E7%B1%BB.html --- ## MODBUS_OPEN - 打开 Modbus 连接 ### 说明 打开 Modbus 通讯连接 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_OPEN 在枚举数列 type 中为210 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 5, "logout": false, "modType": "Master", "type": 210, "userParamInt": 0, "userParamString": "" } ``` --- ## MODBUS_CLOSE - 关闭 Modbus 连接 ### 说明 断开 Modbus 通讯连接 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_CLOSE 在枚举数列 type 中为211 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 9, "logout": false, "modType": "Master", "type": 211, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## MODBUS_CONNECTION_STATUS - 获取 Modbus 连接状态 ### 说明 将 Modbus 通讯连接的状态存入变量,连接成功该变量值被赋值为1,连接失败选择的该变量被赋值为0 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | 获取 Modbus 连接状态在枚举数列 type 中为212 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 1, "logout": false, "modType": "Master", "type": 212, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[GI001]"} } ``` --- ## MODBUS_READ - Modbus 读状态 ### 说明 读取 Modbus 中对应地址的数值。将获取到的状态存入到变量(bool 类型变量或绑定变量,全局或局部)。 **地址类型说明:** | 地址类型 | 说明 | |----------|------| | 3x | 读取 Modbus 中对应地址的值 | | 4x | 同3x | | 3x-bit | 读取所选地址中所存值得任一 bit 的状态 | | 4x-bit | 同3x-bit | | 0x | 可读可写的设备类型,相当于操作 PLC 的输出点 | | 1x | 只读设备类型,相当于操作 PLC 的输入点 | **地址类型为3X-bit 时从站地址个数范围是[0,16]** **地址类型为3X-bit,存到变量时候的17位为符号位,0表示正数,1表示负数** **读取字符时会将读取到的所有值存入到一个变量,它跟整型、浮点型、布尔型变量不一样,不会根据设置的首地址,读从站地址个数顺延存入其它变量** ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | addressNumber | object | 是 | 读从站地址个数。手填或者 int 类型变量或绑定变量,全局或局部。读取的地址个数,如果设置的读从站地址个数为3,执行读指令后会从 Modbus 首地址开始读取3个地址(包含首地址一共读3个) | | addressType | string | 是 | 地址类型。可选取值:3x,4x,3x-bit,4x-bit,0x,1x | | dataType | string | 是 | 数据类型。当数据存放的首个变量选 I 或 GI 时,从站的数据类型可选 short 和 ushort(分别对应短整型和无符号短整型,前者范围为[-32768,32767],后者的范围为[0,65535])。数据存放首个变量选 I 或 GI 数据类型时需要和从站的数据类型一致,否则可能导致数据出错 | | dataVariable | object | 是 | 数据存放的首个变量。所有变量或绑定变量都可。将读取到的参数存放到变量,如果选择的首个变量为 I001,读取的地址个数为3,执行读指令会把参数值依次存入到 I001、I002、I003 | | firstAddress | object | 是 | 从站寄存器首地址。手填或 int 类型变量或绑定变量,全局或局部。根据指令参数里面设置的首地址读取参数值,如果参数里面设置的首地址是5,在执行读指令后会从 Modbus 第5个地址开始读 | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_READ 在枚举数列 type 中为213 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 3, "addressNumber": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "addressType": "4x-bit", "dataType": "short", "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[GI001]"}, "firstAddress": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "modType": "Master", "type": 213, "userParamInt": 0, "userParamString": "" } ``` --- ## MODBUS_WRITE - Modbus 写操作 ### 说明 该指令用于通过 Modbus 将变量写入从站寄存器中对应位置的地址中 **地址类型说明:** | 地址类型 | 说明 | |----------|------| | 4x | 将变量里的值写入地址码 | | 4x-bit | 将变量组成16位二进制码写入地址码中 | | 0x | 将变量值写入地址码,只有"0","1"两种状态,变量有值的话写入1,变量没值写入0 | ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | addressNumber | object | 是 | 读从站地址个数。手填或者 int 类型变量或绑定变量,全局或局部。读取的地址个数,如果设置的读从站地址个数为3,执行读指令后会从 Modbus 首地址开始读取3个地址(包含首地址一共读3个) | | addressType | string | 是 | 地址类型。可选取值:4x,4x-bit,0x | | dataVariable | object | 是 | 数据存放的首个变量,写入的变量类型。手填或者所有变量或绑定变量都可 | | firstAddress | object | 是 | 从站寄存器首地址。手填或 int 类型变量或绑定变量,全局或局部。开始写入的第一个地址,如果首地址为5,执行写指令会从 modbus 第5个地址开始写入 | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_WRITE 在枚举数列 type 中为214 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 5, "addressNumber": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "addressType": "0x", "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "firstAddress": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "logout": false, "modType": "Master", "type": 214, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-FINSTCP 类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/14.%E6%8C%87%E4%BB%A4-FINSTCP%E7%B1%BB.html ## 1. 打开 FINSTCP 连接 **指令名**: FINSTCP_OPEN **说明**: 用于在运行模式下打开 FINSTCP 通讯连接 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 215 | 打开 FINSTCP 连接在枚举数列 type 中为210 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量对象,包含 data、secondvalue、value、varname 等属性 | ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 215, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ``` --- ## 2. 断开 FINSTCP 连接 **指令名**: FINSTCP_CLOSE **说明**: 在运行模式下断开 FINSTCP 通讯连接 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 216 | FINSTCP_CLOSE 在枚举数列 type 中为216 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 9, "logout": false, "type": 216, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. FINSTCP 连接状态 **指令名**: FINSTCP_CONNECTION_STATUS **说明**: 在运行模式下获取 FINSTCP 连接状态 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 217 | FINSTCP_CONNECTION_STATUS 在枚举数列 type 中为217 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量对象 | ### variable 对象 | 参数名 | 类型 | 说明 | |--------|------|------| | data | float | 数据值 | | secondvalue | int | 第二个值 | | value | int | 状态值;6表示连接 | | varname | string | 变量名,如"GB[I001]" | ### 返回值说明 FINSTCP 的连接状态;bool 类型变量或绑定变量,全局或局部 - `true`:连接 - `false`:未连接 ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 217, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]" } } ``` --- # 指令-码垛控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/15.%E6%8C%87%E4%BB%A4-%E7%A0%81%E5%9E%9B%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 1. 码垛开始 (PALON) **说明**:码垛开始的判断,可通过修改变量控制码第几层第几个工件。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | STACKTYPE | int | 码垛类型,取值范围[0,1]
0:码垛
1:卸垛 | | _pCurrentLayersNum | 变量对象 | 当前层码垛数;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _pLayersNum | 变量对象 | 当前码垛层;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _pWorkpieceSum | 变量对象 | 当前已码总数;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _stackSequence | int | 单层码垛/卸垛顺序,取值范围[0,1]
0:正序
1:倒序 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALON 在枚举数列 type 中为70 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 1, "STACKTYPE": 0, "_pCurrentLayersNum": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "_pLayersNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "_pWorkpieceSum": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "[-]"}, "_stackSequence": 1, "logout": false, "type": 70, "userParamInt": 0, "userParamString": "" } ``` --- ## 2. 切换抓手 (PALGRIPPER) **说明**:选取抓手。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | tool | int | 抓手编号,取值范围[1,4] | | type | int | PALGRIPPER 在枚举数列 type 中为71 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "logout": false, "tool": 3, "type": 71, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. 码垛入口点 (PLAENTER) **说明**:选取抓手,码垛入口点。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | Posture | int | 姿态,取值范围[0,2]
0:关闭
1:手动写入
自动计算姿态 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | para_posture_ | 变量对象 | 姿态手动写入值;int 类型或 double 类型变量或绑定变量,全局或局部 | | type | int | PLAENTER 在枚举数列 type 中为73 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | xyOpt | int | 优化 XY 轴运动路径,取值范围[0,1]
0:关闭
1:打开 | | zOpt | int | 优化 Z 轴运动路径,取值范围[0,1]
0:关闭
1:打开
优化 Z 轴运动路径,需在码垛前插入一个固定点 | ### 示例 ```json { "ID": 1, "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaV": {"data": 300.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": ""}, "Posture": 1, "logout": false, "moveType": "MovC", "para_posture_": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI005"}, "type": 73, "offsetAxis": 2, "userParamInt": 0, "userParamString": "", "xyOpt": 1, "zOpt": 1 } ``` --- ## 4. 码垛辅助点 (PALSHIFT) **说明**:码垛辅助点。 **高度规则说明**: - 当入口点高度比固定点低时,入口点在高度上会和固定点、辅助点处于同一值线上(侧视同一直线,俯视不是同一直线,XY 轴不变) - 当入口点高度位于固定点与辅助点之间时,入口点高度不变 - 当入口点高度位于固定点、辅助点之上时,入口点高度将优化到与固定点水平的高度 - 当入口点、辅助点高度都高于固定点时,入口点高度将优化到与辅助点水平高度 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | type | int | PALSHIFT 在枚举数列 type 中为74 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 4, "varname": "GI001"}, "logout": false, "moveType": "MovArch", "type": 74, "offsetAxis": 2, "userParamInt": 0, "userParamString": "" } ``` --- ## 5. 码垛接近点 (PALAPPRO) **说明**:码垛接近点是辅助点和工件点之间的过渡点,也是接近方式要走到的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | type | int | PALAPPRO 在枚举数列 type 中为76 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 2, "varname": "D[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "I001"}, "moveType": "MovL", "type": 76, "offsetAxis": 2, "userParamInt": 0, "userParamString": "" } ``` --- ## 6. 码垛工件点 (PALREAL) **说明**:码垛工件所在的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | type | int | PALREAL 在枚举数列 type 中为75 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 4, "varname": "GI001"}, "logout": false, "moveType": "MovArch", "offsetAxis": 2, "type": 75, "userParamInt": 0, "userParamString": "" } ``` --- ## 7. 码垛复位 (PALCLEAR) **说明**:码垛开始后的数据初始化。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALCLEAR 在枚举数列 type 中为77 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "logout": false, "type": 77, "userParamInt": 0, "userParamString": "" } ``` --- ## 8. 码垛结束判断 (PALOFF) **说明**:判断码垛是否结束。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | _pPalOffvarName | 变量对象 | 结束判断变量;bool 类型变量或绑定变量,全局或局部
true:结束
false:未结束 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALOFF 在枚举数列 type 中为78 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "_pPalOffvarName": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]"}, "logout": false, "type": 78, "userParamInt": 0, "userParamString": "" } ``` --- ## 9. 获取工件点位 (PAL_POS) **说明**:获取指定工件的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | PalPOS_pointType | int | 获取点位类型,取值范围[0,2]
0:入口点
1:辅助点
2:工件点 | | _pLayNum | 变量对象 | 工件所在层;手填值或 int 类型变量或绑定变量 | | _pSerialNum | 变量对象 | 工件编号;手填值或 int 类型变量或绑定变量 | | _pTecNUM | 变量对象 | 码垛工艺号;手填值或 int 类型变量或绑定变量;取值范围[1,99] | | getPointPosPos | int | m_getPointPosname 节点绑定的变量类型,取值范围[1,2]
1:位置变量名固定,如:P0001、G001
2:位置变量名不固定,如:P$I001、P$GI001、G$I001、G$GI001 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | m_getPointPosname | string | 节点绑定的变量名 | | tool | int | 工具编号 | | type | int | PAL_POS 在枚举数列 type 中为221 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "PalPOS_pointType": 2, "_pLayNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "_pSerialNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "_pTecNUM": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "getPointPosPos": 2, "logout": false, "m_getPointPosname": "GP$GI001", "tool": 0, "type": 221, "userParamInt": 0, "userParamString": "" } ``` --- ## 10. 简易码垛 (PALSIMPLESET) **说明**:简易码垛。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | _pTecNUM | 变量对象 | 码垛参数存放的工艺号;手填值或 int 类型,变量或绑定变量,全局或局部;取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | m_numVariableType | int 数组 | 行数、列数、层数是否为绑定变量;取值范围[0,1]
0:手填值或变量
1:绑定变量 | | m_pointVariableType | int 数组 | 变量类型,取值范围[1,3]
目前只有第二位到第七位使用
第一位:无
第二位:起始工件点
第三位:列末点
第四位:行末端
第五位:高末端
第六位:辅助点
第七位:入口点
1:位置变量名固定,如:P0001、G001
2:位置变量名不固定,如:P$I001、P$GI001、G$I001、G$GI001
3:不使用 | | pointVariableName | string 数组 | 点位变量名数组
第二位:起始工件点
第三位:列末端
第四位:行末端
第五位:高末端
第六位:辅助点
第七位:入口点
目前只有第二位到第七位使用 | | type | int | 简易码垛在枚举数列 type 中为222 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variableData | string 数组 | 绑定变量数据 | ### 示例 ```json { "_pTecNUM": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "m_numVariableType": [0, 1, 0], "m_pointVariableType": [0, 1, 1, 2, 2, 2, 2, 0, 0, 0], "pointVariableName": ["[-]", "GP0001", "GP0002", "GP$I001", "P$I001", "GP$I003", "P$GI003", "[-]", "[-]", "[-]"], "type": 222, "userParamInt": 0, "userParamString": "", "variableData": ["GI003", "GI[I004]", "GI005"] } ``` --- # 指令-焊接控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/16.%E6%8C%87%E4%BB%A4-%E7%84%8A%E6%8E%A5%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 焊接开始 **说明:** 该指令可执行起弧操作。选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。焊接开始要和焊接结束一起使用。 **指令名:** ARCON **type:** 23 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anamorphismFlag | int | [0,1] | 使用起弧渐变标志;0:不使用,1:使用 | | arconUseAbled | int | [0,2] | 使用起弧参数标志;0:不使用临时参数,1:使用,2:不使用 | | generatingOfArcAgainFlag | int | [0,1] | 再起弧标志;0:不使用,1:使用 | | generatingOfArcCurrent | double | [0-1000]A | 起弧电流;99999.0:不使用临时变量,使用工艺配置参数 | | generatingOfArcTime | double | [0-5]s | 起弧时间;99999.0:不使用临时变量,使用工艺配置参数 | | generatingOfArcVoltage | double | [-1000,1000]V | 起弧电压;99999.0:不使用临时变量,使用工艺配置参数 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | startUpAgainFlag | int | [0,1] | 使用再启动标志;0:不使用,1:使用 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的焊接参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldCurrent | double | [0-1000]A | 焊接电流 | | weldVoltage | double | - | 焊接电压 | **JSON 示例:** ```json { "anamorphismFlag": 1, "arconUseAbled": 1, "generatingOfArcAgainFlag": 1, "generatingOfArcCurrent": 3.0, "generatingOfArcTime": 2.0, "generatingOfArcVoltage": 36.0, "logout": false, "startUpAgainFlag": 1, "type": 23, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "weldCurrent": 89.0, "weldVoltage": 78.0 } ``` --- ## ARCOFF 焊接结束 **说明:** 该指令可执行灭弧操作,选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。焊接开始要和焊接结束一起使用。 **指令名:** ARCOFF **type:** 24 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcoffUseAbled | int | [0,2] | 使用收弧参数标志;0:不使用临时参数,1:使用,2:不使用 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | quenchingAnamorphismFlag | int | [0,2] | 使用收弧渐变;0:不使用临时参数,1:使用,2:不使用 | | quenchingOfArcCurrent | double | [0,1000]A | 收弧电流 | | quenchingOfArcTime | double | [0,5]s | 收弧时间 | | quenchingOfArcVoltage | double | [-1000,1000]V | 收弧电压 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 要使用的焊接参数工艺号 | **JSON 示例:** ```json { "arcoffUseAbled": 1, "logout": false, "quenchingAnamorphismFlag": 1, "quenchingOfArcCurrent": 2.0, "quenchingOfArcTime": 3.0, "quenchingOfArcVoltage": 1.0, "type": 24, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## ARCSET 焊接设置 **说明:** 该指令可以设置焊接时的电流电压。 **指令名:** ARCSET **type:** 25 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcsetRamp | int | [0,1] | 渐变方式;0:不使用,1:时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的焊接参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldSetCurrent | object | [0,1000]A | 设置焊接电流;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSetRampTime | object | [0,100000]ms | 渐变时间;int 类型手填值或变量,全局或局部 | | weldSetVoltage | object | - | 设置焊接电压 | **JSON 示例:** ```json { "arcsetRamp": 1, "logout": false, "type": 25, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "weldSetCurrent": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "weldSetRampTime": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI001"}, "weldSetVoltage": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## WVON 摆焊开始 **说明:** 该指令执行时开始摆焊,执行该指令前请先运行焊接开始 ARCON 指令。不使用临时参数时,date 应设为99999。 **指令名:** WVON **type:** 26 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的摆焊参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldLeftDwellTime | object | [0,15]s | 左停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldRightDwellTime | object | [0,15]s | 右停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingAmplitude | object | (0,50]mm | 摆动幅度;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingFrequency | object | (0,20]HZ | 摆动频率;double 类型手填值,double 类型或 int 类型变量,全局或局部 | **JSON 示例:** ```json { "logout": false, "type": 26, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006"}, "weldLeftDwellTime": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "weldRightDwellTime": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[I001]"}, "weldSwingAmplitude": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "weldSwingFrequency": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GD001"} } ``` --- ## WVOFF 摆焊结束 **说明:** 该指令执行时结束摆焊。 **指令名:** WVOFF **type:** 27 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 27, "userParamInt": 0, "userParamString": "" } ``` --- ## WVSET 摆焊设置 **说明:** 该指令可执行灭弧操作,选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。 **指令名:** WVSET **type:** 28 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的摆焊参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldLeftDwellTime | object | [0,15]s | 左停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldRightDwellTime | object | [0,15]s | 右停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingAmplitude | object | (0,50]mm | 摆动幅度;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingFrequency | object | (0,20]HZ | 摆动频率;double 类型手填值,double 类型或 int 类型变量,全局或局部 | **JSON 示例:** ```json { "logout": false, "type": 28, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "weldLeftDwellTime": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D009"}, "weldRightDwellTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "weldSwingAmplitude": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009"}, "weldSwingFrequency": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"} } ``` --- ## CIL 相贯线 **说明:** 相贯线指令方式与 MOVC 相似。 **指令名:** CIL **type:** 29 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1,100]% | 加速度变量;double 类型 | | ParaDEC | object | [1,100]% | 减速度变量;double 类型 | | ParaPL | object | [0,5] | 平滑变量;double 类型 | | ParaTIME | object | 自然数 | 提前执行时间变量;double 类型 | | ParaV | object | [1,1000]mm/s | 速度变量;double 类型;m_vUnit:0=cm/s 1=mm/s 2=百分比 | | RobotPos | object | - | 点位信息;当使用绑定变量点位时,不使用该节点 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | para | int | [0,3] | ID | | posidtype | int | 0/1 | 点位是否为绑定变量;1:绑定变量,0:非绑定变量 | | positionId | string | - | 非绑定变量时的点位名 | | posidname | string | - | 绑定变量时的点位名 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[GI001]"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "D001"}, "RobotPos": { "ctype": 1, "data": [2.0, 1.0, 8.0, 0.0, 0.0, 0.0, 0.0, 490.0, 0.0, 647.0, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 490.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 647.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "logout": false, "para": 2, "polish": 0, "type": 29, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## TIGWELDON 鱼鳞焊开始 **说明:** 执行该指令开始鱼鳞焊轨迹,执行该指令前请先运行焊接开始 ARCON 指令。 **指令名:** TIGWELDON **type:** 66 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | headTailType | int | [0,3] | 首位段;0:首尾段焊接优化空走距离,1:首尾段空走优化空走距离,2:首段焊接,3:首段空走 | | l1 | double | [0.01,9999] | 焊接距离;typeOFTIG 节点值为2时需要此节点 | | l1speed | double | [1,200]% | 焊接速度;typeOFTIG 节点值为2时需要此节点 | | l2 | double | [0.01,9999]mm | 空走距离 | | l2speed | double | [1,1000]% | 空走速度 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | timeOFTIG | double | [0.01,6]s | 点焊时间;typeOFTIG 节点值为1时需要此节点 | | typeOFTIG | int | [0,1] | 参数类型;1:点焊时间,2:焊接距离 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "headTailType": 2, "l1": 5.0, "l1speed": 6.0, "l2": 200.0, "l2speed": 569.0, "logout": false, "timeOFTIG": 6.0, "type": 66, "typeOFTIG": 1, "userParamInt": 0, "userParamString": "" } ``` --- ## TIGWELDOFF 鱼鳞焊结束 **说明:** 执行该指令后结束鱼鳞焊轨迹。 **指令名:** TIGWELDOFF **type:** 67 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 67, "userParamInt": 0, "userParamString": "" } ``` --- ## FEEDWIRE 送丝 **说明:** 执行该指令可在参数时间内打开送丝信号。 **指令名:** FEEDWIRE **type:** 69 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | feedtime | double | (0,10]s | 送丝时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "feedtime": 9.0, "logout": false, "type": 69, "userParamInt": 0, "userParamString": "" } ``` --- ## ARCBUILTIN 焊机内置工艺 **说明:** 该指令目前可配合奥太焊机使用。 **指令名:** ARCBUILTIN **type:** 172 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | 焊机内置工艺号 | | Value | array | [-999999,999999] | 参数 A-E;元素分别为$builtin_a 调用、$builtin_b 调用、$builtin_c 调用、$builtin_d 调用、$builtin_e 调用 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "ID": 6, "Value": [369.0, 239.0, 896.0, 456.0, 789.0], "logout": false, "type": 172, "userParamInt": 0, "userParamString": "" } ``` --- ## REFP 摆焊参考点 **说明:** 焊机内置工艺。 **指令名:** REFP **type:** 178 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | RobotPos | object | - | 点位信息;当使用绑定变量点位时,不使用该节点 | | autoCorrection | int | [0,1] | 摆焊轨迹自动修正使能;0:否,1:是 | | correctionSpeed | double | [2,9999]mm/s | 摆焊轨迹自动修正速度 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | positionId | string | - | 参考点变量名;字符串以 P 开头 | | refpPointNum | int | [1,2] | 参考点 | | startUpAgainFlag | int | - | 再启动标志 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "RobotPos": { "ctype": 1, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 490.0, 0.0, 647.0, 3.14160, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0002", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 490.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 647.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.14160, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "autoCorrection": 1, "correctionSpeed": 869.0, "logout": false, "positionId": "P0002", "refpPointNum": 1, "startUpAgainFlag": 0, "type": 178, "userParamInt": 0, "userParamString": "" } ``` --- ## SPOTWELD 点焊 **说明:** 该指令执行时机器人开始执行点焊操作。 **指令名:** SPOTWELD **type:** 179 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcParameterId | int | [1,99] | 焊接参数标号 | | feedtime | double | (0,1000]s | 焊接时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "arcParameterId": 17, "feedtime": 200.0, "logout": false, "type": 179, "userParamInt": 0, "userParamString": "" } ``` --- ## MP_OFFSET_ON 多层多道焊偏转开始 **说明:** 多层多道焊偏转开始。 **指令名:** MP_OFFSET_ON **type:** 245 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | craft_number | object | [1,999] | 工艺号;手填 int 类型,int 类型变量或绑定变量,全局或局部 | | head_indent | object | [-1000,1000] | 头部缩进;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | head_multi_indent | object | [0,1] | 头部倍数缩进使能;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:不生效,1:生效 | | left_right_offset | object | [-1000,1000] | 左右偏移;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | offset_pass | object | [0,99] | 偏移焊道号;int 类型手填值,全局或局部 int 类型变量或绑定变量 | | push_angle | object | [-1000,1000] | 推角;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | tail_indent | object | [-1000,1000] | 尾部缩进;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | tail_multi_indent | object | [0,1] | 尾部倍数缩进使能;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:不生效,1:生效 | | tilt_angle | object | [-1000,1000] | 倾斜角;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | trace_data | object | [1,9] | 跟踪路径数据;int 类型手填值,全局或局部 int 类型变量或绑定变量;0:表示不使用 | | up_down_offset | object | [-1000,1000] | 高低偏移;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | weld_dir | object | [0,1] | 焊接方向;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:正方向,1:负方向 | **JSON 示例:** ```json { "craft_number": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI003"}, "head_indent": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "head_multi_indent": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GB[I001]"}, "left_right_offset": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "logout": false, "offset_pass": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "offset_weld_count": {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, "push_angle": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005"}, "tail_indent": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "tail_multi_indent": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GB[GI006]"}, "tilt_angle": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006"}, "trace_data": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "type": 245, "up_down_offset": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004"}, "use_temp": 1, "userParamInt": 0, "userParamString": "", "weld_dir": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "B007"} } ``` --- ## MP_OFFSET_OFF 多层多道焊偏移结束 **说明:** 点焊。 **指令名:** MP_OFFSET_OFF **type:** 246 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 246, "userParamInt": 0, "userParamString": "" } ``` --- ## GET_OFFSET_WELD_COUNT 获取偏转焊道数 **说明:** 点焊。 **指令名:** GET_OFFSET_WELD_COUNT **type:** 252 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | craft_number | object | - | 工艺号 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | offset_weld_count | object | - | 偏转焊道数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "craft_number": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI009"}, "logout": false, "offset_weld_count": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "type": 252, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-视觉命令类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/17.%E6%8C%87%E4%BB%A4-%E8%A7%86%E8%A7%89%E5%91%BD%E4%BB%A4%E7%B1%BB.html ## 视觉开始 **说明**:执行视觉开始指令后控制器与相机连接 **指令名**:VISION_RUN | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_RUN 在枚举数列 type 中为79 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 14, "logout": false, "type": 79, "userParamInt": 0, "userParamString": "" } ``` --- ## 视觉触发 **说明**:执行视觉触发指令后等待视觉服务器的返回值(发送的位置数据),获取到位置数据后继续运行下一条指令 **指令名**:VISION_TRG | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_TRG 在枚举数列 type 中为80 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 23, "logout": false, "type": 80, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉位置个数 **说明**:记录相机发送的点位个数,将点位个数存入到选择的变量 **指令名**:VISION_POSNUM | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | M_STRPOSNUM | object | 是 | 全局数值变量,全局 int 变量或绑定变量,取值范围[1,990] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_POSNUM 在枚举数列 type 中为81 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **M_STRPOSNUM 结构**: ```json {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"} ``` **JSON 示例**: ```json { "ID": 31, "M_STRPOSNUM": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "type": 81, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉位置 **说明**:执行此条指令可以将相机发送的点位信息存入到变量 **指令名**:VISION_POS | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | dataVariable | object | 是 | 附加数值首个变量,全局 int 变量或绑定变量,取值范围[1,990] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidname | string | 否 | 点位变量名称,如"GP$GI001" | | posidtype | int | 否 | posidname 节点是绑定点位还是点位:0=点位;1=绑定点位 | | type | int | 是 | VISION_POS 在枚举数列 type 中为82 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **dataVariable 结构**: ```json {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[I001]"} ``` **JSON 示例**: ```json { "ID": 38, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[I001]"}, "logout": false, "posidname": "GP$GI001", "posidtype": 1, "type": 82, "userParamInt": 0, "userParamString": "" } ``` --- ## 清除视觉位置信息 **说明**:清除当前工艺号里相机发送的点位信息 **指令名**:VISION_CLEAR | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_CLEAR 在枚举数列 type 中为83 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 17, "logout": false, "type": 83, "userParamInt": 0, "userParamString": "" } ``` --- ## 视觉结束 **说明**:结束视觉工艺,控制器与相机断开连接 **指令名**:VISION_END | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_END 在枚举数列 type 中为84 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 1, "logout": false, "type": 84, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉轨迹位置 **说明**:当相机发送的数据为多个点位时可选择不同点位存储方式运行轨迹 **指令名**:VISION_TRACE | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | M_POINTSTORAGENUM | object | 是 | 点位存放数,int 类型全局或局部变量或绑定变量 | | dataVariable | object | 否 | 附加数据首个变量,int/double/string 类型全局或局部变量或绑定变量;不使用时为`{"data":0.0,"secondvalue":0,"value":0,"varname":""}` | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | pointStoragePosType | int | 是 | 点位存放位置:0=外部点队列;1=变量 | | posidname | string | 是 | 点位存放的首个变量,全局或局部点位变量或绑定变量 | | posidtype | int | 是 | posidname 节点是绑定点位还是点位:0=点位;1=绑定点位 | | type | int | 是 | VISION_TRACE 在枚举数列 type 中为236 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 17, "M_POINTSTORAGENUM": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[GI001]"}, "logout": false, "pointStoragePosType": 1, "posidname": "P$GI001", "posidtype": 1, "type": 236, "userParamInt": 0, "userParamString": "" } ``` --- ## 飞拍开始 **说明**:机器人工具手运动经过拍照点时,快速触发相机拍照,在拍照过程中物体或相机处于运动状态 **指令名**:ONFLY_INIT | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | Delay | object | 是 | 记录坐标延时,全局或局部 double 类型手填值或 int/double 类型变量或绑定变量,取值范围[0,1000] | | axisNum | object | 否 | 轴,string 类型手填值或 int 类型全局或局部变量或绑定变量 | | _posIdType | int | 是 | phonePos 节点是点位变量还是绑定点位变量:0=点位变量;1=绑定点位变量 | | IOPort | object | 否 | IO 端口,int 类型或绑定变量类型,取值范围[1,1000] | | IOValue | object | 否 | 端口值,bool 类型手填值或变量或绑定变量 | | cameraTriggerDelayTime | object | 是 | 相机触发延时,double 类型手填值或 int 类型,取值范围[0,1000] | | craftID | object | 是 | 工艺号,int 类型,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | triggerAngleSpacing | object | 否 | 触发角度间隔,double 类型手填值或 int/double 类型全局或局部变量或绑定变量,取值范围[-360,360] | | triggerCount | object | 否 | 触发次数,int 类型手填值或全局或局部绑定变量或变量,取值范围[0,10];不使用时`{"data":0.0,"secondvalue":0,"value":1,"varname":"[-]"}` | | triggerStartPos | object | 否 | 触发起始位置,double 类型手填值或全局或局部 int/double 类型变量或绑定变量 | | phonePos | string | 是 | 拍照点,string 类型,全局或局部 P 点位或 E 点位变量或绑定变量 | | radius | object | 是 | 拍照点范围半径,取值范围[0.001,1000] | | type | int | 是 | ONFLY_INIT 在枚举数列 type 中为239 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | visionCraftID | object | 否 | 视觉工艺号 | ### triggerType=0 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "_posIdType": 1, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "phonePos": "P$GI001", "radius": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "triggerType": 0, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` ### triggerType=1 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "IOPort": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "DIN[I003]"}, "IOValue": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]"}, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "triggerType": 1, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` ### triggerType=2 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "axisNum": {"data": 0.0, "secondvalue": 0, "value": 7, "varname": "J6"}, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "triggerAngleSpacing": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "triggerCount": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "triggerStartPos": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "triggerType": 2, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` --- ## 飞拍结束 **说明**:结束视觉工艺,控制器与相机断开连接 **指令名**:VISION_END | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | craftID | object | 是 | 工艺号,int 类型,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_END 在枚举数列 type 中为240 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "craftID": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"}, "logout": false, "type": 240, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取飞拍打开状态 **说明**:获取飞拍任务是否打开,将获取的状态存入选择的变量 **指令名**:ONFLY_GET_STATUS | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | Result | object | 是 | 结果,全局或局部 bool 变量或局部变量 | | craftID | object | 是 | 工艺号,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | ONFLY_GET_STATUS 在枚举数列 type 中为241 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "Result": {"data": 0.0, "secondvalue": 0, "value": 6, "varname": "GB001"}, "craftID": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "type": 241, "userParamInt": 0, "userParamString": "" } ``` --- ## 飞拍计算工具手 **说明**:飞拍计算工具手作用于机械臂夹持工件时可能出现偏心位置,工件有旋转角。通过计算获取并切换新的工具手之后,工件中心放置到放料位置点,不偏心无旋转 **指令名**:ONFLY_CALC_TOOL | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | craftID | object | 是 | 工艺号,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,99] | | grabTool | object | 是 | 抓取工具手,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,999] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | newTool | object | 是 | 新工具手,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,999] | | type | int | 是 | ONFLY_CALC_TOOL 在枚举数列 type 中为242 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "craftID": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "grabTool": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "logout": false, "newTool": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I006]"}, "type": 242, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-激光类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/18.%E6%8C%87%E4%BB%A4-%E6%BF%80%E5%85%89%E7%B1%BB.html ## 激光开始 - **说明**:激光开始 - **指令名**:LASER_ON - **ID**:5 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | VISION_RUN 在枚举数列 type 中为60 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 60, "userParamInt": 0, "userParamString": "" } ``` --- ## 激光结束 - **说明**:激光结束 - **指令名**:LASER_OFF ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | LASER_OFF 在枚举数列 type 中为61 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 61, "userParamInt": 0, "userParamString": "" } ``` --- ## 切割圆 - **说明**:切割圆 - **指令名**:LASER_CIRCLE - **type**:62 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | ParaACC | object | 加速度;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaDEC | object | 减速度;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaTIME | object | 提前运行时间;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;单位 ms | | ParaV | object | 速度参数 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | margin | double | 补差;取值范围[0,500]mm | | posidname | string | 中心点;P 或 GP 变量或绑定变量 | | posidtype | int | 点位是否为绑定变量;0或1;1:绑定变量,0:非绑定变量 | | radius | double | 半径;取值范围[1,3000]mm | | type | int | LASER_CIRCLE 在枚举数列 type 中为62 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[GI001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "D001"}, "logout": false, "margin": 360.0, "posidname": "GP$I001", "posidtype": 1, "radius": 28.0, "type": 62, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-传送类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/19.%E6%8C%87%E4%BB%A4-%E4%BC%A0%E9%80%81%E7%B1%BB.html --- ## 传送带工件检测开始 **指令名**:CONVEYOR_CHECKPOS **说明**:传送带工件检测开始 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_CHECKPOS 在枚举数列 type 中为107 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 107, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带工件检测结束 **指令名**:CONVEYOR_CHECKEND **说明**:传送带工件检测结束 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_CHECKEND 在枚举数列 type 中为108 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 108, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带跟踪开始 **指令名**:CONVEYOR_ON **说明**:传送带跟踪开始 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | ParaACC | object | 是 | 加速度,double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaV | object | 是 | 速度,double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[2,1000]mm/s | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | m_positionId | string | 否 | 点位,如:"GP0001";当填点位变量时使用,其余时刻为空 | | m_postype | int | 否 | 当点位为工件点时值为1;取值范围[0,1] | | posidname | string | 否 | 点位,如:GP$I001;当填的点位值为点位绑定变量时使用,其余时刻为空 | | posidtype | int | 否 | 点位类型:0=点位类型不为绑定点位变量;1=点位类型为绑定点位变量 | | type | int | 是 | 枚举值,CONVEYOR_ON 在枚举数列 type 中为105 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI007" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "GD003" }, "logout": false, "m_positionId": "", "m_postype": 1, "posidname": "", "posidtype": 0, "type": 105, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带跟踪结束 **指令名**:CONVEYOR_OFF **说明**:传送带跟踪结束 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_OFF 在枚举数列 type 中为106 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 106, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取传送带跟踪位置 **指令名**:CONVEYOR_POS **说明**:获取传送带跟踪位置 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | dataVariable | object | 否 | 视觉附加数据收个变量,int 类型或 double 类型或 string 类型全局或局部或全局变量或绑定变量;不使用时各个值都为空 | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | m_positionId | string | 是 | 全局位置变量,GP 变量;取值范围 GP00001-GP9999 | | type | int | 是 | 枚举值,CONVEYOR_POS 在枚举数列 type 中为176 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "dataVariable": { "data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]" }, "logout": false, "m_positionId": "GP0019", "type": 176, "userParamInt": 0, "userParamString": "" } ``` --- ## 删除传送带跟踪目标 **指令名**:CONVEYOR_CLEAR **说明**:删除传送带跟踪目标 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | removeType | int | 是 | 删除范围:0=全部目标;1=本次目标;取值范围[0,1] | | type | int | 是 | 枚举值,CONVEYOR_CLEAR 在枚举数列 type 中为220 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "removeType": 1, "type": 220, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-喷涂工艺类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/20.%E6%8C%87%E4%BB%A4-%E5%96%B7%E6%B6%82%E5%B7%A5%E8%89%BA%E7%B1%BB.html --- ## 喷涂开始 **指令名:SPRAY_ON** **type 值:122** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | [0, 99] | 模拟量组号 | | atom | double | [0, 10] | 雾化模拟量(V),模拟量组号为0时修改 | | colorID | int | - | 颜色 ID | | flow | double | [0, 10] | 流量模拟量(V),模拟量组号为0时修改 | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | sector | double | [0, 10] | 扇形模拟量(V),模拟量组号为0时修改 | | seqID | int | [1, 99] | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 122 | SPRAY_ON 在枚举序列 type 中为122 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 0, "atom": 6.0, "colorID": 1, "flow": 8.0, "gunID": 2, "logout": false, "point": 1, "sector": 7.0, "seqID": 39, "traID": 1, "type": 122, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂结束 **指令名:SPRAY_OFF** **type 值:123** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | - | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 123 | SPRAY_OFF 在枚举序列 type 中为123 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 1, "colorID": 1, "gunID": 2, "logout": false, "point": 1, "seqID": 1, "traID": 1, "type": 123, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂换色 **指令名:SPRAY_CHANGE** **type 值:124** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | - | 模拟量组号 | | colorID | int | [1, 10] | 颜色 | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | [1, 99] | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 124 | SPRAY_CHANGE 在枚举序列 type 中为124 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 1, "colorID": 9, "gunID": 2, "logout": false, "point": 1, "seqID": 98, "traID": 1, "type": 124, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂轨迹 **指令名:SPRAY_MOVE** **type 值:125** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1, 100]% | 喷涂加速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaDEC | object | [1, 100]% | 喷涂减速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaPL | object | [1, 100]% | 喷涂 PL:int 类型手填值或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2, 1000]mm/s | 喷涂速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | - | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | [1, 99] | 时序组号 | | traID | int | [1, 99] | 轨迹组号 | | type | int | 125 | SPRAY_MOVE 在枚举序列 type 中为125 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D009"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "anaID": 1, "colorID": 1, "gunID": 1, "logout": false, "point": 1, "seqID": 1, "traID": 98, "type": 125, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂起始位置 **指令名:SPRAY_STARTPOS** **type 值:126** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1, 100]% | 喷涂加速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaDEC | object | [1, 100]% | 喷涂减速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaTIME | object | - | 提前执行时间:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2, 1000]mm/s | 喷涂速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | - | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | [0, 1] | 点位姿态:0-绝对标记点,1-仅姿态 | | seqID | int | - | 时序组号 | | traID | int | [1, 99] | 轨迹组号 | | type | int | 126 | SPRAY_STARTPOS 在枚举序列 type 中为126 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 2, "varname": "D[GI001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "anaID": 1, "colorID": 1, "gunID": 1, "logout": false, "point": 1, "seqID": 1, "traID": 98, "type": 126, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-打磨工艺类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/21.%E6%8C%87%E4%BB%A4-%E6%89%93%E7%A3%A8%E5%B7%A5%E8%89%BA%E7%B1%BB.html --- ## 棱边打磨 **指令名:POLISH_EDGE** **说明:** 棱边打磨 **type:** 109(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | ParaACC | double/int | 加速度 | [1,100]% | | ParaAHEAD | double/int | 提前执行,与 aheadtype 有关 | [1,100]% | | ParaDEC | double/int | 减速度 | [1,100]% | | ParaPL | int | 平滑 | [0,5] | | ParaTIME | double/int | 提前执行时间 | - | | ParaV | double/int | 速度 | [1,1000] mm/s | | aheadtype | int | 提前类型 | 0:提前时间;1:提前距离;2:提前进度 | | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polish | int | 打磨次数 | [1,99] | | polishAngle | double | 角度 | [-180,180] 度 | | polishID | int | 打磨工艺号 | [1,99] | | posidname | string | 点位 | P 或 GP 绑定变量 | | posidtype | int | 点位类型 | 0:点位变量;1:点位绑定变量 | | positionId | string | 点位 | 当 posidtype 为 0 时使用 | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "ParaAHEAD": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI008"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "I001"}, "aheadtype": 2, "logout": false, "polish": 89, "polishAngle": 70.0, "polishID": 30, "posidname": "GP$GI001", "posidtype": 1, "positionId": "", "type": 109, "userParamInt": 0, "userParamString": "" } ``` --- ## 打磨继续 **指令名:POLISH_CONTINUE** **说明:** 打磨继续 **type:** 131(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | angle | double | 角度 | [-180,180] 度 | | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polishID | int | 工艺号 | [1,99] | | time | double | 提前执行时间 | - | | times | int | 打磨次数 | [1,99] | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "angle": 99, "logout": false, "polishID": 21, "time": 999, "times": 19, "type": 131, "userParamInt": 0, "userParamString": "" } ``` --- ## 打磨结束 **指令名:POLISH_OFF** **说明:** 打磨结束 **type:** 132(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polishID | int | 工艺号 | [1,99] | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "logout": false, "polishID": 18, "type": 132, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-寻位跟踪类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/22.%E6%8C%87%E4%BB%A4-%E5%AF%BB%E4%BD%8D%E8%B7%9F%E8%B8%AA%E7%B1%BB.html --- ## 激光追踪开始 **说明**:激光追踪开始 **指令名**:LASERTRACK_ON **type 值**:85 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | delay | double | [0,10] | 参数表延时 | | segmentParam | int | [1,99] | 跟踪参数表号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,LASERTRACK_ON 在枚举数列中为 85 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 2, "delay": 4.0, "logout": false, "segmentParam": 3, "type": 85, "userParamInt": 0, "userParamString": "" } ``` --- ## 激光追踪结束 **说明**:激光追踪结束 **指令名**:LASERTRACK_OFF **type 值**:86 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,LASERTRACK_OFF 在枚举数列中为 86 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 2, "logout": false, "type": 86, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位开始 **说明**:寻位开始 **指令名**:SEARCH_START **type 值**:151 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | senseType | int | [0,1] | 传感类型:0=线激光;1=触碰 | | type | int | - | 枚举值,SEARCH_START 在枚举数列中为 151 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 19, "logout": false, "senseType": 1, "type": 151, "userParamInt": 0, "userParamString": "" } ``` --- ## 静态寻位 **说明**:静态寻位 **指令名**:SEARCH_STATIC **type 值**:152 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | delay | double | [0,10] | 参数表延时 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidtype | int | [0,1] | 点位类型:0=点位变量;1=点位绑定变量 | | positionOutId | string | - | 输出位置,E 或 P 或 GP 或 GE 点位变量或绑定变量 | | tableID | int | [1,99] | 寻位参数表号 | | type | int | - | 枚举值,SEARCH_STATIC 在枚举数列中为 152 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 18, "delay": 9.0, "logout": false, "posidname": "", "posidtype": 1, "positionOutId": "E$I001", "tableID": 31, "type": 152, "userParamInt": 0, "userParamString": "" } ``` --- ## 动态寻位 **说明**:动态寻位 **指令名**:SEARCH_DYNAMIC **type 值**:153 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | ParaACC | object | [1,100] | 加速度:double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量 | | ParaPL | object | [0,5] | 平滑:int 类型手填值或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2,1000] mm/s | 速度:double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量 | | delay | double | [0,10] | 参数表延时 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | pointEffet | int | [0,1] | 点位作用:0=准备点;1=寻位开始点 | | posidname | string | - | 点位位置数据:P 或 E 或 GP 或 GE 变量或绑定变量 | | posidtype | int | [0,1] | 点位类型:0=点位变量;1=点位绑定变量 | | positionOutId | string | - | 输出位置:E 或 P 或 GP 或 GE 点位变量或绑定变量 | | sync | int | [0,1] | SYNC:0=否;1=是 | | tableID | int | [1,99] | 寻位参数表号 | | type | int | - | 枚举值,SEARCH_DYNAMIC 在枚举数列中为 153 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例(寻位开始点) ```json { "ID": 20, "delay": 5.0, "logout": false, "pointEffet": 1, "posidname": "GE$I001", "posidtype": 1, "positionOutId": "GP0001", "sync": 1, "tableID": 22, "type": 153, "userParamInt": 0, "userParamString": "" } ``` ### JSON 示例(准备点) ```json { "ID": 20, "ParaACC": {"data": 58.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaPL": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaV": {"data": 78.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": ""}, "logout": false, "pointEffet": 0, "posidname": "GE$I001", "posidtype": 1, "sync": 1, "type": 153, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位计算 **说明**:寻位计算 **指令名**:SEARCH_CALC **type 值**:154 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calculType | int | [0,11] | 计算方式:0=1维偏转;1=2维偏转;2=2维偏转+旋转;3=3点计算投影点;4=4点确定两条直线计算交点;5=3点计算用户坐标系;6=4点确定两条直线计算交点;7=6点计算用户坐标系;8=2点简易触碰寻位;9=3维偏移+旋转;10=平面两点计算新用户坐标系;11=4点计算平面用户坐标系 | | coordNum | int | [1,999] | 输出用户坐标系 | | length | double | mm | 长度 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidtype | int | [0,1] | 节点是否绑定变量:0=点位变量;1=点位绑定变量 | | position1Id | string | - | 点1:P 或 E 或 GE 或 GP | | position2Id | string | - | 点2:P 或 E 或 GE 或 GP | | position3Id | string | - | 点3:P 或 E 或 GE 或 GP | | position4Id | string | - | 点4:P 或 E 或 GE 或 GP | | position5Id | string | - | 点5:P 或 E 或 GE 或 GP | | position6Id | string | - | 点6:P 或 E 或 GE 或 GP | | positionOutId | string | - | 输出结果:P 或 GP 或 E 或 GE | | searchParacoordinate | int | [1,999] | 输入用户坐标系 | | type | int | - | 枚举值,SEARCH_CALC 在枚举数列中为 154 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calculType": 9, "coordNum": 1, "length": 56.0, "logout": false, "posidtype": 0, "position1Id": "GP0001", "position2Id": "GP0002", "position3Id": "", "position4Id": "", "position5Id": "", "position6Id": "", "positionOutId": "GP0096", "searchParacoordinate": 1, "type": 154, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位结束 **说明**:寻位结束 **指令名**:SEARCH_END **type 值**:155 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,SEARCH_END 在枚举数列中为 155 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 20, "logout": false, "type": 155, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位偏移 **说明**:寻位偏移 **指令名**:SEARCH_OFFSET **type 值**:156 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | position1Id | string | - | 偏移量:P 或 GP | | type | int | - | 枚举值,SEARCH_OFFSET 在枚举数列中为 156 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "position1Id": "GP0036", "type": 156, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位偏移结束 **说明**:寻位偏移结束 **指令名**:SEARCH_OFFSETEND **type 值**:157 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,SEARCH_OFFSETEND 在枚举数列中为 157 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 157, "userParamInt": 0, "userParamString": "" } ``` --- ## 电弧跟踪开始 **说明**:电弧跟踪开始 **指令名**:ARCTRACKON **type 值**:158 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | p_trace_path_num | object | [1,9] | 跟踪路径数据:int 类型手填值或 int 类型全局或局部变量或绑定变量;值为0时表示不使用 | | type | int | - | 枚举值,ARCTRACKON 在枚举数列中为 158 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "p_trace_path_num": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI036]"}, "type": 158, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I026]"} } ``` --- ## 电弧跟踪结束 **说明**:电弧跟踪结束 **指令名**:ARCTRACKOFF **type 值**:159 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCTRACKOFF 在枚举数列中为 159 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 159, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"} } ``` --- ## 弧压跟踪开始 **说明**:弧压跟踪开始 **指令名**:ARCTRACKON **type 值**:160 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCTRACKON 在枚举数列中为 160 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 160, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI099"} } ``` --- ## 弧压跟踪结束 **说明**:弧压跟踪结束 **指令名**:ARCVTRACKOFF **type 值**:161 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCVTRACKOFF 在枚举数列中为 161 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 161, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"} } ``` --- # 程序操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/03.%E7%A8%8B%E5%BA%8F%E6%93%8D%E4%BD%9C.html ## 程序打开 正式执行程序之前需要打开程序。 **命令字:** `0x5100` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | jobName | string | 新建作业文件名 | | suffixname | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | ```json { "robot": 1, "jobName": "xxxx", "suffixname": ".JBR" } ``` ## 程序复制 复制后程序的后缀是一样的。 **命令字:** `0x5101` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | oldjobName | string | 旧文件名 | | newjobName | string | 复制后文件名 | | suffixname | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | ```json { "robot": 1, "oldjobName": "QQQQ", "newjobName": "WWWW", "suffixname": ".JBR" } ``` ## 程序清除 会清除当前机器人的所有程序,但不会清除复位程序。 **命令字:** `0x5102` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | lock_enable | bool | 是否清空作业文件使能,true 清空使能,false 清空不使能 | ```json { "robot": 1, "lock_enable": true } ``` ## 获取当前打开程序 **命令字:** `0x5103` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5104` | 字段 | 类型 | 说明 | |------|------|------| | openedJobName | string | 当前打开的作业文件,空表示没有 | ```json { "openedJobName": "asd" } ``` ## 主程序 主程序可以认为是特殊的前台程序,只有前台程序可以设置成主程序。 ### 设置作业文件为主程序 **命令字:** `0x5110` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名,空字符串表示取消主程序 | ```json { "robot": 1, "jobName": "xxx" } ``` ### 查询主程序 **命令字:** `0x5111` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5112` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名,空表示没有 | ```json { "robot": 1, "jobName": "xxx" } ``` ## 程序保存 程序进行修改、插入、删除后需要使用该协议进行保存。 **命令字:** `0x5120` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobname | string | 作业文件名 | | suffix | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | | time | string | 时间戳,格式如 "2024.08.08 14:16:39" | ```json { "robot": 1, "jobname": "xxxx", "suffix": ".JBR", "time": "2024.08.08 14:16:39" } ``` ## 同步程序打开 > 功能可能有问题,只有在 6001 打开时同步到 6000 的操作 控制器打开程序后通知上位机,告知上位机该程序已在控制器打开。 **命令字:** `0x3130` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前反馈的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名 | ```json { "robot": 1, "jobName": "" } ``` ## 发送程序指令 为无作业文件的指令插入。运行方式与作业运行方式一样,但是需要将 "noFileRun" 节点的值写为 true。 **命令字:** `0x5122` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | cmd | object | 插入的指令详情,格式为 cmd->toJson(),见指令页面 | ```json { "robot": 1, "cmd": {} } ``` ## 程序同步 上位机发送给控制器,通知示教器同步作业文件。 **命令字:** `0x1222` - 无需发送数据 **控制器响应** **命令字:** `0x1223` | 字段 | 类型 | 说明 | |------|------|------| | finished | bool | true 成功,false 失败 | ```json { "finished": true } ``` ### 控制器通知示教器同步作业文件 **命令字:** `0x1224` - 无需发送数据 **示教器响应** **命令字:** `0x1225` | 字段 | 类型 | 说明 | |------|------|------| | finished | bool | true 成功,false 失败 | ```json { "finished": true } ``` --- # 注释 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/04.%E6%B3%A8%E9%87%8A.html ## 变量 变量/绑定变量的 JSON 结构: ```json { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" } ``` | 参数 | 类型 | 说明 | |------|------|------| | data | float | 数值型数据 | | secondvalue | int | 是否为绑定变量,0=否,1=是(格式:GD[GI0002]) | | value | int | 数据类型,0=数值型(填 data 节点),7=字符串(填 varname 节点),8=变量或绑定变量(填 varname 节点) | | varname | string | 字符串类型或变量名 | ## 点位 ```json { "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "paraVarData": [ {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] } } ``` | 参数 | 类型 | 说明 | |------|------|------| | ctype | int | 点位类型,1=P,2=E,3=S,4=R,5=GP,6=GE | | key | string | 点位名称 | | note | string | 点位注释 | | data | array | 21位数组,详见下方说明 | | paraVarData | array | 21位参数变量数组,结构同变量节点 | **data 数组说明(21位):** | 位 | 说明 | |----|------| | 第1位 | 坐标系:0=关节,1=直角,2=工具,3=用户 | | 第2位 | 单位:0=角度制,1=弧度制 | | 第3位 | 左右手(形态):0=任意,1=左,2=右 | | 第4位 | 工具号 | | 第5位 | 用户号 | | 第6~7位 | 备用 | | 第8~21位 | 坐标值(7位内部轴 + 7位外部轴) | > 注:不存在的节点默认为 0 或 "" --- # 程序运行控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/05.%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E6%8E%A7%E5%88%B6.html ## 程序运行总数清零 **命令字:** `0x5600` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 运行程序 对程序进行操作。 ### 发送开始运行程序 **命令字:** `0x5601` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | jobname | string | 程序名 | | suffixname | string | 程序名后缀名称,取值:.JBR 主程序,.JBP 后台局部程序,.JBPG 后台全局程序 | | stepRunSum | int | 一共多少步(可选) | | callerName | string | 访问者名字(可选) | | stepRun | bool | 是否单步运行(可选) | | index | int | 索引(可选) | | noFileRun | bool | 无文件运行(可选) | | notJudgeSafePos | bool | 不判断安全位置(可选) | | line | int | 程序开始运行的行号 | | globalStart | bool | 是否为多机模式 | | continueRun | int | 是否为继续运行:0 不继续运行,1 继续运行 | | startOver | int | 是否为重头运行:0 继续运行,1 重头运行 | ```json { "robot": 1, "jobname": "TTT", "suffixname": ".JBR", "stepRunSum": 2, "callerName": "tttt", "stepRun": false, "index": 0, "noFileRun": false, "notJudgeSafePos": false, "line": 1, "globalStart": false, "continueRun": 0, "startOver": 0 } ``` > 注:可选字段不使用无影响 ### 下发停止程序 **命令字:** `0x5602` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 程序执行状态设置 上位机需要改变当前控制器程序执行模式时发送。 **命令字:** `0x5603` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | type | int | 程序执行状态:0 单步运行,1 暂停,2 停止但不下电,5 停止但不下电(停止优先使用) | ```json { "robot": 1, "type": 5 } ``` > **注意:** 对于单步,没有全部机器人;对于暂停和停止,只有多机模式下有全部机器人,此时将 "robot" 节点设置成 0 ## 使用无文件运行开关 **命令字:** `0x5604` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 正序倒序运动 ### 设置反向运行 **命令字:** `0x5610` | 字段 | 类型 | 说明 | |------|------|------| | switch | bool | 是否反向顺序运行 | ```json { "switch": false } ``` ### 查询正序倒序 **命令字:** `0x5611` - 无需发送数据 **控制器回复** **命令字:** `0x5612` | 字段 | 类型 | 说明 | |------|------|------| | switch | bool | 是否反向顺序运行 | ```json { "switch": false } ``` ## 循环次数 ### 设置循环次数 **命令字:** `0x5620` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | index | int | 总循环次数,0 表示无限循环 | ```json { "robot": 1, "index": 1 } ``` ### 查询循环次数 **命令字:** `0x5621` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5622` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | index | int | 总循环次数,0 表示无限循环 | | count | int | 当前已运行次数 | ```json { "robot": 1, "count": 0, "index": 1 } ``` ## 全局线程 ### 全局线程自启动设置 **命令字:** `0x5630` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | name | string | 全局后台程序名 | ```json { "robot": 1, "name": "Q1" } ``` ### 全局线程自启动查询 **命令字:** `0x5631` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 全局线程自启动接收 **命令字:** `0x5632` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | name | string | 全局后台程序名 | ```json { "robot": 1, "name": "Q1" } ``` ### 全局线程启动控制 **命令字:** `0x5633` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | type | int | 启动控制:0 表示停止,1 开始 | ```json { "robot": 1, "type": 1 } ``` ### 全局线程启动状态查询 **命令字:** `0x5634` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | runName | int | 1 表示获取全局后台运行状态 | ```json { "robot": 1, "hasRun": true, "runName": 1 } ``` **控制器回复** | 命令字 | 类型 | 说明 | |--------|------|------| | 0x50c6 | - | GLOBAL_PTHREAD_RUNSTATUS_RESPOND | | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool[] | 自启状态数组,true 表示启动,false 表示停止 | ```json { "robot": 1, "hasRun": [false, true] } ``` ## 追加运动模式 追加运动模式是在不使用程序的条件下运行程序。 使用方法: 1. 打开追加运动模式 2. 追加运动模式插入指令向量 3. 追加运动模式设置 ### 打开追加运动模式 **命令字:** `0x5640` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | open | bool | 是否开启追加运动模式,true 打开,false 关闭 | ```json { "robot": 1, "open": true } ``` ### 查询追加运动模式 **命令字:** `0x5641` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5642` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | open | bool | 是否开启追加运动模式,true 打开,false 关闭 | ```json { "robot": 1, "open": true } ``` ### 追加运动插入指令向量 **命令字:** `0x5643` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | isContinue | bool | true 只接收并存储 pos,false 接收 pos 并使得机器人执行所有 pos | | data | array | 指令 JSON 列表,格式为 cmd->toJson() | ```json { "data": [ { "cmd": "toJson()" }, { "cmd": "toJson()" }, { "cmd": "toJson()" } ], "isContinue": false, "robot": 1 } ``` > 指令详情请参阅指令页面 ### 追加运动模式挂起(暂停) **命令字:** `0x5644` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 追加运动模式启动 **命令字:** `0x5645` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 追加运动模式停止 **命令字:** `0x5646` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [0, 3] | ```json { "robot": 0 } ``` ## 自启动 自启动程序,设置后开机自启动。 ### 设置自启动程序 **命令字:** `0x5647` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | enable | bool | 是否使能,true 使能,false 不使用 | | count | int | 运行次数 | | speed | int | 运行速度 | | jobname | string | 程序名字 | ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` ### 查询自启动程序 **命令字:** `0x5648` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5649` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | enable | bool | 是否使能 | | count | int | 运行次数 | | speed | int | 运行速度 | | jobname | string | 程序名字 | ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` > 需补充试运行和单步相关内容 ### 查询全局后台自启状态 **命令字:** `0x50c5` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool | 自启状态,true 启动,false 停止 | | runName | int | 1:获取全局后台运行状态 | ```json { "robot": 1, "hasRun": true, "runName": 1 } ``` **控制器回复** **命令字:** `0x50c6` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool | 自启状态,true 启动,false 停止 | ```json { "robot": 1, "hasRun": false } ``` --- # 程序状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/06.%E7%A8%8B%E5%BA%8F%E7%8A%B6%E6%80%81.html ## 程序行号 当控制器开始运行一条指令时,向上位机发送: **命令字:** `0x5400` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | num | int | 已运行指令数量 | ```json { "robot": 1, "jobname": "Q1", "num": 3 } ``` ## CRAFTLINE 指令跳转 当控制器执行 CRAFTLINE 指令时,向示教器发送跳转: **命令字:** `0x5401` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | num | int | 已运行指令数量 | ```json { "robot": 1, "num": 2 } ``` ## 查询当前行号 当示教器与控制器建立网络连接时,上位机查询当前运行到哪一行: **命令字:** `0x5402` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5403` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | num | int | 行号 | ```json { "robot": 1, "jobname": "Q1", "num": 3 } ``` ## 程序运行状态 程序状态包括:暂停、运行、停止。 ### 查询程序运行状态 **命令字:** `0x5410` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5411` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | status | int | 程序运行状态:0 停止,1 暂停,2 运行 | ```json { "robot": 1, "status": 0 } ``` ### 查询机器人运行状态 **命令字:** `0x5412` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | ```json { "robot": 1, "jobfilename": "" } ``` **控制器回复** **命令字:** `0x5413` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | status | int | 运行状态:0 停止,1 暂停,2 运行 | | continueRun | int | 是否从当前行运行:0 从头运行,1 从当前行运行 | | currentRun | bool | 当前是否运行 | | mainProgramRun | int | 主程序是否运行 | ```json { "robot": 1, "status": 0, "continueRun": 0, "currentRun": false, "mainProgramRun": 0 } ``` ### 设置当前行 **命令字:** `0x5414` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | | num | int | 行号 | ```json { "robot": 1, "jobfilename": "", "num": 1 } ``` ### 查询当前行 **命令字:** `0x5415` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5416` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | | num | int | 行号 | ```json { "robot": 1, "jobfilename": "", "num": 1 } ``` ### 清除运行状态 上位机在导入程序成功后发送此协议请求重置程序运行状态: **命令字:** `0x5417` - 无需发送数据 **控制器回复** **命令字:** `0x5418` - 无需回复数据 ### 查询运动队列剩余指令数量 **命令字:** `0x5419` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x541A` | 字段 | 类型 | 说明 | |------|------|------| | sum | int | 运动队列的行号数量 | ```json { "sum": 4 } ``` ### 查询运动队列剩余指令数量 **命令字:** `0x541a` **控制器回复** | 字段 | 类型 | 说明 | |------|------|------| | sum | int | 运动队列的行号 | ```json { "sum": 4 } ``` --- # 指令操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/07.%E6%8C%87%E4%BB%A4%E6%93%8D%E4%BD%9C.html ## 1 外部轴 ### 1.1 外部轴位置查询 **说明:** 机器人+变位机同步插入指令时的位置查询 **命令字:** `0x5300` **上位机发送:** ```json { "robot": 1, "coord": 0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | coord | int | 是 | 控制器当前坐标:0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | --- ### 1.2 外部轴位置接收 **说明:** 机器人+变位机同步插入指令时的位置接收 **命令字:** `0x5301` **控制器返回:** ```json { "robot": 1, "coord": 0, "configuration": 1, "position": [0, 0.1, 2, 3.3, 44, 555.55, 66.6], "positionDeg": [0, 0.1, 2, 3.3, 44, 555.55, 66.6], "externalPosition": [0, 0.1, 2, 3.3, 44] } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | coord | int | 是 | 控制器当前坐标:0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | | configuration | int | 是 | 姿态或左右手 | | position | double[] | 是 | 当前位置(弧度制),7位考虑双机情况 | | positionDeg | double[] | 是 | 当前位置(角度制) | | externalPosition | double[] | 是 | 外部轴当前位置,5位 | --- ## 2 历史指令列表 ### 2.1 历史指令列表查询 **命令字:** `0x5310` **上位机发送:** ```json { "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | --- ### 2.2 指令列表查询 **命令字:** `0x5301` **上位机发送:** ```json { "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | --- ### 2.3 历史指令列表返回 **命令字:** `0x5311` **控制器返回:** ```json { "robot": 1, "jobname": ["请求权", "请求权"], "num": [2, 1], "sendednum": 2, "totalnum": 2 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | jobname | string[] | 是 | 程序名数组,单次上限50 | | num | int[] | 是 | 历史行号数组,单次上限50,数组顺序为程序执行反序 | | sendednum | int | 是 | 此次发送数量 | | totalnum | int | 是 | 总计发送数量 | --- ## 3 局部点 **说明:** 局部点为不同程序内的数据,不同程序的局部点不相关。 ### 3.1 插入局部点位 **命令字:** `0x5320` **上位机发送:** ```json { "robot": 1, "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "paraVarData": [ {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0} ] }, "time": "2024.11.06 10:10:34" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | robotpos | object | 是 | 点位信息 | | time | string | 是 | 时间戳,格式如:`2024.11.06 10:10:34` | **robotpos 子对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | 类型 | | key | string | 点位标识 | | note | string | 备注 | | data | double[] | 位置数据数组 | | paraVarData | object[] | 参数变量数据 | --- ### 3.2 修改局部点位 **命令字:** `0x5321` **上位机发送:** ```json { "robot": 1, "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "paraVarData": [ {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0} ] }, "time": "2024.11.06 10:14:31" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | robotpos | object | 是 | 点位信息 | | time | string | 是 | 时间戳,格式如:`2024.11.06 10:14:31` | --- ### 3.3 修改数值局部变量 **命令字:** `0x5322` **上位机发送:** ```json { "robot": 1, "time": "2024.11.06 10:18:24", "varName": "D007", "varNote": "", "varType": 1, "varString": "RRR", "varValue": 0.0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | time | string | 是 | 时间戳 | | varName | string | 是 | 变量名,局部数值型变量:I001, D001, B001, S001 | | varNote | string | 否 | 注释 | | varType | int | 是 | 变量类型:0-int, 1-double, 2-bool, 3-string | | varValue | double | 是 | 数值型值 | | varString | string | 是 | 字符型值 | --- ## 4 语法检查 ### 4.1 获取语法检查结果 **命令字:** `0x9121` **上位机发送:** ```json { "robot_id": 1, "job_name": "QQQ", "suffix": ".JBR" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_id | int | 是 | 机器人号 | | job_name | string | 是 | 作业名 | | suffix | string | 是 | 程序后缀:`.JBR` 主程序、`.JBP` 后台局部程序、`.JBPG` 后台全局程序 | --- ### 4.2 语法检查结果返回 **命令字:** `0x9121` **控制器返回:** ```json { "robot_id": 1, "job_name": "QQQ", "suffix": ".JBR", "result": "true", "cur_error_command_num": 5 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_id | int | 是 | 机器人号 | | job_name | string | 是 | 作业名 | | suffix | string | 是 | 程序后缀 | | result | bool | 是 | 检查结果:true-成功,false-失败 | | cur_error_command_num | int | 否 | 失败时行号 | --- ## 5 快捷指令 **说明:** 快捷指令的是否使用在操作参数中有节点表示。 ### 5.1 设置快捷指令 **命令字:** `0x50E0` **上位机发送:** ```json { "quickInsert": [ [0, 0], [0, 1], [0, 2], [0, 3], [0, 5], [-1, -1], [-1, -1], [-1, -1] ] } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | quickInsert | array | 是 | 快捷指令数组,共8个元素,每个元素第一位代表指令类型,第二位代表指令 | --- ### 5.2 查询快捷指令 **命令字:** `0x50E0` **上位机发送:** ```json {} ``` **说明:** data 为空对象。 --- ### 5.3 返回快捷指令 **命令字:** `0x50E2` **控制器返回:** (同 0x50E0 格式) --- # 远程程序 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/08.%E8%BF%9C%E7%A8%8B%E7%A8%8B%E5%BA%8F.html ## 预约执行状态 远程模式界面,上位机查询预约执行状态时,发送。 **命令字:** `0x5500` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复预约执行状态查询结果。 **命令字:** `0x5501` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | current | object | 当前任务状态 | | current.station | int | 工位编号 | | current.name | string | 程序名称 | | current.runtime | int | 运行时间 | | current.times | int | 运行次数 | | current.count | int | 已运行次数 | | current.status | int | 状态:0-无预约,1-预约中,2-运行中,3-已预约,4-程序暂停 | | queue | array | 预约队列 | | queue[].station | int | 工位编号 | | queue[].name | string | 程序名称 | | queue[].times | int | 运行次数 | | queue[].count | int | 已运行次数 | | queue[].status | int | 状态 | ### 响应示例 ```json { "robot": 1, "current": { "station": 1, "name": "Q1", "runtime": 1, "times": 3, "count": 1, "status": 2 }, "queue": [ { "station": 1, "name": "Q4", "times": 2, "count": 0, "status": 1 }, { "station": 1, "name": "Q1", "times": 6, "count": 0, "status": 1 }, { "station": 1, "name": "Q3", "times": 1, "count": 0, "status": 1 }, { "station": 1, "name": "", "times": 1, "count": 0, "status": 0 }, { "station": 1, "name": "", "times": 2, "count": 0, "status": 0 } ] } ``` ## 远程状态 上位机发送远程控制设置。 **命令字:** `0x5510` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | remotectl | bool | 是 | 远程控制的状态 | ### 请求示例 ```json { "remotectl": false } ``` 上位机发送远程控制查询。 **命令字:** `0x5511` date:无 控制器回复查询。 **命令字:** `0x5512` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | remotectl | bool | 远程控制的状态 | ### 响应示例 ```json { "remotectl": false } ``` ## 远程程序 上位机发送设置远程程序。 **命令字:** `0x5520` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | jobFile | array | 是 | 程序列表 | | jobFile[].name | string | 是 | 程序名称 | | jobFile[].times | int | 是 | 运行次数 | | interpolationMethod | int | 否 | 插补方法 | | absolutePosResolution | double | 否 | 绝对位置分辨率 | | stopTime | int | 否 | 暂停时间 | | runDelayTime | int | 否 | 运行延时时间 | | remoteDefaultSpeed | int | 否 | 远程模式速度 1-100% | ### 请求示例 ```json { "robot": 1, "jobFile": [ {"name": "Q1", "times": 3}, {"name": "Q2", "times": 3}, {"name": "", "times": 1}, {"name": "Q4", "times": 2}, {"name": "", "times": 1} ], "interpolationMethod": 4, "absolutePosResolution": 0.06, "stopTime": 5, "runDelayTime": 600, "remoteDefaultSpeed": 1 } ``` 上位机发送获取远程程序。 **命令字:** `0x5521` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器收到上位机查询程序名字时回复。 **命令字:** `0x5522` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobFile | array | 程序列表 | | jobFile[].name | string | 程序名称 | | jobFile[].times | int | 运行次数 | | remoteProgramNum | int | 远程程序个数 | ### 响应示例 ```json { "jobFile": [ {"name": "Q1", "times": 3}, {"name": "Q2", "times": 3}, {"name": "", "times": 1}, {"name": "Q4", "times": 2}, {"name": "", "times": 1}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0} ], "remoteProgramNum": 10, "robot": 1 } ``` ## 远程模式参数设置 上位机发送远程模式参数设置。 **命令字:** `0x5530` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | waitingTime | double | 否 | IO 重复触发时间 | | reserveIsStart | int | 否 | 预约 IO 后自动启动运行:0-关,1-开 | | interpolationMethod | int | 否 | 插补方法 | | reserveTrgTime | double | 否 | 远程模式 IO 预约并启动时间(毫秒) | | absolutePosResolution | int | 否 | 绝对位置分辨率 | | stopTime | int | 否 | 暂停时间 | | runDelayTime | int | 否 | 运行延时时间 | | remoteDefaultSpeed | int | 否 | 远程模式速度 1-100% | ### 请求示例 ```json { "robot": 1, "waitingTime": 1, "reserveIsStart": 0, "interpolationMethod": 4, "reserveTrgTime": 200, "absolutePosResolution": 0.06, "stopTime": 5, "runDelayTime": 600, "remoteDefaultSpeed": 1 } ``` 上位机发送远程模式参数查询。 **命令字:** `0x5531` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复查询结果。 **命令字:** `0x5532` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | remoteDefaultSpeed | int | 远程模式速度 1-100% | | remoteProgramNum | int | 远程程序个数 | | reserveIsStart | bool | 预约 IO 后自动启动运行:0-关,1-开 | | waitingTime | int | IO 重复触发时间 | ### 响应示例 ```json { "remoteDefaultSpeed": 1.0, "remoteProgramNum": 10, "reserveIsStart": false, "waitingTime": 500 } ``` ## 远程 IO 功能界面设置 上位机发送设置 IO 功能界面。 **命令字:** `0x5540` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | remoteProgramNum | int | 是 | 远程 IO 数功能 | | inPort | object | 否 | IO 触发端口绑定 | | inPort.clearoutagekeep | int | 否 | 清除断电保存数据,绑定 IO 端口:0-无,1-端口1 | | inPort.faultReset | int | 否 | 清除报警,绑定 IO 端口 | | inPort.pause | int | 否 | 暂停,绑定 IO 端口 | | inPort.start | int | 否 | 启动,绑定 IO 端口 | | inPort.stop | int | 否 | 停止,绑定 IO 端口 | | inValue | object | 否 | IO 参数 | | inValue.clearoutagekeep | int | 否 | 清除断电保存数据,绑定 IO 端口触发所需状态:0-低电平有效,1-高电平有效 | | inValue.faultReset | int | 否 | 清除报警,绑定 IO 端口触发所需状态 | | inValue.pause | int | 否 | 暂停,绑定 IO 端口触发所需状态 | | inValue.start | int | 否 | 启动,绑定 IO 端口触发所需状态 | | inValue.stop | int | 否 | 停止,绑定 IO 端口触发所需状态 | | program | array | 否 | 程序列表 | | program[].port | int | 否 | 端口 | | program[].value | int | 否 | 值 | ### 请求示例 ```json { "inPort": { "clearoutagekeep": 0, "faultReset": 0, "pause": 0, "start": 8, "stop": 0 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1} ], "remoteProgramNum": 10, "robot": 1 } ``` IO 功能界面查询设置时,上位机发送下面命令。 **命令字:** `0x5541` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` IO 功能界面,控制器收到查询时回复。 **命令字:** `0x5542` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | remoteProgramNum | int | 远程 IO 数功能 | | inPort | object | IO 触发端口绑定:0-无,1-端口1 | | inPort.clearoutagekeep | int | 清除断电保存数据,绑定 IO 端口 | | inPort.faultReset | int | 清除报警,绑定 IO 端口 | | inPort.pause | int | 暂停,绑定 IO 端口 | | inPort.start | int | 启动,绑定 IO 端口 | | inPort.stop | int | 停止,绑定 IO 端口 | | inValue | object | IO 参数:0-低电平有效,1-高电平有效 | | inValue.clearoutagekeep | int | 清除断电保存数据,绑定 IO 端口触发所需状态 | | inValue.faultReset | int | 清除报警,绑定 IO 端口触发所需状态 | | inValue.pause | int | 暂停,绑定 IO 端口触发所需状态 | | inValue.start | int | 启动,绑定 IO 端口触发所需状态 | | inValue.stop | int | 停止,绑定 IO 端口触发所需状态 | | program | array | 程序列表 | | program[].name | string | 程序名称 | | program[].port | int | 端口 | | program[].value | int | 值 | | reserveTrgTime | int | IO 重复触发屏蔽时间 | ### 响应示例 ```json { "inPort": { "clearoutagekeep": 0, "faultReset": 0, "pause": 0, "start": 0, "stop": 0 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"name": "Q1", "port": 0, "value": 1}, {"name": "Q2", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "Q4", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1} ], "remoteProgramNum": 10, "reserveTrgTime": 500, "robot": 1 } ``` ## 远程 IO 状态 上位机发送远程状态提示设置。 **命令字:** `0x5550` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | output | array | 是 | 输出端口列表 | | output[].program1 ~ program10 | int | 否 | 远程 IO 程序 1-10 的输出端口编号 | | output[].program_value1 ~ program_value10 | int | 否 | 对应每个远程 IO 程序的输出端口值 | ### 请求示例 ```json { "robot": 1, "output": [ { "program1": 1, "program2": 2, "program3": 3, "program4": 4, "program5": 5, "program6": 6, "program7": 7, "program8": 8, "program9": 9, "program10": 10, "program_value1": 1, "program_value2": 2, "program_value3": 3, "program_value4": 4, "program_value5": 5, "program_value6": 6, "program_value7": 7, "program_value8": 8, "program_value9": 9, "program_value10": 10 } ] } ``` 上位机查询远程状态提示设置。 **命令字:** `0x5551` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复查询结果。 **命令字:** `0x5552` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | output | array | 输出端口列表 | | output[].program1 ~ program10 | int | 远程 IO 程序 1-10 的输出端口编号 | | output[].program_value1 ~ program_value10 | int | 对应每个远程 IO 程序的输出端口值 | ### 响应示例 ```json { "robot": 1, "output": [ { "program1": 1, "program2": 2, "program3": 3, "program4": 4, "program5": 5, "program6": 6, "program7": 7, "program8": 8, "program9": 9, "program10": 10, "program_value1": 1, "program_value2": 2, "program_value3": 3, "program_value4": 4, "program_value5": 5, "program_value6": 6, "program_value7": 7, "program_value8": 8, "program_value9": 9, "program_value10": 10 } ] } ``` ## 远程模式连接状态 查询 Modbus、外部 IO 连接状态时,发送。 **命令字:** `0x5560` date:无 收到查询连接状态时,返回。 **命令字:** `0x5561` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | ModbusConnect | bool | Modbus 连接状态:false-未连接,true-已连接 | | ExternIOConnect | bool | 外部 IO 连接状态:false-未连接,true-已连接 | | type | int | 类型:0-NAN,1-RTU,2-TCP | ### 响应示例 ```json { "ModbusConnect": false, "ExternIOConnect": true, "type": 2 } ``` 控制器发送,是否通过 IO 修改了作业文件(外部按键触发修改作业文件时,控制器发送给上位机)。 **命令字:** `0x5562` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | isModify | bool | 是否通过 IO 修改了作业文件:true-是,false-否 | ### 响应示例 ```json { "isModify": false } ``` --- # 总线 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/01.%E6%80%BB%E7%BA%BF.html ## 概述 本控制器支持多种工业现场总线协议,包括 EtherCAT、CANopen 等。通过总线可以实现与伺服驱动器、IO 模块、传感器等从站设备的高速实时通信。 ### 支持的总线类型 | 总线类型 | 说明 | 典型用途 | |----------|------|----------| | EtherCAT | 基于以太网的实时总线 | 伺服控制、高速 IO | | CANopen | 基于 CAN 的现场总线 | 传感器、编码器、分布式 IO | ### 总线架构 ```text ┌─────────────┐ │ 控制器 │ (主站) └──────┬──────┘ │ EtherCAT / CAN bus │ ┌────┴────┬─────────┬──────────┐ │ │ │ │ ┌─┴──┐ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ │伺服│ │伺服 │ │ IO │ │交换 │ │ 1 │ │ 2 │ │模块 │ │ 机 │ └────┘ └─────┘ └─────┘ └─────┘ ``` ### EtherCAT 主站功能 | 功能 | 说明 | |------|------| | 从站扫描 | 自动识别总线上的从站设备 | | ENI 配置 | 通过 EtherCAT 网络信息文件配置从站 | | DC 时钟同步 | 分布式时钟同步,实现各从站精确同步 | | PDO 映射 | 过程数据对象映射,定义实时数据交换内容 | | 从站状态管理 | 监控从站运行状态,支持在线/离线检测 | --- ## CanOpen ### 0x7000 上位机查询该硬件的 can 支持的功能 **命令字:** `0x7000` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 端口号 | | function | Int | 该硬件 can 支持的功能,范围[0,3]
0-标准帧,1-扩展帧,2-远程帧,3-过滤 id | **请求示例:** ```json { "canPort": 1, "function": 0 } ``` --- ### 0x7001 控制器回复上位机查询该硬件的 can 支持的功能结果 **命令字:** `0x7001` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 端口号 | | support | Bool | 该硬件的 can 是否支持这功能 | **响应示例:** ```json { "canPort": 1, "support": true } ``` --- ### 0x7002 上位机设置 can 参数 **命令字:** `0x7002` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canBaud | UInt | can 通讯波特率(bps),常用值:125k, 250k, 500k, 1M | | canPort | UInt | can 通讯端口 | | enableRecvFiltert | Bool | 是否开启过滤 ID;开启后仅接收过滤 ID 匹配的帧 | | frameFormat | Int | 帧格式,范围[0,1]
0-标准帧(11位 ID),1-扩展帧(29位 ID) | | recvFilterId | UInt | 设置过滤 ID,仅 enableRecvFiltert=true 时生效 | **请求示例:** ```json { "canBaud": 500000, "canPort": 1, "enableRecvFiltert": true, "frameFormat": 0, "recvFilterId": 0x181 } ``` --- ### 0x7003 上位机请求接收一帧 can 数据 **命令字:** `0x7003` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | **请求示例:** ```json { "canPort": 1 } ``` --- ### 0x7004 控制器回复上位机接收一帧 can 数据结果 **命令字:** `0x7004` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | | data | UChar[] | 接收到的数据,长度为 Length 节点的值 | | Length | UInt | 接收到的数据长度 | | recvCanID | UInt | 接收到的帧 ID | **响应示例:** ```json { "canPort": 1, "data": [0x10, 0x20, 0x30], "Length": 3, "recvCanID": 0x181 } ``` --- ### 0x7005 上位机请求发送一帧数据 **命令字:** `0x7005` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | | data | UChar[] | 需要发送的数据 | | sendCanID | UInt | 发送帧的 ID | | sendLen | UInt | 发送的数据长度,范围[1,8] | | useRemoteFrame | Bool | 是否使用远程帧;远程帧用于请求对方发送数据 | **请求示例:** ```json { "canPort": 1, "data": [0x10, 0x20], "sendCanID": 0x201, "sendLen": 2, "useRemoteFrame": false } ``` --- ## EtherCAT 总线配置 ### ENI 文件管理 ENI(EtherCAT Network Information)文件是 EtherCAT 总线配置的核心文件,描述了总线上所有从站的型号、数量、排列顺序及 PDO 映射信息。ENI 文件通常由专用配置工具生成(如 INEXBOT EC-Config),导入控制器后生效。 --- ### 0x7010 上位机查询 ENI 文件列表 **命令字:** `0x7010` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | num | Int | 获取 ENI 文件数目,范围[1,10]
1-获取当前使用的 ENI 文件,10-获取所有 ENI 文件 | **请求示例:** ```json { "num": 10 } ``` --- ### 0x7011 控制器回复上位机 ENI 文件列表 **命令字:** `0x7011` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIfilelist | String[] | 控制器 ENI 文件列表 | | ENIfilenum | Int | ENI 文件数目 | | absolutepath | String | 控制器中 ENI 文件所在文件夹 | **响应示例:** ```json { "ENIfilelist": [ "INEXBOT-IO-R4-1.xml", "DST_X503-1.json", "DST_X503-1.xml", "KunWeiTech_FT_Sensors-1.xml", "P140000107-1.0.1.1-ECXML-1.xml" ], "ENIfilenum": 5, "absolutepath": "eni/" } ``` --- ### 0x7012 上位机查询 ENI 参数 **命令字:** `0x7012` **请求参数:**(无) ```json {} ``` --- ### 0x7013 控制器回复上位机 ENI 参数 **命令字:** `0x7013` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIName | String | 当前使用的 ENI 文件名称 | | isHaveENI | Int | ENI 文件识别结果,范围[-1,1]
-1-无 ENI 文件,0-未识别到对应 ENI,1-识别到 ENI 文件 | **响应示例:** ```json { "ENIName": "eni-RC-6-mecat-1-1000.xml", "isHaveENI": 1 } ``` --- ### 0x7014 上位机设置当前使用的 ENI 文件 **命令字:** `0x7014` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIName | String | 要激活的 ENI 文件名 | **请求示例:** ```json { "ENIName": "eni-RC-6-mecat-1-1000.xml" } ``` > ⚠️ 切换 ENI 文件后,控制器需要重新初始化 EtherCAT 总线。切换前请确认机器人处于安全状态。 --- ## 从站管理 ### 0x7020 上位机查询从站列表 **命令字:** `0x7020` **请求参数:**(无) ```json {} ``` --- ### 0x7021 控制器回复上位机从站列表 **命令字:** `0x7021` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | IONum | Int[] | IO 从站列表(0-非 IO 从站,非0-IO 从站索引) | | servoNum | Int[] | 伺服从站列表(0-非伺服从站,非0-伺服索引) | | switchNum | Int[] | 交换机列表(0-非交换机,非0-交换机索引) | | slaveType | String[] | 从站中文名称列表 | | slaveTypeEnglish | String[] | 从站英文名称列表 | **响应示例:** ```json { "IONum": [0, 0, 0, 0, 0, 0], "servoNum": [1, 2, 3, 4, 5, 6], "switchNum": [0, 0, 0, 0, 0, 0], "slaveType": ["禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E"], "slaveTypeEnglish": ["hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e"] } ``` > 从站列表按总线拓扑顺序排列(从站 0 为离主站最近的设备),`servoNum`、`IONum`、`switchNum` 分别表示该位置的从站类型和编号。 --- ## 从站状态监控 ### 0x7023 上位机查询从站状态 **命令字:** `0x7023` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveIndex | int | 从站索引号,-1 表示查询所有从站 | **请求示例:** ```json { "slaveIndex": -1 } ``` --- ### 0x7024 控制器回复从站状态 **命令字:** `0x7024` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveStates | object[] | 从站状态列表 | | slaveStates[].index | int | 从站索引 | | slaveStates[].ethercatState | int | EtherCAT 状态机:1-INIT,2-PREOP,4-SAFEOP,8-OP | | slaveStates[].online | bool | 在线状态:true-在线,false-离线 | | slaveStates[].errorCode | int | 错误码,0-正常 | | slaveStates[].txErrors | int | 发送错误计数 | | slaveStates[].rxErrors | int | 接收错误计数 | | slaveStates[].alStatusCode | int | AL 状态码(应用层状态码) | #### EtherCAT 状态机说明 | 状态 | 值 | 说明 | |------|---|------| | INIT | 1 | 初始化状态,仅完成基础通讯 | | PREOP | 2 | 预运行状态,可进行邮箱通讯和参数配置 | | SAFEOP | 4 | 安全运行状态,可进行输入数据读取,输出保持安全值 | | OP | 8 | 运行状态,可进行完整的输入/输出数据交换 | **响应示例:** ```json { "slaveStates": [ { "index": 0, "ethercatState": 8, "online": true, "errorCode": 0, "txErrors": 0, "rxErrors": 0, "alStatusCode": 0 }, { "index": 1, "ethercatState": 8, "online": true, "errorCode": 0, "txErrors": 0, "rxErrors": 0, "alStatusCode": 0 } ] } ``` --- ### 0x7025 控制器主动上报从站状态变化 **命令字:** `0x7025` 当任何从站状态发生变化(在线/离线、状态机切换、错误发生)时,控制器主动推送。 **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveIndex | int | 从站索引 | | oldState | int | 旧状态 | | newState | int | 新状态 | | errorCode | int | 错误码 | | timestamp | string | 状态变化时间 | **响应示例:** ```json { "slaveIndex": 2, "oldState": 8, "newState": 4, "errorCode": 0, "timestamp": "2024-03-15T14:30:05Z" } ``` --- ## 总线状态监控 ### 0x7026 上位机查询总线状态 **命令字:** `0x7026` **请求参数:**(无) ```json {} ``` --- ### 0x7027 控制器回复总线状态 **命令字:** `0x7027` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | busState | int | 总线状态:0-未初始化,1-初始化中,2-运行中,3-错误 | | cycleTime | int | 总线周期时间(us) | | slaveCount | int | 已识别的从站总数 | | onlineCount | int | 在线从站数 | | dcInSync | bool | DC 时钟同步状态 | | masterState | int | 主站状态码 | **响应示例:** ```json { "busState": 2, "cycleTime": 1000, "slaveCount": 6, "onlineCount": 6, "dcInSync": true, "masterState": 8 } ``` --- ### 0x7022 上位机请求控制器切换系统 **命令字:** `0x7022` **请求参数:**(无) ```json {} ``` > 切换系统用于在多个 ENI 配置方案之间切换,切换后控制器重新初始化总线。 --- ## 常见问题 ### 总线故障排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 从站离线 | 网线松动或断开 | 检查 EtherCAT 网线连接 | | 从站离线 | 从站设备断电 | 检查从站电源 | | 从站不在 OP 状态 | ENI 文件与实际从站不匹配 | 确认 ENI 文件与硬件配置一致 | | 从站不在 OP 状态 | 从站固件版本不兼容 | 升级从站固件或更新 ESI 文件 | | 总线初始化失败 | ENI 文件损坏 | 重新导入有效的 ENI 文件 | | DC 同步失败 | 从站不支持 DC | 在配置工具中禁用该从站的 DC 功能 | | 总线周期超时 | 从站数量过多 | 减少不必要的从站,或增大周期时间 | | 通讯错误累积 | 电磁干扰 | 检查屏蔽和接地 | ### 维护建议 - 定期检查从站在线状态(`0x7023`),监控 `txErrors`/`rxErrors` 计数 - 总线运行中勿插拔网线或从站设备 - 更换从站设备后需确认 ENI 配置匹配 - 保持 ENI 文件与硬件配置同步更新 --- # IO > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/02.IO.html ## 状态提示 > **说明:** 提示端口范围最大均为当前绑定的 IO 数量;输出方式范围均为[0,2],0为0,1为1,2为闪烁 ### 上位机设置状态提示参数 **命令字:** `0x7100` > **说明:** 此命令的通讯协议与控制器回复命令 `0x7102` 一致。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | outPut | array | 机器人状态提示参数列表,长度为4 | | remoteOut | int | 远程模式状态提示端口 | | remoteOut_value | int | 远程模式状态输出方式,范围[0,2] | | runOut | int | 运动模式状态提示端口 | | runOut_value | int | 运动模式状态输出方式,范围[0,2] | | startUp | int | 开机状态提示端口 | | startUp_value | int | 开机状态输出方式,范围[0,2] | | teachOut | int | 示教模式状态提示端口 | | teachOut_value | int | 示教模式状态输出方式,范围[0,2] | **请求示例:** ```json { "outPut": [ { "IOenable":5, "IOenable_value":1, "continuable":8, "continuable_value":1, "fault":4, "faultIsFickler":1, "mainJobFirstLine":9, "mainJobFirstLine_value":2, "pause":2, "pause_value":1, "quickStopOut1":6, "quickStopOut2":7, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":1, "running_value":1, "stop":3, "stop_value":1, "teachBoxStateOut":17, "teachBoxStateOutValue":2 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":1, "mainJobFirstLine":24, "mainJobFirstLine_value":0, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 } ], "remoteOut":19, "remoteOut_value":2, "runOut":20, "runOut_value":2, "startUp":18, "startUp_value":0, "teachOut":21, "teachOut_value":2 } ``` ### 上位机查询状态提示参数 **命令字:** `0x7101` **请求示例:** ```json {} ``` ### 控制器回复上位机状态提示参数 **命令字:** `0x7102` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | outPut | array | 机器人状态提示参数列表,长度为4 | | remoteOut | int | 远程模式状态提示端口 | | remoteOut_value | int | 远程模式状态输出方式,范围[0,2] | | runOut | int | 运动模式状态提示端口 | | runOut_value | int | 运动模式状态输出方式,范围[0,2] | | startUp | int | 开机状态提示端口 | | startUp_value | int | 开机状态输出方式,范围[0,2] | | teachOut | int | 示教模式状态提示端口 | | teachOut_value | int | 示教模式状态输出方式,范围[0,2] | **响应示例:** ```json { "outPut": [ { "IOenable":5, "IOenable_value":1, "continuable":8, "continuable_value":1, "fault":4, "faultIsFickler":1, "mainJobFirstLine":9, "mainJobFirstLine_value":2, "pause":2, "pause_value":1, "quickStopOut1":6, "quickStopOut2":7, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":1, "running_value":1, "stop":3, "stop_value":1, "teachBoxStateOut":17, "teachBoxStateOutValue":2 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":1, "mainJobFirstLine":24, "mainJobFirstLine_value":0, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 }, { "IOenable":0, "IOenable_value":1, "continuable":0, "continuable_value":1, "fault":0, "faultIsFickler":0, "mainJobFirstLine":0, "mainJobFirstLine_value":1, "pause":0, "pause_value":1, "quickStopOut1":0, "quickStopOut2":0, "quickStopOutValue1":1, "quickStopOutValue2":1, "running":0, "running_value":1, "stop":0, "stop_value":1 } ], "remoteOut":19, "remoteOut_value":2, "runOut":20, "runOut_value":2, "startUp":18, "startUp_value":0, "teachOut":21, "teachOut_value":2 } ``` ## IO 复位 > **说明:** "enable"与"value"节点长度均为128,实际有效数据为当前 IO 的总端口数,超过部分默认为0 ### 上位机设置 IO 复位参数 **命令字:** `0x7110` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 是否复位;bool 类型,长度128 | | robot | int | 需要设置的机器人号,范围[1,4] | | type | int | 需要设置的复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | | value | array | 输出端口复位值;int 类型,范围[0,1],长度128 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "robot":1, "type":1, "value":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` ### 上位机查询 IO 复位参数 **命令字:** `0x7111` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 需要查询的机器人号,范围[1,4] | | type | int | 需要查询的复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | **请求示例:** ```json { "robot":1, "type":1 } ``` ### 控制器回复上位机 IO 复位参数 **命令字:** `0x7112` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 是否复位;bool 类型,长度128 | | robot | int | 机器人号,范围[1,4] | | type | int | 复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | | value | array | 输出端口复位值;int 类型,范围[0,1],长度128 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "robot":1, "type":1, "value":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` ## IO 功能状态 ### 上位机查询 IO 功能状态 **命令字:** `0x7120` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | IO 状态类型,范围[1,4]
1:数字输入
2:数字输出
3:模拟输入
4:模拟输出 | **请求示例:** ```json { "type":1 } ``` ### 控制器回复上位机 IO 功能状态 **命令字:** `0x7121` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | IOFunction | array | IO 功能列表;string 类型,长度为当前 IO 端口数量 | | type | int | IO 状态类型,范围[1,4]
1:数字输入
2:数字输出
3:模拟输入
4:模拟输出 | **响应示例:** ```json { "IOFunction":["","","","","拖拽:拖拽示教外部触发信号 ","","","", "","","","","","使能硬接线端口1 ","安全:机器人1紧急停止1 安全:机器人2紧急停止1 ","", "","远程:机器人1启动 远程:机器人1程序1选择 ","","","","","","", "","","","","","","",""], "type":1 } ``` ## IO 配置 > **说明:** 串口模拟 IO 参数(若 EtherCAT IO 板有模拟 IO,则该串口模拟 IO 将无效) ### 上位机设置 IO 配置参数 **命令字:** `0x7130` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | serialAnalog | object | 串行模拟参数 | | serialAnalog.baudRate | int | 波特率 | | serialAnalog.port | int | 端口号,范围(0,65535] | | serialAnalog.type | string | 模拟类型
"DAC_ANAIO":DAC 模拟 IO 板
"SUPER_ANAIO":格控模拟 IO 板 | | simuNum | int | 虚拟 IO 数量,范围[0,4] | **请求示例:** ```json { "serialAnalog": { "baudRate":115200, "port":2, "type":"SUPER_ANAIO" }, "simuNum":2 } ``` ### 上位机查询 IO 配置参数 **命令字:** `0x7131` **请求示例:** ```json {} ``` ### 控制器回复上位机 IO 配置参数 **命令字:** `0x7132` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | IO 数量(包含实体 IO 和虚拟 IO 的总数量) | | portNum | array | 各 IO 端口数二维数组;int 类型
一维为 IO 号,二维依次为:数字输入端口数、数字输出端口数、模拟输入端口数、模拟输出端口数 | | serialAnalog | object | 串行模拟参数 | | serialAnalog.baudRate | int | 波特率 | | serialAnalog.port | int | 端口号,范围(0,65535] | | serialAnalog.type | string | 模拟类型 | | simuNum | int | 虚拟 IO 数量,范围[0,4] | | type | array | 已连接 IO 板型号列表;string 类型 | **响应示例:** ```json { "num":2, "portNum": [ [16,16,2,2], [16,16,2,2] ], "serialAnalog": { "baudRate":115200, "port":2, "type":"SUPER_ANAIO" }, "simuNum":2, "type":["虚拟IO","虚拟IO"] } ``` ## 安全设置 ### 上位机设置安全设置参数 **命令字:** `0x7140` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | quickStop | object | 紧急停止参数 | | quickStop.enable | bool | 紧急停止使能 | | quickStop.port1 | int | 紧急停止1数字输入端口 | | quickStop.port2 | int | 紧急停止2数字输入端口 | | quickStop.shieldFlag1 | bool | 屏蔽紧急停止1 | | quickStop.shieldFlag2 | bool | 屏蔽紧急停止2 | | quickStop.shieldTime | int | 屏蔽紧急停止时间,范围[0,100000)s | | quickStop.time | double | 快速停止时间,范围[50,200]ms | | quickStop.value1 | int | 紧急停止1数字输入参数,范围[0,1] | | quickStop.value2 | int | 紧急停止2数字输入参数,范围[0,1] | | robot | int | 需要设置的机器人号,范围[1,4] | | safeScreen | object | 安全光幕参数 | | safeScreen.enable | bool | 安全光幕使能 | | safeScreen.port1 | int | 安全光幕1数字输入端口 | | safeScreen.port2 | int | 安全光幕2数字输入端口 | | safeScreen.value1 | int | 安全光幕1数字输入参数,范围[0,1] | | safeScreen.value2 | int | 安全光幕2数字输入参数,范围[0,1] | **请求示例:** ```json { "quickStop": { "enable":true, "port1":15, "port2":0, "shieldFlag1":false, "shieldFlag2":true, "shieldTime":30, "time":60.0, "value1":1, "value2":1 }, "robot":1, "safeScreen": { "enable":true, "port1":8, "port2":0, "value1":1, "value2":1 } } ``` ### 上位机查询安全设置参数 **命令字:** `0x7141` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 需要查询的机器人号,范围[1,4] | **请求示例:** ```json { "robot":1 } ``` ### 控制器回复上位机安全设置参数 **命令字:** `0x7142` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | quickStop | object | 紧急停止参数 | | quickStop.enable | bool | 紧急停止使能 | | quickStop.port1 | int | 紧急停止1数字输入端口 | | quickStop.port2 | int | 紧急停止2数字输入端口 | | quickStop.shieldFlag1 | bool | 屏蔽紧急停止1 | | quickStop.shieldFlag2 | bool | 屏蔽紧急停止2 | | quickStop.shieldTime | int | 屏蔽紧急停止时间,范围[0,100000)s | | quickStop.time | double | 快速停止时间,范围[50,200]ms | | quickStop.value1 | int | 紧急停止1数字输入参数,范围[0,1] | | quickStop.value2 | int | 紧急停止2数字输入参数,范围[0,1] | | robot | int | 机器人号,范围[1,4] | | safeScreen | object | 安全光幕参数 | | safeScreen.enable | bool | 安全光幕使能 | | safeScreen.port1 | int | 安全光幕1数字输入端口 | | safeScreen.port2 | int | 安全光幕2数字输入端口 | | safeScreen.value1 | int | 安全光幕1数字输入参数,范围[0,1] | | safeScreen.value2 | int | 安全光幕2数字输入参数,范围[0,1] | **响应示例:** ```json { "quickStop": { "enable":true, "port1":15, "port2":0, "shieldFlag1":false, "shieldFlag2":true, "shieldTime":30, "time":60.0, "value1":1, "value2":1 }, "robot":1, "safeScreen": { "enable":true, "port1":8, "port2":0, "value1":1, "value2":1 } } ``` ## 端口触发信息 > **说明:** 在端口被触发时控制器向上位机发送设置的信息进行提示 ### 上位机设置数字输入端口触发信息 **命令字:** `0x7150` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2]
0:消息
1:警告
2:错误,长度32 | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机查询数字输入端口触发信息 **命令字:** `0x7151` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入触发信息 **命令字:** `0x7152` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机设置数字输出端口触发信息 **命令字:** `0x7153` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机查询数字输出端口触发信息 **命令字:** `0x7154` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出触发信息 **命令字:** `0x7155` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ## 端口名称 > **说明:** 对端口名称进行重命名 ### 上位机设置数字输入端口名称 **命令字:** `0x7160` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的数字输入端口名称列表;string 类型 | **请求示例:** ```json { "name":["AAA","","","","","","","","","","","","","BBB","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机查询数字输入端口名称 **命令字:** `0x7161` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入端口名称 **命令字:** `0x7162` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的数字输入端口名称列表;string 类型 | **响应示例:** ```json { "name":["AAA","","","","","","","","","","","","","BBB","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机设置数字输出端口名称 **命令字:** `0x7163` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的数字输出端口名称列表;string 类型 | **请求示例:** ```json { "name":["","","","","","VV","","","","","","","","","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机查询数字输出端口名称 **命令字:** `0x7164` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出端口名称 **命令字:** `0x7165` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的数字输出端口名称列表;string 类型 | **响应示例:** ```json { "name":["","","","","","VV","","","","","","","","","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机设置模拟输入端口名称 **命令字:** `0x7166` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的模拟输入端口名称列表;string 类型 | **请求示例:** ```json { "name":["","UY","",""] } ``` ### 上位机查询模拟输入端口名称 **命令字:** `0x7167` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输入端口名称 **命令字:** `0x7168` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的模拟输入端口名称列表;string 类型 | **响应示例:** ```json { "name":["","UY","",""] } ``` ### 上位机设置模拟输出端口名称 **命令字:** `0x7169` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的模拟输出端口名称列表;string 类型 | **请求示例:** ```json { "name":["TY","","",""] } ``` ### 上位机查询模拟输出端口名称 **命令字:** `0x716A` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输出端口名称 **命令字:** `0x716B` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的模拟输出端口名称列表;string 类型 | **响应示例:** ```json { "name":["TY","","",""] } ``` ## 输入输出 ### 上位机设置数字输出值 **命令字:** `0x7180` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | int | 要设置的端口号 | | status | int | 要设置的数字输出值,范围[0,2]
0:输出0
1:输出1
2:将输出值翻转(例:原本输出1现在输出0) | **请求示例:** ```json { "port":1, "status":1 } ``` ### 上位机查询数字输出值 **命令字:** `0x7181` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出值 **命令字:** `0x7182` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | status | array | 数字输出状态列表;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "status":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0] } ``` ### 上位机查询数字输入值 **命令字:** `0x7183` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入值 **命令字:** `0x7184` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | status | array | 数字输入状态列表;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "status":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0] } ``` ### 上位机设置模拟输出值 **命令字:** `0x7185` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | int | 要设置的端口号 | | value | double | 要设置的模拟输出值(该节点数值不小于0) | **请求示例:** ```json { "port":1, "value":8.880 } ``` ### 上位机查询模拟输出值 **命令字:** `0x7186` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输出值 **命令字:** `0x7187` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | value | array | 模拟输出当前值;double 类型 | **响应示例:** ```json { "value":[8.87939453125,0.0,0.0,0.0] } ``` ### 上位机查询模拟输入值 **命令字:** `0x7188` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输入值 **命令字:** `0x7189` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | value | array | 模拟输入当前值;double 类型 | **响应示例:** ```json { "value":[9.99755859375,0.0,0.0,0.0] } ``` ## 强制输入 ### 上位机设置强制数字输入 **命令字:** `0x7190` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | int | 是否强制数字输入,范围[0,1] | | port | int | 强制数字输入的端口号 | | status | int | 强制数字输入的当前值 | **请求示例:** ```json { "enable":1, "port":1, "status":0 } ``` ### 上位机查询强制数字输入端口 **命令字:** `0x7191` **请求示例:** ```json {} ``` ### 控制器回复上位机强制数字输入端口 **命令字:** `0x7192` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | array | 强制数字输入的端口号;int 类型 | | status | array | 强制数字输入的值;int 类型 | **响应示例:** ```json { "port":[2,6,12], "status":[0,1,0] } ``` ### 上位机设置强制模拟输入 **命令字:** `0x7193` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | int | 是否强制模拟输入,范围[0,1] | | port | int | 强制模拟输入的端口号 | | status | double | 强制模拟输入的当前值(该节点数值不小于0) | **请求示例:** ```json { "enable":1, "port":2, "status":9.0 } ``` ### 上位机查询强制模拟输入端口 **命令字:** `0x7194` **请求示例:** ```json {} ``` ### 控制器回复上位机强制模拟输入端口 **命令字:** `0x7195` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | array | 强制数字输入的端口号;int 类型 | | status | array | 强制数字输入的值;double 类型 | **响应示例:** ```json { "port":[1,2], "status":[5.0,9.0] } ``` --- # 其他外设 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/03.%E5%85%B6%E4%BB%96%E5%A4%96%E8%AE%BE.html ## 编码器 ### 说明 上位机设置外部轴编码器溢值参数 **命令字:** `0x7200` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalAxis | array | - | 外部轴编码器最大值最小值参数列表,长度为当前外部轴轴数 | | encode | array | - | 编码器最大值最小值参数列表,长度为该轴从动轴数目+1 | | max | double | [-2^32, 2^32] | 编码器最大值 | | min | double | [-2^32, 2^32] | 编码器最小值 | | externalGroupNum | int | [1, 3] | 要设置参数的轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 请求示例 ```json { "externalAxis": [ { "encode": [ { "max": "100.0", "min": "-100.0" } ] } ], "externalGroupNum": 1, "robot": 2 } ``` --- ### 说明 上位机查询外部轴编码器溢值参数 **命令字:** `0x7201` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalGroupNum | int | [1, 3] | 要查询参数的轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 请求示例 ```json { "externalGroupNum": 1, "robot": 2 } ``` --- ### 说明 控制器回复上位机外部轴编码器溢值参数 **命令字:** `0x7202` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalAxis | array | - | 外部轴编码器最大值最小值参数列表,长度为当前外部轴轴数 | | enable | int | [0, 1] | 编码器多圈值溢出计数功能;0表示未开启,1表示已开启 | | encode | array | - | 编码器最大值最小值参数列表,长度为该轴从动轴数目+1 | | max | double | [-2^32, 2^32] | 编码器最大值 | | min | double | [-2^32, 2^32] | 编码器最小值 | | externalGroupNum | int | [1, 3] | 轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 响应示例 ```json { "externalAxis": [ { "enable": 0, "encode": [ { "max": "100.0", "min": "-100.0" } ] } ], "externalGroupNum": 1, "robot": 2 } ``` --- ## 外部接口 ### 说明 上位机查询外部接口数量 **命令字:** `0x7220` #### 请求示例 ```json {} ``` --- ### 说明 控制器回复上位机外部接口数量 **命令字:** `0x7221` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | canPortSum | int | 已连接 CAN 端口数量 | | encodorPortSum | int | 已连接编码器端口数量 | | pwmPortSum | int | 已连接 PWM 端口数量 | #### 响应示例 ```json { "canPortSum": 1, "encodorPortSum": 2, "pwmPortSum": 4 } ``` --- ## 硬盘 ### 说明 上位机查询硬盘状态 **命令字:** `0x7230` #### 请求示例 ```json {} ``` --- ### 说明 控制器回复上位机硬盘状态 **命令字:** `0x7231` #### 参数列表 | 字段名 | 类型 | 单位 | 说明 | |--------|------|------|------| | Estimated Available Time | int | h | 预计可用时间 | | get_harddisk_warning_time | int | h | 硬盘预警时间 | #### 响应示例 ```json { "Estimated Available Time": 200, "get_harddisk_warning_time": 500 } ``` --- ### 说明 上位机设置硬盘预警时间 **命令字:** `0x7232` #### 参数列表 | 字段名 | 类型 | 范围 | 单位 | 说明 | |--------|------|------|------|------| | set_harddisk_warning_time | int | (0, 9999) | h | 硬盘预警时间 | #### 请求示例 ```json { "set_harddisk_warning_time": 50 } ``` --- ## 伺服内部参数 ### 说明 控制器发送伺服内部参数时会十个参数为一组,分多次发送给上位机 ### 上位机设置伺服参数 **命令字:** `0x7240` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1, 4] | 当前机器人号 | | servoNum | int | - | 需要设置的轴号 | | servo | object | - | 伺服内部参数列表;不同机型获取到参数不一致 | | value | int/double | - | 设置的参数值 | | temporary_save | int | [0, 1] | 是否为临时储存;0表示非临时储存,1表示临时储存 | #### 请求示例 ```json { "robot": 1, "servo": { "位置指令低通滤波器截止频率": { "value": 100.0 }, "位置环比例增益1": { "value": 1000.0 }, "位置环比例增益2": { "value": 1000.0 }, "位置环积分时间常数": { "value": 5000.0 }, "功率回路设定": { "value": 196616.0 }, "故障停止选项": { "value": 6.0 }, "电机反电势系数": { "value": 53.0 }, "电机抱闸保持力矩": { "value": 1000.0 }, "电机抱闸制动保持延迟时间": { "value": 100.0 }, "电机抱闸制动允许延迟时间": { "value": 500.0 }, "电机抱闸制动时间": { "value": 60.0 } }, "servoNum": 1, "temporary_save": 0 } ``` --- ### 上位机查询伺服内部参数 **命令字:** `0x7241` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号 | | servoNum | int | 需要查询的轴号 | #### 请求示例 ```json { "robot": 1, "servoNum": 1 } ``` --- ### 控制器回复上位机伺服内部参数 **命令字:** `0x7242` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号 | | servoNum | int | 查询的轴号 | | sendNum | int | 已发送参数数量 | | totalNum | int | 内部参数的总数量 | | servo | object | 伺服内部参数列表;不同机型获取到参数不一致 | #### servo 对象参数 | 字段名 | 类型 | 说明 | |--------|------|------| | hex | bool | 是否为十六进制 | | index | int | 地址 | | lowLimit | int | 最小限制 | | unit | string | 单位 | | upLimit | int | 最大限制 | | value | int/double | 参数值 | #### 响应示例 ```json { "robot": 1, "sendNum": 10, "servo": { "位置指令低通滤波器截止频率": { "hex": false, "index": 8299, "lowLimit": 1, "unit": "0.1HZ", "upLimit": 1000, "value": 100 }, "位置环比例增益1": { "hex": false, "index": 8256, "lowLimit": 0, "unit": "‰", "upLimit": 600000, "value": 1000 }, "位置环比例增益2": { "hex": false, "index": 8258, "lowLimit": 0, "unit": "‰", "upLimit": 600000, "value": 1000 }, "位置环积分时间常数": { "hex": false, "index": 8259, "lowLimit": 125, "unit": "us", "upLimit": 600000, "value": 5000 }, "功率回路设定": { "hex": true, "index": 8236, "lowLimit": 0, "unit": "", "upLimit": 196623, "value": 196616 }, "故障停止选项": { "hex": true, "index": 8339, "lowLimit": 0, "unit": "", "upLimit": 197379, "value": 0 }, "电机反电势系数": { "hex": false, "index": 8390, "lowLimit": 1, "unit": "mV/rpm", "upLimit": 10000, "value": 53 }, "电机抱闸保持力矩": { "hex": false, "index": 8756, "lowLimit": 1, "unit": "mNm", "upLimit": 600000, "value": 1000 }, "电机抱闸制动保持延迟时间": { "hex": false, "index": 8250, "lowLimit": 0, "unit": "ms", "upLimit": 10000, "value": 100 }, "电机抱闸制动允许延迟时间": { "hex": false, "index": 8254, "lowLimit": 0, "unit": "ms", "upLimit": 10000, "value": 500 } }, "servoNum": 1, "totalNum": 38 } ``` --- ## 星辰一号 ### 上位机查询编码器范围 **命令字:** `0x7250` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | #### 请求示例 ```json { "encodorPort": 1 } ``` --- ### 控制器回复上位机编码器范围 **命令字:** `0x7251` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | | encodorMax | int | 编码器范围最大值 | | encodorMin | int | 编码器范围最小值 | #### 响应示例 ```json { "encoderMax": 100, "encoderMin": 0, "encodorPort": 1 } ``` --- ### 上位机查询编码器值 **命令字:** `0x7252` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | #### 请求示例 ```json { "encodorPort": 1 } ``` --- ### 控制器回复上位机编码器值 **命令字:** `0x7253` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | | encodorValue | int | 编码器值 | #### 响应示例 ```json { "encodorPort": 1, "encodorValue": 5 } ``` --- ## PWM ### 上位机设置 PWM 参数 **命令字:** `0x7260` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | pwmPort | UInt | - | PWM 端口 | | duty | double | - | PWM 占空比 | | freq | double | - | PWM 频率 | | pwmOutTimeMs | UInt | [1000, 5000] ms | PWM 输出时间;输入0时则一直输出 PWM | #### 请求示例 ```json { "duty": 50, "freq": 1000, "pwmOutTimeMs": 1000, "pwmPort": 1 } ``` --- ### 上位机查询 PWM 参数 **命令字:** `0x7261` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | pwmPort | UInt | PWM 端口 | #### 请求示例 ```json { "pwmPort": 1 } ``` --- ### 控制器回复上位机 PWM 参数 **命令字:** `0x7262` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | pwmPort | UInt | PWM 端口 | | duty | double | PWM 占空比 | | freq | double | PWM 频率 | #### 响应示例 ```json { "duty": 50, "freq": 1000, "pwmPort": 1 } ``` --- ### 控制器回复上位机输出时间结果 **命令字:** `0x7263` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | ok | bool | 输出时间结果 | #### 响应示例 ```json { "ok": true } ``` --- # Modbus > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/04.Modbus.html ## 1. 上位机设置 modbus 主站参数 **命令字:** `0x7300` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | masterStation | object | 是 | 主站参数,包含 RTU 参数和 TCP 参数 | | startAddress | bool | 否 | 地址偏移;true 表示地址不变,false 表示地址自动-1 | #### masterStation 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 主站类型;取值"TCP","RTU" | | processNumber | int | 是 | 需要设置的工艺号;范围[1,9] | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | checkBit | string | 是 | 校验位;取值"N","E","O" | | dataBit | int | 是 | 数据位;范围[5,8] | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | | stopBit | int | 是 | 停止位;范围[0,1] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址 | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 请求示例 ```json { "masterStation": { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 2, "slaveId": 1, "stopBit": 1 }, "TCP": { "IP": "192.168.1.14", "endian_type": 1, "port": 503 }, "processNumber": 1, "type": "TCP" }, "startAddress": false } ``` --- ## 2. 上位机查询 modbus 参数 **命令字:** `0x7301` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 需要查询的工艺号;范围[1,9] | ### 请求示例 ```json { "processNumber": 1 } ``` --- ## 3. 控制器回复上位机 modbus 参数 **命令字:** `0x7302` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 主站类型;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | modbus_state | bool | 是 | Modbus 连接状态;true 表示已连接,false 表示未连接 | | response_time_out | int | 是 | 读写响应时间;单位 ms | | startAddress | bool | 是 | 地址偏移;true 表示地址不变,false 表示地址自动-1 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | checkBit | string | 是 | 校验位;取值"N","E","O" | | dataBit | int | 是 | 数据位;范围[5,8] | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | | stopBit | int | 是 | 停止位;范围[0,1] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址 | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 响应示例 ```json { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 2, "slaveId": 1, "stopBit": 1 }, "TCP": { "IP": "192.168.1.14", "endian_type": 1, "port": 503 }, "modbus_state": false, "response_time_out": 100, "startAddress": false, "type": "TCP" } ``` --- ## 4. 上位机查询 modbus 连接状态 **命令字:** `0x7303` ### 请求示例 ```json {} ``` --- ## 5. 控制器回复上位机 modbus 连接状态 **命令字:** `0x7304` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ModbusConnect | bool | 是 | modbus 连接状态;true 表示已连接,false 表示未连接 | ### 响应示例 ```json { "ModbusConnect": false } ``` --- ## 6. 上位机设置 modbus 从站参数 **命令字:** `0x7305` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 通讯方式;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 | | scancycle | int | 是 | 扫描周期;范围[8,1000]ms | | stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址(默认值) | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 请求示例 ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "endian_type": 0, "port": 502 }, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` --- ## 7. 上位机查询 modbus 从站参数 **命令字:** `0x7306` ### 请求示例 ```json {} ``` --- ## 8. 控制器回复上位机 modbus 从站参数 **命令字:** `0x7307` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 通讯方式;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | enable | bool | 是 | 连接使能 | | master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 | | scancycle | int | 是 | 扫描周期;范围[8,1000]ms | | stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址(默认值) | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 响应示例 ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "endian_type": 0, "port": 502 }, "enable": false, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` --- ## 9. 上位机设置 modbus 从站连接使能 **命令字:** `0x7308` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | enable | bool | 是 | modbus 从站连接使能 | ### 请求示例 ```json { "enable": true } ``` --- ## 10. 上位机设置 modbus 从站心跳检测使能 **命令字:** `0x7309` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | checkheart | bool | 是 | 心跳检测使能 | ### 请求示例 ```json { "checkheart": true } ``` --- ## 11. 上位机查询 modbus 从站心跳检测使能 **命令字:** `0x703A` ### 请求示例 ```json {} ``` --- ## 12. 控制器回复上位机 modbus 从站心跳检测使能 **命令字:** `0x703B` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | checkheart | bool | 是 | 心跳检测使能 | ### 响应示例 ```json { "checkheart": true } ``` --- ## 13. 上位机设置 modbus 程序 **命令字:** `0x703C` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobname | string | 是 | 已选程序名称 | | programid | int | 是 | 程序序号;范围[1,300] | | robot | int | 是 | 当前机器人号 | ### 请求示例 ```json { "jobname": "AA", "programid": 1, "robot": 1 } ``` --- ## 14. 上位机查询 modbus 程序 **命令字:** `0x703D` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | num | int | 是 | 查询数量;固定为10 | | robot | int | 是 | 当前机器人号 | | startprogramid | int | 是 | 查询序列起始程序序号;范围[1,30] | ### 请求示例 ```json { "num": 10, "robot": 1, "startprogramid": 1 } ``` --- ## 15. 控制器回复上位机 modbus 程序 **命令字:** `0x703E` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobnamelist | array | 是 | 程序名称列表;长度为10 | | robot | int | 是 | 当前机器人号 | | startprogramid | int | 是 | 序列起始程序序号;范围[1,30] | | sum | int | 是 | 可选程序总数 | ### 响应示例 ```json { "jobnamelist": ["AA", "", "", "", "", "", "", "", "", ""], "robot": 1, "startprogramid": 1, "sum": 300 } ``` ## 16. 上位机 Modbus 读线圈(功能码 01H) **命令字:** `0x7310` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `1`(01H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 2000] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 1, "address": 0, "quantity": 10 } ``` ## 17. 控制器回复 Modbus 读线圈(功能码 01H) **命令字:** `0x7311` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `1`(01H) | | data | int[] | 是 | 读取到的线圈状态数组;值为 `0` 或 `1` | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 1, "data": [0, 1, 1, 0, 0, 1, 0, 1, 1, 0], "success": true } ``` ## 18. 上位机 Modbus 读输入状态(功能码 02H) **命令字:** `0x7312` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `2`(02H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 2000] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 2, "address": 100, "quantity": 16 } ``` ## 19. 控制器回复 Modbus 读输入状态(功能码 02H) **命令字:** `0x7313` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `2`(02H) | | data | int[] | 是 | 读取到的输入状态数组;值为 `0` 或 `1` | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 2, "data": [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1], "success": true } ``` ## 20. 上位机 Modbus 读保持寄存器(功能码 03H) **命令字:** `0x7314` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `3`(03H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 125] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 3, "address": 200, "quantity": 5 } ``` ## 21. 控制器回复 Modbus 读保持寄存器(功能码 03H) **命令字:** `0x7315` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `3`(03H) | | data | int[] | 是 | 读取到的保持寄存器值数组;范围 [0, 65535] | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 3, "data": [1234, 5678, 910, 1112, 1314], "success": true } ``` ## 22. 上位机 Modbus 读输入寄存器(功能码 04H) **命令字:** `0x7316` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `4`(04H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 125] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 4, "address": 300, "quantity": 8 } ``` ## 23. 控制器回复 Modbus 读输入寄存器(功能码 04H) **命令字:** `0x7317` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `4`(04H) | | data | int[] | 是 | 读取到的输入寄存器值数组;范围 [0, 65535] | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 4, "data": [100, 200, 300, 400, 500, 600, 700, 800], "success": true } ``` ## 24. 上位机 Modbus 写单个线圈(功能码 05H) **命令字:** `0x7318` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `5`(05H) | | address | int | 是 | 线圈地址 | | value | int | 是 | 写入值;`0` 或 `1` | ### 请求示例 ```json { "processNumber": 1, "functionCode": 5, "address": 10, "value": 1 } ``` ## 25. 控制器回复 Modbus 写单个线圈(功能码 05H) **命令字:** `0x7319` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `5`(05H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 5, "success": true } ``` ## 26. 上位机 Modbus 写单个保持寄存器(功能码 06H) **命令字:** `0x731A` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `6`(06H) | | address | int | 是 | 寄存器地址 | | value | int | 是 | 写入值;范围 [0, 65535] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 6, "address": 200, "value": 9999 } ``` ## 27. 控制器回复 Modbus 写单个保持寄存器(功能码 06H) **命令字:** `0x731B` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `6`(06H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 6, "success": true } ``` ## 28. 上位机 Modbus 写多个线圈(功能码 0FH) **命令字:** `0x731C` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `15`(0FH) | | address | int | 是 | 起始地址 | | data | int[] | 是 | 写入的线圈值数组;每个元素为 `0` 或 `1` | ### 请求示例 ```json { "processNumber": 1, "functionCode": 15, "address": 20, "data": [1, 0, 1, 0, 1, 1, 0, 0, 1, 0] } ``` ## 29. 控制器回复 Modbus 写多个线圈(功能码 0FH) **命令字:** `0x731D` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `15`(0FH) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 15, "success": true } ``` ## 30. 上位机 Modbus 写多个保持寄存器(功能码 10H) **命令字:** `0x731E` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `16`(10H) | | address | int | 是 | 起始地址 | | data | int[] | 是 | 写入的寄存器值数组;每个元素范围 [0, 65535] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 16, "address": 200, "data": [100, 200, 300, 400, 500] } ``` ## 31. 控制器回复 Modbus 写多个保持寄存器(功能码 10H) **命令字:** `0x731F` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `16`(10H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 16, "success": true } ``` ## Modbus 功能码汇总 | 功能码 | 名称 | 命令字(请求) | 命令字(回复) | 说明 | |--------|------|---------------|---------------|------| | 01H | 读线圈 | `0x7310` | `0x7311` | 读取从站线圈状态(位操作,读/写) | | 02H | 读输入状态 | `0x7312` | `0x7313` | 读取从站离散输入状态(位操作,只读) | | 03H | 读保持寄存器 | `0x7314` | `0x7315` | 读取从站保持寄存器(16 位操作,读/写) | | 04H | 读输入寄存器 | `0x7316` | `0x7317` | 读取从站输入寄存器(16 位操作,只读) | | 05H | 写单个线圈 | `0x7318` | `0x7319` | 写从站单个线圈状态 | | 06H | 写单个保持寄存器 | `0x731A` | `0x731B` | 写从站单个保持寄存器 | | 0FH | 写多个线圈 | `0x731C` | `0x731D` | 写从站多个线圈状态 | | 10H | 写多个保持寄存器 | `0x731E` | `0x731F` | 写从站多个保持寄存器 | ## Modbus 通讯说明 ### 主站操作流程 1. **设置主站参数**:通过 `0x7300` 设置 Modbus 主站参数(TCP/RTU 模式、端口、从站 ID 等) 2. **建立连接**:主站参数设置后,通讯自动建立(TCP 模式)或通过串口建立(RTU 模式) 3. **查询状态**:通过 `0x7303` 查询连接状态,通过 `0x7304` 获取回复 4. **读写操作**:使用功能码命令(`0x7310`-`0x731F`)进行读写操作 5. **断开连接**:TCP 模式下可关闭连接,RTU 模式下串口保持打开 ### 从站操作流程 1. **设置从站参数**:通过 `0x7305` 设置从站参数 2. **使能连接**:通过 `0x7308` 使能从站连接 3. **心跳检测**:通过 `0x7309` 设置心跳使能 ### 地址偏移说明 - `startAddress` 为 `false` 时,写入的地址会自动减 1(适用于多数 PLC,如西门子等起始地址为 1 的设备) - `startAddress` 为 `true` 时,写入的地址保持不变(适用于起始地址为 0 的设备) ### 注意事项 - 每次读写操作需确保 Modbus 连接已建立,否则操作将失败 - 读取数量受 Modbus 协议限制:线圈/输入状态最多 2000 个,寄存器最多 125 个 - 写多个线圈函数会自动将数据打包为 Modbus 协议格式发送 - TCP 模式的 Float 大小端通过 `endian_type` 参数控制 --- # Tcp 通讯 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/05.Tcp%E9%80%9A%E8%AE%AF.html ## 上位机设置 Tcp 通讯参数 **命令字:** `0x7320` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | client | object | 否 | 客户端参数,当 `type` 为 1 时该节点存在 | | client.frameHeader | string | 否 | 数据帧头,留空为没有 | | client.ip | string | 否 | 需要连接的服务器 IP | | client.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | client.port | int | 否 | 通讯端口,范围 (0, 65535] | | client.separator | string | 否 | 数据分隔符 | | client.terminator | string | 否 | 数据帧尾,留空为没有 | | server | object | 否 | 服务器参数,当 `type` 为 0 时该节点存在 | | server.frameHeader | string | 否 | 数据帧头,留空为没有 | | server.ip | string | 否 | 当前用作服务器 IP | | server.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | server.port | int | 否 | 通讯端口,范围 (0, 65535] | | server.separator | string | 否 | 数据分隔符 | | server.terminator | string | 否 | 数据帧尾,留空为没有 | | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 当前机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件 | ### 请求示例 ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 0, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "robot": 1, "server": { "frameHeader": "@", "ip": "192.168.0.229", "numberSystem": 0, "port": 9001, "separator": ",", "terminator": "!" }, "type": 1 } ``` --- ## 上位机查询 Tcp 通讯参数 **命令字:** `0x7321` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件;为 2 时控制器发送服务器参数 | ### 请求示例 ```json { "craft": 1, "robot": 1, "type": 2 } ``` --- ## 控制器回复 Tcp 通讯参数 **命令字:** `0x7322` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | client | object | 否 | 客户端参数,当 `type` 为 1 时该节点存在 | | client.frameHeader | string | 否 | 数据帧头,留空为没有 | | client.ip | string | 否 | 需要连接的服务器 IP | | client.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | client.port | int | 否 | 通讯端口,范围 (0, 65535] | | client.separator | string | 否 | 数据分隔符 | | client.terminator | string | 否 | 数据帧尾,留空为没有 | | server | object | 否 | 服务器参数,当 `type` 为 0 时该节点存在 | | server.frameHeader | string | 否 | 数据帧头,留空为没有 | | server.ip | string | 否 | 当前用作服务器 IP | | server.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | server.port | int | 否 | 通讯端口,范围 (0, 65535] | | server.separator | string | 否 | 数据分隔符 | | server.terminator | string | 否 | 数据帧尾,留空为没有 | | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 当前机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件 | ### 响应示例 ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 0, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "robot": 1, "server": { "frameHeader": "@", "ip": "192.168.0.229", "numberSystem": 0, "port": 9001, "separator": ",", "terminator": "!" }, "type": 1 } ``` --- ## 上位机请求连接 Tcp 通讯 **命令字:** `0x7323` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` --- ## 上位机请求断开 Tcp 通讯 **命令字:** `0x7324` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` ## 上位机查询 Tcp 通讯连接状态 **命令字:** `0x7325` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` ## 控制器回复 Tcp 通讯连接状态 **命令字:** `0x7326` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | status | int | 是 | 连接状态;0-未连接,1-已连接 | ### 响应示例 ```json { "craft": 1, "robot": 1, "status": 1 } ``` ## 上位机发送 Tcp 数据 **命令字:** `0x7327` > **说明:** 上位机通过已建立的 TCP 连接向对端发送字符串数据。发送前需确保 TCP 连接已建立。 ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | data | string | 是 | 要发送的字符串数据 | ### 请求示例 ```json { "craft": 1, "robot": 1, "data": "Hello, this is a test message!" } ``` ## 控制器主动推送 Tcp 接收数据 **命令字:** `0x7328` > **说明:** 当 TCP 连接接收到对端发来的数据时,控制器会主动向上位机推送接收到的数据。 ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | data | string | 是 | 接收到的字符串数据 | ### 推送示例 ```json { "craft": 1, "robot": 1, "data": "Received message from peer" } ``` ## TCP 通讯协议说明 ### 数据帧格式 TCP 通讯支持自定义数据帧格式,通过设置 `frameHeader`(帧头)、`separator`(分隔符)和 `terminator`(帧尾)来定义数据帧的边界: - **帧头(`frameHeader`)**:数据帧的起始标记,留空表示无帧头 - **分隔符(`separator`)**:数据域之间的分隔字符,用于解析多个数据字段 - **帧尾(`terminator`)**:数据帧的结束标记,留空表示无帧尾 - **数据进制(`numberSystem`)**:接收数据时的解析进制,`0` 为十进制,`1` 为十六进制 ### 连接管理流程 1. **设置参数**:通过 `0x7320` 设置 TCP 通讯参数(服务器/客户端模式、IP、端口等) 2. **建立连接**:通过 `0x7323` 请求建立 TCP 连接 3. **数据收发**:通过 `0x7327` 发送数据,通过 `0x7328` 接收推送数据 4. **查询状态**:通过 `0x7325` 查询连接状态 5. **断开连接**:通过 `0x7324` 请求断开 TCP 连接 ### 服务器模式(type=0) 当 `type` 为 `0` 时,控制器作为 TCP 服务器,绑定 `server.ip` 和 `server.port`,等待客户端连接。 ### 客户端模式(type=1) 当 `type` 为 `1` 时,控制器作为 TCP 客户端,主动连接 `client.ip` 和 `client.port` 指定的服务器。 ### 配置文件模式(type=2) 当 `type` 为 `2` 时,控制器读取配置文件中的 TCP 通讯参数,上位机可通过 `0x7321` 查询配置。 ### 注意事项 - 通讯双方的数据帧格式(帧头、分隔符、帧尾)必须保持一致,否则可能导致数据解析错误 - 进制设置仅影响接收数据的解析,发送数据始终以原始字符串形式发送 - 同一工艺号同时只能维持一种连接模式(服务器或客户端) --- # 数据上传 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/06.%E6%95%B0%E6%8D%AE%E4%B8%8A%E4%BC%A0.html ## 概述 数据上传功能用于将控制器运行过程中采集的数据(如关节角度、速度、力矩、IO 状态等)按照配置的格式和周期上传至远程服务器。支持 FTP 上传方式,可自定义文件格式、采集周期和上传周期。 ### 工作流程 ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 控制器 │ │ 上位机 │ │ FTP 服务器│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ 配置上传参数 │ │<──────────────│ 0x7333 │ │ │ │ │ 周期采集数据 │ │ │──────┐ │ │ │ │ (采集) │ │ │<─────┘ │ │ │ │ │ │ 上传周期到达 │ │ │──────────────────────────────>│ FTP 上传 │ │ │ ``` ### 核心概念 | 概念 | 说明 | |------|------| | 采集周期 | 控制器从机器人读取数据的频率 | | 上传周期 | 将采集到的数据打包上传至服务器的频率 | | 数据文件 | 包含机器人运行数据的文件(csv/txt) | | 说明文档 | 包含数据列定义的辅助文件 | --- ## 1. 数据传输开关 ### 1.1 上位机设置数据传输开关 **命令字:** `0x7330` | 参数名 | 类型 | 描述 | |--------|------|------| | enable | bool | 数据传输开关,true-开启,false-关闭 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "enable": true, "robot": 1 } ``` > 开启数据传输后,控制器按配置的采集周期开始采集数据,并按上传周期发送至服务器。 ### 1.2 上位机查询数据传输开关 **命令字:** `0x7331` | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` ### 1.3 控制器回复数据传输开关 **命令字:** `0x7332` | 参数名 | 类型 | 描述 | |--------|------|------| | enable | bool | 数据传输开关 | | robot | int | 当前机器人号 | ```json { "enable": false, "robot": 1 } ``` --- ## 2. 数据上传参数 ### 2.1 上位机设置数据上传参数 **命令字:** `0x7333` | 参数名 | 类型 | 范围/取值 | 描述 | |--------|------|-----------|------| | dataCollectTime | double | [0.001, 999999] 秒 | 数据采集周期,即每隔多少秒采集一次数据 | | dataUploadTime | double | [0.001, 999999] 秒 | 数据上传周期,即每隔多少秒上传一次数据文件 | | fileSuffix | string | "csv" / "txt" | 文件格式。csv 为逗号分隔值,txt 为空格或制表符分隔 | | filepath | string | - | FTP 服务器上的文件存放路径,如 "/robot_data/" | | password | string | - | FTP 登录密码 | | robot | int | [1, 4] | 机器人号 | | sendInfoFileFlag | bool | - | 是否发送说明文档。true-每次上传同时发送说明文档 | | serverIP | string | - | FTP 服务器 IP 地址 | | serverPort | int | (0, 65535] | FTP 服务器端口,默认 21 | | uploadMode | string | 默认 "FTP" | 上传方式,当前仅支持 "FTP" | | username | string | - | FTP 登录用户名 | ### 参数配置建议 | 参数 | 推荐值 | 说明 | |------|--------|------| | dataCollectTime | 0.01~1.0 s | 高频采集用于精细运动分析,低频用于长期监控 | | dataUploadTime | 30~300 s | 上传间隔应考虑文件大小和网络带宽 | | fileSuffix | "csv" | csv 格式兼容性好,易于 Excel 等工具打开 | | sendInfoFileFlag | true | 首次上传建议开启,便于理解数据列含义 | ```json { "dataCollectTime": 1.0, "dataUploadTime": 30.0, "fileSuffix": "csv", "filepath": "/robot_data/", "password": "123456", "robot": 1, "sendInfoFileFlag": true, "serverIP": "192.168.1.14", "serverPort": 21, "uploadMode": "FTP", "username": "admin" } ``` ### 2.2 上位机查询数据上传参数 **命令字:** `0x7334` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | robot | int | [1, 4] | 机器人号 | ```json { "robot": 1 } ``` ### 2.3 控制器回复数据上传参数 **命令字:** `0x7335` | 参数名 | 类型 | 范围/取值 | 描述 | |--------|------|-----------|------| | dataCollectTime | double | [0.001, 999999]s | 数据采集周期 | | dataUploadTime | double | [0.001, 999999]s | 数据上传周期 | | fileSuffix | string | "csv" / "txt" | 文件格式 | | filepath | string | - | 文件路径 | | password | string | - | 密码 | | robot | int | [1, 4] | 机器人号 | | sendInfoFileFlag | bool | - | 是否发送说明文档 | | serverIP | string | - | 服务器 IP | | serverPort | int | (0, 65535] | 端口号 | | uploadMode | string | 默认 "FTP" | 上传方式 | | username | string | - | 用户名 | ```json { "dataCollectTime": 1.0, "dataUploadTime": 30.0, "fileSuffix": "csv", "filepath": "/robot_data/", "password": "123456", "robot": 1, "sendInfoFileFlag": true, "serverIP": "192.168.1.14", "serverPort": 21, "uploadMode": "FTP", "username": "admin" } ``` --- ## 3. 数据格式 > **说明:** 上位机设置与查询分四次进行,分别对应说明文档文件名、说明文档文件内容、数据文档文件名、数据文档文件内容的格式。 ### 3.1 上位机设置数据格式 **命令字:** `0x7336` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | format | string | - | 数据格式模板,支持占位符 | | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | #### type 取值说明 | 值 | 描述 | 应用场景 | |----|------|----------| | 1 | 说明文档文件名 | 定义发送的说明文档的文件命名规则 | | 2 | 说明文档文件内容 | 定义说明文档中数据列的名称与排列 | | 3 | 数据文档文件名 | 定义数据文件的文件命名规则 | | 4 | 数据文档文件内容 | 定义数据文件中每行数据的排列格式 | #### 格式模板占位符 格式字符串中使用以下占位符,上传时自动替换为实际值: | 占位符 | 替换内容 | 示例输出 | |--------|----------|----------| | `$Y%` | 4 位年份 | 2024 | | `$m%` | 2 位月份 | 03 | | `$d%` | 2 位日期 | 15 | | `$H%` | 2 位小时(24小时制) | 14 | | `$M%` | 2 位分钟 | 30 | | `$S%` | 2 位秒 | 00 | | `$R%` | 机器人号 | 1 | | `$N%` | 递增序号 | 001 | | `TEXT` | 普通文本(原样输出) | Robot-R1 | #### type=1 示例(说明文档文件名) ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%_Info.txt", "robot": 1, "type": 1 } ``` > 生成的说明文档文件名示例:`Robot-R1_2024-03-15_14-30-00_Info.txt` #### type=3 示例(数据文档文件名) ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%", "robot": 1, "type": 3 } ``` > 生成的数据文件名示例:`Robot-R1_2024-03-15_14-30-00.csv` ### 3.2 上位机查询数据格式 **命令字:** `0x7337` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | ```json { "robot": 1, "type": 1 } ``` ### 3.3 控制器回复数据格式 **命令字:** `0x7338` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | format | string | - | 数据格式模板 | | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%", "robot": 1, "type": 1 } ``` --- ## 4. 触发方式 ### 定时触发 数据上传默认采用定时触发方式,由 `dataUploadTime` 控制上传间隔。 - 控制器内部维护一个上传定时器 - 定时器到达 `dataUploadTime` 时,将采集缓冲区数据写入文件并上传 - 上传完成后重置定时器,进入下一周期 ### 条件触发(手动触发) **命令字:** `0x7339` 除了定时触发外,上位机可随时发送命令触发一次即时上传。 #### 请求参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人号,范围 [1, 4] | | command | string | "upload_now"-立即上传,"clear_buffer"-清空采集缓冲区 | #### 请求示例 ```json { "robot": 1, "command": "upload_now" } ``` --- ## 5. 上传内容定义 ### 数据文件内容(type=4) type=4 的格式定义决定了数据文件中每行的数据排列。格式字符串由变量名和分隔符组成。 #### 可用数据变量 | 变量名 | 说明 | 数据类型 | |--------|------|----------| | `$JT1%` ~ `$JT6%` | 关节 1~6 的角度 | double (°) | | `$JV1%` ~ `$JV6%` | 关节 1~6 的速度 | double (°/s) | | `$JTQ1%` ~ `$JTQ6%` | 关节 1~6 的力矩 | double (Nm) | | `$TCX%` / `$TCY%` / `$TCZ%` | TCP 位置 X/Y/Z | double (mm) | | `$TRX%` / `$TRY%` / `$TRZ%` | TCP 姿态 RX/RY/RZ | double (°) | | `$DI1%` ~ `$DIN%` | 数字输入 | int (0/1) | | `$DO1%` ~ `$DON%` | 数字输出 | int (0/1) | | `$TS%` | 时间戳 | int (ms) | #### 请求示例(type=4) ```json { "format": "$TS%,$JT1%,$JT2%,$JT3%,$JT4%,$JT5%,$JT6%,$TCX%,$TCY%,$TCZ%", "robot": 1, "type": 4 } ``` > 生成的数据行示例:`12345,10.5,-20.3,45.0,0.5,30.2,-90.0,500.1,100.0,250.5` ### 说明文档内容(type=2) type=2 定义说明文档中数据列标题。通常与 type=4 的数据排列一一对应。 ```json { "format": "时间戳(ms),关节1(deg),关节2(deg),关节3(deg),关节4(deg),关节5(deg),关节6(deg),TCP_X(mm),TCP_Y(mm),TCP_Z(mm)", "robot": 1, "type": 2 } ``` --- ## 6. 上传状态反馈 ### 控制器上报上传状态 **命令字:** `0x733A` 每次上传操作完成后,控制器主动上报上传结果。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | status | int | 上传状态,0-成功,1-失败,2-上传中 | | fileName | string | 上传的文件名 | | fileSize | int | 文件大小(字节) | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "robot": 1, "status": 0, "fileName": "Robot-R1_2024-03-15_14-30-00.csv", "fileSize": 20480, "errorMsg": "" } ``` --- ## 7. 常见问题 ### 上传失败排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 上传失败 | FTP 服务器地址错误 | 检查 `serverIP` 和 `serverPort` | | 上传失败 | 用户名/密码错误 | 检查 `username` 和 `password` | | 上传失败 | 路径不存在 | 确认 FTP 服务器上 `filepath` 目录存在 | | 上传失败 | 网络不通 | 用 ping 测试控制器与 FTP 服务器连通性 | | 文件为空 | 采集周期过大 | 减小 `dataCollectTime`,增大 `dataUploadTime` | | 文件为空 | 数据变量未配置 | 检查 type=4 格式是否包含有效变量 | | 文件命名错乱 | 格式占位符错误 | 确认占位符语法正确 | ### 性能建议 - 长时间运行建议设置较大的上传周期(如 300s),避免产生过多小文件 - 高频采集(dataCollectTime < 0.01s)时注意控制器内存占用 - FTP 服务器应有足够的磁盘空间,定期清理历史数据文件 - `sendInfoFileFlag` 改为 false 可减少上传数据量(仅首次需要说明文档) --- # finsTCP > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/07.finsTCP.html ## 概述 FINS(Factory Interface Network Service)是欧姆龙(Omron)PLC 的专用通信协议,FINS/TCP 是通过 TCP/IP 网络封装 FINS 命令的通信方式。本控制器通过 FINS/TCP 协议与欧姆龙 PLC 进行数据交互,支持读写 PLC 的 DM 数据区。 ### 协议栈结构 ```text ┌─────────────────────┐ │ FINS 命令/响应 │ ← 应用层 ├─────────────────────┤ │ FINS 帧头 │ ← FINS Header (10字节) ├─────────────────────┤ │ TCP 封装 │ ← TCP/IP 传输层 └─────────────────────┘ ``` ### 数据区映射 | 数据类型 | PLC 地址区 | 本机映射 | 说明 | |----------|------------|----------|------| | DM 区 | DM0 ~ DM9999 | 全局变量区 | 数据存储区,支持读写 | | 布尔量 | - | 全局布尔变量 | 本机与 PLC DM 区按位映射 | --- ## 1. 上位机设置 finsTCP 参数 **命令字:** `0x7340` ### 参数列表 | 参数名 | 类型 | 说明 | 范围/格式 | |--------|------|------|-----------| | IP | string | PLC 的 IP 地址 | 标准 IPv4 格式 | | PLCReadAddress | string | PLC 读取首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | PLCWriteAddress | string | PLC 写入首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | craftNum | int | 工艺号 | 范围 [1, 9] | | localReadAddress | int[] | 本机读取首地址列表 | 范围 [1, 990],第一位为全局布尔首地址,第二位为全局整型首地址 | | localWriteAddress | int[] | 本机写入首地址列表 | 范围 [1, 990],第一位为全局布尔首地址,第二位为全局整型首地址 | | port | int | 端口号 | 范围 [0, 65535],欧姆龙默认 9600 | ### 配置说明 - **PLCReadAddress**:控制器从 PLC 的此地址开始读取数据到本机 `localReadAddress` - **PLCWriteAddress**:控制器将本机 `localWriteAddress` 的数据从此地址开始写入 PLC - **localReadAddress[0]**:全局布尔变量起始地址,**localReadAddress[1]**:全局整型变量起始地址 - 读写数据长度在 PLC 侧可配置,本机侧根据实际变量数量自动计算 ### 请求示例 ```json { "IP": "192.168.1.10", "PLCReadAddress": "DM2000", "PLCWriteAddress": "DM1000", "craftNum": 1, "localReadAddress": [500, 500], "localWriteAddress": [100, 100], "port": 9600 } ``` --- ## 2. 上位机查询 finsTCP 参数 **命令字:** `0x7341` ### 参数列表 | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | craftNum | int | 查询的工艺号名称 | 范围 [1, 9] | ### 请求示例 ```json { "craftNum": 1 } ``` --- ## 3. 控制器回复上位机 finsTCP 参数 **命令字:** `0x7342` ### 参数列表 | 参数名 | 类型 | 说明 | 范围/格式 | |--------|------|------|-----------| | IP | string | IP 地址 | - | | PLCReadAddress | string | PLC 读取首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | PLCWriteAddress | string | PLC 写入首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | craftNum | int | 工艺号 | 范围 [1, 9] | | localReadAddress | int[] | 本机读取首地址列表 | 范围 [1, 990] | | localWriteAddress | int[] | 本机写入首地址列表 | 范围 [1, 990] | | port | int | 端口号 | 范围 [0, 65535] | | status | int | 通讯状态 | 0-未连接,1-已连接 | ### 响应示例 ```json { "IP": "192.168.1.10", "PLCReadAddress": "DM2000", "PLCWriteAddress": "DM1000", "craftNum": 1, "localReadAddress": [500, 500], "localWriteAddress": [100, 100], "port": 9600, "status": 0 } ``` --- ## 4. 上位机请求连接通讯 **命令字:** `0x7343` 发送此命令后,控制器尝试与 PLC 建立 FINS/TCP 通信连接。 ### 请求示例 ```json {} ``` ### 连接流程 1. 上位机发送连接命令 `0x7343` 2. 控制器通过 TCP 三次握手与 PLC 建立连接 3. 控制器发送 FINS 节点地址数据发送(CLIENT TO SERVER)命令注册节点 4. 连接成功后控制器回复状态 `0x7345`(status=1) 5. 开始周期性地将本机数据写入 PLC,并从 PLC 读取数据 --- ## 5. 上位机请求断开通讯 **命令字:** `0x7344` 发送此命令后,控制器断开与 PLC 的 FINS/TCP 连接,停止数据交换。 ### 请求示例 ```json {} ``` --- ## 6. 控制器发送 finsTCP 通讯连接状态 **命令字:** `0x7345` ### 参数列表 | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | status | int | 通讯连接状态 | 0-未连接,1-已连接 | ### 响应示例 ```json { "status": 0 } ``` --- ## 7. 控制器发送 fins 打开的程序名称 **命令字:** `0x7346` ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | programName | string | 打开的程序名称 | ### 响应示例 ```json "AAA" ``` --- ## 8. FINS 协议帧格式 ### FINS 命令帧结构 FINS 命令帧由 FINS Header + FINS Command 组成,封装在 TCP 数据中。 | 字节偏移 | 长度(字节) | 字段名 | 说明 | |----------|------------|--------|------| | 0 | 4 | ICF | 信息控制字段 | | 4 | 4 | RSV | 保留字段(固定 0x00) | | 8 | 2 | GCT | 网关计数(通常 0x02) | | 10 | 1 | DNA | 目标网络地址(0x00=本地) | | 11 | 1 | DA1 | 目标节点号 | | 12 | 1 | DA2 | 目标单元号(0x00=CPU单元) | | 13 | 1 | SNA | 源网络地址 | | 14 | 1 | SA1 | 源节点号 | | 15 | 1 | SA2 | 源单元号 | | 16 | 2 | SID | 服务标识(请求/响应匹配用) | | 18 | 2 | MRC | 主请求码 | | 20 | 2 | SRC | 子请求码 | | 22 | N | Data | 命令数据(变长) | ### 常用命令码 | MRC | SRC | 命令名称 | 说明 | |-----|-----|----------|------| | 0x01 | 0x01 | MEMORY AREA READ | 读取指定存储区数据 | | 0x01 | 0x02 | MEMORY AREA WRITE | 向指定存储区写入数据 | | 0x01 | 0x03 | MEMORY AREA FILL | 填充存储区数据 | | 0x01 | 0x04 | MULTIPLE MEMORY AREA READ | 批量读取多个存储区 | | 0x02 | 0x01 | PARAMETER AREA READ | 读取参数区 | | 0x02 | 0x02 | PARAMETER AREA WRITE | 写入参数区 | | 0x04 | 0x01 | RUN | 切换到运行模式 | | 0x04 | 0x02 | STOP | 切换到停止模式 | | 0x05 | 0x01 | CPU UNIT DATA READ | 读取 CPU 单元数据 | | 0x06 | 0x01 | CONNECTION DATA READ | 读取连接数据 | ### 存储区代码 FINS 协议通过存储区代码标识不同的数据区域: | 代码 | 区域名称 | 说明 | 字节/字 | |------|----------|------|---------| | 0x82 | DM 区 | 数据存储器,16位字 | 2 字节/字 | | 0xB0 | CIO 区 | 核心 I/O 区,位可访问 | 2 字节/字 | | 0xB1 | WR 区 | 工作继电器区 | 2 字节/字 | | 0xB2 | HR 区 | 保持继电器区 | 2 字节/字 | | 0xB3 | AR 区 | 辅助继电器区 | 2 字节/字 | --- ## 9. 读写操作详解 ### 上位机请求读取 PLC 数据 **命令字:** `0x7347` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | areaCode | int | 是 | 存储区代码,如 0x82 表示 DM 区 | | startAddress | int | 是 | 读取起始地址(字地址) | | wordCount | int | 是 | 读取字数,范围 [1, 512] | | craftNum | int | 否 | 工艺号,范围 [1, 9];不填则使用当前连接工艺 | #### 请求示例 ```json { "areaCode": 130, "startAddress": 2000, "wordCount": 10, "craftNum": 1 } ``` --- ### 控制器回复 PLC 读取数据 **命令字:** `0x7348` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | areaCode | int | 存储区代码 | | startAddress | int | 起始地址 | | words | int[] | 读取到的字数据(每个字 0~65535) | | status | int | 读取状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "areaCode": 130, "startAddress": 2000, "words": [100, 200, 300, 150, 250, 50, 75, 125, 500, 1000], "status": 0 } ``` --- ### 上位机请求写入 PLC 数据 **命令字:** `0x7349` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | areaCode | int | 是 | 存储区代码,如 0x82 表示 DM 区 | | startAddress | int | 是 | 写入起始地址(字地址) | | words | int[] | 是 | 要写入的字数据,每个字范围 [0, 65535] | | craftNum | int | 否 | 工艺号,范围 [1, 9] | #### 请求示例 ```json { "areaCode": 130, "startAddress": 1000, "words": [10, 20, 30, 40, 50], "craftNum": 1 } ``` --- ### 控制器回复 PLC 写入结果 **命令字:** `0x734A` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | areaCode | int | 存储区代码 | | startAddress | int | 起始地址 | | status | int | 写入状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "areaCode": 130, "startAddress": 1000, "status": 0 } ``` --- ## 10. 通讯错误码 | 错误码 | 说明 | 处理建议 | |--------|------|----------| | 0x0000 | 正常完成 | - | | 0x0101 | 连接失败(TCP 层) | 检查 IP、端口和网络连通性 | | 0x0102 | 节点注册失败 | 检查 PLC 的 FINS 节点地址配置 | | 0x0201 | 不支持的存储区代码 | 确认 areaCode 正确 | | 0x0202 | 地址超出范围 | 确认 startAddress 和 wordCount 在有效范围 | | 0x0203 | 数据长度错误 | 确认 words 数组长度与 wordCount 一致 | | 0x0301 | PLC 处于不可操作状态 | 将 PLC 切换到监视/运行模式 | | 0x0302 | 写入被禁止 | 检查 PLC 的写保护设置 | | 0x0401 | 命令超时 | 增大超时时间或检查网络负载 | | 0x0402 | 响应格式异常 | 检查 PLC 固件版本兼容性 | --- ## 11. 通讯时序 ### 典型数据交互周期 ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 上位机 │ │ 控制器 │ │ PLC │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ 0x7343 连接请求 │ │ │───────────────────>│ │ │ │ TCP Connect │ │ │───────────────────>│ │ │ FINS Node Reg │ │ │───────────────────>│ │ 0x7345 连接成功 │ │ │<───────────────────│ │ │ │ │ │ │◄──── 循环读写 ────►│ │ │ (DM 区周期交换) │ │ │ │ ``` ### 周期性数据交换 连接建立后,控制器以固定周期执行以下数据交换: 1. **写入阶段**:将 `localWriteAddress` 的全局变量数据写入 PLC 的 `PLCWriteAddress` 起始的 DM 区 2. **读取阶段**:从 PLC 的 `PLCReadAddress` 起始的 DM 区读取数据到 `localReadAddress` 的全局变量 布尔量以位为单位映射到 DM 区的对应位,整型以 16 位字为单位映射。 --- ## 12. 常见问题 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 连接不上 PLC | IP 地址错误 | 确认 PLC IP 地址,可用 ping 测试 | | 连接不上 PLC | 端口错误 | 欧姆龙 PLC 默认端口为 9600 | | 连接不上 PLC | PLC 不在同一网段 | 检查网络配置 | | 读写数据不正确 | 地址偏移 | 确认 DM 起始地址与 PLC 程序一致 | | 读写数据不正确 | 数据长度不匹配 | 核对本机变量数量和 PLC 数据长度配置 | | 通讯中断 | 网络故障 | 检查网络设备状态,查看 `0x7345` 状态码 | | 通讯中断 | PLC 模式变更 | 确认 PLC 处于监视/运行模式 | --- # OPCUA > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/08.OPCUA.html ## 概述 OPC UA(Open Platform Communications Unified Architecture)是一种工业自动化领域的跨平台通信协议,支持数据访问、报警与事件、历史数据等功能。本控制器支持作为 OPC UA **客户端**连接远程服务器,同时也可作为 OPC UA **服务器**供其他设备访问,实现双向数据交互。 ### 核心功能 | 功能 | 说明 | |------|------| | 连接管理 | 支持客户端/服务器双模式,可独立启停 | | 节点读写 | 读写 OPC UA 服务器中的变量节点 | | 订阅监控 | 订阅节点数据变化,实时推送更新 | | 安全认证 | 支持用户名/密码认证方式 | ### 工作模式 - **客户端模式**:控制器作为 OPC UA 客户端,连接外部 OPC UA 服务器,读写对方提供的变量节点 - **服务器模式**:控制器作为 OPC UA 服务器,开放本地变量供外部客户端访问 --- ## 上位机设置 OPCUA 参数 **命令字:** `0x7350` ### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | client | object | 否 | 客户端参数 | | client.enable | bool | 是 | 客户端连接使能,true-开启,false-关闭 | | client.ip | string | 是 | OPC UA 服务器 IP 地址 | | client.port | int | 是 | 服务器端口号,范围 [0, 65535],默认 4840 | | client.resource | string | 否 | 服务器资源路径/名称 | | client.username | string | 否 | 登录用户名(需服务器支持) | | client.password | string | 否 | 登录密码 | | client.security | string | 否 | 安全策略,可选 "None" / "Basic256Sha256" / "Basic128Rsa15" | | server | object | 否 | 服务器参数 | | server.enable | bool | 是 | 服务器使能,true-开启,false-关闭 | | server.ip | string | 是 | 控制器用作服务器时的 IP 地址 | | server.port | int | 是 | 服务器端口号,范围 [0, 65535],默认 4840 | ### 配置说明 - `client.enable` 和 `server.enable` 可以同时开启,控制器将同时运行客户端和服务端 - 客户端模式下,`client.ip` 和 `client.port` 必须指向有效的 OPC UA 服务器 - 若服务器需要认证,需同时填写 `client.username` 和 `client.password` - 安全策略选择需与目标服务器支持的策略一致 ### 请求示例 ```json { "client": { "enable": true, "ip": "192.168.1.240", "port": 49400, "resource": "ProsysServer", "username": "admin", "password": "123456", "security": "None" }, "server": { "enable": true, "ip": "192.168.0.229", "port": 4840 } } ``` --- ## 上位机查询 OPCUA 参数 **命令字:** `0x7351` ### 请求示例 ```json {} ``` --- ## 控制器回复上位机 OPCUA 参数 **命令字:** `0x7352` ### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | client | object | 客户端参数 | | client.enable | bool | 连接使能 | | client.ip | string | 服务器 IP 地址 | | client.port | int | 端口号 | | client.resource | string | 服务器名称 | | client.connected | bool | 客户端连接状态,true-已连接,false-未连接 | | server | object | 服务器参数 | | server.enable | bool | 服务器使能 | | server.ip | string | 控制器用作服务器时的 IP 地址 | | server.port | int | 端口号 | | server.connected | bool | 是否有客户端连接,true-有客户端连接,false-无连接 | ### 响应示例 ```json { "client": { "enable": true, "ip": "192.168.1.240", "port": 49400, "resource": "ProsysServer", "connected": true }, "server": { "enable": true, "ip": "192.168.0.229", "port": 4840, "connected": false } } ``` --- ## OPC UA 节点读写 控制器作为客户端连接 OPC UA 服务器后,可读写服务器中的变量节点。 ### 上位机请求读取节点 **命令字:** `0x7353` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | nodeId | string | 是 | 目标节点的 NodeId,如 "ns=2;s=Temperature" | | nodeIdType | int | 否 | NodeId 类型,0-字符串,1-数字,2-GUID,3-Opaque,默认 0 | | namespace | int | 否 | 命名空间索引,默认 0 | #### 节点标识说明 OPC UA 节点通过以下方式定位: | 标识方式 | 格式示例 | 说明 | |----------|----------|------| | 字符串 ID | `ns=2;s=MyVariable` | 使用字符串标识 | | 数字 ID | `ns=2;i=1001` | 使用数字标识 | | GUID | `ns=2;g=ABC123...` | 使用 GUID | | 浏览路径 | `/Objects/MyDevice/Temperature` | 使用路径浏览 | #### 请求示例 ```json { "nodeId": "ns=2;s=Temperature", "nodeIdType": 0, "namespace": 2 } ``` --- ### 控制器回复节点读取结果 **命令字:** `0x7354` ##### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | nodeId | string | 读取的节点 ID | | value | variant | 节点当前值 | | dataType | string | 数据类型,如 "Int32" / "Double" / "Boolean" / "String" | | timestamp | string | 数据时间戳(ISO 8601 格式) | | status | int | 读取状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(仅失败时返回) | ##### 响应示例 ```json { "nodeId": "ns=2;s=Temperature", "value": 25.6, "dataType": "Double", "timestamp": "2024-03-15T10:30:00Z", "status": 0 } ``` --- ### 上位机请求写入节点 **命令字:** `0x7355` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | nodeId | string | 是 | 目标节点的 NodeId | | value | variant | 是 | 要写入的值 | | dataType | string | 是 | 写入值的数据类型 | #### 请求示例 ```json { "nodeId": "ns=2;s=SetPoint", "value": 100.0, "dataType": "Double" } ``` --- ### 控制器回复节点写入结果 **命令字:** `0x7356` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | nodeId | string | 写入的节点 ID | | status | int | 写入状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(仅失败时返回) | #### 响应示例 ```json { "nodeId": "ns=2;s=SetPoint", "status": 0 } ``` --- ### 批量读写节点 **命令字:** `0x7357` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | operations | object[] | 是 | 批量操作列表 | | operations[].opType | string | 是 | 操作类型,"read"-读取,"write"-写入 | | operations[].nodeId | string | 是 | 节点 ID | | operations[].value | variant | 否 | 写入值(opType="write" 时必填) | #### 请求示例 ```json { "operations": [ { "opType": "read", "nodeId": "ns=2;s=Temperature" }, { "opType": "read", "nodeId": "ns=2;s=Pressure" }, { "opType": "write", "nodeId": "ns=2;s=SetPoint", "value": 50.0 } ] } ``` --- ## OPC UA 订阅机制 订阅功能允许控制器持续监控 OPC UA 服务器中的指定节点,当节点值发生变化时,服务器主动推送更新数据,无需轮询。 ### 上位机创建订阅 **命令字:** `0x7358` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 订阅唯一标识符,用于后续管理 | | publishingInterval | int | 是 | 发布间隔(毫秒),服务器以此周期检查并推送变化数据 | | lifetimeCount | int | 否 | 订阅生存周期计数,默认 10000 | | maxKeepAliveCount | int | 否 | 最大保活计数,默认 3000 | | monitoredItems | object[] | 是 | 监控项列表 | | monitoredItems[].nodeId | string | 是 | 要监控的节点 ID | | monitoredItems[].samplingInterval | int | 是 | 采样间隔(毫秒) | | monitoredItems[].queueSize | int | 否 | 队列大小,默认 1 | | monitoredItems[].discardOldest | bool | 否 | 队列满时是否丢弃最旧数据,默认 true | | monitoredItems[].deadbandType | int | 否 | 死区类型,0-无,1-绝对值,2-百分比 | | monitoredItems[].deadbandValue | double | 否 | 死区值,仅当值变化超过此阈值时才触发通知 | #### 订阅参数建议 | 参数 | 推荐值 | 说明 | |------|--------|------| | publishingInterval | 100~1000 ms | 发布周期,越小实时性越好但网络负载越大 | | samplingInterval | publishingInterval 的 1/2 ~ 1/5 | 采样周期应小于发布周期 | | queueSize | 1~10 | 数据变化队列,应对突发变化 | | lifetimeCount | ≥ 3 × maxKeepAliveCount | 订阅有效期,超时无保活则自动清理 | | deadbandValue | 根据精度需求设定 | 变化阈值,过滤微小波动 | #### 请求示例 ```json { "subscriptionId": "sub_temp_001", "publishingInterval": 200, "lifetimeCount": 10000, "maxKeepAliveCount": 3000, "monitoredItems": [ { "nodeId": "ns=2;s=Temperature", "samplingInterval": 100, "queueSize": 5, "discardOldest": true, "deadbandType": 1, "deadbandValue": 0.5 }, { "nodeId": "ns=2;s=Pressure", "samplingInterval": 200, "queueSize": 1 } ] } ``` --- ### 控制器上报订阅数据 **命令字:** `0x7359` 当订阅的节点数据发生变化时,控制器主动推送数据至上位机。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | subscriptionId | string | 订阅 ID | | dataChanges | object[] | 变化的数据列表 | | dataChanges[].nodeId | string | 节点 ID | | dataChanges[].value | variant | 节点当前值 | | dataChanges[].timestamp | string | 时间戳 | | sequenceNumber | int | 序列号,递增 | #### 响应示例 ```json { "subscriptionId": "sub_temp_001", "dataChanges": [ { "nodeId": "ns=2;s=Temperature", "value": 26.8, "timestamp": "2024-03-15T10:30:01Z" } ], "sequenceNumber": 42 } ``` --- ### 上位机修改订阅 **命令字:** `0x735A` 修改已有订阅的监控项或发布参数。 #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 要修改的订阅 ID | | publishingInterval | int | 否 | 新的发布间隔 | | addItems | object[] | 否 | 新增监控项列表 | | removeItems | string[] | 否 | 移除监控项的 nodeId 列表 | #### 请求示例 ```json { "subscriptionId": "sub_temp_001", "publishingInterval": 500, "addItems": [ { "nodeId": "ns=2;s=Humidity", "samplingInterval": 500 } ], "removeItems": ["ns=2;s=Pressure"] } ``` --- ### 上位机删除订阅 **命令字:** `0x735B` 停止并删除指定订阅。 #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 要删除的订阅 ID | #### 请求示例 ```json { "subscriptionId": "sub_temp_001" } ``` --- ## 连接状态管理 ### 控制器主动上报连接状态 **命令字:** `0x735C` 当 OPC UA 客户端或服务器连接状态发生变化时,控制器主动推送状态更新。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | role | string | 角色,"client" / "server" | | status | int | 状态码:0-已断开,1-连接中,2-已连接,3-连接失败 | | errorMsg | string | 错误描述(连接失败时返回) | | timestamp | string | 状态变化时间 | #### 响应示例 ```json { "role": "client", "status": 2, "timestamp": "2024-03-15T10:29:55Z" } ``` --- ## 常见问题 ### 连接失败排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 客户端无法连接 | IP/端口错误 | 检查 `client.ip` 和 `client.port` 是否正确 | | 客户端无法连接 | 安全策略不匹配 | 确认 `client.security` 与服务器一致 | | 客户端无法连接 | 网络不通 | 用 ping 测试网络连通性 | | 节点读取失败 | NodeId 格式错误 | 确认 `nodeId` 格式,如 `ns=2;s=xxx` | | 节点读取失败 | 命名空间索引错误 | 确认 `namespace` 值匹配服务器实际命名空间 | | 写入失败 | 权限不足 | 确认服务器对目标节点开放了写入权限 | | 订阅无数据推送 | 发布间隔过大 | 减小 `publishingInterval` 值 | | 订阅无数据推送 | 死区设置过大 | 减小 `deadbandValue` 或关闭死区 | ### 性能建议 - 批量操作优先使用批量读写命令(`0x7357`),减少通信开销 - 订阅监控项不宜过多,建议单个订阅不超过 50 个节点 - 采样间隔应根据数据变化频率合理设置,避免过度采样 - 发布间隔不宜过小,推荐 100ms ~ 1000ms --- # EIP > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/09.EIP.html ## 概述 EIP(EtherNet/IP)是一种基于标准以太网的工业通信协议,由 ODVA 组织维护。它使用 CIP(Common Industrial Protocol,通用工业协议)作为应用层协议,支持实时 I/O 数据和显式消息通信。本控制器通过 EtherNet/IP 与支持该协议的设备进行数据交互。 ### 通讯模式 | 模式 | 说明 | 特点 | |------|------|------| | 显式消息(Explicit Messaging) | 基于 TCP,请求/应答模式 | 非实时,用于配置和诊断 | | 隐式消息(Implicit Messaging) | 基于 UDP,生产者/消费者模式 | 实时,用于周期性 I/O 数据交换 | ### CIP 协议层次 ```text ┌────────────────────────────┐ │ 应用对象 (CIP Objects) │ ├────────────────────────────┤ │ CIP 通用工业协议 │ ├───────────┬────────────────┤ │ 显式消息 │ 隐式消息(I/O) │ │ (TCP) │ (UDP) │ ├───────────┴────────────────┤ │ TCP/IP 协议栈 │ ├────────────────────────────┤ │ 以太网物理层 │ └────────────────────────────┘ ``` --- ## 0x7360 上位机设置设备参数配置 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | type | int | 是 | 输入/输出路数 | 1 / 4 / 8 / 12 / 16 | | grouptype | int | 是 | 组号的方式 | 0: 手填,1: 全局 int 类型变量,2: 全局 int 类型绑定变量 | | group | int | 是 | 组号中的数字 | - | | addtype | int | 是 | 数值存入的方式 | 0: 全局 int 类型变量,1: 全局 int 类型绑定变量,2: 全局 double 类型变量,3: 全局 double 类型绑定变量 | | add | int | 是 | 数值存入的数字 | - | | num | int | 是 | 编号 | 1-10: 输出,11-20: 输入 | | value | - | 是 | 值 | - | | able | bool | 是 | 使能开关 | true: 使能,false: 不使能 | ### 参数详解 - **type**:定义每路输入/输出的数据位宽。例如 type=16 时每路包含 16 个位信号 - **grouptype**:定义组号的来源方式。手填(0)直接使用 group 值;全局变量方式(1/2)从对应变量中读取组号 - **addtype**:定义数据存入的目标类型。int 变量存储整数,double 变量存储浮点数 - **num**:1~10 为输出信号,11~20 为输入信号,与外部设备的 I/O 映射对应 ### 请求示例 ```json { "type": 4, "grouptype": 1, "group": 3, "addtype": 2, "add": 100, "num": 5, "value": 1, "able": true } ``` ### 响应 控制器响应并返回设备参数。响应数据结构与请求一致。 --- ## 0x7361 上位机获取设备参数配置 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前所有设备参数配置列表。 --- ## 0x7362 上位机修改设备参数配置 > 参数格式同 0x7360。可修改已配置的设备参数,支持部分字段修改。 --- ## 0x7363 上位机设置连接参数 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | enable | bool | 是 | 连接开关 | true: 打开连接开关,false: 关闭连接开关 | | writenum | int | 是 | 输出(写入)数据长度 | [0, 256] | | readnum | int | 是 | 输入(读取)数据长度 | [0, 256] | | scancycle | int | 是 | 扫描周期(ms) | 建议 [1, 100] | | outtimecycle | int | 是 | 超时周期(ms) | 应为扫描周期的倍数 | | networkname | string | 是 | 选取的网口的名称 | 如 "eth0", "eth1" | | writetype | int | 是 | 本机输出数据的类型 | 0: 全局 bool 类型变量,1: 全局 bool 类型绑定变量 | | writeadd | int | 是 | 本机输出数据的起始地址 | 全局变量地址 | | readtype | int | 是 | 本机输入数据的类型 | 0: 全局 bool 类型变量,1: 全局 bool 类型绑定变量 | | readadd | int | 是 | 本机输入数据的起始地址 | 全局变量地址 | ### 参数详解 - **writenum / readnum**:定义输出/输入数据的长度(以 bool 为单位)。实际数据量 = writenum/readnum × 位宽 - **scancycle**:控制器获取/发送 EtherNet/IP 数据的周期,单位毫秒 - **outtimecycle**:通讯超时判定周期,若超过此时间未收到对端数据则判定超时。建议设置为 scancycle × 4 - **networkname**:指定使用的物理网口,需与设备实际连接的网络接口一致 ### 请求示例 ```json { "enable": true, "writenum": 64, "readnum": 64, "scancycle": 10, "outtimecycle": 40, "networkname": "eth0", "writetype": 0, "writeadd": 200, "readtype": 0, "readadd": 300 } ``` --- ## 0x7364 上位机获取连接参数配置 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前的连接参数配置。数据结构与 0x7363 请求一致。 --- ## 0x7365 上位机修改连接参数 > 参数格式同 0x7363。 --- ## 0x7366 上位机向控制器获取连接状态 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前的连接状态信息。 #### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | connected | bool | 连接状态,true-已连接,false-未连接 | | linkSpeed | int | 链路速度(Mbps) | | packetTx | int | 发送数据包计数 | | packetRx | int | 接收数据包计数 | | timeoutCount | int | 超时计数 | | lastError | string | 最近一次错误描述 | #### 响应示例 ```json { "connected": true, "linkSpeed": 100, "packetTx": 15230, "packetRx": 15128, "timeoutCount": 0, "lastError": "" } ``` --- ## 0x7367 控制器返回读取数据的状态 控制器在周期性通讯中,主动推送输入数据的状态变化。 #### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | 输入编号,范围 11-20 | | value | int/bool/double | 输入当前值 | | timestamp | int | 数据更新时间戳(ms) | --- ## 0x7368 读取数据的状态设置 上位机可主动设置输入数据的状态值(用于调试或模拟)。 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | num | int | 是 | 编号信息 | 0-9: 输出,10-19: 输入 | | value | - | 是 | 设置的值 | 类型取决于 addtype 配置 | ### 请求示例 ```json { "num": 12, "value": 1 } ``` --- ## 0x7369 读取数据的状态设置 控制输入数据是否随 EtherNet/IP 接收数据实时更新。 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | state | bool | 是 | true: 输入数据跟随 EIP 接收数据实时更新,false: 冻结当前值 | ### 应用场景 - **state=true**:正常运行模式,输入数据实时反映外部设备状态 - **state=false**:调试/维护模式,冻结输入值,便于排查问题或手动模拟信号 ### 请求示例 ```json { "state": false } ``` --- ## CIP 连接管理 ### 连接建立流程 EtherNet/IP 使用 CIP 连接进行数据交换,连接建立过程如下: ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 上位机 │ │ 控制器 │ │ EIP 设备 │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ 0x7363 设置连接参数 │ │ │────────────────────>│ │ │ │ TCP 连接 │ │ │─────────────────────>│ │ │ 注册 Session │ │ │─────────────────────>│ │ │ Forward Open 请求 │ │ │─────────────────────>│ │ │ Forward Open 响应 │ │ │<─────────────────────│ │ │ │ │ │◄── 隐式消息(I/O) ──►│ │ │ (周期性数据交换) │ ``` ### 连接类型 | 连接类型 | 传输方式 | 触发方式 | 典型用途 | |----------|----------|----------|----------| | Exclusive Owner | 点到点 | 周期 | 控制器独占控制 I/O 设备 | | Input Only | 多播 | 周期 | 仅监听输入数据 | | Listen Only | 多播 | 周期 | 监听其他连接的输出数据 | ### Assembly 对象 Assembly 对象用于将离散 I/O 数据组合为一个数据块进行传输。 | Assembly 类型 | 实例 ID 范围 | 方向 | 说明 | |---------------|-------------|------|------| | Output Assembly | 100~199 | 本机 → 设备 | 输出数据集合 | | Input Assembly | 200~299 | 设备 → 本机 | 输入数据集合 | | Configuration Assembly | 300~399 | 本机 → 设备 | 配置数据集合 | --- ## 通讯状态监控 ### 控制器主动上报状态变化 **命令字:** `0x736A` 当 EtherNet/IP 连接状态发生变化时,控制器主动推送状态更新。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | status | int | 连接状态:0-空闲,1-连接中,2-运行中,3-超时,4-错误 | | elapsedMs | int | 当前连接已持续时间(毫秒) | | diagInfo | object | 诊断信息 | #### diagInfo 说明 | 字段 | 类型 | 描述 | |------|------|------| | sessionHandle | int | CIP Session 句柄 | | connectionId | int | CIP 连接 ID | | rpi | int | 请求包间隔 RPI(ms) | | openRetries | int | 连接打开重试次数 | | watchDogTimeout | int | 看门狗超时次数 | #### 响应示例 ```json { "status": 2, "elapsedMs": 3600000, "diagInfo": { "sessionHandle": 12345, "connectionId": 67890, "rpi": 10, "openRetries": 0, "watchDogTimeout": 0 } } ``` --- ## 常见问题 ### 连接问题排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 无法建立连接 | 网口选择错误 | 检查 `networkname` 是否与实际网口一致 | | 无法建立连接 | 设备 IP 不在同一网段 | 配置控制器网口 IP 与设备同网段 | | 数据不更新 | 扫描周期过大 | 减小 `scancycle` 值 | | 数据不更新 | state 设为 false | 将 `0x7369` 的 state 设为 true | | 频繁超时 | 网络负载过高 | 增大 `outtimecycle`,优化网络拓扑 | | 频繁超时 | 网络设备故障 | 检查交换机、网线等硬件 | | 数据错乱 | 数据长度不匹配 | 确认 `writenum`/`readnum` 与设备一致 | | 数据错乱 | 字节序不一致 | 检查设备的字节序设置 | ### 性能优化建议 - 扫描周期建议根据实际 I/O 点数和网络条件设置,通常 5~50ms - RPI(请求包间隔)应在 `scancycle` 的基础上考虑网络延迟余量 - 对于纯监控类数据,可适当增大扫描周期以降低网络负载 - 使用 `0x7366` 定期查询连接状态和通信统计,及时发现异常 --- # SoftPLC Socket 通信协议 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/10.PLC.html > 适用于 rtl-25.01,核对日期:2026-09-10。以当前控制器命令分发、SoftPLC SDK 和示教器调用代码为准;每个命令独立列出功能、JSON、字段含义和响应命令。 ## 通用说明 - 本文描述 Socket 帧中的 SoftPLC JSON 负载,外层 Socket 帧格式沿用通用协议。 - JSON 使用 UTF-8。JSON 语法错误时不产生对应 PLC 回复。 - 除 `var_page` 从 1 开始外,section、rung、变量和坐标索引均从 0 开始。 - `robot` 是兼容字段。当前控制器只有一个 SoftPLC 实例,PLC handler 不读取该字段。 - 梯形图固定 12 列,默认 8 行;当前控制器支持扩展至 1000 行。每个 rung 的实际行数由 `nbr_lines_used` 给出,`x=0..11`,`y=0..nbr_lines_used-1`。客户端应通过 `0x7434` 获取行列容量,不再按固定 8 行解析。 - 编辑成功后工程保存到 `./plc/default.clprj`。保存失败可能发生在内存修改之后,收到失败响应时应重新查询相关模型。 - 开机自启配置单独保存到 `./plc/runtime.json`,默认关闭;工程文件导入/导出不包含该配置。 - 下文部分示例用空数组或空对象省略模型内容,例如 `elements: []`、`changed_models.rungs: []`;完整响应以字段表定义为准。 ## 命令索引 | 命令字 | 名称 | 类型 | | --- | --- | --- | | `0x7400` | PLC 启动请求 | 请求 | | `0x7401` | PLC 停止请求 | 请求 | | `0x7402` | PLC 状态查询 | 请求 | | `0x7403` | PLC 状态响应 | 响应 | | `0x7404` | PLC 工程概要查询 | 请求 | | `0x7405` | PLC 工程概要响应 | 响应 | | `0x7406` | PLC section 数据查询 | 请求 | | `0x7407` | PLC section 数据响应 | 响应 | | `0x7411` | PLC rung 数据查询 | 请求 | | `0x7412` | PLC rung 数据响应 | 响应 | | `0x7413` | PLC 插入 rung / 行 | 请求 | | `0x7414` | PLC 插入 rung / 行响应 | 响应 | | `0x7415` | PLC 删除 rung / 行 | 请求 | | `0x7416` | PLC 删除 rung / 行响应 | 响应 | | `0x7420` | PLC 元素更新 | 请求 | | `0x7422` | PLC 元素更新响应 | 响应 | | `0x7423` | IEC Timer 更新 | 请求 | | `0x7424` | IEC Timer 更新响应 | 响应 | | `0x7425` | Counter 更新 | 请求 | | `0x7426` | Counter 更新响应 | 响应 | | `0x7427` | CTU 更新 | 请求 | | `0x7428` | CTU 更新响应 | 响应 | | `0x7429` | CTD 更新 | 请求 | | `0x742A` | CTD 更新响应 | 响应 | | `0x742B` | MOVE 更新 | 请求 | | `0x742C` | MOVE 更新响应 | 响应 | | `0x742D` | 元素属性更新 | 请求 | | `0x742E` | 元素属性更新响应 | 响应 | | `0x7430` | PLC 变量写入 | 请求 | | `0x7431` | PLC 变量读取 | 请求 | | `0x7432` | PLC 变量值响应 | 响应 | | `0x7433` | PLC 通用参数查询 | 请求 | | `0x7434` | PLC 通用参数响应 | 响应 | | `0x7435` | PLC 重置 | 请求 | | `0x7436` | PLC 重置响应 | 响应 | | `0x7437` | PLC 工程导出准备 | 请求 | | `0x7438` | PLC 工程导出准备响应 | 响应 | | `0x7439` | PLC 工程导入准备 | 请求 | | `0x743A` | PLC 工程导入准备响应 | 响应 | | `0x743B` | PLC 工程导入应用 | 请求 | | `0x743C` | PLC 工程导入应用响应 | 响应 | | `0x743D` | PLC 开机自启查询 | 请求 | | `0x743E` | PLC 开机自启设置 | 请求 | | `0x743F` | PLC 开机自启响应 | 响应 | `0x7410`(`PLC_UPDATE_RUNG_INFO_INQUIRE`)和 `0x7421`(`PLC_ELEMENT_INQUIRE`)目前只在头文件中定义,未接入控制器命令分发,不属于可用请求。 ## 0x7400 PLC 启动请求 **功能:** 启动 SoftPLC。处理完成后用 `0x7403` 返回当前状态。 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,当前控制器忽略。 | ## 0x7401 PLC 停止请求 **功能:** 停止 SoftPLC,随后执行 PLC reset。处理完成后用 `0x7403` 返回当前状态。 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,当前控制器忽略。 | ## 0x7402 PLC 状态查询 **功能:** 查询 SoftPLC 当前运行状态。用 `0x7403` 响应。 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,当前控制器忽略。 | ## 0x7403 PLC 状态响应 **功能:** 响应 `0x7400`、`0x7401` 或 `0x7402`。 ```json {"state": 2} ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `state` | int | PLC 当前状态。 | | state 值 | 含义 | | ---: | --- | | 0 | 正在加载 | | 1 | 已停止 | | 2 | 正在运行 | | 3 | 运行冻结 | | 4 | 单周期运行 | 该响应没有 `ok` 和 `error`。启动或停止失败时会关闭 SoftPLC 运行时,调用方根据最终 `state` 判断结果。未初始化时 `state=-3`(`PLC_API_ERR_NOT_INITIALIZED`),不能将所有返回值都按 0 到 4 的状态枚举处理;其他响应中的 `state` 也遵循这一规则。 ## 0x7404 PLC 工程概要查询 **功能:** 查询 section 数量、rung 数量和工程修改状态。用 `0x7405` 响应。 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,当前控制器忽略。 | ## 0x7405 PLC 工程概要响应 ```json { "section_count": 1, "rung_count": 3, "current_section_index": 0, "dirty_flag": 0 } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `section_count` | int | 当前已使用的 section 数量。 | | `rung_count` | int | 工程中的 rung 总数量。 | | `current_section_index` | int | 当前 section 的 0 基索引。 | | `dirty_flag` | int | 0 表示无未保存修改,1 表示有未保存修改。 | 读取概要失败时控制器不发送本响应。 ## 0x7406 PLC Section 数据查询 **功能:** 查询一个 section。控制器按 rung 拆分,每个 rung 单独发送一帧 `0x7407`。 ```json { "robot": 1, "section_no": 0, "rung_format": "compact-v1" } ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,当前控制器忽略。 | | `section_no` | int | 否 | section 的 0 基索引,缺省为 0。 | | `rung_format` | string | 否 | 值为 `compact-v1` 时,`0x7407` 中 rung 元素使用紧凑数组;否则使用普通对象。 | section 无效或 section 没有 rung 时不发送 `0x7407`。 ## 0x7407 PLC Section 数据响应 **功能:** 返回 section 基本信息、一个 rung 和该 rung 引用的功能块。一个 section 通常连续收到多帧。 ```json { "section_index": 0, "section_no": 0, "used": 1, "name": "main", "language": 0, "sub_routine_number": -1, "first_rung": 0, "last_rung": 2, "sequential_page": 0, "rung_format": "compact-v1", "rung": { "index": 0, "data": { "rung_index": 0, "used": 1, "prev_rung": -1, "next_rung": 1, "nbr_lines_used": 8, "label": "", "comment": "", "elements": [] } }, "models": { "counters": [], "timers_iec": [], "ctus": [], "ctds": [], "moves": [] } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `section_index` | int | section 的 0 基索引。 | | `section_no` | int | 与 `section_index` 相同,用于协议兼容。 | | `used` | int | 0 未使用,1 已使用。 | | `name` | string | section 名称。 | | `language` | int | 0 ladder,1 sequential。 | | `sub_routine_number` | int | 子程序编号;-1 表示主程序 section。 | | `first_rung` | int | section 第一个 rung 索引。 | | `last_rung` | int | section 最后一个 rung 索引。 | | `sequential_page` | int | sequential 页号;ladder 通常为 0。 | | `rung_format` | string | 仅请求 compact-v1 时存在。 | | `rung.index` | int | 本帧携带的 rung 索引。 | | `rung.data` | object | 本帧的 rung 数据。 | | `models.counters` | array | 本 rung 引用的 Counter 模型。 | | `models.timers_iec` | array | 本 rung 引用的 IEC Timer 模型。 | | `models.ctus` | array | 本 rung 引用的 CTU 模型。 | | `models.ctds` | array | 本 rung 引用的 CTD 模型。 | | `models.moves` | array | 本 rung 引用的 MOVE 模型。 | `rung.data` 字段: | 字段 | 类型 | 含义 | | --- | --- | --- | | `rung_index` | int | rung 索引。 | | `used` | int | 0 未使用,1 已使用。 | | `prev_rung` | int | 前一个 rung;-1 表示没有。 | | `next_rung` | int | 后一个 rung;-1 表示没有。 | | `nbr_lines_used` | int | 本 rung 的逻辑行数,包含空行;普通和 compact-v1 格式都只返回这些行。 | | `label` | string | rung 标签。 | | `comment` | string | rung 注释。 | | `elements` | array | `elements[y][x]`,共 `nbr_lines_used` 行,每行 12 列。 | 普通元素对象字段: | 字段 | 类型 | 含义 | | --- | --- | --- | | `type` | int | 元素类型。 | | `connected_with_top` | int | 是否与上方元素连接。 | | `var_type` | int | 变量类型。 | | `var_num` | int | 变量 0 基编号。 | | `indexed_var_type` | int | 索引变量类型;-1 表示未使用。 | | `indexed_var_num` | int | 索引变量编号。 | | `dynamic_input` | int | 运行时输入状态。 | | `dynamic_state` | int | 运行时元素状态。 | | `dynamic_var_bak` | int | 运行时变量备份值。 | | `dynamic_output` | int | 运行时输出状态。 | | `dynamic_var_setted` | int | 运行时变量是否已设置。 | | `rung_index/x/y` | int | 元素所在 rung 和坐标。 | compact-v1 元素为 `[type,connected_with_top,var_type,var_num,indexed_var_type,indexed_var_num,runtime_bits]`。`runtime_bits` 的 bit0 到 bit4 依次表示 dynamic_input、dynamic_state、dynamic_var_bak、dynamic_output、dynamic_var_setted。 ## 0x7411 PLC Rung 数据查询 **功能:** 查询单个 rung、批量完整模型或批量运行态。用 `0x7412` 响应。 单个查询: ```json {"rung_no": 0} ``` 批量查询: ```json {"robot": 1, "rung_nos": [0, 1, 2]} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `rung_no` | int | 单个查询时必填 | 要查询的 rung 索引。 | | `rung_nos` | array\ | 批量查询时必填 | rung 索引数组。存在该数组时走批量路径。 | | `rung_format` | string | 否 | 当前命令忽略该字段;完整模型使用普通格式,运行态使用下面的专用结构。 | | `runtime_only` | int | 否 | 仅批量查询有效。缺省 0 返回完整模型;非 0 只返回运行态。 | | `request_id` | JSON 值 | 否 | 仅批量运行态查询原样回传,可用于匹配请求;其他查询路径不回传。 | 运行态查询: ```json {"robot": 1, "rung_nos": [0, 1], "runtime_only": 1, "request_id": 12} ``` `rung_nos` 是数组时优先于 `rung_no`,包括空数组;没有该数组时走单 rung 路径,忽略 `runtime_only` 和 `request_id`。 ## 0x7412 PLC Rung 数据响应 单个查询响应是一个普通 rung: ```json { "rung_index": 0, "used": 1, "prev_rung": -1, "next_rung": 1, "nbr_lines_used": 8, "label": "", "comment": "", "elements": [] } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `rung_index` | int | rung 索引。 | | `used` | int | 0 未使用,1 已使用。 | | `prev_rung` | int | 前一个 rung;-1 表示没有。 | | `next_rung` | int | 后一个 rung;-1 表示没有。 | | `nbr_lines_used` | int | 本 rung 的逻辑行数,包含空行。 | | `label` | string | rung 标签。 | | `comment` | string | rung 注释。 | | `elements` | array | `nbr_lines_used` x 12 普通元素对象数组。字段含义与 `0x7407` 相同。 | 单个 rung 无效时响应为 JSON `null`。 批量查询响应: ```json { "ok": 1, "rungs": [], "models": { "counters": [], "timers_iec": [], "ctus": [], "ctds": [], "moves": [] } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `ok` | int | 当前批量路径固定为 1。 | | `rungs` | array | 查询成功的普通 rung 对象。无效 rung 被跳过。 | | `models.*` | array | 所有成功 rung 引用的功能块模型。 | 批量运行态响应(`runtime_only != 0`): ```json { "ok": 1, "runtime_only": 1, "request_id": 12, "rungs": [ { "rung_no": 0, "nbr_lines_used": 8, "states": [ 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0 ], "runtime_values": [ {"x": 0, "y": 0, "value": 0}, {"x": 2, "y": 0, "current": 0, "preset": 10} ] } ] } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `ok` | int | 固定为 1;无效 rung 跳过,不代表每个请求的 rung 都有效。 | | `runtime_only` | int | 固定为 1。 | | `request_id` | JSON 值 | 仅请求包含该字段时存在,原样回传。 | | `rungs[].rung_no` | int | rung 索引;注意这里使用 `rung_no`,不是完整模型中的 `rung_index`。 | | `rungs[].nbr_lines_used` | int | 本 rung 实际返回的逻辑行数。 | | `rungs[].states` | array\ | 一维数组,按行排列,长度为 `nbr_lines_used * 12`,坐标 `(x,y)` 对应 `states[y * 12 + x]`。 | | `rungs[].runtime_values` | array\ | 可读取的元素数值;没有数值时整个字段省略。 | | `runtime_values[].x/y` | int | 数值所属元素在 rung 内的坐标。 | | `runtime_values[].value` | int | 触点或线圈绑定的变量值,已解析索引变量偏移。 | | `runtime_values[].current/preset` | int | Counter、IEC Timer、CTU、CTD 的当前值和预置值。 | | `runtime_values[].input/output` | int | MOVE 的输入值和输出值。 | `states` 每项的 bit0 到 bit4 与 compact-v1 的 `runtime_bits` 相同。数值字段按元素类型和读取结果提供,可能只存在其中一部分,不能把缺失字段当作 0;本接口数值按 int 读取,GD 的小数部分不会保留。 运行态响应不含 `elements`、标签、注释及 `models`,应叠加到已获取的完整模型上。空请求数组或全部 rung 无效时返回 `rungs: []`。当前示教器用此路径轮询可见 rung。 ## 0x7413 PLC 插入 Rung / 行请求 **功能:** 未传 `row_no` 时,在 anchor rung 后插入新 rung;传入 `row_no` 时,在指定 rung 的该行之后插入一行。两种路径都用 `0x7414` 响应。 插入整个 rung: ```json {"robot": 1, "rung_no": 0, "rung_format": "compact-v1"} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `rung_no` | int | 是 | 整个 rung 路径为 anchor 索引;行路径为要修改的 rung 索引。 | | `rung_format` | string | 否 | 插入整个 rung 时,仅 compact-v1 响应包含变更模型;插入行时始终返回变更模型,该字段只控制 rung 编码格式。 | | `row_no` | int | 否 | 存在时切换为行插入,表示插入位置之前的 0 基行号,范围为 `0..nbr_lines_used-1`。 | 在 rung 0 的第 0 行之后插入一行: ```json {"robot": 1, "rung_no": 0, "row_no": 0, "rung_format": "compact-v1"} ``` 新行为空行,后续行下移,`nbr_lines_used` 加 1。已达最大行数、行号越界、插入位置跨越多行功能块或竖向连接时失败。 ## 0x7414 PLC 插入 Rung / 行响应 未传 `row_no` 时: ```json { "action": "insert", "anchor_rung_no": 0, "section_no": 0, "ok": 1, "inserted_rung_no": 1, "rung_format": "compact-v1", "changed_models": {"section": {}, "rungs": []} } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `insert`。 | | `anchor_rung_no` | int | 请求中的 anchor rung。 | | `section_no` | int | 所属 section 索引;找不到时为 -1。 | | `ok` | int | 1 成功,0 失败。 | | `inserted_rung_no` | int | 新 rung 索引,仅成功时存在。 | | `rung_format` | string | 仅 compact-v1 请求成功时存在。 | | `changed_models.section` | object | 仅 compact-v1 请求成功且找到 section 时返回变更后的 section。 | | `changed_models.rungs` | array | 仅 compact-v1 请求成功时返回 anchor、新 rung 和可能的后继 rung。 | | `error` | string | 失败原因,仅失败时存在。 | 传入 `row_no` 时: ```json { "action": "insert_row", "rung_no": 0, "row_no": 1, "section_no": 0, "ok": 1, "rung_format": "compact-v1", "changed_models": {"section": {}, "rungs": []} } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `insert_row`。 | | `rung_no` | int | 请求中的 rung 索引;行路径不返回 `anchor_rung_no`、`inserted_rung_no`。 | | `row_no` | int | 新行索引,即请求的 `row_no + 1`;失败响应也按此规则回填。 | | `section_no` | int | 所属 section 索引,找不到为 -1。 | | `ok` | int | 1 成功,0 失败。 | | `rung_format` | string | 仅 compact-v1 请求成功时存在。 | | `changed_models.section` | object | 成功且找到 section 时返回的 section 元数据。 | | `changed_models.rungs` | array | 成功时返回修改后的当前 rung;未请求 compact-v1 时使用普通格式。 | | `error` | string | 仅失败时存在。 | ## 0x7415 PLC 删除 Rung / 行请求 **功能:** 未传 `row_no` 时删除整个 rung;传入 `row_no` 时删除 rung 内的一行。用 `0x7416` 响应。 删除整个 rung: ```json {"robot": 1, "rung_no": 1, "rung_format": "compact-v1"} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `rung_no` | int | 是 | 整个 rung 路径为要删除的 rung;行路径为要修改的 rung 索引。 | | `rung_format` | string | 否 | 删除整个 rung 时,仅 compact-v1 响应包含变更模型;删除行时始终返回变更模型,该字段只控制 rung 编码格式。 | | `row_no` | int | 否 | 存在时切换为行删除,表示要删除的 0 基行号,范围为 `0..nbr_lines_used-1`。 | 删除 rung 0 的第 1 行: ```json {"robot": 1, "rung_no": 0, "row_no": 1, "rung_format": "compact-v1"} ``` 后续行上移,`nbr_lines_used` 减 1。当前行数不得减到 8 以下;行号越界、目标行占用多行功能块或与上下行有竖向连接时失败。目标行不必为空,允许删除该行中的普通触点、线圈或水平连接。 ## 0x7416 PLC 删除 Rung / 行响应 未传 `row_no` 时: ```json { "action": "delete", "section_no": 0, "deleted_rung_no": 1, "ok": 1, "rung_format": "compact-v1", "changed_models": {"section": {}, "rungs": []} } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `delete`。 | | `section_no` | int | 删除前所属 section。 | | `deleted_rung_no` | int | 被删除的 rung。 | | `ok` | int | 1 成功,0 失败。 | | `rung_format` | string | 仅 compact-v1 请求成功时存在。 | | `changed_models.section` | object | 仅 compact-v1 请求成功且找到 section 时返回。 | | `changed_models.rungs` | array | 仅 compact-v1 请求成功且有相邻 rung 时返回变更后的前驱和后继 rung。 | | `error` | string | 失败原因。 | 传入 `row_no` 时: ```json { "action": "delete_row", "rung_no": 0, "row_no": 1, "section_no": 0, "ok": 1, "rung_format": "compact-v1", "changed_models": {"section": {}, "rungs": []} } ``` `action` 固定为 `delete_row`,`row_no` 为请求中要删除的行号,`rung_no` 为所在 rung;不返回 `deleted_rung_no`。其余字段及存在条件与 `insert_row` 响应相同,成功时返回修改后的当前 rung。 ## 0x7420 PLC 元素更新请求 **功能:** 插入、替换或删除单个元素,也支持批量更新。用 `0x7422` 响应。 单元素: ```json { "robot": 1, "section_no": 0, "rung_format": "compact-v1", "rung_no": 0, "x": 0, "y": 0, "element": { "type": 1, "var_type": 400, "var_num": 0, "indexed_var_type": -1, "indexed_var_num": 0 } } ``` 批量: ```json { "robot": 1, "rung_format": "compact-v1", "elements": [ {"rung_no": 0, "x": 0, "y": 0, "element": {"type": 0}}, {"rung_no": 0, "x": 1, "y": 0, "element": {"type": 0}} ] } ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `section_no` | int | 否 | 兼容字段,当前定位实际使用 rung_no/x/y。 | | `rung_format` | string | 否 | compact-v1 时 changed_models.rungs 使用紧凑格式。 | | `rung_no` | int | 单元素时必填 | rung 索引。 | | `x/y` | int | 单元素时必填 | 元素坐标。 | | `element` | object | 单元素时必填 | 新元素数据;`type=0` 表示删除。 | | `elements` | array | 批量时必填 | 多个包含 rung_no/x/y/element 的项目。 | `element` 字段: | 字段 | 类型 | 含义 | | --- | --- | --- | | `type` | int | 元素类型;0 free,1 常开输入,2 常闭输入,3 上升沿,4 下降沿,9 水平连接,10 旧 Timer,11 Monostable,12 Counter,13 IEC Timer,14 Register,20 比较,50 到 53 输出,54 jump,55 call,60 operate,300 CTU,301 CTD,302 MOVE。编辑动作还支持 100 竖向连接、102 长连接、107 取反。 | | `var_type` | int | PLC 变量类型,常用 400 到 407。 | | `var_num` | int | 变量 0 基编号或功能块实例编号。 | | `indexed_var_type` | int | 索引变量类型,-1 表示不使用。 | | `indexed_var_num` | int | 索引变量编号。 | 普通触点(1、2)可绑定 X/Y/M/T/C/GB/GI/GD;边沿触点(3、4)及线圈(50 到 53)当前属性校验仅接受 X/Y/GB,索引变量也按相同范围校验。X 仍是只读变量,线圈写出应使用 Y 或 GB。输出元素须放在末列,多格功能块受占用和边界约束。 `type=100` 设置与上方的竖向连接(要求 `y>0`);`type=102` 从当前空格向右补水平连接,遇非空格或输出列前停止;`type=107` 切换触点/线圈的对应类型(1/2、3/4、50/51、52/53)。这些值是编辑动作,不作为响应中的持久元素类型。 功能块插入时由控制器分配实例编号,不能依靠本请求的 `var_num` 指定新功能块实例;应重新读取 rung/功能块模型,再用对应的模型更新命令设置参数。`connected_with_top` 和运行态字段不从本请求的 `element` 对象读取。 批量处理不是事务,首次失败后停止;已成功项目会尝试保存。响应 `ok=0` 也可能包含已成功项目的 `changed_models`。单项内部先改元素类型、再设置属性,属性校验失败时前一步可能已经生效;失败后应重新查询对应 rung。 ## 0x7422 PLC 元素更新响应 ```json { "action": "update_elements", "section_no": 0, "rung_no": 0, "x": 0, "y": 0, "processed_count": 2, "requested_count": 2, "ok": 1, "rung_format": "compact-v1", "changed_models": {"rungs": []} } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 单元素为 `insert_element`,批量为 `update_elements`。 | | `section_no` | int | 第一个处理元素所属 section;找不到时为 -1。 | | `rung_no` | int | 第一个处理元素的 rung。 | | `x/y` | int | 第一个处理元素坐标。 | | `processed_count` | int | 成功处理的元素数量。 | | `requested_count` | int | 批量请求总数,仅批量时存在。 | | `ok` | int | 1 全部成功,0 发生失败。 | | `rung_format` | string | 请求 compact-v1 且有 changed rung 时存在。 | | `changed_models.rungs` | array | 已发生变化的 rung。 | | `error` | string | 失败原因。 | ## 0x7423 IEC Timer 更新请求 ```json { "robot": 1, "timer_index": 0, "timer_iec": { "preset": {"type": 0, "num": 10}, "value": {"type": 403, "num": 0}, "base": 1000, "timer_mode": 0, "display_format": "" } } ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `timer_index` | int | 是 | IEC Timer 实例索引。 | | `timer_iec.preset` | object | 是 | 预置值引用。type=0 时 num 是常量。 | | `timer_iec.value` | object | 是 | 当前值变量引用。 | | `timer_iec.base` | int | 是 | 时间基值,只接受 100、1000、60000 毫秒;省略时解析为 0,校验失败。 | | `timer_iec.timer_mode` | int | 否 | 0 TON,1 TOF,2 TP。 | | `timer_iec.display_format` | string | 否 | ClassicLadder 显示格式。 | 请求中的运行态字段会被忽略。 IEC Timer、Counter、CTU、CTD 的 `preset/value` 均为 `{"type": ..., "num": ...}` 引用:`type=0` 时 `num` 为非负整数常量,其他情况为变量编号。当前可引用 X/Y/M/T/C/GI/GD,不接受 GB;MOVE 的 `in/out` 额外允许 GB。旧引用类型 1、2 分别兼容为 GI(406)、GD(407),响应使用规范化类型。变量编号须在对应容量范围内。 这些模型更新请求不是局部合并,未提供的引用或运行态字段通常按 0 解析;Timer 的 `base` 尤其必须显式传入。Counter、CTU、CTD 和 MOVE 会读取并写入请求中的运行态字段;Timer 更新则清零输入、备份输入、输出、启动标记和时间基累积值,并向当前值引用写入 0。 ## 0x7424 IEC Timer 更新响应 ```json { "action": "update_timer_iec", "timer_index": 0, "ok": 1, "timer_iec": {} } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `update_timer_iec`。 | | `timer_index` | int | Timer 索引。 | | `ok` | int | 1 成功,0 失败。 | | `timer_iec` | object | 成功时的完整模型。 | | `error` | string | 失败原因。 | `timer_iec` 包含 `timer_index,preset,value,base,timer_mode,display_format,input,input_bak,output,timer_started,value_to_reach_one_base_unit`。input/output 等字段是运行态。 ## 0x7425 Counter 更新请求 ```json { "robot": 1, "counter_index": 0, "counter": { "preset": {"type": 0, "num": 10}, "value": {"type": 404, "num": 0}, "value_bak": 0, "input_reset": 0, "input_preset": 0, "input_count_up": 0, "input_count_up_bak": 0, "input_count_down": 0, "input_count_down_bak": 0, "output_done": 0, "output_empty": 0, "output_full": 0 } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `robot` | int | 兼容字段,控制器忽略。 | | `counter_index` | int | Counter 实例索引。 | | `counter.preset` | object | 预置值引用。 | | `counter.value` | object | 当前值引用。 | | `value_bak` | int | 上一次值。 | | `input_reset` | int | reset 输入状态。 | | `input_preset` | int | preset 输入状态。 | | `input_count_up/input_count_up_bak` | int | 加计数当前/备份输入。 | | `input_count_down/input_count_down_bak` | int | 减计数当前/备份输入。 | | `output_done` | int | 完成输出。 | | `output_empty` | int | 空输出。 | | `output_full` | int | 满输出。 | ## 0x7426 Counter 更新响应 ```json {"action":"update_counter","counter_index":0,"ok":1,"counter":{}} ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `update_counter`。 | | `counter_index` | int | Counter 索引。 | | `ok` | int | 1 成功,0 失败。 | | `counter` | object | 成功时的完整 Counter,字段同 `0x7425`,并额外带 `counter_index`。 | | `error` | string | 失败原因。 | ## 0x7427 CTU 更新请求 ```json { "robot": 1, "ctu_index": 0, "ctu": { "preset": {"type":0,"num":10}, "value": {"type":404,"num":0}, "input_reset": 0, "input_count_up": 0, "input_count_up_bak": 0, "output_done": 0 } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `robot` | int | 兼容字段,控制器忽略。 | | `ctu_index` | int | CTU 实例索引。 | | `ctu.preset` | object | 预置值引用。 | | `ctu.value` | object | 当前值引用。 | | `input_reset` | int | reset 输入。 | | `input_count_up` | int | 加计数输入。 | | `input_count_up_bak` | int | 上一次加计数输入。 | | `output_done` | int | 完成输出。 | ## 0x7428 CTU 更新响应 ```json {"action":"update_ctu","ctu_index":0,"ok":1,"ctu":{}} ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `update_ctu`。 | | `ctu_index` | int | CTU 索引。 | | `ok` | int | 1 成功,0 失败。 | | `ctu` | object | 成功时完整 CTU,字段同 `0x7427`,额外带 `ctu_index`。 | | `error` | string | 失败原因。 | ## 0x7429 CTD 更新请求 ```json { "robot": 1, "ctd_index": 0, "ctd": { "preset": {"type":0,"num":10}, "value": {"type":404,"num":0}, "input_load": 0, "input_count_down": 0, "input_count_down_bak": 0, "output_done": 0 } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `robot` | int | 兼容字段,控制器忽略。 | | `ctd_index` | int | CTD 实例索引。 | | `ctd.preset` | object | 预置值引用。 | | `ctd.value` | object | 当前值引用。 | | `input_load` | int | load 输入;兼容字段名 `input_reset`。 | | `input_count_down` | int | 减计数输入。 | | `input_count_down_bak` | int | 上一次减计数输入。 | | `output_done` | int | 完成输出。 | ## 0x742A CTD 更新响应 ```json {"action":"update_ctd","ctd_index":0,"ok":1,"ctd":{}} ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `update_ctd`。 | | `ctd_index` | int | CTD 索引。 | | `ok` | int | 1 成功,0 失败。 | | `ctd` | object | 成功时完整 CTD,字段同 `0x7429`,额外带 `ctd_index`。 | | `error` | string | 失败原因。 | ## 0x742B MOVE 更新请求 ```json { "robot": 1, "move_index": 0, "move": { "in": {"type":0,"num":10}, "out": {"type":406,"num":0}, "out_bak": 0, "en": 0, "en_bak": 0, "eno": 0 } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `robot` | int | 兼容字段,控制器忽略。 | | `move_index` | int | MOVE 实例索引。 | | `move.in` | object | 输入值引用。 | | `move.out` | object | 输出值引用。 | | `out_bak` | int | 上一次输出值。 | | `en` | int | 使能输入。 | | `en_bak` | int | 上一次使能输入。 | | `eno` | int | 使能输出。 | ## 0x742C MOVE 更新响应 ```json {"action":"update_move","move_index":0,"ok":1,"move":{}} ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `update_move`。 | | `move_index` | int | MOVE 索引。 | | `ok` | int | 1 成功,0 失败。 | | `move` | object | 成功时完整 MOVE,字段同 `0x742B`,额外带 `move_index`。 | | `error` | string | 失败原因。 | ## 0x742D PLC 元素属性更新请求 **功能:** 不改变元素类型,仅修改变量引用属性。 ```json { "robot": 1, "section_no": 0, "rung_format": "compact-v1", "rung_no": 0, "x": 0, "y": 0, "element": { "type": 1, "var_type": 402, "var_num": 0, "indexed_var_type": -1, "indexed_var_num": 0 } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `robot` | int | 兼容字段,控制器忽略。 | | `section_no` | int | 兼容字段,控制器实际按 rung 定位。 | | `rung_format` | string | compact-v1 时响应 rung 使用紧凑格式。 | | `rung_no` | int | rung 索引。 | | `x/y` | int | 元素坐标。 | | `element.type` | int | 必须与当前位置可编辑元素的类型相同。 | | `element.var_type` | int | 新变量类型。 | | `element.var_num` | int | 新变量编号。 | | `element.indexed_var_type` | int | 索引变量类型,-1 表示不使用。 | | `element.indexed_var_num` | int | 索引变量编号。 | 触点/线圈的变量及索引变量范围与 `0x7420` 相同;功能块、jump/call 和表达式元素仅更新 `var_num`。若坐标落在多格功能块的占位格上,控制器会解析到可编辑主格;响应 `x/y` 仍回填请求坐标,客户端应应用返回的完整 rung。 ## 0x742E PLC 元素属性更新响应 ```json { "action": "update_element_properties", "section_no": 0, "rung_no": 0, "x": 0, "y": 0, "ok": 1, "rung_format": "compact-v1", "changed_models": {"rungs":[]} } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 固定为 `update_element_properties`。 | | `section_no` | int | 元素所属 section。 | | `rung_no/x/y` | int | 被修改元素的位置。 | | `ok` | int | 1 成功,0 失败。 | | `rung_format` | string | 请求 compact-v1 且成功时存在。 | | `changed_models.rungs` | array | 修改后的 rung。 | | `error` | string | 失败原因。类型不匹配时为 `element type mismatch for property update`。 | ## 0x7430 PLC 变量写入请求 **功能:** 按页写入 10 个 PLC 变量。用 `0x7432` 返回结果。 ```json { "var_type": 402, "var_page": 1, "value": [1,0,0,0,0,0,0,0,0,0] } ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `var_type` | int | 是 | 400 X、401 Y、402 M、403 T、404 C、405 GB、406 GI、407 GD。 | | `var_page` | int | 是 | 1 基页码,每页 10 个变量。 | | `value` | array\ | 是 | 10 个写入值。最后一页越界位置被忽略并在响应中返回 0。 | X 是只读变量。写 X 仍会收到 `0x7432`,其中 `ok=0,error="read_only"`,`value` 全为 0。无效类型、页码小于 1 或底层变量写入失败时不发送该响应。超出变量总数的整页返回 10 个 0,`ok=1`;成功响应的 `value` 是请求值回显,不是写后回读值。 ## 0x7431 PLC 变量读取请求 ```json {"var_type": 402, "var_page": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `var_type` | int | 是 | 400 X、401 Y、402 M、403 T、404 C、405 GB、406 GI、407 GD。 | | `var_page` | int | 是 | 1 基页码,每页 10 个变量。 | 无效类型、页码小于 1 或底层变量读取失败时不发送 `0x7432`。超出变量总数的整页返回 10 个 -1,`ok=1`。 ## 0x7432 PLC 变量值响应 **功能:** 响应 `0x7430` 或 `0x7431`。 ```json { "var_type": 402, "var_page": 1, "ok": 1, "value": [0,0,0,0,0,0,0,0,0,0] } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `var_type` | int | 请求的变量类型。 | | `var_page` | int | 请求的 1 基页码。 | | `ok` | int | 1 成功,0 失败。 | | `value` | array\ | 10 个变量值。读取最后一页时,越界位置为 -1;写入响应越界位置为 0。 | | `error` | string | 失败原因;当前明确值包括 `read_only`。 | 变量数量:X 16、Y 16、M 999、T 99、C 99、GB/GI/GD 各 999。GD 在该接口中按 int 传输,小数会丢失。 ## 0x7433 PLC 通用参数查询 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | 用 `0x7434` 响应。 ## 0x7434 PLC 通用参数响应 ```json { "nbr_rungs": 0, "nbr_bits": 0, "nbr_words": 0, "nbr_counters": 0, "nbr_ctus": 0, "nbr_ctds": 0, "nbr_moves": 0, "nbr_timers_iec": 0, "nbr_registers": 0, "register_list_size": 0, "nbr_phys_inputs": 0, "nbr_phys_outputs": 0, "nbr_arithm_expr": 0, "nbr_sections": 0, "nbr_symbols": 0, "nbr_phys_words_inputs": 0, "nbr_phys_words_outputs": 0, "period_millis_task_logic": 0, "period_millis_task_scan_inputs": 0, "real_inputs_outputs_only_on_target": 0, "automatically_adjust_summer_winter_time": 0, "rung_width": 12, "rung_height_default": 8, "rung_height_max": 1000 } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `nbr_rungs` | int | rung 容量。 | | `nbr_bits` | int | ClassicLadder 内部 bit 数量。 | | `nbr_words` | int | ClassicLadder 内部 word 数量。 | | `nbr_counters` | int | Counter 数量。 | | `nbr_ctus` | int | CTU 数量。 | | `nbr_ctds` | int | CTD 数量。 | | `nbr_moves` | int | MOVE 数量。 | | `nbr_timers_iec` | int | IEC Timer 数量。 | | `nbr_registers` | int | Register 数量。 | | `register_list_size` | int | Register 数据列表容量。 | | `nbr_phys_inputs` | int | 物理 bit 输入数量。 | | `nbr_phys_outputs` | int | 物理 bit 输出数量。 | | `nbr_arithm_expr` | int | 算术表达式数量。 | | `nbr_sections` | int | section 容量。 | | `nbr_symbols` | int | 符号表容量。 | | `nbr_phys_words_inputs` | int | 物理 word 输入数量。 | | `nbr_phys_words_outputs` | int | 物理 word 输出数量。 | | `period_millis_task_logic` | int | PLC 逻辑任务周期,单位 ms。 | | `period_millis_task_scan_inputs` | int | 输入扫描任务周期,单位 ms。 | | `real_inputs_outputs_only_on_target` | int | 是否只在目标设备使用真实 IO。 | | `automatically_adjust_summer_winter_time` | int | 是否自动调整夏令时和冬令时。 | | `rung_width` | int | 每个 rung 的列数,当前为 12。 | | `rung_height_default` | int | 默认行数及行删除下限,当前为 8。 | | `rung_height_max` | int | 每个 rung 的最大行数,当前控制器为 1000。 | 示例中其他容量和周期的 0 是占位值,实际值以控制器返回为准。 当前 SoftPLC 页面在初始化和成功导入后会发送本查询,响应信号由通信层转发;页面暂未连接消费这些字段的槽函数。协议接入方仍应读取新增的行列容量字段。 ## 0x7435 PLC 重置请求 **功能:** 调用 ClassicLadder reset。用 `0x7436` 响应。 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | reset 会重置 ClassicLadder 运行数据,并恢复原先的运行状态;它不是停止命令,运行中调用后可能继续运行。需要保持停止时使用 `0x7401` 并确认状态。 当前 reset 没有调用 `PlcVariableSystem::resetRuntime()`,因此不能保证扩展变量 M/T/C 全部清零。 ## 0x7436 PLC 重置响应 ```json {"ok": 1, "state": 1} ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `ok` | int | 1 重置成功,0 重置失败。 | | `state` | int | 重置后的 PLC 状态,含义同 `0x7403`;运行中重置不保证变为 1,未初始化可返回 -3。 | | `error` | string | 失败原因,仅失败时存在。 | ## 0x7437 PLC 工程导出准备请求 **功能:** 将当前内存工程保存为可下载的 `default.clprj` 快照,用 `0x7438` 返回下载信息。调用前必须确认 PLC 为停止状态(`state=1`);未停止时先用 `0x7401` 停止并等待状态响应。 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | 该命令只准备工程文件,不在 PLC JSON 响应中传输文件内容。 ## 0x7438 PLC 工程导出准备响应 ```json { "ok": 1, "state": 1, "remote_path": "./plc/transfer/default.clprj", "file_name": "default.clprj", "size": 4096, "md5": "0123456789abcdef0123456789abcdef" } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `ok` | int | 1 准备成功,0 失败。 | | `state` | int | 当前 PLC 状态。 | | `remote_path` | string | 成功时的控制器下载路径,当前固定为 `./plc/transfer/default.clprj`。 | | `file_name` | string | 成功时的建议文件名,固定为 `default.clprj`。 | | `size` | uint | 成功时的文件字节数,范围为 1 到 16777216(16 MiB)。 | | `md5` | string | 成功时文件的 32 位小写十六进制 MD5。 | | `code` | string | 失败时的错误分类:`plc_running`、`prepare_failed` 或 `export_failed`。 | | `error` | string | 仅失败时存在,错误说明。 | 示例中的 `size`、`md5` 仅为格式示意;下载完成后应校验文件实际大小和 MD5。每次导出准备都会重新生成该路径的快照。 ## 0x7439 PLC 工程导入准备请求 **功能:** 在 PLC 停止时准备上传路径,用 `0x743A` 响应。当前仅支持 `.clprj` 工程,文件大小不得超过 16 MiB。 ```json {"robot": 1, "extension": "clprj", "size": 4096} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `extension` | string | 是 | 必须为小写 `clprj`,不带点。 | | `size` | uint | 是 | 待上传文件的实际字节数,范围为 1 到 16777216。 | 准备成功会删除原暂存文件并登记新的待导入路径。此时尚未替换当前工程。 ## 0x743A PLC 工程导入准备响应 ```json { "ok": 1, "state": 1, "remote_path": "./plc/transfer/import.clprj", "max_size": 16777216 } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `ok` | int | 1 准备成功,0 失败。 | | `state` | int | 当前 PLC 状态。 | | `remote_path` | string | 成功时的上传路径,当前固定为 `./plc/transfer/import.clprj`。 | | `max_size` | uint | 成功时返回最大文件字节数,当前为 16777216。 | | `code` | string | 失败时的错误分类:`plc_running`、`invalid_file` 或 `prepare_failed`。 | | `error` | string | 仅失败时存在,错误说明。 | 收到成功响应后,通过通用文件传输通道上传到 `remote_path`;上传完成后再发送 `0x743B`。 ## 0x743B PLC 工程导入应用请求 **功能:** 校验已上传工程,备份当前工程,加载新工程并保存到 `./plc/default.clprj`,重新加载后执行 reset。用 `0x743C` 响应。调用时仍须为停止状态。 ```json { "robot": 1, "size": 4096, "md5": "0123456789abcdef0123456789abcdef" } ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `size` | uint | 是 | 已上传文件的实际字节数,必须与暂存文件一致且在 1 到 16777216 之间。 | | `md5` | string | 是 | 已上传文件的 32 位小写十六进制 MD5;控制器按字符串精确比较。 | 请求不接受自选应用路径,始终使用最近一次成功准备的暂存路径。`size`、`md5` 必须由实际文件计算,不能照抄示例。 每次应用尝试都会消费待导入状态;校验失败、导入失败或调用时 PLC 已不在停止状态,均需重新执行准备、上传、应用流程。导入过程失败会尝试恢复原工程;不能仅凭文件上传成功判断工程已生效。 ## 0x743C PLC 工程导入应用响应 ```json { "ok": 1, "state": 1, "project_summary": { "section_count": 1, "rung_count": 3, "current_section_index": 0, "dirty_flag": 0 } } ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `ok` | int | 1 已应用成功,0 失败。 | | `state` | int | 应用或错误处理后的 PLC 状态。成功后保持停止,不自动启动。 | | `project_summary` | object | 成功且能读取概要时存在,字段与 `0x7405` 相同。 | | `code` | string | 仅失败时存在,取值见下表。 | | `error` | string | 仅失败时存在,错误说明。 | 工程导入/导出错误分类: | `code` | 适用响应 | 含义 | | --- | --- | --- | | `plc_running` | `0x7438/0x743A/0x743C` | 当前状态不是 STOP(1),包括运行、冻结、加载或未初始化等状态。 | | `prepare_failed` | `0x7438/0x743A` | 无法创建工程传输目录。 | | `export_failed` | `0x7438` | 快照保存失败,或导出文件不存在、为空、超过大小限制。 | | `invalid_file` | `0x743A` | 扩展名或声明的文件大小不合法。 | | `not_prepared` | `0x743C` | 没有待应用的导入准备记录。 | | `validation_failed` | `0x743C` | 暂存文件无效、大小不匹配或 MD5 不匹配。 | | `backup_failed` | `0x743C` | 无法备份当前工程,尚未加载新工程。 | | `import_failed` | `0x743C` | 导入失败,已恢复原工程。 | | `rollback_failed` | `0x743C` | 导入及原工程恢复均失败,需检查控制器上的工程状态。 | 失败响应示例: ```json { "ok": 0, "code": "validation_failed", "error": "SoftPLC project validation failed", "state": 1 } ``` ### 工程文件传输顺序 工程二进制数据复用通用文件传输通道,PLC 命令只负责准备和应用: 1. 导出:停止 PLC 并确认 `state=1`,发送 `0x7437`,收到成功的 `0x7438` 后,用 `0x1074`(`REQUEST_DOWNLOAD_FILE`)请求下载;等待通用文件传输完成,再核对大小和 MD5。 2. 导入:停止 PLC 并确认 `state=1`,发送 `0x7439`,收到成功的 `0x743A` 后,用 `0x1072`(`REQUEST_UPLOAD_FILE`)请求上传;等待上传完成,再发送 `0x743B`。收到成功的 `0x743C` 后,重新查询工程概要、section 和通用参数。 通用下载请求 `0x1074`: ```json {"name": "./plc/transfer/default.clprj"} ``` 通用上传请求 `0x1072`: ```json {"name": "./plc/transfer/import.clprj", "size": 4096} ``` 这里的 `name` 应原样使用 PLC 准备响应中的 `remote_path`;通用请求分别通过 `0x1075`、`0x1073` 响应,后续数据帧和完成确认沿用通用文件协议。上传路径不匹配或尚未准备时,`0x1073` 返回 `answer="no", cause="invalid_project_transfer_path"`;通道忙时返回 `answer="busy"`。 导入使用控制器级单个待导入路径,没有会话 ID 或并行任务队列。客户端应串行执行,避免多个客户端同时准备或覆盖暂存文件。工程文件不携带开机自启设置,成功导入后需启动时另发 `0x7400`。 ## 0x743D PLC 开机自启查询请求 **功能:** 查询持久化的开机自启配置,用 `0x743F` 响应。该配置与当前 PLC 运行状态分别查询。 ```json {"robot": 1} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | `./plc/runtime.json` 不存在或配置对象未包含 `auto_start` 时,正常返回关闭。文件损坏、内容无效或读取失败时返回 `ok=0`。 ## 0x743E PLC 开机自启设置请求 **功能:** 持久化开机自启配置,用 `0x743F` 响应。只修改下次控制器启动时的行为,不立即启停 PLC,也不要求当前 PLC 停止。 ```json {"robot": 1, "auto_start": true} ``` | 字段 | 类型 | 必填 | 含义 | | --- | --- | --- | --- | | `robot` | int | 否 | 兼容字段,控制器忽略。 | | `auto_start` | bool / int | 是 | `true/false`,兼容整数 `1/0`;其他值及缺失字段均无效。 | 控制器下次启动时,只有 SoftPLC 初始化和默认工程准备成功,且配置读取成功、`auto_start=true`,才调用启动。读取配置失败时按关闭处理。 ## 0x743F PLC 开机自启响应 查询成功: ```json {"action": "query", "ok": 1, "auto_start": false} ``` 设置成功: ```json {"action": "set", "ok": 1, "auto_start": true} ``` | 字段 | 类型 | 含义 | | --- | --- | --- | | `action` | string | 查询为 `query`,设置为 `set`。 | | `ok` | int | 1 成功,0 失败。 | | `auto_start` | bool | 查询返回配置值,读取失败时为 false;设置请求合法时返回请求值,只有 `ok=1` 才表示持久化成功。非法设置请求不返回本字段。 | | `error` | string | 仅失败时存在,取值见下表。 | | `error` | 含义 | | --- | --- | | `Failed to read SoftPLC auto-start configuration` | 配置读取失败。 | | `Invalid SoftPLC auto-start value` | 设置请求缺少字段或值不合法。 | | `Failed to persist SoftPLC auto-start configuration` | 配置持久化失败。 | 该响应不含 `state` 或 `code`;当前运行状态仍用 `0x7402/0x7403` 查询。 ## 核对依据 - [控制器命令字定义](../ctr/Inexbot_Controller/src/hmi_comm/vxSvr_v2.h)与[命令分发](../ctr/Inexbot_Controller/src/hmi_comm/cmdParsing.cpp)。 - [SoftPLC JSON 处理、模型序列化、工程传输及自启配置](../ctr/Inexbot_Controller/src/softPLC/softplc_sdk.cpp)。 - [梯形图编辑约束、运行态数值和 reset](../ctr/Inexbot_Controller/src/softPLC/plc_sdk_bridge.cpp)与[行列容量定义](../ctr/classicladder/src/classicladder.h)。 - [控制器启动流程](../ctr/Inexbot_Controller/src/start/start.cpp)。 - [示教器 SoftPLC 请求与响应处理](../tp/QT-TeachBoxPrj/components/SettingWidget/SettingCode/plc/softplc.cpp)。 --- # 码垛工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/01.%E7%A0%81%E5%9E%9B%E5%B7%A5%E8%89%BA.html ## 1 抓手 ### 1.1 上位机设置抓手参数 **说明:** 抓手设置就是设置码垛过程中用到的工具手。两个吸盘分别取料(一个吸盘吸完后再切换到另一个吸盘取料),那么要设置成两个抓手;两个吸盘同时取料,则设置成一个抓手;如果两个吸盘分别放料(一个吸盘放完后切换到另一个吸盘放料),此时需要设置两个抓手;两个吸盘同时放料,则设置成一个抓手。 **命令字:** `0x8000` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手数目 | [1,4] | | pallet.gripper | array | 抓手工具号数组,第 i 个数代表抓手 i 的工具号 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 2, "gripper": [1, 3, 4, 1] } } ``` ### 1.2 上位机查询抓手参数 **命令字:** `0x8001` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 1.3 控制器返回抓手参数 **命令字:** `0x8002` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手数目 | [1,4] | | pallet.gripper | array | 抓手工具号数组,第 i 个数代表抓手 i 的工具号 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 2, "gripper": [1, 3, 4, 1] } } ``` ## 2 托盘 ### 2.1 上位机设置托盘参数 **命令字:** `0x8010` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.userNum | int | 用户坐标系 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "userNum": 1 } } ``` ### 2.2 上位机查询托盘参数 **命令字:** `0x8011` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 2.3 控制器返回托盘参数 **命令字:** `0x8012` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.userNum | int | 用户坐标系 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "userNum": 1 } } ``` ### 2.4 上位机下发设置码垛托盘范围参数 **命令字:** `0x8013` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 表示要操作的机器人编号 | [1,4] | | craftID | int | 码垛工艺号 | - | | pallet.tray_preview | bool | 是否打开托盘预览 | true/false | | pallet.tray_length | double | 托盘长 | (1,50000) | | pallet.tray_width | double | 托盘宽 | (1,50000) | ```json { "robot": 1, "craftID": 1, "pallet": { "tray_preview": true, "tray_length": 1, "tray_width": 1 } } ``` ### 2.5 上位机查询码垛托盘范围参数 **命令字:** `0x8014` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 表示要操作的机器人编号 | [1,4] | | craftID | int | 码垛工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 2.6 控制器回复托盘范围参数 **命令字:** `0x8015` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 表示要操作的机器人编号 | [1,4] | | craftID | int | 码垛工艺号 | - | | pallet.tray_preview | bool | 是否打开托盘预览 | true/false | | pallet.tray_length | double | 托盘长 | (1,50000) | | pallet.tray_width | double | 托盘宽 | (1,50000) | ```json { "robot": 1, "craftID": 1, "pallet": { "tray_preview": true, "tray_length": 1, "tray_width": 1 } } ``` ## 3 位置 ### 3.1 上位机设置位置参数 **说明:** 位置设置可以设置码垛工件点、辅助点、入口点,请带抓手设置所选的工具手进行位置标记。 **命令字:** `0x8020` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorNum | int | 标记原点所在层 | - | | pallet.enterPos | array | 入口点,double 类型,6个元素 | - | | pallet.realPos | array | 工件点,double 类型,6个元素 | - | | pallet.shiftPos | array | 辅助点,double 类型,6个元素 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorNum": 1, "enterPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "realPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "shiftPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0] } } ``` ### 3.2 上位机查询位置参数 **命令字:** `0x8021` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 3.3 控制器返回位置参数 **命令字:** `0x8022` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorNum | int | 标记原点所在层 | - | | pallet.enterPos | array | 入口点,double 类型,6个元素 | - | | pallet.realPos | array | 工件点,double 类型,6个元素 | - | | pallet.shiftPos | array | 辅助点,double 类型,6个元素 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorNum": 1, "enterPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "realPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0], "shiftPos": [9999.0, 9999.0, 9999.0, 9999.0, 9999.0, 9999.0] } } ``` ## 4 工件参数 ### 4.1 上位机设置工件参数 **命令字:** `0x8030` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceGapX | double | 托盘 X 方向间隙 | [0,9999]mm | | pallet.workpieceGapY | double | 托盘 Y 方向间隙 | [0,9999]mm | | pallet.workpieceHeight | double | 高(托盘 Z 方向) | [1,9999]mm | | pallet.workpieceLength | array | 长(托盘 Y 方向),double 类型 | [1,9999]mm | | pallet.workpieceWidth | array | 宽(托盘 X 方向),double 类型 | [1,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceGapX": 0.0, "workpieceGapY": 0.0, "workpieceHeight": 1.0, "workpieceLength": [1.0], "workpieceWidth": [1.0] } } ``` ### 4.2 上位机查询工件参数 **命令字:** `0x8031` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 4.3 控制器返回工件参数 **命令字:** `0x8032` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceGapX | double | 托盘 X 方向间隙 | [0,9999]mm | | pallet.workpieceGapY | double | 托盘 Y 方向间隙 | [0,9999]mm | | pallet.workpieceHeight | double | 高(托盘 Z 方向) | [1,9999]mm | | pallet.workpieceLength | array | 长(托盘 Y 方向),double 类型 | [1,9999]mm | | pallet.workpieceWidth | array | 宽(托盘 X 方向),double 类型 | [1,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceGapX": 0.0, "workpieceGapY": 0.0, "workpieceHeight": 1.0, "workpieceLength": [1.0], "workpieceWidth": [1.0] } } ``` ## 5 接近参数 ### 5.1 上位机设置接近参数 **命令字:** `0x8040` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceApproEnable | bool | 接近使能 | true/false | | pallet.workpieceApproMode | int | 接近方式 | 0:下降接近, 1:接近下降 | | pallet.workpieceApproLenX | double | 托盘 X 方向长度 | [0,9999]mm | | pallet.workpieceApproLenY | double | 托盘 Y 方向长度 | [0,9999]mm | | pallet.workpieceApproLenZ | double | 托盘 Z 方向长度 | [0,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceApproEnable": false, "workpieceApproMode": 0, "workpieceApproLenX": 0, "workpieceApproLenY": 0, "workpieceApproLenZ": 0 } } ``` ### 5.2 上位机查询接近参数 **命令字:** `0x8041` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 5.3 控制器返回接近参数 **命令字:** `0x8042` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.workpieceApproEnable | bool | 接近使能 | true/false | | pallet.workpieceApproMode | int | 接近方式 | 0:下降接近, 1:接近下降 | | pallet.workpieceApproLenX | double | 托盘 X 方向长度 | [0,9999]mm | | pallet.workpieceApproLenY | double | 托盘 Y 方向长度 | [0,9999]mm | | pallet.workpieceApproLenZ | double | 托盘 Z 方向长度 | [0,9999]mm | ```json { "robot": 1, "craftID": 1, "pallet": { "workpieceApproEnable": false, "workpieceApproMode": 0, "workpieceApproLenX": 0, "workpieceApproLenY": 0, "workpieceApproLenZ": 0 } } ``` ## 6 重叠模式参数 ### 6.1 设置重叠模式参数 **命令字:** `0x8050` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorSum | int | 层数 | [1,999] | | pallet.overlapType | int | 重复关系 | 0:相同, 1:交替, 2:自定义 | | pallet.layHeightOffset | double | 放货点高度补偿 | - | | pallet.fixedLayHeight | bool | 固定放货点高度 | true/false | | pallet.fixedSupHeight | bool | 固定辅助点高度 | true/false | | pallet.columnLay | bool | 竖直方向排列 | true/false | | pallet.floorAutoJustified | bool | 层自动对齐 | true/false | | pallet.poseAutorotation | bool | 姿态自动旋转 | true/false | | pallet.fixedEnterPoint | bool | 固定入口点位置 | true/false | | pallet.graphicNum | array | 图形编号 | [0,9] | | pallet.heightRevise | array | 高度修正 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorSum": 1, "overlapType": 0, "layHeightOffset": 0.0, "fixedLayHeight": false, "fixedSupHeight": false, "columnLay": false, "floorAutoJustified": false, "poseAutorotation": false, "fixedEnterPoint": false, "graphicNum": [1, 2, 1, 2], "heightRevise": [1.1, -2.2] } } ``` ### 6.2 上位机查询重叠模式参数 **命令字:** `0x8051` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 6.3 控制器返回重叠模式参数 **命令字:** `0x8052` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.floorSum | int | 层数 | [1,999] | | pallet.overlapType | int | 重复关系 | 0:相同, 1:交替, 2:自定义 | | pallet.layHeightOffset | double | 放货点高度补偿 | - | | pallet.fixedLayHeight | bool | 固定放货点高度 | true/false | | pallet.fixedSupHeight | bool | 固定辅助点高度 | true/false | | pallet.columnLay | bool | 竖直方向排列 | true/false | | pallet.floorAutoJustified | bool | 层自动对齐 | true/false | | pallet.poseAutorotation | bool | 姿态自动旋转 | true/false | | pallet.fixedEnterPoint | bool | 固定入口点位置 | true/false | | pallet.graphicNum | array | 图形编号 | [0,9] | | pallet.heightRevise | array | 高度修正 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "floorSum": 1, "overlapType": 0, "layHeightOffset": 0.0, "fixedLayHeight": false, "fixedSupHeight": false, "columnLay": false, "floorAutoJustified": false, "poseAutorotation": false, "fixedEnterPoint": false, "graphicNum": [1, 2, 1, 2], "heightRevise": [1.1, -2.2] } } ``` ## 7 平面模式参数 ### 7.1 设置平面模式参数 **命令字:** `0x8060` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.graphicType | int | 模版选择 | 0:行列, 1:纵横交错, 2:回字型, 3:五花垛, 4:自定义 | | pallet.transLenX | double | X 平移补偿 | [-9999,9999]mm | | pallet.transLenY | double | Y 平移补偿 | [-9999,9999]mm | | pallet.ranks.numX | int | x 方向个数 | [1,999] | | pallet.ranks.numY | int | y 方向个数 | [1,999] | | pallet.ranks.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.autoCalculate | bool | 自动计算 | true/false | | pallet.intertwining.numX | int | x 方向个数 | [1,999] | | pallet.intertwining.numY | int | y 方向个数 | [1,999] | | pallet.intertwining.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.intertwining.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.A_rows | int | A 区行数 | [0,999] | | pallet.wideType.B_rows | int | B 区行数 | [1,999] | | pallet.wideType.B_columns | int | B 区列数 | [1,999] | | pallet.wideType.C_rows | int | C 区行数 | [0,999] | | pallet.wideType.A_C_columns | int | A 区和 C 区列数 | [0,999] | | pallet.wideType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.custom.sum | int | 层工件总数 | - | | pallet.custom.start | int | 开始发送的工件号 | - | | pallet.custom.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.custom.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].t | double | 旋转角 | [-180,180] | | pallet.custom.eachVec[].dir | int | 接近方向 | 0:上, 1:下, 2:左, 3:右, 4:左上, 5:左下, 6:右上, 7:右下 | | pallet.custom.eachVec[].h | double | 高度修正 | [-9999,9999]mm | | pallet.custom.eachVec[].EntrySpeed | double | 接近速度 | 0或[1,100]% | | pallet.custom.eachVec[].LeaveSpeed | double | 离开速度 | 0或[1,100]% | **注意:** 每次最多发送十组,若工件总数大于10,则要多次发送,非第一次发送时 start 需要改变。例如,第一次发送10组,第二次发送时 start 为11。 ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "graphicType": 0, "transLenX": 2.2, "transLenY": -3.3, "ranks": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0, "autoCalculate": true }, "intertwining": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "gearType": { "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "wideType": { "A_rows": 1, "B_rows": 1, "B_columns": 1, "C_rows": 1, "A_C_columns": 1, "rotationAngleWhole": 0.0, "rotationAngleSingle": 0.0 }, "custom": { "sum": 20, "start": 1, "count": 10, "eachVec": [ { "X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0, "EntrySpeed": 60.0, "LeaveSpeed": 3.0 } ] } } } ``` ### 7.2 上位机查询平面模式参数 **命令字:** `0x8061` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 7.3 控制器返回平面模式参数 **命令字:** `0x8060` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.graphicType | int | 模版选择 | 0:行列, 1:纵横交错, 2:回字型, 3:五花垛, 4:自定义 | | pallet.transLenX | double | X 平移补偿 | [-9999,9999]mm | | pallet.transLenY | double | Y 平移补偿 | [-9999,9999]mm | | pallet.ranks.numX | int | x 方向个数 | [1,999] | | pallet.ranks.numY | int | y 方向个数 | [1,999] | | pallet.ranks.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.ranks.autoCalculate | bool | 自动计算 | true/false | | pallet.intertwining.numX | int | x 方向个数 | [1,999] | | pallet.intertwining.numY | int | y 方向个数 | [1,999] | | pallet.intertwining.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.intertwining.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.gearType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.A_rows | int | A 区行数 | [0,999] | | pallet.wideType.B_rows | int | B 区行数 | [1,999] | | pallet.wideType.B_columns | int | B 区列数 | [1,999] | | pallet.wideType.C_rows | int | C 区行数 | [0,999] | | pallet.wideType.A_C_columns | int | A 区和 C 区列数 | [0,999] | | pallet.wideType.rotationAngleWhole | int | 整体旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.wideType.rotationAngleSingle | int | 工件旋转角度 | 0:0, 1:90, 2:180, 3:-90 | | pallet.custom.sum | int | 层工件总数 | - | | pallet.custom.start | int | 开始发送的工件号 | - | | pallet.custom.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.custom.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.custom.eachVec[].t | double | 旋转角 | [-180,180] | | pallet.custom.eachVec[].dir | int | 接近方向 | 0:上, 1:下, 2:左, 3:右, 4:左上, 5:左下, 6:右上, 7:右下 | | pallet.custom.eachVec[].h | double | 高度修正 | [-9999,9999]mm | | pallet.custom.eachVec[].EntrySpeed | double | 接近速度 | 0或[1,100]% | | pallet.custom.eachVec[].LeaveSpeed | double | 离开速度 | 0或[1,100]% | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "graphicType": 0, "transLenX": 2.2, "transLenY": -3.3, "ranks": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0, "autoCalculate": true }, "intertwining": { "numX": 0, "numY": 0, "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "gearType": { "rotationAngleWhole": 0, "rotationAngleSingle": 0 }, "wideType": { "A_rows": 1, "B_rows": 1, "B_columns": 1, "C_rows": 1, "A_C_columns": 1, "rotationAngleWhole": 0.0, "rotationAngleSingle": 0.0 }, "custom": { "sum": 20, "start": 1, "count": 10, "eachVec": [ { "X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0, "EntrySpeed": 60.0, "LeaveSpeed": 3.0 } ] } } } ``` ### 7.4 请求转换为平面模式自定义模板 **命令字:** `0x8063` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 7.5 控制器返回转换为平面模式自定义模板后对应参数 **命令字:** `0x8064` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.graphicType | int | 模版选择(此处只能取3) | 3:自定义 | | pallet.transLenX | double | X 平移补偿 | [-9999,9999]mm | | pallet.transLenY | double | Y 平移补偿 | [-9999,9999]mm | | pallet.autoTransLenX | double | X 自动平移距离 | - | | pallet.autoTransLenY | double | Y 自动平移距离 | - | | pallet.custom | object | 自定义参数(同上) | - | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "graphicType": 3, "transLenX": 2.2, "transLenY": -3.3, "autoTransLenX": 4.4, "autoTransLenY": 5.5, "custom": { "sum": 20, "start": 1, "count": 10, "eachVec": [ { "X": 0, "Y": 0, "t": 0, "dir": 0, "h": 0 } ] } } } ``` ### 7.6 上位机请求平面模式预览 **命令字:** `0x8065` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | ```json { "robot": 1, "craftID": 1, "graphic": 1 } ``` ### 7.7 控制器返回平面模式预览参数 **命令字:** `0x8066` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.workpieceLength | int | 每个工件的长度 | [0,9999]mm | | pallet.workpieceWidth | int | 每个工件的宽度 | [0,9999]mm | | pallet.sum | int | 层工件总数 | - | | pallet.start | int | 开始发送的工件号 | - | | pallet.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.tray.x | double | 托盘 x 坐标 | - | | pallet.tray.y | double | 托盘 y 坐标 | - | | pallet.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.eachVec[].t | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "workpieceLength": 1, "workpieceWidth": 1, "sum": 20, "start": 1, "count": 10, "tray": { "x": 0.0, "y": 0.0 }, "eachVec": [ { "X": 0, "Y": 0, "t": 0 } ] } } ``` ### 7.8 查询完整码垛平面模式自动计算结果 **命令字:** `0x806A` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 7.9 控制器返回完整码垛平面模式自动计算结果 **命令字:** `0x806B` | 参数名 | 类型 | 说明 | |--------|------|------| | pallet.ranks.numX | int | X 方向个数 | | pallet.ranks.numY | int | Y 方向个数 | ```json { "pallet": { "ranks": { "numX": 0, "numY": 0 } } } ``` ### 7.10 平面模式自定义模式预览(不保存参数和结果) **命令字:** `0x8067` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.workpieceLength | int | 每个工件的长度 | [0,9999]mm | | pallet.workpieceWidth | int | 每个工件的宽度 | [0,9999]mm | | pallet.sum | int | 层工件总数 | - | | pallet.start | int | 开始发送的工件号 | - | | pallet.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.tray.x | double | 托盘 x 坐标 | - | | pallet.tray.y | double | 托盘 y 坐标 | - | | pallet.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.eachVec[].t | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "workpieceLength": 1, "workpieceWidth": 1, "sum": 20, "start": 1, "count": 10, "tray": { "x": 0.0, "y": 0.0 }, "eachVec": [ { "X": 0, "Y": 0, "t": 0 } ] } } ``` ### 7.11 控制器返回平面模式自定义模式预览 **命令字:** `0x8068` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.workpieceLength | int | 每个工件的长度 | [0,9999]mm | | pallet.workpieceWidth | int | 每个工件的宽度 | [0,9999]mm | | pallet.sum | int | 层工件总数 | - | | pallet.start | int | 开始发送的工件号 | - | | pallet.count | int | 发送给控制器的层工件数,每次发送最大为10 | - | | pallet.tray.x | double | 托盘 x 坐标 | - | | pallet.tray.y | double | 托盘 y 坐标 | - | | pallet.eachVec[].X | double | X 偏移 | [-9999,9999]mm | | pallet.eachVec[].Y | double | Y 偏移 | [-9999,9999]mm | | pallet.eachVec[].t | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craftID": 1, "graphic": 1, "pallet": { "workpieceLength": 1, "workpieceWidth": 1, "sum": 20, "start": 1, "count": 10, "tray": { "x": 0.0, "y": 0.0 }, "eachVec": [ { "X": 0, "Y": 0, "t": 0 } ] } } ``` ## 8 复制层图形参数 ### 8.1 复制层图形参数 **命令字:** `0x8069` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID_source | int | 要复制的工艺号 | - | | craftID_target | int | 复制到的工艺号 | - | | graphic_source | int | 要复制的图形层 | - | | graphic_target | int | 复制到的图形层 | - | ```json { "robot": 1, "craftID_source": 1, "craftID_target": 2, "graphic_source": 1, "graphic_target": 2 } ``` ## 9 码垛状态 ### 9.1 设置码垛状态 **命令字:** `0x80A0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | graphic | int | 图形编号 | [1,9] | | pallet.curLayerNum | int | 当前层数 | - | | pallet.curLayerPalletedWpNum | int | 当前层已码工件数 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "curLayerNum": 1, "curLayerPalletedWpNum": 5 } } ``` ### 9.2 上位机查询码垛状态 **命令字:** `0x80A1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 9.3 控制器返回码垛状态 **命令字:** `0x80A2` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craftID | int | 工艺号 | | graphic | int | 图形编号 | | pallet.totalWpNum | int | 总工件数 | | pallet.totalLayerNum | int | 总层数 | | pallet.curPalletedWpSum | int | 当前已码总工件数 | | pallet.curLayerNum | int | 当前层数 | | pallet.curLayerPalletedWpNum | int | 当前层已码工件数 | | pallet.curLayerWpSum | int | 当前层总工件数 | ```json { "robot": 1, "craftID": 1, "pallet": { "totalWpNum": 20, "totalLayerNum": 2, "curPalletedWpSum": 5, "curLayerNum": 1, "curLayerPalletedWpNum": 5, "curLayerWpSum": 10 } } ``` ## 10 码垛类型 ### 10.1 上位机切换使用码垛类型 **命令字:** `0x80B2` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | usePalletType | int | 码垛类型 | 0:简易, 1:完整, 2:未定义 | | craftNote | string | 标记 | - | ```json { "robot": 1, "craftID": 1, "usePalletType": 0, "craftNote": "" } ``` ### 10.2 上位机查询当前使用码垛类型 **命令字:** `0x80B3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 10.3 控制器返回当前使用码垛类型 **命令字:** `0x80B4` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | usePalletType | int | 码垛类型 | 0:简易, 1:完整, 2:未定义 | | craftNote | string | 标记 | - | ```json { "robot": 1, "craftID": 1, "usePalletType": 0, "craftNote": "" } ``` ## 11 简易码垛 ### 11.1 设置简易码垛位置 **命令字:** `0x80C0` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craftID | int | 工艺号 | | O | array | 工件起始点,直角坐标系下的末端位姿 | | X | array | 列末端,直角坐标系下的末端位姿 | | Y | array | 行末端,直角坐标系下的末端位姿 | | shift | array | 辅助点,直角坐标系下的末端位姿 | | enter | array | 入口点,直角坐标系下的末端位姿 | | numX | int | 行数 | | numY | int | 列数 | | numZ | int | 层数 | | useAcrossCorner | bool | 是否使用对角末端,true:是, false:否 | ```json { "robot": 1, "craftID": 1, "O": [1, 2, 3, 4, 5, 6], "X": [1, 2, 3, 4, 5, 6], "Y": [1, 2, 3, 4, 5, 6], "shift": [1, 2, 3, 4, 5, 6], "enter": [1, 2, 3, 4, 5, 6], "numX": 1, "numY": 1, "numZ": 1, "useAcrossCorner": true } ``` ### 11.2 上位机查询简易码垛位置 **命令字:** `0x80C1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 11.3 控制器返回简易码垛位置 **命令字:** `0x80C2` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craftID | int | 工艺号 | | O | array | 工件起始点(弧度制) | | ODeg | array | 工件起始点(角度制) | | X | array | 列末端(弧度制) | | XDeg | array | 列末端(角度制) | | Y | array | 行末端(弧度制) | | YDeg | array | 行末端(角度制) | | shift | array | 辅助点(弧度制) | | shiftDeg | array | 辅助点(角度制) | | enter | array | 入口点(弧度制) | | enterDeg | array | 入口点(角度制) | | acrossCorner | array | 对角末端(弧度制) | | acrossCornerDeg | array | 对角末端(角度制) | | numX | int | 行数 | | numY | int | 列数 | | numZ | int | 层数 | ```json { "robot": 1, "craftID": 1, "O": [1, 2, 3, 4, 5, 6], "ODeg": [1, 2, 3, 4, 5, 6], "X": [1, 2, 3, 4, 5, 6], "XDeg": [1, 2, 3, 4, 5, 6], "Y": [1, 2, 3, 4, 5, 6], "YDeg": [1, 2, 3, 4, 5, 6], "shift": [1, 2, 3, 4, 5, 6], "shiftDeg": [1, 2, 3, 4, 5, 6], "enter": [1, 2, 3, 4, 5, 6], "enterDeg": [1, 2, 3, 4, 5, 6], "acrossCorner": [1, 2, 3, 4, 5, 6], "acrossCornerDeg": [1, 2, 3, 4, 5, 6], "numX": 1, "numY": 1, "numZ": 1 } ``` ### 11.4 设置简易码垛抓手参数 **命令字:** `0x80C3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手个数 | [1,4] | | pallet.gripper | array | 抓手工具号数组 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 4, "gripper": [1, 3, 4, 1] } } ``` ### 11.5 上位机查询简易码垛抓手参数 **命令字:** `0x80C4` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ### 11.6 控制器返回简易码垛抓手参数 **命令字:** `0x80C5` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | pallet.gripperNum | int | 抓手个数 | [1,4] | | pallet.gripper | array | 抓手工具号数组 | - | ```json { "robot": 1, "craftID": 1, "pallet": { "gripperNum": 4, "gripper": [1, 3, 4, 1] } } ``` ## 12 码垛复位 ### 12.1 码垛复位 **命令字:** `0x80A3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | gripper | int | 抓手工具号 | [1,9] | ```json { "robot": 1, "craftID": 1 } ``` ## 13 复制与清空 ### 13.1 复制码垛参数 **命令字:** `0x80B0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID_source | int | 要复制的工艺号 | - | | craftID_target | int | 复制到的工艺号 | - | ```json { "robot": 1, "craftID_source": 1, "craftID_target": 2 } ``` ### 13.2 清空码垛参数 **命令字:** `0x80B1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | ```json { "robot": 1, "craftID": 1 } ``` ## 14 点位调试界面 ### 14.1 上位机获取当前层全部工件数据 **命令字:** `0x8080` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 当前层 | - | | clear | int | 是否清空缓存,1:清空缓存, 0:不清 | - | ```json { "robot": 1, "craft": 1, "layer": 1, "clear": 0 } ``` ### 14.2 控制器回复当前层全部工件数据 **命令字:** `0x8081` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craft | int | 工艺号 | | layer | int | 当前层 | | sumLayer | int | 总层数 | | length.L | int | 长 | | length.W | int | 宽 | | overLimit.over | int | 0:无超限, 1:入口点超限, 2:辅助点超限, 3:工件点超限 | | overLimit.layer | int | 超限层 | | overLimit.num | int | 超限工件号 | | pallet.sum | int | 层工件总数 | | pallet.count | int | 发送给控制器的层工件数 | | pallet.start | int | 开始发送的工件号 | | pallet.tray_length | double | 托盘长 | | pallet.tray_width | double | 托盘宽 | | pallet.tray.x | double | 托盘 x 坐标 | | pallet.tray.y | double | 托盘 y 坐标 | | pallet.eachVec[].X | double | X 坐标 | | pallet.eachVec[].Y | double | Y 坐标 | | pallet.eachVec[].Z | double | Z 坐标 | | pallet.eachVec[].t | double | 旋转角 | | pallet.eachVec[].over | int | 0:无超限, 1:入口点不可达, 2:辅助点不可达, 3:工件点不可达 | ```json { "robot": 1, "craft": 1, "layer": 1, "sumLayer": 10, "length": { "L": 10, "W": 10 }, "overLimit": { "over": 1, "layer": 1, "num": 2 }, "pallet": { "sum": 25, "count": 10, "start": 1, "tray_length": 5, "tray_width": 5, "tray": { "x": 0, "y": 0 }, "eachVec": [ { "X": 0, "Y": 0, "Z": 0, "t": 0, "over": 0 } ] } } ``` ### 14.3 码垛工艺号查询 **命令字:** `0x8082` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | ```json { "robot": 1, "craft": 1 } ``` ### 14.4 控制器回复码垛工艺号查询结果 **命令字:** `0x8083` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | | craft | int | 工艺号 | | _palletNumIsTooMore | bool | 码垛数量是否过多 | ```json { "robot": 1, "craft": 1, "_palletNumIsTooMore": true } ``` ### 14.5 上位机获取抓手对应工具手 **命令字:** `0x808B` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | gripper | int | 抓手号 | - | ```json { "robot": 1, "craft": 1, "gripper": 1 } ``` ### 14.6 控制器返回 **命令字:** `0x808C` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | tool | int | 工具手号 | - | ```json { "robot": 1, "craft": 1, "tool": 1 } ``` ### 14.7 上位机设置整体偏移 **命令字:** `0x8084` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 当前层 | - | | transLenX | double | X 偏移 | - | | transLenY | double | Y 偏移 | - | | transLenZ | double | Z 偏移 | - | | rotationAngle | double | 偏移角度 | - | ```json { "robot": 1, "craft": 1, "layer": 1, "transLenX": 0, "transLenY": 0, "transLenZ": 0, "rotationAngle": 0 } ``` ### 14.8 应用到相同层 **命令字:** `0x8085` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | ```json { "robot": 1, "craft": 1, "layer": 1 } ``` ### 14.9 修改单个工件位置 **命令字:** `0x8086` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | | num | int | 当前工件 | - | | mode | int | 设置方式 | 0:直接设置 xyz, 1:使用机器人当前位置 | | X | double | X 偏移 | [-9999,9999]mm | | Y | double | Y 偏移 | [-9999,9999]mm | | Z | double | Z 偏移 | [-9999,9999]mm | | angle | double | 旋转角 | [-180,180] | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1, "mode": 0, "X": 0.1, "Y": 0.1, "Z": 0.1, "angle": 0 } ``` ### 14.10 获取单个工件位置 **命令字:** `0x8087` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | | num | int | 当前工件 | - | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1 } ``` ### 14.11 控制器回复单个工件位置 **命令字:** `0x8088` | 参数名 | 类型 | 说明 | |--------|------|------| | ApproachMode | int | 接近方式 | | DepartureSpeed | double | 离开速度 | | EntryConfiguration | int | 入口配置 | | EntrySpeed | double | 接近速度 | | RealConfiguration | int | 实际配置 | | ShiftConfiguration | int | 辅助配置 | | X | double | X 坐标 | | Y | double | Y 坐标 | | Z | double | Z 坐标 | | craft | int | 工艺号 | | layer | int | 层 | | num | int | 当前工件 | | over | int | 超限标志 | | overLimit.layer | int | 超限层 | | overLimit.num | int | 超限工件号 | | overLimit.over | int | 超限类型 | | reference | int | 参考点 | | robot | int | 当前机器人 | | t | double | 旋转角 | ```json { "ApproachMode": 0, "DepartureSpeed": 0.0, "EntryConfiguration": 0, "EntrySpeed": 0.0, "RealConfiguration": 0, "ShiftConfiguration": 0, "X": 0.0, "Y": 0.0, "Z": 0.0, "craft": 7, "layer": 1, "num": 1, "over": 3, "overLimit": { "layer": 1, "num": 1, "over": 3 }, "reference": 1, "robot": 1, "t": 0.0 } ``` ### 14.12 将点位调试内容从缓存保存到文件中 **命令字:** `0x8089` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | gripper | int | 抓手号 | - | ```json { "robot": 1, "craft": 1, "gripper": 1 } ``` ### 14.13 运动到工件点/辅助点/入口点 **命令字:** `0x808A` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craft | int | 工艺号 | - | | layer | int | 层 | - | | num | int | 当前工件 | - | | tool | int | 工具手 | - | | type | int | 运动到的点 | 0:入口点, 1:辅助点, 2:工件点 | ```json { "robot": 1, "craft": 1, "layer": 1, "num": 1, "tool": 1, "type": 0 } ``` ### 14.14 设置接近/离开方式 **命令字:** `0x80C7` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | craftID | int | 工艺号 | - | | approMoveType | int | 接近/离开方式 | - | ```json { "robot": 1, "craftID": 1, "approMoveType": 1 } ``` --- # 焊接工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/02.%E7%84%8A%E6%8E%A5%E5%B7%A5%E8%89%BA.html 焊接的相关通讯协议主要包含焊接装备、电流电压、焊接参数、摆焊参数、焊接 IO 端口、多层多道焊接、相贯线,关于焊接工艺的详细介绍请参考焊接工艺手册。 --- ## 1. 焊接装备 焊接装备设置包含基础功能、微调整、防碰撞、再启动/再启弧和其他模块。 ### 1.1 上位机设置焊接装备 **命令字:** `0x8300` 说明:焊接过程中,通过发生断弧、防碰撞、切模式停止等方式断弧时,此功能可在断弧处接着焊接。自动再启动、半自动再启动时要确保断弧处和回退目标位置之间没有障碍物。 #### basic_functions(基础功能) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | arc_detection_time | double | 电弧检测时间 | [0,5]s | | arc_depletion_detection_time | double | 电弧耗尽检测时间 | [0,5]s | | arc_detection_ensure_time | double | 电弧检测确认时间 | [0,5]s | | pre_give_gas_time | double | 提前送气时间 | [0,5]s | | close_time | double | 关气时间(负数为提前关气,正数为延后关气) | [-5,5]s | | weld_interruption_detection | bool | 焊接中断检测 | true:中断检测;false:不中断检测 | | arc_fly | bool | 飞行起弧 | true:飞行起弧;false:不飞行起弧 | | air_close_mode | int | 关气方式 | 0: 延迟关气,1: 提前关气 | #### micro_adjustment(微调整) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | single_adjustment_current | double | 焊接电流单次调整量 | [0,1000]A | | single_adjustment_voltage | double | 焊接电压单次调整量 | [-1000,1000]V | #### restart(再启动/再起弧) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | restart_times | int | 再启动次数 | [0,1000] | | restart_distance | double | 再启动距离 | [0,100]mm | | restart_speed | double | 再启动速度 | [0,100]mm/s | | re_arc_times | int | 再起弧次数 | [1,1000] | | restart_enable | bool | 再启动使能 | - | | re_arc_enable | bool | 再起弧使能 | - | | restart_mode | int | 再启动模式 | - | #### antiCollision(防碰撞) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | enable | bool | 防碰撞使能 | true: 开启;false:关闭 | | inputPort | int | 防碰撞 IO 端口 | - | | inputValue | int | 防碰撞出发电平 | 0/1 | | stopTime | double | 防碰撞快速停止时间 | [50,200]s | | outputPort | int | 防碰撞状态输出端口 | - | | outputValue | int | 防碰撞状态输出电平 | 0/1 | | shieldFlag | bool | 屏蔽防碰撞 | true: 开启;false:关闭 | | shieldTime | double | 屏蔽时间 | [0,1000000]s | #### other(其他) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | break_back_time | double | 断弧回抽时间 | [0,5]s | | weld_finish_time | double | 焊接完成回抽时间 | [0,5]s | | break_back_enable | bool | 断弧回抽使能 | true: 开启;false:关闭 | | weld_finish_function | bool | 焊接完成回抽功能 | true: 开启;false:关闭 | | simulation_set_zero | bool | 灭弧模拟量置零功能 | true: 开启;false:关闭 | | collisionButtonFlag.error_enable_switch | bool | 错误使能开关 | - | **示例:** ```json { "basic_functions": { "arc_detection_time": 1.1, "arc_depletion_detection_time": 1.1, "arc_detection_ensure_time": 1.1, "pre_give_gas_time": 1.1, "close_time": 1.1, "weld_interruption_detection": true, "arc_fly": true, "air_close_mode": 0 }, "micro_adjustment": { "single_adjustment_current": 1.1, "single_adjustment_voltage": 1.1 }, "restart": { "restart_times": 1, "restart_distance": 1.1, "restart_speed": 1.1, "re_arc_times": 1, "restart_enable": true, "re_arc_enable": true, "restart_mode": 1 }, "antiCollision": { "enable": false, "inputPort": 0, "inputValue": 1, "stopTime": 60, "outputPort": 0, "outputValue": 1, "shieldFlag": false, "shieldTime": 30 }, "other": { "break_back_time": 1.1, "weld_finish_time": 1.1, "break_back_enable": true, "weld_finish_function": true, "simulation_set_zero": true }, "collisionButtonFlag": { "error_enable_switch": true } } ``` ### 1.2 上位机查询焊接装备 **命令字:** `0x8301` 说明:拖拽点动模式切换开关 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 1.3 控制器回复焊接装备 **命令字:** `0x8302` 返回参数同"上位机设置焊接装备",参见上方表格及示例。 --- ## 2. 电流电压 ### 2.1 电流电压匹配设置 **命令字:** `0x8310` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | #### current_control(电流控制) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | set_current | double[] | 设置电流 | [0,10]A | | actual_current | double[] | 实际电流 | [0,999]A | #### voltage_control(电压控制) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | set_voltage | double[] | 设置电压 | [0,10]V | | actual_voltage | double[] | 实际电压 | [0,999]V | ```json { "current_control": { "set_current": [1, 2, 3, 4, 5, 6, 7, 8], "actual_current": [1, 2, 3, 4, 5, 6, 7, 8] }, "voltage_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_voltage": [1, 2, 3, 4, 5, 6, 7, 8] }, "robot": 1 } ``` ### 2.2 上位机查询电压电流匹配 **命令字:** `0x8311` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 2.3 控制器回复电流电压匹配 **命令字:** `0x8312` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | set_current | int[] | 设置电流 | [0,10]A | | actual_current | int[] | 实际电流 | [0,999]A | | set_voltage | int[] | 设置电压 | [0,10]V | | actual_voltage | int[] | 实际电压 | [0,999]V | | AO_setcurrent | int | 电流输出端口 | - | | AO_setvoltage | int | 电压输出端口 | - | ```json { "current_control": { "set_current": [1, 2, 3, 4, 5, 6, 7, 8], "actual_current": [1, 2, 3, 4, 5, 6, 7, 8] }, "voltage_control": { "set_voltage": [1, 2, 3, 4, 5, 6, 7, 8], "actual_voltage": [1, 2, 3, 4, 5, 6, 7, 8] }, "IO": { "AO_setcurrent": 0, "AO_setvoltage": 0 }, "robot": 1 } ``` ### 2.4 上位机设置电流电压匹配参数实际值 **命令字:** `0x8313` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | type | int | 参数类型(电压1=0, 电压2=1, 电流1=2, 电流2=3) | [0,3] | | value | double | 参数值 | [0,999]A/V | | robot | int | 机器人号 | [1,4] | ```json { "type": 0, "value": 4.13, "robot": 1 } ``` ### 2.5 控制器返回设置是否成功 **命令字:** `0x8314` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | result | int | 设置结果(1:成功,0:失败) | - | | robot | int | 当前机器人 | [1,4] | ```json { "result": 1, "robot": 1 } ``` ### 2.6 开始进行电流电压匹配 **命令字:** `0x8315` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | start | bool | 是否开始进行匹配 | true:开始, false:结束 | | robot | int | 当前机器人 | [1,4] | ```json { "start": true, "robot": 1 } ``` ### 2.7 手动操作电流电压设置 **命令字:** `0x8316` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | type | int | 选择设置电流/电压 | 1:设置电流,2:设置电压 | | value | double | 值 | - | ```json { "robot": 1, "type": 1, "value": 1 } ``` --- ## 3. 焊接参数 ### 3.1 上位机设置焊接参数 **命令字:** `0x8320` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号(从1开始,可设置1-99个) | [1,99] | | notes | string | 注释 | - | | robot | int | 当前机器人 | [1,4] | #### arcoff_parameters(收弧参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | arcoff_use_param | bool | 是否使用收弧参数 | true:使用;false:不使用 | | arcoff_voltage | double | 收弧电压 | [-1000,1000]V | | arcoff_current | double | 收弧电流 | [0,1000]A | | arcoff_time | double | 收弧时间 | [0,5]s | | ramp_time | double | 渐变时间 | [0,100000]ms | | ramp_enable | bool | 渐变使能 | - | | ramp_mode | int | 收弧渐变方式 | 0:时间渐变 | #### weld_parameters(焊接参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | weld_current | double | 焊接电流 | [0,1000]A | | weld_voltage | double | 焊接电压 | [-1000,1000]V | #### arcon_parameters(起弧参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | arcon_use_param | bool | 是否使用起弧参数 | true:使用;false:不使用 | | arcon_current | double | 起弧电流 | [0,1000]A | | arcon_voltage | double | 起弧电压 | [-1000,1000]V | | arcon_time | double | 起弧时间 | [0,5]s | | arcon_ramp_time | double | 渐变时间 | [0,1000000]ms | | arcon_ramp_enable | bool | 起弧渐变使能 | - | | arcon_ramp_mode | int | 起弧渐变方式 | 0:时间渐变 | ```json { "num": 1, "notes": "示例", "arcoff_parameters": { "arcoff_use_param": true, "arcoff_voltage": 1.1, "arcoff_current": 1.1, "arcoff_time": 1.1, "ramp_time": 1.1, "ramp_enable": true, "ramp_mode": 1 }, "weld_parameters": { "weld_current": 1.1, "weld_voltage": 1.1 }, "arcon_parameters": { "arcon_use_param": true, "arcon_current": 1.1, "arcon_voltage": 1.1, "arcon_time": 1.1, "arcon_ramp_time": 1.1, "arcon_ramp_enable": true, "arcon_ramp_mode": 1 } } ``` ### 3.2 上位机查询焊接参数 **命令字:** `0x8321` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号(从1开始) | [1,99] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 3.3 控制器回复焊接参数 **命令字:** `0x8322` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 参数序号(从1开始) | - | | notes | string | 注释 | - | | robot | int | 当前机器人 | [1,4] | #### arcoff_parameters(收弧参数) | 参数名 | 类型 | 说明 | |--------|------|------| | arcoff_voltage | double | 收弧电压 | | arcoff_current | double | 收弧电流 | | arcoff_time | double | 收弧时间 | | arcon_ramp_time | double | 渐变时间 | | arcon_ramp_distance | double | 渐变距离 | | arcon_ramp_enable | bool | 渐变使能 | | arcon_ramp_mode | int | 收弧渐变方式(0:时间渐变,1:距离渐变) | #### weld_parameters(焊接参数) | 参数名 | 类型 | 说明 | |--------|------|------| | weld_current | double | 焊接电流 | | weld_voltage | double | 焊接电压 | | weld_velocity | double | 焊接速度 | #### arcon_parameters(起弧参数) | 参数名 | 类型 | 说明 | |--------|------|------| | arcon_current | double | 起弧电流 | | arcon_voltage | double | 起弧电压 | | arcon_time | double | 起弧时间 | | arcon_ramp_time | double | 渐变时间 | | arcon_ramp_distance | double | 渐变距离 | | arcon_ramp_enable | bool | 起弧渐变使能 | | arcon_ramp_mode | int | 起弧渐变方式(0:时间渐变,1:距离渐变) | #### anti_adhesion_parameters(防粘丝参数) | 参数名 | 类型 | 说明 | |--------|------|------| | anti_adhesion_enable | bool | 防粘丝使能 | | anti_adhesion_times | int | 防粘丝次数 | | anti_adhesion_v | double | 防粘丝电压 | | anti_adhesion_i | double | 防粘丝电流 | | anti_adhesion_time | double | 防粘丝时间 | ```json { "num": 1, "notes": "示例", "arcoff_parameters": { "arcoff_voltage": 1.1, "arcoff_current": 1.1, "arcoff_time": 1.1, "arcon_ramp_time": 1.1, "arcon_ramp_distance": 1.1, "arcon_ramp_enable": true, "arcon_ramp_mode": 1 }, "weld_parameters": { "weld_current": 1.1, "weld_voltage": 1.1, "weld_velocity": 0.0 }, "arcon_parameters": { "arcon_current": 1.1, "arcon_voltage": 1.1, "arcon_time": 1.1, "arcon_ramp_time": 1.1, "arcon_ramp_distance": 1.1, "arcon_ramp_enable": true, "arcon_ramp_mode": 0 }, "anti_adhesion_parameters": { "anti_adhesion_enable": true, "anti_adhesion_times": 1, "anti_adhesion_v": 1.1, "anti_adhesion_i": 1.1, "anti_adhesion_time": 1.1 } } ``` --- ## 4. 摆焊参数 inexbot 摆焊支持七种摆动方式:正弦摆、Z 字摆、圆形摆、外部轴定点摆、L 型摆、三角摆、8字摆。摆动频率、摆动幅度、起始方向、水平偏角、竖直偏角等参数可调。 ### 4.1 上位机发送设置摆焊参数 **命令字:** `0x8330` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 摆焊文件序号(从1开始) | [1,99] | | note | string | 注释 | - | | robot | int | 当前机器人 | [1,4] | #### parameter(摆焊参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | weaving_type | int | 摆动类型 | [0,6],0:正弦,1:Z 字形,2:圆形摆,3:外部轴定点摆,4:L 型摆,5:三角摆,6:8字摆 | | weaving_freq | int | 摆动频率 | (0,20]Hz | | weaving_ampli | int | 摆动幅度 | (0,50]mm | | isMove | int | 是否移动/停留 | 0:停留,1:移动 | | right_standing_time | int | 右停留时间(选择 Z 字形摆、外部轴定点摆、L 型摆、三角摆时需要设置) | [0,15] | | left_standing_time | int | 左停留时间(选择 Z 字形摆、外部轴定点摆、L 型摆、三角摆时需要设置) | [0,15] | | init_direction | int | 起始方向 | 0:+1,1:-1 | | horizontal_angle | int | 水平偏角 | [-180,180] | | vertical_angle | int | 竖直偏角 | [-180,180] | | left_angle | int | 左仰角(选择 L 型摆、三角摆时需要设置) | [0,90] | | right_angle | int | 右仰角(选择 L 型摆、三角摆时需要设置) | [0,90] | ```json { "num": 1, "parameter": { "note": "示例", "weaving_type": 0, "weaving_freq": 20, "weaving_ampli": 50, "isMove": 0, "right_standing_time": 15, "left_standing_time": 15, "init_direction": 1, "horizontal_angle": 180, "vertical_angle": 180, "left_angle": 90, "right_angle": 90 }, "robot": 1 } ``` ### 4.2 上位机查询摆焊参数 **命令字:** `0x8331` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | | num | int | 摆焊文件序号 | [1,99] | ```json { "robot": 1, "num": 1 } ``` ### 4.3 控制器返回摆焊参数 **命令字:** `0x8332` 返回参数同"上位机设置摆焊参数",参见上方表格及示例。 --- ## 5. 焊接 IO inexbot 控制系统通过数字化 IO 端口实现焊接工艺的精确控制,配合模拟信号接口完成焊接参数的闭环管理。 ### 5.1 上位机设置焊接 IO 接口 **命令字:** `0x8340` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | #### Din(数字输入,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | arc_success | int | 起弧成功 | | seek_success | int | 寻位成功 | | weld_enable | int | 远程焊接使能 | | wire_feed | int | 点动送丝 | | return_wire | int | 退丝 | | remote_gastest | int | 气体检测 | | shieldingGas | int | 焊接保护气端口号 | | weldingWire | int | 焊丝端口号 | #### Dout(数字输出,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | arc_signal | int | 起弧成功信号 | | wire_feed | int | 点动送丝信号 | | wire_feed_back | int | 反向送丝信号 | | gas_detection | int | 气体检测信号 | | positioning_mode | int | 寻位模式 | | weld_enable | bool | 焊接使能 | #### Ain(模拟输入,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | electric | int | 焊接电流 | | voltage | int | 焊接电压 | #### Aout(模拟输出,端口号从1开始,0表示无) | 参数名 | 类型 | 说明 | |--------|------|------| | given_electric_current | int | 给定电流信号 | | given_setvoltage | int | 给定电压信号 | ```json { "Din": { "arc_success": 0, "seek_success": 0, "weld_enable": 0, "wire_feed": 0, "return_wire": 0, "remote_gastest": 0, "shieldingGas": 0, "weldingWire": 0 }, "Dout": { "arc_signal": 0, "wire_feed": 0, "wire_feed_back": 0, "gas_detection": 0, "positioning_mode": 0, "weld_enable": true }, "Ain": { "electric": 0, "voltage": 0 }, "Aout": { "given_electric_current": 0, "given_setvoltage": 0 }, "robot": 1 } ``` ### 5.2 上位机查询焊接 IO 接口 **命令字:** `0x8341` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 5.3 控制器回复焊接 IO 接口 **命令字:** `0x8342` 返回参数同"上位机设置焊接 IO 接口",参见上方表格及示例。 --- ## 6. 查询焊接状态 ### 6.1 上位机查询焊接状态 **命令字:** `0x8350` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人 | [1,4] | ```json { "robot": 1 } ``` ### 6.2 控制器返回焊接状态 **命令字:** `0x8351` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人 | [1,4] | #### antiCollision(防碰撞) | 参数名 | 类型 | 说明 | |--------|------|------| | shieldFlag | bool | 是否屏蔽防碰撞 | #### 焊接状态 | 参数名 | 类型 | 说明 | 取值 | |--------|------|------|------| | weldEnabled | bool | 焊接使能 | - | | spotWeldEnabled | bool | 点焊 | - | | feedWire | bool | 送丝 | - | | aspiration | bool | 送气 | - | | returnWire | bool | 退丝 | - | | pistolSwitch | int | 焊枪开关状态 | 0表示低(红),1表示高(绿),-1表示无(灰) | | arcingSuccess | int | 引弧成功 | 同上 | | handWireFeed | int | 手动送丝 | 同上 | | weldCurrent | double | 焊接电流 | - | | weldVoltage | double | 焊接电压 | - | | weldRunTime | double | 焊接时间 | - | | weldRunDutyRatio | double | 焊接占空比 | - | ```json { "antiCollision": { "shieldFlag": true }, "weldEnabled": true, "spotWeldEnabled": true, "feedWire": true, "aspiration": true, "returnWire": true, "pistolSwitch": 0, "arcingSuccess": 1, "handWireFeed": -1, "weldCurrent": 1.0, "weldVoltage": 2.0, "weldRunTime": 3.3, "weldRunDutyRatio": 4.4, "robot": 1 } ``` --- ## 7. 点焊参数 ### 7.1 上位机设置点焊参数 **命令字:** `0x8352` 说明:用户可以通过此命令手动设置点焊参数,包含:电焊电流、点焊电压、点焊最大时间。 | 参数名 | 类型 | 说明 | |--------|------|------| | spotWeldCurrent | double | 点焊电流 | | spotWeldVoltage | double | 点焊电压 | | spotWeldMaxTime | double | 点焊最大时间 | | robot | int | 机器人号(取值范围[1,4]) | ```json { "spotWeldCurrent": 0, "spotWeldVoltage": 0, "spotWeldMaxTime": 0, "robot": 1 } ``` --- ## 8. 焊机模式 ### 8.1 上位机设置焊机模式 **命令字:** `0x8360` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | type | int | 焊机模式 | 1:焊接使能,2:手动起弧,3:手动点焊,4:送丝,5:退丝,6:送气,7:故障复位 | | value | int | 是否开启对应的模式 | 1:开启,0:关闭 | | robot | int | 当前机器人 | [1,4] | ```json { "type": 1, "value": 0, "robot": 1 } ``` ### 8.2 上位机查询焊机模式 **命令字:** `0x8361` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 8.3 控制器返回焊机模式 **命令字:** `0x8362` | 参数名 | 类型 | 说明 | |--------|------|------| | weldEnabled | bool | 焊接使能 | | spotWeldEnabled | bool | 点焊使能 | | spotWeldCurrent | double | 点焊电流 | | spotWeldVoltage | double | 点焊电压 | | spotWeldMaxTime | double | 点焊最大时间 | | newCurrent | double | 设置电流 | | newVoltage | double | 设置电压 | | feedWire | bool | 送丝 | | returnWire | bool | 退丝 | | aspiration | bool | 送气 | | robot | int | 当前机器人(取值范围[1,4]) | ```json { "weldEnabled": true, "spotWeldEnabled": true, "spotWeldCurrent": 33.3, "spotWeldVoltage": -20.2, "spotWeldMaxTime": 0.5, "newCurrent": 33.3, "newVoltage": -20.2, "feedWire": true, "returnWire": true, "aspiration": true, "robot": 1 } ``` ### 8.4 焊接微调整 **命令字:** `0x8363` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | name | string | 焊接电流/电压 | - | | robot | int | 当前机器人 | [1,4] | | type | int | 操作类型 | 0:给定值增加,1:给定值减小,2:保存 | ```json { "name": "weld_current", "robot": 1, "type": 0 } ``` ### 8.5 上位机查询焊接微调整结果 **命令字:** `0x8364` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` ### 8.6 控制器返回查询结果 **命令字:** `0x8365` | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人 | #### weav(摆焊参数) | 参数名 | 类型 | 说明 | |--------|------|------| | left_stay_time | double[] | 左停留时间 | | right_stay_time | double[] | 右停留时间 | | swing_amplitude | double[] | 摆焊振幅 | | swing_frequency | double[] | 摆焊频率 | #### weld(焊接参数) | 参数名 | 类型 | 说明 | |--------|------|------| | weld_current | double[] | 焊接电流 | | weld_voltage | double[] | 焊接电压 | ```json { "robot": 1, "weav": { "left_stay_time": [0.0, 1.0], "right_stay_time": [0.0, 1.0], "swing_amplitude": [0.0, 1.0], "swing_frequency": [0.0, 1.0] }, "weld": { "weld_current": [0.0, 1.0], "weld_voltage": [0.0, 1.0] } } ``` --- ## 9. 焊机设置 ### 9.1 上位机设置焊机 **命令字:** `0x8370` 说明:用户可以通过以下命令字设置焊机。 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | controlMode | int | 控制模式 | 0:模拟控制,1:数字控制 | | monufactor | string | 焊机厂家 | 纳博特、麦格米特、深威智能、奥太、美佳尼克、瑞凌、肯倍 IF15、EWM、福尼斯 | | weldingMode | int | 焊机工作模式 | 0:分别,1:一元化 | | commMode | string | 通讯方式 | CAN、ModBus RTU、Modbus TCP | | slaveIP | string | 从站 IP(通讯方式为 Modbus TCP 时需要设置) | - | | slaveid | int | 从站 ID(通讯方式为 ModBus RTU 时需要设置) | - | | port | int | 端口号(通讯方式为 ModBus RTU、Modbus TCP 时需要设置) | (0,65535] | | baudRate | int | 波特率(通讯方式为 ModBus RTU 时需要设置) | - | | identifiedWelder | string | 已识别焊机 | - | | CANPort | string | CAN 通讯下的端口(通讯方式为 CAN 时需要设置) | - | | CANPortSum | int | CAN 通讯下的端口数量 | - | | welderNumber | int | 焊机编号 | - | | monufactorList | string[] | 可选择的焊机厂家清单 | 纳博特、麦格米特、深威智能、奥太、美佳尼克、瑞凌、肯倍 IF15、EWM、福尼斯、和宗 | | weldingvoltageCurve | int[] | 焊接电压曲线 | - | #### RILAND(瑞凌焊机参数) | 参数名 | 类型 | 说明 | |--------|------|------| | materialWireDiameterGasSelect | int | 材料/丝径/气体选择 | ```json { "welder": [ { "controlMode": 0, "monufactor": "麦格米特", "weldingMode": 0, "commMode": "CAN", "slaveIP": "192.168.1.14", "slaveid": 1, "port": 2, "baudRate": 38400, "identifiedWelder": "麦格米特1", "CANPort": 1, "CANPortSum": 0, "welderNumber": 1, "monufactorList": ["纳博特","麦格米特","深威智能","奥太","美佳尼克","瑞凌","肯倍IF15","EWM","福尼斯","和宗"], "weldingvoltageCurve": [0], "RILAND": { "materialWireDiameterGasSelect": 1 } } ] } ``` ### 9.2 上位机查询焊机选择 **命令字:** `0x8371` ### 9.3 控制器回复焊机选择 **命令字:** `0x8372` 返回参数同"上位机设置焊机",参见上方表格及示例。 ### 9.4 焊机通讯状态查询 **命令字:** `0x8373` ### 9.5 控制器返回焊机通讯状态 **命令字:** `0x8374` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | welder[].status | int | 焊机通讯状态 | 0:未通讯,1:已通讯 | ```json { "welder": [ { "status": 0 } ] } ``` ### 9.6 上位机查询焊接参数、摆焊参数中的注释 **命令字:** `0x8380` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | finishinit | bool | 控制器初始化完成标志 | true:完成,false:未完成 | | robot | int | 当前机器人 | [1,4] | ```json { "finishinit": true, "robot": 1 } ``` ### 9.7 控制器返回查询结果 **命令字:** `0x8381` | 参数名 | 类型 | 说明 | |--------|------|------| | weldNotes | string[] | 焊接参数注释 | | weavParameterNotes | string[] | 摆焊参数注释 | | robot | int | 当前机器人 | ```json { "robot": 1, "weldNotes": ["112", "223", "", ""], "weavParameterNotes": ["112", "223", "", ""] } ``` --- ## 10. 多层多道焊 ### 10.1 多层多道焊接参数设置 **命令字:** `0x8390` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | | sum | int | 焊道总数 | [1,999] | #### multipass(多层多道参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | note | string | 注释 | - | | weld_bead_num | int | 焊道数 | [1,99] | ```json { "multipass": [ { "note": "", "weld_bead_num": 6 } ], "num": 1, "robot": 1, "sum": 100 } ``` ### 10.2 上位机查询多层多道焊道参数 **命令字:** `0x8391` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 10.3 控制器回复多层多道焊道参数 **命令字:** `0x8392` 返回参数同"多层多道焊接参数设置",参见上方表格及示例。 ### 10.4 上位机设置多层多道焊道配置 **命令字:** `0x8393` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | #### weld_bead(焊道配置) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | head_indent | double | 头部缩进 | [-1000,1000]mm | | head_multi_indent | bool | 头部倍数缩进使能 | - | | left_right_offset | double | 左右偏移 | [-1000,1000]mm | | push_angle | double | 推角 | [-180,180] | | tail_indent | double | 尾部缩进 | [-1000,1000]mm | | tail_multi_indent | bool | 尾部倍数缩进使能 | - | | tilt_angle | double | 倾斜角 | [-180,180] | | up_down_offset | double | 高低偏移 | [-1000,1000]mm | | weld_dir | int | 焊接方向 | 0:+1,1:-1 | ```json { "num": 1, "robot": 1, "weld_bead": [ { "head_indent": 0.0, "head_multi_indent": false, "left_right_offset": 0.0, "push_angle": 0.0, "tail_indent": 0.0, "tail_multi_indent": false, "tilt_angle": 0.0, "up_down_offset": 0.0, "weld_dir": 0 } ] } ``` ### 10.5 上位机查询多层多道焊道配置 **命令字:** `0x8394` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 10.6 控制器回复多层多道焊道配置 **命令字:** `0x8395` 返回参数同"上位机设置多层多道焊道配置",参见上方表格及示例。 ### 10.7 多层多焊道参数清空 **命令字:** `0x8396` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num | int | 工艺号 | [1,999] | | robot | int | 当前机器人 | [1,4] | ```json { "num": 1, "robot": 1 } ``` ### 10.8 多层多焊道参数复制 **命令字:** `0x8397` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | num_source | int | 复制的工艺号 | - | | num_target | int | 复制到的工艺号 | - | | robot | int | 当前机器人 | [1,4] | ```json { "num_source": 1, "num_target": 2, "robot": 1 } ``` ### 10.9 多层多焊道参数增加 **命令字:** `0x8398` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 当前机器人 | [1,4] | ```json { "robot": 1 } ``` --- ## 11. 焊缝数据库 ### 11.1 储存数据到焊缝数据库 **命令字:** `0x83A0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | weld_type | string | 焊缝类型 | - | | fillet_weld_leg_1 | double | 左焊脚高 | - | | fillet_weld_leg_2 | double | 右焊脚高 | - | | fillet_weld_leg_angle | double | 两条焊脚夹角 | [-180,180] | | weld_parameter_mode | string | 焊机工作模式 | "一元化"或"分别" | | welding_current | double | 焊接电流 | - | | welding_voltage | double | 焊接电压 | - | | welding_speed | double | 焊接速度 | - | | weld_bead_layer | int | 焊道总层数 | [1,99] | | weld_bead_number | int | 焊道总道数 | [1,99] | #### weld_bead(焊道参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | left_right_offset | double | 第 i 道焊缝左右偏移 | [-1000,1000] | | up_down_offset | double | 第 i 道焊缝高低偏移 | [-1000,1000] | ```json { "robot": 1, "weld_type": "V缝", "fillet_weld_leg_1": 10, "fillet_weld_leg_2": 10, "fillet_weld_leg_angle": 90, "weld_parameter_mode": "一元化", "welding_current": 160, "welding_voltage": 23, "welding_speed": 6, "weld_bead_layer": 4, "weld_bead_number": 10, "weld_bead": [ { "left_right_offset": 0.0, "up_down_offset": 0.0 } ] } ``` ### 11.2 匹配焊缝数据库中的数据 **命令字:** `0x83A1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | weld_type | string | 焊缝类型 | - | | fillet_weld_leg_1 | double | 左焊脚高 | - | | fillet_weld_leg_2 | double | 右焊脚高 | - | | fillet_weld_leg_angle | double | 两条焊脚夹角 | [-180,180] | | weld_parameter_mode | string | 焊机工作模式 | "一元化"或"分别" | | welding_current | double | 焊接电流 | - | | welding_voltage | double | 焊接电压 | - | | welding_speed | double | 焊接速度 | - | ```json { "robot": 1, "weld_type": "V缝", "fillet_weld_leg_1": 10, "fillet_weld_leg_2": 10, "fillet_weld_leg_angle": 90, "weld_parameter_mode": "一元化", "welding_current": 160, "welding_voltage": 23, "welding_speed": 6 } ``` ### 11.3 控制器回复数据库匹配结果 **命令字:** `0x83A2` 说明:回复数据库中匹配项的焊道总层数、总道数及每一层焊道数。 | 参数名 | 类型 | 说明 | |--------|------|------| | weld_database | array | 匹配数据库 | | total_layer | int | 第 i 项匹配项存在的焊道总层数 | | total_bead | int | 第 i 项匹配项存在的焊道总道数 | | layer | array | 焊道层信息 | | number | int | 第 i 项匹配项存在的第 k 层焊道数 | ```json { "weld_database": [ { "total_layer": 4, "total_bead": 10, "layer": [ { "number": 1 } ] } ] } ``` --- ## 12. 相贯线 ### 12.1 坐标标定设置 **命令字:** `0x83B0` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.2 上位机查询坐标标定 **命令字:** `0x83B1` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | pointNum | int | 标定点(共需要6个标定点) | [0,5] | ```json { "workPieceNum": 1, "pointNum": 0 } ``` ### 12.3 控制器回复坐标标定 **命令字:** `0x83B2` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | pointNum | int | 标定点(共需要6个标定点) | [0,5] | | pos | double[] | 该标定点的坐标(X,Y,Z,A,B,C) | - | ```json { "workPieceNum": 1, "pointNum": 0, "pos": [0, 0, 0, 0, 0, 0] } ``` ### 12.4 回复相贯线设置计算结果 **命令字:** `0x83B3` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | result | bool | 是否有计算结果 | true:有,false:没有 | | workPieceNum | int | 工艺号 | [1,3] | #### cylinderIntersectLineParam(相贯线参数) | 参数名 | 类型 | 说明 | |--------|------|------| | R | double | 下圆柱半径 | | r | double | 上圆柱半径 | | e | double | 中心轴距 | | alpha | double | 中心轴夹角 | #### WorkPieceCoord | 参数名 | 类型 | 说明 | |--------|------|------| | - | double[] | X,Y,Z,A,B,C 值 | ```json { "result": true, "workPieceNum": 1, "cylinderIntersectLineParam": { "R": 0, "r": 0, "e": 0, "alpha": 0 }, "WorkPieceCoord": [0, 0, 0, 0, 0, 0] } ``` ### 12.5 相贯线工件参数设置 **命令字:** `0x83B4` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | #### cylinderIntersectLineParam(相贯线参数) | 参数名 | 类型 | 说明 | |--------|------|------| | R | double | 下圆柱半径 | | r | double | 上圆柱半径 | | e | double | 中心轴距 | | alpha | double | 中心轴夹角 | #### WorkPieceCoord | 参数名 | 类型 | 说明 | |--------|------|------| | - | double[] | X,Y,Z,A,B,C 值 | ```json { "workPieceNum": 1, "cylinderIntersectLineParam": { "R": 0, "r": 0, "e": 0, "alpha": 0 }, "WorkPieceCoord": [0, 0, 0, 0, 0, 0] } ``` ### 12.6 上位机查询相贯线工件参数 **命令字:** `0x83B5` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.7 控制器回复相贯线工件参数 **命令字:** `0x83B6` 返回参数同"相贯线工件参数设置",参见上方表格及示例。 ### 12.8 相贯线焊枪参数设置 **命令字:** `0x83B7` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | #### WeldingGunParam(焊枪参数) | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | alpha | double | - | [-60,60] | | beta | double | - | [-60,60] | | gama | double | - | [-180,180] | | pos_hf_hq | double[] | 第三个量必须大于0 | - | | startAngle | double | - | [-180,180] | | totalAngle | double | - | [0,360] | ```json { "workPieceNum": 1, "WeldingGunParam": { "alpha": 0, "beta": 0, "gama": 0, "pos_hf_hq": [0, 0, 10] }, "startAngle": 0, "totalAngle": 360 } ``` ### 12.9 上位机查询相贯线焊枪参数 **命令字:** `0x83B8` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.10 控制器回复相贯线焊枪参数 **命令字:** `0x83B9` 返回参数同"相贯线焊枪参数设置",参见上方表格及示例。 ### 12.11 上位机设置有无变位机 **命令字:** `0x83BA` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | withSyncPosFlag | int | 是否有无变位机 | 0:无变位机,1:有变位机 | ```json { "workPieceNum": 1, "withSyncPosFlag": 1 } ``` ### 12.12 上位机查询有无变位机 **命令字:** `0x83BB` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | ```json { "workPieceNum": 1 } ``` ### 12.13 控制器回复有无变位机 **命令字:** `0x83BC` | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | workPieceNum | int | 工艺号 | [1,3] | | withSyncPosFlag | int | 是否有无变位机 | 0:无变位机,1:有变位机 | ```json { "workPieceNum": 1, "withSyncPosFlag": 1 } ``` --- # 传送带 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/03.%E4%BC%A0%E9%80%81%E5%B8%A6.html ## 0x8200 上位机发送,轨道传送位置设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | position | object | 位置参数对象 | - | | robot | int | 机器人号 | [1,4] | ### position 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | receLatestPos | double | 最迟接收 X 值 | | trackRangeXMax | double | 跟踪最大范围 | | trackStartXPoint | double | 跟踪开始 X 点 | ### 请求示例 ```json { "conveyorID": 1, "position": { "receLatestPos": 0.0, "trackRangeXMax": 0.0, "trackStartXPoint": 0.0 }, "robot": 1 } ``` --- ## 0x8201 上位机发送,轨道传送位置查询 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8202 控制器回复,轨道传送位置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | position | object | 位置参数对象 | - | | robot | int | 机器人号 | [1,4] | ### position 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | calibrationFlag | array | 标定标志,前三个分别表示"最迟接收坐标"、"跟踪最大范围坐标"、"跟踪开始坐标"是否被标定 | | posToMove | array | 前三个数组分别是最迟接收坐标、跟踪最大范围坐标、跟踪开始坐标 | | receLatestPos | double | 最迟接收 X 值 | | trackRangeXMax | double | 跟踪最大范围 | | trackStartXPoint | double | 跟踪开始 X 点 | ### 响应示例 ```json { "conveyorID": 1, "position": { "calibrationFlag": [0, 0, 0, 0, 0, 0, 0], "posToMove": [ [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] ], "receLatestPos": 0.0, "trackRangeXMax": 0.0, "trackStartXPoint": 0.0 }, "robot": 1 } ``` --- ## 0x8210 上位机发送,传送带传送参数设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyor | object | 传送带参数对象 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | track | object | 轨道参数对象 | - | ### conveyor 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | encoderDirection | int | 编码器方向:1正向,-1负向 | - | | encoderResolution | double | 分辨率(线/mm) | [0,10000] | | encoderValue | string | 编码器值 | - | | encoder_num | int | 编码器编号 | - | | encoder_sum | int | 编码器总数 | - | | maxEncoderVal | string | 编码器最大值 | - | | minEncoderVal | string | 编码器最小值 | - | | posRecordMode | int | 位置模式:0编码器,1恒速设置 | [0,1] | | speed | double | 编码器速度(mm/s) | - | ### track 子参数 | 参数名 | 类型 | 描述 | 单位 | |--------|------|------|------| | arch_height | int | 门型高度 | mm | | arch_straight_len | int | 门型直线距离 | mm | ### 请求示例 ```json { "conveyor": { "encoderDirection": 1, "encoderResolution": 44.33, "encoderValue": "0", "encoder_num": 1, "encoder_sum": 0, "maxEncoderVal": "2147483647", "minEncoderVal": "-2147483648", "posRecordMode": 0, "speed": 0.0 }, "conveyorID": 1, "robot": 1, "track": { "arch_height": 30, "arch_straight_len": 10 } } ``` --- ## 0x8211 上位机发送,查询传送带传送参数 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8212 控制器返回,传送带传送参数 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyor | object | 传送带参数对象 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | track | object | 轨道参数对象 | - | ### conveyor 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | encoderDirection | int | 编码器方向:1正向,-1负向 | - | | encoderResolution | double | 分辨率(线/mm) | [0,10000] | | encoderValue | string | 编码器值 | - | | encoder_num | int | 编码器编号 | - | | encoder_sum | int | 编码器总数 | - | | maxEncoderVal | string | 编码器最大值 | - | | minEncoderVal | string | 编码器最小值 | - | | posRecordMode | int | 位置模式:0编码器,1恒速设置 | [0,1] | | speed | double | 编码器速度(mm/s) | - | ### track 子参数 | 参数名 | 类型 | 描述 | 单位 | |--------|------|------|------| | arch_height | int | 门型高度 | mm | | arch_straight_len | int | 门型直线距离 | mm | ### 响应示例 ```json { "conveyor": { "encoderDirection": 1, "encoderResolution": 44.33, "encoderValue": "0", "encoder_num": 1, "encoder_sum": 0, "maxEncoderVal": "2147483647", "minEncoderVal": "-2147483648", "posRecordMode": 0, "speed": 0.0 }, "conveyorID": 1, "robot": 1, "track": { "arch_height": 30, "arch_straight_len": 10 } } ``` --- ## 0x8213 传送带传送位置检查参数设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | detectSrc | object | 检测源参数对象 | - | | robot | int | 机器人号 | [1,4] | ### detectSrc 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | DI_capturePos | int | 绑定触发信号 IO | 与当前 IO 数量有关 | | filter_data_missing_triggered_latch_data_ | bool | 是否过滤未触发锁存的信号 | - | | sensorTrg | int | 传感器触发方式:0下降沿触发,1上升沿触发 | [0,1] | | type | int | 检测和识别类型:0传感器,1视觉,2传感器+视觉,3全局变量+modbus,4全局变量+视觉 | [0,4] | | visionID | int | 视觉工艺号 | [1,9] | | vision_io_filter_type | int | 视觉过滤类型:0信号触发过滤,1信号触发过滤,2无过滤 | [0,2] | | vision_latch_encoder_value_type | int | 视觉锁存编码器值类型:0视觉触发锁存,1收到数据锁存 | [0,1] | ### 请求示例 ```json { "conveyorID": 1, "detectSrc": { "DI_capturePos": 0, "filter_data_missing_triggered_latch_data_": true, "sensorTrg": 0, "sensor_safe_trigger_interval": 1.0, "type": 2, "visionID": 1, "vision_io_filter_type": 0, "vision_latch_encoder_value_type": 1 }, "robot": 1 } ``` --- ## 0x8214 上位机发送,传送带传送位置检查参数查询 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8215 控制器回复,传送带传送位置检查参数接收 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | detectSrc | object | 检测源参数对象 | - | | robot | int | 机器人号 | [1,4] | ### detectSrc 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | DI_capturePos | int | 绑定触发信号 IO | 与当前 IO 数量有关 | | filter_data_missing_triggered_latch_data_ | bool | 是否过滤未触发锁存的信号 | - | | sensorTrg | int | 传感器触发方式:0下降沿触发,1上升沿触发 | [0,1] | | type | int | 检测和识别类型:0传感器,1视觉,2传感器+视觉,3全局变量+modbus,4全局变量+视觉 | [0,4] | | visionID | int | 视觉工艺号 | [1,9] | | vision_io_filter_type | int | 视觉过滤类型:0信号触发过滤,1信号触发过滤,2无过滤 | [0,2] | | vision_latch_encoder_value_type | int | 视觉锁存编码器值类型:0视觉触发锁存,1收到数据锁存 | [0,1] | ### 响应示例 ```json { "conveyorID": 1, "detectSrc": { "DI_capturePos": 0, "filter_data_missing_triggered_latch_data_": true, "sensorTrg": 0, "sensor_safe_trigger_interval": 1.0, "type": 2, "visionID": 1, "vision_io_filter_type": 0, "vision_latch_encoder_value_type": 1 }, "robot": 1 } ``` --- ## 0x8218 上位机发送,传送带用户坐标设置 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | sensorPos | object | 传感器位置 | - | | userCoord | int | 用户坐标系号 | [1,999] | | userFrame | array | 用户坐标系 | double 类型数组 | ### sensorPos 子参数 | 参数名 | 类型 | |--------|------| | X | double | | Y | double | | Z | double | | A | double | | B | double | | C | double | ### 请求示例 ```json { "conveyorID": 1, "robot": 1, "sensorPos": { "A": 0.0, "B": 0.0, "C": 0.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }, "userCoord": 1, "userFrame": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 0x8219 上位机发送,传送带用户坐标查询 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,9] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x821A 控制器回复,传送带用户坐标接收 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | conveyorID | int | 传送带工艺号 | [1,9] | | robot | int | 机器人号 | [1,4] | | sensorPos | object | 传感器位置(弧度) | - | | sensorPosDeg | object | 传感器位置(角度) | - | | userCoord | int | 用户坐标系号 | [1,999] | | userFrame | array | 用户坐标系(弧度) | double 类型数组 | | userFrameDeg | array | 用户坐标系(角度) | double 类型数组 | ### sensorPos / sensorPosDeg 子参数 | 参数名 | 类型 | |--------|------| | X | double | | Y | double | | Z | double | | A | double | | B | double | | C | double | ### 响应示例 ```json { "conveyorID": 1, "robot": 1, "sensorPos": { "A": 0.0, "B": 0.0, "C": 0.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }, "sensorPosDeg": { "A": 0.0, "B": 0.0, "C": 0.0, "X": 0.0, "Y": 0.0, "Z": 0.0 }, "userCoord": 1, "userFrame": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "userFrameDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 0x821B 设置传送带过滤参数 > 命令字:0x821B ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | threshold_pos | array | 对应 xyzabc 的阈值 | - | | angle_filter_enable | bool | 视觉过滤的角度过滤使能 | - | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "threshold_pos": [10, 10, 10, 10, 10, 10], "angle_filter_enable": true } ``` --- ## 0x821C 查询传送带过滤参数 > 命令字:0x821C ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x821D 回复传送带过滤参数 > 命令字:0x821D ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | vision_filter_shreshold | object | 过滤阈值参数对象 | - | ### vision_filter_shreshold 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | angle_filter_enable | bool | 视觉过滤的角度过滤使能 | | threshold_pos | array | xyz 的过滤阈值(double 类型数组) | ### 响应示例 ```json { "robot": 1, "conveyorID": 1, "vision_filter_shreshold": { "angle_filter_enable": false, "threshold_pos": [10, 5, 5, 0.1, 0.1, 0.1] } } ``` --- ## 0x8226 传送带传感器标定 > 命令字:0x8226 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | posNum | int | 标定步骤的第几点 | [1,4] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "posNum": 1 } ``` --- ## 0x8227 取消传送带传感器标定 > 命令字:0x8227 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8229 查询传送带数据源和识别类型 > 命令字:0x8229 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8230 回复传送带数据源和识别类型 > 命令字:0x8230 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | detectSrc | object | 检测源参数对象 | - | | identification | object | 识别参数对象 | - | ### detectSrc 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | type | int | 数据源类型:0视觉,1IO,2全局变量 | [0,2] | ### identification 子参数 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | type | int | 识别类型:0视觉,1传感器 | [0,1] | ### 响应示例 ```json { "robot": 1, "conveyorID": 1, "detectSrc": { "type": 0 }, "identification": { "type": 0 } } ``` --- ## 0x8231 传感器传送带标定计算结果 > 命令字:0x8231 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8232 传送带视觉标定 > 命令字:0x8232 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "step": 1 } ``` --- ## 0x8233 查询传送带视觉标定数据 > 命令字:0x8233 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "step": 1 } ``` --- ## 0x8234 清除传送带标定数据 > 命令字:0x8234 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1, "step": 1 } ``` --- ## 0x8235 回复传送带标定数据 > 命令字:0x8235 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | | step | int | 对应视觉标定的六步 | [1,6] | | U1 | double | 第一步像素坐标的 X 坐标 | | | V1 | double | 第一步像素坐标的 Y 坐标 | | | encodorValue | string | 第一步的编码器值 | | | X2 | double | 第二步的 X 坐标 | | | Y2 | double | 第二步的 Y 坐标 | | | Z2 | double | 第二步的 Z 坐标 | | | X3 | double | 第三步的 X 坐标 | | | Y3 | double | 第三步的 Y 坐标 | | | Z3 | double | 第三步的 Z 坐标 | | | encoder_resolution | double | 第三步的编码器分辨率 | | | U4 | double | 第四步的像素坐标的 X 坐标 | | | V4 | double | 第四步的像素坐标的 Y 坐标 | | | X5 | double | 第五步的 X 坐标 | | | Y5 | double | 第五步的 Y 坐标 | | | Z5 | double | 第五步的 Z 坐标 | | | X6 | double | 第六步的 X 坐标 | | | Y6 | double | 第六步的 Y 坐标 | | | Z6 | double | 第六步的 Z 坐标 | | ### 各步骤请求示例 **第一步:** ```json { "robot": 1, "conveyorID": 1, "step": 1, "U1": 0, "V1": 0, "encodorValue": "0" } ``` **第二步:** ```json { "robot": 1, "conveyorID": 1, "step": 2, "X2": 0, "Y2": 0, "Z2": 0, "encodorValue": "0" } ``` **第三步:** ```json { "robot": 1, "conveyorID": 1, "step": 3, "X3": 0, "Y3": 0, "Z3": 0, "encodorValue": "0", "encoder_resolution": 0.0 } ``` **第四步:** ```json { "robot": 1, "conveyorID": 1, "step": 4, "U4": 0, "V4": 0, "encodorValue": "0" } ``` **第五步:** ```json { "robot": 1, "conveyorID": 1, "step": 5, "X5": 0, "Y5": 0, "Z5": 0, "encodorValue": "0" } ``` **第六步:** ```json { "robot": 1, "conveyorID": 1, "step": 6, "X6": 0, "Y6": 0, "Z6": 0 } ``` --- ## 0x8236 视觉传送带标定计算结果 > 命令字:0x8236 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8237 设置传送带进阶参数 > 命令字:0x8237 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | compensation | object | 补偿参数对象 | - | | compensation_acc_multiple | double | 偏差开始段加速度倍数 | - | | compensation_max_len | double | 单次补偿最大距离 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | exception | object | 异常参数对象 | - | | is_start_smoothly | bool | 平滑跟踪是否启动 | - | | obj_distribute_proportion | int | 多机:下一台机对象分配比例 | - | | robot | int | 机器人号 | [1,4] | | start_acc_multiple | double | 同步开始段加速度倍数 | - | | stop_acc_multiple | double | 同步结束段加速度倍数 | - | | sync_param | object | 同步 PID 参数对象 | - | ### compensation 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | distance | double | 编码器补偿距离 | | encoderVal | string | 编码器补偿编码器值 | | time | double | 编码器补偿时间 | ### exception 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | multiple_of_axis_max_vel | double | 警告并放弃同步的速度阈值倍数 | ### sync_param 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | kd | double | 同步 PID 比例系数 | | ki | double | 同步 PID 积分系数 | | kp | double | 同步 PID 微分系数 | | limit_acc_multiple | double | 同步 PID 限输出加速度倍率 | | max_out | double | 同步 PID 限幅 | ### 请求示例 ```json { "compensation": { "distance": 0.0, "encoderVal": "0", "time": 10.0 }, "compensation_acc_multiple": 20.0, "compensation_max_len": 8.0, "conveyorID": 1, "exception": { "multiple_of_axis_max_vel": 0.950 }, "is_start_smoothly": false, "obj_distribute_proportion": 100, "robot": 1, "start_acc_multiple": 20.0, "stop_acc_multiple": 20.0, "sync_param": { "kd": 0.050, "ki": 0.050, "kp": 0.40, "limit_acc_multiple": 0.40, "max_out": 0.60 } } ``` --- ## 0x8238 查询传送带进阶参数 > 命令字:0x8238 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x8239 回复传送带进阶参数 > 命令字:0x8239 ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | compensation | object | 补偿参数对象 | - | | compensation_acc_multiple | double | 偏差开始段加速度倍数 | - | | compensation_max_len | double | 单次补偿最大距离 | - | | conveyorID | int | 传送带工艺号 | [1,9] | | exception | object | 异常参数对象 | - | | is_start_smoothly | bool | 平滑跟踪是否启动 | - | | obj_distribute_proportion | int | 多机:下一台机对象分配比例 | - | | robot | int | 机器人号 | [1,4] | | start_acc_multiple | double | 同步开始段加速度倍数 | - | | stop_acc_multiple | double | 同步结束段加速度倍数 | - | | sync_param | object | 同步 PID 参数对象 | - | ### compensation 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | distance | double | 编码器补偿距离 | | encoderVal | string | 编码器补偿编码器值 | | time | double | 编码器补偿时间 | ### exception 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | multiple_of_axis_max_vel | double | 警告并放弃同步的速度阈值倍数 | ### sync_param 子参数 | 参数名 | 类型 | 描述 | |--------|------|------| | kd | double | 同步 PID 比例系数 | | ki | double | 同步 PID 积分系数 | | kp | double | 同步 PID 微分系数 | | limit_acc_multiple | double | 同步 PID 限输出加速度倍率 | | max_out | double | 同步 PID 限幅 | ### 响应示例 ```json { "compensation": { "distance": 0.0, "encoderVal": "0", "time": 10.0 }, "compensation_acc_multiple": 20.0, "compensation_max_len": 8.0, "conveyorID": 1, "exception": { "multiple_of_axis_max_vel": 0.950 }, "is_start_smoothly": false, "obj_distribute_proportion": 100, "robot": 1, "start_acc_multiple": 20.0, "stop_acc_multiple": 20.0, "sync_param": { "kd": 0.050, "ki": 0.050, "kp": 0.40, "limit_acc_multiple": 0.40, "max_out": 0.60 } } ``` --- ## 0x823A 多机通讯测试 > 命令字:0x823A ### 参数说明 | 参数名 | 类型 | 描述 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人号 | [1,4] | | conveyorID | int | 传送带工艺号 | [1,99] | ### 请求示例 ```json { "robot": 1, "conveyorID": 1 } ``` --- ## 0x823B 多机通讯测试数据回复 > 命令字:0x823B ### 参数说明 | 参数名 | 类型 | 描述 | |--------|------|------| | recvTargetData | string | 和相机设置的数据格式一致 | ### 响应示例 ```json { "recvTargetData": "xxx,xxx,xxx" } ``` > **注意:** 0x821E、0x821F 已删除(这两个命令字不再使用)。 --- ## 传送带同步原理 ### 同步跟踪基本流程 传送带同步跟踪系统通过编码器实时获取传送带位置,动态调整机器人轨迹,使机器人与移动中的工件保持同步。 #### 同步阶段 1. **检测与识别阶段**:传感器或视觉检测到工件,记录当前编码器值 2. **跟踪等待阶段**:工件进入跟踪范围内,机器人准备抓取 3. **同步运动阶段**:机器人与传送带同步运动,末端执行器与工件保持相对静止 4. **抓取/操作阶段**:在同步过程中完成抓取、放置等操作 5. **返回阶段**:操作完成后机器人返回初始位置 ### 同步位置关系 传送带跟踪中的关键位置参数: | 参数 | 说明 | 单位 | |------|------|------| | trackStartXPoint | 跟踪开始 X 点(工件进入跟踪范围的位置) | mm | | trackRangeXMax | 跟踪最大范围 X 值(工件超出此范围则放弃) | mm | | receLatestPos | 最迟接收 X 值(工件最晚被接收的位置) | mm | #### 跟踪窗口示意 在跟踪开始点和跟踪最大范围之间,机器人与传送带同步运动。超过跟踪最大范围或未在最迟接收位置前收到数据,则放弃该工件。 ### PID同步控制参数 同步过程中使用 PID 控制器实现平稳的传送带跟踪: | 参数 | 说明 | 典型值 | 调节 | |------|------|--------|------| | kp | 同步 PID 比例系数 | 0.2~0.8 | 增大可加快同步响应 | | ki | 同步 PID 积分系数 | 0.01~0.1 | 消除同步稳态误差 | | kd | 同步 PID 微分系数 | 0.01~0.1 | 减小同步超调 | | max_out | 同步 PID 限幅 | 0.3~1.0 | 限制最大同步速度 | | limit_acc_multiple | 同步 PID 限输出加速度倍率 | 0.2~0.8 | 防止加速度过大 | --- ## 位置补偿 ### 编码器位置补偿 编码器位置补偿用于修正由于编码器误差或机械传动导致的传送带位置偏差。 #### 补偿参数 | 参数 | 说明 | 单位 | |------|------|------| | compensation.distance | 编码器补偿距离 | mm | | compensation.encoderVal | 编码器补偿编码器值 | 脉冲数 | | compensation.time | 编码器补偿时间 | s | | compensation_acc_multiple | 偏差开始段加速度倍数 | - | | compensation_max_len | 单次补偿最大距离 | mm | #### 补偿公式 实际传送带位置 = 编码器原始值 / 编码器分辨率 + 补偿偏移量 其中补偿偏移量 = compensation.distance * (经过时间 / compensation.time) ### 同步开始/结束段加速度控制 | 参数 | 说明 | 典型值 | |------|------|--------| | start_acc_multiple | 同步开始段加速度倍数 | 10~50 | | stop_acc_multiple | 同步结束段加速度倍数 | 10~50 | | is_start_smoothly | 平滑跟踪是否启动 | true/false | 当 is_start_smoothly=true 时,机器人进入和退出同步的运动更加平滑,减少机械冲击。 ### 异常处理 | 参数 | 说明 | 典型值 | |------|------|------| | exception.multiple_of_axis_max_vel | 警告并放弃同步的速度阈值倍数 | 0.8~0.95 | 当同步所需速度超过 轴最大速度 * multiple_of_axis_max_vel 时,系统发出警告并放弃对该工件的同步跟踪。 ### 多机协同对象分配 | 参数 | 说明 | |------|------| | obj_distribute_proportion | 多机场景下分配给下一台机器人的对象比例(百分比) | 当多台机器人共享一条传送带时,通过此参数控制工件分配的负载均衡。 ### 视觉过滤参数 用于传送带跟踪中视觉数据的过滤: | 参数 | 说明 | |------|------| | threshold_pos | xyzabc 各轴的过滤阈值 | | angle_filter_enable | 角度过滤使能 | 当视觉返回的位置数据与上一次数据在各轴上的偏差超过阈值时,该数据被过滤丢弃。 ### 位置补偿调试 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 抓取位置偏前 | 编码器补偿过大 | 减小 compensation.distance | | 抓取位置偏后 | 编码器补偿不足或延迟 | 增大 compensation.distance 或 compensation.time | | 同步过程中抖动 | PID参数不当 | 降低 kp,增大 kd | | 同步启动冲击大 | start_acc_multiple 过大 | 降低加速度倍数或启用平滑跟踪 | | 频繁放弃工件 | 传送带速度太快 | 降低传送带速度或增大 trackRangeXMax | --- # 寻位跟踪 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/04.%E5%AF%BB%E4%BD%8D%E8%B7%9F%E8%B8%AA.html ## 跟踪 ### 跟踪传感器类型 #### 设置跟踪传感器类型 - **命令字:** `0x8740` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | fileNum | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | sensorType | int | [0,2] | 跟踪类型:0-线激光,1-电弧,2-弧压 | **请求示例:** ```json { "fileNum": 1, "robot": 1, "sensorType": 0 } ``` #### 查询跟踪传感器类型 - **命令字:** `0x8741` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | fileNum | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "fileNum": 1, "robot": 1 } ``` #### 返回跟踪传感器类型 - **命令字:** `0x8742` - **方向:** 上位机接收 - **data:** 同0x8740 --- ### 电弧通讯参数 #### 设置电弧通讯参数 - **命令字:** `0x874d` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | dataType | int | [0,1] | 采样数据类型:0-电流,1-电压 | | period | int | [0,1000]ms | 采样周期 | | std_low_weight_threshold | double | [3,20] | 噪声阈值,噪声超限后偏差权重降低 | **请求示例:** ```json { "craftid": 1, "robot": 1, "sampling": { "dataType": 0, "period": 20, "std_low_weight_threshold": 3.0 } } ``` #### 查询电弧通讯参数 - **命令字:** `0x874e` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧通讯参数 - **命令字:** `0x874f` - **方向:** 上位机接收 - **data:** 同0x874d --- ### 电弧补偿参数 #### 设置电弧跟踪左右补偿参数 - **命令字:** `0x8750` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | accFactor | double | [0.1,10] | 补偿加速度倍数,对应当前运动指令加速度 | | algorithmType | int | [0,1] | 偏差提取类型:0-均值,1-手填值 | | beginCycleNum | int | [1,100] | 开始采样周期数 | | differential | double | [0,1] | 微分系数 | | integral | double | [0,1] | 积分系数 | | maxSingleLen | double | [0,10] | 每次最大补偿量 | | scale | double | [0,1] | 比例系数 | | switchon | bool | true/false | 补偿开关:true-打开,false-关闭 | | deviation_dead_band | double | [0,20] | 偏差死区,死区内偏差不纠偏 | | filter_level | int | [1,9] | 偏差滤波等级 | **请求示例:** ```json { "craftid": 1, "lateralCompensation": { "accFactor": 1.0, "algorithmType": 0, "beginCycleNum": 4, "differential": 0.0, "integral": 0.00050, "maxSingleLen": 2.0, "scale": 0.050, "switchon": true, "deviation_dead_band": 0.0, "filter_level": 1 }, "robot": 1 } ``` #### 查询电弧跟踪左右补偿参数 - **命令字:** `0x8751` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧跟踪左右补偿参数 - **命令字:** `0x8752` - **方向:** 上位机接收(控制器返回) - **data:** 同0x8750 #### 设置电弧跟踪高低补偿参数 - **命令字:** `0x8753` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | accFactor | double | [0.1,10] | 补偿加速度倍数,对应当前运动指令加速度 | | algorithmType | int | [0,1] | 偏差提取类型:0-均值,1-手填值 | | beginCycleNum | int | [1,100] | 开始采样周期数 | | custom_value | double | [0,1000]A | 偏差提取类型手填值 | | differential | double | [0,1] | 微分系数 | | integral | double | [0,1] | 积分系数 | | maxSingleLen | double | [0,10] | 每次最大补偿量 | | scale | double | [0,1] | 比例系数 | | switchon | bool | true/false | 补偿开关:true-打开,false-关闭 | | deviation_dead_band | double | [0,20] | 偏差死区,死区内偏差不纠偏 | | filter_level | int | [1,9] | 偏差滤波等级 | | base_ema_alpha | double | [0,0.5] | 基准计算滤波系数,指数移动平均系数;基准选择自动时可修改,手填时置灰 | **请求示例:** ```json { "craftid": 1, "robot": 1, "verticalCompensation": { "accFactor": 1.0, "algorithmType": 0, "beginCycleNum": 4, "custom_value": 0.0, "differential": 0.0, "integral": 0.00050, "maxSingleLen": 0.50, "scale": 0.050, "switchon": true, "deviation_dead_band": 0.0, "filter_level": 1, "base_ema_alpha": 0.0 } } ``` #### 查询电弧跟踪高低补偿参数 - **命令字:** `0x8754` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧跟踪高低补偿参数 - **命令字:** `0x8755` - **方向:** 控制器发送 - **data:** 同0x8753 #### 设置电弧跟踪路径数据记录 - **命令字:** `0x8756` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | | cycle | double | [1,1000000000]mm | 跟踪路径数据记录周期 | | type | int | [0,1] | 跟踪路径数据记录方式:0-距离,1-时间 | **请求示例:** ```json { "craftid": 1, "robot": 1, "track_path_record": { "cycle": 30.0, "type": 0 } } ``` #### 查询电弧跟踪路径数据记录 - **命令字:** `0x8757` - **方向:** 上位机发送 | 参数名 | 类型 | 取值范围 | 描述 | |--------|------|----------|------| | craftid | int | [1,99] | 跟踪文件号 | | robot | int | [1,4] | 机器人号 | **请求示例:** ```json { "craftid": 1, "robot": 1 } ``` #### 返回电弧跟踪路径数据记录 - **命令字:** `0x8758` - **方向:** 控制器发送 - **data:** 同0x8756 --- ## 寻位算法参数 寻位跟踪系统通过传感器实时采集焊缝位置偏差,结合 PID 控制算法对机器人轨迹进行动态补偿,确保焊枪始终对准焊缝中心。 ### 寻位偏差计算原理 系统通过采样传感器数据(电流/电压/激光轮廓)提取焊缝左右偏差和高低偏差: 1. **数据采集**:按采样周期采集传感器原始数据 2. **偏差提取**:根据算法类型(均值/手填值)计算当前周期的偏差值 3. **PID 补偿**:使用比例(P)、积分(I)、微分(D)控制算法计算补偿量 4. **运动叠加**:将补偿量叠加到当前运动指令上 ### PID 补偿算法参数详解 | 参数 | 说明 | 推荐范围 | 调节建议 | |------|------|----------|----------| | scale(比例系数 Kp) | 控制补偿响应速度 | 0.01~0.5 | 增大可加快响应但可能引起振荡 | | integral(积分系数 Ki) | 消除稳态误差 | 0.0001~0.01 | 增大可消除静差但可能引起超调 | | differential(微分系数 Kd) | 抑制振荡,预测趋势 | 0.0~0.5 | 增大可抑制振荡但可能引入噪声 | | maxSingleLen | 每次补偿量上限(mm) | 0.1~10 | 防止单步补偿过大导致抖动 | | accFactor | 补偿加速度倍数 | 0.1~10 | 控制补偿运动的加速度 | | beginCycleNum | 起始采样周期数 | 1~100 | 起始阶段采集多少个周期后开始补偿 | ### 算法类型说明 | 类型值 | 名称 | 说明 | |--------|------|------| | 0 | 均值法 | 取多个采样周期的偏差平均值作为当前偏差,平滑效果好 | | 1 | 手填值 | 使用预设的固定偏差值 custom_value,适用于已知偏差量场景 | --- ## 跟踪模式详解 ### 传感器类型与适用场景 | 传感器类型 | 值 | 适用工艺 | 优点 | 缺点 | |------------|-----|----------|------|------| | 线激光 | 0 | 焊接、切割 | 精度高,可同时获取左右和高低偏差 | 成本较高,对工件表面反光敏感 | | 电弧 | 1 | 焊接 | 成本低,不受弧光干扰 | 精度中等,需电弧稳定 | | 弧压 | 2 | 等离子切割 | 适合高度跟踪 | 仅能获取高低偏差 | ### 跟踪模式工作流程 #### 1. 初始化阶段 - 设置传感器类型(0x8740) - 配置电弧通讯参数(采样类型、周期、噪声阈值) - 设置左右/高低补偿参数(PID 参数、开关) #### 2. 运行阶段 1. 传感器持续采集数据 2. 系统按采样周期提取偏差 3. 根据算法类型计算当前偏差值 4. PID 控制器输出补偿量(受 maxSingleLen 限制) 5. 补偿量叠加到当前运动轨迹 #### 3. 数据记录(调试用) - 可通过 0x8756 设置路径数据记录 - 支持按距离或按时间两种记录方式 - 记录周期范围:1~1000000000 mm 或对应时间 ### 补偿策略选择 | 场景 | 建议参数 | 说明 | |------|----------|------| | 直线焊缝 | Kp=0.1, Ki=0.001, Kd=0 | 平稳跟踪,避免过调 | | 曲线焊缝 | Kp=0.2, Ki=0.005, Kd=0.05 | 需要更快响应 | | 薄板焊接 | Kp=0.05, Ki=0.0005, maxSingleLen=0.5 | 防止过补偿导致焊穿 | | 厚板多层焊 | Kp=0.3, Ki=0.01, maxSingleLen=3 | 允许较大补偿量 | ### 补偿数据流 传感器信号 -> 采样滤波 -> 偏差提取(算法类型) -> PID 计算(Kp, Ki, Kd) -> 限幅(maxSingleLen) -> 加速度平滑(accFactor) -> 轨迹叠加 -> 机器人运动 ### 故障排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 跟踪振荡 | Kp过大 | 减小比例系数 | | 跟踪滞后 | Kp过小或Ki过小 | 增大Kp或Ki | | 补偿超调 | Ki过大或maxSingleLen过大 | 减小Ki或限制单次补偿量 | | 噪声敏感 | 噪声阈值设置不当 | 增大噪声阈值或改用均值法 | | 补偿方向错误 | 传感器安装方向或编码器方向 | 检查传感器安装和参数符号 | --- # 视觉工艺 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/05.%E5%B7%A5%E8%89%BA/05.%E8%A7%86%E8%A7%89%E5%B7%A5%E8%89%BA.html ## 试拍照(0x8125) **说明:** 上位机发送,试拍照 **命令字:** `0x8125` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | cali_camera_angle | bool | 是 | 是否记录工件旋转角度 | true: 记录, false: 不记录 | | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | ### 请求示例 ```json { "cali_camera_angle": false, "robot": 1, "visionNum": 0 } ``` --- ## 拍照结果(0x8126) **说明:** 控制器返回拍照结果 **命令字:** `0x8126` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | cameraPoint | double[6] | 是 | 相机坐标点 | - | | protocol.type | int | 是 | 数据解析类型 | 0: 2维, 1: 2维+高度, 2: 3维 | | camera_angle | double | 是 | 工件旋转角度 | [-180, 180] | | cameraData | string | 是 | 接收数据 | - | ### 响应示例 ```json { "cameraPoint": [0, 0, 0, 0, 0, 0], "protocol": { "type": 0 }, "camera_angle": 0, "cameraData": "" } ``` --- ## 视觉标定(0x8150) **说明:** 上位机发送,下发标定点及标定参数用于视觉标定(手眼标定) **命令字:** `0x8150` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | camera_position_by_robot | int | 是 | 相机相对机器人位置(标定方式) | 0: 眼在手上;1: 眼在手外 | | calibration | object | 是 | 标定数据 | - | | calibration.point_num | int | 是 | 标定点数量 | - | | calibration.point | array | 是 | 标定点集合 | - | | calibration.point[].pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位 | - | | calibration.point[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | eye_to_hand_calibration | object | 是 | 眼在手外标定参数 | - | | eye_to_hand_calibration.angle_setting | double | 是 | 角度设置 | - | | eye_to_hand_calibration.select_template | int | 是 | 选择模板 | - | | eye_to_hand_calibration.step_angle | double | 是 | 步进角度 | - | | eye_to_hand_calibration.step_setting | double | 是 | 步进设置 | - | | eye_to_hand_calibration.tool_num | int | 是 | 工具号 | - | ### 请求示例 ```json { "calibration": { "point": [ {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]} ], "point_num": 9 }, "camera_position_by_robot": 0, "eye_to_hand_calibration": { "angle_setting": 5.0, "select_template": 0, "step_angle": 5.0, "step_setting": 5.0, "tool_num": 1 }, "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定查询(0x8151) **说明:** 上位机发送,查询视觉标定数据 **命令字:** `0x8151` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | ### 响应示例 ```json { "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定数据(0x8152) **说明:** 控制器返回,获取到的视觉标定数据 **命令字:** `0x8152` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | camera_position_by_robot | int | 是 | 相机相对机器人位置(标定方式) | - | | target_pos_calibrated | bool | 是 | 目标点是否已标定 | true: 已标定, false: 未标定 | | calibration | object | 是 | 标定数据 | - | | calibration.calc_result | double | 是 | 标定计算结果 | - | | calibration.calibrated | bool | 是 | 是否已标定 | true: 已标定, false: 未标定 | | calibration.point_num | int | 是 | 标定点数量 | - | | calibration.point | array | 是 | 标定点集合 | - | | calibration.point[].pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - | | calibration.point[].pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - | | calibration.point[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | calibration.point[].robot_pos_deg | double[7] | 是 | 标定点机器人角度坐标,定长 7 位,姿态用角度单位 | - | | calibration.target_pos_calibrated | bool | 是 | 目标点是否已标定 | true: 已标定, false: 未标定 | | eye_to_hand_calibration | object | 是 | 眼在手外标定参数 | - | | eye_to_hand_calibration.angle_setting | double | 是 | 角度设置 | - | | eye_to_hand_calibration.select_template | int | 是 | 选择模板 | - | | eye_to_hand_calibration.step_angle | double | 是 | 步进角度 | - | | eye_to_hand_calibration.step_setting | double | 是 | 步进设置 | - | | eye_to_hand_calibration.tool_num | int | 是 | 工具号 | - | ### 请求示例 ```json { "calibration": { "calc_result": 0.0, "calibrated": false, "point": [ {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, {"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]} ], "point_num": 9, "target_pos_calibrated": false }, "camera_position_by_robot": 4, "eye_to_hand_calibration": { "angle_setting": 5.0, "select_template": 0, "step_angle": 5.0, "step_setting": 5.0, "tool_num": 1 }, "robot": 1, "target_pos_calibrated": false, "visionNum": 0 } ``` --- ## 视觉标定点查询(0x8153) **说明:** 上位机发送,查询标定点数据 **命令字:** `0x8153` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | ### 响应示例 ```json { "point_num": 1, "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定点数据(0x8154) **说明:** 控制器返回,标定点数据 **命令字:** `0x8154` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | | pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - | | pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - | | robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | robot_pos_deg | double[7] | 是 | 标定点机器人角度坐标,定长 7 位,姿态用角度单位 | - | ### 响应示例 ```json { "pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "point_num": 1, "robot": 1, "robot_pos": [557.984545757289, -5.704418391263, 1056.73931896607, -3.085566393119, 0.021842103824, -3.047913696756, 0.0], "robot_pos_deg": [557.984545757289, -5.704418391263, 1056.73931896607, -176.789931733112, 1.251460364796, -174.632591144215, 0.0], "visionNum": 0 } ``` --- ## 运行至标定点(0x8155) **说明:** 上位机发送,运行至该标定点 **命令字:** `0x8155` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | ### 请求示例 ```json { "point_num": 1, "robot": 1, "visionNum": 1 } ``` --- ## 清除标定点(0x8156) **说明:** 上位机发送,清除指定标定点 **命令字:** `0x8156` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | ### 请求示例 ```json { "point_num": 3, "robot": 1, "visionNum": 0 } ``` --- ## 眼在手外自动标定运行(0x8157) **说明:** 上位机发送,眼在手外自动标定运行 **命令字:** `0x8157` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | ### 请求示例 ```json { "robot": 1, "visionNum": 0 } ``` --- ## 视觉标定像素数据(0x8158) **说明:** 控制器返回,标定点对应的像素坐标数据 **命令字:** `0x8158` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | visionNum | int | 是 | 工艺号 | [0, 98] | | point_num | int | 是 | 当前标定点 | - | | pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - | | pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - | ### 响应示例 ```json { "robot": 1, "visionNum": 0, "point_num": 1, "pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 手眼标定计算(0x8160) **说明:** 上位机发送,根据 socket 数据计算转换矩阵(手眼标定) **命令字:** `0x8160` `VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | camera_type | int | 是 | 相机类型 | 0: 2D;1: 3D(扩展,暂不支持) | | calculation_type | int | 是 | 标定计算类型 | 0: 眼在手上固定姿态的手眼标定(如眼在三轴直角机器人上);1: 眼在手上变姿态的手眼标定(如眼在四轴 SCARA、六轴串联上);2: 眼在手外的手眼标定 | | base_robot_pos | double[7] | 是 | 基准机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | mark_pos | array | 是 | 标定点集合(共 9 个点) | - | | mark_pos[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | mark_pos[].camera_pos | double[7] | 是 | 标定点像素坐标,定长 7 位 | - | ### 请求示例 ```json { "robot": 1, "camera_type": 0, "calculation_type": 0, "base_robot_pos": [0, 0, 0, 0, 0, 0, 0], "mark_pos": [ { "robot_pos": [0, 0, 0, 0, 0, 0, 0], "camera_pos": [0, 0, 0, 0, 0, 0, 0] }, { "robot_pos": [0, 0, 0, 0, 0, 0, 0], "camera_pos": [0, 0, 0, 0, 0, 0, 0] } ] } ``` --- ## 手眼标定计算回复(0x8161) **说明:** 控制器返回手眼标定计算结果(转换矩阵) **命令字:** `0x8161` `VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA_RESPOND` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | result | bool | 是 | 计算是否成功 | true: 成功, false: 失败 | | matrix | double[16] | 是 | 转换矩阵(4×4,行优先共 16 位) | - | ### 响应示例 ```json { "robot": 1, "result": true, "matrix": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` --- ## 视觉目标点计算(0x8162) **说明:** 上位机发送,计算视觉目标点的机器人坐标 **命令字:** `0x8162` `VISION_CALCULATE_TARGET_POS` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | camera_type | int | 是 | 相机类型 | 0: 2D;1: 3D | | calculation_type | int | 是 | 标定计算类型 | 0: 眼在手上;1: 眼在手外 | | robot_pos | double[7] | 是 | 机器人直角坐标,定长 7 位,姿态用弧度单位 | - | | camera_pos | double[7] | 是 | 像素坐标,定长 7 位 | - | | matrix | double[16] | 是 | 手眼标定结果(4×4,行优先共 16 位) | - | ### 请求示例 ```json { "robot": 1, "camera_type": 0, "calculation_type": 0, "robot_pos": [0, 0, 0, 0, 0, 0, 0], "camera_pos": [0, 0, 0, 0, 0, 0, 0], "matrix": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } ``` --- ## 视觉目标点计算回复(0x8163) **说明:** 控制器返回视觉目标点的机器人坐标 **命令字:** `0x8163` `VISION_CALCULATE_TARGET_POS_RESPOND` ### 响应参数 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | robot | int | 是 | 当前机器人 | [1, 4] | | result | bool | 是 | 计算是否成功 | true: 成功, false: 失败 | | robot_pos | double[7] | 是 | 目标点机器人直角坐标,定长 7 位,姿态用弧度单位 | - | ### 响应示例 ```json { "robot": 1, "result": true, "robot_pos": [0, 0, 0, 0, 0, 0, 0] } ``` --- ## 视觉触发方式 视觉触发决定了相机何时拍照并获取图像数据,系统支持多种触发方式以适应不同应用场景。 ### 触发方式对比 | 触发方式 | 实现方式 | 适用场景 | 优点 | 缺点 | |----------|----------|----------|------|------| | 软触发(命令触发) | 上位机发送拍照命令 0x8125 | 单次拍照、调试 | 灵活可控 | 延迟不可控 | | 硬触发(IO触发) | 通过数字IO信号触发相机 | 高速产线、固定工位 | 延迟低、一致性高 | 需额外接线 | | 连续触发 | 相机持续拍照 | 动态检测 | 无遗漏 | 数据量大 | | 编码器触发 | 通过编码器位置触发 | 传送带跟踪 | 位置精确 | 需要编码器 | ### 软触发完整流程 1. 上位机发送试拍照命令 0x8125(含 cali_camera_angle 标志) 2. 控制器转发拍照指令给相机 3. 相机拍照并返回图像数据 4. 控制器通过 0x8126 返回拍照结果(含 cameraData 和 cameraPoint) 5. 上位机解析结果数据进行后续处理 --- ## 视觉结果解析 视觉拍照后返回的数据需要根据不同协议类型进行解析。 ### 数据解析类型 | protocol.type | 名称 | 数据格式 | 适用场景 | |---------------|------|----------|----------| | 0 | 2维 | (X, Y, 角度) | 平面定位、抓取 | | 1 | 2维+高度 | (X, Y, Z, 角度) | 带高度信息的抓取 | | 2 | 3维 | (X, Y, Z, A, B, C) | 三维空间定位 | ### cameraData 解析 cameraData 为字符串类型,根据 protocol.type 不同,解析方式不同: #### 2维数据解析 (type=0) 格式: X,Y,Angle(逗号分隔),X/Y 为像素坐标或物理坐标,Angle 为工件旋转角度(度) #### 2维+高度 (type=1) 格式: X,Y,Z,Angle(逗号分隔),增加高度 Z 信息 #### 3维数据解析 (type=2) 格式: X,Y,Z,A,B,C(逗号分隔),完整的六自由度位姿数据 ### cameraPoint 说明 cameraPoint 为 double[6] 数组,表示拍照时相机在工作坐标系下的位置: - cameraPoint[0]~[2]:X, Y, Z 坐标 (mm) - cameraPoint[3]~[5]:A, B, C 姿态 (弧度) ### camera_angle 说明 工件旋转角度,单位为度,范围 [-180, 180]。仅在 cali_camera_angle=true 时有效返回实际角度。 --- ## 视觉坐标变换 ### 坐标系关系 像素坐标系 -> 相机坐标系 -> 工具坐标系 -> 基座坐标系 (分别通过相机内参、手眼矩阵、法兰变换进行转换) ### 手眼标定矩阵应用 手眼标定得到的 4x4 变换矩阵 matrix(16个元素,行优先),用于将相机坐标转换为机器人坐标。 矩阵格式为行优先的 4x4 齐次变换矩阵,包含旋转分量 R(3x3) 和平移分量 Tx,Ty,Tz。 ### 计算目标点机器人坐标 已知条件: - camera_pos:目标在相机坐标系下的位置 - matrix:手眼标定矩阵 - robot_pos:拍照时机器人的当前位置 计算步骤: 1. 将 camera_pos 通过 matrix 变换到机器人基坐标系下的偏移 2. 将偏移叠加到 robot_pos 上得到最终目标位置 3. 使用 0x8162/0x8163 命令进行此计算 ### 常见视觉配置校验 | 检查项 | 方法 | |--------|------| | 手眼标定精度 | 使用多个验证点检查重投影误差,一般要求 < 0.5mm | | 相机安装稳定性 | 在固定位置连续拍照多次,检查位置重复性 | | 光照条件 | 确保拍照区域光照均匀,避免反光或阴影 | --- # 变量 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/06.%E5%8F%98%E9%87%8F.html ## 获取当前位置 **命令字:** `0x6000` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x6001` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | globalPosition | object | 全局位置变量对象 | | note | object | 注释对象 | `globalPosition` 中每个点位数据为 `double[]` 类型,含义如下: | 位 | 说明 | |----|------| | 0 | 坐标类型:0 关节,1 直角,2 工具,3 用户 | | 1 | 角度制/弧度制:0 弧度制,1 角度制 | | 2 | 左右手:0 无,1 左,2 右 | | 3 | 工具坐标系 | | 4 | 用户坐标系 | | 5、6 | 扩展备用 | | 7~13 | 机器人坐标(共 7 位) | | 14~20 | 外部轴 | ```json { "globalPosition": { "GP0021": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0022": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0023": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0024": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0025": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0026": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0027": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0028": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0029": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0030": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0031": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0032": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0033": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0034": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0035": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0036": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0037": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0038": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0039": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0040": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, "note": { "GP0021": "", "GP0022": "", "GP0023": "", "GP0024": "", "GP0025": "", "GP0026": "", "GP0027": "", "GP0028": "", "GP0029": "", "GP0030": "", "GP0031": "", "GP0032": "", "GP0033": "", "GP0034": "", "GP0035": "", "GP0036": "", "GP0037": "", "GP0038": "", "GP0039": "", "GP0040": "" }, "robot": 1 } ``` ## 设置全局位置变量 > **注意:** 如果是四轴,最后两位补 0。 **命令字:** `0x6002` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | posName | string | 变量名称 | | pos | double[] | 变量数据 | | note | string | 注释 | ```json { "robot": 1, "posName": "GP0001", "pos": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 2, 3.3, 0, 0], "note": "qqq" } ``` ## 查询全局位置变量 **命令字:** `0x6003` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | posName | string | 点位名称 | | initialValue | bool | 初始化,可选发送或不发送 | ```json { "robot": 1, "posName": "GP0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6004` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | initialValue | bool | 初始化 | | posName | string | 点位名称 | | posValue | double[] | 点位数据(弧度制) | | posValueDeg | double[] | 点位数据(角度制) | | note | string | 注释 | ```json { "initialValue": true, "note": "qqq", "posName": "GP0001", "posValue": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posValueDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ## 局部变量 ### 局部变量位置变量 P 点查询 **命令字:** `0x6010` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | ```json { "robot": 1, "varname": "P0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6011` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | pos | double[] | 弧度制点位数据 | | posDeg | double[] | 角度制点位数据 | ```json { "robot": 1, "jobname": "Q1", "varname": "P0001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6] } ``` ### 局部变量位置变量 E 点查询 **命令字:** `0x6012` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | ```json { "robot": 1, "varname": "E0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6013` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | pos | double[] | 弧度制点位数据 | | posDeg | double[] | 角度制点位数据 | ```json { "robot": 1, "jobname": "Q1", "varname": "E0001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } ``` ### 局部变量查询 **命令字:** `0x6014` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | vartype | int | 变量类型:0 int 型,1 double 型,2 bool 型,3 string 型 | | varname | string | 变量名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | identify | string | CommandInsert:插入指令界面变量,VariableReview:监控界面数值变量 | ```json { "robot": 1, "vartype": 1, "varname": "I001", "initialValue": true, "identify": "CommandInsert" } ``` **控制器回复** **命令字:** `0x6015` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | vartype | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varname | string | 变量名称 | | value | double | 若变量为数值类型,通过 value 传输 | | string | string | 若变量为字符串类型,通过 string 传输 | | identify | string | CommandInsert:插入指令界面变量,VariableReview:监控界面数值变量 | ```json { "robot": 1, "jobname": "Q1", "vartype": 1, "varname": "I001", "value": 2, "string": "i'm a string", "identify": "CommandInsert" } ``` ## 全局变量 ### 设置全局变量 **命令字:** `0x6020` | 字段 | 类型 | 说明 | |------|------|------| | varName | string | 变量名称 | | varType | int | 变量类型:0 int 型,1 double 型,2 bool 型,3 string 型 | | varValue | double | 变量值 | | varString | string | 当 varType = 3 时使用此字段传输 | | varNote | string | 注释 | ```json { "varName": "GD001", "varType": 1, "varValue": 14.0, "varString": "oooo", "varNote": "aaa" } ``` ### 获取全局数值变量 **命令字:** `0x6021` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | ```json { "varType": 1 } ``` **控制器回复** **命令字:** `0x6022` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varNum | int | 数值变量个数,范围 [1, 100] | | varList | array | 变量列表 | | varList[].varName | string | 变量名称 | | varList[].varValue | double | 变量值 | | varList[].varNote | string | 注释 | ```json { "varType": 1, "varNum": 2, "varList": [ { "varName": "I001", "varValue": 3, "varNote": "QQQ" }, { "varName": "D002", "varValue": 8.4, "varNote": "hhha" } ] } ``` ### 全局变量注释查询 **命令字:** `0x6023` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | ```json { "varType": 1 } ``` **控制器回复** **命令字:** `0x6024` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varNote | object | 变量注释对象,键为变量名,值为注释内容 | ```json { "varNote": { "GI001": "9999" }, "varType": 1 } ``` ## 全局外部轴变量 ### 设置全局外部轴变量 **命令字:** `0x6025` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | pos | double[] | 点位数据,格式:点位信息(7) + 机器人位置(7) + 外部轴位置(5) + 预留(2) | | note | string | 注释 | ```json { "robot": 1, "varname": "GE0001", "pos": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4], "note": "qqq" } ``` ### 查询全局外部轴变量 **命令字:** `0x6026` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始化值,true:是,false:否 | ```json { "robot": 1, "varname": "GE001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6027` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始化值 | | note | string | 注释 | | posValue | double[] | GP + 外部点(角度制) | | posValueDeg | double[] | GP + 外部点(弧度制) | ```json { "initialValue": true, "note": "qqq", "posValue": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 0.0, 0.0], "posValueDeg": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 0.0, 0.0], "robot": 1, "varname": "GE001" } ``` ### 获取全部全局外部轴点位 **命令字:** `0x6028` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x6029` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | globalExtPosition | object | 点位列表,键为变量名,值为 double[] | | note | object | 注释列表,键为变量名,值为注释字符串 | ```json { "robot": 1, "globalExtPosition": { "GE001": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "GE003": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6] }, "note": { "GE001": "qqqq", "GE002": "", "GE003": "www" } } ``` ## 查询指定坐标下的位置 **命令字:** `0x602A` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | name | string | 点位名称 | | initialValue | bool | 是否为初始化值 | | targetCoord | int | 目标坐标系类型 | ```json { "initialValue": true, "name": "GP0001", "targetCoord": 3 } ``` **控制器回复** **命令字:** `0x602B` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,范围 [1,4] | | posName | string | 点位名称 | | result | int | 坐标系转换是否正确 | | pos | array | 位置信息,0~6 信息,7~13 机器人本体,14~18 外部轴(角度制) | | initialValue | bool | 是否为初始化值 | ```json { "robot": 1, "posName": "GP0001", "result": 0, "pos": [0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "initialValue": true } ``` ## 查询一个全局变量 **命令字:** `0x602C` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型 | | varName | string | 变量名称 | | identity | string | 来源标识:VariableReview 监控界面的全局变量,NumerlcalVarWidget 全局数值变量界面 | ```json { "varType": 1, "varName": "GI001", "identity": "VariableReview" } ``` **控制器回复** **命令字:** `0x602D` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型 | | varName | string | 变量名称 | | identity | string | 来源标识 | | varNote | string | 注释 | | varValue | double | 变量值 | ```json { "varType": 1, "varName": "GI001", "identity": "VariableReview", "varNote": "9999", "varValue": 16.0 } ``` --- # 拖拽示教 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/01.%E5%8D%8F%E8%AE%AE/07.%E6%8B%96%E6%8B%BD%E7%A4%BA%E6%95%99.html ## 1 拖动模式 ### 1.1 上位机设置拖拽模式参数 **命令字:** `0x4074` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | mode | int | [0,3] | 拖动方式:0-无,1-3D 鼠标,2-力矩,3-位置 | | port | int | 当前绑定 IO 端口数 | 外部触发信号端口 | | value | int | [0,1] | 外部触发信号参数 | ```json { "mode": 2, "port": 0, "value": 0 } ``` --- ### 1.2 上位机查询拖拽模式参数 **命令字:** `0x4075` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4076` | 参数名 | 类型 | 说明 | |--------|------|------| | mode | int | 拖动方式,范围[0,3] | | port | int | 外部触发信号端口 | | value | int | 外部触发信号参数,范围[0,1] | ```json { "mode": 2, "port": 0, "value": 0 } ``` --- ### 1.3 上位机设置力矩参数 **命令字:** `0x4085` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | DecareLimit | double | [0,∞) m/s | 笛卡尔空间线速度限制 | | JointVelLimit | double | [0,∞) °/s | 关节空间速度限制 | | dragCoefficient | double[6] | [1,100] | 超限阻力系数 | | drag_mode | int | [0,2] | 拖动模式:0-自由拖动,1-位置拖动,2-姿态拖动 | | frictionOffset | double[6] | [0,0.99] | 关节摩擦力补偿矫正系数 | | targetTorqCoefficient | double[6] | [0,1] | 关节目标扭矩矫正系数 | | waitCycle | double | [1,10] | 下发给伺服力矩参数等待周期 | ```json { "DecareLimit": 2.50, "JointVelLimit": 1.0, "dragCoefficient": [5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode": 0, "frictionOffset": [0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient": [1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle": 5.0 } ``` --- ### 1.4 上位机查询力矩参数 **命令字:** `0x4086` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4087` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | DecareLimit | double | [0,∞) m/s | 笛卡尔空间线速度限制 | | JointVelLimit | double | [0,∞) °/s | 关节空间速度限制 | | dragCoefficient | double[6] | [1,100] | 超限阻力系数 | | drag_mode | int | [0,2] | 拖动模式 | | frictionOffset | double[6] | [0,0.99] | 关节摩擦力补偿矫正系数 | | targetTorqCoefficient | double[6] | [0,1] | 关节目标扭矩矫正系数 | | waitCycle | double | [1,10] | 下发给伺服力矩参数等待周期 | ```json { "DecareLimit": 2.50, "JointVelLimit": 1.0, "dragCoefficient": [5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode": 0, "frictionOffset": [0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient": [1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle": 5.0 } ``` --- ## 2 轨迹管理 > **说明:** 轨迹保存结果通过0x4070返回。 ### 2.1 上位机查询拖拽轨迹是否被记录 **命令字:** `0x408B` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4070` | 参数名 | 类型 | 说明 | |--------|------|------| | record | bool | 轨迹是否被记录 | ```json { "record": false } ``` --- ### 2.2 上位机请求轨迹回放 **命令字:** `0x4071` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | trajName | string | - | 需要回放的轨迹名称 | | vel | int | [1,100] | 轨迹回放运行速度 | ```json { "trajName": "AAA", "vel": 100 } ``` --- ### 2.3 上位机请求保存拖拽轨迹 **命令字:** `0x4072` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string | 需要保存的轨迹名称,若为空则保存失败 | ```json { "TrajName": "AAA" } ``` --- ### 2.4 上位机请求删除拖拽轨迹 **命令字:** `0x4073` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string | 需要删除的轨迹名称 | ```json { "TrajName": "AAA" } ``` --- ### 2.5 上位机查询拖拽轨迹列表 **命令字:** `0x4083` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4084` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string[] | 已保存轨迹列表,长度为当前已保存轨迹数量,若无轨迹则该节点不存在 | ```json { "TrajName": ["AAA"] } ``` --- ### 2.6 上位机设置轨迹记录参数 **命令字:** `0x4088` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | MaxSamplingNum | double | (200,1200) | 最大采样点数 | | SamplingInterval | double | [0.03,1] | 采样间隔(秒) | | Start | bool | - | 开始/停止记录:true-开始记录,false-停止记录;false 时"MaxSamplingNum"和"SamplingInterval"可以不存在 | ```json { "MaxSamplingNum": 300.0, "SamplingInterval": 0.030, "Start": true } ``` --- ### 2.7 上位机查询轨迹记录参数 **命令字:** `0x4089` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x408A` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | MaxSamplingNum | double | (200,1200) | 最大采样点数 | | SamplingInterval | double | [0.03,1] | 采样间隔(秒) | | Start | bool | - | 开始/停止记录:true-开始记录,false-停止记录 | ```json { "MaxSamplingNum": 300.0, "SamplingInterval": 0.030, "Start": false } ``` --- ### 2.8 上位机查询拖拽轨迹文件列表 **命令字:** `0x408C` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x408D` | 参数名 | 类型 | 说明 | |--------|------|------| | absolutepath | string | 控制器中拖拽轨迹文件存放地址 | | trajectory_filelist | string[] | 拖拽轨迹文件列表,"drag_traj_details.json"为轨迹记录信息文件 | ```json { "absolutepath": "dragPos/", "trajectory_filelist": ["AAA","JJ","drag_traj_details.json"] } ``` --- # 变更日志 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/03.RTL-25.01/02.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html TODO:待补充 --- # 系统 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/01.%E7%B3%BB%E7%BB%9F.html ## 状态 ### 查询初始化状态 系统开机需要进行初始化,否则系统将无法使用。 **命令字:** `0x1000` - 无需发送数据 **控制器回复** **命令字:** `0x1001` | 字段 | 类型 | 说明 | |------|------|------| | finishinit | bool | 初始化是否完成,true 完成,false 未完成 | ```json { "finishinit": true } ``` ### 查询是否为 T5 系统 **命令字:** `0x1002` - 无需发送数据 **控制器回复** **命令字:** `0x1003` | 字段 | 类型 | 说明 | |------|------|------| | T5_system | bool | 是否为 T5 系统,true 是,false 不是 | ```json { "T5_system": false } ``` ### 查询硬件系统发布版本 **命令字:** `0x1004` - 无需发送数据 **控制器回复** **命令字:** `0x1005` | 字段 | 类型 | 说明 | |------|------|------| | result | bool | 查询是否成功,true 成功,false 失败 | | version | string | 版本号(若查询成功则返回) | ```json { "result": true, "version": "xx" } ``` ## 版本升级 系统开机时需要查询当前版本号,若出现不匹配则需要进行版本升级。 ### 查询当前系统版本号 **命令字:** `0x1010` | 字段 | 类型 | 说明 | |------|------|------| | version | string | 版本号内容 | ```json { "version": "v1.0-rc1-67-gf34dae7" } ``` **控制器回复** **命令字:** `0x1011` | 字段 | 类型 | 说明 | |------|------|------| | configFileVersionMismatch | bool | 配置文件是否匹配,false 不匹配,true 匹配 | | jobFileVersion | string | 作业文件版本 | | rtlVersion | string | 控制器版本 | | sysClock | string | 系统时钟,格式如 "2023.11.10 13:29:25" | | version | string | 版本号内容,若查询时发送的 version 为空字符串则返回同样内容 | | controllerFunction | string | 控制器功能版本,默认 "BASE" | | controllerProject | string | 项目版本号,默认 "1.0.0" | | controllerModel | string | 控制器型号,默认 "C1102" | | controllerMaster | string | 主站类型,默认 "EtherCAT" | | controllerFactory | string | 厂家,默认 "INEXBOT" | ```json { "configFileVersionMismatch": false, "jobFileVersion": "5.2.0", "rtlVersion": "22.08.0", "sysClock": "2023.11.10 13:29:25", "version": "v1.0-rc1-67-gf34dae7", "controllerFunction": "BASE", "controllerProject": "1.0.0", "controllerModel": "C1102", "controllerMaster": "EtherCAT", "controllerFactory": "INEXBOT" } ``` ## 日志 ### 查询崩溃日志文件 **命令字:** `0x1020` - 无需发送数据 **控制器回复** **命令字:** `0x1021` | 字段 | 类型 | 说明 | |------|------|------| | absolutepath | string | 路径 | | dumpLogfilenum | int | 文件数量 | | dumpLogfilelist | string[] | 日志文件列表 | ```json { "absolutepath": "", "dumpLogfilenum": 3, "dumpLogfilelist": ["", "", "", ""] } ``` ### 请求获取日志文件列表 **命令字:** `0x1022` | 字段 | 类型 | 说明 | |------|------|------| | num | int | 表示获取最近多少个文件,可取 5、30、100 | ```json { "num": 5 } ``` **控制器回复** **命令字:** `0x1023` | 字段 | 类型 | 说明 | |------|------|------| | absolutepath | string | 日志所在目录 | | logfilenum | int | 日志数目(与 num 不一定相等) | | logfilelist | string[] | 日志列表 | ```json { "absolutepath": "log/", "logfilenum": 3, "logfilelist": ["logInfo.0", "logInfo.1", "logInfo.2"] } ``` ## 恢复出厂设置 **命令字:** `0x1030` | 字段 | 类型 | 说明 | |------|------|------| | clearFactoryIO | bool | 清除所有 IO,true 清除,false 未清除 | | clearFactoryRobot | bool | 清除所有机器人,true 清除,false 未清除 | | clearFactoryToolhand | bool | 清除所有工具手,true 清除,false 未清除 | | clearConfigFile | bool | 清除所有系统配置文件,true 清除,false 未清除 | | clearExtendedFile | bool | 清除所有扩展文件,true 清除,false 未清除 | ```json { "clearFactoryIO": true, "clearFactoryRobot": true, "clearFactoryToolhand": true, "clearConfigFile": true, "clearExtendedFile": true } ``` ## 重启、关机 ### 重启控制器 **命令字:** `0x1031` - 无需发送数据 ### 关机 **命令字:** `0x1032` - 无需发送数据 ### 查询断电保持恢复状态 **命令字:** `0x1033` - 无需发送数据 **控制器回复** **命令字:** `0x1034` | 字段 | 类型 | 说明 | |------|------|------| | rebootKeepRecoveryFlag | bool | 断电保持恢复标志,true 恢复成功,false 未执行断电保持恢复 | | rebootKeepJobFileName | string | 断电保持恢复的程序名字,程序命名首字母不得为数字 | ```json { "rebootKeepRecoveryFlag": false, "rebootKeepJobFileName": "xxxx" } ``` ## IP 设置 ### 控制器 IP 设置 **命令字:** `0x1040` | 字段 | 类型 | 说明 | |------|------|------| | name | string | 网口名称 | | address | string | 设置控制器 IP | | gateway | string | 设置控制器网关 | | dns | string | 设置控制器 DNS | ```json { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ``` ### 查询连接 IP **命令字:** `0x1041` - 无需发送数据 **控制器回复** **命令字:** `0x1042` | 字段 | 类型 | 说明 | |------|------|------| | num | int | 网口数目 | | network | array | 网络信息列表 | | network[].name | string | 网口名称 | | network[].address | string | 控制器 IP | | network[].gateway | string | 控制器网关 | | network[].dns | string | 控制器 DNS | ```json { "num": 2, "network": [ { "name": "p1p1", "address": "192.168.1.13", "gateway": "192.168.1.1", "dns": "114.114.114.114" }, { "name": "p2p1", "address": "192.168.1.14", "gateway": "192.168.1.1", "dns": "114.114.114.114" } ] } ``` ## 时间设置 ### 发送时间查询 **命令字:** `0x1050` | 字段 | 类型 | 说明 | |------|------|------| | type | int | 时间类型:0 现实时间,1 获取系统开始时间至现在秒数 | | format | int | 格式:0 获取时间戳,1 获取北京时间 | ```json { "type": 0, "format": 0 } ``` **控制器回复** **命令字:** `0x1051` | 字段 | 类型 | 说明 | |------|------|------| | tType | int | 时间类型:0 现实时间,1 系统开始时间至现在秒数 | | format | int | 格式:0 时间戳,1 北京时间 | | date | object | 日期和时间信息 | | date.year | int | 年份 | | date.mon | int | 月份 | | date.day | int | 日期 | | date.hour | int | 小时 | | date.min | int | 分钟 | | date.sec | int | 秒数 | | date.msec | int | 毫秒数 | | timestamp | object | 时间戳(format 为 0 时显示) | | timestamp.s | int | 时间戳秒数 | | timestamp.ns | int | 时间戳纳秒数 | ```json { "tType": 0, "format": 0, "date": { "year": 2023, "mon": 1, "day": 1, "hour": 1, "min": 1, "sec": 1, "msec": 1 }, "timestamp": { "s": 1, "ns": 1 } } ``` ### 查询语言支持 **命令字:** `0x1052` - 无需发送数据 **控制器回复** **命令字:** `0x1053` | 字段 | 类型 | 说明 | |------|------|------| | language | string[] | 控制器能够支持的所有语言,目前支持:Chinese 中文、Korean 韩文、English 英文 | | language_used | string | 控制器当前使用的语言 | ```json { "language": ["Chinese", "Korean", "English"], "language_used": "Chinese" } ``` ### 查询上位机当前语言 **命令字:** `0x1054` | 字段 | 类型 | 说明 | |------|------|------| | teachbox_language | string | 上位机当前使用的语言 | ```json { "teachbox_language": "Chinese" } ``` ## 系统保养 ### 系统保养查询 **命令字:** `0x1060` - 无需发送数据 **控制器回复** **命令字:** `0x1061` | 字段 | 类型 | 说明 | |------|------|------| | controller_ID | string | 控制器 ID | | controller_total_time | int | 控制器通电总时间,单位为小时 | | controller_spent_time | int | 控制器距离上次保养时长,单位为小时 | | controller_cycle_time | int | 控制器保养间隔周期,单位为小时 | | robot_total_time | int | 机器人通电总时间,单位为小时 | | robot_spent_time | int | 机器人距离上次保养时长,单位为小时 | | robot_cycle_time | int | 机器人保养间隔周期,单位为小时 | ```json { "controller_ID": "4DC9F0249098C82E", "controller_total_time": 0, "controller_spent_time": 0, "controller_cycle_time": 0, "robot_total_time": 0, "robot_spent_time": 0, "robot_cycle_time": 0 } ``` ### 系统保养提示 **命令字:** `0x1062` | 字段 | 类型 | 说明 | |------|------|------| | exist | bool | 判断保养文件是否存在,true 存在,false 不存在 | | controlTimeStatus | bool | 控制器保养状态,true 保养,false 不保养 | | robotTimeStatus | bool | 机器人保养状态,true 保养,false 不保养 | ```json { "exist": true, "controlTimeStatus": true, "robotTimeStatus": true } ``` ## 文件 ### 查询控制器配置文件目录 **命令字:** `0x1070` | 字段 | 类型 | 说明 | |------|------|------| | isExport | bool | 导入导出配置,true 导出配置,false 导入配置 | ```json { "isExport": true } ``` **控制器回复** **命令字:** `0x1071` | 字段 | 类型 | 说明 | |------|------|------| | filelist | string[] | 配置文件名称列表 | | filenum | int | 配置文件数量 | ```json { "filelist": ["xxx.json", "yyy.json"], "filenum": 2 } ``` ## 系统备份 ### 查询是否存在当前版本示教器程序 **命令字:** `0x1090` | 字段 | 类型 | 说明 | |------|------|------| | config_md5 | string | config.db 文件 MD5 值 | | pinyin_md5 | string | Pinyin.db 文件 MD5 值,null 表示没有这个文件或者文件大小是 0 | | pro_md5 | string | 示教器程序文件的 MD5 值 | | pro_name | string | 示教器程序文件的名称,可选 Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "config_md5": "2803f92ecdecfd3c178b0998b9391a4d", "pinyin_md5": "null", "pro_md5": "ce407851346d030dad5207948f55ed6c", "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1091` | 字段 | 类型 | 说明 | |------|------|------| | path | object | 文件路径信息 | | path.config | string | config.db 文件上传路径 | | path.dir | string | 所有文件的路径 | | path.pinyin | string | Pinyin.db 文件上传路径,空字符串表示不需要上传 | | path.pro | string | Qt-tp 文件上传路径 | ```json { "path": { "config": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "dir": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "pinyin": "", "pro": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6" } } ``` ### 查询是否存在与控制器版本匹配的示教器程序 **命令字:** `0x1092` | 字段 | 类型 | 说明 | |------|------|------| | pro_name | string | 示教器程序名称,可选 Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1093` | 字段 | 类型 | 说明 | |------|------|------| | backuppath | string | 备份路径 | ### 请求备份程序文件 **命令字:** `0x1094` | 字段 | 类型 | 说明 | |------|------|------| | backup_dir | string | 备份文件的原路径 | | pro_name | string | 程序名称,Qt-tp 或 T30_ARM_Linux_Teach-pendant | ```json { "backup_dir": "qttpBackup/rtl-24.03.07-6.0.9-1.0.6", "pro_name": "Qt-tp" } ``` **控制器回复** **命令字:** `0x1095` | 字段 | 类型 | 说明 | |------|------|------| | backuppath | string | 自动备份的路径 | ```json { "backuppath": "" } ``` ### 请求自动备份 **命令字:** `0x1096` - 无需发送数据 **控制器回复** **命令字:** `0x1097` | 字段 | 类型 | 说明 | |------|------|------| | backUpNum | int | 备份系统数,最多 10 个 | | backUpName | string[] | 备份系统的名字 | ```json { "backUpNum": 1, "backUpName": ["string", "string", "string……"] } ``` ### 请求系统恢复 **命令字:** `0x1098` | 字段 | 类型 | 说明 | |------|------|------| | backUpOneName | string | 需要恢复的系统名称 | ```json { "backUpOneName": "xxxx" } ``` **控制器回复** **命令字:** `0x1099` | 字段 | 类型 | 说明 | |------|------|------| | success | bool | 系统恢复是否成功,true 成功,false 失败 | | backUpName | string[] | 备份系统的名字,最多 10 个 | ```json { "success": true } ``` ### 保存厂家参数 **命令字:** `0x109A` - 无需发送数据 **控制器回复** **命令字:** `0x109B` | 字段 | 类型 | 说明 | |------|------|------| | success | bool | 是否保存成功,true 成功,false 失败 | ```json { "success": true } ``` ## 密钥 ### 系统限制设置 **命令字:** `0x10B0` | 字段 | 类型 | 说明 | |------|------|------| | pallet | bool | 设置码垛功能限制 | | welding | bool | 设置焊接功能限制 | | laserCut | bool | 设置激光切割功能限制 | | polish | bool | 设置打磨功能限制 | | spray | bool | 设置喷涂功能限制 | | search | bool | 设置寻位功能限制 | | vision | bool | 设置视觉功能限制 | | conveyor | bool | 设置传送带功能限制 | | clear_data | bool | 清除数据 | ```json { "pallet": true, "welding": true, "laserCut": true, "polish": true, "spray": true, "search": true, "vision": true, "conveyor": true, "clear_data": true } ``` ### 查询控制器功能限制 **命令字:** `0x10B1` - 无需发送数据 **控制器回复** **命令字:** `0x10B2` | 字段 | 类型 | 说明 | |------|------|------| | maxRobotCount | int | 机器人最大数目 | | crafts | string[] | 已解锁的工艺列表 | | robotTypes | string[] | 已解锁的机器人类型 | 工艺类型值: - `C_Pallet`:码垛工艺 - `C_Welding`:焊接工艺 - `C_Lasercut`:激光切割工艺 - `C_Polish`:打磨工艺 - `C_Spray`:喷涂工艺 - `C_Search`:寻位跟踪工艺 - `C_Vision`:视觉工艺 机器人类型值: - `R_NULL`:未选择机器人类型 - `R_GENERAL_6S`:六轴串联多关节 - `R_GENERAL_6S_1`:六轴协作 - `R_SIXAXIS_SPRAY_BBR`:六轴喷涂机器人 - `R_GENERAL_6S_2`:六轴异型二 - `R_GENERAL_5S`:五轴机器人 - `R_SCARA`:四轴 SCARA 机器人 - `R_SCARA_1`:四轴 SCARA 异型一机器人 - `R_FOURAXIS_PALLET`:四轴连杆码垛机器人 - `R_FOURAXIS_PALLET_1`:四轴码垛丝杆机器人 - `R_FOURAXIS`:四轴机器人 - `R_FOUR_CARTESIAN_COORDINATE`:四轴直角机器人 - `R_FOUR_POLAR_COORDINATE_1`:四轴极坐标异形机器人 - `R_SCARA_THREEAXIS`:三轴 SCARA 机器人 - `R_THREE_CARTESIAN_COORDINATE`:三轴直角机器人 - `R_THREE_CARTESIAN_COORDINATE_1`:三轴异形一机器人 - `R_SCARA_TWOAXIS`:二轴 SCARA 机器人 - `R_GENERAL_7S`:七轴通用机器人 - `R_GENERAL_1S`:一轴机器人 - `R_GANTRY_WELD`:五轴龙门焊接机器人 - `R_DELTA`:delta 机器人(四轴并联机器人) - `R_WINE_CHAMFER`:酒槽机型 - `R_GANTRY_WELD_2`:五轴龙门焊接机器人类型 2 - `R_FOUR_CARTESIAN_COORDINATE_1`:四轴直角异型一机器人 - `R_GANTRY_WELD_6`:六轴龙门焊接机器人 - `FIVE_AXLE_MIXED`:五轴混动机器人 - `R_SCARA_FOURAXIS_2`:四轴 SCARA 异型 2 - `R_SIX_AXLE_ABNORMITY_3`:六轴异型三 - `R_SCARA_THREEAXIS_1`:三轴 SCARA 异型 1 - `R_DELTA_2D_`:delta 2D 并联机器人模型 - `R_GANTRY_WELD_3`:五轴龙门焊接机器人类型 3 - `R_GENERAL_3S_1`:三轴串联异形一 - `R_GENERAL_5S_COLLABORATIVE_`:五轴协作机器人 - `R_SCARA_3_`:四轴 SCARA 异型三机器人 - `R_GENERAL_6S_CBBARA_`:六轴串联-CBBARA - `R_HEAVY_DUTY_FOUR_AXIS_`:高格立柱旋转四轴 ```json { "crafts": [ "C_Pallet", "C_Welding", "C_Lasercut", "C_Polish", "C_Spray", "C_Search", "C_Vision" ], "maxRobotCount": 4, "robotTypes": [ "R_GENERAL_6S", "R_SCARA", "R_FOURAXIS_PALLET", "R_FOURAXIS", "R_GENERAL_1S", "R_GENERAL_5S", "R_GENERAL_6S_1", "R_SCARA_TWOAXIS", "R_SCARA_THREEAXIS", "R_THREE_CARTESIAN_COORDINATE", "R_THREE_CARTESIAN_COORDINATE_1", "R_GENERAL_7S", "R_SCARA_1", "R_FOURAXIS_PALLET_1", "R_SIXAXIS_SPRAY_BBR", "R_FOUR_CARTESIAN_COORDINATE", "R_FOUR_POLAR_COORDINATE_1", "R_GENERAL_6S_2", "R_GANTRY_WELD", "R_DELTA", "R_WINE_CHAMFER", "R_GANTRY_WELD_2", "R_FOUR_CARTESIAN_COORDINATE_1", "R_GANTRY_WELD_6", "FIVE_AXLE_MIXED", "R_SCARA_FOURAXIS_2", "R_SIX_AXLE_ABNORMITY_3", "R_SCARA_THREEAXIS_1", "R_DELTA_2D_", "R_GANTRY_WELD_3", "R_GENERAL_3S_1", "R_GENERAL_5S_COLLABORATIVE_", "R_SCARA_3_" ] } ``` ### 查询控制器 ID **命令字:** `0x10B3` - 无需发送数据 **控制器回复** **命令字:** `0x10B4` | 字段 | 类型 | 说明 | |------|------|------| | controllerID | string | 控制器 ID | ```json { "controllerID": "4DC9F0249098C82E" } ``` > **说明:** 获取到连接的控制器 ID 之后,在同步作业文件时需判断此 ID 是否已知。已知则判断路径 "dir/controllerID" 是否存在,若存在则不做操作;若不存在则创建工作文件路径,格式:"dir/controllerID/robotJob/R1"。多个机器人则表示 R1-4。 ### 获取控制器剩余使用天数 **命令字:** `0x10B5` - 无需发送数据 **控制器回复** **命令字:** `0x10B6` | 字段 | 类型 | 说明 | |------|------|------| | restdays | int | 剩余使用天数,-1 无限期使用,0 使用期限已到,其余表示剩余多少天 | | year | int | 过期年份 | | mon | int | 过期月份 | | day | int | 过期日 | ```json { "restdays": 30, "year": 1, "mon": 1, "day": 1 } ``` ### 控制器发送剩余使用天数 **命令字:** `0x10B7` | 字段 | 类型 | 说明 | |------|------|------| | restDays | int | 剩余使用天数 | ```json { "restDays": 0 } ``` ### 控制器序列号更新 **命令字:** `0x10B8` | 字段 | 类型 | 说明 | |------|------|------| | license | string | 控制器序列号 | ```json { "license": "ACOCWKBZHSKBEJHI" } ``` **控制器回复** **命令字:** `0x10B9` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 更新结果,"success" 成功,"ivalid" 非法密钥,"notInit" 未初始化 | | ivalid | string | 无效的密钥 | | error | string | 存在破解嫌疑,拒绝解锁 | ```json { "result": "success", "ivalid": "无效的密钥!", "error": "存在破解嫌疑,拒绝解锁!" } ``` > 密钥更新成功后,控制器即将重启。 ### 控制器无权使用信息 **命令字:** `0x10BA` | 字段 | 类型 | 说明 | |------|------|------| | reason | string | 控制器无权使用原因 | ```json { "reason": "" } ``` ### 获取控制器基础信息 **命令字:** `0x10C0` - 无需发送数据 **控制器回复** **命令字:** `0x10C1` | 字段 | 类型 | 说明 | |------|------|------| | controllerID | string | 控制器 ID | | controllerModel | string | 控制器型号 | ```json { "controllerID": "1234567890ABCDEF", "controllerModel": "C2201" } ``` ### 获取控制器支持的机器人类型和工艺 **命令字:** `0x10C2` - 无需发送数据 **控制器回复** **命令字:** `0x10C3` | 字段 | 类型 | 说明 | |------|------|------| | maxRobotSum | int | 最大机器人总数,范围 [0,4] | | robotTypeEn | string[] | 支持的机器人类型英文 | | robotTypeCn | string[] | 支持的机器人类型中文 | | craftTypeEn | string[] | 支持的所有工艺英文 | | craftTypeCn | string[] | 支持的所有工艺中文 | ```json { "maxRobotSum": 4, "robotTypeEn": ["RobotA", "RobotB"], "robotTypeCn": ["机器人A", "机器人B"], "craftTypeEn": ["pallet", "weld"], "craftTypeCn": ["码垛", "焊接"] } ``` ### 获取控制器授权信息 **命令字:** `0x10C4` - 无需发送数据 **控制器回复** **命令字:** `0x10C5` | 字段 | 类型 | 说明 | |------|------|------| | isInit | bool | 是否初始化 | | expirationDate | object | 到期日期 | | expirationDate.year | int | 到期年份 | | expirationDate.month | int | 到期月份 | | expirationDate.day | int | 到期日 | | maxRobotSum | int | 最大机器人数,范围 [0,4] | | robotType | string[] | 机器人类型 | | craftType | string[] | 工艺类型 | ```json { "isInit": true, "expirationDate": { "year": 2038, "month": 1, "day": 31 }, "maxRobotSum": 4, "robotType": ["RobotA", "RobotB"], "craftType": ["pallet", "weld"] } ``` ### 传输初始化密钥 **命令字:** `0x10C6` | 字段 | 类型 | 说明 | |------|------|------| | permissionType | string | 许可类型 | | license | string | 密钥 | ```json { "permissionType": "01", "license": "DSFPSKDGSJDFSGDSGJDSDF" } ``` **控制器回复** **命令字:** `0x10C7` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 密钥结果,"success" 成功,"ivalid" 非法密钥,"deviceAbnormal" 控制器异常 | | data | string | 控制器数据 | ```json { "result": "success", "data": "123ABC" } ``` ### 传输解密密钥 **命令字:** `0x10C8` | 字段 | 类型 | 说明 | |------|------|------| | license | string | 密钥 | ```json { "license": "DSFPSKDGSJDFSGDSGJDSDF" } ``` **控制器回复** **命令字:** `0x10C9` | 字段 | 类型 | 说明 | |------|------|------| | result | string | 结果,"success" 成功,"ivalid" 非法密钥,"notInit" 未初始化 | ```json { "result": "success" } ``` ### 获取离线权限文件内容 **命令字:** `0x10CA` - 无需发送数据 **控制器回复** **命令字:** `0x10CB` | 字段 | 类型 | 说明 | |------|------|------| | data | string | 权限文件内容 | ```json { "data": "xxxxxxxx" } ``` --- # 报错 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/02.%E6%8A%A5%E9%94%99.html ## 概述 控制器通过 JSON 协议向上位机上报各类错误、警告和消息提示。上位机也可以通过协议命令清除伺服错误。本章详细说明错误码的分类体系、上报机制和处理流程。 --- ## 错误码分类 系统错误码按照功能域和严重程度进行分类,便于快速定位和处理问题。 ### 按严重程度分类 | 种类 | kind 值 | 说明 | 典型场景 | |------|---------|------|----------| | 消息 | 0 | 普通信息提示,不影响系统运行 | 日志记录、操作成功提示、状态变更通知 | | 警告 | 1 | 警告信息,系统可继续运行但需关注 | 参数配置缺失、备份提醒、接近限位 | | 报错 | 2 | 严重错误,通常需要人工干预才能恢复 | 伺服故障、急停触发、碰撞检测、通信中断 | ### 按功能域分类 | 错误域 | 错误码范围 | 说明 | |--------|-----------|------| | 系统错误 | 0x0000 - 0x0FFF | 系统初始化、配置、版本相关的错误 | | 伺服错误 | 0x1000 - 0x1FFF | 伺服驱动、编码器、电机相关的错误 | | 运动控制错误 | 0x2000 - 0x3FFF | 运动规划、插补、轨迹相关的错误 | | 程序执行错误 | 0x4000 - 0x5FFF | 作业程序解析、执行、变量操作相关的错误 | | 通信错误 | 0x6000 - 0x6FFF | 网络通信、协议解析、端口连接相关的错误 | | 安全错误 | 0x7000 - 0x7FFF | 安全门、急停、光幕等安全设备相关的错误 | | IO 错误 | 0x8000 - 0x8FFF | 数字/模拟输入输出相关的错误 | | 工艺错误 | 0x9000 - 0x9FFF | 焊接、码垛、切割等工艺相关的错误 | ### 常见错误码 | 错误码 | 说明 | 种类 | 处理建议 | |--------|------|------|----------| | 16385 | 机器人参数配置文件不存在 | 警告(1) | 检查配置文件,系统已自动创建默认配置 | | 21764 | 自动备份成功 | 消息(0) | 无需处理,仅为通知 | | 28680 | 指令不存在 | 报错(2) | 检查发送的命令字是否正确 | --- ## 错误上报机制 ### 上报方式 控制器通过以下命令字主动向上位机推送提示信息: | 命令字 | 功能 | 方向 | |--------|------|------| | `0x1110` | 错误提示上报 | 控制器 → 上位机 | | `0x1111` | 警告提示上报 | 控制器 → 上位机 | | `0x1112` | 消息提示上报 | 控制器 → 上位机 | | `0x1113` | 弹窗提示上报 | 控制器 → 上位机 | ### 错误信息字段说明 每个错误/警告/消息都包含以下核心字段: | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 产生错误的机器人编号。0 表示与特定机器人无关(系统级错误) | | `kind` | int | 严重程度:0=消息,1=警告,2=报错 | | `code` | int | 错误编码,用于唯一标识错误类型 | | `data` | string | 人类可读的错误描述信息 | | `param` | int[] | 错误附带的参数,根据具体错误码有不同含义(如轴号、指令字等) | --- ## 清错 清除伺服错误时使用。 ### 清除伺服错误 **命令字:** `0x1100` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x1101` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [1, 4] | | clearErrorFlag | bool | 是否清除成功,true 清除伺服错误成功,false 清除失败 | ```json { "robot": 1, "clearErrorFlag": true } ``` ### 错误处理流程 典型的错误处理流程如下: 1. **错误发生**:控制器检测到异常,通过 `0x1110`/`0x1111`/`0x1112` 上报错误/警告/消息 2. **错误识别**:上位机收到上报后解析 `code` 和 `kind` 字段,确定错误类型和严重程度 3. **错误分类处理**: - **消息(kind=0)**:记录日志,无需特殊处理 - **警告(kind=1)**:提示用户注意,记录日志 - **报错(kind=2)**: - 显示错误弹窗或提示 - 判断是否需要停机或停止当前运动 - 如为伺服错误,可发送 `0x1100` 清错命令 4. **清错操作**:上位机发送 `0x1100` 清除伺服错误,控制器回复 `0x1101` 告知清除结果 5. **恢复运行**:错误清除后,上位机可重新使能并继续执行 > **注意:** 并非所有错误都可以通过 `0x1100` 清除。部分硬件故障、安全联锁错误需要物理排除故障后才能恢复。 --- ## 信息提示 控制器向上位机发送错误提示/警告提示/消息提示/弹窗提示。 ### 错误提示 **命令字:** `0x1110` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者错误内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的错误对应不同的内容 | | code | int | 消息编码 | | param | int[] | 消息内容参数,根据具体编码的不同会有不同个数,预留 5 个 | ```json { "code": 28680, "data": "指令[0x5743]不存在", "kind": 2, "param": [22339, 3], "robot": 0 } ``` ### 警告提示 **命令字:** `0x1111` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者警告内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的警告对应不同的内容 | | code | int | 消息编码 | | param | int[] | 消息内容参数,根据具体编码的不同会有不同个数,预留 5 个 | ```json { "code": 16385, "data": "机器人1参数配置文件不存在,已创建,请配置参数", "kind": 1, "param": [1], "robot": 1 } ``` ### 消息提示 **命令字:** `0x1112` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人编号,取值范围 [0, 4],等于 0 时表示未选择机器人类型或者消息内容与机器人无关 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | data | string | 消息条内容,不同的消息对应不同的内容 | | code | int | 消息编码 | ```json { "code": 21764, "data": "自动备份成功", "kind": 0, "robot": 0 } ``` ### 弹窗提示 **命令字:** `0x1113` | 字段 | 类型 | 说明 | |------|------|------| | count | int | 弹窗按钮数量,最大为 3 | | text1 | string | 弹窗居中显示的主文本 | | text2 | string | 按钮 1 的文本 | | text3 | string | 按钮 2 的文本 | | text4 | string | 按钮 3 的文本 | | kind | int | 弹窗提示种类:0 消息,1 警告,2 报错 | | node | int | 机器人序号,取值范围 [1, 4] | | Tips | bool | 弹窗呼出,true 表示呼出 | ```json { "count": 1, "text1": "示例", "text2": "示例", "text3": "示例", "text4": "示例", "kind": 1, "node": 1, "Tips": true } ``` ### 弹窗交互反馈 根据用户对弹窗的操作进行相应设置。 **命令字:** `0x1114` | 字段 | 类型 | 说明 | |------|------|------| | node | int | 机器人序号,取值范围 [1, 4] | | option | int | 对应弹窗选项 1-3 的内容,取值范围 [1, 3] | ```json { "node": 1, "option": 1 } ``` --- # 操作参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/03.%E6%93%8D%E4%BD%9C%E5%8F%82%E6%95%B0.html ## 概述 操作参数用于配置控制器的运行行为,包括运行模式、预约模式、语言、工艺选择、安全相关等全局设置。上位机通过 `0x1300` 设置参数,通过 `0x1301` 查询参数,控制器通过 `0x1302` 回复当前参数值。 --- ## 参数分类 ### 运行模式参数 控制机器人的启动行为和运行模式切换。 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电:true 自动上电,false 不自动上电 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式:true 允许,false 不允许 | | `changeModePowerOffFlag` | bool | false | 切换模式时是否下电:true 不下电,false 下电 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式:0 单击运行,1 按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | ### 预约与执行参数 控制远程 IO 的程序预约和执行行为。 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式:true 预约模式,false 非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行:true 断电执行,false 断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行:true 当前行执行,false 非当前行执行 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约:true 允许,false 不允许 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列:true 清空,false 不清空 | ### 安全与保护参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效:true 不生效,false 生效 | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位:true 保持,false 不保持 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应超时时间,范围 [0, 100],单位 ms | ### 坐标系与工艺参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标:0 直角坐标系,1 大地坐标系 | | `craftSelect` | string | "general" | 工艺选择:"general" 通用,"special" 专用,"punch" 冲压,"pallet" 码垛,"weld" 焊接,"cut" 切割 | | `autoSetUserAndTool` | bool | false | 点位形态/工具手/用户值设置方式:true 自动,false 手动 | ### 其他参数 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `language` | string | "chinese" | 默认语言:"chinese" 中文,"english" 英文,"korean" 韩文 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位:0 倍数值,1 数值 | | `quickInsert` | bool | false | 快捷指令打开标志:true 打开,false 关闭 | --- ## 1. 运行参数设置 ### 读/写操作说明 操作参数遵循"设置-查询-回复"的标准模式: | 操作 | 命令字(下发) | 命令字(回复) | 说明 | |------|---------------|---------------|------| | 设置参数 | `0x1300` | - | 上位机设置运行参数,控制器保存后生效 | | 查询参数 | `0x1301` | `0x1302` | 上位机查询当前运行参数值,控制器回复 | **命令字:** `0x1300` > **说明:** 上位机通过此命令设置操作参数。参数可按控制器支持的字段组合下发;以下参数表与示例基于已采集的实际设置帧整理。 ### 参数列表 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电;true: 自动上电;false:不自动上电 | | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式;true: 预约模式;false:非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行;true: 断电执行;false:断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行;true: 当前行执行;false:非当前行执行 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式;true: 允许;false:不允许 | | `changeModePowerOffFlag` | bool | false | 切换模式时是否下电;true: 不下电;false:下电 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约;true: 允许;false:不允许 | | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效;true: 不生效;false:生效 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式;0:单击运行;1:按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | | `language` | string | "chinese" | 设置默认语言;"chinese":中文;"english":英文;"korean":韩文 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位;0: 倍数值;1: 数值 | | `craftSelect` | string | "general" | 工艺选择;"general":通用工艺;"special":专用工艺;"punch":冲压工艺;"pallet":码垛工艺;"weld":焊接工艺;"cut":切割工艺 | | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标;0: 直角坐标系;1: 大地坐标系 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列;true: 清空;false:不清空 | | `autoSetUserAndTool` | bool | false | 点位形态/工具手/用户值设置方式;true: 自动;false: 手动 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应时间;取值范围 [0, 100],单位 ms | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位;true: 保持;false: 不保持 | | `quickInsert` | bool | false | 快捷指令打开标志;true: 打开;false: 关闭 | | `DisplayMotorCoordinatePositionAndCalibrationFlag` | bool | false | 是否显示电机坐标位置和标定标志 | | `LineAndAxisSpeedFlag` | bool | true | 直线和轴速度显示/设置标志 | | `OperationmodedisabledFlag` | bool | false | 操作模式禁用标志 | | `ZeroOffsetMode` | int | 0 | 零偏移模式 | | `autoServoEnableAfterStartup` | bool | false | 控制器启动后是否自动使能伺服 | | `defaultTeachModeSpeed` | int | 5 | 示教模式默认速度 | | `double_encoder_enable` | bool | false | 双编码器使能标志 | | `enterInterfaceSelect` | int | 0 | 进入界面选择 | | `servo_power_on_delay_time` | int | 0 | 伺服上电延迟时间 | | `switch_only_note` | bool | false | 仅切换注释标志 | ### 请求示例 ```json { "DisplayMotorCoordinatePositionAndCalibrationFlag": false, "LineAndAxisSpeedFlag": true, "OperationmodedisabledFlag": false, "OutageKeepFunctionFlag": false, "runModeAutoManBegFlag": false, "SetSafeScreenTeachInvalidFlag": false, "ZeroOffsetMode": 0, "accUnitMode": 0, "autoServoEnableAfterStartup": false, "autoSetUserAndTool": true, "base_coord_of_user_coord_": 0, "changeModePowerOffFlag": false, "checkServoStatusWordMaxTime": 0, "craftSelect": "general", "defaultRunningSpeed": 5, "defaultTeachModeSpeed": 5, "double_encoder_enable": false, "enterInterfaceSelect": 0, "keepStepRunFlag": 0, "quickInsert": false, "remoteSwitchModeEnable": false, "servo_power_on_delay_time": 0, "switch_only_note": false } ``` ### 参数生效说明 - 大部分参数设置后**立即生效** - `language` 参数设置后需要重新加载界面才能看到语言变化 - `craftSelect` 参数设置后可能触发工艺相关的模块初始化 - 参数保存在控制器配置文件中,**断电后保持** --- ## 2. 运行参数查询 **命令字:** `0x1301` **请求参数:** 无 **请求示例:** ```json {} ``` **命令字:** `0x1302` > **说明:** 控制器通过此命令回复当前操作参数。以下示例基于已采集的实际回复帧;其中 `keepStepRunFlag` 在该回复帧中为 `bool` 类型。 ### 参数列表 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `runModeAutoManBegFlag` | bool | false | 切到运行模式自动上电;true: 自动上电;false:不自动上电 | | `remoteUseReserveModeFlag` | bool | false | 是否为预约模式;true: 预约模式;false:非预约模式 | | `remoteAllowContinueRunFlag` | bool | true | 远程 IO 断点执行;true: 断电执行;false:断电不执行 | | `remoteAllowCurrentRunFlag` | bool | false | 远程 IO 当前行执行;true: 当前行执行;false:非当前行执行 | | `remoteSwitchModeEnable` | bool | false | 无示教器切远程模式;true: 允许;false:不允许 | | `changeModePowerOffFlag` | bool | false | 切换模式时是否下电;true: 不下电;false:下电 | | `allowReserveRunningPro` | bool | false | 远程 IO 程序运行中再次预约;true: 允许;false:不允许 | | `SetSafeScreenTeachInvalidFlag` | bool | false | 示教模式安全光幕不生效;true: 不生效;false:生效 | | `keepStepRunFlag` | int | 0 | 单步/回零/复位点/运行操作方式;0:单击运行;1:按下运行 | | `defaultRunningSpeed` | int | 1 | 运行模式开机默认速度 | | `accUnitMode` | int | 0 | 关节/笛卡尔参数中最大加速度单位;0: 倍数值;1: 数值 | | `craftSelect` | string | "general" | 工艺选择;"general":通用工艺;"special":专用工艺;"punch":冲压工艺;"pallet":码垛工艺;"weld":焊接工艺;"cut":切割工艺 | | `base_coord_of_user_coord_` | int | 0 | 用户坐标系基准坐标;0: 直角坐标系;1: 大地坐标系 | | `remote_io_reset_clear_all_reserve_program_status_flag` | bool | true | 远程 IO 复位清空预约队列;true: 清空;false:不清空 | | `checkServoStatusWordMaxTime` | int | 0 | 伺服响应时间;取值范围 [0, 100],单位 ms | | `OutageKeepFunctionFlag` | bool | true | 断电保持标志位;true: 保持;false: 不保持 | | `quickInsert` | bool | false | 快捷指令打开标志;true: 打开;false: 关闭 | | `LineAndAxisSpeedFlag` | bool | true | 直线和轴速度显示/设置标志 | | `autoServoEnableAfterStartup` | bool | false | 控制器启动后是否自动使能伺服 | | `autoSetUserAndTool` | bool | false | 点位形态/工具手/用户值设置方式;true: 自动;false: 手动 | | `defaultTeachModeSpeed` | int | 5 | 示教模式默认速度 | | `double_encoder_enable` | bool | false | 双编码器使能标志 | | `enterInterfaceSelect` | int | 0 | 进入界面选择 | | `rebootRunEnable` | bool | false | 重启后运行使能标志 | | `servo_power_on_delay_time` | int | 0 | 伺服上电延迟时间 | | `switch_only_note` | bool | false | 仅切换注释标志 | ### 响应示例 ```json { "LineAndAxisSpeedFlag": true, "SetSafeScreenTeachInvalidFlag": false, "accUnitMode": 0, "autoServoEnableAfterStartup": false, "autoSetUserAndTool": true, "base_coord_of_user_coord_": 0, "changeModePowerOffFlag": false, "checkServoStatusWordMaxTime": 0, "craftSelect": "general", "defaultRunningSpeed": 5, "defaultTeachModeSpeed": 5, "double_encoder_enable": false, "enterInterfaceSelect": 0, "keepStepRunFlag": false, "quickInsert": false, "rebootRunEnable": false, "runModeAutoManBegFlag": false, "servo_power_on_delay_time": 0, "switch_only_note": false } ``` --- # 示教器与上位机的通讯连接 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/04.%E7%A4%BA%E6%95%99%E5%99%A8%E4%B8%8E%E4%B8%8A%E4%BD%8D%E6%9C%BA%E7%9A%84%E9%80%9A%E8%AE%AF%E8%BF%9E%E6%8E%A5.html ## 心跳 > **说明:** 不管什么通讯模式,都应设计心跳模式,确保通讯状态正常。示教盒定期发送心跳检查包给控制器,并等待控制器回应。客户端收到心跳包后需要回复心跳回应包,包数据为检查包所携带的时间戳。示教盒收到回应包后检查数据是否正确。数据不正确或超时为收到回应,则认为连接可能中断。 ### 收到心跳 | 属性 | 类型 | 说明 | |------|------|------| | time | int | 时间戳 | **命令字**:`0x1200` ```json { "time": 123 } ``` ### 回应心跳 | 属性 | 类型 | 说明 | |------|------|------| | time | int | 时间戳 | **命令字**:`0x1201` ```json { "time": 123 } ``` ## 示教器关机 > **说明:** 拔出示教器发送 **命令字**:`0x1210` | 属性 | 类型 | 说明 | |------|------|------| | date | - | 无 | ## 示教器开机 > **说明:** 插入示教盒恢复通信 **命令字**:`0x1211` | 属性 | 类型 | 说明 | |------|------|------| | date | - | 无 | --- # 5000端口协议 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/05.5000%E7%AB%AF%E5%8F%A3%E5%8D%8F%E8%AE%AE.html ## 说明 5000端口协议主要作用于上传、下载、备份文件。 - 若要向控制器上传文件,则上位机通过0x1D00请求上传文件,控制器通过0x1D01回复上传请求,当控制器同意上传时,上位机通过0x1D04上传文件,上传完毕后,上位机通过0x1D05告诉控制器上传结束,控制器通过0x1D06回复确认接收成功。 - 若要下载控制器中的文件,则上位机通过0x1D02请求下载文件,控制器通过0x1D03回复下载请求,当控制器同意下载时,控制器通过0x1D07向上位机传输其申请下载的文件,并且上位机通过0x1D08回复控制器接收结果,下载完毕后,控制器通过0x1D09告诉上位机下载结束,上位机通过0x1D0A 回复确认接收成功。 --- ## 文件传输流程 ### 上传文件流程 ```text 上位机 控制器 | | |--- 0x1D00 请求上传 -------->| |<-- 0x1D01 回复上传请求 -----| | | | (若 answer="yes") | |--- 0x1D04 上传文件数据 ---->| |--- 0x1D04 上传文件数据 ---->| |--- ... (可能多次分包) | |--- 0x1D05 上传结束 -------->| |<-- 0x1D06 确认接收 ---------| ``` ### 下载文件流程 ```text 上位机 控制器 | | |--- 0x1D02 请求下载 -------->| |<-- 0x1D03 回复下载请求 -----| | | | (若 answer="yes") | |<-- 0x1D07 下载文件数据 -----| |--- 0x1D08 回复接收 -------->| |<-- 0x1D07 下载文件数据 -----| |--- 0x1D08 回复接收 -------->| |<-- ... (可能多次分包) | |<-- 0x1D09 下载完成 ---------| |--- 0x1D0A 确认接收 -------->| ``` ### 备份文件流程 ```text 上位机 控制器 | | |--- 0x1D10 请求备份 -------->| |<-- 0x1D11 回复备份文件名 ---| | | | (然后按下载流程下载备份文件) | ``` --- ## 传输机制说明 ### 分包传输 大文件传输时,数据会分为多个数据包进行传输: - **上传 (0x1D04)**:上位机将文件内容分多次发送,每次发送一个数据包 - **下载 (0x1D07)**:控制器将文件内容分多次发送,上位机每次通过 `0x1D08` 回复接收状态 ### 错误处理 在文件传输过程中可能出现的异常情况: | 场景 | 处理方式 | |------|----------| | 控制器忙碌 | `0x1D01` 或 `0x1D03` 返回 `answer: "busy"`,上位机应稍后重试 | | 传输中断 | 通过 `0x1D0B` 断开连接,上位机需要重新发起传输请求 | | 接收失败 | `0x1D06` 或 `0x1D0A` 返回 `finish: false`,需要重新传输 | | 磁盘空间不足 | 控制器在 `0x1D01` 或 `0x1D03` 阶段拒绝请求 | ### 文件类型与路径 | 文件类型 | 路径示例 | 说明 | |----------|----------|------| | 作业文件 | `job/R1/WWWWW.JBR` | 机器人 1 的作业程序文件 | | 系统配置 | `config/` | 系统参数配置文件 | | 日志文件 | `log/` | 系统运行日志 | | 备份文件 | `controller.tar.gz` | 控制器全量备份包 | | ENI 文件 | `eni/` | 网络配置文件 | > **注意:** 下载作业文件时,文件名需包含完整的控制器内部路径。 --- ## 命令列表 | 命令字 | 功能 | 方向 | |--------|------|------| | 0x1D00 | 上位机请求上传文件 | 上位机 → 控制器 | | 0x1D01 | 控制器回复上传请求 | 控制器 → 上位机 | | 0x1D02 | 上位机请求下载文件 | 上位机 → 控制器 | | 0x1D03 | 控制器回复下载请求 | 控制器 → 上位机 | | 0x1D04 | 上位机向控制器上传文件 | 上位机 → 控制器 | | 0x1D05 | 上位机告诉控制器上传结束 | 上位机 → 控制器 | | 0x1D06 | 控制器回复确认接收成功 | 控制器 → 上位机 | | 0x1D07 | 控制器向上位机发送申请下载的文件 | 控制器 → 上位机 | | 0x1D08 | 上位机回复接收结果 | 上位机 → 控制器 | | 0x1D09 | 控制器告诉上位机下载完成 | 控制器 → 上位机 | | 0x1D0A | 上位机回复确认接收成功 | 上位机 → 控制器 | | 0x1D0B | 下载连接断开 | - | | 0x1D10 | 上位机请求备份文件 | 上位机 → 控制器 | | 0x1D11 | 控制器回复备份请求 | 控制器 → 上位机 | | 0x1D12 | 上位机发送下载 log 文件完成 | 上位机 → 控制器 | | 0x1D13 | 上位机发送下载 eni 文件完成 | 上位机 → 控制器 | --- ## 详细命令说明 ### 0x1D00 上位机请求上传文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 上位机发送文件的文件名 | | size | int | 上位机发送文件的文件大小 | **请求示例:** ```json { "name": "vxWorks", "size": 4096 } ``` --- ### 0x1D01 控制器回复上传请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 是否同意上传文件请求 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意上传文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes" } ``` --- ### 0x1D02 上位机请求下载文件 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要下载的作业文件名称 | **说明:** 参数 name 是作业文件在控制器中的作业文件路径加上名字。在0x5533和0x5534中系统有向上位机发送路径和名字。示教器提示开始同步作业文件。 **请求示例:** ```json { "name": "job/R1/WWWWW.JBR" } ``` --- ### 0x1D03 控制器回复下载请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 系统是否同意下载文件请求 | | name | string | 需要下载的作业文件名称 | | size | int | 此作业文件的文件大小 | **answer 值说明:** | 值 | 说明 | |----|------| | yes | 同意下载文件请求 | | busy | 控制器忙碌 | **响应示例:** ```json { "answer": "yes", "name": "job/R1/WWWWW.JBR", "size": 217 } ``` --- ### 0x1D04 上位机向控制器上传文件 **方向:** 上位机 → 控制器 **说明:** 上传文件数据 --- ### 0x1D05 上位机告诉控制器上传结束 **方向:** 上位机 → 控制器 --- ### 0x1D06 控制器回复确认接收成功 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否上传成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 上传成功 | | false | 上传失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D07 控制器向上位机发送申请下载的文件 **方向:** 控制器 → 上位机 **说明:** 传输下载文件数据 --- ### 0x1D08 上位机回复接收结果 **方向:** 上位机 → 控制器 --- ### 0x1D09 控制器告诉上位机下载完成 **方向:** 控制器 → 上位机 --- ### 0x1D0A 上位机回复确认接收成功 **方向:** 上位机 → 控制器 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | finish | bool | 判断文件是否下载成功 | **finish 值说明:** | 值 | 说明 | |----|------| | true | 下载成功 | | false | 下载失败 | **响应示例:** ```json { "finish": true } ``` --- ### 0x1D0B 下载连接断开 **说明:** 断开下载连接 --- ### 0x1D10 上位机请求备份文件 **方向:** 上位机 → 控制器 --- ### 0x1D11 控制器回复备份请求 **方向:** 控制器 → 上位机 **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | answer | string | 回复备份文件名 | **响应示例:** ```json { "answer": "controller.tar.gz" } ``` --- ### 0x1D12 上位机发送下载 log 文件完成 **方向:** 上位机 → 控制器 --- ### 0x1D13 上位机发送下载 eni 文件完成 **方向:** 上位机 → 控制器 --- # 7000 端口协议 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/06.7000%E7%AB%AF%E5%8F%A3%E5%8D%8F%E8%AE%AE.html ## 概述 ### 数据帧结构 | 项目 | 长度 (Byte) | 说明 | |------|------------|------| | SyncByte | 2 | `0x4E66` 固定包头 | | Length | 2 | 16进制长度 `0`–`0xffff`;不包含数据头和命令字,不包含 CRC 段 | | Command | 2 | 命令字 | | data | Length | 数据段(主要为 JSON 数据格式) | | CRC | 4 | 对不含包头数据做 CRC 校验(CRC32) | ### 通讯协议配置 7000 端口可选择 **TCP** 和 **UDP** 两种通讯协议,通过进入控制器后台修改配置文件 `config/controller.json`,在 `hostComputerService` 节点下: - `socketType`:socket 类型,可选 `"TCP"` 或 `"UDP"`,默认为 `"TCP"` - `checkCRC`:是否进行 CRC 检测;`false` 时不检测 CRC(但 CRC 所占用的 4 个字节仍需发送),默认为 `true` > 查询状态可设置为 UDP 通讯进行数据获取,最小周期可达 1ms。 --- ## 命令字总览 | 命令字 | 方向 | 功能 | |--------|------|------| | `0x1E00` | 上位机 → 控制器 | 查询状态 | | `0x1E01` | 控制器 → 上位机 | 查询状态回复 | | `0x1E02` | 上位机 → 控制器 | 运动控制 | | `0x1E03` | 控制器 → 上位机 | 运动控制回复 | | `0x1E04` | 上位机 → 控制器 | 变量、IO 控制 | | `0x1E10` | 上位机 → 控制器 | 开关伺服点位运动控制 | | `0x1E11` | 控制器 → 上位机 | 开关伺服点位运动控制回复 | | `0x1E12` | 上位机 → 控制器 | 点位发送 | | `0x1E13` | 控制器 → 上位机 | 点位发送回复 | --- ## 1. 查询状态(`0x1E00`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `channel` | int | 通道;最多 9 个通道,默认为 `1` | | `stop` | int | 停止发送;为 `1` 时停止之前的持续发送,下面的数据可不发 | | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `mode` | int | 请求回复模式;`0`:应答(请求一次回复一次),`1`:持续(请求一次持续回复) | | `interval` | int | 持续回复间隔时间(ms);仅 `mode=1` 时有效,范围 `[1, 60000]` | | `queryType` | string[] | 查询运行参数列表,无需查询的不写 | | `typeCfg` | object | 查询内容配置,仅需要查询相关类型数据时有效 | #### `queryType` 可选值 | 值 | 说明 | |----|------| | `realPosACS` | 实时坐标位置(关节坐标系) | | `realPosMCS` | 实时坐标位置(直角坐标系) | | `realPosPCS` | 实时坐标位置(工具坐标系) | | `realPosUCS` | 实时坐标位置(用户坐标系) | | `axisVel` | 轴速度 | | `axisAcc` | 轴加速度 | | `torque` | 力矩 | | `electric` | 电流 | | `numGVar` | 数值变量 | | `IO` | IO 端口 | | `serialNum` | 序列号 | | `runControlPosRunNum` | 运动控制当前轨迹已运行点位数 | | `detailedMotionPos` | 详细运动点位(每个机器人同一时刻仅支持一个通道查询) | #### `typeCfg` 配置说明 - `numGVar`:查询全局变量(int 类型),如 `["GD001", "GA001", "GI001", "GI333"]` - `IO`:查询 IO 端口(string 类型),如 `["DI1", "DI16", "DO1", "DO3", "DO17"]`;若查询的 IO 不存在,返回 `-1`;可查询最大数量不应大于 IO 个数 - `detailedMotionPos`: - `num`:每帧数据回复的点位数目(int) - `optional`:可选参数(string[]),可选 `"ACS"`、`"MCS"`、`"time"`、`"reset"` ### 请求示例 ```json { "channel": 1, "stop": 1, "robot": 1, "mode": 0, "interval": 10, "queryType": [ "realPosACS", "realPosMCS", "realPosPCS", "realPosUCS", "axisVel", "axisAcc", "torque", "electric", "numGVar", "IO", "serialNum", "runControlPosRunNum", "detailedMotionPos" ], "typeCfg": { "numGVar": ["GD001", "GA001", "GI001", "GI333"], "IO": ["DI1", "DI16", "DO1", "DO3", "DO17"], "detailedMotionPos": { "num": 10, "optional": ["ACS", "MCS", "time", "reset"] } } } ``` --- ## 2. 查询状态回复(`0x1E01`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `channel` | int | 通道;最多 9 个通道 | | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `replyData` | object | 回复查询的结果;未查询的不会回复 | #### 坐标数据说明 坐标格式:**机器人(前 7 个)+ 外部轴(后 5 个)** - 无外部轴时,坐标个数为轴数 - 有外部轴时,坐标个数为 `7 + 外部轴个数` #### `replyData` 字段详情 | 字段 | 说明 | |------|------| | `realPosACS` | 实时坐标位置(关节坐标系),float 数组 | | `realPosMCS` | 实时坐标位置(直角坐标系),float 数组 | | `realPosPCS` | 实时坐标位置(工具坐标系),float 数组 | | `realPosUCS` | 实时坐标位置(用户坐标系),float 数组 | | `axisVel` | 轴速度,float 数组 | | `axisAcc` | 轴加速度,float 数组 | | `torque` | 力矩,float 数组 | | `electric` | 电流,float 数组 | | `numGVar` | 全局变量键值对,如 `{"GD001": 0.1, "GA001": true, "GI001": 33}` | | `IO` | IO 状态键值对,如 `{"DI1": 1, "DO1": 0}`;若 IO 不存在返回 `-1` | | `runControlPosRunNum` | 运动控制当前轨迹已运行点位数 | | `serialNum` | 序列号;每次回复加 1,每个通道互相独立 | | `detailedMotionPos` | 详细运动点位 | #### `detailedMotionPos` 详情 - `num`:每帧数据回复的点位数目(int) - `data`:点位数组,每个点位包含: - `ACS`:关节坐标,float 数组 - `MCS`:直角坐标,float 数组 - `time`:时间戳 `[秒, 纳秒]`,如 `[123456, 654321]` ### 回复示例 ```json { "channel": 1, "robot": 1, "replyData": { "realPosACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosMCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosPCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "realPosUCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "torque": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "electric": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "numGVar": {"GD001": 0.1, "GA001": true, "GI001": 33, "GI333": -55}, "IO": {"DI1": 1, "DI16": 0, "DO1": 0, "DO3": 1, "DO17": -1}, "runControlPosRunNum": 0, "serialNum": 1, "detailedMotionPos": { "num": 10, "data": [ { "time": [123456, 654321], "ACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "MCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] } ] } } } ``` --- ## 3. 运动控制(`0x1E02`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `clearBuffer` | int | 清空运动轨迹缓存队列;`1`:清空(不影响当前正在传输的数据),`0` 时可不发 | | `targetMode` | int | 运动模式;`0`:独立点位,`1`:连续轨迹 | | `sendMode` | int | `0`:一次传输完全部轨迹点位,`1`:每次传输部分点位 | | `runMode` | int | 每次传输部分点位时有效;`0`:接收完轨迹再运动,`1`:边接收边运动 | | `end` | int | `1`:停止之前的持续传输,下面的数据可不发;`0` 时可不发此字段 | | `sum` | int | 仅"接收完轨迹再运动"时有效;总共要发的帧数 | | `count` | int | 仅"接收完轨迹再运动"时有效;当前为第几帧 | | `cfg` | object | 运动配置(仅需第一帧设置,且仅第一帧有效) | | `targetPos` | float[] | 单目标点(使用此节点只走一个目标点) | | `targetVec` | object[] | 多目标点(按顺序走完所有点位;与 `targetPos` 同时存在时,仅 `targetPos` 生效) | #### `cfg` 字段详情 | 字段 | 类型 | 说明 | |------|------|------| | `coord` | string | 坐标系,如 `"ACS"` | | `extMove` | int | 是否有外部轴运动;`1`:有,`0` 或不写:无 | | `sync` | int | 外部轴是否同步;`0` 或不写:不同步,`1`:同步 | | `speed` | int | 速度设定;不写则使用默认值 | | `acc` | int | 加速度设定;不写则使用默认值 | | `pl` | int | 不写则默认 `5`;仅"独立点位"且使用 `targetVec` 时有效 | | `moveMode` | string | 运动模式;可选 `"TeachSet"`、`"MOVJ"`、`"MOVL"`、`"MOVS"`,默认 `"TeachSet"`;仅"独立点位"且使用 `targetVec` 时有效 | | `timeout` | int | 超时时间(ms),不写则不检测超时,范围 `10–10000`;仅"接收完轨迹再运动"时有效 | ### 示例一:独立点位 · 一次传输全部点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet" }, "targetPos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] // targetPos 和 targetVec 同时存在时,仅 targetPos 生效 } ``` ### 示例二:独立点位 · 每次传输部分点位 · 接收完轨迹再运动 ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 0, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "pl": 5, "moveMode": "TeachSet", "timeout": 100 }, "targetVec": [ {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}, {"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]} ] } ``` ### 示例三:连续轨迹 · 一次传输全部点位 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 1, "sendMode": 0, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 }, { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` > `timeStamp`:运行到该点位时相对于起始点的时间(ms) ### 示例四:连续轨迹 · 每次传输部分点位 · 接收完轨迹再运动 ```json { "robot": 1, "clearBuffer": 1, "end": 0, "targetMode": 1, "sendMode": 1, "runMode": 0, "sum": 10, "count": 1, "cfg": { "coord": "ACS", "extMove": 0, "sync": 0, "speed": 100, "acc": 100, "timeout": 100 }, "targetVec": [ { "pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], "timeStamp": 10 } ] } ``` --- ## 4. 运动控制回复(`0x1E03`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `success` | bool | `true`:成功,`false`:失败 | | `size` | int | 运动轨迹缓存队列的当前轨迹数目;仅 `success=true` 时有该项 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"busy"` | 当前有未传输完成的数据 | | `"timeout"` | 接收超时 | | `"dataErr"` | 数据错误 | | `"termination"` | 发送端终止了正在传输的数据 | ### 回复示例 ```json { "robot": 1, "success": false, "size": 1, "cause": "timeout" } ``` --- ## 5. 变量、IO 控制(`0x1E04`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `numGVar` | object | 设置变量;`GA` 为 bool 型,`GI` 为 int 型,`GD` 为 double 型 | | `IO` | object | 设置 IO 口;`1`/`0` 表示 IO 口状态 | ### 请求示例 ```json { "numGVar": { "GA001": true, "GI033": 6, "GD666": -2.33 }, "IO": { "DO1": 1, "DO13": 0 } } ``` --- ## 6. 开关伺服点位运动控制(`0x1E10`) > **注意:** 该功能和"运动控制"功能(`0x1E02`)不可同时使用。 ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `switch` | bool | `true`:开启,`false`:关闭 | ### 请求示例 ```json { "robot": 1, "switch": true } ``` --- ## 7. 开关伺服点位运动控制回复(`0x1E11`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `success` | bool | `true`:成功,`false`:失败 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"busy"` | 当前通道被占用 | | `"dataErr"` | 数据错误 | | `"startupErr"` | 启动失败 | ### 回复示例 ```json { "success": false, "cause": "busy" } ``` --- ## 8. 点位发送(`0x1E12`) ### 请求字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `end` | int | `1`:停止之前的持续传输,下面的数据可不发;`0` 时可不发此字段。在点位未传输完毕时,会清空之前接收到的数据,重新等待新的点位队列 | | `sum` | int | 总共要发的帧数 | | `count` | int | 当前的帧数 | | `PosVec` | float[][] | 点位坐标数组;格式:机器人(前 7 个)+ 外部轴(后 5 个) | ### 请求示例 ```json { "robot": 1, "end": 1, "sum": 10, "count": 1, "PosVec": [ [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5], [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5] ] } ``` --- ## 9. 点位发送回复(`0x1E13`) ### 回复字段说明 | 字段 | 类型 | 说明 | |------|------|------| | `robot` | int | 机器人编号;取值范围 `[1, 4]` | | `success` | bool | `true`:接收成功,`false`:接收失败 | | `cause` | string | 失败原因(成功时为空) | #### `cause` 失败原因 | 值 | 说明 | |----|------| | `"notStart"` | 未开启伺服点位运动控制模式 | | `"dataErr"` | 数据错误 | | `"termination"` | 发送端终止了正在传输的数据 | | `"cacheFull"` | 缓存区已满(最大缓存 6 条轨迹) | ### 回复示例 ```json { "robot": 1, "success": false, "cause": "dataErr" } ``` ## 附录一:TLV 协议格式详解 ### TLV 结构 7000 端口协议采用 **TLV(Type-Length-Value)** 封装的二进制帧结构,由以下字段组成: | 字段 | 偏移 | 长度 (Byte) | 说明 | |------|------|------------|------| | SyncByte | 0 | 2 | 同步头/魔数,固定值 `0x4E66`,用于帧同步 | | Length | 2 | 2 | 数据长度,大端序(Big-Endian),范围 `0`–`0xFFFF`;表示 Data 段的字节数 | | Command | 4 | 2 | 命令字,大端序,标识该帧的功能类型 | | Data | 6 | Length | 数据段,JSON 格式的 UTF-8 编码字符串 | | CRC | 6 + Length | 4 | CRC32 校验值,大端序;对 Command + Data 段计算 | ### 帧结构图示 ```text +----------+----------+----------+-----------+------------+ | SyncByte | Length | Command | Data | CRC | | 2 Bytes | 2 Bytes | 2 Bytes | N Bytes | 4 Bytes | +----------+----------+----------+-----------+------------+ | | CRC 校验范围 | +----------+--------------------------------------------+ ``` ### 字节序说明 - **Length**:大端序(Big-Endian),即高位字节在前 - **Command**:大端序 - **CRC**:大端序 ### 示例:查询状态帧 上位机发送查询状态请求(命令字 `0x1E00`): ```text | 0x4E 0x66 | 0x00 0x3C | 0x1E 0x00 | {...JSON...} | CRC32 | ``` 其中: - `SyncByte = 0x4E66` - `Length = 0x003C`(60 字节,即 JSON 数据的长度) - `Command = 0x1E00` - `Data` = 60 字节的 JSON 字符串 - `CRC` = 对 Command + Data 共 62 字节的 CRC32 校验值 ## 附录二:CRC32 校验说明 ### 校验范围 CRC 校验覆盖 **Command(2 字节)+ Data(Length 字节)**,不包含 SyncByte 和 Length 字段,也不包含 CRC 自身。 ### 校验算法 使用标准 **CRC-32** 算法,多项式为 `0x04C11DB7`。 ### 校验配置 通过修改配置文件 `config/controller.json` 中 `hostComputerService.checkCRC` 字段: - `true`(默认):启用 CRC 校验,数据帧必须包含正确的 CRC 值 - `false`:不进行 CRC 校验,但 CRC 所占用的 4 个字节仍需发送(可填充任意值) ### CRC 计算示例(伪代码) ```text function calcCRC32(data, length): crc = 0xFFFFFFFF for i in range(length): crc = crc ^ data[i] for j in range(8): if (crc & 1): crc = (crc >> 1) ^ 0xEDB88320 else: crc = crc >> 1 return crc ^ 0xFFFFFFFF ``` ## 附录三:通讯建立与握手流程 ### TCP 模式下的连接建立 1. **上位机发起 TCP 连接**:连接到控制器的 7000 端口(默认 IP 为控制器 IP) 2. **TCP 三次握手完成**:建立可靠的 TCP 连接 3. **数据帧传输**:按照 TLV 格式发送/接收数据帧 4. **心跳维持**:通过持续查询状态或定时发送数据保持连接 ### UDP 模式下的通讯 1. **无连接通讯**:UDP 模式下无需建立连接,直接发送数据帧 2. **端口绑定**:上位机绑定本地端口,控制器回复到该端口 3. **丢包处理**:UDP 不保证可靠传输,适合高频状态查询(最小周期 1ms) 4. **推荐用途**:高频状态查询场景使用 UDP,运动控制使用 TCP ### 持续模式下的通讯(mode=1) 1. 发送查询状态请求(`0x1E00`,`mode=1`),设置 `interval`(回复间隔) 2. 控制器按照 `interval` 周期持续回复状态数据(`0x1E01`) 3. 发送 `stop=1` 的请求停止持续回复 4. 每个通道独立维护 `serialNum`(序列号),每次回复递增 1 ## 附录四:命令字编址规则 ### 命令字结构 7000 端口的命令字采用 2 字节(16 位)编码,按功能分为以下段: | 范围 | 功能类别 | 说明 | |------|----------|------| | `0x1E00`–`0x1E0F` | 状态查询与控制 | 基本状态查询、运动控制、IO/变量控制 | | `0x1E10`–`0x1E1F` | 伺服点位运动 | 开关伺服、点位发送与接收 | ### 命令字对应关系 | 命令字 | 方向 | 功能 | |--------|------|------| | `0x1E00` | 上位机 → 控制器 | 查询状态 | | `0x1E01` | 控制器 → 上位机 | 查询状态回复 | | `0x1E02` | 上位机 → 控制器 | 运动控制 | | `0x1E03` | 控制器 → 上位机 | 运动控制回复 | | `0x1E04` | 上位机 → 控制器 | 变量、IO 控制 | | `0x1E10` | 上位机 → 控制器 | 开关伺服点位运动控制 | | `0x1E11` | 控制器 → 上位机 | 开关伺服点位运动控制回复 | | `0x1E12` | 上位机 → 控制器 | 点位发送 | | `0x1E13` | 控制器 → 上位机 | 点位发送回复 | ### 命令字编址规则 - 请求命令字为偶数(如 `0x1E00`、`0x1E02`) - 回复命令字为对应的奇数(如 `0x1E01`、`0x1E03`) - 上位机 → 控制器方向为偶数命令字 - 控制器 → 上位机方向为奇数命令字 ## 附录五:常见通讯配置示例 ### 示例 1:TCP 模式高频状态查询 上位机通过 TCP 连接 7000 端口,以 10ms 间隔持续查询机器人实时位置: ```json { "channel": 1, "stop": 0, "robot": 1, "mode": 1, "interval": 10, "queryType": ["realPosACS", "realPosMCS", "axisVel", "axisAcc"] } ``` ### 示例 2:UDP 模式最低延迟查询 将配置文件 `socketType` 设置为 `"UDP"`,以 1ms 间隔查询,用于高速数据采集: ```json { "channel": 1, "robot": 1, "mode": 1, "interval": 1, "queryType": ["realPosACS", "torque", "electric"] } ``` ### 示例 3:单次查询全局变量和 IO ```json { "channel": 1, "robot": 1, "mode": 0, "queryType": ["numGVar", "IO"], "typeCfg": { "numGVar": ["GD001", "GI001"], "IO": ["DI1", "DI2", "DO1", "DO2"] } } ``` ### 示例 4:运动控制 - 单点位运动 ```json { "robot": 1, "clearBuffer": 1, "targetMode": 0, "cfg": { "coord": "MCS", "extMove": 0, "speed": 50, "acc": 80 }, "targetPos": [100.0, 200.0, 300.0, 0.0, 0.0, 0.0, 0.0] } ``` ### 推荐配置 | 场景 | 协议 | 间隔 | checkCRC | 说明 | |------|------|------|----------|------| | 实时监控(低延迟) | UDP | 1–5ms | false | 丢包容忍,最低延迟 | | 实时监控(可靠) | TCP | 10–20ms | true | 保证数据完整 | | 运动控制 | TCP | 按需 | true | 需可靠传输 | | 批量数据采集 | TCP | 50–100ms | true | 低频持续采集 | --- # 其他 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/07.%E5%85%B6%E4%BB%96.html ## 自定义接口 **说明:** rtl-24.03 控制器为客户提供 15 个空的接口,可供客户自定义使用。 ### 协议号列表 | 序号 | 协议号 | |------|----------| | 1 | 0x1F00 | | 2 | 0x1F01 | | 3 | 0x1F02 | | 4 | 0x1F03 | | 5 | 0x1F04 | | 6 | 0x1F05 | | 7 | 0x1F06 | | 8 | 0x1F07 | | 9 | 0x1F08 | | 10 | 0x1F09 | | 11 | 0x1F0A | | 12 | 0x1F0B | | 13 | 0x1F0C | | 14 | 0x1F0D | | 15 | 0x1F0E | --- # 安全参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/08.%E5%AE%89%E5%85%A8%E5%8F%82%E6%95%B0.html > **说明:** 安全参数用于配置机器人各轴的软限位角度范围,是保障机器人运动安全的关键配置。 --- ## 概述 安全参数主要用于设置机器人各关节轴的软限位(正向最大角度和负向最大角度)。当机器人关节运动超出设定的软限位范围时,控制器将触发安全保护机制,停止当前运动并上报错误。 ### 安全参数分类 | 类别 | 说明 | 相关命令 | |------|------|----------| | 关节软限位 | J1-J6 各轴正向/负向最大角度限制 | `0x1400`/`0x1401`/`0x1402` | | 安全 IO | 安全门、急停、光幕等安全输入信号 | 参见 IO 协议文档 | | 速度限制 | 各轴最大速度、笛卡尔最大速度 | 参见运动控制文档 | | 工作空间限制 | 笛卡尔空间范围限制 | 参见干涉区文档 | --- ## 关节软限位 ### 功能说明 关节软限位是在控制器软件层面设置的各轴运动范围限制。与机械限位(物理挡块)不同,软限位由控制器实时监控,当关节角度超出软限位范围时: 1. 控制器立即停止当前运动 2. 上报软限位错误提示 3. 需要手动将机器人移回安全工作范围后才能恢复 > **注意:** 软限位值应在机械限位范围内设置,否则软限位将无法起到保护作用。默认情况下,各轴软限位范围为 [-360°, 360°](即 [-2π, 2π] 弧度)。 ### 配置建议 | 轴 | 典型范围 | 说明 | |----|----------|------| | J1 | [-170°, 170°] | 基座旋转轴 | | J2 | [-90°, 155°] | 大臂俯仰轴 | | J3 | [-80°, 90°] | 小臂俯仰轴 | | J4 | [-180°, 180°] | 手腕旋转轴 | | J5 | [-120°, 120°] | 手腕俯仰轴 | | J6 | [-360°, 360°] | 手腕末端旋转轴 | --- ## 安全 IO 概述 安全 IO 是机器人控制系统中的关键安全信号入口,包括: | 安全信号 | 说明 | 触发后行为 | |----------|------|-----------| | 急停 (E-Stop) | 紧急停止按钮信号 | 立即切断伺服电源,所有运动停止 | | 安全门 (Safety Gate) | 安全门/围栏状态信号 | 根据模式:示教模式下允许操作,运行模式下触发急停 | | 安全光幕 (Light Curtain) | 安全光幕遮挡信号 | 类似安全门,检测到遮挡时触发安全停止 | | 使能开关 (Enable Switch) | 三段式使能开关 | 示教器上的安全使能装置 | ### 安全信号优先级 安全信号的优先级从高到低为: 1. **急停**:最高优先级,硬件级别切断伺服电源 2. **安全门/光幕**:软件级别,根据运行模式处理 3. **软限位**:软件级别,仅限制运动范围 --- ## 设置安全参数(上位机 → 控制器) **命令字:** `0x1400` | 参数 | 类型 | 说明 | |----------|--------|--------------------------| | `J1 Max` | double | J1 轴正向最大角度,弧度 | | `J1 Min` | double | J1 轴负向最大角度,弧度 | | `J2 Max` | double | J2 轴正向最大角度,弧度 | | `J2 Min` | double | J2 轴负向最大角度,弧度 | | `J3 Max` | double | J3 轴正向最大角度,弧度 | | `J3 Min` | double | J3 轴负向最大角度,弧度 | | `J4 Max` | double | J4 轴正向最大角度,弧度 | | `J4 Min` | double | J4 轴负向最大角度,弧度 | | `J5 Max` | double | J5 轴正向最大角度,弧度 | | `J5 Min` | double | J5 轴负向最大角度,弧度 | | `J6 Max` | double | J6 轴正向最大角度,弧度 | | `J6 Min` | double | J6 轴负向最大角度,弧度 | | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "J1 Max": 3.14, "J1 Min": -3.14, "J2 Max": 3.14, "J2 Min": -3.14, "J3 Max": 3.14, "J3 Min": -3.14, "J4 Max": 3.14, "J4 Min": -3.14, "J5 Max": 3.14, "J5 Min": -3.14, "J6 Max": 3.14, "J6 Min": -3.14, "robot": 1 } ``` ### 使用注意事项 1. **单位转换**:安全参数中的角度单位为**弧度**,设置时需要将度数值转换为弧度值(乘以 π/180) 2. **范围检查**:Max 值必须大于 Min 值,否则设置将无效 3. **即时生效**:参数设置后立即生效,无需重启控制器 4. **多机器人**:每个机器人(robot 1-4)需要单独设置安全参数 --- ## 查询安全参数(上位机 → 控制器) **命令字:** `0x1401` | 参数 | 类型 | 说明 | |---------|------|---------------------------| | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "robot": 1 } ``` --- ## 安全参数回复(控制器 → 上位机) **命令字:** `0x1402` | 参数 | 类型 | 说明 | |----------|--------|--------------------------| | `J1 Max` | double | J1 轴正向最大角度,弧度 | | `J1 Min` | double | J1 轴负向最大角度,弧度 | | `J2 Max` | double | J2 轴正向最大角度,弧度 | | `J2 Min` | double | J2 轴负向最大角度,弧度 | | `J3 Max` | double | J3 轴正向最大角度,弧度 | | `J3 Min` | double | J3 轴负向最大角度,弧度 | | `J4 Max` | double | J4 轴正向最大角度,弧度 | | `J4 Min` | double | J4 轴负向最大角度,弧度 | | `J5 Max` | double | J5 轴正向最大角度,弧度 | | `J5 Min` | double | J5 轴负向最大角度,弧度 | | `J6 Max` | double | J6 轴正向最大角度,弧度 | | `J6 Min` | double | J6 轴负向最大角度,弧度 | | `robot` | int | 机器人编号,取值范围 `[1, 4]` | **示例:** ```json { "J1 Max": 3.14, "J1 Min": -3.14, "J2 Max": 3.14, "J2 Min": -3.14, "J3 Max": 3.14, "J3 Min": -3.14, "J4 Max": 3.14, "J4 Min": -3.14, "J5 Max": 3.14, "J5 Min": -3.14, "J6 Max": 3.14, "J6 Min": -3.14, "robot": 1 } ``` --- ## 安全验证流程 建议按照以下流程进行安全参数配置和验证: 1. **读取当前参数**:通过 `0x1401` 查询现有安全参数配置 2. **确认机械限位**:确认各轴机械限位的实际范围 3. **设置软限位**:通过 `0x1400` 设置软限位,确保在机械限位范围内 4. **慢速验证**:以低速手动移动机器人到各轴极限位置,确认软限位生效 5. **观察报警**:确认超出软限位时控制器正确上报错误 6. **保存配置**:参数自动保存在控制器中,断电不丢失 --- # 语言 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/01.%E7%B3%BB%E7%BB%9F/09.%E8%AF%AD%E8%A8%80.html ## 查询语言支持 **命令字:** `0x1052` **请求参数:** 无 **控制器回复** **命令字:** `0x1053` | 字段 | 类型 | 说明 | |------|------|------| | language | string[] | 控制器支持的语言列表 | | language_used | string | 控制器当前使用的语言 | **语言取值:** | 语言代码 | 说明 | |----------|------| | Chinese | 中文 | | Korean | 韩文 | | English | 英文 | **响应示例:** ```json { "language": ["Chinese", "Korean", "English"], "language_used": "Chinese" } ``` ## 查询上位机当前语言 **命令字:** `0x1054` **请求参数:** | 字段 | 类型 | 说明 | |------|------|------| | teachbox_language | string | 上位机当前使用的语言 | **请求示例:** ```json { "teachbox_language": "Chinese" } ``` ## 支持的语言类型 | 语言代码 | 说明 | |----------|------| | Chinese | 中文 | | Korean | 韩文 | | English | 英文 | --- # DH 参数 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/01.%E5%8F%82%E6%95%B0%E8%AE%BE%E7%BD%AE/01.DH%E5%8F%82%E6%95%B0.html ## 机器人基础参数 > **说明:** 包含有 DH 参数、关节参数、笛卡尔参数等机器人基础参数的设置与查询 --- ## 1. 上位机设置当前机器人 DH 参数 **命令字:** `0x20C0` | 参数名 | 类型 | 说明 | |--------|------|------| | DH | object | DH 参数对象 | | DH.a | array | 连杆长度 a 列表,长度为当前机器人轴数 | | DH.alpha | array | 连杆扭角 alpha 列表,长度为当前机器人轴数 | | DH.d | array | 连杆偏距 d 列表,长度为当前机器人轴数 | | DH.theta | array | 关节角 theta 列表,长度为当前机器人轴数 | | eulerAngle | int | 欧拉角 | | robotNum | int | 当前机器人号,范围[1,4] | **示例 JSON:** ```json { "DH": { "a": [9999.0, 9999.0, 9999.0, 0.0, 0.0], "alpha": [90.0, 0.0, 90.0, 90.0, -90.0], "d": [9999.0, 0.0, 0.0, 9999.0, 0.0], "theta": [0.0, 90.0, 0.0, 0.0, 90.0] }, "eulerAngle": 0, "robotNum": 2 } ``` --- ## 2. 上位机查询当前机器人 DH 参数 **命令字:** `0x20C1` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robotNum": 2 } ``` --- ## 3. 控制器回复上位机当前机器人 DH 参数 **命令字:** `0x20C2` > **说明:** 回复内容与设置内容一致。 **回复示例 JSON:** ```json { "DH": { "a": [9999.0, 9999.0, 9999.0, 0.0, 0.0], "alpha": [90.0, 0.0, 90.0, 90.0, -90.0], "d": [9999.0, 0.0, 0.0, 9999.0, 0.0], "theta": [0.0, 90.0, 0.0, 0.0, 90.0] }, "eulerAngle": 0, "robotNum": 2 } ``` --- ## 5. 上位机发送设置机器人关节参数 **命令字:** `0x20C5` | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人号,范围[1,4] | | jointNum | int | 机器人轴编号,范围[1,7] | | jointParam | object | 关节参数对象 | | jointParam.maxPos | double | 正限位,单位:度或毫米 | | jointParam.minPos | double | 反限位,单位:度或毫米 | | jointParam.reduceRatio | double | 硬件减速比,范围(0,1000](开关关闭时按 1 计算) | | jointParam.reduceRatioEnable | bool | 硬件减速比开关 | | jointParam.encoderResolution | int | 编码器位数(可切换为编码器单圈值 * inc) | | jointParam.encodeResolutionUnit | int | 编码器单位,范围[0,1] | | jointParam.ratedRotSpeed | double | 额定正转速,单位:转/分(可切换为度或毫米/秒) | | jointParam.maxRotSpeed | double | 最大正转速 | | jointParam.maxAcc | double | 最大加速度 | | jointParam.maxDec | double | 最大减速度 | | jointParam.maxAccJerk | double | 最大加加速度 | | jointParam.maxDecJerk | double | 最大减减速度 | | jointParam.angleToDistance | double | 角度距离转换比(可切换为距离角度转换比,两者乘积为 1) | | jointParam.angleToDistanceUnit | int | 距离转换比 0:角度距离转换比 1:整圈距离转换比 | | jointParam.reverseClearance | double | 机械间隙,单位:度或毫米 | | jointParam.motorDirection | int | 电机方向(原模型方向),范围[-1,1] | | jointParam.axisDirection | int | 关节方向(原关节实际方向),范围[-1,1] | **示例 JSON:** ```json { "robotNum": 1, "jointNum": 2, "jointParam": { "maxPos": 120.0, "minPos": -120.0, "reduceRatio": 57.0, "reduceRatioEnable": true, "encoderResolution": 18, "encodeResolutionUnit": 0, "ratedRotSpeed": 1500.0, "maxRotSpeed": 1.0, "maxAcc": 8.0, "maxDec": -8.0, "maxAccJerk": 1.0, "maxDecJerk": -1.0, "angleToDistance": 1.0, "angleToDistanceUnit": 0, "reverseClearance": 0.0, "motorDirection": -1, "axisDirection": 1.0 } } ``` --- ## 6. 上位机查询机器人关节参数 **命令字:** `0x20C6` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人号,范围[1,4] | | jointNum | int | 机器人轴编号,范围[1,7] | **请求示例 JSON:** ```json { "robotNum": 1, "jointNum": 2 } ``` --- **命令字:** `0x20C7`(控制器回复) > 回复参数同设置参数一致,其中 `robotNum` 为实际读取的机器人号,范围[1,4]。 **回复示例 JSON:** ```json { "jointNum": 1, "jointParam": { "angleToDistance": 1.0, "angleToDistanceUnit": 0, "axisDirection": 1.0, "encodeResolutionUnit": 1, "encoderResolution": 0, "maxAcc": 0.0, "maxAccJerk": 0.0, "maxDec": 0.0, "maxDecJerk": 0.0, "maxPos": 0.0, "maxRotSpeed": 0.0, "minPos": 0.0, "motorDirection": 1, "ratedRotSpeed": 0.0, "reduceRatio": 0.0, "reduceRatioEnable": true, "reverseClearance": 0.0 }, "robotNum": 2 } ``` --- ## 7. 上位机发送设置机器人笛卡尔参数 **命令字:** `0x20C8` | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 机器人编号,范围[1,4] | | moveParam | object | 笛卡尔运动参数对象 | | moveParam.interpType | int | 插补方式 | | moveParam.posResolution | double | 绝对位置分辨率(度) | | moveParam.maxLineVel | double | 最大线速度(毫米/秒) | | moveParam.maxLineAcc | double | 最大线加速度(相对最大线速度) | | moveParam.maxLineDec | double | 最大线减速度(相对最大线速度) | | moveParam.maxAttitudeVel | double | 最大姿态速度(度/秒) | | moveParam.decareVelLimitType | int | 速度限制方式,范围[0,1] | | moveParam.minAccTime | int | 最小加速时间(毫秒) | | moveParam.minDecTime | int | 最小减速时间(毫秒) | **示例 JSON:** ```json { "robotNum": 1, "moveParam": { "interpType": 0, "posResolution": 0.001, "maxLineVel": 1000.0, "maxLineAcc": 1.0, "maxLineDec": -1.0, "maxAttitudeVel": 100.0, "decareVelLimitType": 0, "minAccTime": 100, "minDecTime": 100 } } ``` --- ## 8. 上位机查询机器人笛卡尔参数 **命令字:** `0x20C9` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 机器人编号,范围[1,4] | **请求示例 JSON:** ```json { "robotNum": 1 } ``` --- **命令字:** `0x20CA`(控制器回复) > 回复参数同设置参数一致。 --- ## 9. 上位机设置机器人关节多圈值参数 **命令字:** `0x20CB` | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人号,范围[1,4] | | robotAxis | array | 关节多圈值参数列表,长度为当前机器人轴数 | ### robotAxis 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | axisSlaveSum | int | 从动轴数量,范围[0,3] | | enable | int | 编码器多圈值溢出计数功能,范围[0,1](0关闭,1开启) | | encode | array | 编码器最大值最小值列表,长度为关节从动轴数量+1 | ### encode 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | encoderRange | int | 编码器范围 | | encoderType | int | 多圈值类型 | | max | string | 编码器最大值,范围[-2^32,2^32] | | min | string | 编码器最小值,范围[-2^32,2^32](不得大于编码器最大值) | **示例 JSON:** ```json { "robotNum": 1, "robotAxis": [ { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": 0, "encoderType": 0, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": 0, "encoderType": 0, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": 0, "encoderType": 0, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": 0, "encoderType": 0, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": 0, "encoderType": 0, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": 0, "encoderType": 0, "max": "0", "min": "0" } ] } ] } ``` --- ## 10. 上位机查询机器人编码器多圈值参数 **命令字:** `0x20CC` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人号,范围[1,4] | **请求示例 JSON:** ```json { "robotNum": 1 } ``` --- **命令字:** `0x20CD`(控制器回复) ### 回复参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robotNum | int | 当前机器人号,范围[1,4] | | robotAxis | array | 关节多圈值参数列表,长度为当前机器人轴数 | ### robotAxis 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | axisSlaveSum | int | 从动轴数量,范围[0,3] | | enable | int | 编码器多圈值溢出计数功能,范围[0,1](0关闭,1开启) | | encode | array | 编码器信息列表,长度为关节从动轴数量+1 | ### encode 数组元素 | 参数名 | 类型 | 说明 | |--------|------|------| | encoderRange | int | 编码器范围(未设置时为 null) | | encoderResolution | int | 编码器分辨率(未设置时为 0) | | encoderType | int | 多圈值类型(未设置时为 null) | | max | string | 编码器最大值,范围[-2^32,2^32] | | min | string | 编码器最小值,范围[-2^32,2^32](不得大于编码器最大值) | > **说明:** 回复内容在设置参数(0x20CB)基础上,额外返回 `encoderRange`、`encoderResolution`、`encoderType` 字段。实际回复帧包含当前机器人轴数对应的 6 个 `robotAxis` 项,`encoderResolution` 为 23。 **回复示例 JSON:** ```json { "robotNum": 1, "robotAxis": [ { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": null, "encoderResolution": 23, "encoderType": null, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": null, "encoderResolution": 23, "encoderType": null, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": null, "encoderResolution": 23, "encoderType": null, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": null, "encoderResolution": 23, "encoderType": null, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": null, "encoderResolution": 23, "encoderType": null, "max": "0", "min": "0" } ] }, { "axisSlaveSum": 0, "enable": 0, "encode": [ { "encoderRange": null, "encoderResolution": 23, "encoderType": null, "max": "0", "min": "0" } ] } ] } ``` --- ## 11. 上位机申请另存为预置机器人参数文件 **命令字:** `0x20CE` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 机器人类型名称 | | presetRobotName | string | 预置机器人参数自定义名称 | **示例 JSON:** ```json { "name": "R_GENERAL_6S", "presetRobotName": "AAA" } ``` --- ## 12. 上位机查询可选预置参数文件 **命令字:** `0x20D0` > 无请求参数 **请求示例 JSON:** ```json {} ``` --- **命令字:** `0x20D1`(控制器回复) | 参数名 | 类型 | 说明 | |--------|------|------| | presetRobotParamFile | array | 可选预置参数文件名列表 | **回复示例 JSON:** ```json { "presetRobotParamFile": ["pre_robot_1", "pre_robot_2"] } ``` --- ## 13. 上位机设置预置机器人参数 **命令字:** `0x20D2`(PRESET_ROBOT_SET) | 参数名 | 类型 | 说明 | |--------|------|------| | presetRobotParamFile | string | 选预置参数文件 | | jointNum | int | 机器人轴编号,范围[1,7] | | jointParam | object | 关节参数对象 | | jointParam.maxPos | double | 正限位,单位:度或毫米 | | jointParam.minPos | double | 反限位,单位:度或毫米 | | jointParam.reduceRatio | double | 硬件减速比,范围(0,1000](开关关闭时按 1 计算) | | jointParam.reduceRatioEnable | bool | 硬件减速比开关 | | jointParam.encoderResolution | string | 编码器位数(可切换为编码器单圈值 * inc) | | jointParam.encodeResolutionUnit | int | 编码器单位,范围[0,1] | | jointParam.ratedRotSpeed | double | 额定正转速,单位:转/分(可切换为度或毫米/秒) | | jointParam.maxRotSpeed | double | 最大正转速 | | jointParam.maxAcc | double | 最大加速度 | | jointParam.maxDec | double | 最大减速度 | | jointParam.maxAccJerk | double | 最大加加速度 | | jointParam.maxDecJerk | double | 最大减减速度 | | jointParam.angleToDistance | double | 角度距离转换比(可切换为距离角度转换比,两者乘积为 1) | | jointParam.angleToDistanceUnit | int | 角度距离转换单位,范围[0,1] | | jointParam.reverseClearance | double | 机械间隙,单位:度或毫米 | | jointParam.motorDirection | int | 电机方向(原模型方向),范围[-1,1] | | jointParam.axisDirection | int | 关节方向(原关节实际方向),范围[-1,1] | **示例 JSON:** ```json { "presetRobotParamFile": "pre_robot_1", "jointNum": 2, "jointParam": { "maxPos": 120.0, "minPos": -120.0, "reduceRatio": 57.0, "reduceRatioEnable": true, "encoderResolution": 18, "encodeResolutionUnit": "", "ratedRotSpeed": 1500.0, "maxRotSpeed": 1.0, "maxAcc": 8.0, "maxDec": -8.0, "maxAccJerk": 1.0, "maxDecJerk": -1.0, "angleToDistance": 1.0, "angleToDistanceUnit": 0, "reverseClearance": 0.0, "motorDirection": -1, "axisDirection": 1.0 } } ``` --- ## 14. 上位机查询预置机器人参数 **命令字:** `0x20D3`(PRESET_ROBOT_INQUIRE) | 参数名 | 类型 | 说明 | |--------|------|------| | presetRobotParamFile | string | 选预置参数文件 | | jointNum | int | 机器人轴编号,范围[1,7] | **请求示例 JSON:** ```json { "presetRobotParamFile": "pre_robot_1", "jointNum": 2 } ``` --- **命令字:** `0x20D4`(控制器回复) > 回复参数同设置参数一致。 **回复示例 JSON:** ```json { "presetRobotParamFile": "pre_robot_1", "jointNum": 2, "jointParam": { "maxPos": 120.0, "minPos": -120.0, "reduceRatio": 57.0, "reduceRatioEnable": true, "encoderResolution": 18, "encodeResolutionUnit": "", "ratedRotSpeed": 1500.0, "maxRotSpeed": 1.0, "maxAcc": 8.0, "maxDec": -8.0, "maxAccJerk": 1.0, "maxDecJerk": -1.0, "angleToDistance": 1.0, "angleToDistanceUnit": 0, "reverseClearance": 0.0, "motorDirection": -1, "axisDirection": 1.0 } } ``` --- ## 15. 上位机设置预置参数中 DH 参数 **命令字:** `0x20D5` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | presetRobotParamFile | string | - | 预置参数文件 | | DH | object | - | DH 参数对象 | | DH.alpha | array | - | 连杆扭角 alpha 列表,维度为机器人轴数 | | DH.a | array | - | 连杆长度 a 列表,维度为机器人轴数 | | DH.theta | array | - | 关节角 theta 列表,维度为机器人轴数 | | DH.d | array | - | 连杆偏距 d 列表,维度为机器人轴数 | | mountingAngle | double | [0,180] | 机器人安装角 | | eulerAngle | int | [0,11] | 欧拉角 | **示例 JSON:** ```json { "presetRobotParamFile": "pre_robot_1", "DH": { "alpha": [0.0], "a": [0.0], "theta": [0.0], "d": [0.0] }, "mountingAngle": 5.0, "eulerAngle": 6 } ``` --- ## 16. 上位机查询预置参数中 DH 参数 **命令字:** `0x20D6` | 参数名 | 类型 | 说明 | |--------|------|------| | presetRobotParamFile | string | 预置机器人参数文件 | **请求示例 JSON:** ```json { "presetRobotParamFile": "pre_robot_1" } ``` --- **命令字:** `0x20D7`(控制器回复) > 回复参数同设置参数一致。 **回复示例 JSON:** ```json { "presetRobotParamFile": "pre_robot_1", "DH": { "alpha": [0.0], "a": [0.0], "theta": [0.0], "d": [0.0] }, "mountingAngle": 5.0, "eulerAngle": 6 } ``` --- # 运动控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/02.%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6.html ## 伺服状态 ### 说明 - 伺服状态的设置与查询,当前已连接伺服方式的查询 - 当前伺服状态为伺服错误时,无法通过0x3000命令修改伺服状态 - 上位机设置机器人伺服状态 --- #### 上位机设置机器人伺服状态 **命令字:** `0x3000` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | state | int | [0,1] | 伺服状态;0表示伺服停止,1表示伺服就绪 | ```json { "robot": 1, "state": 1 } ``` --- #### 上位机查询机器人伺服状态 **命令字:** `0x3001` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人伺服状态 **命令字:** `0x3002` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,1] | 0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 当前机器人号 | | state | int | [0,3] | 伺服状态;0表示伺服停止,1表示伺服就绪,2表示伺服错误,3表示伺服运行 | ```json { "mode": 0, "robot": 1, "state": 0 } ``` --- #### 上位机查询机器人伺服连接方式 **命令字:** `0x3003` ```json {} ``` --- #### 控制器回复上位机机器人伺服连接方式 **命令字:** `0x3004` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | servoType | int | [0,1] | 0表示实际伺服,1表示虚拟伺服 | ```json { "robot": 1, "servoType": 0 } ``` --- ### 查询伺服连接状态 **命令字:** `0x3005` **控制器回复** | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1,4] | | servoType | int | 当前机器人伺服连接状态:0 实际伺服,1 虚拟伺服 | ```json { "robot": 1, "servoType": 0 } ``` --- ## 操作模式 ### 说明 - 机器人当前操作模式的设置与查询 - 操作模式默认为示教模式 --- #### 上位机设置当前机器人操作模式 **命令字:** `0x3010` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,2] | 操作模式;0表示示教模式,1表示远程模式,2表示运行模式 | ```json { "mode": 0 } ``` --- #### 上位机查询当前机器人操作模式 **命令字:** `0x3011` ```json {} ``` --- #### 控制器回复上位机当前机器人操作模式 **命令字:** `0x3012` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,2] | 操作模式;0表示示教模式,1表示远程模式,2表示运行模式 | ```json { "mode": 0 } ``` --- ## 示教模式 ### 说明 - 示教模式类型的设置与查询 - 拖拽模式运动时切换为点动模式会失败 --- #### 上位机设置当前示教模式类型 **命令字:** `0x3020` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | teachType | int | [0,2] | 示教模式类型;0表示点动(单动),1表示拖拽示教,2表示点动(联动) | ```json { "teachType": 0 } ``` --- #### 上位机查询当前示教模式类型 **命令字:** `0x3021` ```json {} ``` --- #### 控制器回复上位机当前示教模式类型 **命令字:** `0x3022` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | type | int | [0,2] | 示教模式类型;0表示点动(单动),1表示拖拽示教,2表示点动(联动) | ```json { "type": 0 } ``` --- ## 使能 ### 说明 - 使能状态与触发模式的设置与查询 - 触发模式设置为硬件触发时,上下使能端口不能都为0 --- #### 上位机设置使能状态 **命令字:** `0x3030` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadman | int | [0,1] | 上下使能开关;0表示下使能,1表示上使能 | | deadmanmode | int | - | 使能触发方式;默认为0,即软件触发 | ```json { "deadman": 1, "deadmanmode": 0 } ``` --- #### 上位机查询使能状态 **命令字:** `0x3031` ```json {} ``` --- #### 控制器回复上位机使能状态 **命令字:** `0x3032` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadman | int | [0,1] | 上下使能开关;0表示下使能,1表示上使能 | ```json { "deadman": 1 } ``` --- #### 上位机设置机器人使能触发模式 **命令字:** `0x3033` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadmanPortOne | int | [0,端口总数] | 使能端口1(上使能端口) | | deadmanPortTwo | int | [0,端口总数] | 使能端口2(下使能端口),和上使能端口不能同时为0 | | mode | int | [0,1] | 使能触发模式;0为软件触发,1为硬件触发 | | robot | int | [1,4] | 当前机器人号 | ```json { "deadmanPortOne": 14, "deadmanPortTwo": 2, "mode": 0, "robot": 1 } ``` --- #### 上位机查询机器人使能触发方式 **命令字:** `0x3034` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人使能触发方式 **命令字:** `0x3035` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | deadmanPortOne | int | [0,端口总数] | 使能端口1(上使能端口) | | deadmanPortTwo | int | [0,端口总数] | 使能端口2(下使能端口) | | mode | int | [0,1] | 使能触发模式;0为软件触发,1为硬件触发 | | robot | int | [1,4] | 当前机器人号 | ```json { "deadmanPortOne": 14, "deadmanPortTwo": 2, "mode": 0, "robot": 1 } ``` --- #### 上位机请求伺服上使能 **命令字:** `0x3036` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求伺服下使能 **命令字:** `0x3037` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- ## 点动坐标模式 ### 说明 - 机器人点动运行坐标模式的设置与查询 --- #### 上位机设置机器人点动坐标模式 **命令字:** `0x3040` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coordinate | int | [0,3] | 点动坐标模式;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | robot | int | [1,4] | 当前机器人号 | ```json { "coordinate": 1, "robot": 1 } ``` --- #### 上位机查询机器人点动坐标模式 **命令字:** `0x3041` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人点动坐标模式 **命令字:** `0x3042` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coordinate | int | [0,3] | 点动坐标模式;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | robot | int | [1,4] | 当前机器人号 | ```json { "coordinate": 1, "robot": 1 } ``` --- ## 机器人速度 ### 说明 - 包括有点动模式和定距移动速度的设置与查询 --- #### 上位机请求设置机器人速度参数 **命令字:** `0x3050` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | type | int | [0,2] | 当前速度模式;0表示点动速度,1表示关节坐标定距移动,2表示直角坐标定距移动 | | speed | int | [1,100] | 全局速度(%) | | mocroDotSpeedACS | double | (0,2000] | 关节坐标定距移动(°);仅当前点动坐标为关节坐标时使用 | | mocroDotSpeedMCS | double | (0,2000] | 直角坐标定距移动(mm);当前点动坐标不为关节坐标时使用 | ```json { "robot": 1, "type": 0, "speed": 5, "mocroDotSpeedACS": 0.1, "mocroDotSpeedMCS": 0.1 } ``` --- #### 上位机查询机器人速度参数 **命令字:** `0x3051` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人速度参数 **命令字:** `0x3052` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | type | int | [0,2] | 当前速度模式;0表示点动速度,1表示关节坐标定距移动,2表示直角坐标定距移动 | | speed | int | [1,100] | 全局速度 | | mocroDotSpeedACS | double | (0,2000] | 关节坐标定距移动(°) | | mocroDotSpeedMCS | double | (0,2000] | 直角坐标定距移动(mm) | ```json { "robot": 1, "type": 0, "speed": 5, "mocroDotSpeedACS": 0.1, "mocroDotSpeedMCS": 0.1 } ``` --- ## 运动到点 ### 说明 - 包含有回零、运动到标记点、关节直线运动等操作 - 机器人运动前需将伺服改为使能状态,否则发送以下命令机器人也不会动作 --- #### 上位机请求机器人回零 **命令字:** `0x3070` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | isWithExternal | int | [0,1] | 是否包含外部轴 | | robot | int | [1,4] | 当前机器人号 | ```json { "isWithExternal": 0, "robot": 1 } ``` --- #### 上位机请求机器人运行到目标点 **命令字:** `0x3071` **RobotPos 对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | P 点类型;0表示 NONE_TYPE,1表示 P_TYPE,2表示 E_TYPE,3表示 RP_TYPE,4表示 AP_TYPE,5表示 GP_TYPE,6表示 GE_TYPE | | data | array | 点位数据列表 | | key | string | 变量名称 | | note | string | 变量注释 | | paraVarData | array | 点位列表,对"data"节点数据进行进一步说明 | **data 列表说明:** - 第一二位:坐标类型(0,0表示关节坐标,1,1表示直角坐标,2,1工具坐标,3,1用户坐标) - 第三位:左右手(1表示左手,2表示右手,0表示无左右手) - 第四五六七位:备用,默认位0 - 第八至十四位:机器人本体坐标值(7位) - 第十五至十九位:外部轴坐标值(最大支持五个外部轴) **paraVarData 元素:** | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | data | double | - | 同"data"节点 | | secondvalue | int | [0,1] | 0表示位置变量名固定(如 P001),1表示不固定(如 P[I001]) | | value | int | [0,17] | 数值类型;0表示数值类型;1表示 int 变量;2表示 double 变量;3表示 bool 变量;4表示全局 int 变量;5表示全局 double 变量;6表示全局 bool 变量;7表示 string 常量;8表示 string 变量;9表示全局 string 变量;10表示 P 点变量;11表示全局 P 点变量;12表示 E 点变量;13表示全局 E 点变量 | | varname | string | - | 使用的变量名称 | | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | positionName | string | - | 目标点位名 | | robot | int | [1,4] | 当前机器人号 | ```json { "RobotPos": { "ctype": 0, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 470.7460, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 817.3340, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "positionName": "MoveToGetPoint", "robot": 1 } ``` --- #### 上位机请求机器人外部轴运行到目标点 **命令字:** `0x3072` **RobotPos 对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | P 点类型;0表示 NONE_TYPE,1表示 P_TYPE,2表示 E_TYPE,3表示 RP_TYPE,4表示 AP_TYPE,5表示 GP_TYPE,6表示 GE_TYPE | | data | array | 点位数据列表(长度21) | | key | string | 变量名称 | | note | string | 变量注释 | | paraVarData | array | 点位列表 | | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "RobotPos": { "ctype": 0, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 470.7460, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 817.3340, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "robot": 1 } ``` --- #### 上位机请求机器人运行到程序点 **命令字:** `0x3073` | 参数名 | 类型 | 说明 | |--------|------|------| | job | string | 程序名称 | | robot | int | 当前机器人号 | | suffix | string | 程序文件后缀;.JBR 表示主程序,.JBP 表示后台局部程序,.JBPG 表示后台全局程序 | | var | string | 点位名称 | ```json { "job": "WWW", "robot": 1, "suffix": ".JBR", "var": "P0001" } ``` --- #### 上位机请求机器人运行到用户坐标标定点 **命令字:** `0x3074` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | posType | int | [0,2] | 移动到点类型;0表示原点,1表示 X 值,2表示 Y 值 | | robot | int | [1,4] | 当前机器人号 | | userNum | int | [1,999] | 当前用户坐标坐标号 | ```json { "posType": 0, "robot": 1, "userNum": 1 } ``` --- #### 上位机请求机器人运行到复位点(不含外部轴) **命令字:** `0x3075` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求机器人运行到复位点(含外部轴) **命令字:** `0x3076` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 上位机请求机器人点到点运动到点 **命令字:** `0x3077` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度7,机器人本体坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人直线运动到点 **命令字:** `0x3078` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度7,机器人本体坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人圆弧运动到点 **命令字:** `0x3079` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | isFull | bool | - | false 表示 MOVC,true 表示 MOVCA | | posOne | array | 圆弧起始点位置信息(长度7) | | | posTwo | array | 圆弧经过中间点位置信息(长度7) | | | posThree | array | 圆弧目标点位置信息(长度7) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "isFull": false, "posOne": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], "posTwo": [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0], "posThree": [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人样条曲线运动到点 **命令字:** `0x307A` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 样条曲线的轨迹点位二维数组;一维表示轨迹上的目标点位,二维机器人本体坐标(长度7) | | | robot | int | [1,4] | 当前机器人号 | | size | int | - | 样条曲线的点数目,最小为4 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [ [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 25.5, 0.0, 0.0, 0.0, 0.0, 0.0] ], "robot": 1, "size": 4, "vel": 5 } ``` --- #### 上位机请求机器人外部轴点到点运动到点 **命令字:** `0x307B` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人外部轴直线运动到点 **命令字:** `0x307C` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | pos | array | 目标点信息列表(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "pos": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人外部轴圆弧运动到点 **命令字:** `0x307D` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | | posOne | array | 圆弧起始点位置信息(长度12,前7位为机器人本体坐标,后5位为外部轴坐标) | | | posTwo | array | 圆弧经过中间点位置信息(长度12) | | | posThree | array | 圆弧目标点位置信息(长度12) | | | robot | int | [1,4] | 当前机器人号 | | vel | int | [1,100] | 运行速度 | ```json { "coord": 0, "posOne": [0.0, 10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 7.1, 0.0, 0.0, 0.0, 0.0], "posTwo": [0.0, 15.3, 0.0, 0.0, 0.0, 0.0, 0.0, 14.2, 0.0, 0.0, 0.0, 0.0], "posThree": [0.0, 20.4, 0.0, 0.0, 0.0, 0.0, 0.0, 21.3, 0.0, 0.0, 0.0, 0.0], "robot": 1, "vel": 5 } ``` --- #### 上位机请求机器人门控运动 **命令字:** `0x3081` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | ParaACC | double | - | 加速度 | | ParaDEC | double | - | 减速度 | | ParaV | double | - | 速度 | | ParaPL | int | [0,5] | 平滑 | | aheadtype | int | [0,2] | 提前执行类型;0表示时间,1表示距离,2表示进度 | | ParaAHEAD | double | - | 提前执行值 | | offsetAxis | int | [0,2] | 走门型的轴 | | axis_offset_type | int | [0,1] | 偏移轴的偏移方式;0表示最大高度,1表示最大坐标 | | para_line_or_coord_max | double | - | 偏移轴最大坐标或者最大偏移量 | | para_straight_up_dis | double | - | 垂直上升距离 | | para_straight_down_dis | double | - | 垂直下降距离 | | ParaSPIN | int | [0,1] | 门型运动方式;0表示关节,1表示直线 | | pos | array | 长度14,前7位为机器人本体坐标,后7位为外部轴坐标 | 目标位置 | | coord | int | [0,3] | 坐标类型;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | ```json { "robot": 1, "ParaACC": 100.0, "ParaDEC": 100.0, "ParaV": 10, "ParaPL": 0, "aheadtype": 0, "ParaAHEAD": 5, "offsetAxis": 2, "axis_offset_type": 0, "para_line_or_coord_max": 1000, "para_straight_up_dis": 10, "para_straight_down_dis": 10, "ParaSPIN": 0, "pos": [791.9649933992308, -122.76709767976902, 360.000035291658, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "coord": 1 } ``` --- ## 运动参数 ### 说明 - 上位机设置机器人运动参数 --- #### 上位机设置机器人运动参数 **命令字:** `0x3090` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | absolutePosResolution | double | [0.0001,0.1] | 绝对位置分辨率(°) | | interpolationMethod | int | [0,2] | 机器人插补方式;0表示 S 型插补,1表示梯形插补,2表示加加速度插补 | | minTrajectTime | object | - | 最小加/减速度时间 | | minTrajectTime.minAccTime | double | [0.05,1] | 最小加速度时间(s) | | minTrajectTime.minDecTime | double | [0.05,1] | 最小减速度时间(s) | | runDelayTime | int | [500,20000] | 运行延时时间(ms) | | stopTime | int | [240,2000] | 暂停时间(ms) | ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "minTrajectTime": { "minAccTime": 0.10, "minDecTime": 0.10 }, "runDelayTime": 500, "stopTime": 240 } ``` --- #### 上位机查询机器人运动参数 **命令字:** `0x3091` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人运动参数 **命令字:** `0x3092` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | absolutePosResolution | double | [0.0001,0.1] | 绝对位置分辨率(°) | | interpolationMethod | int | [0,2] | 机器人插补方式;0表示 S 型插补,1表示梯形插补,2表示加加速度插补 | | minTrajectTime | object | - | 最小加/减速度时间 | | minTrajectTime.minAccTime | double | [0.05,1] | 最小加速度时间(s) | | minTrajectTime.minDecTime | double | [0.05,1] | 最小减速度时间(s) | | runDelayTime | int | [500,20000] | 运行延时时间(ms) | | stopTime | int | [240,2000] | 暂停时间(ms) | ```json { "absolutePosResolution": 0.010, "interpolationMethod": 0, "minTrajectTime": { "minAccTime": 0.10, "minDecTime": 0.10 }, "runDelayTime": 500, "stopTime": 240 } ``` --- ## 点动 ### 说明 - 包括有关节/直角点动速度的设置与查询,点动灵敏度的设置与查询,开启/关闭点动操作 --- #### 上位机请求进行点动操作 **命令字:** `0x30A0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | [1,12] | 当前需要运动的轴 | | direction | int | [-1,1] | 轴移动方向;-1表示负方向移动,1表示正方向移动 | | robot | int | [1,4] | 当前机器人号 | **axis 参数说明:** - 关节坐标时:表示对应的轴,从8开始为外部轴 - 直角坐标时:按顺序分别表示 X 轴、Y 轴、Z 轴、A 轴、B 轴、C 轴 - 工具坐标时:按顺序分别表示 TX 轴、TY 轴、TZ 轴、TA 轴、TB 轴、TC 轴 - 用户坐标时:按顺序分别表示 UX 轴、UY 轴、UZ 轴、UA 轴、UB 轴、UC 轴 ```json { "axis": 1, "direction": 1, "robot": 1 } ``` --- #### 上位机请求停止点动操作 **命令字:** `0x30A1` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | axis | int | [1,12] | 当前需要停止运动的轴 | | robot | int | [1,4] | 当前机器人号 | **axis 参数说明:** - 关节坐标时:表示对应的轴,从8开始为外部轴 - 直角坐标时:按顺序分别表示 X 轴、Y 轴、Z 轴、A 轴、B 轴、C 轴 - 工具坐标时:按顺序分别表示 TX 轴、TY 轴、TZ 轴、TA 轴、TB 轴、TC 轴 - 用户坐标时:按顺序分别表示 UX 轴、UY 轴、UZ 轴、UA 轴、UB 轴、UC 轴 ```json { "axis": 1, "robot": 1 } ``` --- #### 上位机设置机器人点动速度 **命令字:** `0x30A2` | 参数名 | 类型 | 说明 | |--------|------|------| | robotJointMaxJogVel | array | 关节坐标最大点动速度,double 数组,长度为当前机器人轴数 | | robotJointMaxJogAcc | array | 关节最大点动加速度,double 数组,长度为当前机器人轴数 | | posABCMaxJogVel | double | A、B、C 姿态轴最大点动速度 | | lineMaxJogVel | double | 直线坐标最大点动速度 | | lineMaxJogAcc | double | 直线坐标最大点动加速度 | | sensitivity | double | 点动灵敏度 | | externAxisGroup | array | 外部轴组点动参数列表,元素为 object | | externAxisGroup[].MaxJogVel | array | 外部轴组最大点动速度,double 数组;长度为该轴组的外部轴数量 | | externAxisGroup[].MaxJogAcc | array | 外部轴组最大点动加速度,double 数组;长度为该轴组的外部轴数量 | ```json { "externAxisGroup": [ { "MaxJogAcc": [800.0], "MaxJogVel": [40.0] }, { "MaxJogAcc": [800.0, 800.0], "MaxJogVel": [40.0, 40.0] } ], "lineMaxJogAcc": 3000.0, "lineMaxJogVel": 200.0, "posABCMaxJogVel": 10.0, "robotJointMaxJogAcc": [800.0, 800.0, 800.0, 800.0, 800.0, 800.0], "robotJointMaxJogVel": [40.0, 40.0, 40.0, 40.0, 40.0, 40.0], "sensitivity": 0.0010 } ``` --- #### 上位机查询机器人点动速度 **命令字:** `0x30A3` > 无请求参数 ```json {} ``` --- #### 控制器回复上位机机器人点动速度 **命令字:** `0x30A4` > 回复参数与设置参数一致。`externAxisGroup` 按外部轴组返回,每个轴组的数组长度与该轴组实际外部轴数量一致。 ```json { "externAxisGroup": [ { "MaxJogAcc": [800.0], "MaxJogVel": [40.0] }, { "MaxJogAcc": [800.0, 800.0], "MaxJogVel": [40.0, 40.0] } ], "lineMaxJogAcc": 3000.0, "lineMaxJogVel": 200.0, "posABCMaxJogVel": 10.0, "robotJointMaxJogAcc": [800.0, 800.0, 800.0, 800.0, 800.0, 800.0], "robotJointMaxJogVel": [40.0, 40.0, 40.0, 40.0, 40.0, 40.0], "sensitivity": 0.001 } ``` --- #### 上位机设置机器人直角点动速度 **命令字:** `0x30A5` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | maxAcc | double | [1,4000] | 直角轴点动加速度(mm/s²) | | maxSpeed | double | [1,250] | 直角轴最大点动速度(mm/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "maxAcc": 1500.0, "maxSpeed": 200.0, "robot": 1 } ``` --- #### 上位机查询机器人直角点动速度 **命令字:** `0x30A6` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人直角点动速度 **命令字:** `0x30A7` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | maxAcc | double | [1,4000] | 直角轴点动加速度(mm/s²) | | maxSpeed | double | [1,250] | 直角轴最大点动速度(mm/s²) | | robot | int | [1,4] | 当前机器人号 | ```json { "maxAcc": 1500.0, "maxSpeed": 200.0, "robot": 1 } ``` --- #### 上位机设置机器人点动灵敏度 **命令字:** `0x30A8` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | sensitivity | double | [0.001,1] | 点动灵敏度 | ```json { "robot": 1, "sensitivity": 0.0010 } ``` --- #### 上位机查询机器人点动灵敏度 **命令字:** `0x30A9` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人点动灵敏度 **命令字:** `0x30AA` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | sensitivity | double | [0.001,1] | 点动灵敏度 | ```json { "robot": 1, "sensitivity": 0.0010 } ``` --- ## 点位坐标转换 ### 说明 - 机器人在各个坐标的值相互转换 --- #### 上位机请求转换坐标值 **命令字:** `0x30C0` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要转换坐标的点位名称 | | pos | array | 点位数据列表 | | robot | int | 当前机器人号 | | targetCoord | int | 目标转换坐标;0表示关节坐标,1表示直角坐标,2表示工具坐标,3表示用户坐标 | **pos 列表说明:** - 第一二位:坐标类型(0,0表示关节坐标,1,1表示直角坐标,2,1工具坐标,3,1用户坐标) - 第三位:当前点位姿态 - 第四位:当前点位的工具手号 - 第五位:当前点位的用户坐标号 - 第六七位:备用 - 后七位:当前点在当前坐标系下的位置信息 ```json { "name": "P0002", "pos": [0, 0.0, 8.0, 0.0, 1.0, 0.0, 0.0, 0.0, 10.20, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "targetCoord": 1 } ``` --- #### 控制器回复上位机转换后的坐标值 **命令字:** `0x30C1` | 参数名 | 类型 | 说明 | |--------|------|------| | name | string | 需要转换坐标的点位名称 | | pos | array | 点位数据列表(弧度制) | | posDeg | array | 点位数据列表(角度制) | | result | bool | 转换是否成功 | | robot | int | 当前机器人号 | ```json { "name": "P0002", "pos": [1, 1, 8.0, 0.0, 1.0, 0.0, 0.0, 387.623217660095, 0.0, 894.038513201144, -3.14159265359, 0.178023583703, 0.0, 0.0], "posDeg": [1, 1, 8.0, 0.0, 1.0, 0.0, 0.0, 387.623217660095, 0.0, 894.038513201144, -180.0, 10.2, 0.0, 0.0], "result": true, "robot": 1 } ``` --- #### 上位机发送获取任意工具手下位置 **命令字:** `0x30C2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | toolNum | int | [0,9] | 目标工具手 | | toolNowNum | int | [0,9] | 当前工具手;0是无工具手 | | pos | array | 需要转换的点位;元素为 double 类型数组 | | ```json { "robot": 1, "toolNum": 1, "toolNowNum": 0, "pos": [[19998, 0, 19998, 180, 0, 0, 0], [19998, 0, 19998, 180, 0, 0, 0]] } ``` --- #### 控制器返回目标工具手坐标 **命令字:** `0x30C3` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | toolNum | int | [0,9] | 目标工具手 | ```json { "robot": 1, "toolNum": 1, "pos": [[19998, 0, 19998, 180, 0, 0, 0], [19998, 0, 19998, 180, 0, 0, 0]] } ``` --- ## 机器人切换 ### 说明 - 切换当前使用的机器人 --- #### 上位机请求切换当前使用机器人 **命令字:** `0x30D0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | isMultiRobot | bool | - | 是否为双机协作 | | mode | int | [0,1] | 当前机器人模式;0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 需要切换到的机器人号 | ```json { "isMultiRobot": false, "mode": 0, "robot": 1 } ``` --- #### 上位机查询当前使用机器人号 **命令字:** `0x30D1` ```json {} ``` --- #### 控制器回复上位机当前使用机器人号 **命令字:** `0x30D2` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mode | int | [0,1] | 当前机器人模式;0表示单机模式,1表示多机模式 | | robot | int | [1,4] | 当前机器人号 | ```json { "mode": 0, "robot": 1 } ``` --- #### 上位机设置角度制或弧度制 **命令字:** `0x30D3` | 参数名 | 类型 | 说明 | |--------|------|------| | isDeg | bool | 是否为角度制;false 表示弧度制,true 表示角度制 | ```json { "isDeg": false } ``` --- #### 上位机设置机器人运动队列停止但不下使能 **命令字:** `0x30D4` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复当前机器人当前为角度制还是弧度制 **命令字:** `0x30D5` | 参数名 | 类型 | 说明 | |--------|------|------| | tmpDeg | bool | 是否为角度制;false 表示弧度制,true 表示角度制 | > 注:此为0x30D3的回复,只有切换角度/弧度时才会回复 ```json { "tmpDeg": false } ``` --- ## Arch 参数 ### 说明 - 机器人模型 Arch 参数(垂直上升/下降距离)的查询与设置 --- #### 上位机查询机器人模型 Arch 参数 **命令字:** `0x30D9` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | ```json { "robot": 1 } ``` --- #### 控制器回复上位机机器人模型 Arch 参数 **命令字:** `0x30DA` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1,4] | 当前机器人号 | | straight_down_dis | array | - | 垂直下降距离列表 | | straight_up_dis | array | - | 垂直上升距离列表 | ```json { "robot": 1, "straight_down_dis": [30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0], "straight_up_dis": [30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0] } ``` --- #### 上位机设置机器人模型 Arch 参数 **命令字:** `0x30DB` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | straight_down_dis | array | - | 垂直下降距离列表 | | straight_up_dis | array | - | 垂直上升距离列表 | ```json { "straight_down_dis": [30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0], "straight_up_dis": [30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0] } ``` --- ## 耦合比 ### 说明 - 耦合比相关通讯 --- #### 上位机下发设置耦合比 **命令字:** `0x20E0` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robotNum | int | [1,4] | 当前机器人 | | axisCouplePara | array | - | 新增耦合轴组,元素为 object | | axisCouplePara.drivingAxisNum | int | - | 选取主动轴 | | axisCouplePara.drivenAxisNum | array | - | 选取带动轴,int 类型数组 | | axisCouplePara.coupleRatio | array | - | 填写耦合比,double 类型数组 | ```json { "robotNum": 1, "axisCouplePara": [ { "drivingAxisNum": 1, "drivenAxisNum": [2, 3, 4], "coupleRatio": [1.0, 2.0, 3.0] }, { "drivingAxisNum": 5, "drivenAxisNum": [6], "coupleRatio": [4.4] } ] } ``` --- #### 上位机下发查询耦合比 **命令字:** `0x20E1` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robotNum | int | [1,4] | 当前机器人 | ```json { "robotNum": 1 } ``` --- #### 控制器回复耦合比 **命令字:** `0x20E2` > 注:控制器收到 0x20E0 命令后回复,内容与 0x20E0 相同 ```json { "robotNum": 1, "axisCouplePara": [ { "drivingAxisNum": 1, "drivenAxisNum": [2, 3, 4], "coupleRatio": [1.0, 2.0, 3.0] }, { "drivingAxisNum": 5, "drivenAxisNum": [6], "coupleRatio": [4.4] } ] } ``` --- ## 动态限位 ### 说明 - 动态限位相关通讯 --- #### 上位机下发设置动态限位 **命令字:** `0x20E3` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robotNum | int | [1,4] | 当前机器人 | | dynamicPosLimitPara | array | - | 新增轴组动态限位,元素为 object | | dynamicPosLimitPara.relatedAxisNum | array | - | 选取关联轴组,int 类型数组 | | dynamicPosLimitPara.maxPos | double | - | 填写动态限位最大值 | | dynamicPosLimitPara.minPos | double | - | 填写动态限位最小值 | ```json { "robotNum": 1, "dynamicPosLimitPara": [ { "relatedAxisNum": [2, 3, 4], "maxPos": 180.0, "minPos": -90.0 }, { "relatedAxisNum": [2, 5, 6], "maxPos": 170.0, "minPos": -160.0 } ] } ``` --- #### 上位机下发查询动态限位 **命令字:** `0x20E4` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robotNum | int | [1,4] | 当前机器人 | ```json { "robotNum": 1 } ``` --- #### 控制器回复动态限位 **命令字:** `0x20E5` > 注:控制器收到 0x20E4 命令后回复,内容与 0x20E3 相同 ```json { "robotNum": 1, "dynamicPosLimitPara": [ { "relatedAxisNum": [2, 3, 4], "maxPos": 180.0, "minPos": -90.0 }, { "relatedAxisNum": [2, 5, 6], "maxPos": 170.0, "minPos": -160.0 } ] } ``` --- ## 速度设置 ### 说明 - 速度设置相关通讯 --- #### 上位机设置速度参数 **命令字:** `0x20E6` | 参数名 | 类型 | 说明 | |--------|------|------| | speedsetting | object | 速度设置参数对象 | **speedsetting 参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | attitudespeedVR | double | 姿态速度 | | externaxispeedVJE | double | 外部轴速度 | | jointspeedVJ | double | 关节速度 | | linearspeedV | double | 线速度 | ```json { "speedsetting": { "attitudespeedVR": 10.0, "externaxispeedVJE": 10.0, "jointspeedVJ": 10.0, "linearspeedV": 100.0 } } ``` --- ## 安装位置 ### 说明 - 安装角度偏移量为以正装为初始安装方式后绕自身坐标轴旋转的角度。 - 正装 = (0°,0°,0°);倒装 = (0°,180°,0°)。 --- #### 上位机设置机器人安装角度 **命令字:** `0x20E9` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountAngle | array | - | 安装角度偏移列表,长度为3;依次为绕 X/Y/Z 轴旋转偏移角度(°) | | robotNum | int | [1,4] | 实际设置的机器人号 | ```json { "mountAngle": [0.0, 0.0, 0.0], "robotNum": 2 } ``` --- #### 上位机查询机器人安装角度 **命令字:** `0x20EA` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robotNum | int | [1,4] | 实际读取的机器人号 | ```json { "robotNum": 2 } ``` --- #### 控制器回复机器人安装角度 **命令字:** `0x20EB` | 参数名 | 类型 | 范围 | 说明 | |--------|------|------|------| | mountAngle | array | - | 安装角度偏移列表,长度为3;依次为绕 X/Y/Z 轴旋转偏移角度(°) | | robotNum | int | [1,4] | 实际读取的机器人号 | ```json { "mountAngle": [0.0, 0.0, 0.0], "robotNum": 2 } ``` --- #### 上位机查询速度参数 **命令字:** `0x20E7` > 无请求参数 --- #### 控制器回复速度参数 **命令字:** `0x20E8` | 参数名 | 类型 | 说明 | |--------|------|------| | speedsetting | object | 速度设置参数对象 | **speedsetting 参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | attitudespeedVR | double | 姿态速度 | | externaxispeedVJE | double | 外部轴速度 | | jointspeedVJ | double | 关节速度 | | linearspeedV | double | 线速度 | ```json { "speedsetting": { "attitudespeedVR": 10.0, "externaxispeedVJE": 10.0, "jointspeedVJ": 10.0, "linearspeedV": 100.0 } } ``` --- # 状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/03.%E7%8A%B6%E6%80%81.html ## 碰撞检测状态 ### 查询碰撞检测状态 **命令字:** `0x3200` | 字段 | 类型 | 说明 | |------|------|------| | clear | int | 是否清除理论扭矩和实际扭矩差别,范围 [0, 1] | ```json { "clear": 0 } ``` **控制器回复** **命令字:** `0x3201` | 字段 | 类型 | 说明 | |------|------|------| | Difference_torq | double[] | 理论与反馈差值列表,长度为 7 | | actual_torq | double[] | 扭矩反馈值列表,长度为 7 | | detect_torq | double[] | 碰撞检测阈值列表,长度为 7 | | max_torq | double[] | 插值峰值列表,长度为 7 | | target_torq | double[] | 扭矩理论值列表,长度为 7 | ```json { "Difference_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "actual_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "detect_torq": [50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 0.0], "max_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "target_torq": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` ## 指令运行百分比 ### 查询运动指令已完成百分比 **命令字:** `0x3202` - 无需发送数据 **控制器回复** **命令字:** `0x3203` | 字段 | 类型 | 说明 | |------|------|------| | completionRatio | double | 运行百分比,取值范围 [0, 1],最大值为 1 | ```json { "completionRatio": 0.11 } ``` ## 当前位置 ### 查询机器人坐标位置 **命令字:** `0x3210` | 字段 | 类型 | 说明 | |------|------|------| | coord | int | 查询当前坐标的位置,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "coord": 0, "robot": 1 } ``` **控制器回复** **命令字:** `0x3212` | 字段 | 类型 | 说明 | |------|------|------| | configuration | int | 当前位置形态值,范围 [0, 8] | | coord | int | 当前位置坐标类型,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | pos | double[] | 获取到的弧度制当前位置信息 | | posDeg | double[] | 获取到的角度制当前位置信息 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "configuration": 8, "coord": 0, "pos": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "posDeg": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "robot": 1 } ``` **控制器回复** **命令字:** `0x3213` | 字段 | 类型 | 说明 | |------|------|------| | coord | int | 当前位置坐标类型,范围 [0, 4]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标,4 电机坐标 | | isDeg | int | 是否为角度制,范围 [0, 1] | | position | double[] | 获取到的弧度制当前位置信息 | | positionDeg | double[] | 获取到的角度制当前位置信息 | | posture | int | 当前位置形态值,范围 [0, 8] | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "coord": 0, "isDeg": 0, "position": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "positionDeg": [0.8047034822, 0.0, 0.0, 0.033915260824, 0.0, -0.008860939141, 0.0], "posture": 8, "robot": 1 } ``` > **说明:** 控制器回复上位机机器人坐标位置(0x3211) ### 查询双机协作下机器人坐标位置 **命令字:** `0x3214` | 字段 | 类型 | 说明 | |------|------|------| | coord1 | int | 获取机器人 1 位置的坐标类型,范围 [0, 3]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标 | | coord2 | int | 获取机器人 2 位置的坐标类型,范围 [0, 3]:0 关节坐标,1 直角坐标,2 工具坐标,3 用户坐标 | | robot1 | int | 双机协作第一个机器人号,范围 [1, 4],默认为 1 | | robot2 | int | 双机协作第二个机器人号,范围 [1, 4],默认为 2 | ```json { "coord1": 1, "coord2": 1, "robot1": 1, "robot2": 2 } ``` **控制器回复** **命令字:** `0x3215` | 字段 | 类型 | 说明 | |------|------|------| | coord1 | int | 机器人 1 位置的坐标类型,范围 [0, 3] | | coord2 | int | 机器人 2 位置的坐标类型,范围 [0, 3] | | pos1 | double[] | 机器人 1 弧度制下的坐标 | | pos1Deg | double[] | 机器人 1 角度制下的坐标 | | pos2 | double[] | 机器人 2 弧度制下的坐标 | | pos2Deg | double[] | 机器人 2 角度制下的坐标 | | robot1 | int | 双机协作第一个机器人号,默认为 1 | | robot2 | int | 双机协作第二个机器人号,默认为 2 | ```json { "coord1": 0, "coord2": 0, "pos1": [-0.0, 0.0, 3.077931758984, -0.0, 0.0, -0.0, 0.0], "pos1Deg": [-0.0, 0.0, 3.077931758984, -0.0, 0.0, -0.0, 0.0], "pos2": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pos2Deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot1": 1, "robot2": 2 } ``` ## 电机负载值 ### 查询机器人电机扭矩过载值 **命令字:** `0x3220` | 字段 | 类型 | 说明 | |------|------|------| | robot_num | int | 查询机器人号,范围 [1, 4] | ```json { "robot_num": 1 } ``` **控制器回复** **命令字:** `0x3221` | 字段 | 类型 | 说明 | |------|------|------| | torq_limit_enable | bool | 电机过载保护使能 | | torq_limit_min_ensure_time | double | 电机过载保护最小确认时间,范围 [10, 9999],单位 ms | | torq_limit_robot | double[] | 电机扭矩过载值列表,单位 ‰,长度为当前机器人的轴数量 | | torq_limit_sync | double[] | 外部轴电机扭矩过载值列表,单位 ‰,长度为当前机器人绑定的外部轴数量 | ```json { "torq_limit_enable": false, "torq_limit_min_ensure_time": 10, "torq_limit_robot": [800.0, 1400.0, 1000.0, 1200.0, 800.0, 700.0], "torq_limit_sync": [-0.0, -0.0, 0.0, 0.0, -0.0] } ``` ## 轴速度 ### 查询机器人轴速度 **命令字:** `0x3230` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3231` | 字段 | 类型 | 说明 | |------|------|------| | actualLineVel | double | 机器人末端当前线速度,单位 mm/s | | axisActualVel | double[] | 机器人各轴当前速度列表,单位 °/s,长度为 7 | | axisActualVelSync | double[] | 机器人外部轴各轴当前速度列表,单位 °/s,长度为 5 | | maxActualLineVel | double | 机器人末端最大线速度,单位 mm/s | | maxAxisActualVel | double[] | 机器人各轴最大速度列表,单位 °/s,长度为 7 | | maxAxisActualVelSync | double[] | 机器人外部轴各轴最大速度列表,单位 °/s,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "actualLineVel": 0.0, "axisActualVel": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "axisActualVelSync": [0.0, 0.0, 0.0, 0.0, 0.0], "maxActualLineVel": 0.0, "maxAxisActualVel": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "maxAxisActualVelSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ## 福德伺服温度 > 福德伺服专属功能 ### 查询福德伺服温度是否存在 **命令字:** `0x3250` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3251` | 字段 | 类型 | 说明 | |------|------|------| | IsExist | bool | 福德伺服温度是否存在 | ```json { "IsExist": false } ``` ### 控制器向示教器发送延时时间响应 **命令字:** `0x3252` | 字段 | 类型 | 说明 | |------|------|------| | delaytime | double | 延迟时间,单位 s | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "delaytime": 4, "robot": 1 } ``` ## 电机状态 > 电机参数查询,伺服温度仅福德伺服温度存在时可用 ### 查询机器人电机转速 **命令字:** `0x3260` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3261` | 字段 | 类型 | 说明 | |------|------|------| | maxVel | double[] | 机器人最大电机转速列表,单位 rpm,长度为 7 | | maxVelSync | double[] | 机器人外部轴最大电机转速列表,单位 rpm,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | vel | double[] | 机器人当前电机转速列表,单位 rpm,长度为 7 | | velSync | double[] | 机器人外部轴当前电机转速列表,单位 rpm,长度为 5 | | slave_vel | double[][] | 机器人主轴及从动轴电机速度列表,单位 rpm,7 个元素各包含 4 个元素(第 1 位主轴,2-4 位从动轴) | | slave_max_vel | double[][] | 机器人主轴及从动轴最大电机速度列表,单位 rpm | | slave_vel_sync | double[][] | 机器人外部轴主轴及从动轴电机速度列表,单位 rpm,5 个元素各包含 4 个元素 | | slave_max_vel_sync | double[][] | 机器人外部轴主轴及从动轴最大电机速度列表,单位 rpm | ```json { "maxVel": [0, 0, 0, 0, 0, 0, 0], "maxVelSync": [0, 0, 0, 0, 0], "robot": 1, "vel": [0, 0, 0, 0, 0, 0, 0], "velSync": [0, 0, 0, 0, 0], "slave_vel": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_vel": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_vel_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_vel_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人电机扭矩 **命令字:** `0x3262` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3263` | 字段 | 类型 | 说明 | |------|------|------| | maxTheoTorq | double[] | 机器人最大电机理论扭矩列表,单位 ‰,长度为 7 | | maxTorq | double[] | 机器人最大电机扭矩列表,单位 ‰,长度为 7 | | maxTorqSync | double[] | 机器人外部轴最大电机扭矩列表,单位 ‰,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | theoTorq | double[] | 机器人当前电机理论扭矩列表,单位 ‰,长度为 7 | | torq | double[] | 机器人当前电机扭矩列表,单位 ‰,长度为 7 | | torqSync | double[] | 机器人外部轴当前电机扭矩列表,单位 ‰,长度为 5 | | slave_torq | double[][] | 机器人主轴及从动轴电机扭矩列表,单位 ‰,7 个元素各包含 4 个元素(第 1 位主轴,2-4 位从动轴) | | slave_max_torq | double[][] | 机器人主轴及从动轴电机最大扭矩列表,单位 ‰ | | slave_torq_sync | double[][] | 机器人外部轴主轴及从动轴电机扭矩列表,单位 ‰,5 个元素各包含 4 个元素 | | slave_max_torq_sync | double[][] | 机器人外部轴主轴及从动轴最大电机扭矩列表,单位 ‰ | ```json { "maxTheoTorq": [0, 0, 0, 0, 0, 0, 0], "maxTorq": [0, 0, 0, 0, 0, 0, 0], "maxTorqSync": [0, 0, 0, 0, 0], "robot": 1, "theoTorq": [0, 0, 0, 0, 0, 0, 0], "torq": [0, 0, 0, 0, 0, 0, 0], "torqSync": [0, 0, 0, 0, 0], "slave_torq": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_torq": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_torq_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_max_torq_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人电机负载率 **命令字:** `0x3264` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3265` | 字段 | 类型 | 说明 | |------|------|------| | externalOverload | double[] | 机器人外部轴当前电机负载列表,单位 ‰,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | robotOverload | double[] | 机器人当前电机负载列表,单位 ‰,长度为 7 | | slave_motor_rbt_over_load | double[][] | 机器人主轴及从动轴电机负载列表,单位 ‰,7 个元素各包含 4 个元素(第 1 位主轴,2-3 位从动轴) | | slave_motor_sync_over_load | double[][] | 机器人外部轴主轴及从动轴电机负载列表,单位 ‰,5 个元素各包含 4 个元素 | ```json { "externalOverload": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1, "robotOverload": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "slave_motor_rbt_over_load": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_motor_sync_over_load": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ### 查询机器人编码器位置 **命令字:** `0x3266` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3267` | 字段 | 类型 | 说明 | |------|------|------| | reality | double[] | 机器人编码器位置实际值列表,长度为 7 | | realitySync | double[] | 机器人外部轴编码器位置实际值列表,长度为 5 | | robot | int | 当前机器人号,范围 [1, 4] | | target | double[] | 机器人编码器位置目标值列表,长度为 7 | | targetSync | double[] | 机器人外部轴编码器位置目标值列表,长度为 5 | | slave_reality | double[][] | 机器人主轴及从动轴编码器位置实际值列表,7 个元素各包含 4 个元素 | | slave_target | double[][] | 机器人主轴及从动轴编码器位置目标值列表 | | slave_reality_sync | double[][] | 机器人外部轴主轴及从动轴编码器位置实际值列表,5 个元素各包含 4 个元素 | | slave_target_sync | double[][] | 机器人外部轴主轴及从动轴编码器位置目标值列表 | ```json { "reality": [0, 0, 0, 0, 0, 0, 0], "realitySync": [0, 0, 0, 0, 0], "robot": 1, "target": [0, 0, 0, 0, 0, 0, 0], "targetSync": [0, 0, 0, 0, 0], "slave_reality": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_target": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_reality_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], "slave_target_sync": [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] } ``` ## PDO 操作 说明:存在5个元素,为机器人的5个外部轴;元素存在4个元素,第1位:主轴,2-4:从动轴 ### 上位机发送写入 PDO **命令字:** `0x2056` | 字段 | 类型 | 说明 | |------|------|------| | axisNum | uint | 从站编号 | | index | uint | 命令字编码 | | subindex | uint | 子命令编码 | | size | uint | 位数 | | value | - | 写入的值 | ```json { "axisNum": 1, "index": 0x0006, "subindex": 0, "size": 16, "value": 6 } ``` ## 电机电流查询 ### 查询机器人电机电流 **命令字:** `0x3268` - 无需发送数据 **控制器回复** **命令字:** `0x3269` | 字段 | 类型 | 说明 | |------|------|------| | current | double[] | 机器人电机电流列表,单位‰,长度为7 | | max_current | double[] | 机器人最大电机电流列表,单位‰,长度为7 | | robot | int | 当前机器人号,范围 [1,4] | | sync_current | double[] | 机器人外部轴电机电流列表,单位‰,长度为5 | | sync_max_current | double[] | 机器人外部轴最大电机电流列表,单位‰,长度为5 | | slave_current | double[][] | 机器人主轴及从动轴电机最大电流列表,存在7个元素,元素存在4个元素 | | slave_max_current | double[][] | 机器人外部轴主轴及从动轴电机电流列表,存在7个元素 | | slave_sync_max_current | double[][] | 机器人外部轴主轴及从动轴电机最大电流列表,存在5个元素 | ```json { "current": [0,0,0,0,0,0,0], "max_current": [0,0,0,0,0,0,0], "robot": 1, "sync_current": [0,0,0,0,0], "sync_max_current": [0,0,0,0,0], "slave_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_max_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_sync_max_current": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] } ``` ## 电机温度查询 ### 查询机器人电机温度 **命令字:** `0x326A` - 无需发送数据 **控制器回复** **命令字:** `0x326B` | 字段 | 类型 | 说明 | |------|------|------| | temperature | double[] | 机器人电机温度列表,单位°/C,长度为7 | | maxTemperature | double[] | 机器人最大电机温度列表,单位°/C | | temperatureSync | double[] | 机器人外部轴电机温度列表,单位°/C | | maxtemperatureSync | double[] | 机器人外部轴最大电机温度列表,单位°/C | | slave_temperature | double[][] | 机器人主轴及从动轴伺服温度列表,存在7个元素 | | slave_temperature_max | double[][] | 机器人主轴及从动轴伺服最大温度列表,存在7个元素 | | slave_temperature_sync_out | double[][] | 机器人外部轴主轴及从动轴伺服温度列表,存在5个元素 | | slave_temperature_sync_out_max | double[][] | 机器人外部轴主轴及从动轴伺服最大温度列表,存在5个元素 | ```json { "temperature": [0.0,0.0,0.0,0.0,0.0,0.0,0.0], "maxTemperature": [0.0,0.0,0.0,0.0,0.0,0.0,0.0], "temperatureSync": [0.0,0.0,0.0,0.0,0.0], "maxtemperatureSync": [0.0,0.0,0.0,0.0,0.0], "slave_temperature": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_max": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_sync_out": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]], "slave_temperature_sync_out_max": [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] } ``` ## 系统运行状态 ### 查询机器人运行状态 **命令字:** 0x3000 - 无需发送数据 **控制器回复** **命令字:** 0x3001 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | status | int | 运行状态码 | | errorCode | int | 错误码,0表示无错误 | | programName | string | 当前运行的程序名 | --- ## 状态码说明 ### 运行状态码 | 状态码 | 状态名称 | 说明 | |--------|----------|------| | 0 | 空闲 (IDLE) | 机器人未运行,等待指令 | | 1 | 运行中 (RUNNING) | 程序正在执行 | | 2 | 暂停 (PAUSED) | 程序被暂停,可恢复 | | 3 | 停止 (STOPPED) | 程序被停止 | | 4 | 错误 (ERROR) | 发生错误,需复位 | | 5 | 回零中 (HOMING) | 正在执行回零操作 | | 6 | 示教模式 (TEACH) | 处于示教/手动模式 | | 7 | 急停 (EMERGENCY_STOP) | 急停按钮被按下 | ### 伺服状态 | 状态值 | 说明 | |--------|------| | 0 | 伺服关闭 (Servo OFF) | | 1 | 伺服开启 (Servo ON) | | 2 | 伺服使能中 (Enabling) | ### 程序运行状态 | 状态值 | 说明 | |--------|------| | 0 | 未运行 | | 1 | 运行中 | | 2 | 暂停 | | 3 | 单步执行 | | 4 | 已停止 | ### 电机状态码 | 状态码 | 名称 | 说明 | |--------|------|------| | 0 | 正常 | 电机工作正常 | | 1 | 过载警告 | 负载超过额定值但未报警 | | 2 | 过载报警 | 负载超过保护阈值 | | 3 | 过热警告 | 温度超过警告阈值 | | 4 | 过热报警 | 温度超过保护阈值 | | 5 | 通讯异常 | 与驱动器通讯中断 | | 6 | 跟随误差过大 | 实际位置与指令位置偏差超限 | ## 安全状态查询 ### 查询安全回路状态 **命令字:** 0x3004 - 无需发送数据 **控制器回复** **命令字:** 0x3005 | 字段 | 类型 | 说明 | |------|------|------| | emergencyStop | bool | 急停状态:true=急停中, false=正常 | | safetyDoor | bool | 安全门状态:true=门开, false=门关 | | enableSwitch | bool | 使能开关:true=按下, false=松开 | ## 程序状态查询 ### 查询程序运行详细信息 **命令字:** 0x3006 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1,4] | **控制器回复** **命令字:** 0x3007 | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号 | | progName | string | 当前程序名 | | lineNumber | int | 当前执行行号 | | cycleCount | int | 循环次数 | | progStatus | int | 程序状态:0=未运行, 1=运行中, 2=暂停, 3=单步, 4=停止 | ## 常用状态查询组合 ### 检查机器人是否可以开始工作 步骤1 - 查询安全回路 (0x3004 -> 0x3005): 检查 emergencyStop=false, safetyDoor=false 步骤2 - 查询伺服状态: 检查各轴伺服已开启 步骤3 - 查询程序状态 (0x3006 -> 0x3007): 检查 progStatus=0 (空闲) ### 监控电机健康状况 步骤1 - 查询电机温度 (0x326A -> 0x326B) 步骤2 - 查询电机负载 (0x3264 -> 0x3265) 步骤3 - 查询电机扭矩 (0x3262 -> 0x3263) 步骤4 - 查询碰撞检测 (0x3200 -> 0x3201) --- # 工具手 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/04.%E5%B7%A5%E5%85%B7%E6%89%8B.html ## 概述 工具手标定是工业机器人坐标系管理的核心功能,用于建立机器人末端工具的坐标系(Tool Coordinate System, TCS)。 ### 什么是工具坐标系 - **法兰盘中心**:默认工具坐标系的原点,法兰盘中心指向法兰盘定位孔方向为+X 方向,垂直法兰向外为+Z 方向,根据右手法则判定 Y 方向 - **工具中心点(TCP)**:工具坐标系的原点,通常是工具的工作点(如焊丝尖端、吸盘中心等) - **工具坐标系特点**:新的工具坐标系相对于默认的工具坐标系变化得到,位置和方向始终同法兰盘保持绝对的位置和姿态关系 ### 为什么要建立工具坐标系 1. **确立工具的 TCP 点**:方便调整工具状态 - 例如:焊接时,将 TCP 定义到焊丝尖端,程序记录的位置便是焊丝尖端的位置 2. **确定工具进给方向**:方便工具位置调整 - 例如:手爪的前进方向可以直接移动过去 ### 适用场景 **需要使用工具手的情况**: - 机器人工作时 X、Y、Z 轴需要绕着 A、B、C 姿态轴旋转 - 典型工艺:焊接、打磨、喷涂、切割等 **无需使用工具手的情况**: - 机器人本身仅做 Z 轴姿态旋转 - 工具末梢位于机器人6轴法兰中心延长线上 ### 标定方式选择指南 | 场景 | 推荐方式 | 说明 | |------|----------|------| | 已激光标定 + 使用焊枪 | 6点标定 | 校准工具手尺寸+姿态,C轴精度较好 | | 未激光标定 + 使用焊枪 | 12点标定 | 校准零点+工具手尺寸 | | 标定码垛夹爪 | 直接填写尺寸或6点标定 | 优先选择直接填工具尺寸 | | 零点丢失 | 20点标定 | 校准零点+工具手尺寸 | | 6点标定后A/B轴旋转误差大 | 7点标定 | 校准工具手尺寸+姿态,A/B轴精度较好 | ### 工具手参数说明 | 参数 | 说明 | 单位 | |------|------|------| | X轴 | 工具末端相对于法兰中心,沿直角坐标系X轴方向的偏移长度 | mm | | Y轴 | 工具末端相对于法兰中心,沿直角坐标系Y轴方向的偏移长度 | mm | | Z轴 | 工具末端相对于法兰中心,沿直角坐标系Z轴方向的偏移长度 | mm | | A轴 | 工具末端相对于法兰中心,绕直角坐标系X轴方向旋转角度 | °/rad | | B轴 | 工具末端相对于法兰中心,绕直角坐标系Y轴方向旋转角度 | °/rad | | C轴 | 工具末端相对于法兰中心,绕直角坐标系Z轴方向的旋转角度 | °/rad | --- ## 工具手参数 ### 上位机设置工具手参数 **命令字:** `0x3500` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | B | double | 绕 B 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | C | double | 绕 C 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **请求示例:** ```json { "parameter": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.170 }, "robot": 1, "tool": 1 } ``` ### 上位机查询工具手参数 **命令字:** `0x3501` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **请求示例:** ```json { "robot": 1, "tool": 1 } ``` ### 控制器回复上位机工具手参数 **命令字:** `0x3502` **参数列表(弧度制):** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | [-3.1416,3.1416] | | B | double | 绕 B 轴旋转 | [-3.1416,3.1416] | | C | double | 绕 C 轴旋转 | [-3.1416,3.1416] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | **参数列表(角度制):** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | A | double | 绕 A 轴旋转 | [-180,180] | | B | double | 绕 B 轴旋转 | [-180,180] | | C | double | 绕 C 轴旋转 | [-180,180] | | X | double | X 轴方向偏移,单位 mm | [-2000,2000] | | Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] | | Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] | | note | string | 工具手注释 | - | | payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] | | payloadMass | double | 负载质量,单位 kg | [0,999999] | | payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] | | payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] | | payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] | | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手号 | [1,999] | **响应示例:** ```json { "parameter": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.17 }, "parameterDeg": { "A": 0.0, "B": 0.0, "C": 0.0, "X": -68.0, "Y": 3.0, "Z": 162.0, "note": "", "payloadInertia": 0.0, "payloadMass": 3.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.17 }, "robot": 1, "tool": 1 } ``` ## 工具号 ### 上位机请求切换工具号 **命令字:** `0x3510` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 需要切换的工具手号,0表示无工具手 | [0,999] | **请求示例:** ```json { "robot": 1, "tool": 0 } ``` ### 上位机查询工具手号 **命令字:** `0x3511` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | **请求示例:** ```json { "robot": 1 } ``` ### 控制器回复上位机工具手号 **命令字:** `0x3512` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | curToolNum | int | 当前已选中工具手号 | [0,999] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 与已选中工具手号一致,选中工具号为0时值为1 | [1,999] | **响应示例:** ```json { "curToolNum": 0, "robot": 1, "tool": 1 } ``` ## 工具标定 > 六点法和七点法标定,包含有标定 N 号点、获取标定点位置信息、点位标定状态。 > 标定计算前需标定好所有点,先用0x3521标定每一个点,所有的点位标定完成后用0x3520计算标定结果。 > 查询 N 号点位置信息时需 N 号点已标定。 ### 标定方式详解 #### 6点标定 6点标定用于校准工具手尺寸和姿态,标定结果旋转 C 轴精度较好。 **标定步骤**: 1. **TC1标定**:机器人5轴垂直向下,工具手末梢对准标定锥尖端 2. **TC2标定**:在第一点的基础上 C 轴旋转180度 3. **TC3标定**:在第一点的基础上 B 轴角度在35度 4. **TC4标定**:机器人回到零点,然后工具手末梢垂直 5. **TC5标定**:在第四点的基础上动 X- 6. **TC6标定**:在第五点的基础上动 Y+ **计算**:六个点标定结束后,点击"计算"会算出计算结果,如果计算结果大于1的话就需要重新标定。 #### 7点标定 7点标定用于校准工具手尺寸和姿态,标定结果旋转 A、B 轴精度较好。 **标定步骤**: 1. **TC1**:工具手末梢垂直对准参考点 2. **TC2**:将机器人切换一个姿势,末端正对参考点 3. **TC3**:将机器人切换一个姿势,末端正对参考点 4. **TC4**:将机器人切换一个姿势,末端正对参考点 5. **TC5**:将工具末端垂直且正对参考点(同 TC1) 6. **TC6**:在 TC5的基础上,沿笛卡尔坐标系 X 轴负方向移动任意距离 7. **TC7**:在 TC6的基础上,沿笛卡尔坐标系 Y 轴正方向移动任意距离 **注意事项**:进行数据量取前请将法兰盘平行于水平面! #### 12点标定 12点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。 **标定步骤**: 1. **TC1**:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端 2. **TC2**:在第一个点的基础上,通过直角坐标系将 C 旋转180度 3. **TC3**:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端 4. **TC4**:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度 5. **TC5**:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度 6. **TC6**:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+、J5大于-90度 7. **TC7**:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度 8. **TC8**:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度 9. **TC9**:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度 10. **TC10**:回到第一个点,通过关节坐标系点动五轴,使五轴向上、J5小于-90度 11. **TC11**:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度 12. **TC12**:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度 **计算**:标定完成后点击计算,计算出标定结果,如果计算出来的数值较大的话,就需要重新标定。 #### 15点标定 15点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。 **标定步骤**: 1. **TC1**:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端 2. **TC2**:在第一个点的基础上,通过直角坐标系将 C 旋转180度 3. **TC3**:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端 4. **TC4**:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度 5. **TC5**:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度 6. **TC6**:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+,J5大于-90度 7. **TC7**:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度 8. **TC8**:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度 9. **TC9**:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度 10. **TC10**:机器人回到第一个点,通过关节坐标系点动五轴使五轴向上,J5小于-90度 11. **TC11**:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度 12. **TC12**:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度 13. **TC13**:机器人回到零点位置,调整机器人姿态,使机器人末端工具尖端竖直朝下,将标定尖端与标定锥对齐 14. **TC14**:在第十三点的基础上,通过直角坐标系做 X-,机器人位移一段距离 15. **TC15**:在第十四点的基础上,通过直角坐标系做 Y+,机器人位移一段距离 #### 20点标定 **标定步骤**: 1. **TC1**:机器人工具手末端垂直参考点 2. **TC2**:在第一点的基础上动 A+ 3. **TC3**:在第一点的基础上动 A+ 40度 4. **TC4**:在第一点的基础上动 A+ 60度 5. **TC5**:在第一点基础上动 A- 20度 6. **TC6**:在第一点基础上动 A- 40度 7. **TC7**:在第一点基础上动 A- 60度 8. **TC8**:在第一点基础上动 B+ 20度 9. **TC9**:在第一点基础上动 B+ 30度 10. **TC10**:在第一点基础上动 B+ 40度 11. **TC11**:在第一点基础上动 B- 20度 12. **TC12**:在第一点基础上动 B- 30度 13. **TC13**:在第一点基础上动 B- 40度 14. **TC14**:在第一点基础上动 C+ 30度 15. **TC15**:在第一点基础上动 C+ 50度 16. **TC16**:在第一点基础上动 C+ 70度 17. **TC17**:在第一点基础上动 C+ 90度 18. **TC18**:在第一点基础上动 C- 30度 19. **TC19**:在第一点基础上动 C- 60度 20. **TC20**:第二十点在第一点基础上动 C- 90度 **注意事项**: - 进行数据量取前请将法兰盘平行于水平面! - 标定过程中请保持参考点固定,否则标定误差增大 ### 验证标定精度 示教模式下,工具手标定的末梢对准标定锥,在两个尖端对准的情况下,选中标定的工具手工具手编号,然后在直角坐标系下点动 A、B、C 轴,看尖端是否对准、偏了多少 mm。 ### API接口 #### 上位机标定计算请求 **命令字:** `0x3520` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | **请求示例:** ```json { "robot": 1, "tool": 1, "calibrationType": 7 } ``` #### 上位机标定 N 号点请求 **命令字:** `0x3521` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 4, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机 N 号点标定信息 **命令字:** `0x3522` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | position | `array` | 标定点直角坐标信息列表 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "calibrationType": 7, "point": 1, "position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0], "robot": 1 } ``` #### 控制器回复上位机标定计算完成结果 **命令字:** `0x3523` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | result | bool | 标定计算结果 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "result": true, "robot": 1 } ``` #### 上位机查询 N 号点位置信息 **命令字:** `0x3524` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 4, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机 N 号点位置信息 **命令字:** `0x3525` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | position | `array` | 标定点直角坐标信息列表 | - | | robot | int | 当前机器人号 | [1,4] | **响应示例:** ```json { "calibrationType": 7, "point": 1, "position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0], "robot": 1 } ``` #### 上位机查询全部点标定状态 **命令字:** `0x3526` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "robot": 1, "tool": 1 } ``` #### 控制器回复上位机全部点标定状态 **命令字:** `0x3527` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | robot | int | 当前机器人号 | [1,4] | | status | `array` | 点位标定状态列表,1表示已标定,0表示未标定 | 六点法长度6,七点法长度7 | **响应示例:** ```json { "calibrationType": 7, "robot": 1, "status": [1, 1, 1, 0, 0, 1, 1] } ``` #### 上位机请求清除 N 号点标定状态 **命令字:** `0x3528` | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] | | point | int | 标定点编号 | 六点法[0,5],七点法[0,6] | | robot | int | 当前机器人号 | [1,4] | | tool | int | 当前工具手编号 | [1,999] | **请求示例:** ```json { "calibrationType": 7, "point": 0, "robot": 1, "tool": 1 } ``` ## 常见问题 **Q: 什么是工具坐标系?** A: 工具坐标系是机器人末端工具的坐标系,原点是 TCP(工具中心点),用于确定工具的位姿。 **Q: 为什么要建立工具坐标系?** A: 1. 确立工具的 TCP 点,方便调整工具状态;2. 确定工具进给方向,方便工具位置调整。 **Q: 什么情况下需要使用工具手标定?** A: 需要用到绕 X、绕 Y、绕 Z 的姿态旋转时,需要进行工具手标定,例如焊接工艺、打磨工艺、喷涂工艺等。 **Q: 什么情况下无需使用工具手?** A: 机器人本身仅做 Z 轴姿态旋转,且工具末梢位于机器人6轴法兰中心延长线上;此时可以不设置工具手参数。 **Q: 如何选择工具手标定方式?** A: 1. 已做过激光标定+使用焊枪:使用6点标定;2. 未做过激光标定+使用焊枪:使用12点标定;3. 标定码垛夹抓:优先选择直接填工具尺寸;4. 零点丢失:使用20点标定;5. 6点标定后 A、B 轴旋转误差大:使用7点标定。 **Q: 标定失败,计算结果大于1怎么办?** A: 可能原因:标定点位置不准确、标定过程中参考点移动、机器人姿态不正确。解决方案:重新标定,确保参考点固定,检查机器人姿态是否正确,使用更精确的标定工具。 **Q: 标定后 A、B 轴旋转误差大怎么办?** A: 可能原因:6点标定精度不够、标定点分布不合理。解决方案:更换7点标定,重新标定,确保标定点分布合理。 **Q: 标定后 C 轴旋转误差大怎么办?** A: 可能原因:标定点位置不准确、参考点移动。解决方案:重新标定,确保参考点固定。 --- ## 工具手坐标系变换 ### 坐标系变换链 机器人系统中各坐标系之间的变换关系如下: 基座坐标系(Base) -> 关节变换(J1~J6) -> 法兰坐标系(Flange) -> 工具坐标系(TCP) 其中工具坐标系(TCP)由法兰坐标系经过工具手参数变换得到。 ### 工具手变换矩阵 工具手参数 (X, Y, Z, A, B, C) 定义了一个从法兰坐标系到工具坐标系的齐次变换矩阵: 平移部分由 (X, Y, Z) 定义,单位 mm。 旋转部分由 (A, B, C) 定义,遵循 ZYX 欧拉角顺序(先绕 Z 轴转 C,再绕 Y 轴转 B,最后绕 X 轴转 A)。 ### 变换矩阵计算 工具手变换矩阵 T_tool 的计算公式: T_tool = Trans(X,Y,Z) * RotX(A) * RotY(B) * RotZ(C) 其中: - Trans(X,Y,Z) 是平移变换矩阵 - RotX(A) 是绕 X 轴旋转 A 弧度的旋转矩阵 - RotY(B) 是绕 Y 轴旋转 B 弧度的旋转矩阵 - RotZ(C) 是绕 Z 轴旋转 C 弧度的旋转矩阵 ### 坐标变换应用 #### 获取TCP在基座坐标系下的位姿 TCP 在基座坐标系下的位姿 = T_base_to_flange * T_tool 其中 T_base_to_flange 是基座坐标系到法兰坐标系的变换矩阵,由正运动学计算得到。 #### 工具手参数对运动的影响 1. **平移影响**:设置工具手 X/Y/Z 偏移后,机器人将 TCP 点移动到目标位置而不是法兰中心 2. **旋转影响**:设置工具手 A/B/C 后,直角坐标系的旋转轴将围绕 TCP 点旋转 3. **速度影响**:线速度从法兰中心速度转换为 TCP 点速度 ### 切换工具手的坐标变换 当运行时切换工具手号时,系统会自动: 1. 读取新工具手的 (X, Y, Z, A, B, C) 参数 2. 重新计算工具手变换矩阵 T_tool 3. 后续所有运动指令基于新的 TCP 进行计算 ### 工具手负载参数对动力学的影响 负载参数 (payloadMass, payloadMassCenterX/Y/Z, payloadInertia) 用于: 1. **前馈补偿**:根据负载质量和质心位置计算前馈力矩 2. **碰撞检测**:修正碰撞检测阈值,防止误报 3. **力控模式**:在力控制中补偿负载重力和惯性 ### 坐标系变换示例 假设工具手参数为 X=-68, Y=3, Z=162, A=0, B=0, C=0(仅平移): TCP 相对于法兰的位置偏移为 (-68, 3, 162) mm 当法兰位于基座坐标 (500, 200, 800) 时,TCP 位于基座坐标 (432, 203, 962) ### 工具手参数校验 | 校验项 | 方法 | 标准 | |--------|------|------| | TCP位置 | 四/六点法标定后检查 | 标定距离 < 1mm | | 姿态精度 | 绕A/B/C轴旋转检查尖端偏移 | < 2mm | | 负载质心 | 实际测量与参数对比 | 偏差 < 50mm | | 负载质量 | 称重对比 | 偏差 < 1kg | --- # 用户坐标 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/05.%E7%94%A8%E6%88%B7%E5%9D%90%E6%A0%87.html ## 概述 用户坐标系是机器人在工件或工装上定义的局部坐标系,用于简化编程和操作。通过在不同工件上定义用户坐标系,可以使同一程序在不同工位间复用,大幅提高编程效率。 --- ## 坐标系层次 机器人系统中存在多层坐标系,从全局到局部的关系如下: ```text 大地坐标系 (World) └── 基坐标系 (Base/Robot) └── 用户坐标系 (User) ← 本章内容 └── 工具坐标系 (Tool) ``` | 坐标系 | 说明 | 默认原点 | |--------|------|----------| | 大地坐标系 | 车间地面的绝对参考系 | 固定在地面 | | 基坐标系 | 机器人底座上的参考系 | 机器人底座中心 | | 用户坐标系 | 工件/工装上的局部参考系 | 用户通过标定定义 | | 工具坐标系 | 工具末端 (TCP) 的参考系 | 工具法兰中心 | ### 用户坐标系的作用 1. **编程简化**:在工件上定义坐标系后,可以直接使用工件的长宽高方向编程 2. **程序复用**:同一程序应用于不同位置的工件时,只需切换用户坐标系 3. **偏移补偿**:通过修改用户坐标系偏移量实现工位微调 4. **多工位管理**:支持最多 999 个用户坐标系,满足多工位需求 --- ## 用户坐标标定 ### 标定方法 用户坐标系通过**三点法**进行标定: 1. **原点 (O)**:定义用户坐标系的原点位置 2. **X 轴方向点 (X)**:定义用户坐标系 X 轴正方向 3. **Y 轴方向点 (Y)**:定义用户坐标系 Y 轴正方向(Z 轴由右手定则确定) > **标定要求:** 原点、X 点、Y 点不能共线,否则标定失败。 ### 标定流程 1. 通过 `0x3562` 发送标定点位置信息(原点/X/Y) 2. 通过 `0x3560` 请求标定计算 3. 控制器回复 `0x3561` 告知计算结果 4. 通过 `0x3570` 查询标定后的位置信息验证 --- ### 0x3560 上位机请求用户坐标标定计算 **说明:** 上位机请求用户坐标标定计算 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 1 } ``` --- ### 0x3561 控制器回复用户坐标标定计算结果 **说明:** 控制器回复上位机用户坐标标定计算结果 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | result | bool | 标定计算是否成功 | | robot | int | 当前机器人号,范围[1,4] | **响应示例:** ```json { "result": true, "robot": 1 } ``` --- ### 0x3562 上位机请求当前用户坐标标定原点/X 值/Y 值 **说明:** 上位机请求当前用户坐标标定原点/X 值/Y 值 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | posX | double[] | 标记的 X 值位置信息列表,当`require`为`"OXY"`时该节点存在 | | posY | double[] | 标记的 Y 值位置信息列表,当`require`为`"OXY"`时该节点存在 | | posZero | double[] | 标记的原点位置信息列表,当`require`为`"OXY"`时该节点存在 | | require | string | 标记点信息,取值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;取值为`"OXY"`时,标记所有点 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "posX": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "posY": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "posZero": [470.7460, 0.0, 817.3340, 3.1410, 0.0, 0.0], "require": "OXY", "robot": 1, "user": 1 } ``` --- ### 0x3563 控制器回复当前用户坐标标定原点/X 值/Y 值 **说明:** 控制器回复上位机当前用户坐标标定原点/X 值/Y 值 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 弧度制下的位置信息列表 | | positionDeg | double[] | 角度制下的位置信息列表 | | require | string | 标记点信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值 | | robot | int | 当前机器人号,范围[1,4] | | status | bool | 标定状态,`true`表示已标定,`false`表示未标定 | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "position": [470.746, 0.0, 817.334, 3.141, 0.0, 0.0], "positionDeg": [470.746, 0.0, 817.334, 179.966043450592, 0.0, 0.0], "require": "O", "robot": 1, "status": true, "user": 1 } ``` --- ### 0x3570 上位机查询用户坐标标定点位置信息 **说明:** 上位机查询用户坐标标定点位置信息 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | require | string | 需要查询的位置信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;值为`"Calibration"`时表示计算后的位置信息 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "require": "X", "robot": 1, "user": 1 } ``` --- ### 0x3571 控制器回复用户坐标标定点位置信息 **说明:** 控制器回复上位机用户坐标标定点位置信息 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 弧度制下的位置信息列表;`require`为`"Calibration"`时为弧度制下偏移量 | | positionDeg | double[] | 角度制下的位置信息列表;`require`为`"Calibration"`时为角度制下偏移量 | | require | string | 查询的位置信息,值为`"0"`、`"X"`、`"Y"`时分别表示标记原点,X 值,Y 值;值为`"Calibration"`时表示计算后的位置信息 | | robot | int | 当前机器人号,范围[1,4] | | status | bool | 标定状态,`true`表示已标定,`false`表示未标定;`require`为`"Calibration"`时该节点不存在 | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "positionDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "require": "X", "robot": 1, "status": false, "user": 1 } ``` --- ## 用户坐标号 ### 0x3580 上位机请求切换用户坐标 **说明:** 上位机请求切换用户坐标 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 需要切换到的用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 3 } ``` > **注意:** 切换用户坐标系后,所有后续运动指令将基于新的用户坐标系执行。确保目标用户坐标系已正确标定。 --- ### 0x3581 上位机查询当前已选中的用户坐标号 **说明:** 上位机查询当前已选中用户坐标号 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 0x3582 控制器回复已选中的用户坐标号 **说明:** 控制器回复上位机已选中的用户坐标号 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "robot": 1, "user": 3 } ``` --- ## 用户坐标注释 ### 0x3590 上位机请求设置用户坐标注释 **说明:** 上位机请求设置用户坐标注释 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | note | string | 需要设置的注释 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "note": "AAA", "robot": 1, "user": 1 } ``` --- ### 0x3591 上位机查询用户坐标号注释 **说明:** 上位机查询用户坐标号注释 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "robot": 1, "user": 1 } ``` --- ### 0x3592 控制器回复用户坐标号注释 **说明:** 控制器回复上位机用户坐标号注释 **响应参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | note | string | 当前用户坐标注释 | | robot | int | 当前机器人号,范围[1,4] | | user | int | 当前用户坐标号,范围[1,999] | **响应示例:** ```json { "note": "AAA", "robot": 1, "user": 1 } ``` --- ### 0x3593 上位机设置用户坐标偏移量 **说明:** 上位机设置用户坐标偏移量 **请求参数:** | 参数 | 类型 | 说明 | | ---- | ---- | ---- | | position | double[] | 设置的偏移量列表,按顺序分别为 X 值,Y 值,Z 值,A 值,B 值,C 值 | | user | int | 当前用户坐标号,范围[1,999] | **请求示例:** ```json { "position": [5.0, 0.0, 0.0, 0.0, 0.0, 0.0], "user": 1 } ``` ### 偏移量用途 偏移量用于在不重新标定的情况下微调用户坐标系的位置: - **X/Y/Z 偏移**:平移用户坐标系原点 - **A/B/C 偏移**:旋转用户坐标系方向(欧拉角) > **典型场景:** 工装更换后工件位置发生微小偏移,通过调整偏移量即可恢复精度,无需重新标定。 --- # 零点 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/06.%E9%9B%B6%E7%82%B9.html ## 概述 零点是机器人各关节轴的基准参考位置。准确的零点标定是保证机器人运动精度的基础。本章说明零点相关的所有协议命令,包括零点标定流程、零点偏移设置、编码器状态查询和多圈值/单圈值管理。 --- ## 零点标定流程 ### 标准零点标定步骤 零点标定的完整流程如下: 1. **编码器状态检查**:通过 `0x3603` 查询编码器状态,确认无欠压报警 2. **标记无间隙方向**:通过 `0x3600` 请求标记无间隙方向(消除传动间隙对零点的影响) 3. **清除多圈值**:通过 `0x3601` 清除轴多圈值,将当前编码器位置重置 4. **移动机器人到零点**:手动将机器人各轴移动到机械零点位置 5. **设置零点偏移**:通过 `0x3605` 设置零点偏移值(度数值或偏移量) 6. **设置单圈值**:通过 `0x3606` 微调各轴单圈值 7. **验证零点**:查询单圈值确认零点设置正确 ### 零点标定类型 | 标定方式 | mode 值 | 说明 | 适用场景 | |----------|---------|------|----------| | 度数方式 | 0 | 直接设置各轴的目标角度值 | 已知精确零点角度时的快速标定 | | 偏移量方式 | 1 | 设置各轴相对于当前编码器位置的偏移量 | 机械零点定位后的微调标定 | ### 零点精度要求 - 零点精度直接影响机器人的**绝对定位精度** - 各轴零点偏差应在 **±0.01°** 以内 - 零点标定后应通过运行验证程序确认精度 - 更换电机、编码器或减速机后需要重新标定零点 ### 零点标定注意事项 - 标定前确认机器人**各轴无负载** - 标定前确认编码器**无欠压报警** - 标定时各轴应处于**无间隙方向** - 标定完成后建议**保存配置并重启验证** --- ## 请求标记无间隙方向 **命令字:** `0x3600` - 无需发送数据 --- ## 清除轴多圈值 ### 请求清除轴多圈值 **命令字:** `0x3601` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 需要清除多圈值的轴,范围 [0, 7],0 表示清除所有轴多圈值 | | clear | bool | 是否清除多圈值 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "axis": 0, "clear": true, "robot": 1 } ``` **控制器回复** **命令字:** `0x3602` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 清除多圈值的轴,范围 [0, 7] | | result | int | 清除多圈值结果,范围 [0, 1] | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "axis": 0, "result": 1, "robot": 1 } ``` --- ## 编码器状态 ### 查询编码器状态 **命令字:** `0x3603` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3604` | 字段 | 类型 | 说明 | |------|------|------| | encoderUndervoltage | bool[] | 欠压报警列表,false 表示不欠压,true 表示欠压,长度为当前机器人轴数 | | encoderUnderVoltageExternal | bool[] | 外部轴欠压报警列表,false 表示不欠压,true 表示欠压,长度为当前机器人外部轴轴数 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "encoderUndervoltage": [false, false, false, false, false, false], "encoderUnderVoltageExternal": [false, false, false, false, false], "robot": 1 } ``` --- ## 零点偏移 ### 设置零点偏移 **命令字:** `0x3605` | 字段 | 类型 | 说明 | |------|------|------| | axis | int | 设置零点偏移的轴,范围 [0, 7],0 表示设置全部轴 | | mode | int | 零点偏移方式:0 表示度数,1 表示偏移量 | | robot | int | 当前机器人号,范围 [1, 4] | | value | double[] | 零点偏移值列表,长度为 7;当 mode 为度数时范围 [-360, 360] | ```json { "axis": 0, "mode": 0, "robot": 1, "value": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 单圈值 ### 设置单圈值 **命令字:** `0x3606` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 设置的各轴单圈值列表,范围 [-2^31, 2^31-1] | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0] } ``` ### 查询单圈值 **命令字:** `0x3607` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x3608` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 各轴单圈值列表,范围 [-2^31, 2^31-1] | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0] } ``` --- ## 多圈值 > 零点偏移为编码器时 ### 查询多圈值 **命令字:** `0x330B` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x330C` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | | value | int[] | 电机编码器值列表 | ```json { "robot": 1, "value": [0, 0, 0, 0, 0, 0, 0] } ``` --- # 复位点 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/07.%E5%A4%8D%E4%BD%8D%E7%82%B9.html ## 概述 上位机与控制器通过复位点协议进行通信,用于设置和查询机器人复位点位置、复位 IO 参数、安全位置等相关配置。 ### 复位点概念 复位点是机器人在特定条件下需要返回的安全参考位置。典型的应用场景包括: - **安全事件后复位**:急停或安全门触发后,机器人需要先回到复位点才能继续运行 - **程序异常中断后复位**:程序执行中断后,机器人需要回到复位点重新开始 - **断电重启后复位**:断电后重新上电,机器人需要从复位点开始运行 ### 复位形式 | 形式 | selectPiontOrFile 值 | 说明 | |------|---------------------|------| | 复位点 | 0 | 机器人移动到预设的复位点关节位置 | | 复位程序 | 1 | 机器人执行预设的复位程序 | ### 插补方式 | 方式 | returnWay 值 | 说明 | |------|-------------|------| | 关节插补 | 0 | 各轴以关节插补方式同时移动到复位点 | | 直线插补 | 1 | 末端以直线路径移动到复位点(需要逆解) | --- ## 复位点配置参数总览 | 参数类别 | 参数 | 说明 | |----------|------|------| | 位置参数 | `pos` / `posSync` | 本体轴/外部轴复位点位置 | | 安全参数 | `deviation` / `deviationSync` | 各轴安全范围偏差 | | IO 参数 | `inPort` / `inValue` / `outPort` | 开始/结束 IO 信号 | | 控制参数 | `returnWay` / `safeEnable` / `selectPiontOrFile` | 插补方式/安全使能/复位形式 | ### 安全使能 (safeEnable) 当 `safeEnable` 为 `true` 时: - 机器人在安全事件后**必须手动回到安全点位置**才能重新运行 - 控制器通过 `0x3665` 上报当前不在安全位置的机器人状态 --- ## 1. 上位机设置复位点位置 **命令字:** `0x3660` ### 请求参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | pos | double[] | 7 | 机器人复位点位置列表 | | posSync | double[] | 5 | 机器人外部轴复位点位置列表 | | robot | int | 1 | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "pos": [10.20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posSync": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- ## 2. 上位机查询复位点位置 **命令字:** `0x3661` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "robot": 1 } ``` --- ## 3. 控制器回复上位机复位点位置 **命令字:** `0x3662` ### 响应参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | deviation | double[] | 7 | 机器人各轴安全范围,范围[0,10] | | deviationSync | double[] | 5 | 机器人外部轴各轴安全范围,范围[0,10] | | inPort | int | 1 | 开始 DIN | | inValue | int | 1 | 开始 DIN 参数,范围[0,1] | | outPort | int | 1 | 结束 DOUT | | pos | double[] | 7 | 机器人复位点位置列表 | | posSync | double[] | 5 | 外部轴复位点位置列表 | | returnWay | int | 1 | 插补方式:0-关节插补,1-直线插补 | | robot | int | 1 | 当前机器人号,范围[1,4] | | safeEnable | bool | 1 | 安全使能:安全使能开始时,机器人必须手动回到安全点位置才能重新运行 | | selectPiontOrFile | int | 1 | 机器人复位形式:0-复位点,1-复位程序 | ### 响应示例 ```json { "deviation": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0], "inPort": 0, "inValue": 1, "outPort": 0, "pos": [10.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posSync": [0.0, 0.0, 0.0, 0.0, 0.0], "returnWay": 0, "robot": 1, "safeEnable": false, "selectPiontOrFile": 0 } ``` --- ## 4. 上位机设置复位 IO 参数 **命令字:** `0x3663` ### 请求参数 | 参数名 | 类型 | 说明 | |--------|------|------| | inPort | int | 开始 DIN | | inValue | int | 开始 DIN 参数,范围[0,1] | | outPort | int | 结束 DOUT | | returnWay | int | 插补方式:0-关节插补,1-直线插补 | | robot | int | 当前机器人号,范围[1,4] | | safeEnable | bool | 安全使能:安全使能开始时,机器人必须手动回到安全点位置才能重新运行 | | selectPiontOrFile | int | 机器人复位形式:0-复位点,1-复位程序 | ### 请求示例 ```json { "inPort": 0, "inValue": 1, "outPort": 0, "returnWay": 0, "robot": 1, "safeEnable": false, "selectPiontOrFile": 0 } ``` --- ## 5. 上位机设置复位点安全位置 **命令字:** `0x3664` ### 请求参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | deviation | double[] | 7 | 机器人各轴安全范围,范围[0,10] | | deviationSync | double[] | 5 | 机器人外部轴各轴安全范围,范围[0,10] | | robot | int | 1 | 当前机器人号,范围[1,4] | ### 请求示例 ```json { "deviation": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "deviationSync": [1.0, 1.0, 1.0, 1.0, 1.0], "robot": 1 } ``` --- ## 6. 控制器回复上位机当前不在安全位置 **命令字:** `0x3665` ### 响应参数 | 参数名 | 类型 | 长度 | 说明 | |--------|------|------|------| | currentPos | double[] | 6 | 当前机器人位置列表,长度为当前机器人轴数 | | isSync | bool | 1 | 是否为外部轴 | | robot | int | 1 | 当前机器人号,范围[1,4] | | safePos | double[] | 6 | 复位点位置列表 | ### 响应示例 ```json { "currentPos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "isSync": false, "robot": 1, "safePos": [10.2, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 复位点配置流程 建议按以下顺序配置复位点: 1. **设置复位点位置** (`0x3660`):定义复位点的各轴关节角度 2. **设置安全范围** (`0x3664`):定义各轴允许的偏差范围 3. **设置 IO 参数** (`0x3663`):配置复位开始/结束的 IO 信号条件 4. **查询验证** (`0x3661`/`0x3662`):查询当前配置,确认参数正确 > **注意:** `returnWay` 选择直线插补时,需确保复位点位置在机器人的可达工作空间内,否则可能导致逆解失败。 --- # 标定 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/08.%E6%A0%87%E5%AE%9A.html ## 四点标定 说明:机器人末梢移动到并标定四个点,计算后可得杆长度和轴零点偏移,若认可计算结果,可将计算结果填入 DH 参数。 ### 上位机四点标定计算请求 **命令字:** `0x3700` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | ParamOf4Points | double[] | 长度为2,L1和 L2长度。两参数分别为机器人末梢从标记点 A 移动到标记点 C 时 X 的移动距离和 Y 的移动距离 | ```json { "ParamOf4Points": [85.0, 70.0] } ``` ### 上位机 N 号点标定请求 **命令字:** `0x3701` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | pointNum | int | 范围[0,3],标定点编号 | | status | int | 范围[0,1],标定状态。0表示取消标定,1表示标定 | ```json { "pointNum": 0, "status": 1 } ``` ### 控制器回复上位机 N 号点标定位置信息 **命令字:** `0x3702` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | pointNum | int | 范围[0,3],标定点编号 | | pos | double[] | 长度为4,位置信息列表 | ```json { "pointNum": 0, "pos": [0.0, 0.0, 0.0, 0.0] } ``` ### 控制器回复上位机标定计算结果 **命令字:** `0x3703` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | dtheta | double[] | 长度为2,轴零点偏移列表。值全为-1表示计算失败 | | length | double[] | 长度为2,杆长度列表。值全为-1表示计算失败 | | result | bool | 是否计算成功 | ```json { "dtheta": [-1.0, -1.0], "length": [-1.0, -1.0], "result": false } ``` ### 上位机请求将计算结果填入 DH 参数 **命令字:** `0x3704` ```json {} ``` ### 控制器回复上位机填入 DH 参数结果 **命令字:** `0x3705` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | apply | bool | 计算结果填入是否成功 | ```json { "apply": true } ``` ### 上位机查询标定信息 **命令字:** `0x3706` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | dtheta | double[] | 长度为2,轴零点偏移列表。null 表示没有计算结果 | | length | double[] | 长度为2,杆长度列表。null 表示没有计算结果 | | result | bool | 是否计算成功 | | status | int[] | 点位标定状态列表。0表示未标定,1表示已标定 | ```json { "dtheta": [null, null], "length": [null, null], "result": false, "status": [0, 1, 0, 1] } ``` ## 20点标定 说明:一种用于校准机器人的方法,通过在特定的20个点上进行标定,以确保机器人的准确性和稳定性。 ### 上位机标定计算请求 **命令字:** `0x3710` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | noCalZero | bool | 是否为校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "noCalZero": false, "robot": 1, "tool": 1 } ``` ### 上位机标定 N 号点请求 **命令字:** `0x3711` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 1, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机 N 号点标定信息 **命令字:** `0x3712` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | position | double[] | 标定点关节坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrationType": 20, "point": 1, "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ### 控制器回复上位机标定计算完成结果 **命令字:** `0x3713` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | distance | double | 标定计算结果。结果为-1表示计算失败,结果>10则请重新标定 | | result | bool | 标定计算是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "distance": 464.473876425245, "result": true, "robot": 1 } ``` ### 上位机发送设置标定结果为零点 **命令字:** `0x3714` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 12, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机标定结果为零点设置结果 **命令字:** `0x3715` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | apply | bool | 设置为零点是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "apply": true, "robot": 1 } ``` ### 上位机查询全部点标定状态 **命令字:** `0x3716` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手号 | ```json { "calibrationType": 20, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机全部点标定状态 **命令字:** `0x3717` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | robot | int | 范围[1,4],当前机器人号 | | status | int[] | 点位标定状态列表。1表示已标定,0表示未标定。长度为当前使用标点法 | ```json { "calibrationType": 20, "robot": 1, "status": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] } ``` ### 上位机请求清除 N 号点标定状态 **命令字:** `0x3718` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 范围[0,20],标定点编号。20表示清除所有点 | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 20, "robot": 1, "tool": 1 } ``` ### 上位机查询 N 号点位置信息 **命令字:** `0x3719` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | robot | int | 范围[1,4],当前机器人号 | | tool | int | 范围[1,999],当前工具手编号 | ```json { "calibrationType": 20, "point": 1, "robot": 1, "tool": 1 } ``` ### 控制器回复上位机 N 号点位置信息 **命令字:** `0x371A` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 | | point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] | | position | double[] | 标定点关节坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrationType": 20, "point": 1, "position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ### 上位机请求移动到计算结果位置 **命令字:** `0x371B` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人号 | ```json { "robot": 1 } ``` ### 上位机查询是否可以打开标定页面 **命令字:** `0x371C` ```json {} ``` ### 控制器回复上位机是否可以打开标定页面 **命令字:** `0x371D` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | canCalibration | bool | 上位机是否可以打开标定页面 | ```json { "canCalibration": true } ``` ## 外部轴标定 说明:包含有旋转轴标定和直线轴(地轨)协同参数。 ### 上位机外部旋转轴标定计算请求 **命令字:** `0x3730` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateNum | int | 范围[1,3],当前轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrateNum": 1, "robot": 1 } ``` ### 上位机外部轴标定 N 号点请求 **命令字:** `0x3731` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[1,3],当前轴组号 | | pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 1, "pointNum": 0, "robot": 1 } ``` ### 控制器回复上位机外部轴 N 号点标定信息 **命令字:** `0x3732` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[1,3],当前轴组号 | | pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] | | pos | double[] | 标定点直角坐标信息列表,长度为6 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 1, "pointNum": 0, "pos": [470.746, 0.0, 817.334, 3.14159265359, 0.0, 0.0], "robot": 1 } ``` ### 控制器回复上位机外部轴标定计算结果 **命令字:** `0x3733` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | result | bool | 外部轴标定计算是否成功 | | robot | int | 范围[1,4],当前机器人号 | ```json { "result": true, "robot": 1 } ``` ### 上位机查询机器人绑定外部轴标定状态 **命令字:** `0x3734` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复上位机机器人绑定外部轴标定状态 **命令字:** `0x3735` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool[] | 长度为3,机器人绑定外部轴标定状态。true 表示已标定,false 表示未标定 | | robot | int | 范围[1,4],当前机器人号 | ```json { "calibrateResult": [false, false, false], "robot": 1 } ``` ### 上位机设置当前协作外部轴组号 **命令字:** `0x3736` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[0,2],协作外部轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 0, "robot": 1 } ``` ### 上位机查询当前协作外部轴组号 **命令字:** `0x3737` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复上位机当前协作外部轴组号 **命令字:** `0x3738` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | externalGroupNum | int | 范围[0,2],协作外部轴组号 | | robot | int | 范围[1,4],当前机器人号 | ```json { "externalGroupNum": 0, "robot": 1 } ``` ### 上位机设置地轨协同参数 **命令字:** `0x3739` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool | 地轨是否协同。协同:当启用地址是确定 | | conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。超过当前轴数的部分默认为1.0 | | trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。超过当前轴数的部分默认为0 | ```json { "calibrateResult": true, "conversionRatio": [58.0, 1.0, 1.0], "trackMap": [1, 0, 0] } ``` ### 上位机查询当前机器人地轨协同参数 **命令字:** `0x373A` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | robot | int | 范围[1,4],当前机器人编号 | ```json { "robot": 1 } ``` ### 控制器回复当前机器人地轨协同参数 **命令字:** `0x373B` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | calibrateResult | bool | 地轨是否协同 | | conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。初始化为9999 | | robot | int | 当前机器人号 | | trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。初始化为0 | ```json { "calibrateResult": false, "conversionRatio": [9999, 9999, 9999], "robot": 1, "trackMap": [0, 0, 0] } ``` ### 上位机发送设置外部轴标定结果 **命令字:** `0x373C` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | | resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 | ```json { "syncPositionerNum": 1, "resultArray": [ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] } ``` ### 上位机查询外部轴标定结果 **命令字:** `0x373D` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | ```json { "syncPositionerNum": 1 } ``` ### 控制器回复上位机外部轴标定结果 **命令字:** `0x373E` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | syncPositionerNum | int | 范围[1,3],当前轴组号 | | calibrateResult | bool | 外部轴标定计算结果 | | resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 | ```json { "syncPositionerNum": 1, "calibrateResult": false, "resultArray": [ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] } ``` ### 上位机发送设置地轨方向校准系数 **命令字:** `0x373F` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` ### 上位机查询地轨方向校准系数 **命令字:** `0x3740` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | ```json { "axis_num": 1 } ``` ### 控制器回复地轨方向校准系数 **命令字:** `0x3741` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` ### 上位机标定轴 N 号点请求 **命令字:** `0x3742` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | | point_num | int | 范围[1,2],当前标定点编号 | ```json { "axis_num": 1, "point_num": 1 } ``` ### 上位机请求地轨移动到标记点 **命令字:** `0x3743` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | | point_num | int | 范围[1,2],当前标定点编号 | ```json { "axis_num": 1, "point_num": 1 } ``` ### 上位机地轨标定点计算请求 **命令字:** `0x3744` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],当前标定的轴号 | ```json { "axis_num": 1 } ``` ### 控制器回复上位机标定计算结果 **命令字:** `0x3745` | 参数名 | 类型 | 范围/说明 | |--------|------|-----------| | axis_num | int | 范围[1,3],地轨轴号 | | direction_ratio | double[] | 方向校准系数。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 | ```json { "axis_num": 1, "direction_ratio": [1.0, 0.0, 0.0] } ``` --- ## 标定算法参数 ### 四点标定算法 四点标定通过四个已知位置的标定点,利用几何关系计算出机器人杆长和轴零点偏移。 #### 算法原理 1. 机器人末梢移动到四个标定点(标记点 A, B, C, D) 2. 通过最小二乘法求解杆长 L1, L2 和轴零点偏移 dtheta1, dtheta2 3. 计算结果可填入 DH 参数,修正运动学模型 #### 算法参数 (ParamOf4Points) | 参数 | 说明 | 单位 | |------|------|------| | L1 | 机器人末梢从标记点A移动到C时X方向移动距离 | mm | | L2 | 机器人末梢从标记点A移动到C时Y方向移动距离 | mm | ### 20点标定算法 20点标定通过在不同姿态下的大量采样点,利用非线性优化算法求解完整的运动学参数。 #### 优化目标 最小化所有标定点的位置误差:min sum(||P_actual_i - P_target||) 其中 P_actual_i 是第 i 个标定点的实际位置,P_target 是标记点位置。 #### 收敛条件 | 条件 | 阈值 | 说明 | |------|------|------| | 标定距离 | < 10mm | 标定计算结果 distance < 10 表示标定成功 | | 计算成功 | result=true | 优化算法成功收敛 | #### 标定点方法选择 | calibrationType | 方法 | 标定点数 | 校准内容 | 适用场景 | |-----------------|------|----------|----------|----------| | 2 | 2点法 | 2 | 简单校准 | 快速校准 | | 12 | 12点法 | 12 | 零点+工具手 | 未激光标定+焊枪 | | 15 | 15点法 | 15 | 零点+工具手(精确) | 高精度场景 | | 20 | 20点法(校准零点) | 20 | 零点+工具手 | 零点丢失 | | 21 | 21点法(不校准零点) | 21 | 仅工具手 | 零点已校准 | ### 标定算法参数调节 | 参数 | 说明 | 推荐值 | |------|------|--------| | 标定点分布 | 标定点应覆盖尽可能大的工作空间 | 全工作空间的60%以上 | | 姿态多样性 | 各标定点的姿态应有明显差异 | 各轴角度变化 > 20度 | | 参考点稳定性 | 参考点在标定过程中不允许移动 | 固定偏差 < 0.1mm | --- ## 自动标定流程 ### 四点标定流程 #### 标定步骤 1. **准备阶段** - 确认机器人处于手动/示教模式 - 安装标定工具(如标定锥) - 设置固定参考点 2. **标定阶段** - 移动机器人末梢到标记点 A,发送标定请求(0x3701, pointNum=0, status=1) - 沿 X 方向移动 L1 距离到标记点 C,发送标定请求(0x3701, pointNum=2, status=1) - 沿 Y 方向移动 L2 距离到标记点 B,发送标定请求(0x3701, pointNum=1, status=1) - 移动机器人末梢到标记点 D,发送标定请求(0x3701, pointNum=3, status=1) 3. **计算阶段** - 发送标定计算请求(0x3700),传入 ParamOf4Points=[L1, L2] - 控制器返回计算结果(0x3703),包含杆长 length 和零点偏移 dtheta - 检查 result 是否为 true,dtheta 和 length 是否不为 -1 4. **应用阶段** - 如认可结果,发送填入 DH 参数请求(0x3704) - 控制器返回应用结果(0x3705) #### 标定数据流 标定点1~4 -> 几何计算 -> 杆长 L1+L2 + 零点偏移 dtheta1+dtheta2 -> 填入 DH 参数 -> 验证 ### 20点标定流程 #### 标定步骤 1. **准备阶段** - 设置参考点(固定标记点) - 选择标定方法类型 (calibrationType=20) - 选择工具手编号 2. **标定阶段(循环20次)** - 移动机器人到第 i 个标定点 - 发送标定请求(0x3711, point=i) - 控制器返回标定点信息(0x3712) 3. **计算阶段** - 全部20点标定完成后,发送计算请求(0x3710) - 控制器返回计算结果(0x3713),包含 distance 和 result - 检查 result=true 且 distance < 10 4. **应用阶段** - 如认可结果,发送设置为零点请求(0x3714) - 控制器返回设置结果(0x3715) #### 标定状态查询 可随时查询各标定点的完成情况: - 查询全部点状态(0x3716/0x3717): 返回 status 数组,1=已标定,0=未标定 - 查询 N 号点位置(0x3719/0x371A): 返回该点的关节坐标 ### 外部轴标定流程 #### 旋转轴标定 1. 设置协作外部轴组号(0x3736) 2. 移动机器人到标定点1,发送标定请求(0x3731, pointNum=0) 3. 旋转外部轴到不同角度,移动机器人到标定点2~5,逐一标定 4. 发送计算请求(0x3730)获取标定结果(0x3733) #### 地轨标定 1. 设置地轨协同参数(0x3739):包含转换比(conversionRatio)和各轴方向(trackMap) 2. 移动地轨到标记点1,发送标定请求(0x3742, point_num=1) 3. 移动地轨到标记点2,发送标定请求(0x3742, point_num=2) 4. 发送计算请求(0x3744)获取方向校准系数(0x3745) ### 自动标定安全检查 | 检查项 | 方法 | 标准 | |--------|------|------| | 参考点固定 | 标定前后检查参考点位置 | 偏差 < 1mm | | 碰撞风险 | 标定路径上无障碍物 | 手动确认路径安全 | | 伺服状态 | 标定前确认伺服开启 | 各轴伺服正常 | | 急停可用 | 确保急停按钮可用 | 紧急情况可中断 | --- # 干涉区 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/09.%E5%B9%B2%E6%B6%89%E5%8C%BA.html ## 概述 干涉区是用于多机器人协作或机器人与外部设备交互时,防止碰撞的安全区域机制。通过定义笛卡尔空间中的矩形区域,控制器可以实时监控机器人末端/工具是否进入或离开指定的干涉区,并根据配置执行相应的动作(状态输出或禁止运动)。 --- ## 干涉区概念 ### 干涉区定义 干涉区是笛卡尔空间中的一个**轴对齐矩形区域(AABB)**,由最小坐标点 (minX, minY, minZ) 和最大坐标点 (maxX, maxY, minZ) 定义。控制器实时计算机器人末端(TCP)位置,判断其是否在干涉区内。 ### 干涉区类型 | 类型 | workType 值 | 说明 | 典型应用 | |------|------------|------|----------| | 状态输出 | 0 | 机器人在区域内时输出 IO 信号 | 通知外部设备机器人已到达工作区域 | | 禁止运动 | 1 | 机器人在区域内时禁止运动 | 防止两台机器人进入对方的作业空间 | ### 区域判断 | 判断方式 | isInInterfer 值 | 说明 | |----------|----------------|------| | 在区域内 | 1 | 当机器人末端在区域内时触发 | | 在区域外 | 0 | 当机器人末端在区域外时触发 | ### 干涉区应用场景 1. **多机器人协作**:定义各机器人的专属工作区域,防止同时进入同一区域 2. **机器人与外部设备**:定义设备的安全区域,机器人进入时降低速度或停止 3. **工位管理**:定义不同工位的边界,通过 IO 信号通知 PLC 机器人的位置 4. **安全围栏**:定义虚拟围栏,机器人越界时停止运动 --- ## 干涉区数量与编号 - 每个机器人支持最多 **99 个干涉区**(工艺号 1-99) - 每个干涉区独立配置,互不影响 - 干涉区坐标系基于**当前选中的用户坐标系** --- ## 干涉区范围 ### 上位机设置干涉区范围 **命令字:** `0x3800` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 工艺号 | | param | object | - | 干涉区参数 | | robot | int | [1,4] | 当前机器人号 | **param 参数:** | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | varName | string | GB001-GB999 | 用于干涉区输出值 | | shapeInterfere | int | - | 干涉区形状 | | interfereNote | string | - | 干涉区注释 | | enable | bool | - | 干涉区使能 | | isInInterfer | int | [0,1] | 在区域内/外:0表示在区域外,1表示在区域内 | | maxX | double | [-9999,9999] mm | 最大 X | | maxY | double | [-9999,9999] mm | 最大 Y | | maxZ | double | [-9999,9999] mm | 最大 Z | | minX | double | [-9999,9999] mm | 最小 X | | minY | double | [-9999,9999] mm | 最小 Y | | minZ | double | [-9999,9999] mm | 最小 Z | | port | int | - | 输出 IO 端口 | | value | int | [0,1] | 输出参数 | | workType | int | [0,1] | 起作用方式:0表示状态输出,1表示禁止运动 | **示例:** ```json { "num": 1, "param": { "varName": "GB001", "shapeInterfere": 1, "interfereNote": "", "enable": false, "isInInterfer": 1, "maxX": "1101.05", "maxY": "183.569", "maxZ": "1024.13", "minX": "833.956", "minY": "-173.017", "minZ": "944.358", "port": 0, "value": 0, "workType": 0 }, "robot": 1 } ``` ### 配置建议 - `minX` < `maxX`,`minY` < `maxY`,`minZ` < `maxZ`,否则干涉区无效 - 干涉区应设置在机器人可达工作空间内 - 多个干涉区可以重叠,重叠区域的判断结果取并集 --- ### 上位机查询干涉区范围 **命令字:** `0x3801` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "robot": 1 } ``` --- ### 控制器回复上位机干涉区参数/干涉点标记结果 **命令字:** `0x3802` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 工艺号 | | param | object | - | 干涉区参数 | | robot | int | [1,4] | 当前机器人号 | **param 参数:** | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | calibrationState1 | int | [0,1] | 标记点1是否标定:0表示未标定,1表示已标定 | | calibrationState2 | int | [0,1] | 标记点2是否标定:0表示未标定,1表示已标定 | | enable | bool | - | 干涉区使能 | | isInInterfer | int | [0,1] | 在区域内/外:0表示在区域外,1表示在区域内 | | maxX | double | [-9999,9999] mm | 最大 X | | maxY | double | [-9999,9999] mm | 最大 Y | | maxZ | double | [-9999,9999] mm | 最大 Z | | minX | double | [-9999,9999] mm | 最小 X | | minY | double | [-9999,9999] mm | 最小 Y | | minZ | double | [-9999,9999] mm | 最小 Z | | point1Data | double[] | - | 标记点1标记位置信息列表 | | point2Data | double[] | - | 标记点2标记位置信息列表 | | port | int | - | 输出 IO 端口 | | value | int | [0,1] | 输出参数 | | workType | int | [0,1] | 起作用方式:0表示状态输出,1表示禁止运动 | **示例:** ```json { "num": 1, "param": { "calibrationState1": 0, "calibrationState2": 0, "enable": false, "isInInterfer": 1, "maxX": "1101.05", "maxY": "183.569", "maxZ": "1024.13", "minX": "833.956", "minY": "-173.017", "minZ": "944.358", "point1Data": [0, 0, 0, 0, 0, 0], "point2Data": [0, 0, 0, 0, 0, 0], "port": 0, "value": 0, "workType": 0 }, "robot": 1 } ``` --- ## 干涉点 ### 干涉点概念 干涉点用于辅助定义干涉区的位置。通过示教标记两个对角点(标记点1和标记点2),控制器可以自动计算干涉区的边界范围。这是一种便捷的干涉区定义方式。 ### 标记点标定流程 1. 通过 `0x3810` 发送标记请求,指定标记点号 (1 或 2) 2. 手动将机器人移动到目标位置 3. 控制器记录当前位置作为标记点 4. 完成两个标记点后,通过 `0x3811` 请求计算干涉区范围 --- ### 上位机请求标记干涉点 **命令字:** `0x3810` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | calibrationState1 | int | [0,1] | 标记点1状态:0表示进行标定,1表示取消标定 | | calibrationState2 | int | [0,1] | 标记点2状态:0表示进行标定,1表示取消标定 | | num | int | [1,99] | 工艺号 | | pos | int | [1,2] | 标记点号:1表示标记点1,2表示标记点2 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "calibrationState1": 1, "calibrationState2": 1, "num": 1, "pos": 1, "robot": 1 } ``` --- ### 上位机请求标记完成计算 **命令字:** `0x3811` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "robot": 1 } ``` --- ### 上位机请求移动到标记点 **命令字:** `0x3812` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | num | int | [1,99] | 当前查询的工艺号 | | pos | int | [1,2] | 需要移动到的标记点号 | | robot | int | [1,4] | 当前机器人号 | **示例:** ```json { "num": 1, "pos": 1, "robot": 1 } ``` --- # 跟随误差&电机过载保护 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/10.%E8%B7%9F%E9%9A%8F%E8%AF%AF%E5%B7%AE&%E7%94%B5%E6%9C%BA%E8%BF%87%E8%BD%BD%E4%BF%9D%E6%8A%A4.html ## 概述 跟随误差和电机过载保护是机器人运动控制中的关键安全监测机制。本章说明跟随误差的概念、监测参数设置、电机过载保护配置以及连杆额外负载参数设置。 --- ## 跟随误差概念 ### 什么是跟随误差 **跟随误差**是指控制器下发的**指令位置**与伺服驱动器反馈的**实际位置**之间的偏差。它是衡量伺服系统跟踪性能的核心指标。 - **静态误差**:机器人静止时的指令位置与实际位置偏差 - **动态误差**:机器人运动时的指令位置与实际位置偏差 ### 跟随误差过大的原因 | 原因 | 说明 | 排查方向 | |------|------|----------| | 负载过重 | 电机输出扭矩不足以驱动负载 | 减轻负载或调整加减速参数 | | 加减速过大 | 指令加速度超过电机能力 | 降低加速度参数 | | 机械卡滞 | 机械传动部分存在阻力 | 检查减速机、导轨等机械部件 | | 伺服参数不当 | 伺服增益等参数设置不合理 | 调整伺服 PID 参数 | | 编码器故障 | 编码器反馈异常 | 检查编码器连接和状态 | ### 跟随误差保护机制 当跟随误差超过设定的**最大跟随误差上限**时,控制器将: 1. 立即停止当前运动(紧急停止) 2. 上报跟随误差过大错误(kind=2) 3. 需要清除错误后才能重新使能 --- ## 1. 最大跟随误差上限 ### 1.1 上位机设置最大跟随误差参数上限 **命令字:** `0x3860` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | maxDynamicDeviations | array | 最大动态误差列表,长度为机器人轴数 | [1, 2×10⁷] ‱° | | maxStaticDeviations | array | 最大静态误差列表,长度为机器人轴数 | [1, 2×10⁷] ‱° | | maxExternalDynamicDeviations | array | 外部轴最大动态误差列表,长度为外部轴轴数 | [1, 2×10⁷] ‱° | | maxExternalStaticDeviations | array | 外部轴最大静态误差列表,长度为外部轴轴数 | [1, 2×10⁷] ‱° | > **单位说明:** ‱° 表示万分之一度(0.0001°),例如 5000000 表示 500° 的跟随误差阈值。 **请求示例:** ```json { "maxDynamicDeviations": [45, 5000000, 5000000, 5000000], "maxStaticDeviations": [45, 5000000, 5000000, 5000000], "maxExternalDynamicDeviations": [5000000, 5000000, 5000000], "maxExternalStaticDeviations": [5000000, 5000000, 5000000] } ``` ### 参数配置建议 - **动态误差**通常设置为**静态误差的 2-5 倍**,因为运动时允许更大的跟随偏差 - 对于**高精度应用**(如激光切割),应设置更小的跟随误差阈值 - 对于**重负载应用**,可适当增大阈值以避免频繁触发保护 - **各轴独立设置**,通常 J1-J3 轴负载较大,可设置较大阈值 --- ### 1.2 上位机查询最大跟随误差参数上限 **命令字:** `0x3861` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 1.3 控制器回复上位机最大跟随误差参数上限 **命令字:** `0x3862` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | maxDynamicDeviations | array | 最大动态误差列表,长度为机器人轴数(未配置轴为 null) | [1, 2×10⁷] ‱° | | maxStaticDeviations | array | 最大静态误差列表,长度为机器人轴数(未配置轴为 null) | [1, 2×10⁷] ‱° | | maxExternalDynamicDeviations | array | 外部轴最大动态误差列表,长度为外部轴轴数 | [1, 2×10⁷] ‱° | | maxExternalStaticDeviations | array | 外部轴最大静态误差列表,长度为外部轴轴数 | [1, 2×10⁷] ‱° | | robot | int | 当前机器人号 | [1, 4] | **响应示例:** ```json { "maxDynamicDeviations": [5000000, 5000000, 5000000, 5000000, null, null], "maxStaticDeviations": [5000000, 5000000, 5000000, 5000000, null, null], "maxExternalDynamicDeviations": [5000000, 5000000, 5000000], "maxExternalStaticDeviations": [5000000, 5000000, 5000000], "robot": 1 } ``` --- ## 2. 当前跟随误差(监控) ### 2.1 上位机查询当前跟随误差 **命令字:** `0x3870` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 2.2 控制器回复上位机当前跟随误差 **命令字:** `0x3871` **参数列表:** | 参数名 | 类型 | 说明 | 维度 | |--------|------|------|------| | curDeviations | double[7] | 当前机器人误差列表 | 单位 ‱° | | curExternalDeviations | double[5] | 当前外部轴误差列表 | 单位 ‱° | | maxDeviations | double[7] | 最大机器人误差列表 | 单位 ‱° | | maxExternalDeviations | double[5] | 最大外部轴误差列表 | 单位 ‱° | | robot | int | 当前机器人号 | [1, 4] | > **说明:** `maxDeviations` 记录的是历史最大误差值,可用于分析运动过程中的峰值误差。 **响应示例:** ```json { "curDeviations": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "curExternalDeviations": [0.0, 0.0, 0.0, 0.0, 0.0], "maxDeviations": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "maxExternalDeviations": [0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` --- ## 3. 电机过载保护 ### 功能说明 电机过载保护用于监测电机扭矩是否长时间超出安全范围。当电机扭矩持续超过设定的 `robotLimit` 值超过 `minLimiteTime` 时间时,触发过载保护。 ### 保护机制 1. 实时监测各轴电机扭矩 2. 当扭矩超过 `robotLimit` 时开始计时 3. 持续时间超过 `minLimiteTime` 则触发过载保护 4. 停止运动并上报过载错误 --- ### 3.1 上位机设置电机过载保护参数 **命令字:** `0x3880` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | enable | bool | 电机过载保护使能 | true/false | | minLimiteTime | int | 电机过载保护最小确认时间 | [10, 9999] ‰ | | robotLimit | int[6] | 电机扭矩过载值列表 | [0, 9999) ‰ 或 mNm | | robot | int | 当前机器人号 | [1, 4] | > **单位说明:** `minLimiteTime` 单位为千分之一秒(‰),如 10 表示 10ms。`robotLimit` 为相对于电机额定扭矩的千分比。 **请求示例:** ```json { "enable": false, "minLimiteTime": 10, "robot": 1, "robotLimit": [999, 999, 999, 999, 999, 999] } ``` --- ### 3.2 上位机查询电机过载保护参数 **命令字:** `0x3881` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | robot | int | 当前机器人号 | [1, 4] | **请求示例:** ```json { "robot": 1 } ``` --- ### 3.3 控制器回复上位机电机过载保护参数 **命令字:** `0x3882` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | enable | bool | 电机过载保护使能 | true/false | | minLimiteTime | int | 电机过载保护最小确认时间 | [10, 9999] ‰ | | robotLimit | int[6] | 电机扭矩过载值列表 | [0, 9999) ‰ 或 mNm | | robot | int | 当前机器人号 | [1, 4] | **响应示例:** ```json { "enable": false, "minLimiteTime": 10, "robot": 1, "robotLimit": [999, 999, 999, 999, 999, 999] } ``` --- ### 3.4 请求判断世界坐标系下的某点是否触发干涉区 **命令字:** `0x3890` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | array | double[3] | 点的世界坐标,分别表示 x, y, z 轴坐标 | 无 | **请求示例:** ```json { "array": [1, 2, 3] } ``` --- ### 3.5 响应判断世界坐标系下的某点是否触发干涉区 **命令字:** `0x3891` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | trigger | bool | 是否触发干涉区 | true/false | **响应示例:** ```json { "trigger": false } ``` --- ### 3.6 请求判断工具手(带工具手的干涉区立方体)在某位置是否触发干涉区 **命令字:** `0x3892` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | array | double[6] | 表示工具手在世界坐标下的位姿,x,y,z,a,b,c,a,b,c均为角度制 | [0, 1000000] m | **请求示例:** ```json { "array": [1, 2, 3, 0.5, 0.5, 0.6] } ``` --- ### 3.7 响应判断工具手(带工具手的干涉区立方体)在某位置是否触发干涉区 **命令字:** `0x3893` **参数列表:** | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | trigger | bool | 是否触发干涉区 | true/false | **响应示例:** ```json { "trigger": false } ``` --- ## 4. 连杆额外负载参数 ### 功能说明 连杆额外负载参数用于设置机器人各连杆上附加负载的动力学参数,供控制器在动力学计算中补偿额外负载对电机力矩的影响。 --- ### 4.1 上位机设置连杆额外负载参数 **命令字:** `0x40A0` **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | loadDynamicsParams | array | 连杆额外负载动力学参数列表,维度为 4×10 | **请求示例:** ```json { "loadDynamicsParams": [ [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] ] } ``` --- ### 4.2 上位机查询连杆额外负载参数 **命令字:** `0x40A1` **参数列表:** 无 --- ### 4.3 控制器回复连杆额外负载参数 **命令字:** `0x40A2` **参数列表:** | 参数名 | 类型 | 说明 | |--------|------|------| | loadDynamicsParams | array | 连杆额外负载动力学参数列表,维度为 4×10 | **响应示例:** ```json { "loadDynamicsParams": [ [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] ] } ``` --- # 动力学 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/11.%E5%8A%A8%E5%8A%9B%E5%AD%A6.html ### 负载使能 - 说明 - 力矩拖拽时需要打开转化比使能并修改实际力矩转换比 - 实际力矩转换比为从 Nm 单位的值转换为伺服0x6077的值的比例关系,该比例关系通常由伺服厂家提供 - 传感器参数由传感器厂家提供,质心 X 和质心 Y 通常为0,质心 Z 为传感器高度的一半 - 上位机设置转化比使能参数 **命令字:** `0x4000` - "conversionRatioEnable":false - 转化比使能;bool 类型 - "jointActualTorqConversionRatio":[0.0,0.0,0.0,0.0] - 关节实际力矩转换比列表;double 类型 - "jointSensorTorqConversionRatio":[0.0,0.0,0.0,0.0] - 关节传感器力矩转换比列表;double 类型 ```json { "conversionRatioEnable":false, "jointActualTorqConversionRatio":[0.0,0.0,0.0,0.0], "jointSensorTorqConversionRatio":[0.0,0.0,0.0,0.0] } ``` - 上位机查询转化比使能参数 ```json {} ``` **命令字:** `0x4001` - 控制器回复上位机转化比使能参数 **命令字:** `0x4002` - "conversionRatioEnable":false - 转化比使能;bool 类型 - "jointActualTorqConversionRatio":[0.0,0.0,0.0,0.0,0.0,0.0,0.0] - 关节实际力矩转换比列表;double 类型 - "jointSensorTorqConversionRatio":[0.0,0.0,0.0,0.0,0.0,0.0,0.0] - 关节传感器力矩转换比列表;double 类型 ```json { "conversionRatioEnable":false, "jointActualTorqConversionRatio":[0.0,0.0,0.0,0.0,0.0,0.0,0.0], "jointSensorTorqConversionRatio":[0.0,0.0,0.0,0.0,0.0,0.0,0.0] } ``` - 上位机设置负载使能工艺号 **命令字:** `0x4003` - "payload_num":1 ```json { "payload_num":1 } ``` - 负载使能工艺号;int 类型 - 控制器回复上位机负载使能工艺号 **命令字:** `0x4004` - "payload_num":1 ```json { "payload_num":1 } ``` ### 柔性关节参数 - 说明 - 柔性关节功能通过调整关节柔性系数,使机器人在受到外力时产生柔顺变形,适用于力控装配、人机协作等场景 - 上位机发送设置柔性关节参数 **命令字:** `0x4005` - "robot":1 - 当前机器人号;int 类型;取值范围[1,4] - "enable":false - 柔性关节功能是否打开;bool 类型 - "Joint_stiffness_parameters":[1,1,1,1,1,1] - 关节柔性系数;double 数组;数组大小为关节轴数;元素取值范围[0.1,9999] - "extern_Joint_stiffness_parameters":[1,1,1,1,1,1] - 外部轴关节柔性系数;double 数组;数组大小为外部轴关节轴数;元素取值范围[0.1,9999] ```json { "robot": 1, "enable": false, "Joint_stiffness_parameters": [1, 1, 1, 1, 1, 1], "extern_Joint_stiffness_parameters": [1, 1, 1, 1, 1, 1] } ``` - 上位机发送查询柔性关节参数 **命令字:** `0x4006` - "robot":1 - 当前机器人号;int 类型;取值范围[1,4] ```json { "robot": 1 } ``` - 控制器返回柔性关节参数 **命令字:** `0x4007` - 返回参数同 `0x4005` 设置参数一致 ```json { "robot": 1, "enable": false, "Joint_stiffness_parameters": [1, 1, 1, 1, 1, 1], "extern_Joint_stiffness_parameters": [1, 1, 1, 1, 1, 1] } ``` ### 外部按键 - 负载使能工艺号;int 类型 - 说明 - 可通过 IO 触发相应的功能,按队列顺序分别为拖拽模式、点动模式、开始轨迹采集、结束轨迹采集、开始轨迹回放、停止轨迹回放、上使能、下使能、夹爪开、夹爪关、保存轨迹、快捷指令1、快捷指令2、快捷指令3、快捷指令4、快捷指令5 - 快捷指令范围[0,9],0表示未选择,1表示点到点指令,2表示直线指令,3表示圆弧指令,4表示整圆指令,5表示曲线指令,6表示焊接开始指令,7表示焊接结束指令,8表示摆焊开始指令,9表示摆焊结束指令 - 上位机查询功能控制参数 ```json {} ``` **命令字:** `0x4020` - 控制器回复上位机功能控制参数 **命令字:** `0x4021` - "IoInPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "fastCommand":[0,0,0,0,0] - 快捷指令功能选择列表;int 类型,范围[0,9] - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "isClearTrack":0 - 保存后清除轨迹;int 类型,范围[0,1] - 0表示清除,1表示不清除 - "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发参数列表;int 类型,范围[0,1] - "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发方式列表;int 类型,范围[0,2] - 0表示长按,1表示短按,2表示置位 - "craft":{ - "weldBeadSize":2 - 多层多道焊当前焊道数;int 类型;取值范围:1-99 - "dragTeachSelectCraft":0 ```json { "IoInPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "fastCommand":[0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "isClearTrack":0, "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "craft": { "weldBeadSize":2 }, "dragTeachSelectCraft":0 } ``` - 拖拽示教工艺选择;int 类型;取值范围[0,1] - 上位机查询状态提示参数 ```json {} ``` **命令字:** `0x4022` - 控制器回复上位机状态提示参数 **命令字:** `0x4023` - "IoDoutPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "parameterArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ```json { "IoDoutPortArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` - 端口触发参数列表;int 类型,范围[0,2] - 0表示0,1表示1,2表示闪烁 - 上位机设置功能控制或状态提示参数 **命令字:** `0x4024` - "_isFunctionalControl":true - 是否为功能控制参数;bool 类型 - true 表示设置功能控制参数,false 表示设置状态提示参数 - "fastCommand":[0,0,0,0,0] - 快捷指令功能选择列表;int 类型,范围[0,9] - "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 触发硬件类型列表;int 类型 - 默认是 IO 触发 - "isClearTrack":0 - 保存后清除轨迹;int 类型,范围[0,1] - 0表示清除,1表示不清除 - "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发方式列表;int 类型,范围[0,2] - 分别表示"长按""短按""置位" - "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0] - 端口触发参数列表;int 类型 - 功能控制时范围[0,1] - 状态提示参数时范围[0,2],2表示"闪烁" - "portArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 各功能触发端口列表;int 类型 - 范围为当前 IO 端口数,无 IO 时为0 - "dragTeachSelectCraft":0 ```json { "_isFunctionalControl":true, "fastCommand":[0,0,0,0,0], "hardwareTypeArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "isClearTrack":0, "modeArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "parameterArr":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0], "portArr":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "dragTeachSelectCraft":0 } ``` - 拖拽示教工艺选择;int 类型;取值范围[0,1] - 控制器发送快捷插入指令 **命令字:** `0x4025` - "fastCommandSelectd":1 - 已选择快捷功能;int 类型,范围[0,9] - 取值在[1,5]时"pos"和"posture"节点存在 - "name":11 - 快捷功能号;int 类型,范围[11,15] - 分别表示快捷功能1~5 - "pos":[0.0,0.0,0.0,0.0,0.0,0.0,0.0] - 插入指令位置信息列表;double 类型 - 长度为7 - "posture":8 ```json { "fastCommandSelectd":1, "name":11, "pos":[0.0,0.0,0.0,0.0,0.0,0.0,0.0], "posture":8 } ``` ### 动力学参数 - 插入指令位置姿态;int 类型,范围[0,9] - 说明 - 需要进行力矩拖拽时必须先进行一次动力学辨识 - 上位机设置动力学参数 **命令字:** `0x4030` - "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0] - 动力学参数列表;double 类型 - 第1位表示质量,第2位表示质心 X,第3位表示质心 Y,第4位表示质心 Z,第5位表示惯性张量 XX,第6位表示惯性张量 XY,第7位表示惯性张量 XZ,第8位表示惯性张量 YY,第9位表示惯性张量 YZ,第10位表示惯性张量 ZZ,第11位表示动摩擦系数,第12位表示静摩擦系数 - "joint_num":6 ```json { "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0], "joint_num":6 } ``` - 机器人轴数;int 类型 - 上位机查询动力学参数 ```json {} ``` **命令字:** `0x4031` - 控制器回复上位机动力学参数 **命令字:** `0x4032` - "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0] - 动力学参数列表;double 类型 - 第1位表示质量,第2位表示质心 X,第3位表示质心 Y,第4位表示质心 Z,第5位表示惯性张量 XX,第6位表示惯性张量 XY,第7位表示惯性张量 XZ,第8位表示惯性张量 YY,第9位表示惯性张量 YZ,第10位表示惯性张量 ZZ,第11位表示动摩擦系数,第12位表示静摩擦系数 - "joint_num":6 ```json { "Dyna_Param":[0,0,0,0,0,0,0,0,0,0,0,0], "joint_num":6 } ``` - 机器人轴数;int 类型 - 上位机请求参数辨识 ```json {} ``` **命令字:** `0x4033` - 控制器回复上位机参数辨识结果 **命令字:** `0x4034` - "finish":false ```json { "finish":false } ``` - 辨识结束;bool 类型 - 上位机请求开始辨识 ```json {} ``` **命令字:** `0x4035` - 控制器回复上位机辨识误差值 **命令字:** `0x4036` - "error":[0.0,0.0,0.0,0.0,0.0,0.0] ```json { "error":[0.0,0.0,0.0,0.0,0.0,0.0] } ``` - 转矩误差列表;double 类型 - 控制器回复上位机辨识结果 **命令字:** `0x4037` - "finish":1 ```json { "finish":1 } ``` - 辨识结果;int 类型 - 控制器辨识过程中错误停止发送给上位机 **命令字:** `0x4038` - "ErrorStop":1 ```json { "ErrorStop":1 } ``` ### 负载辨识 - 错误停止;int 类型 - 上位机请求负载辨识数据 **命令字:** `0x4040` - data:无 - 上位机请求辨识计算负载质量和质心 **命令字:** `0x4041` - data:无 - 上位机请求辨识计算惯量 **命令字:** `0x4042` - data:无 - 控制器回复负载辨识结果(负载质量和质心 / 惯量) 或负载数据 **命令字:** `0x4043` - "result":true - 负载辨识结果;bool 类型; - true:负载辨识成功(显示数据);false:负载辨识失败 - "mass":3.6 - 质量;double 类型;kg - "massCenterX":0.53 - 质心 X;double 类型;m - "massCenterY":2.3 - 质心 Y;double 类型;m - "massCenterZ":1.3 - 质心 Z;double 类型;m - "Ixx":0.0 - 惯量 X;double 类型;kg·m² - "Iyy":0.0 - 惯量 Y;double 类型;kg·m² - "Izz":0.0 ```json { "result":true, "mass":3.6, "massCenterX":0.53, "massCenterY":2.3, "massCenterZ":1.3, "Ixx":0.0, "Iyy":0.0, "Izz":0.0 } ``` - 惯量 Z;double 类型;kg·m² - 上位机请求保存负载数据到对应工具手 **命令字:** `0x4044` - "targetTool":1 ```json { "targetTool":1 } ``` - 需要保存到工具手号;int 类型;取值范围[1,999] - 控制器回复保存负载数据到对应工具手 **命令字:** `0x4045` - "result":true ```json "result":true ``` - 保存是否成功;bool 类型 - true:保存成功;false:保存失败 - 上位机请求空载辨识 **命令字:** `0x4046` - data:无 - 控制器回复回应空载辨识 **命令字:** `0x4047` - "result":true ```json { "result":true } ``` - 空载辨识结果;bool 类型; - true:空载辨识成功;false:空载辨识失败 - 上位机请求下载空载配置文件数据 **命令字:** `0x4048` - data:无 - 控制器回复下载空载配置文件数据 **命令字:** `0x4049` - "name":"config/identification_xxxxx.json" ```json { "name":"config/identification_xxxxx.json" } ``` ### 软浮动参数 - 配置文件在控制器的路径;string 类型 - xxxx 为 bios 获取的时间 - 上位机获取软浮动参数 **命令字:** `0x404A` - "softfloat":{} - "num":0 ```json { "softfloat": { "num":0 } } ``` - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - 控制器回复软浮动参数 **命令字:** `0x404B` - "softfloat":{} - "num":0 - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - "percentage"[j][k]:[] - 含义对应 关节 直角 工具 用户;类型 int;范围 j(0-3) k(0-6) - 每种坐标系中分别的柔软度百分比(例:关节 j1 j2 j3 ...;直角 X Y Z A..) - "coord":0 - 含义对应 工艺号选择的坐标系类型(关节 直角 工具 用户); 类型 int;范围0-3 - "note":"xxxx" ```json { "softfloat": { "num":0, "percentage": [ [],[]...... ] "coord":0, "note":"xxxx" } } ``` - 含义注释;类型 string - 上位机发送设置软浮动参数 - 0x404C - "softfloat":{} - "num":0 - 含义对应1-9个参数的工艺号;类型 int;取值范围[0-8] - "percentage"[j]:[] - 含义对应 关节 直角 工具 用户;类型 int;范围 j(0-3) - 每种坐标系中分别的柔软度百分比 - "coord":0 - 含义对应 工艺号选择的坐标系类型(关节 直角 工具 用户); 类型 int;范围0-3 - "note":"xxxx" ```json { "softfloat": { "num":0, "percentage": [ ...... ] "coord":0, "note":"xxxx" } } ``` ### 安全状态 - 含义注释;类型 string - 上位机查询安全状态(测试辨识轨迹是否安全) ```json {} ``` **命令字:** `0x407A` - 控制器回复上位机安全状态 **命令字:** `0x407B` ```json { "finish":1 } ``` - "finish":1 - 辨识结果;int 类型 - 上位机请求设置辨识轨迹参数 **命令字:** `0x4077` - "traSize":10.0 - 辨识轨迹范围;int 类型,范围[1,100] - 第一次请填入较小数值 - "traVel":100.0 ```json { "traSize":10.0, "traVel":100.0 } ``` - 辨识轨迹速度;int 类型,范围[1,100] - 请先用低速测试安全,辨识用100 - 上位机查询辨识轨迹参数 ```json {} ``` **命令字:** `0x4078` - 控制器回复上位机辨识轨迹参数 **命令字:** `0x4079` - "alreadyIden":false - 是否已完成辨识;bool 类型 - "traSize":10.0 - 辨识轨迹范围;int 类型,范围[1,100] - "traVel":10.0 ```json { "alreadyIden":false, "traSize":10.0, "traVel":10.0 } ``` - 辨识轨迹速度;int 类型,范围[1,100] - 控制器回复上位机当前轨迹 Z 最值 **命令字:** `0x407C` - "zMax":636.712935786949 - 当前轨迹 Z 最大值;double 类型 - "zMin":505.396403159378 ```json { "zMax":636.712935786949, "zMin":505.396403159378 } ``` ### 自适应加减速 - 当前轨迹 Z 最小值;double 类型 - 说明 - 上位机设置自适应加减速阈值参数 **命令字:** `0x4050` - "Inertia_or_mass_or_both":[0,0,0,0,0,0] - 各轴限制条件列表;int 类型,范围[0,2] - 0表示"惯量",1表示"质量",2表示"并行" - "Load_or_center":[0,0,0,0,0,0] - 各轴参考点列表;int 类型,范围[0,1] - 0表示"负载",1表示"旋转中心" - "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]] - 各轴惯量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度的值 - "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴惯量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度的值 - "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], - 各轴质量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度的值 - "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴质量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度的值 - "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度对应惯量的值 - "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量加速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度对应惯量的值 - "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴质量速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度对应质量的值 - "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] ```json { "Inertia_or_mass_or_both":[0,0,0,0,0,0], "Load_or_center":[0,0,0,0,0,0], "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] } ``` - 各轴质量加速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度对应质量的值 - 上位机查询自适应加减速阈值参数 ```json {} ``` **命令字:** `0x4051` - 控制器回复上位机自适应加减速阈值参数 **命令字:** `0x4052` - "Inertia_or_mass_or_both":[0,0,0,0,0,0] - 各轴限制条件列表;int 类型,范围[0,2] - 0表示"惯量",1表示"质量",2表示"并行" - "Load_or_center":[0,0,0,0,0,0] - 各轴参考点列表;int 类型,范围[0,1] - 0表示"负载",1表示"旋转中心" - "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]] - 各轴惯量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度的值 - "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴惯量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度的值 - "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], - 各轴质量加速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度的值 - "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]] - 各轴质量速度二维数组;double 类型,范围(0,100]% - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度的值 - "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中速度对应惯量的值 - "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴惯量加速度对应惯量二维数组;double 类型,范围[0,100000]0.001kgm^2 - 一维表示各轴,二维表示速度-惯量-加速度-惯量列表中加速度对应惯量的值 - "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - 各轴质量速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中速度对应质量的值 - "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] ```json { "Inertia_or_mass_or_both":[0,0,0,0,0,0], "Load_or_center":[0,0,0,0,0,0], "_inertiaAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_inertiaSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "_massAcc":[[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0],[50.0,50.0,50.0]], "_massSpeed":[[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0],[10.0,20.0,30.0]], "inertiaMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "inertiaMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_1":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]], "massMap_2":[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] } ``` - 各轴质量加速度对应质量二维数组;double 类型,范围[0,100000]kg - 一维表示各轴,二维表示速度-质量-加速度-质量列表中加速度对应质量的值 - 上位机设置自适应加减速参数 **命令字:** `0x4053` - "arm_inertia":[0.0,0.0,0.0] - 关节臂体惯量列表;double 类型,范围[0,99999.9]0.001kgm^2 - 分别表示为"关节1臂体惯量","关节2臂体惯量","关节3臂体惯量" - "auto_modify_acc_enable":false - 自适应加减速使能;bool 类型 - "joint1_mass":0.0 - 关节1质量;double 类型,范围[0,99999.9]kg - "joint1_mass_center_to_motor_distance":0.0 - 关节1质心到电机距离;double 类型,范围[0,99999.9]m - "joint2_mass":0.0 - 关节2质量;double 类型,范围[0,99999.9]kg - "joint2_mass_center_to_motor_distance":0.0 - 关节2质心到电机距离;double 类型,范围[0,99999.9]m - "joint4_mass":0.0 ```json { "arm_inertia":[0.0,0.0,0.0], "auto_modify_acc_enable":false, "joint1_mass":0.0, "joint1_mass_center_to_motor_distance":0.0, "joint2_mass":0.0, "joint2_mass_center_to_motor_distance":0.0, "joint4_mass":0.0 } ``` - 关节4质量;double 类型,范围[0,99999.9]kg - 上位机查询自适应加减速参数 ```json {} ``` **命令字:** `0x4054` - 控制器回复上位机自适应加减速参数 **命令字:** `0x4055` - "arm_inertia":[0.0,0.0,0.0] - 关节臂体惯量列表;double 类型,范围[0,99999.9]0.001kgm^2 - 分别表示为"关节1臂体惯量","关节2臂体惯量","关节3臂体惯量" - "auto_modify_acc_enable":false - 自适应加减速使能;bool 类型 - "joint1_mass":0.0 - 关节1质量;double 类型,范围[0,99999.9]kg - "joint1_mass_center_to_motor_distance":0.0 - 关节1质心到电机距离;double 类型,范围[0,99999.9]m - "joint2_mass":0.0 - 关节2质量;double 类型,范围[0,99999.9]kg - "joint2_mass_center_to_motor_distance":0.0 - 关节2质心到电机距离;double 类型,范围[0,99999.9]m - "joint4_mass":0.0 ```json { "arm_inertia":[0.0,0.0,0.0], "auto_modify_acc_enable":false, "joint1_mass":0.0, "joint1_mass_center_to_motor_distance":0.0, "joint2_mass":0.0, "joint2_mass_center_to_motor_distance":0.0, "joint4_mass":0.0 } ``` - 关节4质量;double 类型,范围[0,99999.9]kg - 上位机设置位置环比参数 **命令字:** `0x4056` - "Dynamic_sendServoParam":false - 位置环比发送使能;bool 类型 - "PositionalComparison": - 位置环比参数列表 - "inertiaMax":9999.0 - 惯量最大值;double 类型,范围(0,100000]0.001kgm^2 - "inertiaMin":8.0 - 惯量最小值;double 类型,范围[0,100000)0.001kgm^2 - 惯量最小值必须小于惯量最大值 - "max":8.0 - 位置环比例增益1最小值;double 类型,范围[0,100000) - 位置环比例增益1最小值必须小于位置环比例增益1最大值 - "min":9999.0 ```json { "Dynamic_sendServoParam":false, "PositionalComparison": { "inertiaMax":9999.0, "inertiaMin":8.0, "max":8.0, "min":9999.0 } } ``` - 位置环比例增益1最大值;double 类型,范围(0,100000] - "max"与"min"参数在实现时写反了,后续进行修改 - 上位机查询位置环比参数 ```json {} ``` **命令字:** `0x4057` - 控制器回复上位机位置环比参数 **命令字:** `0x4058` - "Dynamic_sendServoParam":false - 位置环比发送使能;bool 类型 - "PositionalComparison": - 位置环比参数列表 - "inertiaMax":9999.0 - 惯量最大值;double 类型,范围(0,100000]0.001kgm^2 - "inertiaMin":8.0 - 惯量最小值;double 类型,范围[0,100000)0.001kgm^2 - 惯量最小值必须小于惯量最大值 - "max":8.0 - 位置环比例增益1最小值;double 类型,范围[0,100000) - 位置环比例增益1最小值必须小于位置环比例增益1最大值 - "min":9999.0 ```json { "Dynamic_sendServoParam":false, "PositionalComparison": { "inertiaMax":9999.0, "inertiaMin":8.0, "max":8.0, "min":9999.0 } } ``` ### 拖动模式 - 位置环比例增益1最大值;double 类型,范围(0,100000] - "max"与"min"参数在实现时写反了,后续进行修改 - 说明 - 上位机设置拖拽模式参数 **命令字:** `0x4074` - "mode":2 - 拖动方式;int 类型,范围[0,3] - 0表示无,1表示3D 鼠标,2表示力矩,3表示位置 - "port":0 - 外部触发信号端口;int 类型 - 范围为当前绑定的 IO 端口数 - "value":0 ```json { "mode":2, "port":0, "value":0 } ``` - 外部触发信号参数;int 类型,范围[0,1] - 上位机查询拖拽模式参数 ```json {} ``` **命令字:** `0x4075` - 控制器回复上位机拖拽模式参数 **命令字:** `0x4076` - "mode":2 - 拖动方式;int 类型,范围[0,3] - 0表示无,1表示3D 鼠标,2表示力矩,3表示位置 - "port":0 - 外部触发信号端口;int 类型 - 范围为当前绑定的 IO 端口数 - "value":0 ```json { "mode":2, "port":0, "value":0 } ``` - 外部触发信号参数;int 类型,范围[0,1] - 上位机设置力矩参数 **命令字:** `0x4085` - "DecareLimit":2.50 - 笛卡尔空间线速度限制;double 类型,范围[0,∞)m/s - "JointVelLimit":1.0 - 关节空间速度限制;double 类型,范围[0,∞)°/s - "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0] - 超限阻力系数;double 类型,范围[1,100] - "drag_mode":0 - 拖动模式;int 类型,范围[0,2] - 0表示自由拖动,1表示位置拖动,2表示姿态拖动 - "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0] - 关节摩擦力补偿矫正系数;double 类型,范围[0,0.99] - "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0] - 关节目标扭矩矫正系数;double 类型,范围[0,1] - "waitCycle":5.0 ```json { "DecareLimit":2.50, "JointVelLimit":1.0, "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode":0, "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle":5.0 } ``` - 下发给伺服力矩参数等待周期;double 类型,范围[1,10] - 上位机查询力矩参数 ```json {} ``` **命令字:** `0x4086` - 控制器回复上位机力矩参数 **命令字:** `0x4087` - "DecareLimit":2.50 - 笛卡尔空间线速度限制;double 类型,范围[0,∞)m/s - "JointVelLimit":1.0 - 关节空间速度限制;double 类型,范围[0,∞)°/s - "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0] - 超限阻力系数;double 类型,范围[1,100] - "drag_mode":0 - 拖动模式;int 类型,范围[0,2] - 0表示自由拖动,1表示位置拖动,2表示姿态拖动 - "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0] - 关节摩擦力补偿矫正系数;double 类型,范围[0,0.99] - "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0] - 关节目标扭矩矫正系数;double 类型,范围[0,1] - "waitCycle":5.0 ```json { "DecareLimit":2.50, "JointVelLimit":1.0, "dragCoefficient":[5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode":0, "frictionOffset":[0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient":[1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle":5.0 } ``` ### 力学功能 - 下发给伺服力矩参数等待周期;double 类型,范围[1,10] - 说明 - 设置碰撞检测安全系数需要先进行动力学辨识 - 上位机设置碰撞检测安全系数 **命令字:** `0x407D` - "safeCoeff":[0,0,0,0,0,0,0] - 碰撞检测安全系数列表;double 类型 ```json { "safeCoeff":[0,0,0,0,0,0,0] } ``` - 上位机查询碰撞检测安全系数 ```json {} ``` **命令字:** `0x407E` - 控制器回复上位机碰撞检测安全系数 **命令字:** `0x407F` - "safeCoeff":[0,0,0,0] - 碰撞检测安全系数列表;double 类型 - "servoExecutionDelay":[5,5,5,5] - 伺服执行延时列表;double 类型 ```json { "safeCoeff":[0,0,0,0], "servoExecutionDelay":[5,5,5,5] } ``` - 上位机设置碰撞检测参数 **命令字:** `0x4080` - "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值(点动);double 类型,范围[1,10000]‰ - "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值(点动);double 类型,范围[1,10000]‰ - "error_enable_time":1.0 - 误差允许时间;double 类型,范围[0,99]ms - "pos_delay_time":1.0 ```json { "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0], "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0], "error_enable_time":1.0, "pos_delay_time":1.0 } ``` - 指令位置响应时间;double 类型,范围(0,99]ms - 上位机查询碰撞检测参数 ```json {} ``` **命令字:** `0x4081` - 控制器回复上位机碰撞检测参数 **命令字:** `0x4082` - "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值列表(点动);double 类型,范围[1,10000]‰ - "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0] - 碰撞检测阈值列表(点动);double 类型,范围[1,10000]‰ - "error_enable_time":1.0 - 误差允许时间;double 类型,范围[0,99]ms - "pos_delay_time":1.0 ```json { "Co_De_para":[50.0,50.0,50.0,50.0,50.0,50.0], "Colli_Detec_jog":[50.0,50.0,50.0,50.0,50.0,50.0], "error_enable_time":1.0, "pos_delay_time":1.0 } ``` - 指令位置响应时间;double 类型,范围(0,99]ms - 上位机设置机器人力矩前馈 **命令字:** `0x4010` - "torqFeedback":false ```json { "torqFeedback":false } ``` - 力矩前馈开关;bool 类型 - 上位机查询机器人力矩前馈 ```json {} ``` **命令字:** `0x4011` - 控制器回复上位机机器人力矩前馈 **命令字:** `0x4012` ```json { "torqFeedback":false } ``` ### 轨迹管理 - "torqFeedback":false - 力矩前馈开关;bool 类型 - 说明 - 轨迹保存结果通过0x4070返回 - 上位机查询拖拽轨迹是否被记录 ```json {} ``` **命令字:** `0x408B` - 控制器回复上位机拖拽轨迹记录结果 **命令字:** `0x4070` - "record":false ```json { "record":false } ``` - 轨迹是否被记录;bool 类型 - 上位机请求轨迹回放 **命令字:** `0x4071` - "trajName":"AAA" - 需要回放的轨迹名称;string 类型 - "vel":100 ```json { "trajName":"AAA", "vel":100 } ``` - 轨迹回放运行速度;int 类型,范围[1,100] - 上位机请求保存拖拽轨迹 **命令字:** `0x4072` - "TrajName":"AAA" ```json { "TrajName":"AAA" } ``` - 需要保存的轨迹名称;string 类型 - 若为空则保存失败 - 上位机请求删除拖拽轨迹 **命令字:** `0x4073` - "TrajName":"AAA" ```json { "TrajName":"AAA" } ``` - 需要删除的轨迹名称;string 类型 - 上位机查询拖拽轨迹列表 ```json {} ``` **命令字:** `0x4083` - 控制器回复上位机拖拽轨迹列表 **命令字:** `0x4084` - "TrajName":["AAA"] ```json { "TrajName":["AAA"] } ``` - 已保存轨迹列表;string 类型 - 长度为当前已保存轨迹数量,若无轨迹,则该节点不存在 - 上位机设置轨迹记录参数 **命令字:** `0x4088` - "MaxSamplingNum":300.0 - 最大采样点数;double 类型,范围(200,1200) - "SamplingInterval":0.030 - 采样间隔;double 类型,范围[0.03,1] - "Start":true ```json { "MaxSamplingNum":300.0, "SamplingInterval":0.030, "Start":true } ``` - 开始/停止记录;bool 类型 - true 表示开始记录,false 表示停止记录 - false 时"MaxSamplingNum"和"SamplingInterval"可以不存在 - 上位机查询轨迹记录参数 ```json {} ``` **命令字:** `0x4089` - 控制器回复上位机轨迹记录参数 - 0x408A - "MaxSamplingNum":300.0 - 最大采样点数;double 类型,范围(200,1200) - "SamplingInterval":0.030 - 采样间隔;double 类型,范围[0.03,1] - "Start":false ```json { "MaxSamplingNum":300.0, "SamplingInterval":0.030, "Start":false } ``` - 开始/停止记录;bool 类型 - true 表示开始记录,false 表示停止记录 - 上位机查询拖拽轨迹文件列表 ```json {} ``` **命令字:** `0x408C` - 控制器回复上位机拖拽轨迹文件列表 **命令字:** `0x408D` - "absolutepath":"dragPos/" - 控制器中拖拽轨迹文件存放地址;string 类型 - "trajectory_filelist":["AAA","JJ","drag_traj_details.json"] ```json { "absolutepath":"dragPos/", "trajectory_filelist":["AAA","JJ","drag_traj_details.json"] } ``` - 拖拽轨迹文件列表;string 类型 - "drag_traj_details.json"为轨迹记录信息文件 --- # 遥操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/12.%E9%81%A5%E6%93%8D%E4%BD%9C.html ## 3D 鼠标 ### 上位机设置3D 鼠标参数 **命令字:** `0x4600` | 参数名 | 类型 | 范围 | 说明 | |-----------|------------|-----------|----------------------------------------------------------------------| | ABC | int | [4,6] | 姿态控制:4表示已选中 A,5表示已选中 B,6表示已选中 C | | mouseSen | double[4] | [0,300] | 3D 鼠标灵敏度列表,分别为 X 方向灵敏度、Y 方向灵敏度、Z 方向灵敏度、姿态灵敏度 | **请求示例:** ```json { "ABC": 4, "mouseSen": [128.0, 128.0, 128.0, 128.0] } ``` ### 上位机查询3D 鼠标参数 **命令字:** `0x4601` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标参数 **命令字:** `0x4602` | 参数名 | 类型 | 范围 | 说明 | |----------|-----------|----------|---------------------------------------------------| | ABC | int | [4,6] | 姿态控制:4表示已选中 A,5表示已选中 B,6表示已选中 C | | enable | bool | - | 3D 鼠标使能 | | mouseSen | double[4] | [0,300] | 3D 鼠标灵敏度列表,分别为 X/Y/Z 方向灵敏度和姿态灵敏度 | **响应示例:** ```json { "ABC": 4, "enable": false, "mouseSen": [128.0, 128.0, 128.0, 128.0] } ``` ### 上位机请求标记3D 鼠标零点 **命令字:** `0x4603` **请求示例:** ```json {} ``` ### 上位机查询3D 鼠标零点标记状态 **命令字:** `0x4604` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标零点标记状态 **命令字:** `0x4605` | 参数名 | 类型 | 范围 | 说明 | |-------------|------|----------|----------------------------------------| | zeroTagged | int | [0,1] | 3D 鼠标零点标记状态:0表示未标记,1表示已标记 | **响应示例:** ```json { "zeroTagged": 0 } ``` ### 上位机请求标记3D 鼠标正方向 **命令字:** `0x4606` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------------------------------| | axis | int | [1,3] | 标记的方向:1表示 X 方向,2表示 Y 方向,3表示 Z 方向 | **请求示例:** ```json { "axis": 1 } ``` ### 上位机查询3D 鼠标标记正方向状态 **命令字:** `0x4607` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标标记正方向状态 **命令字:** `0x4608` | 参数名 | 类型 | 范围 | 说明 | |----------|------|----------|--------------------------------------------------| | xTagged | int | [0,2] | X 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | | yTagged | int | [0,2] | Y 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | | zTagged | int | [0,2] | Z 正方向标记状态:0表示未标定,1表示已标定,2表示通讯失败 | **响应示例:** ```json { "xTagged": 2, "yTagged": 0, "zTagged": 0 } ``` ### 上位机设置3D 鼠标参数页面返回 **命令字:** `0x4609` | 参数名 | 类型 | 说明 | |-----------|------|-----------------------------| | pageBack | int | 上位机页面离开3D 鼠标参数页面 | **请求示例:** ```json { "pageBack": 1 } ``` ### 上位机设置3D 鼠标端口号 **命令字:** `0x460A` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------| | port | int | [1,10] | 3D 鼠标端口号 | **请求示例:** ```json { "port": 1 } ``` ### 上位机查询3D 鼠标端口号 **命令字:** `0x460B` **请求示例:** ```json {} ``` ### 控制器回复上位机3D 鼠标端口号 **命令字:** `0x460C` | 参数名 | 类型 | 范围 | 说明 | |--------|------|----------|----------------| | port | int | [1,10] | 3D 鼠标端口号 | **响应示例:** ```json { "port": 1 } ``` --- ## 六维力传感器 ### 说明 六维力传感器安装在机器人末端,通过传感器末端感应区获取受力的变化。 六维力传感器的基础参数在0x4000里设置,包括有传感器质量和质心,标零计算前需要提前写入,否则会导致标零计算结果错误。 使用六维力传感器进行力矩拖拽和位置拖拽需要在安装好传感器后进行空载标零,若需要安装额外拖把,则需要在标零后进行负载计算。 使用六维力传感器进行力矩拖拽,在各轴扭矩转换数据超出关节摩擦力补偿阈值时进行摩擦力补偿。 ### 上位机请求计算六维力传感器负载参数 **命令字:** `0x4620` **请求示例:** ```json {} ``` ### 上位机查询六维力传感器负载参数的计算结果 **命令字:** `0x4621` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器计算的负载参数 **命令字:** `0x4622` | 参数名 | 类型 | 单位 | 说明 | |---------------------|--------|------|------------------------------------------------------------| | isFinished | bool | - | 负载计算轨迹是否运行结束(仅回复0x4620时存在) | | runSuccess | bool | - | 负载参数是否计算成功(仅回复0x4620时存在) | | payloadMass | double | kg | 计算得到的负载块质量(仅回复0x4621时存在) | | payloadMassCenterX | double | m | 计算得到的负载块质心 X(仅回复0x4621时存在) | | payloadMassCenterY | double | m | 计算得到的负载块质心 Y(仅回复0x4621时存在) | | payloadMassCenterZ | double | m | 计算得到的负载块质心 Z(仅回复0x4621时存在) | **响应示例:** ```json { "isFinished": true, "runSuccess": true, "payloadMass": 0.0, "payloadMassCenterX": 0.0, "payloadMassCenterY": 0.0, "payloadMassCenterZ": 0.0 } ``` ### 上位机查询六维力传感器数据 **命令字:** `0x4623` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器数据 **命令字:** `0x4624` | 参数名 | 类型 | 单位 | 说明 | |--------------------|---------|------|------------------------------------------------------------------------| | fxData | double | N | 传感器 X 方向受力原始数据 | | fyData | double | N | 传感器 Y 方向受力原始数据 | | fzData | double | N | 传感器 Z 方向受力原始数据 | | mxData | double | Nm | 传感器 X 方向力矩原始数据 | | myData | double | Nm | 传感器 Y 方向力矩原始数据 | | mzData | double | Nm | 传感器 Z 方向力矩原始数据 | | peelOffValue | object | - | 传感器去皮数据,传感器标零后该节点存在 | | fxDataSubBase | double | N | 传感器 X 方向受力去皮数据 | | fyDataSubBase | double | N | 传感器 Y 方向受力去皮数据 | | fzDataSubBase | double | N | 传感器 Z 方向受力去皮数据 | | mxDataSubBase | double | Nm | 传感器 X 方向力矩去皮数据 | | myDataSubBase | double | Nm | 传感器 Y 方向力矩去皮数据 | | mzDataSubBase | double | Nm | 传感器 Z 方向力矩去皮数据 | | sensorConnect | bool | - | 传感器连接状态:true 表示已连接,false 表示未连接 | | torqueConvertData | object | - | 六维力传感器额外力导致的各轴扭矩值,机器人进入力矩拖拽时该节点存在 | | axis1Data | double | ‰ | 1轴扭矩转换数据 | | axis2Data | double | ‰ | 2轴扭矩转换数据 | | axis3Data | double | ‰ | 3轴扭矩转换数据 | | axis4Data | double | ‰ | 4轴扭矩转换数据 | | axis5Data | double | ‰ | 5轴扭矩转换数据 | | axis6Data | double | ‰ | 6轴扭矩转换数据 | **响应示例:** ```json { "fxData": -7.48328, "fyData": 4.0964, "fzData": 34.09224, "mxData": 0.4361, "myData": -0.01078, "mzData": 0.1176, "peelOffValue": { "fxDataSubBase": 0.324231194364, "fyDataSubBase": -0.550949927519, "fzDataSubBase": 5.315393681562, "mxDataSubBase": 0.254721004374, "myDataSubBase": -0.23501051027, "mzDataSubBase": 0.003892025499 }, "sensorConnect": true, "torqueConvertData": { "axis1Data": 4.350304342178, "axis2Data": -31.252106163066, "axis3Data": -67.928968119182, "axis4Data": 8.274872052417, "axis5Data": 15.919933464577, "axis6Data": 0.318515582768 } } ``` ### 上位机请求六维力传感器标零 **命令字:** `0x4625` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器标零结果 **命令字:** `0x4626` | 参数名 | 类型 | 说明 | |------------|------|--------------------| | isFinished | bool | 标零轨迹是否运行结束 | | isSaved | bool | 标零数据是否保存成功 | **响应示例:** ```json { "isFinished": true, "isSaved": true } ``` ### 上位机请求将六维力传感器负载计算结果存入到工具手 **命令字:** `0x4627` | 参数名 | 类型 | 范围 | 说明 | |------------|------|-----------|--------------------| | targetTool | int | [1,999] | 要存入到的工具手号 | **请求示例:** ```json { "targetTool": 5 } ``` ### 控制器回复上位机六维力传感器负载计算结果存入到工具手结果 **命令字:** `0x4628` | 参数名 | 类型 | 说明 | |--------|------|------------------| | result | bool | 数据存入是否成功 | **响应示例:** ```json { "result": true } ``` ### 上位机设置关节摩擦力补偿阈值 **命令字:** `0x4629` | 参数名 | 类型 | 范围 | 说明 | |------------------------|------|------------|--------------------| | sensorJointThreshold1 | int | [1,999999] | 1轴关节摩擦力补偿阈值 | | sensorJointThreshold2 | int | [1,999999] | 2轴关节摩擦力补偿阈值 | | sensorJointThreshold3 | int | [1,999999] | 3轴关节摩擦力补偿阈值 | | sensorJointThreshold4 | int | [1,999999] | 4轴关节摩擦力补偿阈值 | | sensorJointThreshold5 | int | [1,999999] | 5轴关节摩擦力补偿阈值 | | sensorJointThreshold6 | int | [1,999999] | 6轴关节摩擦力补偿阈值 | **请求示例:** ```json { "sensorJointThreshold1": 50, "sensorJointThreshold2": 50, "sensorJointThreshold3": 50, "sensorJointThreshold4": 50, "sensorJointThreshold5": 50, "sensorJointThreshold6": 50 } ``` ### 上位机查询关节摩擦力补偿系数 **命令字:** `0x462A` **请求示例:** ```json {} ``` ### 控制器回复上位机关节摩擦力补偿系数 **命令字:** `0x462B` | 参数名 | 类型 | 范围 | 说明 | |------------------------|------|------------|--------------------| | sensorJointThreshold1 | int | [1,999999] | 1轴关节摩擦力补偿阈值 | | sensorJointThreshold2 | int | [1,999999] | 2轴关节摩擦力补偿阈值 | | sensorJointThreshold3 | int | [1,999999] | 3轴关节摩擦力补偿阈值 | | sensorJointThreshold4 | int | [1,999999] | 4轴关节摩擦力补偿阈值 | | sensorJointThreshold5 | int | [1,999999] | 5轴关节摩擦力补偿阈值 | | sensorJointThreshold6 | int | [1,999999] | 6轴关节摩擦力补偿阈值 | **响应示例:** ```json { "sensorJointThreshold1": 50, "sensorJointThreshold2": 50, "sensorJointThreshold3": 50, "sensorJointThreshold4": 50, "sensorJointThreshold5": 50, "sensorJointThreshold6": 50 } ``` ### 上位机设置传感器基础参数 **命令字:** `0x4630` | 参数名 | 类型 | 说明 | |--------------------|--------|------------| | sensorMass | double | 传感器质量 | | sensorMassCenterX | double | 传感器质心 X | | sensorMassCenterY | double | 传感器质心 Y | | sensorMassCenterZ | double | 传感器质心 Z | **请求示例:** ```json { "sensorMass": 0, "sensorMassCenterX": 0, "sensorMassCenterY": 0, "sensorMassCenterZ": 0 } ``` ### 上位机获取传感器基础参数 **命令字:** `0x4631` **请求示例:** ```json {} ``` ### 控制器回复传感器基础参数 **命令字:** `0x4632` | 参数名 | 类型 | 说明 | |--------------------|--------|------------| | sensorMass | double | 传感器质量 | | sensorMassCenterX | double | 传感器质心 X | | sensorMassCenterY | double | 传感器质心 Y | | sensorMassCenterZ | double | 传感器质心 Z | **响应示例:** ```json { "sensorMass": 0, "sensorMassCenterX": 0, "sensorMassCenterY": 0, "sensorMassCenterZ": 0 } ``` ### 传感器去皮数据清零 **命令字:** `0x4633` **请求示例:** ```json {} ``` ### 传感器数据标定 **命令字:** `0x4634` **请求示例:** ```json {} ``` ### 控制器回复传感器数据标定结果 **命令字:** `0x4635` | 参数名 | 类型 | 说明 | |------------|------|--------------| | runSuccess | bool | 轨迹运行结果 | | isFinished | bool | 标定结束 | **响应示例:** ```json { "runSuccess": true, "isFinished": true } ``` ### 上位机设置六维力传感器通讯参数 **命令字:** `0x462C` | 参数名 | 类型 | 范围/取值 | 说明 | |-------------------------------|--------|------------------------------------|----------------------------------------------------------------------| | EtherCAT.mapNum | int | - | 已选择通讯设备号:0表示未选择 | | modbus.RTU.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | modbus.RTU.checkBit | string | 'N','E','O' | 校验位 | | modbus.RTU.dataBit | int | [5,8] | 数据位 | | modbus.RTU.stopBit | int | [1,2] | 停止位 | | modbus.RTU.addressNum | int | [0,125] | 从站地址个数 | | modbus.RTU.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.RTU.baudRate | int | - | 波特率 | | modbus.RTU.firstAddress | int | (0,65535] | 寄存器首地址 | | modbus.RTU.port | int | (0,65535] | 端口号 | | modbus.RTU.slaveID | int | (0,65535] | 从站 ID | | modbus.TCP.IP | string | - | IP 地址 | | modbus.TCP.port | int | (0,65535] | 端口号 | | modbus.TCP.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.TCP.firstAddress | int | [0,65535] | 寄存器首地址 | | modbus.TCP.addressNum | int | [0,125] | 从站地址个数 | | modbus.TCP.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | YDirection | int | 1/-1 | 传感器 Y 方向:1表示 Y 正方向朝左,-1表示 Y 正方向朝右 | | originDataInitialPara | int | [0,999] | 原始数据起始变量:0表示无,其他数值表示存放到全局变量位置,依次存放六个传感器原始数据 | | sensorCommunicationType | int | [0,1] | 传感器通讯类型:0表示 EtherCAT,1表示 Modbus RTU | | sensorConnectStatus | bool | - | 传感器通讯使能(该节点可单独进行设置) | | sensorDragEnable | bool | - | 传感器拖拽使能:false 表示传感器数据不参与力矩拖拽计算 | | startupAutoConnectSensor | bool | - | 开机连接传感器 | **请求示例:** ```json { "etherCat": { "mapNum": 0 }, "modbus": { "RTU": { "endian": 1, "checkBit": "N", "dataBit": 5, "stopBit": 1, "addressNum": 1, "addressType": 0, "baudRate": 115200, "firstAddress": 1, "port": 1, "slaveID": 1 }, "TCP": { "IP": "192.168.1.14", "port": 503, "addressType": 0, "firstAddress": 1, "addressNum": 1, "endian": 1 } }, "YDirection": 1, "originDataInitialPara": 0, "sensorCommunicationType": 0, "sensorConnectStatus": false, "sensorDragEnable": true, "startupAutoConnectSensor": true } ``` ### 上位机查询六维力传感器通讯参数 **命令字:** `0x462D` **请求示例:** ```json {} ``` ### 控制器回复上位机六维力传感器通讯参数 **命令字:** `0x462E` | 参数名 | 类型 | 范围/取值 | 说明 | |-------------------------------|--------|------------------------------------|----------------------------------------------------------------------| | EtherCAT.mapNum | int | - | 已选择通讯设备号:0表示未选择 | | modbus.RTU.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | modbus.RTU.checkBit | string | 'N','E','O' | 校验位 | | modbus.RTU.dataBit | int | [5,8] | 数据位 | | modbus.RTU.stopBit | int | [1,2] | 停止位 | | modbus.RTU.addressNum | int | [0,125] | 从站地址个数 | | modbus.RTU.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.RTU.baudRate | int | - | 波特率 | | modbus.RTU.firstAddress | int | (0,65535] | 寄存器首地址 | | modbus.RTU.port | int | (0,65535] | 端口号 | | modbus.RTU.slaveID | int | (0,65535] | 从站 ID | | modbus.TCP.IP | string | - | IP 地址 | | modbus.TCP.port | int | (0,65535] | 端口号 | | modbus.TCP.addressType | int | [0,1] | 地址类型:0表示3x,1表示4x | | modbus.TCP.firstAddress | int | [0,65535] | 寄存器首地址 | | modbus.TCP.addressNum | int | [0,125] | 从站地址个数 | | modbus.TCP.endian | int | [0,3] | FLOAT 大小端:0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | YDirection | int | 1/-1 | 传感器 Y 方向:1表示 Y 正方向朝左,-1表示 Y 正方向朝右 | | originDataInitialPara | int | [0,999] | 原始数据起始变量:0表示无,其他数值表示存放到全局变量位置,依次存放六个传感器原始数据 | | sensorCommunicationType | int | [0,1] | 传感器通讯类型:0表示 EtherCAT,1表示 Modbus RTU | | sensorConnectStatus | bool | - | 传感器通讯使能(该节点可单独进行设置) | | sensorDragEnable | bool | - | 传感器拖拽使能:false 表示传感器数据不参与力矩拖拽计算 | | startupAutoConnectSensor | bool | - | 开机连接传感器 | **响应示例:** ```json { "etherCat": { "mapNum": 0 }, "modbus": { "RTU": { "endian": 1, "checkBit": "N", "dataBit": 5, "stopBit": 1, "addressNum": 1, "addressType": 0, "baudRate": 115200, "firstAddress": 1, "port": 1, "slaveID": 1 }, "TCP": { "IP": "192.168.1.14", "port": 503, "addressType": 0, "firstAddress": 1, "addressNum": 1, "endian": 1 } }, "YDirection": 1, "originDataInitialPara": 0, "sensorCommunicationType": 0, "sensorConnectStatus": false, "sensorDragEnable": true, "startupAutoConnectSensor": true } ``` ### 上位机设置六维力传感器导纳拖拽参数 **命令字:** `0x408E` | 参数名 | 类型 | 范围 | 说明 | |---------------------|------------|---------------------------|--------------------------------| | dragDamper | double[6] | 前三位[0,100],后三位[0,50] | 阻尼系数列表,直角坐标系下 XYZABC | | dragInPosMaxAngleVel| double | (0,90] | 拖拽最大角速度,单位:°/s | | dragInPosMaxVel | double | (0,2] | 拖拽最大线速度,单位:m/s | | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | | dragMass | double[6] | 前三位[5,100],后三位[0.3,30] | 质量系数列表 | | dragChangeRate | double[6] | - | 变化率阈值 | | dragTh.xyz | double | - | 位置启动阈值 | | dragTh.abc | double | - | 姿态启动阈值 | **请求示例:** ```json { "dragDamper": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "dragInPosMaxAngleVel": 5.0, "dragInPosMaxVel": 2.0, "dragInPosMode": 0, "dragMass": [5.0, 5.0, 5.0, 0.30, 0.30, 0.30], "dragChangeRate": [10, 10, 10, 5, 5, 5], "dragTh": { "xyz": 5, "abc": 1 } } ``` ### 上位机查询六维力传感器导纳拖拽参数 **命令字:** `0x408F` | 参数名 | 类型 | 范围 | 说明 | |---------------|------|----------|--------------------------------------------------| | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | **请求示例:** ```json { "dragInPosMode": 0 } ``` ### 控制器回复上位机六维力传感器导纳拖拽参数 **命令字:** `0x4090` | 参数名 | 类型 | 范围 | 说明 | |---------------------|------------|---------------------------|--------------------------------| | dragDamper | double[6] | 前三位[0,100],后三位[0,50] | 阻尼系数列表,直角坐标系下 XYZABC | | dragInPosMaxAngleVel| double | (0,90] | 拖拽最大角速度,单位:°/s | | dragInPosMaxVel | double | (0,2] | 拖拽最大线速度,单位:m/s | | dragInPosMode | int | [0,2] | 拖动模式:0表示自由拖动,1表示位置拖动,2表示位姿拖动 | | dragMass | double[6] | 前三位[5,100],后三位[0.3,30] | 质量系数列表 | | dragChangeRate | double[6] | - | 变化率阈值 | | dragTh.xyz | double | - | 位置启动阈值 | | dragTh.abc | double | - | 姿态启动阈值 | **响应示例:** ```json { "dragDamper": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "dragInPosMaxAngleVel": 5.0, "dragInPosMaxVel": 2.0, "dragInPosMode": 0, "dragMass": [5.0, 5.0, 5.0, 0.30, 0.30, 0.30], "dragChangeRate": [10, 10, 10, 5, 5, 5], "dragTh": { "xyz": 5, "abc": 1 } } ``` ### 上位机查询拖拽回放点位滤波参数 **命令字:** `0x4097` | 参数名 | 类型 | 说明 | |----------|--------|---------------------| | trajName | string | 回放文件名 | | posNum | int[] | 获取点位的索引列表 | **请求示例:** ```json { "trajName": "test.json", "posNum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } ``` ### 控制器回复拖拽回放点位滤波参数 **命令字:** `0x4098` | 参数名 | 类型 | 说明 | |------------------------|---------|--------------------| | trajectoryPlayBackFilt | bool | 是否开启点位滤波 | | filterParam | int | 滤波点数 | | dataSize | int | 记录点位总数 | | posNum | int[] | 获取点位的索引列表 | | dragPos | double[]| 回放点位 | **响应示例:** ```json { "trajectoryPlayBackFilt": true, "filterParam": 20, "dataSize": 1000, "posNum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "dragPos": [0.001, -1.0, -1.0, 0, 0, 0.0, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } ``` --- ## 关节扭矩传感器拖拽 ### 设置关节传感器参数 **命令字:** `0x4636` | 参数名 | 类型 | 说明 | |--------------------|------|--------------| | jointSensorSwitch | bool | 开启传感器 | **请求示例:** ```json { "jointSensorSwitch": true } ``` ### 获取传感器参数 **命令字:** `0x4637` **请求示例:** ```json {} ``` ### 返回传感器参数 **命令字:** `0x4638` | 参数名 | 类型 | 说明 | |--------------------|------|------------------------------| | jointSensorSwitch | bool | 传感器已开启:true 表示开启,false 表示未开启 | **响应示例:** ```json { "jointSensorSwitch": true } ``` ### 获取传感器数据 **命令字:** `0x4639` **请求示例:** ```json {} ``` ### 返回传感器数据 **命令字:** `0x463A` | 参数名 | 类型 | 说明 | |--------------------|--------|------------------| | jointSensorConnect | bool | 传感器连接状态:true 表示连接,false 表示未连接 | | axis1Data | double | 一轴传感器数据 | | axis2Data | double | 二轴传感器数据 | | axis3Data | double | 三轴传感器数据 | | axis4Data | double | 四轴传感器数据 | | axis5Data | double | 五轴传感器数据 | | axis6Data | double | 六轴传感器数据 | **响应示例:** ```json { "jointSensorConnect": true, "axis1Data": 1, "axis2Data": 1, "axis3Data": 1, "axis4Data": 1, "axis5Data": 1, "axis6Data": 1 } ``` --- # 独立轴 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/13.%E7%8B%AC%E7%AB%8B%E8%BD%B4.html ## 独立轴参数 ### 设置独立轴界面参数 **命令字:** `0x2800` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | | angularDistanceConversionRatioValue | double | 转换比 | | isTrack | bool | 是否是地轨 | | encoderBitLineditValue | double | 编码器位数 | | inverseLimitValue | double | 反限位 | | maximumPositiveSpeedValue | double | 最大正转速;单位:倍率 | | maximumReverseSpeedValue | double | 最大反转速;单位:倍率 | | motorDir | int | 电机方向;1:正,-1:负 | | positiveLimitValue | double | 正限位 | | ratedPositiveSpeedValue | double | 额定正转速;单位:rpm | | ratedReverseSpeedValue | double | 额定反转速;单位:rpm | | reductionRatioValue | double | 减速比 | | maxAccValue | double | 最大加速度;单位:速度的倍率 | | maxDecValue | double | 最大减速度;单位:速度的倍率 | | selectBindServo | uint | 选择需要绑定的伺服编号 | **请求示例:** ```json { "independentAxisParameter": { "axisNum": 0, "angularDistanceConversionRatioValue": 0.0, "isTrack": false, "encoderBitLineditValue": 0.0, "inverseLimitValue": 0.0, "maximumPositiveSpeedValue": 0.0, "maximumReverseSpeedValue": 0.0, "motorDir": 0, "positiveLimitValue": 0.0, "ratedPositiveSpeedValue": 0.0, "ratedReverseSpeedValue": 0.0, "reductionRatioValue": 0.0, "maxAccValue": 0.0, "maxDecValue": 0.0, "selectBindServo": 0 } } ``` ### 上位机查询独立轴界面参数 **命令字:** `0x2801` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴界面参数 **命令字:** `0x2802` 返回参数同 `0x2800` 设置命令。 ### 上位机查询独立轴总数 **命令字:** `0x2803` **参数说明:** 无请求参数。 ### 控制器返回独立轴总数 **命令字:** `0x2804` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisSum | int | 独立轴总数 | **响应示例:** ```json { "axisSum": 2 } ``` ### 上位机删除某一个独立轴参数 **命令字:** `0x2805` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ## 独立轴位置 ### 上位机查询独立轴位置 **命令字:** `0x2806` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 控制器返回独立轴位置 **命令字:** `0x2807` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | currentPos | double | 当前位置 | **响应示例:** ```json { "currentPos": 210.01 } ``` ### 独立轴0点标定 **命令字:** `0x2808` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ## 轴独立控制弹窗 ### 独立控制轴 PV 运动 **命令字:** `0x30E0` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | | vel | int | 轴速度;单位:rpm | [-6000,6000] | | dir | int | 运动方向;1:正,-1:反向 | - | | acc | double | 加速度 | - | | dec | double | 减速度 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1, "vel": 50, "dir": 1, "acc": 50.0, "dec": 50.0 } ``` ### 独立控制轴 PV 停止 **命令字:** `0x30E1` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1 } ``` ### 取消轴独立控制运动 **命令字:** `0x30E4` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | robot | int | 机器人编号 | [1,4] | | axisNum | int | 轴编号 | - | **请求示例:** ```json { "robot": 1, "axisNum": 1 } ``` ### 独立轴回零 **命令字:** `0x30E5` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 独立轴回零停止 **命令字:** `0x30E6` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 2 } ``` ### 独立轴点动 **命令字:** `0x30E7` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | vel | int | 速度;单位:rpm | - | | acc | double | 加速度 | - | | dec | double | 减速度 | - | | dir | int | 运动方向;1:正,-1:反向 | - | **请求示例:** ```json { "axisNum": 2, "vel": 5, "acc": 50.0, "dec": 50.0, "dir": 1 } ``` ## 独立轴状态 ### 上位机查询独立轴状态 **命令字:** `0x30E8` **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴状态 **命令字:** `0x30E9` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | | currentPos | double | 当前位置 | | currentVel | double | 当前速度;单位:rpm | | currentTorque | double | 当前力矩 | | status | int | 运行状态;0-停止,1-运动中,2-回零中,3-报警 | | servoOn | bool | 伺服使能状态;true-使能,false-未使能 | | alarmCode | int | 报警代码;0 表示无报警 | **响应示例:** ```json { "axisNum": 1, "currentPos": 120.5, "currentVel": 100.0, "currentTorque": 0.5, "status": 1, "servoOn": true, "alarmCode": 0 } ``` ## 独立轴控制 ### 独立轴伺服使能 **命令字:** `0x30EA` > **说明:** 控制独立轴伺服电机的使能/去使能状态。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | enable | bool | 伺服使能;true-使能,false-去使能 | - | **请求示例:** ```json { "axisNum": 1, "enable": true } ``` ### 独立轴复位 **命令字:** `0x30EB` > **说明:** 复位独立轴的报警状态。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 独立轴停止 **命令字:** `0x30EC` > **说明:** 停止独立轴的所有运动(包括点动、回零、定位运动)。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ## 独立轴定位运动 ### 独立轴绝对位置运动 **命令字:** `0x30ED` > **说明:** 控制独立轴运动到指定的绝对位置。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | targetPos | double | 目标位置 | 受正反限位限制 | | vel | double | 运动速度;单位:rpm | [0, 6000] | | acc | double | 加速度 | > 0 | | dec | double | 减速度 | > 0 | **请求示例:** ```json { "axisNum": 1, "targetPos": 200.0, "vel": 100.0, "acc": 50.0, "dec": 50.0 } ``` ### 独立轴相对位置运动 **命令字:** `0x30EE` > **说明:** 控制独立轴以当前位置为基准,运动指定的相对距离。 **参数说明:** | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | axisNum | int | 独立轴编号 | - | | relativePos | double | 相对位移量;正值正向运动,负值反向运动 | 受正反限位限制 | | vel | double | 运动速度;单位:rpm | [0, 6000] | | acc | double | 加速度 | > 0 | | dec | double | 减速度 | > 0 | **请求示例:** ```json { "axisNum": 1, "relativePos": 50.0, "vel": 80.0, "acc": 40.0, "dec": 40.0 } ``` ### 独立轴定位运动停止 **命令字:** `0x30EF` > **说明:** 停止独立轴的定位运动(绝对/相对位置运动)。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 独立轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ## 独立轴配置 ### 上位机查询独立轴软限位 **命令字:** `0x2809` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | **请求示例:** ```json { "axisNum": 1 } ``` ### 控制器返回独立轴软限位 **命令字:** `0x280A` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | axisNum | int | 轴编号 | | positiveLimit | double | 正限位值 | | inverseLimit | double | 反限位值 | | enableLimit | bool | 软限位使能状态 | **响应示例:** ```json { "axisNum": 1, "positiveLimit": 500.0, "inverseLimit": -500.0, "enableLimit": true } ``` ## 独立轴运动说明 ### 运动控制模式 独立轴提供以下几种运动控制方式: | 控制方式 | 命令字 | 说明 | |----------|--------|------| | PV 运动 | `0x30E0` | 速度控制模式,以指定速度和方向持续运动 | | 点动 | `0x30E7` | Jog 模式,按住时持续运动,松开停止 | | 绝对定位 | `0x30ED` | 运动到指定的绝对位置后停止 | | 相对定位 | `0x30EE` | 从当前位置运动指定的相对距离后停止 | | 回零 | `0x30E5` | 回到零点位置 | ### 运动停止方式 | 停止方式 | 命令字 | 说明 | |----------|--------|------| | PV 停止 | `0x30E1` | 停止 PV 运动 | | 取消运动 | `0x30E4` | 取消独立控制运动 | | 回零停止 | `0x30E6` | 停止回零操作 | | 通用停止 | `0x30EC` | 停止所有运动 | | 定位停止 | `0x30EF` | 停止定位运动 | ### 操作流程 1. 首先通过 `0x30EA` 使能伺服 2. 查询 `0x30E9` 确认伺服已使能且无报警 3. 发送运动命令(PV、点动、定位等) 4. 通过 `0x30E9` 监控运行状态 5. 运动完成后发送停止命令 6. 必要时通过 `0x30EA` 去使能伺服 --- # 插件 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/02.%E6%9C%BA%E5%99%A8%E4%BA%BA/14.%E6%8F%92%E4%BB%B6.html ## 1. 查询插件详情 ### 上位机下发查询插件详情 **命令字:** `0x10D0` | 参数名 | 类型 | 说明 | |--------|------|------| | pluginsClass | string | 插件基类类型 | | pluginsEnum | int | 插件枚举值 | **请求示例 JSON:** ```json { "pluginsClass": "Interp", "pluginsEnum": 3 } ``` --- ### 控制器回复插件详情 **命令字:** `0x10D1` | 参数名 | 类型 | 说明 | |--------|------|------| | isPluginsState | bool | 插件加载状态;true 为加载 | | pluginsName | string | 插件文件名 | | version | string | 版本号 | | author | string | 作者 | | description | string | 描述 | | interfaceVersion | string | 接口版本 | | paramVersion | string | 参数版本 | | libaVersion | string | 插件的静态库版本号 | | demandInterfaceVersion | string | 需求接口版本 | | demandParaVersion | string | 需求参数版本 | | demandLibaVersion | string | 当前控制器程序需要的插件静态库版本号 | | dependencies | array | 依赖项,元素为 object | | dependencies.dependencyName | string | 依赖插件功能名称 | | dependencies.interfaceVersion | string | 依赖插件接口版本 | | dependencies.paramVersion | string | 依赖插件参数版本 | | dependencies.libaVersion | string | 依赖插件静态库版本号 | **回复示例 JSON:** ```json { "isPluginsState": true, "pluginsName": "trajectory_line_interp.pln", "version": "1.0.0", "author": "Inexbot", "description": "直线轨迹的插件库", "interfaceVersion": "1.0.0", "paramVersion": "1.0.0", "libaVersion": "1.0.0", "demandInterfaceVersion": "1.0.0", "demandParaVersion": "1.0.0", "demandLibaVersion": "1.0.0", "dependencies": [ { "dependencyName": "机器人模型插件", "interfaceVersion": "1.0.0", "paramVersion": "1.0.0", "libaVersion": "1.0.0" } ] } ``` --- ## 2. 查询插件列表 ### 上位机下发查询插件列表 **命令字:** `0x10D2` | 参数名 | 类型 | 说明 | |--------|------|------| | pluginsClass | string | 插件基类类型 | **请求示例 JSON:** ```json { "pluginsClass": "Model" } ``` --- ### 控制器回复插件列表 **命令字:** `0x10D3` | 参数名 | 类型 | 说明 | |--------|------|------| | pluginsList | array | 插件列表,元素为 object | | pluginsList.pluginsClass | string | 插件基类类型 | | pluginsList.pluginsEnum | int | 插件枚举值 | | pluginsList.pluginsName | string | 插件功能名称 | | pluginsList.supportSyncAxisType | array | 插件类型枚举值,int 数组 | **回复示例 JSON:** ```json { "pluginsList": [ { "pluginsClass": "Interp", "pluginsEnum": 1, "pluginsName": "点动轨迹" }, { "pluginsClass": "Interp", "pluginsEnum": 2, "pluginsName": "点到点轨迹" } ] } ``` --- ## 3. 查询所有插件名称 ### 上位机下发查询所有插件名称 **命令字:** `0x10D4` > 无请求参数 **请求示例 JSON:** ```json {} ``` --- ### 控制器回复所有插件名称 **命令字:** `0x10D5` | 参数名 | 类型 | 说明 | |--------|------|------| | pluginsNameList | array | 所有的插件名称,string 数组 | **回复示例 JSON:** ```json { "pluginsNameList": [ "robot_model_SERIAL_6S_CBBARA.pln", "robot_model_SERIAL_4S_CBBC.pln", "trajectory_extern_axis_fixed_point_wobble_weld.pln", "trajectory_extern_axis_line_interp.pln", "extern_axis_three_translate_axis.pln", "extern_axis_two_translate_axis.pln" ] } ``` --- # 程序增删改查 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/01.%E7%A8%8B%E5%BA%8F%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5.html ## 1 程序删除 **命令字:** `0x5000` **说明:** 上位机下发删除程序 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | jobfilename | string | 是 | 作业文件名称 | | suffixname | string | 是 | 作业文件后缀名 | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "jobfilename": "QQQQ", "suffixname": ".JBR" } ``` --- ## 2 程序重命名 **命令字:** `0x5001` **说明:** 将原有程序的名字更改,上位机下发重命名程序 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | lastname | string | 是 | 修改前程序名 | | newname | string | 是 | 修改后程序名 | | suffixname | string | 是 | 程序后缀名 | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "lastname": "QQQQ", "newname": "WWWW", "suffixname": ".JBR" } ``` --- ## 3 程序创建 **命令字:** `0x5002` **说明:** - 程序的新建需要在示教模式下 - 程序的运行需要再运行模式下,并且伺服就绪,上电没有报错 - 上位机下发新建程序 | 参数 | 类型 | 必填 | 说明 | | |------|------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | | jobName | string | 是 | 新建程序名,命名首字母不得为数字 | | | suffix | string | 是 | 程序后缀名 | | | time | string | 是 | 插入指令的时间,格式如 `2025.03.11 20:28:23` | | **后缀名类型:** - `.JBR` - 主程序 - `.JBP` - 后台局部程序 - `.JBPG` - 后台全局程序 ```json { "robot": 1, "jobName": "TTT", "suffixname": ".JBR", "time": "2025.03.11 20:28:23" } ``` ### 3.1 控制器发送新建作业指令(0x5004) **说明:** 控制器发送给示教器外部按键触发的新建作业 **命令字:** `0x5004` | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | jobName | string | 是 | 需要新建的作业名称 | ```json { "jobName": "文件1" } ``` --- ## 4 程序文件列表查询 **说明:** 上位机下发查询程序文件列表,若成功将会返回 `0x5011`、`0x5012`、`0x5013` 三个命令字 - 使用时,在接收到 `0x5011` 后,开启计时,设定5秒,作用为判断下载文件过程中是否等待超时 - 返回 `0x5012` 时,每个机器人会单独发送,并且每次发送文件数量为五个 - 文件发送完成后,返回 `0x5013` 作为发送完成的标志 ### 4.1 查询程序文件列表(0x5010) **命令字:** `0x5010` **说明:** 上位机下发查询程序文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | ### 4.2 返回程序文件总数(0x5011) **命令字:** `0x5011` **说明:** 控制器返回程序文件总数,获取所有机器人的程序文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | absolutepath | string 数组 | 是 | 程序文件的文件夹列表,如 `{"/job/R1/","/job/R2/","/job/R3/","/job/R4/"}`,当只有一个机器人时,其余位置填空字符串 | | jobfilenum | int 数组 | 是 | 程序文件夹中包含的文件个数,分别对应机器人1,2,3,4,数量包含复位程序;当只有一个机器人时,其余位置为0 | **备注:** 复位程序 - 当点击复位时执行复位程序或者移动到复位点,具体操作看用户设置 ```json { "absolutepath": ["/job/R1/", "/job/R2/", "/job/R3/", "/job/R4/"], "jobfilenum": [4, 1, 1, 1] } ``` ### 4.3 返回程序文件列表(0x5012) **命令字:** `0x5012` **说明:** 控制器主动向上位机发送指令,向上位机回复时每个机器人分开发送 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | robot | int | 是 | 机器人编号,取值范围[1,4] | | listnum | int | 是 | 发送的程序文件数量,单次最多发送5个,范围[0,5] | | jobfilelist | object 数组 | 是 | 程序文件数组,元素个数为 `listnum` 的值 | **jobfilelist 元素结构:** | 参数 | 类型 | 说明 | |------|------|------| | name | string | 程序文件名,如 `xxx.JBR` | | MD5 | string | MD5值,用于判断文件是否相同 | **备注:** `RobotResetProgram.ResetPro` 为复位程序 ```json { "robot": 1, "listnum": 2, "jobfilelist": [ { "name": "RobotResetProgram.ResetPro", "MD5": "e4b21ca518cd2d2eecd4b3f463c02ab1" }, { "name": "yyy.JBR", "MD5": "5b172a7a37a07aa6ccec1c60cfd5db7d" } ] } ``` ### 4.4 程序文件列表查询结束(0x5013) **命令字:** `0x5013` **说明:** 标志着程序文件列表查询结束,控制器返回程序文件列表查询结束的标识 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | --- ## 5 Lua 文件列表查询 ### 5.1 查询 Lua 文件列表(0x5020) **命令字:** `0x5020` **说明:** 上位机发送查询 lua 文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | - | - | - | 无节点 | ### 5.2 返回 Lua 文件列表(0x5021) **命令字:** `0x5021` **说明:** 控制器返回 lua 文件列表 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | absolutepath | string | 是 | lua 脚本所在目录,如 `lua/` | | sum | int | 是 | 列表总数 | | scriptlist | string 数组 | 是 | lua 文件列表 | ```json { "absolutepath": "lua/", "sum": 2, "scriptlist": ["ww.lua", "ee.lua"] } ``` --- # 指令-运动控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/01.%E6%8C%87%E4%BB%A4-%E8%BF%90%E5%8A%A8%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 外部轴运动 **说明**:与外部轴有关的运动指令,必须是在存在外部轴的前提下才可以使用。 --- ### MOVJEXT - 外部轴点到点运动 **指令类型**:type = 33 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 100] | % | 速度(m_vUnit 必须为2) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量;1:绑定变量,0:非绑定变量 | | RobotPos | object | - | - | 点位信息(当使用绑定变量点位时,不使用该节点) | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s | | 2 | 百分比(仅可使用2) | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 33, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### MOVLEXT - 外部轴直线运动 **指令类型**:type = 34 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSYNC | int | 0或1 | - | 变位机同步;0:否,1:同步 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 34, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### MOVCEXT - 外部轴圆弧运动 **指令类型**:type = 35 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaEVJ | double | [1, 100] | - | 外部轴速度调整比率;值为字符串"0"时表示不使用 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSYNC | int | 0或1 | - | 变位机同步;0:否,1:同步 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaEVJ": { "data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSYNC": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 35, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EXTMOV - 外部轴随动运动 **指令类型**:type = 144 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | _pVarName | double | [-2000, 0) ∪ (0, 2000] | 速度值 | | extaxle | int | 1, 2, 3 | 外部轴编号;1:O1,2:O2,3:O3 | | movtype | int | 0, 1, 2 | 外部轴随动方式;0:随线速度动,1:恒速运动,2:绑定变量 | | p_move_type | object | - | 当 movtype 为2时,绑定的变量为该节点 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "_pVarName": { "data": 2.90, "secondvalue": 0, "value": 0, "varname": "" }, "extaxle": 1, "logout": false, "movtype": 2, "p_move_type": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "p_speed_proportion_factor": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 144, "userParamInt": 0, "userParamString": "" } ``` --- ### ENDEXTMOV - 外部轴随动停止运动 **指令类型**:type = 145 #### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 145, "userParamInt": 0, "userParamString": "" } ``` --- ### GEARIN - 电子齿轮 **指令类型**:type = 148 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | followAxle | int | 1, 2, 3 | 随动轴;1=O1,2=O2,3=O3 | | mainAxle | int | 1-6 | 主轴;J1~J6轴对应1-6 | | proportionfactor | double | (0, 1000] | 比例关系(k);随动轴速(°/s)=K*主轴速(°/s) | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "followAxle": 1, "logout": false, "mainAxle": 2, "proportionfactor": 3.0, "type": 148, "userParamInt": 0, "userParamString": "" } ``` --- ### ENDGEARIN - 电子齿轮停止 **指令类型**:type = 150 #### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 150, "userParamInt": 0, "userParamString": "" } ``` --- ### MRESET - 复位外部轴多圈转动量 **指令类型**:type = 149 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | exterAxis | int | 0, 1, 2, 3 | 外部轴个数;0为全部轴,1=O1,2=O2,3=O3 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 149, "userParamInt": 0, "userParamString": "", "exterAxis": 1 } ``` --- ## 双机运动 **说明**:需要先设置成双机模式。 --- ### MOVJDOUBLE - 双机点到点运动 **指令类型**:type = 59 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 100] | % | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 59, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVLDOUBLE - 双机直线运动 **指令类型**:type = 56 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 56, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVCDOUBLE - 双机圆弧运动 **指令类型**:type = 57 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 57, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ### MOVCADOUBLE - 双机整圆运动 **指令类型**:type = 58 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaSPIN | int | 0, 1, 2 | - | 姿态参数;0:姿态不变,1:六轴不转,2:六轴旋转 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "E0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 58, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "E0001", "posidtype": 0 } ``` --- ## 外部点运动 **说明**:使用 MODBUS 或者 TCP 发送过来的点位信息来运动。 --- ### MOVCOMM - 外部点运动 **指令类型**:type = 101 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [2, 1000]或[1, 100] | mm/s 或% | 速度;根据 m_vUnit 和 moveType 确定范围 | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | moveType | string | MovJ/MovL/MovS/MovC | - | 插补方式;MovJ:关节,MovL:直线,MovS:曲线,MovC:圆弧 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | #### m_vUnit 速度单位说明 | m_vUnit 值 | 单位 | 适用插补方式 | 速度范围 | |-----------|------|--------------|----------| | 1 | mm/s | 直线、曲线、圆弧 | [2, 1000] | | 2 | % | 关节 | [1, 100] | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 101, "logout": false, "userParamInt": 0, "userParamString": "", "moveType": "MovS" } ``` --- ## 拖拽轨迹运动 **说明**:使用原本的拖拽轨迹来运动。 --- ### DRAG_TRAJECTORY - 拖拽轨迹 **指令类型**:type = 174 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | trackName | string | - | - | 轨迹名称;开头##,结束$$ | | trackSpeed | double | 0~500 | % | 轨迹回放速率 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | #### 示例 ```json { "logout": false, "type": 174, "userParamInt": 0, "userParamString": "", "trackName": "##RRR$$", "trackSpeed": 3 } ``` --- ## 切换负载编号 **说明**:不切换工具手,只切换负载编号。 --- ### SWITCHPAYLOAD - 切换负载编号 **指令类型**:type = 219 #### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | _pVarName | object | - | 负载编号参数 | | logout | bool | true/false | 是否被注释 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | #### 负载编号范围 | 范围 | 说明 | |------|------| | 1-999 | int 类型 | #### 示例 ```json { "logout": false, "type": 219, "userParamInt": 0, "userParamString": "", "_pVarName": { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" } } ``` --- ## 外部基准点运动 **说明**:外部基准点是指将空间中的一点作为本体的控制点。 --- ### EIMOVL - 外部基准点直线 **指令类型**:type = 233 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 233, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EIMOVC - 外部基准点圆弧 **指令类型**:type = 233 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 233, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ### EIMOVCA - 外部基准点整圆 **指令类型**:type = 235 #### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1, 100] | % | 加速度 | | ParaDEC | double | [1, 100] | % | 减速度 | | ParaSPIN | int | 0 | - | 姿态参数;0:姿态不变 | | ParaV | double | [1, 1000] | mm/s | 速度(m_vUnit 必须为1) | | ParaPL | double | [0, 5] | - | 平滑 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | logout | bool | true/false | - | 是否被注释 | | userParamInt | int | - | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | - | 二次开发中客户自定义,目前无意义 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位是否为绑定变量 | | RobotPos | object | - | - | 点位信息 | #### m_vUnit 速度单位说明 | 值 | 说明 | |----|------| | 0 | cm/s | | 1 | mm/s(仅可使用1) | | 2 | 百分比 | #### 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [ 5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "key": "P0001", "note": "", "paraVarData": [ { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 1.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 3.142, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } ] }, "type": 235, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- # 指令-通用运动 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/02.%E6%8C%87%E4%BB%A4-%E9%80%9A%E7%94%A8%E8%BF%90%E5%8A%A8.html ## 1. MOVJ 点到点运动 **说明**:点到点运动为关节运动,单位为%。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,100] | % | 速度,m_vUnit 必须为2 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 1 | - | 指令类型,1表示 MOVJ 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 1, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 2. MOVL 直线运动 **说明**:直线运动速度单位为 mm。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 2 | - | 指令类型,2表示 MOVL 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### m_vUnit 速度单位说明 | 值 | 单位 | |----|------| | 0 | cm/s | | 1 | mm/s | | 2 | 百分比 | > 直线运动时只能使用 1 (mm/s)。 ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 2, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 3. MOVC 圆弧运动 **说明**:使用时需要一条直线或点到点指令和两条圆弧指令,这三个点确定一个圆弧。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSPIN | double | 0或1 | - | 姿态参数:0=示教姿态,1=姿态倾角不变 | | type | int | 3 | - | 指令类型,3表示 MOVC 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 3, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 4. MOVCA 插入整圆 **说明**:整圆运动需要一条点到点或者直线运动,加两个整圆运动指令。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | ParaSPIN | double | 0,1,2 | - | 姿态参数:0=姿态不变,1=六轴不转,2=六轴旋转 | | type | int | 4 | - | 指令类型,4表示 MOVCA 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 4, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 5. MOVS 插入曲线 **说明**:曲线运动为 S 型运动轨迹,需要一条点到点或直线指令,再加四条曲线运动指令。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 6 | - | 指令类型,6表示 MOVS 指令 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 6, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 6. IMOV 增量运动 **说明**:增量运动为在当前位置的基础上,各轴增加多少。此时的点位信息为各轴增加多少。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,100] | % | 速度,m_vUnit 必须为2 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 5 | - | 指令类型,5表示 IMOV 指令 | | imovecoord | string | - | - | 移动坐标:RF=关节坐标,BF=直角坐标,TF=工具坐标,UF=用户坐标 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 2, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 5, "logout": false, "imovecoord": "RF", "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## 7. MOVARCH 门型运动 **说明**:门型运动为从当前位置抬升或降低到指定高度,随后在该平面上移动到目标点的上方或下方,最后抬升或降低到目标点。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaSPIN | double | [0,1] | - | 关节运动方式:0=关节,1=直角 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 231 | - | 指令类型,231表示 MOVARCH 指令 | | offsetAxis | int | [0,2] | - | 位移轴:0=X,1=Y,2=Z | | para_line_or_coord_max_ | double | - | - | 最大坐标值或最大高度值 | | axis_offset_type_ | int | 0或1 | - | 偏移方式:1=最大坐标,0=最大高度 | | para_straight_up_ | double | - | - | 垂直上升距离 | | para_straight_down_ | double | - | - | 垂直下降距离 | | use_arch_params_table_enable_ | int | 0或1 | - | 是否使用参数表 | | arch_param_group_index_ | int | [0,6] | - | 参数表组号 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaSPIN": { "data": 0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 231, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0, "offsetAxis": 0, "para_line_or_coord_max_": 0.0, "axis_offset_type_": 1, "para_straight_up_": 0.0, "para_straight_down_": 0.0, "use_arch_params_table_enable_": 0, "arch_param_group_index_": 0 } ``` --- ## 8. MOVARCHEXT 扩展门型运动 **说明**:门型运动为从当前位置抬升或降低到指定高度,随后在该平面上移动到目标点的上方或下方,最后抬升或降低到目标点。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [1,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 275 | - | 指令类型,275表示 MOVARCHEXT 指令 | | offsetAxis | int | [0,2] | - | 位移轴:0=X,1=Y,2=Z | | para_straight_up_ | double | - | - | 垂直上升距离 | | para_straight_down_ | double | - | - | 垂直下降距离 | | use_arch_params_table_enable_ | int | 0或1 | - | 是否使用参数表 | | arch_param_group_index_ | int | [0,6] | - | 参数表组号 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### 点位信息说明 - **RobotPos**:目标点点位信息 - **RobotPos1**:接近点点位信息 - **RobotPos2**:转移点点位信息 当使用绑定变量点位时,不使用对应节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 275, "logout": false, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0, "offsetAxis": 0, "para_straight_up_": 0.0, "para_straight_down_": 0.0, "use_arch_params_table_enable_": 0, "arch_param_group_index_": 0 } ``` --- ## 9. SPEED 全局速度 **说明**:可使用该指令设置全局速度。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | type | int | 31 | - | 指令类型,31表示 SPEED 指令 | | paraSpeed | int | [1,200] | % | 全局速度 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | ### JSON 示例 ```json { "type": 31, "paraSpeed": { "data": 150.0, "secondvalue": 0, "value": 0, "varname": "" }, "logout": false, "userParamInt": 0, "userParamString": "" } ``` --- ## 10. SAMOV 定点移动 **说明**:定点移动可以使用不同的坐标系移动。 ### 参数说明 | 参数名 | 类型 | 取值范围 | 单位 | 说明 | |--------|------|----------|------|------| | ParaACC | double | [1,100] | % | 加速度 | | ParaDEC | double | [1,100] | % | 减速度 | | ParaV | double | [2,1000] | mm/s | 速度,m_vUnit 必须为1 | | ParaPL | double | [0,5] | - | 平滑变量 | | ParaTIME | double | 自然数 | - | 提前执行时间 | | type | int | 59 | - | 指令类型,59表示 SAMOV 指令 | | imovecoord | string | - | - | 移动坐标:RF=关节坐标,BF=直角坐标,TF=工具坐标,UF=用户坐标 | | logout | bool | - | - | 是否被注释,true 表示不执行 | | userParamInt | int | - | - | 二次开发自定义参数 | | userParamString | string | - | - | 二次开发自定义参数 | | posidname | string | - | - | 绑定变量时的点位名 | | positionId | string | - | - | 非绑定变量时的点位名 | | posidtype | int | 0或1 | - | 点位类型:1=绑定变量,0=非绑定变量 | ### RobotPos 点位信息 当使用绑定变量点位时,不使用该节点。 ### JSON 示例 ```json { "ParaACC": { "data": 4.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaDEC": { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaV": { "data": 1.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": "" }, "ParaPL": { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" }, "ParaTIME": { "data": 5.0, "secondvalue": 0, "value": 0, "varname": "" }, "RobotPos": { "ctype": 2, "data": [5.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 6.0, 0.0, 6.0, 3.142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "AP0001", "note": "", "paraVarData": [ {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 4.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 6.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.142, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "type": 59, "logout": false, "imovecoord": "RF", "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- # 指令-输入输出类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/03.%E6%8C%87%E4%BB%A4-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B1%BB.html --- ## DIN IO 输入 **说明**:输入是相对于控制器而言,由外部到控制器。IO 输入的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | DIN 在枚举数列 type 中为17 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输入 | | ParaGroupValue | object | 端口值存入;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | din 类型;1路输入:IN#,4路输入:IGH#,8路输入:IG# | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **示例**: ```json { "logout": false, "type": 17, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "groupType": "IGH#" } ``` --- ## DOUT IO 输出 **说明**:将 IO 板上对应的 IO 端口置高或置低。IO 输出的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | DOUT 在枚举数列 type 中为16 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输出 | | ParaGroupValue | object | 端口值输出;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | dout 类型;1路输出:OT#,4路输出:OGH#,8路输出:OG# | | errorHanding | int | 1:计时结束停止,0:输出值保持 | | ParaGroupTime | object | 时间;double 类型;范围[0,9999] | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **ParaGroupTime 结构**: ```json {"data":3.0,"secondvalue":0,"value":0,"varname":""} ``` **示例**: ```json { "logout": false, "type": 16, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "errorHanding": 1, "groupType": "OT#", "ParaGroupTime": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## AIN 模拟输入 **说明**:输入是相对于控制器而言,由外部到控制器。模拟输入的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | AIN 在枚举数列 type 中为21 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupValue | object | 变量值;double 类型 | | portId | int | 模拟输入口;int 类型;取值范围1-IO 板数*2 | **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"D001"} ``` **示例**: ```json { "logout": false, "type": 21, "userParamInt": 0, "userParamString": "", "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "D001"}, "portId": 4 } ``` --- ## AOUT 模拟输出 **说明**:输出是由控制器控制 IO 板的值。模拟输出的指令。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | AOUT 在枚举数列 type 中为20 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupValue | object | 变量值;double 类型;范围[0,10] | | portId | int | 模拟输入口;int 类型;取值范围1-IO 板数*2 | **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"D001"} ``` **示例**: ```json { "logout": false, "type": 20, "userParamInt": 0, "userParamString": "", "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "D001"}, "portId": 4 } ``` --- ## PULSEOUT 脉冲输出 **说明**:按照设定的脉冲频率与个数,在 R1 PWMIO 板上的 DB9端子的引脚4(PWM+)上进行输出。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | PULSEOUT 在枚举数列 type 中为22 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | rate | int | 频率;int 类型;范围[1,1000000] | | sum | int | 个数;int 类型;范围大于零 | **示例**: ```json { "logout": false, "type": 22, "userParamInt": 0, "userParamString": "", "rate": 10, "sum": 100 } ``` --- ## READ_DOUT 读取输出 **说明**:将数字输出端口的状态通过变量读取,然后将2进制转为10进制数值并存入目标变量中。 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | READ_DOUT 在枚举数列 type 中为99 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | ParaGroupNum | object | 输入组号;int 类型;取值范围和一共多少组有关,IO 板值*16/几路输出 | | ParaGroupValue | object | 端口值输出;变量类型,全局或局部的 bool 或 int 型变量 | | groupType | string | dout 类型;1路输出:OT#,4路输出:OGH#,8路输出:OG# | **ParaGroupNum 结构**: ```json {"data":2.0,"secondvalue":0,"value":0,"varname":""} ``` **ParaGroupValue 结构**: ```json {"data":0.0,"secondvalue":0,"value":1,"varname":"I001"} ``` **示例**: ```json { "logout": false, "type": 99, "userParamInt": 0, "userParamString": "", "ParaGroupNum": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaGroupValue": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "groupType": "IGH#" } ``` --- # 指令-运算类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/04.%E6%8C%87%E4%BB%A4-%E8%BF%90%E7%AE%97%E7%B1%BB.html --- ## 加 (ADD) **说明**:参数1与参数2相加的值存入结果变量 **指令名**:ADD | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | ADD 在枚举序列中为43 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 43, "userParamInt": 0, "userParamString": "" } ``` --- ## 减 (SUB) **说明**:参数1与参数2相减的值存入结果变量 **指令名**:SUB | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | SUB 在枚举序列中为44 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 44, "userParamInt": 0, "userParamString": "" } ``` --- ## 乘 (MUL) **说明**:参数1与参数2相乘的值存入结果变量 **指令名**:MUL | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | MUL 在枚举序列中为45 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 45, "userParamInt": 0, "userParamString": "" } ``` --- ## 除 (DIV) **说明**:参数1与参数2相除的值存入结果变量(除数不可为零) **指令名**:DIV | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | desType2 | int | 变量2的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup2 | object | 变量2;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | DIV 在枚举序列中为46 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1/paraValueGroup2 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "desType2": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "paraValueGroup2": {"data": 5.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 46, "userParamInt": 0, "userParamString": "" } ``` --- ## 模 (MOD) **说明**:进行模运算,将模运算的结果存入到选择的结果变量 **指令名**:MOD | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量,全局或局部变量 | | type | int | MOD 在枚举序列中为47 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 47, "userParamInt": 0, "userParamString": "" } ``` --- ## 正弦 (SIN) **说明**:正弦运算(sin),A = sin(B),B 为弧度制 rad **指令名**:SIN | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | SIN 在枚举序列中为102 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 102, "userParamInt": 0, "userParamString": "" } ``` --- ## 余弦 (COS) **说明**:余弦运算(cos),A = cos(B),B 为弧度制 rad **指令名**:COS | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | COS 在枚举序列中为103 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 103, "userParamInt": 0, "userParamString": "" } ``` --- ## 反正弦 (ANTN) **说明**:反正弦运算(arcsin),A = arcsin(B),B 为弧度制 rad **指令名**:ANTN | 字段 | 类型 | 说明 | |------|------|------| | desType1 | int | 变量1的类型;此处只能填2 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraSourceGroup | object | 结果变量;int 类型变量或 double 类型变量,全局或局部变量 | | paraValueGroup1 | object | 变量1;数值或 int 类型变量或 double 类型变量,全局或局部变量 | | type | int | ANTN 在枚举序列中为104 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraSourceGroup/paraValueGroup1 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "desType1": 2, "logout": false, "paraSourceGroup": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraValueGroup1": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[I001]"}, "type": 104, "userParamInt": 0, "userParamString": "" } ``` --- ## 逻辑运算 (LOGICAL_OP) **说明**:逻辑运算(与、或、非) **指令名**:LOGICAL_OP | 字段 | 类型 | 说明 | |------|------|------| | logicalType | int | 运算类型;取值范围:0(与)、1(或)、2(非) | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | paraGroupOne | object | 变量1;int 类型变量或 double 类型变量或 bool 类型或 IO 输入,全局或局部变量 | | paraGroupStore | object | 结果变量;int 类型变量或 double 类型变量或 bool 类型,全局或局部变量 | | paraGroupTwo | object | 参数2;int 类型变量或 double 类型变量或 bool 类型或 IO 输入,全局或局部变量 | | type | int | LOGICAL_OP 在枚举序列中为121 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **paraGroupOne/paraGroupStore/paraGroupTwo 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | double | 数值 | | secondvalue | int | 变量类型标识 | | value | int | 变量引用标识;0:使用 data 数值;1:使用 varname 变量 | | varname | string | 变量名 | **示例**: ```json { "logicalType": 1, "logout": false, "paraGroupOne": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "paraGroupStore": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "paraGroupTwo": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, "type": 121, "userParamInt": 0, "userParamString": "" } ``` --- --- # 指令-条件控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/05.%E6%8C%87%E4%BB%A4-%E6%9D%A1%E4%BB%B6%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 调用子程序 (CALL) **说明**:调用另一个程序,被调用的程序运行完后返回主程序 CALL 指令的下一行继续运行。 **指令名**:CALL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | callInParaVarData | array | 否 | 输入参数个数及选择;有0-12个元素。元素格式:`{"data":0.0,"secondvalue":0,"value":2,"varname":"D001"}` | | callOutParaVarData | array | 否 | 输出参数个数及选择;有0-12个元素。元素格式:`{"data":0.0,"secondvalue":0,"value":2,"varname":"D001"}` | | jobName | string | 是 | 调用程序名称,不能是本身,调用的程序中须有参数声明 | | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL 在枚举数列中为15 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**:有两个参数 ```json { "callInParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D002" } ], "callOutParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD003" }, { "data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD004" } ], "jobName": "QQQQ", "logout": false, "type": 15, "userParamInt": 0, "userParamString": "" } ``` --- ## 退出 (RETURN) **说明**:退出当前运行的作业文件,例如:子程序、后台程序。 **指令名**:RETURN | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | RETURN 在枚举数列中为251 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 251, "userParamInt": 0, "userParamString": "" } ``` --- ## 调用 Lua 文件 (CALL_LUAFILE) **说明**:参数定义好之后,直接上传 Lua 文件,然后插入调用 Lua 文件指令,指令运行结束后会把写好的所有参数变量传入和输出。 **指令名**:CALL_LUAFILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL_LUAFILE 在枚举数列中为218 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | inParaVarData | array | 否 | 传入参数个数及选择;元素个数[0-12]。元素格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}` | | luafileName | string | 是 | 调用的 lua 文件 | | outParaVarData | array | 否 | 输出参数个数及选择;元素个数[0-12]。元素格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I001"}` | | textEditType | bool | 否 | 文本编译类型;true:文本类型,false:语句类型 | **示例**: ```json { "logout": false, "type": 218, "userParamInt": 0, "userParamString": "", "inParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, { "data": 2.0, "secondvalue": 0, "value": 0, "varname": "" } ], "luafileName": "demo.lua", "outParaVarData": [ { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" }, { "data": 6.0, "secondvalue": 0, "value": 0, "varname": "" } ], "textEditType": true } ``` --- ## 如果 (IF) **说明**:通过判断条件是否成立来执行下一目标的指令,判断条件不满足时,执行 ELSEIF 语句。IF 和 ENDIF 配对使用,不能单独删除或更改,会导致程序运行出错。ELSE IF 不可脱离 IF 单独使用。ELSE 不可脱离 IF 单独使用。 **指令名**:IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | IF 在枚举数列中为9 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ifconditionArrayFINAL | object | 是 | 表示 if 判断;{}内的为 if 判断的数据 | **ifconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **conditionGroup 元素结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | logicType | int | if 判断条件比较方式;1:==,2:<,3:>,4:<=,5:>=,6:!= | | paraGroupOne | object | 变量1,格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I002"}` | | paraGroupTwo | object | 变量2,格式:`{"data":0.0,"secondvalue":0,"value":1,"varname":"I002"}` | **示例**: ```json { "logout": false, "type": 9, "userParamInt": 0, "userParamString": "", "ifconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1, 0] } } ``` ### 结束如果 (END IF) **指令名**:END IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | END IF 在枚举数列中为12 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 12, "userParamInt": 0, "userParamString": "" } ``` ### 否则如果 (ELSE IF) **指令名**:ELSE IF | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ELSE IF 在枚举数列中为11 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ifconditionArrayFINAL | object | 是 | 表示 if 判断;{}内的为 if 判断的数据 | **ifconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 11, "userParamInt": 0, "userParamString": "", "ifconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1, 0] } } ``` ### 否则 (ELSE) **指令名**:ELSE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ELSE 在枚举数列中为10 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 10, "userParamInt": 0, "userParamString": "" } ``` --- ## 等待 (WAIT) **说明**:条件成立之前程序处于等待状态,条件成立后继续执行等待指令后面的指令。 **指令名**:WAIT | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WAIT 在枚举数列中为8 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | m_filterTime | double | 否 | 滤波时间,输入信号需满足的时间;[0,9999]s。滤波时间要小于等待时间 | | paraTime | object | 否 | 等待时间;double 类型;[0.01,9999]s | | para_wait_result_ | object | 否 | 等待结果,满足条件为 true;bool 类型 | | waitConditionFinal | object | 否 | {}内为参与判断的条件和变量 | | wait_value_check_ | bool | 否 | 是否接受结果;true:存在"para_wait_result_"节点,false:不存在 | **waitConditionFinal 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 8, "userParamInt": 0, "userParamString": "", "m_filterTime": 66.0, "paraTime": { "data": 77.0, "secondvalue": 0, "value": 0, "varname": "" }, "para_wait_result_": { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B005" }, "waitConditionFinal": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } } ], [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" } } ], [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I007" } } ] ], "logic": [1, 0] }, "wait_value_check_": true } ``` --- ## WHILE 循环 (WHILE) **说明**:判断条件为真是反复执行循环语句里面的指令。插入 WHILE 指令的同时会同时插入 ENDWHILE 指令。若要删除 WHILE 指令请同时删掉其对应的 ENDWHILE 指令,否则会导致程序无法运行。当程序的开头为 WHILE 且最后一样指令为 ENDWHILE 时,请在程序的开头或结尾插入一条 TIMER(延时)指令。否则当 WHILE 指令的条件不满足时会导致程序陷入死机。当 WHILE 内部的指令没有运动类指令或在某种情况下可能会陷入死循环时,请在 WHILE 与 ENDWHILE 间插入一条 TIMER(延时)指令,否则当 WHILE 指令的条件满足时可能会导致程序陷入死机。当 WHILE 指令的条件满足时,会循环运行 WHILE 与 ENDWHILE 两条指令之间的指令。在运行到 WHILE 指令之前若判断条件不满足,在运行到 WHILE 指令时会直接跳转到 ENDWHILE 指令而不运行 WHILE 与 ENDWHILE 之间的指令;若在运行 WHILE 与 ENDWHILE 之间的指令过程中,判断条件变成不满足,会继续运行,直到运行到 ENDWHILE 行,不再循环而是继续运行 ENDWHILE 下面的指令。 **指令名**:WHILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WHILE 在枚举数列中为13 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | whileconditionArrayFINAL | object | 是 | 表示 while 判断;{}内的为 while 判断的数据 | **whileconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | while 判断与 while 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 13, "userParamInt": 0, "userParamString": "", "whileconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } } ], [ { "logicType": 2, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" } } ], [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I007" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" } }, { "logicType": 4, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I008" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I009" } } ] ], "logic": [0, 1], "logicGroup": [null, null, [0]] } } ``` ### 结束循环 (ENDWHILE) **指令名**:ENDWHILE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ENDWHILE 在枚举数列中为14 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 14, "userParamInt": 0, "userParamString": "" } ``` --- ## LABEL 标签 (LABEL) **说明**:指定跳转目标行的标签。同一程序无法插入两条标签名相同的标签指令。标签指令不支持上移、下移操作。 **指令名**:LABEL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | LABEL 在枚举数列中为51 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | label | string | 是 | 标签名;格式:`[$......$]` | **示例**: ```json { "logout": false, "type": 51, "userParamInt": 0, "userParamString": "", "label": "[$EAFF$]" } ``` --- ## JUMP 跳转 (JUMP) **说明**:跳转至指定标签号的指令行。判断条件成立则跳转到 LABEL 指令行,若判断条件不成立则忽略 JUMP 指令,继续运行 JUMP 指令的下一行指令。JUMP 指令必须与 LABEL(标签)指令配合使用。JUMP 指令不可跨程序跳转。例如主程序里面插入 LABEL [$Q1$]指令,在子程序插入 JUMP [$Q1$]指令,程序运行会报错。 **指令名**:JUMP | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | JUMP 在枚举数列中为52 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | jumpCondition | object | 否 | 表示 if 判断;{}内的为 if 判断的数据 | | jumpConditionFlag | bool | 否 | 是否使用判断条件;true:使用,false:不使用 | | label | string | 是 | 标签名;格式:`[$......$]` | **jumpCondition 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 52, "userParamInt": 0, "userParamString": "", "jumpCondition": { "conditionGroup": [ [ { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" }, "paraGroupTwo": { "data": 89.0, "secondvalue": 0, "value": 0, "varname": "" } }, { "logicType": 3, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 88.0, "secondvalue": 0, "value": 0, "varname": "" } } ], [ { "logicType": 6, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I089" }, "paraGroupTwo": { "data": 78.0, "secondvalue": 0, "value": 0, "varname": "" } } ] ], "logic": [1], "logicGroup": [[0]] }, "jumpConditionFlag": true, "label": "[$EAFF$]" } ``` --- ## UNTIL 直到 (UNTIL) **说明**:条件不成立时重复执行 UNTIL 和 ENDUNTIL 之间的指令,条件成立时直接跳到 ENDUNTIL 下面的指令运行。UNTIL 指令插入的同时会插入 ENDUNTIL 指令。若要删除 UNTIL 指令请同时删掉其对应的 ENDUNTIL 指令,否则会导致程序无法运行。 **指令名**:UNTIL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | UNTIL 在枚举数列中为87 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | untilconditionArrayFINAL | object | 是 | {}内的为判断的数据 | **untilconditionArrayFINAL 结构**: | 参数名 | 类型 | 说明 | |--------|------|------| | conditionGroup | array | 元素个数表示有多少个并列判断,元素的数组内的元素为并列判断 | | logic | array | if 判断与 if 判断之间的关系,按数组内元素顺序;1:或,0:与 | | logicGroup | array | conditionGroup 节点的元素的判断条件;1:或,0:与,null 表示该层没有判断 | **示例**: ```json { "logout": false, "type": 87, "userParamInt": 0, "userParamString": "", "untilconditionArrayFINAL": { "conditionGroup": [ [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" } }, { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004" } } ], [ { "logicType": 1, "paraGroupOne": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005" }, "paraGroupTwo": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006" } } ] ], "logic": [0], "logicGroup": [[1]] } } ``` ### 停止直到 (ENDUNTIL) **指令名**:ENDUNTIL | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | ENDUNTIL 在枚举数列中为88 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 88, "userParamInt": 0, "userParamString": "" } ``` --- ## 工艺跳行 (CRAFTLINE) **说明**:只用于专用工艺,程序中插入该指令设置对应行数,在专用工艺界面运行程序时会先跳转到对应的行数。 **指令名**:CRAFTLINE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CRAFTLINE 在枚举数列中为89 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | line | int | 是 | 专用工艺界面中对应的指令行数;[1,999] | **示例**: ```json { "logout": false, "type": 89, "userParamInt": 0, "userParamString": "", "line": 3 } ``` --- ## 指令注释 (CMDNOTE) **说明**:专用工艺指令,程序中运行该指令后,在专用工艺界面会跳转到对应的行数。 **指令名**:CMDNOTE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CMDNOTE 在枚举数列中为127 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | note | string | 是 | 注释内容;格式:`##.......$$` | **示例**: ```json { "logout": false, "type": 127, "userParamInt": 0, "userParamString": "", "note": "##ADSDDD$$" } ``` --- ## 到达判断 (POS_REACHABLE) **说明**:判断目标点是否能到达,点位能够到达选择的状态存入的变量置1,不能到达置0。 **指令名**:POS_REACHABLE | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | POS_REACHABLE 在枚举数列中为133 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | moveType | int | 否 | 运动类型;0-MOVJ,1-MOVL | | positionId | string | 是 | 位置变量名 | | _pVarName | object | 是 | 状态存入变量 | **示例**: ```json { "logout": false, "type": 133, "userParamInt": 0, "userParamString": "", "moveType": 0, "positionId": "GP0001", "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 6, "varname": "GB001" } } ``` --- ## 计时 (CLKSTART / CLKSTOP / CLKRESET) **说明**:运行该指令开始计时,并将时间记录到局部或者全局 DOUBLE 变量。停止对应序号的计时器计时,停止后已存入变量的值不会归零。 ### 计时开始 (CLKSTART) **指令名**:CLKSTART | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKSTART 在枚举数列中为128 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | | _pVarName | object | 是 | 存入变量 | **示例**: ```json { "logout": false, "type": 128, "userParamInt": 0, "userParamString": "", "ID": 5, "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" } } ``` ### 计时停止 (CLKSTOP) **指令名**:CLKSTOP | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKSTOP 在枚举数列中为129 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | **示例**: ```json { "logout": false, "type": 129, "userParamInt": 0, "userParamString": "", "ID": 5 } ``` ### 计时复位 (CLKRESET) **指令名**:CLKRESET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CLKRESET 在枚举数列中为130 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | ID | int | 是 | 计时序号;[1,32] | **示例**: ```json { "logout": false, "type": 130, "userParamInt": 0, "userParamString": "", "ID": 5 } ``` --- ## 读取线速度 (READLINEAR / STOPREADLINEAR) **说明**:机器人运行的时候实时读取机器人线速度,将读取到的速度存入到变量。插入读取线速度指令时会同时插入读取线速度停止,如果要删除读取线速度指令请将对应线速度停止指令删除,否则程序会报错。 ### 读取线速度 (READLINEAR) **指令名**:READLINEAR | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | READLINEAR 在枚举数列中为146 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | _pVarName | object | 是 | 变量;int 类型或 double 类型 | **示例**: ```json { "logout": false, "type": 146, "userParamInt": 0, "userParamString": "", "_pVarName": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI003" } } ``` ### 停止读取线速度 (STOPREADLINEAR) **指令名**:STOPREADLINEAR | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | STOPREADLINEAR 在枚举数列中为147 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 147, "userParamInt": 0, "userParamString": "" } ``` --- ## 调用 Lua 语句 (CALL_LUASTRING) **说明**:通过调用 Lua 语句来实现相应的功能或操作。 **指令名**:CALL_LUASTRING | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | CALL_LUASTRING 在枚举数列中为230 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | textEditType | bool | 否 | 文本编译类型;true:文本类型,false:语句类型 | | variable | object | 否 | lua 语句变量 | **示例**: ```json { "logout": false, "type": 230, "userParamInt": 0, "userParamString": "", "textEditType": false, "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001" } } ``` --- ## 参数声明 (PARAM_DECLARATION) **说明**:声明要输入或者输出的参数,输入参数将被子程序接收并使用,输出参数将返回给主程序使用。 **指令名**:PARAM_DECLARATION | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | PARAM_DECLARATION 在枚举数列中为237 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | declareInParaVarData | array | 否 | 输入参数变量;元素个数为输入参数个数;参数个数[0,12] | | declareInParaVarValues | array | 否 | 输入参数默认值;元素个数为输入参数个数;参数个数[0,12] | | declareInParaVarnote | array | 否 | 输入参数注释;元素个数为输入参数个数;参数个数[0,12] | | declareOutParaVarData | array | 否 | 输出参数值;元素个数为输出参数个数;参数个数[0,12] | | declareOutParaVarnote | array | 否 | 输出参数注释;元素个数为输出参数个数;参数个数[0,12] | **示例**: ```json { "logout": false, "type": 237, "userParamInt": 0, "userParamString": "", "declareInParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" }, { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002" }, { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003" } ], "declareInParaVarValues": [ { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D002" }, { "data": 0.0, "secondvalue": 0, "value": 2, "varname": "D003" } ], "declareInParaVarnote": [ "000", "111", "222" ], "declareOutParaVarData": [ { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B001" }, { "data": 0.0, "secondvalue": 0, "value": 3, "varname": "B002" } ], "declareOutParaVarnote": [ "333", "4444" ] } ``` --- ## 等到运动到点 (WAIT_POS) **说明**:MOV 指令执行结束并不代表伺服运行结束,仅为点位下发结束,此指令等待伺服电机运行精准到点,再执行下一个指令。此指令必须在运动指令后执行此指令才生效。此指令只能仅支持前台程序,后台无运动指令自然也不需要使用。此指令不支持提前执行。如果机器人在最小等待时间和最大等待时间之间,运动到点了,就会退出等待,执行下一条指令。 **指令名**:WAIT_POS | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | WAIT_POS 在枚举数列中为238 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | accurary | double | 是 | 精度;[0.0001,0.1]度/秒 | | waitType | int | 否 | 等待类型;0:位置,1:速度 | | maxTime | int | 是 | 最大等待时间;[20,20000] | | minTime | int | 是 | 最小等待时间;[20,20000] | **示例**: ```json { "logout": false, "type": 238, "userParamInt": 0, "userParamString": "", "accurary": 0.10, "maxTime": 200, "minTime": 20, "waitType": 0 } ``` --- ## 碰撞检测 (DETECTCOLLISION_SET / DETECTCOLLISION_RESET) **说明**:碰撞检测设置:调用临时参数,方便及时调整碰撞检测阈值。碰撞检测设置指令只是临时参数,只对碰撞检测设置指令下面的运动指令有效,不插入碰撞检测设置指令时调用人机协作-力学功能界面的碰撞检测阈值(指令)参数。碰撞检测参数复位:复位临时使用的碰撞检测阈值,执行此条指令后会调用人机协作-力学功能界面的碰撞检测阈值(指令)参数。 ### 碰撞检测设置 (DETECTCOLLISION_SET) **指令名**:DETECTCOLLISION_SET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | DETECTCOLLISION_SET 在枚举数列中为243 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | axis_1_ | double | 否 | 1轴;[1,10000] | | axis_2_ | double | 否 | 2轴;[1,10000] | | axis_3_ | double | 否 | 3轴;[1,10000] | | axis_4_ | double | 否 | 4轴;[1,10000] | | axis_5_ | double | 否 | 5轴;[1,10000] | | axis_6_ | double | 否 | 6轴;[1,10000] | | axis_7_ | double | 否 | 7轴;[1,10000] | | collision_detection_enable_ | int | 否 | 碰撞检测使能;1:使能,0:关闭使能 | | temp_parameters_enable_ | int | 否 | 使用临时参数;1:使用,0:不使用 | **示例**: ```json { "logout": false, "type": 243, "userParamInt": 0, "userParamString": "", "axis_1_": 10.0, "axis_2_": 20.0, "axis_3_": 30.0, "axis_4_": 40.0, "axis_5_": 50.0, "axis_6_": 60.0, "axis_7_": 0.0, "collision_detection_enable_": 1, "temp_parameters_enable_": 1 } ``` ### 碰撞检测参数复位 (DETECTCOLLISION_RESET) **指令名**:DETECTCOLLISION_RESET | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | DETECTCOLLISION_RESET 在枚举数列中为244 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 244, "userParamInt": 0, "userParamString": "" } ``` --- ## Switch 条件分支 (Switch / Case / Default / EndSwitch) **说明**:当 SWITCH 的参数值与某个 CASE 值匹配,则会跳到对应的 CASE 语句块中执行相应的指令,执行完该语句块则会跳出 SWITCH;若 SWITCH 的参数值不与任何一个 CASE 匹配则运行 DEFAULT 语句。 ### Switch (Switch) **指令名**:Switch | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Switch 在枚举数列中为247 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | variable_switch_ | object | 是 | 变量;int 类型 | **示例**: ```json { "logout": false, "type": 247, "userParamInt": 0, "userParamString": "", "variable_switch_": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` ### Case (Case) **指令名**:Case | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Case 在枚举数列中为248 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | switch_case | int | 是 | case 的值 | **示例**: ```json { "logout": false, "type": 248, "userParamInt": 0, "userParamString": "", "switch_case": 22 } ``` ### Default (Default) **指令名**:Default | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | Default 在枚举数列中为249 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 249, "userParamInt": 0, "userParamString": "" } ``` ### EndSwitch (EndSwitch) **指令名**:EndSwitch | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | logout | bool | 否 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 是 | EndSwitch 在枚举数列中为250 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **示例**: ```json { "logout": false, "type": 250, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-字符串类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/06.%E6%8C%87%E4%BB%A4-%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%B1%BB.html --- ## 1. 字符串追加 (STRING_SPELL) **说明**:在原有字符串变量或者新的字符变量中追加需要的字符,就构成了一个新的字符串变量。 **指令名**:STRING_SPELL **type 值**:223 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串追加在枚举数列中为 223 | 223 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 变量类型及名称;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | variableValue | object | 追加的字符变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"GS001"}` | ### JSON 示例 ```json { "logout": false, "type": 223, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"}, "variableValue": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "GS001"} } ``` --- ## 2. 索引截取 (STRING_SLICE) **说明**:截取一个字符串变量中的其中一部分字符串,并把截取到部分字符串存到指定的变量。 **指令名**:STRING_SLICE **type 值**:224 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,索引截取在枚举数列中为 224 | 224 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | startIndex | object | 起始索引位置;int 类型手填值或者变量,全局或局部 | `{"data":2.0,"secondvalue":0,"value":0,"varname":""}` | | endIndex | object | 结束索引位置;int 类型手填值或者变量,全局或局部 | `{"data":8.0,"secondvalue":0,"value":0,"varname":""}` | | dataVariable | object | 查询的数据依次存放的位置;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GS[I001]"}` | | variable | object | 被截取的字符串变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | ### JSON 示例 ```json { "logout": false, "type": 224, "userParamInt": 0, "userParamString": "", "startIndex": {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, "endIndex": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GS[I001]"}, "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 3. 字符串分隔符拆分 (STRING_SPLIT) **说明**:将字符串变量中的其中一个字符拆分,并把拆分的字符依次存放到指定变量中。 **指令名**:STRING_SPLIT **type 值**:225 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串分隔符拆分在枚举数列中为 225 | 225 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | separator | object | 分隔符;string 类型的手填值或变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"GS001"}` | | variable | object | 被提取的字符串变量名;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"S[I001]"}` | | dataVariable | object | 查询的数据依次存放的首位置;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | dataStorage | object | 记录提取数据的数量;string 类型的手填"0"或者 int 类型变量,全局或局部。string 类型的手填"0"表示不使用 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[I001]"}` | ### JSON 示例 ```json { "dataStorage": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[I001]"}, "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"}, "logout": false, "separator": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "GS001"}, "type": 225, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "S[I001]"} } ``` --- ## 4. 字符串定位 (STRING_LOCATE) **说明**:查询字符串变量里面的一种字符所在的位置,并把位置和数量存到指定变量。 > **注意:** > - 如果待索引变量在一个字符串里面是不连续的字符,在执行定位查询指令时,字符的位置和个数是无法读取出来的 > - 如果待索引变量在一个字符串里面是连续的字符,在执行定位查询指令时,读取出来的字符位置是第一个索引变量的位置,数据存放个数为1 **指令名**:STRING_LOCATE **type 值**:226 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串定位在枚举数列中为 226 | 226 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 被提取的字符串变量名;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | startIndex | object | 需要搜索的字符;string 类型手填值或变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":7,"varname":"RRRR"}` | | dataVariable | object | 查询的数据依次存放的首位置;int 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | | dataStorage | object | 记录提取数据的数量;string 类型的手填"0"或者 int 类型变量,全局或局部。string 类型的手填"0"表示不使用 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[GI001]"}` | ### JSON 示例 ```json { "dataStorage": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[GI001]"}, "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "startIndex": {"data": 0.0, "secondvalue": 0, "value": 7, "varname": "RRRR"}, "type": 226, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 5. 字符串长度 (STRING_LENGTH) **说明**:计算一个字符串变量的长度,并把计算的长度存到变量。 **指令名**:STRING_LENGTH **type 值**:227 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串长度在枚举数列中为 227 | 227 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 定位字符所在的变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | dataVariable | object | 计算结果存储的结果;int 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | ### JSON 示例 ```json { "dataVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "type": 227, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 6. 字符串转非字符串 (STRING_TO) **说明**:字符串变量转换成非字符串变量。 > **转换规则**:字符串变量转换成非字符串变量时只会将字符串变量的数值部分转译到非字符串变量。在转译过程中会从字符串变量的第一个字符开始转译,直到检测到的字符是非数值的字符时转译结束,将检测到的数值部分的字符转译到非字符变量。如果检测到的第一个字符就是非数值的字符,那字符串无法转译成功。 **指令名**:STRING_TO **type 值**:228 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,字符串转非字符串在枚举数列中为 228 | 228 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 待计算长度的变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | nonVariable | object | 转译的目标变量;int 类型或 double 类型或 bool 类型变量,局部或全局 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"I001"}` | ### JSON 示例 ```json { "nonVariable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001"}, "logout": false, "type": 228, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- ## 7. 非字符串转字符串 (TO_STRING) **说明**:非字符串变量转换成字符串变量。 **指令名**:TO_STRING **type 值**:229 ### 参数列表 | 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | logout | bool | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | type | int | 指令类型,非字符串转字符串在枚举数列中为 229 | 229 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 二次开发中客户自定义,目前无意义 | "" | | variable | object | 转译的目标变量;string 类型变量,全局或局部 | `{"data":0.0,"secondvalue":0,"value":8,"varname":"S001"}` | | nonVariable | object | 需要转译的变量;int 类型或 double 类型或 bool 类型变量,局部或全局 | `{"data":0.0,"secondvalue":1,"value":8,"varname":"GI[GI001]"}` | ### JSON 示例 ```json { "nonVariable": {"data": 0.0, "secondvalue": 1, "value": 8, "varname": "GI[GI001]"}, "logout": false, "type": 229, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 8, "varname": "S001"} } ``` --- # 指令-定时器类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/07.%E6%8C%87%E4%BB%A4-%E5%AE%9A%E6%97%B6%E5%99%A8%E7%B1%BB.html ## 延时 **说明**:延时设置的值,到达设置的时间后程序继续运行 | 参数名 | 类型 | 必填 | 说明 | 示例 | |--------|------|------|------|------| | logout | bool | 是 | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | false | | paraTime | object | 是 | 延时持续时间 | {"data":500.0,"secondvalue":0,"value":0,"varname":""} | | paraTime.data | double | 否 | 延时值;取值范围(0,9999];单位 s | 500.0 | | paraTime.value | int | 否 | 变量值(备用) | 0 | | paraTime.secondvalue | int | 否 | 变量值(备用) | 0 | | paraTime.varname | string | 否 | 变量名(使用变量时填) | "" | | type | int | 是 | TIMER 在枚举数列中为7 | 7 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | 0 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | "" | **命令字**:TIMER **JSON 示例**: ```json { "logout": false, "paraTime": { "data": 500.0, "secondvalue": 0, "value": 0, "varname": "" }, "type": 7, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-变量类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/08.%E6%8C%87%E4%BB%A4-%E5%8F%98%E9%87%8F%E7%B1%BB.html --- ## 1. 赋值 (SET) ### 说明 给定义的整型、浮点型、布尔型和字符串变量赋值。字符串追加指令。 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 指令类型,值为 41 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variable | object | 变量;int 类型或 bool 类型或 double 类型或 string 类型变量,全局或局部 | | variableValue | object | 变量值;手填值或 bool 类型或 int 类型或 double 类型变量 | ### variable 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### variableValue 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### 示例 ```json { "logout": false, "type": 41, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "I001" }, "variableValue": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GD009" } } ``` --- ## 2. 写入文件 (FORCESET) ### 说明 将缓存的数据存入硬盘。在程序运行过程中,所有的计算、赋值操作均是对缓存中的数值进行更改的,并不会存入系统文件中。若要强制将内存中的全局数值变量写入文件中,则可以使用 FORCESET 指令。 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 指令类型,值为 42 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variable | object | 变量名;int 类型或 bool 类型或 double 类型,全局 | ### variable 结构 | 字段 | 类型 | 说明 | |------|------|------| | varname | string | 变量名 | | value | int | 变量值 | | data | double | 浮点数据 | | secondvalue | int | 备用值 | ### 示例 ```json { "logout": false, "type": 42, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 8, "varname": "GI001" } } ``` --- # 指令-坐标系类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/09.%E6%8C%87%E4%BB%A4-%E5%9D%90%E6%A0%87%E7%B3%BB%E7%B1%BB.html --- ## 1. 切换工具手 (SWITCHTOOL) **说明:** 切换工具手,0为无工具手 **指令名:** `SWITCHTOOL` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `_variable` | object | - | 变量类型;手填 int 类型或 int 类型,全局或局部 | | `_variable.data` | float | - | 数据值 | | `_variable.secondvalue` | int | - | 副值 | | `_variable.value` | int | [0, 999] | 工具手编号 | | `_variable.varname` | string | - | 变量名 | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 48 | 切换工具手在枚举数列 type 中为48 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "_variable": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009" }, "logout": false, "type": 48, "userParamInt": 0, "userParamString": "" } ``` --- ## 2. 切换用户坐标 (SWITCHUCOORD) **说明:** 切换用户坐标 **指令名:** `SWITCHUCOORD` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `_variable` | object | - | 变量类型;手填 int 类型或 int 类型,全局或局部 | | `_variable.data` | float | - | 数据值 | | `_variable.secondvalue` | int | - | 副值 | | `_variable.value` | int | [0, 999] | 用户坐标编号 | | `_variable.varname` | string | - | 变量名 | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 49 | 切换用户坐标在枚举数列 type 中为49 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "_variable": { "data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]" }, "logout": false, "type": 49, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. 用户坐标转换 (USERCOORD_TRANS) **说明:** 将 B、C 用户坐标系叠加(×),结果置入 A 用户坐标系 **指令名:** `USERCOORD_TRANS` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `CoordA` | int | [1, 999] | 用户坐标 A;结果存入该用户坐标系,这里是用户坐标系序号 | | `CoordB` | int | [1, 999] | 用户坐标 B | | `CoordC` | int | [1, 999] | 用户坐标 C | | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `type` | int | 117 | 用户坐标转换在枚举数列 type 中为117 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "CoordA": 8, "CoordB": 18, "CoordC": 28, "logout": false, "type": 117, "userParamInt": 0, "userParamString": "" } ``` --- ## 4. 切换外部轴 (SWITCHSYNC) **说明:** 在程序运行中切换当前使用的外部轴 **指令名:** `SWITCHSYNC` ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | `logout` | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | `syncgroup` | int | [1, 3] | 要切换到的外部轴的组号 | | `type` | int | 50 | 切换外部轴在枚举数列 type 中为50 | | `userParamInt` | int | - | 二次开发中客户自定义,目前无意义 | | `userParamString` | string | - | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "logout": false, "syncgroup": 2, "type": 50, "userParamInt": 0, "userParamString": "" } ``` --- --- # 指令-网络通讯类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/10.%E6%8C%87%E4%BB%A4-%E7%BD%91%E7%BB%9C%E9%80%9A%E8%AE%AF%E7%B1%BB.html --- ## 发送数据 **说明**:向个网络设备发送字符串信息或者变量值 **指令名**:SENDMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | sendChar | 发送的字符消息 | string | - | | type | 发送数据在枚举数列 type 中为94 | int | 94 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 7, "logout": false, "sendChar": "UUUUUU", "type": 94, "userParamInt": 0, "userParamString": "" } ``` --- ## 解析数据 **说明**:该指令用来解析外部设备传来的一组数据,并将数据存入多个变量 **指令名**:PARSEMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | clearCache | 解析后是否清楚缓存区,0:否,1:是 | int | [0,1] | | dataStorage | 记录提取数据的数量;手填值 int 类型0或 int 类型变量,全局或局部;手填值0表示不记录提取数据的数量 | object | - | | dataVariable | 查询的数据依次存放的首位置;int 类型或 double 类型或 string 类型变量,全局或局部 | object | - | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 解析数据在枚举数列 type 中为96 | int | 96 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 3, "clearCache": 1, "dataStorage": { "data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009" }, "dataVariable": { "data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]" }, "logout": false, "type": 96, "userParamInt": 0, "userParamString": "" } ``` --- ## 读取 **说明**:读取通过以太网或 Modbus 通讯发送点位,并将点位存入到变量 **指令名**:READCOMM | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | 工艺号 | int | [1-9] | | commType | 通讯方式,0:ETHERENT 通讯,1:MODBUS 通讯 | int | [0,1] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | m_varname | 点位存放个数;int 类型变量,全局或局部 | string | - | | positionId | 点位存放首个变量;P:点位局部变量,GP:点位全局变量 | string | - | | type | 读取在枚举数列 type 中为110 | int | 110 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 6, "commType": 1, "logout": false, "m_varname": "I001", "positionId": "GP0001", "type": 110, "userParamInt": 0, "userParamString": "" } ``` --- ## 打开数据 **说明**:打开网络通讯 **指令名**:OPENMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 读取在枚举数列 type 中为115 | int | 115 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 5, "logout": false, "type": 115, "userParamInt": 0, "userParamString": "" } ``` --- ## 关闭数据 **说明**:关闭网络通讯 **指令名**:CLOSEMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 关闭数据在枚举数列 type 中为116 | int | 116 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "ID": 7, "logout": false, "type": 116, "userParamInt": 0, "userParamString": "" } ``` --- ## 输出字符 **说明**:通过打印提示条的方式输出定义的信息内容 **指令名**:PRINTMSG | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | printChar | 输出字符 | string | - | | printType | 输出信息类型,0:消息,1:警告,2:错误 | int | [0,2] | | type | 输出字符在枚举数列 type 中为120 | int | 120 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | **JSON 示例**: ```json { "logout": false, "printChar": "阿斯vca", "printType": 2, "type": 120, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取信息连接状态 **说明**:获取网络设置里某个工艺号的连接状态 **指令名**:MSG_CONNECTION_STATUS | 参数 | 说明 | 类型 | 取值范围 | |------|------|------|----------| | ID | TCP 通讯时连接的工艺号 | int | [1-9] | | logout | 是否被注释,true:在作业文件中将不执行该指令;false:未被注释,可执行 | bool | - | | type | 获取信息连接状态在枚举数列 type 中为95 | int | 95 | | userParamInt | 二次开发中客户自定义,目前无意义 | int | - | | userParamString | 二次开发中客户自定义,目前无意义 | string | - | | variable | 状态存入变量名;bool 类型变量,全局或局部 | object | - | **JSON 示例**: ```json { "ID": 5, "logout": false, "type": 95, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[GI001]" } } ``` --- # 指令-位置变量类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/11.%E6%8C%87%E4%BB%A4-%E4%BD%8D%E7%BD%AE%E5%8F%98%E9%87%8F%E7%B1%BB.html --- ## 用户坐标修改 (USERFRAME_SET) **说明**:修改或者读取用户坐标系某一轴的数值 **指令名**:USERFRAME_SET | **ID**:888 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | coord | string | UX、UY、UZ、UA、UB、UC、UCUSTOM(UX、UY、UZ) | 用户坐标参数。UX、UY、UZ、UA、UB、UC:读取用户坐标系某一轴的数值;UCUSTOM(UX、UY、UZ):自定义,括号中为自定义选中的用户坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | m_varName | string | int 或 double 类型变量,全局或局部 | 变量。写入时可手填 int 类型;取值范围[-2000,2000]。写入时:直接手填数值修改坐标轴的数值,变量赋值的形式修改坐标轴的数值。读取时:用变量的形式将选择的坐标轴的数值读取出来 | | mode | int | [0,1] | 修改方式。0:读取用户坐标某一轴的值,1:修改用户坐标某一轴的值 | | type | int | 97 | 用户坐标修改在枚举数列 type 中为97 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varType | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | ### JSON 示例 ```json { "ID": 888, "coord": "UCUSTOM(UX、UY、UZ)", "logout": false, "m_varName": "I001", "mode": 1, "type": 97, "userParamInt": 0, "userParamString": "", "varType": 1 } ``` --- ## 工具坐标修改 (TOOLFRAME_SET) **说明**:修改或者读取工具手某一轴的参数 **指令名**:TOOLFRAME_SET | **ID**:55 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | coord | string | TX、TY、TZ、TA、TB、TC、TCUSTOM(TZ、TA) | 工具坐标参数。TX、TY、TZ、TA、TB、TC:读取工具坐标系某一轴的数值;TCUSTOM(TZ、TA):自定义,括号中为自定义选中的工具坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | m_newValue | string | - | (未在说明中描述) | | m_varName | string | int 或 double 类型变量,全局或局部 | 变量。写入时可手填 int 类型;取值范围[-2000,2000] | | mode | int | [0,1] | 修改方式。0:读取工具坐标某一轴的值,1:修改工具坐标某一轴的值 | | type | int | 98 | 工具坐标修改在枚举数列 type 中为98 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varType | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | ### JSON 示例 ```json { "ID": 55, "coord": "TCUSTOM(TZ、TA)", "logout": false, "m_newValue": "", "m_varName": "I001", "mode": 1, "type": 98, "userParamInt": 0, "userParamString": "", "varType": 1 } ``` --- ## 读取点位 (READPOS) **说明**:将位置变量的某个轴的值读入到浮点型变量 **指令名**:READPOS | **type**:92 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE 变量名 | 位置变量名。当字符串为空时表示当前读取的是机器人当前位置的坐标。P,GP,E,GE:将点位存入变量,读取时只需要选择想要读取的目标变量即可 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 92 | 读取点位在枚举数列 type 中为92 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varname | string | int 类型变量名 | 目标变量名 | ### JSON 示例 ```json { "axis": 1, "coord": "RF", "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 92, "userParamInt": 0, "userParamString": "", "varname": "D001" } ``` --- ## 点位加 (POSADD) **说明**:在不同坐标系下给位置变量的某一个变量轴增加数值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人一轴的正限位是180°,目标点位一轴的坐标是150°,在设置参数是给变量轴一轴赋值50°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位加指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSADD | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位加在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 5, "caltype": 0, "coord": "RF", "datatype": 1, "desData": "GI001", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位减 (POSSUB) **说明**:在不同坐标系下给位置变量的某一个变量轴减少数值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人二轴的负限位是-50°,目标点位二轴的坐标是30°,在设置参数时给变量轴二轴赋值100°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位减指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSSUB | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位减在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 3, "caltype": 1, "coord": "RF", "datatype": 0, "desData": "666", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位改 (POSSET) **说明**:在不同坐标系下将位置变量的某一个变量轴直接修改点位坐标值 **注意**: - 修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 - 关节超限:例如机器人三轴的正限位是100°,在设置参数时给变量轴二轴赋值120°,运行指令时就会出现关节超限问题 - 坐标无法转换问题:例如目标点位是关节点位,在设置参数时选择的变量坐标系是直角坐标系,给目标点位的位置变量轴赋值,执行点位改指令,点位在运算过程中可能会出现坐标无法转换问题 **指令名**:POSSET | **type**:93 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | axis | int | [1,13] | 位置变量轴。取值1~7:1~7轴,取值8~13:外部轴 O1~O6;当前配置有什么轴,可以选什么轴 | | caltype | int | [0,2] | 运算类型。0:ADDTYPE 点位加;1:SUBTYPE 点位减;2:SETTYPE 点位改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int | [0,4] | 变量值类型。0:手填值,1:INT,2:DOUBLE,3:GINT,4:GDOUBLE | | desData | string | 手填值或 int/double 类型变量,全局或局部 | 位置变量。取值范围[-50000,50000] | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P 或 GP 或 E 或 GE | 需要修改点位的位置变量 | | type | int | 93 | 点位改在枚举数列 type 中为93 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "axis": 6, "caltype": 2, "coord": "RF", "datatype": 0, "desData": "666", "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 93, "userParamInt": 0, "userParamString": "" } ``` --- ## 复制点位 (COPYPOS) **说明**:将一个位置变量的点位数据复制到另一个位置变量 **注意**:最大支持连接5个外部轴,在复制外部轴点位时只支持 O1、O2、O3、O4、O5轴的复制,如果在设置参数时勾选了 O6、O7轴,在执行复制点位时 O6、O7轴不生效 **指令名**:COPYPOS | **type**:118 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | cpaxles | int[] | 数组,每个元素代表相应轴号 | 选择需要复制的坐标轴数据 | | cpaxletype | int | [0,1] | 表示是否所有坐标轴数据都复制。0:表示所有坐标轴数据都复制,此时没有"cpaxles"节点;1:看"cpaxles"节点选择了什么 | | cpdposname | string | P 或 E,局部或全局 | 目标位置变量名 | | cpdpostype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | cpposname | string | P,GP,E,GE 变量名 | 源位置变量名。当字符串为空时表示当前读取的是机器人当前位置的坐标 | | cppostype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 118 | 复制点位在枚举数列 type 中为118 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "cpaxles": [2, 4, 6], "cpaxletype": 1, "cpdposname": "GE$GI001", "cpdpostype": 1, "cpposname": "P$GI001", "cppostype": 1, "logout": false, "type": 118, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全加 (POSADDALL) **说明**:在不同坐标系下给位置变量的若干个变量轴增加数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSADDALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的增加值 | 轴增加数值。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全加在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 0, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全减 (POSSUBALL) **说明**:在不同坐标系下给位置变量的若干个变量轴减少数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSSUBALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的增加值 | 轴增加数值(负值为减)。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全减在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 1, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 点位全改 (POSSETALL) **说明**:在不同坐标系下给位置变量的若干个变量轴直接修改为指定数值 **注意**:修改目标点位时注意超限问题和目标位置不可达,坐标无法转换问题 **指令名**:POSSETALL | **type**:140 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 14个元素,每个元素为每个轴的目标值 | 轴目标数值。可手填也可为 int 或 double 变量类型,全局或局部 | | caltype | int | [0,2] | 点位全操作类型。0:点位全加,1:点位全减,2:点位全改 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 14个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidname | string | P,GP,E,GE | 位置变量名。需要修改点位的位置变量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 140 | 点位全改在枚举数列 type 中为140 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I002", "I034", "I056", "I069", "GI012", "GI023", "[-]", "GI047", "[-]", "[-]", "[-]", "[-]", "[-]", "[-]"], "caltype": 2, "coord": "UF", "datatype": [1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2], "logout": false, "posidname": "GE$GI001", "posidtype": 1, "type": 140, "userParamInt": 0, "userParamString": "" } ``` --- ## 轨迹偏移 (TOFFSETON / TOFFSETOFF) ### 轨迹偏移开始 **说明**: - 该指令能够对机器人的运行轨迹进行实时偏移 - 轨迹偏移结束指令后的运动轨迹不再偏移 - 程序的第一条指令不能使用偏移指令 **指令名**:TOFFSETON | **type**:141 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calData | string[] | 7个元素,取值范围[-50000,50000] | 轴增加数值。每个元素为每个轴的增加值;可手填也可为 int 或 double 变量类型,全局或局部 | | coord | string | RF、BF、TF、UF | 位置变量坐标系。RF:关节坐标,BF:直角坐标,TF:工具坐标,UF:用户坐标 | | datatype | int[] | 7个元素,与"calData"节点有对应关系 | 轴值是否改变。1:该轴有改变;2:该轴不改变 | | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | tool | int | [-1,999] | 工具手。-1:不使用;0:当前;1-999:对应的工具手 | | type | int | 141 | 轨迹偏移开始在枚举数列 type 中为141 | | user | int | [-1,999] | 用户。-1:不使用;0:当前;1-999:对应的用户 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calData": ["I001", "I002", "I003", "I004", "I005", "I006", "I007"], "coord": "TF", "datatype": [1, 1, 1, 1, 1, 1, 1], "logout": false, "tool": 666, "type": 141, "user": -1, "userParamInt": 0, "userParamString": "" } ``` --- ### 轨迹偏移结束 **指令名**:TOFFSETOFF | **type**:142 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 142 | 轨迹偏移结束在枚举数列 type 中为142 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 142, "userParamInt": 0, "userParamString": "" } ``` --- ## 读取点位信息 (READPOSMSG) **说明**:将目标位置的工具号、用户坐标号、坐标系、姿态角度/弧度、形态信息的值读入到一个整型变量 **指令名**:READPOSMSG | **type**:175 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | message | int | [0,4] | 信息读取值。0:工具号;1:用户坐标号;2:坐标系;3:姿态角度/弧度;4:形态 | | positionId | string | - | 位置变量 ID | | type | int | 175 | 读取点位信息在枚举数列 type 中为175 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varName | string | int 类型变量名 | 目标变量名 | | varType | int | - | 变量类型 | ### message 参数详细说明 | 值 | 说明 | |----|------| | 0 | 工具号:读取目标变量的工具手编号 | | 1 | 用户坐标号:读取目标变量的用户坐标编号 | | 2 | 坐标系["0"关节坐标,"1"直角坐标,"2"工具坐标,"3"用户坐标] | | 3 | 姿态角度/弧度:读取目标位置姿态轴的姿态值 | | 4 | 形态:读取目标点位的形态值 | ### JSON 示例 ```json { "logout": false, "message": 4, "positionId": "GP0001", "type": 175, "userParamInt": 0, "userParamString": "", "varName": "I001", "varType": 0 } ``` --- ## 点位拉伸 (POS_STRETCH) **说明**:通过设置起点和终点的偏移量来拉伸或者缩短轨迹的长度和圆弧的轨迹形状 **指令名**:POS_STRETCH | **type**:177 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | position1Id | string | P、GP | 拉伸轨迹的起始点 | | position1OutId | string | P、GP | 输出起点位置,偏移的起点位置 | | position2Id | string | P、GP | 圆弧轨迹中间点 | | position2OutId | string | P、GP | 将偏移后的终点点位存入到选择的位置变量 | | position3Id | string | P、GP | 拉伸轨迹的终点 | | stretchL1 | double | [-10000,10000] | 设置偏移量,改变轨迹起始点的点位 | | stretchL2 | double | [-10000,10000] | 设置偏移量,改变轨迹终点的点位 | | stretchType | int | [0,1] | 拉伸类型。0:直线;1:曲线 | | type | int | 177 | 点位拉伸在枚举数列 type 中为177 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "position1Id": "GP0001", "position1OutId": "GP0006", "position2Id": "GP0002", "position2OutId": "GP0007", "position3Id": "GP0003", "stretchL1": 4.0, "stretchL2": 5.0, "stretchType": 1, "type": 177, "userParamInt": 0, "userParamString": "" } ``` --- ## 设置点位信息 (SETPOSMSG) **说明**:通过设置起点和终点的偏移量来拉伸或者缩短轨迹的长度和圆弧的轨迹形状 **指令名**:SETPOSMSG | **type**:207 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posData | string[] | 5个元素 | 位置数据数组。元素1:坐标系(0-3);元素2:姿态(0-角度/1-弧度);元素3:形态参数(0-8);元素4:工具编号(0-999);元素5:用户编号(0-999) | | posDataType | int[] | 5个元素 | 表示"posData"节点的各个元素是否使用。1:使用;2:不使用 | | posidname | string | P、GP、E、GE | 位置标量 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | type | int | 207 | 设置点位信息在枚举数列 type 中为207 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### posData 数组元素说明 | 索引 | 内容 | 取值范围 | 说明 | |------|------|----------|------| | 0 | 坐标系 | [0,3] | "0"关节坐标,"1"直角坐标,"2"工具坐标,"3"用户坐标 | | 1 | 姿态 | [0,1] | 0:角度;1:弧度 | | 2 | 形态参数 | [0,8] | 设置目标位置的形态参数 | | 3 | 工具编号 | [0,999] | 设置目标位置的工具编号。"0"表示无工具手 | | 4 | 用户编号 | [0,999] | 设置目标位置的用户编号。"0"表示无用户 | ### JSON 示例 ```json { "logout": false, "posData": ["GI002", "GI003", "I004", "GI005", "GI006"], "posDataType": [1, 1, 1, 1, 1], "posidname": "GP$GI001", "posidtype": 1, "type": 207, "userParamInt": 0, "userParamString": "" } ``` --- ## 计算目标形态值 (SOLVE_CONFIGURATION) **说明**:机器人从 A 点(当前实际位置)运动到 B 点时,可以计算出机器人能以多少种形态从 A 到 B **指令名**:SOLVE_CONFIGURATION | **type**:232 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | posidtype | int | [0,1] | 位置变量名标识。0:位置变量名固定,例:P001,G001;1:位置变量名不固定,例:P$I001,P$GI001,G$I001,G$GI001 | | positionId | string | P、GP、E、GE | 目标点。可以选择的位置变量类型 | | type | int | 232 | 计算目标形态值在枚举数列 type 中为232 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | varName | object | INT 或 GINT 变量 | 形态值首个变量。将计算出来的形态值存入到选择的目标变量,通过选择的首变量顺延保存计算出来的形态 | | varNumber | object | INT 或 GINT 变量 | 形态值个数。将计算出来的形态值个数存入到选择的目标变量 | ### JSON 示例 ```json { "logout": false, "posidtype": 0, "positionId": "GP0001", "type": 232, "userParamInt": 0, "userParamString": "", "varName": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "varNumber": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"} } ``` --- # 指令-程序控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/12.%E6%8C%87%E4%BB%A4-%E7%A8%8B%E5%BA%8F%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 开启线程 **说明**:开启全局后台或者局部后台任务 **指令名**:PTHREAD_START **type 值**:90 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 后台任务程序文件名 | | localOrGlobal | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "localOrGlobal": 0, "logout": false, "type": 90, "userParamInt": 0, "userParamString": "" } ``` --- ## 退出线程 **说明**:关闭已经开启的后台任务 **指令名**:PTHREAD_END **type 值**:91 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 后台任务程序文件名 | | localOrGlobal | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "localOrGlobal": 0, "logout": false, "type": 91, "userParamInt": 0, "userParamString": "" } ``` --- ## 暂停运行 **说明**:暂停主程序和局部后台程序运行 **指令名**:PAUSERUN **type 值**:111 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 当选取局部后台类型时选择的程序名 | | programtype | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "programtype": 2, "logout": false, "type": 111, "userParamInt": 0, "userParamString": "" } ``` --- ## 继续运行 **说明**:继续运行已暂停的主程序或者局部后台程序 **指令名**:CONTINUERUN **type 值**:112 | 参数名 | 类型 | 说明 | |--------|------|------| | jobName | string | 当选取局部后台类型时选择的程序名 | | programtype | int | 后台类型:0-局部后台,1-全局后台 | | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "jobName": "SFDFF", "programtype": 2, "logout": false, "type": 112, "userParamInt": 0, "userParamString": "" } ``` --- ## 停止运行 **说明**:停止正在运行的程序,程序运行到停止运行指令时伺服下电 **指令名**:STOPRUN **type 值**:113 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "logout": false, "type": 113, "userParamInt": 0, "userParamString": "" } ``` --- ## 重新运行 **说明**:停止正在运行的程序,程序运行到停止运行指令时伺服下电 **指令名**:RESTRATRUN **type 值**:117 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | **请求示例**: ```json { "logout": false, "type": 117, "userParamInt": 0, "userParamString": "" } ``` --- ## 弹窗指令 **说明**:运行指令时弹出所填写的提示内容窗口,按钮数量为选项数量,点击按钮会将变量值存入绑定的变量 **指令名**:WINDOW **type 值**:208 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | | count | int | 选项数量,取值范围[0,3] | | text1 | string | 提示内容 | | text2 | string | 选项1内容 | | text3 | string | 选项2内容 | | text4 | string | 选项3内容 | | value1 | int | 选项1对应变量值 | | value2 | int | 选项2对应变量值 | | value3 | int | 选项3对应变量值 | | variable | object | 绑定变量,结构:{data, secondvalue, value, varname} | **variable 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | float | 数据值 | | secondvalue | int | 次要值 | | value | int | 变量值 | | varname | string | 变量名 | **请求示例**: ```json { "logout": false, "type": 208, "userParamInt": 0, "userParamString": "", "count": 3, "text1": "AAAAA", "text2": "1", "text3": "2", "text4": "3", "value1": 1111, "value2": 2222, "value3": 3333, "variable": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` --- ## 线程状态 **说明**:查看当前所执行的线程程序的状态,停止等于1,暂停等于2,运行等于3 **指令名**:PTHREAD_STATE **type 值**:209 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释:true-在作业文件中将不执行该指令,false-未被注释可执行 | | userParamInt | int | 二次开发客户自定义参数(目前无意义) | | userParamString | string | 二次开发客户自定义参数(目前无意义) | | jobName | string | 当选取后台类型时选择的程序名 | | localOrGlobal | int | 程序类型:0-局部后台,1-全局后台,2-主程序 | | m_VariableValue | object | 存入变量,结构:{data, secondvalue, value, varname} | **m_VariableValue 结构**: | 字段 | 类型 | 说明 | |------|------|------| | data | float | 数据值 | | secondvalue | int | 次要值 | | value | int | 变量值 | | varname | string | 变量名 | **请求示例**: ```json { "logout": false, "type": 209, "userParamInt": 0, "userParamString": "", "jobName": "SFDFF", "localOrGlobal": 0, "m_VariableValue": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001" } } ``` --- # 指令-MODBUS 类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/13.%E6%8C%87%E4%BB%A4-MODBUS%E7%B1%BB.html --- ## MODBUS_OPEN - 打开 Modbus 连接 ### 说明 打开 Modbus 通讯连接 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_OPEN 在枚举数列 type 中为210 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 5, "logout": false, "modType": "Master", "type": 210, "userParamInt": 0, "userParamString": "" } ``` --- ## MODBUS_CLOSE - 关闭 Modbus 连接 ### 说明 断开 Modbus 通讯连接 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_CLOSE 在枚举数列 type 中为211 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 9, "logout": false, "modType": "Master", "type": 211, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## MODBUS_CONNECTION_STATUS - 获取 Modbus 连接状态 ### 说明 将 Modbus 通讯连接的状态存入变量,连接成功该变量值被赋值为1,连接失败选择的该变量被赋值为0 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | 获取 Modbus 连接状态在枚举数列 type 中为212 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 1, "logout": false, "modType": "Master", "type": 212, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[GI001]"} } ``` --- ## MODBUS_READ - Modbus 读状态 ### 说明 读取 Modbus 中对应地址的数值。将获取到的状态存入到变量(bool 类型变量或绑定变量,全局或局部)。 **地址类型说明:** | 地址类型 | 说明 | |----------|------| | 3x | 读取 Modbus 中对应地址的值 | | 4x | 同3x | | 3x-bit | 读取所选地址中所存值得任一 bit 的状态 | | 4x-bit | 同3x-bit | | 0x | 可读可写的设备类型,相当于操作 PLC 的输出点 | | 1x | 只读设备类型,相当于操作 PLC 的输入点 | **地址类型为3X-bit 时从站地址个数范围是[0,16]** **地址类型为3X-bit,存到变量时候的17位为符号位,0表示正数,1表示负数** **读取字符时会将读取到的所有值存入到一个变量,它跟整型、浮点型、布尔型变量不一样,不会根据设置的首地址,读从站地址个数顺延存入其它变量** ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | addressNumber | object | 是 | 读从站地址个数。手填或者 int 类型变量或绑定变量,全局或局部。读取的地址个数,如果设置的读从站地址个数为3,执行读指令后会从 Modbus 首地址开始读取3个地址(包含首地址一共读3个) | | addressType | string | 是 | 地址类型。可选取值:3x,4x,3x-bit,4x-bit,0x,1x | | dataType | string | 是 | 数据类型。当数据存放的首个变量选 I 或 GI 时,从站的数据类型可选 short 和 ushort(分别对应短整型和无符号短整型,前者范围为[-32768,32767],后者的范围为[0,65535])。数据存放首个变量选 I 或 GI 数据类型时需要和从站的数据类型一致,否则可能导致数据出错 | | dataVariable | object | 是 | 数据存放的首个变量。所有变量或绑定变量都可。将读取到的参数存放到变量,如果选择的首个变量为 I001,读取的地址个数为3,执行读指令会把参数值依次存入到 I001、I002、I003 | | firstAddress | object | 是 | 从站寄存器首地址。手填或 int 类型变量或绑定变量,全局或局部。根据指令参数里面设置的首地址读取参数值,如果参数里面设置的首地址是5,在执行读指令后会从 Modbus 第5个地址开始读 | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_READ 在枚举数列 type 中为213 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 3, "addressNumber": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "addressType": "4x-bit", "dataType": "short", "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[GI001]"}, "firstAddress": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "modType": "Master", "type": 213, "userParamInt": 0, "userParamString": "" } ``` --- ## MODBUS_WRITE - Modbus 写操作 ### 说明 该指令用于通过 Modbus 将变量写入从站寄存器中对应位置的地址中 **地址类型说明:** | 地址类型 | 说明 | |----------|------| | 4x | 将变量里的值写入地址码 | | 4x-bit | 将变量组成16位二进制码写入地址码中 | | 0x | 将变量值写入地址码,只有"0","1"两种状态,变量有值的话写入1,变量没值写入0 | ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | Modbus 主站工艺号,取值范围[1,9] | | addressNumber | object | 是 | 读从站地址个数。手填或者 int 类型变量或绑定变量,全局或局部。读取的地址个数,如果设置的读从站地址个数为3,执行读指令后会从 Modbus 首地址开始读取3个地址(包含首地址一共读3个) | | addressType | string | 是 | 地址类型。可选取值:4x,4x-bit,0x | | dataVariable | object | 是 | 数据存放的首个变量,写入的变量类型。手填或者所有变量或绑定变量都可 | | firstAddress | object | 是 | 从站寄存器首地址。手填或 int 类型变量或绑定变量,全局或局部。开始写入的第一个地址,如果首地址为5,执行写指令会从 modbus 第5个地址开始写入 | | logout | bool | 否 | 是否被注释。true:在作业文件中将不执行该指令;false:未被注释,可执行 | | modType | string | 是 | 主站/从站。"Master":主站;"Slave":从站 | | type | int | 是 | MODBUS_WRITE 在枚举数列 type 中为214 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 5, "addressNumber": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "addressType": "0x", "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "firstAddress": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "logout": false, "modType": "Master", "type": 214, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-FINSTCP 类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/14.%E6%8C%87%E4%BB%A4-FINSTCP%E7%B1%BB.html ## 1. 打开 FINSTCP 连接 **指令名**: FINSTCP_OPEN **说明**: 用于在运行模式下打开 FINSTCP 通讯连接 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 215 | 打开 FINSTCP 连接在枚举数列 type 中为210 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量对象,包含 data、secondvalue、value、varname 等属性 | ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 215, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 0, "value": 0, "varname": "" } } ``` --- ## 2. 断开 FINSTCP 连接 **指令名**: FINSTCP_CLOSE **说明**: 在运行模式下断开 FINSTCP 通讯连接 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 216 | FINSTCP_CLOSE 在枚举数列 type 中为216 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 9, "logout": false, "type": 216, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. FINSTCP 连接状态 **指令名**: FINSTCP_CONNECTION_STATUS **说明**: 在运行模式下获取 FINSTCP 连接状态 ### 参数列表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | FINSTCP 主站工艺号 | | logout | bool | - | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | 217 | FINSTCP_CONNECTION_STATUS 在枚举数列 type 中为217 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量对象 | ### variable 对象 | 参数名 | 类型 | 说明 | |--------|------|------| | data | float | 数据值 | | secondvalue | int | 第二个值 | | value | int | 状态值;6表示连接 | | varname | string | 变量名,如"GB[I001]" | ### 返回值说明 FINSTCP 的连接状态;bool 类型变量或绑定变量,全局或局部 - `true`:连接 - `false`:未连接 ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 217, "userParamInt": 0, "userParamString": "", "variable": { "data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]" } } ``` --- # 指令-码垛控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/15.%E6%8C%87%E4%BB%A4-%E7%A0%81%E5%9E%9B%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 1. 码垛开始 (PALON) **说明**:码垛开始的判断,可通过修改变量控制码第几层第几个工件。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | STACKTYPE | int | 码垛类型,取值范围[0,1]
0:码垛
1:卸垛 | | _pCurrentLayersNum | 变量对象 | 当前层码垛数;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _pLayersNum | 变量对象 | 当前码垛层;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _pWorkpieceSum | 变量对象 | 当前已码总数;int 类型变量或绑定变量,全局或局部
当该变量的值表示 string 类型[-]时:表示不使用 | | _stackSequence | int | 单层码垛/卸垛顺序,取值范围[0,1]
0:正序
1:倒序 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALON 在枚举数列 type 中为70 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 1, "STACKTYPE": 0, "_pCurrentLayersNum": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "_pLayersNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "_pWorkpieceSum": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "[-]"}, "_stackSequence": 1, "logout": false, "type": 70, "userParamInt": 0, "userParamString": "" } ``` --- ## 2. 切换抓手 (PALGRIPPER) **说明**:选取抓手。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | tool | int | 抓手编号,取值范围[1,4] | | type | int | PALGRIPPER 在枚举数列 type 中为71 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "logout": false, "tool": 3, "type": 71, "userParamInt": 0, "userParamString": "" } ``` --- ## 3. 码垛入口点 (PLAENTER) **说明**:选取抓手,码垛入口点。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | Posture | int | 姿态,取值范围[0,2]
0:关闭
1:手动写入
自动计算姿态 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | para_posture_ | 变量对象 | 姿态手动写入值;int 类型或 double 类型变量或绑定变量,全局或局部 | | type | int | PLAENTER 在枚举数列 type 中为73 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | xyOpt | int | 优化 XY 轴运动路径,取值范围[0,1]
0:关闭
1:打开 | | zOpt | int | 优化 Z 轴运动路径,取值范围[0,1]
0:关闭
1:打开
优化 Z 轴运动路径,需在码垛前插入一个固定点 | ### 示例 ```json { "ID": 1, "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaV": {"data": 300.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": ""}, "Posture": 1, "logout": false, "moveType": "MovC", "para_posture_": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI005"}, "type": 73, "offsetAxis": 2, "userParamInt": 0, "userParamString": "", "xyOpt": 1, "zOpt": 1 } ``` --- ## 4. 码垛辅助点 (PALSHIFT) **说明**:码垛辅助点。 **高度规则说明**: - 当入口点高度比固定点低时,入口点在高度上会和固定点、辅助点处于同一值线上(侧视同一直线,俯视不是同一直线,XY 轴不变) - 当入口点高度位于固定点与辅助点之间时,入口点高度不变 - 当入口点高度位于固定点、辅助点之上时,入口点高度将优化到与固定点水平的高度 - 当入口点、辅助点高度都高于固定点时,入口点高度将优化到与辅助点水平高度 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | type | int | PALSHIFT 在枚举数列 type 中为74 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 4, "varname": "GI001"}, "logout": false, "moveType": "MovArch", "type": 74, "offsetAxis": 2, "userParamInt": 0, "userParamString": "" } ``` --- ## 5. 码垛接近点 (PALAPPRO) **说明**:码垛接近点是辅助点和工件点之间的过渡点,也是接近方式要走到的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | type | int | PALAPPRO 在枚举数列 type 中为76 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 2, "varname": "D[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "I001"}, "moveType": "MovL", "type": 76, "offsetAxis": 2, "userParamInt": 0, "userParamString": "" } ``` --- ## 6. 码垛工件点 (PALREAL) **说明**:码垛工件所在的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | ParaACC | 变量对象 | 加速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaDEC | 变量对象 | 减速度;int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[1,100] | | ParaLINE | 变量对象 | 门型位移距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[-5000,5000]
插补方式选择门型时使用 | | ParaPL | 变量对象 | 平滑;int 类型变量或绑定变量,全局或局部;取值范围[0,5] | | ParaSTRAIGHT | 变量对象 | 门型直线距离;手填值或 int 类型或 double 类型变量或绑定变量,全局或局部;取值范围[0,5000] | | ParaTIME | 变量对象 | 提前执行时间;int 类型或 double 类型变量或绑定变量,全局或局部 | | ParaV | 变量对象 | 运动速度;int 类型或 double 类型变量或绑定变量,全局或局部
当运动方式为关节运动时:m_vUnit 的值为2,速度单位为%;取值范围[1,100]
当运动方式为圆弧或直线时:m_vUnit 的值为1,速度单位为 mm/s;取值范围[1,1000] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | moveType | string | 运动插补方式
MovJ:关节
MovL:直线
MovC:圆弧
MovArch:门型 | | offsetAxis | int | 位移轴,取值范围[0,2]
0:X 轴
1:Y 轴
2:Z 轴 | | type | int | PALREAL 在枚举数列 type 中为75 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaLINE": {"data": 0.0, "secondvalue": 0, "value": 5, "varname": "GD001"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaSTRAIGHT": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D001"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 4, "varname": "GI001"}, "logout": false, "moveType": "MovArch", "offsetAxis": 2, "type": 75, "userParamInt": 0, "userParamString": "" } ``` --- ## 7. 码垛复位 (PALCLEAR) **说明**:码垛开始后的数据初始化。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALCLEAR 在枚举数列 type 中为77 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 16, "logout": false, "type": 77, "userParamInt": 0, "userParamString": "" } ``` --- ## 8. 码垛结束判断 (PALOFF) **说明**:判断码垛是否结束。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | ID | int | 码垛工艺号,取值范围[1,99] | | _pPalOffvarName | 变量对象 | 结束判断变量;bool 类型变量或绑定变量,全局或局部
true:结束
false:未结束 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | type | int | PALOFF 在枚举数列 type 中为78 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "ID": 17, "_pPalOffvarName": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]"}, "logout": false, "type": 78, "userParamInt": 0, "userParamString": "" } ``` --- ## 9. 获取工件点位 (PAL_POS) **说明**:获取指定工件的点位。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | PalPOS_pointType | int | 获取点位类型,取值范围[0,2]
0:入口点
1:辅助点
2:工件点 | | _pLayNum | 变量对象 | 工件所在层;手填值或 int 类型变量或绑定变量 | | _pSerialNum | 变量对象 | 工件编号;手填值或 int 类型变量或绑定变量 | | _pTecNUM | 变量对象 | 码垛工艺号;手填值或 int 类型变量或绑定变量;取值范围[1,99] | | getPointPosPos | int | m_getPointPosname 节点绑定的变量类型,取值范围[1,2]
1:位置变量名固定,如:P0001、G001
2:位置变量名不固定,如:P$I001、P$GI001、G$I001、G$GI001 | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | m_getPointPosname | string | 节点绑定的变量名 | | tool | int | 工具编号 | | type | int | PAL_POS 在枚举数列 type 中为221 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### 示例 ```json { "PalPOS_pointType": 2, "_pLayNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "_pSerialNum": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "_pTecNUM": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "getPointPosPos": 2, "logout": false, "m_getPointPosname": "GP$GI001", "tool": 0, "type": 221, "userParamInt": 0, "userParamString": "" } ``` --- ## 10. 简易码垛 (PALSIMPLESET) **说明**:简易码垛。 ### 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | _pTecNUM | 变量对象 | 码垛参数存放的工艺号;手填值或 int 类型,变量或绑定变量,全局或局部;取值范围[1,99] | | logout | bool | 是否被注释
true:在作业文件中将不执行该指令
false:未被注释,可执行 | | m_numVariableType | int 数组 | 行数、列数、层数是否为绑定变量;取值范围[0,1]
0:手填值或变量
1:绑定变量 | | m_pointVariableType | int 数组 | 变量类型,取值范围[1,3]
目前只有第二位到第七位使用
第一位:无
第二位:起始工件点
第三位:列末点
第四位:行末端
第五位:高末端
第六位:辅助点
第七位:入口点
1:位置变量名固定,如:P0001、G001
2:位置变量名不固定,如:P$I001、P$GI001、G$I001、G$GI001
3:不使用 | | pointVariableName | string 数组 | 点位变量名数组
第二位:起始工件点
第三位:列末端
第四位:行末端
第五位:高末端
第六位:辅助点
第七位:入口点
目前只有第二位到第七位使用 | | type | int | 简易码垛在枚举数列 type 中为222 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | | variableData | string 数组 | 绑定变量数据 | ### 示例 ```json { "_pTecNUM": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "m_numVariableType": [0, 1, 0], "m_pointVariableType": [0, 1, 1, 2, 2, 2, 2, 0, 0, 0], "pointVariableName": ["[-]", "GP0001", "GP0002", "GP$I001", "P$I001", "GP$I003", "P$GI003", "[-]", "[-]", "[-]"], "type": 222, "userParamInt": 0, "userParamString": "", "variableData": ["GI003", "GI[I004]", "GI005"] } ``` --- # 指令-焊接控制类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/16.%E6%8C%87%E4%BB%A4-%E7%84%8A%E6%8E%A5%E6%8E%A7%E5%88%B6%E7%B1%BB.html ## 焊接开始 **说明:** 该指令可执行起弧操作。选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。焊接开始要和焊接结束一起使用。 **指令名:** ARCON **type:** 23 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anamorphismFlag | int | [0,1] | 使用起弧渐变标志;0:不使用,1:使用 | | arconUseAbled | int | [0,2] | 使用起弧参数标志;0:不使用临时参数,1:使用,2:不使用 | | generatingOfArcAgainFlag | int | [0,1] | 再起弧标志;0:不使用,1:使用 | | generatingOfArcCurrent | double | [0-1000]A | 起弧电流;99999.0:不使用临时变量,使用工艺配置参数 | | generatingOfArcTime | double | [0-5]s | 起弧时间;99999.0:不使用临时变量,使用工艺配置参数 | | generatingOfArcVoltage | double | [-1000,1000]V | 起弧电压;99999.0:不使用临时变量,使用工艺配置参数 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | startUpAgainFlag | int | [0,1] | 使用再启动标志;0:不使用,1:使用 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的焊接参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldCurrent | double | [0-1000]A | 焊接电流 | | weldVoltage | double | - | 焊接电压 | **JSON 示例:** ```json { "anamorphismFlag": 1, "arconUseAbled": 1, "generatingOfArcAgainFlag": 1, "generatingOfArcCurrent": 3.0, "generatingOfArcTime": 2.0, "generatingOfArcVoltage": 36.0, "logout": false, "startUpAgainFlag": 1, "type": 23, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "weldCurrent": 89.0, "weldVoltage": 78.0 } ``` --- ## ARCOFF 焊接结束 **说明:** 该指令可执行灭弧操作,选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。焊接开始要和焊接结束一起使用。 **指令名:** ARCOFF **type:** 24 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcoffUseAbled | int | [0,2] | 使用收弧参数标志;0:不使用临时参数,1:使用,2:不使用 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | quenchingAnamorphismFlag | int | [0,2] | 使用收弧渐变;0:不使用临时参数,1:使用,2:不使用 | | quenchingOfArcCurrent | double | [0,1000]A | 收弧电流 | | quenchingOfArcTime | double | [0,5]s | 收弧时间 | | quenchingOfArcVoltage | double | [-1000,1000]V | 收弧电压 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 要使用的焊接参数工艺号 | **JSON 示例:** ```json { "arcoffUseAbled": 1, "logout": false, "quenchingAnamorphismFlag": 1, "quenchingOfArcCurrent": 2.0, "quenchingOfArcTime": 3.0, "quenchingOfArcVoltage": 1.0, "type": 24, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## ARCSET 焊接设置 **说明:** 该指令可以设置焊接时的电流电压。 **指令名:** ARCSET **type:** 25 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcsetRamp | int | [0,1] | 渐变方式;0:不使用,1:时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的焊接参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldSetCurrent | object | [0,1000]A | 设置焊接电流;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSetRampTime | object | [0,100000]ms | 渐变时间;int 类型手填值或变量,全局或局部 | | weldSetVoltage | object | - | 设置焊接电压 | **JSON 示例:** ```json { "arcsetRamp": 1, "logout": false, "type": 25, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "weldSetCurrent": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "weldSetRampTime": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI001"}, "weldSetVoltage": {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""} } ``` --- ## WVON 摆焊开始 **说明:** 该指令执行时开始摆焊,执行该指令前请先运行焊接开始 ARCON 指令。不使用临时参数时,date 应设为99999。 **指令名:** WVON **type:** 26 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的摆焊参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldLeftDwellTime | object | [0,15]s | 左停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldRightDwellTime | object | [0,15]s | 右停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingAmplitude | object | (0,50]mm | 摆动幅度;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingFrequency | object | (0,20]HZ | 摆动频率;double 类型手填值,double 类型或 int 类型变量,全局或局部 | **JSON 示例:** ```json { "logout": false, "type": 26, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006"}, "weldLeftDwellTime": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "weldRightDwellTime": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[I001]"}, "weldSwingAmplitude": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "weldSwingFrequency": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GD001"} } ``` --- ## WVOFF 摆焊结束 **说明:** 该指令执行时结束摆焊。 **指令名:** WVOFF **type:** 27 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 27, "userParamInt": 0, "userParamString": "" } ``` --- ## WVSET 摆焊设置 **说明:** 该指令可执行灭弧操作,选择好文件标号以后,参数默认是根据焊接工艺界面设定保存的参数来运行。打开使用临时工艺参数开关,以指令中参数为准。 **指令名:** WVSET **type:** 28 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | useTemp | int | [0,1] | 是否使用临时工艺参数标志;0:不使用,1:使用临时参数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | [1-99] | 要使用的摆焊参数工艺号;手填 int 或 int 类型变量,全局或局部 | | weldLeftDwellTime | object | [0,15]s | 左停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldRightDwellTime | object | [0,15]s | 右停留时间;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingAmplitude | object | (0,50]mm | 摆动幅度;double 类型手填值,double 类型或 int 类型变量,全局或局部 | | weldSwingFrequency | object | (0,20]HZ | 摆动频率;double 类型手填值,double 类型或 int 类型变量,全局或局部 | **JSON 示例:** ```json { "logout": false, "type": 28, "useTemp": 1, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "weldLeftDwellTime": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D009"}, "weldRightDwellTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "weldSwingAmplitude": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI009"}, "weldSwingFrequency": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"} } ``` --- ## CIL 相贯线 **说明:** 相贯线指令方式与 MOVC 相似。 **指令名:** CIL **type:** 29 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1,100]% | 加速度变量;double 类型 | | ParaDEC | object | [1,100]% | 减速度变量;double 类型 | | ParaPL | object | [0,5] | 平滑变量;double 类型 | | ParaTIME | object | 自然数 | 提前执行时间变量;double 类型 | | ParaV | object | [1,1000]mm/s | 速度变量;double 类型;m_vUnit:0=cm/s 1=mm/s 2=百分比 | | RobotPos | object | - | 点位信息;当使用绑定变量点位时,不使用该节点 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | para | int | [0,3] | ID | | posidtype | int | 0/1 | 点位是否为绑定变量;1:绑定变量,0:非绑定变量 | | positionId | string | - | 非绑定变量时的点位名 | | posidname | string | - | 绑定变量时的点位名 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[GI001]"}, "ParaPL": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "D001"}, "RobotPos": { "ctype": 1, "data": [2.0, 1.0, 8.0, 0.0, 0.0, 0.0, 0.0, 490.0, 0.0, 647.0, 3.1410, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0001", "note": "", "paraVarData": [ {"data": 2.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 8.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 490.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 647.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.1410, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "logout": false, "para": 2, "polish": 0, "type": 29, "userParamInt": 0, "userParamString": "", "posidname": "", "positionId": "P0001", "posidtype": 0 } ``` --- ## TIGWELDON 鱼鳞焊开始 **说明:** 执行该指令开始鱼鳞焊轨迹,执行该指令前请先运行焊接开始 ARCON 指令。 **指令名:** TIGWELDON **type:** 66 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | headTailType | int | [0,3] | 首位段;0:首尾段焊接优化空走距离,1:首尾段空走优化空走距离,2:首段焊接,3:首段空走 | | l1 | double | [0.01,9999] | 焊接距离;typeOFTIG 节点值为2时需要此节点 | | l1speed | double | [1,200]% | 焊接速度;typeOFTIG 节点值为2时需要此节点 | | l2 | double | [0.01,9999]mm | 空走距离 | | l2speed | double | [1,1000]% | 空走速度 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | timeOFTIG | double | [0.01,6]s | 点焊时间;typeOFTIG 节点值为1时需要此节点 | | typeOFTIG | int | [0,1] | 参数类型;1:点焊时间,2:焊接距离 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "headTailType": 2, "l1": 5.0, "l1speed": 6.0, "l2": 200.0, "l2speed": 569.0, "logout": false, "timeOFTIG": 6.0, "type": 66, "typeOFTIG": 1, "userParamInt": 0, "userParamString": "" } ``` --- ## TIGWELDOFF 鱼鳞焊结束 **说明:** 执行该指令后结束鱼鳞焊轨迹。 **指令名:** TIGWELDOFF **type:** 67 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 67, "userParamInt": 0, "userParamString": "" } ``` --- ## FEEDWIRE 送丝 **说明:** 执行该指令可在参数时间内打开送丝信号。 **指令名:** FEEDWIRE **type:** 69 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | feedtime | double | (0,10]s | 送丝时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "feedtime": 9.0, "logout": false, "type": 69, "userParamInt": 0, "userParamString": "" } ``` --- ## ARCBUILTIN 焊机内置工艺 **说明:** 该指令目前可配合奥太焊机使用。 **指令名:** ARCBUILTIN **type:** 172 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,9] | 焊机内置工艺号 | | Value | array | [-999999,999999] | 参数 A-E;元素分别为$builtin_a 调用、$builtin_b 调用、$builtin_c 调用、$builtin_d 调用、$builtin_e 调用 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "ID": 6, "Value": [369.0, 239.0, 896.0, 456.0, 789.0], "logout": false, "type": 172, "userParamInt": 0, "userParamString": "" } ``` --- ## REFP 摆焊参考点 **说明:** 焊机内置工艺。 **指令名:** REFP **type:** 178 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | RobotPos | object | - | 点位信息;当使用绑定变量点位时,不使用该节点 | | autoCorrection | int | [0,1] | 摆焊轨迹自动修正使能;0:否,1:是 | | correctionSpeed | double | [2,9999]mm/s | 摆焊轨迹自动修正速度 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | positionId | string | - | 参考点变量名;字符串以 P 开头 | | refpPointNum | int | [1,2] | 参考点 | | startUpAgainFlag | int | - | 再启动标志 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "RobotPos": { "ctype": 1, "data": [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 490.0, 0.0, 647.0, 3.14160, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "key": "P0002", "note": "", "paraVarData": [ {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 1.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 490.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 647.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 3.14160, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] }, "autoCorrection": 1, "correctionSpeed": 869.0, "logout": false, "positionId": "P0002", "refpPointNum": 1, "startUpAgainFlag": 0, "type": 178, "userParamInt": 0, "userParamString": "" } ``` --- ## SPOTWELD 点焊 **说明:** 该指令执行时机器人开始执行点焊操作。 **指令名:** SPOTWELD **type:** 179 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | arcParameterId | int | [1,99] | 焊接参数标号 | | feedtime | double | (0,1000]s | 焊接时间 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "arcParameterId": 17, "feedtime": 200.0, "logout": false, "type": 179, "userParamInt": 0, "userParamString": "" } ``` --- ## MP_OFFSET_ON 多层多道焊偏转开始 **说明:** 多层多道焊偏转开始。 **指令名:** MP_OFFSET_ON **type:** 245 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | craft_number | object | [1,999] | 工艺号;手填 int 类型,int 类型变量或绑定变量,全局或局部 | | head_indent | object | [-1000,1000] | 头部缩进;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | head_multi_indent | object | [0,1] | 头部倍数缩进使能;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:不生效,1:生效 | | left_right_offset | object | [-1000,1000] | 左右偏移;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | offset_pass | object | [0,99] | 偏移焊道号;int 类型手填值,全局或局部 int 类型变量或绑定变量 | | push_angle | object | [-1000,1000] | 推角;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | tail_indent | object | [-1000,1000] | 尾部缩进;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | tail_multi_indent | object | [0,1] | 尾部倍数缩进使能;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:不生效,1:生效 | | tilt_angle | object | [-1000,1000] | 倾斜角;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | trace_data | object | [1,9] | 跟踪路径数据;int 类型手填值,全局或局部 int 类型变量或绑定变量;0:表示不使用 | | up_down_offset | object | [-1000,1000] | 高低偏移;手填 double 类型,int 类型或 double 类型绑定变量或变量,全局或局部 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | weld_dir | object | [0,1] | 焊接方向;手填 int 类型,bool 类型变量或绑定变量,全局或局部;0:正方向,1:负方向 | **JSON 示例:** ```json { "craft_number": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI003"}, "head_indent": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "head_multi_indent": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GB[I001]"}, "left_right_offset": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "logout": false, "offset_pass": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "offset_weld_count": {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, "push_angle": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I005"}, "tail_indent": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "tail_multi_indent": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GB[GI006]"}, "tilt_angle": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I006"}, "trace_data": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "type": 245, "up_down_offset": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I004"}, "use_temp": 1, "userParamInt": 0, "userParamString": "", "weld_dir": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "B007"} } ``` --- ## MP_OFFSET_OFF 多层多道焊偏移结束 **说明:** 点焊。 **指令名:** MP_OFFSET_OFF **type:** 246 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "logout": false, "type": 246, "userParamInt": 0, "userParamString": "" } ``` --- ## GET_OFFSET_WELD_COUNT 获取偏转焊道数 **说明:** 点焊。 **指令名:** GET_OFFSET_WELD_COUNT **type:** 252 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | craft_number | object | - | 工艺号 | | logout | bool | true/false | 是否被注释;true:在作业文件中将不执行该指令 | | offset_weld_count | object | - | 偏转焊道数 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | **JSON 示例:** ```json { "craft_number": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI009"}, "logout": false, "offset_weld_count": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "type": 252, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-视觉命令类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/17.%E6%8C%87%E4%BB%A4-%E8%A7%86%E8%A7%89%E5%91%BD%E4%BB%A4%E7%B1%BB.html ## 视觉开始 **说明**:执行视觉开始指令后控制器与相机连接 **指令名**:VISION_RUN | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_RUN 在枚举数列 type 中为79 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 14, "logout": false, "type": 79, "userParamInt": 0, "userParamString": "" } ``` --- ## 视觉触发 **说明**:执行视觉触发指令后等待视觉服务器的返回值(发送的位置数据),获取到位置数据后继续运行下一条指令 **指令名**:VISION_TRG | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_TRG 在枚举数列 type 中为80 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 23, "logout": false, "type": 80, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉位置个数 **说明**:记录相机发送的点位个数,将点位个数存入到选择的变量 **指令名**:VISION_POSNUM | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | M_STRPOSNUM | object | 是 | 全局数值变量,全局 int 变量或绑定变量,取值范围[1,990] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_POSNUM 在枚举数列 type 中为81 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **M_STRPOSNUM 结构**: ```json {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"} ``` **JSON 示例**: ```json { "ID": 31, "M_STRPOSNUM": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "type": 81, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉位置 **说明**:执行此条指令可以将相机发送的点位信息存入到变量 **指令名**:VISION_POS | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | dataVariable | object | 是 | 附加数值首个变量,全局 int 变量或绑定变量,取值范围[1,990] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidname | string | 否 | 点位变量名称,如"GP$GI001" | | posidtype | int | 否 | posidname 节点是绑定点位还是点位:0=点位;1=绑定点位 | | type | int | 是 | VISION_POS 在枚举数列 type 中为82 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **dataVariable 结构**: ```json {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[I001]"} ``` **JSON 示例**: ```json { "ID": 38, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[I001]"}, "logout": false, "posidname": "GP$GI001", "posidtype": 1, "type": 82, "userParamInt": 0, "userParamString": "" } ``` --- ## 清除视觉位置信息 **说明**:清除当前工艺号里相机发送的点位信息 **指令名**:VISION_CLEAR | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_CLEAR 在枚举数列 type 中为83 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 17, "logout": false, "type": 83, "userParamInt": 0, "userParamString": "" } ``` --- ## 视觉结束 **说明**:结束视觉工艺,控制器与相机断开连接 **指令名**:VISION_END | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_END 在枚举数列 type 中为84 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 1, "logout": false, "type": 84, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取视觉轨迹位置 **说明**:当相机发送的数据为多个点位时可选择不同点位存储方式运行轨迹 **指令名**:VISION_TRACE | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,99] | | M_POINTSTORAGENUM | object | 是 | 点位存放数,int 类型全局或局部变量或绑定变量 | | dataVariable | object | 否 | 附加数据首个变量,int/double/string 类型全局或局部变量或绑定变量;不使用时为`{"data":0.0,"secondvalue":0,"value":0,"varname":""}` | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | pointStoragePosType | int | 是 | 点位存放位置:0=外部点队列;1=变量 | | posidname | string | 是 | 点位存放的首个变量,全局或局部点位变量或绑定变量 | | posidtype | int | 是 | posidname 节点是绑定点位还是点位:0=点位;1=绑定点位 | | type | int | 是 | VISION_TRACE 在枚举数列 type 中为236 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 17, "M_POINTSTORAGENUM": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "dataVariable": {"data": 0.0, "secondvalue": 1, "value": 9, "varname": "GS[GI001]"}, "logout": false, "pointStoragePosType": 1, "posidname": "P$GI001", "posidtype": 1, "type": 236, "userParamInt": 0, "userParamString": "" } ``` --- ## 飞拍开始 **说明**:机器人工具手运动经过拍照点时,快速触发相机拍照,在拍照过程中物体或相机处于运动状态 **指令名**:ONFLY_INIT | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | Delay | object | 是 | 记录坐标延时,全局或局部 double 类型手填值或 int/double 类型变量或绑定变量,取值范围[0,1000] | | axisNum | object | 否 | 轴,string 类型手填值或 int 类型全局或局部变量或绑定变量 | | _posIdType | int | 是 | phonePos 节点是点位变量还是绑定点位变量:0=点位变量;1=绑定点位变量 | | IOPort | object | 否 | IO 端口,int 类型或绑定变量类型,取值范围[1,1000] | | IOValue | object | 否 | 端口值,bool 类型手填值或变量或绑定变量 | | cameraTriggerDelayTime | object | 是 | 相机触发延时,double 类型手填值或 int 类型,取值范围[0,1000] | | craftID | object | 是 | 工艺号,int 类型,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | triggerAngleSpacing | object | 否 | 触发角度间隔,double 类型手填值或 int/double 类型全局或局部变量或绑定变量,取值范围[-360,360] | | triggerCount | object | 否 | 触发次数,int 类型手填值或全局或局部绑定变量或变量,取值范围[0,10];不使用时`{"data":0.0,"secondvalue":0,"value":1,"varname":"[-]"}` | | triggerStartPos | object | 否 | 触发起始位置,double 类型手填值或全局或局部 int/double 类型变量或绑定变量 | | phonePos | string | 是 | 拍照点,string 类型,全局或局部 P 点位或 E 点位变量或绑定变量 | | radius | object | 是 | 拍照点范围半径,取值范围[0.001,1000] | | type | int | 是 | ONFLY_INIT 在枚举数列 type 中为239 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | | visionCraftID | object | 否 | 视觉工艺号 | ### triggerType=0 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "_posIdType": 1, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "phonePos": "P$GI001", "radius": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "triggerType": 0, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` ### triggerType=1 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "IOPort": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "DIN[I003]"}, "IOValue": {"data": 0.0, "secondvalue": 1, "value": 6, "varname": "GB[I001]"}, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "triggerType": 1, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` ### triggerType=2 时 ```json { "Delay": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "axisNum": {"data": 0.0, "secondvalue": 0, "value": 7, "varname": "J6"}, "cameraTriggerDelayTime": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "craftID": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I001"}, "logout": false, "triggerAngleSpacing": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "triggerCount": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "triggerStartPos": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I003"}, "triggerType": 2, "type": 239, "userParamInt": 0, "userParamString": "", "visionCraftID": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"} } ``` --- ## 飞拍结束 **说明**:结束视觉工艺,控制器与相机断开连接 **指令名**:VISION_END | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | craftID | object | 是 | 工艺号,int 类型,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | VISION_END 在枚举数列 type 中为240 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "craftID": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"}, "logout": false, "type": 240, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取飞拍打开状态 **说明**:获取飞拍任务是否打开,将获取的状态存入选择的变量 **指令名**:ONFLY_GET_STATUS | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | Result | object | 是 | 结果,全局或局部 bool 变量或局部变量 | | craftID | object | 是 | 工艺号,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,99] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | ONFLY_GET_STATUS 在枚举数列 type 中为241 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "Result": {"data": 0.0, "secondvalue": 0, "value": 6, "varname": "GB001"}, "craftID": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "logout": false, "type": 241, "userParamInt": 0, "userParamString": "" } ``` --- ## 飞拍计算工具手 **说明**:飞拍计算工具手作用于机械臂夹持工件时可能出现偏心位置,工件有旋转角。通过计算获取并切换新的工具手之后,工件中心放置到放料位置点,不偏心无旋转 **指令名**:ONFLY_CALC_TOOL | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | craftID | object | 是 | 工艺号,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,99] | | grabTool | object | 是 | 抓取工具手,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,999] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | newTool | object | 是 | 新工具手,int 类型手填值或全局或局部变量或绑定变量,取值范围[1,999] | | type | int | 是 | ONFLY_CALC_TOOL 在枚举数列 type 中为242 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "craftID": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI001]"}, "grabTool": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "logout": false, "newTool": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I006]"}, "type": 242, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-激光类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/18.%E6%8C%87%E4%BB%A4-%E6%BF%80%E5%85%89%E7%B1%BB.html ## 激光开始 - **说明**:激光开始 - **指令名**:LASER_ON - **ID**:5 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | VISION_RUN 在枚举数列 type 中为60 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 5, "logout": false, "type": 60, "userParamInt": 0, "userParamString": "" } ``` --- ## 激光结束 - **说明**:激光结束 - **指令名**:LASER_OFF ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | type | int | LASER_OFF 在枚举数列 type 中为61 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 61, "userParamInt": 0, "userParamString": "" } ``` --- ## 切割圆 - **说明**:切割圆 - **指令名**:LASER_CIRCLE - **type**:62 ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | ParaACC | object | 加速度;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaDEC | object | 减速度;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaTIME | object | 提前运行时间;double 手填值或 int 类型或 double 类型全局或局部变量或绑定变量;单位 ms | | ParaV | object | 速度参数 | | logout | bool | 是否被注释;true:在作业文件中将不执行该指令;false:未被注释,可执行 | | margin | double | 补差;取值范围[0,500]mm | | posidname | string | 中心点;P 或 GP 变量或绑定变量 | | posidtype | int | 点位是否为绑定变量;0或1;1:绑定变量,0:非绑定变量 | | radius | double | 半径;取值范围[1,3000]mm | | type | int | LASER_CIRCLE 在枚举数列 type 中为62 | | userParamInt | int | 二次开发中客户自定义,目前无意义 | | userParamString | string | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GI[GI001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "D[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "D001"}, "logout": false, "margin": 360.0, "posidname": "GP$I001", "posidtype": 1, "radius": 28.0, "type": 62, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-传送类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/19.%E6%8C%87%E4%BB%A4-%E4%BC%A0%E9%80%81%E7%B1%BB.html --- ## 传送带工件检测开始 **指令名**:CONVEYOR_CHECKPOS **说明**:传送带工件检测开始 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_CHECKPOS 在枚举数列 type 中为107 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 107, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带工件检测结束 **指令名**:CONVEYOR_CHECKEND **说明**:传送带工件检测结束 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_CHECKEND 在枚举数列 type 中为108 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 108, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带跟踪开始 **指令名**:CONVEYOR_ON **说明**:传送带跟踪开始 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | ParaACC | object | 是 | 加速度,double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[1,100]% | | ParaV | object | 是 | 速度,double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量;取值范围[2,1000]mm/s | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | m_positionId | string | 否 | 点位,如:"GP0001";当填点位变量时使用,其余时刻为空 | | m_postype | int | 否 | 当点位为工件点时值为1;取值范围[0,1] | | posidname | string | 否 | 点位,如:GP$I001;当填的点位值为点位绑定变量时使用,其余时刻为空 | | posidtype | int | 否 | 点位类型:0=点位类型不为绑定点位变量;1=点位类型为绑定点位变量 | | type | int | 是 | 枚举值,CONVEYOR_ON 在枚举数列 type 中为105 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "ParaACC": { "data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI007" }, "ParaV": { "data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "GD003" }, "logout": false, "m_positionId": "", "m_postype": 1, "posidname": "", "posidtype": 0, "type": 105, "userParamInt": 0, "userParamString": "" } ``` --- ## 传送带跟踪结束 **指令名**:CONVEYOR_OFF **说明**:传送带跟踪结束 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | 是 | 枚举值,CONVEYOR_OFF 在枚举数列 type 中为106 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "type": 106, "userParamInt": 0, "userParamString": "" } ``` --- ## 获取传送带跟踪位置 **指令名**:CONVEYOR_POS **说明**:获取传送带跟踪位置 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | dataVariable | object | 否 | 视觉附加数据收个变量,int 类型或 double 类型或 string 类型全局或局部或全局变量或绑定变量;不使用时各个值都为空 | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | m_positionId | string | 是 | 全局位置变量,GP 变量;取值范围 GP00001-GP9999 | | type | int | 是 | 枚举值,CONVEYOR_POS 在枚举数列 type 中为176 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "dataVariable": { "data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[I001]" }, "logout": false, "m_positionId": "GP0019", "type": 176, "userParamInt": 0, "userParamString": "" } ``` --- ## 删除传送带跟踪目标 **指令名**:CONVEYOR_CLEAR **说明**:删除传送带跟踪目标 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ID | int | 是 | 工艺号,取值范围[1,9] | | logout | bool | 是 | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | removeType | int | 是 | 删除范围:0=全部目标;1=本次目标;取值范围[0,1] | | type | int | 是 | 枚举值,CONVEYOR_CLEAR 在枚举数列 type 中为220 | | userParamInt | int | 否 | 二次开发中客户自定义,目前无意义 | | userParamString | string | 否 | 二次开发中客户自定义,目前无意义 | **JSON 示例**: ```json { "ID": 6, "logout": false, "removeType": 1, "type": 220, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-喷涂工艺类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/20.%E6%8C%87%E4%BB%A4-%E5%96%B7%E6%B6%82%E5%B7%A5%E8%89%BA%E7%B1%BB.html --- ## 喷涂开始 **指令名:SPRAY_ON** **type 值:122** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | [0, 99] | 模拟量组号 | | atom | double | [0, 10] | 雾化模拟量(V),模拟量组号为0时修改 | | colorID | int | - | 颜色 ID | | flow | double | [0, 10] | 流量模拟量(V),模拟量组号为0时修改 | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | sector | double | [0, 10] | 扇形模拟量(V),模拟量组号为0时修改 | | seqID | int | [1, 99] | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 122 | SPRAY_ON 在枚举序列 type 中为122 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 0, "atom": 6.0, "colorID": 1, "flow": 8.0, "gunID": 2, "logout": false, "point": 1, "sector": 7.0, "seqID": 39, "traID": 1, "type": 122, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂结束 **指令名:SPRAY_OFF** **type 值:123** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | - | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 123 | SPRAY_OFF 在枚举序列 type 中为123 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 1, "colorID": 1, "gunID": 2, "logout": false, "point": 1, "seqID": 1, "traID": 1, "type": 123, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂换色 **指令名:SPRAY_CHANGE** **type 值:124** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | anaID | int | - | 模拟量组号 | | colorID | int | [1, 10] | 颜色 | | gunID | int | [1, 2] | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | [1, 99] | 时序组号 | | traID | int | - | 轨迹 ID | | type | int | 124 | SPRAY_CHANGE 在枚举序列 type 中为124 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "anaID": 1, "colorID": 9, "gunID": 2, "logout": false, "point": 1, "seqID": 98, "traID": 1, "type": 124, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂轨迹 **指令名:SPRAY_MOVE** **type 值:125** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1, 100]% | 喷涂加速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaDEC | object | [1, 100]% | 喷涂减速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaPL | object | [1, 100]% | 喷涂 PL:int 类型手填值或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2, 1000]mm/s | 喷涂速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | - | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | - | 点位 | | seqID | int | [1, 99] | 时序组号 | | traID | int | [1, 99] | 轨迹组号 | | type | int | 125 | SPRAY_MOVE 在枚举序列 type 中为125 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI001"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 2, "varname": "D009"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 1, "value": 5, "varname": "GD[I001]"}, "anaID": 1, "colorID": 1, "gunID": 1, "logout": false, "point": 1, "seqID": 1, "traID": 98, "type": 125, "userParamInt": 0, "userParamString": "" } ``` --- ## 喷涂起始位置 **指令名:SPRAY_STARTPOS** **type 值:126** ### 参数说明 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ParaACC | object | [1, 100]% | 喷涂加速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaDEC | object | [1, 100]% | 喷涂减速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaTIME | object | - | 提前执行时间:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2, 1000]mm/s | 喷涂速度:double 类型手填值或 double 类型或 int 类型全局或局部变量或绑定变量 | | anaID | int | - | 模拟量组号 | | colorID | int | - | 颜色 ID | | gunID | int | - | 枪 | | logout | bool | true/false | 是否被注释:true 在作业文件中将不执行该指令,false 未被注释可执行 | | point | int | [0, 1] | 点位姿态:0-绝对标记点,1-仅姿态 | | seqID | int | - | 时序组号 | | traID | int | [1, 99] | 轨迹组号 | | type | int | 126 | SPRAY_STARTPOS 在枚举序列 type 中为126 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 1, "value": 2, "varname": "D[GI001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"}, "ParaTIME": {"data": 0.0, "secondvalue": 1, "value": 5, "varname": "GD[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 1, "value": 1, "varname": "I[I001]"}, "anaID": 1, "colorID": 1, "gunID": 1, "logout": false, "point": 1, "seqID": 1, "traID": 98, "type": 126, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-打磨工艺类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/21.%E6%8C%87%E4%BB%A4-%E6%89%93%E7%A3%A8%E5%B7%A5%E8%89%BA%E7%B1%BB.html --- ## 棱边打磨 **指令名:POLISH_EDGE** **说明:** 棱边打磨 **type:** 109(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | ParaACC | double/int | 加速度 | [1,100]% | | ParaAHEAD | double/int | 提前执行,与 aheadtype 有关 | [1,100]% | | ParaDEC | double/int | 减速度 | [1,100]% | | ParaPL | int | 平滑 | [0,5] | | ParaTIME | double/int | 提前执行时间 | - | | ParaV | double/int | 速度 | [1,1000] mm/s | | aheadtype | int | 提前类型 | 0:提前时间;1:提前距离;2:提前进度 | | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polish | int | 打磨次数 | [1,99] | | polishAngle | double | 角度 | [-180,180] 度 | | polishID | int | 打磨工艺号 | [1,99] | | posidname | string | 点位 | P 或 GP 绑定变量 | | posidtype | int | 点位类型 | 0:点位变量;1:点位绑定变量 | | positionId | string | 点位 | 当 posidtype 为 0 时使用 | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "ParaACC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "I002"}, "ParaAHEAD": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "GD[I001]"}, "ParaDEC": {"data": 0.0, "secondvalue": 0, "value": 1, "varname": "GI008"}, "ParaPL": {"data": 0.0, "secondvalue": 1, "value": 1, "varname": "I[GI001]"}, "ParaV": {"data": 0.0, "m_vUnit": 1, "secondvalue": 0, "value": 1, "varname": "I001"}, "aheadtype": 2, "logout": false, "polish": 89, "polishAngle": 70.0, "polishID": 30, "posidname": "GP$GI001", "posidtype": 1, "positionId": "", "type": 109, "userParamInt": 0, "userParamString": "" } ``` --- ## 打磨继续 **指令名:POLISH_CONTINUE** **说明:** 打磨继续 **type:** 131(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | angle | double | 角度 | [-180,180] 度 | | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polishID | int | 工艺号 | [1,99] | | time | double | 提前执行时间 | - | | times | int | 打磨次数 | [1,99] | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "angle": 99, "logout": false, "polishID": 21, "time": 999, "times": 19, "type": 131, "userParamInt": 0, "userParamString": "" } ``` --- ## 打磨结束 **指令名:POLISH_OFF** **说明:** 打磨结束 **type:** 132(在枚举序列中) ### 参数列表 | 参数名 | 类型 | 说明 | 取值范围 | |--------|------|------|----------| | logout | bool | 是否被注释 | true:不执行该指令;false:可执行 | | polishID | int | 工艺号 | [1,99] | | userParamInt | int | 二次开发自定义,目前无意义 | - | | userParamString | string | 二次开发自定义,目前无意义 | - | ### JSON 示例 ```json { "logout": false, "polishID": 18, "type": 132, "userParamInt": 0, "userParamString": "" } ``` --- # 指令-寻位跟踪类 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/02.%E7%A8%8B%E5%BA%8F-%E6%8C%87%E4%BB%A4%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5/22.%E6%8C%87%E4%BB%A4-%E5%AF%BB%E4%BD%8D%E8%B7%9F%E8%B8%AA%E7%B1%BB.html --- ## 激光追踪开始 **说明**:激光追踪开始 **指令名**:LASERTRACK_ON **type 值**:85 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | delay | double | [0,10] | 参数表延时 | | segmentParam | int | [1,99] | 跟踪参数表号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,LASERTRACK_ON 在枚举数列中为 85 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 2, "delay": 4.0, "logout": false, "segmentParam": 3, "type": 85, "userParamInt": 0, "userParamString": "" } ``` --- ## 激光追踪结束 **说明**:激光追踪结束 **指令名**:LASERTRACK_OFF **type 值**:86 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,LASERTRACK_OFF 在枚举数列中为 86 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 2, "logout": false, "type": 86, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位开始 **说明**:寻位开始 **指令名**:SEARCH_START **type 值**:151 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | senseType | int | [0,1] | 传感类型:0=线激光;1=触碰 | | type | int | - | 枚举值,SEARCH_START 在枚举数列中为 151 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 19, "logout": false, "senseType": 1, "type": 151, "userParamInt": 0, "userParamString": "" } ``` --- ## 静态寻位 **说明**:静态寻位 **指令名**:SEARCH_STATIC **type 值**:152 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | delay | double | [0,10] | 参数表延时 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidtype | int | [0,1] | 点位类型:0=点位变量;1=点位绑定变量 | | positionOutId | string | - | 输出位置,E 或 P 或 GP 或 GE 点位变量或绑定变量 | | tableID | int | [1,99] | 寻位参数表号 | | type | int | - | 枚举值,SEARCH_STATIC 在枚举数列中为 152 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 18, "delay": 9.0, "logout": false, "posidname": "", "posidtype": 1, "positionOutId": "E$I001", "tableID": 31, "type": 152, "userParamInt": 0, "userParamString": "" } ``` --- ## 动态寻位 **说明**:动态寻位 **指令名**:SEARCH_DYNAMIC **type 值**:153 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | ParaACC | object | [1,100] | 加速度:double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量 | | ParaPL | object | [0,5] | 平滑:int 类型手填值或 int 类型全局或局部变量或绑定变量 | | ParaV | object | [2,1000] mm/s | 速度:double 类型手填值或 int 类型或 double 类型全局或局部变量或绑定变量 | | delay | double | [0,10] | 参数表延时 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | pointEffet | int | [0,1] | 点位作用:0=准备点;1=寻位开始点 | | posidname | string | - | 点位位置数据:P 或 E 或 GP 或 GE 变量或绑定变量 | | posidtype | int | [0,1] | 点位类型:0=点位变量;1=点位绑定变量 | | positionOutId | string | - | 输出位置:E 或 P 或 GP 或 GE 点位变量或绑定变量 | | sync | int | [0,1] | SYNC:0=否;1=是 | | tableID | int | [1,99] | 寻位参数表号 | | type | int | - | 枚举值,SEARCH_DYNAMIC 在枚举数列中为 153 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例(寻位开始点) ```json { "ID": 20, "delay": 5.0, "logout": false, "pointEffet": 1, "posidname": "GE$I001", "posidtype": 1, "positionOutId": "GP0001", "sync": 1, "tableID": 22, "type": 153, "userParamInt": 0, "userParamString": "" } ``` ### JSON 示例(准备点) ```json { "ID": 20, "ParaACC": {"data": 58.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaPL": {"data": 3.0, "secondvalue": 0, "value": 0, "varname": ""}, "ParaV": {"data": 78.0, "m_vUnit": 1, "secondvalue": 0, "value": 0, "varname": ""}, "logout": false, "pointEffet": 0, "posidname": "GE$I001", "posidtype": 1, "sync": 1, "type": 153, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位计算 **说明**:寻位计算 **指令名**:SEARCH_CALC **type 值**:154 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | calculType | int | [0,11] | 计算方式:0=1维偏转;1=2维偏转;2=2维偏转+旋转;3=3点计算投影点;4=4点确定两条直线计算交点;5=3点计算用户坐标系;6=4点确定两条直线计算交点;7=6点计算用户坐标系;8=2点简易触碰寻位;9=3维偏移+旋转;10=平面两点计算新用户坐标系;11=4点计算平面用户坐标系 | | coordNum | int | [1,999] | 输出用户坐标系 | | length | double | mm | 长度 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | posidtype | int | [0,1] | 节点是否绑定变量:0=点位变量;1=点位绑定变量 | | position1Id | string | - | 点1:P 或 E 或 GE 或 GP | | position2Id | string | - | 点2:P 或 E 或 GE 或 GP | | position3Id | string | - | 点3:P 或 E 或 GE 或 GP | | position4Id | string | - | 点4:P 或 E 或 GE 或 GP | | position5Id | string | - | 点5:P 或 E 或 GE 或 GP | | position6Id | string | - | 点6:P 或 E 或 GE 或 GP | | positionOutId | string | - | 输出结果:P 或 GP 或 E 或 GE | | searchParacoordinate | int | [1,999] | 输入用户坐标系 | | type | int | - | 枚举值,SEARCH_CALC 在枚举数列中为 154 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "calculType": 9, "coordNum": 1, "length": 56.0, "logout": false, "posidtype": 0, "position1Id": "GP0001", "position2Id": "GP0002", "position3Id": "", "position4Id": "", "position5Id": "", "position6Id": "", "positionOutId": "GP0096", "searchParacoordinate": 1, "type": 154, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位结束 **说明**:寻位结束 **指令名**:SEARCH_END **type 值**:155 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | ID | int | [1,99] | 跟踪文件号 | | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,SEARCH_END 在枚举数列中为 155 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "ID": 20, "logout": false, "type": 155, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位偏移 **说明**:寻位偏移 **指令名**:SEARCH_OFFSET **type 值**:156 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | position1Id | string | - | 偏移量:P 或 GP | | type | int | - | 枚举值,SEARCH_OFFSET 在枚举数列中为 156 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "position1Id": "GP0036", "type": 156, "userParamInt": 0, "userParamString": "" } ``` --- ## 寻位偏移结束 **说明**:寻位偏移结束 **指令名**:SEARCH_OFFSETEND **type 值**:157 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,SEARCH_OFFSETEND 在枚举数列中为 157 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | ### JSON 示例 ```json { "logout": false, "type": 157, "userParamInt": 0, "userParamString": "" } ``` --- ## 电弧跟踪开始 **说明**:电弧跟踪开始 **指令名**:ARCTRACKON **type 值**:158 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | p_trace_path_num | object | [1,9] | 跟踪路径数据:int 类型手填值或 int 类型全局或局部变量或绑定变量;值为0时表示不使用 | | type | int | - | 枚举值,ARCTRACKON 在枚举数列中为 158 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "p_trace_path_num": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[GI036]"}, "type": 158, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I026]"} } ``` --- ## 电弧跟踪结束 **说明**:电弧跟踪结束 **指令名**:ARCTRACKOFF **type 值**:159 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCTRACKOFF 在枚举数列中为 159 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 159, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 1, "value": 4, "varname": "GI[I001]"} } ``` --- ## 弧压跟踪开始 **说明**:弧压跟踪开始 **指令名**:ARCTRACKON **type 值**:160 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCTRACKON 在枚举数列中为 160 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 160, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI099"} } ``` --- ## 弧压跟踪结束 **说明**:弧压跟踪结束 **指令名**:ARCVTRACKOFF **type 值**:161 ### 参数表 | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | logout | bool | - | 是否被注释:true=在作业文件中将不执行该指令;false=未被注释,可执行 | | type | int | - | 枚举值,ARCVTRACKOFF 在枚举数列中为 161 | | userParamInt | int | - | 二次开发中客户自定义,目前无意义 | | userParamString | string | - | 二次开发中客户自定义,目前无意义 | | variable | object | - | 变量数据 | ### JSON 示例 ```json { "logout": false, "type": 161, "userParamInt": 0, "userParamString": "", "variable": {"data": 0.0, "secondvalue": 0, "value": 4, "varname": "GI006"} } ``` --- # 程序操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/03.%E7%A8%8B%E5%BA%8F%E6%93%8D%E4%BD%9C.html ## 程序打开 正式执行程序之前需要打开程序。 **命令字:** `0x5100` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | jobName | string | 新建作业文件名 | | suffixname | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | ```json { "robot": 1, "jobName": "xxxx", "suffixname": ".JBR" } ``` ## 程序复制 复制后程序的后缀是一样的。 **命令字:** `0x5101` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | oldjobName | string | 旧文件名 | | newjobName | string | 复制后文件名 | | suffixname | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | ```json { "robot": 1, "oldjobName": "QQQQ", "newjobName": "WWWW", "suffixname": ".JBR" } ``` ## 程序清除 会清除当前机器人的所有程序,但不会清除复位程序。 **命令字:** `0x5102` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | lock_enable | bool | 是否清空作业文件使能,true 清空使能,false 清空不使能 | ```json { "robot": 1, "lock_enable": true } ``` ## 获取当前打开程序 **命令字:** `0x5103` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5104` | 字段 | 类型 | 说明 | |------|------|------| | openedJobName | string | 当前打开的作业文件,空表示没有 | ```json { "openedJobName": "asd" } ``` ## 主程序 主程序可以认为是特殊的前台程序,只有前台程序可以设置成主程序,设置和查询时作业文件名字不考虑后缀 ### 设置作业文件为主程序 **命令字:** `0x5110` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名,空字符串表示取消主程序 | ```json { "robot": 1, "jobName": "xxx" } ``` ### 查询主程序 **命令字:** `0x5111` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5112` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名,空表示没有 | ```json { "robot": 1, "jobName": "xxx" } ``` ## 程序保存 程序进行修改、插入、删除后需要使用该协议进行保存。 **命令字:** `0x5120` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | jobname | string | 作业文件名 | | suffix | string | 文件后缀名:.JBR 前台程序,.JBP 后台局部程序,.JBPG 后台全局程序 | | time | string | 时间戳,格式如 "2024.08.08 14:16:39" | ```json { "robot": 1, "jobname": "xxxx", "suffix": ".JBR", "time": "2024.08.08 14:16:39" } ``` ## 同步程序打开 > 功能可能有问题,只有在 6001 打开时同步到 6000 的操作 控制器打开程序后通知上位机,告知上位机该程序已在控制器打开。 **命令字:** `0x3130` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前反馈的机器人编号,取值范围 [1, 4] | | jobName | string | 作业文件名 | ```json { "robot": 1, "jobName": "" } ``` ## 发送程序指令 为无作业文件的指令插入。运行方式与作业运行方式一样,但是需要将 "noFileRun" 节点的值写为 true。 **命令字:** `0x5122` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | cmd | object | 插入的指令详情,格式为 cmd->toJson(),见指令页面 | ```json { "robot": 1, "cmd": {} } ``` ## 程序同步 上位机发送给控制器,通知示教器同步作业文件。 **命令字:** `0x1222` - 无需发送数据 **控制器响应** **命令字:** `0x1223` | 字段 | 类型 | 说明 | |------|------|------| | finished | bool | true 成功,false 失败 | ```json { "finished": true } ``` ### 控制器通知示教器同步作业文件 **命令字:** `0x1224` - 无需发送数据 **示教器响应** **命令字:** `0x1225` | 字段 | 类型 | 说明 | |------|------|------| | finished | bool | true 成功,false 失败 | ```json { "finished": true } ``` --- # 注释 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/04.%E6%B3%A8%E9%87%8A.html ## 变量 变量/绑定变量的 JSON 结构: ```json { "data": 3.0, "secondvalue": 0, "value": 0, "varname": "" } ``` | 参数 | 类型 | 说明 | |------|------|------| | data | float | 数值型数据 | | secondvalue | int | 是否为绑定变量,0=否,1=是(格式:GD[GI0002]) | | value | int | 数据类型,0=数值型(填 data 节点),7=字符串(填 varname 节点),8=变量或绑定变量(填 varname 节点) | | varname | string | 字符串类型或变量名 | ## 点位 ```json { "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "paraVarData": [ {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""}, {"data": 0.0, "secondvalue": 0, "value": 0, "varname": ""} ] } } ``` | 参数 | 类型 | 说明 | |------|------|------| | ctype | int | 点位类型,1=P,2=E,3=S,4=R,5=GP,6=GE | | key | string | 点位名称 | | note | string | 点位注释 | | data | array | 21位数组,详见下方说明 | | paraVarData | array | 21位参数变量数组,结构同变量节点 | **data 数组说明(21位):** | 位 | 说明 | |----|------| | 第1位 | 坐标系:0=关节,1=直角,2=工具,3=用户 | | 第2位 | 单位:0=角度制,1=弧度制 | | 第3位 | 左右手(形态):0=任意,1=左,2=右 | | 第4位 | 工具号 | | 第5位 | 用户号 | | 第6~7位 | 备用 | | 第8~21位 | 坐标值(7位内部轴 + 7位外部轴) | > 注:不存在的节点默认为 0 或 "" --- # 程序运行控制 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/05.%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E6%8E%A7%E5%88%B6.html ## 程序运行总数清零 **命令字:** `0x5600` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 运行程序 对程序进行操作。 ### 发送开始运行程序 **命令字:** `0x5601` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | jobname | string | 程序名 | | suffixname | string | 程序名后缀名称,取值:.JBR 主程序,.JBP 后台局部程序,.JBPG 后台全局程序 | | stepRunSum | int | 一共多少步(可选) | | callerName | string | 访问者名字(可选) | | stepRun | bool | 是否单步运行(可选) | | index | int | 索引(可选) | | noFileRun | bool | 无文件运行(可选) | | notJudgeSafePos | bool | 不判断安全位置(可选) | | line | int | 程序开始运行的行号 | | globalStart | bool | 是否为多机模式 | | continueRun | int | 是否为继续运行:0 不继续运行,1 继续运行 | | startOver | int | 是否为重头运行:0 继续运行,1 重头运行 | ```json { "robot": 1, "jobname": "TTT", "suffixname": ".JBR", "stepRunSum": 2, "callerName": "tttt", "stepRun": false, "index": 0, "noFileRun": false, "notJudgeSafePos": false, "line": 1, "globalStart": false, "continueRun": 0, "startOver": 0 } ``` > 注:可选字段不使用无影响 ### 下发停止程序 **命令字:** `0x5602` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 程序执行状态设置 上位机需要改变当前控制器程序执行模式时发送。 **命令字:** `0x5603` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | type | int | 程序执行状态:0 单步运行,1 暂停,2 停止但不下电,5 停止但不下电(停止优先使用) | ```json { "robot": 1, "type": 5 } ``` > **注意:** 对于单步,没有全部机器人;对于暂停和停止,只有多机模式下有全部机器人,此时将 "robot" 节点设置成 0 ## 使用无文件运行开关 **命令字:** `0x5604` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ## 正序倒序运动 ### 设置反向运行 **命令字:** `0x5610` | 字段 | 类型 | 说明 | |------|------|------| | switch | bool | 是否反向顺序运行 | ```json { "switch": false } ``` ### 查询正序倒序 **命令字:** `0x5611` - 无需发送数据 **控制器回复** **命令字:** `0x5612` | 字段 | 类型 | 说明 | |------|------|------| | switch | bool | 是否反向顺序运行 | ```json { "switch": false } ``` ## 循环次数 ### 设置循环次数 **命令字:** `0x5620` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | index | int | 总循环次数,0 表示无限循环 | ```json { "robot": 1, "index": 1 } ``` ### 查询循环次数 **命令字:** `0x5621` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5622` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | index | int | 总循环次数,0 表示无限循环 | | count | int | 当前已运行次数 | ```json { "robot": 1, "count": 0, "index": 1 } ``` ## 全局线程 ### 全局线程自启动设置 **命令字:** `0x5630` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | name | string | 全局后台程序名 | ```json { "robot": 1, "name": "Q1" } ``` ### 全局线程自启动查询 **命令字:** `0x5631` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 全局线程自启动接收 **命令字:** `0x5632` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | name | string | 全局后台程序名 | ```json { "robot": 1, "name": "Q1" } ``` ### 全局线程启动控制 **命令字:** `0x5633` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | type | int | 启动控制:0 表示停止,1 开始 | ```json { "robot": 1, "type": 1 } ``` ### 全局线程启动状态查询 **命令字:** `0x5634` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1, 4] | | runName | int | 1 表示获取全局后台运行状态 | ```json { "robot": 1, "hasRun": true, "runName": 1 } ``` **控制器回复** | 命令字 | 类型 | 说明 | |--------|------|------| | 0x50c6 | - | GLOBAL_PTHREAD_RUNSTATUS_RESPOND | | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool[] | 自启状态数组,true 表示启动,false 表示停止 | ```json { "robot": 1, "hasRun": [false, true] } ``` ## 追加运动模式 追加运动模式是在不使用程序的条件下运行程序。 使用方法: 1. 打开追加运动模式 2. 追加运动模式插入指令向量 3. 追加运动模式设置 ### 打开追加运动模式 **命令字:** `0x5640` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | open | bool | 是否开启追加运动模式,true 打开,false 关闭 | ```json { "robot": 1, "open": true } ``` ### 查询追加运动模式 **命令字:** `0x5641` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5642` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | open | bool | 是否开启追加运动模式,true 打开,false 关闭 | ```json { "robot": 1, "open": true } ``` ### 追加运动插入指令向量 **命令字:** `0x5643` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | | isContinue | bool | true 只接收并存储 pos,false 接收 pos 并使得机器人执行所有 pos | | data | array | 指令 JSON 列表,格式为 cmd->toJson() | ```json { "data": [ { "cmd": "toJson()" }, { "cmd": "toJson()" }, { "cmd": "toJson()" } ], "isContinue": false, "robot": 1 } ``` > 指令详情请参阅指令页面 ### 追加运动模式挂起(暂停) **命令字:** `0x5644` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 追加运动模式启动 **命令字:** `0x5645` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` ### 追加运动模式停止 **命令字:** `0x5646` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要操作的机器人编号,取值范围 [0, 3] | ```json { "robot": 0 } ``` ## 自启动 自启动程序,设置后开机自启动。 ### 设置自启动程序 **命令字:** `0x5647` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | enable | bool | 是否使能,true 使能,false 不使用 | | count | int | 运行次数 | | speed | int | 运行速度 | | jobname | string | 程序名字 | ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` ### 查询自启动程序 **命令字:** `0x5648` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5649` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 要查询的机器人编号,取值范围 [1, 4] | | enable | bool | 是否使能 | | count | int | 运行次数 | | speed | int | 运行速度 | | jobname | string | 程序名字 | ```json { "robot": 1, "enable": false, "count": 1, "speed": 15, "jobname": "Q1" } ``` > 需补充试运行和单步相关内容 ### 查询全局后台自启状态 **命令字:** `0x50c5` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool | 自启状态,true 启动,false 停止 | | runName | int | 1:获取全局后台运行状态 | ```json { "robot": 1, "hasRun": true, "runName": 1 } ``` **控制器回复** **命令字:** `0x50c6` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人号 | | hasRun | bool | 自启状态,true 启动,false 停止 | ```json { "robot": 1, "hasRun": false } ``` --- # 程序状态 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/06.%E7%A8%8B%E5%BA%8F%E7%8A%B6%E6%80%81.html ## 程序行号 当控制器开始运行一条指令时,向上位机发送: **命令字:** `0x5400` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | num | int | 已运行指令数量 | ```json { "robot": 1, "jobname": "Q1", "num": 3 } ``` ## CRAFTLINE 指令跳转 当控制器执行 CRAFTLINE 指令时,向示教器发送跳转: **命令字:** `0x5401` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | num | int | 已运行指令数量 | ```json { "robot": 1, "num": 2 } ``` ## 查询当前行号 当示教器与控制器建立网络连接时,上位机查询当前运行到哪一行: **命令字:** `0x5402` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5403` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | num | int | 行号 | ```json { "robot": 1, "jobname": "Q1", "num": 3 } ``` ## 程序运行状态 程序状态包括:暂停、运行、停止。 ### 查询程序运行状态 **命令字:** `0x5410` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5411` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | status | int | 程序运行状态:0 停止,1 暂停,2 运行 | ```json { "robot": 1, "status": 0 } ``` ### 查询机器人运行状态 **命令字:** `0x5412` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | ```json { "robot": 1, "jobfilename": "" } ``` **控制器回复** **命令字:** `0x5413` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | status | int | 运行状态:0 停止,1 暂停,2 运行 | | continueRun | int | 是否从当前行运行:0 从头运行,1 从当前行运行 | | currentRun | bool | 当前是否运行 | | mainProgramRun | int | 主程序是否运行 | ```json { "robot": 1, "status": 0, "continueRun": 0, "currentRun": false, "mainProgramRun": 0 } ``` ### 设置当前行 **命令字:** `0x5414` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | | num | int | 行号 | ```json { "robot": 1, "jobfilename": "", "num": 1 } ``` ### 查询当前行 **命令字:** `0x5415` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x5416` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobfilename | string | 作业文件名 | | num | int | 行号 | ```json { "robot": 1, "jobfilename": "", "num": 1 } ``` ### 清除运行状态 上位机在导入程序成功后发送此协议请求重置程序运行状态: **命令字:** `0x5417` - 无需发送数据 **控制器回复** **命令字:** `0x5418` - 无需回复数据 ### 查询运动队列剩余指令数量 **命令字:** `0x5419` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 当前机器人,取值范围 [1, 4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x541A` | 字段 | 类型 | 说明 | |------|------|------| | sum | int | 运动队列的行号数量 | ```json { "sum": 4 } ``` ### 查询运动队列剩余指令数量 **命令字:** `0x541a` **控制器回复** | 字段 | 类型 | 说明 | |------|------|------| | sum | int | 运动队列的行号 | ```json { "sum": 4 } ``` --- # 指令操作 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/07.%E6%8C%87%E4%BB%A4%E6%93%8D%E4%BD%9C.html ## 1 外部轴 ### 1.1 外部轴位置查询 **说明:** 机器人+变位机同步插入指令时的位置查询 **命令字:** `0x5300` **上位机发送:** ```json { "robot": 1, "coord": 0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | coord | int | 是 | 控制器当前坐标:0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | --- ### 1.2 外部轴位置接收 **说明:** 机器人+变位机同步插入指令时的位置接收 **命令字:** `0x5301` **控制器返回:** ```json { "robot": 1, "coord": 0, "configuration": 1, "position": [0, 0.1, 2, 3.3, 44, 555.55, 66.6], "positionDeg": [0, 0.1, 2, 3.3, 44, 555.55, 66.6], "externalPosition": [0, 0.1, 2, 3.3, 44] } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | coord | int | 是 | 控制器当前坐标:0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | | configuration | int | 是 | 姿态或左右手 | | position | double[] | 是 | 当前位置(弧度制),7位考虑双机情况 | | positionDeg | double[] | 是 | 当前位置(角度制) | | externalPosition | double[] | 是 | 外部轴当前位置,5位 | --- ## 2 历史指令列表 ### 2.1 历史指令列表查询 **命令字:** `0x5310` **上位机发送:** ```json { "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | --- ### 2.2 指令列表查询 **命令字:** `0x5301` **上位机发送:** ```json { "robot": 1 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | --- ### 2.3 历史指令列表返回 **命令字:** `0x5311` **控制器返回:** ```json { "robot": 1, "jobname": ["请求权", "请求权"], "num": [2, 1], "sendednum": 2, "totalnum": 2 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | jobname | string[] | 是 | 程序名数组,单次上限50 | | num | int[] | 是 | 历史行号数组,单次上限50,数组顺序为程序执行反序 | | sendednum | int | 是 | 此次发送数量 | | totalnum | int | 是 | 总计发送数量 | --- ## 3 局部点 **说明:** 局部点为不同程序内的数据,不同程序的局部点不相关。 ### 3.1 插入局部点位 **命令字:** `0x5320` **上位机发送:** ```json { "robot": 1, "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "paraVarData": [ {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0} ] }, "time": "2024.11.06 10:10:34" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | robotpos | object | 是 | 点位信息 | | time | string | 是 | 时间戳,格式如:`2024.11.06 10:10:34` | **robotpos 子对象:** | 参数名 | 类型 | 说明 | |--------|------|------| | ctype | int | 类型 | | key | string | 点位标识 | | note | string | 备注 | | data | double[] | 位置数据数组 | | paraVarData | object[] | 参数变量数据 | --- ### 3.2 修改局部点位 **命令字:** `0x5321` **上位机发送:** ```json { "robot": 1, "robotpos": { "ctype": 1, "key": "P0001", "note": "", "data": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "paraVarData": [ {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0}, {"varname": "", "value": 0, "secondvalue": 0, "data": 0.0} ] }, "time": "2024.11.06 10:14:31" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | robotpos | object | 是 | 点位信息 | | time | string | 是 | 时间戳,格式如:`2024.11.06 10:14:31` | --- ### 3.3 修改数值局部变量 **命令字:** `0x5322` **上位机发送:** ```json { "robot": 1, "time": "2024.11.06 10:18:24", "varName": "D007", "varNote": "", "varType": 1, "varString": "RRR", "varValue": 0.0 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot | int | 是 | 机器人编号,取值范围 [1,4] | | time | string | 是 | 时间戳 | | varName | string | 是 | 变量名,局部数值型变量:I001, D001, B001, S001 | | varNote | string | 否 | 注释 | | varType | int | 是 | 变量类型:0-int, 1-double, 2-bool, 3-string | | varValue | double | 是 | 数值型值 | | varString | string | 是 | 字符型值 | --- ## 4 语法检查 ### 4.1 获取语法检查结果 **命令字:** `0x9121` **上位机发送:** ```json { "robot_id": 1, "job_name": "QQQ", "suffix": ".JBR" } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_id | int | 是 | 机器人号 | | job_name | string | 是 | 作业名 | | suffix | string | 是 | 程序后缀:`.JBR` 主程序、`.JBP` 后台局部程序、`.JBPG` 后台全局程序 | --- ### 4.2 语法检查结果返回 **命令字:** `0x9121` **控制器返回:** ```json { "robot_id": 1, "job_name": "QQQ", "suffix": ".JBR", "result": "true", "cur_error_command_num": 5 } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | robot_id | int | 是 | 机器人号 | | job_name | string | 是 | 作业名 | | suffix | string | 是 | 程序后缀 | | result | bool | 是 | 检查结果:true-成功,false-失败 | | cur_error_command_num | int | 否 | 失败时行号 | --- ## 5 快捷指令 **说明:** 快捷指令的是否使用在操作参数中有节点表示。 ### 5.1 设置快捷指令 **命令字:** `0x50E0` **上位机发送:** ```json { "quickInsert": [ [0, 0], [0, 1], [0, 2], [0, 3], [0, 5], [-1, -1], [-1, -1], [-1, -1] ] } ``` | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | quickInsert | array | 是 | 快捷指令数组,共8个元素,每个元素第一位代表指令类型,第二位代表指令 | --- ### 5.2 查询快捷指令 **命令字:** `0x50E0` **上位机发送:** ```json {} ``` **说明:** data 为空对象。 --- ### 5.3 返回快捷指令 **命令字:** `0x50E2` **控制器返回:** (同 0x50E0 格式) --- # 远程程序 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/03.%E7%A8%8B%E5%BA%8F/08.%E8%BF%9C%E7%A8%8B%E7%A8%8B%E5%BA%8F.html ## 预约执行状态 远程模式界面,上位机查询预约执行状态时,发送。 **命令字:** `0x5500` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复预约执行状态查询结果。 **命令字:** `0x5501` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | current | object | 当前任务状态 | | current.station | int | 工位编号 | | current.name | string | 程序名称 | | current.runtime | int | 运行时间 | | current.times | int | 运行次数 | | current.count | int | 已运行次数 | | current.status | int | 状态:0-无预约,1-预约中,2-运行中,3-已预约,4-程序暂停 | | queue | array | 预约队列 | | queue[].station | int | 工位编号 | | queue[].name | string | 程序名称 | | queue[].times | int | 运行次数 | | queue[].count | int | 已运行次数 | | queue[].status | int | 状态 | ### 响应示例 ```json { "robot": 1, "current": { "station": 1, "name": "Q1", "runtime": 1, "times": 3, "count": 1, "status": 2 }, "queue": [ { "station": 1, "name": "Q4", "times": 2, "count": 0, "status": 1 }, { "station": 1, "name": "Q1", "times": 6, "count": 0, "status": 1 }, { "station": 1, "name": "Q3", "times": 1, "count": 0, "status": 1 }, { "station": 1, "name": "", "times": 1, "count": 0, "status": 0 }, { "station": 1, "name": "", "times": 2, "count": 0, "status": 0 } ] } ``` ## 远程状态 上位机发送远程控制设置。 **命令字:** `0x5510` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | remotectl | bool | 是 | 远程控制的状态 | ### 请求示例 ```json { "remotectl": false } ``` 上位机发送远程控制查询。 **命令字:** `0x5511` date:无 控制器回复查询。 **命令字:** `0x5512` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | remotectl | bool | 远程控制的状态 | ### 响应示例 ```json { "remotectl": false } ``` ## 远程程序 上位机发送设置远程程序。 **命令字:** `0x5520` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | jobFile | array | 是 | 程序列表 | | jobFile[].name | string | 是 | 程序名称 | | jobFile[].times | int | 是 | 运行次数 | | interpolationMethod | int | 否 | 插补方法 | | absolutePosResolution | double | 否 | 绝对位置分辨率 | | stopTime | int | 否 | 暂停时间 | | runDelayTime | int | 否 | 运行延时时间 | | remoteDefaultSpeed | int | 否 | 远程模式速度 1-100% | ### 请求示例 ```json { "robot": 1, "jobFile": [ {"name": "Q1", "times": 3}, {"name": "Q2", "times": 3}, {"name": "", "times": 1}, {"name": "Q4", "times": 2}, {"name": "", "times": 1} ], "interpolationMethod": 4, "absolutePosResolution": 0.06, "stopTime": 5, "runDelayTime": 600, "remoteDefaultSpeed": 1 } ``` 上位机发送获取远程程序。 **命令字:** `0x5521` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器收到上位机查询程序名字时回复。 **命令字:** `0x5522` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobFile | array | 程序列表 | | jobFile[].name | string | 程序名称 | | jobFile[].times | int | 运行次数 | | remoteProgramNum | int | 远程程序个数 | ### 响应示例 ```json { "jobFile": [ {"name": "Q1", "times": 3}, {"name": "Q2", "times": 3}, {"name": "", "times": 1}, {"name": "Q4", "times": 2}, {"name": "", "times": 1}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0}, {"name": "", "times": 0} ], "remoteProgramNum": 10, "robot": 1 } ``` ## 远程模式参数设置 上位机发送远程模式参数设置。 **命令字:** `0x5530` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | waitingTime | double | 否 | IO 重复触发时间 | | reserveIsStart | int | 否 | 预约 IO 后自动启动运行:0-关,1-开 | | interpolationMethod | int | 否 | 插补方法 | | reserveTrgTime | double | 否 | 远程模式 IO 预约并启动时间(毫秒) | | absolutePosResolution | int | 否 | 绝对位置分辨率 | | stopTime | int | 否 | 暂停时间 | | runDelayTime | int | 否 | 运行延时时间 | | remoteDefaultSpeed | int | 否 | 远程模式速度 1-100% | ### 请求示例 ```json { "robot": 1, "waitingTime": 1, "reserveIsStart": 0, "interpolationMethod": 4, "reserveTrgTime": 200, "absolutePosResolution": 0.06, "stopTime": 5, "runDelayTime": 600, "remoteDefaultSpeed": 1 } ``` 上位机发送远程模式参数查询。 **命令字:** `0x5531` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复查询结果。 **命令字:** `0x5532` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | remoteDefaultSpeed | int | 远程模式速度 1-100% | | remoteProgramNum | int | 远程程序个数 | | reserveIsStart | bool | 预约 IO 后自动启动运行:0-关,1-开 | | waitingTime | int | IO 重复触发时间 | ### 响应示例 ```json { "remoteDefaultSpeed": 1.0, "remoteProgramNum": 10, "reserveIsStart": false, "waitingTime": 500 } ``` ## 远程 IO 功能界面设置 上位机发送设置 IO 功能界面。 **命令字:** `0x5540` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | remoteProgramNum | int | 是 | 远程 IO 数功能 | | inPort | object | 否 | IO 触发端口绑定 | | inPort.clearoutagekeep | int | 否 | 清除断电保存数据,绑定 IO 端口:0-无,1-端口1 | | inPort.faultReset | int | 否 | 清除报警,绑定 IO 端口 | | inPort.pause | int | 否 | 暂停,绑定 IO 端口 | | inPort.start | int | 否 | 启动,绑定 IO 端口 | | inPort.stop | int | 否 | 停止,绑定 IO 端口 | | inValue | object | 否 | IO 参数 | | inValue.clearoutagekeep | int | 否 | 清除断电保存数据,绑定 IO 端口触发所需状态:0-低电平有效,1-高电平有效 | | inValue.faultReset | int | 否 | 清除报警,绑定 IO 端口触发所需状态 | | inValue.pause | int | 否 | 暂停,绑定 IO 端口触发所需状态 | | inValue.start | int | 否 | 启动,绑定 IO 端口触发所需状态 | | inValue.stop | int | 否 | 停止,绑定 IO 端口触发所需状态 | | program | array | 否 | 程序列表 | | program[].port | int | 否 | 端口 | | program[].value | int | 否 | 值 | ### 请求示例 ```json { "inPort": { "clearoutagekeep": 0, "faultReset": 0, "pause": 0, "start": 8, "stop": 0 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1}, {"port": 0, "value": 1} ], "remoteProgramNum": 10, "robot": 1 } ``` IO 功能界面查询设置时,上位机发送下面命令。 **命令字:** `0x5541` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` IO 功能界面,控制器收到查询时回复。 **命令字:** `0x5542` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | remoteProgramNum | int | 远程 IO 数功能 | | inPort | object | IO 触发端口绑定:0-无,1-端口1 | | inPort.clearoutagekeep | int | 清除断电保存数据,绑定 IO 端口 | | inPort.faultReset | int | 清除报警,绑定 IO 端口 | | inPort.pause | int | 暂停,绑定 IO 端口 | | inPort.start | int | 启动,绑定 IO 端口 | | inPort.stop | int | 停止,绑定 IO 端口 | | inValue | object | IO 参数:0-低电平有效,1-高电平有效 | | inValue.clearoutagekeep | int | 清除断电保存数据,绑定 IO 端口触发所需状态 | | inValue.faultReset | int | 清除报警,绑定 IO 端口触发所需状态 | | inValue.pause | int | 暂停,绑定 IO 端口触发所需状态 | | inValue.start | int | 启动,绑定 IO 端口触发所需状态 | | inValue.stop | int | 停止,绑定 IO 端口触发所需状态 | | program | array | 程序列表 | | program[].name | string | 程序名称 | | program[].port | int | 端口 | | program[].value | int | 值 | | reserveTrgTime | int | IO 重复触发屏蔽时间 | ### 响应示例 ```json { "inPort": { "clearoutagekeep": 0, "faultReset": 0, "pause": 0, "start": 0, "stop": 0 }, "inValue": { "clearoutagekeep": 1, "faultReset": 1, "pause": 1, "start": 1, "stop": 1 }, "program": [ {"name": "Q1", "port": 0, "value": 1}, {"name": "Q2", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "Q4", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1}, {"name": "", "port": 0, "value": 1} ], "remoteProgramNum": 10, "reserveTrgTime": 500, "robot": 1 } ``` ## 远程 IO 状态 上位机发送远程状态提示设置。 **命令字:** `0x5550` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | | output | array | 是 | 输出端口列表 | | output[].program1 ~ program10 | int | 否 | 远程 IO 程序 1-10 的输出端口编号 | | output[].program_value1 ~ program_value10 | int | 否 | 对应每个远程 IO 程序的输出端口值 | ### 请求示例 ```json { "robot": 1, "output": [ { "program1": 1, "program2": 2, "program3": 3, "program4": 4, "program5": 5, "program6": 6, "program7": 7, "program8": 8, "program9": 9, "program10": 10, "program_value1": 1, "program_value2": 2, "program_value3": 3, "program_value4": 4, "program_value5": 5, "program_value6": 6, "program_value7": 7, "program_value8": 8, "program_value9": 9, "program_value10": 10 } ] } ``` 上位机查询远程状态提示设置。 **命令字:** `0x5551` ### 请求参数 | 参数名 | 类型 | 必填 | 描述 | |--------|------|------|------| | robot | int | 是 | 选择机器人,取值范围 [1,4] | ### 请求示例 ```json { "robot": 1 } ``` 控制器回复查询结果。 **命令字:** `0x5552` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | output | array | 输出端口列表 | | output[].program1 ~ program10 | int | 远程 IO 程序 1-10 的输出端口编号 | | output[].program_value1 ~ program_value10 | int | 对应每个远程 IO 程序的输出端口值 | ### 响应示例 ```json { "robot": 1, "output": [ { "program1": 1, "program2": 2, "program3": 3, "program4": 4, "program5": 5, "program6": 6, "program7": 7, "program8": 8, "program9": 9, "program10": 10, "program_value1": 1, "program_value2": 2, "program_value3": 3, "program_value4": 4, "program_value5": 5, "program_value6": 6, "program_value7": 7, "program_value8": 8, "program_value9": 9, "program_value10": 10 } ] } ``` ## 远程模式连接状态 查询 Modbus、外部 IO 连接状态时,发送。 **命令字:** `0x5560` date:无 收到查询连接状态时,返回。 **命令字:** `0x5561` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | ModbusConnect | bool | Modbus 连接状态:false-未连接,true-已连接 | | ExternIOConnect | bool | 外部 IO 连接状态:false-未连接,true-已连接 | | type | int | 类型:0-NAN,1-RTU,2-TCP | ### 响应示例 ```json { "ModbusConnect": false, "ExternIOConnect": true, "type": 2 } ``` 控制器发送,是否通过 IO 修改了作业文件(外部按键触发修改作业文件时,控制器发送给上位机)。 **命令字:** `0x5562` ### 响应参数 | 参数名 | 类型 | 描述 | |--------|------|------| | isModify | bool | 是否通过 IO 修改了作业文件:true-是,false-否 | ### 响应示例 ```json { "isModify": false } ``` --- # 总线 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/01.%E6%80%BB%E7%BA%BF.html ## 概述 本控制器支持多种工业现场总线协议,包括 EtherCAT、CANopen 等。通过总线可以实现与伺服驱动器、IO 模块、传感器等从站设备的高速实时通信。 ### 支持的总线类型 | 总线类型 | 说明 | 典型用途 | |----------|------|----------| | EtherCAT | 基于以太网的实时总线 | 伺服控制、高速 IO | | CANopen | 基于 CAN 的现场总线 | 传感器、编码器、分布式 IO | ### 总线架构 ```text ┌─────────────┐ │ 控制器 │ (主站) └──────┬──────┘ │ EtherCAT / CAN bus │ ┌────┴────┬─────────┬──────────┐ │ │ │ │ ┌─┴──┐ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ │伺服│ │伺服 │ │ IO │ │交换 │ │ 1 │ │ 2 │ │模块 │ │ 机 │ └────┘ └─────┘ └─────┘ └─────┘ ``` ### EtherCAT 主站功能 | 功能 | 说明 | |------|------| | 从站扫描 | 自动识别总线上的从站设备 | | ENI 配置 | 通过 EtherCAT 网络信息文件配置从站 | | DC 时钟同步 | 分布式时钟同步,实现各从站精确同步 | | PDO 映射 | 过程数据对象映射,定义实时数据交换内容 | | 从站状态管理 | 监控从站运行状态,支持在线/离线检测 | --- ## CanOpen ### 0x7000 上位机查询该硬件的 can 支持的功能 **命令字:** `0x7000` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 端口号 | | function | Int | 该硬件 can 支持的功能,范围[0,3]
0-标准帧,1-扩展帧,2-远程帧,3-过滤 id | **请求示例:** ```json { "canPort": 1, "function": 0 } ``` --- ### 0x7001 控制器回复上位机查询该硬件的 can 支持的功能结果 **命令字:** `0x7001` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 端口号 | | support | Bool | 该硬件的 can 是否支持这功能 | **响应示例:** ```json { "canPort": 1, "support": true } ``` --- ### 0x7002 上位机设置 can 参数 **命令字:** `0x7002` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canBaud | UInt | can 通讯波特率(bps),常用值:125k, 250k, 500k, 1M | | canPort | UInt | can 通讯端口 | | enableRecvFiltert | Bool | 是否开启过滤 ID;开启后仅接收过滤 ID 匹配的帧 | | frameFormat | Int | 帧格式,范围[0,1]
0-标准帧(11位 ID),1-扩展帧(29位 ID) | | recvFilterId | UInt | 设置过滤 ID,仅 enableRecvFiltert=true 时生效 | **请求示例:** ```json { "canBaud": 500000, "canPort": 1, "enableRecvFiltert": true, "frameFormat": 0, "recvFilterId": 0x181 } ``` --- ### 0x7003 上位机请求接收一帧 can 数据 **命令字:** `0x7003` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | **请求示例:** ```json { "canPort": 1 } ``` --- ### 0x7004 控制器回复上位机接收一帧 can 数据结果 **命令字:** `0x7004` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | | data | UChar[] | 接收到的数据,长度为 Length 节点的值 | | Length | UInt | 接收到的数据长度 | | recvCanID | UInt | 接收到的帧 ID | **响应示例:** ```json { "canPort": 1, "data": [0x10, 0x20, 0x30], "Length": 3, "recvCanID": 0x181 } ``` --- ### 0x7005 上位机请求发送一帧数据 **命令字:** `0x7005` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | canPort | UInt | can 通讯端口 | | data | UChar[] | 需要发送的数据 | | sendCanID | UInt | 发送帧的 ID | | sendLen | UInt | 发送的数据长度,范围[1,8] | | useRemoteFrame | Bool | 是否使用远程帧;远程帧用于请求对方发送数据 | **请求示例:** ```json { "canPort": 1, "data": [0x10, 0x20], "sendCanID": 0x201, "sendLen": 2, "useRemoteFrame": false } ``` --- ## EtherCAT 总线配置 ### ENI 文件管理 ENI(EtherCAT Network Information)文件是 EtherCAT 总线配置的核心文件,描述了总线上所有从站的型号、数量、排列顺序及 PDO 映射信息。ENI 文件通常由专用配置工具生成(如 INEXBOT EC-Config),导入控制器后生效。 --- ### 0x7010 上位机查询 ENI 文件列表 **命令字:** `0x7010` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | num | Int | 获取 ENI 文件数目,范围[1,10]
1-获取当前使用的 ENI 文件,10-获取所有 ENI 文件 | **请求示例:** ```json { "num": 10 } ``` --- ### 0x7011 控制器回复上位机 ENI 文件列表 **命令字:** `0x7011` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIfilelist | String[] | 控制器 ENI 文件列表 | | ENIfilenum | Int | ENI 文件数目 | | absolutepath | String | 控制器中 ENI 文件所在文件夹 | **响应示例:** ```json { "ENIfilelist": [ "INEXBOT-IO-R4-1.xml", "DST_X503-1.json", "DST_X503-1.xml", "KunWeiTech_FT_Sensors-1.xml", "P140000107-1.0.1.1-ECXML-1.xml" ], "ENIfilenum": 5, "absolutepath": "eni/" } ``` --- ### 0x7012 上位机查询 ENI 参数 **命令字:** `0x7012` **请求参数:**(无) ```json {} ``` --- ### 0x7013 控制器回复上位机 ENI 参数 **命令字:** `0x7013` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIName | String | 当前使用的 ENI 文件名称 | | isHaveENI | Int | ENI 文件识别结果,范围[-1,1]
-1-无 ENI 文件,0-未识别到对应 ENI,1-识别到 ENI 文件 | **响应示例:** ```json { "ENIName": "eni-RC-6-mecat-1-1000.xml", "isHaveENI": 1 } ``` --- ### 0x7014 上位机设置当前使用的 ENI 文件 **命令字:** `0x7014` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | ENIName | String | 要激活的 ENI 文件名 | **请求示例:** ```json { "ENIName": "eni-RC-6-mecat-1-1000.xml" } ``` > ⚠️ 切换 ENI 文件后,控制器需要重新初始化 EtherCAT 总线。切换前请确认机器人处于安全状态。 --- ## 从站管理 ### 0x7020 上位机查询从站列表 **命令字:** `0x7020` **请求参数:**(无) ```json {} ``` --- ### 0x7021 控制器回复上位机从站列表 **命令字:** `0x7021` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | IONum | Int[] | IO 从站列表(0-非 IO 从站,非0-IO 从站索引) | | servoNum | Int[] | 伺服从站列表(0-非伺服从站,非0-伺服索引) | | switchNum | Int[] | 交换机列表(0-非交换机,非0-交换机索引) | | slaveType | String[] | 从站中文名称列表 | | slaveTypeEnglish | String[] | 从站英文名称列表 | **响应示例:** ```json { "IONum": [0, 0, 0, 0, 0, 0], "servoNum": [1, 2, 3, 4, 5, 6], "switchNum": [0, 0, 0, 0, 0, 0], "slaveType": ["禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E", "禾川X3E"], "slaveTypeEnglish": ["hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e", "hcfa_x3e"] } ``` > 从站列表按总线拓扑顺序排列(从站 0 为离主站最近的设备),`servoNum`、`IONum`、`switchNum` 分别表示该位置的从站类型和编号。 --- ## 从站状态监控 ### 0x7023 上位机查询从站状态 **命令字:** `0x7023` **请求参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveIndex | int | 从站索引号,-1 表示查询所有从站 | **请求示例:** ```json { "slaveIndex": -1 } ``` --- ### 0x7024 控制器回复从站状态 **命令字:** `0x7024` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveStates | object[] | 从站状态列表 | | slaveStates[].index | int | 从站索引 | | slaveStates[].ethercatState | int | EtherCAT 状态机:1-INIT,2-PREOP,4-SAFEOP,8-OP | | slaveStates[].online | bool | 在线状态:true-在线,false-离线 | | slaveStates[].errorCode | int | 错误码,0-正常 | | slaveStates[].txErrors | int | 发送错误计数 | | slaveStates[].rxErrors | int | 接收错误计数 | | slaveStates[].alStatusCode | int | AL 状态码(应用层状态码) | #### EtherCAT 状态机说明 | 状态 | 值 | 说明 | |------|---|------| | INIT | 1 | 初始化状态,仅完成基础通讯 | | PREOP | 2 | 预运行状态,可进行邮箱通讯和参数配置 | | SAFEOP | 4 | 安全运行状态,可进行输入数据读取,输出保持安全值 | | OP | 8 | 运行状态,可进行完整的输入/输出数据交换 | **响应示例:** ```json { "slaveStates": [ { "index": 0, "ethercatState": 8, "online": true, "errorCode": 0, "txErrors": 0, "rxErrors": 0, "alStatusCode": 0 }, { "index": 1, "ethercatState": 8, "online": true, "errorCode": 0, "txErrors": 0, "rxErrors": 0, "alStatusCode": 0 } ] } ``` --- ### 0x7025 控制器主动上报从站状态变化 **命令字:** `0x7025` 当任何从站状态发生变化(在线/离线、状态机切换、错误发生)时,控制器主动推送。 **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | slaveIndex | int | 从站索引 | | oldState | int | 旧状态 | | newState | int | 新状态 | | errorCode | int | 错误码 | | timestamp | string | 状态变化时间 | **响应示例:** ```json { "slaveIndex": 2, "oldState": 8, "newState": 4, "errorCode": 0, "timestamp": "2024-03-15T14:30:05Z" } ``` --- ## 总线状态监控 ### 0x7026 上位机查询总线状态 **命令字:** `0x7026` **请求参数:**(无) ```json {} ``` --- ### 0x7027 控制器回复总线状态 **命令字:** `0x7027` **响应参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | busState | int | 总线状态:0-未初始化,1-初始化中,2-运行中,3-错误 | | cycleTime | int | 总线周期时间(us) | | slaveCount | int | 已识别的从站总数 | | onlineCount | int | 在线从站数 | | dcInSync | bool | DC 时钟同步状态 | | masterState | int | 主站状态码 | **响应示例:** ```json { "busState": 2, "cycleTime": 1000, "slaveCount": 6, "onlineCount": 6, "dcInSync": true, "masterState": 8 } ``` --- ### 0x7022 上位机请求控制器切换系统 **命令字:** `0x7022` **请求参数:**(无) ```json {} ``` > 切换系统用于在多个 ENI 配置方案之间切换,切换后控制器重新初始化总线。 --- ## 常见问题 ### 总线故障排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 从站离线 | 网线松动或断开 | 检查 EtherCAT 网线连接 | | 从站离线 | 从站设备断电 | 检查从站电源 | | 从站不在 OP 状态 | ENI 文件与实际从站不匹配 | 确认 ENI 文件与硬件配置一致 | | 从站不在 OP 状态 | 从站固件版本不兼容 | 升级从站固件或更新 ESI 文件 | | 总线初始化失败 | ENI 文件损坏 | 重新导入有效的 ENI 文件 | | DC 同步失败 | 从站不支持 DC | 在配置工具中禁用该从站的 DC 功能 | | 总线周期超时 | 从站数量过多 | 减少不必要的从站,或增大周期时间 | | 通讯错误累积 | 电磁干扰 | 检查屏蔽和接地 | ### 维护建议 - 定期检查从站在线状态(`0x7023`),监控 `txErrors`/`rxErrors` 计数 - 总线运行中勿插拔网线或从站设备 - 更换从站设备后需确认 ENI 配置匹配 - 保持 ENI 文件与硬件配置同步更新 --- # IO > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/02.IO.html ## 状态提示 > **说明:** 提示端口范围最大均为当前绑定的 IO 数量;输出方式范围均为[0,2],0为0,1为1,2为闪烁 ### 上位机IO配置设置状态提示参数 **命令字:** `0x7100` > **说明:** 上位机通过此命令设置状态提示参数。实际设置帧可同时包含编码器电池欠压、机器人状态及全局状态提示参数。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | encoder_battery_undervoltage_port | int | 编码器电池欠压状态提示端口 | | encoder_battery_undervoltage_value | int | 编码器电池欠压状态输出方式,范围[0,2] | | outPut | array | 机器人状态提示参数列表,长度为4 | | outPut[].IOenable | int | 机器人上电状态提示端口 | | outPut[].IOenable_value | int | 机器人上电状态输出方式,范围[0,2] | | outPut[].continuable | int | 机器人可继续执行状态提示端口 | | outPut[].continuable_value | int | 机器人可继续执行状态输出方式,范围[0,2] | | outPut[].fault | int | 机器人报错提示状态提示端口 | | outPut[].faultIsFickler | int | 机器人报错提示状态输出方式,范围[0,2] | | outPut[].mainJobFirstLine | int | 机器人主程序首行状态提示端口 | | outPut[].mainJobFirstLine_value | int | 机器人主程序首行状态输出方式,范围[0,2] | | outPut[].pause | int | 机器人暂停状态提示端口 | | outPut[].pause_value | int | 机器人暂停状态输出方式,范围[0,2] | | outPut[].quickStopOut1 | int | 机器人紧急停止1状态提示端口 | | outPut[].quickStopOut2 | int | 机器人紧急停止2状态提示端口 | | outPut[].quickStopOutValue1 | int | 机器人紧急停止1状态输出方式,范围[0,2] | | outPut[].quickStopOutValue2 | int | 机器人紧急停止2状态输出方式,范围[0,2] | | outPut[].resetPort | int | 机器人复位状态提示端口 | | outPut[].resetValue | int | 机器人复位状态输出方式,范围[0,2] | | outPut[].running | int | 机器人运行状态提示端口 | | outPut[].running_value | int | 机器人运行状态输出方式,范围[0,2] | | outPut[].stop | int | 机器人停止状态提示端口 | | outPut[].stop_value | int | 机器人停止状态输出方式,范围[0,2] | | outPut[].teachBoxStateOut | int | 拔出示教盒输出端口(仅存在于机器人1) | | outPut[].teachBoxStateOutValue | int | 拔出示教盒输出方式,范围[0,2](仅存在于机器人1) | | outPut[].zeroPort | int | 机器人零点状态提示端口 | | outPut[].zeroValue | int | 机器人零点状态输出方式,范围[0,2] | | remoteOut | int | 远程模式状态提示端口 | | remoteOut_value | int | 远程模式状态输出方式,范围[0,2] | | runOut | int | 运动模式状态提示端口 | | runOut_value | int | 运动模式状态输出方式,范围[0,2] | | startUp | int | 开机状态提示端口 | | startUp_value | int | 开机状态输出方式,范围[0,2] | | teachOut | int | 示教模式状态提示端口 | | teachOut_value | int | 示教模式状态输出方式,范围[0,2] | **请求示例:** ```json { "encoder_battery_undervoltage_port": 0, "encoder_battery_undervoltage_value": 1, "outPut": [ { "IOenable": 0, "IOenable_value": 1, "continuable": 0, "continuable_value": 1, "fault": 0, "faultIsFickler": 0, "mainJobFirstLine": 0, "mainJobFirstLine_value": 1, "pause": 0, "pause_value": 1, "quickStopOut1": 0, "quickStopOut2": 0, "quickStopOutValue1": 1, "quickStopOutValue2": 1, "resetPort": 0, "resetValue": 1, "running": 0, "running_value": 1, "stop": 0, "stop_value": 1, "teachBoxStateOut": 0, "teachBoxStateOutValue": 1, "zeroPort": 0, "zeroValue": 1 }, { "IOenable": 0, "IOenable_value": 1, "continuable": 0, "continuable_value": 1, "fault": 0, "faultIsFickler": 0, "mainJobFirstLine": 0, "mainJobFirstLine_value": 1, "pause": 0, "pause_value": 1, "quickStopOut1": 0, "quickStopOut2": 0, "quickStopOutValue1": 1, "quickStopOutValue2": 1, "resetPort": 0, "resetValue": 1, "running": 0, "running_value": 1, "stop": 0, "stop_value": 1, "zeroPort": 0, "zeroValue": 1 }, { "IOenable": 0, "IOenable_value": 0, "continuable": 0, "continuable_value": 0, "fault": 0, "faultIsFickler": 0, "mainJobFirstLine": 0, "mainJobFirstLine_value": 0, "pause": 0, "pause_value": 0, "quickStopOut1": 0, "quickStopOut2": 0, "quickStopOutValue1": 0, "quickStopOutValue2": 0, "resetPort": 0, "resetValue": 0, "running": 0, "running_value": 0, "stop": 0, "stop_value": 0, "zeroPort": 0, "zeroValue": 0 }, { "IOenable": 0, "IOenable_value": 0, "continuable": 0, "continuable_value": 0, "fault": 0, "faultIsFickler": 0, "mainJobFirstLine": 0, "mainJobFirstLine_value": 0, "pause": 0, "pause_value": 0, "quickStopOut1": 0, "quickStopOut2": 0, "quickStopOutValue1": 0, "quickStopOutValue2": 0, "resetPort": 0, "resetValue": 0, "running": 0, "running_value": 0, "stop": 0, "stop_value": 0, "zeroPort": 0, "zeroValue": 0 } ], "remoteOut": 0, "remoteOut_value": 1, "runOut": 0, "runOut_value": 1, "startUp": 0, "startUp_value": 1, "teachOut": 0, "teachOut_value": 1 } ``` ### 上位机查询状态提示参数 **命令字:** `0x7101` > **说明:** 上位机发送空 JSON 对象查询当前状态提示参数;控制器使用 `0x7102` 返回查询结果。 **请求示例:** ```json {} ``` ### 控制器回复上位机状态提示参数 **命令字:** `0x7102` > **说明:** 控制器使用此命令回复当前状态提示参数。根据已采集的通讯帧,`0x7100` 设置帧包含 4 个 `outPut` 项,`0x7102` 回复帧包含 2 个 `outPut` 项;本文示例分别保持该实际帧结构。 **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | encoder_battery_undervoltage_port | int | 编码器电池欠压状态提示端口 | | encoder_battery_undervoltage_value | int | 编码器电池欠压状态输出方式,范围[0,2] | | outPut | array | 机器人状态提示参数列表;已采集的 `0x7102` 回复帧中包含2项 | | outPut[].IOenable | int | 机器人上电状态提示端口 | | outPut[].IOenable_value | int | 机器人上电状态输出方式,范围[0,2] | | outPut[].continuable | int | 机器人可继续执行状态提示端口 | | outPut[].continuable_value | int | 机器人可继续执行状态输出方式,范围[0,2] | | outPut[].fault | int | 机器人报错状态提示端口 | | outPut[].faultIsFickler | int | 机器人报错状态输出方式,范围[0,2] | | outPut[].mainJobFirstLine | int | 机器人主程序首行状态提示端口 | | outPut[].mainJobFirstLine_value | int | 机器人主程序首行状态输出方式,范围[0,2] | | outPut[].pause | int | 机器人暂停状态提示端口 | | outPut[].pause_value | int | 机器人暂停状态输出方式,范围[0,2] | | outPut[].quickStopOut1 | int | 机器人紧急停止1状态提示端口 | | outPut[].quickStopOut2 | int | 机器人紧急停止2状态提示端口 | | outPut[].quickStopOutValue1 | int | 机器人紧急停止1状态输出方式,范围[0,2] | | outPut[].quickStopOutValue2 | int | 机器人紧急停止2状态输出方式,范围[0,2] | | outPut[].resetPort | int | 机器人复位状态提示端口 | | outPut[].resetValue | int | 机器人复位状态输出方式,范围[0,2] | | outPut[].running | int | 机器人运行状态提示端口 | | outPut[].running_value | int | 机器人运行状态输出方式,范围[0,2] | | outPut[].stop | int | 机器人停止状态提示端口 | | outPut[].stop_value | int | 机器人停止状态输出方式,范围[0,2] | | outPut[].teachBoxStateOut | int | 示教盒状态提示端口 | | outPut[].teachBoxStateOutValue | int | 示教盒状态输出方式,范围[0,2] | | outPut[].zeroPort | int | 机器人零点状态提示端口 | | outPut[].zeroValue | int | 机器人零点状态输出方式,范围[0,2] | | remoteOut | int | 远程模式状态提示端口 | | remoteOut_value | int | 远程模式状态输出方式,范围[0,2] | | runOut | int | 运动模式状态提示端口 | | runOut_value | int | 运动模式状态输出方式,范围[0,2] | | startUp | int | 开机状态提示端口 | | startUp_value | int | 开机状态输出方式,范围[0,2] | | teachOut | int | 示教模式状态提示端口 | | teachOut_value | int | 示教模式状态输出方式,范围[0,2] | **响应示例:** ```json { "encoder_battery_undervoltage_port": 0, "encoder_battery_undervoltage_value": 1, "outPut": [ { "IOenable": 0, "IOenable_value": 1, "continuable": 0, "continuable_value": 1, "fault": 0, "faultIsFickler": 0, "mainJobFirstLine": 0, "mainJobFirstLine_value": 1, "pause": 0, "pause_value": 1, "quickStopOut1": 0, "quickStopOut2": 0, "quickStopOutValue1": 1, "quickStopOutValue2": 1, "resetPort": 0, "resetValue": 1, "running": 0, "running_value": 1, "stop": 0, "stop_value": 1, "teachBoxStateOut": 0, "teachBoxStateOutValue": 1, "zeroPort": 0, "zeroValue": 1 }, { "IOenable": 0, "IOenable_value": 1, "continuable": 0, "continuable_value": 1, "fault": 0, "faultIsFickler": 0, "mainJobFirstLine": 0, "mainJobFirstLine_value": 1, "pause": 0, "pause_value": 1, "quickStopOut1": 0, "quickStopOut2": 0, "quickStopOutValue1": 1, "quickStopOutValue2": 1, "resetPort": 0, "resetValue": 1, "running": 0, "running_value": 1, "stop": 0, "stop_value": 1, "zeroPort": 0, "zeroValue": 1 } ], "remoteOut": 0, "remoteOut_value": 1, "runOut": 0, "runOut_value": 1, "startUp": 0, "startUp_value": 1, "teachOut": 0, "teachOut_value": 1 } ``` ## IO 复位 > **说明:** "enable"与"value"节点长度均为128,实际有效数据为当前 IO 的总端口数,超过部分默认为0 ### 上位机设置 IO 复位参数 **命令字:** `0x7110` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 是否复位;bool 类型,长度128 | | robot | int | 需要设置的机器人号,范围[1,4] | | type | int | 需要设置的复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | | value | array | 输出端口复位值;int 类型,范围[0,1],长度128 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "robot":1, "type":1, "value":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` ### 上位机查询 IO 复位参数 **命令字:** `0x7111` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 需要查询的机器人号,范围[1,4] | | type | int | 需要查询的复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | **请求示例:** ```json { "robot":1, "type":1 } ``` ### 控制器回复上位机 IO 复位参数 **命令字:** `0x7112` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 是否复位;bool 类型,长度128 | | robot | int | 机器人号,范围[1,4] | | type | int | 复位类型,范围[1,3]
1:远程 IO 复位
2:切模式停止
3:程序报错 | | value | array | 输出端口复位值;int 类型,范围[0,1],长度128 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "robot":1, "type":1, "value":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } ``` ## IO 功能状态 ### 上位机查询 IO 功能状态 **命令字:** `0x7120` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | type | int | IO 状态类型,范围[1,4]
1:数字输入
2:数字输出
3:模拟输入
4:模拟输出 | **请求示例:** ```json { "type":1 } ``` ### 控制器回复上位机 IO 功能状态 **命令字:** `0x7121` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | IOFunction | array | IO 功能列表;string 类型,长度为当前 IO 端口数量 | | type | int | IO 状态类型,范围[1,4]
1:数字输入
2:数字输出
3:模拟输入
4:模拟输出 | **响应示例:** ```json { "IOFunction":["","","","","拖拽:拖拽示教外部触发信号 ","","","", "","","","","","使能硬接线端口1 ","安全:机器人1紧急停止1 安全:机器人2紧急停止1 ","", "","远程:机器人1启动 远程:机器人1程序1选择 ","","","","","","", "","","","","","","",""], "type":1 } ``` ## IO 配置 > **说明:** 串口模拟 IO 参数(若 EtherCAT IO 板有模拟 IO,则该串口模拟 IO 将无效) ### 上位机设置 IO 配置参数 **命令字:** `0x7130` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | serialAnalog | object | 串行模拟参数 | | serialAnalog.baudRate | int | 波特率 | | serialAnalog.port | int | 端口号,范围(0,65535] | | serialAnalog.type | string | 模拟类型
"DAC_ANAIO":DAC 模拟 IO 板
"SUPER_ANAIO":格控模拟 IO 板 | | simuNum | int | 虚拟 IO 数量,范围[0,4] | **请求示例:** ```json { "serialAnalog": { "baudRate":115200, "port":2, "type":"SUPER_ANAIO" }, "simuNum":2 } ``` ### 上位机查询 IO 配置参数 **命令字:** `0x7131` **请求示例:** ```json {} ``` ### 控制器回复上位机 IO 配置参数 **命令字:** `0x7132` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | IO 数量(包含实体 IO 和虚拟 IO 的总数量) | | portNum | array | 各 IO 端口数二维数组;int 类型
一维为 IO 号,二维依次为:数字输入端口数、数字输出端口数、模拟输入端口数、模拟输出端口数 | | serialAnalog | object | 串行模拟参数 | | serialAnalog.baudRate | int | 波特率 | | serialAnalog.port | int | 端口号,范围(0,65535] | | serialAnalog.type | string | 模拟类型 | | simuNum | int | 虚拟 IO 数量,范围[0,4] | | type | array | 已连接 IO 板型号列表;string 类型 | **响应示例:** ```json { "num":2, "portNum": [ [16,16,2,2], [16,16,2,2] ], "serialAnalog": { "baudRate":115200, "port":2, "type":"SUPER_ANAIO" }, "simuNum":2, "type":["虚拟IO","虚拟IO"] } ``` ## 安全设置 ### 上位机设置安全设置参数 **命令字:** `0x7140` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | TwoStepActivation | object | 两步使能参数 | | TwoStepActivation.enable | bool | 两步使能开关 | | TwoStepActivation.port | int | 两步使能数字输入端口 | | TwoStepActivation.time | double | 两步使能有效时间,单位 ms | | TwoStepActivation.value | int | 两步使能数字输入值,范围[0,1] | | quickStop | object | 紧急停止参数 | | quickStop.enable | bool | 紧急停止使能 | | quickStop.port1 | int | 紧急停止1数字输入端口 | | quickStop.port2 | int | 紧急停止2数字输入端口 | | quickStop.shieldFlag1 | bool | 屏蔽紧急停止1 | | quickStop.shieldFlag2 | bool | 屏蔽紧急停止2 | | quickStop.shieldTime | int | 屏蔽紧急停止时间,范围[0,100000)s | | quickStop.time | double | 快速停止时间,范围[50,200]ms | | quickStop.value1 | int | 紧急停止1数字输入参数,范围[0,1] | | quickStop.value2 | int | 紧急停止2数字输入参数,范围[0,1] | | robot | int | 需要设置的机器人号,范围[1,4] | | safeScreen | object | 安全光幕参数 | | safeScreen.enable | bool | 安全光幕使能 | | safeScreen.port1 | int | 安全光幕1数字输入端口 | | safeScreen.port2 | int | 安全光幕2数字输入端口 | | safeScreen.value1 | int | 安全光幕1数字输入参数,范围[0,1] | | safeScreen.value2 | int | 安全光幕2数字输入参数,范围[0,1] | **请求示例:** ```json { "TwoStepActivation": { "enable": false, "port": 0, "time": 30.0, "value": 0 }, "quickStop": { "enable":true, "port1":15, "port2":0, "shieldFlag1":false, "shieldFlag2":true, "shieldTime":30, "time":60.0, "value1":1, "value2":1 }, "robot":1, "safeScreen": { "enable":true, "port1":8, "port2":0, "value1":1, "value2":1 } } ``` ### 上位机查询安全设置参数 **命令字:** `0x7141` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | robot | int | 需要查询的机器人号,范围[1,4] | **请求示例:** ```json { "robot":1 } ``` ### 控制器回复上位机安全设置参数 **命令字:** `0x7142` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | TwoStepActivation | object | 两步使能参数 | | TwoStepActivation.enable | bool | 两步使能开关 | | TwoStepActivation.port | int | 两步使能数字输入端口 | | TwoStepActivation.time | double | 两步使能有效时间,单位 ms | | TwoStepActivation.value | int | 两步使能数字输入值,范围[0,1] | | quickStop | object | 紧急停止参数 | | quickStop.enable | bool | 紧急停止使能 | | quickStop.port1 | int | 紧急停止1数字输入端口 | | quickStop.port2 | int | 紧急停止2数字输入端口 | | quickStop.shieldFlag1 | bool | 屏蔽紧急停止1 | | quickStop.shieldFlag2 | bool | 屏蔽紧急停止2 | | quickStop.shieldTime | int | 屏蔽紧急停止时间,范围[0,100000)s | | quickStop.time | double | 快速停止时间,范围[50,200]ms | | quickStop.value1 | int | 紧急停止1数字输入参数,范围[0,1] | | quickStop.value2 | int | 紧急停止2数字输入参数,范围[0,1] | | robot | int | 机器人号,范围[1,4] | | safeScreen | object | 安全光幕参数 | | safeScreen.enable | bool | 安全光幕使能 | | safeScreen.port1 | int | 安全光幕1数字输入端口 | | safeScreen.port2 | int | 安全光幕2数字输入端口 | | safeScreen.value1 | int | 安全光幕1数字输入参数,范围[0,1] | | safeScreen.value2 | int | 安全光幕2数字输入参数,范围[0,1] | **响应示例:** ```json { "TwoStepActivation": { "enable": false, "port": 0, "time": 30.0, "value": 0 }, "quickStop": { "enable":true, "port1":15, "port2":0, "shieldFlag1":false, "shieldFlag2":true, "shieldTime":30, "time":60.0, "value1":1, "value2":1 }, "robot":1, "safeScreen": { "enable":true, "port1":8, "port2":0, "value1":1, "value2":1 } } ``` ## 端口触发信息 > **说明:** 在端口被触发时控制器向上位机发送设置的信息进行提示 ### 上位机设置数字输入端口触发信息 **命令字:** `0x7150` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2]
0:消息
1:警告
2:错误,长度32 | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机查询数字输入端口触发信息 **命令字:** `0x7151` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入触发信息 **命令字:** `0x7152` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机设置数字输出端口触发信息 **命令字:** `0x7153` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **请求示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ### 上位机查询数字输出端口触发信息 **命令字:** `0x7154` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出触发信息 **命令字:** `0x7155` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | array | 信息触发使能;int 类型,范围[0,1],长度32 | | msg | array | 信息触发发送的消息;string 类型,长度32 | | msgType | array | 信息触发类型;int 类型,范围[0,2] | | value | array | 信息触发参数;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "enable":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], "msg":["","","","","","","","","","","","","","","","","","","","","AAAAA","","","","","","","","","","",""], "msgType":[0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2], "value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ``` ## 端口名称 > **说明:** 对端口名称进行重命名 ### 上位机设置数字输入端口名称 **命令字:** `0x7160` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的数字输入端口名称列表;string 类型 | **请求示例:** ```json { "name":["AAA","","","","","","","","","","","","","BBB","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机查询数字输入端口名称 **命令字:** `0x7161` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入端口名称 **命令字:** `0x7162` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的数字输入端口名称列表;string 类型 | **响应示例:** ```json { "name":["AAA","","","","","","","","","","","","","BBB","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机设置数字输出端口名称 **命令字:** `0x7163` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的数字输出端口名称列表;string 类型 | **请求示例:** ```json { "name":["","","","","","VV","","","","","","","","","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机查询数字输出端口名称 **命令字:** `0x7164` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出端口名称 **命令字:** `0x7165` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的数字输出端口名称列表;string 类型 | **响应示例:** ```json { "name":["","","","","","VV","","","","","","","","","","","","","","","","","","","","","","","","","",""] } ``` ### 上位机设置模拟输入端口名称 **命令字:** `0x7166` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的模拟输入端口名称列表;string 类型 | **请求示例:** ```json { "name":["","UY","",""] } ``` ### 上位机查询模拟输入端口名称 **命令字:** `0x7167` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输入端口名称 **命令字:** `0x7168` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的模拟输入端口名称列表;string 类型 | **响应示例:** ```json { "name":["","UY","",""] } ``` ### 上位机设置模拟输出端口名称 **命令字:** `0x7169` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 设置的模拟输出端口名称列表;string 类型 | **请求示例:** ```json { "name":["TY","","",""] } ``` ### 上位机查询模拟输出端口名称 **命令字:** `0x716A` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输出端口名称 **命令字:** `0x716B` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | name | array | 已设置的模拟输出端口名称列表;string 类型 | **响应示例:** ```json { "name":["TY","","",""] } ``` ## 输入输出 ### 上位机设置数字输出值 **命令字:** `0x7180` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | int | 要设置的端口号 | | status | int | 要设置的数字输出值,范围[0,2]
0:输出0
1:输出1
2:将输出值翻转(例:原本输出1现在输出0) | **请求示例:** ```json { "port":1, "status":1 } ``` ### 上位机查询数字输出值 **命令字:** `0x7181` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输出值 **命令字:** `0x7182` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | status | array | 数字输出状态列表;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "status":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0] } ``` ### 上位机查询数字输入值 **命令字:** `0x7183` **请求示例:** ```json {} ``` ### 控制器回复上位机数字输入值 **命令字:** `0x7184` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | status | array | 数字输入状态列表;int 类型,范围[0,1],长度32 | **响应示例:** ```json { "status":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0] } ``` ### 上位机设置模拟输出值 **命令字:** `0x7185` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | int | 要设置的端口号 | | value | double | 要设置的模拟输出值(该节点数值不小于0) | **请求示例:** ```json { "port":1, "value":8.880 } ``` ### 上位机查询模拟输出值 **命令字:** `0x7186` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输出值 **命令字:** `0x7187` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | value | array | 模拟输出当前值;double 类型 | **响应示例:** ```json { "value":[8.87939453125,0.0,0.0,0.0] } ``` ### 上位机查询模拟输入值 **命令字:** `0x7188` **请求示例:** ```json {} ``` ### 控制器回复上位机模拟输入值 **命令字:** `0x7189` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | value | array | 模拟输入当前值;double 类型 | **响应示例:** ```json { "value":[9.99755859375,0.0,0.0,0.0] } ``` ## 强制输入 ### 上位机设置强制数字输入 **命令字:** `0x7190` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | int | 是否强制数字输入,范围[0,1] | | port | int | 强制数字输入的端口号 | | status | int | 强制数字输入的当前值 | **请求示例:** ```json { "enable":1, "port":1, "status":0 } ``` ### 上位机查询强制数字输入端口 **命令字:** `0x7191` **请求示例:** ```json {} ``` ### 控制器回复上位机强制数字输入端口 **命令字:** `0x7192` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | array | 强制数字输入的端口号;int 类型 | | status | array | 强制数字输入的值;int 类型 | **响应示例:** ```json { "port":[2,6,12], "status":[0,1,0] } ``` ### 上位机设置强制模拟输入 **命令字:** `0x7193` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | enable | int | 是否强制模拟输入,范围[0,1] | | port | int | 强制模拟输入的端口号 | | status | double | 强制模拟输入的当前值(该节点数值不小于0) | **请求示例:** ```json { "enable":1, "port":2, "status":9.0 } ``` ### 上位机查询强制模拟输入端口 **命令字:** `0x7194` **请求示例:** ```json {} ``` ### 控制器回复上位机强制模拟输入端口 **命令字:** `0x7195` **参数说明:** | 参数名 | 类型 | 说明 | |--------|------|------| | port | array | 强制数字输入的端口号;int 类型 | | status | array | 强制数字输入的值;double 类型 | **响应示例:** ```json { "port":[1,2], "status":[5.0,9.0] } ``` --- # 其他外设 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/03.%E5%85%B6%E4%BB%96%E5%A4%96%E8%AE%BE.html ## 编码器 ### 说明 上位机设置外部轴编码器溢值参数 **命令字:** `0x7200` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalAxis | array | - | 外部轴编码器最大值最小值参数列表,长度为当前外部轴轴数 | | encode | array | - | 编码器最大值最小值参数列表,长度为该轴从动轴数目+1 | | max | double | [-2^32, 2^32] | 编码器最大值 | | min | double | [-2^32, 2^32] | 编码器最小值 | | externalGroupNum | int | [1, 3] | 要设置参数的轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 请求示例 ```json { "externalAxis": [ { "encode": [ { "max": "100.0", "min": "-100.0" } ] } ], "externalGroupNum": 1, "robot": 2 } ``` --- ### 说明 上位机查询外部轴编码器溢值参数 **命令字:** `0x7201` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalGroupNum | int | [1, 3] | 要查询参数的轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 请求示例 ```json { "externalGroupNum": 1, "robot": 2 } ``` --- ### 说明 控制器回复上位机外部轴编码器溢值参数 **命令字:** `0x7202` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | externalAxis | array | - | 外部轴编码器最大值最小值参数列表,长度为当前外部轴轴数 | | enable | int | [0, 1] | 编码器多圈值溢出计数功能;0表示未开启,1表示已开启 | | encode | array | - | 编码器最大值最小值参数列表,长度为该轴从动轴数目+1 | | max | double | [-2^32, 2^32] | 编码器最大值 | | min | double | [-2^32, 2^32] | 编码器最小值 | | externalGroupNum | int | [1, 3] | 轴组号 | | robot | int | [1, 4] | 当前机器人号 | #### 响应示例 ```json { "externalAxis": [ { "enable": 0, "encode": [ { "max": "100.0", "min": "-100.0" } ] } ], "externalGroupNum": 1, "robot": 2 } ``` --- ## 外部接口 ### 说明 上位机查询外部接口数量 **命令字:** `0x7220` #### 请求示例 ```json {} ``` --- ### 说明 控制器回复上位机外部接口数量 **命令字:** `0x7221` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | canPortSum | int | 已连接 CAN 端口数量 | | encodorPortSum | int | 已连接编码器端口数量 | | pwmPortSum | int | 已连接 PWM 端口数量 | #### 响应示例 ```json { "canPortSum": 1, "encodorPortSum": 2, "pwmPortSum": 4 } ``` --- ## 硬盘 ### 说明 上位机查询硬盘状态 **命令字:** `0x7230` #### 请求示例 ```json {} ``` --- ### 说明 控制器回复上位机硬盘状态 **命令字:** `0x7231` #### 参数列表 | 字段名 | 类型 | 单位 | 说明 | |--------|------|------|------| | Estimated Available Time | int | h | 预计可用时间 | | get_harddisk_warning_time | int | h | 硬盘预警时间 | #### 响应示例 ```json { "Estimated Available Time": 200, "get_harddisk_warning_time": 500 } ``` --- ### 说明 上位机设置硬盘预警时间 **命令字:** `0x7232` #### 参数列表 | 字段名 | 类型 | 范围 | 单位 | 说明 | |--------|------|------|------|------| | set_harddisk_warning_time | int | (0, 9999) | h | 硬盘预警时间 | #### 请求示例 ```json { "set_harddisk_warning_time": 50 } ``` --- ## 伺服内部参数 ### 说明 控制器发送伺服内部参数时会十个参数为一组,分多次发送给上位机 ### 上位机设置伺服参数 **命令字:** `0x7240` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | robot | int | [1, 4] | 当前机器人号 | | servoNum | int | - | 需要设置的轴号 | | servo | object | - | 伺服内部参数列表;不同机型获取到参数不一致 | | value | int/double | - | 设置的参数值 | | temporary_save | int | [0, 1] | 是否为临时储存;0表示非临时储存,1表示临时储存 | #### 请求示例 ```json { "robot": 1, "servo": { "位置指令低通滤波器截止频率": { "value": 100.0 }, "位置环比例增益1": { "value": 1000.0 }, "位置环比例增益2": { "value": 1000.0 }, "位置环积分时间常数": { "value": 5000.0 }, "功率回路设定": { "value": 196616.0 }, "故障停止选项": { "value": 6.0 }, "电机反电势系数": { "value": 53.0 }, "电机抱闸保持力矩": { "value": 1000.0 }, "电机抱闸制动保持延迟时间": { "value": 100.0 }, "电机抱闸制动允许延迟时间": { "value": 500.0 }, "电机抱闸制动时间": { "value": 60.0 } }, "servoNum": 1, "temporary_save": 0 } ``` --- ### 上位机查询伺服内部参数 **命令字:** `0x7241` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号 | | servoNum | int | 需要查询的轴号 | #### 请求示例 ```json { "robot": 1, "servoNum": 1 } ``` --- ### 控制器回复上位机伺服内部参数 **命令字:** `0x7242` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | robot | int | 当前机器人号 | | servoNum | int | 查询的轴号 | | sendNum | int | 已发送参数数量 | | totalNum | int | 内部参数的总数量 | | servo | object | 伺服内部参数列表;不同机型获取到参数不一致 | #### servo 对象参数 | 字段名 | 类型 | 说明 | |--------|------|------| | hex | bool | 是否为十六进制 | | index | int | 地址 | | lowLimit | int | 最小限制 | | unit | string | 单位 | | upLimit | int | 最大限制 | | value | int/double | 参数值 | #### 响应示例 ```json { "robot": 1, "sendNum": 10, "servo": { "位置指令低通滤波器截止频率": { "hex": false, "index": 8299, "lowLimit": 1, "unit": "0.1HZ", "upLimit": 1000, "value": 100 }, "位置环比例增益1": { "hex": false, "index": 8256, "lowLimit": 0, "unit": "‰", "upLimit": 600000, "value": 1000 }, "位置环比例增益2": { "hex": false, "index": 8258, "lowLimit": 0, "unit": "‰", "upLimit": 600000, "value": 1000 }, "位置环积分时间常数": { "hex": false, "index": 8259, "lowLimit": 125, "unit": "us", "upLimit": 600000, "value": 5000 }, "功率回路设定": { "hex": true, "index": 8236, "lowLimit": 0, "unit": "", "upLimit": 196623, "value": 196616 }, "故障停止选项": { "hex": true, "index": 8339, "lowLimit": 0, "unit": "", "upLimit": 197379, "value": 0 }, "电机反电势系数": { "hex": false, "index": 8390, "lowLimit": 1, "unit": "mV/rpm", "upLimit": 10000, "value": 53 }, "电机抱闸保持力矩": { "hex": false, "index": 8756, "lowLimit": 1, "unit": "mNm", "upLimit": 600000, "value": 1000 }, "电机抱闸制动保持延迟时间": { "hex": false, "index": 8250, "lowLimit": 0, "unit": "ms", "upLimit": 10000, "value": 100 }, "电机抱闸制动允许延迟时间": { "hex": false, "index": 8254, "lowLimit": 0, "unit": "ms", "upLimit": 10000, "value": 500 } }, "servoNum": 1, "totalNum": 38 } ``` --- ## 星辰一号 ### 上位机查询编码器范围 **命令字:** `0x7250` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | #### 请求示例 ```json { "encodorPort": 1 } ``` --- ### 控制器回复上位机编码器范围 **命令字:** `0x7251` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | | encodorMax | int | 编码器范围最大值 | | encodorMin | int | 编码器范围最小值 | #### 响应示例 ```json { "encoderMax": 100, "encoderMin": 0, "encodorPort": 1 } ``` --- ### 上位机查询编码器值 **命令字:** `0x7252` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | #### 请求示例 ```json { "encodorPort": 1 } ``` --- ### 控制器回复上位机编码器值 **命令字:** `0x7253` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | encodorPort | UInt | 编码器端口号 | | encodorValue | int | 编码器值 | #### 响应示例 ```json { "encodorPort": 1, "encodorValue": 5 } ``` --- ## PWM ### 上位机设置 PWM 参数 **命令字:** `0x7260` #### 参数列表 | 字段名 | 类型 | 范围 | 说明 | |--------|------|------|------| | pwmPort | UInt | - | PWM 端口 | | duty | double | - | PWM 占空比 | | freq | double | - | PWM 频率 | | pwmOutTimeMs | UInt | [1000, 5000] ms | PWM 输出时间;输入0时则一直输出 PWM | #### 请求示例 ```json { "duty": 50, "freq": 1000, "pwmOutTimeMs": 1000, "pwmPort": 1 } ``` --- ### 上位机查询 PWM 参数 **命令字:** `0x7261` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | pwmPort | UInt | PWM 端口 | #### 请求示例 ```json { "pwmPort": 1 } ``` --- ### 控制器回复上位机 PWM 参数 **命令字:** `0x7262` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | pwmPort | UInt | PWM 端口 | | duty | double | PWM 占空比 | | freq | double | PWM 频率 | #### 响应示例 ```json { "duty": 50, "freq": 1000, "pwmPort": 1 } ``` --- ### 控制器回复上位机输出时间结果 **命令字:** `0x7263` #### 参数列表 | 字段名 | 类型 | 说明 | |--------|------|------| | ok | bool | 输出时间结果 | #### 响应示例 ```json { "ok": true } ``` --- # Modbus > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/04.Modbus.html ## 1. 上位机设置 modbus 主站参数 **命令字:** `0x7300` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | masterStation | object | 是 | 主站参数,包含 RTU 参数和 TCP 参数 | | startAddress | bool | 否 | 地址偏移;true 表示地址不变,false 表示地址自动-1 | #### masterStation 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 主站类型;取值"TCP","RTU" | | processNumber | int | 是 | 需要设置的工艺号;范围[1,9] | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | checkBit | string | 是 | 校验位;取值"N","E","O" | | dataBit | int | 是 | 数据位;范围[5,8] | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | | stopBit | int | 是 | 停止位;范围[0,1] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址 | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 请求示例 ```json { "masterStation": { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 2, "slaveId": 1, "stopBit": 1 }, "TCP": { "IP": "192.168.1.14", "endian_type": 1, "port": 503 }, "processNumber": 1, "type": "TCP" }, "startAddress": false } ``` --- ## 2. 上位机查询 modbus 参数 **命令字:** `0x7301` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 需要查询的工艺号;范围[1,9] | ### 请求示例 ```json { "processNumber": 1 } ``` --- ## 3. 控制器回复上位机 modbus 参数 **命令字:** `0x7302` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 主站类型;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | modbus_state | bool | 是 | Modbus 连接状态;true 表示已连接,false 表示未连接 | | response_time_out | int | 是 | 读写响应时间;单位 ms | | startAddress | bool | 是 | 地址偏移;true 表示地址不变,false 表示地址自动-1 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | checkBit | string | 是 | 校验位;取值"N","E","O" | | dataBit | int | 是 | 数据位;范围[5,8] | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | | stopBit | int | 是 | 停止位;范围[0,1] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址 | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 响应示例 ```json { "RTU": { "baudrate": 115200, "checkBit": "E", "dataBit": 5, "port": 2, "slaveId": 1, "stopBit": 1 }, "TCP": { "IP": "192.168.1.14", "endian_type": 1, "port": 503 }, "modbus_state": false, "response_time_out": 100, "startAddress": false, "type": "TCP" } ``` --- ## 4. 上位机查询 modbus 连接状态 **命令字:** `0x7303` ### 请求示例 ```json {} ``` --- ## 5. 控制器回复上位机 modbus 连接状态 **命令字:** `0x7304` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | ModbusConnect | bool | 是 | modbus 连接状态;true 表示已连接,false 表示未连接 | ### 响应示例 ```json { "ModbusConnect": false } ``` --- ## 6. 上位机设置 modbus 从站参数 **命令字:** `0x7305` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 通讯方式;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 | | scancycle | int | 是 | 扫描周期;范围[8,1000]ms | | stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址(默认值) | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 请求示例 ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "endian_type": 0, "port": 502 }, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` --- ## 7. 上位机查询 modbus 从站参数 **命令字:** `0x7306` ### 请求示例 ```json {} ``` --- ## 8. 控制器回复上位机 modbus 从站参数 **命令字:** `0x7307` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | type | string | 是 | 通讯方式;取值"TCP","RTU" | | RTU | object | 否 | RTU 参数 | | TCP | object | 否 | TCP 参数 | | enable | bool | 是 | 连接使能 | | master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 | | scancycle | int | 是 | 扫描周期;范围[8,1000]ms | | stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 | #### RTU 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | baudrate | int | 是 | 波特率 | | port | int | 是 | 端口号 | | slaveId | int | 是 | 从站 ID;范围[0,65535] | #### TCP 参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | IP | string | 是 | IP 地址(默认值) | | endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA | | port | int | 是 | 端口号;范围[0,65535] | ### 响应示例 ```json { "RTU": { "baudrate": 115200, "port": 2, "slaveId": 1 }, "TCP": { "IP": "192.168.1.11", "endian_type": 0, "port": 502 }, "enable": false, "master-slave": 1, "scancycle": 100, "stoprun": 0, "type": "TCP" } ``` --- ## 9. 上位机设置 modbus 从站连接使能 **命令字:** `0x7308` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | enable | bool | 是 | modbus 从站连接使能 | ### 请求示例 ```json { "enable": true } ``` --- ## 10. 上位机设置 modbus 从站心跳检测使能 **命令字:** `0x7309` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | checkheart | bool | 是 | 心跳检测使能 | ### 请求示例 ```json { "checkheart": true } ``` --- ## 11. 上位机查询 modbus 从站心跳检测使能 **命令字:** `0x703A` ### 请求示例 ```json {} ``` --- ## 12. 控制器回复上位机 modbus 从站心跳检测使能 **命令字:** `0x703B` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | checkheart | bool | 是 | 心跳检测使能 | ### 响应示例 ```json { "checkheart": true } ``` --- ## 13. 上位机设置 modbus 程序 **命令字:** `0x703C` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobname | string | 是 | 已选程序名称 | | programid | int | 是 | 程序序号;范围[1,300] | | robot | int | 是 | 当前机器人号 | ### 请求示例 ```json { "jobname": "AA", "programid": 1, "robot": 1 } ``` --- ## 14. 上位机查询 modbus 程序 **命令字:** `0x703D` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | num | int | 是 | 查询数量;固定为10 | | robot | int | 是 | 当前机器人号 | | startprogramid | int | 是 | 查询序列起始程序序号;范围[1,30] | ### 请求示例 ```json { "num": 10, "robot": 1, "startprogramid": 1 } ``` --- ## 15. 控制器回复上位机 modbus 程序 **命令字:** `0x703E` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | jobnamelist | array | 是 | 程序名称列表;长度为10 | | robot | int | 是 | 当前机器人号 | | startprogramid | int | 是 | 序列起始程序序号;范围[1,30] | | sum | int | 是 | 可选程序总数 | ### 响应示例 ```json { "jobnamelist": ["AA", "", "", "", "", "", "", "", "", ""], "robot": 1, "startprogramid": 1, "sum": 300 } ``` ## 16. 上位机 Modbus 读线圈(功能码 01H) **命令字:** `0x7310` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `1`(01H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 2000] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 1, "address": 0, "quantity": 10 } ``` ## 17. 控制器回复 Modbus 读线圈(功能码 01H) **命令字:** `0x7311` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `1`(01H) | | data | int[] | 是 | 读取到的线圈状态数组;值为 `0` 或 `1` | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 1, "data": [0, 1, 1, 0, 0, 1, 0, 1, 1, 0], "success": true } ``` ## 18. 上位机 Modbus 读输入状态(功能码 02H) **命令字:** `0x7312` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `2`(02H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 2000] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 2, "address": 100, "quantity": 16 } ``` ## 19. 控制器回复 Modbus 读输入状态(功能码 02H) **命令字:** `0x7313` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `2`(02H) | | data | int[] | 是 | 读取到的输入状态数组;值为 `0` 或 `1` | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 2, "data": [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1], "success": true } ``` ## 20. 上位机 Modbus 读保持寄存器(功能码 03H) **命令字:** `0x7314` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `3`(03H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 125] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 3, "address": 200, "quantity": 5 } ``` ## 21. 控制器回复 Modbus 读保持寄存器(功能码 03H) **命令字:** `0x7315` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `3`(03H) | | data | int[] | 是 | 读取到的保持寄存器值数组;范围 [0, 65535] | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 3, "data": [1234, 5678, 910, 1112, 1314], "success": true } ``` ## 22. 上位机 Modbus 读输入寄存器(功能码 04H) **命令字:** `0x7316` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `4`(04H) | | address | int | 是 | 起始地址 | | quantity | int | 是 | 读取数量;范围 [1, 125] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 4, "address": 300, "quantity": 8 } ``` ## 23. 控制器回复 Modbus 读输入寄存器(功能码 04H) **命令字:** `0x7317` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `4`(04H) | | data | int[] | 是 | 读取到的输入寄存器值数组;范围 [0, 65535] | | success | bool | 是 | 读取是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 4, "data": [100, 200, 300, 400, 500, 600, 700, 800], "success": true } ``` ## 24. 上位机 Modbus 写单个线圈(功能码 05H) **命令字:** `0x7318` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `5`(05H) | | address | int | 是 | 线圈地址 | | value | int | 是 | 写入值;`0` 或 `1` | ### 请求示例 ```json { "processNumber": 1, "functionCode": 5, "address": 10, "value": 1 } ``` ## 25. 控制器回复 Modbus 写单个线圈(功能码 05H) **命令字:** `0x7319` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `5`(05H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 5, "success": true } ``` ## 26. 上位机 Modbus 写单个保持寄存器(功能码 06H) **命令字:** `0x731A` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `6`(06H) | | address | int | 是 | 寄存器地址 | | value | int | 是 | 写入值;范围 [0, 65535] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 6, "address": 200, "value": 9999 } ``` ## 27. 控制器回复 Modbus 写单个保持寄存器(功能码 06H) **命令字:** `0x731B` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `6`(06H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 6, "success": true } ``` ## 28. 上位机 Modbus 写多个线圈(功能码 0FH) **命令字:** `0x731C` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `15`(0FH) | | address | int | 是 | 起始地址 | | data | int[] | 是 | 写入的线圈值数组;每个元素为 `0` 或 `1` | ### 请求示例 ```json { "processNumber": 1, "functionCode": 15, "address": 20, "data": [1, 0, 1, 0, 1, 1, 0, 0, 1, 0] } ``` ## 29. 控制器回复 Modbus 写多个线圈(功能码 0FH) **命令字:** `0x731D` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `15`(0FH) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 15, "success": true } ``` ## 30. 上位机 Modbus 写多个保持寄存器(功能码 10H) **命令字:** `0x731E` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号,范围 [1, 9] | | functionCode | int | 是 | 功能码,固定为 `16`(10H) | | address | int | 是 | 起始地址 | | data | int[] | 是 | 写入的寄存器值数组;每个元素范围 [0, 65535] | ### 请求示例 ```json { "processNumber": 1, "functionCode": 16, "address": 200, "data": [100, 200, 300, 400, 500] } ``` ## 31. 控制器回复 Modbus 写多个保持寄存器(功能码 10H) **命令字:** `0x731F` ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | processNumber | int | 是 | 工艺号 | | functionCode | int | 是 | 功能码,固定为 `16`(10H) | | success | bool | 是 | 写入是否成功 | ### 响应示例 ```json { "processNumber": 1, "functionCode": 16, "success": true } ``` ## Modbus 功能码汇总 | 功能码 | 名称 | 命令字(请求) | 命令字(回复) | 说明 | |--------|------|---------------|---------------|------| | 01H | 读线圈 | `0x7310` | `0x7311` | 读取从站线圈状态(位操作,读/写) | | 02H | 读输入状态 | `0x7312` | `0x7313` | 读取从站离散输入状态(位操作,只读) | | 03H | 读保持寄存器 | `0x7314` | `0x7315` | 读取从站保持寄存器(16 位操作,读/写) | | 04H | 读输入寄存器 | `0x7316` | `0x7317` | 读取从站输入寄存器(16 位操作,只读) | | 05H | 写单个线圈 | `0x7318` | `0x7319` | 写从站单个线圈状态 | | 06H | 写单个保持寄存器 | `0x731A` | `0x731B` | 写从站单个保持寄存器 | | 0FH | 写多个线圈 | `0x731C` | `0x731D` | 写从站多个线圈状态 | | 10H | 写多个保持寄存器 | `0x731E` | `0x731F` | 写从站多个保持寄存器 | ## Modbus 通讯说明 ### 主站操作流程 1. **设置主站参数**:通过 `0x7300` 设置 Modbus 主站参数(TCP/RTU 模式、端口、从站 ID 等) 2. **建立连接**:主站参数设置后,通讯自动建立(TCP 模式)或通过串口建立(RTU 模式) 3. **查询状态**:通过 `0x7303` 查询连接状态,通过 `0x7304` 获取回复 4. **读写操作**:使用功能码命令(`0x7310`-`0x731F`)进行读写操作 5. **断开连接**:TCP 模式下可关闭连接,RTU 模式下串口保持打开 ### 从站操作流程 1. **设置从站参数**:通过 `0x7305` 设置从站参数 2. **使能连接**:通过 `0x7308` 使能从站连接 3. **心跳检测**:通过 `0x7309` 设置心跳使能 ### 地址偏移说明 - `startAddress` 为 `false` 时,写入的地址会自动减 1(适用于多数 PLC,如西门子等起始地址为 1 的设备) - `startAddress` 为 `true` 时,写入的地址保持不变(适用于起始地址为 0 的设备) ### 注意事项 - 每次读写操作需确保 Modbus 连接已建立,否则操作将失败 - 读取数量受 Modbus 协议限制:线圈/输入状态最多 2000 个,寄存器最多 125 个 - 写多个线圈函数会自动将数据打包为 Modbus 协议格式发送 - TCP 模式的 Float 大小端通过 `endian_type` 参数控制 --- # Tcp 通讯 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/05.Tcp%E9%80%9A%E8%AE%AF.html ## 上位机设置 Tcp 通讯参数 **命令字:** `0x7320` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | client | object | 否 | 客户端参数,当 `type` 为 1 时该节点存在 | | client.frameHeader | string | 否 | 数据帧头,留空为没有 | | client.ip | string | 否 | 需要连接的服务器 IP | | client.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | client.port | int | 否 | 通讯端口,范围 (0, 65535] | | client.separator | string | 否 | 数据分隔符 | | client.terminator | string | 否 | 数据帧尾,留空为没有 | | server | object | 否 | 服务器参数,当 `type` 为 0 时该节点存在 | | server.frameHeader | string | 否 | 数据帧头,留空为没有 | | server.ip | string | 否 | 当前用作服务器 IP | | server.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | server.port | int | 否 | 通讯端口,范围 (0, 65535] | | server.separator | string | 否 | 数据分隔符 | | server.terminator | string | 否 | 数据帧尾,留空为没有 | | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 当前机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件 | ### 请求示例 ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 0, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "robot": 1, "server": { "frameHeader": "@", "ip": "192.168.0.229", "numberSystem": 0, "port": 9001, "separator": ",", "terminator": "!" }, "type": 1 } ``` --- ## 上位机查询 Tcp 通讯参数 **命令字:** `0x7321` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件;为 2 时控制器发送服务器参数 | ### 请求示例 ```json { "craft": 1, "robot": 1, "type": 2 } ``` --- ## 控制器回复 Tcp 通讯参数 **命令字:** `0x7322` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | client | object | 否 | 客户端参数,当 `type` 为 1 时该节点存在 | | client.frameHeader | string | 否 | 数据帧头,留空为没有 | | client.ip | string | 否 | 需要连接的服务器 IP | | client.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | client.port | int | 否 | 通讯端口,范围 (0, 65535] | | client.separator | string | 否 | 数据分隔符 | | client.terminator | string | 否 | 数据帧尾,留空为没有 | | server | object | 否 | 服务器参数,当 `type` 为 0 时该节点存在 | | server.frameHeader | string | 否 | 数据帧头,留空为没有 | | server.ip | string | 否 | 当前用作服务器 IP | | server.numberSystem | int | 否 | 接收到的数据解析进制:0-十进制,1-十六进制 | | server.port | int | 否 | 通讯端口,范围 (0, 65535] | | server.separator | string | 否 | 数据分隔符 | | server.terminator | string | 否 | 数据帧尾,留空为没有 | | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 当前机器人号,范围 [1, 4] | | type | int | 是 | TCP 通讯方式:0-服务器,1-客户端,2-配置文件 | ### 响应示例 ```json { "client": { "frameHeader": "@", "ip": "192.168.1.111", "numberSystem": 0, "port": 9000, "separator": ",", "terminator": "!" }, "craft": 1, "robot": 1, "server": { "frameHeader": "@", "ip": "192.168.0.229", "numberSystem": 0, "port": 9001, "separator": ",", "terminator": "!" }, "type": 1 } ``` --- ## 上位机请求连接 Tcp 通讯 **命令字:** `0x7323` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` --- ## 上位机请求断开 Tcp 通讯 **命令字:** `0x7324` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` ## 上位机查询 Tcp 通讯连接状态 **命令字:** `0x7325` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | ### 请求示例 ```json { "craft": 1, "robot": 1 } ``` ## 控制器回复 Tcp 通讯连接状态 **命令字:** `0x7326` ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | status | int | 是 | 连接状态;0-未连接,1-已连接 | ### 响应示例 ```json { "craft": 1, "robot": 1, "status": 1 } ``` ## 上位机发送 Tcp 数据 **命令字:** `0x7327` > **说明:** 上位机通过已建立的 TCP 连接向对端发送字符串数据。发送前需确保 TCP 连接已建立。 ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | data | string | 是 | 要发送的字符串数据 | ### 请求示例 ```json { "craft": 1, "robot": 1, "data": "Hello, this is a test message!" } ``` ## 控制器主动推送 Tcp 接收数据 **命令字:** `0x7328` > **说明:** 当 TCP 连接接收到对端发来的数据时,控制器会主动向上位机推送接收到的数据。 ### 参数列表 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | craft | int | 是 | 工艺号,范围 [1, 9] | | robot | int | 是 | 机器人号,范围 [1, 4] | | data | string | 是 | 接收到的字符串数据 | ### 推送示例 ```json { "craft": 1, "robot": 1, "data": "Received message from peer" } ``` ## TCP 通讯协议说明 ### 数据帧格式 TCP 通讯支持自定义数据帧格式,通过设置 `frameHeader`(帧头)、`separator`(分隔符)和 `terminator`(帧尾)来定义数据帧的边界: - **帧头(`frameHeader`)**:数据帧的起始标记,留空表示无帧头 - **分隔符(`separator`)**:数据域之间的分隔字符,用于解析多个数据字段 - **帧尾(`terminator`)**:数据帧的结束标记,留空表示无帧尾 - **数据进制(`numberSystem`)**:接收数据时的解析进制,`0` 为十进制,`1` 为十六进制 ### 连接管理流程 1. **设置参数**:通过 `0x7320` 设置 TCP 通讯参数(服务器/客户端模式、IP、端口等) 2. **建立连接**:通过 `0x7323` 请求建立 TCP 连接 3. **数据收发**:通过 `0x7327` 发送数据,通过 `0x7328` 接收推送数据 4. **查询状态**:通过 `0x7325` 查询连接状态 5. **断开连接**:通过 `0x7324` 请求断开 TCP 连接 ### 服务器模式(type=0) 当 `type` 为 `0` 时,控制器作为 TCP 服务器,绑定 `server.ip` 和 `server.port`,等待客户端连接。 ### 客户端模式(type=1) 当 `type` 为 `1` 时,控制器作为 TCP 客户端,主动连接 `client.ip` 和 `client.port` 指定的服务器。 ### 配置文件模式(type=2) 当 `type` 为 `2` 时,控制器读取配置文件中的 TCP 通讯参数,上位机可通过 `0x7321` 查询配置。 ### 注意事项 - 通讯双方的数据帧格式(帧头、分隔符、帧尾)必须保持一致,否则可能导致数据解析错误 - 进制设置仅影响接收数据的解析,发送数据始终以原始字符串形式发送 - 同一工艺号同时只能维持一种连接模式(服务器或客户端) --- # 数据上传 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/06.%E6%95%B0%E6%8D%AE%E4%B8%8A%E4%BC%A0.html ## 概述 数据上传功能用于将控制器运行过程中采集的数据(如关节角度、速度、力矩、IO 状态等)按照配置的格式和周期上传至远程服务器。支持 FTP 上传方式,可自定义文件格式、采集周期和上传周期。 ### 工作流程 ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 控制器 │ │ 上位机 │ │ FTP 服务器│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ 配置上传参数 │ │<──────────────│ 0x7333 │ │ │ │ │ 周期采集数据 │ │ │──────┐ │ │ │ │ (采集) │ │ │<─────┘ │ │ │ │ │ │ 上传周期到达 │ │ │──────────────────────────────>│ FTP 上传 │ │ │ ``` ### 核心概念 | 概念 | 说明 | |------|------| | 采集周期 | 控制器从机器人读取数据的频率 | | 上传周期 | 将采集到的数据打包上传至服务器的频率 | | 数据文件 | 包含机器人运行数据的文件(csv/txt) | | 说明文档 | 包含数据列定义的辅助文件 | --- ## 1. 数据传输开关 ### 1.1 上位机设置数据传输开关 **命令字:** `0x7330` | 参数名 | 类型 | 描述 | |--------|------|------| | enable | bool | 数据传输开关,true-开启,false-关闭 | | robot | int | 当前机器人号,范围 [1, 4] | ```json { "enable": true, "robot": 1 } ``` > 开启数据传输后,控制器按配置的采集周期开始采集数据,并按上传周期发送至服务器。 ### 1.2 上位机查询数据传输开关 **命令字:** `0x7331` | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 当前机器人号,范围 [1, 4] | ```json { "robot": 1 } ``` ### 1.3 控制器回复数据传输开关 **命令字:** `0x7332` | 参数名 | 类型 | 描述 | |--------|------|------| | enable | bool | 数据传输开关 | | robot | int | 当前机器人号 | ```json { "enable": false, "robot": 1 } ``` --- ## 2. 数据上传参数 ### 2.1 上位机设置数据上传参数 **命令字:** `0x7333` | 参数名 | 类型 | 范围/取值 | 描述 | |--------|------|-----------|------| | dataCollectTime | double | [0.001, 999999] 秒 | 数据采集周期,即每隔多少秒采集一次数据 | | dataUploadTime | double | [0.001, 999999] 秒 | 数据上传周期,即每隔多少秒上传一次数据文件 | | fileSuffix | string | "csv" / "txt" | 文件格式。csv 为逗号分隔值,txt 为空格或制表符分隔 | | filepath | string | - | FTP 服务器上的文件存放路径,如 "/robot_data/" | | password | string | - | FTP 登录密码 | | robot | int | [1, 4] | 机器人号 | | sendInfoFileFlag | bool | - | 是否发送说明文档。true-每次上传同时发送说明文档 | | serverIP | string | - | FTP 服务器 IP 地址 | | serverPort | int | (0, 65535] | FTP 服务器端口,默认 21 | | uploadMode | string | 默认 "FTP" | 上传方式,当前仅支持 "FTP" | | username | string | - | FTP 登录用户名 | ### 参数配置建议 | 参数 | 推荐值 | 说明 | |------|--------|------| | dataCollectTime | 0.01~1.0 s | 高频采集用于精细运动分析,低频用于长期监控 | | dataUploadTime | 30~300 s | 上传间隔应考虑文件大小和网络带宽 | | fileSuffix | "csv" | csv 格式兼容性好,易于 Excel 等工具打开 | | sendInfoFileFlag | true | 首次上传建议开启,便于理解数据列含义 | ```json { "dataCollectTime": 1.0, "dataUploadTime": 30.0, "fileSuffix": "csv", "filepath": "/robot_data/", "password": "123456", "robot": 1, "sendInfoFileFlag": true, "serverIP": "192.168.1.14", "serverPort": 21, "uploadMode": "FTP", "username": "admin" } ``` ### 2.2 上位机查询数据上传参数 **命令字:** `0x7334` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | robot | int | [1, 4] | 机器人号 | ```json { "robot": 1 } ``` ### 2.3 控制器回复数据上传参数 **命令字:** `0x7335` | 参数名 | 类型 | 范围/取值 | 描述 | |--------|------|-----------|------| | dataCollectTime | double | [0.001, 999999]s | 数据采集周期 | | dataUploadTime | double | [0.001, 999999]s | 数据上传周期 | | fileSuffix | string | "csv" / "txt" | 文件格式 | | filepath | string | - | 文件路径 | | password | string | - | 密码 | | robot | int | [1, 4] | 机器人号 | | sendInfoFileFlag | bool | - | 是否发送说明文档 | | serverIP | string | - | 服务器 IP | | serverPort | int | (0, 65535] | 端口号 | | uploadMode | string | 默认 "FTP" | 上传方式 | | username | string | - | 用户名 | ```json { "dataCollectTime": 1.0, "dataUploadTime": 30.0, "fileSuffix": "csv", "filepath": "/robot_data/", "password": "123456", "robot": 1, "sendInfoFileFlag": true, "serverIP": "192.168.1.14", "serverPort": 21, "uploadMode": "FTP", "username": "admin" } ``` --- ## 3. 数据格式 > **说明:** 上位机设置与查询分四次进行,分别对应说明文档文件名、说明文档文件内容、数据文档文件名、数据文档文件内容的格式。 ### 3.1 上位机设置数据格式 **命令字:** `0x7336` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | format | string | - | 数据格式模板,支持占位符 | | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | #### type 取值说明 | 值 | 描述 | 应用场景 | |----|------|----------| | 1 | 说明文档文件名 | 定义发送的说明文档的文件命名规则 | | 2 | 说明文档文件内容 | 定义说明文档中数据列的名称与排列 | | 3 | 数据文档文件名 | 定义数据文件的文件命名规则 | | 4 | 数据文档文件内容 | 定义数据文件中每行数据的排列格式 | #### 格式模板占位符 格式字符串中使用以下占位符,上传时自动替换为实际值: | 占位符 | 替换内容 | 示例输出 | |--------|----------|----------| | `$Y%` | 4 位年份 | 2024 | | `$m%` | 2 位月份 | 03 | | `$d%` | 2 位日期 | 15 | | `$H%` | 2 位小时(24小时制) | 14 | | `$M%` | 2 位分钟 | 30 | | `$S%` | 2 位秒 | 00 | | `$R%` | 机器人号 | 1 | | `$N%` | 递增序号 | 001 | | `TEXT` | 普通文本(原样输出) | Robot-R1 | #### type=1 示例(说明文档文件名) ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%_Info.txt", "robot": 1, "type": 1 } ``` > 生成的说明文档文件名示例:`Robot-R1_2024-03-15_14-30-00_Info.txt` #### type=3 示例(数据文档文件名) ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%", "robot": 1, "type": 3 } ``` > 生成的数据文件名示例:`Robot-R1_2024-03-15_14-30-00.csv` ### 3.2 上位机查询数据格式 **命令字:** `0x7337` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | ```json { "robot": 1, "type": 1 } ``` ### 3.3 控制器回复数据格式 **命令字:** `0x7338` | 参数名 | 类型 | 范围 | 描述 | |--------|------|------|------| | format | string | - | 数据格式模板 | | robot | int | [1, 4] | 当前机器人号 | | type | int | [1, 4] | 当前设置的格式类型 | ```json { "format": "Robot-R$R%_$Y%-$m%-$d%_$H%-$M%-$S%", "robot": 1, "type": 1 } ``` --- ## 4. 触发方式 ### 定时触发 数据上传默认采用定时触发方式,由 `dataUploadTime` 控制上传间隔。 - 控制器内部维护一个上传定时器 - 定时器到达 `dataUploadTime` 时,将采集缓冲区数据写入文件并上传 - 上传完成后重置定时器,进入下一周期 ### 条件触发(手动触发) **命令字:** `0x7339` 除了定时触发外,上位机可随时发送命令触发一次即时上传。 #### 请求参数 | 参数名 | 类型 | 描述 | |--------|------|------| | robot | int | 机器人号,范围 [1, 4] | | command | string | "upload_now"-立即上传,"clear_buffer"-清空采集缓冲区 | #### 请求示例 ```json { "robot": 1, "command": "upload_now" } ``` --- ## 5. 上传内容定义 ### 数据文件内容(type=4) type=4 的格式定义决定了数据文件中每行的数据排列。格式字符串由变量名和分隔符组成。 #### 可用数据变量 | 变量名 | 说明 | 数据类型 | |--------|------|----------| | `$JT1%` ~ `$JT6%` | 关节 1~6 的角度 | double (°) | | `$JV1%` ~ `$JV6%` | 关节 1~6 的速度 | double (°/s) | | `$JTQ1%` ~ `$JTQ6%` | 关节 1~6 的力矩 | double (Nm) | | `$TCX%` / `$TCY%` / `$TCZ%` | TCP 位置 X/Y/Z | double (mm) | | `$TRX%` / `$TRY%` / `$TRZ%` | TCP 姿态 RX/RY/RZ | double (°) | | `$DI1%` ~ `$DIN%` | 数字输入 | int (0/1) | | `$DO1%` ~ `$DON%` | 数字输出 | int (0/1) | | `$TS%` | 时间戳 | int (ms) | #### 请求示例(type=4) ```json { "format": "$TS%,$JT1%,$JT2%,$JT3%,$JT4%,$JT5%,$JT6%,$TCX%,$TCY%,$TCZ%", "robot": 1, "type": 4 } ``` > 生成的数据行示例:`12345,10.5,-20.3,45.0,0.5,30.2,-90.0,500.1,100.0,250.5` ### 说明文档内容(type=2) type=2 定义说明文档中数据列标题。通常与 type=4 的数据排列一一对应。 ```json { "format": "时间戳(ms),关节1(deg),关节2(deg),关节3(deg),关节4(deg),关节5(deg),关节6(deg),TCP_X(mm),TCP_Y(mm),TCP_Z(mm)", "robot": 1, "type": 2 } ``` --- ## 6. 上传状态反馈 ### 控制器上报上传状态 **命令字:** `0x733A` 每次上传操作完成后,控制器主动上报上传结果。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | robot | int | 机器人号 | | status | int | 上传状态,0-成功,1-失败,2-上传中 | | fileName | string | 上传的文件名 | | fileSize | int | 文件大小(字节) | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "robot": 1, "status": 0, "fileName": "Robot-R1_2024-03-15_14-30-00.csv", "fileSize": 20480, "errorMsg": "" } ``` --- ## 7. 常见问题 ### 上传失败排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 上传失败 | FTP 服务器地址错误 | 检查 `serverIP` 和 `serverPort` | | 上传失败 | 用户名/密码错误 | 检查 `username` 和 `password` | | 上传失败 | 路径不存在 | 确认 FTP 服务器上 `filepath` 目录存在 | | 上传失败 | 网络不通 | 用 ping 测试控制器与 FTP 服务器连通性 | | 文件为空 | 采集周期过大 | 减小 `dataCollectTime`,增大 `dataUploadTime` | | 文件为空 | 数据变量未配置 | 检查 type=4 格式是否包含有效变量 | | 文件命名错乱 | 格式占位符错误 | 确认占位符语法正确 | ### 性能建议 - 长时间运行建议设置较大的上传周期(如 300s),避免产生过多小文件 - 高频采集(dataCollectTime < 0.01s)时注意控制器内存占用 - FTP 服务器应有足够的磁盘空间,定期清理历史数据文件 - `sendInfoFileFlag` 改为 false 可减少上传数据量(仅首次需要说明文档) --- # finsTCP > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/07.finsTCP.html ## 概述 FINS(Factory Interface Network Service)是欧姆龙(Omron)PLC 的专用通信协议,FINS/TCP 是通过 TCP/IP 网络封装 FINS 命令的通信方式。本控制器通过 FINS/TCP 协议与欧姆龙 PLC 进行数据交互,支持读写 PLC 的 DM 数据区。 ### 协议栈结构 ```text ┌─────────────────────┐ │ FINS 命令/响应 │ ← 应用层 ├─────────────────────┤ │ FINS 帧头 │ ← FINS Header (10字节) ├─────────────────────┤ │ TCP 封装 │ ← TCP/IP 传输层 └─────────────────────┘ ``` ### 数据区映射 | 数据类型 | PLC 地址区 | 本机映射 | 说明 | |----------|------------|----------|------| | DM 区 | DM0 ~ DM9999 | 全局变量区 | 数据存储区,支持读写 | | 布尔量 | - | 全局布尔变量 | 本机与 PLC DM 区按位映射 | --- ## 1. 上位机设置 finsTCP 参数 **命令字:** `0x7340` ### 参数列表 | 参数名 | 类型 | 说明 | 范围/格式 | |--------|------|------|-----------| | IP | string | PLC 的 IP 地址 | 标准 IPv4 格式 | | PLCReadAddress | string | PLC 读取首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | PLCWriteAddress | string | PLC 写入首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | craftNum | int | 工艺号 | 范围 [1, 9] | | localReadAddress | int[] | 本机读取首地址列表 | 范围 [1, 990],第一位为全局布尔首地址,第二位为全局整型首地址 | | localWriteAddress | int[] | 本机写入首地址列表 | 范围 [1, 990],第一位为全局布尔首地址,第二位为全局整型首地址 | | port | int | 端口号 | 范围 [0, 65535],欧姆龙默认 9600 | ### 配置说明 - **PLCReadAddress**:控制器从 PLC 的此地址开始读取数据到本机 `localReadAddress` - **PLCWriteAddress**:控制器将本机 `localWriteAddress` 的数据从此地址开始写入 PLC - **localReadAddress[0]**:全局布尔变量起始地址,**localReadAddress[1]**:全局整型变量起始地址 - 读写数据长度在 PLC 侧可配置,本机侧根据实际变量数量自动计算 ### 请求示例 ```json { "IP": "192.168.1.10", "PLCReadAddress": "DM2000", "PLCWriteAddress": "DM1000", "craftNum": 1, "localReadAddress": [500, 500], "localWriteAddress": [100, 100], "port": 9600 } ``` --- ## 2. 上位机查询 finsTCP 参数 **命令字:** `0x7341` ### 参数列表 | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | craftNum | int | 查询的工艺号名称 | 范围 [1, 9] | ### 请求示例 ```json { "craftNum": 1 } ``` --- ## 3. 控制器回复上位机 finsTCP 参数 **命令字:** `0x7342` ### 参数列表 | 参数名 | 类型 | 说明 | 范围/格式 | |--------|------|------|-----------| | IP | string | IP 地址 | - | | PLCReadAddress | string | PLC 读取首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | PLCWriteAddress | string | PLC 写入首地址 | "DM" 开头 + 数字,范围 [1, 9999] | | craftNum | int | 工艺号 | 范围 [1, 9] | | localReadAddress | int[] | 本机读取首地址列表 | 范围 [1, 990] | | localWriteAddress | int[] | 本机写入首地址列表 | 范围 [1, 990] | | port | int | 端口号 | 范围 [0, 65535] | | status | int | 通讯状态 | 0-未连接,1-已连接 | ### 响应示例 ```json { "IP": "192.168.1.10", "PLCReadAddress": "DM2000", "PLCWriteAddress": "DM1000", "craftNum": 1, "localReadAddress": [500, 500], "localWriteAddress": [100, 100], "port": 9600, "status": 0 } ``` --- ## 4. 上位机请求连接通讯 **命令字:** `0x7343` 发送此命令后,控制器尝试与 PLC 建立 FINS/TCP 通信连接。 ### 请求示例 ```json {} ``` ### 连接流程 1. 上位机发送连接命令 `0x7343` 2. 控制器通过 TCP 三次握手与 PLC 建立连接 3. 控制器发送 FINS 节点地址数据发送(CLIENT TO SERVER)命令注册节点 4. 连接成功后控制器回复状态 `0x7345`(status=1) 5. 开始周期性地将本机数据写入 PLC,并从 PLC 读取数据 --- ## 5. 上位机请求断开通讯 **命令字:** `0x7344` 发送此命令后,控制器断开与 PLC 的 FINS/TCP 连接,停止数据交换。 ### 请求示例 ```json {} ``` --- ## 6. 控制器发送 finsTCP 通讯连接状态 **命令字:** `0x7345` ### 参数列表 | 参数名 | 类型 | 说明 | 范围 | |--------|------|------|------| | status | int | 通讯连接状态 | 0-未连接,1-已连接 | ### 响应示例 ```json { "status": 0 } ``` --- ## 7. 控制器发送 fins 打开的程序名称 **命令字:** `0x7346` ### 参数列表 | 参数名 | 类型 | 说明 | |--------|------|------| | programName | string | 打开的程序名称 | ### 响应示例 ```json "AAA" ``` --- ## 8. FINS 协议帧格式 ### FINS 命令帧结构 FINS 命令帧由 FINS Header + FINS Command 组成,封装在 TCP 数据中。 | 字节偏移 | 长度(字节) | 字段名 | 说明 | |----------|------------|--------|------| | 0 | 4 | ICF | 信息控制字段 | | 4 | 4 | RSV | 保留字段(固定 0x00) | | 8 | 2 | GCT | 网关计数(通常 0x02) | | 10 | 1 | DNA | 目标网络地址(0x00=本地) | | 11 | 1 | DA1 | 目标节点号 | | 12 | 1 | DA2 | 目标单元号(0x00=CPU单元) | | 13 | 1 | SNA | 源网络地址 | | 14 | 1 | SA1 | 源节点号 | | 15 | 1 | SA2 | 源单元号 | | 16 | 2 | SID | 服务标识(请求/响应匹配用) | | 18 | 2 | MRC | 主请求码 | | 20 | 2 | SRC | 子请求码 | | 22 | N | Data | 命令数据(变长) | ### 常用命令码 | MRC | SRC | 命令名称 | 说明 | |-----|-----|----------|------| | 0x01 | 0x01 | MEMORY AREA READ | 读取指定存储区数据 | | 0x01 | 0x02 | MEMORY AREA WRITE | 向指定存储区写入数据 | | 0x01 | 0x03 | MEMORY AREA FILL | 填充存储区数据 | | 0x01 | 0x04 | MULTIPLE MEMORY AREA READ | 批量读取多个存储区 | | 0x02 | 0x01 | PARAMETER AREA READ | 读取参数区 | | 0x02 | 0x02 | PARAMETER AREA WRITE | 写入参数区 | | 0x04 | 0x01 | RUN | 切换到运行模式 | | 0x04 | 0x02 | STOP | 切换到停止模式 | | 0x05 | 0x01 | CPU UNIT DATA READ | 读取 CPU 单元数据 | | 0x06 | 0x01 | CONNECTION DATA READ | 读取连接数据 | ### 存储区代码 FINS 协议通过存储区代码标识不同的数据区域: | 代码 | 区域名称 | 说明 | 字节/字 | |------|----------|------|---------| | 0x82 | DM 区 | 数据存储器,16位字 | 2 字节/字 | | 0xB0 | CIO 区 | 核心 I/O 区,位可访问 | 2 字节/字 | | 0xB1 | WR 区 | 工作继电器区 | 2 字节/字 | | 0xB2 | HR 区 | 保持继电器区 | 2 字节/字 | | 0xB3 | AR 区 | 辅助继电器区 | 2 字节/字 | --- ## 9. 读写操作详解 ### 上位机请求读取 PLC 数据 **命令字:** `0x7347` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | areaCode | int | 是 | 存储区代码,如 0x82 表示 DM 区 | | startAddress | int | 是 | 读取起始地址(字地址) | | wordCount | int | 是 | 读取字数,范围 [1, 512] | | craftNum | int | 否 | 工艺号,范围 [1, 9];不填则使用当前连接工艺 | #### 请求示例 ```json { "areaCode": 130, "startAddress": 2000, "wordCount": 10, "craftNum": 1 } ``` --- ### 控制器回复 PLC 读取数据 **命令字:** `0x7348` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | areaCode | int | 存储区代码 | | startAddress | int | 起始地址 | | words | int[] | 读取到的字数据(每个字 0~65535) | | status | int | 读取状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "areaCode": 130, "startAddress": 2000, "words": [100, 200, 300, 150, 250, 50, 75, 125, 500, 1000], "status": 0 } ``` --- ### 上位机请求写入 PLC 数据 **命令字:** `0x7349` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | areaCode | int | 是 | 存储区代码,如 0x82 表示 DM 区 | | startAddress | int | 是 | 写入起始地址(字地址) | | words | int[] | 是 | 要写入的字数据,每个字范围 [0, 65535] | | craftNum | int | 否 | 工艺号,范围 [1, 9] | #### 请求示例 ```json { "areaCode": 130, "startAddress": 1000, "words": [10, 20, 30, 40, 50], "craftNum": 1 } ``` --- ### 控制器回复 PLC 写入结果 **命令字:** `0x734A` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | areaCode | int | 存储区代码 | | startAddress | int | 起始地址 | | status | int | 写入状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(失败时返回) | #### 响应示例 ```json { "areaCode": 130, "startAddress": 1000, "status": 0 } ``` --- ## 10. 通讯错误码 | 错误码 | 说明 | 处理建议 | |--------|------|----------| | 0x0000 | 正常完成 | - | | 0x0101 | 连接失败(TCP 层) | 检查 IP、端口和网络连通性 | | 0x0102 | 节点注册失败 | 检查 PLC 的 FINS 节点地址配置 | | 0x0201 | 不支持的存储区代码 | 确认 areaCode 正确 | | 0x0202 | 地址超出范围 | 确认 startAddress 和 wordCount 在有效范围 | | 0x0203 | 数据长度错误 | 确认 words 数组长度与 wordCount 一致 | | 0x0301 | PLC 处于不可操作状态 | 将 PLC 切换到监视/运行模式 | | 0x0302 | 写入被禁止 | 检查 PLC 的写保护设置 | | 0x0401 | 命令超时 | 增大超时时间或检查网络负载 | | 0x0402 | 响应格式异常 | 检查 PLC 固件版本兼容性 | --- ## 11. 通讯时序 ### 典型数据交互周期 ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 上位机 │ │ 控制器 │ │ PLC │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ 0x7343 连接请求 │ │ │───────────────────>│ │ │ │ TCP Connect │ │ │───────────────────>│ │ │ FINS Node Reg │ │ │───────────────────>│ │ 0x7345 连接成功 │ │ │<───────────────────│ │ │ │ │ │ │◄──── 循环读写 ────►│ │ │ (DM 区周期交换) │ │ │ │ ``` ### 周期性数据交换 连接建立后,控制器以固定周期执行以下数据交换: 1. **写入阶段**:将 `localWriteAddress` 的全局变量数据写入 PLC 的 `PLCWriteAddress` 起始的 DM 区 2. **读取阶段**:从 PLC 的 `PLCReadAddress` 起始的 DM 区读取数据到 `localReadAddress` 的全局变量 布尔量以位为单位映射到 DM 区的对应位,整型以 16 位字为单位映射。 --- ## 12. 常见问题 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 连接不上 PLC | IP 地址错误 | 确认 PLC IP 地址,可用 ping 测试 | | 连接不上 PLC | 端口错误 | 欧姆龙 PLC 默认端口为 9600 | | 连接不上 PLC | PLC 不在同一网段 | 检查网络配置 | | 读写数据不正确 | 地址偏移 | 确认 DM 起始地址与 PLC 程序一致 | | 读写数据不正确 | 数据长度不匹配 | 核对本机变量数量和 PLC 数据长度配置 | | 通讯中断 | 网络故障 | 检查网络设备状态,查看 `0x7345` 状态码 | | 通讯中断 | PLC 模式变更 | 确认 PLC 处于监视/运行模式 | --- # OPCUA > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/08.OPCUA.html ## 概述 OPC UA(Open Platform Communications Unified Architecture)是一种工业自动化领域的跨平台通信协议,支持数据访问、报警与事件、历史数据等功能。本控制器支持作为 OPC UA **客户端**连接远程服务器,同时也可作为 OPC UA **服务器**供其他设备访问,实现双向数据交互。 ### 核心功能 | 功能 | 说明 | |------|------| | 连接管理 | 支持客户端/服务器双模式,可独立启停 | | 节点读写 | 读写 OPC UA 服务器中的变量节点 | | 订阅监控 | 订阅节点数据变化,实时推送更新 | | 安全认证 | 支持用户名/密码认证方式 | ### 工作模式 - **客户端模式**:控制器作为 OPC UA 客户端,连接外部 OPC UA 服务器,读写对方提供的变量节点 - **服务器模式**:控制器作为 OPC UA 服务器,开放本地变量供外部客户端访问 --- ## 上位机设置 OPCUA 参数 **命令字:** `0x7350` ### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | client | object | 否 | 客户端参数 | | client.enable | bool | 是 | 客户端连接使能,true-开启,false-关闭 | | client.ip | string | 是 | OPC UA 服务器 IP 地址 | | client.port | int | 是 | 服务器端口号,范围 [0, 65535],默认 4840 | | client.resource | string | 否 | 服务器资源路径/名称 | | client.username | string | 否 | 登录用户名(需服务器支持) | | client.password | string | 否 | 登录密码 | | client.security | string | 否 | 安全策略,可选 "None" / "Basic256Sha256" / "Basic128Rsa15" | | server | object | 否 | 服务器参数 | | server.enable | bool | 是 | 服务器使能,true-开启,false-关闭 | | server.ip | string | 是 | 控制器用作服务器时的 IP 地址 | | server.port | int | 是 | 服务器端口号,范围 [0, 65535],默认 4840 | ### 配置说明 - `client.enable` 和 `server.enable` 可以同时开启,控制器将同时运行客户端和服务端 - 客户端模式下,`client.ip` 和 `client.port` 必须指向有效的 OPC UA 服务器 - 若服务器需要认证,需同时填写 `client.username` 和 `client.password` - 安全策略选择需与目标服务器支持的策略一致 ### 请求示例 ```json { "client": { "enable": true, "ip": "192.168.1.240", "port": 49400, "resource": "ProsysServer", "username": "admin", "password": "123456", "security": "None" }, "server": { "enable": true, "ip": "192.168.0.229", "port": 4840 } } ``` --- ## 上位机查询 OPCUA 参数 **命令字:** `0x7351` ### 请求示例 ```json {} ``` --- ## 控制器回复上位机 OPCUA 参数 **命令字:** `0x7352` ### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | client | object | 客户端参数 | | client.enable | bool | 连接使能 | | client.ip | string | 服务器 IP 地址 | | client.port | int | 端口号 | | client.resource | string | 服务器名称 | | client.connected | bool | 客户端连接状态,true-已连接,false-未连接 | | server | object | 服务器参数 | | server.enable | bool | 服务器使能 | | server.ip | string | 控制器用作服务器时的 IP 地址 | | server.port | int | 端口号 | | server.connected | bool | 是否有客户端连接,true-有客户端连接,false-无连接 | ### 响应示例 ```json { "client": { "enable": true, "ip": "192.168.1.240", "port": 49400, "resource": "ProsysServer", "connected": true }, "server": { "enable": true, "ip": "192.168.0.229", "port": 4840, "connected": false } } ``` --- ## OPC UA 节点读写 控制器作为客户端连接 OPC UA 服务器后,可读写服务器中的变量节点。 ### 上位机请求读取节点 **命令字:** `0x7353` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | nodeId | string | 是 | 目标节点的 NodeId,如 "ns=2;s=Temperature" | | nodeIdType | int | 否 | NodeId 类型,0-字符串,1-数字,2-GUID,3-Opaque,默认 0 | | namespace | int | 否 | 命名空间索引,默认 0 | #### 节点标识说明 OPC UA 节点通过以下方式定位: | 标识方式 | 格式示例 | 说明 | |----------|----------|------| | 字符串 ID | `ns=2;s=MyVariable` | 使用字符串标识 | | 数字 ID | `ns=2;i=1001` | 使用数字标识 | | GUID | `ns=2;g=ABC123...` | 使用 GUID | | 浏览路径 | `/Objects/MyDevice/Temperature` | 使用路径浏览 | #### 请求示例 ```json { "nodeId": "ns=2;s=Temperature", "nodeIdType": 0, "namespace": 2 } ``` --- ### 控制器回复节点读取结果 **命令字:** `0x7354` ##### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | nodeId | string | 读取的节点 ID | | value | variant | 节点当前值 | | dataType | string | 数据类型,如 "Int32" / "Double" / "Boolean" / "String" | | timestamp | string | 数据时间戳(ISO 8601 格式) | | status | int | 读取状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(仅失败时返回) | ##### 响应示例 ```json { "nodeId": "ns=2;s=Temperature", "value": 25.6, "dataType": "Double", "timestamp": "2024-03-15T10:30:00Z", "status": 0 } ``` --- ### 上位机请求写入节点 **命令字:** `0x7355` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | nodeId | string | 是 | 目标节点的 NodeId | | value | variant | 是 | 要写入的值 | | dataType | string | 是 | 写入值的数据类型 | #### 请求示例 ```json { "nodeId": "ns=2;s=SetPoint", "value": 100.0, "dataType": "Double" } ``` --- ### 控制器回复节点写入结果 **命令字:** `0x7356` #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | nodeId | string | 写入的节点 ID | | status | int | 写入状态,0-成功,非0-失败 | | errorMsg | string | 错误信息(仅失败时返回) | #### 响应示例 ```json { "nodeId": "ns=2;s=SetPoint", "status": 0 } ``` --- ### 批量读写节点 **命令字:** `0x7357` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | operations | object[] | 是 | 批量操作列表 | | operations[].opType | string | 是 | 操作类型,"read"-读取,"write"-写入 | | operations[].nodeId | string | 是 | 节点 ID | | operations[].value | variant | 否 | 写入值(opType="write" 时必填) | #### 请求示例 ```json { "operations": [ { "opType": "read", "nodeId": "ns=2;s=Temperature" }, { "opType": "read", "nodeId": "ns=2;s=Pressure" }, { "opType": "write", "nodeId": "ns=2;s=SetPoint", "value": 50.0 } ] } ``` --- ## OPC UA 订阅机制 订阅功能允许控制器持续监控 OPC UA 服务器中的指定节点,当节点值发生变化时,服务器主动推送更新数据,无需轮询。 ### 上位机创建订阅 **命令字:** `0x7358` #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 订阅唯一标识符,用于后续管理 | | publishingInterval | int | 是 | 发布间隔(毫秒),服务器以此周期检查并推送变化数据 | | lifetimeCount | int | 否 | 订阅生存周期计数,默认 10000 | | maxKeepAliveCount | int | 否 | 最大保活计数,默认 3000 | | monitoredItems | object[] | 是 | 监控项列表 | | monitoredItems[].nodeId | string | 是 | 要监控的节点 ID | | monitoredItems[].samplingInterval | int | 是 | 采样间隔(毫秒) | | monitoredItems[].queueSize | int | 否 | 队列大小,默认 1 | | monitoredItems[].discardOldest | bool | 否 | 队列满时是否丢弃最旧数据,默认 true | | monitoredItems[].deadbandType | int | 否 | 死区类型,0-无,1-绝对值,2-百分比 | | monitoredItems[].deadbandValue | double | 否 | 死区值,仅当值变化超过此阈值时才触发通知 | #### 订阅参数建议 | 参数 | 推荐值 | 说明 | |------|--------|------| | publishingInterval | 100~1000 ms | 发布周期,越小实时性越好但网络负载越大 | | samplingInterval | publishingInterval 的 1/2 ~ 1/5 | 采样周期应小于发布周期 | | queueSize | 1~10 | 数据变化队列,应对突发变化 | | lifetimeCount | ≥ 3 × maxKeepAliveCount | 订阅有效期,超时无保活则自动清理 | | deadbandValue | 根据精度需求设定 | 变化阈值,过滤微小波动 | #### 请求示例 ```json { "subscriptionId": "sub_temp_001", "publishingInterval": 200, "lifetimeCount": 10000, "maxKeepAliveCount": 3000, "monitoredItems": [ { "nodeId": "ns=2;s=Temperature", "samplingInterval": 100, "queueSize": 5, "discardOldest": true, "deadbandType": 1, "deadbandValue": 0.5 }, { "nodeId": "ns=2;s=Pressure", "samplingInterval": 200, "queueSize": 1 } ] } ``` --- ### 控制器上报订阅数据 **命令字:** `0x7359` 当订阅的节点数据发生变化时,控制器主动推送数据至上位机。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | subscriptionId | string | 订阅 ID | | dataChanges | object[] | 变化的数据列表 | | dataChanges[].nodeId | string | 节点 ID | | dataChanges[].value | variant | 节点当前值 | | dataChanges[].timestamp | string | 时间戳 | | sequenceNumber | int | 序列号,递增 | #### 响应示例 ```json { "subscriptionId": "sub_temp_001", "dataChanges": [ { "nodeId": "ns=2;s=Temperature", "value": 26.8, "timestamp": "2024-03-15T10:30:01Z" } ], "sequenceNumber": 42 } ``` --- ### 上位机修改订阅 **命令字:** `0x735A` 修改已有订阅的监控项或发布参数。 #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 要修改的订阅 ID | | publishingInterval | int | 否 | 新的发布间隔 | | addItems | object[] | 否 | 新增监控项列表 | | removeItems | string[] | 否 | 移除监控项的 nodeId 列表 | #### 请求示例 ```json { "subscriptionId": "sub_temp_001", "publishingInterval": 500, "addItems": [ { "nodeId": "ns=2;s=Humidity", "samplingInterval": 500 } ], "removeItems": ["ns=2;s=Pressure"] } ``` --- ### 上位机删除订阅 **命令字:** `0x735B` 停止并删除指定订阅。 #### 参数说明 | 字段 | 类型 | 必填 | 描述 | |------|------|------|------| | subscriptionId | string | 是 | 要删除的订阅 ID | #### 请求示例 ```json { "subscriptionId": "sub_temp_001" } ``` --- ## 连接状态管理 ### 控制器主动上报连接状态 **命令字:** `0x735C` 当 OPC UA 客户端或服务器连接状态发生变化时,控制器主动推送状态更新。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | role | string | 角色,"client" / "server" | | status | int | 状态码:0-已断开,1-连接中,2-已连接,3-连接失败 | | errorMsg | string | 错误描述(连接失败时返回) | | timestamp | string | 状态变化时间 | #### 响应示例 ```json { "role": "client", "status": 2, "timestamp": "2024-03-15T10:29:55Z" } ``` --- ## 常见问题 ### 连接失败排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 客户端无法连接 | IP/端口错误 | 检查 `client.ip` 和 `client.port` 是否正确 | | 客户端无法连接 | 安全策略不匹配 | 确认 `client.security` 与服务器一致 | | 客户端无法连接 | 网络不通 | 用 ping 测试网络连通性 | | 节点读取失败 | NodeId 格式错误 | 确认 `nodeId` 格式,如 `ns=2;s=xxx` | | 节点读取失败 | 命名空间索引错误 | 确认 `namespace` 值匹配服务器实际命名空间 | | 写入失败 | 权限不足 | 确认服务器对目标节点开放了写入权限 | | 订阅无数据推送 | 发布间隔过大 | 减小 `publishingInterval` 值 | | 订阅无数据推送 | 死区设置过大 | 减小 `deadbandValue` 或关闭死区 | ### 性能建议 - 批量操作优先使用批量读写命令(`0x7357`),减少通信开销 - 订阅监控项不宜过多,建议单个订阅不超过 50 个节点 - 采样间隔应根据数据变化频率合理设置,避免过度采样 - 发布间隔不宜过小,推荐 100ms ~ 1000ms --- # EIP > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/04.%E5%A4%96%E8%AE%BE_%E9%80%9A%E8%AE%AF/09.EIP.html ## 概述 EIP(EtherNet/IP)是一种基于标准以太网的工业通信协议,由 ODVA 组织维护。它使用 CIP(Common Industrial Protocol,通用工业协议)作为应用层协议,支持实时 I/O 数据和显式消息通信。本控制器通过 EtherNet/IP 与支持该协议的设备进行数据交互。 ### 通讯模式 | 模式 | 说明 | 特点 | |------|------|------| | 显式消息(Explicit Messaging) | 基于 TCP,请求/应答模式 | 非实时,用于配置和诊断 | | 隐式消息(Implicit Messaging) | 基于 UDP,生产者/消费者模式 | 实时,用于周期性 I/O 数据交换 | ### CIP 协议层次 ```text ┌────────────────────────────┐ │ 应用对象 (CIP Objects) │ ├────────────────────────────┤ │ CIP 通用工业协议 │ ├───────────┬────────────────┤ │ 显式消息 │ 隐式消息(I/O) │ │ (TCP) │ (UDP) │ ├───────────┴────────────────┤ │ TCP/IP 协议栈 │ ├────────────────────────────┤ │ 以太网物理层 │ └────────────────────────────┘ ``` --- ## 0x7360 上位机设置设备参数配置 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | type | int | 是 | 输入/输出路数 | 1 / 4 / 8 / 12 / 16 | | grouptype | int | 是 | 组号的方式 | 0: 手填,1: 全局 int 类型变量,2: 全局 int 类型绑定变量 | | group | int | 是 | 组号中的数字 | - | | addtype | int | 是 | 数值存入的方式 | 0: 全局 int 类型变量,1: 全局 int 类型绑定变量,2: 全局 double 类型变量,3: 全局 double 类型绑定变量 | | add | int | 是 | 数值存入的数字 | - | | num | int | 是 | 编号 | 1-10: 输出,11-20: 输入 | | value | - | 是 | 值 | - | | able | bool | 是 | 使能开关 | true: 使能,false: 不使能 | ### 参数详解 - **type**:定义每路输入/输出的数据位宽。例如 type=16 时每路包含 16 个位信号 - **grouptype**:定义组号的来源方式。手填(0)直接使用 group 值;全局变量方式(1/2)从对应变量中读取组号 - **addtype**:定义数据存入的目标类型。int 变量存储整数,double 变量存储浮点数 - **num**:1~10 为输出信号,11~20 为输入信号,与外部设备的 I/O 映射对应 ### 请求示例 ```json { "type": 4, "grouptype": 1, "group": 3, "addtype": 2, "add": 100, "num": 5, "value": 1, "able": true } ``` ### 响应 控制器响应并返回设备参数。响应数据结构与请求一致。 --- ## 0x7361 上位机获取设备参数配置 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前所有设备参数配置列表。 --- ## 0x7362 上位机修改设备参数配置 > 参数格式同 0x7360。可修改已配置的设备参数,支持部分字段修改。 --- ## 0x7363 上位机设置连接参数 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | enable | bool | 是 | 连接开关 | true: 打开连接开关,false: 关闭连接开关 | | writenum | int | 是 | 输出(写入)数据长度 | [0, 256] | | readnum | int | 是 | 输入(读取)数据长度 | [0, 256] | | scancycle | int | 是 | 扫描周期(ms) | 建议 [1, 100] | | outtimecycle | int | 是 | 超时周期(ms) | 应为扫描周期的倍数 | | networkname | string | 是 | 选取的网口的名称 | 如 "eth0", "eth1" | | writetype | int | 是 | 本机输出数据的类型 | 0: 全局 bool 类型变量,1: 全局 bool 类型绑定变量 | | writeadd | int | 是 | 本机输出数据的起始地址 | 全局变量地址 | | readtype | int | 是 | 本机输入数据的类型 | 0: 全局 bool 类型变量,1: 全局 bool 类型绑定变量 | | readadd | int | 是 | 本机输入数据的起始地址 | 全局变量地址 | ### 参数详解 - **writenum / readnum**:定义输出/输入数据的长度(以 bool 为单位)。实际数据量 = writenum/readnum × 位宽 - **scancycle**:控制器获取/发送 EtherNet/IP 数据的周期,单位毫秒 - **outtimecycle**:通讯超时判定周期,若超过此时间未收到对端数据则判定超时。建议设置为 scancycle × 4 - **networkname**:指定使用的物理网口,需与设备实际连接的网络接口一致 ### 请求示例 ```json { "enable": true, "writenum": 64, "readnum": 64, "scancycle": 10, "outtimecycle": 40, "networkname": "eth0", "writetype": 0, "writeadd": 200, "readtype": 0, "readadd": 300 } ``` --- ## 0x7364 上位机获取连接参数配置 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前的连接参数配置。数据结构与 0x7363 请求一致。 --- ## 0x7365 上位机修改连接参数 > 参数格式同 0x7363。 --- ## 0x7366 上位机向控制器获取连接状态 ### 请求参数 data: 无(发送空 JSON) ```json {} ``` ### 响应 控制器返回当前的连接状态信息。 #### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | connected | bool | 连接状态,true-已连接,false-未连接 | | linkSpeed | int | 链路速度(Mbps) | | packetTx | int | 发送数据包计数 | | packetRx | int | 接收数据包计数 | | timeoutCount | int | 超时计数 | | lastError | string | 最近一次错误描述 | #### 响应示例 ```json { "connected": true, "linkSpeed": 100, "packetTx": 15230, "packetRx": 15128, "timeoutCount": 0, "lastError": "" } ``` --- ## 0x7367 控制器返回读取数据的状态 控制器在周期性通讯中,主动推送输入数据的状态变化。 #### 响应参数 | 参数名 | 类型 | 说明 | |--------|------|------| | num | int | 输入编号,范围 11-20 | | value | int/bool/double | 输入当前值 | | timestamp | int | 数据更新时间戳(ms) | --- ## 0x7368 读取数据的状态设置 上位机可主动设置输入数据的状态值(用于调试或模拟)。 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | 取值范围 | |--------|------|------|------|----------| | num | int | 是 | 编号信息 | 0-9: 输出,10-19: 输入 | | value | - | 是 | 设置的值 | 类型取决于 addtype 配置 | ### 请求示例 ```json { "num": 12, "value": 1 } ``` --- ## 0x7369 读取数据的状态设置 控制输入数据是否随 EtherNet/IP 接收数据实时更新。 ### 参数列表 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | state | bool | 是 | true: 输入数据跟随 EIP 接收数据实时更新,false: 冻结当前值 | ### 应用场景 - **state=true**:正常运行模式,输入数据实时反映外部设备状态 - **state=false**:调试/维护模式,冻结输入值,便于排查问题或手动模拟信号 ### 请求示例 ```json { "state": false } ``` --- ## CIP 连接管理 ### 连接建立流程 EtherNet/IP 使用 CIP 连接进行数据交换,连接建立过程如下: ```text ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 上位机 │ │ 控制器 │ │ EIP 设备 │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ 0x7363 设置连接参数 │ │ │────────────────────>│ │ │ │ TCP 连接 │ │ │─────────────────────>│ │ │ 注册 Session │ │ │─────────────────────>│ │ │ Forward Open 请求 │ │ │─────────────────────>│ │ │ Forward Open 响应 │ │ │<─────────────────────│ │ │ │ │ │◄── 隐式消息(I/O) ──►│ │ │ (周期性数据交换) │ ``` ### 连接类型 | 连接类型 | 传输方式 | 触发方式 | 典型用途 | |----------|----------|----------|----------| | Exclusive Owner | 点到点 | 周期 | 控制器独占控制 I/O 设备 | | Input Only | 多播 | 周期 | 仅监听输入数据 | | Listen Only | 多播 | 周期 | 监听其他连接的输出数据 | ### Assembly 对象 Assembly 对象用于将离散 I/O 数据组合为一个数据块进行传输。 | Assembly 类型 | 实例 ID 范围 | 方向 | 说明 | |---------------|-------------|------|------| | Output Assembly | 100~199 | 本机 → 设备 | 输出数据集合 | | Input Assembly | 200~299 | 设备 → 本机 | 输入数据集合 | | Configuration Assembly | 300~399 | 本机 → 设备 | 配置数据集合 | --- ## 通讯状态监控 ### 控制器主动上报状态变化 **命令字:** `0x736A` 当 EtherNet/IP 连接状态发生变化时,控制器主动推送状态更新。 #### 参数说明 | 字段 | 类型 | 描述 | |------|------|------| | status | int | 连接状态:0-空闲,1-连接中,2-运行中,3-超时,4-错误 | | elapsedMs | int | 当前连接已持续时间(毫秒) | | diagInfo | object | 诊断信息 | #### diagInfo 说明 | 字段 | 类型 | 描述 | |------|------|------| | sessionHandle | int | CIP Session 句柄 | | connectionId | int | CIP 连接 ID | | rpi | int | 请求包间隔 RPI(ms) | | openRetries | int | 连接打开重试次数 | | watchDogTimeout | int | 看门狗超时次数 | #### 响应示例 ```json { "status": 2, "elapsedMs": 3600000, "diagInfo": { "sessionHandle": 12345, "connectionId": 67890, "rpi": 10, "openRetries": 0, "watchDogTimeout": 0 } } ``` --- ## 常见问题 ### 连接问题排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 无法建立连接 | 网口选择错误 | 检查 `networkname` 是否与实际网口一致 | | 无法建立连接 | 设备 IP 不在同一网段 | 配置控制器网口 IP 与设备同网段 | | 数据不更新 | 扫描周期过大 | 减小 `scancycle` 值 | | 数据不更新 | state 设为 false | 将 `0x7369` 的 state 设为 true | | 频繁超时 | 网络负载过高 | 增大 `outtimecycle`,优化网络拓扑 | | 频繁超时 | 网络设备故障 | 检查交换机、网线等硬件 | | 数据错乱 | 数据长度不匹配 | 确认 `writenum`/`readnum` 与设备一致 | | 数据错乱 | 字节序不一致 | 检查设备的字节序设置 | ### 性能优化建议 - 扫描周期建议根据实际 I/O 点数和网络条件设置,通常 5~50ms - RPI(请求包间隔)应在 `scancycle` 的基础上考虑网络延迟余量 - 对于纯监控类数据,可适当增大扫描周期以降低网络负载 - 使用 `0x7366` 定期查询连接状态和通信统计,及时发现异常 --- # 变量 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/06.%E5%8F%98%E9%87%8F.html ## 获取当前位置 **命令字:** `0x6000` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x6001` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | globalPosition | object | 全局位置变量对象 | | note | object | 注释对象 | `globalPosition` 中每个点位数据为 `double[]` 类型,含义如下: | 位 | 说明 | |----|------| | 0 | 坐标类型:0 关节,1 直角,2 工具,3 用户 | | 1 | 角度制/弧度制:0 弧度制,1 角度制 | | 2 | 左右手:0 无,1 左,2 右 | | 3 | 工具坐标系 | | 4 | 用户坐标系 | | 5、6 | 扩展备用 | | 7~13 | 机器人坐标(共 7 位) | | 14~20 | 外部轴 | ```json { "globalPosition": { "GP0021": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0022": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0023": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0024": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0025": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0026": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0027": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0028": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0029": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0030": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0031": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0032": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0033": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0034": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0035": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0036": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0037": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0038": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0039": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "GP0040": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, "note": { "GP0021": "", "GP0022": "", "GP0023": "", "GP0024": "", "GP0025": "", "GP0026": "", "GP0027": "", "GP0028": "", "GP0029": "", "GP0030": "", "GP0031": "", "GP0032": "", "GP0033": "", "GP0034": "", "GP0035": "", "GP0036": "", "GP0037": "", "GP0038": "", "GP0039": "", "GP0040": "" }, "robot": 1 } ``` ## 设置全局位置变量 > **注意:** 如果是四轴,最后两位补 0。 **命令字:** `0x6002` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | posName | string | 变量名称 | | pos | double[] | 变量数据 | | note | string | 注释 | ```json { "robot": 1, "posName": "GP0001", "pos": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 2, 3.3, 0, 0], "note": "qqq" } ``` ## 查询全局位置变量 **命令字:** `0x6003` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | posName | string | 点位名称 | | initialValue | bool | 初始化,可选发送或不发送 | ```json { "robot": 1, "posName": "GP0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6004` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | initialValue | bool | 初始化 | | posName | string | 点位名称 | | posValue | double[] | 点位数据(弧度制) | | posValueDeg | double[] | 点位数据(角度制) | | note | string | 注释 | ```json { "initialValue": true, "note": "qqq", "posName": "GP0001", "posValue": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "posValueDeg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot": 1 } ``` ## 局部变量 ### 局部变量位置变量 P 点查询 **命令字:** `0x6010` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | ```json { "robot": 1, "varname": "P0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6011` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | pos | double[] | 弧度制点位数据 | | posDeg | double[] | 角度制点位数据 | ```json { "robot": 1, "jobname": "Q1", "varname": "P0001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6] } ``` ### 局部变量位置变量 E 点查询 **命令字:** `0x6012` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | ```json { "robot": 1, "varname": "E0001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6013` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | varname | string | 点位名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | pos | double[] | 弧度制点位数据 | | posDeg | double[] | 角度制点位数据 | ```json { "robot": 1, "jobname": "Q1", "varname": "E0001", "initialValue": true, "pos": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "posDeg": [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } ``` ### 局部变量查询 **命令字:** `0x6014` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 机器人号,取值范围 [1,4] | | vartype | int | 变量类型:0 int 型,1 double 型,2 bool 型,3 string 型 | | varname | string | 变量名称 | | initialValue | bool | 是否为初始值,true:是,false:否 | | identify | string | CommandInsert:插入指令界面变量,VariableReview:监控界面数值变量 | ```json { "robot": 1, "vartype": 1, "varname": "I001", "initialValue": true, "identify": "CommandInsert" } ``` **控制器回复** **命令字:** `0x6015` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | jobname | string | 作业文件名称 | | vartype | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varname | string | 变量名称 | | value | double | 若变量为数值类型,通过 value 传输 | | string | string | 若变量为字符串类型,通过 string 传输 | | identify | string | CommandInsert:插入指令界面变量,VariableReview:监控界面数值变量 | ```json { "robot": 1, "jobname": "Q1", "vartype": 1, "varname": "I001", "value": 2, "string": "i'm a string", "identify": "CommandInsert" } ``` ## 全局变量 ### 设置全局变量 **命令字:** `0x6020` | 字段 | 类型 | 说明 | |------|------|------| | varName | string | 变量名称 | | varType | int | 变量类型:0 int 型,1 double 型,2 bool 型,3 string 型 | | varValue | double | 变量值 | | varString | string | 当 varType = 3 时使用此字段传输 | | varNote | string | 注释 | ```json { "varName": "GD001", "varType": 1, "varValue": 14.0, "varString": "oooo", "varNote": "aaa" } ``` ### 获取全局数值变量 **命令字:** `0x6021` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | ```json { "varType": 1 } ``` **控制器回复** **命令字:** `0x6022` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varNum | int | 数值变量个数,范围 [1, 100] | | varList | array | 变量列表 | | varList[].varName | string | 变量名称 | | varList[].varValue | double | 变量值 | | varList[].varNote | string | 注释 | ```json { "varType": 1, "varNum": 2, "varList": [ { "varName": "I001", "varValue": 3, "varNote": "QQQ" }, { "varName": "D002", "varValue": 8.4, "varNote": "hhha" } ] } ``` ### 全局变量注释查询 **命令字:** `0x6023` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | ```json { "varType": 1 } ``` **控制器回复** **命令字:** `0x6024` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型:1 bool 型,2 int 型,3 double 型 | | varNote | object | 变量注释对象,键为变量名,值为注释内容 | ```json { "varNote": { "GI001": "9999" }, "varType": 1 } ``` ## 全局外部轴变量 ### 设置全局外部轴变量 **命令字:** `0x6025` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | pos | double[] | 点位数据,格式:点位信息(7) + 机器人位置(7) + 外部轴位置(5) + 预留(2) | | note | string | 注释 | ```json { "robot": 1, "varname": "GE0001", "pos": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4], "note": "qqq" } ``` ### 查询全局外部轴变量 **命令字:** `0x6026` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始化值,true:是,false:否 | ```json { "robot": 1, "varname": "GE001", "initialValue": true } ``` **控制器回复** **命令字:** `0x6027` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | varname | string | 点位名称 | | initialValue | bool | 是否为初始化值 | | note | string | 注释 | | posValue | double[] | GP + 外部点(角度制) | | posValueDeg | double[] | GP + 外部点(弧度制) | ```json { "initialValue": true, "note": "qqq", "posValue": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 0.0, 0.0], "posValueDeg": [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 0.0, 0.0], "robot": 1, "varname": "GE001" } ``` ### 获取全部全局外部轴点位 **命令字:** `0x6028` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | ```json { "robot": 1 } ``` **控制器回复** **命令字:** `0x6029` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | globalExtPosition | object | 点位列表,键为变量名,值为 double[] | | note | object | 注释列表,键为变量名,值为注释字符串 | ```json { "robot": 1, "globalExtPosition": { "GE001": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6], "GE003": [0, 0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6] }, "note": { "GE001": "qqqq", "GE002": "", "GE003": "www" } } ``` ## 查询指定坐标下的位置 **命令字:** `0x602A` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,取值范围 [1,4] | | name | string | 点位名称 | | initialValue | bool | 是否为初始化值 | | targetCoord | int | 目标坐标系类型 | ```json { "initialValue": true, "name": "GP0001", "targetCoord": 3 } ``` **控制器回复** **命令字:** `0x602B` | 字段 | 类型 | 说明 | |------|------|------| | robot | int | 选择机器人,范围 [1,4] | | posName | string | 点位名称 | | result | int | 坐标系转换是否正确 | | pos | array | 位置信息,0~6 信息,7~13 机器人本体,14~18 外部轴(角度制) | | initialValue | bool | 是否为初始化值 | ```json { "robot": 1, "posName": "GP0001", "result": 0, "pos": [0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "initialValue": true } ``` ## 查询一个全局变量 **命令字:** `0x602C` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型 | | varName | string | 变量名称 | | identity | string | 来源标识:VariableReview 监控界面的全局变量,NumerlcalVarWidget 全局数值变量界面 | ```json { "varType": 1, "varName": "GI001", "identity": "VariableReview" } ``` **控制器回复** **命令字:** `0x602D` | 字段 | 类型 | 说明 | |------|------|------| | varType | int | 变量类型 | | varName | string | 变量名称 | | identity | string | 来源标识 | | varNote | string | 注释 | | varValue | double | 变量值 | ```json { "varType": 1, "varName": "GI001", "identity": "VariableReview", "varNote": "9999", "varValue": 16.0 } ``` --- # 拖拽示教 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/01.%E5%8D%8F%E8%AE%AE/07.%E6%8B%96%E6%8B%BD%E7%A4%BA%E6%95%99.html ## 1 拖动模式 ### 1.1 上位机设置拖拽模式参数 **命令字:** `0x4074` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | mode | int | [0,3] | 拖动方式:0-无,1-3D 鼠标,2-力矩,3-位置 | | port | int | 当前绑定 IO 端口数 | 外部触发信号端口 | | value | int | [0,1] | 外部触发信号参数 | ```json { "mode": 2, "port": 0, "value": 0 } ``` --- ### 1.2 上位机查询拖拽模式参数 **命令字:** `0x4075` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4076` | 参数名 | 类型 | 说明 | |--------|------|------| | mode | int | 拖动方式,范围[0,3] | | port | int | 外部触发信号端口 | | value | int | 外部触发信号参数,范围[0,1] | ```json { "mode": 2, "port": 0, "value": 0 } ``` --- ### 1.3 上位机设置力矩参数 **命令字:** `0x4085` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | DecareLimit | double | [0,∞) m/s | 笛卡尔空间线速度限制 | | JointVelLimit | double | [0,∞) °/s | 关节空间速度限制 | | dragCoefficient | double[6] | [1,100] | 超限阻力系数 | | drag_mode | int | [0,2] | 拖动模式:0-自由拖动,1-位置拖动,2-姿态拖动 | | frictionOffset | double[6] | [0,0.99] | 关节摩擦力补偿矫正系数 | | targetTorqCoefficient | double[6] | [0,1] | 关节目标扭矩矫正系数 | | waitCycle | double | [1,10] | 下发给伺服力矩参数等待周期 | ```json { "DecareLimit": 2.50, "JointVelLimit": 1.0, "dragCoefficient": [5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode": 0, "frictionOffset": [0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient": [1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle": 5.0 } ``` --- ### 1.4 上位机查询力矩参数 **命令字:** `0x4086` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4087` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | DecareLimit | double | [0,∞) m/s | 笛卡尔空间线速度限制 | | JointVelLimit | double | [0,∞) °/s | 关节空间速度限制 | | dragCoefficient | double[6] | [1,100] | 超限阻力系数 | | drag_mode | int | [0,2] | 拖动模式 | | frictionOffset | double[6] | [0,0.99] | 关节摩擦力补偿矫正系数 | | targetTorqCoefficient | double[6] | [0,1] | 关节目标扭矩矫正系数 | | waitCycle | double | [1,10] | 下发给伺服力矩参数等待周期 | ```json { "DecareLimit": 2.50, "JointVelLimit": 1.0, "dragCoefficient": [5.0,5.0,5.0,5.0,5.0,5.0], "drag_mode": 0, "frictionOffset": [0.0,0.0,0.0,0.0,0.0,0.0], "targetTorqCoefficient": [1.0,1.0,1.0,1.0,1.0,1.0], "waitCycle": 5.0 } ``` --- ## 2 轨迹管理 > **说明:** 轨迹保存结果通过0x4070返回。 ### 2.1 上位机查询拖拽轨迹是否被记录 **命令字:** `0x408B` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4070` | 参数名 | 类型 | 说明 | |--------|------|------| | record | bool | 轨迹是否被记录 | ```json { "record": false } ``` --- ### 2.2 上位机请求轨迹回放 **命令字:** `0x4071` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | trajName | string | - | 需要回放的轨迹名称 | | vel | int | [1,100] | 轨迹回放运行速度 | ```json { "trajName": "AAA", "vel": 100 } ``` --- ### 2.3 上位机请求保存拖拽轨迹 **命令字:** `0x4072` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string | 需要保存的轨迹名称,若为空则保存失败 | ```json { "TrajName": "AAA" } ``` --- ### 2.4 上位机请求删除拖拽轨迹 **命令字:** `0x4073` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string | 需要删除的轨迹名称 | ```json { "TrajName": "AAA" } ``` --- ### 2.5 上位机查询拖拽轨迹列表 **命令字:** `0x4083` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x4084` | 参数名 | 类型 | 说明 | |--------|------|------| | TrajName | string[] | 已保存轨迹列表,长度为当前已保存轨迹数量,若无轨迹则该节点不存在 | ```json { "TrajName": ["AAA"] } ``` --- ### 2.6 上位机设置轨迹记录参数 **命令字:** `0x4088` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | MaxSamplingNum | double | (200,1200) | 最大采样点数 | | SamplingInterval | double | [0.03,1] | 采样间隔(秒) | | Start | bool | - | 开始/停止记录:true-开始记录,false-停止记录;false 时"MaxSamplingNum"和"SamplingInterval"可以不存在 | ```json { "MaxSamplingNum": 300.0, "SamplingInterval": 0.030, "Start": true } ``` --- ### 2.7 上位机查询轨迹记录参数 **命令字:** `0x4089` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x408A` | 参数名 | 类型 | 取值范围 | 说明 | |--------|------|----------|------| | MaxSamplingNum | double | (200,1200) | 最大采样点数 | | SamplingInterval | double | [0.03,1] | 采样间隔(秒) | | Start | bool | - | 开始/停止记录:true-开始记录,false-停止记录 | ```json { "MaxSamplingNum": 300.0, "SamplingInterval": 0.030, "Start": false } ``` --- ### 2.8 上位机查询拖拽轨迹文件列表 **命令字:** `0x408C` **请求参数:** ```json {} ``` **响应参数:** **命令字:** `0x408D` | 参数名 | 类型 | 说明 | |--------|------|------| | absolutepath | string | 控制器中拖拽轨迹文件存放地址 | | trajectory_filelist | string[] | 拖拽轨迹文件列表,"drag_traj_details.json"为轨迹记录信息文件 | ```json { "absolutepath": "dragPos/", "trajectory_filelist": ["AAA","JJ","drag_traj_details.json"] } ``` --- # 变更日志 > 原文:https://open.inexbot.com/zh/05.JSON-%E5%8D%8F%E8%AE%AE/04.dev-rt/02.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html TODO:待补充 --- # 快速开始 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html ## 1. 环境安装 ### 1.1 系统要求 当前推荐的开发环境操作系统为: 当前支持的编译套件包括: - Ubuntu 20.04 需要根据不同的控制器型号,选择不同的编译套件。 我们提供打包了所有开发环境的镜像文件,当然也可以在任意一台 Ubuntu 20.04 下参照小节《1.2 编译套件安装》来安装。 > 直接获取安装好了的虚拟机 > 点击这里 可以下载得到配置好开发环境的、基于 VirtualBox 软件使用的 Ubuntu 20.04.1 系统的虚拟机; > 点击这里 可以下载得到基于 Windows 系统的 VirtualBox 软件安装包,如需其他系统版本的请自行到 VirtualBox 官网 进行下载。 > • > 安装 VirtualBox 软件(注意按转路径不能带有中文) > • > 打开下载的“开发环境虚拟机”文件夹,按照“README.txt”文件说明安装虚拟机; > • > 开机后登录账户“nbt”,密码是“123”。 ### 1.2 编译套件安装 以下编译链根据具体的控制器硬件选择安装: #### 1.2.1 gcc-4.8 编译套件安装 因为 Ubuntu 20.04 自带的源 gcc 最低版本无法安装4.8。我们需要添加 trusty 的源。 ```bash sudo sh -c 'echo "deb http://dk.archive.ubuntu.com/ubuntu/ trusty main" >> /etc/a pt/sources.list' sudo sh -c 'echo "deb http://dk.archive.ubuntu.com/ubuntu/ trusty universe" >> /e tc/apt/sources.list' ``` ```bash sudo apt update sudo apt install -y gcc-4.8 g++-4.8 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 40 sudo apt-get install -y gcc-4.8-multilib g++-4.8-multilib ``` 下载 lib32 库文件 解压 lib32.xxx 文件,并替换原有的/usr/lib32文件夹。 ```bash tar -zxvf lib32.xxx sudo rm -rf /usr/lib32 sudo mv usr/lib32 /usr/ ``` #### 1.2.2 gcc-9.4 编译套件安装 Ubuntu20.04 的源直接安装即可。 ```bash sudo apt install gcc g++ ``` #### 1.2.3 aarch64-Linux-gnu-gcc-5.3 编译套件安装 下载编译套件:链接: gcc-linaro-5.3.1-2016.05-x86_64_aarch64-Linux-gnu.tar.gz 提取码: w33y 新建 T5⽂件夹,将 gcc-linaro-5.3.1-2016.05-x86_64_aarch64-Linux-gnu.tar.gz 解压进去。 ```bash mkdir ~/T5 tar -zxvf gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu.tar.gz -C ~/T5 ``` 添加环境变量 ```bash gedit ~/.bashrc ``` 将下面这行拷贝到最后,保存退出即可。 ```bash export PATH=$PATH:$HOME/T5/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/bin ``` ## 2. 构建项目 ### 2.1 项目初始化 可以使用 VS code 或者其它 IDE 来开发。 新建一个 Demo 文件夹,将头文件放到 include 文件夹下,将 libNexRob.a 放到 lib 文件夹下。,目录的结构参考如下: ```text ├── include │ ├── nrcAPI.h │ └── nrcAPI_advance.h ├── lib │ └── libNexRob.a └── src └── main.cpp ``` ### 2.2 main.cpp 文件 ```cpp #include #include "nrcAPI.h" void SystemStartup() { //输出Nexmotion版本库信息 std::cout << "库版本:" << NRC_GetNexMotionLibVersion() << std::endl; //启动控制系统 NRC_StartController(); //检测控制系统是否初始化完成 while (NRC_GetControlInitComplete() != 1 ) { NRC_Delayms(100); //延时100ms } //清除所有错误 NRC_ClearAllError(); std::cout << "----" << NRC_GetControlInitComplete() << std::endl; std::cout << "StartController Success" << std::endl; std::cout << "获取同步版本号" << NRC_GetSyncVersion() << std::endl; NRC_Delayms(200); } int main() { //系统启动 SystemStartup(); std::cout << "Hello World" << std::endl; //保持程序继续运行 while(true) { NRC_Delayms(2000); } } ``` ### 2.3 编译代码 #### 2.3.1 直接编译 确认自己的控制器系统架构,选择对应的编译链工具,下面使用的是 gcc-4.8,根据架构不同,可以换成 gcc-9。 > 注:如果是 x64架构的控制器需要将 g++-4.8修改为 g++-9,-m32修改为-m64,如果控制器是 x86架构的可不用进行修改。 ```bash g++-4.8 -m32 -o nrc2.out src/*.cpp -I./include -L./lib -lNexRob -lpthread -lm -ldl -lrt -std=c++11 ``` - 支持的编译器版本 - gcc-4.8 - gcc-9.4 - aarch64-Linux-gnu-gcc-5.3 #### 2.3.2 使用 Makefile 新建 Makeifile 文件 在 Demo 目录下新建 Makefile 文件,将下面内容拷贝到 Makefile 文件中,并保存。 ```makefile TARGET=nrc2.out all : g++-4.8 -m32 -o nrc2.out src/*.cpp -I./include -L./lib -lNexRob -lpthread -lm -ldl -lrt -std=c++11 clean : rm $(TARGET) $(objects) ``` Makefile 文件建好之后在编译时只需要在 Demo 文件目录下打开终端输入 make 即可编译控制器可执行程序 在 Demo 目录下打开一个新的终端,输入 make,编译完成后在 Demo 目录下有一个 nrc2.out 的可执行程序 编译的流程如下图: ## 3. 远程登陆到控制器 ### 3.1 确认电脑连接上控制器 首先确保你的电脑已经跟控制器连接了通讯,电脑的 IP 需要跟控制器的 IP 在同一网段下。控制器的出厂默认 IP 为192.168.1.13,所以电脑连接控制器的网口同样需要设置为1网段(比如可以设置192.168.1.110)。设置完成之后在 Ubuntu 中打开一个新的终端输入 ```bash ping 192.168.1.13 ``` 出现下面如图所示,即为同控制器通讯通讯成功: 如出现不成功的情况,请检查网线的连接,电脑的 IP,控制器的 IP。 ## 3.2 使用 ssh 登陆到控制器 ```bash ssh inexbot@192.168.1.13 ``` 然后密码输入123,即可进行远程控制了。 ## 3.3 查看控制器系统架构 登陆进控制器后,可以通过 uname -a 查看控制器的架构 图中所示是三个 i686,分别为机器硬件名,处理器类型,硬件平台。i686我们俗称为32位系统。 ## 4. 将程序上传到控制器运行 ### 4.1 使用 SCP 上传程序 编译完成后,我们将要把程序给替换进控制器当中运行我们自己编译的二次开发程序,继续在当前终端下输入 ```bash scp nrc2.out inexbot@192.168.1.13:~/robot ``` 输入完成后会出现一句 “ inexbot@192.168.1.13's password: “。 我们继续敲123即可,当出现下图就表示程序已经程序替换进控制器当中了。 当然也会出现替换不成功的时候,终端会显示 Text file busy,这种情况就是控制器原本的 nrc2.out 程序还在运行,无法被替换。 这就需要 ssh 远程登陆到控制器的后台中将正在开启的 nrc2.out 进程给关闭。 ```bash sudo killall -9 nrc2.out ``` 进程关闭后就可以再次执行上面提到的 scp 的操作,就可以成功把二次开发程序替换到控制器当中。 ### 4.2 远程登陆到控制器中启动程序 随后就可以执行我们编译的二次开发程序,,在控制器后台的 robot 目录下输入 ```bash sudo ./nrc2.out ``` 执行的效果如下如: 到这一步我们的二次开发项目已经成功运行起来了。 --- ## 5. 调试与安全规范 ### 5.1 调试流程 新机型或新程序首次运行时,建议按以下步骤操作: 1. **初始化阶段** — 确认伺服连接状态,设置各轴正反限位、减速比,完成伺服映射 2. **示教模式上电** — 切换到示教模式,先以**低速**点动测试各轴,目视确认运动方向与速度响应正确 3. **逐步提速** — 确认无碰撞风险后,逐步提升速度至正常值 4. **运行测试** — 编写简单作业文件,测试完整运动流程 ### 5.2 上电规则 | 模式 | 上电规则 | | ----------------- | ---------------------------------------------------- | | **示教模式** | 只能为当前选中的单个机器人上电,保证操作安全性 | | **运行/多机模式** | 可同时为多个机器人上电,适用于已验证安全性的产线环境 | > **原因:** 示教模式下操作人员站在机器人旁,须保证人对机器人的绝对控制。运行模式下多机已调试完毕、安全性已验证,可并行运行。 ### 5.3 安全提醒 - **电机抱闸:** 没上使能时电机处于抱闸状态,手掰不动,防止重力导致掉落。上使能后抱闸松开、电机供电维持角度。 - **初始低速:** 软件总有 Bug 的可能,首次运行务必低速——万一参数填错、速度远超预期,后果可能是设备损坏或人身伤害。 - **急停可达:** 调试期间确保急停按钮在可触及范围内。 --- # 架构说明 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/01.%E6%96%87%E6%A1%A3/02.%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E.html 控制器运行于 Linux 实时系统,通过 `libnrc2` 库提供 C/C++ 二次开发接口。程序运行在控制器内部,适用于开发专用工艺。 ## 组件架构 ```text ┌──────────────────┐ │ 示教器 (Qt UI) │ ├──────────────────┤ │ NexDroid 核心 │ │ 运动规划 · 插补 │ │ 伺服控制 · IO │ ├──────────────────┤ │ Linux RT 系统 │ └──────────────────┘ ↕ 二次开发接口 (libnrc2 C API) ↕ 用户程序 ``` ## 功能模块 | 模块 | 说明 | |------|------| | 系统与初始化 | 启动控制器、模式切换、IP 修改、库版本 | | 伺服控制 | 上/下使能、状态查询、错误清除 | | 运动控制 | MoveJ/MoveL、点动、队列运动 | | 坐标系与标定 | 工具手、用户坐标、TCP、DH 参数 | | 作业文件 | 创建/打开/删除、指令插入、运行控制 | | 变量管理 | BOOL/INT/DOUBLE/位置变量读写 | | 工艺 | 码垛、焊接 | | 回调 | 指令完成回调、消息回调、周期回调 | ## 编译器版本 | 编译器 | 适用场景 | |--------|---------| | GCC 4.8 | 控制器运行时编译(32 位 i686) | | GCC 9.4 | Ubuntu 20.04 开发环境 | | aarch64-linux-gnu-gcc 5.3 | ARM64 交叉编译 | ## 版本信息 | 版本 | 日期 | 说明 | |------|------|------| | 1.0.0 | — | 初始版本 | ## 控制器产品架构 控制器采用 **IPC + RTOS** 架构:Intel X86 平台结合 Linux 实时操作系统(Linux RT),在保证实时性的同时提供强大的计算性能。 | 特性 | 说明 | |------|------| | 控制轴数 | 最多 64 轴同步插补运动 | | 机器人数量 | 一台控制器同时控制最多 4 台工业机器人 | | 总线架构 | EtherCAT、Canopen 总线实现伺服主从站连接 | | 构型算法 | 串联多关节、并联多关节、SCARA、直角坐标、连杆结构等 30 余种 | | 平台 | Intel Celeron J1900 2.0GHz / 4G 内存(C1102) | ### 总线型架构 NRC 系列控制器采用 EtherCAT、Canopen 总线实现伺服主从站连接,支持最多 64 轴同步运动。相比传统脉冲控制型方案,大幅降低系统布线与维护成本,可扩展性极佳。 ## 多机协作机制 | 模式 | 说明 | |------|------| | 一拖多 | 一台控制器同时控制 4 台机器人,每台机器人的参数、程序相互独立 | | 同步启停 | 运行及远程模式下可令所有机器人同步运行、停止 | | 双机协作 | 可令两台机器人的启停完全同步 | | 外部轴搭配 | 每台机器人可搭配任意种类外部轴(地轨、变位机、龙门架) | ## 通讯协议栈 | 协议 | 类型 | 用途 | |------|------|------| | EtherCAT | 实时总线 | 伺服轴控制(主站) | | ModbusTCP / ModbusRTU | 工业以太网/串口 | 与 PLC、HMI 通讯 | | Ethernet/IP (EIP) | 工业以太网 | 与罗克韦尔系设备通讯 | | OPC-UA | 工业以太网 | 数据采集与系统集成 | | FinsTCP | 工业以太网 | 与欧姆龙 PLC 通讯 | | TCP/IP | 通用以太网 | 上位机二次开发 | ## 工艺包体系 | 工艺 | 说明 | |------|------| | 焊接 | 弧焊、氩弧焊、激光焊、电阻焊(点焊) | | 切割 | 激光切割 | | 涂装 | 喷涂、点胶 | | 物流 | 码垛、上下料、传送带跟踪 | | 智能 | 视觉、焊缝跟踪、碰撞检测、拖拽示教 | 系统内置上述通用工艺,并支持根据用户需求进行定制工艺开发。 ## 二次开发架构 ```text ┌────────────────────────────┐ │ 用户工艺程序 / HMI │ ├────────────────────────────┤ │ NexDroid OpenAPI 接口 │ ├────────────────────────────┤ │ libnrc2 库 │ ├────────────────────────────┤ │ Linux RT 实时系统 │ └────────────────────────────┘ ``` 利用 NexDroid OpenAPI 接口,用户可自行设计开发工艺系统和人机交互界面,甚至可以自行实现专用的机器人正逆解、轨迹规划算法。 ## 编程方式 | 方式 | 说明 | |------|------| | 示教编程 | 通过示教器手动示教点位并编程 | | 离线编程 | PC 端示教软件、组态软件式触摸屏编程 | | 拖动示教 | 拖动机器人本体记录轨迹 | --- # 核心概念 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/01.%E6%96%87%E6%A1%A3/03.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html ## 编程模型 控制器二次开发采用事件驱动模型: 1. **启动 →** `NRC_StartController` 启动控制器 2. **初始化 →** 轮询 `NRC_GetControlInitComplete` 等待就绪 3. **配置 →** 设置操作模式、伺服状态、坐标系等 4. **主循环 →** 执行作业文件或队列运动,处理回调 5. **清理 →** 停止并释放资源 ## 操作模式 | 模式 | 常量 | 说明 | |------|------|------| | 示教 | 0 | 人工操作单个机器人,安全优先 | | 远程 | 1 | 上位机接管控制权 | | 运行 | 2 | 自动执行作业文件,支持多机并行 | ## 运动方式 | 方式 | 说明 | 适用场景 | |------|------|---------| | 作业文件 | 预编程序列,支持循环和逻辑 | 固定任务 | | 队列模式(无文件) | 直接下发目标点 | 上位机实时控制 | | 追加模式 | 边运动边追加新指令 | 视觉引导 | ## 坐标系 | 坐标类型 | coord 参数 | |----------|-----------| | 关节坐标 | 0 | | 直角坐标 | 1 | | 工具坐标 | 2 | | 用户坐标 | 3 | ## 伺服状态 - **停止(0)** — 未使能 - **就绪(1)** — 等待上电 - **报警(2)** — 错误状态,需要清错 - **运行(3)** — 已上电,可运动 ## 系统启动流程 控制器启动后按以下流程完成初始化: 1. **启动 →** `NRC_StartController` 启动控制器核心 2. **等待就绪 →** 轮询 `NRC_GetControlInitComplete` 直到返回初始化完成 3. **系统配置 →** 设置操作模式(示教/远程/运行)、伺服状态、坐标系 4. **工艺配置 →** 选择工艺号(craftID 1-9)、设置工艺参数 5. **运行 →** 执行作业文件或队列运动,进入主循环 6. **停止 →** 停止运动、下电、释放资源 > 初始化未完成前不应下发运动指令,否则可能返回错误或导致不可预期行为。 ## 指令系统 | 指令类型 | 说明 | 示例 | |----------|------|------| | 运动指令 | 控制机器人运动 | MoveJ、MoveL、MoveC、样条曲线、直线横摆、FLYBY | | 逻辑指令 | 程序流程控制 | IF、WHILE、UNTIL、JUMP、LABEL | | 输入输出指令 | 控制 IO 信号 | IO_OUT、延时 TIMER | | 运算指令 | 数据计算与变量操作 | 数学运算、字符串、位置变量 | ## 位置控制方式 | 方式 | 说明 | |------|------| | 点到点控制(PTP) | 关节空间快速定位,路径不固定(MoveJ) | | 连续轨迹控制(CP) | 笛卡尔空间直线/圆弧/样条,路径精确(MoveL/MoveC) | ## 坐标系与构型算法 | 坐标系统 | 说明 | |----------|------| | 关节坐标系 | 各关节电机的角度位置 | | 机器人坐标系 | 末端相对机器人底座的位置(直角坐标) | | 工具坐标系 | 末端安装工具后的 TCP 位置 | | 用户坐标系 | 工作台上自定义的局部坐标系 | 控制器内置 20 余种构型算法(6 轴串联、SCARA、并联、直角坐标、连杆结构等),每种构型对应独立的 DH 参数与正逆解算法。 ## 多机模式 | 模式 | 说明 | |------|------| | 单机模式 | 默认模式,控制 1 号机器人 | | 并行模式 | 多台机器人同步运行,通过 `set_robots_parallel` 开启 | | 双机协作 | 两台机器人启停完全同步,用于协同作业场景 | ## 事件回调 控制器二次开发采用事件驱动模型,通过回调函数响应异步事件: | 回调 | 触发时机 | |------|----------| | 指令完成回调 | 一条 move 指令执行完成 | | 消息回调 | 收到控制器推送的消息 | | 错误/警告回调 | 控制器上报错误或警告信息 | | 周期回调 | 周期性调用,用于实时数据处理 | > 回调函数内不应执行阻塞或耗时操作,耗时任务应放入独立线程。 --- # 二次开发 API(机器人基本参数设置) > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/02.%E6%8E%A5%E5%8F%A3/01.%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%9F%BA%E6%9C%AC%E5%8F%82%E6%95%B0%E8%AE%BE%E7%BD%AE.html 本章节涵盖系统初始化、伺服控制、运动控制、坐标系标定、IO 通信、变量管理、回调函数等核心接口。 ## 函数分类索引 ### 系统与初始化 | 函数 | 说明 | |------|------| | NRC_StartController | 启动控制器 | | NRC_GetControlInitComplete | 等待初始化完成 | | NRC_SetOperationMode | 设置操作模式(示教 0 / 远程 1 / 运行 2) | | NRC_RebootController | 重启控制器 | | NRC_RestoreFactorySettings | 恢复出厂设置 | | NRC_ModifyControllerIP | 修改控制器 IP | | NRC_GetRobotSum | 获取机器人数量 | | NRC_SetRobotMode | 设置多机模式 | | NRC_ShieldedTeachingPendant | 屏蔽示教器连接检测(需在启动前调用) | | NRC_GetNexMotionLibVersion | 获取库版本 | | NRC_GetSyncVersion | 获取同步版本号 | | NRC_Delayms | 延时(毫秒) | | NRC_LogInfo | 打印日志 | ### 伺服控制 | 函数 | 说明 | |------|------| | NRC_PowerOn / NRC_PowerOff | 伺服上/下使能 | | NRC_ServoEnable / NRC_ServoDisable | 示教模式上/下使能(需按 deadman) | | NRC_SetServoReadyStatus | 切换伺服准备状态 | | NRC_GetServoStatus | 获取伺服状态(0-禁止 1-就绪 2-报警 3-允许) | | NRC_GetPowerOffSaveSignal | 获取通电状态 | | NRC_ClearServoError / NRC_ClearAllError | 清除伺服/全部错误 | ### 运动控制 | 函数 | 说明 | |------|------| | NRC_RobotMoveJoint | 机器人点到点运动 | | NRC_RobotMoveJointSync | 机器人外部轴点对点运动 | | NRC_RobotMoveLineSync | 机器人直线运动(本体+外部轴) | | NRC_JogMove / NRC_JogMoveStop / NRC_JogMoveStopAll | 点动控制 | | NRC_StartResetPoint | 回复位点 | | NRC_SetTargetVelocity | 设置目标速度(PV 模式) | | NRC_PosReachable | 判断点位是否可到达 | | NRC_SetTargetPosition | 设置机器人目标位置 | | NRC_GetPlanningPosition | 获取规划队列第一个点位 | | NRC_PV_SetTargetVelocity / NRC_PV_SetTargetAccAndDec | PV 模式速度/加速度 | ### 速度控制 | 函数 | 说明 | |------|------| | NRC_SetTeachRunSpeedPer / NRC_GetTeachRunSpeedPer | 示教速度百分比 | | NRC_SetAutoRunSpeedPer / NRC_GetAutoRunSpeedPer | 自动速度百分比 | | NRC_GetAngularVel | 获取关节角速度(rad/s) | | NRC_GetLinerVel | 获取线速度(mm/s) | | NRC_GetAxisVelSync | 获取外部轴速度 | ### 点动配置 | 函数 | 说明 | |------|------| | NRC_SetJogJointSpeedConfig / NRC_GetJogJointSpeedConfig | 点动关节速度 | | NRC_SetJogRectangularSpeedConfig / NRC_GetJogRectangularSpeedConfig | 点动直角速度 | | NRC_SetJogSensitivitySpeedConfig | 点动灵敏度 | | NRC_SetJogMoveCalculateNum | 点动插补点位个数 | ### 坐标系与标定 | 函数 | 说明 | |------|------| | NRC_SetCurrentCoord / NRC_GetCurrentCoord | 切换/获取当前坐标系 | | NRC_PositionACStoMCS / NRC_PositionMCStoACS | 关节↔直角坐标转换 | | NRC_TcpCalculate | TCP 固定距离偏移计算 | **工具手:** | 函数 | 说明 | |------|------| | NRC_SetToolCoordParm / NRC_GetToolCoordParm | 设置/获取工具手参数 | | NRC_CalibrationToolCoord_7Pos | 7点/6点标定 | | NRC_CalibrationToolCoord_2Pos_SetPos / _Cacl / _Save | 2点标定(三步) | | NRC_SwitchToolCoord / NRC_GetCurrentToolCoord | 切换/获取当前工具手 | **用户坐标:** | 函数 | 说明 | |------|------| | NRC_SetUserCoordParm / NRC_GetUserCoordParm | 设置/获取用户坐标参数 | | NRC_CalibrationUserCoord | 用户坐标标定(3点法) | | NRC_SwitchUserCoord / NRC_GetCurrentUserCoord | 切换/获取当前用户坐标 | ### 位置与零点 | 函数 | 说明 | |------|------| | NRC_GetCurrentPos / NRC_Rbt_GetCurrentPos | 获取当前位置 | | NRC_GetOtherToolPos | 获取其他工具坐标系下的位置 | | NRC_GetEncoderPosition | 获取编码器位置 | | NRC_SetCurrentPosToZeroPos / NRC_Rbt_SetCurrentPosToZeroPos | 设置零点/清除多圈值 | | NRC_Rbt_SetSingleCircleValue / NRC_Rbt_GetSingleCircleValue | 设置/获取单圈值 | ### 外部轴 | 函数 | 说明 | |------|------| | NRC_SetSyncJointNum | 设置外部轴数目 | | NRC_SetSyncJointPara / NRC_GetSyncJointPara | 设置/获取外部轴参数 | | NRC_SetSyncGroupCarbinarion / NRC_CalSyncCalibrationResult | 外部轴标定 | | NRC_SetCurrentSyncPosToZeroPos | 外部轴零点设置 | | NRC_SingleSyncAxisMoveJConstVel_For_CustomInstructionCB | 外部轴恒速运动 | | NRC_GetCurrentSyncPos / NRC_Rbt_GetCurrentSyncPos | 获取外部轴位置 | ### 力矩与动力学 | 函数 | 说明 | |------|------| | NRC_SetTargetTorque / NRC_GetActualTorque | 设置/获取力矩 | | NRC_GetActualCurrent / NRC_GetMaxCurrent | 电流控制 | | NRC_GetRatedTorque / NRC_GetTorq | 额定力矩 | | NRC_SetIdentityParam | 设置动力学辨识参数 | | NRC_RunSafeCheckProgram / NRC_RunIdentifyProgram | 安全检测/动力学辨识 | | NRC_SetCollisionParam / NRC_SetCollisionSwitch | 碰撞检测 | ### IO 控制 | 函数 | 说明 | |------|------| | NRC_DigOut / NRC_DigOutByBoard | 数字输出 | | NRC_ReadDigOut / NRC_ReadDigOutByBoard | 读取数字输出 | | NRC_ReadDigIn / NRC_ReadDigInByBoard | 读取数字输入 | | NRC_AnaOut / NRC_ReadAnaOut / NRC_ReadAnaIn | 模拟 IO | ### 通信接口 | 函数 | 说明 | |------|------| | NRC_SetCANBaudRate / NRC_SendCANData | CAN 通信 | | NRC_SetCommunicationParam / NRC_SetCommunicationStatus | TCP 通信参数 | | NRC_SetTcpMessageCallback | TCP 消息回调 | | NRC_CommSendMessage | 发送 TCP 消息 | | NRC_GetModbusSlaveConnectStatus / NRC_GetModbusMasterConnectStatus | Modbus 状态 | | NRC_SetSocketCustomProtocalCB / NRC_SendSocketCustomProtocal | 自定义 Socket 协议 | ### 消息与错误 | 函数 | 说明 | |------|------| | NRC_SetMsgHappenCallback | 消息发生回调 | | NRC_FirstMessagePop / NRC_LastMessagePop | 弹出首/尾消息 | | NRC_GetMessage / NRC_GetMessageSize | 获取消息 | | NRC_ClearMessage | 清除消息队列 | | NRC_TriggerErrorReport | 主动触发报错 | ### 变量管理 | 函数 | 说明 | |------|------| | NRC_SetBoolVar / NRC_ReadBoolVar | BOOL 变量 | | NRC_SetIntVar / NRC_ReadIntVar | INT 变量 | | NRC_SetDoubleVar / NRC_ReadDoubleVar | DOUBLE 变量 | | NRC_SetGlobalPositionVariable / NRC_GetGlobalPositionVariable | 全局位置变量 | | NRC_SetGlobalPositionVariableNote / NRC_GetGlobalPositionVariableNote | 全局位置变量注释 | | NRC_GetCurrentTime | 获取当前时间 | ### 机器人参数 | 函数 | 说明 | |------|------| | NRC_SetRobotTypeConfig / NRC_GetRobotTypeConfig | 机器人类型 | | NRC_Rbt_SetRobotTypeConfig / NRC_Rbt_GetRobotTypeConfig | 机器人类型(多机版) | | NRC_SetRobotDHConfig / NRC_GetRobotDHConfig | DH 参数 | | NRC_SetRobotJointConfig | 关节参数 | | NRC_SetRobotDecareConfig / NRC_GetRobotDecareConfig | 笛卡尔参数 | | NRC_CalcConfiguration | 计算机器人形态 | | NRC_GetRobotAxisSum | 获取机器人轴数 | | NRC_GetSyncAxisSum | 获取外部轴轴数 | | NRC_SetRobotRangeLimit / NRC_GetRobotRangeLimit | 范围限制 | | NRC_SetServoMapRelation / NRC_SetAllServoMapRelation | 伺服映射关系 | | NRC_GetConnectServoTypeList | 获取连接的伺服类型 | | NRC_GetSlaveNumByID | 通过 ID 获取从站编号 | | NRC_GetPDOAddrMap | 获取 PDO 映射地址 | | NRC_GetEthercatIOConfig | 获取 EthercatIO 配置 | | NRC_EnableCustomIOFunction | 使能自定义 IO 功能 | | NRC_SetCustomIODoutConfig / NRC_SetCustomIODinConfig | 自定义 IO dout/din 配置 | | NRC_SetCheckExioEnable | 内置 TCP 接口扩展 IO 检测 | ### 运动辅助参数 | 函数 | 说明 | |------|------| | NRC_SetInterpolationMethod | 设置插补方式(S 型/梯形) | | NRC_SetAbsolutePosResolution | 绝对位置分辨率 | | NRC_SetDynamicTrackingErrorMaxAllow | 动态超差值 | | NRC_SetStaticTrackingErrorMaxAllow | 静态超差值 | | NRC_SetTeachMaxStepSpeed / NRC_GetTeachMaxStepSpeed | 示教最大单步速度 | | NRC_ecatSetCommand / NRC_ecatGetCommand | 伺服命令字读写 | ### 回调函数 | 函数 | 说明 | |------|------| | NRC_SetCompleteOneInstrCallBack | 设置指令完成回调 | | NRC_SetJobFileCustomInstructionCB | 设置自定义指令回调 | | NRC_SetMsgHappenCallback | 设置消息回调 | | NRC_SetSocketCustomProtocalCB | 设置 TCP 协议回调 | | NRC_SetFaultResetCB | 设置清错按键回调 | | NRC_robotRunCycle_Callback | 设置通讯周期回调(1ms) | 详细接口文档" tabindex="-1">详细接口文档 ​ 本章介绍系统启动、初始化、控制器网络配置、重启与恢复出厂设置等功能。 ### 1.1 系统启动与初始化 ​ | 函数名称 | 函数功能 || NRC_StartController系统启动函数。 | |------|------|------|------| | NRC_GetControlInitComplete查看系统初始化是否完成。 | | NRC_RestoreFactorySettings恢复出厂设置。 | | NRC_RebootController重启控制器。 | | NRC_ModifyControllerIP修改控制器 IP 地址。 | | NRC_GetControlCycle获取控制器与伺服的通讯周期。 | | NRC_ShieldedTeachingPendant屏蔽示教器连接状态检测(需要在系统启动函数前调用)。 | | NRC_GetRobotSum获取机器人数量。 | | NRC_SetRobotMode设置机器人为多机模式。 | | NRC_Delayms系统延时一定时间。 | | NRC_LogInfo向 NRC 系统中打印日志。 | | NRC_GetNexMotionLibVersion获取 NexMotion 库版本信息。 | | NRC_GetSyncVersion获取同步版本号。 | ### 1.2 伺服使能与状态控制 ​ | 函数名称 | 函数功能 || NRC_PowerOn伺服上使能。 | |------|------|------|------| | NRC_PowerOff伺服下使能。 | | NRC_ServoEnable按下 deadman 键,使伺服处于上使能的状态。 | | NRC_ServoDisable松开 deadman 键,使伺服处于下使能的状态。 | | NRC_SetServoReadyStatus切换伺服准备状态。 | | NRC_GetServoStatus获取伺服状态。 | | NRC_GetPowerOffSaveSignal获取机器人通电状态。 | | NRC_SetServoModerOfOperation设置伺服运行模式。 | | NRC_Rbt_SetServoModerOfOperation设置伺服运行模式,多机版。 | | NRC_GetServoMode获取伺服运行模式。 | | NRC_GetStatusWord读取伺服状态字。 | ### 1.3 操作模式与状态 ​ | 函数名称 | 函数功能 || NRC_SetOperationMode设置操作模式。 | |------|------|------|------| | NRC_SetRunModeAutoManBegFlag设置切到运行模式自动上电。 | | NRC_GetProgramRunStatus获取当前程序运行状态。 | | NRC_GetRobotRunStatus获取当前机器人运动状态。 | | NRC_GetTeachBoxConnectStatus获取是否连接了示教盒。 | ## 第二章:机器人基本参数设置 ​ 概述 本章介绍机器人基本参数的设置函数接口,包括机器人类型配置、伺服映射、DH 参数、关节/笛卡尔参数等基础设置。 ### 2.1 机器人类型与配置 ​ | 函数名称 | 函数功能 || NRC_SetRobotTypeConfig设置机器人类型。 | |------|------|------|------| | NRC_Rbt_SetRobotTypeConfig设置机器人类型(多机版)。 | | NRC_GetRobotTypeConfig获取机器人类型。 | | NRC_Rbt_GetRobotTypeConfig获取机器人类型(多机版)。 | | NRC_SetRobotDHConfig设置机器人 DH 参数。 | | NRC_GetRobotDHConfig获取机器人 DH 参数。 | | NRC_SetRobotJointConfig设置机器人关节参数。 | | NRC_SetRobotDecareConfig设置机器人笛卡尔参数。 | | NRC_GetRobotDecareConfig获取机器人笛卡尔参数。 | | NRC_CalcConfiguration计算机器人各关节在 acsPos 下的形态,仅对 R_GENERAL_6S 类型机器人有效,其余机器人类型下 conf 值为0。 | ### 2.2 伺服映射与配置 ​ | 函数名称 | 函数功能 || NRC_SetServoMapRelation设置伺服映射关系。 | |------|------|------|------| | NRC_SetAllServoMapRelation设置伺服映射关系(仅一个机器人的时候可以使用)。 | | NRC_Rbt_SetAllServoMapRelation设置伺服映射关系 (多机版)。 | | NRC_GetConnectServoTypeList获取连接的伺服类型列表。 | | NRC_GetSlaveNumByID通过从站 vendorID 和 productCode 获取从站的编号列表。 | | NRC_ecatSetCommand设置伺服某命令字的值。 | | NRC_ecatGetCommand读取伺服某命令字的值。 | | NRC_GetPDOAddrMap获取从站 PDO 的映射地址。 | ### 2.3 机器人轴数与限制 ​ | 函数名称 | 函数功能 || NRC_GetRobotAxisSum获取机器人轴数。 | |------|------|------|------| | NRC_GetSyncAxisSum获取外部轴轴数。 | | NRC_SetRobotRangeLimit设置机器人范围限制。 | | NRC_GetRobotRangeLimit获取机器人范围限制。 | | NRC_SetOverTolerance设置机器人轴超差。 | | NRC_Rbt_SetOverTolerance设置机器人轴超差,多机版。 | | NRC_GetTolerance获取机器人轴超差。 | | NRC_Rbt_GetTolerance获取机器人轴超差,多机版。 | | NRC_ShieldFollowError屏蔽机器人轴跟随误差。 | ## 第三章:外部轴配置与管理 ​ 概述 本章介绍外部轴(地轨、变位机等)的参数设置、标定、运动控制等功能。 ### 3.1 外部轴基本设置 ​ | 函数名称 | 函数功能 || NRC_SetSyncJointNum设置机器人外部轴数目。 | |------|------|------|------| | NRC_GetSyncGroupNum获取当前外部轴组号。 | | NRC_SetSyncGroupNum设置机器人外部轴组号。 | | NRC_SetSyncJointPara设置机器人外部轴参数。 | | NRC_GetSyncJointPara获取机器人外部轴参数。 | | NRC_Rbt_GetSyncJointType获取机器人外部轴组类型。 | | NRC_EncoderZeroOffsetSync设置外部轴零点偏移。 | ### 3.2 外部轴运动参数 ​ | 函数名称 | 函数功能 || NRC_SetSyncJogJointSpeedConfig设置机器人外部轴点动关节速度。 | |------|------|------|------| | NRC_GetSyncJogJointSpeedConfig获取机器人外部轴点动关节速度。 | | NRC_GetSyncRackConversionRatio获取外部轴地轨转换比。 | | NRC_SetSyncRackConversionRatio设置外部轴地轨转换比。 | | NRC_SetSyncCooperation设置外部轴地轨是否协作。 | | NRC_GetSyncCooperation获取外部轴地轨是否协作。 | | NRC_ResetSyncAxisMultipleTurns调用该接口,把外部轴当前位置重置到-360°~360°内,效果同示教器界面中的复位外部轴多圈转动量指令,该接口仅能重置单个外部轴。 | ### 3.3 外部轴标定 ​ | 函数名称 | 函数功能 || NRC_SetSyncGroupCarbinarion标定外部轴点位(组号,点位编号)。 | |------|------|------|------| | NRC_GetSyncGroupCarbinarion查询某组外部轴是否标定。 | | NRC_CalSyncCalibrationResult计算外部轴标定结果。 | | NRC_SetCurrentSyncPosToZeroPos将外部轴当前位置设置为零点或清除多圈值。 | ### 3.4 外部轴运动控制 ​ | 函数名称 | 函数功能 || NRC_RobotMoveJointSync机器人外部轴点到点运动,机器人外部轴以 vel 的速度从当前位置以点到点方式运行到 synctarget 位置。 | |------|------|------|------| | NRC_RobotMoveLineSync机器人外部轴直线运动,机器人本体以 vel 的速度从当前位置以直线方式运行到 target 位置,机器人外部轴以 vel 的速度从当前位置以点到点方式运行到 synctarget 位置。 | | NRC_GetAxisVelSync获取外部运动速度。 | | NRC_SingleSyncAxisMoveJConstVel_For_CustomInstructionCB调用该接口,在运行模式下,外部轴 syncAxis 将会以恒定的 vel 运动,同时调用多个该函数只有第一个该函数有效。 | | NRC_StopSingleSyncAxisMoveJConstVel_For_CustomInstructionCB调用该接口,将停止外部轴恒速运动,该接口必须在有外部轴恒速运动状态下调用,否则返回-1。 | | NRC_GetSingleSyncAxisMoveJConstVelMoving调用该接口获取单个外部轴恒速运动标志位。 | ## 第四章:运动控制与操作 ​ 概述 本章涵盖机器人运动控制相关接口,包括操作模式设置、点动控制、点到点运动、复位、速度控制等。 ### 4.1 点动控制 ​ | 函数名称 | 函数功能 || NRC_JogMove开始点动某轴。 | |------|------|------|------| | NRC_JogMoveStop停止某关节点动。 | | NRC_JogMoveStopAll停止所有关节点动。 | | NRC_SetJogJointSpeedConfig点动关节速度设置。 | | NRC_GetJogJointSpeedConfig获取点动关节速度。 | | NRC_SetJogRectangularSpeedConfig点动直角速度设置。 | | NRC_GetJogRectangularSpeedConfig获取点动直角速度。 | | NRC_SetJogSensitivitySpeedConfig设置点动灵敏度。 | | NRC_SetJogMoveCalculateNum设置点动插补点位个数。 | ### 4.2 运动控制 ​ | 函数名称 | 函数功能 || NRC_RobotMoveJoint机器人点到点运行。 | |------|------|------|------| | NRC_StartResetPoint机器人回到复位点的位置。 | | NRC_GetPlanningPosition获取规划队列的第一个点位。 | | NRC_SetTargetPosition设置机器人目标位置。 | | NRC_PV_SetTargetVelocity设置 PV 模式下运行速度。 | | NRC_PV_SetTargetAccAndDec设置 PV 模式下运行加速度,减速度。 | | NRC_SetTargetVelocity设置目标速度值。 | | NRC_PosReachable判断本体点位 target 和外部轴点位 syncTarget 是否超限,结果由 result 返回,result 值为 true 表示可以到达,值为 false 表示不可到达。 | ### 4.3 速度控制 ​ | 函数名称 | 函数功能 || NRC_SetTeachRunSpeedPer设置示教速度百分比。 | |------|------|------|------| | NRC_GetTeachRunSpeedPer获取示教速度百分比。 | | NRC_SetAutoRunSpeedPer设置自动速度百分比。 | | NRC_SetAutoRunSpeedPer_robot设置自动速度百分比(多机版本)。 | | NRC_GetAutoRunSpeedPer获取自动速度百分比。 | | NRC_GetAutoRunSpeedPer_robot获取自动速度百分比(多机版本)。 | | NRC_SetTeachMaxStepSpeed设置示教模式最大单步速度。 | | NRC_GetTeachMaxStepSpeed获取示教模式最大单步速度。 | | NRC_SetAbsolutePosResolution设置机器人绝对位置分辨率。 | | NRC_SetInterpolationMethod设置机器人插补方式。 | ## 第五章:力矩与动力学控制 ​ 概述 本章包含力矩控制、动力学辨识、碰撞检测、力矩监控等功能。 ### 5.1 力矩控制 ​ | 函数名称 | 函数功能 || NRC_SetTargetTorque设置机器人目标力矩。 | |------|------|------|------| | NRC_SetMaxTorque设置机器人轴最大力矩。 | | NRC_GetMaxTorque获取机器人轴最大力矩。 | | NRC_Rbt_SetMaxTorque获取机器人轴最大力矩,多机版。 | | NRC_GetActualTorque获取机器人轴实际力矩。 | | NRC_GetActualCurrent获取实际电流。 | | NRC_GetMaxCurrent获取最大电流。 | | NRC_GetRatedTorque获取各关节额定力矩。 | | NRC_Rbt_GetRatedTorque获取各关节额定力矩 多机版。 | | NRC_GetTorq获取各关节力矩,单位为千分比。 | | NRC_Rbt_GetTorq获取各关节力矩,单位为千分比 多机版。 | | NRC_GetSyncTorq获取各外部轴关节力矩,单位为千分比。 | | NRC_Rbt_GetSyncTorq获取各外部轴关节力矩,单位为千分比 多机版。 | ### 5.2 动力学辨识 ​ | 函数名称 | 函数功能 || NRC_SetIdentityParam设置动力学辨识所需的两个参数并返回当前轨迹范围下机器人末端在 Z 坐标轴上的最大值和最小值。 | |------|------|------|------| | NRC_RunSafeCheckProgram运行范围安全检测程序,该函数功能是运行一次动力学辨识的轨迹,以便确认周围环境是否安全,即确保机器人进行辨识时不会碰到周围的人或物。 | | NRC_RunIdentifyProgram执行动力学辨识程序,该函数的功能是进行动力学辨识,沿预定轨迹运行十次,每次运行完成后会对获取到的数据进行计算并返回理论力矩与实际力矩的误差值。 | | NRC_GetIdentifyError获取十次辨识力矩误差值,该函数的功能是获取十次辨识计算的理论力矩与实际力矩的误差值。 | | NRC_StopIdentityProgram停止动力学辨识程序。 | ### 5.3 碰撞检测 ​ | 函数名称 | 函数功能 || NRC_SetCollisionParam设置各关节判定发生碰撞时理论力矩与实际力矩的差值的绝对值,该值越大则判断碰撞发生的灵敏度越低。 | |------|------|------|------| | NRC_SetCollisionSwitch打开或关闭碰撞检测功能。 | | NRC_GetCollisionSwitch查看碰撞检测功能是否打开。 | | NRC_SetDynamicTrackingErrorMaxAllow设置最大允许动态超差值。 | | NRC_SetStaticTrackingErrorMaxAllow设置最大允许静态超差值。 | ## 第六章:坐标系与标定 ​ 概述 本章介绍坐标系管理、工具/用户坐标系标定、切换与参数设置功能。 ### 6.1 坐标系管理 ​ | 函数名称 | 函数功能 || NRC_SetCurrentCoord切换当前坐标系。 | |------|------|------|------| | NRC_GetCurrentCoord获取当前坐标系。 | | NRC_PositionACStoMCS将机器人关节坐标值转换为直角坐标值。 | | NRC_PositionMCStoACS将机器人直角坐标值转换为关节坐标值。 | | NRC_TcpCalculate计算特定坐标系下,点位进行固定距离偏移后的位置。 | ### 6.2 工具坐标系 ​ | 函数名称 | 函数功能 || NRC_SetToolCoordParm设置工具手参数。 | |------|------|------|------| | NRC_GetToolCoordParm获取工具手参数。 | | NRC_CalibrationToolCoord_7Pos标定工具手--7点标定法,标定工具手,自动计算工具手末端位置相对机器人末端位置的偏移量,从而确定该工具坐标系。 | | NRC_CalibrationToolCoord_2Pos_SetPos2点标定-设置点数据。 | | NRC_CalibrationToolCoord_2Pos_Cacl2点标定-计算标定结果。 | | NRC_CalibrationToolCoord_2Pos_Save将2点标定的结果写入到指定的工具手中。 | | NRC_SwitchToolCoord切换当前工具手。 | | NRC_GetCurrentToolCoord获取当前工具手编号。 | ### 6.3 用户坐标系 ​ | 函数名称 | 函数功能 || NRC_SetUserCoordParm设置用户坐标参数。 | |------|------|------|------| | NRC_GetUserCoordParm获取用户坐标参数。 | | NRC_CalibrationUserCoord标定用户坐标,标定用户坐标系,自动计算用户坐标系原点相对机器人直角坐标系原点的偏移量,从而确定该用户坐标系。 | | NRC_SwitchUserCoord切换当前用户坐标。 | | NRC_GetCurrentUserCoord获取当前用户坐标编号。 | ### 6.4 位置与零点设置 ​ | 函数名称 | 函数功能 || NRC_SetCurrentPosToZeroPos将当前位置设置为零点或清除多圈值。 | |------|------|------|------| | NRC_Rbt_SetCurrentPosToZeroPos将当前位置设置为零点或清除多圈值(多机版)。 | | NRC_Rbt_SetSingleCircleValue设置零点位置单圈值(多机版)。 | | NRC_Rbt_GetSingleCircleValue获取零点位置单圈值(多机版)。 | | NRC_GetEncoderPosition获取编码器点位。 | ### 工具手标定详细说明 #### NRC_SetToolCoordParm 设置工具手参数。 **函数原型**: ```cpp int NRC_SetToolCoordParm(int toolNum, NRC_Position deviation, std::vector payload, bool load = false); ``` **参数说明**: | 参数 | 类型 | 说明 | 范围 | |------|------|------|------| | toolNum | int | 工具手编号 | (0, 1000) | | deviation | NRC_Position | 工具手末端位置相对机器人末端位置的偏移量 | - | | deviation.pos[0] | double | X轴位置偏移量,单位:毫米 | - | | deviation.pos[1] | double | Y轴位置偏移量,单位:毫米 | - | | deviation.pos[2] | double | Z轴位置偏移量,单位:毫米 | - | | deviation.pos[3] | double | X轴方向偏移量(绕X轴旋转),单位:弧度 | - | | deviation.pos[4] | double | Y轴方向偏移量(绕Y轴旋转),单位:弧度 | - | | deviation.pos[5] | double | Z轴方向偏移量(绕Z轴旋转),单位:弧度 | - | | payload | `std::vector` | 负载参数 | - | | payload[0] | double | 负载质量,单位:千克 | >= 0 | | payload[1] | double | 负载惯量,单位:0.001千克每平方米 | - | | payload[2] | double | 负载质心X,单位:米 | [-999999, 999999] | | payload[3] | double | 负载质心Y,单位:米 | [-999999, 999999] | | payload[4] | double | 负载质心Z,单位:米 | [-999999, 999999] | | load | bool | 是否修改负载质量等参数 | false: 不修改,true: 修改 | **返回值**: - 0:成功 - -101:无效的输入参数 - -102:目标对象不存在 - -103:目标对象当前处于不可操作状态 **使用示例**: ```cpp // 设置工具手1的参数 NRC_Position deviation; deviation.coord = 0; // 无用 deviation.pos[0] = 0.0; // X偏移 deviation.pos[1] = 0.0; // Y偏移 deviation.pos[2] = 150.0; // Z偏移150mm deviation.pos[3] = 0.0; // 绕X轴旋转 deviation.pos[4] = 0.0; // 绕Y轴旋转 deviation.pos[5] = 0.0; // 绕Z轴旋转 std::vector payload = {2.0, 0.0, 0.0, 0.0, 0.075}; // payload[0] = 2.0kg 负载质量 // payload[1] = 0.0 负载惯量 // payload[2-4] = 负载质心位置 int result = NRC_SetToolCoordParm(1, deviation, payload, true); if (result == 0) { printf("设置工具手参数成功 "); } ``` **备注**:实际使用中,一般根据工具手的设计尺寸图,直接填入该参数。 --- #### NRC_GetToolCoordParm 获取工具手参数。 **函数原型**: ```cpp int NRC_GetToolCoordParm(int toolNum, NRC_Position& deviation, std::vector& payload); ``` **参数说明**: | 参数 | 类型 | 说明 | 范围 | |------|------|------|------| | toolNum | int | 工具手编号 | (0, 1000) | | deviation | NRC_Position& | 输出参数,工具手参数 | - | | payload | `std::vector&` | 输出参数,负载参数 | - | **使用示例**: ```cpp NRC_Position deviation; std::vector payload(5); int result = NRC_GetToolCoordParm(1, deviation, payload); if (result == 0) { printf("工具手1参数: "); printf(" X偏移:%.2f mm ", deviation.pos[0]); printf(" Y偏移:%.2f mm ", deviation.pos[1]); printf(" Z偏移:%.2f mm ", deviation.pos[2]); printf(" 负载质量:%.2f kg ", payload[0]); } ``` --- #### NRC_CalibrationToolCoord_7Pos 标定工具手--7点标定法。 **函数原型**: ```cpp int NRC_CalibrationToolCoord_7Pos(int toolNum, NRC_Position& pos1, NRC_Position& pos2, NRC_Position& pos3, NRC_Position& pos4, NRC_Position& pos5, NRC_Position& pos6, NRC_Position& pos7, int calibrationPointNum = 7); ``` **参数说明**: | 参数 | 类型 | 说明 | 范围 | |------|------|------|------| | toolNum | int | 工具手编号 | (0, 1000) | | pos1 | NRC_Position | 将工具手末端对准一个固定尖端,并保持工具手垂直的一个位置 | - | | pos2 | NRC_Position | 将工具手末端对准一个固定尖端,选取一个位置,不能和pos1、pos3、pos4是同一位置 | - | | pos3 | NRC_Position | 将工具手末端对准一个固定尖端,选取一个位置,不能和pos1、pos2、pos4是同一位置 | - | | pos4 | NRC_Position | 将工具手末端对准一个固定尖端,选取一个位置,不能和pos1、pos2、pos3是同一位置 | - | | pos5 | NRC_Position | 保持工具手垂直的一个位置,可以和pos1点是同一位置 | - | | pos6 | NRC_Position | 相对pos5的X轴正方向上的一个位置 | - | | pos7 | NRC_Position | 相对pos6的Y轴正方向上的一个位置 | - | | calibrationPointNum | int | 标定点数 | 6: 六点标定,7: 七点标定 | **返回值**: - 0:成功 - -101:无效的输入参数 - -102:目标对象不存在 - -103:目标对象当前处于不可操作状态 **使用示例**: ```cpp // 准备7个标定点位置 NRC_Position pos1, pos2, pos3, pos4, pos5, pos6, pos7; // 获取当前位置作为标定点 // pos1: 工具手垂直对准参考点 NRC_GetCurrentPos(1, pos1); // 1=直角坐标 // 移动机器人到其他位置,获取其他标定点 // ... // 执行7点标定 int result = NRC_CalibrationToolCoord_7Pos(1, pos1, pos2, pos3, pos4, pos5, pos6, pos7, 7); if (result == 0) { printf("7点标定成功 "); } ``` **备注**:7点标定法仅对六轴串联机器人有效! --- #### NRC_CalibrationToolCoord_2Pos_SetPos 2点标定-设置点数据。 **函数原型**: ```cpp int NRC_CalibrationToolCoord_2Pos_SetPos(int posNum, const NRC_Position& pos); ``` **参数说明**: | 参数 | 类型 | 说明 | 范围 | |------|------|------|------| | posNum | int | 标定的点的编号 | [1, 2] | | pos | NRC_Position | 标定的点的位置,需为关节坐标系下的位置 | - | **使用示例**: ```cpp NRC_Position pos1, pos2; // 获取关节坐标系下的位置 NRC_GetCurrentPos(0, pos1); // 0=关节坐标 // 移动机器人到第二个位置 // ... NRC_GetCurrentPos(0, pos2); // 设置2点标定数据 NRC_CalibrationToolCoord_2Pos_SetPos(1, pos1); NRC_CalibrationToolCoord_2Pos_SetPos(2, pos2); ``` --- #### NRC_CalibrationToolCoord_2Pos_Cacl 2点标定-计算标定结果。 **函数原型**: ```cpp int NRC_CalibrationToolCoord_2Pos_Cacl(); ``` **返回值**: - 0:计算成功 - -1:计算失败 **使用示例**: ```cpp // 设置2点标定数据后,计算结果 int result = NRC_CalibrationToolCoord_2Pos_Cacl(); if (result == 0) { printf("2点标定计算成功 "); // 将结果保存到工具手1 NRC_CalibrationToolCoord_2Pos_Save(1); } else { printf("2点标定计算失败 "); } ``` --- #### NRC_CalibrationToolCoord_2Pos_Save 将2点标定的结果写入到指定的工具手中。 **函数原型**: ```cpp int NRC_CalibrationToolCoord_2Pos_Save(int tagetTool); ``` **参数说明**: | 参数 | 类型 | 说明 | 范围 | |------|------|------|------| | tagetTool | int | 要写入的工具手编号 | [1, 9] | **使用示例**: ```cpp // 完整的2点标定流程 NRC_Position pos1, pos2; // 获取两个标定点 NRC_GetCurrentPos(0, pos1); // 移动机器人 NRC_GetCurrentPos(0, pos2); // 设置标定数据 NRC_CalibrationToolCoord_2Pos_SetPos(1, pos1); NRC_CalibrationToolCoord_2Pos_SetPos(2, pos2); // 计算标定结果 if (NRC_CalibrationToolCoord_2Pos_Cacl() == 0) { // 将标定结果写入工具手1 NRC_CalibrationToolCoord_2Pos_Save(1); printf("2点标定完成,结果已保存到工具手1 "); } ``` --- #### NRC_SwitchToolCoord 切换当前工具手。 **函数原型**: ```cpp int NRC_SwitchToolCoord(int tagetTool); ``` **参数说明**: | 参数 | 类型 | 说明 | 范围 | |------|------|------|------| | tagetTool | int | 要切换的目标工具手的编号,0表示无工具手 | [0, 9] | **使用示例**: ```cpp // 切换到工具手1 int result = NRC_SwitchToolCoord(1); if (result == 0) { printf("切换到工具手1成功 "); } // 取消工具手(使用法兰中心) NRC_SwitchToolCoord(0); ``` --- #### NRC_GetCurrentToolCoord 获取当前工具手编号。 **函数原型**: ```cpp int NRC_GetCurrentToolCoord(); ``` **返回值**: - 当前工具手的编号,工具手初始默认值为0,即无工具手 **使用示例**: ```cpp int currentTool = NRC_GetCurrentToolCoord(); printf("当前工具手编号:%d ", currentTool); ``` --- ### 6.3 用户坐标系 | 函数名称 | 函数功能 | | --- | --- | | NRC_SetUserCoordParm | 设置用户坐标参数。 | | NRC_GetUserCoordParm | 获取用户坐标参数。 | | NRC_CalibrationUserCoord | 标定用户坐标,标定用户坐标系,自动计算用户坐标系原点相对机器人直角坐标系原点的偏移量,从而确定该用户坐标系。 | | NRC_SwitchUserCoord | 切换当前用户坐标。 | | NRC_GetCurrentUserCoord | 获取当前用户坐标编号。 | ### 6.4 位置与零点设置 | 函数名称 | 函数功能 | | --- | --- | | NRC_SetCurrentPosToZeroPos | 将当前位置设置为零点或清除多圈值。 | | NRC_Rbt_SetCurrentPosToZeroPos | 将当前位置设置为零点或清除多圈值(多机版)。 | | NRC_Rbt_SetSingleCircleValue | 设置零点位置单圈值(多机版)。 | | NRC_Rbt_GetSingleCircleValue | 获取零点位置单圈值(多机版)。 | | NRC_GetEncoderPosition | 获取编码器点位。 | ## 第七章:位置与变量管理 概述 本章包含位置获取、位置变量设置、变量管理等功能。 ### 7.1 位置获取与监控 | 函数名称 | 函数功能 | | --- | --- | | NRC_GetCurrentPos | 获取当前位置。 | | NRC_Rbt_GetCurrentPos | 获取当前位置(多机版)。 | | NRC_GetOtherToolPos | 获取当前位置下其他工具坐标系表示的位置。 | | NRC_GetAngularVel | 获取关节角速度,单位 rad/s。 | | NRC_GetLinerVel | 获取关节线速度,单位 mm/s。 | | NRC_GetCurrentMotorVel | 获取电机转速。 | | NRC_Rbt_GetCurrentMotorVel | 获取电机转速(多机版)。 | | NRC_GetCurrentSyncPos | 获取外部轴当前位置,该函数可以获取外部轴位置,位置数据由参数引用 position 返回。 | | NRC_Rbt_GetCurrentSyncPos | 获取外部轴当前位置(多机版),该函数可以获取在 coord 坐标系下外部轴位置,位置数据由参数引用 position 返回。 | | NRC_GetCurrentTrackingError | 获取当前超差值。 | | NRC_GetMaxTrackingError | 获取最大超差值。 | ### 7.2 变量管理 | 函数名称 | 函数功能 | | --- | --- | | NRC_ReadBoolVar | 读取 BOOL 变量的值。 | | NRC_ReadIntVar | 读取 INT 变量的值。 | | NRC_ReadDoubleVar | 读取 DOUBLE 变量的值。 | | NRC_SetBoolVar | 设置 BOOL 变量的值。 | | NRC_SetIntVar | 设置 INT 变量的值。 | | NRC_SetDoubleVar | 设置 DOUBLE 变量的值。 | | NRC_SetGlobalPositionVariable | 设置全局位置变量坐标值。 | | NRC_SetGlobalPositionVariableNote | 设置全局位置变量注释。 | | NRC_GetGlobalPositionVariable | 获取全局位置变量坐标值。 | | NRC_GetGlobalPositionVariableNote | 获取全局位置变量注释。 | | NRC_GetCurrentTime | 获取当前时间。 | ## 第八章:IO 与通信控制 概述 本章介绍数字/模拟 IO 控制、CAN 总线通信、EtherCAT 配置、外部通信等接口。 ### 8.1 IO 配置与操作 | 函数名称 | 函数功能 | | --- | --- | | NRC_GetIOBoardSum | 返回 IO 板数量。 | | NRC_GetIOConfig | 返回特定 IO 板对应的 IO 端口数量。 | | NRC_DigOut | 打开或者关闭指定的 IO 的数字输出状态。 | | NRC_DigOutByBoard | 根据 IO 板号,打开或者关闭指定的 IO 的数字输出状态。 | | NRC_ReadDigOut | 读取数字 IO 输出端口的状态。 | | NRC_ReadDigOutByBoard | 根据 IO 板号,读取数字 IO 输出端口的状态。 | | NRC_ReadDigIn | 读取数字 IO 输入端口的状态。 | | NRC_ReadDigInByBoard | 根据 IO 板号,读取数字 IO 输入端口的状态。 | | NRC_AnaOut | 设置模拟 IO 端口输出的值。 | | NRC_ReadAnaOut | 读取模拟 IO 输出端口的状态。 | | NRC_ReadAnaIn | 读取模拟 IO 输入端口的状态。 | | NRC_EnableCustomIOFunction | 使能自定义 IO 功能。 | | NRC_SetCustomIODoutConfig | 设置自定义 IO dout 配置。 | | NRC_SetCustomIODinConfig | 设置自定义 IO din 配置。 | | NRC_SetCheckExioEnable | 设置内置 tcp 接口扩展 IO 检测使能标志。 | | NRC_GetEthercatIOConfig | 获取 EthercatIO 配置。 | ### 8.2 通信接口 | 函数名称 | 函数功能 | | --- | --- | | NRC_SetCANBaudRate | 设置 CAN 通讯的波特率。 | | NRC_SendCANData | CAN 通讯发送一帧数据。 | | NRC_SetCommunicationParam | 调用该接口用于设置外部 TCP 通信的相关参数。 | | NRC_SetCommunicationStatus | 设置 TCP 通信的开关。 | | NRC_SetTcpMessageCallback | 设置外部 TCP 通信收到消息的回调函数。 | | NRC_CommSendMessage | 调用该接口,将向控制器发送消息。 | | NRC_GetModbusSlaveConnectStatus | 获取 modbus 从站连接状态。 | | NRC_GetModbusMasterConnectStatus | 获取 modbus 主站连接状态。 | | NRC_SetSocketCustomProtocalCB | 该函数的功能是自定义 socket 通讯协议。 | | NRC_SendSocketCustomProtocal | 发送 socket 通信。 | ## 第九章:错误处理与消息管理 概述 本章包含错误处理、消息管理、回调函数设置等功能。 ### 9.1 消息管理 | 函数名称 | 函数功能 | | --- | --- | | NRC_SetMsgHappenCallback | 设置消息发生时的回调函数。 | | NRC_FirstMessagePop | 弹出队列中最早的消息。 | | NRC_LastMessagePop | 弹出队列中最后的消息。 | | NRC_GetMessage | 获取队列中第 num 个消息。 | | NRC_GetMessageSize | 获取队列中消息总数。 | | NRC_ClearMessage | 获取当前用户坐标编号。 | | NRC_TriggerErrorReport | 用户主动触发报错。 | ### 9.2 错误处理 | 函数名称 | 函数功能 | | --- | --- | | NRC_ClearServoError | 清除伺服错误。 | | NRC_ClearAllError | 清除全部错误,清空消息的队列,同时清除伺服错误。 | | NRC_SetFaultResetCB | 设置清错按键回调函数,不影响控制器本身的清错功能。 | ## 第十章:示教器与作业文件控制 概述 本章包含示教器交互、作业文件操作、自定义指令等功能。其他指令文档请参考作业文件文档 ### 10.1 示教器控制 | 函数名称 | 函数功能 | | --- | --- | | NRC_GetTeachBoxConnectStatus | 获取是否连接了示教盒。 | | NRC_SendCursorJumpCmdToTeachbox | 向示教器发送光标跳行命令,示教器响应后,会将光标跳转到指定作业文件的指定行。 | | NRC_GetOpenJobFileName | 获取当前打开的作业文件的名称。 | ### 10.2 作业文件与自定义指令 | 函数名称 | 函数功能 | | --- | --- | | NRC_SetJobFileCustomInstructionCB | 将一个函数绑定到自定义指令中。 | | NRC_SetJobFileCustomInstructionPreTreatmentCB | 将一个函数绑定到自定义指令的预处理函数中。 | | NRC_SetJobFileCustomInstructionPostTreatmentCB | 将一个函数绑定到自定义指令的后处理函数中。 | | NRC_ParseJobfileToAppendRunInstruction | 把作业文件中的所有指令解析成可以作为追加模式指令的队列。 | | NRC_SetCustomFileTransfer | 设置可导入导出的自定义配置文件。 | ## 第十一章:回调函数与周期控制 概述 本章介绍各种回调函数设置、周期控制、实时监控等功能。 ### 11.1 回调函数设置 | 函数名称 | 函数功能 | | --- | --- | | NRC_SetMsgHappenCallback | 设置消息发生时的回调函数。 | | NRC_SetSocketCustomProtocalCB | 该函数的功能是自定义 socket 通讯协议。 | | NRC_SetJobFileCustomInstructionCB | 将一个函数绑定到自定义指令中。 | | NRC_SetJobFileCustomInstructionPreTreatmentCB | 将一个函数绑定到自定义指令的预处理函数中。 | | NRC_SetJobFileCustomInstructionPostTreatmentCB | 将一个函数绑定到自定义指令的后处理函数中。 | | NRC_SetTcpMessageCallback | 设置外部 TCP 通信收到消息的回调函数。 | | NRC_SetFaultResetCB | 设置清错按键回调函数,不影响控制器本身的清错功能。 | | NRC_robotRunCycle_Callback | 设置一个自定义的无参函数,将每个 EtherCAT 通讯周期(默认1ms)回调一次。 | 以下是各接口详细描述 ### NRC_Delayms | 函数原型 | int NRC_Delayms(int ms); | | --- | --- | | 功能描述 | 系统延时一定时间。 | | 参数说明 | 输入参数:
ms 为要延时的时间,单位为毫秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_LogInfo | 函数原型 | void NRC_LogInfo(const char* format, ...); | | --- | --- | | 功能描述 | 向 NRC 系统中打印日志。 | | 参数说明 | 输入参数:
format 为需要打印的内容 | | 返回值 | 无 | | 备注说明 | 用法与 printf()一致。 | ### NRC_GetNexMotionLibVersion | 函数原型 | std::string NRC_GetNexMotionLibVersion(); | | --- | --- | | 功能描述 | 获取 NexMotion 库版本信息。 | | 参数说明 | 无 | | 返回值 | 返回 NexMotion 库版本信息。 | | 备注说明 | 无 | ### NRC_GetSyncVersion | 函数原型 | std::string NRC_GetSyncVersion(); | | --- | --- | | 功能描述 | 获取同步版本号。 | | 参数说明 | 无 | | 返回值 | 返回同步版本号。 | | 备注说明 | 无 | ### NRC_StartController | 函数原型 | int NRC_StartController(int netPort = 4); | | --- | --- | | 功能描述 | 系统启动函数。 | | 参数说明 | 输入参数:
连接伺服的网口的端口号,默认为4,根据具体工控机型号设置 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 启动系统需要时间,请使用 NRC_GetControlInitComplete() 函数查看系统是否初始化完成,在初始化完成前,请勿调用其他函数。 | ### NRC_GetControlInitComplete | 函数原型 | int NRC_GetControlInitComplete(); | | --- | --- | | 功能描述 | 查看系统初始化是否完成。 | | 参数说明 | 无 | | 返回值 | 返回系统是否初始化完成
0:表示未完成
1:表示已完成 | | 备注说明 | 无 | ### NRC_SetServoReadyStatus | 函数原型 | int NRC_SetServoReadyStatus(int status); | | --- | --- | | 功能描述 | 切换伺服准备状态。 | | 参数说明 | 输入参数:
输入参数:status  0-伺服禁止  1-伺服允许 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 切换伺服状态前请先检查伺服目前有没报错,如果有报错则无法正常切换伺服的状态。 | ### NRC_GetServoStatus | 函数原型 | int NRC_GetServoStatus(); | | --- | --- | | 功能描述 | 获取伺服状态。 | | 参数说明 | 无 | | 返回值 | 返回伺服状态
0-伺服禁止
1-伺服允许(就绪)
2-伺服报警
3-伺服允许 | | 备注说明 | 无 | ### NRC_SetOperationMode | 函数原型 | int NRC_SetOperationMode(NRC_OperationMode mode); | | --- | --- | | 功能描述 | 设置操作模式。 | | 参数说明 | 输入参数:
mode  0-示教模式 1-远程模式 2-运行模式 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetTeachRunSpeedPer | 函数原型 | int NRC_SetTeachRunSpeedPer(int speedPer); | | --- | --- | | 功能描述 | 设置示教速度百分比。 | | 参数说明 | 输入参数:
`speedPer:
`参数范围:0 < speedPer  <= 100
寸动参数: -1,-2, -3   (关节坐标系下:-1表示0.1度,-2表示0.01度,-3表示0.001度;其他模式下:-1表示1mm/s,-2表示0.1mm/s,-3表示0.01mm/s) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetTeachRunSpeedPer | 函数原型 | int NRC_GetTeachRunSpeedPer(); | | --- | --- | | 功能描述 | 获取示教速度百分比。 | | 参数说明 | 无 | | 返回值 | 返回示教速度百分比
返回值范围:-2 < NRC_GetTeachRunSpeedPer()  <= 100 | | 备注说明 | NRC_GetTeachRunSpeedPer() != 0 | ### NRC_SetAutoRunSpeedPer | 函数原型 | int NRC_SetAutoRunSpeedPer(int speedPer); | | --- | --- | | 功能描述 | 设置自动速度百分比。 | | 参数说明 | 输入参数:
`speedPer:
`参数范围:0 <  speedPer  <= 100 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetAutoRunSpeedPer_robot | 函数原型 | int NRC_SetAutoRunSpeedPer_robot(int robotNum,int speedPer); | | --- | --- | | 功能描述 | 设置自动速度百分比(多机版本)。 | | 参数说明 | 输入参数:
speedPer  参数范围:0 <  speedPer  <= 100
robotNum 选择机器人的编号[1,4] | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetAutoRunSpeedPer | 函数原型 | int NRC_GetAutoRunSpeedPer(); | | --- | --- | | 功能描述 | 获取自动速度百分比。 | | 参数说明 | 无 | | 返回值 | 返回自动速度百分比
返回值范围:0< NRC_GetAutoRunSpeedPer()  <= 100 | | 备注说明 | 无 | ### NRC_GetAutoRunSpeedPer_robot | 函数原型 | int NRC_GetAutoRunSpeedPer_robot(int robotNum); | | --- | --- | | 功能描述 | 获取自动速度百分比(多机版本)。 | | 参数说明 | 输入参数:
robotNum 选择机器人的编号[1,4] | | 返回值 | 返回自动速度百分比
返回值范围:0< NRC_GetAutoRunSpeedPer()  <= 100 | | 备注说明 | 无 | ### NRC_SetCurrentCoord | 函数原型 | int NRC_SetCurrentCoord(NRC_COORD coord); | | --- | --- | | 功能描述 | 切换当前坐标系。 | | 参数说明 | 输入参数:
coord  0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetCurrentCoord | 函数原型 | NRC_COORD NRC_GetCurrentCoord(); | | --- | --- | | 功能描述 | 获取当前坐标系。 | | 参数说明 | 无 | | 返回值 | 返回当前坐标系:0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标 | | 备注说明 | 无 | ### NRC_ServoEnable | 函数原型 | int NRC_ServoEnable(); | | --- | --- | | 功能描述 | 按下 deadman 键,使伺服处于上使能的状态。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 按下 deadman 键,使机器人上电
使用此接口上电后,再调用对应接口 NRC_ServoEnable() 下电时,可以自动先停止正在运行中的机器人,再进行下电
仅示教模式下可用,并且示教模式下推荐使用该接口
调用该函数前,请将伺服准备状态切换至伺服就绪,可调用 NRC_SetServoReadyStatus(int status) 函数切换伺服状态
成功调用该函数后,伺服将处于上电使能状态,请注意安全 | ### NRC_ServoDisable | 函数原型 | int NRC_ServoDisable(); | | --- | --- | | 功能描述 | 松开 deadman 键,使伺服处于下使能的状态。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 可将通过 NRC_ServoEnable() 接口上电的机器人,进行下电
成功调用该函数后,伺服将下电,处于未使能状态
仅示教模式下可用,并且示教模式下推荐使用该接口 | ### NRC_GetPowerOffSaveSignal | 函数原型 | bool NRC_GetPowerOffSaveSignal(); | | --- | --- | | 功能描述 | 获取机器人通电状态。 | | 参数说明 | 无 | | 返回值 | 返回机器人的通电状态:0-未通电 1-已通电 | | 备注说明 | 无 | ### NRC_JogMove | 函数原型 | int NRC_JogMove(int axis, double vel); | | --- | --- | | 功能描述 | 开始点动某轴。 | | 参数说明 | 输入参数:
axis 要进行点动的轴,取值范围1-6
输入参数:
vel  轴运动方向和速度,取值范围[-1,-0.01)U(0.01,1]
正负号代表正反方向
系数为速度比例,实际速度为示教速度*vel*电机速度 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用 NRC_JogMove 点动结束后必须要调用 NRC_JogMoveStop 将当前的 axis 点动的轴给停止,否则会出现点动其他轴的时候之前点动的轴也跟着一起运动 | ### NRC_JogMoveStop | 函数原型 | int NRC_JogMoveStop(int axis); | | --- | --- | | 功能描述 | 停止某关节点动。 | | 参数说明 | 输入参数:
axis 要停止进行点动的轴,取值范围1-6 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用 NRC_JogMove 点动结束后必须要调用 NRC_JogMoveStop 将当前的 axis 点动的轴给停止,否则会出现点动其他轴的时候之前点动的轴也跟着一起运动 | ### NRC_JogMoveStopAll | 函数原型 | int NRC_JogMoveStopAll(); | | --- | --- | | 功能描述 | 停止所有关节点动。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数后,机器人点动将会停止,机器人将减速 | ### NRC_GetOtherToolPos | 函数原型 | int NRC_GetOtherToolPos(int ToolNum, NRC_Position& position); | | --- | --- | | 功能描述 | 获取当前位置下其他工具坐标系表示的位置。 | | 参数说明 | 输入参数:
ToolNum 工具手的编号
输出参数:
position  返回选定工具手下的坐标 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetCurrentPos | 函数原型 | int NRC_GetCurrentPos(NRC_COORD coord, NRC_Position& position); | | --- | --- | | 功能描述 | 获取当前位置。 | | 参数说明 | 输入参数:
coord    0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标
输出参数:
position  返回选定坐标系下的坐标位置 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetCurrentPos | 函数原型 | int NRC_Rbt_GetCurrentPos(int robotNum, NRC_COORD coord, NRC_Position& position); | | --- | --- | | 功能描述 | 获取当前位置(多机版)。 | | 参数说明 | 输入参数:
robotNum 传入机器人编号(1-4)
coord    0-关节坐标 1-直角坐标 2-工具坐标 3-用户坐标
输出参数:
position  返回选定坐标系下的坐标位置 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_PositionACStoMCS | 函数原型 | int NRC_PositionACStoMCS(NRC_Position& posACS, NRC_Position& posMCS); | | --- | --- | | 功能描述 | 将机器人关节坐标值转换为直角坐标值。 | | 参数说明 | 输入参数:
posACS  要进行转换的关节坐标值
输出参数:
posMCS  转换的结果通过其返回 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_PositionMCStoACS | 函数原型 | int NRC_PositionMCStoACS(NRC_Position& posMCS, NRC_Position& posACS); | | --- | --- | | 功能描述 | 将机器人直角坐标值转换为关节坐标值。 | | 参数说明 | 输入参数:
posMCS  要进行转换的直角坐标值
输出参数:
posACS  转换的结果通过其返回 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetProgramRunStatus | 函数原型 | int NRC_GetProgramRunStatus(); | | --- | --- | | 功能描述 | 获取当前程序运行状态。 | | 参数说明 | 无 | | 返回值 | 返回机器人当前程序运行状态
0 程序处于停止状态
1 程序处于暂停状态
2 程序处于运行状态 | | 备注说明 | 无 | ### NRC_GetRobotRunStatus | 函数原型 | int NRC_GetRobotRunStatus(); | | --- | --- | | 功能描述 | 获取当前机器人运动状态。 | | 参数说明 | 无 | | 返回值 | 返回当前机器人运动状态
0 机器人处于停止状态
1 机器人处于运动状态 | | 备注说明 | 无 | ### NRC_PowerOn | 函数原型 | int NRC_PowerOn(); | | --- | --- | | 功能描述 | 伺服上使能。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请将伺服准备状态切换至伺服就绪,可调用 NRC_SetServoReadyStatus(int status) 函数切换伺服状态
成功调用该函数后,伺服将处于上电使能状态,请注意安全 | ### NRC_PowerOff | 函数原型 | int NRC_PowerOff(); | | --- | --- | | 功能描述 | 伺服下使能。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,伺服将下电,处于未使能状态成功调用该函数后,伺服将处于上电使能状态,请注意安全
请勿在机器人运动时调用该接口,可能会导致机器人突然停止,造成剧烈抖动 | ### NRC_RobotMoveJoint | 函数原型 | int NRC_RobotMoveJoint(int vel, const NRC_Position& target, int acc, int dec); | | --- | --- | | 功能描述 | 机器人点到点运行。 | | 参数说明 | 输入参数:
vel  机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <=  100
target 机器人运动目标位置,详见 `NRC_Position
`acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请将伺服上电使能,可调用 NRC_ServoEnable() 函数将伺服上电
成功调用该函数后,机器人将开始运动,请注意安全 | ### NRC_StartResetPoint | 函数原型 | int NRC_StartResetPoint(); | | --- | --- | | 功能描述 | 机器人回到复位点的位置。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 若在示教模式下调用该函数,请先将伺服上电使能,可调用 NRC_ServoEnable() 函数将伺服上电
成功调用该函数后,机器人将开始运动,请注意安全 | ### NRC_DigOut | 函数原型 | void NRC_DigOut(int port, int value); | | --- | --- | | 功能描述 | 打开或者关闭指定的 IO 的数字输出状态。 | | 参数说明 | 输入参数:
port  要输出的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目
value  要输出的状态 0-输出低电平 1-输出高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_DigOutByBoard | 函数原型 | void NRC_DigOutByBoard(int board_id, int port_id, int value); | | --- | --- | | 功能描述 | 根据 IO 板号,打开或者关闭指定的 IO 的数字输出状态。 | | 参数说明 | 输入参数:
port_id: 要输出的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目
value  要输出的状态 0-输出低电平 1-输出高电平
board_id  要输出的 IO 板号,最大范围为 1 <= board_id <= 4,实际范围取决于所连接的 IO 板数量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ReadDigOut | 函数原型 | int NRC_ReadDigOut(int port); | | --- | --- | | 功能描述 | 读取数字 IO 输出端口的状态。 | | 参数说明 | 输入参数:
port  要读取的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目 | | 返回值 | 返回该端口当前状态
0 当前处于低电平
1 当前处于高电平
-1该端口不存在 | | 备注说明 | 无 | ### NRC_ReadDigOutByBoard | 函数原型 | int NRC_ReadDigOutByBoard(int board_id, int port_id); | | --- | --- | | 功能描述 | 根据 IO 板号,读取数字 IO 输出端口的状态。 | | 参数说明 | 输入参数:
board_id  要读取的 IO 板号,最大范围为 1 <= board_id <= 4,实际范围取决于所连接的 IO 板数量
port_id 要读取的 IO 板号所对应的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于该 IO 板号所对应 IO 版的 IO 端口数目 | | 返回值 | 返回该端口当前状态
0 当前处于低电平
1 当前处于高电平
-1该端口不存在 | | 备注说明 | 无 | ### NRC_ReadDigIn | 函数原型 | int NRC_ReadDigIn(int port); | | --- | --- | | 功能描述 | 读取数字 IO 输入端口的状态。 | | 参数说明 | 输入参数:
port  要读取的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目 | | 返回值 | 返回该端口当前状态
0 当前处于低电平
1 当前处于高电平
-1该端口不存在 | | 备注说明 | 无 | ### NRC_ReadDigInByBoard | 函数原型 | int NRC_ReadDigInByBoard(int board_id, int port_id); | | --- | --- | | 功能描述 | 根据 IO 板号,读取数字 IO 输入端口的状态。 | | 参数说明 | 输入参数:
board_id 要读取的 IO 板号,最大范围为 1 <= board_id <= 4,实际范围取决于所连接的 IO 板数量
port_id 要读取的 IO 板号所对应的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于该 IO 板号所对应 IO 版的 IO 端口数目 | | 返回值 | 返回该端口当前状态
0 当前处于低电平
1 当前处于高电平
-1该端口不存在 | | 备注说明 | 无 | ### NRC_AnaOut | 函数原型 | void NRC_AnaOut(int port, double value); | | --- | --- | | 功能描述 | 设置模拟 IO 端口输出的值。 | | 参数说明 | 输入参数:
port  要输出的模拟 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目
value 选定的模拟 IO 端口要输出的数值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ReadAnaOut | 函数原型 | int NRC_ReadAnaOut(int port,double& value); | | --- | --- | | 功能描述 | 读取模拟 IO 输出端口的状态。 | | 参数说明 | 输入参数:
port  要读取的模拟 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目
value 返回该端口当前数值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ReadAnaIn | 函数原型 | int NRC_ReadAnaIn(int port,double& value); | | --- | --- | | 功能描述 | 读取模拟 IO 输入端口的状态。 | | 参数说明 | 输入参数:
port  要读取的模拟 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目
value 返回该端口当前数值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCANBaudRate | 函数原型 | void NRC_SetCANBaudRate(unsigned int port, unsigned int baud); | | --- | --- | | 功能描述 | 设置 CAN 通讯的波特率。 | | 参数说明 | 输入参数:
port  设置使用的 can 端口号
baud  设置的波特率 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SendCANData | 函数原型 | void NRC_SendCANData(unsigned int port, unsigned int sendCanID, const unsigned char buff[8], unsigned int sendLen=8); | | --- | --- | | 功能描述 | CAN 通讯发送一帧数据。 | | 参数说明 | 输入参数:
port  设置使用的 can 端口号
sendID 设置帧 ID 通过该变量返回
sendlen 设置发送数据长度
buff 要发送的数据 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ReadBoolVar | 函数原型 | bool NRC_ReadBoolVar(int num); | | --- | --- | | 功能描述 | 读取 BOOL 变量的值。 | | 参数说明 | 输入参数:
num  变量 BOOL 的编号,取值范围:0 < num <= 999 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ReadIntVar | 函数原型 | int NRC_ReadIntVar(int num); | | --- | --- | | 功能描述 | 读取 INT 变量的值。 | | 参数说明 | 输入参数:
num  变量 INT 的编号,取值范围:0 < num <= 999 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ReadDoubleVar | 函数原型 | double NRC_ReadDoubleVar(int num); | | --- | --- | | 功能描述 | 读取 DOUBLE 变量的值。 | | 参数说明 | 输入参数:
num  变量 DOUBLE 的编号,取值范围:0 < num <= 999 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetBoolVar | 函数原型 | int NRC_SetBoolVar(int num, bool value); | | --- | --- | | 功能描述 | 设置 BOOL 变量的值。 | | 参数说明 | 输入参数:
num  变量 BOOL 的编号,取值范围:0 < num <= 999
value 要设置的目标值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetIntVar | 函数原型 | int NRC_SetIntVar(int num, int value); | | --- | --- | | 功能描述 | 设置 INT 变量的值。 | | 参数说明 | 输入参数:
num  变量 INT 的编号,取值范围:0 < num <= 999
value 要设置的目标值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetDoubleVar | 函数原型 | int NRC_SetIntVar(int num, double value); | | --- | --- | | 功能描述 | 设置 DOUBLE 变量的值。 | | 参数说明 | 输入参数:
num  变量 DOUBLE 的编号,取值范围:0 < num <= 999
value 要设置的目标值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetGlobalPositionVariable | 函数原型 | int NRC_SetGlobalPositionVariable(int num, const NRC_Position &pos_set); | | --- | --- | | 功能描述 | 设置全局位置变量坐标值。 | | 参数说明 | 输入参数:
num   要设置的全局位置变量编号,0 < num <= 999
pos_set 要设置的全局位置变量坐标值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetGlobalPositionVariableNote | 函数原型 | int NRC_SetGlobalPositionVariableNote(int num, std::string note); | | --- | --- | | 功能描述 | 设置全局位置变量注释。 | | 参数说明 | 输入参数:
num   要设置的全局位置变量编号,0 < num <= 999
note  给全局变量设置的注释 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetGlobalPositionVariable | 函数原型 | int NRC_GetGlobalPositionVariable(int num, NRC_Position& pos_get); | | --- | --- | | 功能描述 | 获取全局位置变量坐标值。 | | 参数说明 | 输入参数:
num   要获取的全局位置变量编号,0 < num <= 999
pos_get 要获取的全局位置变量坐标值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetGlobalPositionVariableNote | 函数原型 | int NRC_GetGlobalPositionVariableNote(int num, std::string& note); | | --- | --- | | 功能描述 | 获取全局位置变量注释。 | | 参数说明 | 输入参数:
num   要获取的全局位置变量编号,0 < num <= 999
note  获取全局变量的注释 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetRobotTypeConfig | 函数原型 | int NRC_SetRobotTypeConfig(const std::string &type); | | --- | --- | | 功能描述 | 设置机器人类型。 | | 参数说明 | 输出参数:
type :
- "R_GENERAL_6S" 六轴
- "R_SCARA" 四轴 `SCARA
`- "R_FOURAXIS_PALLET" 四轴码垛
- "R_FOURAXIS" 四轴
- "R_GENERAL_1S" 一轴
- "R_GENERAL_5S" 五轴
- "R_GENERAL_6S_1" 六轴异形一
- "R_SCARA_TWOAXIS" 两轴 `SCARA
`- "R_SCARA_THREEAXIS" 三轴 `SCARA
`- "R_THREE_CARTESIAN_COORDINATE" 三轴直角
- "R_THREE_CARTESIAN_COORDINATE_1" 三轴异形一
- "R_GENERAL_7S_RBT" 七轴
- "R_SCARA_1" 四轴 SCARA 异形一 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_SetRobotTypeConfig | 函数原型 | int NRC_Rbt_SetRobotTypeConfig(int robotNum, const std::string &type); | | --- | --- | | 功能描述 | 设置机器人类型(多机版)。 | | 参数说明 | 输出参数:
index  当前作业文件要运行的总次数,设置为0时循环运行,参数范围:index >= 0 | | 返回值 | 输出参数:
robotNum 机器人编号(1-4)
输出参数:
type:
- "R_GENERAL_6S" 六轴
- "R_SCARA" 四轴 `SCARA
`- "R_FOURAXIS_PALLET" 四轴码垛
- "R_FOURAXIS" 四轴
- "R_GENERAL_1S" 一轴
- "R_GENERAL_5S" 五轴
- "R_GENERAL_6S_1" 六轴异形一
- "R_SCARA_TWOAXIS" 两轴 `SCARA
`- "R_SCARA_THREEAXIS" 三轴 `SCARA
`- "R_THREE_CARTESIAN_COORDINATE" 三轴直角
- "R_THREE_CARTESIAN_COORDINATE_1" 三轴异形一
- "R_GENERAL_7S_RBT" 七轴
- "R_SCARA_1" 四轴 SCARA 异形一 | | 备注说明 | 无 | ### NRC_GetRobotTypeConfig | 函数原型 | int NRC_GetRobotTypeConfig(std::string& type); | | --- | --- | | 功能描述 | 获取机器人类型。 | | 参数说明 | 输出参数:
`type:
`- "R_GENERAL_6S" 六轴
- "R_SCARA" 四轴 `SCARA
`- "R_FOURAXIS_PALLET" 四轴码垛
- "R_FOURAXIS" 四轴
- "R_GENERAL_1S" 一轴
- "R_GENERAL_5S" 五轴
- "R_GENERAL_6S_1" 六轴异形一
- "R_SCARA_TWOAXIS" 两轴 `SCARA
`- "R_SCARA_THREEAXIS" 三轴 `SCARA
`- "R_THREE_CARTESIAN_COORDINATE" 三轴直角
- "R_THREE_CARTESIAN_COORDINATE_1" 三轴异形一
- "R_GENERAL_7S_RBT" 七轴
- "R_SCARA_1" 四轴 SCARA 异形一 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetRobotTypeConfig | 函数原型 | int NRC_GetRobotTypeConfig(std::string& type); | | --- | --- | | 功能描述 | 获取机器人类型(多机版)。 | | 参数说明 | 输出参数:
robotNum  机器人编号(1-4)
`type:
`- "R_GENERAL_6S" 六轴
- "R_SCARA" 四轴 `SCARA
`- "R_FOURAXIS_PALLET" 四轴码垛
- "R_FOURAXIS" 四轴
- "R_GENERAL_1S" 一轴
- "R_GENERAL_5S" 五轴
- "R_GENERAL_6S_1" 六轴异形一
- "R_SCARA_TWOAXIS" 两轴 `SCARA
`- "R_SCARA_THREEAXIS" 三轴 `SCARA
`- "R_THREE_CARTESIAN_COORDINATE" 三轴直角
- "R_THREE_CARTESIAN_COORDINATE_1" 三轴异形一
- "R_GENERAL_7S_RBT" 七轴
- "R_SCARA_1" 四轴 SCARA 异形一 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetServoMapRelation | 函数原型 | int NRC_SetServoMapRelation(std::vector<int> servoMap,std::vector<int> syncServoMap); | | --- | --- | | 功能描述 | 设置伺服映射关系。 | | 参数说明 | 输入参数:
servoMap 伺服映射关系,个数为设置的机器人总轴数,值为每一轴所连接的伺服编号
syncServoMap  外部轴伺服映射关系,个数为3,值为每一轴所连接的伺服编号,若外部轴不足3个,对应位置值为0 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 机器人轴与伺服对应关系为:
- 1轴 连接 第2个伺服
- 2轴 连接 第3个伺服
- 3轴 连接 第1个伺服
- 4轴 连接 第4个伺服
- 5轴 连接 第6个伺服
- 6轴 连接 第5个伺服
- 则 servoMap 的值为 { 2, 3, 1, 4, 6, 5 }
外部轴个数与伺服对应关系:
- 无外部轴,则 syncServoMap 值为 {0 ,0 ,0}
- 一个外部轴,则 syncServoMap 值为 {7 ,0 ,0}
- 两个外部轴,则 syncServoMap 值为 {7 ,8 ,0}
以后替代函数为 NRC_SetAllServoMapRelation! | ### NRC_SetAllServoMapRelation | 函数原型 | int NRC_SetAllServoMapRelation(std::vector<int> servoMap,int syncGroupSum, int syncType[], std::vector<std::vector<int>> syncServoMap); | | --- | --- | | 功能描述 | 设置伺服映射关系(仅一个机器人的时候可以使用)。 | | 参数说明 | 输入参数:
servoMap  伺服映射关系,个数为设置的机器人总轴数,值为每一轴所连接的伺服编号
syncGroupSum  外部轴组最大数目,最大为3,最多支持两个双变位机加一个地轨
syncType  外部轴组类型,0:无,1:单轴变位机,2:双轴变位机,3:地轨
syncServoMap  外部轴伺服映射关系 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 机器人轴与伺服对应关系为:
- 1轴 连接 第2个伺服
- 2轴 连接 第3个伺服
- 3轴 连接 第1个伺服
- 4轴 连接 第4个伺服
- 5轴 连接 第6个伺服
- 6轴 连接 第5个伺服
- 则 servoMap 的值为 { 2, 3, 1, 4, 6, 5 }
外部轴个数与伺服对应关系
- 无外部轴,则 syncGroupSum 值为0,
- 一个单轴变位机,则 syncGroupSum 值1,syncType 为{1,0,0},syncServoMap 为{{7}}
- 两个双轴变位机,一个地轨,则 syncGroupSum 值3,syncType 为{2,2,3},syncServoMap 为{{7,8},{9,10},{11}} | ### NRC_Rbt_SetAllServoMapRelation | 函数原型 | int NRC_Rbt_SetAllServoMapRelation(unsigned int robotSum, std::vector<std::string> robotType, std::vector<std::vector<int>> servoMap, std::vector<NRC_SyncParam> syncMap); | | --- | --- | | 功能描述 | 设置伺服映射关系 (多机版)。 | | 参数说明 | 输入参数:
robotSum  机器人总数,最大为4
servoMap  伺服映射关系,个数为设置的机器人总轴数,值为每一轴所连接的伺服编号
syncGroupSum  外部轴组最大数目,最大为3,最多支持两个双变位机加一个地轨
syncType  外部轴组类型,0:无,1:单轴变位机,2:双轴变位机,3:地轨
syncServoMap  外部轴伺服映射关系 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 机器人轴与伺服对应关系为(以两个四轴机器人为例):
- 机器人1的1轴 连接 第2个伺服
- 机器人1的2轴 连接 第3个伺服
- 机器人1的3轴 连接 第1个伺服
-机器人1的 4轴 连接 第4个伺服
- 机器人2的1轴 连接 第1个伺服
- 机器人2的2轴 连接 第2个伺服
- 机器人2的3轴 连接 第3个伺服
-机器人2的 4轴 连接 第4个伺服
则 servoMap 的值为 {{ 2, 3, 1, 4 },{ 1, 2, 3, 4 }}
外部轴个数与伺服对应关系(以两个四轴机器人为例):
无外部轴,则 syncGroupSum 值为0,
一个单轴变位机 则 syncMap 值为{NRC_SyncMap one, NRC_SyncMap two},
NRC_SyncMap `one
&`#123;
syncGroupSum = 1;
std::vector<std::vector<int>> syncServoMap = {{5}};
std::vector<std::vector<int>> syncType = {1,0,0};
}
NRC_SyncMap two 和 NRC_SyncMap one 一样;
两个双轴变位机,一个地轨,则 syncMap 值为{NRC_SyncMap one}(以一个机器人为例),
NRC_SyncMap `one
&`#123;
syncGroupSum = 3;
std::vector<std::vector<int>> syncServoMap = {{5,6},{7,8},{9}}
std::vector<std::vector<int>> syncType = {2,2,3};
} | ### NRC_GetConnectServoTypeList | 函数原型 | std::vector<std::string> NRC_GetConnectServoTypeList(int nameType = 0); | | --- | --- | | 功能描述 | 获取连接的伺服类型列表。 | | 参数说明 | 输入参数:
nameType  伺服名称类型,0:中文名称,1:英文名称 | | 返回值 | 伺服名称列表 | | 备注说明 | 无 | ### NRC_GetSlaveNumByID | 函数原型 | std::vector<int> NRC_GetSlaveNumByID(unsigned int vendorID, unsigned int productCode); | | --- | --- | | 功能描述 | 通过从站 vendorID 和 productCode 获取从站的编号列表。 | | 参数说明 | 输入参数:
vendorID  从站的 `vendorID
`productCode  从站的 productCode | | 返回值 | 所有该类型从站的编号的列表 | | 备注说明 | 无 | ### NRC_GetPDOAddrMap | 函数原型 | unsigned char * NRC_GetPDOAddrMap(unsigned int slaveNum, unsigned short index); | | --- | --- | | 功能描述 | 获取从站 PDO 的映射地址。 | | 参数说明 | 输入参数:
slaveNum 从站编号
index  PDO 的索引 | | 返回值 | PDO 的映射地址,若从站编号错误或无该 PDO,则返回 nullptr,若该索引的 PDO 存在多个,将只会返回1个 | | 备注说明 | 返回的映射地址,需要根据 PDO 的数据类型,自行转换指针类型后才能使用 | ### NRC_GetPDOAddrMap | 函数原型 | unsigned char * NRC_GetPDOAddrMap(unsigned int slaveNum, unsigned short index, unsigned short subindex); | | --- | --- | | 功能描述 | 获取从站 PDO 的映射地址。 | | 参数说明 | 输入参数:
slaveNum 从站编号
index  PDO 的索引
subindex   PDO 的子索引 | | 返回值 | PDO 的映射地址,若从站编号错误或无该 PDO,则返回 nullptr | | 备注说明 | 返回的映射地址,需要根据 PDO 的数据类型,自行转换指针类型后才能使用 | ### NRC_GetEthercatIOConfig | 函数原型 | int GetEthercatIOConfig(int &sum, std::vector<std::string> &typeVec); | | --- | --- | | 功能描述 | 获取 EthercatIO 配置。 | | 参数说明 | 输入参数:
sum 返回 EthercatIO 板数目
typeVec  返回 EthercatIO 类型 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_EnableCustomIOFunction | 函数原型 | void NRC_EnableCustomIOFunction(); | | --- | --- | | 功能描述 | 使能自定义 IO 功能。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在调用控制器启动函数 NRC_StartController 前调用使能,否则将不生效 | ### NRC_SetCustomIODoutConfig | 函数原型 | int NRC_SetCustomIODoutConfig(unsigned int sum, int* addr); | | --- | --- | | 功能描述 | 设置自定义 IO dout 配置。 | | 参数说明 | 输入参数:
sum  自定义 IO dout 的数目,参数范围:sum >= 0
addr 自定义 IO dout 的对应地址,一个 int 数值对应1个端口 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 设置自定义 IO dout 的数目和对应地址,1表示高电平,0表示低电平 | ### NRC_SetCustomIODinConfig | 函数原型 | int NRC_SetCustomIODinConfig(unsigned int sum, int* addr); | | --- | --- | | 功能描述 | 设置自定义 IO din 配置。 | | 参数说明 | 输入参数:
sum  自定义 IO din 的数目,参数范围:sum >= 0
addr 自定义 IO din 的对应地址,一个 int 数值对应1个端口 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 设置自定义 IO din 的数目和对应地址,1表示高电平,0表示低电平 | ### NRC_SetCheckExioEnable | 函数原型 | void NRC_SetCheckExioEnable(bool enable); | | --- | --- | | 功能描述 | 设置内置 tcp 接口扩展 IO 检测使能标志。 | | 参数说明 | 输入参数:
enable 默认为 true,检测扩展 IO,设置为 false 时,将不检测扩展 IO | | 返回值 | 无 | | 备注说明 | 请在调用控制器启动函数 NRC_StartController 前设置使能标志,否则将不生效 | ### NRC_SetRobotDHConfig | 函数原型 | int NRC_SetRobotDHConfig(NRC_RobotDHConfig config); | | --- | --- | | 功能描述 | 设置机器人 DH 参数。 | | 参数说明 | 输入参数:
config 机器人 DH 参数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetRobotDHConfig | 函数原型 | int NRC_GetRobotDHConfig(NRC_RobotDHConfig& config); | | --- | --- | | 功能描述 | 获取机器人 DH 参数。 | | 参数说明 | 输出参数:
config 机器人 DH 参数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetRobotJointConfig | 函数原型 | int NRC_SetRobotJointConfig(int axisNum, NRC_RobotJointConfig config); | | --- | --- | | 功能描述 | 设置机器人关节参数。 | | 参数说明 | 输入参数:
axisNum 要设置的轴的序号,参数范围:1 <= axisNum <= 机器人轴总数
config   机器人 DH 参数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_SetRobotDecareConfig | 函数原型 | int NRC_SetRobotDecareConfig(NRC_RobotDecareConfig config); | | --- | --- | | 功能描述 | 设置机器人笛卡尔参数。 | | 参数说明 | 输入参数:
config 机器人的笛卡尔参数,具体看 NRC_RobotDecareConfig 结构体内容 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetRobotDecareConfig | 函数原型 | int NRC_GetRobotDecareConfig(NRC_RobotDecareConfig& config); | | --- | --- | | 功能描述 | 获取机器人笛卡尔参数。 | | 参数说明 | 输出参数:
config 机器人的笛卡尔参数,具体看 NRC_RobotDecareConfig 结构体内容 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetJogJointSpeedConfig | 函数原型 | int NRC_SetJogJointSpeedConfig(int axisNum, double maxSpeed, double acc); | | --- | --- | | 功能描述 | 点动关节速度设置。 | | 参数说明 | 输入参数:
axisNum 要设置的轴的序号,参数范围:1 <= axisNum <= 机器人轴总数
maxSpeed  点动时,该轴可以达到的最大速度,单位:度/秒
acc  点动时,该轴的加速度,单位:度/平方秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetJogJointSpeedConfig | 函数原型 | int NRC_GetJogJointSpeedConfig(int axisNum, double& maxSpeed, double& acc); | | --- | --- | | 功能描述 | 获取点动关节速度。 | | 参数说明 | 输入参数:
axisNum 要设置的轴的序号,参数范围:1 <= axisNum <= 机器人轴总数
输出参数:
maxSpeed  点动时,该轴可以达到的最大速度,单位:度/秒
acc  点动时,该轴的加速度,单位:度/平方秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetJogRectangularSpeedConfig | 函数原型 | int NRC_SetJogRectangularSpeedConfig(double maxSpeed, double acc); | | --- | --- | | 功能描述 | 点动直角速度设置。 | | 参数说明 | 输入参数:
maxSpeed 点动时,直角坐标可以达到的最大速度,单位:毫米/秒
acc  点动时,直角坐标的加速度,单位:毫米/平方秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetJogRectangularSpeedConfig | 函数原型 | int NRC_GetJogRectangularSpeedConfig(double& maxSpeed, double& acc); | | --- | --- | | 功能描述 | 获取点动直角速度。 | | 参数说明 | 输出参数:
maxSpeed 点动时,直角坐标可以达到的最大速度,单位:毫米/秒
acc  点动时,直角坐标的加速度,单位:毫米/平方秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetJogSensitivitySpeedConfig | 函数原型 | int NRC_SetJogSensitivitySpeedConfig(double sensitivity); | | --- | --- | | 功能描述 | 设置点动灵敏度。 | | 参数说明 | 输入参数:
sensitivity  该值越小,点动响应越慢,该值越大,点动误差越大,误差较大时,可能引起机器人抖动,单位:度,默认初始值0.001,参数范围:0.0001 <= sensitivity < 1 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_SetInterpolationMethod | 函数原型 | int NRC_SetInterpolationMethod(int method); | | --- | --- | | 功能描述 | 设置机器人插补方式。 | | 参数说明 | 输入参数:
method 机器人运动时的插补方式:
- 0 S 型插补,机器人加减速较为平滑,但相对于梯形插补加减速较慢,一般大型机器人用该插补方式
- 1 梯形插补,机器人加减速较为迅速,但容易造成机器人抖动、过载等现象,一般小型机器人用该插补方式 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_SetAbsolutePosResolution | 函数原型 | int NRC_SetAbsolutePosResolution(double resolution); | | --- | --- | | 功能描述 | 设置机器人绝对位置分辨率。 | | 参数说明 | 输入参数:
resolution 机器人对位置的分辨率,当两个位置之间的差距小于该值时,机器人将认为这两个位置为同一位置,单位:度,参数范围:0.0001 <= resolution <= 0.1 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_SetDynamicTrackingErrorMaxAllow | 函数原型 | int NRC_SetDynamicTrackingErrorMaxAllow(int trackingError[]); | | --- | --- | | 功能描述 | 设置最大允许动态超差值。 | | 参数说明 | 输入参数:
trackingError 最大允许动态超差值,当超差值大于该值时,机器人将停止运行,数组成员个数应不小于机器人的轴数,单位:万分之一度,参数范围:100 <= trackingError <= 5000000 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_SetStaticTrackingErrorMaxAllow | 函数原型 | int NRC_SetStaticTrackingErrorMaxAllow(int trackingError[]); | | --- | --- | | 功能描述 | 设置最大允许静态超差值。 | | 参数说明 | 输入参数:
trackingError 最大允许静态超差值,当超差值大于该值时,机器人将停止运行,数组成员个数应不小于机器人的轴数,单位:万分之一度,参数范围:100 <= trackingError <= 5000000 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_SetRobotRangeLimit | 函数原型 | int NRC_SetRobotRangeLimit(NRC_RobotRangeLimit range, bool enable, int robotRangeNum,int workType, bool isInInterfer, int port, int value); | | --- | --- | | 功能描述 | 设置机器人范围限制。 | | 参数说明 | 输入参数:
range  see `NRC_RobotRangeLimit
`enable 使能机器人范围,参数范围:0 关闭,1使能
robotRangeNum 机器人范围编号,参数范围:0 < robotRangeNum < 100
workType 机器人范围生效方式,参数范围:0 输出状态,1触发停止
isInInterfer 生效范围,参数范围:true 设置范围内生效,false 设置范围外生效
port 输出 io 端口号,仅在 workType 为0时有效
value 输出 io 高低电平,参数范围:0 低电平,1高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetRobotRangeLimit | 函数原型 | int NRC_GetRobotRangeLimit(int robotRangeNum, NRC_RobotRangeLimit& range, bool &enable, int &workType, bool &isInInterfer, int &port, int &value); | | --- | --- | | 功能描述 | 获取机器人范围限制。 | | 参数说明 | 输入参数:
robotRangeNum 机器人范围编号,参数范围:0 < robotRangeNum < 100
输出参数:
range see `NRC_RobotRangeLimit
`enable 使能机器人范围,参数范围:0 关闭,1使能
workType 机器人范围生效方式,参数范围:0 输出状态,1触发停止
isInInterfer 生效范围,参数范围:true 设置范围内生效,false 设置范围外生效
port 输出 io 端口号,仅在 workType 为0时有效
value 输出 io 高低电平,参数范围:0 低电平,1高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetTeachMaxStepSpeed | 函数原型 | int NRC_SetTeachMaxStepSpeed(int maxJointSpeed, int maxDecareSpeed); | | --- | --- | | 功能描述 | 设置示教模式最大单步速度。 | | 参数说明 | 输入参数:
maxJointSpeed  示教模式下单步运行时最大关节运行速度,单位百分比,参数范围:0 < maxJointSpeed <= 100
maxDecareSpeed  示教模式下单步运行时最大直线运行速度,单位 mm/s,参数范围:2 <= maxJointSpeed <= 9999 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetTeachMaxStepSpeed | 函数原型 | int NRC_GetTeachMaxStepSpeed(int &maxJointSpeed, int &maxDecareSpeed); | | --- | --- | | 功能描述 | 获取示教模式最大单步速度。 | | 参数说明 | 输出参数:
maxJointSpeed  示教模式下单步运行时最大关节运行速度,单位百分比,参数范围:0 < maxJointSpeed <= 100
maxDecareSpeed  示教模式下单步运行时最大直线运行速度,单位 mm/s,参数范围:2 <= maxJointSpeed <= 9999 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCurrentPosToZeroPos | 函数原型 | int NRC_SetCurrentPosToZeroPos(int axisNum,bool mod); | | --- | --- | | 功能描述 | 将当前位置设置为零点或清除多圈值。 | | 参数说明 | 输入参数:
axisNum  操作的轴的序号,当 axisNum 为0时,表示全部轴,参数范围:0 <= axisNum <= 机器人轴总数
mod  为设置零点或清除多圈值,0为设置零点,1为清除多圈值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数
执行该函数大约需要两三秒时间
对于大多数类型的伺服,执行该函数时,会使伺服使能上电,请注意安全 | ### NRC_Rbt_SetCurrentPosToZeroPos | 函数原型 | int NRC_Rbt_SetCurrentPosToZeroPos(int robotNum, int axisNum,bool mod); | | --- | --- | | 功能描述 | 将当前位置设置为零点或清除多圈值(多机版)。 | | 参数说明 | 输入参数:
robotNum  需要设置零点或清空多圈值的机器人编号
axisNum  操作的轴的序号,当 axisNum 为0时,表示全部轴,参数范围:0 <= axisNum <= 机器人轴总数
mod  为设置零点或清除多圈值,0为设置零点,1为清除多圈值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数
执行该函数大约需要两三秒时间
对于大多数类型的伺服,执行该函数时,会使伺服使能上电,请注意安全 | ### NRC_Rbt_SetSingleCircleValue | 函数原型 | int NRC_Rbt_SetSingleCircleValue(int robotNum, const std::vector<int>& value); | | --- | --- | | 功能描述 | 设置零点位置单圈值(多机版)。 | | 参数说明 | 输入参数:
robotNum  需要设置零点或清空多圈值的机器人编号
value  传入各个轴零点位置单圈值数组,0 < value.size() <= 7 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 此操作有可能导致机器人精度丢失、无法正常运行、曾建立的点位无法运行等问题,请谨慎操作 | ### NRC_Rbt_GetSingleCircleValue | 函数原型 | int NRC_Rbt_GetSingleCircleValue(int robotNum, std::vector<int>& value); | | --- | --- | | 功能描述 | 获取零点位置单圈值(多机版)。 | | 参数说明 | 输入参数:
robotNum  需要设置零点或清空多圈值的机器人编号
输出参数:
value  获取到的值存入此数组 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetUserCoordParm | 函数原型 | int NRC_SetUserCoordParm(int userNum, const NRC_Position& deviation); | | --- | --- | | 功能描述 | 设置用户坐标参数。 | | 参数说明 | 输入参数:
userNum  要设置的用户坐标系的编号,参数范围:0 < userNum < 1000
deviation  用户坐标系原点相对机器人直角坐标系原点的偏移量
- deviation.coord 该参数无用
- deviation.pos[0]-deviation.pos[2] 分别为 x,y,z 三轴位置的偏移量,单位:毫米
- deviation.pos[3]-deviation.pos[5] 分别为 x,y,z 三轴方向的偏移量,单位:弧度 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 设置用户坐标系原点相对机器人直角坐标系原点的偏移量,从而确定该用户坐标系
由于实际使用中,很难测量方向的偏移量,所有该函数很少使用,一般使用 NRC_CalibrationUserCoord(int userNum, NRC_Position& origin, NRC_Position& X_Axis, NRC_Position& XOY_Plane) 函数对用户坐标进行标定,自动计算出偏移量 | ### NRC_GetUserCoordParm | 函数原型 | int NRC_GetUserCoordParm(int userNum,NRC_Position& deviation); | | --- | --- | | 功能描述 | 获取用户坐标参数。 | | 参数说明 | 输入参数:
userNum  用户坐标系的编号,参数范围:0 < userNum < 1000
输出参数:
deviation  用户坐标系原点相对机器人直角坐标系原点的偏移量
- deviation.coord 该参数无用
- deviation.pos[0]-deviation.pos[2] 分别为 x,y,z 三轴位置的偏移量,单位:毫米
- deviation.pos[3]-deviation.pos[5] 分别为 x,y,z 三轴方向的偏移量,单位:弧度 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_CalibrationUserCoord | 函数原型 | int NRC_CalibrationUserCoord(int userNum, const NRC_Position& origin, const NRC_Position& X_Axis, const NRC_Position& XOY_Plane); | | --- | --- | | 功能描述 | 标定用户坐标,标定用户坐标系,自动计算用户坐标系原点相对机器人直角坐标系原点的偏移量,从而确定该用户坐标系。 | | 参数说明 | 输入参数:
userNum 要标定的用户坐标系的编号,参数范围:0 < userNum < 10
origin  用户坐标系原点在机器人直角坐标系中的位置
X_Axis  用户坐标系 X 轴正方向上任一点在机器人直角坐标系中的位置
XOY_Plane 用户坐标系 XOY 平面上任一点在机器人直角坐标系中的位置 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SwitchUserCoord | 函数原型 | int NRC_SwitchUserCoord(int tagetUser); | | --- | --- | | 功能描述 | 切换当前用户坐标。 | | 参数说明 | 输入参数:
tagetUser 要切换的目标用户坐标系的编号,参数范围:0 < tagetUser < 10 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetCurrentUserCoord | 函数原型 | int NRC_GetCurrentUserCoord(); | | --- | --- | | 功能描述 | 获取当前用户坐标编号。 | | 参数说明 | 无 | | 返回值 | 用户坐标编号 | | 备注说明 | 无 | ### NRC_ecatSetCommand | 函数原型 | int NRC_ecatSetCommand(unsigned int axisNum, unsigned int index, unsigned int subindex, unsigned char* value, unsigned int size); | | --- | --- | | 功能描述 | 设置伺服某命令字的值。 | | 参数说明 | 输入参数:
axisNum 机器人的轴编号
index 命令字编码
subindex 命令字子编码
value 要设置进去的值
size 命令字对应的值的字节数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 示例:
unsigned short value = 3000;
NRC_ecatSetCommand(1, 0x6072, 0, (signed short* )&value, sizeof(value)); | ### NRC_ecatGetCommand | 函数原型 | int NRC_ecatGetCommand(unsigned int axisNum, unsigned int index, unsigned int subindex, unsigned char* value, unsigned int size); | | --- | --- | | 功能描述 | 读取伺服某命令字的值。 | | 参数说明 | 输入参数:
axisNum 机器人的轴编号
index 命令字编码
subindex 命令字子编码
size 命令字对应的值的字节数
输出参数:
value 结果存放入此指针返回 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 示例:
unsigned short value = 0;
NRC_ecatGetCommand(1, 0x6041, 0, (unsigned char* )&value, sizeof(value));
printf("value=%d ", value);
unsigned int value = 0;
NRC_ecatGetCommand(3, 0x202C, 0, (unsigned char* )&value, sizeof(value));
printf("value=%d ", value); | ### NRC_ModifyControllerIP | 函数原型 | int NRC_ModifyControllerIP(const std::string &name, const std::string &ip, const std::string &gateway, const std::string &dns); | | --- | --- | | 功能描述 | 修改控制器 IP 地址。 | | 参数说明 | 输入参数:
name  网口名称
ip 要修改为的目标 IP,要符合 IP 规则
gateway 控制器网关
dns  控制器 DNS | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 修改后一定要记得修改后的 ip,否则无法重现连接控制器,需要返厂! | ### NRC_RestoreFactorySettings | 函数原型 | int NRC_RestoreFactorySettings(bool clearConfigFile,bool clearExtendedFile); | | --- | --- | | 功能描述 | 恢复出厂设置。 | | 参数说明 | 输入参数:
clearConfigFile 系统所有配置文件
clearExtendedFile 所有扩展文件 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 恢复出厂设置后,控制器中的各数据将会被清除,请谨慎操作
调用该函数后,控制器随即就会重启 | ### NRC_RebootController | 函数原型 | int NRC_RebootController(); | | --- | --- | | 功能描述 | 重启控制器。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数后,控制器随即就会重启 | ### NRC_GetCurrentMotorVel | 函数原型 | int NRC_GetCurrentMotorVel(double vel[]); | | --- | --- | | 功能描述 | 获取电机转速。 | | 参数说明 | 输出参数:
vel 电机转速将通过数组返回,数组成员个数应不小于机器人的轴数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetCurrentMotorVel | 函数原型 | int NRC_Rbt_GetCurrentMotorVel(int robotNum, double vel[]); | | --- | --- | | 功能描述 | 获取电机转速(多机版)。 | | 参数说明 | 输入参数:
robotNum 传入机器人编号(1-4)
输出参数
vel 电机转速将通过数组返回,数组成员个数应不小于机器人的轴数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetCurrentTrackingError | 函数原型 | int NRC_GetCurrentTrackingError(double trackingError[]); | | --- | --- | | 功能描述 | 获取当前超差值。 | | 参数说明 | 输出参数
trackingError 当前超差值将通过数组返回,数组成员个数应不小于机器人的轴数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetMaxTrackingError | 函数原型 | int NRC_GetMaxTrackingError(double maxTrackingError[]); | | --- | --- | | 功能描述 | 获取最大超差值。 | | 参数说明 | 输出参数
maxTrackingError 最大超差值将通过数组返回,数组成员个数应不小于机器人的轴数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetRobotAxisSum | 函数原型 | int NRC_GetRobotAxisSum(); | | --- | --- | | 功能描述 | 获取机器人轴数。 | | 参数说明 | 无 | | 返回值 | 机器人轴数 | | 备注说明 | 无 | ### NRC_GetSyncAxisSum | 函数原型 | int NRC_GetSyncAxisSum(); | | --- | --- | | 功能描述 | 获取外部轴轴数。 | | 参数说明 | 无 | | 返回值 | 外部轴轴数 | | 备注说明 | 无 | ### NRC_GetCurrentTime | 函数原型 | NRC_TIME NRC_GetCurrentTime(); | | --- | --- | | 功能描述 | 获取当前时间。 | | 参数说明 | 无 | | 返回值 | NRC_TIME 结构体 | | 备注说明 | 无 | ### NRC_SetMsgHappenCallback | 函数原型 | int NRC_SetMsgHappenCallback(void (*fun)(void)); | | --- | --- | | 功能描述 | 设置消息发生时的回调函数。 | | 参数说明 | 输入参数:
fun 回调函数的函数指针 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 当有消息发生时,将会调用此回调函数 | ### NRC_FirstMessagePop | 函数原型 | NRC_Message NRC_FirstMessagePop(); | | --- | --- | | 功能描述 | 弹出队列中最早的消息。 | | 参数说明 | 无 | | 返回值 | 返回队列中最早的消息,并从队列中移除该消息 | | 备注说明 | 无 | ### NRC_LastMessagePop | 函数原型 | NRC_Message NRC_LastMessagePop(); | | --- | --- | | 功能描述 | 弹出队列中最后的消息。 | | 参数说明 | 无 | | 返回值 | 返回队列中最后的消息,并从队列中移除该消息 | | 备注说明 | 无 | ### NRC_GetMessage | 函数原型 | int NRC_GetMessage(int num, NRC_Message& msg); | | --- | --- | | 功能描述 | 获取队列中第 num 个消息。 | | 参数说明 | 输入参数:
num 要获取的消息在队列中的编号,最早的消息编号为1,取值范围:0 < num <= NRC_GetMessageSize()
输出参数:
msg 获取的消息通过此参数返回 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 获取队列中第 num 个消息,不会移除该消息 | ### NRC_GetMessageSize | 函数原型 | int NRC_GetMessageSize(); | | --- | --- | | 功能描述 | 获取队列中消息总数。 | | 参数说明 | 无 | | 返回值 | 队列中消息总数 | | 备注说明 | 无 | ### NRC_ClearMessage | 函数原型 | void NRC_ClearMessage(); | | --- | --- | | 功能描述 | 获取当前用户坐标编号。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ClearServoError | 函数原型 | int NRC_ClearServoError(); | | --- | --- | | 功能描述 | 清除伺服错误。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 并不是所有的伺服错误都可以直接清除,有些错误是需要先排除错误情况才能清除! | ### NRC_ClearAllError | 函数原型 | int NRC_ClearAllError(); | | --- | --- | | 功能描述 | 清除全部错误,清空消息的队列,同时清除伺服错误。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 并不是所有的伺服错误都可以直接清除,有些错误是需要先排除错误情况才能清除! | ### NRC_GetAngularVel | 函数原型 | int NRC_GetAngularVel(double* angular); | | --- | --- | | 功能描述 | 获取关节角速度,单位 rad/s。 | | 参数说明 | 输出参数:
angular 角速度数组,最大长度为 12 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetLinerVel | 函数原型 | int NRC_GetLinerVel(double& linevel); | | --- | --- | | 功能描述 | 获取关节线速度,单位 mm/s。 | | 参数说明 | 输出参数:
linevel 末端线速度 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetAxisVelSync | 函数原型 | int NRC_GetAxisVelSync(double* syncangular); | | --- | --- | | 功能描述 | 获取外部运动速度。 | | 参数说明 | 输出参数:
syncangular 运动速度数组,最大长度为 12 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 若外部轴为直线轴,单位为 mm/s,若为关节轴,单位为 °/s | ### NRC_GetTorq | 函数原型 | int NRC_GetTorq(double* torq); | | --- | --- | | 功能描述 | 获取各关节力矩,单位为千分比。 | | 参数说明 | 输出参数:
torq  以数组的形式返回各关节的力矩值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetTorq | 函数原型 | int NRC_Rbt_GetTorq(int robotNum, double* torq); | | --- | --- | | 功能描述 | 获取各关节力矩,单位为千分比 多机版。 | | 参数说明 | 输入参数:
robotNum 机器人编号
输出参数:
torq  以数组的形式返回各关节的力矩值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetSyncTorq | 函数原型 | int NRC_GetSyncTorq(double* torq); | | --- | --- | | 功能描述 | 获取各外部轴关节力矩,单位为千分比。 | | 参数说明 | 输出参数:
torq  以数组的形式返回各外部轴关节的力矩值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetSyncTorq | 函数原型 | int NRC_Rbt_GetSyncTorq(int robotNum, double* torq); | | --- | --- | | 功能描述 | 获取各外部轴关节力矩,单位为千分比 多机版。 | | 参数说明 | 输入参数:
robotNum 机器人编号
输出参数:
torq  以数组的形式返回各外部轴关节的力矩值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetRatedTorque | 函数原型 | int NRC_GetRatedTorque(double* ratedTorq); | | --- | --- | | 功能描述 | 获取各关节额定力矩。 | | 参数说明 | 输入参数:
syncangular 运动速度数组,最大长度为 12 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetRatedTorque | 函数原型 | int NRC_Rbt_GetRatedTorque(int robotNum, double* ratedTorq); | | --- | --- | | 功能描述 | 获取各关节额定力矩 多机版。 | | 参数说明 | 输入参数:
ratedTorq 以数组的形式返回各关节的额定力矩值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetSyncJointNum | 函数原型 | int NRC_SetSyncJointNum(int syncGroupNum, std::vector<int> syncGroupType); | | --- | --- | | 功能描述 | 设置机器人外部轴数目。 | | 参数说明 | 输入参数:
syncGroupNum 要设置的外部轴轴组数,参数范围:0 <= syncGroupNum <= 3
syncGroupType 要设置的外部轴各轴组类型,1:单轴变位机,2:双轴变位机,3: | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数。
修改后重启才能生效!!! | ### NRC_Rbt_GetSyncJointType | 函数原型 | int NRC_Rbt_GetSyncJointType(int robot, std::vector<int>& sync_group_type); | | --- | --- | | 功能描述 | 获取机器人外部轴组类型。 | | 参数说明 | 输入参数:
robot 机器人号, 0< robot <= 4
输出参数:
sync_group_type 获取到的数据按照外部轴连接顺序存入 sync_group_type 容器 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 外部轴各轴组类型,1:单轴变位机,2:双轴变位机,3:地轨 | ### NRC_GetSyncRackConversionRatio | 函数原型 | int NRC_GetSyncRackConversionRatio(double & xDirection,double & yDirection,double & zDirection); | | --- | --- | | 功能描述 | 获取外部轴地轨转换比。 | | 参数说明 | 输出参数:
xDirection   X 方向
yDirection   Y 方向
zDirection   Z 方向 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetSyncRackConversionRatio | 函数原型 | Int NRC_SetSyncRackConversionRatio(double xDirection,double yDirection,double zDirection); | | --- | --- | | 功能描述 | 设置外部轴地轨转换比。 | | 参数说明 | 输入参数:
xDirection   X 方向
yDirection   Y 方向
zDirection   Z 方向 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetSyncCooperation | 函数原型 | int NRC_SetSyncCooperation(bool coopertion); | | --- | --- | | 功能描述 | 设置外部轴地轨是否协作。 | | 参数说明 | 输入参数:
coopertion:是否协作 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetSyncCooperation | 函数原型 | int NRC_GetSyncCooperation(int syncGroupNum); | | --- | --- | | 功能描述 | 获取外部轴地轨是否协作。 | | 参数说明 | 输入参数:
syncGroupNum:轴组的序号,参数范围:1 <= syncGroupNum <= 3 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_CalSyncCalibrationResult | 函数原型 | int NRC_CalSyncCalibrationResult(int syncGroupNum); | | --- | --- | | 功能描述 | 计算外部轴标定结果。 | | 参数说明 | 输入参数:
syncGroupNum 轴组的序号,参数范围:1 <= syncGroupNum <= 3 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetSyncGroupNum | 函数原型 | int NRC_GetSyncGroupNum(); | | --- | --- | | 功能描述 | 获取当前外部轴组号。 | | 参数说明 | 无 | | 返回值 | 外部轴组号 | | 备注说明 | 无 | ### NRC_SetSyncGroupNum | 函数原型 | int NRC_SetSyncGroupNum(int syncGroupNum); | | --- | --- | | 功能描述 | 设置机器人外部轴组号。 | | 参数说明 | 输入参数:
syncGroupNum 要设置的轴组的序号,参数范围:1 <= syncGroupNum <= 3 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetSyncGroupCarbinarion | 函数原型 | int NRC_GetSyncGroupCarbinarion(int syncGroupNum); | | --- | --- | | 功能描述 | 查询某组外部轴是否标定。 | | 参数说明 | 输入参数:
syncGroupNum 要查询的轴组的序号,参数范围:1 <= syncGroupNum <= 3 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetSyncGroupCarbinarion | 函数原型 | int NRC_SetSyncGroupCarbinarion(int syncGroupNum,int pointNum); | | --- | --- | | 功能描述 | 标定外部轴点位(组号,点位编号)。 | | 参数说明 | 输入参数:
syncGroupNum 要设置的轴组的序号,参数范围:1 <= syncGroupNum <= 3
pointNum 要设置的点位编号,0 <= pointNum <= 4 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetSyncJointPara | 函数原型 | int NRC_SetSyncJointPara(int syncGroupNum, int syncAxisNum, NRC_RobotJointConfig config); | | --- | --- | | 功能描述 | 设置机器人外部轴参数。 | | 参数说明 | 输入参数:
syncGroupNum 要设置的轴组的序号,参数范围:1 <= syncGroupNum <= 3
syncAxisNum 要设置的某轴组中轴的序号,参数范围:1 <= syncAxisNum <= 2
config  see NRC_RobotJointConfig | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetSyncJointPara | 函数原型 | int NRC_GetSyncJointPara(int syncGroupNum, int syncAxisNum, NRC_RobotJointConfig& config); | | --- | --- | | 功能描述 | 获取机器人外部轴参数。 | | 参数说明 | 输入参数:
syncGroupNum 要设置的轴组的序号,参数范围:1 <= syncGroupNum <= 3
syncAxisNum 要设置的某轴组中轴的序号,参数范围:1 <= syncAxisNum <= 2
输出参数:
config  see NRC_RobotJointConfig | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetSyncJogJointSpeedConfig | 函数原型 | int NRC_SetSyncJogJointSpeedConfig(int groupNum, int axisNum, double maxSpeed, double acc); | | --- | --- | | 功能描述 | 设置机器人外部轴点动关节速度。 | | 参数说明 | 输入参数:
groupNum 要设置的轴组序号,参数范围:1 <= groupNum <= 外部轴轴组总数
axisNum 要设置的轴在轴组中的序号,参数范围:1 <= axisNum <= 轴组组总数
maxSpeed 点动时,该轴可以达到的最大速度,单位:度/秒
acc 点动时,该轴的加速度,单位:度/平方秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数 | ### NRC_GetSyncJogJointSpeedConfig | 函数原型 | int NRC_GetSyncJogJointSpeedConfig(int groupNum, int axisNum, double& maxSpeed, double& acc); | | --- | --- | | 功能描述 | 获取机器人外部轴点动关节速度。 | | 参数说明 | 输入参数:
groupNum 要设置的轴组序号,参数范围:1 <= groupNum <= 外部轴轴组总数
axisNum 要设置的轴在轴组中的序号,参数范围:1 <= axisNum <= 轴组组总数
输出参数:
maxSpeed 点动时,该轴可以达到的最大速度,单位:度/秒
acc 点动时,该轴的加速度,单位:度/平方秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCurrentSyncPosToZeroPos | 函数原型 | int NRC_SetCurrentSyncPosToZeroPos(int axisNum,bool mod); | | --- | --- | | 功能描述 | 将外部轴当前位置设置为零点或清除多圈值。 | | 参数说明 | 输入参数:
axisNum 操作的轴的序号,当 axisNum 为0时,表示全部外部轴,参数范围:0 <= axisNum <= 外部轴轴总数
mod 为设置零点或清除多圈值,0为设置零点,1为清除多圈值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 请在伺服停止或伺服就绪状态下设置该参数。
执行该函数大约需要两三秒时间。
对于大多数类型的伺服,执行该函数时,会使伺服使能上电,请注意安全。 | ### NRC_RobotMoveJointSync | 函数原型 | int NRC_RobotMoveJointSync(int vel,NRC_Position target, const NRC_SyncPosition& targetSync,  int acc, int dec); | | --- | --- | | 功能描述 | 机器人外部轴点到点运动,机器人外部轴以 vel 的速度从当前位置以点到点方式运行到 synctarget 位置。 | | 参数说明 | 输入参数:
vel 机器人外部轴的运行速度,为机器人外部轴最大速度的百分比,参数范围:0 < vel <= 100
target 机器人本体运动目标位置,详见 `NRC_Position
`targetSync 机器人外部轴运动目标位置,详见 `NRC_SyncPosition
`acc 机器人外部轴运行加速度,为机器人外部轴各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人外部轴运行减速度,为机器人外部轴各关节最大减速度的百分比,参数范围:0 < vel <= 100 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请将伺服上电使能,可调用 NRC_ServoEnable() 函数将伺服上电。成功调用该函数后,机器人外部轴将开始运动,请注意安全。 | ### NRC_RobotMoveLineSync | 函数原型 | int NRC_RobotMoveLineSync(int vel,NRC_Position target, const NRC_SyncPosition& targetSync,  int acc, int dec); | | --- | --- | | 功能描述 | 机器人外部轴直线运动,机器人本体以 vel 的速度从当前位置以直线方式运行到 target 位置,机器人外部轴以 vel 的速度从当前位置以点到点方式运行到 synctarget 位置。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置,详见 `NRC_Position
`targetSync 外部轴运动目标位置,详见 NRC_SyncPosition | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请将伺服上电使能,可调用 NRC_ServoEnable() 函数将伺服上电。成功调用该函数后,机器人外部轴将开始运动,请注意安全。 | ### NRC_GetCurrentSyncPos | 函数原型 | int NRC_GetCurrentSyncPos(NRC_SyncPosition& position); | | --- | --- | | 功能描述 | 获取外部轴当前位置,该函数可以获取外部轴位置,位置数据由参数引用 position 返回。 | | 参数说明 | 输出参数:
NRC_SyncPosition 外部轴当前位置 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetCurrentSyncPos | 函数原型 | int NRC_Rbt_GetCurrentSyncPos(int robotNum, NRC_SyncPosition& position); | | --- | --- | | 功能描述 | 获取外部轴当前位置(多机版),该函数可以获取在 coord 坐标系下外部轴位置,位置数据由参数引用 position 返回。 | | 参数说明 | 输入参数:
robotNum 机器人编号(1-4)
输出参数:
NRC_SyncPosition 外部轴当前位置 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_PosReachable | 函数原型 | int NRC_PosReachable(NRC_Position target,NRC_SyncPosition syncTarget,bool &result); | | --- | --- | | 功能描述 | 该函数可以判断本体点位 target 和外部轴点位 syncTarget 是否超限,结果由 result 返回,result 值为 true 表示可以到达,值为 false 表示不可到达。 | | 参数说明 | 输入参数:
target  see `NRC_Position
`syncTarget  see `NRC_SyncPosition
`输出参数:
result  true 表示可以到达,值为 false 表示不可到达 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetIdentityParam | 函数原型 | int NRC_SetIdentityParam(int size,int vel,double& zMax,double& zMin); | | --- | --- | | 功能描述 | 该函数用于设置动力学辨识所需的两个参数并返回当前轨迹范围下机器人末端在 Z 坐标轴上的最大值和最小值。 | | 参数说明 | 输入参数:
size,控制辨识轨迹的范围
vel,控制辨识轨迹的速度
输出参数:
zMax 末端运行到的 Z 的最大值
zMin 末端运行到的 Z 的最小值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 动力学辨识过程中机器人会大幅度运动,因此要确保机器人的运动范围内空旷,无障碍物。执行动力学辨识功能前请认真阅读以下注意事项:
* 1.目前动力学辨识功能只适用于六轴机器人空载状态下对本体进行辨识。
* 2.该辨识方法所得动力学参数与手填动力学参数无关。
* 3.执行辨识程序前确保机器人的运动范围内空旷,无障碍物。
* 4.辨识轨迹的范围由参数 size 控制,100时为最大范围;辨识轨迹的速度由参数 vel 控制,100时为最大速度,此时辨识轨迹运行时间为10秒。
* 5.辨识轨迹的参数的设置规则:首先设定一个较小的 vel 值(建议20),并设置一个较小的 size 值(建议20),并执行安全检测程序(NRC_RunSafeCheckProgram),
* 在安全的基础上逐步增大 size 的值,直至达到最大的安全运行范围(此时 size 值可能未达到100,取决于机器人的运行环境)。
* 在得到环境所允许的最大 size 值后,把 vel 值设置为100,执行辨识程序(NRC_RunIdentifyProgram)。
* 6.执行辨识时 vel 值必须是100,而 size 值没有固定值(理论上 size 越接近100辨识精度越高)。 | ### NRC_RunSafeCheckProgram | 函数原型 | int NRC_RunSafeCheckProgram(); | | --- | --- | | 功能描述 | 运行范围安全检测程序,该函数功能是运行一次动力学辨识的轨迹,以便确认周围环境是否安全,即确保机器人进行辨识时不会碰到周围的人或物。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_RunIdentifyProgram | 函数原型 | int NRC_RunIdentifyProgram(); | | --- | --- | | 功能描述 | 执行动力学辨识程序,该函数的功能是进行动力学辨识,沿预定轨迹运行十次,每次运行完成后会对获取到的数据进行计算并返回理论力矩与实际力矩的误差值。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetIdentifyError | 函数原型 | int NRC_GetIdentifyError(double* error); | | --- | --- | | 功能描述 | 获取十次辨识力矩误差值,该函数的功能是获取十次辨识计算的理论力矩与实际力矩的误差值。 | | 参数说明 | 输出参数:
error 返回理论力矩与实际力矩的误差值,数组长度为60,每6个数据为一次运行轨迹所得到的误差值,共有十次轨迹的误差值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_StopIdentityProgram | 函数原型 | int NRC_StopIdentityProgram(); | | --- | --- | | 功能描述 | 停止动力学辨识程序。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCollisionParam | 函数原型 | int NRC_SetCollisionParam(double* param); | | --- | --- | | 功能描述 | 该函数的功能是设置各关节判定发生碰撞时理论力矩与实际力矩的差值的绝对值,该值越大则判断碰撞发生的灵敏度越低。 | | 参数说明 | 输入参数:
param 是六位数组,从首元素到尾元素依次表示一到六关节的阈值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCollisionSwitch | 函数原型 | int NRC_SetCollisionSwitch(bool param); | | --- | --- | | 功能描述 | 该函数的功能是打开或关闭碰撞检测功能。 | | 参数说明 | 输入参数:
param true 为打开碰撞检测功能,false 为关闭碰撞检测功能 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetCollisionSwitch | 函数原型 | int NRC_GetCollisionSwitch(double* syncangular); | | --- | --- | | 功能描述 | 该函数的功能是查看碰撞检测功能是否打开。 | | 参数说明 | 输出参数:
param true 为碰撞检测功能打开,false 为碰撞检测功能关闭 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_CalcConfiguration | 函数原型 | int NRC_CalcConfiguration(double* acsPos,int& conf); | | --- | --- | | 功能描述 | 该函数的功能是计算机器人各关节在 acsPos 下的形态,仅对 R_GENERAL_6S 类型机器人有效,其余机器人类型下 conf 值为0。 | | 参数说明 | 输入参数:
acsPos 六维数组,用于传入机器人各关节位置
输出参数:
conf 传出机器人形态值的计算结果,0表示机器人类型不是 R_GENERAL_6S,1-8对应机器人的8个形态值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetSocketCustomProtocalCB | 函数原型 | int NRC_SetSocketCustomProtocalCB(int commandNum,void (*fun)(std::string)); | | --- | --- | | 功能描述 | 该函数的功能是自定义 socket 通讯协议。 | | 参数说明 | 输入参数:
commandNum 通讯编号,范围 0x9200 - 0`x920e
`(*fun)(string) 函数句柄,即 commandNum 指令要调用的函数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SendSocketCustomProtocal | 函数原型 | int NRC_SendSocketCustomProtocal(int commandNum,std::string str); | | --- | --- | | 功能描述 | 发送 socket 通信。 | | 参数说明 | 输入参数:
commandNum 通讯编号,范围 0x9200 - 0`x920e
`str 发送的内容 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetTeachBoxConnectStatus | 函数原型 | bool NRC_GetTeachBoxConnectStatus(); | | --- | --- | | 功能描述 | 获取是否连接了示教盒。 | | 参数说明 | 无 | | 返回值 | 是否连接了示教盒 | | 备注说明 | 无 | ### NRC_SetJobFileCustomInstructionCB | 函数原型 | int NRC_SetJobFileCustomInstructionCB(bool (*fun)(int,const std::string &,const std::string &)); | | --- | --- | | 功能描述 | 该函数的功能是将一个函数绑定到自定义指令中。 | | 参数说明 | 输入参数:
(*fun)(int,std::string,std::string) 函数指针,即自定义指令要调用的函数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 回调函数指针中的参数分别为该自定义指令的编号,该自定义指令的字符串参数,该自定义指令调用的点位名称(未调用则此参数为空) | ### NRC_SetJobFileCustomInstructionPreTreatmentCB | 函数原型 | int NRC_SetJobFileCustomInstructionPreTreatmentCB(void (*fun)(int,const std::string &,const std::string &)); | | --- | --- | | 功能描述 | 该函数的功能是将一个函数绑定到自定义指令的预处理函数中。 | | 参数说明 | 输入参数:
(*fun)(int,std::string,std::string) 函数指针,即自定义指令要调用的预处理函数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 回调函数指针中的参数分别为该自定义指令的编号,该自定义指令的字符串参数,该自定义指令调用的点位名称(未调用则此参数为空) | ### NRC_SetJobFileCustomInstructionPostTreatmentCB | 函数原型 | int NRC_SetJobFileCustomInstructionPostTreatmentCB(void (*fun)(int,const std::string &,const std::string &)); | | --- | --- | | 功能描述 | 该函数的功能是将一个函数绑定到自定义指令的后处理函数中。 | | 参数说明 | 输入参数:
(*fun)(int,std::string,std::string) 函数指针,即自定义指令要调用的后处理函数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 回调函数指针中的参数分别为该自定义指令的编号,该自定义指令的字符串参数,该自定义指令调用的点位名称(未调用则此参数为空) | ### NRC_ParseJobfileToAppendRunInstruction | 函数原型 | int NRC_ParseJobfileToAppendRunInstruction(const std::string &fileName, std::vector<NRC_InstrDataBase*>& instrVec); | | --- | --- | | 功能描述 | 该函数的功能是把作业文件中的所有指令解析成可以作为追加模式指令的队列。 | | 参数说明 | 输入参数:
fileName 要解析的作业文件名
输出参数:
instrVec 解析完成后得到的追加模式指令队列 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_TriggerErrorReport | 函数原型 | int NRC_TriggerErrorReport(int kind,const std::string &text); | | --- | --- | | 功能描述 | 用户主动触发报错。 | | 参数说明 | 输入参数:
kind <消息级别:0:一般消息,1:警告消息,2:错误消息,3:重要消息
text 报错内容 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetOpenJobFileName | 函数原型 | int NRC_GetOpenJobFileName(std::string& name); | | --- | --- | | 功能描述 | 该函数的功能是获取当前打开的作业文件的名称。 | | 参数说明 | 输出参数:
name 返回当前打开的作业文件的名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SendCursorJumpCmdToTeachbox | 函数原型 | int NRC_SendCursorJumpCmdToTeachbox(const std::string& name, int line); | | --- | --- | | 功能描述 | 调用该接口,将向示教器发送光标跳行命令,示教器响应后,会将光标跳转到指定作业文件的指定行。 | | 参数说明 | 输入参数:
line 跳转到指定作业文件的指定行
输出参数:
name 返回当前打开的作业文件的名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SingleSyncAxisMoveJConstVel_For_CustomInstructionCB | 函数原型 | int NRC_SingleSyncAxisMoveJConstVel_For_CustomInstructionCB(int syncAxis,double vel); | | --- | --- | | 功能描述 | 调用该接口,在运行模式下,外部轴 syncAxis 将会以恒定的 vel 运动,同时调用多个该函数只有第一个该函数有效。 | | 参数说明 | 输入参数:
syncAxis 要运动的外部轴号,从1开始,比如需要外部轴1运动,则 syncAxis 传入1
vel 运动的速度,单位度每秒 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_StopSingleSyncAxisMoveJConstVel_For_CustomInstructionCB | 函数原型 | int NRC_StopSingleSyncAxisMoveJConstVel_For_CustomInstructionCB(); | | --- | --- | | 功能描述 | 调用该接口,将停止外部轴恒速运动,该接口必须在有外部轴恒速运动状态下调用,否则返回-1。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetSingleSyncAxisMoveJConstVelMoving | 函数原型 | int NRC_GetSingleSyncAxisMoveJConstVelMoving(bool& moving); | | --- | --- | | 功能描述 | 调用该接口获取单个外部轴恒速运动标志位。 | | 参数说明 | 输出参数:
moving true 表示 NRC_SingleSyncAxisMoveJConstVel_For_CustomInstructionCB 正在生效,false 表示 NRC_SingleSyncAxisMoveJConstVel_For_CustomInstructionCB 未生效 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ResetSyncAxisMultipleTurns | 函数原型 | int NRC_ResetSyncAxisMultipleTurns(int syncAxis); | | --- | --- | | 功能描述 | 调用该接口,把外部轴当前位置重置到-360°~360°内,效果同示教器界面中的复位外部轴多圈转动量指令,该接口仅能重置单个外部轴。 | | 参数说明 | 输入参数:
要重置的外部轴号,从1开始,比如需要重置外部轴1,则 syncAxis 传入1 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetFaultResetCB | 函数原型 | int NRC_SetFaultResetCB(void (*fun)()); | | --- | --- | | 功能描述 | 该函数的功能是设置清错按键回调函数,不影响控制器本身的清错功能。 | | 参数说明 | 输入参数:
void (*fun)()  注册一个函数,在示教器按下清错按键时调用改注册的函数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetRunModeAutoManBegFlag | 函数原型 | int NRC_SetRunModeAutoManBegFlag(bool flag); | | --- | --- | | 功能描述 | 设置切到运行模式自动上电。 | | 参数说明 | 输入参数:
flag  0-切到运行模式不会自动上电  1-切到运行模式自动上电 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetServoModerOfOperation | 函数原型 | int NRC_SetServoModerOfOperation(unsigned char moderValue); | | --- | --- | | 功能描述 | 设置伺服运行模式。 | | 参数说明 | 输入参数:
moderValue 伺服运行模式:3:速度模式 PV,8:周期位置模式 CSP, 9:周期同步速度模式(CSV), 10:周期同步转矩模式(CST) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_SetServoModerOfOperation | 函数原型 | int NRC_Rbt_SetServoModerOfOperation(int rotbotNum, unsigned char moderValue); | | --- | --- | | 功能描述 | 设置伺服运行模式,多机版。 | | 参数说明 | 输入参数:
rotbotNum 机器人编号(1-4)
moderValue 伺服运行模式:3:速度模式 PV, 8:周期位置模式 CSP,  9:周期同步速度模式(CSV),  10:周期同步转矩模式(CST) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_PV_SetTargetVelocity | 函数原型 | int NRC_PV_SetTargetVelocity(int robotNum, unsigned int axisNum, double vel); | | --- | --- | | 功能描述 | 调用该接口,将设置 PV 模式下运行速度。 | | 参数说明 | 输入参数:
robotNum  机器人编号(1-4)
axisNum   轴号,1为起始轴数
vel   设置速度值 单位 r/min | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 仅在 PV 模式下有用 | ### NRC_PV_SetTargetAccAndDec | 函数原型 | int NRC_PV_SetTargetAccAndDec(int robotNum, unsigned int axisNum, double acc, double dec); | | --- | --- | | 功能描述 | 调用该接口,将设置 PV 模式下运行加速度,减速度。 | | 参数说明 | 输入参数:
robotNum  机器人编号(1-4)
axisNum   轴号,1为起始轴数
acc  加速度值 单位 r/`min
`dec  减速度值 单位 r/min | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 仅在 PV 模式下有用 | ### NRC_GetIOConfig | 函数原型 | int NRC_GetIOConfig(int ioNum, int ioType); | | --- | --- | | 功能描述 | 调用该接口,可以返回特定 IO 板对应的 IO 端口数量。 | | 参数说明 | 输入参数:
ioNum  IO 板编号, 欲查询连接的 IO 板,就传入对应 IO 板编号,范围[1-4]
ioType  IO 端口类型 DIN = 0, DOUT = 1, AIN = 2, AOUT = 3 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 示例:目前共连接3块 IO 板,查询该 IO 版 DIN 端口数:​
​ NRC_GetIOConfig(3,0); // 范围不能超过3 | ### NRC_GetIOBoardSum | 函数原型 | int NRC_GetIOBoardSum(); | | --- | --- | | 功能描述 | 调用该接口,可以返回 IO 板数量。 | | 参数说明 | 输入参数:
syncangular 运动速度数组,最大长度为 12 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetTargetPosition | 函数原型 | int NRC_SetTargetPosition(double* targetPosition); | | --- | --- | | 功能描述 | 调用该接口,将设置机器人目标位置。 | | 参数说明 | 输入参数:
targetPosition 传入各关节的角度位置的数组 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetTargetTorque | 函数原型 | int NRC_SetTargetTorque(signed short* targetTorq); | | --- | --- | | 功能描述 | 设置机器人目标力矩。 | | 参数说明 | 输入参数:
targetTorq  传入各关节的目标力矩的数组 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetMaxTorque | 函数原型 | int NRC_SetMaxTorque(int axis, signed short torque); | | --- | --- | | 功能描述 | 设置机器人轴最大力矩。 | | 参数说明 | 输入参数:
axis  轴号
torque  轴最大力矩 参考:3000 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetMaxTorque | 函数原型 | int NRC_GetMaxTorque(int axis, signed short& torque); | | --- | --- | | 功能描述 | 获取机器人轴最大力矩。 | | 参数说明 | 输入参数:
axis  轴号
输出参数:
torque  轴最大力矩存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_SetMaxTorque | 函数原型 | int NRC_Rbt_SetMaxTorque(int robotNum, int axis, signed short torque); | | --- | --- | | 功能描述 | 获取机器人轴最大力矩,多机版。 | | 参数说明 | 输入参数:
robotNum 传入机器人编号(1-4)
axis  轴号
输出参数:
torque  轴最大力矩存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetActualTorque | 函数原型 | int NRC_GetActualTorque(int robotNum, int axis, signed short& torque); | | --- | --- | | 功能描述 | 获取机器人轴实际力矩。 | | 参数说明 | 输入参数:
robotNum  传入机器人编号(1-4)
axis  轴号
输出参数:
torque  轴实际力矩存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetActualCurrent | 函数原型 | int NRC_GetActualCurrent(int robotNum, int axis, signed short& current); | | --- | --- | | 功能描述 | 获取实际电流。 | | 参数说明 | 输入参数:
robotNum  传入机器人编号(1-4)
axis  轴号
输出参数:
current 电流存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetMaxCurrent | 函数原型 | int NRC_GetMaxCurrent(int robotNum, int axis, signed short& current); | | --- | --- | | 功能描述 | 获取最大电流。 | | 参数说明 | 输入参数:
robotNum  传入机器人编号(1-4)
axis  轴号
输出参数:
current 最大电流存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetOverTolerance | 函数原型 | int NRC_SetOverTolerance(int axis, unsigned int tolerance); | | --- | --- | | 功能描述 | 设置机器人轴超差。 | | 参数说明 | 输入参数:
axis  轴号
tolerance  机器人轴最大超差 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_SetOverTolerance | 函数原型 | int NRC_Rbt_SetOverTolerance(int robotNum, int axis, unsigned int tolerance); | | --- | --- | | 功能描述 | 设置机器人轴超差,多机版。 | | 参数说明 | 输入参数:
robotNum 传入机器人编号(1-4)
axis  轴号
tolerance  机器人轴最大超差 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetTolerance | 函数原型 | int NRC_GetTolerance(int axis, unsigned int& tolerance); | | --- | --- | | 功能描述 | 获取机器人轴超差。 | | 参数说明 | 输入参数:
axis  轴号
输出参数:
tolerance  轴超差存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Rbt_GetTolerance | 函数原型 | int NRC_Rbt_GetTolerance(int robotNum, int axis, unsigned int& tolerance); | | --- | --- | | 功能描述 | 获取机器人轴超差,多机版。 | | 参数说明 | 输入参数:
robotNum 传入机器人编号(1-4)
axis  轴号
输出参数:
tolerance  轴超差存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ShieldFollowError | 函数原型 | int NRC_ShieldFollowError(int axis, bool shield); | | --- | --- | | 功能描述 | 屏蔽机器人轴跟随误差。 | | 参数说明 | 输入参数:
axis  轴号
shield  屏蔽 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_robotRunCycle_Callback | 函数原型 | int NRC_robotRunCycle_Callback(void (*fun)()); | | --- | --- | | 功能描述 | 设置一个自定义的无参函数,调用该接口,将每个 EtherCAT 通讯周期(默认1ms)回调一次。 | | 参数说明 | 输入参数:
void (*fun)()  注册一个无返回值无参的函数,每个 EtherCAT 通讯周期调用一次该函数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 回调函数中不得含有任何耗时操作 | ### NRC_GetServoMode | 函数原型 | int NRC_GetServoMode(int *servoMode); | | --- | --- | | 功能描述 | 获取伺服运行模式。 | | 参数说明 | 输出参数:
servoMode 以数组形式返回每个伺服运行模式: | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | servoMode :以数组形式返回每个伺服运行模式:
* 0-模式不变;
*1-规划位置模式(PP);
*2-速度模式(VL);
*3-规划速度模式(PV);
*4-规划转矩模式(PT);
*5-保留;
*6-寻原点模式(HM);
*7-插补位置模式(IP),暂不支持;
*8-周期同步位置模式(CSP);
*9-周期同步速度模式(CSV);
*10-周期同步转矩模式(CST)。 | ### NRC_SetTargetVelocity | 函数原型 | int NRC_SetTargetVelocity(int *axisVel); | | --- | --- | | 功能描述 | 设置目标速度值。 | | 参数说明 | 输入参数:
axisVel  传入一个 double 数组设置速度值(注:数组的大小需要和当前机器人轴数一致) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetJogMoveCalculateNum | 函数原型 | int NRC_SetJogMoveCalculateNum(int num); | | --- | --- | | 功能描述 | 设置点动插补点位个数。 | | 参数说明 | 输入参数:
num  点位个数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetPlanningPosition | 函数原型 | int NRC_GetPlanningPosition(int axisSum, double *axisPosition); | | --- | --- | | 功能描述 | 获取规划队列的第一个点位。 | | 参数说明 | 输入参数:
axisSum  机器人总轴数
输出参数:
axisPosition  返回获取点位的结果,数组纬度是 axisSum | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetRobotSum | 函数原型 | int NRC_GetRobotSum(int &robotSum); | | --- | --- | | 功能描述 | 获取机器人数量。 | | 参数说明 | 输出参数:
robotSum 传入一个 int 变量,以引用的方式返回当前的机器人数量; | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_ShieldedTeachingPendant | 函数原型 | int NRC_ShieldedTeachingPendant(bool status); | | --- | --- | | 功能描述 | 调用该接口,将屏蔽示教器连接状态检测(需要在系统启动函数前调用)。 | | 参数说明 | 输入参数:
status 传入的状态 true:屏蔽和示教器的通讯 false:打开和示教器的通讯 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetControlCycle | 函数原型 | int NRC_GetControlCycle(); | | --- | --- | | 功能描述 | 获取控制器与伺服的通讯周期。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_EncoderZeroOffsetSync | 函数原型 | int NRC_EncoderZeroOffsetSync(int updateAxis,double offset); | | --- | --- | | 功能描述 | 设置外部轴零点偏移。 | | 参数说明 | 输入参数:
updateAxis  需要偏移的外部轴号,范围[1,5]
offset  偏移量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetEncoderPosition | 函数原型 | int NRC_GetEncoderPosition(int slaveNum); | | --- | --- | | 功能描述 | 获取编码器点位 。 | | 参数说明 | 输入参数:
slaveNum  轴号 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCustomFileTransfer | 函数原型 | void NRC_SetCustomFileTransfer(const NRC_FileParam & fileParamVector); | | --- | --- | | 功能描述 | 设置可导入导出的自定义配置文件。 | | 参数说明 | 输入参数:
fileParamVector 配置文件参数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | fileParamVector 示例:"global.json","config/global.json","1.0.0" | ### NRC_SetRobotMode | 函数原型 | int NRC_SetRobotMode(int mode); | | --- | --- | | 功能描述 | 设置机器人为多机模式。 | | 参数说明 | 输入参数:
mode 0-单机模式  1-多机模式 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_TcpCalculate | 函数原型 | int NRC_TcpCalculate(int robotNum, NRC_Position pos, const NRC_Position& deviation, NRC_COORD coord, NRC_Position& resultPos); | | --- | --- | | 功能描述 | 计算特定坐标系下,点位进行固定距离偏移后的位置。 | | 参数说明 | 输入参数:
robotNum  机器人编号1-4
pos  要进行偏移的点
coord  坐标系
输出参数:
deviation  偏移距离
resultPos 计算结果存储点位 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetStatusWord | 函数原型 | int NRC_GetStatusWord(int robotNum, int axis, signed short& value); | | --- | --- | | 功能描述 | 读取伺服状态字。 | | 参数说明 | 输入参数:
robotNum  传入机器人编号(1-4)
axis  轴号
输出参数:
value  状态值存储变量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCommunicationParam | 函数原型 | int NRC_SetCommunicationParam( const std::string& ip, int port, int robot, int craft, int type, int numberSystem, const std::string& frameHeader, const std::string& separator, const std::string& terminator); | | --- | --- | | 功能描述 | 调用该接口用于设置外部 TCP 通信的相关参数。 | | 参数说明 | 输入参数:
ip  IP 地址,指定外部通信的目标 `IP
`port  端口号,指定外部通信的目标端口
robot  机器人编号1-4
craft  工艺编号  1-9
type  0服务端  1客户端
numberSystem  0 十进制 1十六进制
frameHeader  帧头,用于标识通信数据的开始
separator  分隔符,用于分隔通信数据中的不同部分
terminator 终止符,用于标识通信数据的结束 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetCommunicationStatus | 函数原型 | int NRC_SetCommunicationStatus(bool status, int craft, int robot); | | --- | --- | | 功能描述 | 设置 TCP 通信的开关。 | | 参数说明 | 输入参数:
status  true 开启  false 关闭
craft 工艺编号  1-9
robot  机器人编号1-4 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_SetTcpMessageCallback | 函数原型 | int NRC_SetTcpMessageCallback(void (*callback)(const std::string& message)); | | --- | --- | | 功能描述 | 设置外部 TCP 通信收到消息的回调函数。 | | 参数说明 | 输入参数:
callback 回调函数指针
message 接收到的数据 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_CommSendMessage | 函数原型 | int NRC_CommSendMessage(const std::string& message, int craft, int robot); | | --- | --- | | 功能描述 | 调用该接口,将向控制器发送消息。 | | 参数说明 | 输入参数:
message  发送的数据
craft 工艺编号  1-9
robot 机器人编号1-4 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetModbusSlaveConnectStatus | 函数原型 | int NRC_GetModbusSlaveConnectStatus(bool& status); | | --- | --- | | 功能描述 | 获取 modbus 从站连接状态。 | | 参数说明 | 输出参数:
status  获取到的连接状态 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_GetModbusMasterConnectStatus | 函数原型 | int NRC_GetModbusMasterConnectStatus(int craft, bool& status); | | --- | --- | | 功能描述 | 获取 modbus 主站连接状态。 | | 参数说明 | 输入参数:
craft  工艺编号
输出参数:
status  获取到的连接状态 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | --- # 二次开发 API(作业文件,指令操作) > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/02.%E6%8E%A5%E5%8F%A3/02.%E4%BD%9C%E4%B8%9A%E6%96%87%E4%BB%B6-%E6%8C%87%E4%BB%A4%E6%93%8D%E4%BD%9C.html 本章节介绍作业文件管理、指令插入与运行队列控制的全部接口。 ## 函数分类索引 ### 作业文件管理 | 函数 | 说明 | |------|------| | NRC_CreateJobfile / NRC_OpenJobfile / NRC_DeleteJobfile | 新建/打开/删除作业文件 | | NRC_JudgeJobIsExist | 判断作业文件是否存在 | | NRC_GetJobfileLineSum | 获取作业文件总行数 | | NRC_JobfileEraseCmd | 删除作业文件中指定行的指令 | ### 作业文件运行控制 | 函数 | 说明 | |------|------| | NRC_StartRunJobfile | 开始/继续运行作业文件 | | NRC_PauseRunJobfile | 暂停运行作业文件 | | NRC_StopRunJobfile | 停止运行作业文件(从头开始) | | NRC_StopRunJobfileNotPoweroff | 停止运行(不下使能) | | NRC_StepRunJobfile | 单步运行一行指令 | | NRC_GetCurrentOrderRuns | 获取执行方向(顺序/倒序) | | NRC_GetDistanceToOldTrack | 获取距原轨迹停止点距离 | | NRC_GetCycleIndex / NRC_GetCycleCount / NRC_GetCycleTimeSec | 循环次数/时间查询 | | NRC_SetCycleIndex | 设置循环次数 | ### 局部后台程序 | 函数 | 说明 | |------|------| | NRC_CreatePthreadJobfile / NRC_OpenPthreadJobfile | 新建/打开后台程序 | | NRC_DeletePthreadJobfile / NRC_JudgePthreadJobIsExist | 删除/判断后台程序 | ### 无文件运行队列 | 函数 | 说明 | |------|------| | NRC_CreateNoFlieRunqueue | 创建无文件运行队列 | | NRC_InsertNoFlieRunqueue | 插入一组指令到队列 | | NRC_StartRunNoFlieRunqueue | 开始运行无文件队列 | | NRC_PauseRunNoFlieRunqueue | 暂停运行队列 | | NRC_StopRunNoFlieRunqueue | 停止运行队列 | | NRC_StopRunNoFlieRunqueueNotPoweroff | 停止(不下使能) | ### 追加运行模式 | 函数 | 说明 | |------|------| | NRC_OpenInstrAppendRunMode | 开启追加运行模式(自动上使能) | | NRC_CloseInstrAppendRunMode | 关闭追加运行模式(自动下使能) | | NRC_AppendRunInstr | 追加运行指令 | | NRC_PauseInstrAppendRun / NRC_PauseInstrAppendRunAsynchronous | 暂停(同步/异步) | | NRC_RestartInstrAppendRun | 继续运行 | | NRC_PauseInstrAppendedRunInBreakpoint / NRC_RestartInstrAppendRunInBreakpoint | 断点模式暂停/继续 | | NRC_StopInstrAppendRun | 停止并清空队列 | | NRC_StopInstrAppendRunNotPoweroff | 停止(不下使能) | | NRC_GetIsInstrAppendRunMode | 获取当前是否在追加模式 | | NRC_GetRestAppendInstrNum | 获取剩余指令数 | | NRC_GetCurrentInstrRestPosNum | 获取当前指令剩余点数 | ### 作业文件插入指令(按类型) **运动指令:** | 函数 | 说明 | |------|------| | NRC_JobfileInsertMOVJ / MOVL / MOVS / MOVC / IMOV | 关节/直线/圆弧/增量运动 | | NRC_JobfileInsertMOVJEXT / MOVLEXT / MOVCEXT | 带外部轴的运动指令 | | NRC_JobfileInsertPOSCALALL | 点位全改指令 | **IO 与时间指令:** | 函数 | 说明 | |------|------| | NRC_JobfileInsertDOUT | 数字输出 | | NRC_JobfileInsertTIMER | 延时 | | NRC_JobfileInsertWAIT | 等待条件 | **流程控制指令:** | 函数 | 说明 | |------|------| | NRC_JobfileInsertUNTIL / NRC_JobfileInsertENDUNTIL | 条件循环 | | NRC_JobfileInsertIF / NRC_JobfileInsertVarIF | 条件判断(端口/变量) | | NRC_JobfileInsertELSE | ELSE 分支 | | NRC_JobfileInsertENDIF | 条件结束 | | NRC_JobfileInsertWHILE / NRC_JobfileInsertVarWHILE | WHILE 循环 | | NRC_JobfileInsertENDWHILE | 循环结束 | **程序控制指令:** | 函数 | 说明 | |------|------| | NRC_JobfileInsertPAUSERUN | 暂停运行 | | NRC_JobfileInsertCONTINUERUN | 继续运行指定程序 | | NRC_JobfileInsertSTOPRUN | 停止运行 | | NRC_JobfileInsertRESTARTRUN | 重启运行 | | NRC_JobfileInsertPthreadStart / PthreadEnd | 启动/结束后台程序 | | NRC_JobfileInsertSETVAR | 设置变量 | | NRC_JobfileInsertOPCmd | 运算指令 | | NRC_JobfileInsertCMDNOTE | 备注 | **码垛指令:** | 函数 | 说明 | |------|------| | NRC_JobfileInsertPALON / PALOFF | 码垛开启/关闭 | | NRC_JobfileInsertPALGRIPPER / PALCLEAR | 抓手切换/清除 | | NRC_JobfileInsertPALENTER / PALSHIFT / PALREAL | 进入/偏移/放置 | **焊接指令:** | 函数 | 说明 | |------|------| | NRC_JobfileInsertARCON / ARCOFF | 焊接起弧/收弧 | | NRC_JobfileInsertTOFFSETON / TOFFSETOFF | 工具偏移开启/关闭 | **自定义:** | 函数 | 说明 | |------|------| | NRC_JobfileInsertCustomInstruction | 插入自定义指令 | ### 运行队列插入指令 对应作业文件插入指令,通过 `NRC_RunqueueInsert*` 系列函数将指令插入无文件运行队列,参数与作业文件版本基本一致(无需 `line` 参数)。 ### 状态查询 | 函数 | 说明 | |------|------| | NRC_GetProgramRunStatus | 获取程序运行状态(0-停止 1-暂停 2-运行) | | NRC_GetRobotRunStatus | 获取机器人运动状态 | | NRC_GetTeachBoxConnectStatus | 获取示教盒连接状态 | | NRC_GetOpenJobFileName | 获取当前打开的作业文件名 | | NRC_GetRunqueueCurrentRunLine | 获取队列当前运行行号 | | NRC_GetJobfileCurrentRunLine | 获取作业文件当前运行行号 | | NRC_GetCurrentInstrRestPosNum | 获取当前指令剩余点数 | ### 回调函数 | 函数 | 说明 | |------|------| | NRC_SetCompleteOneInstrCallBack | 设置指令完成回调(无参/带参两种重载) | ## 详细接口文档 | 函数 | 说明 | |------|------| | NRC_CreateJobfile | 新建作业文件。 | | NRC_OpenJobfile | 打开作业文件。 | | NRC_DeleteJobfile | 删除作业文件。 | | NRC_JudgeJobIsExist | 检测作业文件是否存在。 | | NRC_CreatePthreadJobfile | 新建局部后台程序。 | | NRC_OpenPthreadJobfile | 打开局部后台程序。 | | NRC_DeletePthreadJobfile | 删除局部后台程序。 | | NRC_JudgePthreadJobIsExist | 检测局部后台程序是否存在。 | | NRC_GetJobfileLineSum | 当前打开的作业文件的总行数。 | | NRC_StartRunJobfile | 开始/继续运行作业文件。 | | NRC_StepRunJobfile | 单步运行作业文件一行指令。 | | NRC_PauseRunJobfile | 暂停运行作业文件。 | | NRC_StopRunJobfile | 停止运行作业文件。 | | NRC_GetDistanceToOldTrack | 获取当前位置距离原插补轨迹停止点的距离。 | | NRC_StopRunJobfileNotPoweroff | 停止运行作业文件并且不下使能。 | | NRC_GetCurrentOrderRuns | 获取当前程序执行方向是顺序执行还是倒叙执行。 | | NRC_CreateNoFlieRunqueue | 创建一个无文件运行队列。 | | NRC_StartRunNoFlieRunqueue | 单步运行作业文件一行指令。 | | NRC_PauseRunNoFlieRunqueue | 暂停运行无文件运行队列。 | | NRC_StopRunNoFlieRunqueue | 停止运行无文件运行队列。 | | NRC_StopRunNoFlieRunqueueNotPoweroff | 运动队列停止运行并且不下使能。 | | NRC_JobfileEraseCmd | 删除作业文件指令。 | | NRC_InsertNoFlieRunqueue | 将一组指令数据插入到运行队列中。 | | NRC_OpenInstrAppendRunMode | 开启追加运行模式,添加运行队列即可直接响应运行。 | | NRC_CloseInstrAppendRunMode | 关闭追加运行模式。 | | NRC_AppendRunInstr | 追加运行模式下,添加运行队列。 | | NRC_PauseInstrAppendRun | 暂停追加运行。 | | NRC_PauseInstrAppendRunAsynchronous | 异步暂停追加运行。 | | NRC_RestartInstrAppendRun | 再启动追加运行。 | | NRC_PauseInstrAppendedRunInBreakpoint | 断点模式暂停追加运行。 | | NRC_RestartInstrAppendRunInBreakpoint | 断点模式重启追加运行。 | | NRC_StopInstrAppendRun | 停止追加运行。 | | NRC_StopInstrAppendRunNotPoweroff | 停止已追加的运行。 | | NRC_GetIsInstrAppendRunMode | 获取当前是否是追加运行模式。 | | NRC_GetRestAppendInstrNum | 获取追加运行当前剩余指令数目。 | | NRC_GetCurrentInstrRestPosNum | 获取当前运行指令剩余点数。 | | NRC_SetCompleteOneInstrCallBack | 设置执行完一条指令时的回调函数,当执行完一条指令时,将会调用此回调函数。 | | NRC_SetCompleteOneInstrCallBack | 设置执行完一条指令时的回调函数,当执行完一条指令时,将会调用此回调函数,该回调函数会将用户参数传入。 | | NRC_RunqueueInsertMOVJ | 运行队列插入 MOVJ 指令。 | | NRC_RunqueueInsertMOVL | 运行队列插入 MOVL 指令。 | | NRC_RunqueueInsertMOVS | 运行队列插入 MOVS 指令。 | | NRC_RunqueueInsertMOVC | 运行队列插入 MOVC 指令。 | | NRC_RunqueueInsertIMOV | 运行队列插入 IMOV 指令。 | | NRC_RunqueueInsertDOUT | 运行队列插入 DOUT 指令。 | | NRC_RunqueueInsertTIMER | 运行队列插入 TIMER 指令。 | | NRC_RunqueueInsertWAIT | 运行队列插入 WAIT 指令。 | | NRC_RunqueueInsertUNTIL | 运行队列插入 UNTIL 指令。 | | NRC_RunqueueInsertENDUNTIL | 运行队列插入 ENDUNTIL 指令。 | | NRC_RunqueueInsertIF | 运行队列插入 IF 指令。 | | NRC_RunqueueInsertWHILE | 运行队列插入 WHILE 指令。 | | NRC_RunqueueInsertELSE | 运行队列插入 ELSE 指令。 | | NRC_RunqueueInsertENDWHILE | 运行队列插入 ENDWHILE 指令。 | | NRC_RunqueueInsertENDIF | 运行队列插入 ENDIF 指令。 | | NRC_RunqueueInsertPALON | 运行队列插入 PALON 指令。 | | NRC_RunqueueInsertPALOFF | 运行队列插入 PALOFF 指令。 | | NRC_RunqueueInsertPALGRIPPER | 运行队列插入 PALGRIPPER 指令。 | | NRC_RunqueueInsertPALCLEAR | 运行队列插入 PALCLEAR 指令。 | | NRC_RunqueueInsertPALENTER | 运行队列插入 PALENTER 指令。 | | NRC_RunqueueInsertPALSHIFT | 运行队列插入 PALSHIFT 指令。 | | NRC_RunqueueInsertPALREAL | 运行队列插入 PALREAL 指令。 | | NRC_RunqueueInsertTOFFSETON | 运行队列插入 TOFFSETON 指令。 | | NRC_RunqueueInsertTOFFSETOFF | 运行队列插入 TOFFSETOFF 指令。 | | NRC_RunqueueInsertARCON | 运行队列插入 ARCON 指令。 | | NRC_RunqueueInsertARCOFF | 运行队列插入 ARCOFF 指令。 | | NRC_RunqueueInsertCustomInstruction | 运行队列插入 CustomInstruction 指令。 | | NRC_JobfileInsertMOVJ | 作业文件插入 MOVJ 指令。 | | NRC_JobfileInsertMOVL | 作业文件插入 MOVL 指令。 | | NRC_JobfileInsertMOVS | 作业文件插入 MOVS 指令。 | | NRC_JobfileInsertMOVC | 作业文件插入 MOVC 指令。 | | NRC_JobfileInsertIMOV | 作业文件插入 IMOV 指令。 | | NRC_JobfileInsertDOUT | 作业文件插入 DOUT 指令。 | | NRC_JobfileInsertTIMER | 作业文件插入 TIMER 指令。 | | NRC_JobfileInsertWAIT | 作业文件插入 WAIT 指令。 | | NRC_JobfileInsertUNTIL | 作业文件插入 UNTIL 指令。 | | NRC_JobfileInsertENDUNTIL | 作业文件插入 ENDUNTIL 指令。 | | NRC_JobfileInsertIF | 作业文件插入 IF 指令。 | | NRC_JobfileInsertVarIF | 作业文件插入带参数的 IF 指令。 | | NRC_JobfileInsertWHILE | 作业文件插入 WHILE 指令。 | | NRC_JobfileInsertVarWHILE | 作业文件插入带参数的 WHILE 指令。 | | NRC_JobfileInsertELSE | 作业文件插入 ELSE 指令。 | | NRC_JobfileInsertENDWHILE | 作业文件插入 ENDWHILE 指令。 | | NRC_JobfileInsertENDIF | 作业文件插入 ENDIF 指令。 | | NRC_JobfileInsertPAUSERUN | 作业文件插入 PAUSERUN 指令。 | | NRC_JobfileInsertCONTINUERUN | 作业文件插入 CONTINUERUN 指令。 | | NRC_JobfileInsertSTOPRUN | 作业文件插入 STOPRUN 指令。 | | NRC_JobfileInsertRESTARTRUN | 作业文件插入 RESTARTRUN 指令。 | | NRC_JobfileInsertCMDNOTE | 作业文件插入 CMDNOTE 指令。 | | NRC_JobfileInsertPthreadStart | 作业文件插入 PTHREAD_START 指令。 | | NRC_JobfileInsertPthreadEnd | 作业文件插入 PTHREAD_END 指令。 | | NRC_JobfileInsertSETVAR | 作业文件插入 SETVAR 指令。 | | NRC_JobfileInsertOPCmd | 作业文件插入 OPCmd 指令。 | | NRC_JobfileInsertPALON | 作业文件插入 PALON 指令。 | | NRC_JobfileInsertPALOFF | 作业文件插入 PALOFF 指令。 | | NRC_JobfileInsertPALGRIPPER | 作业文件插入 PALGRIPPER 指令。 | | NRC_JobfileInsertPALCLEAR | 作业文件插入 PALCLEAR 指令。 | | NRC_JobfileInsertPALENTER | 作业文件插入 PALENTER 指令。 | | NRC_JobfileInsertPALSHIFT | 作业文件插入 PALSHIFT 指令。 | | NRC_JobfileInsertPALREAL | 作业文件插入 PALREAL 指令。 | | NRC_JobfileInsertTOFFSETON | 作业文件插入 TOFFSETON 指令。 | | NRC_JobfileInsertTOFFSETOFF | 作业文件插入 TOFFSETOFF 指令。 | | NRC_JobfileInsertARCON | 作业文件插入 ARCON 指令。 | | NRC_JobfileInsertARCOFF | 作业文件插入 ARCOFF 指令。 | | NRC_JobfileInsertCustomInstruction | 作业文件插入 CustomInstruction 指令。 | | NRC_GetRunqueueCurrentRunLine | 获取当前运行队列运行的行号。 | | NRC_GetJobfileCurrentRunLine | 获取当前运行作业文件运行的行号。 | | NRC_GetCycleIndex | 获取当前作业文件要运行的总次数。 | | NRC_GetCycleCount | 获取当前作业文件已运行的次数。 | | NRC_GetCycleTimeSec | 获取当前作业文件已运行的时间。 | | NRC_SetCycleIndex | 设置当前作业文件要运行的总次数。 | | NRC_RunqueueInsertMOVJEXT | 运行队列插入 MOVJEXT 指令。 | | NRC_JobfileInsertMOVJEXT | 作业文件插入 MOVJEXT 指令。 | | NRC_RunqueueInsertMOVLEXT | 运行队列插入 MOVLEXT 指令。 | | NRC_JobfileInsertMOVLEXT | 作业文件插入 MOVLEXT 指令。 | | NRC_RunqueueInsertMOVCEXT | 运行队列插入 MOVCEXT 指令。 | | NRC_JobfileInsertMOVCEXT | 作业文件插入 MOVCEXT 指令。 | | NRC_JobfileInsertPOSCALALL | 作业文件插入点位全改指令。 | | NRC_RunqueueInsertPOSCALALL | 运行队列插入点位全改指令。 | ### NRC_CreateJobfile | 函数原型 | int NRC_CreateJobfile(std::string jobname); | | --- | --- | | 功能描述 | 新建作业文件。 | | 参数说明 | 输入参数:
jobname  要新建的作业文件名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_OpenJobfile | 函数原型 | int NRC_OpenJobfile(std::string jobname); | | --- | --- | | 功能描述 | 打开作业文件。 | | 参数说明 | 输入参数:
jobname  要打开的作业文件名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_DeleteJobfile | 函数原型 | int NRC_DeleteJobfile(std::string jobname); | | --- | --- | | 功能描述 | 删除作业文件。 | | 参数说明 | 输入参数:
jobname  要删除的作业文件名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_JudgeJobIsExist | 函数原型 | int NRC_JudgeJobIsExist(std::string jobname); | | --- | --- | | 功能描述 | 检测作业文件是否存在。 | | 参数说明 | 输入参数:
jobname  要检测的作业文件名称 | | 返回值 | 返回查询的作业文件是否存在
0 作业文件不存在
1 作业文件已存在 | | 备注说明 | 无 | ### NRC_CreatePthreadJobfile | 函数原型 | int NRC_CreatePthreadJobfile(std::string jobname); | | --- | --- | | 功能描述 | 新建局部后台程序。 | | 参数说明 | 输入参数:
jobname   要新建的局部后台程序名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 后台程序不能插入任何运动指令,只能进行逻辑操作 | ### NRC_OpenPthreadJobfile | 函数原型 | int NRC_OpenPthreadJobfile(std::string jobname); | | --- | --- | | 功能描述 | 打开局部后台程序。 | | 参数说明 | 输入参数:
jobname   要打开的局部后台程序名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_DeletePthreadJobfile | 函数原型 | int NRC_DeletePthreadJobfile(std::string jobname); | | --- | --- | | 功能描述 | 删除局部后台程序。 | | 参数说明 | 输入参数:
jobname   要删除的局部后台程序名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_JudgePthreadJobIsExist | 函数原型 | int NRC_JudgePthreadJobIsExist(std::string jobname); | | --- | --- | | 功能描述 | 检测局部后台程序是否存在。 | | 参数说明 | 输入参数:
jobname   要检测的局部后台程序名称 | | 返回值 | 返回查询的作业文件是否存在
0 局部后台程序不存在
1 局部后台程序已存在 | | 备注说明 | 无 | ### NRC_GetJobfileLineSum | 函数原型 | int NRC_GetJobfileLineSum(); | | --- | --- | | 功能描述 | 当前打开的作业文件的总行数。 | | 参数说明 | 无 | | 返回值 | 返回当前打开的作业文件的总行数 | | 备注说明 | 调用该函数前,请先调用
NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_StartRunJobfile | 函数原型 | int NRC_StartRunJobfile(const std::string &jobname); | | --- | --- | | 功能描述 | 开始/继续运行作业文件。 | | 参数说明 | 输入参数:
jobname 要开始运行的作业文件,继续运行时该参数无效 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 该函数仅在运行模式下有效!
成功调用该函数后,机器人将开始运动,请注意安全! | ### NRC_StepRunJobfile | 函数原型 | int NRC_StepRunJobfile(const std::string &jobname, int line); | | --- | --- | | 功能描述 | 单步运行作业文件一行指令。 | | 参数说明 | 输入参数:
jobname 要单步运行运行的作业文件,继续运行时该参数无效
line 要单步运行的指令行号,继续运行时该参数无效 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 该函数仅在运行模式下有效!
成功调用该函数后,机器人将开始运动,请注意安全! | ### NRC_PauseRunJobfile | 函数原型 | int NRC_PauseRunJobfile(); | | --- | --- | | 功能描述 | 暂停运行作业文件。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 暂停运行作业文件,调用 NRC_StartRunJobfile() 将继续运行 | ### NRC_StopRunJobfile | 函数原型 | int NRC_StopRunJobfile(); | | --- | --- | | 功能描述 | 停止运行作业文件。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 停止运行作业文件,执行后再调用 NRC_StartRunJobfile(std::string jobname) 将从头开始运行 | ### NRC_GetDistanceToOldTrack | 函数原型 | int NRC_GetDistanceToOldTrack(int robot, double &distance); | | --- | --- | | 功能描述 | 获取当前位置距离原插补轨迹停止点的距离。 | | 参数说明 | 输入参数:
robot 机器人编号
distance 停止点和当前点位的直线距离 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_StopRunJobfileNotPoweroff | 函数原型 | int NRC_StopRunJobfileNotPoweroff(); | | --- | --- | | 功能描述 | 停止运行作业文件并且不下使能。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 停止运行作业文件,并且不会下使能,执行后再调用 NRC_StartRunJobfile(std::string jobname) 将从头开始运行 | ### NRC_GetCurrentOrderRuns | 函数原型 | int NRC_GetCurrentOrderRuns(bool &order); | | --- | --- | | 功能描述 | 获取当前程序执行方向是顺序执行还是倒叙执行。 | | 参数说明 | 输出参数:
order 执行方向 true/false(顺序执行/倒叙执行) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_CreateNoFlieRunqueue | 函数原型 | int NRC_CreateNoFlieRunqueue(); | | --- | --- | | 功能描述 | 创建一个无文件运行队列。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 创建一个无文件运行队列后,调用插入指令函数后,调用开始运行无文件运行队列函数,即可进行一条或多条指令运动 | ### NRC_StartRunNoFlieRunqueue | 函数原型 | int NRC_StartRunNoFlieRunqueue(); | | --- | --- | | 功能描述 | 单步运行作业文件一行指令。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 开始运行后,若要添加新的运行指令,请在本次运行结束后重新重新创建一个无文件运行队列
成功调用该函数后,机器人将开始运动,请注意安全 | ### NRC_PauseRunNoFlieRunqueue | 函数原型 | int NRC_PauseRunNoFlieRunqueue(); | | --- | --- | | 功能描述 | 暂停运行无文件运行队列。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 暂停运行无文件运行队列,调用 NRC_StartRunNoFlieRunqueue() 将继续运行 | ### NRC_StopRunNoFlieRunqueue | 函数原型 | int NRC_StopRunNoFlieRunqueue(); | | --- | --- | | 功能描述 | 停止运行无文件运行队列。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 停止后,若要继续运行,请重新创建一个无文件运行队列 | ### NRC_StopRunNoFlieRunqueueNotPoweroff | 函数原型 | int NRC_StopRunNoFlieRunqueueNotPoweroff(); | | --- | --- | | 功能描述 | 运动队列停止运行无文件运行队列并且不下使能。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 停止后,若要继续运行,请重新创建一个无文件运行队列 | ### NRC_JobfileEraseCmd | 函数原型 | int NRC_JobfileEraseCmd(int line); | | --- | --- | | 功能描述 | 删除作业文件指令。 | | 参数说明 | 输入参数:
line 要删除的指令所在的行号,参数范围:0 < line <= NRC_GetJobfileLineSum() | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_InsertNoFlieRunqueue | 函数原型 | int NRC_InsertNoFlieRunqueue(std::vector\& instrVec); | | --- | --- | | 功能描述 | 将一组指令数据插入到运行队列中。 | | 参数说明 | 输入参数:
instrVec 要插入的一组指令数据 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 示例:
std::vector\ instrVec;
//可以不创建队列,会自动创建
instrVec.push_back(new NRC_InstrDataMOVJ(50, pos1, 5));
instrVec.push_back(new NRC_InstrDataMOVL(30, pos2, 2));
instrVec.push_back(new NRC_InstrDataMOVC(20, pos0, 3));
instrVec.push_back(new NRC_InstrDataMOVC(20, pos1, 3));
NRC_InsertNoFlieRunqueue(instrVec);
//可以分成多组分次插入,后面插入的会接在之前插入的后面
instrVec.clear();
instrVec.push_back(new NRC_InstrDataIMOV(40, dev1, 0));
instrVec.push_back(new NRC_InstrDataDOUT(5, 1));
instrVec.push_back(new NRC_InstrDataTIMER(3.3));
instrVec.push_back(new NRC_InstrDataWAIT(new NRC_ConditionJudge(NRC_ConditionJudge::INT_, 3, NRC_ConditionJudge::LESS, NRC_ConditionJudge::DOUBLE_, 5), 2.2));
instrVec.push_back(new NRC_InstrDataWAIT(new NRC_ConditionJudge(NRC_ConditionJudge::DIN_, 2, NRC_ConditionJudge::EQUAL_TO, NRC_ConditionJudge::CONST_, 1), 0));
instrVec.push_back(new NRC_InstrDataMOVJ(30, pos1, 1));
NRC_InsertNoFlieRunqueue(instrVec);
//开始执行队列
NRC_StartRunNoFlieRunqueue(); | ### NRC_OpenInstrAppendRunMode | 函数原型 | int NRC_OpenInstrAppendRunMode(); | | --- | --- | | 功能描述 | 开启追加运行模式,添加运行队列即可直接响应运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,机器人自动上使能,请注意安全
只有伺服在就绪状态下才可开启追加运行模式,即 NRC_GetServoStatus() == 1 时
在追加运行模式中,出现伺服报错、运行报错、解析报错,将自动退出追加运行模式,并下使能
在追加运行模式中,切换示教、运行模式,将会自动退出追加运行模式,并下使能 | ### NRC_CloseInstrAppendRunMode | 函数原型 | int NRC_CloseInstrAppendRunMode(); | | --- | --- | | 功能描述 | 关闭追加运行模式。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,机器人会自动下使能
只有在无运行队列或全部运行队列已运行完毕的情况下才可关闭追加运行模式,即 NRC_GetProgramRunStatus() == 0 时 | ### NRC_AppendRunInstr | 函数原型 | int NRC_AppendRunInstr(std::vector\& instrVec); | | --- | --- | | 功能描述 | 追加运行模式下,添加运行队列。 | | 参数说明 | 输入参数:
instrVec  要插入的一组指令数据 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 添加运行队列后,机器人将会立即执行加入的队列,请注意安全
添加的运行队列只能是机器人移动指令
示例:
//开启追加运行模式,机器人自动上使能
NRC_OpenInstrAppendRunMode();
std::vector\ instrVec;
instrVec.push_back(new NRC_InstrDataMOVJ(50, pos1, 5));
instrVec.push_back(new NRC_InstrDataMOVL(30, pos2, 2));
//添加队列后,机器人直接运行
NRC_AppendRunInstr(instrVec);
......
instrVec.clear();
instrVec.push_back(new NRC_InstrDataMOVC(20, pos0, 3));
instrVec.push_back(new NRC_InstrDataMOVC(20, pos1, 3));
//机器人运行完之前添加的队列后,会接上本次添加的队列
NRC_AppendRunInstr(instrVec);
......
NRC_PauseInstrAppendRun();//暂停运行
......
instrVec.clear();
instrVec.push_back(new NRC_InstrDataMOVJ(50, pos1, 5));
instrVec.push_back(new NRC_InstrDataMOVL(30, pos2, 2));
//暂停时添加的队列,调用再启动运行后,也可正常运行
NRC_AppendRunInstr(instrVec);
......
NRC_RestartInstrAppendRun();//再启动运行
......
//停止运行,机器人停止,并清空全部队列
NRC_StopInstrAppendRun();
//关闭追加运行模式,机器人自动下使能
NRC_CloseInstrAppendRunMode(); | ### NRC_PauseInstrAppendRun | 函数原型 | NRC_PauseInstrAppendRun();NRC_PauseInstrAppendRun(); | | --- | --- | | 功能描述 | 暂停追加运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,机器人将暂停运行,该函数会在机器人停止后或调用500毫秒后退出,调用 NRC_RestartInstrAppendRun() 可继续运行
暂停时添加的运行队列,不会立刻运行,而是放入缓存队列中,调用再启动后,才会运行该队列 | ### NRC_PauseInstrAppendRunAsynchronous | 函数原型 | int NRC_PauseInstrAppendRunAsynchronous(); | | --- | --- | | 功能描述 | 异步暂停追加运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,机器人将暂停运行,该函数会直接退出,调用 NRC_RestartInstrAppendRun() 可继续运行
暂停时添加的运行队列,不会立刻运行,而是放入缓存队列中,调用再启动后,才会运行该队列 | ### NRC_RestartInstrAppendRun | 函数原型 | int NRC_RestartInstrAppendRun(); | | --- | --- | | 功能描述 | 再启动追加运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 在机器人将暂停时,调用该函数可使机器人继续运行 | ### NRC_PauseInstrAppendedRunInBreakpoint | 函数原型 | int NRC_PauseInstrAppendedRunInBreakpoint(); | | --- | --- | | 功能描述 | 断点模式暂停追加运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,机器人将暂停运行,并记录当前断点处运行状态,下电,该函数会在机器人停止后或调用500毫秒后退出,调用 NRC_RestartInstrAppendRunInBreakpoint() 可继续运行
暂停时添加的运行队列,不会立刻运行,而是放入缓存队列中,调用再启动后,才会运行该队列 | ### NRC_RestartInstrAppendRunInBreakpoint | 函数原型 | int NRC_RestartInstrAppendRunInBreakpoint(); | | --- | --- | | 功能描述 | 断点模式重启追加运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 在机器人断点停止时,调用该函数可使机器人继续运行 | ### NRC_StopInstrAppendRun | 函数原型 | int NRC_StopInstrAppendRun(); | | --- | --- | | 功能描述 | 停止追加运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,机器人将停止运行,并清空全部运行队列,退出追加模式 | ### NRC_StopInstrAppendRunNotPoweroff | 函数原型 | int NRC_StopInstrAppendRunNotPoweroff(); | | --- | --- | | 功能描述 | 停止已追加的运行。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 成功调用该函数后,机器人将停止运行,并清空全部运行队列,仍在追加模式,不下电
需要调用 NRC_RestartInstrAppendRun() 才能继续运行新追加队列 | ### NRC_GetIsInstrAppendRunMode | 函数原型 | int NRC_GetIsInstrAppendRunMode(); | | --- | --- | | 功能描述 | 获取当前是否是追加运行模式。 | | 参数说明 | 无 | | 返回值 | 当前是否是追加运行模式 0-当前不是追加运行模式  1-当前处于追加运行模式 | | 备注说明 | 无 | ### NRC_GetRestAppendInstrNum | 函数原型 | int NRC_GetRestAppendInstrNum(); | | --- | --- | | 功能描述 | 获取追加运行当前剩余指令数目。 | | 参数说明 | 无 | | 返回值 | 当前剩余指令数目 | | 备注说明 | 对于 MOVC 指令,两条为一对,在插入指令时,插入了两条,但在运行时,是记作一条的 | ### NRC_GetCurrentInstrRestPosNum | 函数原型 | int NRC_GetCurrentInstrRestPosNum(); | | --- | --- | | 功能描述 | 获取当前运行指令剩余点数。 | | 参数说明 | 无 | | 返回值 | 当前运行指令剩余点数。
当该指令未计算计算时,返回为-1。 | | 备注说明 | 无 | ### NRC_SetCompleteOneInstrCallBack | 函数原型 | int NRC_SetCompleteOneInstrCallBack(void (*fun)()); | | --- | --- | | 功能描述 | 设置执行完一条指令时的回调函数,当执行完一条指令时,将会调用此回调函数。 | | 参数说明 | 输入参数:
fun 回调函数的函数指针 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 该函数与 NRC_SetCompleteOneInstrCallBack(void (*fun)(NRC_InstrDataBase::NRC_UserParam)) ,仅最后一次调用的函数生效
该回调函数不可含有耗时操作,否则将对程序的运行产生严重影响 | ### NRC_SetCompleteOneInstrCallBack | 函数原型 | int NRC_SetCompleteOneInstrCallBack(void (*fun)(NRC_InstrDataBase::NRC_UserParam)); | | --- | --- | | 功能描述 | 设置执行完一条指令时的回调函数,当执行完一条指令时,将会调用此回调函数,该回调函数会将用户参数传入。 | | 参数说明 | 输入参数:
fun 回调函数的函数指针 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 该函数与 NRC_SetCompleteOneInstrCallBack(void (*fun)(NRC_InstrDataBase::NRC_UserParam)) ,仅最后一次调用的函数生效
该回调函数不可含有耗时操作,否则将对程序的运行产生严重影响 | ### NRC_RunqueueInsertMOVJ | 函数原型 | int NRC_RunqueueInsertMOVJ(int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 MOVJ 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertMOVL | 函数原型 | int NRC_RunqueueInsertMOVL(int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 MOVL 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertMOVS | 函数原型 | int NRC_RunqueueInsertMOVS(int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 MOVS 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertMOVC | 函数原型 | int NRC_RunqueueInsertMOVC(int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 MOVC 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertIMOV | 函数原型 | int NRC_RunqueueInsertIMOV(int vel, int acc, int dec, const NRC_Position& deviation, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 IMOV 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertDOUT | 函数原型 | int NRC_RunqueueInsertDOUT(int port, int value, double time_sec); | | --- | --- | | 功能描述 | 运行队列插入 DOUT 指令。 | | 参数说明 | 输入参数:
port 要输出的数字输出端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平
timeSec 端口输出的状态持续时间 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertTIMER | 函数原型 | int NRC_RunqueueInsertTIMER(double timeSec); | | --- | --- | | 功能描述 | 运行队列插入 TIMER 指令。 | | 参数说明 | 输入参数:
timeSec 要延时的时间,单位为秒,参数范围:timeSec > 0 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertWAIT | 函数原型 | int NRC_RunqueueInsertWAIT( int port, int value, double timeoutSec, bool now = false); | | --- | --- | | 功能描述 | 运行队列插入 WAIT 指令。 | | 参数说明 | 输入参数:
port 要输出的数字输出端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平
timeoutSec 超时时间,单位为秒,参数范围:timeSec >= 0
now  PL 是否连续  true 连续  false 不连续 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertUNTIL | 函数原型 | int NRC_RunqueueInsertUNTIL( int port, int value); | | --- | --- | | 功能描述 | 运行队列插入 UNTIL 指令。 | | 参数说明 | 输入参数:
port  要检测的数字输入端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertENDUNTIL | 函数原型 | int NRC_RunqueueInsertENDUNTIL(); | | --- | --- | | 功能描述 | 运行队列插入 ENDUNTIL 指令。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertUNTIL( int port, int value) 配合使用 | ### NRC_RunqueueInsertIF | 函数原型 | int NRC_RunqueueInsertIF( int port, int value); | | --- | --- | | 功能描述 | 运行队列插入 IF 指令。 | | 参数说明 | 输入参数:
port  要检测的数字输入端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertENDIF() 配合使用 | ### NRC_RunqueueInsertWHILE | 函数原型 | int NRC_RunqueueInsertWHILE(); | | --- | --- | | 功能描述 | 运行队列插入 WHILE 指令。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertENDWHILE()配合使用 | ### NRC_RunqueueInsertELSE | 函数原型 | int NRC_RunqueueInsertELSE(); | | --- | --- | | 功能描述 | 运行队列插入 ELSE 指令。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertIF( int port, int value) , NRC_RunqueueInsertENDIF() 配合使用 | ### NRC_RunqueueInsertENDWHILE | 函数原型 | int NRC_RunqueueInsertENDWHILE(); | | --- | --- | | 功能描述 | 运行队列插入 ENDWHILE 指令。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertWHILE( int port, int value) 配合使用 | ### NRC_RunqueueInsertENDIF | 函数原型 | int NRC_RunqueueInsertENDIF(); | | --- | --- | | 功能描述 | 运行队列插入 ENDIF 指令。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertIF( int port, int value) 配合使用 | ### NRC_RunqueueInsertPALON | 函数原型 | int NRC_RunqueueInsertPALON(int id, int type, int var1=0, int var2=0, int var3=0); | | --- | --- | | 功能描述 | 运行队列插入 PALON 指令。 | | 参数说明 | 输入参数:
id   码垛工艺的工艺号,参数范围:1 <= id <= 99
type 码垛类型  0-码垛  1-卸垛
var1 存放当前已码工件总数,0表示不存放,1-100表示变量 GI001-GI100,参数范围:0 <= var1 <= 100
var2 存放当前已码层数,0表示不存放,1-100表示变量 GI001-GI100,参数范围:0 <= var1 <= 100
var3 存放当前层已码工件数,0表示不存放,1-100表示变量 GI001-GI100,参数范围:0 <= var1 <= 100 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertPALOFF(int id, int var) 配合使用 | ### NRC_RunqueueInsertPALOFF | 函数原型 | int NRC_RunqueueInsertPALOFF(int id, int var=0); | | --- | --- | | 功能描述 | 运行队列插入 PALOFF 指令。 | | 参数说明 | 输入参数:
id   码垛工艺的工艺号,参数范围:1 <= id <= 99
var  存放码垛是否结束判断,0表示不存放,1-100表示变量 GB001-GB100,参数范围:0 <= var <= 100 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertPALON(int id, int type, int var1, int var2, int var3) 配合使用 | ### NRC_RunqueueInsertPALGRIPPER | 函数原型 | int NRC_RunqueueInsertPALGRIPPER(int id, int tool); | | --- | --- | | 功能描述 | 运行队列插入 PALGRIPPER 指令。 | | 参数说明 | 输入参数:
id   码垛工艺的工艺号,参数范围:1 <= id <= 99
tool  要更换的抓手编号,参数范围:1 <= id <= 4 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertPALCLEAR | 函数原型 | int NRC_RunqueueInsertPALCLEAR(int id); | | --- | --- | | 功能描述 | 运行队列插入 PALCLEAR 指令。 | | 参数说明 | 输入参数:
id   码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertPALENTER | 函数原型 | int NRC_RunqueueInsertPALENTER(int id, int moveType, int vel, int acc, int dec, int pl); | | --- | --- | | 功能描述 | 运行队列插入 PALENTER 指令。 | | 参数说明 | 输入参数:
id   码垛工艺的工艺号,参数范围:1 <= id <= 99
moveType  该条指令所使用的插补方式 1-关节插补 2-直线插补 3-圆弧插补
vel  机器人的运行速度,插补方式为关节时  为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时  为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1
acc  机器人运行加速度,参数范围:0 < vel <= 100,插补方式为关节时  为机器人各关节最大加速度的百分比,插补方式为直线或圆弧时  为机器人笛卡尔最大加速度的百分比
dec  机器人运行减速度,参数范围:0 < vel <= 100,插补方式为关节时  为机器人各关节最大减速度的百分比,插补方式为直线或圆弧时  为机器人笛卡尔最大减速度的百分比
pl   平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertPALSHIFT | 函数原型 | int NRC_RunqueueInsertPALSHIFT(int id, int moveType, int vel, int acc, int dec, int pl); | | --- | --- | | 功能描述 | 运行队列插入 PALSHIFT 指令。 | | 参数说明 | 输入参数:
id   码垛工艺的工艺号,参数范围:1 <= id <= 99
moveType  该条指令所使用的插补方式 1-关节插补 2-直线插补 3-圆弧插补
vel  机器人的运行速度,插补方式为关节时  为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时  为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1
acc  机器人运行加速度,参数范围:0 < vel <= 100,插补方式为关节时  为机器人各关节最大加速度的百分比,插补方式为直线或圆弧时  为机器人笛卡尔最大加速度的百分比
dec  机器人运行减速度,参数范围:0 < vel <= 100,插补方式为关节时  为机器人各关节最大减速度的百分比,插补方式为直线或圆弧时  为机器人笛卡尔最大减速度的百分比
pl   平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertPALREAL | 函数原型 | int NRC_RunqueueInsertPALREAL(int id, int moveType, int vel, int acc, int dec, int pl); | | --- | --- | | 功能描述 | 运行队列插入 PALREAL 指令。 | | 参数说明 | 输入参数:
id   码垛工艺的工艺号,参数范围:1 <= id <= 99
moveType  该条指令所使用的插补方式 1-关节插补 2-直线插补 3-圆弧插补
vel  机器人的运行速度,插补方式为关节时  为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时  为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1
acc  机器人运行加速度,参数范围:0 < vel <= 100,插补方式为关节时  为机器人各关节最大加速度的百分比,插补方式为直线或圆弧时  为机器人笛卡尔最大加速度的百分比
dec  机器人运行减速度,参数范围:0 < vel <= 100,插补方式为关节时  为机器人各关节最大减速度的百分比,插补方式为直线或圆弧时  为机器人笛卡尔最大减速度的百分比
pl   平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_RunqueueInsertTOFFSETON | 函数原型 | int NRC_RunqueueInsertTOFFSETON(const NRC_Position& data); | | --- | --- | | 功能描述 | 运行队列插入 TOFFSETON 指令。 | | 参数说明 | 输入参数:
data 偏移量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertTOFFSETOFF() 配合使用 | ### NRC_RunqueueInsertTOFFSETOFF | 函数原型 | int NRC_RunqueueInsertTOFFSETOFF(); | | --- | --- | | 功能描述 | 运行队列插入 TOFFSETOFF 指令。 | | 参数说明 | 无 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertTOFFSETON(const NRC_Position& data) 配合使用 | ### NRC_RunqueueInsertARCON | 函数原型 | int NRC_RunqueueInsertARCON(int id); | | --- | --- | | 功能描述 | 运行队列插入 ARCON 指令。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertARCOFF(int id) 配合使用 | ### NRC_RunqueueInsertARCOFF | 函数原型 | int NRC_RunqueueInsertARCOFF(int id); | | --- | --- | | 功能描述 | 运行队列插入 ARCOFF 指令。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列
需要和 NRC_RunqueueInsertARCON(int id) 配合使用 | ### NRC_RunqueueInsertCustomInstruction | 函数原型 | int NRC_RunqueueInsertCustomInstruction(int id, const std::string& cmd_param = ""); | | --- | --- | | 功能描述 | 运行队列插入 CustomInstruction 指令。 | | 参数说明 | 输入参数:
id  自定义指令的 ID
cmd_param  自定义指令的标识 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_JobfileInsertMOVJ | 函数原型 | int NRC_JobfileInsertMOVJ(int line, int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 MOVJ 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertMOVL | 函数原型 | int NRC_JobfileInsertMOVL(int line, int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 MOVL 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertMOVS | 函数原型 | int NRC_JobfileInsertMOVS(int line, int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 MOVS 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertMOVC | 函数原型 | int NRC_JobfileInsertMOVC(int line, int vel, int acc, int dec, const NRC_Position& target, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 MOVC 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertIMOV | 函数原型 | int NRC_JobfileInsertIMOV(int line, int vel, int acc, int dec, const NRC_Position& deviation, int pl=0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 IMOV 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5
tm 提前执行时间,本条指令运行结束前 tm 秒开始执行下一条指令 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
deviation.coord 为 NRC_ACS 时,该指令将使用关节插补方式,deviation.coord 为其他值时,使用直线插补方式 | ### NRC_JobfileInsertDOUT | 函数原型 | int NRC_JobfileInsertDOUT(int line, int port, int value, double time_sec); | | --- | --- | | 功能描述 | 作业文件插入 DOUT 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
port 要输出的数字输出端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平
time_sec 端口输出的状态持续时间 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertTIMER | 函数原型 | int NRC_JobfileInsertTIMER(int line, double timeSec); | | --- | --- | | 功能描述 | 作业文件插入 TIMER 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
timeSec 要延时的时间,单位为秒,参数范围:timeSec > 0 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertWAIT | 函数原型 | int NRC_JobfileInsertWAIT(int line,  int port, int value, double timeoutSec, bool now = false); | | --- | --- | | 功能描述 | 作业文件插入 WAIT 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
port 要输出的数字输出端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平
timeoutSec 超时时间,单位为秒,参数范围:timeSec >= 0
如果等待 timeoutSec 时间仍未满足要求,将不再继续等待,本条指令执行结束,值为0时,将无限时间等待,直到条件成立
now  PL 是否连续 true 连续  false 不连续 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertUNTIL | 函数原型 | int NRC_JobfileInsertUNTIL(int line,  int port, int value); | | --- | --- | | 功能描述 | 作业文件插入 UNTIL 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
port 要输出的数字输出端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertENDUNTIL(int line) 配合使用 | ### NRC_JobfileInsertENDUNTIL | 函数原型 | int NRC_JobfileInsertENDUNTIL(int line); | | --- | --- | | 功能描述 | 作业文件插入 ENDUNTIL 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertIF | 函数原型 | int NRC_JobfileInsertIF(int line,  int port, int value); | | --- | --- | | 功能描述 | 作业文件插入 IF 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
port 要输出的数字输出端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertVarIF | 函数原型 | int NRC_JobfileInsertVarIF(int line, const std::string &varName, NRC_JUDGE type, double value); | | --- | --- | | 功能描述 | 作业文件插入带参数的 IF 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
varName 要比较的参数,例如 “GI001”
type  比较的方法
value  要比较的大小 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertWHILE | 函数原型 | int NRC_JobfileInsertWHILE(int line,  int port, int value); | | --- | --- | | 功能描述 | 作业文件插入 WHILE 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
port 要输出的数字输出端口号,参数范围:port > 0
value 端口输出的状态 0-输出低电平 1-输出高电平 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertENDWHILE(int line) 配合使用! | ### NRC_JobfileInsertVarWHILE | 函数原型 | int NRC_JobfileInsertVarWHILE(int line, const std::string &varName, NRC_JUDGE type, double value); | | --- | --- | | 功能描述 | 作业文件插入带参数的 WHILE 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
varName  要比较的参数,例如 “GI001”
type  比较的方法
value  要比较的大小 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertENDWHILE(int line) 配合使用! | ### NRC_JobfileInsertELSE | 函数原型 | int NRC_JobfileInsertELSE(int line); | | --- | --- | | 功能描述 | 作业文件插入 ELSE 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertIF(int line,  int port, int value), NRC_JobfileInsertENDIF(int line) 配合使用 | ### NRC_JobfileInsertENDWHILE | 函数原型 | int NRC_JobfileInsertENDWHILE(int line); | | --- | --- | | 功能描述 | 作业文件插入 ENDWHILE 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertWHILE(int line,  int port, int value) 配合使用! | ### NRC_JobfileInsertENDIF | 函数原型 | int NRC_JobfileInsertENDIF(int line); | | --- | --- | | 功能描述 | 作业文件插入 ENDIF 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertIF(int line,  int port, int value) 配合使用 | ### NRC_JobfileInsertPAUSERUN | 函数原型 | int NRC_JobfileInsertPAUSERUN(int line); | | --- | --- | | 功能描述 | 作业文件插入 PAUSERUN 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertIF(int line,  int port, int value) 配合使用 | ### NRC_JobfileInsertCONTINUERUN | 函数原型 | int NRC_JobfileInsertCONTINUERUN(int line,int programtype,const std::string& jobName); | | --- | --- | | 功能描述 | 作业文件插入 CONTINUERUN 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
programtype  程序类型:1-主程序  2-后台程序
jobName 程序名 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertSTOPRUN | 函数原型 | int NRC_JobfileInsertSTOPRUN(int line); | | --- | --- | | 功能描述 | 作业文件插入 STOPRUN 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertIF(int line,  int port, int value) 配合使用 | ### NRC_JobfileInsertRESTARTRUN | 函数原型 | int NRC_JobfileInsertRESTARTRUN(int line); | | --- | --- | | 功能描述 | 作业文件插入 RESTARTRUN 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertIF(int line,  int port, int value) 配合使用 | ### NRC_JobfileInsertCMDNOTE | 函数原型 | int NRC_JobfileInsertCMDNOTE(int line,  const std::string note); | | --- | --- | | 功能描述 | 作业文件插入 CMDNOTE 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
note 备注内容 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPthreadStart | 函数原型 | int NRC_JobfileInsertPthreadStart(int line,  const std::string &jobName); | | --- | --- | | 功能描述 | 作业文件插入 PTHREAD_START 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
jobName 要开启的局部后台程序名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPthreadEnd | 函数原型 | int NRC_JobfileInsertPthreadEnd(int line,  const std::string &jobName); | | --- | --- | | 功能描述 | 作业文件插入 PTHREAD_END 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
jobName 要结束的局部后台程序名称 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertSETVAR | 函数原型 | int NRC_JobfileInsertSETVAR(int line, std::string varName, double varValue); | | --- | --- | | 功能描述 | 作业文件插入 SETVAR 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
varName 要写入的变量名,如“GI001”,“B099”
varValue 要写入的值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertOPCmd | 函数原型 | int NRC_JobfileInsertOPCmd(int line, const std::string &varName, NRC_OPREATION type, double value); | | --- | --- | | 功能描述 | 作业文件插入 OPCmd 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
varName 运算参数
type 运算类型
value 运算值 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPALON | 函数原型 | int NRC_JobfileInsertPALON(int line, int id, int type, int var1=0, int var2=0, int var3=0); | | --- | --- | | 功能描述 | 作业文件插入 PALON 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  备注内容
type 码垛类型 0-码垛 1-卸垛
var1存放当前已码工件总数,0表示不存放,1-100表示变量 GI001-GI100,参数范围:0 <= var1 <= 100
var2存放当前已码层数,0表示不存放,1-100表示变量 GI001-GI100,参数范围:0 <= var2 <= 100
var3存放当前层已码工件数,0表示不存放,1-100表示变量 GI001-GI100,参数范围:0 <= var3 <= 100 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertPALOFF(int line, int id, int var) 配合使用 | ### NRC_JobfileInsertPALOFF | 函数原型 | int NRC_JobfileInsertPALOFF(int line, int id, int var=0); | | --- | --- | | 功能描述 | 作业文件插入 PALOFF 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
var 存放码垛是否结束判断,0表示不存放,1-100表示变量 GB001-GB100,参数范围:0 <= var <= 100 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertPALON(int line, int id, int type, int var1, int var2, int var3) 配合使用 | ### NRC_JobfileInsertPALGRIPPER | 函数原型 | int NRC_JobfileInsertPALGRIPPER(int line, int id, int tool); | | --- | --- | | 功能描述 | 作业文件插入 PALGRIPPER 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
tool 要更换的抓手编号,参数范围:1 <= id <= 4 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPALCLEAR | 函数原型 | int NRC_JobfileInsertPALCLEAR(int line, int id); | | --- | --- | | 功能描述 | 作业文件插入 PALCLEAR 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPALENTER | 函数原型 | int NRC_JobfileInsertPALENTER(int line, int id, int moveType, int vel, int acc, int dec, int pl); | | --- | --- | | 功能描述 | 作业文件插入 PALENTER 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
moveType 该条指令所使用的插补方式 1-关节插补 2-直线插补 3-圆弧插补
vel 机器人的运行速度:
插补方式为关节时  为机器人最大速度的百分比,参数范围:0 < vel <= 100
插补方式为直线或圆弧时  为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1
acc 机器人运行加速度,参数范围:0 < vel <= 100
dec 机器人运行减速度,参数范围:0 < vel <= 100
pl  平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPALSHIFT | 函数原型 | int NRC_JobfileInsertPALSHIFT(int line, int id, int moveType, int vel, int acc, int dec, int pl); | | --- | --- | | 功能描述 | 作业文件插入 PALSHIFT 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
moveType 该条指令所使用的插补方式 1-关节插补 2-直线插补 3-圆弧插补
vel 机器人的运行速度:
插补方式为关节时  为机器人最大速度的百分比,参数范围:0 < vel <= 100
插补方式为直线或圆弧时  为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1
acc 机器人运行加速度,参数范围:0 < vel <= 100
dec 机器人运行减速度,参数范围:0 < vel <= 100
pl  平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPALREAL | 函数原型 | int NRC_JobfileInsertPALREAL(int line, int id, int moveType, int vel, int acc, int dec, int pl); | | --- | --- | | 功能描述 | 作业文件插入 PALREAL 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
moveType 该条指令所使用的插补方式 1-关节插补 2-直线插补 3-圆弧插补
vel 机器人的运行速度:
插补方式为关节时  为机器人最大速度的百分比,参数范围:0 < vel <= 100
插补方式为直线或圆弧时  为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1
acc 机器人运行加速度,参数范围:0 < vel <= 100
dec 机器人运行减速度,参数范围:0 < vel <= 100
pl  平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertTOFFSETON | 函数原型 | int NRC_JobfileInsertTOFFSETON(int line, const NRC_Position& data); | | --- | --- | | 功能描述 | 作业文件插入 TOFFSETON 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
data 偏移量 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertTOFFSETOFF(int line) 配合使用 | ### NRC_JobfileInsertTOFFSETOFF | 函数原型 | int NRC_JobfileInsertTOFFSETOFF(int line); | | --- | --- | | 功能描述 | 作业文件插入 TOFFSETOFF 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1) | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertTOFFSETON(int line, const NRC_Position& data) 配合使用 | ### NRC_JobfileInsertARCON | 函数原型 | int NRC_JobfileInsertARCON(int line, int id); | | --- | --- | | 功能描述 | 作业文件插入 ARCON 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertARCOFF(int line, int id) 配合使用 | ### NRC_JobfileInsertARCOFF | 函数原型 | int NRC_JobfileInsertARCOFF(int line, int id); | | --- | --- | | 功能描述 | 作业文件插入 ARCOFF 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id  码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件
需要和 NRC_JobfileInsertARCON(int line, int id) 配合使用 | ### NRC_JobfileInsertCustomInstruction | 函数原型 | int NRC_JobfileInsertCustomInstruction(int line, int id, const std::string& cmdParam = ""); | | --- | --- | | 功能描述 | 作业文件插入 CustomInstruction 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
id 自定义指令的 ID
cmd_param  自定义指令的标识 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_GetRunqueueCurrentRunLine | 函数原型 | int NRC_GetRunqueueCurrentRunLine(); | | --- | --- | | 功能描述 | 获取当前运行队列运行的行号。 | | 参数说明 | 无 | | 返回值 | 返回当前运行队列运行的行号 | | 备注说明 | 无 | ### NRC_GetJobfileCurrentRunLine | 函数原型 | int NRC_GetJobfileCurrentRunLine(); | | --- | --- | | 功能描述 | 获取当前运行作业文件运行的行号。 | | 参数说明 | 无 | | 返回值 | 返回当前运行作业文件运行的行号 | | 备注说明 | 无 | ### NRC_GetCycleIndex | 函数原型 | int NRC_GetCycleIndex(); | | --- | --- | | 功能描述 | 获取当前作业文件要运行的总次数。 | | 参数说明 | 无 | | 返回值 | 返回当前作业文件要运行的总次数 | | 备注说明 | 无 | ### NRC_GetCycleCount | 函数原型 | int NRC_GetCycleCount(); | | --- | --- | | 功能描述 | 获取当前作业文件已运行的次数。 | | 参数说明 | 无 | | 返回值 | 返回当前作业文件已运行的次数 | | 备注说明 | 无 | ### NRC_GetCycleTimeSec | 函数原型 | int NRC_GetCycleTimeSec(); | | --- | --- | | 功能描述 | 获取当前作业文件已运行的时间。 | | 参数说明 | 无 | | 返回值 | 返回当前作业文件已运行的时间 | | 备注说明 | 无 | ### NRC_SetCycleIndex | 函数原型 | int NRC_SetCycleIndex(int index); | | --- | --- | | 功能描述 | 设置当前作业文件要运行的总次数。 | | 参数说明 | 输出参数:
index  当前作业文件要运行的总次数,设置为0时循环运行,参数范围:index >= 0 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_RunqueueInsertMOVJEXT | 函数原型 | int NRC_RunqueueInsertMOVJEXT(int vel, int acc, int dec, const NRC_Position& target,const NRC_SyncPosition& targetSync, int pl = 0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 MOVJEXT 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置,详见 NRC_Position
targetSync 外部轴运动目标位置,详见 NRC_SyncPosition
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_JobfileInsertMOVJEXT | 函数原型 | int NRC_JobfileInsertMOVJEXT(int line, int vel, int acc, int dec, const NRC_Position& target,const NRC_SyncPosition& targetSync, int pl = 0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 MOVJEXT 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置,详见 NRC_Position
targetSync 外部轴运动目标位置,详见 NRC_SyncPosition
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_RunqueueInsertMOVLEXT | 函数原型 | int NRC_RunqueueInsertMOVLEXT(int vel, int acc, int dec, const NRC_Position& target,const NRC_SyncPosition& targetSync, int pl = 0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 MOVLEXT 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置,详见 NRC_Position
targetSync 外部轴运动目标位置,详见 NRC_SyncPosition
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_JobfileInsertMOVLEXT | 函数原型 | int NRC_JobfileInsertMOVLEXT(int line, int vel, int acc, int dec, const NRC_Position& target,const NRC_SyncPosition& targetSync, int pl = 0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 MOVLEXT 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置,详见 NRC_Position
targetSync 外部轴运动目标位置,详见 NRC_SyncPosition
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_RunqueueInsertMOVCEXT | 函数原型 | int NRC_RunqueueInsertMOVCEXT(int vel, int acc, int dec, const NRC_Position& target,const NRC_SyncPosition& targetSync, int pl = 0,int tm = 0); | | --- | --- | | 功能描述 | 运行队列插入 MOVCEXT 指令。 | | 参数说明 | 输入参数:
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置,详见 NRC_Position
targetSync 外部轴运动目标位置,详见 NRC_SyncPosition
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateNoFlieRunqueue() 创建一个无文件运行队列 | ### NRC_JobfileInsertMOVCEXT | 函数原型 | int NRC_JobfileInsertMOVCEXT(int line, int vel, int acc, int dec, const NRC_Position& target,const NRC_SyncPosition& targetSync, int pl = 0,int tm = 0); | | --- | --- | | 功能描述 | 作业文件插入 MOVCEXT 指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100
acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100
dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100
target 机器人运动目标位置,详见 NRC_Position
targetSync 外部轴运动目标位置,详见 NRC_SyncPosition
pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 调用该函数前,请先调用 NRC_CreateJobfile(std::string jobname) 或 NRC_OpenJobfile(std::string jobname) 创建或打开一个作业文件 | ### NRC_JobfileInsertPOSCALALL | 函数原型 | int NRC_JobfileInsertPOSCALALL(int line, std::string pos_name,const NRC_Position& change, const NRC_SyncPosition& sync_change); | | --- | --- | | 功能描述 | 作业文件插入点位全改指令。 | | 参数说明 | 输入参数:
line 将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1)
pos_name 需要修改的全局点位名称,范围 "GE0001"~"GE9999"
change 详见 NRC_Position(NRC_COORD coo, int usr, int tool, int con, double axis_pos1, double axis_pos2, double axis_pos3, double axis_pos4, double axis_pos5, double axis_pos6, double axis_pos7)
sync_change 详见 NRC_SyncPosition | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 注意,无论是 change 还是 sync_change,不存在的轴必需传入 99999 | ### NRC_RunqueueInsertPOSCALALL | 函数原型 | int NRC_RunqueueInsertPOSCALALL(std::string pos_name,const NRC_Position& change, const NRC_SyncPosition& sync_change); | | --- | --- | | 功能描述 | 运行队列插入点位全改指令。 | | 参数说明 | 输入参数:
pos_name 需要修改的全局点位名称,范围 "GE0001"~"GE9999"
change 详见 NRC_Position(NRC_COORD coo, int usr, int tool, int con, double axis_pos1, double axis_pos2, double axis_pos3, double axis_pos4, double axis_pos5, double axis_pos6, double axis_pos7)
sync_change 详见 NRC_SyncPosition | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 注意,无论是 change 还是 sync_change,不存在的轴必需传入 99999 | --- # 二次开发 API(码垛工艺) > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/02.%E6%8E%A5%E5%8F%A3/03.%E7%A0%81%E5%9E%9B%E5%B7%A5%E8%89%BA.html 本章节介绍码垛工艺参数设置与控制接口。 ## 函数索引 | 函数 | 说明 | |------|------| | NRC_Pallet_SetUsePalletType / NRC_Pallet_GetUsePalletType | 简易/完整码垛切换 | | NRC_Pallet_SetGripperParm / NRC_Pallet_GetGripperParm | 抓手参数 | | NRC_Pallet_SetSimplePosParm / NRC_Pallet_GetSimplePosParm | 简易码垛位置参数 | | NRC_Pallet_SetSimpleNumParm / NRC_Pallet_GetSimpleNumParm | 简易码垛数量参数 | | NRC_Pallet_ClearCurrentStatus | 清除码垛状态 | | NRC_Pallet_SetPalletedWpNum / NRC_Pallet_GetPalletedWpNum | 已码工件数量 | ### NRC_Pallet_SetUsePalletType | 函数原型 | int NRC_Pallet_SetUsePalletType(int id, int type); | | --- | --- | | 功能描述 | 设置使用简易码垛还是完整码垛。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
type  使用的码垛类型  0-简易码垛  1-完整码垛 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Pallet_GetUsePalletType | 函数原型 | int NRC_Pallet_GetUsePalletType(int id); | | --- | --- | | 功能描述 | 获取使用的是使用简易码垛还是完整码垛。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 使用的码垛类型: 0-简易码垛 1-完整码垛 | | 备注说明 | 无 | ### NRC_Pallet_SetGripperParm | 函数原型 | int NRC_Pallet_SetGripperParm(int id, int gripperSum, int gripper[4]); | | --- | --- | | 功能描述 | 设置码垛抓手数据。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
gripperSum 可用抓手总数,参数范围:1 <= gripperSum <= 4
gripper  每个抓手所绑定的工具坐标号,1 <= gripper[i] <= 9 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Pallet_GetGripperParm | 函数原型 | int NRC_Pallet_GetGripperParm((int id, int &gripperSum, int &gripper[4]); | | --- | --- | | 功能描述 | 获取码垛抓手数据。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
输出参数:
gripperSum 获取到的可用抓手总数
gripper  获取到的每个抓手所绑定的工具坐标号 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回 -102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回 -103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | | --- | --- | ### NRC_Pallet_SetSimplePosParm | 函数原型 | int NRC_Pallet_SetSimplePosParm(int id, int posType, NRC_Position pos); | | --- | --- | | 功能描述 | 设置简易码垛位置数据。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
posType 简易码垛的位置类型:  - 0 起始工件点  - 1 列末端  - 2 行末端  - 3 高末端  - 4 起始辅助点  - 5 起始入口点
pos 点位数据 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Pallet_GetSimplePosParm | 函数原型 | int NRC_Pallet_GetSimplePosParm(int id, int posType, NRC_Position& pos); | | --- | --- | | 功能描述 | 获取简易码垛位置数据。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
posType 简易码垛的位置类型:  - 0 起始工件点  - 1 列末端  - 2 行末端  - 3 高末端  - 4 起始辅助点  - 5 起始入口点
输出参数:
pos 点位数据 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回 -102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回 -103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | | --- | --- | ### NRC_Pallet_SetSimpleNumParm | 函数原型 | int NRC_Pallet_SetSimpleNumParm(int id, int numX, int numY, int numZ); | | --- | --- | | 功能描述 | 设置简易码垛个数数据。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
numX 简易码垛在其托盘 X 方向(对应用户坐标的 X 方向)上的工件数目,即行数
numY 简易码垛在其托盘 Y 方向(对应用户坐标的 Y 方向)上的工件数目,即列数
numZ 简易码垛在其托盘 Z 方向(对应用户坐标的 Z 方向)上的工件数目,即层数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Pallet_GetSimpleNumParm | 函数原型 | int NRC_Pallet_GetSimpleNumParm(int id, int& numX, int& numY, int& numZ); | | --- | --- | | 功能描述 | 获取简易码垛个数数据。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
输出参数:
numX 简易码垛在其托盘 X 方向(对应用户坐标的 X 方向)上的工件数目,即行数
numY 简易码垛在其托盘 Y 方向(对应用户坐标的 Y 方向)上的工件数目,即列数
numZ 简易码垛在其托盘 Z 方向(对应用户坐标的 Z 方向)上的工件数目,即层数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回 -102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回 -103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | | --- | --- | ### NRC_Pallet_ClearCurrentStatus | 函数原型 | int NRC_Pallet_ClearCurrentStatus(int id); | | --- | --- | | 功能描述 | 清除码垛当前状态。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Pallet_SetPalletedWpNum | 函数原型 | int NRC_Pallet_SetPalletedWpNum(int id, int layerNum, int layerPalletedWpNum); | | --- | --- | | 功能描述 | 设置码垛已码个数。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
layerNum 要修改的已码层数
layerPalletedWpNum 要修改的层已码工件数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回
-102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回
-103:目标对象当前处于不可操作状态返回 | | 备注说明 | 无 | ### NRC_Pallet_GetPalletedWpNum | 函数原型 | int NRC_Pallet_GetPalletedWpNum(int id, int& curPalletedWpSum, int& curLayerNum, int& curLayerPalletedWpNum, int& totalWpNum, int& totalLayerNum, int& curLayerWpSum); | | --- | --- | | 功能描述 | 获取码垛已码个数。 | | 参数说明 | 输入参数:
id  码垛工艺的工艺号,参数范围:1 <= id <= 99
输出参数:
curPalletedWpSum 当前已码工件数
curLayerNum 当前已码层数
curLayerPalletedWpNum 当前层的已码工件数
totalWpNum 垛堆工件总数
totalLayerNum 垛堆总层数
curLayerWpSum 当前层的工件总数 | | 返回值 | 0:函数调用成功返回
-101:无效的输入参数返回 -102:目标对象不存在,一般出现在系统初始化未完成时,调用其他函数时可能返回该值返回 -103:目标对象当前处于不可操作状态返回 | | 备注说明 | 对于用作返回值的6个参数,当其值为-1时,表示个数未知 | | --- | --- | --- # 快速开始 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/01.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html TODO:待补充 --- # 接口介绍 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/02.%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4/01.%E7%A4%BA%E6%95%99%E5%99%A8%E5%AE%9E%E7%8E%B0/01.%E6%8E%A5%E5%8F%A3%E4%BB%8B%E7%BB%8D.html 以下接口都在示教器的 SDK 中的头文件中可以找到 ## 自定义指令中的信号接口,需要跟槽函数一起使用 ```cpp /** * @brief 调用插入自定义指令界面的信号 * @note 信号用于初始化自定义界面,即作业文件指令插入时显示的界面 * @param cmdNum 其编号,对应插入时自定义指令类中从上到下第几个 */ void signal_userdefine_cmd_init(int cmdNum); /** * @brief 调用修改自定义指令界面的信号 * @note 信号用于修改自定义指令,即作业文件指令修改时显示的界面 * @param cmdNum 编号,对应插入时自定义指令类中从上到下第几个 * @param cmdParam 插入时传入的字符串参数,用于显示当前字符串参数 * @param posName 插入时传入的点位名,可选用 */ void signal_userdefine_cmd_alter(int cmdNum, QString cmdParam, QString posName); ``` ### signal_userdefine_cmd_init:用于打开用户自己写的自定义指令界面,如下图为自定义的界面: cmdNum 参数:在指令插入界面的自定义指令类内从上到下的第几个: ### signal_userdefine_cmd_alter:用于修改已经插入到作业文件中的自定义指令,调用后同样会打开用户自己写的自定义指令的界面 cmdNum 参数:需要修改的是哪一条自定义指令,具体哪一条指令按照下图去分辨: ## 自定义指令接口 ```cpp /** * @brief 插入自定义指令 * @param cmdNum 编号,对应插入时自定义指令类中从上到下第几个 * @param cmdParam 传入的自定义字符串参数 */ void userdefine_cmd_insert(int cmdNum, QString cmdParam); /** * @brief 修改自定义指令显示在插入界面的名称 * @param EnglishName 英文名称 * @param ChineseName 中文名称 * @note 插入的数量决定自定义指令的个数 * @note 请在使用connect调用信号signal_userdefine_cmd_init(int)绑定界面后调用此参数,否则会失效 */ void userdefined_cmd_name_change(QStringList &EnglishName,QStringList &ChineseName); /** * @brief 关闭自定义指令界面 * @note 插入和修改自定义点位需要取消时,请调用此接口以确保系统正确处理标志位 */ void close_userdefine_cmd_widget(QWidget *); ``` ### userdefined_cmd_name_change:使用示例 ```cpp QStringList ENname ; ENname <<"SWITCHGUN"<<"SWITCHGUNPOS"; QStringList CNname; CNname << tr("换枪动作")<userdefined_cmd_name_change(ENname, CNname); ``` --- # 示教器自定义指令使用示例 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/02.%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4/01.%E7%A4%BA%E6%95%99%E5%99%A8%E5%AE%9E%E7%8E%B0/02.%E7%A4%BA%E6%95%99%E5%99%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B.html ## 本文档只适用于有 QT 开发基础的用户 本文主要围绕相关下载内的示教器二次开发 Demo 进行教学,需要结合 Demo 中的代码一起看 ### 1,自定义指令界面 用户可以按照自己的喜好自己设计指令的界面,也可以直接使用我们的模板界面,下图是 Demo 中设计好的一个界面示例(用户可以直接用这个示例进行修改或者复制添加新的界面) ### 2,设置指令插入界面的自定义指令类中的指令 主要使用的接口: userdefined_cmd_name_change:修改自定义指令显示在插入界面的名称,效果如下图: ```text QStringList ENname ; ENname <<"SWITCHGUN"<<"SWITCHGUNPOS"; QStringList CNname; CNname << tr("换枪动作")<userdefined_cmd_name_change(ENname, CNname); ``` ### 3,打开自定义指令界面 主要使用到的接口是: signal_userdefine_cmd_init :该函数是 qt 中的一个信号函数,需要跟槽函数连接使用,用于打开用户自己写的自定义指令界面 ```cpp connect(Nextp::getInstance(),SIGNAL(signal_userdefine_cmd_init(int)),this,SLOT(slot_userdefine_cmd_init(int))); void WidgetManager::slot_userdefine_cmd_init(int cmd_num) //cmd_num对应指令插入界面自上而下的顺序 { if(cmd_num == 1) //对应界面中的换枪动作指令 { } if(cmd_num == 2) //对应界面中的移动到换枪位置指令 { //设置二次开发界面在窗口中的位置,并且打开该界面 Nextp::getInstance()->setWidgetParentLocation((QWidget *)SwitchGunPosCommand::getInstance(), 86, 96);//设置界面的打开的位置 SwitchGunPosCommand::getInstance()->initSwitchGunPosCmd(); SwitchGunPosCommand::getInstance()->raise(); SwitchGunPosCommand::getInstance()->show(); //打开界面 } } ``` Ps:SwitchGunPosCommand 是我们第一步的自定义指令界面 ### 4,插入自定义指令 自定义指令界面当中的确定控件的点击事件绑定了 slot_cmdInsertEnsureClicked 槽函数: SwitchGunPosBtnEnsure 为确定控件的名称 ```cpp connect(ui->SwitchGunPosBtnEnsure, SIGNAL(clicked()), this, SLOT(slot_cmdInsertEnsureClicked())); void SwitchGunPosCommand::slot_cmdInsertEnsureClicked() { int ID = ui->m_pcomboBoxGP_ID->currentIndex()+1; int moveType = ui->m_pcomboBoxGP_TYPE->currentIndex(); double vel = ui->m_pLineEditSwitchGP_V->text().toDouble(); double acc = ui->m_pLineEditSwitchGP_ACC->text().toDouble(); double dec = ui->m_pLineEditSwitchGP_DEC->text().toDouble(); int pl = ui->m_pLineEditSwitchGP_PL->text().toInt(); QString Param = "移动到换枪位置 " + QString::number(ID) + " " + QString::number(moveType) + " " + QString::number(vel) + " " + QString::number(acc) + " " + QString::number(dec) + " " + QString::number(pl); //封装需要发送的参数 Nextp::getInstance()->userdefine_cmd_insert(2,Param); // 2:自定义指令的编号,对应控制器回调函数的第一个int形参 this->hide(); //指令插入后关闭自定义界面 } ``` 将界面当中需要发送给控制器的参数封装成字符串类型,然后通过 userdefine_cmd_insert 接口将指令插入到作业文件当中 ### 5,修改自定义指令 当自定义指令已经插入到作业文件当中后还需要修改指令当中的参数 主要使用到的接口: signal_userdefine_cmd_alter:调用修改自定义指令界面的信号函数 ```cpp connect(Nextp::getInstance(),SIGNAL(signal_userdefine_cmd_alter(int,QString,QString)),this,SLOT(slot_userdefine_cmd_alter(int,QString,QString))); //当光标选中自定义指令并点击修改控件的时候就会触发这个槽函数 void WidgetManager::slot_userdefine_cmd_alter(int cmd_num, QString cmd_param, QString pos_name) { if(cmd_num == 1) //对应界面中的换枪动作指令 { } if(cmd_num == 2) //对应界面中的移动到换枪位置指令 { //设置二次开发界面在窗口中的位置,并且打开该界面 Nextp::getInstance()->setWidgetParentLocation((QWidget *)SwitchGunPosCommand::getInstance(), 86, 96);//设置界面的打开的位置 SwitchGunPosCommand::getInstance()->initSwitchGunPosCmd(); SwitchGunPosCommand::getInstance()->raise(); SwitchGunPosCommand::getInstance()->show(); //打开界面 } } ``` ### 6,关闭自定义指令界面 当用户打开了自定义指令界面后又不想插入指令时,可以直接关闭这个界面,就可以回到上一级的界面 在界面当中创建一个返回或者取消的控件,将这个控件绑定一个关闭界面的槽函数即可 SwitchGunPosBtnCancel 为 Demo 中的自定义指令界面的取消控件,示例如下: ```cpp connect(ui->SwitchGunPosBtnCancel, SIGNAL(clicked()), this, SLOT(slot_cmdInsertCancelClicked())); void SwitchGunPosCommand::slot_cmdInsertCancelClicked() { this->close(); } ``` --- # 接口介绍 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/02.%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4/02.%E6%8E%A7%E5%88%B6%E5%99%A8%E5%AE%9E%E7%8E%B0/01.%E6%8E%A5%E5%8F%A3%E4%BB%8B%E7%BB%8D.html 以下接口都在控制器的 SDK 中的头文件中可以找到 ```cpp /** * @brief 设置作业文件自定义指令回调函数 * @param cb 回调函数指针,类型为 std::function * @param (*fun)(int,std::string,std::string) 函数指针,即自定义指令要调用的函数 * @note 回调函数指针中的参数分别为该自定义指令的编号,该自定义指令的字符串参数,该自定义指令调用的点位名称(未调用则此参数为空) */ int NRC_SetJobFileCustomInstructionCB(bool (*fun)(int,const std::string &,const std::string &)); /** * @brief 供自定义作业文件指令调用的MOVJ指令,不可直接调用 * @param robotNum 机器人编号[1-4] * @param pos 机器人运动目标位置,详见 NRC_Position * @param vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100 * @param acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 * @param dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 * @param pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 * @param moveToNextLine 是否跳行,只需要在最后的一条指令将moveToNextLine置为true */ void NRC_Jobrun_MoveDirect(int robotNum, const NRC_Position & pos, double vel, double acc, double dec, int pl, bool moveToNextLine = false); /** * @brief 供自定义作业文件指令调用的MOVL指令,不可直接调用 * @param robotNum 机器人编号[1-4] * @param pos 机器人运动目标位置,详见 NRC_Position * @param vel 机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1 * @param acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 * @param dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 * @param pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 * @param moveToNextLine 是否跳行,只需要在最后的一条指令将moveToNextLine置为true */ void NRC_Jobrun_MoveLinear(int robotNum, const NRC_Position & pos, double vel, double acc, double dec, int pl, bool moveToNextLine = false); /** * @brief 供自定义作业文件指令调用的MOVC指令,不可直接调用 * @param robotNum 机器人编号[1-4] * @param mid_pos,end_pos 机器人运动目标位置,详见 NRC_Position * @param vel 机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1 * @param acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 * @param dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 * @param pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 * @param moveToNextLine 是否跳行,只需要在最后的一条指令将moveToNextLine置为true * @note 注意,MOVC不可作为第一条指令运行,且第一次调用时前面必须要有MOVJ或者MOVL指令 */ void NRC_Jobrun_MoveC(int robotNum, const NRC_Position& mid_pos,const NRC_Position& end_pos, double vel, double acc, double dec, int pl, bool moveToNextLine = false); /** * @brief 供自定义作业文件指令调用的MOVS指令,不可直接调用 * @param robotNum 机器人编号[1-4] * @param pos 机器人运动目标位置容器,大小不可小于4(即pos.size() >= 4),点位设置详见 NRC_Position * @param vel 机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1 * @param acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 * @param dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 * @param pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 * @param moveToNextLine 是否跳行,只需要在最后的一条指令将moveToNextLine置为true * @note 注意,MOVS不可作为第一条指令运行,且第一次调用时前面必须要有MOVJ或者MOVL指令 */ void NRC_Jobrun_MoveS(int robotNum, int pointNum, const std::vector< NRC_Position>& pos, double vel, double acc, double dec, int pl, bool moveToNextLine = false); /** * @brief 供自定义作业文件指令调用的IMOV指令,不可直接调用 * @param robotNum 机器人编号[1-4] * @param pos 机器人运动目标位置容器,大小不可小于4(即pos.size() >= 4),点位设置详见 NRC_Position * @param vel 机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1 * @param acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 * @param dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 * @param pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 * @param moveToNextLine 是否跳行,只需要在最后的一条指令将moveToNextLine置为true * @param tm 提前执行时间,范围:[0,999999],可不填,默认为0 * @note 注意,IMOV不可作为第一条指令运行,在其之前必须要有运动类指令 */ int NRC_Jobrun_IMOV(int robotNum, const NRC_Position& offset, double vel, double acc, double dec, int pl, int tm = 0, bool moveToNextLine = false); /** * @brief 供自定义作业文件指令调用的MOVJEXT指令,不可直接调用 * @param robotNum 机器人编号[1-4] * @param pos 机器人运动目标位置,详见 NRC_Position * @param syncPos 机器人运动目标位置,详见 NRC_SyncPosition * @param vel 机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100 * @param acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 * @param dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 * @param pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 * @param moveToNextLine 是否跳行,只需要在最后的一条指令将moveToNextLine置为true */ void NRC_Jobrun_MoveDirectSync(int robotNum, const NRC_Position & pos, const NRC_SyncPosition & syncPos, double vel, double acc, double dec, int pl, bool moveToNextLine = false); /** * @brief 供自定义作业文件指令调用的MOVLEXT指令,不可直接调用 * @param robotNum 机器人编号[1-4] * @param pos 机器人运动目标位置,详见 NRC_Position * @param syncPos 机器人运动目标位置,详见 NRC_SyncPosition * @param vel 机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1 * @param acc 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 * @param dec 机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100 * @param pl 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5 * @param moveToNextLine 是否跳行,只需要在最后的一条指令将moveToNextLine置为true * @param sync 是否协同 */ void NRC_Jobrun_MoveLinearSync(int robotNum, const NRC_Position & pos, const NRC_SyncPosition & syncPos, double vel, double acc, double dec, int pl, int sync, bool moveToNextLine = false); /** * @brief 阻塞非运动指令,当当前存在机器人运动指令未执行完成时,会阻塞在此接口中,阻止程序向下执行; * @brief 在断点恢复时,程序会从停止时程序停留的此接口处继续向下执行 */ void NRC_JobRun_BlockNotMoveInstruction(); ``` --- # 控制器自定义指令使用示例 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/02.%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4/02.%E6%8E%A7%E5%88%B6%E5%99%A8%E5%AE%9E%E7%8E%B0/02.%E6%8E%A7%E5%88%B6%E5%99%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B.html ## 本文档只适用于有 C++开发基础的用户 本文主要围绕相关下载内的控制器二次开发 Demo 进行教学,需要结合 Demo 中的代码一起看 ### 1,注册自定义指令的回调函数 ```cpp NRC_SetJobFileCustomInstructionCB(userdefinecmd); //注册自定义指令的回调函数 ``` 注册的函数: ```cpp bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName) { //id : 对应示教器接口userdefine_cmd_insert中的第一位参数 //paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数 return true; } ``` ### 2,封装获取示教器端发送的自定义指令参数函数(可选,也可以自己开发解析的这部分) 封装解析接收到的的字符串的函数: ```cpp //功能函数,用于切分字符串并存入容器中 std::vector split(const std::string& s, char delimiter) { std::vector tokens; std::string token; std::istringstream tokenStream(s); while (std::getline(tokenStream, token, delimiter)) { tokens.push_back(token); } return tokens; } ``` split 函数的使用示例: ```cpp std::vector param = split(paramStr,' '); param.erase(param.begin()); double vel = atoi(param.at(2).c_str()); double acc = atoi(param.at(3).c_str()); double dec = atoi(param.at(4).c_str()); ``` ### 3,使用示例 将示教器发送的速度,加速度,减速度参数解析出来使用,下面是自定义指令运行三条 MOVJ 运动的示例: 注意:自定义指令内运动类的指令只能使用接口介绍中的运动类接口 ```cpp bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName) { //id : 对应示教器接口userdefine_cmd_insert中的第一位参数 //paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数 int robotNum = 1; //定义需要控制器的机器人编号 if (id == 1) { } else if (id == 2) { //分隔字符串获取参数 std::vector param = split(paramStr,' '); param.erase(param.begin()); double vel = atoi(param.at(2).c_str()); double acc = atoi(param.at(3).c_str()); double dec = atoi(param.at(4).c_str()); //取出示教器封装的各参数 NRC_Position pos1 = {NRC_ACS, 40, 0, 0, 0, 0, 0}; NRC_Position pos2 = {NRC_ACS, 0, 0, 0, 0, 0, 0}; NRC_Position pos3 = {NRC_ACS, -40, 0, 0, 0, 0, 0}; //机器人运行的目标点位 NRC_Jobrun_MoveDirect(robotNum, pos1, vel, acc, dec, 5); //MOVJ运动指令 NRC_Jobrun_MoveDirect(robotNum, pos2, vel, acc, dec, 5); NRC_Jobrun_MoveDirect(robotNum, pos3, vel, acc, dec, 5, true); //最后一条运动类指令需要跳行,将moveToNextLine传true!!!否则会出现机器人飞车事故! } else { printf("no this cmd"); } return true; } ``` ### 4,运行自定义指令 程序都升级完成之后,在作业文件当中插入我们刚刚写的自定义指令到作业文件当中,如图: 作业文件指令插入完成之后,切换到运行模式,启动程序。当程序运行到”移动到换枪位置 1 0 50 50 50 0“这条自定义指令的时候,就开始执行上面的例子中的 userdefinecmd 函数内的全部代码(三条 MOVJ 运动)。 ### 5,进阶教程 当用户需要机器人运动到某一个点位的时候,进行一些对程序的控制,对机器人状态的控制,对 IO 的控制,或者用户自己的一些功能代码时,如果直接将这部分代码直接添加注册的自定义指令函数内,然后在示教器运行自定义指令则出现,机器人机器人一直在运动但是用户的代码在执行自定义指令刚开始时就已经跑完了,这个时候就需要用到下面的这个阻塞接口,将程序阻塞在需要的地方。 ```cpp /** * @brief 阻塞非运动指令,当当前存在机器人运动指令未执行完成时,会阻塞在此接口中,阻止程序向下执行; * @brief 在断点恢复时,程序会从停止时程序停留的此接口处继续向下执行 */ void NRC_JobRun_BlockNotMoveInstruction(); ``` #### 示例一:当机器人运动到某一个点位之后需要打开 IO 输出 ```cpp bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName) { //id : 对应示教器接口userdefine_cmd_insert中的第一位参数 //paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数 int robotNum = 1; //定义需要控制器的机器人编号 if (id == 1) { } else if (id == 2) { NRC_Position pos1 = {NRC_ACS, 40, 0, 0, 0, 0, 0}; NRC_Position pos2 = {NRC_ACS, 0, 0, 0, 0, 0, 0}; NRC_Position pos3 = {NRC_ACS, -40, 0, 0, 0, 0, 0}; //机器人运行的目标点位 NRC_Jobrun_MoveDirect(robotNum, pos1, 80, 50, 50, 0); NRC_Jobrun_MoveDirect(robotNum, pos2, 80, 50, 50, 0); NRC_JobRun_BlockNotMoveInstruction();//阻塞接口,将程序阻塞在该位置,等待上一条的MOVJ运动到目标点位后解除阻塞 NRC_DigOut(1, 1); //打开对应的IO数字输出 NRC_Jobrun_MoveDirect(robotNum, pos3, 80, 50, 50, 0, true); //最后一条运动类指令需要跳行,将moveToNextLine传true!!!否则会出现机器人飞车事故! } else { printf("no this cmd"); } return true; } ``` 其中 nrcAPI.h 头文件中的非运动类的接口大部分都是可以写在注册函数当中进行适用的。 #### 示例二:当机器人运动到某一点位之后,需要执行用户自己写的功能函数: 当机器人运动到 pos2的目标位置之后就开始执行用户自己写的功能函数,注意:用户在添加自己的功能函数的最后需要自己增加阻塞,防止功能函数还没执行完就开始执行下面的 MOVJ 运动! ```cpp bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName) { //id : 对应示教器接口userdefine_cmd_insert中的第一位参数 //paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数 int robotNum = 1; //定义需要控制器的机器人编号 if (id == 1) { } else if (id == 2) { NRC_Position pos1 = {NRC_ACS, 40, 0, 0, 0, 0, 0}; NRC_Position pos2 = {NRC_ACS, 0, 0, 0, 0, 0, 0}; NRC_Position pos3 = {NRC_ACS, -40, 0, 0, 0, 0, 0}; //机器人运行的目标点位 NRC_Jobrun_MoveDirect(robotNum, pos1, 80, 50, 50, 0); NRC_Jobrun_MoveDirect(robotNum, pos2, 80, 50, 50, 0); NRC_JobRun_BlockNotMoveInstruction();//阻塞接口,将程序阻塞在该位置,等待上一条的MOVJ运动到目标点位后解除阻塞 /** * ........................ * 用户自己写的功能函数 * ........................ */ NRC_Jobrun_MoveDirect(robotNum, pos3, 80, 50, 50, 0, true); //最后一条运动类指令需要跳行,将moveToNextLine传true!!!否则会出现机器人飞车事故! } else { printf("no this cmd"); } return true; } ``` --- # 自定义指令 Demo > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/02.%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4/03.%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4demo.html 该 Demo 的版本为 rtl-22.07.64 版本,适用于 C1201 控制器(如果需要其他版本的 SDK,请到相关下载内下载对应的库进行替换)。 ## 下载说明 控制器和示教器的二次开发 Demo 均在 **相关下载 → 控制器 SDK** 中。 ## 目录结构 | 文件夹 | 说明 | |--------|------| | 控制器实现 | 控制器侧二次开发 Demo,演示如何在控制器内注册自定义指令回调函数 | | 示教器实现 | 示教器侧二次开发 Demo,演示如何为自定义指令编写专属 UI 界面 | ## 快速开始 1. 下载对应控制柜版本的 SDK 包 2. 参考文档:[控制器实现接口介绍](./02.控制器实现/01.接口介绍.md) 3. 参考文档:[示教器实现接口介绍](./01.示教器实现/01.接口介绍.md) --- # 06.控制器/04.参考/变更日志 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html --- # 06.控制器/04.参考/数据结构 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/04.%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html --- # 06.控制器/04.参考/错误码表 > 原文:https://open.inexbot.com/zh/06.%E6%8E%A7%E5%88%B6%E5%99%A8/04.%E5%8F%82%E8%80%83/%E9%94%99%E8%AF%AF%E7%A0%81%E8%A1%A8.html --- # 07.示教器/01.文档/01.环境搭建 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html --- title: 快速开始 description: 示教器二次开发环境安装与远程连接指南。 --- ## 1. 环境安装 ### 1.1 系统要求 当前推荐的开发环境操作系统为: 当前支持的 Qt 编译套件包括: - Ubuntu 20.04 - Desktop Qt 5.9.0 GCC 64 bit - LYX(示教盒嵌入式编译套件) 需要根据不同的目标平台,选择不同的 Qt 编译套件。 如果只需要在 Ubuntu 20.04 上运行,选择 Desktop Qt 5.9.0 GCC 64 bit 编译套件,如果需要在嵌入式示教盒上运行,选择 LYX 编译套件。 我们提供打包了所有开发环境的镜像文件,当然也可以在任意一台 Ubuntu 20.04 下参照小节《1.3 编译套件安装》来安装。 > 直接获取安装好了的虚拟机 > 点击这里 可以下载得到配置好开发环境的、基于 VirtualBox 软件使用的 Ubuntu 20.04.1 系统的虚拟机; > 点击这里 可以下载得到基于 Windows 系统的 VirtualBox 软件安装包,如需其他系统版本的请自行到 VirtualBox 官网 进行下载。 > • > 安装 VirtualBox 软件(注意按转路径不能带有中文) > • > 打开下载的"开发环境虚拟机"文件夹,按照"README.txt"文件说明安装虚拟机; > • > 开机后登录账户"nbt",密码是"123"。 ### 1.2 Qt 下载 我们需要进入 Qt 的官网 Qt Downloads 选择 qt-opensource-Linux-x64-5.9.0.run 下载。 > 推荐复制这个链接 [https://download.qt.io/new_archive/qt/5.9/5.9.0/qt-opensource-Linux-x64-5.9.0.run],打开迅雷下载速度更快。 下载完成后在 Ubuntu 20.04中,打开 cmd,运行: ```bash sudo chmod a+x qt-opensource-linux-x64-5.9.0.run sudo ./qt-opensource-linux-x64-5.9.0.run ``` 出现 qt 安装程序后⼀直选择默认,直到这⼀步需要勾选如图所⽰的选项: 步骤全部完成后,Qt 会被安装到/opt 目录下。 启动 Qt,运行: ```text /opt/Qt5.9.0/Tools/QtCreator/bin/qtcreator ``` ### 1.3 编译套件安装 以下编译链根据具体的目标平台选择安装: #### 1.3.1 Desktop Qt 5.9.0 GCC 64 bit 编译套件安装 安装 GCC,运行: ```bash sudo apt install gcc-multilib sudo apt install g++-multilib sudo apt install lib32z1 sudo apt install libgl1-mesa-dev ``` #### 1.3.2 LYX 编译套件安装 将 gcc.tar.gz 和 qtenv.tar.gz 解压到系统的/opt/⽬录下 ```bash sudo tar -zxvf gcc.tar.gz -C /opt sudo tar -zxvf qtenv.tar.gz -C /opt ``` 将 tslib.tar.gz 解压到系统的/usr/local⽬录下 ```bash sudo tar -zxvf tslib.tar.gz -C /usr/local ``` 配置32位编译环境 ```bash sudo dpkg --add-architecture i386 sudo apt update sudo apt install libc6-dev-i386 sudo apt install g++-multilib sudo apt install libstdc++6:i386 ``` 打开 qt,添加 LYX 编译套件,详细步骤可⻅附件: 至此,我们常用的两个编译套件就配置完成了。 ## 2. 远程登陆到示教器 ### 2.1 确认电脑连接上示教器 首先确保你的电脑已经跟控制器连接了通讯,电脑的 IP 需要跟控制器的 IP 在同一网段下。示教器的出厂默认 IP 为192.168.1.245,所以电脑连接控制器的网口同样需要设置为1网段(比如可以设置192.168.1.110)。设置完成之后在 Ubuntu 中打开一个新的终端输入 ```bash ping 192.168.1.245 ``` 如出现不成功的情况,请检查网线的连接,电脑的 IP,示教器的 IP。 ### 2.2 使用 ssh 登陆到示教器 ```bash ssh root@192.168.1.245 ``` 然后密码输入1234,即可进行远程控制了。 示教器程序执行在/userfs/app/下,使用./Qt-tp -qws 即可启动示教器程序,使用 killall -9 Qt-tp 杀死示教器程序。 --- # 架构说明 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/01.%E6%96%87%E6%A1%A3/02.%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E.html 示教器是机器人的主要人机交互设备,提供作业文件编程、点动操作、系统参数设定、模式切换等功能。纳博特示教器(T30/T31/T40 系列)采用 ARM 处理器 + Qt 界面框架,通过以太网与控制器通讯。 ## 产品架构 ```text ┌────────────────────────────┐ │ Qt 5.12.5 界面框架 │ │ (作业编程 · 点动 · 参数) │ ├────────────────────────────┤ │ ARM 处理器 (Cortex-A7) │ │ 1.2GHz · DDR3 · eMMC │ ├────────────────────────────┤ │ Ethernet 通讯接口 │ └────────────┬───────────────┘ ↕ 以太网 ┌────────────┴───────────────┐ │ 控制器 (Linux RT) │ └────────────────────────────┘ ``` ## 硬件平台 | 组件 | 说明 | |------|------| | 处理器 | Cortex-A7 双核 1.2GHz ARM CPU | | 显示 | 8 英寸 800×600 TFT 高清大屏,寿命 20,000 小时 | | 触控 | 4 线工业电阻触控,佩戴手套可操作 | | 存储 | eMMC 8G bit + DDR3 256MB | | 通讯 | Ethernet + USB HOST 2.0 | | 防护 | IP65(显示屏正面),工作温度 -20℃~70℃ | ## 安全机制 | 机制 | 说明 | |------|------| | 三段使能开关(DEADMAN) | 未激活/使能/惊慌三档,松开即停止运动 | | 双触点急停 | 旋钮解锁设计,可选 2 线或 4 线配置 | | 模式选择钥匙 | 物理钥匙切换示教/运行/远程模式 | | 三档切换开关 | 手动/停止/自动 | > 安全机制是机器人操作的核心保障:点动时必须按住 DEADMAN 使能键;紧急情况下按下急停立即停止所有运动。 ## 功能按键体系 | 按键 | 功能 | |------|------| | 启动 | 运行作业文件/试运行 | | 单步 | 单步运行指令行 | | 暂停 | 暂停当前运行 | | 停止 | 停止运行 | | DEADMAN | 使能键,按住才可上电/点动 | | 急停 | 紧急停止,双触点冗余 | | 手轮 | AB 相脉冲电子手轮,20 脉冲/圈,滑鼠/微调模式 | | 自定义按键 | 21 个薄膜按键 + 4 个自定义 LED 指示灯 | ## 界面架构 | 界面 | 功能 | |------|------| | 工程界面 | 作业文件创建、打开、编辑、指令编程 | | 点动界面 | 关节/直角坐标点动操作 | | 参数设置 | 机器人参数、DH 参数、点动速度、独立轴参数 | | 工艺界面 | 焊接、码垛、视觉、传送带等工艺参数 | | 状态栏 | 全局速度、运行状态、模式显示 | ## 版本信息 | 版本 | 日期 | 说明 | |------|------|------| | 1.0.0 | — | 初始版本 | --- # 核心概念 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/01.%E6%96%87%E6%A1%A3/03.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html ## 操作模式 示教器通过右上角【模式选择钥匙】在三种模式间切换: | 模式 | 说明 | 主要用途 | |------|------|----------| | 示教模式 | 人工操作,安全优先 | 系统参数设定、点动操作、作业文件编程 | | 运行模式 | 自动执行作业文件 | 启动/暂停/停止程序,设置运行次数 | | 远程模式 | 上位机/远程 IO 接管 | 远程启动、预约程序、远程控制 | > 模式切换通过物理钥匙完成,防止误操作。 ## 程序运行方式 ### 单步运行 逐行执行作业文件指令,常用于调试: 1. 打开运行的程序,进入程序指令界面 2. 选中要单步操作的指令行 3. 按下【DEADMAN】按键,机器人上电 4. 按下【单步】按键,执行选中行指令后停止 5. 选中行自动下移/上移,再按【单步】执行下一行 支持**正序运行**(从第 1 行依次执行)和**倒序运行**(从最后一行反向执行)。 ### 试运行 示教模式下将【启动】键作为试运行按键,按住保持运行、松开停止: - 支持所有指令 - 不支持倒序以及后台程序 ### 连续运行 切换到运行模式后,点击【启动】按键开始运行作业文件,可设置运行次数(格式:已运行次数/总设置次数)。 ## 速度体系 | 速度类型 | 定义 | |----------|------| | 全局速度 | 示教器状态栏速度,作为整体倍率 | | 点动速度 | 关节轴最大点动速度 × 全局速度(可在机器人参数-点动速度界面修改) | | 单步指令速度 | 全局速度 × 指令速度(单步关节速度受 30% 额定速度限制,单步直角速度上限 300mm/s) | | 试运行速度 | 同单步指令速度 | | 回零速度 | 示教速度 | ## 坐标系与点动 示教器点动支持以下坐标系: | 坐标系 | 说明 | |--------|------| | 关节坐标 | 各关节轴独立点动 | | 直角坐标 | 末端沿 X/Y/Z 方向点动 | | 工具坐标 | 沿工具 TCP 方向点动 | | 用户坐标 | 沿用户坐标系方向点动 | ## 示教器编程 示教器支持完整作业文件编程: | 指令类型 | 说明 | |----------|------| | 运动指令 | MoveJ、MoveL、MoveC 等 | | 逻辑指令 | IF、WHILE、JUMP 等流程控制 | | IO 指令 | IO_OUT 输出、延时 | | 运算指令 | 数学运算、变量赋值 | 编程完成后切到运行模式即可执行。 ## 安全操作概念 | 概念 | 说明 | |------|------| | DEADMAN 使能 | 三段使能开关,按住中间档才可上电/点动,松开立即停止 | | 急停 | 双触点旋钮急停,按下立即停止所有运动 | | 安全区域 | 机器人运行时禁止进入工作区域 | | 低速点动 | 点动时应采用较低速度倍率,增加控制机会 | | 运行前检查 | 确认程序任务、传感器位置、急停按钮位置后再运行 | > 安全规程:不带手套操作示教器;点动前考虑机器人运动趋势;预先确认避让轨迹无干涉;保持机器人周围区域清洁。 --- # 07.示教器/02.接口/01.二次开发API > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/02.%E6%8E%A5%E5%8F%A3/01.%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91API.html --- title: 二次开发 API description: 示教器二次开发静态库接口说明。 --- ## 二次开发静态库简介 ### 功能介绍 提供完整的示教器功能,支持添加用户自定义界面,支持特定字段的通信与控制系统通信。 ### 静态库目录结构 nextpLib 为总文件夹; Include 文件夹中为头文件; Library 文件夹中为静态库文件包括 Linux 平台和 ARM 平台的库文件(使用 ARM 平台交叉编译的程序只适用于纳博特公司的 T30 示教器使用); ### 静态库结构说明 #### 1.nextp.h 头文件接口说明: ```cpp //创建 Nextp 类对象 static QPointer getInstance(); //获取系统字体 QString getSystemFont(); //用户自定义窗体传输到主程序 void setWidgetParentLocation(QPointer widget); //向控制器发送消息 void sendMessage(const quint16 &command,const QByteArray &data); //通知示教程序自定义窗体已经打开 widgetShowFinish() //接收控制器消息信号 void signal_receiveMessage(const quint16 &command,const QByteArray &data); //打开自定义窗体信号 void signal_openWidget(); //关闭自定义窗体信号 void signal_closeWidget(); //隐藏工艺主界面中除了自定义按钮的其他按钮 void hideTechnologyToolbuttons(); //静态库支持与控制器通信命令字 enum CommandList { SetFirstUserParaCommand = 0x9200, GetFirstUserCommand = 0x9201, ReceivedFirstUserCommand = 0x9202, SetSecondUserParaCommand = 0x9203, GetSecondUserCommand = 0x9204, ReceivedSecondUserCommand = 0x9205, SetThirdUserParaCommand = 0x9206, GetThirdUserCommand = 0x9207, ReceivedThirdUserCommand = 0x92, ReceivedThirdUserCommand = 0x9208, SetFourthUserParaCommand = 0x9209, GetFourthUserCommand = 0x920a, ReceivedFourthUserCommand = 0x920b, SetFifthUserParaCommand = 0x920c, GetFifthUserCommand = 0x920d, ReceivedFifthUserCommand = 0x920e, }; ``` #### 2. json/json.h 头文件提供 JSON 数据格式的组装和解析 组装 JSON 数据示例: ```cpp Json::Value root; Json::FastWriter wt; root["robot"] =1; root["booldata"] =true; root["data"] = 1.1; root["name"] ="nihao"; ``` 解析 Json 数据示例 ```cpp QByteArray jsonData //控制器发送的数据 Json::Value root; Json::Reader reader; QString jsonData = param.data(); if(reader.parse(jsonData.toStdString(), root)) { int robot = root["robot"].asInt(); bool booldata= root["booldata"].asBool(); Int data= root["data"].asDouble(); Std::string name = root["name "].asString(); } ``` #### 3.digitallineedit.h 提供数字输入框 支持将 QLineEdit 控件提升为数字输入框 提升方法:右键选择一个 QLineEdit 控件 --->Promote to--->DigitalLineEdit 右侧树形结构中可以看到该控件 Classs 属性变为 DigitLineEdit 程序运行后控件效果,单击控件会弹出数字键盘: #### 4.lineeditwidget.h 提供数字和字符输入框 支持将 QLineEdit 控件提升为数字与字符输入框 提升方法:右键选择一个 QLineEdit 控 件 --->Promote to--->lineEditWidget 右侧树形结构中可以看到该控件 Classs 属性变为 lineEditWidget 程序运行后控件效果,单击控件会弹出数字与字母键盘: ## Demo 说明 - Demo 结构图 Demo 文件夹名称:NextpMode 2.1 settingparawidget.h settingparawidget.cpp settingparawidget.ui 三个文件为用户自定义窗体 2.2 widgetmanager.h widgetmanager.cpp 为管理类连接用户自定义窗体和静态库 2.2 静态库文件夹 nextplib 需要放置在 demod 的 NextpMode 文件夹下 2.3 运行 Demo (使用 QtCreator 直接打开 NextpMode 文件夹下的 NextpMode.pro 文件 ) 运 Demo 程序点击【操作员】> 选择管理员>输入密码 123456 登录 点击左侧【工艺】按钮> 用户 进入自定义窗体 点击修改按钮 可以修改参数 点击保存将发送参数到控制器 QtCreator 控制台会打印发送到控制器的数据 如果调用函数 void hideTechnologyToolbuttons();会隐藏除工艺在主界 面上自定义按钮以外的其他工艺按钮 - Demo 文件类说明 --- # 07.示教器/03.示例/01.快速开始 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/01.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html --- # 07.示教器/03.示例/02.硬件接口 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/02.%E7%A1%AC%E4%BB%B6%E6%8E%A5%E5%8F%A3.html --- title: 硬件接口 description: 通过 Linux 设备文件读取示教器上的按键、旋钮、使能状态。 --- 示教器上存在着一部分按钮和旋钮,下面示例演示如何获取到他们的状态: 建立一个 Qt 窗口应用 ## mainwindow.h ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void onDataAvailable(); void getKeyValue(); void getEnableValue(); private: Ui::MainWindow *ui; int switchfd = -1; QSocketNotifier *switch_notifier; int buttonfd = -1; QSocketNotifier *button_notifier; int enablefd = -1;// 使能 QSocketNotifier *enable_notifier; }; #endif // MAINWINDOW_H ``` ## mainwindow.cpp ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 打开旋钮设备文件 switchfd = ::open("/dev/buttons", O_RDONLY | O_NONBLOCK); if (switchfd < 0) { qCritical() << "Failed to open device:" << strerror(errno); QCoreApplication::exit(1); return; } switch_notifier = new QSocketNotifier(switchfd, QSocketNotifier::Read, this); connect(switch_notifier, SIGNAL(activated(int)), this, SLOT(onDataAvailable())); //打开按键设备文件 buttonfd = ::open("/dev/input/event0", O_RDWR); if (buttonfd < 0) { qCritical() << "Failed to open device:" << strerror(errno); QCoreApplication::exit(1); return; } button_notifier = new QSocketNotifier(buttonfd,QSocketNotifier::Read, this); connect(button_notifier, SIGNAL(activated(int)), this, SLOT(getKeyValue())); //打开使能设备文件 enablefd = ::open("/dev/buttonstop", O_RDWR); if (enablefd < 0) { qCritical() << "Failed to open device:" << strerror(errno); QCoreApplication::exit(1); return; } enable_notifier = new QSocketNotifier(enablefd,QSocketNotifier::Read, this); connect(enable_notifier, SIGNAL(activated(int)), this, SLOT(getEnableValue())); } MainWindow::~MainWindow() { delete ui; if (switchfd >= 0) ::close(switchfd); if (buttonfd >= 0) ::close(buttonfd); if (enablefd >= 0) ::close(enablefd); } void MainWindow::onDataAvailable() { char switchbuttons[8]={'0','0','0','0','0','0','0','0'}; ssize_t bytesRead; // 读取设备数据 while ((bytesRead = ::read(switchfd, switchbuttons, sizeof(switchbuttons))) > 0) { qDebug() << "Data received:" << QByteArray(switchbuttons, bytesRead); QString CurMode = ""; QString teachMode="00001000";//示教模式 QString runMode="00000100";//运行模式 QString remoteMode="00010000";//远程模式 for(unsigned int i=0;i 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/03.%E7%A4%BA%E4%BE%8B/03.%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%87%E4%BB%A4.html --- title: 自定义指令 description: 示教器自定义指令界面的开发指南。 --- 在 TeachPendantDemo 中,建立三个文件 在 widget_mannager.cpp 中将 signal_userdefine_cmd_init 与 signal_userdefine_cmd_alter 这两个信号和我们的界面绑定起来 ```cpp WidgetManager::WidgetManager(QObject *parent) : QObject(parent) { Nextp::getInstance(); // 注册my_custom_widget界面 connect(Nextp::getInstance(),SIGNAL(signal_openWidget()),this,SLOT(slot_openMyCustomWidget())); // 注册my_custom_command界面 connect(Nextp::getInstance(),SIGNAL(signal_userdefine_cmd_init(int)),this,SLOT(slot_openMyCustomCommand(int))); connect(Nextp::getInstance(),SIGNAL(signal_userdefine_cmd_alter(int,QString,QString)),this,SLOT(slot_modifyMyCustomCommand(int,QString,QString))); // 注册关闭界面的信号,收到这个系统信号需要关闭所有custom界面 connect(Nextp::getInstance(),SIGNAL(signal_closeWidget()),this,SLOT(slot_closeAllCustomWidget())); // 注册接收到控制器消息的回调 connect(Nextp::getInstance(),SIGNAL(signal_receiveMessage(const quint16 &,const QByteArray &)),this,SLOT(slot_receiveMessage(const quint16 &,const QByteArray &))); } void WidgetManager::slot_openMyCustomCommand(int) { Nextp::getInstance()->setWidgetParentLocation((QWidget*)MyCustomCommand::getInstance(),86,96); MyCustomCommand::getInstance()->show(); MyCustomCommand::getInstance()->raise(); Nextp::getInstance()->widgetShowFinish(); } ``` 第一个信号是绑定打开事件,第二个信号是绑定修改事件。 在实现 slot_openMyCustomCommand 是打开一个全新的 custom_commamd.ui 在实现 slot_modifyMyCustomCommand 是打开一个界面,并根据 int,QString,QString 这三个参数,初始化界面。 - my_custom_command.h - my_custom_command.cpp - my_custom_command.ui --- # 07.示教器/04.参考/变更日志 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html --- # 07.示教器/04.参考/数据结构 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/04.%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html --- # 07.示教器/04.参考/错误码表 > 原文:https://open.inexbot.com/zh/07.%E7%A4%BA%E6%95%99%E5%99%A8/04.%E5%8F%82%E8%80%83/%E9%94%99%E8%AF%AF%E7%A0%81%E8%A1%A8.html --- # Ubuntu 18.04 安装 > 原文:https://open.inexbot.com/zh/08.ROS/01.ROS-1/01.%E6%96%87%E6%A1%A3/01.ubuntu%E7%9A%84%E5%AE%89%E8%A3%85.html 本文详细说明 Ubuntu 18.04 的下载、通过 VMware Workstation 创建虚拟机、安装配置以及 VMware Tools 安装的全过程。 ## 1. 下载 Ubuntu 18.04 从 Ubuntu 官方或国内镜像站下载 Ubuntu 18.04 LTS 的 iso 文件。 安装好之后如下: ## 2. 创建虚拟机 ### VMware 配置步骤 1. 打开 VMware Workstation,点击 **创建新的虚拟机**。 2. 选择 **自定义(高级)**,然后点击 **下一步**。 3. 根据安装的 VMware 的版本号,选择硬件兼容性,点击 **下一步**。 4. 选择 **稍后安装操作系统**,点击 **下一步**。 5. 选择 **Linux**,版本为 **Ubuntu 64位**,点击 **下一步**。 6. 自己命名,选择安装位置(最好不要安装在 C 盘)。 7. 处理器数量选择 **1**,内核数量选择 **4**,点击 **下一步**。 8. 内存选择 **8GB**,点击 **下一步**。 9. 选择 **使用网络地址转换**,点击 **下一步**。 10. 按默认推荐配置,点击 **下一步**。 11. 选择 **创建新虚拟磁盘**,点击 **下一步**。 12. 分配磁盘,推荐 **80GB**,可根据实际需求调整,选择 **将虚拟磁盘拆分为多个文件**,点击 **下一步**。 13. 默认,点击 **下一步**。 14. 点击 **自定义硬件**。 15. 进入自定义硬件,使用 **ISO 映像文件**,选择一开始下载的 iso 文件,移除 **声卡** 和 **打印机**,然后点 **关闭**。因为用不上虚拟机的声卡和打印机,关闭以节省资源。 16. 点击 **完成**,开始安装。 ## 3. 安装 Ubuntu 18.04 1. 进入 Ubuntu 18.04,开启此虚拟机。选择 **中文(简体)**,点击 **安装 Ubuntu**。 2. 选择 **汉语**。 3. 选择 **正常安装**,**安装 Ubuntu 时下载更新**,点击 **继续**。 4. 选择 **清除整个磁盘并安装 Ubuntu**,出现提醒选择 **继续**,最后点击 **现在安装**。 5. 自己设定好用户名以及密码,地区可以随意填,等待 Ubuntu 自己安装即可。 ## 4. 安装 VMware Tools 安装好 Ubuntu 后点击现在重启,进入 Ubuntu,安装 VMware Tools。 ### 挂载 VMware Tools 1. 点击上方 **虚拟机**,点击 **安装 VMware Tools**。 下载完成如下: 2. 在文件—VMware Tools 中找到这个文件夹,把文件夹移入主目录。 3. 在主目录中点击右键,点击 **在终端打开**,运行以下命令: ```bash tar -zxvf VMwareTools-xxx.tar.gz ``` 运行后即可发现文件夹已解压: 4. 运行以下两条命令: ```bash cd vmware-tools-distrib sudo ./vmware-install.pl ``` 除了第一次停顿时输入 `yes`,其他停顿都按回车即可。 之后重启;至此,Ubuntu 18.04 安装完成。 --- # ROS 1 安装 > 原文:https://open.inexbot.com/zh/08.ROS/01.ROS-1/01.%E6%96%87%E6%A1%A3/02.ROS-1%E7%9A%84%E5%AE%89%E8%A3%85.html 本文介绍在 Ubuntu 18.04 上安装 ROS 1 Melodic 的完整步骤,以及常见错误的处理方法。 ## 1. 配置软件源 Ubuntu 默认软件源速度较慢,建议更换为国内镜像(以阿里云为例)。 ### 备份原 sources.list ```bash sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup ``` ### 替换为阿里云镜像源 ```bash sudo gedit /etc/apt/sources.list ``` 在文件最前面添加: ```bash deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse ``` ### 刷新软件列表 ```bash sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential ``` ## 2. 添加 ROS 软件源 ### 官方源 ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` ### 清华源(推荐国内使用) ```bash sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' ``` ## 3. 添加密钥 ```bash sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` ## 4. 安装 ROS ```bash sudo apt update sudo apt install ros-melodic-desktop-full ``` ## 5. 安装并初始化 rosdep ```bash sudo apt update sudo apt install python-rosdep sudo rosdep init rosdep update ``` 如果一切顺利,rosdep 初始化与更新的打印结果如下: ### rosdep 初始化失败的解决 若初始化失败(因 GitHub 服务器访问受限),可先尝试用手机热点连接网络进行 `rosdep init`,仍不行则按以下步骤修改。 #### 修复 sources_list.py ```bash sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py ``` 在 `download_rosdep_data` 函数中,将 `url = "https://raw.githubusercontent.com/..."` 改为 `url = "https://ghproxy.com/" + url`。 #### 修复 rosdistro/__init__.py ```bash sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/__init__.py ``` 找到 `DEFAULT_INDEX_URL`(第 72 行),改为: ```python DEFAULT_INDEX_URL = 'https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml' ``` #### 修复 gbpdistro_support.py ```bash sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py ``` 在 `download_rosdep_data` 函数开头(第 36 行附近)添加: ```python gbpdistro_url = "https://ghproxy.com/" + gbpdistro_url ``` #### 修复 rep3.py ```bash sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/rep3.py ``` 在约第 39 行处添加代理前缀。 #### 修复 manifest_provider/github.py ```bash sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/manifest_provider/github.py ``` 在约第 68 行和第 119 行处添加代理前缀。 #### 处理 DNS 问题 如果依然不能解决报错,尝试修改 DNS: ```bash sudo gedit /etc/resolv.conf ``` 将原有的 `nameserver` 行注释,并添加: ```bash nameserver 8.8.8.8 nameserver 8.8.4.4 ``` 保存退出,执行: ```bash sudo apt-get update ``` 再执行: ```bash sudo rosdep init ``` 如果报错提示 `default sources list file already exists`,先删除已存在的文件: ```bash sudo rm /etc/ros/rosdep/sources.list.d/20-default.list ``` 然后重新运行 `sudo rosdep init`。 ## 6. 设置环境变量 ```bash echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc ``` ## 7. 安装 ROS 功能包 ```bash sudo apt-get install ros-melodic-moveit sudo apt-get install ros-melodic-joint-state-publisher sudo apt-get install ros-melodic-robot-state-publisher sudo apt install ros-melodic-gazebo-ros-pkgs sudo apt-get install ros-melodic-gazebo-ros-control sudo apt-get install ros-melodic-joint-trajectory-controller sudo apt-get install ros-melodic-industrial-core ``` ## 8. 测试 ROS 内置了一些小程序,可以通过运行这些小程序以检测 ROS 环境是否可以正常运行。 ### 启动 roscore ```bash roscore ``` ### 启动小海龟仿真器 另起一个终端: ```bash rosrun turtlesim turtlesim_node ``` ### 启动键盘控制 再打开一个终端: ```bash rosrun turtlesim turtle_teleop_key ``` 将光标悬停在这个终端中,然后使用 ↑、↓、←、→ 键来控制小海龟移动: --- # ROS 使用教程 > 原文:https://open.inexbot.com/zh/08.ROS/01.ROS-1/01.%E6%96%87%E6%A1%A3/03.%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.html 本文介绍 ROS 的基本使用方法,包括创建工作空间、配置 URDF 模型、通过 MoveIt 控制机器人以及 C++ 编程实现控制。可结合视频教程 [NexDroid 与 ROS 结合-连接和使用](https://www.bilibili.com/video/BV1mJ41177Jh) 一起学习。 ## 1. 创建工作空间 ```bash mkdir -p ~/inexbot/src cd ~/inexbot/src catkin_init_workspace ``` 如果出现异常: 执行以下命令: ```bash ls -al ~/inexbot/src ``` 之后再运行工作空间初始化命令即可: ```bash catkin_init_workspace cd ../ catkin_make ``` ## 2. 配置 ~/.bashrc ```bash gedit ~/.bashrc ``` 在文件末尾添加: ```bash source ~/inexbot/devel/setup.bash ``` 将 inexbot 功能包复制到 `~/inexbot/src` 目录下。 ## 3. 配置 MoveIt ### 安装 MoveIt 新开一个终端,执行: ```bash sudo apt-get install ros-melodic-moveit source /opt/ros/melodic/setup.bash sudo apt-get install ros-melodic-moveit-resources ``` ### 启动 MoveIt Setup Assistant ```bash cd ~/inexbot source ./devel/setup.bash roslaunch moveit_setup_assistant setup_assistant.launch ``` 将 inexbot_driver 文件中的两个文件夹拷贝进来,以及生成的 moveit 文件: 将 `qj_ws/src/inexbot_support/launch` 中 `moveit_planning_execution.launch` 里所有默认的 moveit 文件夹名称改成 `qj_moveit`(moveit 文件夹的实际名称): `inexbot_support/config` 中两个 `.yaml` 文件的 joints 名称改成 URDF 中的 joints name: `qj_moveit/launch/qj_moveit_controller_manager.launch.xml` 中红框内容改成 `(find inexbot_support)/config/controllers.yaml`: 打开终端,编译并启动: ```bash cd ~/inexbot catkin_make source devel/setup.bash roslaunch inexbot_support moveit_planning_execution.launch sim:=false robot_ip:=192.168.1.13 ``` ## 4. 通过 MoveIt 控制机器人 ### 方法一:设置 Goal State 点击 **Plan** 生成规划轨迹,底部会显示计算用时 Time。 点击 **Execute** 执行,也可以点击 **Plan & Execute** 规划完立即执行。 ### 方法二:拖拽规划器 拖拽规划器前端的绿色小球,光标放在小球上时,下方出现一个三维坐标,拖拽到目标点,点击 **Plan** 产生规划轨迹,点击 **Execute** 执行,也可以点击 **Plan & Execute** 规划完立即执行。 ## 5. C++ 编程控制机器人 ### 创建功能包 ```bash cd ~/inexbot/src catkin_create_pkg inexbot_code std_msgs rospy roscpp cd ../ catkin_make ``` ### 关节空间规划示例 将以下代码保存为 `src/moveit_joint_demo.cpp`,放入 `~/inexbot/src/inexbot_code/src/`: ```cpp #include #include int main(int argc, char **argv) { ros::init(argc, argv, "moveit_joint_demo"); ros::AsyncSpinner spinner(1); spinner.start(); // manipulator 是通过 MoveIt 设置的规划组名称 moveit::planning_interface::MoveGroupInterface arm("manipulator"); // 设置关节容许误差 arm.setGoalJointTolerance(0.001); // 设置最大加速度 arm.setMaxAccelerationScalingFactor(0.2); // 设置最大速度 arm.setMaxVelocityScalingFactor(0.2); // 控制机械臂回到初始化位置(home 为 MoveIt 预设位置) arm.setNamedTarget("home"); arm.move(); sleep(1); // 设置关节空间的六个轴角度 double targetPose[6] = {0.391410, -0.676384, -0.376217, 0.0, 1.052834, 0.454125}; std::vector joint_group_positions(6); joint_group_positions[0] = targetPose[0]; joint_group_positions[1] = targetPose[1]; joint_group_positions[2] = targetPose[2]; joint_group_positions[3] = targetPose[3]; joint_group_positions[4] = targetPose[4]; joint_group_positions[5] = targetPose[5]; arm.setJointValueTarget(joint_group_positions); arm.move(); sleep(1); // 控制机械臂回到初始化位置 arm.setNamedTarget("home"); arm.move(); sleep(1); ros::shutdown(); return 0; } ``` ### 修改 CMakeLists.txt 在 `add_executable` 标签上方添加: ```cmake add_executable(moveit_joint_demo src/moveit_joint_demo.cpp) target_link_libraries(moveit_joint_demo ${catkin_LIBRARIES}) ``` ### 编译并运行 ```bash cd ~/inexbot catkin_make rosrun inexbot_code moveit_joint_demo ``` --- # ROS 与 Qt 联合使用 > 原文:https://open.inexbot.com/zh/08.ROS/01.ROS-1/01.%E6%96%87%E6%A1%A3/04.ROS%E4%B8%8EQT%E8%81%94%E5%90%88%E4%BD%BF%E7%94%A8.html 将 Qt 工程与 ROS 1 结合,使可以通过 `rosrun` 或 `roslaunch` 指令运行。核心思路是将 Qt 项目改造为 ROS 功能包,并正确配置 CMakeLists.txt。以下为完整步骤。 ### 1. 检查 g++ 版本 Qt5 需要 g++ 4.8 及以上版本: ```bash g++ --version gcc --version ``` ### 2. 创建 ROS 工作空间 ```bash source /opt/ros/noetic/setup.bash mkdir -p ~/inexbot/src cd ~/inexbot/src catkin_create_pkg Qt_test roscpp std_msgs ``` ### 3. 调整 Qt 工程结构 首先创建一个 Qt 工程,构成文件如下,其中 `libs` 是库文件 `.so` 及其包含的头文件 `.h`: Qt 工程需要略微调整结构才能作为 ROS 功能包使用,如下所示: 其中,将原工程中的 `main.cpp`、`mainwindow.cpp`、`Qt_test.pro` 文件放到 `src` 中,`mainwindow.h` 放到 `include/Qt_test` 中: ### 4. 修改 CMakeLists.txt 这是最关键的一步。需要修改功能包下的 `CMakeLists.txt` 文件,使其能够编译 Qt 项目。ROS 使用 CMake,而 Qt 通常使用 qmake,但可以通过 CMake 的 `find_package` 来定位 Qt。 ```cmake cmake_minimum_required(VERSION 3.0.2) project(Qt_test) ## 寻找 Catkin 和 ROS 包 find_package(catkin REQUIRED COMPONENTS roscpp std_msgs ) ## 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) ## 寻找 Qt5 set(Qt5_DIR "/usr/lib/x86_64-linux-gnu/cmake/Qt5") find_package(Qt5 COMPONENTS Core Widgets REQUIRED) ## Catkin 包配置 catkin_package( CATKIN_DEPENDS roscpp std_msgs ) ## 包含目录 include_directories( include /opt/ros/noetic/include ${catkin_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ) ## 设置自动处理 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 确保这行存在 ## 处理资源文件(如果有 .qrc 文件) file(GLOB RESOURCE_FILES "*.qrc") qt5_add_resources(QT_RESOURCES ${RESOURCE_FILES}) ## 源文件 set(SRC_FILES src/main.cpp src/mainwindow.cpp ) ## 头文件 set(HEADER_FILES include/Qt_test/mainwindow.h libs/include/cpp_interface/nrc_api.h libs/include/cpp_interface/nrc_interface.h ) ## 添加库路径 link_directories(${PROJECT_SOURCE_DIR}/libs) ## 创建可执行文件 add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEADER_FILES} ${QT_UI_HEADERS} ${QT_RESOURCES} ) ## 链接库 target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} Qt5::Widgets Qt5::Core nrc_host ) ## 安装可执行文件 install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) ## 安装库文件(可选) install(FILES libs/libnrc_host.so DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} ) ``` **说明:** - `qt5_add_resources`:将 `.qrc` 资源文件嵌入可执行文件; - `CMAKE_AUTOMOC`、`CMAKE_AUTORCC`、`CMAKE_AUTOUIC`:自动处理 Qt 元对象编译器、资源编译器、UI 转换; - 确保源文件路径(如 `src/main.cpp`)正确。 ### 5. 编译功能包 回到工作空间根目录进行编译: ```bash cd ~/inexbot catkin_make ``` 如果编译成功,应该能在 `~/inexbot/devel/lib/Qt_test/` 目录下找到生成的可执行文件 `Qt_test`: ### 6. 运行 ```bash ## 首先确保 roscore 已运行 roscore ## 然后运行该节点 source ~/inexbot/devel/setup.bash rosrun Qt_test Qt_test ``` ### 常见问题与提示 - **环境变量**:确保终端已经 `source /opt/ros/noetic/setup.bash` 和 `source ~/inexbot/devel/setup.bash`; - **Qt 版本**:ROS Noetic 默认基于 Ubuntu 20.04,其 Qt5 版本是 5.12,需要确保项目与该版本兼容; - **依赖**:如果项目依赖其他 ROS 包(如 rviz、tf 等),需要在 `catkin_create_pkg` 和 `find_package(catkin ...)` 中添加它们。 --- # 08.ROS/01.ROS-1/04.参考/变更日志 > 原文:https://open.inexbot.com/zh/08.ROS/01.ROS-1/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html --- # Ubuntu 22.04 安装 > 原文:https://open.inexbot.com/zh/08.ROS/02.ROS-2/01.%E6%96%87%E6%A1%A3/01.ubuntu22.04%E5%AE%89%E8%A3%85.html 本文介绍通过 VMware 安装 Ubuntu 22.04 虚拟机的完整步骤。使用清华大学开源镜像站下载镜像,安装时可省去手动换源的步骤。 ## 下载镜像 从清华大学开源镜像站下载 Ubuntu 22.04 LTS 镜像: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ ## 创建虚拟机 ### VMware 配置步骤 1. 打开 VMware,点击 **创建新的虚拟机**,开始配置虚拟机环境。 2. 选择 **自定义(高级)**,点击 **下一步**。 3. 根据 VMware 版本选择硬件兼容性,点击 **下一步**。 4. 选择 **稍后安装操作系统**,点击 **下一步**。 5. 选择 **Linux**,版本选择 **Ubuntu 64位**,点击 **下一步**。 6. 设置虚拟机名称和安装位置(建议不要放在 C 盘),点击 **下一步**。 7. 设置处理器数量和内核数量,点击 **下一步**。 8. 配置内存(建议 4GB 以上),点击 **下一步**。 9. 选择 **使用网络地址转换(NAT)**,点击 **下一步**。 10. 按默认推荐配置,点击 **下一步**。 11. 选择 **SCSI(S)**,点击 **下一步**。 12. 选择 **创建新虚拟磁盘**,点击 **下一步**。 13. 分配磁盘容量(推荐 80GB,可根据需要调整),选择 **将虚拟磁盘拆分为多个文件**,点击 **下一步**。 14. 点击 **下一步**。 15. 点击 **自定义硬件**,移除打印机(节省资源)。 16. 选择 **新 CD/DVD (SATA)**,点击 **使用 ISO 映像文件**,浏览并选择下载好的 Ubuntu 镜像文件,然后点击 **关闭**。 17. 点击 **完成**,然后点击 **开启此虚拟机**。 ## 安装 Ubuntu 22.04 ### 启动虚拟机 1. 选择 **Try or install ubuntu**,按回车。 2. 左边下拉选择 **中文(简体)**,点击 **安装 Ubuntu**。 ### 配置安装选项 1. 点击 **继续**。 2. 选择 **正常安装** 或 **最小安装**,点击 **继续**。 3. 选择 **清除整个磁盘并安装 Ubuntu**,点击 **现在安装**。 4. 点击 **继续**。 5. 点击 **继续**。 6. 设置用户名和密码,点击 **继续**,等待安装完成。 ### 初始配置 1. 重启后点击 **跳过**。 2. 后续几步根据提示点击前进,最后点击 **完成**。若弹出提示框,点击 **稍后提醒** 即可。 --- # ROS 2 安装 > 原文:https://open.inexbot.com/zh/08.ROS/02.ROS-2/01.%E6%96%87%E6%A1%A3/02.ROS-2%E5%AE%89%E8%A3%85.html 本文介绍在 Ubuntu 20.04 及以上版本中安装 ROS 2 的完整步骤,以 Ubuntu 22.04 + ROS 2 Humble 为例。 ## 准备工作 ### 检查 Ubuntu 版本 ```bash lsb_release -a ``` Ubuntu 22.04 对应 ROS 2 Humble 版本。Foxy 之后的版本才开始支持 Ubuntu 22.04,更详细的版本对应关系可参考 ROS 官方文档。 ## 方法一:手动安装 ### 1. 基础环境配置 #### 设置 locale 确保系统支持 UTF-8 编码: ```bash sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 ``` #### 配置软件源 ```bash sudo apt install software-properties-common sudo add-apt-repository universe ``` #### 添加 ROS 2 GPG key ```bash sudo apt update && sudo apt install curl gnupg2 -y sudo curl -sSL https://gitee.com/tyx6/rosdistro/raw/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg ``` #### 添加软件仓库 **官方源:** ```bash echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null ``` **清华源(推荐国内使用):** ```bash echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null ``` ### 2. 安装 ROS 2 #### 更新系统 ```bash sudo apt update sudo apt upgrade ``` #### 安装 ROS 2 ```bash sudo apt install ros-humble-desktop ``` #### 配置环境变量 ```bash echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc ``` ### 3. 验证安装 #### 测试通信功能 终端 1,启动发布者: ```bash ros2 run demo_nodes_cpp talker ``` 若正常,将显示以下信息: 终端 2,启动订阅者: ```bash ros2 run demo_nodes_py listener ``` 正常将显示以下信息: 若两个终端中均显示 `Hello World` 字符串,说明通信正常。 #### 测试小海龟仿真器 终端 1,启动海龟仿真器: ```bash ros2 run turtlesim turtlesim_node ``` 终端 2,启动键盘控制: ```bash ros2 run turtlesim turtle_teleop_key ``` 效果如下图所示: ### 4. 配置 rosdep rosdep 是 ROS 的依赖管理工具,部分功能包源码编译时需要用它安装系统依赖。 rosdep 访问的是 GitHub 国外服务器,建议将地址替换为国内镜像。 #### 安装 rosdep ```bash sudo apt install python3-rosdep ``` #### 自动修改配置(推荐) 下载并运行一键修复脚本: ```bash wget https://gitee.com/tyx6/mytools/raw/main/ros/Mrosdep.py sudo python3 Mrosdep.py ``` 注:此脚本在 rosdistro 目录下,若脚本执行失败可手动修改,方法如下。 #### 手动修改配置 需手动修改以下 4 个文件,将 `https://raw.githubusercontent.com/...` 替换为 `https://gitee.com/...`: ```bash sudo gedit /usr/lib/python3/dist-packages/rosdep2/sources_list.py # 约64行 sudo gedit /usr/lib/python3/dist-packages/rosdistro/__init__.py # 约68行 sudo gedit /usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py # 约34行 sudo gedit /usr/lib/python3/dist-packages/rosdep2/rep3.py # 约36行 ``` #### 完成初始化 ```bash sudo rosdep init rosdep update ``` 注意:若总是配置失败,可尝试方法二一键配置。 ## 方法二:一键安装 使用小鱼的一键安装脚本,可自动完成 ROS 2 安装、rosdep 配置和环境变量设置: ```bash wget http://fishros.com/install -O fishros && . fishros ``` --- # MoveIt 2 安装 > 原文:https://open.inexbot.com/zh/08.ROS/02.ROS-2/01.%E6%96%87%E6%A1%A3/03.Moveit2%E5%AE%89%E8%A3%85.html 与 ROS 1 不同,ROS 2 Humble 需要手动安装 MoveIt 2。 ## 安装步骤 ### 1. 安装 MoveIt 2 主包 ```bash sudo apt install ros-humble-moveit ``` 安装后运行无报错即成功。注意,不同 ROS 2 版本指令不同,本教程以 Humble 为例。 ### 2. 安装 MoveIt Setup Assistant ```bash sudo apt install ros-humble-moveit-setup-assistant ``` ### 3. 安装所有 MoveIt 相关包 ```bash sudo apt install ros-humble-moveit-* ``` ### 4. 启动 Setup Assistant ```bash ros2 run moveit_setup_assistant moveit_setup_assistant ``` 弹出如下界面表示安装成功。MoveIt Setup Assistant 的使用流程在 ROS 2 与 ROS 1 中基本相同,此处不再展开。 --- # 7000 通讯包使用教程 > 原文:https://open.inexbot.com/zh/08.ROS/02.ROS-2/01.%E6%96%87%E6%A1%A3/04.7000%E9%80%9A%E8%AE%AF%E5%8C%85%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.html 本文介绍 ROS 2 与 inexbot 控制器之间通过 socket 协议、7000 端口进行通讯的具体流程。 ## 1. 修改控制器配置 ROS 2 功能包依赖 7000 端口与控制器通信。使用前需通过 SSH 登录控制器,修改 `controller.json` 配置文件。 ### SSH 登录控制器 ```bash ssh inexbot@192.168.x.x # 替换为实际控制器 IP ``` 密码:`123` ### 修改文件权限 ```bash cd robot/ cd config/ sudo chmod 777 controller.json ``` ### 关闭 CRC 校验 打开 `controller.json`,在 `hostComputerService` 节点下找到 `checkCRC`,将 `true` 改为 `false`。 ## 2. 创建工作空间 ```bash mkdir -p ~/inexbot/src ``` ## 3. 编译功能包 将 `inexbot_service` 功能包放入 `~/inexbot/src`,然后编译: ```bash cd ~/inexbot/ colcon build ``` ## 4. 启动通讯节点 ### 启动 nrc_rostopic_joint(连接控制器) ```bash source install/setup.bash ros2 run inexbot_service nrc_rostopic_joint ``` 若出现终端中以下输出,则代表与控制器连接成功。不同的控制器 IP 可能不同,需要根据实际情况在 `nrc_rostopic_joint.cpp` 中修改 IP。 ### 启动 rostopic_joint(演示程序) ```bash source install/setup.bash ros2 run inexbot_service rostopic_joint ``` ## 演示程序功能说明 `rostopic_joint.cpp` 作为 Demo,旨在向客户演示 ROS 2 与 inexbot 控制器的通讯。出现 `input your number` 字样后,可以输入 1-6,不同的数字分别代表不同的功能: | 数字 | 功能 | |------|------| | 1 | 从控制器中读取 IO 信息 | | 2 | 向控制器中写入 IO 信息 | | 3 | 停止查询指令 | | 4 | 读取机器人的实际坐标 | | 5 | 控制机器人走到姿态 1 | | 6 | 控制机器人走到姿态 2 | ### 核心代码示例 ```cpp switch(s_number) { case 1: { // 读IO Json::Value rootSend; Json::FastWriter fWriter; rootSend["channel"] = 1; rootSend["stop"] = 0; rootSend["robot"] = 1; rootSend["mode"] = 1; // 0:只回复一次, 1:定时回复 rootSend["interval"] = 1000; // 1000ms回复一次 rootSend["queryType"][(unsigned int)0] = "IO"; rootSend["typeCfg"]["IO"][(unsigned int)0] = "DO1"; rootSend["typeCfg"]["IO"][1] = "DO2"; rootSend["typeCfg"]["IO"][2] = "DO3"; rootSend["typeCfg"]["IO"][3] = "DO4"; rootSend["typeCfg"]["IO"][4] = "DO5"; str = fWriter.write(rootSend); break; } case 2: { // 写IO Json::Value rootSend_1; Json::FastWriter fWriter_1; rootSend_1["IO"]["DO1"] = 1; rootSend_1["IO"]["DO2"] = 0; rootSend_1["IO"]["DO3"] = 1; rootSend_1["IO"]["DO4"] = 0; str = fWriter_1.write(rootSend_1); break; } case 3: { // 停止查询 printf("tell me channel number is ???\n"); int channel_num; scanf("%d", &channel_num); Json::Value rootSend; Json::FastWriter fWriter; rootSend["channel"] = channel_num; // 需停止的通道,最多支持9个 rootSend["stop"] = 1; str = fWriter.write(rootSend); break; } case 4: { // 读实际坐标 Json::Value rootSend; Json::FastWriter fWriter; rootSend["channel"] = 2; rootSend["stop"] = 0; rootSend["robot"] = 1; rootSend["mode"] = 1; rootSend["interval"] = 1000; rootSend["queryType"][(unsigned int)0] = "realPosMCS"; str = fWriter.write(rootSend); break; } case 5: { // 控制运动到姿态1 Json::Value rootSend; Json::FastWriter fWriter; rootSend["robot"] = 1; rootSend["clearBuffer"] = 1; rootSend["targetMode"] = 0; rootSend["cfg"]["coord"] = "MCS"; rootSend["cfg"]["speed"] = 20; rootSend["cfg"]["acc"] = 20; rootSend["cfg"]["moveMode"] = "MOVJ"; rootSend["targetPos"][0] = 530.433; rootSend["targetPos"][1] = 7.497; rootSend["targetPos"][2] = 118.728; rootSend["targetPos"][3] = 3.141593; rootSend["targetPos"][4] = 0; rootSend["targetPos"][5] = -0.1; str = fWriter.write(rootSend); break; } case 6: { // 控制运动到姿态2 Json::Value rootSend; Json::FastWriter fWriter; rootSend["robot"] = 1; rootSend["clearBuffer"] = 1; rootSend["targetMode"] = 0; rootSend["cfg"]["coord"] = "MCS"; rootSend["cfg"]["speed"] = 20; rootSend["cfg"]["acc"] = 20; rootSend["cfg"]["moveMode"] = "MOVJ"; rootSend["targetPos"][0] = 574.964434; rootSend["targetPos"][1] = -37.208582; rootSend["targetPos"][2] = 150; rootSend["targetPos"][3] = 3.141593; rootSend["targetPos"][4] = 0; rootSend["targetPos"][5] = 0.2; str = fWriter.write(rootSend); break; } default: RCLCPP_INFO(this->get_logger(), "scanf is: %d", s_number); break; } ``` ## 控制器端配置 首先,打开示教器,新建一个工程,然后打开这个工程。 插入指令,选择:**运动控制类 → 外部点** 然后将示教器切为运行模式,运行该工程。 通过监控,可以看出此时机器人在直角坐标系下的点位。 在运行 `rostopic_joint.cpp` 的终端中输入 5,此时在运行 `nrc_rostopic_joint.cpp` 的终端中会出现以下效果。 机器人开始移动,最终在直角坐标系下的点位变换成我们发给控制器的点位。注意:若没有运行,可以按下 `START` 试试。 然后在运行 `rostopic_joint.cpp` 的终端中输入 6,点击 `START`,则机器人运行到 case 6 中的点位。 --- # 08.ROS/02.ROS-2/04.参考/变更日志 > 原文:https://open.inexbot.com/zh/08.ROS/02.ROS-2/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html --- # 环境搭建 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html ## 开发环境要求 | 项目 | 要求 | |------|------| | 操作系统 | Ubuntu 20.04 LTS | | 系统架构 | x86_64 | | 编译器 | GCC 9.4.0 / GCC 4.8.2 | | 依赖库 | libpthread、librt、libdl、libm | > **实时环境要求:** 主站库运行需要实时内核支持(Xenomai 或 PREEMPT_RT)。运行主站进程通常需要 `sudo` root 权限。 ## 导入库文件 1. 将 `libNexIghEcm.a` 静态库复制到项目的 `lib` 目录 2. 将 `EcMasterApi.h` 头文件复制到项目的 `include` 目录 3. 编译时链接 `-lNexIghEcm -lm -ldl -lpthread -lrt` ## Makefile 示例 ```makefile CXX ?= g++ CFLAGS = -std=c++11 LDFLAGS = -lm -ldl -lpthread -lrt INCLUDE = -I. LIB = -L.. -lNexIghEcm OBJ += $(patsubst %.cpp, %.o, $(wildcard *.cpp)) target = test all: $(OBJ) $(CXX) *.o -o $(target) $(LIB) $(LDFLAGS) %.o: %.cpp $(CXX) $(CFLAGS) -c $< -o $@ $(INCLUDE) clean: rm -rf *.o $(target) ``` --- # 架构说明 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/01.%E6%96%87%E6%A1%A3/02.%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E.html 纳博特 EtherCAT 主站控制器主站抖动时间小于 20us。`libNexIghEcm` 库可自动生成 ENI 文件,用户只需获取 PDO 操作地址、注册周期任务即可,极大降低使用难度。 ## 功能简介 - 自动生成 ENI 配置文件 - PDO 地址自动映射 - SDO 读写接口 - 周期任务注册(每周期回调) - 从站 ID 匹配回调 ## 版本信息 | 版本 | 日期 | 说明 | |------|------|------| | 1.0.0 | 2025-03-10 | 初始版本 | ## 核心概念 - **PDO(Process Data Object):** 实时过程数据,每个周期自动交换 - **SDO(Service Data Object):** 非实时配置数据,按需读写 - **从站编号:** 从 0 开始的 EtherCAT 从站序号 - **ENI 文件:** EtherCAT 网络信息文件(ENI),描述网络拓扑和配置 --- # 核心概念 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/01.%E6%96%87%E6%A1%A3/03.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html ## 主站开发流程 1. 使能实时环境 → `enableRealtimeEnvironment()` 2. 注册日志回调 → `registerCustomeAppLog()` 3. 启动主站 → `startEcMaster()` 4. 获取从站数量和 ID → `getSlaveIDVec()` 5. 获取 PDO 地址映射 → `getPDOAddrVec()` 6. 注册周期任务回调 → `registerCustomeAppWorkpd()` 7. 进入事件循环 --- # 主站管理 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/02.%E6%8E%A5%E5%8F%A3/01.%E4%B8%BB%E7%AB%99%E7%AE%A1%E7%90%86.html ## API 列表 | 函数 | 说明 | |------|------| | `startEcMaster` | 启动 EtherCAT 主站 | | `enableRealtimeEnvironment` | 启用实时环境 | | `ECM_LogMsg` | 记录日志消息 | | `ECM_LogError` | 记录错误日志 | | `setEcatLicenseKey` | 设置主站密钥(空函数) | | `isEcatLicenseCorrect` | 获取主站密钥是否有效 | | `setLogDirName` | 设置日志输出目录 | | `setEcatLogSwitch` | 设置日志开关 | | `getCycleTime` | 获取主站实时周期 | | `getEcLibVersion` | 获取主站库版本 | | `getEniFileName` | 获取 ENI 文件名 | ### startEcMaster - **原型:** `int startEcMaster(int argc, char* argv[])` - **参数:** 第一个参数为周期时间(ms) - **返回:** 0 成功,非 0 失败 ### enableRealtimeEnvironment - **原型:** `int enableRealtimeEnvironment()` - **说明:** 启用实时环境(Xenomai / PREEMPT_RT),需在 startEcMaster 前调用 ### ECM_LogMsg / ECM_LogError - **原型:** `void ECM_LogMsg(const char* msg)` / `void ECM_LogError(const char* msg)` - **说明:** 日志和错误消息输出 ### getCycleTime - **原型:** `CycleTime getCycleTime()` - **说明:** 获取主站的实时周期时间 ### getEcLibVersion - **原型:** `const char* getEcLibVersion()` - **返回:** 库版本号字符串 --- # 从站配置 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/02.%E6%8E%A5%E5%8F%A3/02.%E4%BB%8E%E7%AB%99%E9%85%8D%E7%BD%AE.html ## API 列表 | 函数 | 说明 | |------|------| | `ecatGetConnectedSlavesNum` | 获取已连接从站数量 | | `ecatGetConfiguredSlavesNum` | 获取已配置从站数量 | | `ecatGetSlaveState` | 获取指定从站状态 | | `getSlaveIDVec` | 获取从站 ID 向量 | | `registerCustomeContrastID` | 注册从站 ID 匹配检查回调 | ### ecatGetConnectedSlavesNum - **原型:** `int ecatGetConnectedSlavesNum()` - **返回:** 已连接的从站数量 ### ecatGetSlaveState - **原型:** `EC_T_WORD ecatGetSlaveState(EC_T_DWORD ecSlaveNum)` - **参数:** ecSlaveNum 从站编号(从 0 开始) ### getSlaveIDVec - **原型:** `void getSlaveIDVec(std::vector>& vectorID)` - **输出:** 从站 ID 和 Code 的配对列表 ### registerCustomeContrastID - **原型:** `void registerCustomeContrastID(void (*callback)(EC_T_DWORD slaveNum, bool isMatched))` - **说明:** 注册回调,主站检查从站 ID 是否与预设匹配时调用 --- # 数据通信 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/02.%E6%8E%A5%E5%8F%A3/03.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1.html ## PDO 访问 | 函数 | 说明 | |------|------| | `getPDOAddrVec` | 获取 PDO 地址映射 | | `ecatSetSDO` | 设置从站 SDO 值 | | `ecatGetSDO` | 获取从站 SDO 值 | ### getPDOAddrVec - **原型:** `void getPDOAddrVec(PDOAddrVec& outPDOAddrVec, PDOAddrVec& inPDOAddrVec)` - **说明:** 获取输入和输出的 PDO 地址列表 **PDOAddrData 结构体:** ```c typedef struct { EC_T_WORD index; // PDO 索引 EC_T_WORD subIndex; // PDO 子索引 EC_T_BYTE* addrMap; // PDO 对象地址指针 } PDOAddrData; ``` ### ecatSetSDO - **原型:** `int ecatSetSDO(EC_T_DWORD slaveNum, EC_T_WORD index, EC_T_DWORD subindex, EC_T_BYTE* value, EC_T_DWORD size)` - **返回:** 0 成功 ### ecatGetSDO - **原型:** `int ecatGetSDO(EC_T_DWORD slaveNum, EC_T_WORD index, EC_T_DWORD subindex, EC_T_BYTE* value, EC_T_DWORD size, int num = 0)` ## 回调注册 | 函数 | 说明 | |------|------| | `registerCustomeAppWorkpd` | 注册每周期回调(主要任务逻辑) | | `registerCustomeEcMasterStartFinish` | 注册主站启动完成回调 | | `registerCustomeAppLog` | 注册日志回调 | ### registerCustomeAppWorkpd - **原型:** `void registerCustomeAppWorkpd(int (*callback)())` - **说明:** **最重要的回调**——每个实时周期调用一次,在此完成伺服控制和业务逻辑 --- # 09.主站库/03.示例/01.快速开始 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/03.%E7%A4%BA%E4%BE%8B/01.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html --- # 09.主站库/04.参考/变更日志 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html --- # 数据结构 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/04.%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html ## 基础类型 | 类型 | C 类型 | |------|--------| | `EC_T_BYTE` | `unsigned char` | | `EC_T_WORD` | `unsigned short` | | `EC_T_DWORD` | `unsigned int` | | `EC_T_SBYTE` | `signed char` | | `EC_T_SWORD` | `signed short` | | `EC_T_SDWORD` | `signed int` | | `EC_T_REAL` | `double` | ## PDOAddrData ```c typedef struct { EC_T_WORD index; // PDO 索引 EC_T_WORD subIndex; // PDO 子索引 EC_T_BYTE* addrMap; // PDO 对象地址指针 } PDOAddrData; ``` --- # 错误码表 > 原文:https://open.inexbot.com/zh/09.%E4%B8%BB%E7%AB%99%E5%BA%93/04.%E5%8F%82%E8%80%83/%E9%94%99%E8%AF%AF%E7%A0%81%E8%A1%A8.html | 错误码 | 含义 | |--------|------| | 0 | 无错误 | | 1 | 总线忙 | | 2 | 总线被占用 | | 3 | 总线错误 | | 4 | 设备访问超时 | | 5 | IO 设备无法访问 | | 6 | 参数不合法 | | 7 | 文件加载错误 | | 8 | 动态库加载错误 | | 9 | EtherCAT 主机请求错误 | | 10 | 获取从站数量出错 | | 11 | 获取从站失败 | | 12 | XML 文件打开失败 | | 13 | XML 解析失败 | | 14 | 从站配置初始化失败 | | 15 | 创建 EtherCAT 域失败 | | 16 | 配置从站出错 | | 17-18 | 配置 PDO 出错 | | 19 | 选择参考时钟出错 | | 20 | 配置 Sync0 出错 | | 21 | 主机激活失败 | | 22-23 | 域数据/大小错误 | | 24 | 获取 PDO 出错 | --- # 环境搭建 > 原文:https://open.inexbot.com/zh/10.HAL/01.%E6%96%87%E6%A1%A3/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html ## 环境要求 | 项目 | 要求 | |------|------| | 操作系统 | Ubuntu 20.04 LTS | | 系统架构 | x86_64 | | 编译器 | GCC 9.4.0 / GCC 4.8.2 | | 依赖库 | libpthread、librt、libdl、libm | ## 导入库文件 1. 将 `libhal_sdk.a` 静态库复制到项目的 `lib` 目录 2. 将 `include` 文件夹下的头文件复制到项目的 `include` 目录 3. 编译时链接 `libhal_sdk.a` --- # 架构说明 > 原文:https://open.inexbot.com/zh/10.HAL/01.%E6%96%87%E6%A1%A3/02.%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E.html `libhal_sdk` 为纳博特系统硬件抽象层(HAL),统一了底层硬件接口,方便用户跨硬件平台开发。 ## 功能简介 - 统一的设备管理框架(DeviceManager 单例) - 设备类型抽象:DigitalIO、AnalogIO、CAN、PWM、Encoder、UART、UPS - 设备热插拔支持(add/remove device) - 类型安全的设备查询与访问 ## 设备类型 | 枚举值 | 说明 | |--------|------| | `DIGITAL_IO_` | 数字输入输出 | | `ANALOG_IO_` | 模拟输入输出 | | `CAN_DEVICE_` | CAN 总线 | | `PWM_DEVICE_` | 脉宽调制 | | `ENCODER_DEVICE_` | 编码器 | | `UPS_DEVICE_` | 不间断电源 | | `SERIAL_DEVICE_` | 串口设备 | | `CUSTOM_` | 自定义设备 | ## 类层次 ```text Device (抽象基类) ├── DigitalIO ├── AnalogIO ├── CANDevice ├── EncoderDevice ├── PwmDevice ├── UpsDevice ├── SerialDevice └── ... (自定义设备) DeviceManager (单例管理器) └── devices_ (管理所有设备) ``` ## 版本信息 | 版本 | 日期 | 说明 | |------|------|------| | 1.0.0 | 2025-03-10 | 初始版本 | --- # 核心概念 > 原文:https://open.inexbot.com/zh/10.HAL/01.%E6%96%87%E6%A1%A3/03.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.html ## 使用流程 1. 获取 DeviceManager 单例:`hal::DeviceManager::instance()` 2. 查询可用设备:`get_all_device_name_list()` / `get_device_name_list(type)` 3. 获取具体设备:`get_device(type, name)` 4. 转换为具体类型指针:`std::dynamic_pointer_cast(dev)` 5. 执行设备操作:`set_output()` / `get_input()` 等 ## 设备抽象基类 所有设备继承自 `Device` 基类,提供: - `valid()` — 设备是否可用 - `get_device_type()` — 设备类型 - `get_device_name()` — 设备名称 --- # 系统初始化 > 原文:https://open.inexbot.com/zh/10.HAL/02.%E6%8E%A5%E5%8F%A3/01.%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96.html ## DeviceManager 类 设备管理器单例,管理所有硬件设备的生命周期。 ### instance - **原型:** `static DeviceManager& instance()` - **返回:** 单例引用 ### add_device - **原型:** `int add_device(std::shared_ptr device)` - **返回:** 0 成功 ### remove_device - **原型:** `int remove_device(DeviceType device_type, const std::string& device_name)` ### is_device_exist - **原型:** `bool is_device_exist(DeviceType device_type, const std::string& device_name) const` ### get_device - **原型:** `std::shared_ptr get_device(DeviceType device_type, const std::string& device_name) const` ### get_all_device_name_list / get_device_name_list / get_device_list 按类型查询设备名称或实例列表。 --- # 线程与定时器 > 原文:https://open.inexbot.com/zh/10.HAL/02.%E6%8E%A5%E5%8F%A3/02.%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%AE%9A%E6%97%B6%E5%99%A8.html HAL 层的线程和定时器功能由具体设备驱动实现。控制逻辑应在 `registerCustomeAppWorkpd` 回调中每周期执行。 ## Device 基类 所有设备的抽象基类: ```cpp class Device { public: Device(DeviceType device_type, const std::string& device_name); virtual ~Device() = default; bool valid() const; DeviceType get_device_type() const; std::string get_device_name() const; }; ``` ### 成员函数 | 函数 | 说明 | |------|------| | `valid()` | 设备是否有效 | | `get_device_type()` | 获取设备类型 | | `get_device_name()` | 获取设备名称 | --- # 网络通信 > 原文:https://open.inexbot.com/zh/10.HAL/02.%E6%8E%A5%E5%8F%A3/03.%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1.html ## CAN 设备 ### CANDevice 类 - **open(channel) / close(channel):** 打开/关闭 CAN 通道 - **set_parameters(channel, baudrate):** 设置波特率 - **send(channel, id, data, len):** 发送 CAN 帧 - **receive(channel, id, data):** 接收 CAN 帧 ## 串口设备 ### SerialDevice 类 - **open / close:** 打开/关闭串口 - **set_parameters(baudrate, databits, stopbits, parity):** 配置串口参数 - **send / receive:** 收发数据 ## 数字 IO ### DigitalIO 类 - `set_output(channel, value)` — 设置单个数字输出 - `get_input(channel)` — 读取单个数字输入 - `get_channel_count()` — 获取通道数 ## 模拟 IO ### AnalogIO 类 - `set_output(channel, value)` — 设置模拟输出 - `get_input(channel)` — 读取模拟输入 - `get_range(channel)` — 获取量程范围 - `get_channel_count()` — 获取通道数 --- # 文件与日志 > 原文:https://open.inexbot.com/zh/10.HAL/02.%E6%8E%A5%E5%8F%A3/04.%E6%96%87%E4%BB%B6%E4%B8%8E%E6%97%A5%E5%BF%97.html HAL 层的日志功能通过设备管理器回调实现。 ## PWM 设备 ### PwmDevice 类 - **set_duty(channel, duty):** 设置占空比 - **set_frequency(channel, frequency):** 设置频率 - **enable(channel) / disable(channel):** 使能/禁用 ## 编码器设备 ### EncoderDevice 类 - **get_position(channel):** 读取编码器位置 - **reset(channel):** 复位编码器 ## UPS 设备 ### UpsDevice 类 - **get_status():** 获取 UPS 状态 - **get_battery_level():** 获取电池电量 --- # 快速开始 > 原文:https://open.inexbot.com/zh/10.HAL/03.%E7%A4%BA%E4%BE%8B/01.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html ```cpp #include #include #include int main() { auto& manager = hal::DeviceManager::instance(); // 查询所有设备 auto devices = manager.get_all_device_name_list(); std::cout << "设备列表:" << std::endl; for (auto& name : devices) std::cout << " - " << name << std::endl; // 获取数字 IO 设备 if (auto dev = manager.get_device(hal::DeviceType::DIGITAL_IO_, "DIO_1")) { auto dio = std::dynamic_pointer_cast(dev); dio->set_output(2, true); // 通道3 输出高电平 std::cout << "DIO_1 ch3 input: " << dio->get_input(3) << std::endl; } return 0; } ``` --- # 10.HAL/04.参考/变更日志 > 原文:https://open.inexbot.com/zh/10.HAL/04.%E5%8F%82%E8%80%83/%E5%8F%98%E6%9B%B4%E6%97%A5%E5%BF%97.html --- # 数据结构 > 原文:https://open.inexbot.com/zh/10.HAL/04.%E5%8F%82%E8%80%83/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html ## DeviceType 枚举 ```cpp enum class DeviceType { NULL_, // 空设备 ANALOG_IO_, // 模拟输入输出 CAN_DEVICE_, // CAN 总线 DIGITAL_IO_, // 数字输入输出 ENCODER_DEVICE_, // 编码器 PWM_DEVICE_, // 脉宽调制 SERIAL_DEVICE_, // 串口 UPS_DEVICE_, // 不间断电源 CUSTOM_ // 自定义 }; ``` --- # 10.HAL/04.参考/错误码表 > 原文:https://open.inexbot.com/zh/10.HAL/04.%E5%8F%82%E8%80%83/%E9%94%99%E8%AF%AF%E7%A0%81%E8%A1%A8.html --- # 常见问题 > 原文:https://open.inexbot.com/zh/11.%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98.html 本文档收录了 SDK 开发和协议集成中最常见的问题。每个问题包含 **症状**、**原因**、**检查步骤** 和 **解决方法**。 --- ## 1. 连接失败 / IP 不通 **症状:** `connect_robot` 返回 `<= 0`,或连接超时无响应。 **可能原因:** - 控制器 IP 地址配置错误 - PC 与控制器不在同一网段 - 防火墙或安全软件拦截 - 控制器未上电或系统未启动完毕 - 网线物理断开 **检查步骤:** 1. 在 PC 上 ping 控制器 IP,确认网络可达: ```bash ping 192.168.1.16 ``` 如果不通,检查网线、IP 地址和子网掩码 2. 在示教器上查看「系统信息」确认控制器 IP 3. 确认端口未被防火墙拦截(临时关闭防火墙测试) 4. 如果使用 WiFi,改为有线直连排查 **解决方法:** 保证网络连通后重试。若 IP 正确但始终不通,请联系技术支持。 --- ## 2. 端口区别:5000 / 6000 / 6001 / 7000 | 端口 | 用途 | 协议格式 | 一般使用者 | |------|------|---------|-----------| | `5000` | 文件传输(上传/下载/备份) | TCP | 工具、HTTP 客户端 | | `6000` | JSON 文本命令通信 | JSON 文本 | 示教器 | | `6001` | JSON 文本命令通信 | JSON 文本 | 上位机、C++/C#/Python SDK | | `7000` | 上位机服务功能端口 | TCP | 上位机、工具 | > **关键区别:** 四个端口两个版本通用。SDK 用户统一使用 **6001** 即可;JSON 协议用户根据场景选择 **6000**(示教器)或 **6001**(上位机)。 --- ## 3. SDK 与控制器版本不兼容 **症状:** 连接成功但 API 调用返回错误,或部分功能异常。 **可能原因:** - SDK 版本太新,控制器固件版本过旧 - 不同 RTL 版本的 SDK 混用 **检查步骤:** 1. 确认 SDK 版本号(查看下载包的文件名或 README) 2. 在示教器上查看控制器固件和 RTL 版本 3. 对照[下载页的兼容矩阵](./12.相关下载.md#控制器固件与-SDK-兼容矩阵)确认匹配关系 **解决方法:** 下载与控制器固件版本匹配的 SDK。版本信息不明确时,联系技术支持并提供控制器型号和固件版本。 --- ## 4. `_nrc_host.so` 或 DLL 无法加载 **症状:** C++ 报 `无法定位程序输入点`;C# 报 `DllNotFoundException`;Python 报 `ImportError: No module named _nrc_host`。 **可能原因:** - 本地库文件未放在正确目录 - 库文件架构不匹配(x86 vs x64) - 库文件与 SDK 包版本不一致 - 缺少运行时依赖(Linux 缺少 `libstdc++` 等;Windows 缺少 VC++ Redistributable) **检查步骤:** 1. **Python:** 确认 `_nrc_host.so`(Linux)或对应的本地库文件与 `nrc_interface.py` 在同一目录 2. **C++:** 确认 `nrc_host.dll` 在可执行文件目录或系统 PATH 中 3. **C#:** 确认 `nrc_host.dll` 的"复制到输出目录"属性已设置 4. 用 `ldd`(Linux)或 Dependency Walker(Windows)检查缺失的依赖库 **解决方法:** 将对应平台和架构的本地库放在正确目录。Windows 还需安装 Visual C++ Redistributable。 --- ## 5. Python 版本不匹配 **症状:** `ImportError: bad magic number` 或 `undefined symbol` 错误。 **可能原因:** Python SDK 是为特定 Python 小版本编译的,不同版本(如 3.6 vs 3.10)的 C 扩展二进制不兼容。 **检查步骤:** ```bash python3 --version # 查看 Python 版本 file _nrc_host.so # 查看编译架构(Linux) ``` **解决方法:** 下载与你的 Python 版本严格匹配的 SDK 包。32 位 Python 需要 32 位 SDK,64 位 Python 需要 64 位 SDK。 --- ## 6. MinGW 与 MSVC 库混用 **症状:** 链接时报 `undefined reference` 或 `unresolved external symbol`,即使库路径正确。 **可能原因:** MinGW 编译的库与 MSVC 编译的库 ABI 不兼容,无法交叉链接。 **检查步骤:** 1. 确认你使用的编译器:Qt Creator 中查看编译套件(MinGW 64-bit / MSVC) 2. 确认 SDK 包名称:`win_mingw64` → MinGW;`win_msvc2017_x64` → MSVC **解决方法:** - MinGW 用户:使用 `win_mingw64` 包,链接时用 `-lnrc_host`(自动找 `libnrc_host.dll.a`) - MSVC 用户:使用 `win_msvc2017_x64` 包,链接 `nrc_host.lib` --- ## 7. x86/x64、Debug/Release 不匹配 **症状:** 加载 DLL 时报 `0xC000007B` 错误(Windows),或链接时报架构不匹配。 **可能原因:** - 32 位程序加载 64 位 DLL - Debug 配置链接 Release 库(或反过来) **检查步骤:** 1. Windows:确认项目平台目标为 **x64**(非 x86/Any CPU) 2. 确认库的 Debug/Release 版本与项目的构建配置一致 3. Visual Studio:**生成 → 配置管理器** 中查看活动解决方案平台 **解决方法:** 统一使用 **x64 + Release** 组合。如须调试,使用对应版本的 Debug 库。 --- ## 8. 连接成功但机器人不能运动 **症状:** `connect_robot` 成功,但运动指令发送后机器人无反应。 **可能原因(按可能性排序):** 1. 伺服未使能(最常见) 2. 急停按钮被按下 3. 运动队列未启动(未调用 `queue_motion_set_status(socketFd, True)`) 4. 机器人处于错误状态(查看示教器错误信息) 5. 速度参数为 0 6. 目标位置超出工作空间 **检查步骤:** 1. 在示教器上查看伺服状态(是否已使能) 2. 检查急停按钮是否释放 3. 确认代码中调用了 `queue_motion_set_status(socketFd, True)` 4. 读取机器人状态查看是否有错误码 **解决方法:** 先通过示教器手动使能伺服,确认急停已释放,再执行运动指令。 --- ## 9. 如何读取错误码和注册错误回调 ### Python:注册错误/警告消息回调 使用 `set_receive_error_or_warnning_message_callback` 注册回调函数,控制器发生错误或警告时会自动调用: ```python import nrc_interface import time def my_callback(message_type: int, message: str, message_code: int): print(f"[回调] 类型={message_type}, 信息={message}, 代码={message_code}") socketFd = nrc_interface.connect_robot("192.168.1.13", "6001") result = nrc_interface.get_connection_status(socketFd) print(result) nrc_interface.set_receive_error_or_warnning_message_callback(socketFd, my_callback) time.sleep(1000) # 保持连接以接收回调 ``` ### C#:注册消息接收回调 ```csharp using System; using System.Runtime.InteropServices; public delegate void RecvMsgCallbackDelegate(int cmd, IntPtr message); private RecvMsgCallbackDelegate recvMsgbackDelegate; public void RecvMsgCallback(int messageType, IntPtr messagePtr) { string msg = Marshal.PtrToStringAnsi(messagePtr); Console.WriteLine($"[回调] 类型={messageType}, 信息={msg}"); } // 注册回调 recvMsgbackDelegate = new RecvMsgCallbackDelegate(RecvMsgCallback); IntPtr recvCallbackPtr = Marshal.GetFunctionPointerForDelegate(recvMsgbackDelegate); var recvMsgCallback = new SWIGTYPE_p_f_int_p_q_const__char__void(recvCallbackPtr, true); nrc_interface.recv_message(fd, recvMsgCallback); ``` > C++ 错误回调 API 以实际 SDK 接口文档为准。更多回调示例请参考 [C# 连接示例](./04.上位机/02.CSharp/03.示例/01.快速开始.md) 和 [Python 接口示例](./04.上位机/03.Python/03.示例/02.基础应用/01.设置接收到错误消息时的回调.md)。 --- ## 10. 多机器人报错 5410(外部轴超限) **症状:** 添加第二个机器人后,第一个机器人或第二个机器人报错误码 5410,提示"外部轴超限"。之前单个机器人运行时正常。 **可能原因:** 误启用了**双机同步模式**,该模式会将第二个机器人视为第一个机器人的外部轴。当第二个机器人未配置参数或超出限位时,即报外部轴超限。 **检查步骤:** 1. 确认是否配置为双机同步:检查系统设置中是否启用了"双机同步"或"协同模式" 2. 检查各机器人是否独立配置:确认每个机器人的 DH 参数、关节限位等均已单独配置 3. 确认上电顺序:运行模式下应先切换到多机模式再依次上电 **解决方法:** - 如果不需要双机同步:关闭双机同步模式,为每个机器人独立配置 - 如果需要双机同步:确认第二个机器人的所有参数(DH、限位、减速比等)已正确设置 > **提示:** 示教模式下只能为当前选中的单个机器人上电;需要在运行模式下切换到多机模式才能同时控制多台机器人。 --- ## 11. 如何提交有效的技术支持信息 当需要联系技术支持时,建议同时提供以下信息以便快速定位问题: 1. **控制器信息:** 型号、固件版本、RTL 版本(在示教器"系统信息"中查看) 2. **SDK 信息:** 使用的 SDK 语言、版本号、下载来源 3. **开发环境:** 操作系统和版本、编译器版本(如 Visual Studio 2022 / GCC 9.3)、Python 版本 4. **错误描述:** 完整的错误信息或错误码、复现步骤、是否必现 5. **代码片段:** 出问题的关键代码(简化后仍能复现问题的最小代码) 6. **网络拓扑:** PC 与控制器的连接方式(直连/交换机)、IP 地址 **联系方式:** sales@inexbot.com --- # 相关下载 > 原文:https://open.inexbot.com/zh/12.%E7%9B%B8%E5%85%B3%E4%B8%8B%E8%BD%BD.html > **提示:** 以下 SDK 版本需与控制器固件版本匹配,具体兼容关系参见下方的[兼容矩阵](#控制器固件与-SDK-兼容矩阵)。下载前请确认你的控制器型号和 RTL 版本。 --- ## C++ SDK | 平台 | 架构 | 编译器 | 配置 | 版本 | 下载 | | ------- | ----- | -------------------------- | ------- | ---------- | -------- | | Windows | x64 | MSVC (Visual Studio 2019+) | Release | 待研发确认 | 百度网盘 | | Windows | x64 | MSVC (Visual Studio 2019+) | Debug | 待研发确认 | 百度网盘 | | Windows | x64 | MinGW (GCC 8.3+) | Release | 待研发确认 | 百度网盘 | | Linux | x64 | GCC (8.3+) | Release | 待研发确认 | 百度网盘 | | Linux | ARM64 | GCC (8.3+) | Release | 待研发确认 | 百度网盘 | > **说明:** C++ SDK 分为动态库(.dll/.so)和静态库(.lib/.a)两种形式。Release 配置用于生产环境,Debug 配置包含调试符号。MinGW 版本使用 POSIX 线程模型,MSVC 版本使用原生 Windows 线程模型。 参考[版本与兼容性](./版本与兼容性.md)了解详细的控制器型号、RTL 版本、端口关系。 **快速开始:** [C++ 渐入式教程](./04.上位机/01.C++/01.文档/index.md) --- ## C# SDK | 平台 | 架构 | .NET 版本 | 版本 | 本地库要求 | 下载 | | ------- | ---- | --------------- | ---------- | --------------------------- | -------- | | Windows | x64 | .NET 待研发确认 | 待研发确认 | 依赖 C++ SDK 本地库(.dll) | 百度网盘 | > **说明:** C# SDK 是对 C++ SDK 的封装,使用时需将对应平台的 C++ 本地库(.dll)放置在可执行文件目录或系统 PATH 中。.NET Framework 与 .NET Core/.NET 5+ 的加载方式略有差异。 **快速开始:** [C# 渐入式教程](./04.上位机/02.CSharp/01.文档/01.环境搭建.md) --- ## Python SDK | 平台 | 架构 | Python 版本 | SDK 版本 | 本地库 | 下载 | | ----- | ---- | ----------- | ---------- | -------------- | -------- | | Linux | x64 | 待研发确认 | 待研发确认 | `_nrc_host.so` | 百度网盘 | > **说明:** > > - Python SDK 通过 C 扩展调用本地库实现控制器通信。 > - 本地库必须与 Python 版本和架构严格匹配,混用会导致 `ImportError` 或段错误。 > - 安装方式:将 SDK 包解压后,确保 `nrc_host.py` 和对应本地库在同一目录,或在 Python 路径中引用。 **快速开始:** [Python 渐入式教程](./04.上位机/03.Python/01.文档/index.md) --- ## 控制器固件与 SDK 兼容矩阵 | 控制器型号 | RTL 版本 | 端口 | C++ SDK | C# SDK | Python SDK | JSON 协议 | | ---------- | --------- | ----------- | ---------- | ---------- | ---------- | ------------------------------------------------------ | | 待研发确认 | RTL-22.07 | 6000 / 7000 | 待研发确认 | 待研发确认 | 待研发确认 | [RTL-22.07 文档](./05.JSON-协议/01.RTL-22.07/index.md) | | 待研发确认 | RTL-24.03 | 5000 / 7000 | 待研发确认 | 待研发确认 | 待研发确认 | [RTL-24.03 文档](./05.JSON-协议/02.RTL-24.03/index.md) | > **版本选择建议:** > > - **RTL-22.07** — 早期稳定版本,保有量大。仅重大 bug 修复,不再合入新功能。 > - **RTL-24.03** — 当前主流出货版本。bug 修复 + 关键功能合入。 > > 如果无法确认控制器型号或 RTL 版本,请在示教器上查看"系统信息"或联系技术支持。 --- ## 百度网盘 以上所有 SDK 包统一托管在百度网盘: [进入下载](https://pan.baidu.com/s/1p8xEYpZ0ng37OlJla395DQ?pwd=8888) 提取码:8888 网盘目录说明: | 目录 | 内容 | | ----------- | ------------------------- | | `C++/` | C++ SDK 各平台/编译器版本 | | `C#/` | C# SDK 各 .NET 版本 | | `Python/` | Python SDK 各版本 | | `Firmware/` | 控制器固件升级包 | | `Tools/` | 开发工具和文档 | --- ## 下载支持 - **下载失败:** 百度网盘下载受限时,可联系技术支持获取替代下载方式 - **版本疑问:** 不确定应该下载哪个包?请先查阅[入门指南](./02.入门指南.md)确定你的开发方式,再对照上表选择对应版本 - **技术支持:** 发送邮件至 sales@inexbot.com,请说明控制器型号和所需 SDK 语言 --- # Agent 开发指引 > 原文:https://open.inexbot.com/zh/13.Agent%20%E5%BC%80%E5%8F%91%E6%8C%87%E5%BC%95.html 本页面向使用 AI 助手(Agent)辅助二次开发的开发者:无论你是自己写代码,还是把想法交给 AI 助手生成代码,都建议先读本页。**默认开发方式为上位机 SDK**;只有在明确不满足时才引导到其它开发方式(见第 6 节)。 ::: tip 机器可读入口 - 文档索引(llms.txt): - 全量文档(llms-full.txt): - 单页 Markdown:把页面 URL 中的 .html 换成 .md 即为该页纯文本版本 ::: ## 1. 一分钟选型 | 你的情况 | 用什么 | 入口 | | --- | --- | --- | | 在 PC 上写程序控制机器人(默认,绝大多数场景) | **上位机 SDK**(C++ / C# / Python) | [上位机开发](./04.上位机/index.md) | | 上位机满足不了:需要定制控制器内部行为 | 控制器二次开发 | [控制器开发指南](./06.控制器/index.md) | | 上位机满足不了:需要定制示教器界面 | 示教器二次开发 | [示教器开发指南](./07.示教器/index.md) | | 上位机满足不了:不用 SDK 库、任意语言直连 | JSON 协议 | [JSON 协议](./05.JSON-协议/index.md) | | 客户明确要求 ROS 集成 | ROS 开发 | [ROS 集成指南](./08.ROS/index.md) | | 客户明确要求 EtherCAT 主站 / 硬件抽象层 | 主站库 / HAL | [主站库](./09.主站库/index.md) · [HAL 文档](./10.HAL/01.文档/index.md) | 除第一行外,其余均为**进阶通道**:仅当上位机 SDK 无法满足需求、或客户明确提出时,才引导到对应方式。 ## 2. 推荐生成流程(让 AI 助手按此顺序产出) 1. **选环境** — 按目标平台选一套环境搭建教程(MinGW / MSVC / Linux),先把 SDK 库和头文件放好:[MinGW + Qt](./04.上位机/01.C++/01.文档/01.环境搭建/01.MinGW%20环境.md) · [MSVC + Visual Studio](./04.上位机/01.C++/01.文档/01.环境搭建/02.MSVC%20环境.md) · [Linux + GCC](./04.上位机/01.C++/01.文档/01.环境搭建/03.Linux%20环境.md) 2. **以「快速开始」为骨架** — [C++ 快速开始](./04.上位机/01.C++/03.示例/01.快速开始.md)(连接 → 等待就绪 → 读版本 → 读位置 → 断开),先跑通最小闭环再加功能。 3. **按任务补接口与示例** — 用第 3 节的任务索引找到对应接口页与示例页。 4. **编译与自检** — 按[编译与验证指南](./14.编译与验证指南.md)做语法检查、编译链接、无硬件自检;接入控制器后再联调。 5. **收尾** — 程序退出前调用 `disconnect_robot` 断开连接。 ::: warning 涉及运动的代码 运动类示例会让机器人真实运动。生成或运行前请确认工作空间安全、急停可用,并先核对目标点位。 ::: ## 3. 任务 → 文档索引(默认上位机) | 我要做什么 | 先看接口页 | 再看示例 | | --- | --- | --- | | 连接 / 断开控制器、查询连接状态 | [基础连接与系统接口](./04.上位机/01.C++/02.接口/01.基础连接与系统接口.md)(`connect_robot`、`get_connection_status`、`disconnect_robot`) | [快速开始](./04.上位机/01.C++/03.示例/01.快速开始.md) · [5. 断开连接](./04.上位机/01.C++/03.示例/02.基础应用/05.断开连接.md) | | 读取当前位置(关节 / 直角 / 工具 / 用户坐标) | 同上(`get_current_position`) | [1. 获取不同坐标系的位置](./04.上位机/01.C++/03.示例/02.基础应用/01.获取不同坐标系的位置.md) | | 伺服上电 / 清错 / 状态查询 | 同上(`clear_error`、`get_servo_state`) | [2. 上电流程](./04.上位机/01.C++/03.示例/02.基础应用/02.上电流程.md) · [3. 伺服状态检测](./04.上位机/01.C++/03.示例/02.基础应用/03.伺服状态检测.md) | | 点位 / 直线等运动指令 | 同上(`robot_movej`、`robot_movel`) | [4. 直接运动指令](./04.上位机/01.C++/03.示例/02.基础应用/04.直接运动指令.md) | | 实时轨迹跟踪(servo_move) | 同上 | [使用 servo_move() 来进行跟踪运动](./04.上位机/01.C++/03.示例/03.进阶应用/01.使用-servo_move%28%29-来进行跟踪运动.md) | | 关节空间伺服(servoJ) | 同上 | [使用 servoJ 进行关节控制](./04.上位机/01.C++/03.示例/03.进阶应用/03.使用servoJ进行关节控制.md) | | 伺服位置控制(逐周期下发点位) | 同上 | [使用 star_servo_point_position_motion_control() 进行伺服控制](./04.上位机/01.C++/03.示例/03.进阶应用/02.使用-star_servo_point_position_motion_control%28%29-来进行伺服控制运动.md) | | 队列运动 / 连续轨迹 | [队列运动模式](./04.上位机/01.C++/02.接口/08.队列运动模式.md)(`queue_motion_set_status`) | [6. 运动队列的曲线运动](./04.上位机/01.C++/03.示例/02.基础应用/06.运动队列的曲线运动.md) | | 作业文件(新建 / 指令 / 执行) | [作业文件操作](./04.上位机/01.C++/02.接口/07.作业文件操作.md) | [7. 新建并执行作业文件](./04.上位机/01.C++/03.示例/02.基础应用/07.新建并执行作业文件.md) | | 文件上传 / 下载 | [基础连接与系统接口](./04.上位机/01.C++/02.接口/01.基础连接与系统接口.md) | [11. 上传下载文件](./04.上位机/01.C++/03.示例/02.基础应用/11.上传下载文件.md) | | 错误消息回调 | 同上(`set_receive_error_or_warnning_message_callback`) | [常见问题](./11.常见问题.md)(第 9 条) | | IO 控制 | [IO 控制](./04.上位机/01.C++/02.接口/02.IO控制.md) | — | | Modbus 通讯 | [Modbus 通讯](./04.上位机/01.C++/02.接口/03.Modbus通讯.md) | — | | 工具手标定 | [基础连接与系统接口](./04.上位机/01.C++/02.接口/01.基础连接与系统接口.md) | [13.工具手标定](./04.上位机/01.C++/03.示例/02.基础应用/13.工具手标定.md) | | 轨迹记录与回放 / 示教模式 | [轨迹记录与回放](./04.上位机/01.C++/02.接口/04.轨迹记录与回放.md) | [12.示教模式类型切换与轨迹回放功能](./04.上位机/01.C++/03.示例/02.基础应用/12.示教模式类型切换与轨迹回放功能.md) | | 双臂机器人 | [双臂机器人](./04.上位机/01.C++/02.接口/05.双臂机器人.md) | [9. 追加队列模式(单机器人)](./04.上位机/01.C++/03.示例/02.基础应用/09.追加队列模式(单机器人).md) · [10. 追加队列模式(双机器人)](./04.上位机/01.C++/03.示例/02.基础应用/10.追加队列模式(双机器人).md) | | 焊接 / 码垛 / 视觉 / 激光 / 传送带工艺 | [焊接工艺](./04.上位机/01.C++/02.接口/09.焊接工艺.md) · [码垛工艺](./04.上位机/01.C++/02.接口/10.码垛工艺.md) · [视觉工艺](./04.上位机/01.C++/02.接口/11.视觉工艺.md) · [激光切割工艺](./04.上位机/01.C++/02.接口/12.激光切割工艺.md) · [传送带跟踪工艺](./04.上位机/01.C++/02.接口/13.传送带跟踪工艺.md) | — | | C# 开发 | [C# API 参考](./04.上位机/02.CSharp/02.接口/index.md) | [C# 连接示例](./04.上位机/02.CSharp/03.示例/01.快速开始.md) | | Python 开发 | [Python API 参考](./04.上位机/03.Python/02.接口/index.md) | [Python 快速开始](./04.上位机/03.Python/03.示例/01.快速开始.md) | > 表中函数名可在对应接口页与 SDK 头文件中核对;接口参数以接口页为准。 ## 4. 最小连接骨架与避坑速查 所有上位机程序都从这段骨架开始(完整可用版本见[快速开始](./04.上位机/01.C++/03.示例/01.快速开始.md)): ```cpp SOCKETFD fd = connect_robot("<控制器 IP>", "6001"); // 连接(上位机 SDK 使用 6001 端口) if (fd <= 0) { /* 连接失败处理 */ } while (get_connection_status(fd) != 0) { /* 等待连接就绪 */ } /* 业务代码 */ disconnect_robot(fd); // 退出前断开 ``` 常见坑(详见[常见问题](./11.常见问题.md)): - **版本要匹配**:SDK 版本必须与控制器固件版本对应,见[版本与兼容性](./版本与兼容性.md)与[相关下载](./12.相关下载.md)。 - **编译器不能混用**:MinGW 与 MSVC 的库 ABI 不兼容,下载 SDK 与编译环境必须一致,且统一 x64。 - **端口**:上位机 SDK 统一连 6001;JSON 协议按场景选择 6000(示教器)或 6001(上位机)。 - **机器人不动先查三件事**:伺服是否使能、急停是否释放、队列模式是否已启动(`queue_motion_set_status`)。 - **库加载失败**:Windows 确认动态库与可执行文件同目录;Linux 设置 LD_LIBRARY_PATH。 ## 5. 无硬件时怎么验证 生成完代码不一定马上有控制器可连,可按[编译与验证指南](./14.编译与验证指南.md)做三级验证: 1. **语法检查** — 头文件、类型、语法错误(最快)。 2. **编译 + 链接** — 检查库文件、ABI、x86/x64 是否匹配。 3. **运行自检** — 直接运行程序:能正常启动并走到「连接失败」提示,说明可执行文件与 SDK 库加载正常;接入控制器后即可完成真实联调。 仿真验证的接入方式见《编译与验证指南》相关章节(待补充)。 ## 6. 其它开发方式(进阶通道) **只有在上位机 SDK 无法满足需求,或客户明确提出时**,才引导到以下方式: | 方式 | 适用情况 | 入口 | | --- | --- | --- | | 控制器二次开发 | 需要定制或替换控制器内部算法与流程(Linux + C++) | [控制器开发指南](./06.控制器/index.md) | | 示教器二次开发 | 需要定制示教器界面(Qt + C++) | [示教器开发指南](./07.示教器/index.md) | | JSON 协议 | 不使用 SDK 库,任意语言通过 TCP 与控制器通信 | [JSON 协议](./05.JSON-协议/index.md) | | ROS 集成 | 需要接入 ROS 生态 | [ROS 集成指南](./08.ROS/index.md) | | 主站库 / HAL | EtherCAT 主站或硬件抽象层开发 | [主站库](./09.主站库/index.md) · [HAL 文档](./10.HAL/01.文档/index.md) | --- ## 给 AI 助手的说明 - 生成代码时默认使用**上位机 SDK**(C++ / C# / Python),先阅读对应「快速开始」与第 3 节任务索引。 - 涉及运动的代码必须保留安全提示,并提醒用户核对目标点位与急停状态。 - 所有接口名以站内接口页为准(本文中的函数名可在对应接口页与 SDK 头文件中核对)。 - 需要全量上下文时读取 llms-full.txt;只需定位时读 llms.txt(均为绝对 URL,见页面顶部说明)。 --- # 编译与验证指南 > 原文:https://open.inexbot.com/zh/14.%E7%BC%96%E8%AF%91%E4%B8%8E%E9%AA%8C%E8%AF%81%E6%8C%87%E5%8D%97.html 本页说明如何在没有连接实物控制器的情况下,验证二次开发程序是否「写对了」。适用于上位机 SDK(默认开发方式);示例以 C++ 为主,C# / Python 见第 6 节。 ## 1. 三级验证 | 级别 | 验证内容 | 通过标准 | | --- | --- | --- | | L1 语法检查 | 头文件引用、类型、语法错误 | 编译器无报错 | | L2 编译 + 链接 | 库文件齐全、ABI 匹配(编译器、x86/x64、Debug/Release) | 成功生成可执行文件 | | L3 运行自检 | 可执行文件能启动、SDK 库能加载、连接调用能执行 | 未接控制器时走到「连接失败」提示 | ::: tip 为什么要做 L3 L3 能在无硬件条件下验证:程序能启动、动态库能被加载、接口调用路径成立。接入控制器后,同一程序只需替换 IP 即可完成真实联调。 ::: ## 2. L1:语法检查(最快) ```bash # MinGW / Linux(g++;包含目录按你的工程结构调整) g++ -fsyntax-only -I ./include main.cpp # MSVC(在「开发者命令提示符」中执行) cl /Zs /I include main.cpp ``` 语法检查只验证代码本身,不检查库文件与链接关系。 ## 3. L2:编译 + 链接 各环境的完整工程配置(头文件路径、库文件、动态库复制等)见环境搭建教程: - [MinGW + Qt 环境搭建](./04.上位机/01.C++/01.文档/01.环境搭建/01.MinGW%20环境.md) - [MSVC + Visual Studio 环境搭建](./04.上位机/01.C++/01.文档/01.环境搭建/02.MSVC%20环境.md) - [Linux + GCC 环境搭建](./04.上位机/01.C++/01.文档/01.环境搭建/03.Linux%20环境.md) Linux(与教程中的 Makefile 一致): ```bash g++ -o demo src/*.cpp -I./include -L./lib -lnrc_host -lpthread -lm -ldl -lrt -lstdc++ -std=c++11 -fPIC export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH ./demo ``` 链接阶段常见错误对照: | 现象 | 常见原因 | 处理 | | --- | --- | --- | | `undefined reference` / `LNK2019` 找不到符号 | 库未链接,或编译器 ABI 不匹配 | 确认链接了 `nrc_host` 库文件,且与编译套件(MinGW/MSVC)一致 | | 找不到 `nrc_host.lib` / `libnrc_host.dll.a` | 库搜索路径不对 | 检查 `-L` 路径 / 附加库目录配置 | | 架构不匹配报错 | 32 位与 64 位混用 | 程序与库统一 x64 | ## 4. L3:无硬件运行自检 编译出可执行文件后**直接运行**(不需要控制器),对照下表判断: | 运行结果 | 说明 | | --- | --- | | 等待数秒后输出「连接失败」并正常退出 | 可执行文件、SDK 动态库加载、连接调用路径均正常(未接控制器属预期结果) | | 提示缺少 `nrc_host.dll` / `libnrc_host.so` | 动态库不在查找路径:Windows 将 DLL 放到可执行文件同目录;Linux 设置 `LD_LIBRARY_PATH` | | 启动即崩溃或报 `0xC000007B` | 架构或编译器不匹配(x86/x64、MinGW/MSVC 混用),更换对应 SDK 重新编译 | | 长时间无响应 | 检查程序逻辑(如等待连接就绪的循环)以及防火墙 / 网络配置 | > 等待时长取决于系统的连接超时设置,通常几秒到数十秒。 自检通过后再接入控制器做真实联调:把示例中的 IP 换成现场控制器 IP 即可。 ## 5. 仿真验证(待补充) 仿真环境(虚拟控制器)的接入方式确认后补充到本节,预计包含:仿真环境启动方式、连接参数(IP / 端口)、支持的指令范围。在此之前,请以第 4 节的编译级验证为准。 ## 6. C# 与 Python 的差异 - **C#**:编译由 Visual Studio 或 `dotnet build` 完成;运行时确认 `nrc_host.dll` 位于输出目录(环境搭建教程中有「复制到输出目录」配置)。运行自检判断方式相同,见 [C# 环境搭建](./04.上位机/02.CSharp/01.文档/01.环境搭建.md)。 - **Python**:无需编译,直接用解释器运行;确认本地库(`_nrc_host`)与 Python 版本、架构严格匹配,见 [Python 环境搭建](./04.上位机/03.Python/01.文档/01.环境搭建.md)。 - 两者运行自检同样以「连接失败」分支输出为准。 ## 7. 相关页面 - 环境搭建:见第 3 节三个平台的教程入口 - [Agent 开发指引](./13.Agent%20开发指引.md)(任务索引与避坑速查) - [常见问题](./11.常见问题.md)(含库加载失败、版本不匹配的排查步骤) - [版本与兼容性](./版本与兼容性.md)(SDK 与控制器固件的对应关系) --- # 版本与兼容性 > 原文:https://open.inexbot.com/zh/%E7%89%88%E6%9C%AC%E4%B8%8E%E5%85%BC%E5%AE%B9%E6%80%A7.html 本文档说明纳博特控制器的 RTL 版本、SDK 版本、协议端口之间的兼容关系,帮助你在开发前选择正确的组合。 --- ## RTL 版本对比 > RTL-24.03 为**稳定版本**,是当前主流出货版本。文档持续维护。 | 特性 | 说明 | |------|------| | 版本状态 | 稳定版,bug 修复 + 关键功能合入 | | 出货情况 | **当前主流出货版本** | | 通信格式 | JSON 文本(可读性好) | | 系统功能 | 运动控制、状态、工艺、作业文件、系统配置、安全参数、协作机器人 | | 工艺支持 | 码垛、打磨、焊接、喷涂、激光、冲压、传送带 | | 程序管理 | 指令级增删改查 + 远程程序启动 | | 推荐场景 | 新项目开发、需要系统级功能 | > 后续版本(如 2501)尚未达到稳定状态,暂未开放 SDK 文档。 ### 端口体系 RTL-24.03 使用统一的端口体系,各端口用途如下: | 端口 | 协议格式 | 用途 | 使用者 | |------|---------|------|--------| | 5000 | TCP | **文件传输**(上传/下载/备份) | 工具、HTTP 客户端 | | 6000 | JSON 文本 | **命令通信**,一般用于示教器 | JSON 协议用户(示教器) | | 6001 | JSON 文本 | **命令通信**,一般用于上位机 | C++/C#/Python SDK、上位机 | | 7000 | TCP | **上位机服务功能端口** | 上位机、工具 | > 💡 **SDK 用户**:统一使用 **6001 端口**,无需手动切换。 --- ## 控制器型号与 SDK 兼容矩阵 | 控制器型号 | 支持 RTL 版本 | C++ SDK | C# SDK | Python SDK | JSON 协议 |-----------|-------------|---------|--------|-----------|---------- | 待研发确认 | RTL-24.03 | 待研发确认 | 待研发确认 | 待研发确认 | 支持 | 待研发确认 | RTL-24.03 | 待研发确认 | 待研发确认 | 待研发确认 | 支持 > ⚠️ 具体型号、SDK 版本号等信息需联系研发确认后填入。当前为结构骨架。 --- ## SDK 版本与编译器/运行时兼容性 ### C++ SDK | 平台 | 编译器 | ABI | 架构 | 配置 | |------|--------|-----|------|------| | Windows | MinGW (GCC 8.3+) | MinGW ABI | x64 | Release / Debug | | Windows | MSVC (VS 2019+) | MSVC ABI | x64 | Release / Debug | | Linux | GCC 8.3+ | GCC ABI | x64 / ARM64 | Release | > MinGW 与 MSVC 的库 **不能混用**,必须下载对应编译器版本的 SDK。 ### C# SDK | 平台 | .NET 版本 | 架构 | 原生库 | |------|----------|------|--------| | Windows | .NET 8.0 | x64 | 依赖对应平台的 `nrc_host.dll` | > C# SDK 封装了 C++ 原生库,运行时须确保 `nrc_host.dll` 可被找到。 ### Python SDK | 平台 | Python 版本 | 架构 | 本地库 | |------|------------|------|--------| | Windows | 待研发确认 | x64 | SDK 包内本地库文件 | | Linux | 待研发确认 | x64 | `_nrc_host.so` | > Python SDK 的本地库严格绑定 Python 版本,32 位/64 位也必须对应。 --- ## 相关页面 - [SDK 下载页](./12.相关下载.md) — 各平台 SDK 包下载 - [入门指南](./02.入门指南.md) — 如何选择开发方式 - [常见问题](./11.常见问题.md) — 排错指南