资讯详情

资讯详情

MES与ERP批处理接口设计:定长文件、互斥防重与对账

简介这份《MES 接口设计说明书》面向正在实施或评估 SAP R/3 与制造执行系统MES集成方案的技术顾问、接口开发人员与项目组提供 MELEBUS-BMAS 模板下 MES 连携功能的接口设计参考。文档围绕制造指图数据抽取与实绩数据计上这两条核心链路说明系统化对象范围、适用前提条件、R/3 侧与 MES 侧接口职责划分以及 R/3 与 MES 之间的排他控制与同步处理机制并给出想定业务流程图。文件级规格部分涵盖接口文件一览与各文件字段定义程序规格章节则针对 ZMAF001、ZMAF005 两个 Add-on 程序展开处理逻辑说明末尾附参数设定要点。资源包共 1 个 doc 文件约 178KB为日文原版设计书结构按系统规格、文件接口规格、程序规格、参数设定分章便于按模块检索。已有 2668 人学习下载适合作为接口雛型方案设计、字段对齐与联调排错时的对照材料。1. 需求先立住一份一天跑两次的文本文件撑起 MES 接口做 MES 接口设计最容易走偏的一步是先选技术再谈业务一上来就规划消息中间件、实时双向同步可现场只有一天两次的批处理窗口方案做得像给自行车装涡轮。这套 MES 接口反着来——ERP 与 MES 之间只用共享目录里的定长文本文件握手一天跑一到两次接口层不做任何业务判断只负责把制造指图整批送出去、把 MES 汇总好的投入与完成实绩整批收回来。它要解决的是两个系统都不愿为对方改代码的现实问题ERP 侧只在自己的批处理里发指图、收实绩MES 侧按自己的节拍取文件写文件双方靠一份管理文件互斥、靠唯一键去重。适合正在做 MES 接口课程设计、毕业设计或者要给一个只有日批窗口的车间出交付方案的人。2. 总体设计两条链路、四类接口文件与两份管理文件2.1 职责切分ERP 只做抽出和计上中间层不做判断系统化对象范围只有两块这一点必须在方案第一页就写死一是制造指图数据抽出处理ERP 把指图头信息和构成品目数据打成接口文件二是实绩数据计上处理把 MES 输出的投入实绩、完成实绩计上到 ERP 的制造指图作业实绩上。MES 侧的接口功能不在这套 addon 范围内。这句话看起来像免责声明实际上是验收线——写过一次交付方案就知道不写清楚评审时一定有人问「MES 那边你实现了什么」而你答不上来。接口层不做业务判断具体落在三条约束上。第一不做单位换算数量和单位原样透传换算责任在各自系统的主数据里。第二不合并、不分割指图制造上的批次合并与分割全部由 MES 侧按「一个制造指图」为单位处理完再汇总回来。第三不改数量计上之后要改实绩值走 ERP 自己的作业确认界面接口不提供变更通道。链路触发方输入输出成功标志指图抽出ERP 批处理指图头、构成品目指图数据文件、构成数据文件文件落盘 指图用户状态置位指图取信MES 批处理上两个文件MES 内部工单文件处理完并删除实绩输出MES 批处理MES 汇总结果投入实绩文件、完成实绩文件文件落盘实绩计上ERP 批处理上两个文件ERP 作业实绩计上成功 文件删除生产方式是「会发制造指图的生产方式」处理周期 12 次/天两端 OS 限定在 Windows 与 UnixMES 侧独立控制、不受 ERP 操作影响。这几条合起来决定了选型没有实时性要求就不需要中间件两端都是批处理就必须有文件级的互斥和去重。这是整份方案的地基。2.2 接口文件设计定长文本、透传不转码、键落在记录里接口文件用 Windows 格式或 Unix 格式的纯文本换行码和逻辑路径都做成变体参数不写死在程序里——这一点后面会反复提到是换环境时最常见的翻车点。文件不做代码转换按透传数据交给对方所以双方必须提前约定同一套字符编码别等联调时才发现混排乱码。四类文件的键设计是整个方案的核心因为「重送」在文件接口里是常态而不是异常接口文件方向内容唯一键删除方指图数据ERP→MES指图头号、类型、品目、数量、着手/完成日指图号MES 取信后构成数据ERP→MES构成品目、必要量、单位指图号 品目 项目号MES 取信后投入实绩MES→ERP投入品目、数量、计上日指图号 作业号 品目 计上日 连番ERP 计上后完成实绩MES→ERP确认出来高、确认不良、预测完了日、部分/最终区分指图号 作业号 确认连番ERP 计上后文件写入侧永远是追加模式不覆盖、不定位改写删除动作只发生在读入侧并且要等整批处理完才删。这个「写的人只管加、删的人只管删」的分工避免了两个系统同时动同一个文件的指针。字段定义上指图数据文件通常这样排字段长度类型说明指图号12CHAR主键左对齐补空格指图类型4CHAR用于区分通常/特急/手直品目代码18CHAR成品计划数量13NUMC含 3 位小数右对齐补零单位3CHAR不换算原样传着手日8CHARYYYYMMDD完了日8CHARYYYYMMDD作业数3NUMC该指图下的作业条数提示定长文件一定要在方案里附一份「字段位置表」标清起止位。只写字段名和长度对接方按分隔符去切联调时必然对不上。2.3 管理文件与互斥两个系统怎么不打架接口文件通过共享网络被两端同时访问靠文件系统自身没有可靠的互斥手段所以方案里单独设了管理文件只有两类指图处理和实绩处理。规则很简单处理中创建管理文件管理文件不存在时才允许执行处理完删除。* 接口管理文件处理前创建处理完删除 * iv_lock_type ORDER指图处理/ ACT实绩处理 FORM f_lock_interface USING iv_lock_type TYPE char10 CHANGING cv_rc TYPE sy-subrc. DATA: lv_path TYPE string, lv_msg TYPE string. CONCATENATE gv_if_dir /ZMES_LOCK_ iv_lock_type INTO lv_path. 存在即视为对方处理中直接退出不改任何数据 OPEN DATASET lv_path FOR INPUT IN TEXT MODE ENCODING DEFAULT MESSAGE lv_msg. IF sy-subrc 0. CLOSE DATASET lv_path. cv_rc 4. 4 对方处理中本次跳过 EXIT. ENDIF. 不存在则创建并写入本侧标识便于残留时人工判断是谁留下的 OPEN DATASET lv_path FOR OUTPUT IN TEXT MODE ENCODING DEFAULT MESSAGE lv_msg. IF sy-subrc 0. cv_rc 8. 8 创建失败多为目录权限或路径不存在 EXIT. ENDIF. TRANSFER |{ sy-mandt }{ sy-uname }{ sy-datum }{ sy-uzeit }| TO lv_path. CLOSE DATASET lv_path. cv_rc 0. ENDFORM.这段的关键在返回码语义0 表示拿到锁继续跑4 表示对方在处理、本次安静退出8 表示环境有问题、必须报警。三者混在一起运维就分不清「正常跳过」和「权限炸了」。参数 gv_if_dir 取自变体里的逻辑路径不写死物理路径写入管理文件的那行标识包含集团、用户、日期、时间出问题时能直接看出是哪台机器哪个账号留下的。同步规则还有两条要一起写进方案一是每个接口文件都带唯一键读入侧按键判断是否为重送数据重送的直接跳过不报错二是一旦处理完成的交易数据不提供变更接口要改就各自在自己系统里手工处理。第二条听起来很土但它是这套方案能长期稳定运行的前提——留了变更接口就等于把两边的数据一致性交给一个没有事务的文本文件。3. 制造指图抽出接口从抽出条件到状态回写3.1 业务前提把颗粒度和责任边界先钉死抽出的前提条件有五条每一条都对应一个后期变更需求的入口写在设计说明书里能挡掉一半扯皮。制造指图与计划手配是一对一关系不做一拖多。指图的创建单位就是 ERP 里做工程计划的单位通常落到日、品目这一层。一个制造指图可以包含多个作业但副作业不支持——这一条最容易被忽略现场真有副作业时抽出会静默少数据。指图发号由 ERP 完成计划立案、计划手配创建、工程割付、指图发号都在 ERP 侧做。但发号之后的重发、再印刷、变更、移动单位分割、现品票发行打印全部由 MES 侧管理ERP 侧抽出后基本不再变更。这意味着一件事MES 侧改了工单ERP 是不知情的两边对不上是设计内的不是 bug。指图类型要通知给 MES。通常的指图和特急、手直修正的指图靠指图类型字段区分方案里建议把这三类做成固定的类型码别让现场自己扩展。ERP 侧作业与 MES 侧作业是一对一。制造上要拆分或合并由 MES 侧管理并且要求 MES 侧在回传实绩前先按制造指图、作业汇总好不按拆出来的小单位分别计上。这条不写死实绩回来就是一地碎数据。3.2 抽出条件与两种管理方式的取舍抽出的硬条件有四条同时成立着手日落在参数文件指定的日期范围内从当天起 N 日以内、系统状态为已发号且未完成或部分完成、未被取消的有效指图、以及下面二选一的管理条件。二选一的管理方式是这套方案里比较有特色的设计两种都实现靠启动时的选择变体择一方式判定依据优点代价日志文件重复检查送信日志文件里不存在该指图号不动 ERP 业务数据纯接口层可回滚日志文件要长期维护清理策略错了就重发用户状态管理指图用户状态 SEND 未置位状态跟着单据走可查可审计会写 ERP 业务对象回滚要人工清状态原型验证阶段我一般用日志文件方式因为改起来干净删掉日志就能重来正式运行切到用户状态方式因为半年后有人问「这张指图到底发没发出去」只有状态字段能回答。3.3 程序骨架抽出、写文件、回写状态REPORT zmaf001. 以下为骨架代码表名与字段按本项目 ERP 版本对应替换 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS: p_days TYPE i DEFAULT 3 OBLIGATORY, 着手日范围今天起 N 日内 p_mgrp TYPE c DEFAULT S RADIOBUTTON GROUP mg, S用户状态 / L日志文件 p_crlf TYPE c DEFAULT W RADIOBUTTON GROUP mg2, WWindows / UUnix 换行码 p_logd TYPE i DEFAULT 30. 日志保留天数 SELECTION-SCREEN END OF BLOCK b1. START-OF-SELECTION. PERFORM f_lock_interface USING ORDER CHANGING gv_rc. CHECK gv_rc 0. 非 0 一律不处理避免和 MES 侧撞车 PERFORM f_select_order. 1) 取候选指图 构成品目 PERFORM f_write_file. 2) 先落盘追加模式 PERFORM f_write_log. 3) 记录级日志 开始/终了日志 PERFORM f_set_send_status. 4) 落盘成功后才回写状态 PERFORM f_unlock_interface USING ORDER.四个 PERFORM 的顺序不是随手排的尤其第 2 步和第 4 步先写文件、再回写状态。反过来写一旦中间异常退出指图状态已经是「已送信」文件里却没有这批指图就永久丢了——这是我在一个模拟项目里真踩过的坑丢了两天的工单靠对比 MES 侧的接收记录才发现。p_days 决定抽出窗口通常设 3 天覆盖周末和一天的处理延迟设太大候选集膨胀日志难读设太小跨周末的指图漏抽。p_logd 控制日志保留期别设成 0 或负数很多现场就是这么把日志清空的。抽出的实际写入是追加模式文件存在就追加不存在就新建再追加OPEN DATASET gv_path FOR OUTPUT IN TEXT MODE ENCODING DEFAULT MESSAGE gv_msg. IF sy-subrc 0. 失败要写进终了日志并置错误返回码不能静默跳过 PERFORM f_log_error USING OPEN FAIL gv_path gv_msg. EXIT. ENDIF. LOOP AT lt_record INTO ls_record. 定长拼接数字右补零字符右补空格长度严格对齐字段位置表 TRANSFER ls_record-line TO gv_path. ENDLOOP. CLOSE DATASET gv_path.写入部分只有一个细节值得单独说定长拼接一定做成一个独立 FORM输入是内表输出是拼好的行别在循环里现拼。后期加字段时改一处就够。3.4 日志与抽出后处理日志分两类职责不同。开始、终了文件只在处理开始和结束时各写一行记录时间戳、处理种别、抽出件数、返回码运维看这个判断「今天跑没跑」。记录级日志按行记录处理内容包括被跳过的指图和跳过原因排错时看这个。抽出正常完成后才把抽出到的指图用户状态 SEND 置位。置位要用封装好的状态变更函数不要直接改状态表——直接改表在审计上是过不去的而且下次 ERP 升级就得重写。还有一条容易漏抽出过程中如果检测到 MES 侧接口正在处理管理文件存在本次输出整体不执行但要写一条终了日志说明「因对方处理中跳过」。不写这条第二天有人问为什么少了一批你只能靠猜。4. 实绩数据计上接口从 MES 汇总口径到 ERP 作业确认4.1 口径先对齐累计实绩还是日别实绩MES 侧回传的实绩有两种口径方案里用变体让启动时选一种一是作业累计实绩每次回传的都是从开工到现在的累计值二是作业日别实绩每次回传当天新增部分。这两种口径对 ERP 侧的处理完全不同。累计口径下ERP 要拿本次值减去已计上值才能得到增量减出来是负数就说明 MES 那边改过数得报错日别口径下直接累加就行但对账时必须保证 MES 侧不漏日期。选哪种不是技术偏好是现场管理方式决定的日结的车间用日别口径更自然跨日连续生产的用累计口径更安全。不管选哪种MES 侧都要按制造指图单位、日为单位做集计。批次合并或分割在 MES 侧完成ERP 侧收到的永远是「一个制造指图一个作业」的汇总数不接收拆分后的小单位。4.2 防二重计上工作库暂存 处理済标记 删除时机计上处理最怕的不是失败是失败后重跑把数据计了两遍。方案里的做法是加一层工作库接口文件里的每一行先带着唯一键落到工作库主键挡住重复再对本次新插入的行调用 ERP 的业务接口。 1) 先落地到工作库唯一键做主键重复执行时 INSERT 直接被挡回 LOOP AT lt_act INTO ls_act. ls_work-key ls_act-bwart_key. 指图号作业号品目计上日连番 ls_work-stat N. N未计上 E错误 C已计上 INSERT zmes_act_work FROM ls_work. IF sy-subrc 0. APPEND ls_work TO lt_new. 只处理本次真正新插入的 ENDIF. ENDLOOP. COMMIT WORK AND WAIT. 2) 只对新增行调用 ERP 业务接口 LOOP AT lt_new INTO ls_work. IF ls_work-ptype I. 投入实绩 - 发料 CALL FUNCTION BAPI_GOODSMVT_CREATE 移动类型 261 ELSE. 完成实绩 - 作业确认 CALL FUNCTION BAPI_PRODORDCONF_CREATE_TT ENDIF. IF sy-subrc 0. ls_work-stat C. ELSE. ls_work-stat E. 失败行留库不进下一批 ENDIF. UPDATE zmes_act_work FROM ls_work. ENDLOOP. COMMIT WORK AND WAIT.工作库的字段至少要包括唯一键主键、指图号、作业号、实绩种别、数量、计上日、状态、错误消息。状态机只有三个值N 到 C 或 N 到 E不做 E 到 C 的自动重试——错误行必须人工看完日志再决定怎么处理自动重试只会把同一个错误刷一百遍。整批处理完、并且只有全部成功或已明确标错误之后才删除接口文件。异常退出时文件保留下次跑的时候靠工作库主键挡住已处理的部分只补没处理的这就是「后悔药」。4.3 必须报错的三类数据计上接口的报错规则要写得很细否则现场会把它当成系统不稳定错误类型判定条件处理方式是否影响整批背景冲洗品目投入实绩该品目在指图上标记为背景冲洗写错误日志不计数否逐行跳过BOM 外品目投入实绩品目不在指图发号时点的 BOM 里写错误日志不计数否逐行跳过重复唯一键工作库已存在同键记录静默跳过只记信息日志否第一条的原因是背景冲洗品目的投入由 ERP 在作业确认时自动冲销MES 再报一次就是重复。要改这类品目的投入数量只能从 ERP 的作业确认界面输。第二条的根因在主数据实绩里的构成品目必须在指图发号时点就已经登记在 BOM 里发号后再加的不认。这两条都属于「数据问题不是程序问题」所以逐行跳过、写日志、不影响同批其他行。重复唯一键要区别对待这是重送是设计内的正常现象不能报错报错会让运维每天收到几十条假告警最后没人看日志了。4.4 实绩侧的排他与时序实绩方向用独立的管理文件和指图方向不共用。这样安排的原因是两个方向的处理窗口可以重叠ERP 在凌晨抽指图的同时MES 可以在写实绩两边操作的是不同文件没必要互相阻塞。共用一个锁文件反而把并行度压没了。时序上MES 侧按制造指图单位把投入和完成实绩汇总好同一批次、同一时点写入接口文件。完成数据里必须带部分确认/最终确认的区分否则 ERP 侧无法判断这张指图是不是真的做完了会一直挂在未完成状态。计上完成之后不提供变更通道。要在 ERP 侧改实绩值走各系统自己的界面手工处理。这条前面提过一次在实绩侧尤其重要——实绩是成本核算的输入接口层偷偷改数账就没法对了。5. 避坑与常见问题排查联调阶段最容易翻车的五处5.1 文件与编码类**换行码不一致整个文件被读成一行。**现象是 MES 侧只取到一条记录内容是几千个字符连在一起字段全部错位。原因是 ERP 侧变体选了 Windows 换行MES 侧按 Unix 换行解析或者反过来。解决方法是把换行码做成启动变体两端在联调前先在方案里对一次并且写一条最简验证抽出三张指图用十六进制工具看行尾是 0D0A 还是 0A。别靠肉眼看肉眼看不出。**逻辑路径写死在程序里换个环境就炸。**现象是测试环境一切正常上生产第一天就报文件打不开。原因是路径常量写死成测试目录生产目录结构不一样。解决方法是路径、换行码、日志保留期全部进变体表程序只读变体。这条看起来是常识但我在三个不同的模拟项目里都见过同一个错误。5.2 状态与重复类**SEND 状态回写太早指图丢了没人发现。**现象是 MES 侧说没收到某批工单ERP 侧查状态显示已送信。原因是程序先置状态再写文件中间异常退出。解决方法是严格保证「文件 CLOSE 成功 → 写终了日志 → 再置状态」中间任何一步失败就整批回滚不置位。**重送数据被二次计上账对不上。**现象是同一张指图某天的完成数量翻倍。原因是读入侧只按文件判断是否处理过文件删了或者换了个文件名就当成新数据。解决方法是唯一键必须落到工作库主键上不能只靠「文件是否已处理」这个粗粒度标记。5.3 排他与时间窗类**管理文件残留之后所有批次都静默跳过。**现象是连续几天没有任何数据往来但所有程序返回码都是成功。原因是某次处理被强制终止管理文件没删掉之后每次跑都判定「对方处理中」安静退出而且日志里只写一句「跳过」没人会去看。解决方法是管理文件里写时间戳超过阈值比如 4 小时自动判定为残留并清理同时在终了日志里把这个动作标成告警级别。**检查和创建之间有窗口两端同时进入。**现象是极偶发的一次重复计上查日志看不出来。原因是「判断管理文件不存在」和「创建管理文件」是两个动作两端刚好卡在这个缝隙里。共享文件系统上这个问题没有完美的原子解通常的做法是退一步给两个方向定死固定的处理时间窗比如 ERP 凌晨 2 点抽指图、MES 凌晨 3 点取信、MES 凌晨 4 点写实绩、ERP 凌晨 5 点计上靠时序错开降低概率再用管理文件兜底。方案里把时间窗写成一张表比讲一堆理论有用。6. 验收与答辩用一张对账表证明接口真的跑通了这套接口的验收不能靠「点一下能跑」得靠对账。我一般分三段推先只开指图抽出、不开计上确认 ERP 抽出的指图数和文件行数一致再只开计上、不开抽出拿一份准备好的实绩文件打进去确认工作库、ERP 作业实绩、错误日志三者数量闭合最后两个方向同时开跑满三个完整日批周期看有没有互相阻塞。对账表按阶段拆开每一项都要能算出确定的数字对账项取数来源期望关系指图抽出件数ERP 抽出日志「终了」行 指图数据文件行数构成数据条数构成数据文件行数 抽出指图对应的 BOM 展开条数MES 取信件数MES 侧接收日志 指图数据文件行数实绩文件行数投入 完成实绩文件行数 MES 汇总输出的记录数计上成功数工作库 statC statE 实绩文件行数状态置位数指图用户状态 SENDON 的件数 指图抽出件数最后一行的关系最容易被跳过但它是答辩时最能加分的一条抽出成功不等于状态回写成功两者必须分开点数。用一段 SQL 就能把差异拉出来-- 计上闭合性检查文件行数 成功数 错误数差额必须为 0 SELECT COUNT(*) AS file_rows, SUM(CASE WHEN stat C THEN 1 ELSE 0 END) AS posted, SUM(CASE WHEN stat E THEN 1 ELSE 0 END) AS errored, COUNT(*) - SUM(CASE WHEN stat IN (C,E) THEN 1 ELSE 0 END) AS pending FROM zmes_act_work WHERE post_date BETWEEN 20240101 AND 20240103;语句里的 pending 就是「卡住的」记录正常情况下应该恒为 0。不为 0 只有两种可能程序跑一半被杀或者状态更新丢事务。这两种都必须查不能当成偶发。答辩环节通常会被问三个问题提前准备好答案比现场想强得多。为什么不用消息中间件——因为处理周期是一天一到两次两端都是批处理引入中间件要多维护一套东西收益为零。二重计上怎么防——三层文件唯一键、工作库主键、ERP 业务接口的重复检查任何一层生效都不会重复。MES 侧改了工单 ERP 怎么知道——不知道也不打算知道责任边界就是发号之后由 MES 管理变更走各自系统手工处理方案里写死了。从那以后我每次做接口类方案验收章节都强制先写对账表再写实现顺序反了就会变成「功能都做了但没法证明它对」。希望这套结构能帮你把方案交得踏实一点。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →