1. 项目背景与系统概述
这套基于.NET技术栈开发的大型MES(制造执行系统)生产制造管理系统,是我在前单位参与维护的核心业务系统。作为典型的BS架构工业级应用,它承载着企业从订单下达到产品交付的全流程管理任务。系统目前仍在多个生产基地稳定运行,日均处理超过50万条生产数据记录。
从技术架构来看,系统采用Oracle 11g作为底层数据库,结合.NET Framework 4.6.1构建三层架构。特别值得注意的是,这套系统实现了与PLC设备、AGV调度系统、质量检测设备的深度集成,形成了完整的智能制造闭环。系统规模上,仅核心业务表就超过200张,存储过程多达350余个,代码总量约25万行。
2. 技术架构深度解析
2.1 整体架构设计
系统采用经典的分层架构设计,但针对制造业特点做了特殊优化:
code复制表现层(Web) → 业务逻辑层 → 数据访问层 → Oracle数据库
↑ ↑ ↑
IIS WCF服务 Enterprise Library
表现层采用ASP.NET MVC 5 + jQuery EasyUI组合,这种选择在当时(2016年左右)既保证了开发效率,又满足了制造业对界面响应速度的要求。业务逻辑层通过WCF服务暴露核心接口,实现了与车间设备控制系统的安全通信。
2.2 数据库连接方案
由于Oracle数据库的特殊性,系统采用了混合连接方案:
- 基础数据访问:使用Microsoft的Oracle Data Provider(ODP.NET)
- 高性能批量操作:直接调用OracleCommand执行PL/SQL块
- 事务处理:结合System.Transactions实现分布式事务
典型的数据库连接配置示例:
xml复制<configuration>
<oracle.manageddataaccess.client>
<version number="4.122.19.1">
<settings>
<setting name="TraceLevel" value="0" />
<setting name="TraceFileLocation" value="C:\oracle_logs\" />
</settings>
<dataSources>
<dataSource alias="MESDB" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod-db01)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MESPRD)))" />
</dataSources>
</version>
</oracle.manageddataaccess.client>
</configuration>
重要提示:实际部署时应将TraceLevel调整为3以上,便于排查连接问题
2.3 核心业务模块实现
以生产订单分解为例,系统采用"模板+实时计算"的混合策略:
csharp复制public class ProductionOrderService
{
public OrderBreakdownResult BreakdownOrder(ProductionOrder order)
{
// 获取基础BOM模板
var template = BomRepository.GetTemplate(order.ProductCode);
// 实时计算考虑当前库存和替代料
var breakdown = new OrderBreakdownCalculator(
template,
InventoryService,
SubstitutePolicyService)
.Calculate();
// 应用工艺路线约束
var routed = ProcessRoutingService.ApplyConstraints(breakdown);
return new OrderBreakdownResult {
Materials = routed.Materials,
Operations = routed.Operations,
Warnings = routed.Warnings
};
}
}
这个典型实现展示了制造业系统的复杂性:需要同时处理静态数据(BOM模板)、动态数据(实时库存)和业务规则(替代料策略)。
3. 系统部署实践指南
3.1 环境准备要点
对于想要搭建此系统的开发者,需特别注意以下环境要求:
| 组件 | 版本要求 | 备注 |
|---|---|---|
| IIS | 8.5+ | 需启用ASP.NET 4.6和WCF HTTP激活 |
| Oracle客户端 | 12c R2 | 需配置tnsnames.ora |
| .NET Framework | 4.6.1 | 需安装开发者包 |
| 浏览器 | IE11/Chrome 60+ | 兼容模式可能引发布局问题 |
3.2 数据库初始化步骤
由于缺少完整DMP文件,需通过建表语句手动初始化:
- 按顺序执行table目录下的SQL脚本:
- 00_DDL_Table.sql → 01_DDL_Index.sql → 02_DDL_Constraint.sql
- 初始化基础数据:
sql复制INSERT INTO SYS_PARAM (PARAM_CODE, PARAM_VALUE) VALUES ('SYSTEM_MODE', 'DEV'); - 创建必要的DBLink(如对接ERP系统):
sql复制CREATE DATABASE LINK ERP_LINK CONNECT TO erp_user IDENTIFIED BY password USING 'ERPDB';
3.3 常见部署问题解决
根据实际部署经验,整理高频问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 登录后立即跳转 | Session配置错误 | 检查web.config中的sessionState mode |
| 报表加载缓慢 | Oracle字符集不匹配 | 在连接字符串中添加Unicode=True |
| WCF调用超时 | 绑定配置不当 | 调整binding的maxReceivedMessageSize |
| 条码打印乱码 | 打印机驱动问题 | 安装Zebra原厂驱动并设置ZPL模式 |
4. 二次开发建议
4.1 架构优化方向
对于想要基于此系统进行二次开发的团队,建议考虑以下改进:
-
技术栈升级:
- 迁移到.NET Core 6+获取更好的性能
- 用Dapper替换部分EF代码提升数据访问效率
- 引入Redis缓存热点数据
-
模块化改造:
mermaid复制graph TD A[原单体架构] --> B[微服务拆分] B --> C[订单服务] B --> D[排产服务] B --> E[质量服务] -
前端现代化:
- 用Vue.js重构EasyUI部分
- 增加WebSocket实时看板
4.2 典型功能扩展示例
以添加设备预测性维护功能为例:
csharp复制// 设备健康度评估服务
public class EquipmentHealthService
{
private readonly IEquipmentDataRepository _repo;
private readonly IPredictiveModel _model;
public EquipmentHealthService(IEquipmentDataRepository repo,
IPredictiveModel model)
{
_repo = repo;
_model = model;
}
public HealthAssessment Assess(string equipmentId)
{
var recentData = _repo.GetRecentData(equipmentId, hours: 24);
var prediction = _model.Predict(recentData);
return new HealthAssessment {
EquipmentId = equipmentId,
Score = prediction.Score,
Suggestions = prediction.GetMaintenanceSuggestions()
};
}
}
这个扩展展示了如何在不修改核心代码的前提下,通过依赖注入增加新功能。
5. 实战经验分享
5.1 性能调优技巧
经过多次生产环境优化,总结出以下关键点:
-
Oracle参数优化:
sql复制ALTER SYSTEM SET cursor_sharing=FORCE SCOPE=BOTH; ALTER SYSTEM SET optimizer_index_cost_adj=20 SCOPE=BOTH; -
.NET内存管理:
- 对大型DataSet使用Clear()后立即Dispose()
- 配置GC工作站模式:
xml复制<configuration> <runtime> <gcServer enabled="true"/> </runtime> </configuration>
-
批处理优化:
csharp复制// 低效方式 foreach(var item in list) { db.ExecuteNonQuery($"INSERT...{item.Id}"); } // 优化后 using(var bulkCopy = new OracleBulkCopy(conn)) { bulkCopy.DestinationTableName = "PRODUCTION_DATA"; bulkCopy.WriteToServer(dataTable); }
5.2 制造业特殊考量
在MES系统中需要特别注意的行业特性:
-
事务处理:
- 车间操作需要支持秒级响应
- 采用乐观并发控制而非锁机制
-
异常处理:
csharp复制public void ProcessDefect(DefectInfo defect) { try { // 正常处理流程 } catch (OracleException ex) when (ex.Number == 1555) { // 特殊处理快照过旧错误 RetryPolicy.Execute(() => ProcessDefect(defect)); } } -
离线模式支持:
- 关键工位操作需缓存本地
- 实现SQLite和Oracle的双向同步
这套系统虽然已有一定历史,但其架构设计和实现思路仍然值得制造业软件开发人员深入研究。特别是在处理高并发生产数据采集、复杂业务规则引擎等方面,有很多值得借鉴的设计模式和实践方案。