3. ERP与PLM系统概览
在ThingWorx集成项目中,真正决定集成方案可行性的,往往不是ThingWorx本身,而是被集成的ERP与PLM系统“长什么样”。ERP与PLM虽然都服务于制造企业,但它们的数据模型、接口风格和扩展能力差异很大。理解这些差异,才能判断哪些数据该由谁做主、通过什么接口交换、以什么频率同步。
一、ERP的数据模型:以“业务凭证”为中心
SAP与Oracle ERP的数据模型都围绕业务凭证展开。SAP的核心对象包括物料主数据(MARA/MARC)、客户主数据(KNA1)、供应商主数据(LFA1)、销售订单(VBAK/VBAP)、采购订单(EKKO/EKPO)、生产订单(AUFK/AFKO)以及会计凭证(BKPF/BSEG)。这些对象之间通过主键和外键形成强关联,例如销售订单行项目通过VBELN与抬头关联,通过MATNR与物料主数据关联。Oracle E-Business Suite或Oracle Fusion则使用类似结构,如MTL_SYSTEM_ITEMS_B表示物料、OE_ORDER_HEADERS_ALL表示销售订单头、PO_HEADERS_ALL表示采购订单头。
ERP数据模型的关键特征是“事务性强、状态驱动”。一张销售订单会经历创建、审批、发货、开票、收款等多个状态,每个状态变化都对应数据库中的字段更新或新凭证生成。集成时如果只同步订单头,往往无法支撑后续业务,必须同时考虑行项目、状态字段和关联凭证。
二、PLM的数据模型:以“产品结构”为中心
Windchill与Teamcenter的数据模型则围绕产品、版本、BOM和文档展开。Windchill的核心对象包括产品(Product)、部件(Part)、CAD文档(EPMDocument)、BOM(Bill of Materials)以及变更对象(Change Notice/Change Request)。Teamcenter使用Item、Item Revision、BOM View Revision、Dataset、Form等对象。两者都强调版本与迭代:一个部件可能有多个版本(Revision),每个版本下又有多个迭代(Iteration),只有发布状态(Released)的版本才允许被下游ERP使用。
PLM数据模型的关键特征是“结构性强、版本敏感”。BOM不是一张平表,而是多层父子关系;一个装配件下可能挂载多个子件,子件又有自己的版本和数量。集成时如果忽略版本和发布状态,就可能把未定稿的BOM同步到ERP,造成生产用料错误。
三、API接口风格与集成能力对比
SAP提供多种接口方式。传统上使用RFC/BAPI进行函数级调用,IDoc用于异步批量传输,SOAP Web Service用于跨系统集成。S/4HANA时代则主推OData服务,通过Gateway暴露标准API,例如API_SALES_ORDER_SRV用于销售订单、API_PRODUCT_SRV用于产品主数据。Oracle ERP Cloud提供REST API,如销售订单使用salesOrders资源,物料使用items资源;Oracle EBS则更多依赖PL/SQL API和并发程序。
Windchill提供REST API(如/v1/parts、/v1/bom)和SOAP服务,支持通过OData查询部件与BOM。Teamcenter提供SOA接口(Teamcenter Services)和REST API,常用服务包括createItem、getItemFromId、expandBOM等。两者都支持事件订阅或工作流触发,可在对象状态变更时向外推送消息。
从集成能力看,ERP接口偏向“事务提交与查询”,PLM接口偏向“结构读取与版本发布”。ThingWorx在中间需要完成三件事:协议适配(REST/SOAP/IDoc)、数据映射(字段对应与编码转换)、状态同步(发布状态与业务状态对齐)。
四、集成中的关键判断:谁做主、何时同步
物料主数据通常由PLM创建、ERP接收。PLM中部件发布后,通过ThingWorx将物料编码、描述、单位、版本同步到ERP物料主数据。BOM则由PLM发布、ERP接收,但ERP可能根据工厂差异做本地调整,因此需要区分“工程BOM”与“制造BOM”。销售订单、采购订单、生产订单由ERP创建,PLM通常只读取订单状态用于项目跟踪。
同步时机上,建议采用“事件驱动为主、定时补偿为辅”。PLM发布变更时触发ThingWorx服务,实时推送至ERP;ERP订单状态变更时通过OData轮询或IDoc触发回传。对于大批量历史数据,使用定时批处理,并记录同步日志与失败重试队列。
五、示例:物料与BOM同步的字段映射
假设Windchill中一个部件发布,需要同步到SAP。Windchill字段与SAP字段的典型映射如下:Part Number → MATNR,Part Name → MAKTX,Base Unit → MEINS,Revision → ZZREV(自定义字段),Lifecycle State → ZZSTAT。BOM同步时,父件Part Number → MATNR,子件Part Number → IDNRK,用量 → MENGE,单位 → MEINS。ThingWorx在映射时还需处理编码规则:如果SAP物料编码有长度限制或前导零要求,需要在转换服务中补齐或截断。
// ThingWorx 服务示例:Windchill Part → SAP MATNR 映射
var partNumber = source.PartNumber; // 如 "A-1001"
var revision = source.Revision; // 如 "B"
var matnr = partNumber.replace("-", ""); // 去连字符 → "A1001"
matnr = matnr.padStart(18, "0"); // SAP 18位补齐
result.MATNR = matnr;
result.MAKTX = source.PartName;
result.MEINS = source.BaseUnit;
result.ZZREV = revision;
result.ZZSTAT = source.LifecycleState; // Released / InWork
同步完成后,在SAP中用MM03查看物料主数据,确认基本视图和工厂视图已生成;用CS03查看BOM,确认父子件和用量正确。如果SAP返回错误,常见原因包括物料编码重复、单位不在允许范围、BOM父件未先创建。ThingWorx应记录错误响应并触发重试或告警。
六、集成能力评估要点
在项目初期,建议对每个系统做一次接口能力盘点:ERP是否开放OData或仅支持IDoc;PLM是否支持REST或只能通过SOA;接口是否有频率限制;是否支持增量查询;认证方式是什么(OAuth、Basic、证书)。这些信息直接决定ThingWorx集成服务的轮询周期、批量大小和错误处理策略。只有把ERP与PLM的数据模型、接口风格和集成边界摸清楚,后续的ThingWorx建模与编排才有可靠依据。