ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

西门子MOM与S7-1200集成实战:从工单下发到报工回传

西门子MOM与S7-1200集成实战:从工单下发到报工回传 简介这份PPT聚焦西门子离散行业MOM整体解决方案面向制造企业信息化管理者、制造运营MOM/MES项目规划与实施人员以及希望快速了解离散型智能制造概念的从业者。内容从离散制造的定义与典型行业入手解释零件装配、物料数量比例等工艺特点随后梳理OEE、UPPH、ITO、OTD等制造运营核心KPI并结合MES在全价值链中的位置描述车间作业管理、物料管理、质量管理、报表追溯等典型场景。西门子MOM产品矩阵是其中重点包括针对电子的Simatic-IT Unicam、经典框架Simatic-IT Library以及适合半导体的Camstar并简要说明各方案的适用行业与客制化程度便于读者结合行业做选型参考。资源收录1个pptx文件压缩包整体7.3MB体量不大但结构递进清晰已有58人学习可作为离散行业MOM概念入门和西门子方案概览的快速阅读材料。1. 西门子离散行业MOM不是一张PPT是一套制造语义模型你拿到“西门子离散行业MOM整体介绍.pptx”时看到的是一堆圆角矩形和箭头ERP落计划MOM拆工序PLC执行动作。真正麻烦的事PPT不会画出来——一个工单状态要经过几次接口同步才从“已下发”变成“已开工”序列号是在哪一道工序第一次生成的离散制造以单件和批次为账BOM多变、工艺路线分支多、插单频繁所以西门子MOM落地的核心不是功能清单而是对象模型和接口契约。这篇内容面向要做MOM选型或正在做实施对接的工程师也适合需要理解MOM边界的上位机与PLC开发者。先理清边界再谈参数后面几章按“理论 → 建模 → 设备联调 → 排错验证”推演。 ## 2. 西门子离散MOM的逻辑分层与对象模型2.1 三层边界ERP管事件MOM管过程PLC管动作MOM不是ERP的影子更不是PLC的日报表系统。在一个典型离散车间里三层系统的职责和粒度完全不同层级代表系统职责数据粒度计划层ERP订单交期、物料需求、成本核算生产订单、销售订单执行层西门子MOM工单拆解、工艺路线、资源派工、质量追溯、报工工单、工序、序列号、资源控制层S7-1200/1500等PLC动作执行、信号采集、报警处理轴位置、变频器电流、计数值PPT里三层很好画但口径很难对齐。典型矛盾是ERP里的“完工”指整张生产订单关闭MOM里的“完工”可能只是某一道工序的批次完成PLC里的“完成”则是机械动作循环结束。如果这三个“完成”没有映射成不同的状态值报表里就会出现对不上的产量数字。2.2 离散车间的四个核心对象工单、BOM、工艺路线、资源离散行业MOM建模时最先确认的是四个对象对象MOM里的含义离散车间里的例子工单Order一个生产任务实例带数量和交期MO-2407-001生产120台水泵BOM物料清单单件产品的物料组成和齐套规则阀体、叶轮、密封圈、标签工艺路线Routing工序顺序、并行/串行关系装配→测试→包装测试分两个台位资源Resource承担工序的物理或逻辑实体3号装配工位、1号老化柜、操作员张三BOM和工艺路线通常从PLM导入但MOM里必须维护“生产层版本”。同一个物料在ERP里是一个料号在MOM里要区分供应商批次和内部生产批次。离散行业更常以序列号作为追踪根节点产品从第一道工序就拿到唯一ID之后的测试数据、装配人员、拧紧扭矩都挂在这个ID下这是与流程行业最大的建模差异。2.3 对象关系落库从ERP取数到MOM的常见过滤逻辑MOM上游接口最常见的开发任务是写ERP临时表到MOM的映射视图。下面是一段示意性的SQL用于把ERP销售/生产订单行项目转成MOM可接收的工单结构重点不是某个具体产品而是告诉你在接口开发时哪些字段需要做类型转换和过滤-- 示意ERP临时表映射到MOM工单的取数视图 SELECT so.order_no AS mom_order_no, so.customer_po AS customer_ref, so.item_code AS product_code, CONVERT(INT, so.item_qty) AS order_qty, CONVERT(DATE, so.due_dt) AS due_date FROM erp.sales_order so WHERE so.source_system ERP_CLOUD AND so.family_code LIKE PUMP% AND so.delete_flag 0;逻辑说明order_no映射成MOM的工单号order_qty用CONVERT(INT)强制转成整数避免ERP里小数位数造成MOM在处理数量时出现尾差。source_system和delete_flag两个过滤条件是为了防止ERP侧重复推送或逻辑删除数据污染MOM工单台账。实际项目中这段逻辑通常不是直接访问ERP生产库而是通过中间库或API视图MOM端再做幂等校验同一mom_order_no只允许创建一次。3. 用TIA博途和S7-1200搭一个可被MOM识别的工位接口3.1 为什么S7-1200足够做MOM联调S7-1200承担产线刚性动作控制同时也能作为MOM的数据端点。它支持OPC UA Server固件4.0以上版本可在设备属性中直接激活。做MOM项目验证时没必要一开始就上S7-1500S7-1200足够模拟一个带启停、计数、报警的装配工位。实际项目里可能一台S7-1200通过Modbus RTU控制32台变频器MOM并不直接和变频器对话而是读取PLC聚合后的状态值这一层协议转换可以在PLC内部完成。3.2 创建全局数据块并定义变量在TIA博途里新建DB块命名为MOM_Interface勾选“优化访问”变量表如下变量名数据类型初始值作用StartCmdBoolFALSEMOM或HMI下发的启动命令StateInt00空闲10运行20完成90故障CurrentOrderString[20]当前MOM工单号GoodCountInt0合格品计数BadCountInt0不合格计数HeartbeatBoolFALSE每500ms翻转一次供MOM检测连接在OB1里写一段SCL状态机让MOM的“开始指令”和“完成信号”形成一个最小闭环// 工位状态机示意请求→执行→完成 IF MOM_Interface.StartCmd AND MOM_Interface.State 0 THEN MOM_Interface.State : 10; // 置为运行中 // 此处调用设备动作子程序例如输出启动信号 MOM_Interface.StartCmd : FALSE; // 清除重复触发 END_IF; IF MOM_Interface.State 10 AND MOM_Interface.PartDone THEN MOM_Interface.GoodCount : MOM_Interface.GoodCount 1; MOM_Interface.State : 20; // 置为完成 END_IF;参数说明PartDone是一个暂存的完成传感器信号实际项目中可能由“气缸到位扭矩值合格扫码成功”三个条件合成。StartCmd在PLC侧读取后必须立刻复位否则MOM下一次轮询时会认为又是一次新指令导致同一工单被重复上报。State字的值要跟MOM侧的枚举字典保持一致例如故障状态统一为90不能一处用9另一处用99。3.3 启用OPC UA并用Python读取变量TIA博途里双击PLC的“设备组态”在“属性→OPC UA→服务器”中勾选“激活OPC UA服务器”端口默认4840认证方式先选“匿名”做联调上线前再改成用户名口令。然后可以用UaExpert浏览到DB变量也可以写一段Python脚本验证MOM链路from opcua import Client client Client(opc.tcp://192.168.0.10:4840) client.connect() node client.get_node(ns3;sProgram.MOM_Interface.GoodCount) count node.get_value() print(current good count:, count) client.disconnect()逻辑说明opcua是常用的OPC UA客户端库节点ID里的命名空间和标识符必须与PLC实际发布的一致不能凭记忆写死。建议先用UaExpert浏览一次把NodeId复制到脚本里。真实场景中MOM端很少直接逐个轮询PLC而是通过边缘网关聚合多个工位再以MQTT或REST接口供MOM处理因为S7-1200的OPC UA连接数有限直接对接大量客户端会占满连接资源。4. 工单下发与报工回传MOM和PLC之间的参数手册4.1 一次完整的离散执行循环常见流程如下ERP下发工单MOM接收并检查BOM齐套。MOM按工艺路线拆分将OP10装配任务分配到3号工位。PLC在HMI上显示工单号操作员按下“开始”。PLC执行装配动作完成时报警状态机上报GoodCount和BadCount。MOM收到报工数据后生成序列号并把质量结果写入追溯库。从集成视角看第4步和第5步最消耗调试时间。真正需要注意的细节是PLC抛出的“完成”必须只触发一次报工MOM侧要用工单号工序号序列号做唯一约束靠网络重试机制去做兜底。4.2 核心参数表参数建议值作用OPC UA发布间隔100~200ms控制状态刷新速率太短会增加PLC负载心跳位翻转周期500~1000ms让MOM侧能快速识别链路断开启动指令超时15~30s防止StartCmd下发后设备无响应导致工单卡住报工缓存条数1000条断网时PLC本地缓存恢复后批量补传序列号规则产线号日期流水用于追溯和跨系统对账参数说明心跳位不能用Bool只置一次必须在OB1里加一个定时器让它周期翻转。MOM如果连续3个周期没有看到心跳翻转就把该资源状态置为离线。启动指令超时是MOM侧参数指从发送StartCmd到收到第一个完成信号之间的最大等待时间超时后应触发重复下发或转人工。4.3 用REST API创建工单的示例以MOM网关提供的OData接口为例下发工单的请求可以这样写curl --location https://mom-gw.example.com/opcenter/odata/work-orders \ --header Content-Type: application/json \ --data { orderNo: MO-2407-001, productCode: PUMP-100, qty: 120, priority: 1, resourceGroup: ASSY-LINE-01, baseOperation: OP10 }逻辑说明orderNo是MOM主键重复提交同一orderNo时接口应返回409 Conflict或直接更新不能生成第二条工单。resourceGroup指定的是资源组而非单个资源真正的工位分配由MOM调度逻辑按空闲状态选择。上线前建议先用curl -i查看响应头确认接口的幂等键和鉴权方式否则联调阶段会频繁出现重复工单。4.4 用“请求-应答”替代简单写置位直接在MOM和PLC之间写一个StartCmd位太脆弱原因在于网络抖动会让一条指令丢在中间。更可靠的做法是命令缓存加Ack回执// 握手逻辑MOM下发CmdPLC执行后回写Ack IF MOM_Interface.Cmd 0 AND MOM_Interface.Ack MOM_Interface.Cmd THEN CASE MOM_Interface.Cmd OF 1: // 启动 MOM_Interface.State : 10; 2: // 暂停 MOM_Interface.Paused : TRUE; 3: // 查询 ; END_CASE; MOM_Interface.Ack : MOM_Interface.Cmd; MOM_Interface.Cmd : 0; END_IF;参数说明Cmd和Ack必须放在同一个DB块里并允许MOM侧同时读取。MOM发送Cmd1后只有Ack1才能确认指令已到达PLC此时MOM才能把工单状态置为“已启动”。Ack在MOM读取后要由下一个接口调用清空否则下一次Cmd2时Ack仍等于1会与Cmd2不匹配从而触发错误判断。这个范式比简单置位多两个变量但能省下大量现场排查时间。5. 上线前用小批量压测验证MOM追溯口径离散MOM上线前最值得做的验证是“回溯端到端追溯”。选一个工单数量定为50台产品在装配工位执行到一半时把网线拔掉过30秒再恢复然后查看MOM追溯数据是否缺号、是否有重复序列号。可以用下面这段Python脚本快速核对序列号连续性import requests resp requests.get( https://mom-gw.example.com/opcenter/odata/serial-units, params{ $filter: workOrderNo eq MO-2407-001, $select: serialNo,lastOperation, $orderby: serialNo asc, $top: 200 }, timeout10 ) serials [int(row[serialNo]) for row in resp.json()[value]] missing [i for i in range(serials[0], serials[-1] 1) if i not in set(serials)] print(missing serial numbers:, missing)逻辑说明这个脚本只能用在“单个资源内序列号自增”的场景。如果一条产线有两个测试台位并行报工序列号会交错增长缺号不代表数据丢失需要先确认MOM的序列号生成规则是否覆盖多资源并发。脚本里$top200是为了避免一次拉全量大记录真实项目还要配合分页游标。压测后重点看两个对比值一是PLC侧的GoodCount和MOM侧报工成功条数是否一致二是断网期间PLC本地缓存的报工记录在恢复后是否全部上传。如果MOM侧数量大于PLC侧说明接口存在重复请求要检查幂等键如果MOM侧小于PLC侧说明断网缓存有丢失要检查PLC的上传确认逻辑。最后建议在MOM数据库层对报工表增加唯一索引字段包含work_order_no, operation_no, resource_id, event_time四项。这样即使接口层漏掉幂等判断数据库也会拒绝重复记录相比在代码里写重试逻辑更可靠。对于多工位并行产线还可以再加一个sequence_no字段用来对比同一时刻不同工位产生的序列号区间。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进