英威腾IVC5 PLC与伺服CANopen通信中,当PDO(Process Data Object)映射对象总长度超过8字节时,必须进行合法拆分。CANopen协议规定:单个PDO报文的数据域严格限制为最多8字节(64位),不可扩展、不可压缩、不可绕过。任何尝试发送9字节及以上数据到单一TPDO/RPDO的配置,均会导致通信失败——表现为伺服无响应、PLC报“PDO mapping error”或“COB-ID conflict”,或数据错乱、周期性超时。
以下为完整、可直接执行的实操指南,覆盖原理、配置、验证、避坑四阶段,所有操作基于IVC5系列PLC固件V2.1.8+、英威腾IS620P/IS620N系列伺服(支持CANopen从站模式)、标准CANopen EDS文件(如IS620P_v2.1.eds)。
一、理解PDO映射本质与8字节硬约束
CANopen中,PDO用于实时传输过程数据(如位置指令、速度反馈、状态字)。其结构由两部分构成:
- PDO通信参数(COB-ID、传输类型、Inhibit Time等)
- PDO映射参数(即实际要打包进该PDO的对象字典条目列表)
关键规则:
- 每个PDO映射参数表(
1A00h–1A03hfor RPDO;1B00h–1B03hfor TPDO)是一个16位索引 + 8位子索引 + 8位数据长度(bit数) 的三元组数组。 - 所有映射条目的数据长度之和(单位:bit)必须 ≤ 64 bit,即 ≤ 8字节。
- 若求和结果为65 bit,即使仅超1 bit,CANopen栈在初始化时将拒绝使能该PDO,并置位
Error Register (1001h).bit1 = 1(Configuration Error)。
✅ 正确示例:映射
6060h:00(控制字,16 bit) +607Ah:00(目标位置,32 bit) +6081h:00(最大速度,16 bit) → 16 + 32 + 16 = 64 bit → 合法。
❌ 错误示例:再加6064h:00(位置实际值,32 bit) → 64 + 32 = 96 bit → 超限,必须拆。
二、拆分策略:按功能解耦 + 长度对齐
不能随意切分寄存器。必须遵循对象字典语义完整性与控制时序一致性原则。推荐两种经产线验证的拆分方式:
方式1:控制指令与参数分离(推荐用于主轴定位控制)
| PDO类型 | COB-ID(十六进制) | 映射内容(索引:子索引 × bit长度) | 总bit | 说明 |
|---|---|---|---|---|
| RPDO1 | 200h |
6060h:00 × 16(控制字)<br>607Ah:00 × 32(目标位置)<br>6081h:00 × 16(最大速度) |
64 | 所有运动启动必需参数,保证原子下发 |
| RPDO2 | 300h |
6083h:00 × 16(加速度)<br>6084h:00 × 16(减速度)<br>60B2h:00 × 16(位置窗口)<br>6065h:00 × 16(跟随误差限) |
64 | 运动参数,可异步更新,不影响当前运行 |
✅ 优势:RPDO1承载“立即执行”指令,低延迟;RPDO2承载“配置类”参数,允许非周期写入,降低总线负载。
方式2:高低位分包(仅适用于32/64位整数型数据)
当需传输一个64位目标位置(如607Ah:00为32位,但客户要求微米级精度需64位),而伺服固件支持607Ah:01(低位32位)与607Ah:02(高位32位)时:
- 禁止将
607Ah:01与607Ah:02塞进同一PDO(虽合计64 bit,但违反CANopen规范中“同一索引不同子索引不得共存于一PDO”的隐含规则,IVC5会报错)。 - 正确做法:
- RPDO1 映射
607Ah:01 × 32(低位) - RPDO2 映射
607Ah:02 × 32(高位) - 在PLC程序中同步触发两个RPDO的传输(使用同步管理器SYNC或RTR机制),确保高低位严格同周期更新。
- RPDO1 映射
⚠️ 注意:IS620P固件V2.1.8起支持
607Ah:01/02,但需在伺服上电前通过2100h:01启用“64位位置模式”,否则607Ah:02读取为0。
三、IVC5 PLC端实操配置(以RS485-CAN转换器挂CANopen网络为例)
步骤1:导入伺服EDS文件并启用CANopen主站
打开 IV Designer V3.2.1
点击 工程 → 设备组态 → 添加设备 → 选择 CANopen Master → 设置波特率 1 Mbps
右键 CANopen Master节点 → 导入EDS文件 → 选择 IS620P_v2.1.eds
勾选 “启用CANopen主站” → 点击 应用
💡 提示:EDS文件必须与伺服实际固件版本完全匹配。若用V2.0.0 EDS驱动V2.1.8伺服,
607Ah:02等新条目将不可见。
步骤2:配置RPDO1(COB-ID 200h,传输类型 255 即同步)
双击 CANopen Master → 进入“PDO配置”页签
点击 “添加RPDO” → 设置:
- RPDO Index:
1 - COB-ID:
0x200 - 传输类型:
255(synchronous, via SYNC) - 映射条目数:
3
逐行填写映射表:
- 索引
6060h,子索引00h,位长16 - 索引
607Ah,子索引00h,位长32 - 索引
6081h,子索引00h,位长16
点击 “校验映射长度” → 显示 64 bits → 点击 确定
步骤3:配置RPDO2(COB-ID 300h,传输类型 1 即事件触发)
再次点击 “添加RPDO” → 设置:
- RPDO Index:
2 - COB-ID:
0x300 - 传输类型:
1(on event) - 映射条目数:
4
填写:
6083h:00 × 166084h:00 × 1660B2h:00 × 166065h:00 × 16
校验结果必须为 64 bits → 若显示 65 或 63,立即检查子索引是否输错(如60B2h:00误输为60B2h:01)。
步骤4:绑定PLC变量与PDO数据区
IVC5将每个RPDO映射为连续字节缓冲区:
- RPDO1 数据起始地址:
%MB1000(16位控制字存于%MW1000,目标位置低16位存于%MW1001,高16位存于%MW1002,最大速度存于%MW1003) - RPDO2 数据起始地址:
%MB1100
在PLC程序中(ST语言):
// 写入RPDO1:控制字+位置+速度
%MW1000 := 16#000F; // 控制字:Enable Voltage + Enable Operation + New Set Point
%MD1001 := iTargetPos; // %MD1001 = %MW1001 + %MW1002(32位有符号整数)
%MW1003 := iMaxSpeed;
// 写入RPDO2:加速度等参数(仅需变更时写)
IF bParamUpdate THEN
%MW1100 := iAcc;
%MW1101 := iDec;
%MW1102 := iPosWindow;
%MW1103 := iFollowErr;
END_IF
✅ 关键:
%MD1001是IVC5自动将%MW1001(低位)与%MW1002(高位)合并的32位DINT变量,无需手动拼接。
四、伺服端强制同步与状态确认
步骤1:设置伺服PDO响应行为
伺服上电后,需确保其接收RPDO后立即生效。进入伺服参数界面(面板或PC软件):
- 设置
2100h:00=1(启用PDO映射) - 设置
2100h:01=1(启用64位模式,如需) - 设置
2100h:02=255(RPDO1传输类型同步) - 设置
2100h:03=1(RPDO2传输类型事件)
步骤2:监控TPDO反馈验证拆分有效性
启用TPDO1(COB-ID 180h)映射伺服状态:
6041h:00 × 16(状态字)6064h:00 × 32(实际位置)606Ch:00 × 16(实际速度)
在IVC5中读取 %MD2001(对应6064h:00)并与指令位置比对。若偏差稳定在±1脉冲内,证明RPDO1拆分后数据完整到达。
🔍 故障快速定位表:
| 现象 | 最可能原因 | 解决动作 |
|---|---|---|
伺服不使能,6041h:00.bit12=0(Switched on) |
RPDO1中6060h:00未正确写入或位长设错 |
检查%MW1000值是否为16#000F,确认映射位长为16而非8 |
| 目标位置跳变(每次移动都偏移固定值) | 607Ah:00高低位字节序颠倒 |
在IVC5中改用%MD1001(自动大端),勿用%MW1001+%MW1002手动组合 |
| RPDO2参数修改后无效 | 伺服未收到RTR帧或传输类型设为0(禁用) |
将RPDO2传输类型改为1,并在PLC中执行CAN_SEND_RTR(0x300) |
周期性报CAN bus off |
多个RPDO共用同一COB-ID(如RPDO1与RPDO2均设200h) |
严格按200h/300h/400h递增分配COB-ID,间隔≥100h |
五、高级技巧:动态PDO重映射(免停机更新)
当产线需在线切换工艺(如粗加工→精加工,需不同加速度),避免重新下载PLC程序:
-
预置两套RPDO映射:
- RPDO1:
200h→ 粗加工参数(高加速度) - RPDO3:
400h→ 精加工参数(低加速度+小窗口)
- RPDO1:
-
运行时切换:
IF bSwitchToFine THEN // 禁用RPDO1 CAN_PDO_DISABLE(1); // 启用RPDO3 CAN_PDO_ENABLE(3); // 强制同步一次 CAN_SYNC_PULSE(); END_IF
✅ 优势:切换耗时 < 1ms,无运动中断。需确保RPDO3映射长度也为64 bit且COB-ID唯一。
六、常见陷阱与绕不过的真相
-
陷阱1:“用SDO强行写超长PDO映射”
SDO可写任意对象字典项,但1A00h映射表本身是只读的(属性ro)。试图写1A00h:05会返回06090010(Object does not exist)错误。PDO映射只能在初始化阶段静态配置,不可运行时修改长度。 -
陷阱2:“把BOOL量凑满8字节”
将32个6040h:00.bit0(开关使能)塞进一PDO看似省事,但违反语义——每个6040h属于不同伺服节点。CANopen要求一个PDO只能服务一个从站节点(即一个伺服)。多节点必须用不同COB-ID。 -
陷阱3:“忽略字节对齐导致数据错位”
若RPDO1映射为:6060h:00 × 16+6040h:00 × 1(一个bit),剩余47 bit未用,则607Ah:00必须从第3字节开始(因16 bit占2字节,1 bit占1 bit,下一项自动对齐到字节边界)。IVC5自动处理对齐,但手动计算时必须按ceil(bit_length/8)取整。 -
终极真相:8字节是物理层硬限制,不是软件缺陷
CAN帧数据段最大为8字节,这是ISO 11898标准定义,与PLC品牌无关。英威腾、倍福、欧姆龙、三菱——所有CANopen设备均受此约束。所谓“某品牌支持16字节PDO”实为多PDO聚合应用层协议(如CiA 402扩展),底层仍是多个8字节帧。
七、验证清单(上线前逐项打钩)
- [ ] IVC5工程中,每个RPDO的“校验映射长度”显示精确
64 bits - [ ] 所有RPDO COB-ID无重复,且与伺服EDS中声明的
1200h(RPDO COB-ID)一致 - [ ] 伺服参数
2100h:00=1,且2100h:02=255(对应RPDO1) - [ ] PLC程序中,32位数据统一使用
%MDx而非拆分为%MWx+%MWx+1 - [ ] 用CANalyzer或PCAN-View抓包,确认
200h帧数据区为16+32+16 bit紧凑排列,无填充字节 - [ ] 执行单点定位,
6064h:00反馈值与607Ah:00指令值绝对差 ≤ 1 LSB
完成上述全部步骤后,IVC5与英威腾伺服的CANopen PDO通信即可稳定承载任意复杂运动控制指令,彻底规避8字节超限故障。

暂无评论,快来抢沙发吧!