跳转到内容
新建笔记

老虎机控制系统程序总结

本项目是一个基于STM32F103RE微控制器的工业老虎机(转盘)控制系统,用于替代原有的PLC控制方案。系统采用FreeRTOS实时操作系统,通过Modbus通信协议控制A3伺服驱动器,实现转盘的精确定位控制。

┌─────────────────────────────────────────────────────────────────┐
│ STM32F103RE主控板 │
├─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┤
│ USART1 │ USART2 │ USART3 │ I2C1 │ SPI1 │ GPIO │ Timer │
│ (调试) │(从站MB) │(主站MB) │(EEPROM) │(扩展) │(控制IO) │(定时器) │
└─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
│ │ │ │ │ │ │
│ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼
调试 上位机 A3伺服 AT24C02C 扩展接口 按钮/LED PWM/捕获
终端 通信 驱动器 EEPROM 气动阀 光电传感器
(站1/站2) 控制面板
┌─────────────────────────────────────────────────────────────────┐
│ 应用层 (Application Layer) │
├─────────────────┬─────────────────┬─────────────────┬─────────────┤
│ 按钮控制模块 │ 伺服控制模块 │ 阀门控制模块 │ 参数管理模块 │
│ button_control │ tigerservo │ valveControl │SavedParameters│
├─────────────────┴─────────────────┴─────────────────┴─────────────┤
│ Modbus通信层 (Communication Layer) │
├─────────────────┬─────────────────┬─────────────────┬─────────────┤
│ 主站通信模块 │ 从站通信模块 │ 寄存器映射 │ 地址适配层 │
│ mb_master │ mb_slave │ mb_reg │slave_adapter │
├─────────────────┴─────────────────┴─────────────────┴─────────────┤
│ 系统服务层 (System Services) │
├─────────────────┬─────────────────┬─────────────────┬─────────────┤
│ FreeRTOS │ 看门狗管理 │ LED调试 │ 定时器管理 │
│ Task/Mutex │ watchdog_mgr │ debug_led │ bsp_tim │
├─────────────────┴─────────────────┴─────────────────┴─────────────┤
│ 硬件抽象层 (Hardware Abstraction) │
├─────────────────┬─────────────────┬─────────────────┬─────────────┤
│ GPIO │ UART │ I2C │ Timer │
│ HAL_GPIO │ HAL_UART │ HAL_I2C │ HAL_TIM │
└─────────────────┴─────────────────┴─────────────────┴─────────────┘

任务优先级和功能分配

跳转到“任务优先级和功能分配”
高优先级 ┌──────────────────────────────────────────────────┐
│ ModbusTask (osPriorityHigh) │
│ - 周期: 5ms │
│ - 功能: Modbus主从机通信处理 │
│ - 栈大小: 1200*4 字节 │
└──────────────────────────────────────────────────┘
│
▼
中优先级 ┌──────────────────────────────────────────────────┐
│ ServoTask (osPriorityNormal) │
│ - 周期: 10ms │
│ - 功能: 伺服控制器状态机 │
│ - 栈大小: 1200*4 字节 │
└──────────────────────────────────────────────────┘
│
▼
低优先级 ┌──────────────────────────────────────────────────┐
│ SystemTask (osPriorityLow7) │
│ - 周期: 100ms │
│ - 功能: 按钮扫描、系统监控、看门狗喂狗 │
│ - 栈大小: 512*4 字节 │
└──────────────────────────────────────────────────┘
│
▼
最低优先级┌─────────────────────────────────────────────────┐
│ DefaultTask (osPriorityLow) │
│ - 周期: 100ms │
│ - 功能: 空闲任务,CPU休眠 │
│ - 栈大小: 128*4 字节 │
└──────────────────────────────────────────────────┘
┌─────────────┐
│ INIT │ 初始化状态
│ 初始化状态 │
└─────┬───────┘
│
▼
┌─────────────┐
│READ_INOUT │ 读取输入输出数据
│读取I/O数据 │ (21个32位参数)
└─────┬───────┘
│
▼
┌─────────────┐
│CHECK_INOUT │ 检查数据差异
│检查I/O差异 │
└─────┬───────┘
│
┌──────▼──────┐
│ │
有差异 ▼ ▼ 无差异
┌─────────────┐ ┌─────────────┐
│WRITE_INOUT │ │CHECK_CTRL │ 检查控制差异
│写入I/O差异 │ │检查控制差异 │ (控制位)
└─────┬───────┘ └─────┬───────┘
│ │
└───────┬───────┘
│
┌──────▼──────┐
│ │
有差异 ▼ ▼ 无差异
┌─────────────┐ ┌─────────────┐
│WRITE_CTRL │ │READ_OUTPUT │ 读取输出数据
│写入控制差异 │ │读取输出数据 │ (11个输出参数)
└─────┬───────┘ └─────┬───────┘
│ │
└───────┬───────┘
│
▼
┌─────────────┐
│ 回到INIT │ 循环执行
└─────────────┘
┌─────────────┐
│ 按钮初始化 │
└─────┬───────┘
│
▼
┌─────────────┐ 定时扫描 (20ms)
│ GPIO扫描 │ ◄────────────────┐
└─────┬───────┘ │
│ │
▼ │
┌─────────────┐ │
│ 消抖处理 │ │
│ (50ms延时) │ │
└─────┬───────┘ │
│ │
▼ │
┌────────────────┐ │
│ 事件分发 │ │
└────┬───┬───┬───┘ │
│ │ │ │
急停按钮 │ │ 启动按钮 │
│ │ │ │
▼ ▼ ▼ │
┌────────┐│┌────────┐ │
│ 急停处理│││ 启动处理│ │
│- 伺服停止│││- 气阀检查│ │
│- 开气阀 │││- 伺服启动│ │
└────────┘│└────────┘ │
│ │
▼ │
┌─────────────┐ │
│ 复位按钮 │ │
│- 报警复位 │ │
│- 回原点 │ │
└─────────────┘ │
│ │
└──────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 上位机 (PC/HMI) │
└─────────────────┬───────────────────────────────────────────────┘
│ UART2 (RS485)
│ 38400,8N2
▼
┌─────────────────────────────────────────────────────────────────┐
│ STM32F103RE (Modbus从站) │
│ ┌─────────────┬─────────────┬─────────────┬─────────────────┐ │
│ │ 保持寄存器 │ 输入寄存器 │ 线圈寄存器 │ 地址映射 │ │
│ │ (参数写入) │ (状态读取) │ (控制位) │ (透传模式) │ │
│ └─────────────┴─────────────┴─────────────┴─────────────────┘ │
└─────────────────┬───────────────────────────────────────────────┘
│ UART3 (RS485)
│ 38400,8N2
▼
┌─────────────────────────────────────────────────────────────────┐
│ A3伺服驱动器 (Modbus主站目标) │
│ ┌─────────────┬─────────────┬─────────────┬─────────────────┐ │
│ │ 站号1 │ 站号2 │ P6参数 │ 控制寄存器 │ │
│ │ (主要参数) │ (控制/状态) │ (配置参数) │ (0xA864/0xA875) │ │
│ └─────────────┴─────────────┴─────────────┴─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
启动时序:
时间 →
上电复位 ─┐
│
HAL初始化 ├─── 外设初始化 ──── FreeRTOS启动 ──── 任务创建
│ │ │ │
│ ▼ │ ▼
│ Timer启动 │ ┌─────────────┐
│ (TIM2/TIM4) │ │SystemTask │
│ │ │ │- 按钮初始化 │
│ ▼ │ │- LED初始化 │
│ UART初始化 │ │- 看门狗启用 │
│ (调试/Modbus) │ └─────────────┘
│ │ │ │
│ ▼ │ ▼
│ GPIO初始化 │ ┌─────────────┐
│ (按钮/阀门/LED) │ │ModbusTask │
│ │ │ │- 寄存器初始 │
│ ▼ │ │- 从站启动 │
│ I2C/SPI初始化 │ └─────────────┘
│ (EEPROM/扩展) │ │
│ │ │ ▼
│ ▼ │ ┌─────────────┐
└─── 看门狗初始化 │ │ServoTask │
(IWDG) │ │- 延时3秒 │
│ │ │- 伺服初始化 │
▼ │ │- 状态机启动 │
系统就绪指示 │ └─────────────┘
(LED闪烁序列) │ │
│ ▼ ▼
└─────── 正常运行状态 ──────────┘
启动按钮按下时序:
用户操作 按钮控制 伺服控制 A3驱动器 气动阀
│ │ │ │ │
▼ │ │ │ │
按下启动按钮 │ │ │ │
│ ▼ │ │ │
│ GPIO扫描检测 │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ 消抖处理(50ms) │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ 事件生成 │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ 安全检查 │ │ │
│ - 系统就绪? │ │ │
│ - 急停状态? │ │ │
│ - 运行状态? │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ 气阀状态检查 │ │ ▼
│ │ │ │ 检查阀门状态
│ ▼ │ │ │
│ 如果气阀开启 │ │ ▼
│ │ │ │ 关闭气阀夹紧
│ ▼ │ │ (2秒延时)
│ 等待夹紧完成 │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ 调用A3Servo_Start │ │ │
│ │ ▼ │ │
│ │ 设置bi_start=true │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 状态机检测到控制差异 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 组装控制命令 │ │
│ │ (0x00000001) │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ Modbus写入站2 ▼ │
│ │ (0xA864寄存器) ← Write32 ────────│
│ │ │ │ │
│ │ ▼ ▼ │
│ │ 清除bi_start标志 接收启动命令 │
│ │ │ │ │
│ │ ▼ ▼ │
│ │ 设置运行状态 伺服电机启动 │
│ │ │ │ │
│ ▼ ▼ ▼ ▼
│ 启动成功确认 LED指示运行 转盘开始转动 保持夹紧
参数修改同步时序:
上位机 STM32(从站) STM32(主站) A3驱动器
│ │ │ │
▼ │ │ │
Modbus写入 │ │ │
保持寄存器 │ │ │
(例:测量转速) │ │ │
│ ▼ │ │
│ 接收并存储到 │ │
│ mb_hold_map │ │
│ │ │ │
│ ▼ │ │
│ 更新balanceInput │ │
│ .measureSpeed │ │
│ │ │ │
│ ▼ │ │
│ 设置数据差异标志 │ │
│ isDataDifferent │ │
│ │ │ │
│ ▼ │ │
│ 状态机检测到差异 │ │
│ │ │ │
│ ▼ │ │
│ 更新写入缓存 │ │
│ writeInOutDataCache │ │
│ │ │ │
│ ▼ │ │
│ 调用A3Servo_Write32 ▼ │
│ │ 组装Modbus命令 │
│ │ │ │
│ │ ▼ │
│ │ 发送到站1 ▼
│ │ (0x063E地址) ← 接收参数
│ │ │ │
│ │ ▼ ▼
│ │ 等待ACK确认 更新内部参数
│ │ │ │
│ ▼ ▼ ▼
│ 同步读取缓存 清除差异标志 参数生效
│ readInOutDataCache │ │
│ │ │ │
│ ▼ ▼ ▼
└─────── 参数同步完成 ──────────────────────┘
急停触发源 ──────► 安全处理 ──────► 恢复流程
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 物理按钮 │──►│ 立即停机 │──►│ 手动复位 │
│ (GPIO检测) │ │- 伺服急停 │ │- 检查安全 │
└─────────────┘ │- 清控制位 │ │- 清急停标志 │
└─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 软件检测 │──►│ 等待停止 │──►│ 状态确认 │
│ (通信异常) │ │- 2秒延时 │ │- 零速检测 │
└─────────────┘ └─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 系统监控 │──►│ 释放工件 │──►│ 系统就绪 │
│ (看门狗) │ │- 开启气阀 │ │- 允许启动 │
└─────────────┘ │- 2秒延时 │ └─────────────┘
└─────────────┘
┌─────────────────────────┐
│ 安全检查矩阵 │
└───────────┬─────────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 运行状态 │ │ 急停状态 │ │ 伺服状态 │
│ 检查 │ │ 检查 │ │ 检查 │
└─────┬───────┘ └─────┬───────┘ └─────┬───────┘
│ │ │
▼ ▼ ▼
运行中禁止: 急停时禁止: 故障时禁止:
- 气阀操作 - 启动命令 - 所有操作
- 参数修改 - 气阀关闭 - 需复位
│ │ │
└────────────────┼────────────────┘
│
▼
┌─────────────┐
│ 操作许可 │
│ 判断 │
└─────────────┘
┌─────────────┐ Modbus ┌─────────────┐ 内部 ┌─────────────┐
│ 上位机 │ 协议传输 │ STM32从站 │ 处理 │ STM32主站 │
│ (HMI/PC) │ ─────────────► │ 寄存器映射 │ ───────────► │ 命令生成 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
│ 参数设置 │ 地址透传 │ Modbus命令
│ - 转速 │ - 保持寄存器 │ - 03H读取
│ - 角度 │ - 输入寄存器 │ - 10H写入
│ - 加减速 │ - 线圈寄存器 │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 实时监控 │ ◄─状态回读─ │ 状态机处理 │ ─命令发送──► │ A3伺服驱动器 │
│ - 转子速度 │ │ - 差异检测 │ │ - 站号1/2 │
│ - 当前位置 │ │ - 自动同步 │ │ - P6参数 │
│ - 运行状态 │ │ - 错误重试 │ │ - 控制寄存器 │
└─────────────┘ └─────────────┘ └─────────────┘
按钮输入 ─┐
│
GPIO扫描 ─┼─► 消抖处理 ──► 事件生成 ──► 安全检查 ──► 命令执行
│ │
上位机命令┘ │
▼
┌──────────────────────────────────────────┐
│ 命令分发 │
└─┬─────────┬─────────┬─────────┬─────────┬─┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────┐┌─────────┐┌─────────┐┌─────────┐┌─────────┐
│ 启动命令││ 停止命令││ 复位命令││ 气阀控制││ 参数设置│
└─────────┘└─────────┘└─────────┘└─────────┘└─────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────┐┌─────────┐┌─────────┐┌─────────┐┌─────────┐
│伺服启动 ││伺服停止 ││伺服复位 ││阀门动作 ││寄存器写入│
│0xA864.0││0xA864.1││0xA864.5││GPIO控制││Modbus写入│
└─────────┘└─────────┘└─────────┘└─────────┘└─────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 参数存储层次结构 │
├─────────────────┬─────────────────┬─────────────────┬───────────┤
│ RAM运行时 │ EEPROM持久化 │ Flash程序区 │ 默认参数 │
│ 参数缓存 │ 用户配置 │ 固化参数 │ 出厂设置 │
└─────────────────┴─────────────────┴─────────────────┴───────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│balanceInput │ │AT24C02C │ │const数组 │ │init_configs │
│- 测量转速 │ │- 用户参数 │ │- 地址映射 │ │- 默认值 │
│- 加速系数 │ │- 标定数据 │ │- 功能配置 │ │- 安全值 │
│- 减速系数 │ │- 历史记录 │ │- 版本信息 │ │- 限制范围 │
│- 角度偏移 │ │- 报警日志 │ └─────────────┘ └─────────────┘
│- 其他21参数 │ └─────────────┘
└─────────────┘
系统上电 ──► 读取Flash默认值 ──► 读取EEPROM用户值 ──► 参数校验 ──► 应用参数
│ │ │ │ │
│ ▼ ▼ ▼ ▼
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌────────┐
│ │常量表初始化 │ │存储值读取 │ │范围检查 │ │生效应用│
│ │- 21个参数 │ │- I2C通信 │ │- 最小值 │ │- 写伺服│
│ │- 地址映射 │ │- 错误重试 │ │- 最大值 │ │- 更新缓存│
│ └─────────────┘ └─────────────┘ └─────────────┘ └────────┘
│ │ │ │ │
└──────────────┼──────────────────┼────────────────┼─────────┘
│ │ │
▼ ▼ ▼
出厂默认值 ──► 用户配置值 ──► 当前运行值
(安全可靠) (个性化) (实时有效)
通信错误类型 ──► 检测机制 ──► 处理策略 ──► 恢复流程
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 超时错误 │──►│ 超时计数 │──►│ 重试机制 │──►│ 连接恢复 │
│- Modbus无响应│ │- 1秒超时 │ │- 最多3次 │ │- 重新初始化 │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 校验错误 │──►│ CRC检查 │──►│ 丢弃重发 │──►│ 数据同步 │
│- 数据损坏 │ │- 帧格式检查 │ │- 立即重试 │ │- 状态确认 │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 设备离线 │──►│ 连续失败 │──►│ 降级运行 │──►│ 报警通知 │
│- 伺服无应答 │ │- 错误计数>10│ │- 禁用控制 │ │- LED指示 │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
┌─────────────────────────┐
│ 看门狗管理器 │
│ (watchdog_manager) │
└───────────┬─────────────┘
│
┌───────────▼─────────────┐
│ 多重保护机制 │
└─┬─────────┬─────────┬───┘
│ │ │
┌─────────▼───┐ ┌───▼───┐ ┌───▼─────────┐
│ 硬件看门狗 │ │任务监控│ │ 通信监控 │
│ (IWDG) │ │(心跳) │ │(错误计数) │
└─────────────┘ └───────┘ └─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────┐
│ 系统状态评估 │
│ - 任务运行正常? │
│ - 通信连接正常? │
│ - 硬件响应正常? │
└─────────┬───────────────────────────┘
│
┌──────▼──────┐
│ │
异常 ▼ ▼ 正常
┌─────────────┐ ┌─────────────┐
│ 系统复位 │ │ 继续监控 │
│ - 软件重启 │ │ - 喂狗操作 │
│ - 硬件重启 │ │ - 状态更新 │
└─────────────┘ └─────────────┘
优先级策略 ──► 任务调度 ──► 响应时间控制
高优先级 (Modbus) ─── 5ms周期 ──► 通信响应 < 10ms
│ │
▼ ▼
中优先级 (Servo) ─── 10ms周期 ──► 控制响应 < 20ms
│ │
▼ ▼
低优先级 (System) ─── 100ms周期 ──► 监控响应 < 200ms
│ │
▼ ▼
空闲 (Default) ─── 低功耗 ──► CPU使用率优化
内存分区管理:
┌─────────────────────────────────────────────────────────┐
│ STM32F103RE 内存布局 │
├──────────┬──────────┬──────────┬──────────┬──────────────┤
│ Flash │ RAM │ Stack │ Heap │ Peripherals│
│ 512KB │ 64KB │ 16KB │ 16KB │ Memory │
└──────────┴──────────┴──────────┴──────────┴──────────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐
│程序代码│ │全局变量│ │任务栈 │ │动态分配│ │寄存器映射│
│- 应用 │ │- 控制器│ │- 4个任务│ │- 缓冲区│ │- GPIO │
│- 库函数│ │- 缓存 │ │- 总栈 │ │- 队列 │ │- UART │
│- 常量表│ │- 状态 │ │ 20KB │ │- 信号量│ │- Timer │
└────────┘ └────────┘ └────────┘ └────────┘ └──────────┘
优化策略:
- 稀疏寄存器映射 (节省RAM)
- 栈大小精确配置
- 缓冲区复用
- 常量表存储优化
LED指示状态码:
┌─────────────┬─────────────┬─────────────┬─────────────┐
│ 系统状态 │ 闪烁模式 │ 周期 │ 含义 │
├─────────────┼─────────────┼─────────────┼─────────────┤
│ 系统启动 │ 连续快闪 │ 100ms │ 初始化中 │
│ 系统就绪 │ 单次长亮 │ 2000ms │ 等待命令 │
│ 正在运行 │ 双闪 │ 500ms │ 伺服运行 │
│ 通信活动 │ 单闪 │ 200ms │ 数据传输 │
│ 启动响应 │ 7次快闪 │ 100ms │ 命令确认 │
│ 错误状态 │ SOS闪烁 │ 不规则 │ 故障指示 │
└─────────────┴─────────────┴─────────────┴─────────────┘
调试命令格式:
UART1 (115200,8N1) ──► 调试终端
│
├── 状态查询命令:
│ ├── "status" ──► 系统状态
│ ├── "servo" ──► 伺服状态
│ ├── "modbus" ──► 通信状态
│ └── "tasks" ──► 任务状态
│
├── 控制命令:
│ ├── "start" ──► 启动伺服
│ ├── "stop" ──► 停止伺服
│ ├── "reset" ──► 系统复位
│ └── "emergency" ──► 急停命令
│
└── 参数命令:
├── "speed=1000" ──► 设置转速
├── "angle=360" ──► 设置角度
└── "save" ──► 保存参数

