-
定义
PPDS( Production Planning and Detailed Scheduling ) ,是APO中针对单个工厂下基于产能,工艺要求的详细排程和调度模块,包含PP生产计划排程,DS详细调度,从业务角度理解
- PP输入:特定制造工厂上的需求元素(如销售订单,预测,调拨需求)
- PP输出:考虑或不考虑约束条件的MRP计划结果(如计划订单)
- DS输入:PP/ERP/SNP 中的PP所产生的计划结果(如计划订单,生产订单)
- DS输出:考虑了调度约束条件的调过序的计划结果
备注:1.APO-DP需求预测,需求管理工具--》IBP-Demand
2.APO-SNP聚焦于供应网络的中长期做供应计划的技术模块,功能上它主要包括计划 Planning 及分配 Deployment
3.APO-GATP 是 APO 中聚焦于可以产生需求的订单元素(例如成品层级的销售订单、交货单、调拨单,半成品或原材料层级的其上层计划订单、生产订单等)的物料可用量及可承诺量的检查并对相应的订单进行承诺的技术模块
- 特点
1.支持离散制造、重复制造、流程制造等各业务形态下的生产计划排产,提供到工厂级、车间级、线体级甚至工位级以及时间上分秒级的生产计划与排序;
2.提供 Heuristics 启发式、 PPDS Optimizer 优先器遗传算法等多种优秀的算法及模型,支持订单排序、订单调度、有限无限产能、订单关系、工序关系、换模切换、线体布局网络等多种生产排产限制因素;
- 应用场景
- 自定义排序规则
在SAP的领域里,做生产计划可以由PP、PPDS都可以完成,但是做生产调度(更加细微的也更加精细的日常工作)、排序则传统的PP就无法很好地满足,此时PPDS中的Sequencing等Detailed Scheduling功能就显示出其强大的一面。 PPDS中有体统一些标准的Sequencing对排产后的结果进行调度进行排序,例如按交期优先、按产能有限能力、按Set matrix切换矩阵等等各Heuristics、Function、Optimizer ,PPDS也提供根据企业本身的业务需求来自定义的排序规则,对于自定义排序规则,用的最多的就是Heuristics,即在标准算法写增强或完全自写算法。
在DS的Heuristics(启发式)中,应用最多的排序功能依然是SAP提供的标准Re-scheduling功能,其背后最终使用的是RRP层的FM(/SAPAPO/EFPL_ONLINE_SCHEDULER)及OM层的FM(/SAPAPO/OM_ACT_SCHEDULE),所以,只需要这之前通过Enhancement等对传入OM的排序用的数据(E_CAPREQ_TAB)再行再排序再处理,例如最常用的便是在SORT中进行( /SAPAPO/SORT_SORT_FOR_DISPATCH )考虑自定义的规则。
- 启发式开发步骤(Heuristics)
- 可以参考标准模版/SAPAPO/RRP_HEUR_TEMPLATE函数模版复制函数,我这里是找的是标准计划排序启发式的函数 /SAPAPO/HEUR_PLAN_SEQUENCE 复制的
更新函数组内的代码,主要包括:运算法则;GET方法,SET方法
代码我是复制标准启发式里的:可以/SAPAPO/CDPS_HEURISTICS这个函数组下找到自己需要获取的对应方法参考,以下是我参考的部分
运算法则可以参考标准的计划排序启发式的运算法则
APO模块的LiveCache数据,都是通过存储过程到ABAP层的函数来实现访问,可以看下/SAPAPO/OM_PLANNING && /SAPAPO/OM_PLANNINGTABLE 函数组
2.配置启发式
2.1、SM30,在/SAPAPO/VHEURFNC 中维护新增的运算法则名称
2.2. /SAPAPO/CDPSC11新增启发式配置
相关数据获取函数:
- 根据资源id获取计划需求信息:/SAPAPO/OM_ACT_GET_BY_RES
CALL FUNCTION '/SAPAPO/OM_ACT_GET_BY_RES' EXPORTING is_gen_params = l_gen_params_str iv_simsession = i_simsessid it_res = l_lcresid_tab[] iv_start_time = l_plan_start iv_end_time = l_plan_end iv_constr_selection = gc_no_constr iv_peg_selection = ' ' IMPORTING et_cap_reqs = l_capreq_tab[].
- 获取容量需求数据/SAPAPO/EFPL_CAPREQ_DATA_GET
CALL FUNCTION '/SAPAPO/EFPL_CAPREQ_DATA_GET' EXPORTING i_simsessid = i_simsessid i_simverid = i_simverid i_capreq_tab = i_object_keys-capreq_key_tab TABLES e_capreq_data_tab = l_capreq_tab EXCEPTIONS not_qualified = 1 no_capreq_data_found = 2.
- 过滤固定需求信息/SAPAPO/EFPL_CAPREQ_FILTER
CALL FUNCTION '/SAPAPO/EFPL_CAPREQ_FILTER' EXPORTING iv_simsessid = i_simsessid iv_simverid = i_simverid iv_filter_fixintervalls = gc_true iv_filter_fixed_act = gc_true CHANGING c_capreq_tab = l_capreq_tab[].
- 重排需求订单Scheduling and Rescheduling of Multiple Activities
CALL FUNCTION '/SAPAPO/EFPL_ONLINE_SCHEDULER' EXPORTING i_simsessid = i_simsessid i_simverid = i_simverid i_propagation_area = i_object_keys-propagation_area i_start_planhorizon = i_object_keys-start_planhorizon i_end_planhorizon = i_object_keys-end_planhorizon i_capreq_tab = l_capreq_tab[] IMPORTING e_capreq_tab = e_changed_objects-cap_req_pt_tab[] e_pegid_tab = e_changed_objects-pegid_tab[] TABLES i_strat_sets_tab = l_strategy_parameters_tab EXCEPTIONS scheduling_error = 1 not_qualified = 2.
- 获取APO中订单信息/SAPAPO/OM_ORDER_GET_DATA
CALL FUNCTION '/SAPAPO/OM_ORDER_GET_DATA' EXPORTING is_gen_params = ls_gen_params iv_simsession = lv_simsession it_order = lt_order is_exclude_exports = ls_exclude_exports IMPORTING et_ordkeys = lt_ordkeys et_outputs = lt_outputs et_ext_outputs = lt_ext_outputs EXCEPTIONS lc_connect_failed = 1 lc_com_error = 2 lc_appl_error = 3 OTHERS = 4.
- 根据订单id获取订单工序/SAPAPO/OM_ACT_GET_BY_ORDER
- 根据追溯id获取订单物料信息/SAPAPO/DM_PEGID_GET_MATERIAL
- 根据物料id&位置id获取追溯id/SAPAPO/DM_MATERIAL_GET_PEGID
- 根据特定条件获取收货信息/SAPAPO/DM_OUTPUTNODE_SELECT(可利用此函数差固定日期的订单date_fixed = 'X')
- 获取生产订单列表/ SAPAPO/RRP_PT_PRODUCTION_LIST(事务码/SAPAPO/PPL1运行结果)
- 根据资源id获取班次信息ZPP_APO_CONV_ASTAS_TO_SHIFT(非标准函数仅记录)
- 资源名称拆分成工厂和工作中心ZPP_APO_RES_NAME_SPLIT(非标准函数仅记录)
- 火气APO工厂id /SAPAPO/DM_LOCID_GET
表名 | 描述 |
---|---|
SAPAPO/RES_HEAD | 资源抬头信息 |
/SAPAPO/RES_TXT | 资源描述信息 |
/SAPAPO/SET_MAT | 矩阵信息表(根据资源抬头表中距阵标识可以找到对于资源的矩阵配置信息) |
/SAPAPO/SET_ID | 设置矩阵中组id与组码的信息 |
/SAPAPO/RESKEY | APO中计划订单表 |
/SAPAPO/LOC | APO中位置表 |
/SAPAPO/MATKEY | APO中物料表 |
/SAPAPO/MATLOC | 物料位置 (物料ID、位置ID、生产计划员、采购组) |
/SAPAPO/MATTXT | 物料描述 (物料ID、物料文本) |
/SAPAPO/ORDKEY | 计划订单 |
/SAPAPO/ORDMAP | ORDID mapping ORDNO |
KAKO | 能力表头段(班次定义和班次顺序的分组) |
KAZY | 可用能力间隔 |
TC38A | 班次顺序 |
TC37A | 班次定义 |
TC37P | 中断计划 |
TC39A | 把替换定义和替换序列分组 |
TC39T | 分组班次定义和班次序列的文本 |
TC37S | 中断计划的文本 |
获取配置的班次信息
SELECT DISTINCT kako~kapid,kako~mosid,kazy~datub,kazy~sprog
INTO TABLE @DATA(lt_kako) FROM kazy AS kazy
INNER JOIN kako AS kako ON kazy~kapid = kako~kapid
WHERE kako~werks = @ps_planorder-locno
AND kako~name = @lv_arbpl AND kako~kapar = @lv_kapart
AND kazy~versn = '01' AND kazy~datub = '99991231'.
SELECT DISTINCT a~schgrup,a~sprog,a~schnr,b~begda,b~endda,b~begzt,b~einzt,b~paplan
FROM tc38a AS a
INNER JOIN tc37a AS b ON a~schgrup = b~schgrup AND ( b~kaptprog = a~tprog1
OR b~kaptprog = a~tprog2
OR b~kaptprog = a~tprog3
OR b~kaptprog = a~tprog4
OR b~kaptprog = a~tprog5
OR b~kaptprog = a~tprog6
OR b~kaptprog = a~tprog7 )
INTO TABLE @DATA(lt_tc38a)
WHERE a~sprog = @ls_kako-sprog AND a~schgrup = @ls_kako-mosid.
SELECT tc37p~schgrup,tc37p~paplan,tc37p~paunr,tc39t~ktext AS schgrktext,
tc39t~ktext AS paplktext,tc37p~paubeg,tc37p~pauend,tc37p~stdaz,tc37p~padauer
FROM tc37p AS tc37p
INNER JOIN tc39a AS tc39a ON tc39a~schgrup = tc37p~schgrup
INNER JOIN tc39t AS tc39t ON tc39t~schgrup = tc37p~schgrup AND tc39t~spras = @sy-langu
INNER JOIN tc37s AS tc37s ON tc37s~schgrup = tc37p~schgrup AND tc37s~paplan = tc37p~paplan AND tc37s~spras = @sy-langu
INNER JOIN @lt_kako AS kako ON kako~mosid = tc37p~schgrup
INTO TABLE @DATA(lt_resttime).
DATA(lt_resttime_final) = lt_resttime.