Files
dyp/项目分析报告.md
T
2026-05-07 20:25:34 +08:00

269 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目分析报告
## 一、项目概述
### 1.1 基本信息
| 项目名称 | MainWin |
|---------|--------|
| **项目类型** | Delphi (Embarcadero RAD Studio) 桌面应用程序 |
| **框架版本** | ProjectVersion 19.5 (大约对应 Delphi 10.4/10.5) |
| **UI框架** | FireMonkey (FMX) |
| **目标平台** | Win64 (主要), Win32 |
| **当前版本** | 1.0.1.2 |
| **运行权限** | requireAdministrator (需要管理员权限) |
### 1.2 业务定位
这是一个**工厂生产线数据采集与监控系统 (MES客户端)**,用于:
- 生产线工位数据采集
- PLC设备通信控制
- 条码/二维码扫描识别
- 物料追踪与工艺流程管理
- 与后台Web服务数据同步
---
## 二、技术架构分析
### 2.1 技术栈概览
| 类别 | 技术组件 | 说明 |
|-----|---------|------|
| **UI框架** | FireMonkey (FMX) | 跨平台UI框架,支持Windows/macOS/iOS/Android |
| **数据库** | FireDAC | Embarcadero原生数据访问框架,使用FDMemTable内存表 |
| **网络通信** | RESTClient, Indy, SOAP | 多协议支持:REST API / TCP Socket / WebService |
| **硬件通信** | SPComm, MahUSB, uPLCDevice | 串口、USB、PLC设备驱动 |
| **并发处理** | TThread, TTimer | 多线程+定时器模式 |
| **配置存储** | INI文件 / JSON文件 | 本地配置持久化 |
### 2.2 核心模块结构
```
MainWin (主程序)
├── uMain.pas # 主窗体,UI主逻辑
├── uDM.pas # 数据模块(TDataModule),核心数据管理
├── uFrameBase.pas # 业务框架基类(工厂模式)
├── uFrameBaseBland.pas # 业务框架扩展类
├── uListConent.pas # 业务内容列表
├── json_webservice.pas # REST API通信服务
├── uKsoap.pas # SOAP WebService通信
├── uPLCDevice.pas # PLC设备通信(三菱/欧姆龙)
├── uTCPDevice.pas # TCP Socket通信
├── SPComm.pas # 串口通信组件
├── MahUSB.pas # USB设备通信
├── json_dypSave.pas # 数据保存服务
└── uSafeLog.pas # 日志记录
```
### 2.3 业务框架设计
项目采用了**工厂模式 + 策略模式**的框架设计:
- `TFrameBase` - 所有业务框架的基类,定义标准化接口
- `TFrameClass = class of TFrameBase` - 工厂类,用于动态创建业务框架
- 具体的业务框架包括:`uFrame_Dyp000/001/002/003` 等,针对不同产品/工艺流程
**关键设计模式**
```pascal
// 动态加载业务框架
FrameClass := TFrameClass(FindClass(FrameName));
CurrentFrame := FrameClass.Create(Self);
```
---
## 三、依赖库分析
### 3.1 核心运行时包
| 组件包 | 用途 |
|-------|------|
| `FireDAC` | 数据库访问 |
| `RESTComponents` | REST客户端 |
| `emsclientfiredac` | EMS中间件客户端 |
| `IndyCore/IndyProtocols` | TCP/UDP通信 |
| `soaprtl/soapserver` | SOAP WebService |
| `FireDACSqliteDriver` | SQLite本地存储 |
| `FMX*` | FireMonkey UI框架 |
### 3.2 第三方组件
| 组件 | 说明 |
|-----|------|
| `SPComm` | 串口通信组件 (1997年小猪工作室开发) |
| `EhLib` | 数据感知控件库 |
| `Tee*` | 图表组件 |
---
## 四、功能模块分析
### 4.1 设备通信模块
| 模块 | 支持设备 | 通信方式 |
|-----|---------|--------|
| `uPLCDevice` | 三菱MELSEC, 欧姆龙OMRON | TCP Socket |
| `SPComm` | 串口设备 | RS232/RS485 |
| `MahUSB` | USB设备 | HID协议 |
| `uTCPDevice` | 通用TCP设备 | TCP Socket |
### 4.2 数据交互模块
| 模块 | 协议 | 用途 |
|-----|------|-----|
| `json_webservice` | REST API | 与MES服务器数据交互 |
| `uKsoap` | SOAP | 老式WebService调用 |
| `json_dypSave` | REST API | 数据批量上报 |
### 4.3 业务功能
- **用户认证**: 工号/密码登录
- **工单管理**: 工单查询、录入、报工
- **物料追踪**: 批号、料号、条码扫描
- **生产报工**: 产量数据上报
- **设备监控**: PLC状态、报警灯、传感器
- **打印输出**: 标签打印、报表打印
---
## 五、代码质量评估
### 5.1 优点
1. **模块化设计**: 业务框架与UI分离,便于扩展
2. **多协议支持**: 同时支持REST/SOAP/TCP/串口,兼容性强
3. **多线程架构**: 使用TThread和定时器处理异步任务
4. **本地缓存**: 离线数据暂存,网络恢复后自动上报
### 5.2 改进空间
1. **代码组织**: 部分业务逻辑直接写在Form中,可进一步抽象
2. **异常处理**: 错误处理可以更统一和规范化
3. **日志系统**: 已有uSafeLog,但日志粒度可更细致
4. **单元测试**: 缺少自动化测试覆盖
5. **文档**: 代码注释较少
---
## 六、升级优化建议
### 6.1 编译器/IDE升级
| 当前版本 | 建议版本 | 理由 |
|---------|---------|-----|
| ~Delphi 10.4/10.5 | **Delphi 11.x (Alexandria)****Delphi 12.x** | 最新LSP支持、更好的FMX性能、ARM64 Windows支持 |
**升级步骤**:
1. 在新IDE中打开 `.dproj` 文件
2. 使用项目升级向导
3. 解决第三方组件兼容性问题
4. 重新编译测试
### 6.2 框架现代化
**UI现代化**:
```delphi
// 当前: 使用TRectangle模拟控件
Rectangle7: TRectangle;
// 建议: 使用原生控件 + 样式表
Rectangle7: TPanel; // 或直接使用TStyledControl
```
**高DPI支持**:
- 项目已设置 `AppDPIAwarenessMode=PerMonitor`
- 建议在 Delphi 11+ 中使用新的 `FMX.Styles` 系统
### 6.3 架构优化建议
| 方面 | 当前方案 | 优化建议 |
|-----|---------|--------|
| **网络库** | RESTClient (旧版) | 使用新版 `System.Net.HttpClient` |
| **数据存储** | FDMemTable + INI | SQLite/FireDAC + JSON配置 |
| **并发模型** | TThread + TTimer | 使用 `System.Threading.TTask` |
| **依赖注入** | 直接引用 | 引入接口抽象 |
### 6.4 具体重构建议
**1. 网络通信层重构**:
```delphi
// 当前: 使用TRESTClient (分散在各单元)
RESTClient := TRESTClient.Create(sbaseUrl + '/prod-api/login');
// 建议: 统一网络服务层
INetworkService = interface
function Get(const URL: string): string;
function Post(const URL: string; const Body: string): string;
end;
```
**2. 硬件通信抽象**:
```delphi
// 当前: 直接实现
TMelsec = class
FSocket: TClientSocket;
end;
// 建议: 接口抽象
IPlcDevice = interface
procedure Connect;
procedure Disconnect;
function Read(const Address: string): string;
procedure Write(const Address, Value: string);
end;
```
**3. 数据库设计优化**:
```delphi
// 当前: FDMemTable内存表
FDMemMain: TFDMemTable;
// 建议: SQLite本地持久化
FDConnection: TFDConnection;
FDQuery: TFDQuery;
```
### 6.5 性能优化
| 优化点 | 当前实现 | 优化方案 |
|-------|---------|--------|
| **数据加载** | 启动时全量加载 | 懒加载 + 缓存 |
| **UI刷新** | 定时器轮询 | 事件驱动 |
| **文件监控** | 定时扫描目录 | 使用 `TFileMonitor` (已实现) |
| **内存管理** | 手动Free | 使用接口和ARC模式 |
---
## 七、升级风险评估
| 风险项 | 等级 | 缓解措施 |
|-------|-----|--------|
| 第三方组件不兼容 | **高** | 确认组件有新版本,或寻找替代品 |
| FMX行为变化 | **中** | 全面回归测试UI功能 |
| 运行时库变化 | **低** | 检查第三方库依赖 |
| 性能回归 | **中** | 性能基准测试 |
---
## 八、总结
这是一个**成熟稳定的工厂MES客户端**,基于 Delphi FMX 框架构建,具有以下特点:
**优势**:
- 跨平台潜力 (FMX框架)
- 丰富的设备通信支持
- 模块化业务框架设计
- 离线数据缓存能力
⚠️ **待改进**:
- Delphi版本较旧 (约10.4/10.5)
- 代码架构可进一步现代化
- 缺乏自动化测试
- 部分古老组件 (SPComm 1997年)
🎯 **优先升级方向**:
1. **第一步**: 升级到 Delphi 11.x/12.x
2. **第二步**: 重构网络通信层
3. **第三步**: 优化数据结构存储
4. **第四步**: 补充单元测试