在制造业数字化转型的浪潮中,MES(制造执行系统)作为连接ERP与生产现场的关键纽带,正发挥着越来越重要的作用。我从事工业4.0领域实施工作已有8年时间,参与过20+家制造企业的MES系统部署,今天想和大家分享一个基于Vue和.NetCore技术栈的工业互联网MES系统实战经验。
这个系统最显著的特点是采用了前后端分离架构:前端使用Vue2.6构建响应式用户界面,后端采用.NetCore3.1实现业务逻辑处理。这种架构选择不是偶然的——Vue的组件化开发模式特别适合MES这种需要频繁交互的业务场景,而.NetCore的跨平台特性则完美匹配了工业现场多样化的部署环境需求。
提示:在工业现场环境中,系统往往需要部署在Windows工控机或Linux服务器上,.NetCore的跨平台能力在这里显示出独特优势。
选择Vue2.6作为前端框架主要基于三个考量:
在实际开发中,我们特别注重以下几点优化:
一个典型的生产工单组件实现如下:
vue复制<template>
<el-card class="work-order">
<div slot="header">
<span>工单号:{{ order.no }}</span>
<el-tag :type="order.status | statusColor">
{{ order.status | statusText }}
</el-tag>
</div>
<el-table :data="order.items">
<el-table-column prop="materialCode" label="物料编码"/>
<el-table-column prop="quantity" label="数量"/>
</el-table>
</el-card>
</template>
<script>
export default {
props: ['order'],
filters: {
statusColor(status) {
const map = {1:'success', 2:'warning', 3:'danger'}
return map[status] || 'info'
},
statusText(status) {
return ['未开始','进行中','已暂停','已完成'][status-1] || '未知'
}
}
}
</script>
后端采用分层架构设计:
多租户实现是我们遇到的最大挑战之一。最终方案是:
csharp复制public class TenantAwareDbContext : DbContext
{
private readonly ITenantProvider _tenantProvider;
public TenantAwareDbContext(
DbContextOptions options,
ITenantProvider tenantProvider) : base(options)
{
_tenantProvider = tenantProvider;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 自动应用租户过滤
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
if (typeof(ITenantEntity).IsAssignableFrom(entityType.ClrType))
{
modelBuilder.Entity(entityType.ClrType)
.HasQueryFilter(e => EF.Property<int>(e, "TenantId")
== _tenantProvider.GetTenantId());
}
}
}
}
标签打印是MES中最频繁的操作之一。我们的解决方案包含:
条码生成采用ZXing库的WASM版本:
javascript复制async function generateBarcode(content, type='CODE128') {
const codeWriter = new ZXing.BrowserQRCodeSvgWriter()
const svg = await codeWriter.writeToSvg(content, 300, 100, {
format: type,
margin: 0
})
return URL.createObjectURL(
new Blob([svg], {type: 'image/svg+xml'})
)
}
工厂建模采用层级结构:
我们开发了专用的3D布局工具:
csharp复制public class LayoutService
{
public async Task<LayoutResult> GenerateLayout(PlantModel plant)
{
var result = new LayoutResult();
// 使用AutoCAD API生成二维布局图
using (var doc = AcadApplication.Documents.Add())
{
// 绘制车间轮廓
// 放置设备图块
// 生成路径规划
}
// 使用ThreeJS生成三维预览
result.ThreeJSModel = await _threeJSRenderer.RenderAsync(plant);
return result;
}
}
在汽车零部件工厂实施时,我们遇到了报工接口性能瓶颈。通过以下措施将响应时间从1200ms降至200ms:
数据库优化:
缓存策略:
csharp复制services.AddStackExchangeRedisCache(options => {
options.Configuration = Configuration.GetConnectionString("Redis");
options.InstanceName = "MES_";
});
[HttpGet("report/{workOrderId}")]
[ResponseCache(Duration = 30, Location = ResponseCacheLocation.Client)]
public async Task<IActionResult> GetWorkOrder(string workOrderId)
{
// ...
}
条码打印模糊:
多租户数据混淆:
sql复制-- 确保所有查询都包含TenantId条件
CREATE TRIGGER trg_TenantCheck
ON dbo.ProductionData
FOR INSERT, UPDATE
AS
BEGIN
IF EXISTS(
SELECT 1 FROM inserted
WHERE TenantId <> CONTEXT_INFO()
)
BEGIN
ROLLBACK;
RAISERROR('Tenant mismatch', 16, 1);
END
END
当前系统已支持以下扩展点:
对于计划实施类似系统的同行,我的建议是:
最近我们正在试验将数字孪生技术融入MES,通过实时3D可视化来监控整个生产流程。初期测试显示,这能帮助现场管理人员快速定位瓶颈工序,但这又是另一个值得深入探讨的话题了。