PPDS 启发式(排产规则)

  •  定义

  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
  1.       可以参考标准模版/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/RESKEYAPO中计划订单表
/SAPAPO/LOCAPO中位置表
/SAPAPO/MATKEYAPO中物料表
/SAPAPO/MATLOC  物料位置    (物料ID、位置ID、生产计划员、采购组)
/SAPAPO/MATTXT 物料描述    (物料ID、物料文本)
/SAPAPO/ORDKEY计划订单
/SAPAPO/ORDMAPORDID 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.

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值