macOS 接线、安装与权限
选择连接方式
| 接口 | 连接方式 | 软件条件 |
|---|---|---|
| EtherCAT | Mac 有线网口或系统支持的 USB-C/雷电有线网卡 → 模组 EtherCAT IN | 64 位 Python、PySOEM、BPF 访问权限 |
| CANopen / SLCAN | Mac USB → 支持 SLCAN 的 USB-CAN 适配器 → 模组 CAN | python-can、pyserial,按适配器要求安装串口驱动 |
| CANopen / gs_usb | Mac USB → gs_usb 兼容 USB-CAN 适配器 → 模组 CAN | python-can、gs_usb、libusb |
EtherCAT 和 CANopen 是独立入口,EtherCAT 连接无需 USB-CAN。模组另行供电;EtherCAT 使用有线以太网原始帧,不设置模组 IP、不经 Wi-Fi 或普通 TCP 连接。网卡名采用实际发现的 enX,不能认定 en0 就是有线网口。
ZeroErr 下载页提供公开协议资料和标为 Windows 的 eTuner;本包 Mac 路径由 Python 入口实现。USB-CAN 的 CAN 接线保持相同,电脑侧能否继续使用原适配器取决于其型号与 macOS 驱动。包内 Windows DLL 用于 Windows;Mac 选择 SLCAN 或 gs_usb 后端。
安装
在解包根目录执行。使用原生架构的 Python 3.10+:Apple Silicon 使用 arm64,Intel 使用 x86_64,Python 与所装库保持同一架构。
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python scripts/zeroerr.py --help
只用 EtherCAT 可替换成 -r ethercat/requirements.txt。如 pip 报编译工具缺失,安装 Xcode Command Line Tools(xcode-select --install),再安装依赖。依赖安装在普通用户虚拟环境中。
EtherCAT:一次启动服务,后续普通用户操作
先查看接口并自动探测:
.venv/bin/python scripts/zeroerr.py ethercat adapters
.venv/bin/python scripts/zeroerr.py detect
发现结果只有一个设备时,使用 selected 中的网卡名和从站号;多个候选时先选设备。若提示 BPF 权限不足,在用户终端执行以下命令,en5 替换为实际有线网口。sudo 密码由用户在终端输入,不交给 Agent。
sudo "$(pwd)/.venv/bin/python" scripts/zeroerr.py ethercat --interface en5 discover
sudo "$(pwd)/.venv/bin/python" scripts/zeroerr.py ethercat --interface en5 --slave 1 connect
connect 启动后台持续 PDO 服务,返回后服务继续运行。下列命令使用普通用户,复用相同网口/从站和默认本机端口 8792:
.venv/bin/python scripts/zeroerr.py ethercat --interface en5 --slave 1 status
.venv/bin/python examples/basic_ethercat.py --interface en5 --slave 1
.venv/bin/python scripts/zeroerr.py ethercat --interface en5 --slave 1 state read Pos SpdActual ErrorCode
按用户指定的速度、加减速度和结束动作执行工况。例如下方命令明确选择采集结束停止:
.venv/bin/python scripts/zeroerr.py ethercat --interface en5 --slave 1 motion velocity --speed 10000 --accel 250000 --decel 250000
.venv/bin/python scripts/zeroerr.py ethercat --interface en5 --slave 1 capture --seconds 5 --output output/run.csv --after stop
.venv/bin/python scripts/zeroerr.py ethercat --interface en5 --slave 1 close
--after preserve 用于用户明确要求采集后保持当前目标的工况;两种结束动作均需显式选择。close 失能并关闭服务,下次连接重新取得 BPF 权限。--port 可指定其它本机端口,后续命令都使用同一端口;自动 detect 复用默认端口 8792。
服务只监听本机 127.0.0.1,由本机客户端控制。它不是有身份认证的多用户或远程控制服务;使用专用操作账户,不向网络转发该端口。避免同时启动第二个 EtherCAT 主站。连接保持期间,原始网口权限由服务持有,而非每个客户端重新打开。
CANopen:明确适配器后端
SLCAN 示例(波特率按实际设备填写):
.venv/bin/python scripts/zeroerr.py canopen adapters
.venv/bin/python scripts/zeroerr.py canopen --interface slcan --channel /dev/cu.usbmodemXXXX --serial-baud 115200 --bitrate 1000000 discover
.venv/bin/python scripts/zeroerr.py canopen --interface slcan --channel /dev/cu.usbmodemXXXX --serial-baud 115200 --bitrate 1000000 --can-id 3 state read ProductCode Statusword Pos
--serial-baud 是电脑到适配器的串口速率,--bitrate 是 CAN 总线速率,两者不同。自动探测默认分别为 115200 与 1000000;设备采用其它值时,使用上面的协议入口显式指定。串口候选可能是传感器,只有确认是 SLCAN 适配器后才打开。
gs_usb 示例(已经安装 Homebrew 时可用它安装 libusb):
brew install libusb
.venv/bin/python -m pip install -r canopen/requirements-gs-usb.txt
.venv/bin/python scripts/zeroerr.py detect --can-interface gs_usb --can-channel 0
.venv/bin/python scripts/zeroerr.py canopen --interface gs_usb --channel 0 --can-id 3 state read ProductCode Statusword Pos
Node ID 使用实际发现值,默认扫描 1–64。设备存在但无响应时检查总线速率、CAN_H/CAN_L、终端电阻、供电和适配器占用,依据返回错误处理。
区分权限来源
| 提示 | 对应处理 |
|---|---|
| BPF / 原始网口 permission denied | 同一个虚拟环境 Python 通过 sudo 执行首次 discover / connect;后续复用服务。Mac 不安装 Npcap。 |
| sudo 后找不到 pysoem | 使用上面的虚拟环境 Python 绝对路径,避免切换到系统 Python。 |
| 桌面、下载、文稿目录访问提示 | 在系统设置 → 隐私与安全性 → 文件与文件夹,给实际运行命令的终端或宿主应用授予所需目录权限;这是系统目录授权。Apple 说明。 |
| 每条命令被 Agent 宿主询问确认 | 由宿主应用的执行审批设置管理,与 BPF 权限分开。本包不添加逐命令审批界面。 |
| CSV 可读但普通用户不能原地修改 | CSV 由服务进程写出;通过 sudo 启动的服务可能生成 root 所有的文件。读取后把分析结果输出到用户可写目录。 |
本包不安装开机提权服务、不修改 sudoers 或系统权限策略。使用用户已授权的工作目录,保持解包目录、虚拟环境和输出路径稳定即可。
网口、OP/PDO、同步与驱动故障排查见 EtherCAT 通讯参考;依赖和模块协议资料来源见 SOURCES.md。