diff --git a/Document/PLSR_document/PLSR信捷对标追踪矩阵.md b/Document/PLSR_document/PLSR信捷对标追踪矩阵.md index ccf6e8c..51d5019 100644 --- a/Document/PLSR_document/PLSR信捷对标追踪矩阵.md +++ b/Document/PLSR_document/PLSR信捷对标追踪矩阵.md @@ -22,7 +22,7 @@ | S0为可选择首地址的脉冲数据块 | 6~17 | 运行时指定未占用保持寄存器首地址,保持信捷固定相对布局 | 一比一实现 | | S1为可选择首地址的用户参数块 | 17~18 | 在动态数据池中指定首地址,仅含相对/绝对和起始段 | 已纳入 | | S2选择K0~K4 | 18~24、49 | 每轴提供0~4套参数 | 已纳入 | -| D选择脉冲输出端口 | 49 | D选择轴、输出形式和输出点资源 | 增强 | +| D选择脉冲输出端口 | 49 | D选择Y0~Y3;PULSE/DIR一一对应Q0~Q3,AB/CW/CCW仅允许Y0或Y2并占用固定点对 | 等效实现 | ## 2. 脉冲和定位 @@ -73,7 +73,7 @@ | 短段自动形成三角曲线 | 55 | 自动压缩短距离曲线 | 已纳入 | | 默认速度与加减速时间定义斜率 | 40、50 | 使用相同斜率模型 | 已纳入 | | 起始速度和终止速度 | 43 | S2参数 | 已纳入 | -| 最高速度限制 | 22~24 | S2参数 | 已纳入 | +| 最高速度限制 | 22~24、49 | 高于S2最高速度时按最高速度限幅运行,并增加SPEED_CLAMPED告警 | 已纳入 | | 最后一段动态变频后重算曲线 | 56 | 动态修改后重算剩余曲线 | 已纳入 | ## 5. 公共参数和输出方式 @@ -84,7 +84,7 @@ | 方向输出点 | 31、60等 | 从有效未占用Q点配置 | 等效实现 | | 方向延时 | 31、41 | 默认10 ms,单位ms可配置 | 已纳入 | | PULSE/DIR | 29、49 | 最多四轴 | 已纳入 | -| AB相输出 | 29、70等 | 最多两轴,一个完整正交周期计1个指令脉冲 | 增强 | +| AB相输出 | 29、70等 | D取Y0或Y2,使用Q0/Q1或Q2/Q3固定点对;一个完整正交周期计1个指令脉冲 | 增强 | | 脉冲单位 | 28~29 | 支持脉冲模式 | 已纳入 | | 1 μm、0.01/0.1/1 mm当量 | 28 | 内核直接换算并保存余数 | 增强 | | 每转脉冲数和每转移动量 | 28、60等 | 公共参数 | 已纳入 | @@ -94,7 +94,7 @@ | 补偿加减速时间 | 41 | S2参数 | 已纳入 | | FOLLOW性能参数 | 23~24、44 | 范围1~100 | 已纳入 | | FOLLOW前馈补偿 | 23~24、44 | 范围0~100% | 已纳入 | -| 0.1 ms/1 ms刷新 | 24、44 | S2配置,独立硬件控制周期 | 增强 | +| 0.1 ms/1 ms刷新 | 22~24、44 | S2配置,独立硬件控制周期 | 已纳入 | ## 6. 监控、事件和本项目增强 diff --git a/Document/PLSR_document/PLSR方案设计书_V1.0.md b/Document/PLSR_document/PLSR方案设计书_V1.0.md new file mode 100644 index 0000000..e734991 --- /dev/null +++ b/Document/PLSR_document/PLSR方案设计书_V1.0.md @@ -0,0 +1,1332 @@ +# PLSR 方案设计书 + +> 文档版本:V1.0 Rev.C +> 需求基线:[PLSR需求规格统计_V1.3.md](./PLSR需求规格统计_V1.3.md) Rev.B +> 目标平台:XDM-60T4-E / STM32F407IG / uC/OS-II +> 编制日期:2026-08-05 +> 文档状态:设计基线;标记为“待上板验证”的项目在验证完成前不得关闭 + +## 目录 + +1. [概述](#1-概述) + 1. [项目背景](#11-项目背景) + 2. [定义](#12-定义) +2. [系统概述](#2-系统概述) + 1. [需求概述](#21-需求概述) + 2. [系统结构图](#22-系统结构图) + 3. [功能模块列表](#23-功能模块列表) +3. [功能模块设计](#3-功能模块设计) + 1. [PLSR运动控制核心模块设计](#31-plsr运动控制核心模块设计) + 2. [参数解析与任务提交模块设计](#32-参数解析与任务提交模块设计) + 3. [路径解释与段调度模块设计](#33-路径解释与段调度模块设计) + 4. [速度规划模块设计](#34-速度规划模块设计) + 5. [高速脉冲输出模块设计](#35-高速脉冲输出模块设计) + 6. [状态机与命令模块设计](#36-状态机与命令模块设计) + 7. [输出资源管理模块设计](#37-输出资源管理模块设计) + 8. [软元件与通信适配模块设计](#38-软元件与通信适配模块设计) + 9. [位置、当量与持久化模块设计](#39-位置当量与持久化模块设计) + 10. [诊断与自测模块设计](#310-诊断与自测模块设计) +4. [数据结构设计](#4-数据结构设计) + 1. [数据结构设计](#41-数据结构设计) + 2. [数据结构与程序的关系](#42-数据结构与程序的关系) +5. [错误处理设计](#5-错误处理设计) + 1. [错误处理设计描述](#51-错误处理设计描述) + 2. [错误输出信息](#52-错误输出信息) +6. [参考资料](#6-参考资料) + +## 1 概述 + +### 1.1 项目背景 + +本项目在现有 XDM-60T4-E 控制器工程中实现 PLSR 定位控制功能。控制器采用 +STM32F407IG、12 MHz 外部晶振、168 MHz 系统时钟和 uC/OS-II,现有工程已经具备 +USART1 Modbus RTU、USB Device、Backup SRAM 和基本任务调度能力,但尚未实现高速脉冲、 +路径解释、速度规划及轴状态管理。 + +PLSR V1.0 对标信捷 XD/XL 系列 PLC 的 PLSR 逻辑模型,保留 `PLSR S0 S1 S2 D`、 +S0 多段数据、S1 用户参数、S2 K0~K4 参数组、D 输出端口以及固定 HSD/SFD/SM/SD/I +软元件语义。在此基础上增加四轴独立运行、CW/CCW、64 位内部位置、参数原子提交、命令防重、 +诊断和 Backup SRAM 检查点等能力。 + +本文说明系统如何实现需求,重点覆盖: + +- 总体软硬件架构; +- OS 任务与硬件中断的职责边界; +- PULSE/DIR、AB 相和 CW/CCW 输出; +- S0/S1/S2/D 解析与运行快照; +- 多段路径、等待、跳转和段事件; +- 加减速、动态调频、位置及累计; +- 固定软元件、保存、错误和诊断。 + +V1.0 不实现多轴直线或圆弧插补、闭环位置修正、电子凸轮、龙门同步、完整机械回零和 +安全认证急停。 + +### 1.2 定义 + +| 名称 | 定义 | +| --- | --- | +| PLSR | 多段脉冲定位指令,逻辑调用形式为 `PLSR S0 S1 S2 D` | +| S0 | 动态首地址指定的路径数据块,保存总段数及各段频率、脉冲数、等待和跳转 | +| S1 | 动态首地址指定的用户参数块,保存相对/绝对模式和起始段 | +| S2 | K0~K4 运动参数套组,保存默认速度、速度限制、曲线、补偿、FOLLOW和刷新周期 | +| D | 输出资源操作数,兼容语义下选择 Y0~Y3,本项目对应 Q0~Q3 高速资源 | +| PULSE/DIR | 一个端口输出脉冲,另一个端口输出方向电平 | +| AB 相 | 两路相差四分之一周期的正交输出,通过相位先后表示方向 | +| CW/CCW | 正向和反向分别使用独立脉冲端口,两个端口不得同时输出 | +| 指令脉冲 | PULSE/DIR 的一个上升沿、CW/CCW 的一个完整脉冲或 AB 相的一个完整四状态周期 | +| 控制刷新周期 | 速度规划器更新目标频率的周期,只允许 0.1 ms 或 1 ms | +| 脉冲周期 | 由当前输出频率决定的物理波形周期,与 OS Tick 和控制刷新周期不同 | +| 运行快照 | START 接受后为轴生成的不可变 S0/S1/S2/D 执行副本 | +| BUSY | 轴存在已接受但尚未终止的任务,包括运动、WAIT和PAUSED | +| PULSE_ACTIVE | 当前物理脉冲正在输出 | +| DONE | 当前任务正常完成并锁存;STOP或ERROR不得置位 | +| 当量 | 通过每转脉冲数和每转移动量将工程单位换算为指令脉冲 | +| 固定软元件 | 信捷规定地址和含义的 HSD、SFD、SM、SD、I 数据 | +| 动态数据地址 | 调用者在允许数据区内为 S0、S1 选择的连续首地址 | + +## 2 系统概述 + +### 2.1 需求概述 + +#### 2.1.1 功能范围 + +系统应实现四个独立逻辑轴。PULSE/DIR 可同时运行四轴;AB 相和 CW/CCW 使用 Q0/Q1、 +Q2/Q3 固定点对,最多同时运行两轴。四轴之间不做插补,各轴独立启动、停止、调频、定位和查询。 + +主要功能如下: + +| 类别 | V1.0功能 | +| --- | --- | +| 输出方式 | PULSE/DIR、AB相、CW/CCW | +| 轴数 | 四轴独立;AB/CW/CCW最多两轴 | +| 频率 | 1~100 kHz保证范围;100001~200000 Hz经板测后作为非保证扩展 | +| 脉冲数量 | 完整有符号32位;0表示跳过当前段 | +| 定位 | 相对定位、绝对定位、设置/清零当前位置 | +| 路径 | 1~100段,支持等待、ACT、EXT和动态跳转 | +| 曲线 | 无加减速、直线、S形、正弦 | +| 段衔接 | 完成方式、后续方式 | +| 控制 | START、STOP、PAUSE、RESUME、保存、清零、自测 | +| 刷新周期 | S2配置0.1 ms或1 ms,OS Tick保持1 ms | +| 保存 | Flash固定配置、Backup SRAM动态检查点 | +| 对标 | 固定HSD/SFD/SM/SD/I地址及S0/S1动态首地址语义 | + +#### 2.1.2 性能和安全目标 + +- 正常完成时脉冲数量误差为 0; +- 输出目标占空比为 50%; +- 当前段目标频率修改应在配置的控制刷新周期内开始应用; +- 四轴 100 kHz 并发时不得丢脉冲、重复脉冲或串轴; +- Modbus和USB压力不得改变运动结果; +- 上电、复位、HardFault和看门狗复位期间输出保持安全无效; +- 运行参数使用快照或原子访问,禁止读取半更新数据; +- 异常复位后不得自动续跑,并清除绝对位置有效标志; +- 软件急停没有独立硬件切断回路,不得宣称安全认证急停。 + +#### 2.1.3 工程基线与约束 + +| 项目 | 现状/约束 | 方案处理 | +| --- | --- | --- | +| MCU | STM32F407IG,168 MHz | 保持现有时钟配置 | +| OS | uC/OS-II,Tick为1 ms | 不提高OS Tick | +| Modbus | USART1+DMA,任务轮询 | 作为调用与监控适配层 | +| USB | OTG FS中断当前优先级0 | 调低到运动中断之后,建议优先级6 | +| PLSR定时器 | 当前未初始化 | 新增TIM6控制基准、TIM9/TIM12硬件计数及TIM10/11/13/14脉冲输出 | +| Modbus历史 | 代码仍写入1000起始历史区 | 删除历史写入,释放给S0/S1动态数据池 | +| Backup SRAM | 已完成基础初始化 | 扩展为带版本和CRC的双检查点 | +| 急停 | 无外部硬件切断 | 仅实现软件立即关闭和状态锁存 | + +### 2.2 系统结构图 + +![PLSR系统结构图](./PLSR系统结构图.svg) + +**图 2-1 PLSR系统结构图** + +图中蓝色表示控制与数据流,橙色表示硬实时及物理输出路径,绿色表示固定软元件、持久化和诊断等 +数据服务。为方便纯文本环境阅读,结构关系同时保留如下文字版本。 + +```text +┌──────────────────────────────────────────────────────────┐ +│ PLC调用 / Modbus RTU / 内部测试接口 │ +└───────────────────────────┬──────────────────────────────┘ + │ +┌───────────────────────────▼──────────────────────────────┐ +│ 命令与软元件适配:调用上升沿、命令序号、状态快照 │ +└───────────────────────────┬──────────────────────────────┘ + │ +┌───────────────────────────▼──────────────────────────────┐ +│ 参数提交:读取S0/S1/S2/D、完整校验、资源申请、运行快照 │ +└───────────────────────────┬──────────────────────────────┘ + │ +┌───────────────────────────▼──────────────────────────────┐ +│ 四轴运动内核:状态机、路径解释、速度规划、位置与段事件 │ +└───────────────┬───────────────────────────┬──────────────┘ + │ │ +┌───────────────▼──────────────┐ ┌─────────▼──────────────┐ +│ OS任务控制面 │ │ 定时器/EXTI实时面 │ +│ 命令、段切换、等待、保存 │ │ 脉冲、调频、尾停、限位 │ +└───────────────┬──────────────┘ └─────────┬──────────────┘ + │ │ + └─────────────┬─────────────┘ + │ +┌─────────────────────────────▼────────────────────────────┐ +│ STM32F407板级层:TIM6、TIM9/12、TIM10/11/13/14、GPIO、EXTI│ +└─────────────────────────────┬────────────────────────────┘ + │ + Q0~Q3 / DIR + │ + 伺服驱动器 +``` + +系统划分为控制面和实时面: + +| 执行域 | 运行位置 | 负责内容 | 禁止内容 | +| --- | --- | --- | --- | +| 控制面 | `PlsrTask` | 命令、校验、快照、状态机慢路径、等待、段切换、保存和发布 | 逐脉冲翻转GPIO | +| 实时面 | TIM/EXTI中断 | 硬件累计、软件兜底计数、尾脉冲、速度刷新、限位和EXT锁存 | 阻塞、动态内存、Flash、通信解析、OS等待 | + +### 2.3 功能模块列表 + +| 编号 | 模块 | 建议源文件 | 主要职责 | +| --- | --- | --- | --- | +| M01 | PLSR运动控制核心 | `plsr_core.c` | 四轴对象、任务入口、事件分派和模块协调 | +| M02 | 参数解析与任务提交 | `plsr_parser.c` | S0/S1/S2/D读取、校验、快照和提交 | +| M03 | 路径解释与段调度 | `plsr_path.c` | 段进入、等待、跳转、零段和段事件 | +| M04 | 速度规划 | `plsr_profile.c` | 三种曲线、短距离、衔接和动态调频 | +| M05 | 高速脉冲输出 | `plsr_hal_f407.c` | PWM、TIM9/TIM12硬件累计、软件计数兜底、AB配对和安全关闭 | +| M06 | 状态机与命令 | `plsr_state.c`、`plsr_command.c` | 合法状态转换、命令幂等和优先级 | +| M07 | 输出资源管理 | `plsr_resource.c` | 高速点、DIR点及TIM9/TIM12计数资源的原子申请和释放 | +| M08 | 软元件与通信适配 | `plsr_device.c` | HSD/SFD/SM/SD/I、S0/S1及Modbus边界 | +| M09 | 位置、当量与持久化 | `plsr_position.c`、`plsr_persist.c` | 64位位置、换算、限位、Flash和Backup SRAM | +| M10 | 诊断与自测 | `plsr_diag.c` | 错误映射、分频记录、性能统计和自测 | + +建议工程目录: + +```text +PLSR/ + Inc/ + plsr.h + plsr_types.h + plsr_device.h + plsr_hal.h + Src/ + plsr_core.c + plsr_parser.c + plsr_path.c + plsr_profile.c + plsr_hal_f407.c + plsr_state.c + plsr_command.c + plsr_resource.c + plsr_device.c + plsr_position.c + plsr_persist.c + plsr_diag.c +``` + +## 3 功能模块设计 + +### 3.1 PLSR运动控制核心模块设计 + +#### 3.1.1 模块功能描述 + +运动控制核心静态创建四个 `PlsrAxis` 对象,负责初始化各子模块、运行 `PlsrTask`、接收中断事件、 +调用状态机、协调段调度和发布状态。模块不直接解释 Modbus 帧,也不直接操作 Flash 或具体 GPIO。 + +OS任务建议如下: + +| 任务 | 建议优先级 | 触发方式 | 职责 | +| --- | ---: | --- | --- | +| `PlsrTask` | 4 | 事件唤醒,最长1 ms巡检 | 命令、路径慢处理、等待、状态发布和保存请求 | +| 现有Modbus任务 | 5 | 1 ms轮询 | 通信收发和协议解析 | +| 测试任务 | 6及以后 | 按需 | 非实时测试和日志 | + +中断优先级首次配置建议如下,最终值通过 uC/OS-II 端口约束和上板测试冻结: + +| 抢占优先级 | 中断 | 用途 | +| ---: | --- | --- | +| 1 | 硬限位EXTI | 锁存限位并禁止继续越界输出 | +| 2 | TIM9/TIM12、TIM10/11/13/14 | 硬件计数完成、软件兜底计数、参数边界和尾脉冲关闭 | +| 3 | TIM6 | 0.1 ms速度控制基准 | +| 4 | EXT输入EXTI | 路径切段边沿锁存 | +| 5 | USART1、DMA2 | 现有Modbus通信 | +| 6 | USB OTG FS | 从当前优先级0调低 | +| 15 | SysTick | 现有1 ms OS Tick | + +实时中断不调用 OS API,只设置原子事件位。`PlsrTask` 获取事件后按急停、限位、立即停止、 +减速停止、暂停和正常事件的顺序处理。 + +#### 3.1.2 模块输入输出接口说明 + +```c +PlsrResult Plsr_Init(void); +void Plsr_Task(void *argument); +PlsrResult Plsr_Submit(const PlsrCall *call, uint32_t sequence); +PlsrResult Plsr_Command(const PlsrCommand *command); +bool Plsr_GetStatus(uint8_t axis, PlsrStatus *status); +void Plsr_IsrPost(uint8_t axis, uint32_t event_mask); +``` + +输入为调用参数、控制命令和硬件事件;输出为提交结果、状态快照、固定软元件状态和持久化请求。 + +#### 3.1.3 流程图 + +```text +系统启动 + -> 输出置安全状态 + -> 初始化设备访问、资源和持久化 + -> 初始化四轴对象 + -> 初始化定时器和EXTI + -> 自检 + -> 全部成功:进入IDLE + -> 任一失败:保持输出关闭并发布初始化错误 + +PlsrTask循环 + -> 读取ISR事件 + -> 按优先级处理停止和限位 + -> 处理命令 + -> 推进各轴状态机 + -> 处理等待和段跳转 + -> 发布一致状态 + -> 执行非实时保存请求 +``` + +### 3.2 参数解析与任务提交模块设计 + +#### 3.2.1 模块功能描述 + +该模块把 `PLSR S0 S1 S2 D` 转换为可执行任务。START 只在启动信号上升沿或新命令序号时接受。 +模块先完整校验,再原子申请资源,最后生成运行快照;任何失败都不得影响正在运行的合法任务。 + +S0校验内容: + +- 总段数为1~100; +- 末地址 `S0 + N*10 + 9` 使用检查过的64位运算; +- 保留字为0; +- 双字低字在低地址、高字在下一地址; +- 频率、脉冲数、等待编码、变量来源和跳转来源合法; +- 数据块位于允许的数据区; +- S0与S1不重叠。 + +S1只包含定位模式和起始段。S2只允许K0~K4,并校验默认速度、最高速度、起止频率、曲线、 +FOLLOW、补偿和刷新周期。D按输出模式检查Y0~Y3或Y0/Y2固定点对。 + +#### 3.2.2 模块输入输出接口说明 + +```c +PlsrResult PlsrParser_BuildSnapshot( + const PlsrCall *call, + PlsrJobSnapshot *snapshot, + PlsrErrorDetail *detail); + +PlsrResult PlsrParser_ReadLiveFrequency( + const PlsrJobSnapshot *snapshot, + uint16_t segment, + uint32_t *frequency_hz); +``` + +输入为 S0/S1 首地址、S2选择值、D及输出配置;输出为完整快照或带错误数据块号的失败结果。 + +#### 3.2.3 流程图 + +```text +收到START + -> 检查上升沿/命令序号 + -> 检查轴状态 + -> 读取S0总段数并计算边界 + -> 读取并校验全部S0段 + -> 读取并校验S1 + -> 读取并校验S2和D + -> 检查绝对位置、限位和组合参数 + -> 原子申请输出资源 + -> 生成不可变运行快照 + -> 成功返回运动核心 + +任一步失败 + -> 回滚已申请资源 + -> 保持输出无效 + -> 返回兼容码和增强错误 +``` + +运行期间仅允许重新读取当前段目标频率。S0其它字段、S1、S2、D和资源绑定均使用快照;非法动态 +频率写入被忽略,继续使用最近合法值并发布诊断。 + +### 3.3 路径解释与段调度模块设计 + +#### 3.3.1 模块功能描述 + +路径模块负责1~100段的进入、执行完成条件、等待、动态跳转和段事件。相对模式把段脉冲数解释为 +本段位移;绝对模式把它解释为目标坐标,并用目标坐标减当前逻辑位置求实际输出位移。 + +零值判断顺序固定为: + +1. 先检查脉冲数量; +2. 脉冲数为0时不输出,产生零段事件并跳转; +3. 脉冲数非0且频率为0时才使用S2默认速度; +4. 默认速度不合法时拒绝执行。 + +等待条件处理如下: + +| 编码 | 条件 | 模块处理 | +| --- | --- | --- | +| H00 | 脉冲完成 | 输出完成后立即跳转 | +| H01 | Wait时间 | 完成后计时;0按1 ms | +| H02 | Wait信号 | 完成后判断X/M/HM,未有效则保持WAIT | +| H03 | ACT时间 | 段开始计时;时间到放弃剩余脉冲,脉冲先完则等到时间 | +| H04 | EXT信号 | 新上升沿到达时放弃剩余脉冲;脉冲先完仍等待新边沿 | +| H05 | EXT或脉冲完成 | 原子锁存先到原因,先到者决定跳转 | + +快照保存变量来源类型和编号,Wait/ACT数值、Wait信号和动态跳转值在实际求值时读取,以保留信捷 +动态变量语义。跳转值0表示顺序执行,1~N表示指定段,自跳表示有意无限循环。 + +#### 3.3.2 模块输入输出接口说明 + +```c +PlsrResult PlsrPath_Enter(PlsrAxis *axis, uint16_t segment); +PlsrResult PlsrPath_OnOutputDone(PlsrAxis *axis); +PlsrResult PlsrPath_OnExt(PlsrAxis *axis, uint32_t edge_sequence); +PlsrResult PlsrPath_PollWait(PlsrAxis *axis, uint64_t now_ms); +``` + +输出包括下一段请求、正常完成请求、停止剩余脉冲请求和段事件。 + +#### 3.3.3 流程图 + +```text +进入段 + -> 检查段号 + -> 计算相对位移或绝对位移 + -> 位移为0:不输出并生成段事件 + -> 位移非0:解析方向和目标频率 + -> 启动输出/ACT/EXT监视 + -> 等待脉冲完成或条件事件 + -> 锁存段结束原因 + -> 产生I6000~I6399对应事件 + -> 求动态跳转值 + -> 下一段 / WAIT / COMPLETED / ERROR +``` + +每次任务调度最多连续处理100次无脉冲跳转,达到上限后主动让出CPU,避免无限循环阻塞系统。 + +### 3.4 速度规划模块设计 + +#### 3.4.1 模块功能描述 + +速度规划模块根据S2、段目标、剩余脉冲和下一段速度生成当前控制频率。TIM6提供10 kHz控制基准; +0.1 ms轴每次更新,1 ms轴每10次更新。无运行轴时关闭TIM6。 + +内部采用定点数:频率使用Q32.32,归一化曲线进度使用Q1.31,时间使用整数微秒,禁止在控制中断 +使用浮点三角函数。 + +三种曲线定义为: + +```text +直线:g(u) = u +S形: g(u) = 3u² - 2u³ +正弦:g(u) = (1 - cos(πu)) / 2 + +f(u) = f_start + (f_end - f_start) * g(u) +``` + +正弦函数使用只读查找表和线性插值。距离不足时通过有界二分求解峰值频率,自动形成三角或短距离 +曲线;无法满足起止速度和脉冲数时返回参数冲突。 + +完成方式在当前段脉冲结束后再改变到下一段速度;后续方式在当前段内预留变速脉冲,使段边界时已达到 +下一段入口速度。反向段必须先减速到0再切换方向或相序。 + +S2最高速度为0或超出硬件开放范围时拒绝启动。起始、目标和终止速度超过合法最高速度时限幅并发布 +`SPEED_CLAMPED`。FOLLOW性能范围为1~100,前馈补偿范围为0~100;具体运算公式在编码前按 +信捷手册相应参数定义冻结,禁止自行发明含义。 + +#### 3.4.2 模块输入输出接口说明 + +```c +PlsrResult PlsrProfile_Prepare( + const PlsrSegmentRuntime *segment, + const PlsrS2Snapshot *s2, + PlsrProfile *profile); + +void PlsrProfile_ControlTick(PlsrProfile *profile, uint32_t elapsed_us); +void PlsrProfile_SetTarget(PlsrProfile *profile, uint32_t target_hz); +``` + +输入为当前频率、目标频率、起止频率、加减速时间、曲线、剩余脉冲和衔接方式;输出为当前命令频率 +和待提交的定时器分频参数。 + +#### 3.4.3 流程图 + +```text +准备段曲线 + -> 校验S2和目标速度 + -> 计算加速/减速所需脉冲 + -> 距离足够:生成完整曲线 + -> 距离不足:求解短距离峰值 + -> 每0.1/1 ms推进定点曲线 + -> 计算当前命令频率 + -> 限幅并生成诊断 + -> 计算待提交PSC/ARR/CCR + -> 脉冲模块在安全周期边界应用 +``` + +运行中目标频率修改不改变剩余脉冲数。规划器在配置刷新周期内接收并开始过渡,物理周期参数在最近的 +安全周期边界切换;低频时不得为了刷新指标截断一个完整脉冲。 + +### 3.5 高速脉冲输出模块设计 + +#### 3.5.1 模块功能描述 + +高速输出模块使用硬件定时器维持脉冲边沿,OS不参与逐脉冲翻转。 + +| 逻辑点 | MCU引脚 | 定时器通道 | 定时器时钟 | +| --- | --- | --- | ---: | +| Q0/Y0 | PF6 | TIM10_CH1 | 168 MHz | +| Q1/Y1 | PF8 | TIM13_CH1 | 84 MHz | +| Q2/Y2 | PF7 | TIM11_CH1 | 168 MHz | +| Q3/Y3 | PF9 | TIM14_CH1 | 84 MHz | + +##### 3.5.1.1 混合计数架构 + +RM0090 Rev.22 第19.4.2节表101的TIM9/TIM12内部触发连接提供以下通路: + +| 硬件计数器 | 触发选择 | 内部计数来源 | 对应输出 | +| --- | --- | --- | --- | +| TIM9 | ITR2 | TIM10_OC | Q0 | +| TIM9 | ITR3 | TIM11_OC | Q2 | +| TIM12 | ITR2 | TIM13_OC | Q1 | +| TIM12 | ITR3 | TIM14_OC | Q3 | + +TIM9在同一时刻只能选择Q0或Q2中的一路,TIM12只能选择Q1或Q3中的一路。因此V1.0采用: + +```text +优先:TIM9/TIM12内部硬件累计 + ↓ 计数器不可达或已被其它轴占用 +兜底:对应输出定时器的周期中断软件累计 +``` + +计数方式在每段开始前确定并锁存到该段结束,不在脉冲活动期间切换。最多同时提供两套内部硬件 +计数;四轴PULSE/DIR并发时,至少两轴硬件计数、其余轴软件计数。资源分配优先级依次为: + +1. 已运行轴持有的计数器租约不得被新任务抢占; +2. 同一批待启动段发生竞争时,优先AB相,其次按预计软件中断负载从高到低选择; +3. 条件仍相同时,按命令提交顺序选择; +4. 无可用硬件计数器时自动使用软件计数,不因计数器不足拒绝合法运动。 + +可同时硬件计数的PULSE/DIR组合为Q0+Q1、Q0+Q3、Q2+Q1或Q2+Q3。Q0与Q2竞争TIM9, +Q1与Q3竞争TIM12。 + +AB相每个相位通道每完整正交周期只产生一次同类内部比较事件,因此一组AB轴只需选择其中一个相位 +作为周期计数基准。两组AB轴应通过匹配分配分别使用TIM9和TIM12,例如Q0/Q1轴选Q0→TIM9, +Q2/Q3轴选Q3→TIM12。 + +CW/CCW只对当前实际发脉冲的方向通道计数。发生方向切换时,在完全停止的段边界重新申请相应的 +TIM9或TIM12;申请失败则该段切换为软件计数,不能在脉冲活动期间改源。 + +定时器采用向上计数和PWM输出: + +```text +f_actual = f_timer / ((PSC + 1) * (ARR + 1)) +CCR1 = (ARR + 1) / 2 +``` + +分频算法选择能容纳16位ARR的最小预分频,并比较相邻合法候选,取绝对频率误差最小者;误差相同时 +选择更大的ARR以保留分辨率。记录目标频率、实际频率、PSC、ARR、CCR和误差。 + +硬件计数模式下不为每个PWM周期开启更新中断。TIM6控制刷新先短暂禁止输出定时器的更新装载,依次 +写入PSC、ARR和CCR预装载值,再恢复更新装载;完整的新参数在随后自然更新事件一次性生效。若更新 +边界在短暂禁止期间到达,则延后一个完整周期生效,不能出现混合分频值或截断周期。 + +PULSE/DIR先设置DIR,再等待默认10 ms或配置的方向建立时间,随后启动PWM。物理上升沿计1个指令 +脉冲。硬件计数时由TIM9/TIM12在外部时钟模式1下累计每周期一次的内部OC事件;软件计数时由输出 +定时器自然更新事件累计。进入目标脉冲时只武装一次尾边沿处理,最后一个脉冲下降沿到达后关闭通道, +防止出现下一个多余上升沿。 + +CW/CCW正向只启动CW端,反向只启动CCW端,另一路始终无效。检测到双通道同时活动时立即关闭配对 +输出并进入ERROR。 + +AB相固定配对如下: + +| 轴归属 | A相 | B相 | 正向状态顺序 | +| --- | --- | --- | --- | +| Y0 | Q0/TIM10 | Q1/TIM13 | `00→10→11→01→00` | +| Y2 | Q2/TIM11 | Q3/TIM14 | `00→10→11→01→00` | + +反向交换A、B领先关系。两个定时器预装四分之一周期相位差;从已分配的一个相位内部OC事件累计 +完整AB周期,落后相第四次跳变完成后关闭最后一周期。一个完整四状态周期只计1个指令脉冲,四次 +相位跳变不得分别计数。 + +##### 3.5.1.2 16位硬件计数扩展 + +TIM9和TIM12均为16位计数器。计数器配置为外部时钟模式1,ARR保持为`0xFFFF`,每收到一次选定的 +内部OC事件,CNT自动加1。软件使用“16位硬件CNT + 64位块累计”扩展完整INT32脉冲范围: + +```text +每65536个指令脉冲 + -> TIM9/TIM12产生一次更新中断 + -> 软件块累计加65536 + +最终低16位到达比较值 + -> 检查块累计是否已到目标高位 + -> 是:武装最终完整脉冲/AB周期的尾边沿关闭 + -> 否:清比较标志并继续硬件累计 +``` + +目标低16位不为0时使用捕获比较事件判断最终余数;目标恰为65536的整数倍时,使用更新事件和块累计 +判断完成,禁止把比较值0解释成启动瞬间已经完成。 + +100 kHz连续输出时,每个硬件计数轴的块中断频率约为`100000/65536=1.53次/秒`;除块中断、最终 +比较和异常外,不产生逐脉冲计数中断。零脉冲段在进入硬件层前处理,绝对值计算使用64位,避免 +INT32_MIN取反溢出。 + +TIM10/11/13/14的SMCR在寄存器表中为保留项,因此硬件计数器只能通知CPU达到目标,不能反向门控 +输出定时器。最终比较事件到达后不得立即截断 +活动波形,而应根据模式武装输出定时器的最终边沿:PULSE/DIR和CW/CCW在最后下降沿关闭,AB相在 +第四次状态跳变后同时关闭配对通道。`N=1`时在启动前直接武装尾边沿。内部OC事件相位、同步延迟和 +最终关闭窗口必须用逻辑分析仪确认。 + +四个高速定时器对应共享中断向量: + +| 定时器 | 中断向量 | +| --- | --- | +| TIM10 | `TIM1_UP_TIM10_IRQn` | +| TIM11 | `TIM1_TRG_COM_TIM11_IRQn` | +| TIM13 | `TIM8_UP_TIM13_IRQn` | +| TIM14 | `TIM8_TRG_COM_TIM14_IRQn` | + +两个硬件计数器的中断向量为: + +| 计数器 | 中断向量 | 用途 | +| --- | --- | --- | +| TIM9 | `TIM1_BRK_TIM9_IRQn` | Q0/Q2硬件块计数和最终比较 | +| TIM12 | `TIM8_BRK_TIM12_IRQn` | Q1/Q3硬件块计数和最终比较 | + +热路径采用直接寄存器访问,不调用通用 `HAL_TIM_IRQHandler()`。共享中断入口先检查本定时器标志, +并为TIM1/TIM8未来用途保留分派能力。硬件计数轴关闭输出定时器的周期更新中断;软件计数轴才启用 +周期更新中断。 + +#### 3.5.2 模块输入输出接口说明 + +```c +PlsrResult PlsrHw_Init(void); +PlsrResult PlsrHw_Configure(const PlsrHwRequest *request); +PlsrResult PlsrHw_Start(uint8_t axis, uint64_t pulses); +PlsrResult PlsrHwCounter_Configure(const PlsrCounterLease *lease, uint64_t target_pulses); +void PlsrHwCounter_Stop(const PlsrCounterLease *lease); +void PlsrHw_SetPendingDivider(uint8_t axis, const PlsrDivider *divider); +void PlsrHw_RequestTailStop(uint8_t axis); +void PlsrHw_ForceSafe(uint32_t resource_mask); +``` + +输入为模式、方向、频率、脉冲数量、方向点和极性;输出为周期完成事件、实际计数、分频诊断和硬件错误。 + +#### 3.5.3 流程图 + +```text +启动硬件输出 + -> 输出保持无效 + -> 配置GPIO复用和安全电平 + -> 装载PSC/ARR/CCR并清状态标志 + -> PULSE/DIR设置方向并等待建立时间 + -> AB装载配对相位 / CW选择单通道 + -> 尝试申请并配置TIM9/TIM12硬件计数 + 成功:关闭逐周期计数中断 + 失败:启用输出定时器软件周期计数 + -> 使能通道和定时器 + -> 硬件持续输出 + -> 硬件模式:每65536脉冲更新块累计 + 软件模式:周期ISR更新剩余量 + -> TIM6通过预装载安全更新分频 + -> 进入最后一个脉冲/AB周期 + -> 比较事件完成尾边沿 + -> 关闭输出并通知运动核心 +``` + +TIM10/11/13/14没有重复计数寄存器,TIM9/TIM12内部连接又只能覆盖两路。四轴100 kHz时,若两路 +硬件计数、两路软件计数,最坏约为每秒200,000次软件周期事件,加TIM6的10,000次控制事件和少量 +硬件块中断。完整功能开发前必须完成两种计数模式原型,测量ISR最坏执行时间、CPU占用、计数模式 +切换、USB/Modbus压力、尾脉冲和AB相位;未通过不得宣称四轴100 kHz验收完成。 + +### 3.6 状态机与命令模块设计 + +#### 3.6.1 模块功能描述 + +每轴状态固定为: + +```text +UNINITIALIZED、IDLE、ACCEL、RUN、DECEL、WAIT、PAUSED、 +COMPLETED、STOPPED、ERROR +``` + +主要合法转换如下: + +| 当前状态 | 事件 | 下一状态 | +| --- | --- | --- | +| UNINITIALIZED | 初始化成功 | IDLE | +| IDLE/COMPLETED/STOPPED | START成功 | ACCEL、RUN、WAIT或COMPLETED | +| ACCEL/RUN | 需要减速 | DECEL | +| 运动状态 | 等待条件未满足 | WAIT | +| 运动状态 | PAUSE且减速完成 | PAUSED | +| PAUSED | RESUME | ACCEL或RUN | +| 运行类状态 | 路径正常结束 | COMPLETED | +| 非终止状态 | STOP完成 | STOPPED | +| 可运行状态 | 不可恢复错误 | ERROR | +| ERROR | RESET_ERROR成功 | IDLE | + +未列出的转换由统一入口拒绝并记录非法转换。DONE只在正常完成时置1,下一次START成功接受时清零; +STOP和ERROR不得置DONE。WAIT和PAUSED期间BUSY为1、PULSE_ACTIVE为0。 + +支持START、STOP_DECEL、STOP_IMMEDIATE、PAUSE、RESUME、SET_POSITION、CLEAR_POSITION、 +CLEAR_TOTAL、SAVE_CONFIG、LOAD_CONFIG、RESET_ERROR和SELF_TEST。每轴保存最近命令序号与结果, +相同序号重发只返回上次结果,不重复执行。 + +#### 3.6.2 模块输入输出接口说明 + +```c +PlsrResult PlsrState_Transition( + PlsrAxis *axis, + PlsrState target, + PlsrTransitionReason reason); + +PlsrResult PlsrCommand_Execute( + PlsrAxis *axis, + const PlsrCommand *command); +``` + +#### 3.6.3 流程图 + +```text +收到命令 + -> 比较命令序号 + -> 重复序号:返回上次结果 + -> 检查当前状态是否允许 + -> 按命令执行动作 + -> 通过唯一状态转换入口改变状态 + -> 保存序号、结果和停止原因 + -> 发布BUSY/PULSE_ACTIVE/DONE/WAIT/ERROR +``` + +事件优先级固定为:软件急停 > 硬限位 > STOP_IMMEDIATE > STOP_DECEL > PAUSE > 正常运行。 +高优先级原因锁存后,低优先级命令不得覆盖。 + +### 3.7 输出资源管理模块设计 + +#### 3.7.1 模块功能描述 + +资源管理器维护高速资源Q0~Q3、普通输出资源Q0~Q7/Q10~Q17/Q20,以及内部硬件计数器 +TIM9/TIM12的占用位图。高速输出和DIR资源属于运动必需资源;硬件计数器属于优化资源,申请失败时 +允许使用软件计数兜底。 + +| 模式 | D允许值 | 高速资源 | DIR资源 | +| --- | --- | --- | --- | +| PULSE/DIR | Y0~Y3 | D对应的一个Q点 | 一个未占用有效输出点 | +| AB相 | Y0或Y2 | Q0/Q1或Q2/Q3 | 无 | +| CW/CCW | Y0或Y2 | Q0/Q1或Q2/Q3 | 无 | + +硬件计数资源规则: + +| 脉冲来源 | 可申请计数器 | 冲突组 | +| --- | --- | --- | +| Q0/TIM10 | TIM9 ITR2 | 与Q2互斥 | +| Q2/TIM11 | TIM9 ITR3 | 与Q0互斥 | +| Q1/TIM13 | TIM12 ITR2 | 与Q3互斥 | +| Q3/TIM14 | TIM12 ITR3 | 与Q1互斥 | + +单轴或两轴运行时优先选择能全部硬件计数的组合。四轴运行时,资源管理器分别从Q0/Q2组和Q1/Q3组 +选择一个轴使用硬件计数。既有运行租约不被抢占;同批竞争时按AB模式、预计中断负载和提交顺序选择。 +计数器租约只在段停止边界申请或释放;任务运行期间如果某段不能获得计数器,则该段使用软件计数。 + +方向点板级映射如下: + +| PLC点 | MCU引脚 | PLC点 | MCU引脚 | +| --- | --- | --- | --- | +| Q0 | PF6 | Q10 | PG7 | +| Q1 | PF8 | Q11 | PG6 | +| Q2 | PF7 | Q12 | PH9 | +| Q3 | PF9 | Q13 | PH8 | +| Q4 | PI8 | Q14 | PH7 | +| Q5 | PE6 | Q15 | PH6 | +| Q6 | PE5 | Q16 | PF11 | +| Q7 | PE4 | Q17 | PB0 | +| Q20 | PH5 | | | + +完整申请掩码在短临界区内一次判断和占用,禁止逐点申请后失败而留下半组资源。运行期间模式、D、 +配对关系、方向点和极性锁定。正常完成、STOP和ERROR统一通过幂等清理入口释放资源。 + +#### 3.7.2 模块输入输出接口说明 + +```c +PlsrResult PlsrResource_Reserve( + uint8_t owner_axis, + const PlsrResourceRequest *request, + PlsrResourceLease *lease); + +void PlsrResource_Release(PlsrResourceLease *lease); +PlsrCountMode PlsrResource_SelectCounter( + uint8_t owner_axis, + uint8_t pulse_source, + PlsrCounterLease *counter_lease); +``` + +#### 3.7.3 流程图 + +```text +构造完整资源掩码 + -> 检查模式与D + -> 检查高速点和DIR点合法性 + -> 进入短临界区 + -> 任一冲突:退出并返回RESOURCE_CONFLICT + -> 无冲突:一次性占用全部资源 + -> 尝试申请TIM9/TIM12计数优化资源 + 成功:锁存硬件计数租约 + 失败:锁存软件计数模式 + -> 配置硬件 + -> 配置失败:安全关闭并回滚 + -> 任务终止:安全关闭并幂等释放 +``` + +### 3.8 软元件与通信适配模块设计 + +#### 3.8.1 模块功能描述 + +HSD、SFD、SM、SD、I、S0和S1是逻辑软元件命名空间,不等同于“Modbus通信地址表”。 +PLSR内核通过统一设备接口访问逻辑软元件,Modbus只负责字节序、影子写入、命令序号和提交响应。 + +固定地址只采用 [PLSR地址映射.md](./PLSR地址映射.md): + +| 类别 | 固定范围 | +| --- | --- | +| K0配置 | HSD460~539 | +| 公共参数及K1~K4 | SFD900~1419 | +| 累计状态 | HSD0~15 | +| 运行/方向标志 | SM1000/1001、1020/1021、1040/1041、1060/1061 | +| 实时状态 | SD1000~1011、1020~1031、1040~1051、1060~1071 | +| 段事件 | I6000~6399 | +| 动态数据 | S0、S1 | + +固定字段使用显式描述表保存地址、位宽、有符号性、读写属性、合法范围、所属轴和持久化类别,不得通过 +自拟轴块改变信捷地址。保留字段仍占原地址,未实现字段不得挪作项目扩展。 + +32/64位状态采用版本化快照发布。Modbus断开不产生STOP;非法通信参数不得改变正在运行的任务。 +本设计书不新增PLSR全局通信地址区,也不恢复已删除的Modbus历史功能。 + +#### 3.8.2 模块输入输出接口说明 + +```c +bool PlsrDevice_Read(DeviceRef ref, int64_t *value); +bool PlsrDevice_Write(DeviceRef ref, int64_t value); +bool PlsrDevice_ReadBlock(DeviceRef first, uint16_t words, uint16_t *buffer); +void PlsrDevice_PublishAxis(uint8_t axis, const PlsrStatus *status); +void PlsrDevice_TriggerSegmentEvent(uint8_t axis, uint16_t segment); +``` + +#### 3.8.3 流程图 + +```text +外部读写请求 + -> 解析逻辑软元件类型和地址 + -> 检查位宽、权限和范围 + -> 参数写入影子区 + -> COMMIT时调用PLSR业务校验 + -> 成功:切换版本并返回序号/结果 + -> 失败:保持原有效参数 + +状态读取 + -> 读取版本号 + -> 复制完整状态 + -> 再读版本号 + -> 前后相同且为稳定版本:返回 + -> 否则重试 +``` + +### 3.9 位置、当量与持久化模块设计 + +#### 3.9.1 模块功能描述 + +每轴内部维护64位逻辑位置、本次任务累计、总累计和物理输出诊断计数,以及独立的 +`position_valid`。高速ISR只更新当前块计数;任务在块边界、段边界或检查点时合并64位数据。 + +发布HSD固定32位累计前检查INT32范围。超出范围时保持最近合法发布值,锁存 +`COUNTER_OVERFLOW`,不得回绕或静默截断。 + +当量换算按每转指令脉冲数和每转移动量形成有理数比例,计算前约分并检查溢出,每轴保存换算余数, +避免连续多段累计舍入漂移。任一分母为0时返回兼容错误码2。 + +软限位按逻辑位置和预计停止距离判断:禁止向越界方向启动,允许运动离开已触发限位;运动中触发默认 +减速停止。方向反转时插入内部齿隙补偿子段,补偿脉冲不计入用户段、逻辑位置或HSD,但计入物理输出 +诊断。 + +固定配置使用Flash A/B双槽: + +```text +magic | format_version | payload_length | sequence | payload | CRC32 +``` + +动态K0、64位位置、累计、有效标志和最近诊断保存到有VBAT维持的Backup SRAM双检查点。 +正常完成、正常停止、设置/清零位置和清累计后立即保存;运行中初始按10 ms及段边界保存诊断检查点。 +异常复位或上次BUSY时清除 `position_valid`,任何情况都不自动恢复未完成路径。 + +#### 3.9.2 模块输入输出接口说明 + +```c +PlsrResult PlsrPosition_Set(uint8_t axis, int64_t position); +PlsrResult PlsrPosition_Clear(uint8_t axis); +PlsrResult PlsrPosition_ConvertToPulse(uint8_t axis, int64_t value, int64_t *pulse); +PlsrResult PlsrPersist_SaveConfig(void); +PlsrResult PlsrPersist_LoadConfig(void); +void PlsrPersist_SaveCheckpoint(uint32_t reason); +``` + +#### 3.9.3 流程图 + +```text +脉冲块完成 + -> 原子交换当前块计数 + -> 检查64位加法溢出 + -> 更新逻辑位置和累计 + -> 检查软限位 + -> 检查HSD32位发布范围 + -> 更新状态快照 + -> 达到检查点条件:更新Backup SRAM + +上电恢复 + -> 输出保持安全 + -> 读取复位原因 + -> 校验Flash和Backup SRAM版本/CRC + -> 恢复允许的配置与诊断 + -> 异常复位或上次BUSY:清position_valid + -> 清全部运行资源 + -> 禁止自动启动 +``` + +### 3.10 诊断与自测模块设计 + +#### 3.10.1 模块功能描述 + +诊断模块记录每轴目标/实际频率、PSC/ARR/CCR、当前计数模式、TIM9/TIM12块累计、软件脉冲数、 +物理边沿诊断值、当前段、停止原因、状态机非法转换、资源冲突和ISR执行周期。 + +`SELF_TEST` 分为两级: + +- 默认不输出自测:地址表、S0/S1边界、跳转、分频、状态机、计数和CRC; +- 输出自测:需要明确测试授权,仅在断开执行机构或采取防护后输出指定低频波形。 + +#### 3.10.2 模块输入输出接口说明 + +```c +void PlsrDiag_RecordError(uint8_t axis, PlsrError error, const PlsrErrorDetail *detail); +void PlsrDiag_RecordDivider(uint8_t axis, const PlsrDivider *divider); +void PlsrDiag_RecordIsrCycles(uint8_t axis, uint32_t cycles); +PlsrResult PlsrDiag_SelfTest(uint32_t test_mask, bool allow_output); +``` + +#### 3.10.3 流程图 + +```text +收到SELF_TEST + -> 检查所有轴非BUSY + -> 执行静态地址和配置检查 + -> 执行分频、路径、计数和状态机检查 + -> 是否请求输出测试 + 否:汇总结果 + 是:检查显式授权和安全条件 + -> 输出受限测试波形 + -> 自动安全关闭 + -> 发布逐项结果和首个失败原因 +``` + +## 4 数据结构设计 + +### 4.1 数据结构设计 + +#### 4.1.1 基本枚举 + +```c +typedef enum { + PLSR_STATE_UNINITIALIZED, + PLSR_STATE_IDLE, + PLSR_STATE_ACCEL, + PLSR_STATE_RUN, + PLSR_STATE_DECEL, + PLSR_STATE_WAIT, + PLSR_STATE_PAUSED, + PLSR_STATE_COMPLETED, + PLSR_STATE_STOPPED, + PLSR_STATE_ERROR +} PlsrState; + +typedef enum { + PLSR_OUTPUT_PULSE_DIR = 0, + PLSR_OUTPUT_AB = 1, + PLSR_OUTPUT_CW_CCW = 2 +} PlsrOutputMode; + +typedef enum { + PLSR_POSITION_RELATIVE = 0, + PLSR_POSITION_ABSOLUTE = 1 +} PlsrPositionMode; + +typedef enum { + PLSR_COUNT_SOFTWARE = 0, + PLSR_COUNT_TIM9 = 1, + PLSR_COUNT_TIM12 = 2 +} PlsrCountMode; +``` + +#### 4.1.2 调用与命令 + +```c +typedef struct { + DeviceRef s0; + DeviceRef s1; + DeviceRef s2; + uint8_t d_axis; +} PlsrCall; + +typedef struct { + uint32_t sequence; + uint16_t axis; + uint16_t opcode; + int64_t argument; +} PlsrCommand; +``` + +#### 4.1.3 段快照 + +```c +typedef struct { + uint32_t target_frequency_hz; + int32_t pulse_or_position; + uint16_t wait_word; + int32_t wait_argument; + uint16_t jump_word; + int32_t jump_argument; +} PlsrSegmentSnapshot; +``` + +四轴各保留最多100段的紧凑快照。快照同时保存当前段频率源地址,专供受控动态调频;其它字段不得 +通过源地址重新读取。 + +#### 4.1.4 任务快照 + +```c +typedef struct { + uint16_t segment_count; + uint16_t start_segment; + PlsrPositionMode position_mode; + PlsrOutputMode output_mode; + uint8_t d_axis; + PlsrS2Snapshot s2; + PlsrResourceLease resources; + PlsrSegmentSnapshot segments[PLSR_MAX_SEGMENTS]; +} PlsrJobSnapshot; +``` + +硬件计数租约作为输出资源租约的一部分: + +```c +typedef struct { + PlsrCountMode mode; + uint8_t owner_axis; + uint8_t pulse_source; + uint8_t trigger_select; + bool valid; +} PlsrCounterLease; +``` + +TIM9和TIM12各只能存在一个有效租约。软件计数模式不占用硬件计数租约。 + +#### 4.1.5 轴运行对象 + +```c +typedef struct { + PlsrState state; + PlsrJobSnapshot job; + PlsrSegmentRuntime segment; + PlsrProfile profile; + PlsrPulseFastContext pulse_fast; + int64_t logical_position; + int64_t task_pulses; + int64_t total_pulses; + uint64_t physical_edges; + bool position_valid; + uint32_t event_flags; + uint32_t event_sequence; + uint32_t last_command_sequence; + PlsrCommandResult last_command_result; + PlsrError error; + PlsrStatusPublish publish; +} PlsrAxis; +``` + +#### 4.1.6 ISR快速上下文 + +```c +typedef struct { + volatile uint32_t remaining_in_block; + volatile uint32_t completed_in_block; + volatile uint32_t hardware_wrap_count; + volatile uint32_t pending_event; + volatile uint8_t divider_pending; + volatile uint8_t tail_stop_armed; + PlsrCountMode count_mode; + uint8_t pulse_source; + uint16_t final_compare; + uint64_t target_pulses; + PlsrDivider active_divider; + PlsrDivider pending_divider; +} PlsrPulseFastContext; +``` + +硬件计数模式下,`hardware_wrap_count`与TIM9/TIM12当前CNT组成完整累计;软件计数模式下使用 +`remaining_in_block`逐周期递减。`count_mode`在段活动期间只读,只有输出完全停止后才允许改变。 +快速上下文只保存ISR固定时间内需要的数据,不放置S0数组、Flash缓存和复杂状态对象。 + +#### 4.1.7 对外状态 + +```c +typedef struct { + uint32_t version; + PlsrState state; + uint16_t current_segment; + uint16_t total_segments; + int8_t direction; + uint8_t busy; + uint8_t pulse_active; + uint8_t done; + uint32_t command_frequency_hz; + uint32_t actual_frequency_hz; + PlsrCountMode count_mode; + uint32_t hardware_counter_value; + int64_t segment_sent; + int64_t segment_remaining; + int64_t logical_position; + int64_t task_pulses; + int64_t total_pulses; + PlsrError error; + uint32_t stop_reason; + uint32_t version_end; +} PlsrStatus; +``` + +#### 4.1.8 固定软元件描述 + +```c +typedef struct { + PlsrDeviceType type; + uint16_t address; + uint8_t width_words; + uint8_t axis; + uint8_t access; + uint8_t persistence; + int64_t minimum; + int64_t maximum; +} PlsrDeviceDescriptor; +``` + +描述表必须覆盖HSD460~539、SFD900~1419、HSD0~15、固定SM、固定SD和I6000~6399, +并通过静态断言检查重复地址、位宽和轴归属。 + +### 4.2 数据结构与程序的关系 + +#### 4.2.1 数据流关系 + +```text +S0/S1/S2/D逻辑软元件 + | + v +PlsrParser_BuildSnapshot + | + v +PlsrJobSnapshot ----------> PlsrPath / PlsrProfile + | | + v v +PlsrAxis状态机 <---------- ISR事件和块计数 + | + +----> PlsrStatusPublish ----> HSD/SM/SD/I与Modbus读取 + | + +----> Flash / Backup SRAM检查点 +``` + +#### 4.2.2 数据所有权 + +| 数据 | 唯一写者 | 读取者 | 一致性方法 | +| --- | --- | --- | --- | +| ISR快速计数 | TIM9/TIM12块ISR或输出定时器兜底ISR | TIM6 ISR、PlsrTask | 计数模式锁存、32位原子交换 | +| 速度规划状态 | TIM6 ISR | 脉冲ISR、PlsrTask | 待提交双缓冲 | +| 状态机和路径游标 | PlsrTask | 状态发布 | 单写者 | +| 输出资源位图 | 资源管理器 | PlsrTask、诊断 | 短临界区 | +| 64位位置累计 | PlsrTask | 状态读取、保存 | 顺序锁/短临界区 | +| 对外状态影子 | 状态发布器 | Modbus、内部API | 版本号前后校验 | +| 固定配置镜像 | 参数模块 | 保存和设备访问 | 影子+COMMIT | + +通信层禁止直接写 `PlsrAxis`。`volatile`只保证访问可见性,不代替原子性、临界区和内存屏障。 + +#### 4.2.3 中断事件数据 + +每轴使用32位事件字: + +```text +bit0 PULSE_BLOCK_DONE +bit1 SEGMENT_OUTPUT_DONE +bit2 LIMIT_POSITIVE +bit3 LIMIT_NEGATIVE +bit4 EXT_RISING +bit5 STOP_IMMEDIATE_DONE +bit6 TIMER_FAULT +bit7 COUNTER_FAULT +bit8 HW_COUNTER_WRAP +bit9 HW_COUNTER_TARGET +``` + +可合并事件采用原子置位;不能丢失的段事件另带单调递增序号。临界区内禁止遍历100段、除法、CRC、 +Flash操作或通信发送,并使用DWT周期计数器测量最坏执行时间。 + +#### 4.2.4 固定运行状态发布 + +| 轴 | HSD累计 | SM标志 | SD实时状态 | 段事件 | +| --- | --- | --- | --- | --- | +| Y0 | HSD0~3 | SM1000、SM1001 | SD1000~1011 | I6000~6099 | +| Y1 | HSD4~7 | SM1020、SM1021 | SD1020~1031 | I6100~6199 | +| Y2 | HSD8~11 | SM1040、SM1041 | SD1040~1051 | I6200~6299 | +| Y3 | HSD12~15 | SM1060、SM1061 | SD1060~1071 | I6300~6399 | + +双字采用低地址低16位、下一地址高16位。第N段事件使用轴事件基址加 `N-1`,跳转目标不得改变原段 +事件地址。 + +## 5 错误处理设计 + +### 5.1 错误处理设计描述 + +#### 5.1.1 错误分层 + +| 层级 | 示例 | 处理 | +| --- | --- | --- | +| 告警 | `SPEED_CLAMPED` | 记录并继续运行 | +| 启动拒绝 | 参数越界、资源冲突、位置无效 | 不启动、不占资源、不破坏其它轴 | +| 轴错误 | 计数异常、定时器异常、动态跳转越界 | 安全停止该轴、释放资源并锁存ERROR | +| 全局严重错误 | HardFault、共享数据破坏 | 关闭全部高速输出并锁存全局故障 | + +错误处理统一遵循:先禁止新脉冲,再锁存原因,再发布状态,最后在任务上下文执行资源释放和允许的 +检查点保存。错误清除只回到IDLE,不自动恢复未完成任务。 + +#### 5.1.2 安全输出 + +以下时机调用统一 `PlsrHw_ForceSafe()`: + +- 上电及PLSR初始化前; +- START硬件配置失败; +- STOP_IMMEDIATE尾脉冲完成; +- 定时器、计数或互斥严重错误; +- HardFault、MemManage、BusFault、UsageFault; +- 看门狗复位后的早期初始化。 + +安全关闭直接关闭TIM10/11/13/14通道和计数器,并把相关GPIO恢复为配置的安全无效电平。 +故障处理函数不得写Flash。 + +#### 5.1.3 参数与运行错误 + +- 参数错误在START前尽量全部发现; +- 运行中非法目标频率不破坏当前合法运动,保留最近合法目标并发布诊断; +- 动态等待或跳转变量在运行时越界时进入ERROR; +- 剩余量下溢、TIM9/TIM12硬件累计与输出诊断不一致、定时器意外停止或AB/CW/CCW互斥破坏时 + 立即关闭输出; +- 兼容32位累计溢出时不得截断或回绕; +- 限位触发按正负方向发布兼容码,并禁止继续向越界方向启动; +- 多次STOP_IMMEDIATE按幂等命令处理。 + +#### 5.1.4 设计风险与关闭条件 + +| 编号 | 风险 | 处理及关闭条件 | +| --- | --- | --- | +| RISK-01 | 四轴100 kHz仍有两轴可能采用软件计数,最坏约200k周期事件/秒 | 分别验证两硬件+两软件计数组合,记录ISR最坏周期、CPU占用和通信压力结果 | +| RISK-02 | TIM9/TIM12只能累计,不能反向自动关闭输出源 | 最终比较只武装尾边沿,逐数量边界验证无额外或窄脉冲 | +| RISK-03 | AB配对定时器时钟分别为168/84 MHz | 全频段测量两组AB频率、相位及方向 | +| RISK-04 | USB当前中断优先级0 | 调低优先级并完成USB压力测试 | +| RISK-05 | 输出电路极性和可靠带宽待实测 | 测量Q0~Q3带载波形后冻结参数 | +| RISK-06 | 0.1 ms曲线计算量 | 定点化和预计算,DWT实测最坏执行时间小于周期预算 | +| RISK-07 | 16位通信写入造成32位动态频率撕裂 | 使用影子+COMMIT版本和内核二次校验 | +| RISK-08 | Backup SRAM不能保证掉电瞬间零误差 | 异常复位清position_valid,并记录恢复等级 | +| RISK-09 | 现有历史写入破坏S0/S1数据 | 删除历史写入并完成全地址越界测试 | +| RISK-10 | 信捷保留字段被扩展复用 | 固定描述表、静态断言和对标矩阵评审 | +| RISK-11 | FOLLOW公式尚未在需求中展开 | 编码前按手册冻结公式和测试向量 | +| RISK-12 | TIM9/TIM12内部OC事件相位和跨时钟域同步延迟 | 测量Q0~Q3的计数对应边沿、首脉冲、末脉冲和动态调频后累计一致性 | + +### 5.2 错误输出信息 + +#### 5.2.1 信捷兼容错误码 + +| 兼容码 | 含义 | 处理 | +| ---: | --- | --- | +| 1 | 脉冲数据段配置错误 | 拒绝启动,错误块号写SD的B+11 | +| 2 | 每转脉冲数或每转移动量为0 | 拒绝启动 | +| 3 | S2参数块号错误 | 拒绝启动 | +| 4 | 脉冲参数块号或范围错误 | 拒绝启动 | +| 5 | 正限位触发 | 减速停止并禁止继续正向启动 | +| 6 | 负限位触发 | 减速停止并禁止继续反向启动 | +| 15 | FOLLOW性能不在1~100 | 拒绝启动 | +| 16 | FOLLOW前馈不在0~100 | 拒绝启动 | +| 26 | 控制块或高速资源分配失败 | 拒绝启动或进入ERROR | + +#### 5.2.2 项目增强错误 + +| 错误 | 含义 | 级别 | +| --- | --- | --- | +| `DEFAULT_SPEED_INVALID` | 段频率0但S2默认速度非法 | 启动拒绝/轴错误 | +| `SEGMENT_OVERFLOW` | 路径段数超过100 | 启动拒绝 | +| `OUTPUT_MODE_INVALID` | 输出模式或D组合非法 | 启动拒绝 | +| `RESOURCE_CONFLICT` | 脉冲点或DIR点冲突 | 启动拒绝 | +| `PARAMETER_LOCKED` | 运行中修改锁定参数 | 写入拒绝 | +| `DONE_STATE_ERROR` | DONE状态转换异常 | 轴错误 | +| `SPEED_CLAMPED` | 速度被S2最高速度限幅 | 告警 | +| `POSITION_INVALID` | 绝对定位前位置无效 | 启动拒绝 | +| `COUNTER_OVERFLOW` | 内部或兼容累计溢出 | 轴错误 | +| `ILLEGAL_TRANSITION` | 非法状态机转换 | 轴错误 | +| `TIMER_FAULT` | 定时器初始化或运行异常 | 轴/全局错误 | +| `PULSE_COUNT_MISMATCH` | 软件计数与诊断计数不一致 | 轴错误 | +| `HW_COUNTER_FAULT` | TIM9/TIM12计数器意外停止、越权或累计不一致 | 轴错误 | +| `HW_COUNTER_FALLBACK` | 硬件计数器不可用,当前段使用软件计数 | 诊断提示,不终止任务 | + +#### 5.2.3 错误信息结构 + +```c +typedef struct { + PlsrError error; + uint16_t compatible_code; + uint8_t axis; + uint16_t segment; + uint16_t bad_block; + uint32_t command_sequence; + uint32_t stop_reason; + uint32_t detail_a; + uint32_t detail_b; + uint64_t timestamp; +} PlsrErrorDetail; +``` + +错误信息通过增强状态接口发布;兼容码和错误块号同时写入固定SD字段。相同错误重复发生可增加计数, +但不得覆盖更高优先级停止原因。 + +#### 5.2.4 验证要求 + +| 验证阶段 | 内容 | 合格条件 | +| --- | --- | --- | +| V1 | Q0~Q3固定频率与安全电平 | 引脚、极性、频率、占空比正确 | +| V2 | TIM9/TIM12单轴硬件计数及软件兜底计数 | 两种模式数量误差均为0,无窄脉冲和多余边沿 | +| V3 | 四轴100 kHz并发,两硬件计数+两软件计数 | 计数误差0,轴间无串扰,CPU和ISR数据可接受 | +| V4 | 两组AB及CW/CCW | 计数器分配、相序、周期、互斥和数量正确 | +| V5 | 0.1/1 ms曲线与调频 | 响应、曲线和段边界正确 | +| V6 | 多段、等待、跳转和事件 | 与S0语义一致 | +| V7 | STOP、PAUSE、限位和错误 | 优先级、尾脉冲和终态正确 | +| V8 | Modbus/USB压力及长稳 | 不影响脉冲和状态一致性 | +| V9 | Flash、Backup SRAM和复位 | CRC有效、不自动续跑、位置有效性正确 | + +测试记录应包含固件版本、参数快照、接线、测量设备、原始波形、实际边沿数、方向建立时间、AB相位、 +ISR平均/最坏周期、CPU占用和结论。 + +## 6 参考资料 + +1. [PLSR需求规格统计_V1.3.md](./PLSR需求规格统计_V1.3.md) +2. [PLSR地址映射.md](./PLSR地址映射.md) +3. [PLSR信捷对标追踪矩阵.md](./PLSR信捷对标追踪矩阵.md) +4. [实现PLSR指令.pdf](./实现PLSR指令.pdf) +5. [信捷XD/XL系列PLC定位控制手册](./信捷XD_XL系列PLC定位控制手册_PD02_20260510_V1.3.pdf) +6. [STM32F4xx参考手册 RM0090 Rev.22](./STM32F4xx参考手册_RM0090_Rev22.pdf) +7. 当前工程 `Core`、`Modbus`、`Middlewares`、`USB_DEVICE` 和 `EWARM` 目录 diff --git a/Document/PLSR_document/PLSR系统结构图.png b/Document/PLSR_document/PLSR系统结构图.png new file mode 100644 index 0000000..0cef0f5 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..3db957d --- /dev/null +++ b/Document/PLSR_document/PLSR系统结构图.svg @@ -0,0 +1,169 @@ + + + PLSR系统结构图 + 展示PLSR调用访问、参数提交、四轴运动控制、OS控制面、硬实时中断面、数据服务以及STM32F407板级输出之间的关系。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + PLSR 系统结构图 + XDM-60T4-E · STM32F407IG · uC/OS-II · 四轴独立运动控制 + + + + + + 调用与访问层 + + PLSR S0 S1 S2 D + + Modbus RTU + + 内部测试接口 + + + + + + + 命令与软元件适配层 + 启动上升沿 · 命令序号防重 · 影子参数提交 · 一致状态快照 · 固定软元件访问 + + + + + + + PLSR 运动控制层 + 四个独立 PlsrAxis 对象 · 无插补 + + + + 参数提交与快照 + S0 / S1 / S2 / D 校验 + 资源申请 · 不可变快照 + + + 轴状态机与命令 + START / STOP / PAUSE + BUSY · DONE · ERROR + + + 路径解释与段调度 + 1~100段 · Wait · ACT + EXT · 动态跳转 · 段事件 + + + 速度规划 + 直线 · S形 · 正弦 + 短距离 · 动态调频 + + + 位置与累计 + 64位位置 · 当量 · 限位 + 齿隙补偿 · 检查点 + + + + + + + + + + OS 控制面 · PlsrTask + 命令、段切换、等待、状态发布、保存请求 + + + 硬实时面 · TIM / EXTI ISR + 0.1/1 ms刷新、硬件/软件计数、尾脉冲、限位与EXT + + + + + + + + + 数据与服务层 + + + 固定软元件与动态数据 + HSD / SFD / SM / SD / I · S0 / S1 + + + 持久化 + Flash A/B槽 · Backup SRAM + + + 诊断与自测 + 错误映射 · 分频记录 · ISR性能 + + + + + + + + + + STM32F407 板级输出层 + TIM6控制 · TIM9/TIM12计数 · TIM10/13/11/14 PWM · GPIO · EXTI + 硬件PWM维持边沿,ISR只计数、提交周期参数和完成安全尾停 + + + + 物理输出 + Q0~Q3 / DIR + PULSE/DIR · AB · CW/CCW + + + + 伺服 + 驱动器 + + + + 控制与数据流 + + 硬实时与物理输出 + + 数据服务访问 + diff --git a/Document/PLSR_document/PLSR需求规格统计_V1.3.md b/Document/PLSR_document/PLSR需求规格统计_V1.3.md index e010382..c9ff4ae 100644 --- a/Document/PLSR_document/PLSR需求规格统计_V1.3.md +++ b/Document/PLSR_document/PLSR需求规格统计_V1.3.md @@ -1,15 +1,18 @@ # PLSR 需求规格书 -> 文档版本:V1.3 Rev.A(需求冲突统一冻结版) -> 更新日期:2026-08-05 -> 目标平台:XDM-60T4-E -> 软件平台:STM32F407 + uC/OS-II +> 文档版本:V1.3 Rev.B(正式需求规格基线)
+> 更新日期:2026-08-05
+> 目标平台:XDM-60T4-E
+> 软件平台:STM32F407 + uC/OS-II
+> 对标基线:信捷 XD/XL 系列 PLC 定位控制手册 PLSR(印刷页 5~87,重点为 49~56) ## 目录 - [1 概述](#1-概述) - [1.1 项目背景](#11-项目背景) - [1.2 定义](#12-定义) + - [1.3 需求解释规则](#13-需求解释规则) + - [1.4 对标边界与冻结差异](#14-对标边界与冻结差异) - [2 功能需求](#2-功能需求) - [2.1 系统与硬件功能](#21-系统与硬件功能) - [2.2 脉冲输出功能](#22-脉冲输出功能) @@ -100,6 +103,43 @@ V1.0 的目标范围如下: | 检查点 | 为掉电恢复而保存的一致性累计数据快照 | | 影子参数 | 上位机可编辑但尚未提交给运行模块的参数副本 | +### 1.3 需求解释规则 + +本文使用以下约束词: + +- **应、必须、不得**:V1.0 强制需求,未满足即判定不合格。 +- **可、允许**:在满足前置条件时允许实现的行为。 +- **建议**:不影响功能验收的实现建议。 +- **信捷兼容**:外部可观察语义、数据布局或固定软元件地址与信捷手册一致。 +- **项目增强**:信捷 PLSR 未规定,但本项目在不破坏兼容语义的前提下增加的能力。 + +需求发生冲突时,按以下优先级解释: + +1. 本规格中明确标记为“冻结”的项目决定; +2. 已确认的项目需求; +3. 信捷 PLSR 手册的外部可观察行为; +4. 实现设计和内部数据结构。 + +`Y0~Y3`表示信捷兼容的逻辑脉冲轴;本项目硬件图纸使用`Q0~Q3`标识对应物理输出点, +两者在本规格中按`Y0↔Q0`、`Y1↔Q1`、`Y2↔Q2`、`Y3↔Q3`对应。除非特别说明, +涉及固定软元件时使用`Y`轴语义,涉及板级引脚和资源时使用`Q`点语义。 + +### 1.4 对标边界与冻结差异 + +V1.0 以信捷 PLSR 为最低功能基线,并保留以下已确认差异或增强: + +| 项目 | 信捷手册语义 | 本项目冻结语义 | 分类 | +| --- | --- | --- | --- | +| 段脉冲数为0 | 手册印刷页56将“频率为0或脉冲数为0”并列描述为采用默认速度,脉冲数为0时的数量行为不明确 | 跳过当前段,不输出脉冲并进入下一段;最后一段则完成 | 冻结差异 | +| AB相计数 | 手册仅规定AB相输出方式,未定义本项目计数口径 | 一个完整四状态正交周期计1个指令脉冲 | 冻结增强 | +| 累计位置 | 固定HSD状态为32位 | 固定地址保持32位兼容,内部另以64位累计并做溢出检查 | 增强 | +| 输出模式 | 单向脉冲、AB相 | 增加CW/CCW双脉冲,不占用或改写信捷固定字段语义 | 增强 | +| 参数提交 | 运行前直接读取软元件 | 增加影子参数、原子提交和不可变运行快照 | 增强 | +| 命令与诊断 | 主要通过指令、STOP和固定状态软元件 | 增加命令防重、状态机、自测及详细诊断 | 增强 | + +信捷固定地址、S0/S1相对布局和可观察状态不得因增强功能改变。逐项对应关系见 +[PLSR信捷对标追踪矩阵](./PLSR信捷对标追踪矩阵.md)。 + ## 2 功能需求 ### 2.1 系统与硬件功能 @@ -160,7 +200,7 @@ Q2/PF7/TIM11_CH1、Q3/PF9/TIM14_CH1,仍应通过上板波形测试确认。 | FR-PUL-10 | 运行调频 | 修改目标频率后不改变剩余脉冲数量 | | FR-PUL-11 | 四轴运行 | 四轴可独立启动、停止、调频和查询状态 | | FR-PUL-12 | AB 相方向和计数 | 通过A、B相位先后控制方向;一个完整A/B正交周期计1个指令脉冲 | -| FR-PUL-13 | AB 相轴数 | 最多同时运行两轴;物理点对固定为 Q0(A)/Q1(B)、Q2(A)/Q3(B),逻辑轴可动态申请空闲点对 | +| FR-PUL-13 | AB 相轴数 | 最多同时运行两轴;D只允许选择Y0或Y2,分别占用Q0(A)/Q1(B)、Q2(A)/Q3(B)固定点对 | | FR-PUL-14 | 高速点资源 | PULSE/DIR轴数 + 2 × AB轴数 + 2 × CW/CCW轴数不得超过4,启动前必须检查资源冲突 | | FR-PUL-15 | AB 相频率 | 目标频率表示每秒完整AB周期数;每周期含4次相位跳变,但只计1个指令脉冲 | | FR-PUL-16 | 默认速度 | 段频率为0时使用当前S2套组的脉冲默认速度 | @@ -184,15 +224,18 @@ Q2/PF7/TIM11_CH1、Q3/PF9/TIM14_CH1,仍应通过上板波形测试确认。 高速输出资源按以下规则统一: - 物理高速资源固定为Q0~Q3,不改变其MCU引脚和定时器映射; -- 逻辑运动轴不永久绑定高速资源,START时申请、任务终止时释放; +- D在每次START时申请对应高速资源,任务终止时释放;运行期间轴状态归属D指定的Y轴; - PULSE/DIR占用1个高速资源;AB相和CW/CCW各占用2个高速资源; -- AB相及CW/CCW只能使用Q0/Q1或Q2/Q3有效点对; +- AB相及CW/CCW只能使用Q0/Q1或Q2/Q3有效点对,D分别取Y0或Y2; - 正常完成、STOP或ERROR退出后必须释放本任务占用的高速资源; - 运行期间输出模式、高速点绑定和定时器资源保持锁定。 CW/CCW模式下,正向只允许CW端输出脉冲,反向只允许CCW端输出脉冲;另一端和停止 状态均保持无效电平,任何时刻禁止CW、CCW同时输出。 +方向输出点、方向有效极性和方向延时只作用于PULSE/DIR模式。AB相和CW/CCW不使用独立DIR点; +发生方向反转时仍必须先减速到0,再按对应相序或通道重新启动。 + - **FR-PUL-20:** PLSR任务正常完成、STOP停止或ERROR退出后必须释放高速输出资源。 - **FR-PUL-21:** CW/CCW必须遵守上述互斥输出和停止安全电平规则。 - **FR-PUL-22:** 单段脉冲数量为0时跳过当前段,不输出脉冲并进入下一段;若为最后一段则完成任务。 @@ -201,6 +244,10 @@ AB模式的段脉冲数量按完整正交周期累计。每完成`00→相邻相 的一轮四相位状态转换,段剩余脉冲数减1;四次相位跳变不得分别扣减脉冲数量。正反方向 通过相位先后顺序区分。 +PULSE/DIR模式每个有效上升沿计1个指令脉冲;CW/CCW模式在当前方向通道每输出一个完整 +脉冲计1个指令脉冲。段脉冲数量的符号决定相对模式方向,绝对模式方向由目标坐标与当前位置 +之差决定。实现`-2,147,483,648`的绝对值时必须先扩展到64位,禁止32位取反溢出。 + 最小有效脉宽、输出极性及最高可靠频率还应满足 PLC 输出电路和伺服驱动器 的电气要求。100 kHz 是 V1.0 建议保证值,更高频率需通过硬件测试后开放。 @@ -268,22 +315,57 @@ AB模式的段脉冲数量按完整正交周期累计。每完成`00→相邻相 | S0 | 路径数据块 | 总段数、每段频率、脉冲数、等待及跳转 | | S1 | 用户执行参数 | 仅包含相对/绝对模式和起始执行段;异步调用属于指令接口而非S1字段 | | S2 | 运动参数套组 | K0~K4,包含默认频率、最高频率、起止频率、加减速、曲线、补偿、FOLLOW和刷新周期 | -| D | 输出配置 | 输出形式、PULSE/DIR 点或 AB 点对、输出极性和方向建立时间 | +| D | 输出轴 | 指定Y0~Y3脉冲轴;输出模式、方向点、极性和方向延时由该轴配置参数决定 | + +#### 2.4.1 指令接口 -逻辑调用关系为: +逻辑调用形式为: ```text -PLSR_Start(S0路径, S1执行参数, S2参数套组, D输出轴) +PLSR S0 S1 S2 D ``` -S0和S1由调用方在未占用数据区选择不重叠的连续首地址;数据块不永久绑定到轴,多个轴 -允许只读共享同一数据块。COMMIT成功时为目标轴创建不可变运行快照,随后修改原动态 -数据块不得影响已经启动或已经提交的轴任务。K0~K4固定配置和固定运行状态使用 -[PLSR地址映射](./PLSR地址映射.md)规定的信捷原地址;D只指定输出资源,不自拟固定参数地址。 - **FR-CMD-04:** PLSR指令必须支持`S0、S1、S2、D`四个操作数语义,分别表示路径数据、 用户执行参数、K0~K4系统运动参数组和输出资源配置。 +- 指令只在启动条件上升沿接受一次;启动条件随后断开不得终止已接受任务。 +- S0、S1允许使用项目支持的32位数据软元件首地址,且两个数据块不得重叠。 +- S2允许常数或受支持的32位数据软元件,其运行值必须为K0~K4。 +- D在兼容语义下指定Y0~Y3;项目实现映射到Q0~Q3高速资源。 +- PLSR调用为异步返回。完成方式和后续方式只描述多段速度衔接,不表示同步或异步调用。 + +#### 2.4.2 S0路径数据块 + +S0首地址由调用方动态指定。占用范围从`S0+0`开始,到最后一段 +`S0+N×10+8`双字结束;由于末字段为双字,实际最后一个16位字位于`S0+N×10+9`。 + +| 相对地址 | 数据类型 | 定义 | +| --- | --- | --- | +| S0+0 | INT32 | 总段数N,范围1~100 | +| S0+2~S0+9 | 8个WORD | 保留;写入时应为0,读取时不得解释为项目扩展字段 | +| S0+N×10+0 | INT32 | 第N段目标频率;非负,0表示使用当前S2默认速度 | +| S0+N×10+2 | INT32 | 第N段脉冲数量;相对模式为有符号位移,绝对模式为目标坐标 | +| S0+N×10+4 | WORD | 高8位为等待条件,低8位为等待参数来源类型 | +| S0+N×10+5 | INT32 | 等待常数或等待变量编号 | +| S0+N×10+7 | WORD | 低8位为跳转目标来源类型,高8位保留 | +| S0+N×10+8 | INT32 | 下一段常数或保存下一段号的变量编号 | + +表中的`N`在段字段公式中取1~总段数。所有双字均由连续两个16位字组成,低地址保存低16位、 +下一地址保存高16位;有符号值采用二进制补码。启动前必须验证完整数据块均位于允许的数据区内,且计算 +`S0+N×10+9`时不得发生地址溢出。 + +#### 2.4.3 S1用户参数块 + +| 相对地址 | 数据类型 | 定义 | +| --- | --- | --- | +| S1+0 | INT32 | 定位模式:0为相对模式,1为绝对模式;其它值非法 | +| S1+2 | INT32 | 起始执行段:0或1均从第1段开始,2~100从指定段开始 | + +起始段不得大于S0总段数。相对模式下,每段脉冲数量表示相对本段起点的位移;绝对模式下, +每段脉冲数量表示目标逻辑坐标,实际输出位移为该目标坐标减去进入本段时的逻辑位置。 + +#### 2.4.4 S2系统参数套组 + 每个输出轴必须提供第0~4套S2参数: - 第 0 套用于运行时或上位机动态调整。 @@ -300,11 +382,34 @@ S0和S1由调用方在未占用数据区选择不重叠的连续首地址;数 - FOLLOW前馈补偿百分比,范围0~100。 - 脉冲频率刷新周期,0.1 ms或1 ms。 +K0参数固定使用`HSD460~539`中对应轴的地址;K1~K4及公共参数固定使用 +`SFD900~1419`中对应轴的地址。各地址不得重排或复用,具体范围见 +[PLSR地址映射](./PLSR地址映射.md)。 + S2 的控制刷新周期只允许配置为 `1 ms` 或 `0.1 ms`。系统OS Tick保持1 ms; 0.1 ms运动控制刷新应由独立硬件定时器触发,不得通过提高全局OS Tick实现。 -运行中修改目标频率后, 系统应在当前 S2 -所配置的刷新周期内开始应用新目标;该指标表示调频响应时间, -不表示脉冲输出周期。 +运行中修改当前段目标频率后,系统应在当前S2所配置的刷新周期内开始应用新目标;该指标表示 +调频响应时间,不表示脉冲输出周期。 + +#### 2.4.5 D输出资源 + +D的信捷兼容含义是脉冲输出端口。本项目中: + +- D选择逻辑轴Y0~Y3,并对应物理高速点Q0~Q3。 +- PULSE/DIR占用D所选的一个高速点,方向点来自该轴公共参数。 +- AB相和CW/CCW只允许D选择Y0或Y2,并分别占用Q0/Q1或Q2/Q3固定点对。 +- CW/CCW属于项目增强,模式选择保存在项目输出配置中,不改变信捷SFD900等固定字段含义。 +- D只指定输出资源,不自拟固定配置地址。 + +#### 2.4.6 参数快照与共享规则 + +S0和S1由调用方在未占用数据区选择不重叠的连续首地址。数据块不永久绑定到轴,多个空闲轴 +可以只读共享同一数据块。COMMIT成功时应为目标轴创建不可变运行快照,随后修改原数据块不得 +改变已提交任务,但下列兼容行为除外: + +- 当前正在执行段的目标频率允许更新,并按当前S2刷新周期生效; +- 共享S0被一个运行轴用于调频时,其他轴不得同时把该S0作为可写运行参数源; +- 其余段字段、S1、S2、D和输出资源修改仅在下一次成功提交并启动时生效。 ### 2.5 单段与多段路径 @@ -321,15 +426,40 @@ S2 的控制刷新周期只允许配置为 `1 ms` 或 `0.1 ms`。系统OS Tick S0应提供与信捷每段数据一致的相对布局和动态引用能力;S0首地址由调用方动态指定: - 等待条件和等待参数均可表达常数或受支持的数据/位变量引用。 -- 跳转目标可为常数或运行时数据变量引用,范围0~100。 -- Wait时间范围1~2,147,483,647 ms,配置0时按1 - ms处理;计时从本段脉冲完成后开始。 +- 跳转目标可为常数或运行时数据变量引用,最终值范围0~100。 +- Wait时间范围1~2,147,483,647 ms,配置0时按1 ms处理;计时从本段脉冲完成后开始。 - Wait信号在本段完成后判断;若信号已有效则立即跳段,否则保持WAIT直至有效。 - ACT从本段开始输出时计时;时间到时放弃本段剩余脉冲并跳段;若脉冲先完成则等待ACT到时。 - EXT采用输入上升沿;运动中触发立即放弃剩余脉冲并跳段,脉冲先完成则等待后续EXT边沿。 - EXT或脉冲完成采用先到条件;EXT先到时放弃剩余脉冲,脉冲先完成时立即跳段。 - 外部中断输入应优先用于EXT,以避免普通IO映射周期造成响应延迟。 +等待条件编码必须与信捷S0布局一致: + +| 编码 | 条件 | 进入下一段的时机 | +| --- | --- | --- | +| H00 | 脉冲发送完成 | 本段规定脉冲发送完成后 | +| H01 | Wait时间 | 本段完成后开始计时,计时到达后 | +| H02 | Wait信号 | 本段完成且指定位信号有效后 | +| H03 | ACT时间 | 从本段开始计时,到时后;若脉冲先完成则等待到时 | +| H04 | EXT信号 | 指定X输入出现OFF→ON;若脉冲先完成则继续等待边沿 | +| H05 | EXT信号或脉冲完成 | 两者任一先到 | + +等待参数来源编码必须为:`H00=常数`、`H01=D`、`H02=HD`、`H03=FD`、`H04=X`、 +`H05=M`、`H06=HM`。Wait时间和ACT时间只允许常数、D、HD或FD,数值范围为 +0~2,147,483,647;H04和H05等待条件只允许使用X来源;Wait信号只允许使用X、M或HM。 +EXT使用外部中断输入时不得再由同一物理边沿重复触发普通外部中断业务。 + +跳转来源编码必须为:`H00=常数`、`H01=D`、`H02=HD`、`H03=FD`。解析出的跳转值: + +- 为0时顺序进入下一段;最后一段为0时任务正常完成; +- 为1~100时进入指定段,且不得超过S0总段数; +- 等于当前段时表示有意无限循环,但仍受STOP、限位、急停和错误控制; +- 来源类型、变量地址或最终值非法时,拒绝启动或进入ERROR,不得读取越界地址。 + +段参数的零值判断顺序固定为:先判断脉冲数量,再判断目标频率。脉冲数量为0时直接跳段, +不得因目标频率也为0而输出默认速度脉冲;脉冲数量非0且目标频率为0时才使用S2默认速度。 + 多段路径应满足: | 编号 | 需求 | 优先级 | @@ -349,30 +479,8 @@ S0应提供与信捷每段数据一致的相对布局和动态引用能力;S0 | FR-SEG-13 | 最后一段使用等待类条件时保持WAIT/运行状态,直到条件成立或STOP,不得静默结束 | 必须 | | FR-SEG-14 | 最大路径段数固定为100;超过限制时拒绝执行并返回SEGMENT_OVERFLOW | 必须 | -运行期间除当前目标频率外,其余路径参数修改不得影响当前任务。新参数应在 -下一次成功提交并启动时生效。 - -每段数据增加以下逻辑字段: - -| 字段 | 说明 | -| --- | --- | -| PulseCount | 有符号脉冲数量 | -| TargetFrequency | 目标频率 | -| WaitType | 等待类型 | -| WaitSourceType | 等待数据来源 | -| WaitAddress | 等待变量地址 | -| WaitParameter | 等待参数 | -| JumpType | 跳转来源 | -| JumpAddress | 跳转变量地址 | -| NextSegment | 下一段编号 | - -支持: - -- 常量等待; -- 输入等待; -- 数据变量等待; -- 动态跳转; -- 条件循环。 +运行期间除当前段目标频率外,其余路径参数修改不得影响当前任务。新参数应在下一次成功提交并 +启动时生效。项目内部可把S0编码解析为结构化字段,但不得改变S0对外相对布局。 ### 2.6 加减速与段内变频 @@ -385,8 +493,9 @@ S0应提供与信捷每段数据一致的相对布局和动态引用能力;S0 加减速应满足以下规则: -1. 起始频率、目标频率和结束频率不得超过最高频率。 -2. 目标频率超限时应拒绝启动,不得静默截断。 +1. S2最高速度必须处于硬件保证频率范围内;配置值为0或超过硬件允许范围时应拒绝启动。 +2. 起始频率、目标频率或结束频率高于当前S2最高速度时,应按信捷语义限幅到最高速度运行, + 同时发布`SPEED_CLAMPED`诊断告警;不得把限幅伪装成未经记录的正常输出。 3. 加减速距离不足时,应自动生成三角或短距离曲线。 4. 无法在指定脉冲数量内满足起止频率和曲线约束时,应报告参数冲突。 5. 加减速过程中必须保证最终脉冲数量准确。 @@ -460,7 +569,7 @@ PLSR启动采用上升沿触发方式。 | 参数 | 运行中修改 | | --- | --- | -| 目标频率 | 允许,立即生效 | +| 当前段目标频率 | 允许,在当前S2配置的0.1 ms或1 ms刷新周期内开始生效 | | STOP命令 | 允许 | | PAUSE命令 | 允许 | | 方向 | 禁止 | @@ -565,6 +674,45 @@ ERROR 错误 **FR-STA-01:** DONE只表示正常完成,并按上述方案A产生、保持和清零。 +#### 2.9.2 信捷兼容固定状态 + +四轴固定状态和段事件入口必须保持以下对应关系: + +| 逻辑轴 | 累计状态 | 运行/方向标志 | 实时状态 | 段事件入口 | +| --- | --- | --- | --- | --- | +| Y0/Q0 | HSD0~3 | SM1000、SM1001 | SD1000~1011 | I6000~6099 | +| Y1/Q1 | HSD4~7 | SM1020、SM1021 | SD1020~1031 | I6100~6199 | +| Y2/Q2 | HSD8~11 | SM1040、SM1041 | SD1040~1051 | I6200~6299 | +| Y3/Q3 | HSD12~15 | SM1060、SM1061 | SD1060~1071 | I6300~6399 | + +HSD每轴四个字的相对布局固定为:`+0/+1`累计指令脉冲量,`+2/+3`累计当量,均为有符号 +32位值。项目内部64位累计发布到HSD前必须做范围检查;超出INT32范围时锁存累计溢出错误, +不得回绕或静默截断。 + +SM运行和方向标志语义固定为: + +- 运行标志在脉冲任务处于运动或兼容WAIT期间为ON,任务结束后为OFF;项目增强的PAUSED等 + 详细状态通过独立状态接口提供,不改变固定SM地址。 +- 方向标志在正向输出时为ON,反向输出时为OFF;方向输出极性反转不得改变该逻辑方向语义。 +- 绝对目标等于当前位置时不输出脉冲,运行标志可以不产生ON或下降沿;DONE仍应正确置位。 + +每轴SD实时状态以对应轴起始地址`B`表示,其相对布局固定为: + +| 相对地址 | 定义 | +| --- | --- | +| B+0、B+1 | 当前段号,32位 | +| B+2、B+3 | 当前段已输出指令脉冲量,32位 | +| B+4、B+5 | 当前段已输出当量,32位 | +| B+6、B+7 | 当前输出频率,指令脉冲单位,32位 | +| B+8、B+9 | 当前输出速度,当量单位,32位 | +| B+10 | 信捷兼容脉冲错误码 | +| B+11 | 错误脉冲数据块号 | + +I6000~I6399按轴和段映射:第N段事件入口为该轴事件基址加`N-1`。每个实际执行段在结束或 +被条件切换时产生一次事件。 +事件处理应至少提供轴号、段号和结束原因;正常脉冲完成必须与信捷每段中断的可观察时机一致, +跳转顺序不得改变事件入口与原段号的对应关系。 + ### 2.10 Modbus 通信 现有 USART1 Modbus RTU 从站作为配置和监控通道。 @@ -634,13 +782,15 @@ S0/S1动态数据池使用。 - 软限位启用、正极限值和负极限值。 - 脉冲单位:脉冲、1 μm、0.01 mm、0.1 mm、1 mm。 - 每转指令脉冲数和每转移动量。 -- 输出类型:PULSE/DIR或AB相。 +- 信捷兼容输出类型:PULSE/DIR或AB相;CW/CCW通过项目增强配置选择,不改变该固定字段编码。 - 多段脉冲发送方式:完成方式或后续方式。 - 方向输出点和方向延时时间;默认10 ms,单位ms,可配置。 - 正向和反向齿隙补偿量。 -- 电气原点位置。 - 正负限位输入点及常开/常闭逻辑。 +信捷固定地址中的电气原点、机械回零、Z相、CLR及闭环脉冲字段应保留原地址,不得挪作项目 +扩展用途;其中不属于V1.0 PLSR范围的功能无需实现。未使用的保留位必须按0写入并在读取时忽略。 + 工程单位必须在内核换算层支持,不再限定为上位机换算。换算应保存小数余数, 避免多段或重复运动的累计舍入漂移。 @@ -648,7 +798,8 @@ S0/S1动态数据池使用。 启动,但允许反向离开。软限位和硬限位可同时启用。 发生运动方向反转时,应按配置加入对应方向的齿隙补偿脉冲,并使用补偿加减速时间; -补偿脉冲、指令位置和累计脉冲的统计口径必须在设计书中分别定义。 +补偿段与正式运动段应分开执行。齿隙补偿脉冲不得计入本段指令脉冲、逻辑位置或信捷兼容HSD +累计值,但应计入项目增强的物理输出诊断计数,以便核对实际输出边沿。 ### 2.12 自测与诊断 @@ -696,8 +847,7 @@ S0/S1动态数据池使用。 - 清除错误不得自动重新启动未完成运动。 - 配置限位输入后,限位有效时应禁止向该方向启动,但允许反向离开限位。 - 运动中限位触发默认执行减速停止。 -- V1.0 - 急停没有外部硬件切断回路;急停输入由软件立即禁止脉冲输出并锁存状态。 +- V1.0急停没有外部硬件切断回路;急停输入由软件立即禁止脉冲输出并锁存状态。 - 软件急停不具备独立硬件安全回路的故障容错能力,不得宣称为安全认证急停。 至少应定义以下错误: @@ -705,11 +855,11 @@ S0/S1动态数据池使用。 ```text 参数未初始化 输出点非法或冲突 -频率为零或超限 +默认速度为零或硬件频率超限 脉冲数或段数非法 段参数冲突 跳转段号非法 -路径循环超限 +非预期闭环路径或运行保护超限 绝对位置未建立 模块忙 非法状态命令 @@ -742,7 +892,21 @@ Flash数据无效或保存失败 ### 2.13.1 错误码补充 -新增: +固定实时状态中的信捷兼容错误码应至少实现下列与PLSR有关的取值: + +| 兼容码 | 说明 | 适用处理 | +| ---: | --- | --- | +| 1 | 脉冲数据段配置错误 | 拒绝启动,错误数据块号写入对应SD的`B+11` | +| 2 | 当量模式下每转脉冲数或每转移动量为0 | 拒绝启动 | +| 3 | S2系统参数块号错误 | 拒绝启动 | +| 4 | 脉冲参数块号或范围超过限制 | 拒绝启动 | +| 5 | 正限位触发后停止 | 按减速停止并禁止继续正向启动 | +| 6 | 负限位触发后停止 | 按减速停止并禁止继续反向启动 | +| 15 | FOLLOW性能参数不在1~100 | 拒绝启动 | +| 16 | FOLLOW前馈补偿不在0~100 | 拒绝启动 | +| 26 | 控制块或高速输出资源分配失败 | 拒绝启动或进入ERROR | + +项目增强诊断使用符号错误码,不得占用或改变上述固定兼容码: | 错误码 | 说明 | | --- | --- | @@ -752,6 +916,9 @@ Flash数据无效或保存失败 | RESOURCE_CONFLICT | 输出资源冲突 | | PARAMETER_LOCKED | 运行参数禁止修改 | | DONE_STATE_ERROR | 完成状态异常 | +| SPEED_CLAMPED | 目标速度被S2最高速度限幅;属于告警,不单独终止任务 | +| POSITION_INVALID | 绝对定位前逻辑位置无效 | +| COUNTER_OVERFLOW | 内部或兼容累计计数溢出 | ## 3 性能需求 @@ -822,12 +989,15 @@ Flash数据无效或保存失败 | AT-12 | 重复命令 | 相同命令序号不产生重复运动 | | AT-13 | 掉电恢复 | 不自动运动,位置有效性符合恢复等级 | | AT-14 | 上电安全 | 上电和复位期间无意外脉冲 | +| AT-15 | S0/S1布局 | 使用动态首地址验证完整相对布局、保留区、六种等待条件和四种跳转来源 | +| AT-16 | 最高速度限幅 | 目标速度高于S2最高速度时按最高速度运行并产生SPEED_CLAMPED告警 | | AT-17 | 四轴独立运行 | 四轴同时以100 kHz运行时无丢脉冲、重复脉冲和异常周期,且状态和累计数据互不串扰 | | AT-18 | AB 相输出 | 两个AB轴可独立运行;一个完整正交周期计1个指令脉冲,周期频率、相位方向和数量正确 | | AT-19 | S0等待与跳转 | 六种等待条件、动态参数来源、提前/延后触发和0/指定/自身跳转语义与信捷一致 | | AT-20 | 公共参数 | 单位换算、软限位、方向延时、齿隙补偿和FOLLOW参数均通过测试 | | AT-21 | 零值及边界 | INT32最小值、频率0、脉冲数0跳段和绝对零位移行为符合本规格 | | AT-22 | 段事件和监控 | 每段事件、运行标志、当前段计数和累计计数可被稳定读取 | +| AT-23 | 固定软元件 | HSD、SM、SD和I6000~I6399的地址、位宽、轴映射及可观察语义与信捷一致 | 新增测试: diff --git a/Document/PLSR_document/STM32F4xx参考手册_RM0090_Rev22.pdf b/Document/PLSR_document/STM32F4xx参考手册_RM0090_Rev22.pdf new file mode 100644 index 0000000..fb27dbb Binary files /dev/null and b/Document/PLSR_document/STM32F4xx参考手册_RM0090_Rev22.pdf differ diff --git a/Document/PLSR_document/~$设计方案书2.docx b/Document/PLSR_document/~$设计方案书2.docx new file mode 100644 index 0000000..6ca2045 Binary files /dev/null and b/Document/PLSR_document/~$设计方案书2.docx differ diff --git a/Document/PLSR_document/~$需求规格书.docx b/Document/PLSR_document/~$需求规格书.docx deleted file mode 100644 index 9925073..0000000 Binary files a/Document/PLSR_document/~$需求规格书.docx and /dev/null differ diff --git a/Document/PLSR_document/框图/系统框图.vsdx b/Document/PLSR_document/框图/系统框图.vsdx new file mode 100644 index 0000000..8a23116 Binary files /dev/null and b/Document/PLSR_document/框图/系统框图.vsdx differ diff --git a/Document/PLSR_document/设计方案书.doc b/Document/PLSR_document/设计方案书.doc deleted file mode 100644 index ff4b774..0000000 Binary files a/Document/PLSR_document/设计方案书.doc and /dev/null differ diff --git a/Document/PLSR_document/设计方案书.docx b/Document/PLSR_document/设计方案书.docx new file mode 100644 index 0000000..3bc0f34 Binary files /dev/null and b/Document/PLSR_document/设计方案书.docx differ diff --git a/Document/PLSR_document/设计方案书2.docx b/Document/PLSR_document/设计方案书2.docx new file mode 100644 index 0000000..a206f15 Binary files /dev/null and b/Document/PLSR_document/设计方案书2.docx differ