#!/bin/bash # 04_pdo_demo.sh - CANopen PDO 通信演示(最终版) # 显示方式:使用 cansend 模拟 TPDO + SYNC 触发 TPDO # 真实场景:另一个 CANopen 设备(或 Linux 程序)发送 PDO 帧 SOCKET1="/tmp/CO_command_socket_1" SOCKET2="/tmp/CO_command_socket_2" cocc() { cocomm -s "$1" "$2 $3" 2>/dev/null; } echo "================================================" echo " CANopen PDO 实验 - 最终版" echo "================================================" echo "" echo "--- 0. 当前状态 ---" echo "节点1 0x2000 = $(cocc $SOCKET1 1 'read 0x2000 0 u32')" echo "节点2 0x2000 = $(cocc $SOCKET2 2 'read 0x2000 0 u32')" echo "" echo "--- 1. 实验 A: 外部 CAN 帧走 RPDO ---" echo " 用 cansend 模拟另一个设备发 PDO (CAN ID 0x181)" echo "" echo " 发送前 Node 2 0x2000 = $(cocc $SOCKET2 2 'read 0x2000 0 u32')" echo " 发送 CAN 帧: ID=0x181, data=DE AD BE EF" cansend vcan0 181#DEADBEEF sleep 1 echo " 发送后 Node 2 0x2000 = $(cocc $SOCKET2 2 'read 0x2000 0 u32')" echo "" echo "--- 2. 实验 B: SYNC 触发 TPDO ---" echo " TPDO 传输类型 = 1:每 1 个 SYNC 发送一次" echo " 配置并写入 0xAABB 到 Node 1" cocc $SOCKET1 1 "write 0x2000 0 u32 0xAABB" echo " 节点1 0x2000 = $(cocc $SOCKET1 1 'read 0x2000 0 u32')" echo "" echo " 发送 SYNC (CAN ID 0x080):" cansend vcan0 080# sleep 1 echo " SYNC 后 Node 2 0x2000 = $(cocc $SOCKET2 2 'read 0x2000 0 u32')" echo "" echo "--- 3. 实验 C: RTR 远程帧触发 TPDO ---" echo " TPDO 传输类型 = 255:仅 RTR 触发" cocc $SOCKET1 1 "write 0x1800 2 u8 255" cocc $SOCKET1 1 "write 0x2000 0 u32 0xDEAD" sleep 1 echo " 写入 0xDEAD,发送 RTR:" cansend vcan0 181#R sleep 1 echo " RTR 后 Node 2 0x2000 = $(cocc $SOCKET2 2 'read 0x2000 0 u32')" echo "" echo "================================================" echo " 实验总结" echo "================================================" echo " PDO COB-ID 计算公式:" echo " TPDOn COB-ID = 0x180 + (n-1)*0x100 + NodeId" echo " RPDOn COB-ID = 0x200 + (n-1)*0x100 + NodeId" echo "" echo " 例如 Node 1 的 TPDO1: 0x180 + 0 + 1 = 0x181" echo " 例如 Node 2 的 RPDO1: 0x200 + 0 + 2 = 0x202" echo "" echo " 传输类型:" echo " 0 = acyclic SYNC(同步后事件触发)" echo " 1-240 = cyclic SYNC(每 N 个 SYNC 发一次)" echo " 254 = 事件触发(值变化即发)" echo " 255 = RTR 触发(收到远程帧才发)" echo "" echo " 注意事项:" echo " - TPDO/RPDO 默认被禁用(0x1800/0x1400 COB-ID bit31=1)" echo " - 启用 PDO 需写 COB-ID 为 0x0XXX(清除 bit31)" echo " - 配置需在 Pre-Operational 或 Operational 状态" echo "================================================"