定义
CANopen 是建立在 CAN 总线上的高层应用协议,定义对象字典、SDO/PDO 通信、设备状态机等。广泛应用于运动控制、伺服驱动、变频器、I/O 模块等。与 DeviceNet 同属 CAN 协议族,协议转换器可将 CANopen 数据转换为 Modbus、OPC UA 实现系统互联。
协议架构
CANopen 基于 CAN 2.0A/2.0B,采用 11 位或 29 位标识符。对象字典(Object Dictionary)是设备参数的标准化存储结构,每个对象有 16 位索引和 8 位子索引。SDO(Service Data Object)用于点对点参数读写,支持分段传输大对象;PDO(Process Data Object)用于实时数据交换,支持同步/异步、RTR 等模式。NMT(Network Management)管理节点状态(初始化、预操作、操作、停止),心跳与节点监护可检测节点离线。EDS(Electronic Data Sheet)描述设备对象字典,便于配置与集成。
应用领域
CANopen 在运动控制领域应用广泛:伺服驱动器通过 PDO 接收位置/速度指令并反馈状态;变频器支持速度控制与故障诊断;I/O 模块采集数字量、模拟量;编码器、限位开关等传感器接入。工业网关、协议转换器可将 CANopen 网络与 Modbus、EtherNet/IP、OPC UA 等互联,实现 DCS、SCADA、MES 对现场设备的数据采集与监控。
与 DeviceNet 对比
DeviceNet 由 ODVA 制定,主要流行于北美;CANopen 由 CiA 维护,在欧洲及全球自动化市场广泛采用。两者均基于 CAN 物理层,但应用层协议不同。DeviceNet 与 EtherNet/IP 共享 CIP 协议,便于与罗克韦尔等厂商设备集成;CANopen 与 EtherCAT、Powerlink 等欧洲以太网协议常配合使用。选型时需考虑现有设备生态、区域习惯及系统集成需求。
对象字典与过程数据的分工
对象字典是设备参数的索引表,过程数据才是周期交换的实时量。服务数据对象适合上电时写限幅、写传动比、读故障码,它有应答、可以分段,但不适合每个控制周期都用来传位置。过程数据对象把预先映射的几个对象打进一帧,同步窗口内发出,从站按接收到的映射更新目标值。映射没有做或映射顺序与主站不一致时,主站仍能看到报文,伺服却把速度字当成位置字。电子数据表只说明厂家声明的对象,现场固件若与数据表版本不同,写一个不存在的子索引会得到中止码,设备不会按想象中的默认值工作。
使用条件包括:全网波特率一致、终端电阻只在干线两端、节点号在上电前设定完毕。同步生产者通常只有一个,多个节点同时发同步帧会让从站动作节拍错乱。过程数据长度受 CAN 帧限制,超过八个字节要改用分段或更换映射,不能把服务数据的长对象直接塞进过程数据。心跳或节点保护的时间要长于从站最坏响应,又要短于工艺允许的失控时间。只开其中一种监护即可,两种同时配又互不匹配,主站会误判从站离线。
节点状态机配错的后果
从站上电后先在初始化,再进入预操作。预操作态可以读写服务数据,过程数据并不生效。主站忘记发启动节点,现场表现为参数能读、电机不动。停止态会停掉过程数据,急停恢复后如果没有重新走启动序列,驱动器保持无指令。标识符冲突比断线更难查:两个节点使用同一节点号时,报文间歇成功,错误帧计数上升。波特率只错一个档,有的节点完全看不见,有的在短帧上偶然应答,示波器上的位时间对不上才能确认。
和上位系统对接时,网关应在操作态稳定之后再发布数据。把预操作态的零值上报成“速度为零”,平台会以为设备在线且停机。故障码在对象字典里,不在过程数据里,只映射状态字的某一位会丢掉具体原因。更换驱动器后沿用旧映射,新固件的对象索引若有调整,过程数据会静默错位。调试顺序应是:总线电气、节点号、服务数据读出版本、配置映射、再进入操作态,不要一上电就周期写目标位置。
同步窗口里的溢出
同步周期里要容纳同步帧和全部过程数据。节点增多后如果仍用原来的同步周期,后面的帧会被挤到下一个窗口,从站按旧节拍动作,位置跟随出现固定滞后。同步帧丢失若干次后,从站应进入事先约定的停机或保持,而不是继续执行最后一条目标直到被人发现。紧急报文的标识优先级高于普通过程数据,标识配低了,急停会排在周期数据后面。
服务数据的超时要按对象长度分开。读一个字节和读整段记录不能共用一个很短的超时,否则长对象总是失败,短对象看起来正常。恢复出厂或更换节点后,映射和心跳都要重新下发,只恢复节点号不够。错误帧突然增多时先看终端电阻和支线,不要先改对象字典。主站日志里应记录中止码的原值,只写“通信失败”无法区分索引不存在、写保护和长度错误。