生産スケジューラAsprovaのスケジューリングロジック

2011/05/11

生産スケジューラAsprova

生産スケジューラAsprovaは、オーダーリストまたは作業リスト生成フェーズの後に、コマンド実行フェーズでオーダ展開コマンドがBOMを参照しながら作業入力指図と作業出力指図を生成し、オーダ割付/紐付けコマンドが作業使用指図を生成することで資源に対する割付を行います。

自動車組み立て工程

インドネシアの生産スケジューラ

インドネシアの日系製造業においても生産管理システムが導入される事例が増えましたが、機械や設備の負荷を考慮した実現可能な生産計画作成という生産管理の主要課題については、Excelを使ったマニュアル作業で行われているのが現状で、今後生産スケジューラのニーズは高まるものと思われます。

続きを見る

計画作成の流れ

オーダリストまたは作業リスト生成フェーズ

Asprovaのオーダテーブルからオーダリストを生成するのがオーダ収集で、作業テーブルから作業リストを生成するのが作業収集であり、いずれも親の計画パラメタに保存されます。

  1. オーダ収集(Prepare for assignment):オーダテーブルからオーダリストに収集
  2. オーダ絞込み(Filter orders):オーダリストから絞込み
  3. 割付け解除(Unassign all):作業リストの作業を未割付

作業絞込みは親の計画パラメタの作業絞込み条件式に設定します。

  1. 作業収集(Upload operations):作業テーブルから作業リストに収集
  2. 作業絞込み(Filter operations):作業リストから絞込み
  3. 割付け解除(Unassign all):作業リストの作業を未割付

デフォルト計画パラメタでオーダ割付/紐付けコマンドの前に「作業収集」コマンドが必要ないのは、オーダ展開コマンドで生成された作業が、親のコマンドオブジェクトであるデフォルト計画パラメタの中の作業リストに既に格納されており、再度作業テーブルから取得し直す必要はないからです。

コマンド実行フェーズ

オーダ展開(Explode orders)では、自動補充機能によってオーダリストを満たすように製造BOMを参照しながら、受注オーダの作業入力指図の不足分の製造オーダ(MPS)を補充オーダ(子)として生成し、MPSの作業入力指図の不足分の製造オーダを補充オーダ(孫)として生成します。

そしてオーダリストに格納されている登録オーダと補充オーダに対して作業入力指図と作業出力指図が生成します。

オーダ間の紐付けは、自オーダの初工程作業(作業入力指図)と前工程のオーダの最終工程作業(作業出力指図)であり、自動補充で生成された補充オーダ、または自動補充はないが製造BOMで繋がりのある製造オーダ同士が紐付けられます。

  1. BOMを参照し自動補充で補充オーダを生成
  2. オーダリストから作業リストを生成(作業入力指図と作業出力指図)
  3. オーダ間の紐付け

オーダ割付/紐付けにて、ディスパッチングルールと資源評価のプロパティを見ながら作業使用指図を生成し、作業リストから作業割付けしますが、仮割付で一旦すべての候補資源に割り付けた後、実割付で資源評価から最も評価の高い資源に割付け直します。

  1. オーダ割付/紐付け(Assign/peg orders)で作業リストから作業使用指図を生成し割付け

オーダ間の紐付がオーダ展開時とオーダ割付/紐付け時の2回行うのは、割付結果を元に再度紐付け直す必要が出るケース(在庫MINがある場合は在庫MIN分紐付けを左にずらす)があるからです。schedulingcommand

割付解除の意味

オーダー展開で作業を生成して、オーダー割付・紐付けで作業を割付けることで作業を生成した後に、計画の手修正(数量を修正など)や実績入力など作業の更新(パラメータに値を追加)があった場合、作業ステータスが「割付済み」のまま再度リスケジュールしても、オーダ展開コマンドはステータスが「割付済み」の作業には何もしないので前回と同じ結果になるだけです。

よって一旦割付解除により作業のステータスを「未割付」に戻してから、オーダ展開やオーダ割付/紐付けにより更新を反映させたスケジュールを作成します。

