3.7 IoSignals IO 类
概述
IoSignals 负责单点与批量 IO 读写。在 Arm 完成连接后,通过 arm.ioSignals 获取 Signals 实例,无需单独初始化。SDK 把数字量、组信号和模拟量统一纳入 SignalType 。
支持范围
| 接口 | 支持范围 |
|---|---|
Read | 支持全部 SignalType |
Write 整型重载 | 仅支持 DO 、 RO 、 GO 、 TDO |
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_TYPE ; portList 为空时返回 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_TYPE ; ioList 为空或元素个数不是偶数时返回 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 会改变输出状态,确认后再执行示例代码
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();
}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;
}