fix: rebuild MES as compilable go-zero+ent backend (renamed bj_power_mes), restore 3 workstation projects from pristine original, align naming; all Go projects go build clean
This commit is contained in:
+53
-134
@@ -1,158 +1,77 @@
|
||||
# 自动化生产线管控系统 — 框架流程说明
|
||||
# CNC 生产线
|
||||
|
||||
> 本文档描述框架级的自动化流程,不包含具体产线设备或工艺的业务细节。
|
||||
> 具体业务内容(设备清单、工艺步骤、业务规则)见 `agent业务.md` 和 `doc/data.sql`。
|
||||
> 全配置化流程引擎设计见 `流程文档.md`,引擎作为纯执行器,所有业务逻辑通过数据库配置驱动。
|
||||
## 布局说明:
|
||||
1. 总体包括:地轨系统、内窥镜检测系统、扫码打标、AGV接驳台、抽检输出(具备不良品输出功能)、卧式加工中心MAR-500H、高压清洗机、热能去毛刺机、除锈清洗机。
|
||||
2. 地轨系统包括:地轨、六轴工业机器人、机器人手爪、随行暂存库、随行读码器、控制系统等。
|
||||
3. 内窥镜检测系统:包括工件检测台(滚筒输送带)、内窥镜。上下料位分开。
|
||||
4. AGV接驳台:共10台,分别用于向线内送料(1-5)和将完成的工件送入料库(6-10)。
|
||||
5. 抽检输出:用于人工对线内工件的不定时抽检,抽检不合格品,放置在检测辊筒线末端,人工定期清理。
|
||||
6. 激光打标机:为无法读码的零件打标.
|
||||
|
||||
---
|
||||
## 设备介绍
|
||||
整个产线通过一个西门子S1200 PLC控制,除内窥镜和激光打标机外,工件的转运也都通过PLC信号驱动机器人来进行。
|
||||
|
||||
## 软件架构核心概念
|
||||
### 卧式加工中心
|
||||
1. 型号为大隈 MAR-500H,共4台,通过PLC信号控制。
|
||||
2. 每台机床配备双工作台,可实现加工一个工件同时暂存一个工件,加工完成后自动加工暂存工件。
|
||||
3. 机床1、2可加工工件类型107,机床3、4可加工工件类型160,机床4可加工工件类型200
|
||||
|
||||
### Actor(设备代理,纯内存)
|
||||
每台物理设备对应一个 **MachineActor**(统一实现),通过 `Type` 字段适配不同设备类型。Actor 是 mutex 保护的同步状态结构体,由 EventLoop 同步调用。负责:
|
||||
- **管理槽位状态**:当前槽位上有无工件、哪个工件
|
||||
- **处理 PLC 信号**:收到完成信号后,把槽位状态改为 DONE
|
||||
### AGV 接驳台
|
||||
1. 共10台,分别用于向线内送料(1-5)和将完成的工件送入料库(6-10)。
|
||||
2. 每个接驳台上有一个托盘,每个托盘有9个工位 3*3 布局,编号从左到右从上到下1-9
|
||||
|
||||
Actor 不写数据库、不调度、不操作 PLC。
|
||||
## 机器人
|
||||
1. 机器人有双手爪,可以在一个工位进行换料工作,完成的料再进入下一工位
|
||||
|
||||
### PlcExecutor(PLC 信号握手)
|
||||
`PlcExecutor` 封装所有设备类型的 PLC 信号握手时序,通过方法名区分不同操作。负责:
|
||||
- **Load**:将工件放入设备槽位(写 Req → 等 Done → 复位 Req)
|
||||
- **Unload**:从设备槽位取出工件
|
||||
- **Exchange**:同时取成品+放毛坯(仅支持 exchange 的设备类型)
|
||||
### 随行暂存台
|
||||
1. 随行暂存台是随地轨机器人一起移动的暂存装置,暂存台有扫码枪、暂存料盘、二次定位装置。
|
||||
2. 暂存料盘共有八个料位,工件保持在同一位置直到下料到接驳台。
|
||||
|
||||
### Recipe(工艺配方)
|
||||
每种工件型号定义一份 Recipe(加工步骤有序列表)。每个步骤包含:
|
||||
- 工序类型(MACHINING / INSPECTION / BUFFER_STAGE / …)
|
||||
- 资源类型(指定需要的设备种类)
|
||||
- 默认下一步步骤编号
|
||||
### 高压清洗机
|
||||
1. 高压清洗机,共具备2个清洗工位,可同时放2个工件。
|
||||
2. 使用focas协议
|
||||
|
||||
Recipe 是静态配置,启动时加载到内存。工件实例只记录当前步骤,不复制整份配方。
|
||||
### 除锈清洗线
|
||||
1. 流水线,但只有一个上下料位,可放10个工件。
|
||||
2. 线内摆放方式:放置在框中,每框2/4件。
|
||||
|
||||
### SignalRouter(信号路由,`actor/signal_router.go`)
|
||||
- 每秒轮询 PLC 输入寄存器,检测上升沿变化
|
||||
- 根据信号找到对应 Actor,投递 SignalEvent 到 EventLoop
|
||||
- 信号是系统的输入,触发状态机迁移,但信号本身不是状态源
|
||||
|
||||
### EventLoop(事件循环,`eventloop/loop.go`)
|
||||
产线大脑,运行在独立 goroutine 中,**串行处理**所有生产事件:
|
||||
- 来自 PLC 的设备信号 → 更新 Actor 槽位状态 → 投递 MACHINE_DONE → 推进步骤
|
||||
- 触发调度器 → 决策下一步动作
|
||||
- 下发动作指令 → PlcWorker 执行
|
||||
- 处理执行结果 → 推进 Job 步骤 → 触发下一轮调度
|
||||
- **唯一写数据库的入口**
|
||||
## 自动化流程:
|
||||
|
||||
### Scheduler(调度器,`scheduler/`)
|
||||
三层管道,只读不写:
|
||||
1. **TaskGenerator**:根据 Job 当前步骤生成候选动作
|
||||
2. **ConstraintFilter**:排除不可用设备、冲突、暂停工单等
|
||||
3. **PolicyEngine**:按优先级排序,选出最优方案
|
||||
1. AGV将装有待加工的零件托盘送到AGV接驳台处;(AGV 调度由外部系统负责,本系统仅通过接驳台信号感知“托盘到位”。)
|
||||
2. 工人在管理系统下工单,接驳台上有料就可下单,每个工单只会有一种工件类型, 点击下单选择料位以及工件类型
|
||||
3. 地轨机器人从接驳台(5个上料接驳台,每个9槽位)上抓取工件进行扫码,扫码失败放到抽检台1号槽位,扫码成功将工件放置到随行暂存台上,首次上满8个槽位,后续暂存台上工件数量少于4个时再批量扫码上4个工件;
|
||||
4. 机器人运行至机床换料位置,为数控机床上料/换料,数控机床自动加工,加工完成放回随行暂存台;
|
||||
5. 地轨机器人将加工完成的工件放入高压清洗机(2个槽位,清洗时间2~3分钟/件),清洗完成放回随行暂存台;
|
||||
6. 地轨机器人将高压清洗完成的工件,放至内窥镜检测区的滚筒线,合格件移送至检测辊筒线末端,机器人取回暂存台,不合格品由人工定期清理。
|
||||
7. 地轨机器人将检测合格的工件,为热能去毛刺机换料,将去完毛刺的工件取回暂存台;
|
||||
8. 地轨机器人将热能去完毛刺的工件送至除锈清洗线(一个上下料位,可放10个,FIFO),为除锈清洗线换料,除锈完取回暂存台;
|
||||
9. 地轨机器人对除锈完成的工件扫码,扫码OK将工件放置到随行暂存台处,如果扫码无法识别的,地轨机器人抓取工件到激光打标机处打码,打码完成后放置到随行暂存台处);
|
||||
10. 地轨机器人将扫码(或打码)完成的工件放至抽检台抽检,或放至AGV接驳台(5个上料接驳台,每个9槽位),由AGV接驳台送出线。
|
||||
|
||||
一次调度只派遣一个 Worker 动作,确保机器人串行执行。
|
||||
|
||||
### PlcWorker(PLC 执行器,`plc_worker.go`)
|
||||
按 Action 类型调用 PlcExecutor 对应方法,执行 PLC 信号握手。
|
||||
|
||||
### EventBus(事件总线,`eventbus/`)
|
||||
组件间解耦通信,当前实现为内存 LocalBus。订阅者:
|
||||
- EventLogWriter:异步写入数据库,用于审计和恢复
|
||||
- SSEBridge:推送到前端看板
|
||||
- AlarmService:告警通知
|
||||
|
||||
---
|
||||
|
||||
## 自动化流程(框架级)
|
||||
|
||||
### 阶段一:上料
|
||||
|
||||
```
|
||||
操作员创建工单 → 系统创建 N 个 Job(工件实例)
|
||||
→ 调度器发现 Job 就绪
|
||||
→ 下发上料动作 → PlcWorker → PlcExecutor.DockFetch
|
||||
→ 搬运设备从接驳台取件 → 扫码
|
||||
```
|
||||
|
||||
**扫码结果分支:**
|
||||
- **成功** → 分配暂存台空闲槽位,状态推进
|
||||
- **失败** → 放回原接驳台槽位,挂起,等待人工处理
|
||||
|
||||
### 阶段二:加工
|
||||
|
||||
```
|
||||
暂存台有料 → 调度器选择加工设备
|
||||
→ PlcWorker → PlcExecutor.GrinderPlace(上料)
|
||||
→ 设备开始加工
|
||||
→ 加工完成 → PLC 发送完成信号
|
||||
→ SignalRouter 检测上升沿 → 投递 SignalEvent → EventLoop
|
||||
→ MachineActor.MarkSlotDone → 槽位状态 PROCESSING → DONE
|
||||
→ 调度器得知"有工件待取走"
|
||||
→ PlcWorker → PlcExecutor.GrinderFetch(卸料)
|
||||
→ 工件放回暂存台
|
||||
```
|
||||
|
||||
**Exchange 换料优化:** 支持 exchange 的设备可一次往返同时完成"取成品 + 放毛坯"。
|
||||
|
||||
### 阶段三:检测
|
||||
|
||||
```
|
||||
暂存台有料 → 调度器选择检测设备
|
||||
→ PlcWorker → PlcExecutor.FullCheckPlace(上料)
|
||||
→ 设备开始检测
|
||||
→ 检测完成 → PLC 发送结果信号(OK / NG)
|
||||
→ SignalRouter → EventLoop → MachineActor.MarkSlotDone
|
||||
→ 判定结果分支:
|
||||
├── OK → 推进到下一步工序
|
||||
└── NG → 报废处理
|
||||
```
|
||||
|
||||
### 阶段四:下料
|
||||
|
||||
```
|
||||
暂存台有料 → 调度器决定去向
|
||||
→ PlcWorker → PlcExecutor.DockPlace(下料)
|
||||
→ 搬运设备放到接驳台 → 送走
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 信号触发点(框架级)
|
||||
|
||||
| 信号类型 | 触发时机 | 处理方 | 产生结果 |
|
||||
|----------|---------|--------|---------|
|
||||
| 设备完成信号 | 加工/检测完成 | EventLoop.handleMachineSignal → Actor.MarkSlotDone | 槽位状态 OCCUPIED → DONE,投递 MACHINE_DONE |
|
||||
| 调度触发 | 定时器/Worker完成 | EventLoop.trySchedule | 调度决策,派遣 Worker 动作 |
|
||||
|
||||
具体信号名称和地址见 `doc/signals.sql`。
|
||||
|
||||
---
|
||||
|
||||
## 关键设计原则
|
||||
|
||||
1. **事件驱动,不预排任务** — 每个工件只记录当前步骤,下一步由事件触发实时决策
|
||||
2. **PLC 信号是输入,不是状态源** — 系统以数据库中的状态为准,PLC 信号只用来触发状态迁移
|
||||
3. **Actor 只管槽位和信号** — 不做调度决策,不写数据库,由 EventLoop 同步调用
|
||||
4. **PlcExecutor 封装 PLC 握手** — 所有设备类型的 PLC 操作统一通过 PlcExecutor 方法实现,信号地址校验前置
|
||||
5. **调度器只读不写** — 查询状态做决策,下发任务,不直接操作硬件或数据库
|
||||
6. **EventLoop 是唯一写路径** — 所有生产状态变更必须经过 EventLoop → DBState
|
||||
7. **防御式编程** — 所有错误必须有日志记录或向上抛出,禁止隐性失败
|
||||
|
||||
---
|
||||
## 节拍
|
||||
1. 加工时间:加工除A、B面及其上面的特征之外的各面和孔,加工时间20min/件(单台机床平均时间);4台设备同时加工。
|
||||
2. 加工设备节拍:20min/件。
|
||||
3. 高压清洗时间:2~3分钟/件,共具备2个料位。
|
||||
4. 内窥镜检测时间:5分钟/件,检测输送带可连续输送。
|
||||
5. 热能去毛刺时间:2~3分钟/件。
|
||||
6. 除锈清洗机清洗除锈处理时间: <5分钟/件,工位数量为4件。
|
||||
|
||||
## 技术栈
|
||||
|
||||
- 后端:Go 1.23.4 + go-zero v1.3.8
|
||||
- 数据库:PostgreSQL + ent ORM
|
||||
- 缓存/Token 存储:Redis(可选,未配置时降级内存)
|
||||
- PLC 通信:Snap7(西门子 S7 协议)
|
||||
- 前端:React 19 + Semi Design + Zustand + Vite 7
|
||||
|
||||
## 代码生成
|
||||
1. 采用go-zero MVC框架
|
||||
2. 数据校验采用 github.com/go-playground/validator/v10
|
||||
3. 数据库采用 postgresql , 采用 entgo 框架操作数据库
|
||||
4. 前端采用 react + semi-ui 实现用户界面
|
||||
5. plc 使用 bjhardman.cn/bjhardman/goplc
|
||||
6. 使用 csv 文件存储plc信号
|
||||
|
||||
### 代码生成
|
||||
- 生成 ent:`cd schema && go generate`
|
||||
- 生成 go-zero API:`cd apis && go generate`
|
||||
|
||||
## 全局规则
|
||||
|
||||
- 不要在 `handler` 写业务逻辑,保持薄层
|
||||
- 不要手动修改 `ent/`、`cmd/control-api/internal/handler/routes.go`、`types/types.go`、goctl 生成的 handler
|
||||
- 所有 API 变更先改 `apis/*.api`,再生成代码
|
||||
|
||||
Reference in New Issue
Block a user