#!/bin/bash # 03_sdo_demo.sh - 通过 SDO 读取/写入对象字典 # 演示 cocomm 与 canopend 通过本地 socket 通信 # SDO 是 CANopen 的点对点配置通道(类似 I2C 寄存器读写) SOCKET1="/tmp/CO_command_socket_1" SOCKET2="/tmp/CO_command_socket_2" cocomm_cmd() { local socket=$1 local node=$2 local cmd=$3 echo "→ $cmd" cocomm -s "$socket" "[$node] $cmd" echo "" } echo "================================================" echo " CANopen SDO 实验:读写对象字典" echo "================================================" echo "" echo "--- 实验 1: 读取节点 1 的心跳产生时间 ---" echo "OD 索引 0x1017 (Heartbeat producer time)" cocomm_cmd "$SOCKET1" 1 "read 0x1017 0 u16" echo "--- 实验 2: 修改节点 1 的心跳间隔为 2000ms ---" cocomm_cmd "$SOCKET1" 1 "write 0x1017 0 u16 2000" cocomm_cmd "$SOCKET1" 1 "read 0x1017 0 u16" echo "--- 实验 3: 通过 SDO 读取节点 1 的设备信息 (Identity Object 0x1018) ---" cocomm_cmd "$SOCKET1" 1 "read 0x1018 1 u32" cocomm_cmd "$SOCKET1" 1 "read 0x1018 2 u32" cocomm_cmd "$SOCKET1" 1 "read 0x1018 3 u32" cocomm_cmd "$SOCKET1" 1 "read 0x1018 4 u32" echo "--- 实验 4: 通过 SDO 读取节点 1 的错误寄存器 ---" cocomm_cmd "$SOCKET1" 1 "read 0x1001 0 u8" echo "--- 实验 5: 用 SDO 从节点 1 写数据到节点 2 的对象字典 ---" echo "将节点 2 的 0x1017 心跳时间设为 1500ms" cocomm_cmd "$SOCKET2" 2 "write 0x1017 0 u16 1500" cocomm_cmd "$SOCKET2" 2 "read 0x1017 0 u16" echo "================================================" echo " SDO 实验完成" echo " 关键认知:" echo " - SDO 是点对点、确认型通信" echo " - 用于配置、诊断,不适合高频实时数据" echo " - 对应 CAN ID = 0x600 + NodeId(请求)" echo " - CAN ID = 0x580 + NodeId(响应)" echo "================================================"