跳到主要内容

CiA 401 - I/O 模块

CiA 401 是 CANopen 通用 I/O 模块设备协议,定义了数字和模拟 I/O 设备的标准接口,是最基础的 I/O 设备协议,几乎所有 I/O 模块厂商都遵循此标准。

协议简介

什么是 CiA 401?

CiA 401 是一个基于 CoE (CANopen over EtherCAT) 的设备协议,专门为通用 I/O 模块定义标准接口。

协议层次关系:

EtherCAT 应用层
└── CoE (CANopen over EtherCAT)
├── CiA 401 (通用 I/O 模块) ← 当前协议
├── CiA 402 (驱动器和运动控制)
└── 其他 CiA 设备协议

CiA 401 定义了什么?

CiA 401 在 CoE 对象字典的 0x6000-0x64FF 范围内定义了:

  • 数字输入/输出对象 (0x6000-0x63FF)
  • 模拟输入/输出对象 (0x6400-0x64FF)
  • 极性和滤波配置
  • 中断配置
  • 传感器类型定义

适用设备

  • 数字 I/O 模块(如 Beckhoff EL2008, EL1008)
  • 模拟 I/O 模块(如 Beckhoff EL3064, EL4004)
  • 混合 I/O 模块
  • 传感器接口模块

数字 I/O 对象

数字输入 (DI)

索引名称类型访问说明
0x6000Read Input 8 BitUNSIGNED8RO/TXPDO8位数字输入
0x6001Read Input 16 BitUNSIGNED16RO/TXPDO16位数字输入
0x6002Read Input 32 BitUNSIGNED32RO/TXPDO32位数字输入
0x6003Read Input Bit 1-128ARRAYRO/TXPDO单位访问
0x6005Read Input Byte 1-128ARRAYRO/TXPDO字节访问

数字输入极性与滤波

索引名称类型访问说明
0x6100Input Polarity 8 BitUNSIGNED8RW8位输入极性
0x6150Input Filter ConstantARRAYRW输入滤波常数(μs)

数字输出 (DO)

索引名称类型访问说明
0x6200Write Output 8 BitUNSIGNED8RW/RXPDO8位数字输出
0x6201Write Output 16 BitUNSIGNED16RW/RXPDO16位数字输出
0x6202Write Output 32 BitUNSIGNED32RW/RXPDO32位数字输出
0x6206Error Mode Output 8 BitUNSIGNED8RW错误模式输出值
0x6207Error Value Output 8 BitUNSIGNED8RW错误时输出值

数字输出极性

索引名称类型访问说明
0x6300Output Polarity 8 BitUNSIGNED8RW8位输出极性

模拟 I/O 对象

模拟输入 (AI)

索引名称类型访问说明
0x6401Read Analog Input 16 BitINTEGER16RO/TXPDO16位模拟输入
0x6402Read Analog Input 32 BitINTEGER32RO/TXPDO32位模拟输入
0x6420Analog Input Full Scale RangeRECORDRO模拟输入全量程范围

模拟输出 (AO)

索引名称类型访问说明
0x6411Write Analog Output 16 BitINTEGER16RW/RXPDO16位模拟输出
0x6412Write Analog Output 32 BitINTEGER32RW/RXPDO32位模拟输出
0x6430Analog Output Full Scale RangeRECORDRO模拟输出全量程范围
0x6440Analog Output Error ModeARRAYRW错误模式

代码示例

数字 I/O 控制

// 读取数字输入
byte[] data = slave.CoE.SDORead(0x6000, 0);
byte inputs = data[0];
Console.WriteLine($"数字输入: 0x{inputs:X2}");

// 写入数字输出
byte outputs = 0xFF; // 所有输出置高
slave.CoE.SDOWrite(0x6200, 0, new byte[] { outputs });

// 通过 PDO(实时)
byte[] pdoInputs = slave.PDO.GetInputs();
byte[] pdoOutputs = new byte[] { 0xFF };
slave.PDO.SetOutputs(pdoOutputs);

模拟量采集

// 读取模拟输入
byte[] data = slave.CoE.SDORead(0x6401, 1); // 通道1
short analogValue = BitConverter.ToInt16(data, 0);
Console.WriteLine($"模拟输入: {analogValue}");

// 写入模拟输出
short outputValue = 2048;
slave.CoE.SDOWrite(0x6411, 1, BitConverter.GetBytes(outputValue));