diff --git a/Core/Src/main.c b/Core/Src/main.c
index 95a89a1..5fb8f1f 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -100,8 +100,6 @@ static void AppTaskStart(void *pArg)
// (void)ModbusSlaveSetHoldingRegister( // 非法数据值计数
// D6, (uint16_t)ModbusSlaveStatistics.illegalValueCount);
- // HistorySaveToRegisters();
-
/*
* 每1ms轮询一次,
*/
diff --git a/Document/PLSR_document/PLSR方案设计书_V1.0.md b/Document/PLSR_document/PLSR方案设计书_V1.0.md
index e734991..fabf7b3 100644
--- a/Document/PLSR_document/PLSR方案设计书_V1.0.md
+++ b/Document/PLSR_document/PLSR方案设计书_V1.0.md
@@ -270,6 +270,10 @@ void Plsr_IsrPost(uint8_t axis, uint32_t event_mask);
#### 3.1.3 流程图
+
+
+**图 3-1 PLSR单轴完整执行流程图**
+
```text
系统启动
-> 输出置安全状态
@@ -476,6 +480,10 @@ void PlsrProfile_SetTarget(PlsrProfile *profile, uint32_t target_hz);
高速输出模块使用硬件定时器维持脉冲边沿,OS不参与逐脉冲翻转。
+
+
+**图 3-2 PLSR高速脉冲与硬件计数架构图**
+
| 逻辑点 | MCU引脚 | 定时器通道 | 定时器时钟 |
| --- | --- | --- | ---: |
| Q0/Y0 | PF6 | TIM10_CH1 | 168 MHz |
@@ -655,6 +663,10 @@ UNINITIALIZED、IDLE、ACCEL、RUN、DECEL、WAIT、PAUSED、
COMPLETED、STOPPED、ERROR
```
+
+
+**图 3-3 PLSR单轴状态机与命令优先级图**
+
主要合法转换如下:
| 当前状态 | 事件 | 下一状态 |
@@ -1128,6 +1140,13 @@ typedef struct {
#### 4.2.1 数据流关系
+
+
+**图 4-1 PLSR数据流关系图**
+
+图中蓝色表示配置和运动数据,橙色表示硬实时数据及中断事件,绿色表示持久化数据,紫色表示命令与
+状态接口。为方便纯文本环境阅读,保留如下简化关系。
+
```text
S0/S1/S2/D逻辑软元件
|
diff --git a/Document/PLSR_document/图片/PLSR单轴完整执行流程图.png b/Document/PLSR_document/图片/PLSR单轴完整执行流程图.png
new file mode 100644
index 0000000..f7e9294
Binary files /dev/null and b/Document/PLSR_document/图片/PLSR单轴完整执行流程图.png differ
diff --git a/Document/PLSR_document/图片/PLSR单轴状态机与命令优先级图.png b/Document/PLSR_document/图片/PLSR单轴状态机与命令优先级图.png
new file mode 100644
index 0000000..f8061bb
Binary files /dev/null and b/Document/PLSR_document/图片/PLSR单轴状态机与命令优先级图.png differ
diff --git a/Document/PLSR_document/图片/PLSR单轴状态机与命令优先级图.svg b/Document/PLSR_document/图片/PLSR单轴状态机与命令优先级图.svg
new file mode 100644
index 0000000..c0d57a7
--- /dev/null
+++ b/Document/PLSR_document/图片/PLSR单轴状态机与命令优先级图.svg
@@ -0,0 +1,216 @@
+
+
diff --git a/Document/PLSR_document/图片/PLSR单轴状态机图.png b/Document/PLSR_document/图片/PLSR单轴状态机图.png
new file mode 100644
index 0000000..78cd6a4
Binary files /dev/null and b/Document/PLSR_document/图片/PLSR单轴状态机图.png differ
diff --git a/Document/PLSR_document/图片/PLSR单轴状态机图.svg b/Document/PLSR_document/图片/PLSR单轴状态机图.svg
new file mode 100644
index 0000000..93cf9c5
--- /dev/null
+++ b/Document/PLSR_document/图片/PLSR单轴状态机图.svg
@@ -0,0 +1,170 @@
+
diff --git a/Document/PLSR_document/图片/PLSR数据流关系图.png b/Document/PLSR_document/图片/PLSR数据流关系图.png
new file mode 100644
index 0000000..b198e70
Binary files /dev/null and b/Document/PLSR_document/图片/PLSR数据流关系图.png differ
diff --git a/Document/PLSR_document/图片/PLSR数据流关系图.svg b/Document/PLSR_document/图片/PLSR数据流关系图.svg
new file mode 100644
index 0000000..4d8d71e
--- /dev/null
+++ b/Document/PLSR_document/图片/PLSR数据流关系图.svg
@@ -0,0 +1,179 @@
+
+
diff --git a/Document/PLSR_document/PLSR系统结构图.png b/Document/PLSR_document/图片/PLSR系统结构图.png
similarity index 100%
rename from Document/PLSR_document/PLSR系统结构图.png
rename to Document/PLSR_document/图片/PLSR系统结构图.png
diff --git a/Document/PLSR_document/PLSR系统结构图.svg b/Document/PLSR_document/图片/PLSR系统结构图.svg
similarity index 100%
rename from Document/PLSR_document/PLSR系统结构图.svg
rename to Document/PLSR_document/图片/PLSR系统结构图.svg
diff --git a/Document/PLSR_document/图片/PLSR高速脉冲与硬件计数架构图.png b/Document/PLSR_document/图片/PLSR高速脉冲与硬件计数架构图.png
new file mode 100644
index 0000000..eebed17
Binary files /dev/null and b/Document/PLSR_document/图片/PLSR高速脉冲与硬件计数架构图.png differ
diff --git a/Document/PLSR_document/图片/PLSR高速脉冲与硬件计数架构图.svg b/Document/PLSR_document/图片/PLSR高速脉冲与硬件计数架构图.svg
new file mode 100644
index 0000000..538d4a0
--- /dev/null
+++ b/Document/PLSR_document/图片/PLSR高速脉冲与硬件计数架构图.svg
@@ -0,0 +1,166 @@
+
+
diff --git a/Document/PLSR_document/任务要求.png b/Document/PLSR_document/图片/任务要求.png
similarity index 100%
rename from Document/PLSR_document/任务要求.png
rename to Document/PLSR_document/图片/任务要求.png
diff --git a/Document/PLSR_document/框图/PLSR运动控制流程图 - 副本.vsdx b/Document/PLSR_document/框图/PLSR运动控制流程图 - 副本.vsdx
new file mode 100644
index 0000000..1ca44d2
Binary files /dev/null and b/Document/PLSR_document/框图/PLSR运动控制流程图 - 副本.vsdx differ
diff --git a/Document/PLSR_document/框图/PLSR运动控制流程图 - 副本_修改前备份.vsdx b/Document/PLSR_document/框图/PLSR运动控制流程图 - 副本_修改前备份.vsdx
new file mode 100644
index 0000000..1ca44d2
Binary files /dev/null and b/Document/PLSR_document/框图/PLSR运动控制流程图 - 副本_修改前备份.vsdx differ
diff --git a/Document/PLSR_document/框图/PLSR运动控制流程图.vsdx b/Document/PLSR_document/框图/PLSR运动控制流程图.vsdx
new file mode 100644
index 0000000..1ca44d2
Binary files /dev/null and b/Document/PLSR_document/框图/PLSR运动控制流程图.vsdx differ
diff --git a/Document/PLSR_document/框图/PLSR运动控制流程图_完整版.vsdx b/Document/PLSR_document/框图/PLSR运动控制流程图_完整版.vsdx
new file mode 100644
index 0000000..6fadae7
Binary files /dev/null and b/Document/PLSR_document/框图/PLSR运动控制流程图_完整版.vsdx differ
diff --git a/Document/PLSR_document/框图/PLSR运动控制流程图_完整预览.png b/Document/PLSR_document/框图/PLSR运动控制流程图_完整预览.png
new file mode 100644
index 0000000..dce1d6e
Binary files /dev/null and b/Document/PLSR_document/框图/PLSR运动控制流程图_完整预览.png differ
diff --git a/Document/PLSR_document/框图/PLSR运动控制流程图_当前预览.png b/Document/PLSR_document/框图/PLSR运动控制流程图_当前预览.png
new file mode 100644
index 0000000..75ee3e5
Binary files /dev/null and b/Document/PLSR_document/框图/PLSR运动控制流程图_当前预览.png differ
diff --git a/Document/PLSR_document/框图/PLSR高速脉冲与硬件计数架构图.vsdx b/Document/PLSR_document/框图/PLSR高速脉冲与硬件计数架构图.vsdx
new file mode 100644
index 0000000..832134b
Binary files /dev/null and b/Document/PLSR_document/框图/PLSR高速脉冲与硬件计数架构图.vsdx differ
diff --git a/Document/PLSR_document/框图/~$$PLSR运动控制流程图 - 副本.~vsdx b/Document/PLSR_document/框图/~$$PLSR运动控制流程图 - 副本.~vsdx
new file mode 100644
index 0000000..50439e7
Binary files /dev/null and b/Document/PLSR_document/框图/~$$PLSR运动控制流程图 - 副本.~vsdx differ
diff --git a/Document/PLSR_document/框图/状态机图解.vsdx b/Document/PLSR_document/框图/状态机图解.vsdx
new file mode 100644
index 0000000..b56ab28
Binary files /dev/null and b/Document/PLSR_document/框图/状态机图解.vsdx differ
diff --git a/Document/PLSR_document/虞文昊_PLSR_2026.8.6.zip b/Document/PLSR_document/虞文昊_PLSR_2026.8.6.zip
new file mode 100644
index 0000000..d034b00
Binary files /dev/null and b/Document/PLSR_document/虞文昊_PLSR_2026.8.6.zip differ
diff --git a/Document/PLSR_document/虞文昊_PLSR_2026.8.6/设计方案书.docx b/Document/PLSR_document/虞文昊_PLSR_2026.8.6/设计方案书.docx
new file mode 100644
index 0000000..fe7f91f
Binary files /dev/null and b/Document/PLSR_document/虞文昊_PLSR_2026.8.6/设计方案书.docx differ
diff --git a/Document/PLSR_document/虞文昊_PLSR_2026.8.6/需求规格书.docx b/Document/PLSR_document/虞文昊_PLSR_2026.8.6/需求规格书.docx
new file mode 100644
index 0000000..0a5433e
Binary files /dev/null and b/Document/PLSR_document/虞文昊_PLSR_2026.8.6/需求规格书.docx differ
diff --git a/Document/PLSR_document/设计方案书.docx b/Document/PLSR_document/设计方案书.docx
index 3bc0f34..fe7f91f 100644
Binary files a/Document/PLSR_document/设计方案书.docx and b/Document/PLSR_document/设计方案书.docx differ
diff --git a/Document/PLSR_document/设计方案书2.docx b/Document/PLSR_document/设计方案书2.docx
deleted file mode 100644
index a206f15..0000000
Binary files a/Document/PLSR_document/设计方案书2.docx and /dev/null differ
diff --git a/Document/PLSR_document/需求规格书.docx b/Document/PLSR_document/需求规格书.docx
index 216b6d0..0a5433e 100644
Binary files a/Document/PLSR_document/需求规格书.docx and b/Document/PLSR_document/需求规格书.docx differ
diff --git a/Modbus/Inc/modbus_rtu_slave.h b/Modbus/Inc/modbus_rtu_slave.h
index c24a3a2..3e139df 100644
--- a/Modbus/Inc/modbus_rtu_slave.h
+++ b/Modbus/Inc/modbus_rtu_slave.h
@@ -66,17 +66,6 @@ typedef struct
uint32_t droppedFrameCount; ///< 接收槽占用或长度错误导致的丢帧数
uint32_t uartErrorCount; ///< HAL 串口错误计数
} MODBUS_SLAVE_STATS;
-/**
- * @brief 一次Modbus RTU通信的历史记录
- */
-typedef struct
-{
- uint32_t tick; ///< 通信发生时的系统时间
- uint16_t requestLength; ///< 请求ADU长度
- uint16_t responseLength; ///< 响应ADU长度
- uint8_t request[256]; ///< 请求ADU数据
- uint8_t response[256]; ///< 响应ADU数据
-} MODBUS_HISTORY_ITEM;
/** @brief Modbus 从站通信统计数据 */
extern volatile MODBUS_SLAVE_STATS ModbusSlaveStatistics;
/**
@@ -153,7 +142,6 @@ uint8_t ModbusSlaveGetCoil(uint16_t address, uint8_t *state);
uint8_t ModbusSlaveIsConnected(uint32_t timeoutMs);
void ModbusRetainedRegistersLoad(void);
void ModbusRetainedRegistersPoll(void);
-void HistorySaveToRegisters(void);
#ifdef __cplusplus
}
diff --git a/Modbus/Src/modbus_rtu_slave.c b/Modbus/Src/modbus_rtu_slave.c
index 0b031b8..bf00866 100644
--- a/Modbus/Src/modbus_rtu_slave.c
+++ b/Modbus/Src/modbus_rtu_slave.c
@@ -1,5 +1,4 @@
#include "modbus_rtu_slave.h"
-#include "ucos_ii.h"
#include
#define MODBUS_RTU_ADU_SIZE_MAX (256U) // Modbus RTU 最大 ADU 长度,单位为字节
@@ -25,12 +24,7 @@
static UART_HandleTypeDef *ModbusUart;
static uint8_t ModbusSlaveAddress;
-static void ModbusHistorySave(uint32_t tick, const uint8_t *request,
- uint16_t requestLength, const uint8_t *response,
- uint16_t responseLength);
static HAL_StatusTypeDef ModbusStartReceive(void);
-static MODBUS_HISTORY_ITEM ModbusHistory[16];
-static uint16_t ModbusHistoryWriteIndex;
/*最近一次字节尾到字节头的间隔周期数*/
static volatile uint32_t ModbusLastInterFrameGapCycles;
/**
@@ -457,73 +451,6 @@ tx:
return (uint16_t)(5U + quantity * 2U);
}
-/*
- * 返回帧
- *从站地址 | 14 | 总字节数 | 子响应长度 | 06 | 寄存器数据 | CRC
- *
- * 01 从站地址
- * 14 功能码
- * 06 后续响应数据共6字节
- * 05 当前子响应长度,共5字节
- * 06 引用类型
- * 12 34 第一个寄存器
- * 56 78 第二个寄存器
- */
-static uint16_t ModbusProcessFile(const uint8_t *request,
- uint16_t requestLength)
-{
- uint16_t fileNumber;
- uint16_t recordNumber;
- uint16_t quantity;
- uint16_t index;
- uint16_t value;
- uint16_t *historyRegister;
- if (requestLength != 12U)
- {
- ModbusSlaveStatistics.illegalValueCount++;
- return ModbusBuildException(request[1], MODBUS_EX_ILLEGAL_VALUE);
- }
- if ((request[2] != 7U) || (request[3] != 0x06U))
- {
- ModbusSlaveStatistics.illegalValueCount++;
- return ModbusBuildException(request[1], MODBUS_EX_ILLEGAL_VALUE);
- }
-
- quantity = ModbusGetU16Be(&request[8]);
- fileNumber = ModbusGetU16Be(&request[4]);
- recordNumber = ModbusGetU16Be(&request[6]);
- if ((quantity == 0U) || (quantity > 124U)) // 数量0或者数量大于最大值
- {
- ModbusSlaveStatistics.illegalValueCount++;
- return ModbusBuildException(request[1], MODBUS_EX_ILLEGAL_VALUE);
- }
- /* 检查文件号、记录号和读取范围 */
- if ((fileNumber > 15U) || (recordNumber >= 260U)
- || (((uint32_t)recordNumber + quantity) > 260UL))
- {
- ModbusSlaveStatistics.illegalAddressCount++;
- return ModbusBuildException(request[1], MODBUS_EX_ILLEGAL_ADDRESS);
- }
- ModbusTxFrame[0] = ModbusSlaveAddress;
- ModbusTxFrame[1] = 0X14;
- ModbusTxFrame[2] = (uint8_t)(2U + quantity * 2U);
- ModbusTxFrame[3] = (uint8_t)(1U + quantity * 2U);
-
- ModbusTxFrame[4] = 0X06;
- historyRegister = (uint16_t *)ModbusHistory;
- for (index = 0U; index < quantity; index++)
- {
- uint16_t address = fileNumber * 260 + recordNumber + index;
-
- value = *(historyRegister + address);
- ModbusTxFrame[5U + index * 2U] = (uint8_t)(value & 0x00FFU);
- ModbusTxFrame[6U + index * 2U] = (uint8_t)(value >> 8U);
- }
-
- ModbusAppendCrc(ModbusTxFrame, (uint16_t)(5U + quantity * 2U));
- return (uint16_t)(7U + quantity * 2U);
-}
-
/**
* @brief 处理写单个保持寄存器功能码 0x06
* @param[in] request RTU 请求帧
@@ -893,11 +820,6 @@ static uint16_t ModbusProcessRequest(const uint8_t *request,
return (isBroadcast != 0U)
? 0U
: ModbusProcessReadHolding(request, requestLength);
- case 0x14U:
- return (isBroadcast != 0U)
- ? 0U
- : ModbusProcessFile(request, requestLength);
-
case 0x05U: // 写单个线圈
return ModbusProcessWriteSingleCoil(request, requestLength,
isBroadcast);
@@ -959,9 +881,6 @@ void ModbusSlavePoll(void)
}
responseLength = ModbusProcessRequest(ModbusRxFrame, ModbusRxFrameLength);
- ModbusHistorySave(OSTimeGet() / 1000, ModbusRxFrame, ModbusRxFrameLength,
- ModbusTxFrame, responseLength);
-
if (responseLength > 0U)
{
ModbusTxBusy = 1U;
@@ -1192,57 +1111,3 @@ void ModbusRetainedRegistersPoll(void)
ModbusRetainedSnapshot[index] = value;
}
}
-static void ModbusHistorySave(uint32_t tick, const uint8_t *request,
- uint16_t requestLength, const uint8_t *response,
- uint16_t responseLength)
-{
- MODBUS_HISTORY_ITEM *item;
-
- if (requestLength > 256U)
- {
- requestLength = 256U;
- }
-
- if (responseLength > 256U)
- {
- responseLength = 256U;
- }
-
- item = &ModbusHistory[ModbusHistoryWriteIndex];
-
- item->tick = tick;
- item->requestLength = requestLength;
- item->responseLength = responseLength;
-
- (void)memcpy(item->request, request, requestLength);
-
- if (responseLength > 0U)
- {
- (void)memcpy(item->response, response, responseLength);
- }
-
- ModbusHistoryWriteIndex++;
-
- if (ModbusHistoryWriteIndex >= 16U)
- {
- ModbusHistoryWriteIndex = 0U;
- }
-}
-void HistorySaveToRegisters(void)
-{
-
-
- uint16_t index;
-
- if (ModbusHistoryWriteIndex == 0U)
- {
- index = 15U;
- }
- else
- {
- index = ModbusHistoryWriteIndex - 1U;
- }
-
- (void)memcpy(&ModbusHoldingRegisters[1000U + index * 260U],
- &ModbusHistory[index], sizeof(ModbusHistory[index]));
-}