つまり割付解除は作業に入力された実績(実績数量・実績取得日など)を削除するのではなく、入力された実績に基づいて割付直すために必要なものです。

  1. オーダ展開でオーダリスト中のオーダの作業の割付フラグが「割付済み」であれば作業は生成しないので、オーダ展開の前に必ず割付け解除が必要。
  2. オーダ割付・紐付けで作業使用指図が生成され、ステータスが「割付済み」の作業が出来上がる。
  3. 作業に対して実績数量や実績取得日を入力するが、入力しただけではスケジュールは動かない。
  4. 作業収集と作業絞込で作業リストを生成し、割付解除により作業のステータスを「未割付」に戻す。
  5. オーダ割付・紐付けにより、3で入力した実績を反映させたスケジュールになる。

オーダ・作業・タスク・指図の関係

完全受注生産MTO(Make to Order)では、確定受注の出荷スケジュールがそのまま所要(基準生産計画MPS)となりますが、見込み生産MTS(Make to Stock)の場合は確定受注を元にMRPの所要を別途インポートする必要があります。

task

全体バックワードの後、フォワードで割付直し

バックワードで割り付けた作業の開始日時を元にフォワードで朝一から割付け直しますが、複合計画パラメタでは「オーダリストからオーダ展開して作業作成」「作業リストを絞込み作業割付を行う」という子計画パラメタの階層構造をあわせる必要があります。

backforward

StartOfNextDay(ME.製造開始日時,0)の意味は「製造開始日時の0日後(NextDay)の開始(Start)」つまり割り付いている作業の製造開始日時の始業時刻を返す、つまり「バックワードで割り付けた作業全体をフォワードで割付直すが、始業時刻より前に割りついてはダメ=その日の朝一番から割り付ける」ということになります。

ちなみにStartOfNextMonthなら「製造開始日時の0ヶ月後の開始」となり月初日になります。

また朝一で開始するが体操時間15分間バッファを置きたい場合は、AdvanceAlongResourceWorkingTime(ME.主資源,StartOfNextDay(ME.製造開始日時,0),15M)のようにずらします。

そしてフォワードで割り付け直すときは、バックワードで割り付けた作業のうち開始日時の早いものから順番に割り付けていきます。

リスケジュール

全体フォワードの後、前工程のみバックワード

生産工程にボトルネックが存在する場合、フォワード割付を行うと前工程に待ち時間が発生するので、前工程のみバックワードで割付直します。

作業絞込みで前工程のみに絞ってから割付解除を行うことで、後工程の作業まで割付解除されることを防いでいます。

bottleneck

スケジューラのオーダ間の紐付き

MRPの所要量展開で製造オーダと購買オーダが生成されるのはスケジューラでも同じですが、オーダは入力指図・使用指図・出力指図から構成される作業を生成し、同一オーダ内であれば自工程作業の出力指図と後工程作業の入力指図を紐付け、オーダ間の紐付きであれば自オーダの最終工程の出力指図と後オーダの初工程の入力指図を紐付けます。

これはスケジューラ特有の「オーダに順番を付けて並べる=オーダ同士を紐付けて資源に割り付ける」という機能を実現するためのもので、オーダ(MPS)からオーダリストを生成し、オーダリストから作業リストを生成し、オーダ納期のFIFOで紐付けを行ないますが、材料在庫のあるオーダから先に紐付けて割り付けるなど、紐付けを行なう際のソート式を記述することによって順番を操作することも可能です。
オーダ間の紐付けが行なわれるタイミング
スケジューリングロジックの大まかな流れは以下の2通りありますが、この中でオーダ間の紐付けは「オーダ展開」と「オーダ割付/紐付け」で2回行なわれます。

  1. オーダ収集⇒オーダ絞込⇒割付解除⇒オーダ展開⇒オーダ割付/紐付け
    • オーダテーブルからオーダを収集し親の計画パラメタにオーダリスト生成
    • 作業を生成し親の計画パラメタに作業リストを生成
  2. 作業収集⇒作業絞込⇒割付解除⇒オーダ割付/紐付け
    • 作業テーブルから作業を収集し親の計画パラメタに作業リストを生成

これは製造BOMにある在庫MINを考慮したスケジュールを作成する場合に、在庫MINを参照するのがオーダ割付/紐付け時であることから

  1. オーダ展開時にオーダの紐付け(原料の過不足はこの時点判明する)
  2. オーダ割付/紐付け時に製造BOMの在庫MINを参照して紐付け直し

