Skip to content

3.7 IoSignals IO 类

概述

IoSignals 负责单点与批量 IO 读写。在 Arm 完成连接后,通过 arm.ioSignals 获取 Signals 实例,无需单独初始化。SDK 把数字量、组信号和模拟量统一纳入 SignalType

支持范围

接口支持范围
Read支持全部 SignalType
Write 整型重载仅支持 DOROGOTDO
Write 浮点重载仅支持 AO
MultiRead仅支持 DO
MultiWrite仅支持 DO

端口号口径

  • 端口号按控制器侧编号传入。

3.7.1 读取单路 IO

cpp
Read(SignalType type, int32_t index) -> std::pair<Float64, STATUS_CODE>
说明
描述读取单路 IO;数字量、组信号、模拟量统一返回 Float64
请求参数type : SignalType 信号类型(DI/DO/UI/UO/RI/RO/GI/GO/TAI/TDI/TDO/AI/AO)
index : int32_t 端口号
返回值Float64: 读取到的值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.7.2 写入单路数字量

cpp
Write(SignalType type, int32_t index, int32_t value) -> STATUS_CODE
说明
描述写单路数字量或整型组信号
请求参数type : SignalType 信号类型(仅支持 DO/RO/GO/TDO)
index : int32_t 端口号
value : int32_t 写入值
返回值STATUS_CODE: 函数执行结果
备注不支持的信号类型返回 UNSUPPORTED_SIGNAL_TYPE
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.7.3 写入单路模拟量

cpp
Write(SignalType type, int32_t index, Float64 value) -> STATUS_CODE
说明
描述写单路模拟量;只用于 AO
请求参数type : SignalType 信号类型(仅支持 AO)
index : int32_t 端口号
value : Float64 写入值
返回值STATUS_CODE: 函数执行结果
备注不支持的信号类型返回 UNSUPPORTED_SIGNAL_TYPE
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.7.4 批量读取

cpp
MultiRead(SignalType type, const std::vector<int32_t>& portList) -> std::pair<std::vector<int32_t>, STATUS_CODE>
说明
描述批量读取 IO;只支持 DO
请求参数type : SignalType 信号类型(仅支持 DO)
portList : std::vector<int32_t> 端口号列表
返回值std::vector<int32_t>: 读取到的值列表(与 portList 顺序对应)
STATUS_CODE: 函数执行结果
备注不支持的信号类型返回 UNSUPPORTED_SIGNAL_TYPEportList 为空时返回 INVALID_PARAMETER
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.7.5 批量写入

cpp
MultiWrite(SignalType type, const std::vector<int32_t>& ioList) -> STATUS_CODE
说明
描述批量写入 IO,扁平参数格式为 [port1, value1, port2, value2, ...] ;只支持 DO
请求参数type : SignalType 信号类型(仅支持 DO)
ioList : std::vector<int32_t> 扁平化端口值列表
返回值STATUS_CODE: 函数执行结果
备注不支持的信号类型返回 UNSUPPORTED_SIGNAL_TYPEioList 为空或元素个数不是偶数时返回 INVALID_PARAMETER
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

扁平参数格式说明

ioList 参数格式为交替的端口号和值:

cpp
// 写入 DO[0]=1, DO[1]=0, DO[2]=1
std::vector<int32_t> ioList = {0, 1, 1, 0, 2, 1};  // 依次表示端口和值:0/1、1/0、2/1
// 即 [port0, value0, port1, value1, port2, value2]

3.7.6 按时间间隔触发 IO

cpp
TriggerIOWithIntervals(int32_t inPort, const std::vector<int32_t>& intervals, const std::vector<int32_t>& outPorts, int32_t pulseDuration) -> STATUS_CODE
说明
描述输入触发后按给定间隔驱动多个输出口
请求参数inPort : int32_t 输入端口号
intervals : std::vector<int32_t> 触发间隔列表(毫秒)
outPorts : std::vector<int32_t> 输出端口号列表
pulseDuration : int32_t 脉冲持续时间(毫秒)
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

