#!/bin/bash # 05_sync_demo.sh - SYNC 同步通信演示 # 目标:节点 1 作为 SYNC Producer 发送 SYNC 消息 # 节点 1 和 2 作为 SYNC Consumer 在收到 SYNC 后发送 TPDO # SYNC = 网络同步脉冲,用于同步采样/控制(类似 PWM 同步信号) SOCKET1="/tmp/CO_command_socket_1" SOCKET2="/tmp/CO_command_socket_2" cocc() { local socket=$1 local node=$2 local cmd=$3 echo " → [$node] $cmd" cocomm -s "$socket" "$node $cmd" } echo "================================================" echo " CANopen SYNC 同步实验" echo "================================================" echo "" echo "--- Step 1: 确认节点在 Operational 状态 ---" cocc "$SOCKET1" 1 "start" cocc "$SOCKET2" 2 "start" sleep 1 echo "" echo "--- Step 2: 配置 TPDO1 传输类型为 SYNC(类型 1) ---" echo " TPDO 传输类型:" echo " 0 = acyclic SYNCHRONOUS(同步后由事件触发)" echo " 1-240 = cyclic SYNC(每 N 个 SYNC 发送一次)" echo " 254 = 事件触发(非同步)" echo " 255 = RTR 触发" echo "" echo " 设置节点 1 TPDO1 传输类型 = 1(每次 SYNC 后发送):" cocc "$SOCKET1" 1 "write 0x1800 2 u8 1" echo "" echo " 设置节点 2 TPDO1 传输类型 = 1:" cocc "$SOCKET2" 2 "write 0x1800 2 u8 1" echo "" echo "--- Step 3: 配置 TPDO1 映射(如未配置) ---" echo " 两个节点都映射 0x2000 sub1 到 TPDO1:" cocc "$SOCKET1" 1 "write 0x1A00 1 u32 0x20000120" cocc "$SOCKET1" 1 "write 0x1A00 0 u8 1" cocc "$SOCKET2" 2 "write 0x1A00 1 u32 0x20000120" cocc "$SOCKET2" 2 "write 0x1A00 0 u8 1" echo "" echo "--- Step 4: 在节点 1 上写入不同的值 ---" cocc "$SOCKET1" 1 "write 0x2000 1 u32 0x11111111" cocc "$SOCKET2" 2 "write 0x2000 1 u32 0x22222222" echo "" echo "--- Step 5: 启动 candump 监控 SYNC 和后续 PDO ---" echo " SYNC CAN ID = 0x080" echo " TPDO1 CAN ID = 0x181(节点1)和 0x182(节点2)" candump vcan0,80:FFF,181:FFF,182:FFF & CANDUMP_PID=$! sleep 1 echo "" echo "--- Step 6: 设置 SYNC Producer(节点 1) ---" echo " 通过写入 0x1006(通信循环周期)启用 SYNC" echo " 设周期为 100000 us = 100ms(10 Hz 同步频率)" cocc "$SOCKET1" 1 "write 0x1005 0 u32 0x00000080" cocc "$SOCKET1" 1 "write 0x1006 0 u32 100000" echo "" echo " 等待 3 个 SYNC 周期(约 300ms)..." sleep 3 echo "" echo "--- Step 7: 修改值再观察 SYNC 触发的 PDO ---" echo " 修改节点 1 的值:" cocc "$SOCKET1" 1 "write 0x2000 1 u32 0xAABBCCDD" sleep 1 echo " 修改节点 2 的值:" cocc "$SOCKET2" 2 "write 0x2000 1 u32 0xDDCCBBAA" sleep 2 echo "" # Stop candump kill $CANDUMP_PID 2>/dev/null wait $CANDUMP_PID 2>/dev/null echo "" echo "--- Step 8: 停止 SYNC Producer ---" cocc "$SOCKET1" 1 "write 0x1006 0 u32 0" echo "" echo "================================================" echo " SYNC 实验完成" echo " 关键认知:" echo " - SYNC 是 CANopen 的全局同步机制" echo " - SYNC CAN ID = 0x080(默认)" echo " - TPDO 传输类型 1-240 = 每 N 个 SYNC 发送一次" echo " - 适用于多轴同步控制、同步采样" echo " - CiA402 伺服驱动中,SYNC 用于同步位置/速度环" echo "================================================"