という2段階の処理ロジックだからです。

紐付けオブジェクトテーブルと作業テーブル

このようにリスケジュールの結果として生成されるオーダは、紐付けオブジェクトクラスによって作業同士の紐付きに、さらに出力指図と入力指図の紐付きとして、紐付けオブジェクトテーブル(Peg table)という形に実体化されています。

オーダ展開の中では

  1. オーダから作業(入力指図と出力指図)を生成
  2. 紐付オブジェクトで紐付け

という順番で処理が実行されますが、これは品目ごとに作業入力指図と作業出力指図のリストを用意し、そのリストをソートして、前から紐付けていきます。

品目クラスの「紐付け時作業入力指図ソート式」「紐付け時作業出力指図ソート式」は、このリストのソート方法を指定するものであり、オーダの納期のFIFOで行なわれる紐付け順番を変更できます。

紐付けオブジェクトテーブルは作業出力指図と作業入力指図のマッピングの集合体であり、オーダごとに1対Nに紐付く材料や仕掛品を参照するのに適していますが、作業テーブルは作業使用指図により割付られた資源ごとに作業を集計するのに適しています。

計画は川下から実績は川上から

オーダーが1対1に紐付く場合にロットまとめが無効になるのは、工程ごとにロットサイズが異なると、オーダーの紐付きが1対Nにならざるを得ないという単純な理由です。

受注に基づく計画に対して製造し実績を上げないと、現場が独自の裁量で生産を行い、営業と製造が分断されてしまうということを、バリ島での家具製作の実体験に基づいて力説したことがありますが(計画と実績をリンクさせる製造指図の必要性)、この場合に予定に満たない実績との差異が発生します。

バリ島での家具製作のような受注生産では、差異分をシッピング前になんとしてでも製作して受注数量を満たす必要がありますが、受注に基づいて作成した繰り返し生産の計画(オーダーのカタマリ)に対する遅れは、必ずしもオーダー(指図)単位で挽回する必要はなく、遅れのまま完了させて後ろのオーダーで救援させることもあります。

MRPとスケジューラの違いといえば、無限能力山積みと有限能力山崩しの違いですが、計画に対する実績の差異の扱いという点で見た場合、MRPは基準生産計画の数量ありきで、製造オーダーの数量は基準生産計画の数量を満たすように決まるのに対して、スケジューラは実績に合わせて後工程のオーダー数量を自動調整する機能があります。

MRPは「プッシュ式」と言われるように、大元になる製品の完成日ベースの基準生産計画が前提条件であり、実績に応じた計画数量の事後調整は効きませんが、スケジューラは事後の実績に合わせて計画数量を自動調整することが可能です。

これは川下(受注)から生成された製造オーダー数量を、川上(初工程)から実績入力することで上書きしていくと言えます。

これが可能な理由は2つあります。

スケジューラには所要(基準生産計画=MPS)に対するオーダーの生成(自動補充)の仕方を、MRPのようなロットまとめで生成する方法以外に、受注からの紐付きを維持したまま、1対1で製造オーダーを生成する製番管理のMRP機能があり、オーダーが1対1に紐付くことにより、実績数量により後工程の計画数量を調整します。

もう一つの理由はスケジューラの実績は作業単位に入れられますが、すべての作業は数量固定レベルを持っており(実績の入力・修正が作業とオーダのステータスに与える影響)、実績の入った数量固定レベルの高い作業が、同一オーダー内の前後作業の数量を決めます。

これはマスタの構成を1製品複数工程(1オーダー複数作業)にした場合に機能します。

1対1紐付けとロットまとめの矛盾

スケジューラのマスタの作り方は大きく以下の2種類に分かれます。

  1. 1品目1工程(1オーダー1作業)
  2. 1品目複数工程(1オーダー複数作業)

生産管理システムでは実績を入れるのはオーダー(製造指図)単位であり、スケジューラでもオーダー単位に実績を入れられますが、通常は工程展開した作業単位です。

ただしマスタを1品目1工程に設定すると1オーダー1作業が生成されますので、結果的に両者の実績入力単位は同じになります。

仕掛品の在庫を加味するか否かは、仕掛品の自動補充設定の有無(在庫引当の有無)によるのであって、マスタの作り方とは無関係です。