参数约束

  • intervals 不能为空
  • outPorts 不能为空
  • pulseDuration 必须大于 0

触发逻辑说明

当指定输入端口 inPort 被触发时,按照 intervals 中定义的时间间隔依次驱动 outPorts 中的输出端口,每个输出脉冲持续 pulseDuration 毫秒。


最小调用示例

cpp
#include <iostream>  // 引入标准输出流,用于打印 IO 读取结果
#include <vector>  // 引入 std::vector,用于批量 IO 端口列表
#include "arm_api.h"  // 引入 Arm 主入口,连接后通过 arm.ioSignals 访问信号接口
#include "status_code.h"  // 引入 STATUS_CODE,用于检查 SDK 调用结果
int main()  // 示例程序入口
{  // 进入示例主函数
    Arm arm;  // 创建机器人会话对象
    STATUS_CODE connectRet = arm.Connect("192.168.110.2", "");  // 连接控制器,示教器地址留空表示使用默认规则
    if (connectRet != STATUS_CODE::OK) {  // 判断连接是否失败
        return 1;  // 连接失败时直接退出
    }  // 结束连接结果判断
    auto [di0, diRet] = arm.ioSignals.Read(SignalType::DI, 0);  // 读取 DI[0] 的当前值
    if (diRet != STATUS_CODE::OK) {  // 判断 DI 读取是否失败
        return 1;  // 读取失败时返回错误码
    }  // 结束 DI 读取判断
    std::cout << "DI[0]=" << di0 << "\n";  // 打印 DI[0] 的读取结果
    auto [doBatch, multiRet] = arm.ioSignals.MultiRead(  // 批量读取 DO 端口
        SignalType::DO,  // 指定批量读取的信号类型为 DO
        std::vector<int32_t>{0, 1, 2}  // 指定要读取的 DO 端口列表
    );  // 结束批量读取调用
    if (multiRet != STATUS_CODE::OK) {  // 判断批量读取是否失败
        return 1;  // 批量读取失败时返回错误码
    }  // 结束批量读取判断
    std::cout << "batch_count=" << doBatch.size() << "\n";  // 打印批量读取返回的值数量
    // STATUS_CODE writeRet = arm.ioSignals.Write(SignalType::DO, 0, 1);  // 写 DO 有实际副作用,确认后再取消注释
    // STATUS_CODE multiWriteRet = arm.ioSignals.MultiWrite(  // 批量写 DO 有实际副作用,确认后再取消注释
    //     SignalType::DO,  // 指定批量写入的信号类型为 DO
    //     std::vector<int32_t>{0, 1, 1, 0, 2, 1}  // 按端口和值成对写入:DO[0]=1、DO[1]=0、DO[2]=1
    // );  // 结束批量写入示例调用
    return 0;  // 示例正常结束
}  // 结束示例主函数

场景化示例

下面几组片段按 “读取、写入、脉冲触发” 交叉覆盖本页 API。片段默认承接最小调用示例里已经连接成功的 arm 对象;写 IO 和触发 IO 会改变控制器输出,确认现场后再执行。

读取单路和批量 IO

cpp
auto [singleValue, readRet] = arm.ioSignals.Read(SignalType::DI, 0);  // 读取单路 DI
auto [batchValues, multiReadRet] = arm.ioSignals.MultiRead(SignalType::DO, std::vector<int32_t>{0, 1, 2});  // 批量读取 DO
if (readRet == STATUS_CODE::OK && multiReadRet == STATUS_CODE::OK) {  // 判断读取接口是否成功
    std::cout << "DI[0]=" << singleValue << " batch_count=" << batchValues.size() << "\n";  // 打印单路和批量读取结果
}  // 结束读取结果判断

写入数字量和模拟量

cpp
// STATUS_CODE writeIntRet = arm.ioSignals.Write(SignalType::DO, 0, 1);  // 写数字输出会改变控制器 IO 状态,确认后再执行
// STATUS_CODE writeFloatRet = arm.ioSignals.Write(SignalType::AO, 0, Float64{1.0});  // 写模拟输出会改变控制器 IO 状态,确认后再执行
// STATUS_CODE multiWriteRet = arm.ioSignals.MultiWrite(SignalType::DO, std::vector<int32_t>{0, 1, 1, 0});  // 批量写 DO 会改变多路输出,确认后再执行

