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);