1. 系统整体架构流程图
跳转到“1. 系统整体架构流程图”graph TB subgraph "STM32F103RET6 主控制器" subgraph "FreeRTOS任务层" T1[defaultTask<br/>空闲任务<br/>优先级:Normal] T2[modbusTask<br/>Modbus通信<br/>优先级:Normal] T3[servoTask<br/>伺服控制<br/>优先级:High] T4[systemTask<br/>系统监控<br/>优先级:Low] end
subgraph "业务逻辑层" SC[伺服控制器<br/>tigerservo.c] BC[按钮控制器<br/>button_control.c] VC[气阀控制器<br/>valveControl.c] MC[Modbus适配器<br/>modbus_slave_adapter.c] end
subgraph "通信协议层" MBM[Modbus主站<br/>mb_master.c] MBS[Modbus从站<br/>mb_slave.c] REG[寄存器管理<br/>mb_reg.c] end
subgraph "硬件抽象层" GPIO[GPIO控制] UART[UART通信] TIM[定时器] IWDG[看门狗] end end
subgraph "外部设备" PC[上位机<br/>Modbus主站] SERVO1[伺服驱动器1<br/>站号1] SERVO2[伺服驱动器2<br/>站号2] BTN[按钮面板<br/>急停/复位/启动] VALVE[气动阀门<br/>工件夹紧] end
%% 任务间通信 T2 -.-> T3 T3 -.-> T4 T4 -.-> T2
%% 业务逻辑调用 T2 --> MC T3 --> SC T4 --> BC T4 --> VC
%% 模块间依赖 SC --> MBM MC --> MBS BC --> VC VC --> SC
%% 协议层通信 MBM --> REG MBS --> REG
%% 硬件层接口 MBM --> UART MBS --> UART BC --> GPIO VC --> GPIO SC --> TIM
%% 外部通信 PC -.->|Modbus RTU| MBS MBM -.->|Modbus RTU| SERVO1 MBM -.->|Modbus RTU| SERVO2 BTN --> GPIO GPIO --> VALVE
classDef taskNode fill:#e1f5fe classDef logicNode fill:#f3e5f5 classDef commNode fill:#e8f5e8 classDef halNode fill:#fff3e0 classDef extNode fill:#ffebee
class T1,T2,T3,T4 taskNode class SC,BC,VC,MC logicNode class MBM,MBS,REG commNode class GPIO,UART,TIM,IWDG halNode class PC,SERVO1,SERVO2,BTN,VALVE extNode2. 伺服控制状态机流程图
跳转到“2. 伺服控制状态机流程图”stateDiagram-v2 [*] --> INIT: 系统启动
INIT --> READ_INOUT_DATA: 初始化完成 note right of INIT: 配置Modbus\n写入初始参数
READ_INOUT_DATA --> CHECK_INOUT_DIFF: 读取完成(21个参数) READ_INOUT_DATA --> READ_INOUT_DATA: 读取中/重试 note right of READ_INOUT_DATA: 使用表驱动\n地址映射
CHECK_INOUT_DIFF --> WRITE_INOUT_DIFF: 发现差异 CHECK_INOUT_DIFF --> CHECK_CTRL_DIFF: 无差异 note right of CHECK_INOUT_DIFF: 比较读写缓存\n50ms延时机制
WRITE_INOUT_DIFF --> READ_OUTPUT_DATA: 写入完成 WRITE_INOUT_DIFF --> INIT: 重试失败 note right of WRITE_INOUT_DIFF: 智能站号选择\n参数同步更新
CHECK_CTRL_DIFF --> WRITE_CTRL_DIFF: 发现控制差异 CHECK_CTRL_DIFF --> READ_OUTPUT_DATA: 无差异 note right of CHECK_CTRL_DIFF: 检查控制位\n启动/停止/急停等
WRITE_CTRL_DIFF --> CHECK_CTRL_DIFF: 写入完成 WRITE_CTRL_DIFF --> INIT: 重试失败 note right of WRITE_CTRL_DIFF: 32位控制命令\n自动清除标志位
READ_OUTPUT_DATA --> READ_INOUT_DATA: 读取完成 READ_OUTPUT_DATA --> CHECK_CTRL_DIFF: 检测到差异 READ_OUTPUT_DATA --> READ_OUTPUT_DATA: 读取中 note right of READ_OUTPUT_DATA: 11个输出参数\n状态位解析
%% 错误处理 READ_INOUT_DATA --> INIT: 通信错误 WRITE_INOUT_DIFF --> INIT: 通信错误 CHECK_CTRL_DIFF --> INIT: 通信错误 WRITE_CTRL_DIFF --> INIT: 通信错误 READ_OUTPUT_DATA --> INIT: 通信错误3. 按钮控制流程图
跳转到“3. 按钮控制流程图”flowchart TD START([系统启动]) --> INIT[按钮控制初始化] INIT --> SCAN[按钮扫描<br/>5ms间隔]
SCAN --> DEBOUNCE{消抖处理<br/>10ms} DEBOUNCE -->|稳定| EVENT[事件检测] DEBOUNCE -->|抖动| SCAN
EVENT --> ESTOP{急停按钮?} EVENT --> RESET{复位按钮?} EVENT --> START_BTN{启动按钮?} EVENT --> SCAN
%% 急停处理流程 ESTOP -->|按下| ESTOP_PROC[急停处理] ESTOP_PROC --> SERVO_ESTOP[伺服紧急停止] SERVO_ESTOP --> WAIT_STOP[等待2秒] WAIT_STOP --> VALVE_OPEN[开启气阀释放工件] VALVE_OPEN --> WAIT_VALVE[等待2秒] WAIT_VALVE --> SET_ESTOP[设置急停状态] SET_ESTOP --> SCAN
ESTOP -->|释放| CLEAR_ESTOP[清除急停状态] CLEAR_ESTOP --> SCAN
%% 复位处理流程 RESET -->|按下| RESET_CHECK{系统状态检查} RESET_CHECK -->|就绪| HOME_RETURN[伺服回原点] RESET_CHECK -->|未就绪| SCAN HOME_RETURN --> SCAN
%% 启动处理流程 START_BTN -->|按下| START_CHECK{启动条件检查} START_CHECK --> SYS_READY{系统就绪?} SYS_READY -->|否| SCAN SYS_READY -->|是| MACHINE_RUN{机器运行中?} MACHINE_RUN -->|是| SCAN MACHINE_RUN -->|否| ESTOP_CHECK{急停激活?} ESTOP_CHECK -->|是| SCAN ESTOP_CHECK -->|否| VALVE_CHECK{气阀状态检查}
VALVE_CHECK --> VALVE_OPEN_STATE{气阀开启?} VALVE_OPEN_STATE -->|是| CLOSE_VALVE[关闭气阀夹紧] VALVE_OPEN_STATE -->|否| START_SERVO[启动伺服] CLOSE_VALVE --> WAIT_CLOSE[等待2秒] WAIT_CLOSE --> START_SERVO
START_SERVO --> SERVO_OK{启动成功?} SERVO_OK -->|是| SET_RUNNING[设置运行状态] SERVO_OK -->|否| OPEN_VALVE[开启气阀释放] SET_RUNNING --> SCAN OPEN_VALVE --> SCAN
classDef processNode fill:#e3f2fd classDef decisionNode fill:#fff3e0 classDef actionNode fill:#e8f5e8 classDef errorNode fill:#ffebee
class SCAN,DEBOUNCE,EVENT processNode class ESTOP,RESET,START_BTN,RESET_CHECK,START_CHECK,SYS_READY,MACHINE_RUN,ESTOP_CHECK,VALVE_CHECK,VALVE_OPEN_STATE,SERVO_OK decisionNode class SERVO_ESTOP,VALVE_OPEN,HOME_RETURN,CLOSE_VALVE,START_SERVO,SET_RUNNING actionNode class OPEN_VALVE errorNode4. Modbus通信时序图
跳转到“4. Modbus通信时序图”sequenceDiagram participant PC as 上位机 participant MCU as STM32 MCU participant S1 as 伺服驱动器1 participant S2 as 伺服驱动器2
Note over MCU: 系统启动 - 初始化阶段 MCU->>S1: 写入P3_001(波特率) S1-->>MCU: ACK MCU->>S1: 写入P3_002(协议类型) S1-->>MCU: ACK MCU->>S1: 批量写入P6组参数(21个) S1-->>MCU: ACK
Note over MCU: 正常运行 - 状态机循环 loop 每100ms周期 %% 读取输入输出数据 MCU->>S1: 03H读取P6参数[0-20] S1-->>MCU: 参数值
%% 检查数据差异 alt 发现参数差异 MCU->>S1: 10H写入差异参数 S1-->>MCU: ACK end
%% 处理控制命令 alt 有控制命令 MCU->>S2: 10H写入控制寄存器 S2-->>MCU: ACK end
%% 读取输出数据 MCU->>S1: 03H读取转子速度 S1-->>MCU: 速度值 MCU->>S2: 03H读取回授位置 S2-->>MCU: 位置值 MCU->>S2: 03H读取状态字 S2-->>MCU: 状态值 end
Note over PC,MCU: 上位机通信 loop 按需通信 PC->>MCU: 03H读取状态数据 MCU-->>PC: 状态值 PC->>MCU: 10H写入控制参数 MCU-->>PC: ACK
Note over MCU: 地址透传处理 alt P6组地址(站1) MCU->>S1: 转发到站1 S1-->>MCU: 响应 else 站2数据地址 MCU->>S2: 转发到站2 S2-->>MCU: 响应 end MCU-->>PC: 最终响应 end
Note over MCU: 错误处理机制 alt 通信超时 MCU->>MCU: 重试计数+1 alt 重试次数<3 MCU->>S1: 重新发送 else 重试失败 MCU->>MCU: 重置状态机 end end5. 系统安全互锁流程图
跳转到“5. 系统安全互锁流程图”flowchart TD START([安全检查开始]) --> EMERGENCY{急停状态?}
EMERGENCY -->|激活| ALLOW_VALVE[仅允许开阀<br/>释放工件] EMERGENCY -->|未激活| SERVO_CHECK{伺服运行状态?}
SERVO_CHECK -->|运行中<br/>bo_zeroSpeed=false| DENY[禁止所有操作] SERVO_CHECK -->|停止<br/>bo_zeroSpeed=true| MACHINE_CHECK{机器运行标志?}
MACHINE_CHECK -->|运行中| DENY MACHINE_CHECK -->|停止| ALARM_CHECK{伺服报警?}
ALARM_CHECK -->|有报警| DENY ALARM_CHECK -->|无报警| ALLOW[允许操作]
%% 具体操作判断 ALLOW --> VALVE_OP{气阀操作?} ALLOW --> SERVO_OP{伺服操作?} ALLOW --> BUTTON_OP{按钮操作?}
VALVE_OP --> VALVE_SAFE[安全气阀控制] SERVO_OP --> SERVO_SAFE[安全伺服控制] BUTTON_OP --> BUTTON_SAFE[安全按钮响应]
%% 互锁逻辑 VALVE_SAFE --> INTERLOCK{伺服-气阀互锁} INTERLOCK -->|伺服运行中| VALVE_LOCK[气阀锁定] INTERLOCK -->|伺服停止| VALVE_FREE[气阀自由]
SERVO_SAFE --> SERVO_INTERLOCK{气阀-伺服互锁} SERVO_INTERLOCK -->|工件未夹紧| SERVO_LOCK[伺服锁定] SERVO_INTERLOCK -->|工件夹紧| SERVO_FREE[伺服自由]
%% 结果 ALLOW_VALVE --> SAFE_OP[安全操作执行] VALVE_FREE --> SAFE_OP SERVO_FREE --> SAFE_OP BUTTON_SAFE --> SAFE_OP
DENY --> REJECT[操作被拒绝] VALVE_LOCK --> REJECT SERVO_LOCK --> REJECT
SAFE_OP --> END([安全检查结束]) REJECT --> END
classDef safeNode fill:#e8f5e8 classDef dangerNode fill:#ffebee classDef checkNode fill:#fff3e0 classDef processNode fill:#e3f2fd
class ALLOW_VALVE,VALVE_FREE,SERVO_FREE,SAFE_OP safeNode class DENY,VALVE_LOCK,SERVO_LOCK,REJECT dangerNode class EMERGENCY,SERVO_CHECK,MACHINE_CHECK,ALARM_CHECK,VALVE_OP,SERVO_OP,BUTTON_OP,INTERLOCK,SERVO_INTERLOCK checkNode class VALVE_SAFE,SERVO_SAFE,BUTTON_SAFE processNode6. 系统启动时序图
跳转到“6. 系统启动时序图”gantt title 系统启动时序图 dateFormat X axisFormat %Lms
section 硬件初始化 HAL_Init :hal_init, 0, 100 GPIO配置 :gpio_cfg, after hal_init, 50 UART配置 :uart_cfg, after gpio_cfg, 50 定时器配置 :tim_cfg, after uart_cfg, 50 看门狗配置 :iwdg_cfg, after tim_cfg, 50
section FreeRTOS启动 内核初始化 :os_init, after iwdg_cfg, 100 任务创建 :task_create, after os_init, 200 互斥锁创建 :mutex_create, after task_create, 100 调度器启动 :scheduler, after mutex_create, 100
section 业务模块初始化 按钮控制初始化 :btn_init, after scheduler, 100 LED调试初始化 :led_init, after btn_init, 50 Modbus寄存器初始化 :mb_reg_init, after led_init, 100 从站适配器初始化 :mb_slave_init, after mb_reg_init, 200
section 伺服系统初始化 等待伺服启动 :servo_wait, after mb_slave_init, 3000 Modbus使能 :mb_enable, after servo_wait, 500 通信参数配置 :comm_cfg, after mb_enable, 1000 初始参数写入 :param_write, after comm_cfg, 2000
section 正常运行 状态机循环 :state_machine, after param_write, 1000 任务调度 :task_schedule, after state_machine, 10007. 错误处理和恢复流程图
跳转到“7. 错误处理和恢复流程图”flowchart TD ERROR([系统错误检测]) --> TYPE{错误类型判断}
TYPE -->|通信超时| COMM_ERR[通信错误处理] TYPE -->|参数异常| PARAM_ERR[参数错误处理] TYPE -->|硬件故障| HW_ERR[硬件错误处理] TYPE -->|系统异常| SYS_ERR[系统错误处理]
COMM_ERR --> RETRY_CHECK{重试次数检查} RETRY_CHECK -->|小于3次| RETRY[重新尝试通信] RETRY_CHECK -->|大于等于3次| RESET_COMM[重置通信状态机] RETRY --> COMM_OK{通信恢复?} COMM_OK -->|是| NORMAL[恢复正常运行] COMM_OK -->|否| RETRY_CHECK RESET_COMM --> REINIT[重新初始化]
PARAM_ERR --> VALIDATE[参数验证] VALIDATE --> RANGE_CHECK{范围检查} RANGE_CHECK -->|有效| UPDATE[更新参数] RANGE_CHECK -->|无效| REJECT_PARAM[拒绝参数] UPDATE --> NORMAL REJECT_PARAM --> ERROR_RESP[错误响应]
HW_ERR --> HW_CHECK[硬件状态检查] HW_CHECK --> CRITICAL{关键硬件?} CRITICAL -->|是| SAFE_STOP[安全停机] CRITICAL -->|否| ISOLATE[隔离故障模块] SAFE_STOP --> ESTOP_STATE[进入急停状态] ISOLATE --> DEGRADE[降级运行]
SYS_ERR --> SYS_CHECK[系统健康检查] SYS_CHECK --> MUTEX_CHECK{互斥锁状态} MUTEX_CHECK -->|正常| TASK_CHECK[任务状态检查] MUTEX_CHECK -->|异常| MUTEX_RESET[重置互斥锁] TASK_CHECK --> STACK_CHECK{栈溢出检查} STACK_CHECK -->|正常| WATCHDOG[看门狗检查] STACK_CHECK -->|溢出| STACK_ERR[栈错误处理]
REINIT --> INIT_OK{初始化成功?} INIT_OK -->|是| NORMAL INIT_OK -->|否| SAFE_MODE[安全模式]
DEGRADE --> MONITOR[故障监控] MONITOR --> AUTO_RECOVER{自动恢复?} AUTO_RECOVER -->|是| NORMAL AUTO_RECOVER -->|否| MANUAL[人工干预]
NORMAL --> END([错误处理完成]) ERROR_RESP --> END ESTOP_STATE --> END SAFE_MODE --> END MANUAL --> END总结
跳转到“总结”以上流程图和时序图详细展示了系统的各个关键流程:
- 整体架构图: 展示了系统的分层结构和模块间关系
- 状态机流程: 详细描述了伺服控制的核心逻辑
- 按钮控制流程: 展示了安全相关的用户交互逻辑
- 通信时序: 说明了Modbus双重角色的通信机制
- 安全互锁: 展示了多重安全保护机制
- 启动时序: 描述了系统的初始化过程
- 错误处理: 展示了系统的容错和恢复能力
来源:CSDN 原文,首次发布于 2025-09-11。