4.5 IO 信号
概述
Signals 类提供控制器 IO 的统一读写接口,封装了以下核心功能:
- 数字 / 模拟输入输出控制
- 多路批量操作
通过 Signals 可以:
- 读取当前信号状态
- 批量写入 DO/RO/GO 等端口
- 实现与外部夹爪、传感器或生产线设备的联动。
4.5.1 读取指定类型和端口的 IO 值
| 方法名 | Signals.Read(SignalType type , int index ) |
|---|---|
| 描述 | 读取指定类型和端口的 IO 值(支持 DI/DO/UI/UO/RI/RO/GI/GO/TAI/TDI/TDO/AI/AO) |
| 请求参数 | type : SignalType 要读取的 IO 类型 index : int IO 序号 (从 1 开始) |
| 返回值 | int: IO 值,1 代表高电平,0 代表低电平 StatusCode: 操作执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
| 备注 | UI/UO 只能读不能写 |
示例代码
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class ReadSignal
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 设置IO信号类型和索引
// [EN] Set IO signal type and index
SignalType type = SignalType.DI;
int index = 1;
// [ZH] 读取指定类型指定端口IO的值
// [EN] Read specified type and port IO value
int res;
(res, code) = controller.Signals.Read(type, index);
if (code == StatusCode.OK)
{
Console.WriteLine("读取IO信号成功/Read Signal Success");
Console.WriteLine($"{type}:{index} 的值为/has value {res}");
Console.WriteLine($"信号状态/Signal Status: {(res == 1 ? "高电平/High Level" : "低电平/Low Level")}");
}
else
{
Console.WriteLine($"读取IO信号失败/Read Signal Failed: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
if (disconnectCode != StatusCode.OK)
{
Console.WriteLine(disconnectCode.GetDescription());
if (code == StatusCode.OK)
code = disconnectCode;
}
}
return code;
}
}4.5.2 写入指定类型和端口的 IO 值
| 方法名 | Signals.Write(SignalType type , int index , double value ) |
|---|---|
| 描述 | 写入指定类型和端口的 IO 值,当前仅支持 DO/RO/GO/TDO/AO |
| 请求参数 | type : SignalType 要写入的 IO 类型 index : int IO 序号 (从 1 开始) value : double IO 值 (DO/RO/TDO 仅允许 0 或 1;GO 为整型;AO 为浮点模拟量) |
| 返回值 | StatusCode: 操作执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
| 备注 | UI/UO 只能读不能写 |
示例代码
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class WriteSignal
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 设置IO信号类型、索引和值
// [EN] Set IO signal type, index and value
SignalType type = SignalType.DO;
int index = 1;
int value = 1;
// [ZH] 写指定类型指定端口IO的值
// [EN] Write specified type and port IO value
code = controller.Signals.Write(type, index, value);
if (code == StatusCode.OK)
{
Console.WriteLine("写入IO信号成功/Write Signal Success");
Console.WriteLine($"{type}:{index} 设置为/set to value {value}");
Console.WriteLine($"信号状态/Signal Status: {(value == 1 ? "高电平/High Level" : "低电平/Low Level")}");
}
else
{
Console.WriteLine($"写入IO信号失败/Write Signal Failed: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
if (disconnectCode != StatusCode.OK)
{
Console.WriteLine(disconnectCode.GetDescription());
if (code == StatusCode.OK)
code = disconnectCode;
}
}
return code;
}
}4.5.3 批量写入 DO (数字输出) 信号
| 方法名 | Signals.MultiWrite(SignalType type , List<int> ioData ) |
|---|---|
| 描述 | 批量写入 DO (数字输出) 信号 |
| 请求参数 | type : SignalType 要写入的 IO 类型 (仅支持 DO) ioData : List<int> 端口号和端口值列表 (例如 [port1, state1, port2, state2];长度为偶数且大于 0) |
| 返回值 | StatusCode: 操作执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
| 备注 | 仅支持 DO 批量写入;UI/UO 不支持写入,DI/RI 仅支持单点读取 |
示例代码
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class Test
{
public static async Task Main()
{
string controllerIP = "10.27.1.254";
Arm controller = new Arm(controllerIP);
StatusCode code = await controller.Connect();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected.");
// 批量写入 DO1=1, DO2=0
code = controller.Signals.MultiWrite(SignalType.DO, new List<int> { 1, 1, 2, 0 });
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "MultiWrite Success");
code = controller.Disconnect();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected.");
}
}4.5.4 批量读取 DO (数字输出) 端口值
| 方法名 | Signals.MultiRead(SignalType type , List<int> indexes ) |
|---|---|
| 描述 | 批量读取 DO (数字输出) 端口值 |
| 请求参数 | type : SignalType 要读取的 IO 类型 (仅支持 DO) indexes : List<int> 端口号列表 (不能为空) |
| 返回值 | List<int>: 端口值列表(顺序与输入一致) StatusCode: 操作执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
| 备注 | 仅支持 DO 批量读取;UI/UO 不支持写入,DI/RI 仅支持单点读取 |
示例代码
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class Test
{
public static async Task Main()
{
string controllerIP = "10.27.1.254";
Arm controller = new Arm(controllerIP);
StatusCode code = await controller.Connect();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected.");
// 批量读取 DO1、DO2
(List<int> values, StatusCode readCode) = controller.Signals.MultiRead(SignalType.DO, new List<int> { 1, 2 });
if (readCode == StatusCode.OK)
{
Console.WriteLine($"MultiRead Success: DO1={values[0]}, DO2={values[1]}");
}
code = controller.Disconnect();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected.");
}
}