#!/bin/bash # 05_sync_demo.sh - CANopen SYNC 同步实验(最终版) # 使用 SYNC 触发两个节点的 TPDO 同步传输 SOCKET1="/tmp/CO_command_socket_1" SOCKET2="/tmp/CO_command_socket_2" cocc() { cocomm -s "$1" "$2 $3" 2>/dev/null; } echo "================================================" echo " CANopen SYNC 同步实验" echo "================================================" echo "" echo "--- Step 1: 配置两个节点 TPDO1 为 SYNC 触发 ---" echo " 传输类型 = 1(每次 SYNC 后发送 PDO)" cocc $SOCKET1 1 "write 0x1800 2 u8 1" cocc $SOCKET2 2 "write 0x1800 2 u8 1" echo "" echo "--- Step 2: 确认映射已配置 ---" echo "节点1: $(cocc $SOCKET1 1 'read 0x1A00 0 u8') 个映射对象" echo "节点2: $(cocc $SOCKET2 2 'read 0x1A00 0 u8') 个映射对象" echo "" echo "--- Step 3: 写入不同的值到两个节点 ---" cocc $SOCKET1 1 "write 0x2000 0 u32 0xAAAA" cocc $SOCKET2 2 "write 0x2000 0 u32 0xBBBB" sleep 1 echo "" echo "--- Step 4: 监控 vcan0 的 PDO + SYNC ---" echo " SYNC = CAN ID 0x080" echo " 节点1 TPDO = 0x181" echo " 节点2 TPDO = 0x182" echo "" echo "发送 SYNC 前..." echo "节点1 0x2000 = $(cocc $SOCKET1 1 'read 0x2000 0 u32')" echo "节点2 0x2000 = $(cocc $SOCKET2 2 'read 0x2000 0 u32')" echo "" echo "--- 发送第一个 SYNC ---" candump vcan0,80:FFF,181:FFF,182:FFF & CANDUMP=$! sleep 1 cansend vcan0 080# sleep 2 kill $CANDUMP 2>/dev/null wait $CANDUMP 2>/dev/null echo "" echo "--- Step 5: 多 SYNC 循环 ---" echo "连续发送 3 个 SYNC (每 1 秒),观察 TPDO 同步:" for i in 1 2 3; do echo " SYNC #$i..." candump vcan0,181:FFF,182:FFF -n 2 & CANDUMP=$! cansend vcan0 080# sleep 1 kill $CANDUMP 2>/dev/null wait $CANDUMP 2>/dev/null done echo "" echo "--- Step 6: 修改值后通过 SYNC 同步 ---" echo " 将节点1 的 TPDO 传输类型改为 2(每 2 个 SYNC 发一次)" cocc $SOCKET1 1 "write 0x1800 2 u8 2" cocc $SOCKET1 1 "write 0x2000 0 u32 0xCCCC" echo "" echo " 发送 2 个 SYNC:" candump vcan0,181:FFF -n 1 & CANDUMP=$! cansend vcan0 080# sleep 1 kill $CANDUMP 2>/dev/null; wait $CANDUMP 2>/dev/null echo "第 1 个 SYNC → 节点2 = $(cocc $SOCKET2 2 'read 0x2000 0 u32') (不应变化)" candump vcan0,181:FFF -n 1 & CANDUMP=$! cansend vcan0 080# sleep 1 kill $CANDUMP 2>/dev/null; wait $CANDUMP 2>/dev/null echo "第 2 个 SYNC → 节点2 = $(cocc $SOCKET2 2 'read 0x2000 0 u32') (应 = 0xCCCC)" echo "" echo "================================================" echo " SYNC 实验总结" echo "================================================" echo " SYNC (CAN ID 0x080) 是 CANopen 全局同步脉冲" echo " 每个 SYNC 触发传输类型为 1-240 的 TPDO" echo " 传输类型值 = 每隔 N 个 SYNC 发一次" echo " 多轴伺服系统中用于同步位置环" echo " 相当于分布式系统中的硬件同步信号" echo "================================================"