本老虎机控制系统采用模块化、层次化的软件架构设计,具有以下特点:

  1. 高实时性: FreeRTOS保证任务调度,关键控制周期5-10ms
  2. 高可靠性: 多重安全机制,看门狗保护,错误恢复
  3. 易维护性: 模块化设计,清晰的接口,完善的调试系统
  4. 可扩展性: 地址透传机制,参数化配置,灵活的IO映射
  5. 低成本: 替代PLC方案,降低硬件成本50%以上
  1. 智能状态机: 伺服控制状态机实现PLC级别的逻辑控制
  2. 双重通信: 同时作为Modbus主站和从站,实现透明代理
  3. 线程安全: 完整的互斥锁保护,避免多任务冲突
  4. 自适应重试: 通信失败自动重试,分级降级策略
  5. 参数热更新: 支持运行时参数修改,无需重启系统
  • 控制精度: 角度定位精度 ±0.1度
  • 响应时间: 启动命令响应 < 20ms
  • 通信速率: Modbus 38400bps, 5ms轮询周期
  • 稳定运行: 连续运行7×24小时无故障
  • 资源占用: Flash < 400KB, RAM < 48KB

该系统已成功应用于工业动平衡机设备,替代原有PLC控制方案,在保证功能完整性的前提下,显著降低了成本并提升了系统的可维护性和扩展性。


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