按时间间隔触发 IO

cpp
std::vector<int32_t> intervals = {100, 200};  // 准备两段触发间隔,单位毫秒
std::vector<int32_t> values = {0, 1};  // 准备对应的输出值序列
// STATUS_CODE triggerRet = arm.ioSignals.TriggerIOWithIntervals(0, intervals, values, 50);  // 按间隔触发 IO 会改变输出状态,确认后再执行

示例代码

cpp17/signals_basic/src/main.cpp
cpp
#include "query_signals/run.h"
#include "write_signals/run.h"

int main(void)
{
    // [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
    // [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
    return RunSignalsBasicQuerySignals();
    // return RunSignalsBasicWriteSignals();
}
c99/signals_basic/src/main.cpp
cpp
#include <stdio.h>

extern "C" {
#include "c_arm_api.h"
}

int main(void)
{
    // [ZH] 本示例直接在源码中写死连接地址,不解析命令行参数。
    // [EN] This example hard-codes the connection addresses in the source code and does not parse command-line arguments.
    // [ZH] 创建并连接 SDK 句柄。
    // [EN] Create the SDK handle and connect to the robot.
    ArmHandle* handle = Arm_Create();
    if (handle == NULL) {
        printf("[c99_signals] 创建句柄失败 / Failed to create the handle\n");
        return 1;
    }
    int ret = Arm_Connect(handle, "10.27.1.2", "10.27.1.102");
    if (ret != 0) {
        printf("[c99_signals] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
        Arm_Destroy(handle);
        return 1;
    }
    printf("[c99_signals] 机器人连接成功 / Robot connected successfully\n");

    // [ZH] 读取单路信号与批量信号。
    // [EN] Read a single signal and a batch of signals.
    double diValue = 0.0;
    int ports[2] = {0, 1};
    int values[2] = {0, 0};
    size_t outCount = 0U;
    ret = Arm_Signals_Read(handle, ARM_SIGNAL_DI, 0, &diValue);
    printf("[c99_signals] Read 状态码 / Read status code: %d, DI[0]=%.6f\n", ret, diValue);
    ret = Arm_Signals_MultiRead(handle, ARM_SIGNAL_DI, ports, 2U, values, 2U, &outCount);
    printf("[c99_signals] MultiRead 状态码 / MultiRead status code: %d, 数量 / Count: %zu, 值 / Values: [%d, %d]\n",
        ret,
        outCount,
        values[0],
        values[1]);

    // [ZH] 顺序执行全部写接口。
    // [EN] Execute all write APIs in sequence.
    ret = Arm_Signals_WriteInt(handle, ARM_SIGNAL_DO, 1, 1);
    printf("[c99_signals] WriteInt 状态码 / WriteInt status code: %d\n", ret);
    ret = Arm_Signals_WriteFloat(handle, ARM_SIGNAL_AO, 1, 1.5);
    printf("[c99_signals] WriteFloat 状态码 / WriteFloat status code: %d\n", ret);
    int ioList[4] = {4, 1, 6, 0};
    ret = Arm_Signals_MultiWrite(handle, ARM_SIGNAL_DO, ioList, 4U);
    printf("[c99_signals] MultiWrite 状态码 / MultiWrite status code: %d\n", ret);
    int intervals[2] = {100, 200};
    int outPorts[2] = {4, 5};
    ret = Arm_Signals_TriggerIOWithIntervals(handle, 1, intervals, 2U, outPorts, 2U, 60);
    printf("[c99_signals] TriggerIOWithIntervals 状态码 / TriggerIOWithIntervals status code: %d\n", ret);

    // [ZH] 断开连接并销毁句柄。
    // [EN] Disconnect and destroy the handle.
    Arm_Disconnect(handle);
    Arm_Destroy(handle);
    printf("[c99_signals] 示例结束 / Example finished\n");
    return 0;
}