ただ前工程の作業に対する実績を後工程の計画数量に反映させるには、マスタが1品目複数工程で同一オーダの中で作業が紐付いている場合か、もしくはマスタが1品目1工程で自動補充が1対1の場合です。

自動補充が1対Nの場合は前工程の計画数量を満たすように、後工程の別のオーダと紐付くため、実績で計画数量を上書きすることはできません。

前工程の実績数量を後工程の計画数量に反映させるわけですから、フォワードの計画作成時にのみ有効です。

1対1紐付けとロットまとめの矛盾

1対1に紐付けるということは、前後どちらかの工程のロットサイズに合わせるということであり、この場合ロットサイズの設定が無効化されます。

仕掛品に異なるロットサイズを設定すると必ず1対Nに紐付かざるを得ず、この場合実績数量で前後工程を修正するという考え方が成立しません。

予実差異を後工程の計画数量に反映させるには、オーダーが他の受注に紐付くオーダーと紐付かないことが前提になります。

最適化の指標

スケジューリングロジックのコアとなる機能は、オーダから作業生成と紐付け(オーダ展開)、作業を資源へ割付(オーダ割付/紐付け)、これらは以下の2つのコマンドにて実現されます。

1.オーダ展開

  1. 作業(作業入力指図・作業出力指図)を生成
  2. 自動補充で入力指図の不足分のオーダを生成
  3. オーダ初工程の入力指図と前工程のオーダ最終工程の出力指図を紐付け

2.オーダ割付/紐付け

  1. 仮割付け:マスタ使用指図・ディスパッチングルール
  2. 資源評価:11種類の標準評価式+追加評価式
  3. 実割付け

一般的に最適化は稼働率やリードタイムの改善が指標となりますが、そのための調整パラメータとして以下が考えらます。

  1. 資源評価(代替資源の選択)
  2. 割付方向(ボトルネック中心TOC)
  3. 作業分割(待ち時間削減)
  4. 重なり方法(待ち時間削減)
  5. 作業の順番(段取り回数削減・内段取りの外段取化・材料のある作業を優先)

最適化の方針は工場によって異なりますが、上記パラメタの設定を調整することにより、スケジュール作成時の作業の割付き方に傾向を与え、工場ごとに独自の最適化されたスケジュールを作成します。

資源評価で作業の資源への割付方法を調整

オーダ割付/紐付けの中で、資源への仮割付けに基づいて資源評価を行い実割付けを行います。

製造BOMの資源優先度のみを適用

割付資源プロパティで「優先資源」(通常は「評価値最大資源」)を選択することにより、製造BOMの資源優先度が最大の資源にのみ割りつきます。

資源優先度最大の資源が一杯なら代替資源に割り付く

資源評価の重みである「重み-資源優先度」に1を設定することにより、資源優先度が最大の資源に優先的に割り付き、一杯ならはじめて代替資源に割りつきます。

負荷平準化割付け

資源評価の重み「重み-負荷平準化」に1を設定することにより、代替資源にも均等に割り付けられます。

追加評価式で作業の資源への割付方法を調整

 

資源評価と追加評価式

資源評価には標準で11種類のプロパティがあり、資源ごとに評価方法を変えて作業を割付けることは可能ですが、出力品目ごとに評価方法を替えて作業を資源に割り付けることはできません。

  1. 重み-負荷平準化
  2. 重み-段取り時間最小化
  3. 重み-資源優先度
  4. 重み-待ち時間最小化
  5. 重み-納期遅れ最小化
  6. 重み-製造時間最小化
  7. 重み-同一オーダ優先
  8. 重み-同一品目優先

11種類の資源評価で対応できない条件設定が必要な場合は、追加評価式を用いて標準の資源評価とあわせて使用できますが、追加評価式が呼ばれるときにはまだ作業が割り付いていないので、仮割付けの結果に基づいて追加評価を行なうためには、必ず以下のMEのTentAssignではじまる割付評価式を用いる必要があります。

  1. 評価時-マスタ使用指図(me.TentAssignCurrUseBomInst)
  2. 評価時-対象作業(me.TentAssignCurrOper)
  3. 評価時-右作業(me.TentAssignRightOper)
  4. 評価時-左作業(me.TentAssignLeftOper)
  5. 評価時-対象資源(me.TentAssignCurrRes)

