diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca7498b2..7c168288 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,7 +18,9 @@ set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/output" CACHE PATH "" FORCE)
set(CMAKE_BUILD_RPATH "\$ORIGIN:\$ORIGIN/../lib")
set(CMAKE_INSTALL_RPATH "\$ORIGIN:\$ORIGIN/../lib")
-# Use RUNPATH (new dtags) generally preferable
+# Use transitive RPATH so CLion can run build-tree test executables without
+# manually setting LD_LIBRARY_PATH for indirect third-party dependencies.
+add_link_options(-Wl,--disable-new-dtags)
set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
diff --git a/README.md b/README.md
index 03b74a5e..1bcb8565 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,25 @@
# CMVR-ES
-## Overview
+## 简介
-## Installation
+CMVR-ES 工程。
-### 1. Git submodules install
+## 安装
+
+### 1. 拉取 Git 子模块
```
git submodule update --init --recursive
```
-### 2. Dependency install
+### 2. 安装系统依赖
```shell
-# basic
+# 基础工具
sudo apt-get update
sudo apt install -y build-essential cmake git pkg-config patchelf libboost-all-dev libssl-dev
-# opencv
+# OpenCV
sudo apt install -y \
libjpeg-dev libpng-dev libtiff-dev \
libavcodec-dev libavformat-dev libswscale-dev \
@@ -39,7 +41,7 @@ sudo apt-get install libassimp-dev
# visp
sudo apt-get install -y libx11-dev liblapack-dev libzbar-dev libpthread-stubs0-dev libdc1394-dev nlohmann-json3-dev
-# realsense
+# RealSense
sudo apt-get install -y \
libusb-1.0-0-dev libudev-dev \
libglu1-mesa-dev
@@ -48,4 +50,91 @@ sudo apt-get install -y \
sudo apt install gnuplot-qt
```
+### 3. 配置 IgH EtherCAT
+工程已内置 IgH EtherCAT 1.7.0 的 userspace 文件:
+
+```text
+dependency/x86/third_party/ethercat/v1.7.0
+```
+
+先设置本机路径:
+
+```shell
+export CMVR_ES_ROOT=/path/to/cmvr-es
+export IGH_ETHERCAT_ROOT=$CMVR_ES_ROOT/dependency/x86/third_party/ethercat/v1.7.0
+```
+
+安装当前内核的 header:
+
+```shell
+sudo apt-get update
+sudo apt-get install -y linux-headers-$(uname -r)
+```
+
+如果内置目录里已经有当前内核版本的 EtherCAT 内核模块,直接安装到系统:
+
+```shell
+sudo mkdir -p /lib/modules/$(uname -r)/ethercat
+sudo cp -r $IGH_ETHERCAT_ROOT/lib/modules/$(uname -r)/ethercat/* /lib/modules/$(uname -r)/ethercat/
+sudo depmod
+```
+
+内置内核模块只适用于相同内核版本。如果 `$IGH_ETHERCAT_ROOT/lib/modules/$(uname -r)` 不存在,说明这台机器的内核版本不匹配,需要在这台机器上重新编译安装 IgH EtherCAT:
+
+```shell
+sudo apt-get update
+sudo apt-get install -y \
+ build-essential autoconf automake libtool pkg-config git \
+ linux-headers-$(uname -r)
+
+cd /tmp
+git clone --branch stable-1.7 --depth 1 https://gitlab.com/etherlab.org/ethercat.git ethercat-stable-1.7
+cd ethercat-stable-1.7
+
+./bootstrap
+./configure \
+ --prefix=$IGH_ETHERCAT_ROOT \
+ --libdir=$IGH_ETHERCAT_ROOT/lib \
+ --includedir=$IGH_ETHERCAT_ROOT/include \
+ --sysconfdir=$IGH_ETHERCAT_ROOT/etc \
+ --with-systemdsystemunitdir=$IGH_ETHERCAT_ROOT/lib/systemd/system \
+ --enable-generic \
+ --with-linux-dir=/lib/modules/$(uname -r)/build
+
+make -j$(nproc) all modules
+make install
+sudo make modules_install
+sudo depmod
+```
+
+启动 EtherCAT。`eno1` 换成实际连接 EtherCAT 从站的网卡:
+
+```shell
+sudo script/ethercat/start_ethercat.sh eno1
+```
+
+脚本会写入内置 IgH 配置文件:
+
+```text
+$IGH_ETHERCAT_ROOT/etc/ethercat.conf
+```
+
+脚本会把该网卡的 MAC 写到 `MASTER0_DEVICE`,使用 `DEVICE_MODULES="generic"`,把网卡从 NetworkManager 断开,并通过 `ethercatctl -c` 启动 IgH master。
+
+查看状态:
+
+```shell
+script/ethercat/status_ethercat.sh
+
+$IGH_ETHERCAT_ROOT/bin/ethercat master
+$IGH_ETHERCAT_ROOT/bin/ethercat slaves
+$IGH_ETHERCAT_ROOT/bin/ethercat pdos
+```
+
+停止 EtherCAT:
+
+```shell
+sudo script/ethercat/stop_ethercat.sh eno1
+sudo script/ethercat/stop_ethercat.sh eno1 --restore-network
+```
diff --git a/docs/EYOU_ServoModule_ECAT_V145.xml b/docs/EYOU_ServoModule_ECAT_V145.xml
new file mode 100644
index 00000000..92f89763
--- /dev/null
+++ b/docs/EYOU_ServoModule_ECAT_V145.xml
@@ -0,0 +1,5560 @@
+
+
+
+ #x1097
+ Jiangsu Yiyou Robot Technology Co., Ltd.
+ 424d760500000000000036000000280000001f0000000e000000010018000000000040050000c40e0000c40e00000000000000000000abc1f68aa9f48aa9f39eb8f5ecf1fdffffffffffff6f95f1b5c8f8a4bcf67499f1fffffffffffff8f9fd608aefedf1fd94b0f4a5bdf6ffffffffffff6991f097b2f56c93f092aff4ffffffffffff88a7f3d8e2fbffffffa1b9f6c4d4f9000000d3defa93aff490adf492aff4ffffffffffffffffff99b4f590adf490acf4fefeffffffffffffff6f94f1becff890adf492aef5f6f8feffffffe9eefc2f66ebdae4fb678ff0678ff0ffffffffffffffffff5a85efdfe7fc97b2f5ffffff000000d1ddfa7096f181a2f2799cf2ffffffffffffb5c8f78dabf4c8d6f990adf4ffffffffffffffffffadc3f75481eea2baf591aef5ffffffffffffe2e9fc9db7f5527fee5d87ef93aff4ffffffffffffffffffe6ecfc225ce9ffffffffffff000000a0b9f64b7aed799cf25783efedf2fdffffffffffff5a86ef7d9ff27b9ef25381eeffffffffffff82a2f26d93f085a4f27397f2ffffffffffffffffff507eee9cb6f5608aef789bf1ffffffffffffffffffffffff5c87efffffffffffff000000e7edfcd4dffaa6bdf6d4dffaffffffffffffffffffcbd8f9f8f9fed3dffaf6f9fefffffffffffffafbfedce5fbd3dffacad8f9ffffffffffffffffffaac0f6e2eafcb2c6f7d0dcfaffffffffffffffffffffffffb6c9f7ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000003a6eeb366beb366beb366beb366beb366beb3167eb5c87efffffffffffffffffffc3d2f96b92f0ccd9f9ffffffffffffffffffaac0f6ffffffbccdf8fafbfeffffffffffffffffffffffffffffffa3bbf67ea0f2a4bcf6ffffffffffff000000094ae70346e70446e70446e70446e70446e70041e63369ebffffffffffffffffff94b0f4003de6a3bbf5fffffffefefe205be90035e4ffffff5380ee003ee6b7caf8fffffffffffff2f5fd114fe80748e70446e70748e71250e8f9fbfe000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99b4f50446e7a9bff6ffffff3066eb1250e82760eaffffff8eabf40849e70043e6edf1fdffffff396dec0f4ee8628bf0ccd9fa5f89ef0f4ee85280ee0000007096f16d93f16d93f16d93f16d93f16d93f16990f088a7f3ffffffffffffffffff9bb5f50446e7afc4f6eff3fd0446e7245eeaffffffffffffffffff80a1f20a4be77d9ff2ffffff0346e61755e9ffffffffffffffffff1552e8225ce90000000648e60144e60144e60144e60144e60144e6003fe63168ebffffffffffffffffff91adf40446e7aac0f6d9e3fb0748e74e7deeffffffffffffffffffb8cbf80849e76a91f0ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee9000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fafe094ae70748e7f1f4fdffffff0547e70d4ce7b8caf8fffffff4f7fe2961ea0849e7aac1f6ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee90000004475ec4072ec4072ec4072ec4072ec4072ec3b6eec648df0ffffffffffff2d64ea0345e7afc4f7ffffffffffff9bb5f50245e60039e5ffffff5480ee0446e73167ebffffffffffff0547e71e59e9ffffffffffffffffff1a57e8255ee9000000265fe9215be9215ce9215ce9215ce9215ce91b57e94a7aedffffff779bf20d4de76890f0ffffffffffffffffffffffffc0d1f92962eaffffff6f94f17ea0f2ffffffffffffffffff0a4be7235deaffffffffffffffffff1f5ae92961ea000000
+
+
+
+
+ ServoDrive
+ Servo Drives
+ 424d760500000000000036000000280000001f0000000e000000010018000000000040050000c40e0000c40e00000000000000000000abc1f68aa9f48aa9f39eb8f5ecf1fdffffffffffff6f95f1b5c8f8a4bcf67499f1fffffffffffff8f9fd608aefedf1fd94b0f4a5bdf6ffffffffffff6991f097b2f56c93f092aff4ffffffffffff88a7f3d8e2fbffffffa1b9f6c4d4f9000000d3defa93aff490adf492aff4ffffffffffffffffff99b4f590adf490acf4fefeffffffffffffff6f94f1becff890adf492aef5f6f8feffffffe9eefc2f66ebdae4fb678ff0678ff0ffffffffffffffffff5a85efdfe7fc97b2f5ffffff000000d1ddfa7096f181a2f2799cf2ffffffffffffb5c8f78dabf4c8d6f990adf4ffffffffffffffffffadc3f75481eea2baf591aef5ffffffffffffe2e9fc9db7f5527fee5d87ef93aff4ffffffffffffffffffe6ecfc225ce9ffffffffffff000000a0b9f64b7aed799cf25783efedf2fdffffffffffff5a86ef7d9ff27b9ef25381eeffffffffffff82a2f26d93f085a4f27397f2ffffffffffffffffff507eee9cb6f5608aef789bf1ffffffffffffffffffffffff5c87efffffffffffff000000e7edfcd4dffaa6bdf6d4dffaffffffffffffffffffcbd8f9f8f9fed3dffaf6f9fefffffffffffffafbfedce5fbd3dffacad8f9ffffffffffffffffffaac0f6e2eafcb2c6f7d0dcfaffffffffffffffffffffffffb6c9f7ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000003a6eeb366beb366beb366beb366beb366beb3167eb5c87efffffffffffffffffffc3d2f96b92f0ccd9f9ffffffffffffffffffaac0f6ffffffbccdf8fafbfeffffffffffffffffffffffffffffffa3bbf67ea0f2a4bcf6ffffffffffff000000094ae70346e70446e70446e70446e70446e70041e63369ebffffffffffffffffff94b0f4003de6a3bbf5fffffffefefe205be90035e4ffffff5380ee003ee6b7caf8fffffffffffff2f5fd114fe80748e70446e70748e71250e8f9fbfe000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99b4f50446e7a9bff6ffffff3066eb1250e82760eaffffff8eabf40849e70043e6edf1fdffffff396dec0f4ee8628bf0ccd9fa5f89ef0f4ee85280ee0000007096f16d93f16d93f16d93f16d93f16d93f16990f088a7f3ffffffffffffffffff9bb5f50446e7afc4f6eff3fd0446e7245eeaffffffffffffffffff80a1f20a4be77d9ff2ffffff0346e61755e9ffffffffffffffffff1552e8225ce90000000648e60144e60144e60144e60144e60144e6003fe63168ebffffffffffffffffff91adf40446e7aac0f6d9e3fb0748e74e7deeffffffffffffffffffb8cbf80849e76a91f0ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee9000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fafe094ae70748e7f1f4fdffffff0547e70d4ce7b8caf8fffffff4f7fe2961ea0849e7aac1f6ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee90000004475ec4072ec4072ec4072ec4072ec4072ec3b6eec648df0ffffffffffff2d64ea0345e7afc4f7ffffffffffff9bb5f50245e60039e5ffffff5480ee0446e73167ebffffffffffff0547e71e59e9ffffffffffffffffff1a57e8255ee9000000265fe9215be9215ce9215ce9215ce9215ce91b57e94a7aedffffff779bf20d4de76890f0ffffffffffffffffffffffffc0d1f92962eaffffff6f94f17ea0f2ffffffffffffffffff0a4be7235deaffffffffffffffffff1f5ae92961ea000000
+
+
+
+
+ EYOU_ServoModule_V145
+ EYOU_ServoModule_ECAT_V145
+
+
+
+ 2000
+ 9000
+ 5000
+ 200
+
+
+
+
+ 100
+ 2000
+
+
+
+ ServoDrive
+
+
+ 402
+
+
+
+
+
+ BIT2
+ 2
+
+
+
+ BOOL
+ 1
+
+
+
+ DINT
+ 32
+
+
+
+ INT
+ 16
+
+
+
+ SINT
+ 8
+
+
+
+ UDINT
+ 32
+
+
+
+ UINT
+ 16
+
+
+
+ USINT
+ 8
+
+
+
+ REAL
+ 32
+
+
+
+ ARRAY [0..3] OF BYTE
+ USINT
+ 32
+
+ 0
+ 4
+
+
+
+
+ STRING(12)
+ 96
+
+
+
+ STRING(10)
+ 80
+
+
+
+ DT1010
+ 112
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Store All Parameters
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Store Communication Parameters
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ Store Application Parametesr
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+
+
+ DT1011
+ 112
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Restore All Parameters
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Restore Communication Parameters
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ Restore Application Parametesr
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+
+
+ DT1018
+ 144
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Vendor ID
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Product code
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ Revision
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ Serial number
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+
+ DT1C00ARR
+ USINT
+ 32
+
+ 1
+ 4
+
+
+
+ DT1C00
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DT1C00ARR
+ 32
+ 16
+
+ ro
+ o
+
+
+
+
+
+ DT10F1
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Local Error Reaction
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Sync Error Counter Limit
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+
+ DT1C32
+ 488
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ m
+
+
+
+ 1
+ Synchronization Type
+ UINT
+ 16
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Cycle Time
+ UDINT
+ 32
+ 32
+
+ ro
+ o
+
+
+
+ 4
+ Synchronization Types supported
+ UINT
+ 16
+ 96
+
+ ro
+ o
+
+
+
+ 5
+ Minimum Cycle Time
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 6
+ Calc and Copy Time
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 8
+ Get Cycle Time
+ UINT
+ 16
+ 208
+
+ rw
+ c
+
+
+
+ 9
+ Delay Time
+ UDINT
+ 32
+ 224
+
+ ro
+ c
+
+
+
+ 10
+ Sync0 Cycle Time
+ UDINT
+ 32
+ 256
+
+ rw
+ o
+
+
+
+ 11
+ SM-Event Missed
+ UINT
+ 16
+ 288
+
+ ro
+ c
+
+
+
+ 12
+ Cycle Time Too Small
+ UINT
+ 16
+ 304
+
+ ro
+ c
+
+
+
+ 32
+ Sync Error
+ BOOL
+ 1
+ 480
+
+ ro
+ c
+
+
+
+
+
+ DT1C33
+ 488
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ m
+
+
+
+ 1
+ Synchronization Type
+ UINT
+ 16
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Cycle Time
+ UDINT
+ 32
+ 32
+
+ ro
+ o
+
+
+
+ 4
+ Synchronization Types supported
+ UINT
+ 16
+ 96
+
+ ro
+ o
+
+
+
+ 5
+ Minimum Cycle Time
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 6
+ Calc and Copy Time
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 8
+ Get Cycle Time
+ UINT
+ 16
+ 208
+
+ rw
+ c
+
+
+
+ 9
+ Delay Time
+ UDINT
+ 32
+ 224
+
+ ro
+ c
+
+
+
+ 10
+ Sync0 Cycle Time
+ UDINT
+ 32
+ 256
+
+ rw
+ o
+
+
+
+ 11
+ SM-Event Missed
+ UINT
+ 16
+ 288
+
+ ro
+ c
+
+
+
+ 12
+ Cycle Time Too Small
+ UINT
+ 16
+ 304
+
+ ro
+ c
+
+
+
+ 32
+ Sync Error
+ BOOL
+ 1
+ 480
+
+ ro
+ c
+
+
+
+
+ DT1600
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+
+
+
+ 1
+ 1st Output Object to be mapped
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ 2nd Output Object to be mapped
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ 3rd Output Object to be mapped
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+ 4
+ 4th Output Object to be mapped
+ UDINT
+ 32
+ 112
+
+ rw
+ o
+
+
+
+ 5
+ 5th Output Object to be mapped
+ UDINT
+ 32
+ 144
+
+ rw
+ o
+
+
+
+ 6
+ 6th Output Object to be mapped
+ UDINT
+ 32
+ 176
+
+ rw
+ o
+
+
+
+ 7
+ 7th Output Object to be mapped
+ UDINT
+ 32
+ 208
+
+ rw
+ o
+
+
+
+ 8
+ 8th Output Object to be mapped
+ UDINT
+ 32
+ 240
+
+ rw
+ o
+
+
+
+ 9
+ 9th Output Object to be mapped
+ UDINT
+ 32
+ 272
+
+ rw
+ o
+
+
+
+ 10
+ 10th Output Object to be mapped
+ UDINT
+ 32
+ 304
+
+ rw
+ o
+
+
+
+
+ DT1601
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+
+
+
+ 1
+ 1st Output Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Output Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Output Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Output Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Output Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Output Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Output Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Output Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Output Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Output Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1602
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ 1st Output Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Output Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Output Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Output Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Output Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Output Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Output Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Output Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Output Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Output Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1A00
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+
+
+
+ 1
+ 1st Input Object to be mapped
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ 2nd Input Object to be mapped
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ 3rd Input Object to be mapped
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+ 4
+ 4th Input Object to be mapped
+ UDINT
+ 32
+ 112
+
+ rw
+ o
+
+
+
+ 5
+ 5th Input Object to be mapped
+ UDINT
+ 32
+ 144
+
+ rw
+ o
+
+
+
+ 6
+ 6th Input Object to be mapped
+ UDINT
+ 32
+ 176
+
+ rw
+ o
+
+
+
+ 7
+ 7th Input Object to be mapped
+ UDINT
+ 32
+ 208
+
+ rw
+ o
+
+
+
+ 8
+ 8th Input Object to be mapped
+ UDINT
+ 32
+ 240
+
+ rw
+ o
+
+
+
+ 9
+ 9th Input Object to be mapped
+ UDINT
+ 32
+ 272
+
+ rw
+ o
+
+
+
+ 10
+ 10th Input Object to be mapped
+ UDINT
+ 32
+ 304
+
+ rw
+ o
+
+
+
+
+ DT1A01
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ 1st Input Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Input Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Input Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Input Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Input Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Input Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Input Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Input Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Input Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Input Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1A02
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ 1st Input Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Input Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Input Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Input Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Input Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Input Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Input Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Input Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Input Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Input Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1C12ARR
+ UINT
+ 32
+
+ 1
+ 2
+
+
+
+ DT1C12
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+ o
+
+
+
+ Elements
+ DT1C12ARR
+ 32
+ 16
+
+ rw
+ o
+
+
+
+
+ DT1C13ARR
+ UINT
+ 32
+
+ 1
+ 2
+
+
+
+ DT1C13
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+ o
+
+
+
+ Elements
+ DT1C13ARR
+ 32
+ 16
+
+ rw
+ o
+
+
+
+
+ DT2001
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Eu Node Id
+ USINT
+ 8
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Eu Can BitRate
+ UINT
+ 16
+ 32
+
+ rw
+ o
+
+
+
+
+ DT2010
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Current Loop Kp Default
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Current Loop Ki Default
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ Current Loop Kp
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ Current Loop Ki
+ UINT
+ 16
+ 64
+
+ rw
+ o
+
+
+
+
+ DT2012
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Velocity Loop Kp Default
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Velocity Loop Ki Default
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ Velocity Loop Kp
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ Velocity Loop Ki
+ UINT
+ 16
+ 64
+
+ rw
+ o
+
+
+
+
+ DT2013
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Position Loop Kp Default
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Position Loop Ki Default
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ Position Loop Kp
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ Position Loop Ki
+ UINT
+ 16
+ 64
+
+ rw
+ o
+
+
+
+
+ DT2014
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuBrakeControl
+ USINT
+ 8
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuBrakeState
+ USINT
+ 8
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ EuBrakeAutoState
+ USINT
+ 8
+ 48
+
+ rw
+ o
+
+
+
+
+ DT2016
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Servo Temperture
+ SINT
+ 8
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ EuHighTemperatureLimit
+ SINT
+ 8
+ 32
+
+ rw
+ o
+
+
+
+ 3
+ EuHighTemperatureWindowsTime
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+
+ DT2020
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuMotorBlockTorque
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ EuMotorBlockTime
+ UINT
+ 16
+ 32
+
+ rw
+ o
+
+
+
+ 3
+ EuMotorBlockVelocity
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+ DT2021
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuVolecityFollowingErrorWindows
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuVolecityFollowingErrorTime
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+
+ DT202D
+ 144
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuUnderVoltageThreshold
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuUnderVoltageTime
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ EuOverVoltageThreshold
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+ 4
+ EuOverVoltageTime
+ UDINT
+ 32
+ 112
+
+ rw
+ o
+
+
+
+
+ DT202E
+ 128
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuVelocityFeedforwardControlSelect
+ INT
+ 16
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuVelocityFeedforwardFilterTimeConst
+ INT
+ 16
+ 32
+
+ rw
+ o
+
+
+
+ 3
+ EuVelocityFeedforwardGain
+ INT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ EuVelocityFeedforwardOriginalValue
+ DINT
+ 32
+ 64
+
+ ro
+ o
+
+
+
+ 4
+ EuVelocityFeedforwardFilteredValue
+ DINT
+ 32
+ 96
+
+ ro
+ o
+
+
+
+
+ DT210F
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ FocCurBiasA
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ FocCurBiasB
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ FocCurBiasC
+ UINT
+ 16
+ 48
+
+ ro
+ o
+
+
+
+
+ DT607D
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Min position limit
+ DINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Max position limit
+ DINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+ DT6091
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Motor revolutions
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Shaft revolutions
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+ DT60C1
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Interpolation data record
+ DINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+
+ DT60C2
+ 32
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Interpolation period
+ USINT
+ 8
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Interpolation Index
+ SINT
+ 8
+ 24
+
+ rw
+ o
+
+
+
+
+ DT60FF
+ 32
+
+ 0
+ Target Velocity
+ UDINT
+ 32
+ 0
+
+ rw
+ o
+ R
+
+
+
+
+ DT6502
+ 32
+
+ 0
+ Supported Drive Modes
+ UDINT
+ 32
+ 0
+
+ ro
+ o
+
+
+
+
+ DTF000
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Module index distance
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Maximum number of modules
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+
+ DTF010ARR
+ UDINT
+ 64
+
+ 1
+ 2
+
+
+
+ DTF010
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DTF010ARR
+ 64
+ 16
+
+ ro
+ o
+
+
+
+
+
+ DTF030ARR
+ UDINT
+ 64
+
+ 1
+ 2
+
+
+
+ DTF030
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DTF030ARR
+ 64
+ 16
+
+ ro
+ o
+
+
+
+
+
+ DTF050ARR
+ UDINT
+ 64
+
+ 1
+ 2
+
+
+
+ DTF050
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DTF050ARR
+ 64
+ 16
+
+ ro
+ o
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Outputs
+ Inputs
+ MBoxState
+ MBoxOut
+ MBoxIn
+ Outputs
+ Inputs
+
+
+
+
+
+ Synchron
+ SM-Synchron
+ #x0
+ 0
+ 0
+ 0
+
+
+ DC
+ DC-Synchron
+ #x300
+ 0
+ 0
+ 0
+
+
+
+
+ Axis 0
+ #x119800
+ #x219800
+ #x319800
+
+
+
+ 2048
+ 800E00CC8813f000000000800000
+
+ 424d760500000000000036000000280000001f0000000e000000010018000000000040050000c40e0000c40e00000000000000000000abc1f68aa9f48aa9f39eb8f5ecf1fdffffffffffff6f95f1b5c8f8a4bcf67499f1fffffffffffff8f9fd608aefedf1fd94b0f4a5bdf6ffffffffffff6991f097b2f56c93f092aff4ffffffffffff88a7f3d8e2fbffffffa1b9f6c4d4f9000000d3defa93aff490adf492aff4ffffffffffffffffff99b4f590adf490acf4fefeffffffffffffff6f94f1becff890adf492aef5f6f8feffffffe9eefc2f66ebdae4fb678ff0678ff0ffffffffffffffffff5a85efdfe7fc97b2f5ffffff000000d1ddfa7096f181a2f2799cf2ffffffffffffb5c8f78dabf4c8d6f990adf4ffffffffffffffffffadc3f75481eea2baf591aef5ffffffffffffe2e9fc9db7f5527fee5d87ef93aff4ffffffffffffffffffe6ecfc225ce9ffffffffffff000000a0b9f64b7aed799cf25783efedf2fdffffffffffff5a86ef7d9ff27b9ef25381eeffffffffffff82a2f26d93f085a4f27397f2ffffffffffffffffff507eee9cb6f5608aef789bf1ffffffffffffffffffffffff5c87efffffffffffff000000e7edfcd4dffaa6bdf6d4dffaffffffffffffffffffcbd8f9f8f9fed3dffaf6f9fefffffffffffffafbfedce5fbd3dffacad8f9ffffffffffffffffffaac0f6e2eafcb2c6f7d0dcfaffffffffffffffffffffffffb6c9f7ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000003a6eeb366beb366beb366beb366beb366beb3167eb5c87efffffffffffffffffffc3d2f96b92f0ccd9f9ffffffffffffffffffaac0f6ffffffbccdf8fafbfeffffffffffffffffffffffffffffffa3bbf67ea0f2a4bcf6ffffffffffff000000094ae70346e70446e70446e70446e70446e70041e63369ebffffffffffffffffff94b0f4003de6a3bbf5fffffffefefe205be90035e4ffffff5380ee003ee6b7caf8fffffffffffff2f5fd114fe80748e70446e70748e71250e8f9fbfe000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99b4f50446e7a9bff6ffffff3066eb1250e82760eaffffff8eabf40849e70043e6edf1fdffffff396dec0f4ee8628bf0ccd9fa5f89ef0f4ee85280ee0000007096f16d93f16d93f16d93f16d93f16d93f16990f088a7f3ffffffffffffffffff9bb5f50446e7afc4f6eff3fd0446e7245eeaffffffffffffffffff80a1f20a4be77d9ff2ffffff0346e61755e9ffffffffffffffffff1552e8225ce90000000648e60144e60144e60144e60144e60144e6003fe63168ebffffffffffffffffff91adf40446e7aac0f6d9e3fb0748e74e7deeffffffffffffffffffb8cbf80849e76a91f0ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee9000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fafe094ae70748e7f1f4fdffffff0547e70d4ce7b8caf8fffffff4f7fe2961ea0849e7aac1f6ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee90000004475ec4072ec4072ec4072ec4072ec4072ec3b6eec648df0ffffffffffff2d64ea0345e7afc4f7ffffffffffff9bb5f50245e60039e5ffffff5480ee0446e73167ebffffffffffff0547e71e59e9ffffffffffffffffff1a57e8255ee9000000265fe9215be9215ce9215ce9215ce9215ce91b57e94a7aedffffff779bf20d4de76890f0ffffffffffffffffffffffffc0d1f92962eaffffff6f94f17ea0f2ffffffffffffffffff0a4be7235deaffffffffffffffffff1f5ae92961ea000000
+
+
+
+
+ Axis (csv,csp,cst)
+ dynamic switchbewteen csp/csv
+
+ #x1600
+ #x1601
+ #x1602
+ Outputs
+
+ #x6040
+ 0
+ 16
+ Control Word
+ object 0x6040:0
+ UINT
+
+
+ #x607A
+ 0
+ 32
+ Target Position
+ object 0x607A:0
+ DINT
+
+
+ #x60FF
+ 0
+ 32
+ Target Velocity
+ object 0x60FF:0
+ DINT
+
+
+ #x6071
+ 0
+ 16
+ Target Torque
+ object 0x6071:0
+ INT
+
+
+ #x6060
+ 0
+ 8
+ Mode Of Operation
+ object 0x6060:0
+ SINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1a00
+ #x1a01
+ #x1a02
+ Inputs
+
+ #x6041
+ 0
+ 16
+ Status Word
+ object 0x6041:0
+ UINT
+
+
+ #x6064
+ 0
+ 32
+ Actual Position
+ object 0x6064:0
+ DINT
+
+
+ #x606C
+ 0
+ 32
+ Actual Velocity
+ object 0x606C:0
+ DINT
+
+
+ #x6077
+ 0
+ 16
+ Actual Torque
+ object 0x6077:0
+ INT
+
+
+ #x6061
+ 0
+ 8
+ Mode Of OperationDisplay
+ object 0x6061:0
+ SINT
+
+
+ #x603F
+ 0
+ 16
+ Error Code
+ object 0x603F:0
+ UINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ 402
+
+
+
+ Axis (pp,pv,pt)
+ Axis only supports pp
+
+ #x1601
+ #x1600
+ #x1602
+ Outputs
+
+ #x6040
+ 0
+ 16
+ Control Word
+ object 0x6040:0
+ UINT
+
+
+ #x607A
+ 0
+ 32
+ Target Position
+ object 0x607A:0
+ DINT
+
+
+ #x60FF
+ 0
+ 32
+ Target Velocity
+ object 0x60FF:0
+ DINT
+
+
+ #x6071
+ 0
+ 16
+ Target Torque
+ object 0x6071:0
+ INT
+
+
+ #x6083
+ 0
+ 32
+ Profile Acceleration
+ object 0x6083:0
+ UDINT
+
+
+ #x6084
+ 0
+ 32
+ Profile Deceleration
+ object 0x6084:0
+ UDINT
+
+
+ #x6081
+ 0
+ 32
+ Profile Velocity
+ object 0x6081:0
+ UDINT
+
+
+ #x6087
+ 0
+ 32
+ Torque Slope
+ object 0x6087:0
+ UDINT
+
+
+ #x6060
+ 0
+ 8
+ Modes Of Operation
+ object 0x6060:0
+ SINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1a01
+ #x1a00
+ #x1a02
+ Inputs
+
+ #x6041
+ 0
+ 16
+ Status Word
+ object 0x6041:0
+ UINT
+
+
+ #x6064
+ 0
+ 32
+ Actual Position
+ object 0x6064:0
+ DINT
+
+
+ #x606C
+ 0
+ 32
+ Actual Velocity
+ object 0x606C:0
+ DINT
+
+
+ #x6077
+ 0
+ 16
+ Actual Torque
+ object 0x6077:0
+ INT
+
+
+ #x6061
+ 0
+ 8
+ Mode Of OperationDisplay
+ object 0x6061:0
+ SINT
+
+
+ #x603F
+ 0
+ 16
+ Error Code
+ object 0x603F:0
+ UINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+
+
+ SO
+ #x6060
+ 0
+ 08
+ Modes of operation
+
+
+
+
+ 402
+
+
+
+ pv - axis
+ Axis only supports pv
+
+ #x1602
+ #x1600
+ #x1601
+ Outputs
+
+ #x6040
+ 0
+ 16
+ Control Word
+ object 0x6040:0
+ UINT
+
+
+ #x60FF
+ 0
+ 32
+ Target Velocity
+ object 0x60FF:0
+ DINT
+
+
+ #x6083
+ 0
+ 32
+ Profile Acceleration
+ object 0x6083:0
+ UDINT
+
+
+ #x6084
+ 0
+ 32
+ Profile Deceleration
+ object 0x6084:0
+ UDINT
+
+
+ #x6060
+ 0
+ 8
+ Modes Of Operation
+ object 0x6060:0
+ SINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1a02
+ #x1a00
+ #x1a01
+ Inputs
+
+ #x6041
+ 0
+ 16
+ Status Word
+ object 0x6041:0
+ UINT
+
+
+ #x606C
+ 0
+ 32
+ Actual Velocity
+ object 0x606C:0
+ DINT
+
+
+ #x6061
+ 0
+ 8
+ Mode Of OperationDisplay
+ object 0x6061:0
+ SINT
+
+
+ #x603F
+ 0
+ 16
+ Error Code
+ object 0x603F:0
+ UINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+
+
+ SO
+ #x6060
+ 0
+ 08
+ Modes of operation
+
+
+
+
+ 402
+
+
+
+
+
diff --git a/docs/EYOU_ServoModule_ECAT_V145_no_slot.xml b/docs/EYOU_ServoModule_ECAT_V145_no_slot.xml
new file mode 100644
index 00000000..d8204e8f
--- /dev/null
+++ b/docs/EYOU_ServoModule_ECAT_V145_no_slot.xml
@@ -0,0 +1,5495 @@
+
+
+
+ #x1097
+ Jiangsu Yiyou Robot Technology Co., Ltd.
+ 424d760500000000000036000000280000001f0000000e000000010018000000000040050000c40e0000c40e00000000000000000000abc1f68aa9f48aa9f39eb8f5ecf1fdffffffffffff6f95f1b5c8f8a4bcf67499f1fffffffffffff8f9fd608aefedf1fd94b0f4a5bdf6ffffffffffff6991f097b2f56c93f092aff4ffffffffffff88a7f3d8e2fbffffffa1b9f6c4d4f9000000d3defa93aff490adf492aff4ffffffffffffffffff99b4f590adf490acf4fefeffffffffffffff6f94f1becff890adf492aef5f6f8feffffffe9eefc2f66ebdae4fb678ff0678ff0ffffffffffffffffff5a85efdfe7fc97b2f5ffffff000000d1ddfa7096f181a2f2799cf2ffffffffffffb5c8f78dabf4c8d6f990adf4ffffffffffffffffffadc3f75481eea2baf591aef5ffffffffffffe2e9fc9db7f5527fee5d87ef93aff4ffffffffffffffffffe6ecfc225ce9ffffffffffff000000a0b9f64b7aed799cf25783efedf2fdffffffffffff5a86ef7d9ff27b9ef25381eeffffffffffff82a2f26d93f085a4f27397f2ffffffffffffffffff507eee9cb6f5608aef789bf1ffffffffffffffffffffffff5c87efffffffffffff000000e7edfcd4dffaa6bdf6d4dffaffffffffffffffffffcbd8f9f8f9fed3dffaf6f9fefffffffffffffafbfedce5fbd3dffacad8f9ffffffffffffffffffaac0f6e2eafcb2c6f7d0dcfaffffffffffffffffffffffffb6c9f7ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000003a6eeb366beb366beb366beb366beb366beb3167eb5c87efffffffffffffffffffc3d2f96b92f0ccd9f9ffffffffffffffffffaac0f6ffffffbccdf8fafbfeffffffffffffffffffffffffffffffa3bbf67ea0f2a4bcf6ffffffffffff000000094ae70346e70446e70446e70446e70446e70041e63369ebffffffffffffffffff94b0f4003de6a3bbf5fffffffefefe205be90035e4ffffff5380ee003ee6b7caf8fffffffffffff2f5fd114fe80748e70446e70748e71250e8f9fbfe000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99b4f50446e7a9bff6ffffff3066eb1250e82760eaffffff8eabf40849e70043e6edf1fdffffff396dec0f4ee8628bf0ccd9fa5f89ef0f4ee85280ee0000007096f16d93f16d93f16d93f16d93f16d93f16990f088a7f3ffffffffffffffffff9bb5f50446e7afc4f6eff3fd0446e7245eeaffffffffffffffffff80a1f20a4be77d9ff2ffffff0346e61755e9ffffffffffffffffff1552e8225ce90000000648e60144e60144e60144e60144e60144e6003fe63168ebffffffffffffffffff91adf40446e7aac0f6d9e3fb0748e74e7deeffffffffffffffffffb8cbf80849e76a91f0ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee9000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fafe094ae70748e7f1f4fdffffff0547e70d4ce7b8caf8fffffff4f7fe2961ea0849e7aac1f6ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee90000004475ec4072ec4072ec4072ec4072ec4072ec3b6eec648df0ffffffffffff2d64ea0345e7afc4f7ffffffffffff9bb5f50245e60039e5ffffff5480ee0446e73167ebffffffffffff0547e71e59e9ffffffffffffffffff1a57e8255ee9000000265fe9215be9215ce9215ce9215ce9215ce91b57e94a7aedffffff779bf20d4de76890f0ffffffffffffffffffffffffc0d1f92962eaffffff6f94f17ea0f2ffffffffffffffffff0a4be7235deaffffffffffffffffff1f5ae92961ea000000
+
+
+
+
+ ServoDrive
+ Servo Drives
+ 424d760500000000000036000000280000001f0000000e000000010018000000000040050000c40e0000c40e00000000000000000000abc1f68aa9f48aa9f39eb8f5ecf1fdffffffffffff6f95f1b5c8f8a4bcf67499f1fffffffffffff8f9fd608aefedf1fd94b0f4a5bdf6ffffffffffff6991f097b2f56c93f092aff4ffffffffffff88a7f3d8e2fbffffffa1b9f6c4d4f9000000d3defa93aff490adf492aff4ffffffffffffffffff99b4f590adf490acf4fefeffffffffffffff6f94f1becff890adf492aef5f6f8feffffffe9eefc2f66ebdae4fb678ff0678ff0ffffffffffffffffff5a85efdfe7fc97b2f5ffffff000000d1ddfa7096f181a2f2799cf2ffffffffffffb5c8f78dabf4c8d6f990adf4ffffffffffffffffffadc3f75481eea2baf591aef5ffffffffffffe2e9fc9db7f5527fee5d87ef93aff4ffffffffffffffffffe6ecfc225ce9ffffffffffff000000a0b9f64b7aed799cf25783efedf2fdffffffffffff5a86ef7d9ff27b9ef25381eeffffffffffff82a2f26d93f085a4f27397f2ffffffffffffffffff507eee9cb6f5608aef789bf1ffffffffffffffffffffffff5c87efffffffffffff000000e7edfcd4dffaa6bdf6d4dffaffffffffffffffffffcbd8f9f8f9fed3dffaf6f9fefffffffffffffafbfedce5fbd3dffacad8f9ffffffffffffffffffaac0f6e2eafcb2c6f7d0dcfaffffffffffffffffffffffffb6c9f7ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000003a6eeb366beb366beb366beb366beb366beb3167eb5c87efffffffffffffffffffc3d2f96b92f0ccd9f9ffffffffffffffffffaac0f6ffffffbccdf8fafbfeffffffffffffffffffffffffffffffa3bbf67ea0f2a4bcf6ffffffffffff000000094ae70346e70446e70446e70446e70446e70041e63369ebffffffffffffffffff94b0f4003de6a3bbf5fffffffefefe205be90035e4ffffff5380ee003ee6b7caf8fffffffffffff2f5fd114fe80748e70446e70748e71250e8f9fbfe000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99b4f50446e7a9bff6ffffff3066eb1250e82760eaffffff8eabf40849e70043e6edf1fdffffff396dec0f4ee8628bf0ccd9fa5f89ef0f4ee85280ee0000007096f16d93f16d93f16d93f16d93f16d93f16990f088a7f3ffffffffffffffffff9bb5f50446e7afc4f6eff3fd0446e7245eeaffffffffffffffffff80a1f20a4be77d9ff2ffffff0346e61755e9ffffffffffffffffff1552e8225ce90000000648e60144e60144e60144e60144e60144e6003fe63168ebffffffffffffffffff91adf40446e7aac0f6d9e3fb0748e74e7deeffffffffffffffffffb8cbf80849e76a91f0ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee9000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fafe094ae70748e7f1f4fdffffff0547e70d4ce7b8caf8fffffff4f7fe2961ea0849e7aac1f6ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee90000004475ec4072ec4072ec4072ec4072ec4072ec3b6eec648df0ffffffffffff2d64ea0345e7afc4f7ffffffffffff9bb5f50245e60039e5ffffff5480ee0446e73167ebffffffffffff0547e71e59e9ffffffffffffffffff1a57e8255ee9000000265fe9215be9215ce9215ce9215ce9215ce91b57e94a7aedffffff779bf20d4de76890f0ffffffffffffffffffffffffc0d1f92962eaffffff6f94f17ea0f2ffffffffffffffffff0a4be7235deaffffffffffffffffff1f5ae92961ea000000
+
+
+
+
+ EYOU_ServoModule_V145
+ EYOU_ServoModule_ECAT_V145
+
+
+
+ 2000
+ 9000
+ 5000
+ 200
+
+
+
+
+ 100
+ 2000
+
+
+
+ ServoDrive
+
+
+ 402
+
+
+
+
+
+ BIT2
+ 2
+
+
+
+ BOOL
+ 1
+
+
+
+ DINT
+ 32
+
+
+
+ INT
+ 16
+
+
+
+ SINT
+ 8
+
+
+
+ UDINT
+ 32
+
+
+
+ UINT
+ 16
+
+
+
+ USINT
+ 8
+
+
+
+ REAL
+ 32
+
+
+
+ ARRAY [0..3] OF BYTE
+ USINT
+ 32
+
+ 0
+ 4
+
+
+
+
+ STRING(12)
+ 96
+
+
+
+ STRING(10)
+ 80
+
+
+
+ DT1010
+ 112
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Store All Parameters
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Store Communication Parameters
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ Store Application Parametesr
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+
+
+ DT1011
+ 112
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Restore All Parameters
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Restore Communication Parameters
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ Restore Application Parametesr
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+
+
+ DT1018
+ 144
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Vendor ID
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Product code
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ Revision
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ Serial number
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+
+ DT1C00ARR
+ USINT
+ 32
+
+ 1
+ 4
+
+
+
+ DT1C00
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DT1C00ARR
+ 32
+ 16
+
+ ro
+ o
+
+
+
+
+
+ DT10F1
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Local Error Reaction
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Sync Error Counter Limit
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+
+ DT1C32
+ 488
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ m
+
+
+
+ 1
+ Synchronization Type
+ UINT
+ 16
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Cycle Time
+ UDINT
+ 32
+ 32
+
+ ro
+ o
+
+
+
+ 4
+ Synchronization Types supported
+ UINT
+ 16
+ 96
+
+ ro
+ o
+
+
+
+ 5
+ Minimum Cycle Time
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 6
+ Calc and Copy Time
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 8
+ Get Cycle Time
+ UINT
+ 16
+ 208
+
+ rw
+ c
+
+
+
+ 9
+ Delay Time
+ UDINT
+ 32
+ 224
+
+ ro
+ c
+
+
+
+ 10
+ Sync0 Cycle Time
+ UDINT
+ 32
+ 256
+
+ rw
+ o
+
+
+
+ 11
+ SM-Event Missed
+ UINT
+ 16
+ 288
+
+ ro
+ c
+
+
+
+ 12
+ Cycle Time Too Small
+ UINT
+ 16
+ 304
+
+ ro
+ c
+
+
+
+ 32
+ Sync Error
+ BOOL
+ 1
+ 480
+
+ ro
+ c
+
+
+
+
+
+ DT1C33
+ 488
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ m
+
+
+
+ 1
+ Synchronization Type
+ UINT
+ 16
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Cycle Time
+ UDINT
+ 32
+ 32
+
+ ro
+ o
+
+
+
+ 4
+ Synchronization Types supported
+ UINT
+ 16
+ 96
+
+ ro
+ o
+
+
+
+ 5
+ Minimum Cycle Time
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 6
+ Calc and Copy Time
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 8
+ Get Cycle Time
+ UINT
+ 16
+ 208
+
+ rw
+ c
+
+
+
+ 9
+ Delay Time
+ UDINT
+ 32
+ 224
+
+ ro
+ c
+
+
+
+ 10
+ Sync0 Cycle Time
+ UDINT
+ 32
+ 256
+
+ rw
+ o
+
+
+
+ 11
+ SM-Event Missed
+ UINT
+ 16
+ 288
+
+ ro
+ c
+
+
+
+ 12
+ Cycle Time Too Small
+ UINT
+ 16
+ 304
+
+ ro
+ c
+
+
+
+ 32
+ Sync Error
+ BOOL
+ 1
+ 480
+
+ ro
+ c
+
+
+
+
+ DT1600
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+
+
+
+ 1
+ 1st Output Object to be mapped
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ 2nd Output Object to be mapped
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ 3rd Output Object to be mapped
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+ 4
+ 4th Output Object to be mapped
+ UDINT
+ 32
+ 112
+
+ rw
+ o
+
+
+
+ 5
+ 5th Output Object to be mapped
+ UDINT
+ 32
+ 144
+
+ rw
+ o
+
+
+
+ 6
+ 6th Output Object to be mapped
+ UDINT
+ 32
+ 176
+
+ rw
+ o
+
+
+
+ 7
+ 7th Output Object to be mapped
+ UDINT
+ 32
+ 208
+
+ rw
+ o
+
+
+
+ 8
+ 8th Output Object to be mapped
+ UDINT
+ 32
+ 240
+
+ rw
+ o
+
+
+
+ 9
+ 9th Output Object to be mapped
+ UDINT
+ 32
+ 272
+
+ rw
+ o
+
+
+
+ 10
+ 10th Output Object to be mapped
+ UDINT
+ 32
+ 304
+
+ rw
+ o
+
+
+
+
+ DT1601
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+
+
+
+ 1
+ 1st Output Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Output Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Output Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Output Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Output Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Output Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Output Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Output Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Output Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Output Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1602
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ 1st Output Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Output Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Output Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Output Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Output Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Output Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Output Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Output Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Output Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Output Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1A00
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+
+
+
+ 1
+ 1st Input Object to be mapped
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ 2nd Input Object to be mapped
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ 3rd Input Object to be mapped
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+ 4
+ 4th Input Object to be mapped
+ UDINT
+ 32
+ 112
+
+ rw
+ o
+
+
+
+ 5
+ 5th Input Object to be mapped
+ UDINT
+ 32
+ 144
+
+ rw
+ o
+
+
+
+ 6
+ 6th Input Object to be mapped
+ UDINT
+ 32
+ 176
+
+ rw
+ o
+
+
+
+ 7
+ 7th Input Object to be mapped
+ UDINT
+ 32
+ 208
+
+ rw
+ o
+
+
+
+ 8
+ 8th Input Object to be mapped
+ UDINT
+ 32
+ 240
+
+ rw
+ o
+
+
+
+ 9
+ 9th Input Object to be mapped
+ UDINT
+ 32
+ 272
+
+ rw
+ o
+
+
+
+ 10
+ 10th Input Object to be mapped
+ UDINT
+ 32
+ 304
+
+ rw
+ o
+
+
+
+
+ DT1A01
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ 1st Input Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Input Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Input Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Input Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Input Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Input Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Input Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Input Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Input Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Input Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1A02
+ 336
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ 1st Input Object to be mapped
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ 2nd Input Object to be mapped
+ UDINT
+ 32
+ 48
+
+ ro
+ o
+
+
+
+ 3
+ 3rd Input Object to be mapped
+ UDINT
+ 32
+ 80
+
+ ro
+ o
+
+
+
+ 4
+ 4th Input Object to be mapped
+ UDINT
+ 32
+ 112
+
+ ro
+ o
+
+
+
+ 5
+ 5th Input Object to be mapped
+ UDINT
+ 32
+ 144
+
+ ro
+ o
+
+
+
+ 6
+ 6th Input Object to be mapped
+ UDINT
+ 32
+ 176
+
+ ro
+ o
+
+
+
+ 7
+ 7th Input Object to be mapped
+ UDINT
+ 32
+ 208
+
+ ro
+ o
+
+
+
+ 8
+ 8th Input Object to be mapped
+ UDINT
+ 32
+ 240
+
+ ro
+ o
+
+
+
+ 9
+ 9th Input Object to be mapped
+ UDINT
+ 32
+ 272
+
+ ro
+ o
+
+
+
+ 10
+ 10th Input Object to be mapped
+ UDINT
+ 32
+ 304
+
+ ro
+ o
+
+
+
+
+ DT1C12ARR
+ UINT
+ 32
+
+ 1
+ 2
+
+
+
+ DT1C12
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+ o
+
+
+
+ Elements
+ DT1C12ARR
+ 32
+ 16
+
+ rw
+ o
+
+
+
+
+ DT1C13ARR
+ UINT
+ 32
+
+ 1
+ 2
+
+
+
+ DT1C13
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ rw
+ o
+
+
+
+ Elements
+ DT1C13ARR
+ 32
+ 16
+
+ rw
+ o
+
+
+
+
+ DT2001
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Eu Node Id
+ USINT
+ 8
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Eu Can BitRate
+ UINT
+ 16
+ 32
+
+ rw
+ o
+
+
+
+
+ DT2010
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Current Loop Kp Default
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Current Loop Ki Default
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ Current Loop Kp
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ Current Loop Ki
+ UINT
+ 16
+ 64
+
+ rw
+ o
+
+
+
+
+ DT2012
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Velocity Loop Kp Default
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Velocity Loop Ki Default
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ Velocity Loop Kp
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ Velocity Loop Ki
+ UINT
+ 16
+ 64
+
+ rw
+ o
+
+
+
+
+ DT2013
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Position Loop Kp Default
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Position Loop Ki Default
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ Position Loop Kp
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ Position Loop Ki
+ UINT
+ 16
+ 64
+
+ rw
+ o
+
+
+
+
+ DT2014
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuBrakeControl
+ USINT
+ 8
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuBrakeState
+ USINT
+ 8
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ EuBrakeAutoState
+ USINT
+ 8
+ 48
+
+ rw
+ o
+
+
+
+
+ DT2016
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Servo Temperture
+ SINT
+ 8
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ EuHighTemperatureLimit
+ SINT
+ 8
+ 32
+
+ rw
+ o
+
+
+
+ 3
+ EuHighTemperatureWindowsTime
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+
+ DT2020
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuMotorBlockTorque
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ EuMotorBlockTime
+ UINT
+ 16
+ 32
+
+ rw
+ o
+
+
+
+ 3
+ EuMotorBlockVelocity
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+ DT2021
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuVolecityFollowingErrorWindows
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuVolecityFollowingErrorTime
+ UINT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+
+ DT202D
+ 144
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuUnderVoltageThreshold
+ UDINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuUnderVoltageTime
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+ 3
+ EuOverVoltageThreshold
+ UDINT
+ 32
+ 80
+
+ rw
+ o
+
+
+
+ 4
+ EuOverVoltageTime
+ UDINT
+ 32
+ 112
+
+ rw
+ o
+
+
+
+
+ DT202E
+ 128
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ EuVelocityFeedforwardControlSelect
+ INT
+ 16
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ EuVelocityFeedforwardFilterTimeConst
+ INT
+ 16
+ 32
+
+ rw
+ o
+
+
+
+ 3
+ EuVelocityFeedforwardGain
+ INT
+ 16
+ 48
+
+ rw
+ o
+
+
+
+ 4
+ EuVelocityFeedforwardOriginalValue
+ DINT
+ 32
+ 64
+
+ ro
+ o
+
+
+
+ 4
+ EuVelocityFeedforwardFilteredValue
+ DINT
+ 32
+ 96
+
+ ro
+ o
+
+
+
+
+ DT210F
+ 64
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ FocCurBiasA
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ FocCurBiasB
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+ 3
+ FocCurBiasC
+ UINT
+ 16
+ 48
+
+ ro
+ o
+
+
+
+
+ DT607D
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Min position limit
+ DINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Max position limit
+ DINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+ DT6091
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Motor revolutions
+ UDINT
+ 32
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Shaft revolutions
+ UDINT
+ 32
+ 48
+
+ rw
+ o
+
+
+
+
+ DT60C1
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Interpolation data record
+ DINT
+ 32
+ 16
+
+ rw
+ o
+
+
+
+
+ DT60C2
+ 32
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Interpolation period
+ USINT
+ 8
+ 16
+
+ rw
+ o
+
+
+
+ 2
+ Interpolation Index
+ SINT
+ 8
+ 24
+
+ rw
+ o
+
+
+
+
+ DT60FF
+ 32
+
+ 0
+ Target Velocity
+ UDINT
+ 32
+ 0
+
+ rw
+ o
+ R
+
+
+
+
+ DT6502
+ 32
+
+ 0
+ Supported Drive Modes
+ UDINT
+ 32
+ 0
+
+ ro
+ o
+
+
+
+
+ DTF000
+ 48
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ 1
+ Module index distance
+ UINT
+ 16
+ 16
+
+ ro
+ o
+
+
+
+ 2
+ Maximum number of modules
+ UINT
+ 16
+ 32
+
+ ro
+ o
+
+
+
+
+ DTF010ARR
+ UDINT
+ 64
+
+ 1
+ 2
+
+
+
+ DTF010
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DTF010ARR
+ 64
+ 16
+
+ ro
+ o
+
+
+
+
+
+ DTF030ARR
+ UDINT
+ 64
+
+ 1
+ 2
+
+
+
+ DTF030
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DTF030ARR
+ 64
+ 16
+
+ ro
+ o
+
+
+
+
+
+ DTF050ARR
+ UDINT
+ 64
+
+ 1
+ 2
+
+
+
+ DTF050
+ 80
+
+ 0
+ SubIndex 000
+ USINT
+ 8
+ 0
+
+ ro
+ o
+
+
+
+ Elements
+ DTF050ARR
+ 64
+ 16
+
+ ro
+ o
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Outputs
+ Inputs
+ MBoxState
+ MBoxOut
+ MBoxIn
+ Outputs
+ Inputs
+
+ #x1600
+ Outputs
+
+ #x6040
+ 0
+ 16
+ Control Word
+ object 0x6040:0
+ UINT
+
+
+ #x607A
+ 0
+ 32
+ Target Position
+ object 0x607A:0
+ DINT
+
+
+ #x60FF
+ 0
+ 32
+ Target Velocity
+ object 0x60FF:0
+ DINT
+
+
+ #x6071
+ 0
+ 16
+ Target Torque
+ object 0x6071:0
+ INT
+
+
+ #x6060
+ 0
+ 8
+ Mode Of Operation
+ object 0x6060:0
+ SINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1601
+ Outputs
+
+ #x6040
+ 0
+ 16
+ Control Word
+ object 0x6040:0
+ UINT
+
+
+ #x607A
+ 0
+ 32
+ Target Position
+ object 0x607A:0
+ DINT
+
+
+ #x60FF
+ 0
+ 32
+ Target Velocity
+ object 0x60FF:0
+ DINT
+
+
+ #x6071
+ 0
+ 16
+ Target Torque
+ object 0x6071:0
+ INT
+
+
+ #x6083
+ 0
+ 32
+ Profile Acceleration
+ object 0x6083:0
+ UDINT
+
+
+ #x6084
+ 0
+ 32
+ Profile Deceleration
+ object 0x6084:0
+ UDINT
+
+
+ #x6081
+ 0
+ 32
+ Profile Velocity
+ object 0x6081:0
+ UDINT
+
+
+ #x6087
+ 0
+ 32
+ Torque Slope
+ object 0x6087:0
+ UDINT
+
+
+ #x6060
+ 0
+ 8
+ Modes Of Operation
+ object 0x6060:0
+ SINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1602
+ Outputs
+
+ #x6040
+ 0
+ 16
+ Control Word
+ object 0x6040:0
+ UINT
+
+
+ #x60FF
+ 0
+ 32
+ Target Velocity
+ object 0x60FF:0
+ DINT
+
+
+ #x6083
+ 0
+ 32
+ Profile Acceleration
+ object 0x6083:0
+ UDINT
+
+
+ #x6084
+ 0
+ 32
+ Profile Deceleration
+ object 0x6084:0
+ UDINT
+
+
+ #x6060
+ 0
+ 8
+ Modes Of Operation
+ object 0x6060:0
+ SINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1A00
+ Inputs
+
+ #x6041
+ 0
+ 16
+ Status Word
+ object 0x6041:0
+ UINT
+
+
+ #x6064
+ 0
+ 32
+ Actual Position
+ object 0x6064:0
+ DINT
+
+
+ #x606C
+ 0
+ 32
+ Actual Velocity
+ object 0x606C:0
+ DINT
+
+
+ #x6077
+ 0
+ 16
+ Actual Torque
+ object 0x6077:0
+ INT
+
+
+ #x6061
+ 0
+ 8
+ Mode Of OperationDisplay
+ object 0x6061:0
+ SINT
+
+
+ #x603F
+ 0
+ 16
+ Error Code
+ object 0x603F:0
+ UINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1A01
+ Inputs
+
+ #x6041
+ 0
+ 16
+ Status Word
+ object 0x6041:0
+ UINT
+
+
+ #x6064
+ 0
+ 32
+ Actual Position
+ object 0x6064:0
+ DINT
+
+
+ #x606C
+ 0
+ 32
+ Actual Velocity
+ object 0x606C:0
+ DINT
+
+
+ #x6077
+ 0
+ 16
+ Actual Torque
+ object 0x6077:0
+ INT
+
+
+ #x6061
+ 0
+ 8
+ Mode Of OperationDisplay
+ object 0x6061:0
+ SINT
+
+
+ #x603F
+ 0
+ 16
+ Error Code
+ object 0x603F:0
+ UINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+ #x1A02
+ Inputs
+
+ #x6041
+ 0
+ 16
+ Status Word
+ object 0x6041:0
+ UINT
+
+
+ #x606C
+ 0
+ 32
+ Actual Velocity
+ object 0x606C:0
+ DINT
+
+
+ #x6061
+ 0
+ 8
+ Mode Of OperationDisplay
+ object 0x6061:0
+ SINT
+
+
+ #x603F
+ 0
+ 16
+ Error Code
+ object 0x603F:0
+ UINT
+
+
+ #x0
+ 0
+ 8
+
+
+
+
+
+
+
+ Synchron
+ SM-Synchron
+ #x0
+ 0
+ 0
+ 0
+
+
+ DC
+ DC-Synchron
+ #x300
+ 0
+ 0
+ 0
+
+
+
+ 2048
+ 800E00CC8813f000000000800000
+
+ 424d760500000000000036000000280000001f0000000e000000010018000000000040050000c40e0000c40e00000000000000000000abc1f68aa9f48aa9f39eb8f5ecf1fdffffffffffff6f95f1b5c8f8a4bcf67499f1fffffffffffff8f9fd608aefedf1fd94b0f4a5bdf6ffffffffffff6991f097b2f56c93f092aff4ffffffffffff88a7f3d8e2fbffffffa1b9f6c4d4f9000000d3defa93aff490adf492aff4ffffffffffffffffff99b4f590adf490acf4fefeffffffffffffff6f94f1becff890adf492aef5f6f8feffffffe9eefc2f66ebdae4fb678ff0678ff0ffffffffffffffffff5a85efdfe7fc97b2f5ffffff000000d1ddfa7096f181a2f2799cf2ffffffffffffb5c8f78dabf4c8d6f990adf4ffffffffffffffffffadc3f75481eea2baf591aef5ffffffffffffe2e9fc9db7f5527fee5d87ef93aff4ffffffffffffffffffe6ecfc225ce9ffffffffffff000000a0b9f64b7aed799cf25783efedf2fdffffffffffff5a86ef7d9ff27b9ef25381eeffffffffffff82a2f26d93f085a4f27397f2ffffffffffffffffff507eee9cb6f5608aef789bf1ffffffffffffffffffffffff5c87efffffffffffff000000e7edfcd4dffaa6bdf6d4dffaffffffffffffffffffcbd8f9f8f9fed3dffaf6f9fefffffffffffffafbfedce5fbd3dffacad8f9ffffffffffffffffffaac0f6e2eafcb2c6f7d0dcfaffffffffffffffffffffffffb6c9f7ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000003a6eeb366beb366beb366beb366beb366beb3167eb5c87efffffffffffffffffffc3d2f96b92f0ccd9f9ffffffffffffffffffaac0f6ffffffbccdf8fafbfeffffffffffffffffffffffffffffffa3bbf67ea0f2a4bcf6ffffffffffff000000094ae70346e70446e70446e70446e70446e70041e63369ebffffffffffffffffff94b0f4003de6a3bbf5fffffffefefe205be90035e4ffffff5380ee003ee6b7caf8fffffffffffff2f5fd114fe80748e70446e70748e71250e8f9fbfe000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99b4f50446e7a9bff6ffffff3066eb1250e82760eaffffff8eabf40849e70043e6edf1fdffffff396dec0f4ee8628bf0ccd9fa5f89ef0f4ee85280ee0000007096f16d93f16d93f16d93f16d93f16d93f16990f088a7f3ffffffffffffffffff9bb5f50446e7afc4f6eff3fd0446e7245eeaffffffffffffffffff80a1f20a4be77d9ff2ffffff0346e61755e9ffffffffffffffffff1552e8225ce90000000648e60144e60144e60144e60144e60144e6003fe63168ebffffffffffffffffff91adf40446e7aac0f6d9e3fb0748e74e7deeffffffffffffffffffb8cbf80849e76a91f0ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee9000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fafe094ae70748e7f1f4fdffffff0547e70d4ce7b8caf8fffffff4f7fe2961ea0849e7aac1f6ffffff0648e71e5ae9ffffffffffffffffff1b57e8255ee90000004475ec4072ec4072ec4072ec4072ec4072ec3b6eec648df0ffffffffffff2d64ea0345e7afc4f7ffffffffffff9bb5f50245e60039e5ffffff5480ee0446e73167ebffffffffffff0547e71e59e9ffffffffffffffffff1a57e8255ee9000000265fe9215be9215ce9215ce9215ce9215ce91b57e94a7aedffffff779bf20d4de76890f0ffffffffffffffffffffffffc0d1f92962eaffffff6f94f17ea0f2ffffffffffffffffff0a4be7235deaffffffffffffffffff1f5ae92961ea000000
+
+
+
+
diff --git a/docs/ethercat_motor_tutorial.md b/docs/ethercat_motor_tutorial.md
index 5720c0bc..2ba49119 100644
--- a/docs/ethercat_motor_tutorial.md
+++ b/docs/ethercat_motor_tutorial.md
@@ -1,25 +1,51 @@
# EtherCAT 电机接入教程
-这份文档只说明新增一种 EtherCAT 电机需要改哪里、怎么写。
+当前已接入意优 `EYOU_ServoModule_ECAT_V145`,协议为 EtherCAT CoE + CiA402,PDO 使用 `docs/EYOU_ServoModule_ECAT_V145_no_slot.xml` 中的 `0x1600/0x1A00` 映射。
-## 1. 增加 vendor
+ESI XML 作为厂商通信说明和对照资料保存,运行时不直接解析 XML。实际 PDO 映射写在:
-修改 `protos/cmvr/config/motor_config/motor_config.proto`:
-
-```proto
-enum MotorVendor {
- MOTOR_VENDOR_UNKNOWN = 0;
- MOTOR_VENDOR_TI5 = 1;
- MOTOR_VENDOR_MUJOCO = 2;
- MOTOR_VENDOR_XXX = 3;
-}
+```text
+cmvr-es/devices/motor/drivers/ethercat_motor/include/vendor/eyou/eyou_cia402_pdo_mapping.h
```
-`MOTOR_VENDOR_XXX` 改成真实厂商名,例如 `MOTOR_VENDOR_FOO`。不要复用 `TI5`。
+## 1. 系统依赖
-## 2. 写电机配置
+IgH EtherCAT userspace 已安装在:
-新增配置文件:
+```text
+dependency/x86/third_party/ethercat/v1.7.0
+```
+
+真机运行前,系统里还需要安装/加载 IgH master 内核模块。使用仓库脚本启动 EtherCAT master:
+
+```bash
+sudo script/ethercat/start_ethercat.sh eno1
+script/ethercat/status_ethercat.sh
+```
+
+其中 `eno1` 是连接 EtherCAT 从站的网卡。脚本会读取该网卡 MAC,写入:
+
+```text
+dependency/x86/third_party/ethercat/v1.7.0/etc/ethercat.conf
+```
+
+并通过 bundled IgH 的 `ethercatctl -c` 启动 master。能看到 EYOU slave 后再启动程序。
+
+停止 EtherCAT:
+
+```bash
+sudo script/ethercat/stop_ethercat.sh eno1
+```
+
+如果这张网卡要恢复给普通网络使用:
+
+```bash
+sudo script/ethercat/stop_ethercat.sh eno1 --restore-network
+```
+
+## 2. 电机配置
+
+新增或修改:
```text
cmvr-es/config/devices/motor/ethercat_motors.pb.txt
@@ -34,20 +60,28 @@ motor {
motor_groups {
id: "right_arm_ethercat"
bus_type: MOTOR_BUS_ETHERCAT
- vendor: MOTOR_VENDOR_XXX
+ vendor: MOTOR_VENDOR_EYOU
protocol: MOTOR_PROTOCOL_ETHERCAT_CIA402
- tool_frame: "R_FINGER_TIP"
ethercat {
- master_id: "eth0"
+ master_index: 0
cycle_us: 1000
- slaves { motor_id: 1 slave_index: 0 vendor_id: 0x00000000 product_code: 0x00000000 }
- slaves { motor_id: 2 slave_index: 1 vendor_id: 0x00000000 product_code: 0x00000000 }
- slaves { motor_id: 3 slave_index: 2 vendor_id: 0x00000000 product_code: 0x00000000 }
- slaves { motor_id: 4 slave_index: 3 vendor_id: 0x00000000 product_code: 0x00000000 }
- slaves { motor_id: 5 slave_index: 4 vendor_id: 0x00000000 product_code: 0x00000000 }
- slaves { motor_id: 6 slave_index: 5 vendor_id: 0x00000000 product_code: 0x00000000 }
- slaves { motor_id: 7 slave_index: 6 vendor_id: 0x00000000 product_code: 0x00000000 }
+
+ cia402 {
+ profile_position_trigger_delay_ms: 2
+ state_transition_timeout_ms: 1200
+ velocity_stop_timeout_ms: 2000
+ status_poll_period_ms: 10
+ stopped_velocity_tolerance_rad_s: 0.001
+ }
+
+ slaves { motor_id: 1 alias: 0 position: 0 }
+ slaves { motor_id: 2 alias: 0 position: 1 }
+ slaves { motor_id: 3 alias: 0 position: 2 }
+ slaves { motor_id: 4 alias: 0 position: 3 }
+ slaves { motor_id: 5 alias: 0 position: 4 }
+ slaves { motor_id: 6 alias: 0 position: 5 }
+ slaves { motor_id: 7 alias: 0 position: 6 }
}
joint_limits {
@@ -63,21 +97,26 @@ motor {
}
motors {
- motors { id: 1 joint_name: "R_SHOULDER_P" }
- motors { id: 2 joint_name: "R_SHOULDER_R" }
- motors { id: 3 joint_name: "R_SHOULDER_Y" }
- motors { id: 4 joint_name: "R_ELBOW_R" }
- motors { id: 5 joint_name: "R_WRIST_P" }
- motors { id: 6 joint_name: "R_WRIST_Y" }
- motors { id: 7 joint_name: "R_WRIST_R" }
+ motors { id: 1 joint_name: "R_SHOULDER_P" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
+ motors { id: 2 joint_name: "R_SHOULDER_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
+ motors { id: 3 joint_name: "R_SHOULDER_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
+ motors { id: 4 joint_name: "R_ELBOW_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
+ motors { id: 5 joint_name: "R_WRIST_P" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
+ motors { id: 6 joint_name: "R_WRIST_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
+ motors { id: 7 joint_name: "R_WRIST_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
}
}
}
```
-`motors.motors.id` 是系统内的电机逻辑 id。`ethercat.slaves.motor_id` 必须和它对应。
+字段说明:
-`joint_limits` 按 `joint_name` 读取,和 CAN、MuJoCo 电机保持同一个风格。
+- `master_index`:IgH master 编号,第一张 EtherCAT master 是 `0`。
+- `alias`:EtherCAT alias,一般为 `0`。
+- `position`:slave 在 EtherCAT 链路上的顺序,从 `0` 开始。
+- `motor_id`:系统内电机 id,必须和 `motors.motors.id` 对应。
+- `encoder_counts_per_rev`:电机编码器每转 count 数,用于 `rad <-> count` 换算。
+- `gear_ratio`:电机轴到关节输出轴的减速比,用于接口层 `rad/rad/s` 和驱动器 raw count/counts/s 换算。
## 3. 注册设备
@@ -98,15 +137,9 @@ devices {
}
```
-## 4. 机械臂使用 EtherCAT group
+## 4. 机械臂使用 EtherCAT 电机
-修改机械臂配置,例如:
-
-```text
-cmvr-es/config/devices/arm/arm.pb.txt
-```
-
-把 motor backend 改成:
+修改机械臂配置中的 motor backend:
```proto
motor {
@@ -122,116 +155,66 @@ motor {
}
```
-## 5. 实现 bus runtime
+## 5. 代码结构
-EtherCAT 总线资源放在:
+EtherCAT 总线运行时:
```text
cmvr-es/devices/motor/bus_runtime/ethercat/include/ethercat_motor_bus_runtime.h
cmvr-es/devices/motor/bus_runtime/ethercat/src/ethercat_motor_bus_runtime.cpp
```
-`EthercatMotorBusRuntime` 负责:
+它负责:
+
+- 打开 IgH master
+- 创建 domain
+- 使用 `vendor + protocol` 选择 PDO mapping
+- 按 mapping 配置 `0x1600/0x1A00` PDO
+- 注册每个非 padding PDO entry 的 offset
+- 启动 cyclic loop
+- 按 `motor_id + index + subindex` 提供通用 PDO 读写接口
+
+CiA402 EtherCAT 电机驱动:
```text
-读取 ethercat 配置
-初始化 EtherCAT master
-扫描/校验 slave_index、vendor_id、product_code
-启动 cyclic loop
-保存 command/feedback buffer
-停止 cyclic loop
+cmvr-es/devices/motor/drivers/ethercat_motor/include/cia402/cia402_protocol.h
+cmvr-es/devices/motor/drivers/ethercat_motor/include/cia402/cia402_objects.h
+cmvr-es/devices/motor/drivers/ethercat_motor/include/vendor/motor_vendor_adapter.h
+cmvr-es/devices/motor/drivers/ethercat_motor/src/cia402/cia402_protocol.cpp
```
-bus runtime 不创建具体电机,也不关心厂商;它只保存总线连接、线程和数据缓存。
-
-## 6. 增加具体电机 driver
-
-新增目录:
+EYOU 私有适配:
```text
-cmvr-es/devices/motor/drivers/xxx_ethercat/
- CMakeLists.txt
- include/xxx_ethercat_motor.h
- include/xxx_ethercat_motor_protocol.h
- src/xxx_ethercat_motor.cpp
- src/xxx_ethercat_motor_protocol.cpp
+cmvr-es/devices/motor/drivers/ethercat_motor/include/vendor/eyou/eyou_motor.h
+cmvr-es/devices/motor/drivers/ethercat_motor/include/vendor/eyou/eyou_motor_adapter.h
+cmvr-es/devices/motor/drivers/ethercat_motor/include/vendor/eyou/eyou_cia402_pdo_mapping.h
+cmvr-es/devices/motor/drivers/ethercat_motor/include/vendor/eyou/eyou_objects.h
+cmvr-es/devices/motor/drivers/ethercat_motor/src/vendor/eyou/eyou_motor.cpp
+cmvr-es/devices/motor/drivers/ethercat_motor/src/vendor/eyou/eyou_motor_adapter.cpp
```
-`XxxEthercatMotor` 继承 `AbstractMotor`。
+它负责:
-`XxxEthercatMotorProtocol` 继承 `MotorProtocolInterface`,把 `setTarget`、`setQd`、`getQ` 等接口转换成 EtherCAT command/feedback。
+- CiA402 `6040/6041` 状态机
+- 设置 `6060` 运行模式
+- 写 `607A/60FF/6071`
+- 读 `6064/606C/6077/603F`
+- `rad` 和 encoder count 的换算
-## 7. 在 MotorManager 里创建 EtherCAT 电机
-
-修改:
-
-```text
-cmvr-es/devices/motor/manager/src/motor_manager.cpp
-```
-
-在 `MotorManager::createEthercatMotors_()` 里按 `vendor + protocol` 创建具体电机:
-
-```cpp
-auto ethercat_bus_runtime =
- std::dynamic_pointer_cast(bus_runtime);
-
-if (group_cfg.vendor() == config::MOTOR_VENDOR_XXX &&
- group_cfg.protocol() == config::MOTOR_PROTOCOL_ETHERCAT_CIA402) {
- auto protocol = std::make_shared(ethercat_bus_runtime);
-
- std::vector> motors;
- motors.reserve(motor_cfgs.size());
- for (const auto& cfg : motor_cfgs) {
- auto motor = std::make_shared(cfg);
- motor->setProtocol(protocol);
- if (!motor->init()) {
- return {};
- }
- motors.push_back(std::move(motor));
- }
- return motors;
-}
-```
-
-## 8. 加入 CMake
-
-修改:
-
-```text
-cmvr-es/devices/motor/manager/CMakeLists.txt
-```
-
-给 `motor_manager` 链接新增的具体 EtherCAT 电机 target。
-
-修改:
-
-```text
-cmvr-es/devices/motor/CMakeLists.txt
-```
-
-加入:
-
-```cmake
-add_subdirectory(drivers/xxx_ethercat)
-```
-
-## 9. 验证配置
-
-先验证 proto:
+## 6. 编译验证
```bash
-./output/bin/protoc \
- --encode=cmvr.config.MotorRootConfig \
- -I protos \
- protos/cmvr/config/motor_config/motor_config.proto \
- < cmvr-es/config/devices/motor/ethercat_motors.pb.txt \
- > /tmp/ethercat_motors.pb.bin
+cmake -S . -B cmake-build-debug
+cmake --build cmake-build-debug --target motor_manager
```
-再编译:
+真机验证顺序:
```bash
-cmake --build cmake-build-debug --target mujoco_manual_ui_test
+sudo script/ethercat/start_ethercat.sh eno1
+script/ethercat/status_ethercat.sh
+cmake --build cmake-build-debug --target cmvr_es
```
-真机联调时先只验证初始化日志:master 打开、slave 数量、vendor/product 校验、cyclic loop 启动、每个 motor 注册成功。然后再下发运动命令。
+第一次联调先不要大幅度运动。先看 master 是否打开、slave 是否进入 OP、状态字是否更新,再给单个电机小角度目标。
diff --git a/docs/意优CANopen&EtherCAT应用手册V2.2.pdf b/docs/意优CANopen&EtherCAT应用手册V2.2.pdf
new file mode 100644
index 00000000..e1c3df2a
Binary files /dev/null and b/docs/意优CANopen&EtherCAT应用手册V2.2.pdf differ
diff --git a/request.txt b/request.txt
index 9a4d60e2..08c18e74 100644
--- a/request.txt
+++ b/request.txt
@@ -33,5 +33,6 @@ third_party/modbus/3.1.11
third_party/visp/3.7.0
third_party/mainif/0.0.5
third_party/matplotplusplus/1.2.0
+third_party/ethercat/v1.7.0
diff --git a/script/ethercat/start_ethercat.sh b/script/ethercat/start_ethercat.sh
new file mode 100755
index 00000000..269aef67
--- /dev/null
+++ b/script/ethercat/start_ethercat.sh
@@ -0,0 +1,133 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+usage() {
+ cat <<'USAGE'
+Usage:
+ sudo script/ethercat/start_ethercat.sh [iface] [ethercat_dev] [start_wait_sec]
+ Any pure numeric argument is treated as start_wait_sec.
+
+Example:
+ sudo script/ethercat/start_ethercat.sh eno1
+ sudo script/ethercat/start_ethercat.sh 10
+ sudo script/ethercat/start_ethercat.sh eno1 10
+ sudo script/ethercat/start_ethercat.sh eno1 /dev/EtherCAT1
+ sudo script/ethercat/start_ethercat.sh eno1 /dev/EtherCAT0 10
+ sudo script/ethercat/start_ethercat.sh eno1 10 /dev/EtherCAT0
+
+Environment:
+ DEVICE_MODULES=generic IgH device module list.
+ IGH_ROOT=... Override bundled IgH install path.
+ ETHERCAT_CONF=... Override ethercatctl config path.
+ ETHERCAT_DEV=/dev/EtherCAT0 Override EtherCAT character device node.
+ START_WAIT_SEC=5 Seconds to wait for link/slave discovery.
+USAGE
+}
+
+if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
+ usage
+ exit 0
+fi
+
+if [[ "$(id -u)" -ne 0 ]]; then
+ echo "error: please run with sudo." >&2
+ exit 1
+fi
+
+IFACE="${IFACE:-eno1}"
+ETHERCAT_DEV="${ETHERCAT_DEV:-/dev/EtherCAT0}"
+START_WAIT_SEC="${START_WAIT_SEC:-5}"
+
+NON_NUMERIC_ARG_COUNT=0
+for arg in "$@"; do
+ if [[ "${arg}" =~ ^[0-9]+$ ]]; then
+ START_WAIT_SEC="${arg}"
+ continue
+ fi
+
+ case "${NON_NUMERIC_ARG_COUNT}" in
+ 0)
+ IFACE="${arg}"
+ ;;
+ 1)
+ ETHERCAT_DEV="${arg}"
+ ;;
+ *)
+ echo "error: unexpected argument: ${arg}" >&2
+ usage >&2
+ exit 1
+ ;;
+ esac
+ NON_NUMERIC_ARG_COUNT=$((NON_NUMERIC_ARG_COUNT + 1))
+done
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+IGH_ROOT="${IGH_ROOT:-${REPO_ROOT}/dependency/x86/third_party/ethercat/v1.7.0}"
+DEVICE_MODULES="${DEVICE_MODULES:-generic}"
+ETHERCAT_CONF="${ETHERCAT_CONF:-${IGH_ROOT}/etc/ethercat.conf}"
+ETHERCATCTL="${IGH_ROOT}/sbin/ethercatctl"
+ETHERCAT="${IGH_ROOT}/bin/ethercat"
+
+if [[ ! -d "/sys/class/net/${IFACE}" ]]; then
+ echo "error: network interface '${IFACE}' does not exist." >&2
+ exit 1
+fi
+
+if [[ ! -x "${ETHERCATCTL}" ]]; then
+ echo "error: ethercatctl not found: ${ETHERCATCTL}" >&2
+ exit 1
+fi
+
+if [[ ! -x "${ETHERCAT}" ]]; then
+ echo "error: ethercat command not found: ${ETHERCAT}" >&2
+ exit 1
+fi
+
+MAC="$(cat "/sys/class/net/${IFACE}/address")"
+
+echo "EtherCAT interface: ${IFACE}"
+echo "EtherCAT MAC: ${MAC}"
+echo "EtherCAT device: ${ETHERCAT_DEV}"
+echo "IgH root: ${IGH_ROOT}"
+echo "IgH config: ${ETHERCAT_CONF}"
+echo "Device modules: ${DEVICE_MODULES}"
+echo "Start wait: ${START_WAIT_SEC}s"
+
+mkdir -p "$(dirname "${ETHERCAT_CONF}")"
+
+if [[ -f "${ETHERCAT_CONF}" ]]; then
+ echo "Stopping existing EtherCAT master with current config..."
+ "${ETHERCATCTL}" -c "${ETHERCAT_CONF}" stop >/dev/null 2>&1 || true
+ sleep 1
+fi
+
+cat >"${ETHERCAT_CONF}" </dev/null 2>&1; then
+ nmcli device disconnect "${IFACE}" >/dev/null 2>&1 || true
+fi
+
+ip addr flush dev "${IFACE}"
+ip link set "${IFACE}" up
+
+"${ETHERCATCTL}" -c "${ETHERCAT_CONF}" start
+
+if [[ -e "${ETHERCAT_DEV}" ]]; then
+ chmod 666 "${ETHERCAT_DEV}"
+else
+ echo "warning: ${ETHERCAT_DEV} not found; skip chmod. Check with: ls -l /dev/EtherCAT*" >&2
+fi
+
+for ((i = 0; i < START_WAIT_SEC; ++i)); do
+ if "${ETHERCAT}" slaves 2>/dev/null | grep -qE '^[0-9]+[[:space:]]'; then
+ break
+ fi
+ sleep 1
+done
+
+"${ETHERCAT}" master
+"${ETHERCAT}" slaves || true
diff --git a/script/ethercat/status_ethercat.sh b/script/ethercat/status_ethercat.sh
new file mode 100755
index 00000000..0533b0fb
--- /dev/null
+++ b/script/ethercat/status_ethercat.sh
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+usage() {
+ cat <<'USAGE'
+Usage:
+ script/ethercat/status_ethercat.sh
+
+Environment:
+ IGH_ROOT=... Override bundled IgH install path.
+ ETHERCAT_CONF=... Override ethercatctl config path.
+USAGE
+}
+
+if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
+ usage
+ exit 0
+fi
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+IGH_ROOT="${IGH_ROOT:-${REPO_ROOT}/dependency/x86/third_party/ethercat/v1.7.0}"
+ETHERCAT_CONF="${ETHERCAT_CONF:-${IGH_ROOT}/etc/ethercat.conf}"
+ETHERCATCTL="${IGH_ROOT}/sbin/ethercatctl"
+ETHERCAT="${IGH_ROOT}/bin/ethercat"
+
+if [[ ! -x "${ETHERCATCTL}" ]]; then
+ echo "error: ethercatctl not found: ${ETHERCATCTL}" >&2
+ exit 1
+fi
+
+if [[ ! -x "${ETHERCAT}" ]]; then
+ echo "error: ethercat command not found: ${ETHERCAT}" >&2
+ exit 1
+fi
+
+echo "== ${ETHERCAT_CONF} =="
+if [[ -f "${ETHERCAT_CONF}" ]]; then
+ sed -n '1,80p' "${ETHERCAT_CONF}"
+else
+ echo "missing"
+fi
+
+echo
+echo "== kernel modules =="
+lsmod | grep -E '(^ec_master|^ec_generic|^ec_)' || true
+
+echo
+echo "== ethercatctl =="
+"${ETHERCATCTL}" -c "${ETHERCAT_CONF}" status || true
+
+echo
+echo "== master =="
+"${ETHERCAT}" master || true
+
+echo
+echo "== slaves =="
+"${ETHERCAT}" slaves || true
+
+echo
+echo "== pdos =="
+"${ETHERCAT}" pdos || true
diff --git a/script/ethercat/stop_ethercat.sh b/script/ethercat/stop_ethercat.sh
new file mode 100755
index 00000000..2e0d6f33
--- /dev/null
+++ b/script/ethercat/stop_ethercat.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+usage() {
+ cat <<'USAGE'
+Usage:
+ sudo script/ethercat/stop_ethercat.sh [iface] [--restore-network]
+
+Examples:
+ sudo script/ethercat/stop_ethercat.sh eno1
+ sudo script/ethercat/stop_ethercat.sh eno1 --restore-network
+
+Environment:
+ IGH_ROOT=... Override bundled IgH install path.
+ ETHERCAT_CONF=... Override ethercatctl config path.
+USAGE
+}
+
+if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
+ usage
+ exit 0
+fi
+
+if [[ "$(id -u)" -ne 0 ]]; then
+ echo "error: please run with sudo." >&2
+ exit 1
+fi
+
+IFACE="eno1"
+RESTORE_NETWORK="false"
+
+for arg in "$@"; do
+ case "${arg}" in
+ --restore-network)
+ RESTORE_NETWORK="true"
+ ;;
+ -*)
+ echo "error: unknown option: ${arg}" >&2
+ usage >&2
+ exit 1
+ ;;
+ *)
+ IFACE="${arg}"
+ ;;
+ esac
+done
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+IGH_ROOT="${IGH_ROOT:-${REPO_ROOT}/dependency/x86/third_party/ethercat/v1.7.0}"
+ETHERCAT_CONF="${ETHERCAT_CONF:-${IGH_ROOT}/etc/ethercat.conf}"
+ETHERCATCTL="${IGH_ROOT}/sbin/ethercatctl"
+
+if [[ ! -x "${ETHERCATCTL}" ]]; then
+ echo "error: ethercatctl not found: ${ETHERCATCTL}" >&2
+ exit 1
+fi
+
+"${ETHERCATCTL}" -c "${ETHERCAT_CONF}" stop
+
+if [[ "${RESTORE_NETWORK}" == "true" ]]; then
+ ip link set "${IFACE}" up
+ if command -v nmcli >/dev/null 2>&1; then
+ nmcli device connect "${IFACE}" || true
+ fi
+ echo "Stopped EtherCAT and requested normal network restore on ${IFACE}."
+else
+ echo "Stopped EtherCAT. Normal network restore skipped."
+ echo "Use '--restore-network' if this interface should return to NetworkManager."
+fi