跳到主要内容

CiA 401 — 通用 I/O 模块

CiA 401 (IEC 61131-9) 是基于 CoE 的通用数字/模拟 I/O 设备协议。

CiA 401 运行在 CoE (SDO) 之上,仅当从站支持 CoE 时可用。

通过 slave.CoE.CiA401 访问。从站不支持 CiA 401 时为 null

IO 属性

通过索引器直接读写 IO 通道,所有通道号从 0 开始。

属性读写类型说明
DI[n]只读bool数字输入通道 n
DO[n]读写bool数字输出通道 n
AI[n]只读int模拟输入通道 n
AO[n]读写short模拟输出通道 n

示例:

var io = slave.CoE.CiA401;
if (io == null) return;

// 数字 IO
bool sensor = io.DI[0];
io.DO[0] = true;
io.DO[1] = sensor;

// 模拟 IO
int adc = io.AI[0];
io.AO[0] = 16384;
实时控制

高频率 I/O 控制应使用 PDO 映射 而非 SDO。SDO 适合参数配置和诊断。

方法 API

索引器内部调用以下方法,也可直接使用。

ReadDI

public bool ReadDI(int channel)

读取数字输入。内部按 8 通道一组自动计算组号和位偏移。

参数:

  • channel — 通道号(从 0 开始)

WriteDO

public void WriteDO(int channel, bool state)

设置数字输出,不影响同组其他通道。

参数:

  • channel — 通道号(从 0 开始)
  • state — 目标状态

ReadAI

public int ReadAI(byte ch = 1)

读取模拟输入值。自动适应 16 位和 32 位设备。

参数:

  • ch — 通道号(从 1 开始),默认 1

WriteAO

public void WriteAO(byte ch, short value)

写入模拟输出值。

参数:

  • ch — 通道号(从 1 开始)
  • value — 16 位输出值

错误处理

DOErrorMode

public void DOErrorMode(byte group, CiA401ErrorMode mode)

设置数字输出错误模式。当 EtherCAT 通信丢失时,决定输出如何响应。

参数:

  • group — 组号(每 8 个通道为一组,从 1 开始)
  • mode — 错误模式

相关结构:

public enum CiA401ErrorMode : byte
{
Hold = 0, // 保持当前输出值
SafeValue = 1, // 切换到预设的安全值
}

DOErrorValue

public void DOErrorValue(byte group, byte value)

设置数字输出通信丢失时的安全值。仅在 SafeValue 模式下生效。

参数:

  • group — 组号
  • value — 安全输出值(8 位,每位对应一个通道)

AOErrorMode

public void AOErrorMode(byte ch, CiA401ErrorMode mode)

设置模拟输出错误模式。

参数:

  • ch — 通道号(从 1 开始)
  • mode — 错误模式

AOErrorValue

public void AOErrorValue(byte ch, short value)

设置模拟输出通信丢失时的安全值。仅在 SafeValue 模式下生效。

参数:

  • ch — 通道号(从 1 开始)
  • value — 16 位安全输出值

示例:

io.DOErrorMode(1, CiA401ErrorMode.SafeValue);
io.DOErrorValue(1, 0x00);

io.AOErrorMode(1, CiA401ErrorMode.SafeValue);
io.AOErrorValue(1, 0);

完整示例

var io = slave.CoE.CiA401;
if (io == null) return;

// 数字 IO
bool sensor = io.DI[0];
bool limit = io.DI[5];

io.DO[0] = true;
io.DO[1] = sensor;

// 模拟 IO
int adc = io.AI[0];
double temp = adc * 0.1;
io.AO[0] = (short)(temp > 50 ? 0 : 16384);

// 安全配置
io.DOErrorMode(1, CiA401ErrorMode.SafeValue);
io.DOErrorValue(1, 0x00);