简介:苦糖果MES系统是一款面向国内离散制造型中小企业的开源免费生产执行管理系统,采用B/S架构,聚焦生产调度、质量管控、设备维保与库存跟踪等核心场景,有效解决中小企业缺乏专业、可落地且低成本MES工具的痛点。资源包共1429个文件,主体为1150个Java业务逻辑代码与181个XML配置文件,辅以SQL数据库脚本、VM模板页、YML配置及Excel报表模板等,完整覆盖后端服务、前端展示、数据初始化与部署脚本(如run.bat、clean.bat),包体大小66.15MB,结构清晰、开箱即用。已有472人学习下载,资源包含软件说明书(docx)、多版本数据库备份(.sql.gz)、字体与报表模板(.jasper/.jrxml)及LICENSE协议文件,便于快速部署、二次开发与生产环境适配,是深入理解制造业MES系统设计与工程实践的优质学习样本。
1. 苦糖果MES系统:为什么一家国产开源MES能被中小离散制造厂连夜部署上线?
去年在东莞一家做五金冲压的厂里,我亲眼看着产线主管用手机扫了扫车间平板上的二维码,三分钟内就完成了当天27台数控车床的报工、首检记录上传和异常停机标注——用的不是某国际大厂动辄百万起的定制化MES,而是「苦糖果MES」。它没有炫酷3D数字孪生大屏,不强制上云,不绑定硬件厂商,甚至没要求IT部门写一行定制代码。核心就一条:B/S结构 + 开源 + 免费 = 真正能进车间、被班组长点开就用的生产执行管理系统。这不是给CIO看的PPT方案,而是给班组长、质检员、设备维修工用的“生产操作系统”。它专为国内离散制造业中小企业设计:订单小批量多批次、工艺路线常变、设备品牌杂(发那科/广数/华中/凯恩帝混用)、人员IT基础弱、预算卡在5万以内。苦糖果不谈“智能制造”宏大叙事,只解决三件事:谁在什么设备上干了什么活、干得合不合格、出了问题能不能立刻定位到人和工序。如果你正在被ERP管不到车间、Excel手工报工错漏百出、外包MES实施周期半年起步、年服务费吃掉净利润的现实反复暴击——这篇笔记就是为你写的落地实录。
2. 从零部署苦糖果MES:B/S架构下最小可行环境搭建与初始化配置
苦糖果MES的B/S结构是它能快速落地的底层逻辑:用户端无需安装任何客户端,Chrome/Firefox/Edge甚至微信内置浏览器即可访问;服务端仅需一台普通Linux服务器(或Windows Server),对硬件无特殊要求。其开源免费属性意味着所有源码、数据库脚本、部署文档均公开可查,规避了黑盒系统无法审计、升级受制于人的风险。我们以最典型的中小厂场景为例:一台4核8G内存的阿里云ECS(CentOS 7.9)+ MySQL 5.7 + JDK 11 + Tomcat 9,全程命令行操作,无图形化安装向导干扰。
2.1 获取源码与环境校验:避开“开源但难编译”的第一道坑
首先确认服务器基础环境是否满足最低要求。苦糖果MES基于Spring Boot 2.3.x构建,依赖JDK 11而非JDK 8(这是很多老厂翻车的起点):
# 检查JDK版本(必须为11.x) java -version # 正确输出应类似:openjdk version "11.0.22" 2024-01-16 # 检查MySQL版本(5.7.20+,不支持8.0默认认证插件) mysql --version # 正确输出:mysql Ver 14.14 Distrib 5.7.44, for Linux (x86_64) # 创建专用数据库(字符集必须为utf8mb4,否则中文工艺描述会乱码) mysql -u root -p -e "CREATE DATABASE kugan_mes DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"提示:不要直接用
yum install java,CentOS 7默认装的是OpenJDK 1.8。必须手动下载Adoptium Temurin JDK 11 LTS(https://adoptium.net/zh-CN/temurin/releases/?version=11),解压后配置JAVA_HOME并加入/etc/profile。这是部署失败率最高的环节——90%的“启动报错ClassNotFoundException”源于JDK版本错配。
2.2 编译打包与Tomcat部署:跳过Maven中央仓库慢的玄学等待
苦糖果MES源码托管在Gitee(非GitHub),国内访问稳定。克隆后需修改pom.xml中的仓库镜像地址,避免编译时卡死:
# 克隆官方仓库(注意分支:主推v2.3.0稳定版) git clone https://gitee.com/kugan-mes/kugan-mes.git cd kugan-mes # 修改pom.xml:将<mirrors>节点内mirrorOf值从*改为central,url改为阿里云Maven镜像 sed -i 's|<mirrorOf>.*</mirrorOf>|<mirrorOf>central</mirrorOf>|g' pom.xml sed -i 's|<url>https://repo.maven.apache.org/maven2/</url>|<url>https://maven.aliyun.com/repository/public</url>|g' pom.xml # 清理本地Maven缓存(避免旧jar包冲突) rm -rf ~/.m2/repository/com/kugan/ # 执行编译(跳过测试节省时间,生产环境务必补测) mvn clean package -Dmaven.test.skip=true编译成功后,生成的kugan-mes-web/target/kugan-mes-web-2.3.0.war即为可部署包。将其放入Tomcat的webapps/目录前,需先删除Tomcat自带的ROOT应用,避免路径冲突:
# 停止Tomcat $TOMCAT_HOME/bin/shutdown.sh # 清空默认ROOT rm -rf $TOMCAT_HOME/webapps/ROOT # 部署WAR包(重命名为ROOT.war,实现根路径访问) cp kugan-mes-web/target/kugan-mes-web-2.3.0.war $TOMCAT_HOME/webapps/ROOT.war # 启动Tomcat $TOMCAT_HOME/bin/startup.sh此时访问http://服务器IP:8080,若看到苦糖果登录页,说明B/S服务层已通。但别急着登录——数据库尚未初始化。
2.3 数据库初始化与首账号创建:绕过“空库登录失败”的静默陷阱
苦糖果MES不提供自动建库脚本,需手动执行SQL初始化。其doc/sql/目录下包含kugan_mes_init.sql(基础表结构)和kugan_mes_data.sql(默认组织、用户、角色数据)。关键点在于执行顺序与编码:
# 进入MySQL,选择刚创建的数据库 mysql -u root -p kugan_mes # 设置客户端编码(防止SQL文件中文注释乱码导致执行中断) SET NAMES utf8mb4; # 逐条执行(不可用source命令!因文件含多段DELIMITER,source会解析失败) # 复制粘贴以下两段内容到MySQL命令行: -- 第一段:建表语句(来自kugan_mes_init.sql) CREATE TABLE `sys_user` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ... -- 第二段:初始数据(来自kugan_mes_data.sql) INSERT INTO `sys_user` VALUES (1,'admin','e10adc3949ba59abbe56e057f20f883e','管理员','13800138000',1,'2023-01-01 00:00:00'); ...参数说明:初始账号
admin密码为明文123456(MD5加密后为e10adc3949ba59abbe56e057f20f883e)。生产环境首次登录后必须立即修改,且密码策略强制8位以上含大小写字母+数字。此设计是为降低初次使用门槛,而非安全漏洞——开源系统把密码规则写死在application.yml里,你随时可改。
完成上述步骤后,浏览器刷新http://服务器IP:8080,输入admin/123456即可进入系统。此时你拥有的是一个具备完整权限的超级管理员账号,后续所有业务配置(如BOM管理、工艺路线、设备台账)均可在Web界面内完成,无需碰代码。
3. 适配离散制造业的关键配置:从“能用”到“真贴合产线”的三步落地法
苦糖果MES的通用性不等于“开箱即用”,它需要针对离散制造特性做精准配置。我们以典型冲压厂为例,拆解三个不可跳过的配置层:组织与权限模型、工艺BOM结构、设备数据采集协议。这三步走错一步,系统就会沦为电子版Excel。
3.1 构建符合车间管理习惯的组织树:拒绝ERP式扁平化
离散制造厂的组织结构天然分层:集团→工厂→车间→班组→工位。但很多MES强行套用ERP的“公司-部门-岗位”三级模型,导致班组长看不到本班组设备状态。苦糖果MES的组织管理模块支持无限级树形结构,关键在于把“班组”设为最小管理单元,并关联到具体设备:
进入【系统管理】→【组织管理】→【新增组织】
- 名称:
冲压一车间-自动冲压班组 - 类型:
班组(下拉框有预设类型,勿选“部门”) - 上级组织:选择
冲压一车间 - 负责人:选择该班组班组长账号
- 名称:
进入【设备管理】→【设备台账】→【新增设备】
- 设备编号:
CNC-001 - 设备名称:
200T自动冲床 - 所属班组:下拉选择刚创建的
冲压一车间-自动冲压班组
- 设备编号:
逻辑说明:此配置使班组长登录后,默认只看到本班组设备列表。当点击
CNC-001时,页面右侧实时显示该设备今日计划产量、已完成数、当前运行状态(运行/停机/故障)、最近一次报工记录。这才是“管理下沉到工位”的本质——不是功能堆砌,而是数据权限按物理管理边界自动收敛。
3.2 定义动态工艺BOM:应对小批量多变的工艺路线
离散制造的核心痛点是BOM和工艺路线频繁变更。苦糖果MES的工艺管理模块采用“版本化+生效日期”机制,彻底替代静态BOM:
| 物料编码 | 物料名称 | 工艺版本 | 生效日期 | 工序列表 |
|---|---|---|---|---|
| M-001 | 不锈钢支架 | V2.3 | 2024-05-01 | 下料→冲孔→折弯→焊接→喷塑 |
| M-001 | 不锈钢支架 | V2.4 | 2024-06-15 | 下料→激光切割→折弯→焊接→喷塑 |
操作路径:
- 【基础资料】→【物料管理】→ 新增物料
M-001 - 【工艺管理】→【新增工艺】→ 输入版本号
V2.3,设置生效日期2024-05-01 - 在工序列表中,为每道工序指定:
- 工序名称(如“冲孔”)
- 标准工时(分钟)
- 所需设备类型(自动关联设备台账中的“冲床”类设备)
- 是否首检工序(勾选后,报工时强制上传首件检验报告)
参数说明:当订单下达时,系统自动匹配生效日期≤订单开工日的最新工艺版本。若订单开工日为2024-06-20,则自动选用
V2.4工艺。历史订单仍沿用V2.3,确保追溯准确。这种设计让工艺变更不再需要IT人员介入,班组长在Web端点几下鼠标即可发布新工艺。
3.3 接入异构设备数据:用OPC UA+Modbus双协议覆盖95%国产设备
离散厂设备品牌杂(发那科、广数、华中、凯恩帝、台达PLC),苦糖果MES不强推私有协议,而是内置OPC UA客户端和Modbus TCP服务端双通道:
OPC UA方式(推荐用于新购设备):
在【系统管理】→【设备接入】→【OPC UA配置】中,填入设备OPC UA服务器地址(如opc.tcp://192.168.1.100:4840)、证书路径、读取节点ID(如ns=2;s=Channel1.Device1.MachineStatus)。系统每5秒轮询一次,状态自动映射到MES设备台账的“运行状态”字段。Modbus TCP方式(兼容老设备):
启动MES内置Modbus服务端(默认端口502),在设备HMI中配置Modbus主站,将设备状态寄存器(如40001)映射至MES定义的地址(如40001=运行中,40002=停机,40003=故障)。
避坑重点:国产设备常将“运行中”状态写入保持寄存器(4xxxx),但部分HMI默认读取输入寄存器(3xxxx)。需在设备侧确认寄存器类型,并在MES Modbus配置中勾选“读取保持寄存器”。曾有客户因此调试三天,最终发现是设备工程师把寄存器类型填反了。
4. 避坑指南:中小厂部署苦糖果MES的5个血泪经验
部署苦糖果MES看似简单,但在真实产线环境中,以下问题出现频率极高。这些不是文档里写的“注意事项”,而是我在17家工厂踩坑后总结的硬核排查清单:
4.1 现象:登录后首页空白,F12控制台报Failed to load resource: net::ERR_CONNECTION_REFUSED
原因:Tomcat启动后,前端静态资源(JS/CSS)未正确加载,本质是application.yml中server.servlet.context-path配置为空,但Nginx反向代理时加了/mes前缀,导致资源路径错乱。
解决:检查src/main/resources/application.yml,确保server.servlet.context-path值为空字符串(""),而非"/"或"/mes"。若需反向代理,应在Nginx配置中统一处理路径,而非在应用层硬编码。
4.2 现象:报工时提示“工艺路线不存在”,但工艺管理中明明已创建
原因:工艺版本的“生效日期”早于订单的“计划开工日期”,系统按严格日期匹配,不会自动降级到上一版本。
解决:进入【生产管理】→【订单管理】,打开对应订单,检查“计划开工日期”;再进入【工艺管理】,核对工艺版本的“生效日期”是否≤该日期。若需历史订单沿用旧工艺,可临时新增一个生效日期为订单日期的旧版本工艺。
4.3 现象:设备状态始终显示“离线”,OPC UA连接测试通过
原因:OPC UA服务器启用了匿名访问限制,而苦糖果MES默认以anonymous身份连接,部分国产PLC(如汇川H3U)需显式配置用户名密码。
解决:在【设备接入】→【OPC UA配置】中,勾选“启用认证”,输入PLC侧配置的用户名(如admin)和密码(默认常为123456),保存后重启Tomcat。
4.4 现象:手机浏览器访问正常,但微信内置浏览器白屏
原因:微信iOS版对localStorage容量限制极严(约2MB),苦糖果MES前端缓存了大量字典数据(如工序类型、检验项目),超出限制后JS执行中断。
解决:修改src/main/resources/static/js/common.js,在initDictData()函数开头添加容量检测与清理逻辑:
// 微信浏览器专用清理 if (navigator.userAgent.indexOf('MicroMessenger') > -1) { if (localStorage.length > 500) { localStorage.clear(); // 强制清空,依赖后端实时拉取 } }重新编译部署即可。
4.5 现象:导出Excel报表时中文乱码,显示为??
原因:Tomcat启动脚本未指定JVM参数-Dfile.encoding=UTF-8,导致Java进程默认编码为ISO-8859-1。
解决:编辑$TOMCAT_HOME/bin/catalina.sh,在JAVA_OPTS变量中追加:
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"重启Tomcat生效。此问题在CentOS 7上100%复现,Windows环境因系统默认编码为GBK,反而不易出现。
5. 让MES真正驱动改进:用过程数据反哺工艺优化的实战技巧
部署完成只是起点,真正的价值在于让数据流动起来。苦糖果MES不提供AI分析模块,但它开放了完整的RESTful API和数据库视图,我把最实用的三个数据驱动技巧分享给你:
5.1 实时监控看板:用免费Grafana对接MES数据库
苦糖果MES的MySQL数据库中,mes_production_order(生产订单)、mes_work_order(工单)、mes_device_log(设备日志)三张表构成核心数据链。我们用Grafana直连MySQL,构建产线实时看板:
| 面板指标 | SQL查询示例 | 业务价值 |
|---|---|---|
| 设备综合效率OEE | SELECT device_code, ROUND(AVG(CASE WHEN status='running' THEN 1 ELSE 0 END)*100,2) oee FROM mes_device_log WHERE create_time > DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY device_code | 识别低效设备,聚焦改善 |
| 当前在制订单TOP5 | SELECT order_no, material_name, plan_qty, finish_qty, ROUND(finish_qty/plan_qty*100,1) progress FROM mes_production_order WHERE status='processing' ORDER BY progress ASC LIMIT 5 | 快速定位交付风险订单 |
| 首检不合格TOP3工序 | SELECT process_name, COUNT(*) fail_count FROM mes_inspection_record WHERE result='NG' AND create_time > DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY process_name ORDER BY fail_count DESC LIMIT 3 | 锁定质量薄弱环节 |
落地要点:Grafana数据源配置时,MySQL连接URL需添加
?useUnicode=true&characterEncoding=utf8mb4参数,否则中文字段名会乱码。看板部署在厂务办公室电视墙上,班组长每天晨会前5分钟就能掌握产线健康度。
5.2 工艺参数闭环:把设备采集数据反写回工艺标准
离散制造的工艺标准常是“纸上谈兵”。我们利用苦糖果MES的API,将设备实际加工参数(如冲床压力、模具温度)自动更新到工艺版本中:
- 编写Python脚本,每15分钟调用设备日志API获取
CNC-001的平均压力值:
import requests # 调用MES设备日志API(需Token认证) url = "http://mes-server:8080/api/device/log?deviceCode=CNC-001&startTime=2024-06-20%2000:00:00&endTime=2024-06-20%2023:59:59" headers = {"Authorization": "Bearer xxxxx"} res = requests.get(url, headers=headers) avg_pressure = calculate_avg_pressure(res.json()) # 自定义计算函数- 将计算结果通过
/api/process/version/update接口,写入M-001物料当前工艺版本的“冲孔工序”备注字段:
update_data = { "versionId": "v2.4", "processName": "冲孔", "remark": f"实测平均压力{avg_pressure}MPa(近24h)" } requests.post("http://mes-server:8080/api/process/version/update", json=update_data, headers=headers)效果:工艺工程师在Web端查看
M-001的V2.4工艺时,“冲孔”工序的备注栏自动显示实测压力值。当新员工培训时,看到的不再是“压力设定值50MPa”,而是“历史实测均值48.2MPa”,大幅降低调机试错成本。
5.3 质量追溯提速:用扫码枪3秒定位问题源头
传统追溯需人工翻查纸质记录,苦糖果MES通过报工单号串联全链路数据。我们在车间部署扫码枪,实现“一扫即溯”:
扫码触发逻辑:
扫描报工单号(如WO-20240620-001)→ 调用API/api/work/order/detail?orderNo=WO-20240620-001→ 返回JSON含:{ "materialCode": "M-001", "processVersion": "V2.4", "deviceCode": "CNC-001", "operator": "张三", "firstInspection": { "result": "OK", "reportUrl": "/files/report_001.pdf" }, "defectRecords": [ { "defectType": "毛刺", "position": "边缘A区" } ] }终端展示:扫码枪连接安卓平板,用Termux运行轻量HTTP客户端,解析JSON后高亮显示:
【物料】M-001 不锈钢支架 | 【设备】CNC-001 | 【操作员】张三 | 【缺陷】毛刺(边缘A区)
我的习惯:把扫码查询页面做成PWA(渐进式Web应用),添加到平板桌面,图标命名为“追溯快查”。质检员遇到客诉时,不再跑办公室查系统,蹲在产线边扫一下单号,3秒内锁定责任人和工序。这比任何KPI考核都管用——数据透明本身就是最好的管理。
希望帮到你。
本文还有配套的精品资源,点击获取