評価時の対象作業が製品51096-BZ010の仕掛品(親品目の中に51096-BZ010を含むプレス品)である場合は、ResourceLoadで計算した負荷率を平準化するように割付け(資源評価の「重み-負荷平準化」と同じ)、それ以外の作業の場合は資源優先度(資源評価の「重み-資源優先度」と同じ)を参照します。

  • IF(CheckAllContents_Or(ME.評価時-対象作業.主産物品目.'親品目(再帰)','==','51096-BZ010'),ResourceLoad(ME.評価時-対象資源,PROJECT.割付け開始日時,PROJECT.割付け終了日時), ME.評価時-マスタ使用指図.資源優先度)
  • CheckAllContents_Or : プロパティの全てのデータ(単・複)をある条件を基にORチェック
  • ResourceLoad : 資源から負荷率を計算

左側の作業の仕様1が同じなら優先してその資源に割付け

左作業と自作業が同じ仕様1なら1で、そうでないなら0になるように資源評価を行い、左側の作業の仕様1が同じであれば優先してその資源に割付けるようにする。

  • 1*IF(GetApplicableSpec(1,ME.評価時-対象作業)==GetApplicableSpec(1,ME.評価時-左作業),1,0)
  • GetApplicableSpec : 第一引数が仕様(仕様1)、第二引数が作業を指定すると、その作業の仕様1の値を返す。左作業と自作業の仕様1が一致しなかった場合は「重み-負荷平準化」を考慮するよう1を設定する。

工程間の重なり方

重なり方法や重なりMINは、自工程に対する前工程との重なり具合なので後工程に設定し、作業がロット分割されない場合はESまたはSSEEを設定します。

  • SSEE (Start-Start End-End)は前工程と後工程の開始と終了を関連付けますが、後工程が早く終わる場合に使用します。

工程間の重なり方

  • EES(End-Each-Start)は、後工程が分割(Each)されているとき、前工程の途中から作業開始します。

工程間の重なり方

MEからの参照とPROJECTからの参照の違い

現在実行中のインスタンスからではなく、外部から特定の品目オブジェクトそのものや、資源オブジェクトそのもの等を参照したいときには、Projectを基点に子オブジェクトで参照します。

品目テーブルのカレントオブジェクトの子オブジェクト(工程)の最終オブジェクトのキーであるCodeプロパティの値、つまり最終工程コードを表示。

  • ME.子オブジェクト[0]

Itemテーブルオブジェクトの最初のオブジェクト(キープロパティであるCodeがProductA)の子オブジェクト(工程)の最終オブジェクトを表示。

  • Project.子オブジェクト['Item'].子オブジェクト[1].子オブジェクト[0]
  • Project.子オブジェクト['Item'].子オブジェクト['ProductA'].子オブジェクト[0]

object

オブジェクトは連想配列型なので、PROJECTから品目レコードを参照するときは、インデックス(数字)またはCodeプロパティの値で指定して、プロパティ値を参照します。

一般の配列と異なり、配列の添え字は[1]から始まり[0]は最後のプロパティ値を表します。

特定の資源Material CalcをProjectから参照

Projectオブジェクトの子オブジェクトである資源テーブルの中で、Codeプロパティの値がMaterial Calcである資源オブジェクトを参照します。

特定の資源の稼働時間に沿って指定された日時から指定された時間だけ進んだ日時を取得。

  • AdvanceAlongResourceWorkingTime(PROJECT.子オブジェクト['Resource'].子オブジェクト['Material Calc'],ME.末端親オーダ[1].納期,(-1)*(ME.品目.'Material LT'-ME.品目.ProcessLT))
  • AdvanceAlongResourceWorkingTime(特定の資源, 指定日時, 進める時間)

計画基準日をProjectから取得

指定された資源のある時間帯の稼働日数を取得

  • GetWorkingDays(StartOfNextMonth(PROJECT.計画基準日時,0),StartOfNextMonth(PROJECT.計画基準日時,1),ME.受注予定オブジェクト[1].カレンダ参照資源,24H)
  • GetWorkingDays(開始日, 終了日, 特定の資源, 1日の時間数)

