跳转到内容
新建笔记

项目1:单片机程序审查,控制系统流程图和时序图

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 extNode

2. 伺服控制状态机流程图

跳转到“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: 通信错误
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 errorNode
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
end

5. 系统安全互锁流程图

跳转到“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 processNode
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, 1000

7. 错误处理和恢复流程图

跳转到“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

以上流程图和时序图详细展示了系统的各个关键流程:

  1. 整体架构图: 展示了系统的分层结构和模块间关系
  2. 状态机流程: 详细描述了伺服控制的核心逻辑
  3. 按钮控制流程: 展示了安全相关的用户交互逻辑
  4. 通信时序: 说明了Modbus双重角色的通信机制
  5. 安全互锁: 展示了多重安全保护机制
  6. 启动时序: 描述了系统的初始化过程
  7. 错误处理: 展示了系统的容错和恢复能力

来源:CSDN 原文,首次发布于 2025-09-11。