v1.2修复了EEPROM的读写以及掉电保持参数的功能,现在丢步的误差会保存在Canopen字典的0x60F4位置,网关那边可以通过SDO读取到

This commit is contained in:
编程浩
2026-03-02 17:43:52 +08:00
parent 25d82ccd66
commit 8955887f98
9 changed files with 1710 additions and 1597 deletions

View File

@@ -77,7 +77,6 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
break;
case ENCODER1_Z_Pin:
encoder_1.z++;
break;
default:
break;
}

View File

@@ -31,6 +31,7 @@ typedef struct
uint16_t prev_raw_cnt;
uint8_t prev_raw_valid;
uint8_t motion_active;
uint32_t prev_cmd_steps;
/* 停止后延时上报 */
uint8_t wait_stop_settle;
@@ -44,6 +45,7 @@ typedef struct
static StepLossMonitor_t s_step_loss = {
.threshold_mm = STEPLOSS_THRESHOLD_MM_DEFAULT,
.prev_state = STOP,
.prev_cmd_steps = 0U,
};
static float Normalize_FollowingErrorThreshold(float threshold_mm, float fallback_mm)
@@ -117,6 +119,28 @@ static void Update_PP_FollowingError_StatusBit(float stop_error_mm)
CO_UNLOCK_OD(CO->CANmodule);
}
static void Update_FollowingErrorActual_To_OD(float abs_error_mm)
{
OD_entry_t *entry_ferr_actual = OD_find(OD, CIA402_INDEX_FOLLOWING_ERROR_ACTUAL);
float32_t ferr_mm = (float32_t)abs_error_mm;
if (entry_ferr_actual == NULL)
{
return;
}
if (CO != NULL)
{
CO_LOCK_OD(CO->CANmodule);
(void)OD_set_f32(entry_ferr_actual, 0, ferr_mm, true);
CO_UNLOCK_OD(CO->CANmodule);
}
else
{
(void)OD_set_f32(entry_ferr_actual, 0, ferr_mm, true);
}
}
/* 核心运动分发:先做安全判断,再按模式进入回零/位置模式处理 */
static void Process_Motion_Logic(void)
{
@@ -176,6 +200,7 @@ void App_Motor_Init(void)
void App_Motor_Process(void)
{
Sync_FollowingErrorThreshold_From_OD();
Update_FollowingErrorActual_To_OD(s_step_loss.abs_error_mm);
/* 先跑CiA402状态机再执行业务运动逻辑 */
Process_StateMachine();
@@ -198,17 +223,19 @@ void App_Motor_StepLossCheck(void)
{
/* 周期读取硬件计数与已发步数TIM12中断调用 */
uint16_t raw_cnt = (uint16_t)__HAL_TIM_GET_COUNTER(&htim1);
uint8_t rebase_now = 0U;
s_step_loss.cmd_steps = stepper_1.step_count;
/* 新动作开始时重置累计基准,避免跨动作串扰 */
if (stepper_1.state != STOP)
{
if (!s_step_loss.motion_active)
if ((!s_step_loss.motion_active) || (s_step_loss.cmd_steps < s_step_loss.prev_cmd_steps))
{
s_step_loss.motion_active = 1U;
s_step_loss.accum_pulses = 0;
s_step_loss.prev_raw_cnt = raw_cnt;
s_step_loss.prev_raw_valid = 1U;
rebase_now = 1U;
}
}
else if (s_step_loss.motion_active)
@@ -224,9 +251,18 @@ void App_Motor_StepLossCheck(void)
}
/* int16差分可自然处理16位计数器回绕溢出/下溢) */
int16_t delta = (int16_t)(raw_cnt - s_step_loss.prev_raw_cnt);
s_step_loss.accum_pulses += (int32_t)delta;
s_step_loss.prev_raw_cnt = raw_cnt;
int16_t delta = 0;
if (rebase_now)
{
/* New move baseline: skip one diff sample to avoid counter-reset jump. */
}
else
{
delta = (int16_t)(raw_cnt - s_step_loss.prev_raw_cnt);
s_step_loss.accum_pulses += (int32_t)delta;
s_step_loss.prev_raw_cnt = raw_cnt;
}
s_step_loss.prev_cmd_steps = s_step_loss.cmd_steps;
/* 输出扩展后的总脉冲给上层使用 */
encoder_1.pulses = s_step_loss.accum_pulses;

View File

@@ -15,6 +15,7 @@
#define APP_PARAM_VERSION 0x0001u
#define APP_PARAM_EEPROM_ADDR 0x0000u
#define APP_PARAM_AUTOSAVE_DEBOUNCE_MS 500u
#define APP_PARAM_THRESHOLD_DEFAULT_MM 0.1f
/* Log level: 0=off, 1=error, 2=info */
#define APP_PARAM_STORE_LOG_LEVEL 2
@@ -176,9 +177,13 @@ static bool App_ParamStore_ReadCurrentFromOD(App_RunParams_t *params)
OD_entry_t *entry_acc = OD_find(OD, CIA402_INDEX_PROFILE_ACC);
OD_entry_t *entry_dec = OD_find(OD, CIA402_INDEX_PROFILE_DEC);
OD_entry_t *entry_ferr = OD_find(OD, CIA402_INDEX_FOLLOWING_ERROR_WINDOW);
ODR_t odr_acc = ODR_DEV_INCOMPAT;
ODR_t odr_dec = ODR_DEV_INCOMPAT;
ODR_t odr_ferr = ODR_DEV_INCOMPAT;
uint32_t acc_raw = 0u;
uint32_t dec_raw = 0u;
float32_t ferr_raw = 0.0f;
float ferr_mm = APP_PARAM_THRESHOLD_DEFAULT_MM;
if ((params == 0) || (entry_acc == 0) || (entry_dec == 0) || (entry_ferr == 0))
{
@@ -188,30 +193,55 @@ static bool App_ParamStore_ReadCurrentFromOD(App_RunParams_t *params)
if (CO != 0)
{
CO_LOCK_OD(CO->CANmodule);
(void)OD_get_u32(entry_acc, 0, &acc_raw, true);
(void)OD_get_u32(entry_dec, 0, &dec_raw, true);
(void)OD_get_f32(entry_ferr, 0, &ferr_raw, true);
odr_acc = OD_get_u32(entry_acc, 0, &acc_raw, true);
odr_dec = OD_get_u32(entry_dec, 0, &dec_raw, true);
odr_ferr = OD_get_f32(entry_ferr, 0, &ferr_raw, true);
CO_UNLOCK_OD(CO->CANmodule);
}
else
{
(void)OD_get_u32(entry_acc, 0, &acc_raw, true);
(void)OD_get_u32(entry_dec, 0, &dec_raw, true);
(void)OD_get_f32(entry_ferr, 0, &ferr_raw, true);
odr_acc = OD_get_u32(entry_acc, 0, &acc_raw, true);
odr_dec = OD_get_u32(entry_dec, 0, &dec_raw, true);
odr_ferr = OD_get_f32(entry_ferr, 0, &ferr_raw, true);
}
if ((acc_raw == 0u) || (acc_raw > 65535u) || (dec_raw == 0u) || (dec_raw > 65535u))
if ((odr_acc != ODR_OK) || (odr_dec != ODR_OK) || (odr_ferr != ODR_OK))
{
APP_PS_LOGE("[EEPROM] read OD failed, odr_acc=%d odr_dec=%d odr_ferr=%d",
(int)odr_acc, (int)odr_dec, (int)odr_ferr);
return false;
}
if (((float)ferr_raw <= 0.0f) || ((float)ferr_raw > SOFT_LIMIT_MAX_MM))
if (acc_raw == 0u)
{
return false;
acc_raw = 1u;
}
if (dec_raw == 0u)
{
dec_raw = 1u;
}
if (acc_raw > 65535u)
{
acc_raw = 65535u;
}
if (dec_raw > 65535u)
{
dec_raw = 65535u;
}
ferr_mm = (float)ferr_raw;
if (!(ferr_mm == ferr_mm) || (ferr_mm <= 0.0f))
{
ferr_mm = APP_PARAM_THRESHOLD_DEFAULT_MM;
}
if (ferr_mm > SOFT_LIMIT_MAX_MM)
{
ferr_mm = SOFT_LIMIT_MAX_MM;
}
params->acc_mm_s2 = (uint16_t)acc_raw;
params->dec_mm_s2 = (uint16_t)dec_raw;
params->step_loss_threshold_mm = (float)ferr_raw;
params->step_loss_threshold_mm = ferr_mm;
return true;
}
@@ -239,6 +269,8 @@ static uint8_t App_ParamStore_ParamsEqual(const App_RunParams_t *a, const App_Ru
void App_ParamStore_Init(void)
{
App_RunParams_t current;
/* EEPROM驱动初始化参数由Int_EEPROM24xx内部宏配置。 */
if (Int_EEPROM24xx_Init() != INT_EEPROM_OK)
{
@@ -246,7 +278,15 @@ void App_ParamStore_Init(void)
APP_PS_LOGE("[EEPROM] init failed");
}
g_last_seen_valid = 0u;
if (App_ParamStore_ReadCurrentFromOD(&current))
{
g_last_seen_params = current;
g_last_seen_valid = 1u;
}
else
{
g_last_seen_valid = 0u;
}
g_autosave_dirty = 0u;
g_autosave_due_ms = 0u;
}

View File

@@ -27,9 +27,16 @@ Project File Date: 03/02/2026
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Users\hao\keil_v5\ARM\ARMCC\Bin'
Build target 'three-axis_stepper'
compiling Int_TMC2209.c...
compiling OD.c...
compiling app_param_store.c...
compiling app_key.c...
compiling CO_app_STM32.c...
compiling app_main.c...
compiling app_CiA402.c...
compiling CANopen.c...
compiling app_motor.c...
linking...
Program Size: Code=58168 RO-data=2616 RW-data=1492 ZI-data=18252
Program Size: Code=58652 RO-data=2700 RW-data=1512 ZI-data=18256
FromELF: creating hex file...
"three-axis_stepper\three-axis_stepper.axf" - 0 Error(s), 0 Warning(s).
@@ -54,7 +61,7 @@ Package Vendor: Keil
* Component: ARM::CMSIS:CORE:6.2.0
Include file: CMSIS/Core/Include/tz_context.h
Build Time Elapsed: 00:00:02
Build Time Elapsed: 00:00:05
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -1,66 +1,58 @@
#ifndef __CIA402_DEFS_H__
#define __CIA402_DEFS_H__
//本文件存放CiA402中INDEXcontrolwordstatusword的宏定义替换
#include "stdint.h"
/* --- CiA 402 对象字典索引 (Object Dictionary Indices) --- */
#define CIA402_INDEX_CONTROLWORD 0x6040 /* 控制字 */
#define CIA402_INDEX_STATUSWORD 0x6041 /* 状态字 */
#define CIA402_INDEX_OP_MODE 0x6060 /* 目标运动模式 (Modes of Operation) */
#define CIA402_INDEX_OP_MODE_DISPLAY 0x6061 /* 模式显示 (Modes of Operation Display) */
#define CIA402_INDEX_POS_ACTUAL 0x6064 /* 当前位置值 */
#define CIA402_INDEX_FOLLOWING_ERROR_WINDOW 0x6065 /* Following error window */
#define CIA402_INDEX_VEL_ACTUAL 0x606C /* 当前速度值 */
#define CIA402_INDEX_TARGET_POS 0x607A /* 目标位置 */
#define CIA402_INDEX_TARGET_VEL 0x60FF /* 目标速度 */
#define CIA402_INDEX_PROFILE_ACC 0x6083 /* 梯形加减速:加速度 */
#define CIA402_INDEX_PROFILE_DEC 0x6084 /* 梯形加减速:减速度 */
/* CiA402 Object Dictionary indices */
#define CIA402_INDEX_CONTROLWORD 0x6040
#define CIA402_INDEX_STATUSWORD 0x6041
#define CIA402_INDEX_OP_MODE 0x6060
#define CIA402_INDEX_OP_MODE_DISPLAY 0x6061
#define CIA402_INDEX_POS_ACTUAL 0x6064
#define CIA402_INDEX_FOLLOWING_ERROR_WINDOW 0x6065
#define CIA402_INDEX_VEL_ACTUAL 0x606C
#define CIA402_INDEX_TARGET_POS 0x607A
#define CIA402_INDEX_PROFILE_ACC 0x6083
#define CIA402_INDEX_PROFILE_DEC 0x6084
#define CIA402_INDEX_FOLLOWING_ERROR_ACTUAL 0x60F4
#define CIA402_INDEX_TARGET_VEL 0x60FF
/* --- 状态字位定义 (Statusword, 0x6041) --- */
#define CIA402_STATUS_READY_TO_SWITCH_ON (1 << 0) /* 准备好切换就绪 */
#define CIA402_STATUS_SWITCHED_ON (1 << 1) /* 已切换开启 */
#define CIA402_STATUS_OPERATION_ENABLED (1 << 2) /* 运行使能 (动力输出中) */
#define CIA402_STATUS_FAULT (1 << 3) /* 故障激活 */
#define CIA402_STATUS_VOLTAGE_ENABLED (1 << 4) /* 电压已使能 (主回路通电) */
#define CIA402_STATUS_QUICK_STOP (1 << 5) /* 快速停止标志 (0:正在执行快停, 1:正常) */
#define CIA402_STATUS_SWITCH_ON_DISABLED (1 << 6) /* 切换开启禁用 */
#define CIA402_STATUS_WARNING (1 << 7) /* 警告标志 */
#define CIA402_STATUS_REMOTE (1 << 9) /* 远程控制 (可通过网络控制) */
#define CIA402_STATUS_TARGET_REACHED (1 << 10) /* 目标位置到达 */
#define CIA402_STATUS_INTERNAL_LIMIT_ACTIVE (1 << 11) /* 内部限位激活 */
#define CIA402_STATUS_OMS_12 (1 << 12) /* 模式特定位 12 (如 PP模式:Ack, 回零模式:Attained) */
#define CIA402_STATUS_OMS_13 (1 << 13) /* 模式特定位 13 (如 PP模式:following error) */
/* Statusword bits (0x6041) */
#define CIA402_STATUS_READY_TO_SWITCH_ON (1 << 0)
#define CIA402_STATUS_SWITCHED_ON (1 << 1)
#define CIA402_STATUS_OPERATION_ENABLED (1 << 2)
#define CIA402_STATUS_FAULT (1 << 3)
#define CIA402_STATUS_VOLTAGE_ENABLED (1 << 4)
#define CIA402_STATUS_QUICK_STOP (1 << 5)
#define CIA402_STATUS_SWITCH_ON_DISABLED (1 << 6)
#define CIA402_STATUS_WARNING (1 << 7)
#define CIA402_STATUS_REMOTE (1 << 9)
#define CIA402_STATUS_TARGET_REACHED (1 << 10)
#define CIA402_STATUS_INTERNAL_LIMIT_ACTIVE (1 << 11)
#define CIA402_STATUS_OMS_12 (1 << 12)
#define CIA402_STATUS_OMS_13 (1 << 13)
/* --- 控制字位定义 (Controlword, 0x6040) --- */
#define CIA402_CONTROL_SWITCH_ON (1 << 0) /* 切换开启 */
#define CIA402_CONTROL_ENABLE_VOLTAGE (1 << 1) /* 使能电压 */
#define CIA402_CONTROL_QUICK_STOP (1 << 2) /* 快速停止 (逻辑 0 触发) */
#define CIA402_CONTROL_ENABLE_OPERATION (1 << 3) /* 使能运行 */
#define CIA402_CONTROL_FAULT_RESET (1 << 7) /* 故障复位 (上升沿触发) */
#define CIA402_CONTROL_HALT (1 << 8) /* 暂停运动 */
/* Controlword bits (0x6040) */
#define CIA402_CONTROL_SWITCH_ON (1 << 0)
#define CIA402_CONTROL_ENABLE_VOLTAGE (1 << 1)
#define CIA402_CONTROL_QUICK_STOP (1 << 2)
#define CIA402_CONTROL_ENABLE_OPERATION (1 << 3)
#define CIA402_CONTROL_FAULT_RESET (1 << 7)
#define CIA402_CONTROL_HALT (1 << 8)
/* --- 运动模式特定控制位 (OMS) --- */
/* PP 模式 (Profile Position Mode, 模式 1) */
#define CIA402_CONTROL_PP_NEW_SET_POINT (1 << 4) /* 新目标点触发 (上升沿触发) */
#define CIA402_CONTROL_PP_CHANGE_IMM (1 << 5) /* 立即改变目标 (1:立即更新, 0:完成当前再更新) */
#define CIA402_CONTROL_PP_ABS_REL (1 << 6) /* 绝对/相对坐标 (0:绝对, 1:相对) */
/* Mode specific control bits */
#define CIA402_CONTROL_PP_NEW_SET_POINT (1 << 4)
#define CIA402_CONTROL_PP_CHANGE_IMM (1 << 5)
#define CIA402_CONTROL_PP_ABS_REL (1 << 6)
#define CIA402_CONTROL_HM_START (1 << 4)
/* 回零模式 (Homing Mode, 模式 6) */
#define CIA402_CONTROL_HM_START (1 << 4) /* 启动回零操作 */
#define CIA402_STATUS_MASK_OP_ENABLE (0x0027)
/* --- 常用逻辑掩码与指令组合 --- */
/* 运行使能掩码:检查是否处于 Ready + SwOn + OpEn + NoQuickStop 状态 */
#define CIA402_STATUS_MASK_OP_ENABLE (0x0027)
/* 常用指令组合包 */
#define CIA402_CMD_SHUTDOWN (CIA402_CONTROL_ENABLE_VOLTAGE | CIA402_CONTROL_QUICK_STOP)
#define CIA402_CMD_SWITCH_ON (CIA402_CONTROL_SWITCH_ON | CIA402_CONTROL_ENABLE_VOLTAGE | CIA402_CONTROL_QUICK_STOP)
#define CIA402_CMD_ENABLE_OP (CIA402_CMD_SWITCH_ON | CIA402_CONTROL_ENABLE_VOLTAGE | \
CIA402_CONTROL_QUICK_STOP | CIA402_CONTROL_ENABLE_OPERATION)
// CiA402 状态机状态 (标准定义)
typedef enum
{
STATE_NOT_READY_TO_SWITCH_ON,
@@ -72,16 +64,12 @@ typedef enum
STATE_QUICK_STOP_ACTIVE
} Motor_State_t;
// 回零专用状态机
typedef enum
{
HOMING_IDLE, // 空闲
HOMING_START, // 准备启动
HOMING_MOVING, // 正在找开关
HOMING_DONE // 完成
HOMING_IDLE,
HOMING_START,
HOMING_MOVING,
HOMING_DONE
} Homing_State_t;
#endif

View File

@@ -212,6 +212,7 @@ OD_ATTR_RAM OD_RAM_t OD_RAM = {
.x607A_targetPosition = 0x00000000,
.x6083_acceleration = 0x00000064,
.x6084_deceleration = 0x00000064,
.x60F4_followingErrorActualValue = 0,
.x60FF_targetVelocity = 0
};
@@ -264,6 +265,7 @@ typedef struct {
OD_obj_var_t o_607A_targetPosition;
OD_obj_var_t o_6083_acceleration;
OD_obj_var_t o_6084_deceleration;
OD_obj_var_t o_60F4_followingErrorActualValue;
OD_obj_var_t o_60FF_targetVelocity;
} ODObjs_t;
@@ -1182,6 +1184,11 @@ static CO_PROGMEM ODObjs_t ODObjs = {
.attribute = ODA_SDO_RW | ODA_MB,
.dataLength = 4
},
.o_60F4_followingErrorActualValue = {
.dataOrig = &OD_RAM.x60F4_followingErrorActualValue,
.attribute = ODA_SDO_RW | ODA_MB,
.dataLength = 4
},
.o_60FF_targetVelocity = {
.dataOrig = &OD_RAM.x60FF_targetVelocity,
.attribute = ODA_SDO_RW | ODA_RPDO | ODA_MB,
@@ -1237,6 +1244,7 @@ static OD_ATTR_OD OD_entry_t ODList[] = {
{0x607A, 0x01, ODT_VAR, &ODObjs.o_607A_targetPosition, NULL},
{0x6083, 0x01, ODT_VAR, &ODObjs.o_6083_acceleration, NULL},
{0x6084, 0x01, ODT_VAR, &ODObjs.o_6084_deceleration, NULL},
{0x60F4, 0x01, ODT_VAR, &ODObjs.o_60F4_followingErrorActualValue, NULL},
{0x60FF, 0x01, ODT_VAR, &ODObjs.o_60FF_targetVelocity, NULL},
{0x0000, 0x00, 0, NULL, NULL}
};

View File

@@ -16,7 +16,7 @@
Created: 2026/1/30 14:35:40
Created By:
Modified: 2026/2/26 17:17:54
Modified: 2026/3/2 16:53:20
Modified By:
Device Info:
@@ -252,6 +252,7 @@ typedef struct {
uint32_t x607A_targetPosition;
uint32_t x6083_acceleration;
uint32_t x6084_deceleration;
float32_t x60F4_followingErrorActualValue;
int32_t x60FF_targetVelocity;
} OD_RAM_t;
@@ -317,7 +318,8 @@ extern OD_ATTR_OD OD_t *OD;
#define OD_ENTRY_H607A &OD->list[40]
#define OD_ENTRY_H6083 &OD->list[41]
#define OD_ENTRY_H6084 &OD->list[42]
#define OD_ENTRY_H60FF &OD->list[43]
#define OD_ENTRY_H60F4 &OD->list[43]
#define OD_ENTRY_H60FF &OD->list[44]
/*******************************************************************************
@@ -366,7 +368,8 @@ extern OD_ATTR_OD OD_t *OD;
#define OD_ENTRY_H607A_targetPosition &OD->list[40]
#define OD_ENTRY_H6083_acceleration &OD->list[41]
#define OD_ENTRY_H6084_deceleration &OD->list[42]
#define OD_ENTRY_H60FF_targetVelocity &OD->list[43]
#define OD_ENTRY_H60F4_followingErrorActualValue &OD->list[43]
#define OD_ENTRY_H60FF_targetVelocity &OD->list[44]
/*******************************************************************************

View File

@@ -15,7 +15,7 @@
<ProfileTechnology>CANopen</ProfileTechnology>
</ISO15745Reference>
</ProfileHeader>
<ProfileBody xmlns:q1="http://www.canopen.org/xml/1.1" xsi:type="q1:ProfileBody_Device_CANopen" formatName="CANopen" formatVersion="1.0" fileName="NodeSlave.xdd" fileCreator="" fileCreationDate="2026-01-30" fileCreationTime="14:35:40.0000000+08:00" fileModifiedBy="" fileModificationDate="2026-02-26" fileModificationTime="17:17:54.2103410+08:00" fileVersion="1" supportedLanguages="en" xmlns="">
<ProfileBody xmlns:q1="http://www.canopen.org/xml/1.1" xsi:type="q1:ProfileBody_Device_CANopen" formatName="CANopen" formatVersion="1.0" fileName="NodeSlave.xdd" fileCreator="" fileCreationDate="2026-01-30" fileCreationTime="14:35:40.0000000+08:00" fileModifiedBy="" fileModificationDate="2026-03-02" fileModificationTime="16:53:20.3566767+08:00" fileVersion="1" supportedLanguages="en" xmlns="">
<q1:DeviceIdentity>
<q1:vendorName></q1:vendorName>
<q1:vendorID></q1:vendorID>
@@ -2014,6 +2014,11 @@
<UDINT />
<q1:defaultValue value="100" />
</q1:parameter>
<q1:parameter uniqueID="UID_OBJ_60F4" access="readWrite">
<label lang="en">Following error actual value</label>
<REAL />
<q1:defaultValue value="0" />
</q1:parameter>
<q1:parameter uniqueID="UID_OBJ_60FF" access="readWriteOutput">
<label lang="en">Target velocity</label>
<DINT />
@@ -2036,7 +2041,7 @@
<ProfileTechnology>CANopen</ProfileTechnology>
</ISO15745Reference>
</ProfileHeader>
<ProfileBody xmlns:q2="http://www.canopen.org/xml/1.1" xsi:type="q2:ProfileBody_CommunicationNetwork_CANopen" formatName="CANopen" formatVersion="1.0" fileName="NodeSlave.xdd" fileCreator="" fileCreationDate="2026-01-30" fileCreationTime="14:35:40.0000000+08:00" fileModificationDate="2026-02-26" fileModificationTime="17:17:54.2103410+08:00" fileVersion="1" supportedLanguages="en" xmlns="">
<ProfileBody xmlns:q2="http://www.canopen.org/xml/1.1" xsi:type="q2:ProfileBody_CommunicationNetwork_CANopen" formatName="CANopen" formatVersion="1.0" fileName="NodeSlave.xdd" fileCreator="" fileCreationDate="2026-01-30" fileCreationTime="14:35:40.0000000+08:00" fileModificationDate="2026-03-02" fileModificationTime="16:53:20.3566767+08:00" fileVersion="1" supportedLanguages="en" xmlns="">
<ApplicationLayers>
<q2:CANopenObjectList>
<CANopenObject index="1000" name="Device type" objectType="7" PDOmapping="no" uniqueIDRef="UID_OBJ_1000" />
@@ -2322,6 +2327,7 @@
<CANopenObject index="607A" name="Target position" objectType="7" PDOmapping="RPDO" uniqueIDRef="UID_OBJ_607A" />
<CANopenObject index="6083" name="Acceleration" objectType="7" PDOmapping="no" uniqueIDRef="UID_OBJ_6083" />
<CANopenObject index="6084" name="Deceleration" objectType="7" PDOmapping="no" uniqueIDRef="UID_OBJ_6084" />
<CANopenObject index="60F4" name="Following error actual value" objectType="7" PDOmapping="no" uniqueIDRef="UID_OBJ_60F4" />
<CANopenObject index="60FF" name="Target velocity" objectType="7" PDOmapping="RPDO" uniqueIDRef="UID_OBJ_60FF" />
</q2:CANopenObjectList>
<dummyUsage>