ちなみに受注予定オブジェクトは配列型で以下のようなオブジェクトが格納されています。

  1. 受注予定オブジェクト[1] : 品目
  2. 受注予定オブジェクト[2] : 顧客
  3. 受注予定オブジェクト[3] : 種別
  4. 受注予定オブジェクト[4] : 数量

表示式と表示逆変換式

仮想プロパティ式はカレントオブジェクトの中の他プロパティを参照しますが、表示式はカレントオブジェクトの自プロパティに対する表示変換です。表示式で時刻を固定するとRead Onlyになり、表示逆変換式によって表示式を設定したプロパティをRead writeにします。

INPUTは表示式を設定しているプロパティの値そのもので文字列に変換されるので、この場合FindNumberL(INPUT,1)で数値に変換します。INPUTが指す文字列(値)の1番目の数値という意味になります。

オーダ数量を千の位でカンマ区切り

  • 表示式:Format(ME.Qty,'#,###')
  • 表示逆変換式:FindNumberL(INPUT,1)

納期の時刻を23:59:59にする

  • 表示式:DateF(GetYearPart(ME.最遅終了日時),GetMonthPart(ME.最遅終了日時),GetDayPart(ME.最遅終了日時),23,59,59)
  • 表示逆変換式:DateF(FindNumberL(INPUT,1),FindNumberL(INPUT,2),FindNumberL (INPUT,3),23,59,59)

仮想プロパティ式と仮想プロパティ逆変換式

MEもHOLDERもカレントオブジェクトを指しますが、MEで参照するとRead only(利用者オブジェクト)になりHOLDERで参照するとRead write(所有者オブジェクト)になります。

  1. HOLDER(カレントオブジェクト)
  2. ME(カレントオブジェクト)
  3. OTHER(2つのプロパティの値を比較を設定するプロパティでMEの相方となるオブジェクト)

オーダテーブルのユーザ定義プロパティに文字列「100個」と入力(INPUT)し、逆変換式で入力した文字列の数字部分FindNumberL(INPUT,1)をオーダ数量にコピー「HOLDER.オーダ数量」させることができます。
object2

同一オブジェクト内の2つのプロパティを比較するMEとOTHER

同一オブジェクト内の2つのレコード(オブジェクト)のプロパティの値を比較する場合はMEとOTHERを使います。例えば、品目の紐付け条件式プロパティで、オーダの仕様1が同じなら紐付けるという条件の場合は

  • ME.オーダ.仕様1==OTHER.オーダ.仕様1

最小・最大・総和を求める内部関数の第一引数を指すTARGET

TARGETは内部関数Max, MaxIF, Sum, SumIFの第一引数にオブジェクトを指定し、第二引数以降でTARGETを指定することで、TARGETは第一引数のオブジェクトを指します。

条件付き総和SUMIF

TARGETは受注予定表オブジェクトなので、受注予定表が内示ときの、受注予定表の数量の合計を取得します。

  • SumIF(ME.'親品目(再帰)'.受注予定オブジェクト,TARGET.種別=='内示',TARGET.数量)

条件付き最大MAXIF

TARGETはオーダーオブジェクトなので、オーダテーブルの工程番号が22のときの、オーダテーブルのTMP FIN DATEの最大値を取得します。

  • MaxIF('Order',TARGET.'No Process'==22,TARGET.'TMP FIN DATE')

総和SUM

TARGETはこの品目を使用しているオーダなので、オーダーテーブルのオーダ数量の合計を品目ごとに求めます。

Sum(ME.'親品目(再帰)'.この品目を使用しているオーダ,TARGET.オーダ数量)

0日後、0週後、0月後の開始日時を指すStartOfNextDay(Week, Month)

ディスパッチング時の日まとめ、週まとめ、月まとめを行なう際に、納期から0日後(0週後,0月後)の開始日時ということは、同じ日(週,月)にある作業をまとめます。

  • 日まとめ:StartOfNextDay(ME.オーダ.納期,0)⇒0日先の最初なので今日の割付開始日
  • 週まとめ:StartOfNextWeek(ME.オーダ.納期,0)⇒0週先の初日なので今週初日
  • 月まとめ:StartOfNextMonth(ME.オーダ.納期,0)⇒0月先の初日なので当月初日