Pythonによる業務シミュレーション

2.定期交換部品のライフ推定による交換時期の最適化

この記事は、オンデマンド印刷機における定期交換部品の最適な交換時期をコンピュータ・シミュレーションによって推定するスタディである。

目的

デジタル印刷機の保守サービスをコンピュータ・シミュレーションで最適化する一連のプロセスのうち、この記事では3分割した2番目のステップを説明する。最初のステップでは顧客による印刷機の使われ方を推定した。これをもとに、定期交換部品を計画的に交換する交換時期が、交換された部品数 (コスト) と印刷機の停止時間 (ダウンタイム) に及ぼす影響を推定する。最適な交換時期は両者が折り合うところになる。シミュレーションは、プログラミング言語Pythonと無償の離散事象シミューレションフレームワークsimpyを用いて実装する。

部品ライフの推定方法

保守サービスにおける課題の一つに、サービス提供に要するコストと、顧客が受け取るサービス品質との両立がある。顧客による印刷機の使われ方が部品ライフに影響を及ぼすと仮定し、架空の印刷ジョブを生成する。それらを印刷機へ投入し、部品の摩耗と故障、それに保守サービスによる部品の刷新をシミュレートすることで、部品の交換数 (コスト) と印刷機の停止時間 (ダウンタイム) を予測する。交換時期をさまざま変化させて予測結果を確認する。

故障モデル

本スタディでは、確率的に故障が発生する応力-強度モデルを採用して、印刷機の「使われ方」から部品ライフを推定する故障モデルを作成した。応力-強度モデルは、既知の応力 S と強度 R から、故障の確率 F を予測する。強度 R (resistance) は設計や製造で決まり、応力 S (stress) は使い方で決まる。どちらも発生確率を与える確率分布である。応力 S > 強度 R の場合に故障が起こり、故障確率 F (failure probability) が決まる。


図. 応力-強度モデルによる故障発生。故障は応力 S > 強度 R の場合に起こる。(左) 応力Sと強度Rの分布が離れていれば故障は起こりにくい。(右) 2つの分布が重なるにつれて故障は起こりやすくなる。

部品の生存-故障判定

印刷機の定期交換部品のうち、本スタディでは用紙の搬送系の部品 (例: ローラー、ベルト) を取り上げる。部品の経年をシミュレートするため、未知パラメータから生成した印刷ジョブによる部品負荷 ΔT を累積する。各時点での生存-故障の判定は、部品強度 R に基づく生存関数 (survival function, SF) を使用する。生存関数は、部品の母集団のうち時刻Tの時点で生存している割合を表し、使用開始時は1、時間経過とともに0に近づく。時刻T1まで生き残った部品がさらに時刻T2まで生き残る確率は、条件付き生存率 CS(ΔT|T1) = SF(T2)/SF(T1) で求められる。各時点で故障するかどうか、[0-1) の一様乱数によって確率的に判定する。


図. 故障モデル-生存関数

印刷機保守のシミュレーションモデル

デジタル印刷機の部品の故障と交換に関するイベントを表し、コンピューター・シミュレーションするためにシミュレーションモデルを作成した。前述した故障モデルを表現するためのリソース、プロセス、データといったオブジェクトも含む。主な構成要素を次に示す。


図. 印刷機保守のシミュレーションモデル (拡大)

部品ライフ推定システムの設計

システム構成

予防保守による交換時期による信頼性とコストへの影響を評価するためのソフトウェアである。次に構成を説明する。

①未知パラメータから部品負荷の生成
未知パラメータによって表された印刷機の使われ方に基づき、部品にかかる負荷を生成する。搬送系の部品であれば、印刷ジョブによって移動する用紙の搬送距離が負荷となる。コマンドラインで与えられた未知パラメータから印刷ジョブ長の分布と用紙サイズの分布を取得し、それぞれの分布からサンプリングした印刷ジョブ長と用紙サイズを含む印刷ジョブを生成し、後続の②に出力する。
②印刷機における部品ライフの推定
前述の故障モデルとシミュレーションモデルを実行して、部品ライフを推定する。
故障モデル
故障モデルの部品強度 R はワイブル分布とした。ワイブル分布は修理しない部品ライフのモデル化によく使われ、2つの変数 (形状パラメータ、尺度パラメータ) のみで特徴付けられることから運用にも優れる。部品強度 R のワイブル分布から推定した生存関数 (SF) を用いて、印刷ジョブ毎に部品にかかる負荷に対応した条件付き生存率を算出し、一様乱数を用いた生存-故障判定によって故障するかしないかを決定する。
シミュレーションモデル
印刷機による印刷ジョブに基づいた部品の経年と故障、それにエンジニアによる予防保守と障害修理に基づいた部品の交換という全体の流れを形作る。部品が交換されるまでの累積負荷が部品ライフの推定値となる。交換履歴として部品ライフ、交換理由、交換に伴う印刷機の停止時間が集められ、後続の③と④に出力される。
③応力-強度モデル図作成
②から部品の交換履歴を入力して、部品にかかる応力 S を推定する。応力 S は対数正規分布で近似した。対数正規分布は保守可能なシステムの修復時間をモデル化するのによく使用される。部品の交換理由には予防保守と障害修理があるが、その直前まで生きていたという事実から部品の交換理由は問わない。応力 S から故障確率 F を推定し、応力-強度モデル図を作成する。
④管理目標値の最適値を探索
②で作成した部品交換履歴を入力し、「交換部品数」および「交換に伴う機械の停止時間」をグラフィック出力する。保守サービスの管理目標値ごとの変化を比較して適切な管理目標を選択するのに役立つものとする。
⑤改善効果の予測
交換時期の管理目標値を変更したときの改善効果を推定する。交換部品数を指標とし、シミュレーション時間の経過に対する総数を両対数プロットする。管理目標値を変更した場合としなかった場合を比較して導入効果を定量的に評価する。

図. 部品ライフ推定システムのブロック図

シミュレーション・フレームワーク

このシミュレーション環境内には複数のオブジェクトが共存し、互いに同期を取りながら各種イベントが生成、処理されることで全体が進行する。シミュレーションは内部の時計が指定時間に達するまで継続する。これらを簡潔に記述するため、Python言語向けの離散事象シミュレーションフレームワーク Simpy を使用する。

定期交換部品の交換時期がダウンタイムとコストに及ぼす影響評価

保守サービスにおける定期交換部品の最適な交換時期を推定した。

方法

定期交換部品を計画的に交換する「管理目標」が、印刷機の停止時間 (ダウンタイム) や交換される部品数 (コスト) に対し、どのような影響を及ぼすかをシミュレーションで推定する。管理目標を一定間隔で変えて停止時間と交換部品数の変化をもとに最適値を検討する。

シミュレーション条件

シミュレーション条件を表に示す。部品の強度のワイブル分布は架空のものである。顧客の未知パラメータも同様に架空のものとした。管理目標は部品強度の尺度パラメータ (1000k) の 0.6~1.6倍の範囲に6箇所設定した。

表. シミュレーション条件

意味 補足
部品の強度 R を表すワイブル分布の尺度パラメータ –designed_life 1000000 1000k [A4短辺ページ] と仮定
(同) 形状パラメータ –beta 1.8 摩耗故障型と仮定
予防保守の管理目標(係数) –wearout_rate 0.6 0.8 1.0 1.2 1.4 1.6 600k - 1600k まで 200k 刻みで比較する
シミュレーション期間 –maxt 60*24*30*12 シミュレーション期間を内部時計で 360 日とする
シミュレーション回数 –iter 20 20 [回/条件] のシミュレーション結果を平均化する
顧客未知パラメータのトータルエリアカバレッジ –ac L トータルエリアカバレッジ(インク被覆率)を低(Low)とする (現状未使用であり、シミュレーションに影響を及ぼさない)
(同) 印刷ジョブ長 –pl M 印刷ジョブ長(1ジョブ中のページ数)を中(Mid)とする
コマンドラインを表示 python sim_component_failure.py --designed_life 1000000 --maxt 60*24*30*12 --beta 1.8 --eta 1000000 --wearout_rate 0.6 0.8 1.0 1.2 1.4 1.6 --ac L --pl L --iter 20
python sim_component_failure.py --designed_life 1000000 --maxt 60*24*30*12 --beta 1.8 --eta 1000000 --wearout_rate 0.6 0.8 1.0 1.2 1.4 1.6 --ac L --pl M --iter 20
python sim_component_failure.py --designed_life 1000000 --maxt 60*24*30*12 --beta 1.8 --eta 1000000 --wearout_rate 0.6 0.8 1.0 1.2 1.4 1.6 --ac L --pl H --iter 20

結果

交換部品数

交換時期を遅らせることによりトータルの部品交換数は低下傾向を示した。交換理由の別では、「予防保守」(水色) は減り続け、一方「障害修理」(桃色) は増え続けた。部品が故障するまで使い切ることは、交換部品数を削減する利点がある反面、障害修理が増える欠点も持ち合わせていることがわかった。本シミュレーションでは経年が少ない場合でも確率的に故障が起こるため (故障の確率密度はワイブル分布する)、交換時期を早めても故障を抑えきれないことがわかった。


図. 定期交換部品の計画的な交換時期が交換部品数 (コスト) に及ぼす影響

機械停止時間

交換時期を遅らせることによるトータルの停止時間はほぼ一定 (標準誤差の範囲内) であった。交換理由の別では、「予防保守」(水色) は減少傾向、「障害修理」(桃色) は増加傾向が見られた。本シミュレーションでの停止時間は、計画的な予防保守が30分なのに対し、突発的な障害修理では60-90分とペナルティを含んでいることから、交換部品数の減少は停止時間の増加で相殺されたものと考える。


図. 定期交換部品の計画的な交換時期が印刷機の停止時間 (ダウンタイム) に及ぼす影響
エラーバーは標準誤差

業務視点での影響評価

印刷機メーカーの視点

管理目標を増加させると (交換時期を遅らせると) 保守サービスで消費される部品交換数は低下した。これは部品コストを削減する意味では好ましい。一方、本スタディでは考慮しなかったが、保守サービスを担当するエンジニアの人的コスト (固定費) の観点では計画的な予防保守が望ましく、突発的な保守作業が生じる「障害修理」は、それが高優先であることも含めて不利といえる。両側面を考慮した最適値の決定は本スタディの課題である。

顧客の視点

管理目標を増加させると (交換時期を遅らせると) 「障害修理」による印刷機の停止時間が増加し、交換される部品数 (交換作業の回数) は減っても、障害修理のために業務が止まる時間は反対に増えることがわかった。印刷機は信頼性を重視することを考え合わせると、部品が故障するまで運転を続ける保守運用 (run-to-failure) 導入は難しいと考えられる。

応力-強度干渉モデル図


応力-強度干渉モデル図 (AC=L,PL=M)(管理目標係数0.80)
(上段) ワイブル分布で近似した部品の強度 R の確率密度(青線)。広がった裾野は低いライフで故障が起こる可能性を示している。(中段) 印刷機の「使われ方」を表すチャートで、ヒストグラムは、障害修理で交換された部品(桃色)と、予防保守で交換された部品(水色)のライフ分布である。緑色の点線は部品ライフの算術平均を示す。緑色の実線は交換時期の管理目標で、これを超えた部品は予防保守で交換される対象となる。応力 S (赤線) は対数正規分布で近似したライフ分布である。(下段) 応力 S が強度 R を上回る領域が強調され、その面積は故障確率 F に対応する。

最適な交換時期

管理目標を増加させる (緑色の実線を右側に移動させる) につれて部品ライフの平均値 (緑色の点線) も増加するが、やがて 850k (8.5E5) 付近を上限にして伸びが止まることが分かった。部品ライフを前提にした議論において (例: コスト計算)、こうした上限を考慮する必要性を示唆する。


応力の推移グラフ(AC=L,PL=M)

故障確率 (部品が故障する頻度) は、管理目標を増加させるにつれて減少する傾向が示された。これは、低い管理目標が過剰な交換部品を行ったことに対応する。


故障確率推移グラフ(AC=L,PL=M).png

最後に、サービス中に交換時期を延長した場合、部品交換数がどのように変わるかを推定した。管理目標 (係数)を 0.8 → 0.9 に変更して2年後を予測すると、過去2年間のトレンドを外挿した場合は総数37個、交換時期を延長した場合は総数27個であった。差分の10個は部品コストの削減効果を示すものである。


保守サービス管理目標の変更による改善効果(0.8, 0.9)(AC=L,PL=L)
すべてのチャートを表示

応力-強度干渉グラフ(AC=L,PL=M)(管理目標係数0.60)

応力-強度干渉グラフ(AC=L,PL=M)(管理目標係数0.80)

応力-強度干渉グラフ(AC=L,PL=M)(管理目標係数1.00)

応力-強度干渉グラフ(AC=L,PL=M)(管理目標係数1.20)

応力-強度干渉グラフ(AC=L,PL=M)(管理目標係数1.40)

応力-強度干渉グラフ(AC=L,PL=M)(管理目標係数1.60)

課題

シミュレーションによって、予防保守による介入 (打ち切り) が部品ライフに影響を及ぼし、印刷機によって異なる「使われ方」に応じて最適な交換時期があることが確かめられた。しかし市場には多数の印刷機が稼働し、限られた資源 (人、時間、資金) のもとで保守サービスの収益性を高めるのに多くの検討課題が残っている。

結論

オンデマンド印刷機の定期交換部品の最適な交換時期を推定するため、応力-強度干渉モデルに基づく故障モデルと、離散事象シミュレーションモデルからなるコンピュータ・シミュレーションを構築した。顧客による印刷機の使われ方を推定した未知パラメータに基づき、用紙の搬送距離を部品にかかる負荷と見なした。この負荷が累積して部品強度に基づく生存関数から突発的な故障が生じるとともに、交換時期に基づく計画的な予防保守による打ち切りが起こると考え、交換されたこれらの部品ライフの分布から応力を推定した。シミュレーションの結果、交換時期を延長すると交換部品数は減少してコストへ寄与するが、計画外の機械停止時間が増加することで顧客業務への影響は増す。また部品ライフの平均値には上限があることも分かった。課題としてこうした相反する要件を人的コストなどの因子を含め、より包括的に検討することがある。

付録

ソースコード

コマンドラインオプション

usage: sim_component_failure.py [-h] [--step] [--debug] [--wearout_rates WEAROUT_RATES [WEAROUT_RATES ...]] [--designed_life DESIGNED_LIFE] [--beta BETA] [--eta ETA] [--check_interval CHECK_INTERVAL]
                                [--maxt MAXT] [--maxx MAXX] [--iter ITER] [--seed SEED] [--area_coverage AREA_COVERAGE] [--page_length PAGE_LENGTH]

options:
  -h, --help            show this help message and exit
  --step
  --debug
  --wearout_rates WEAROUT_RATES [WEAROUT_RATES ...]
                        予防保守の管理目標(係数)。部品ライフ設計値を1.0とした場合の管理目標(係数)を指定する。(デフォルト: 1.0)(例: --wearout_rates 1.0, --wearout_rates 0.9 1.0 1.1)
  --designed_life DESIGNED_LIFE
                        部品ライフ設計値。算術平均やB(10)ライフなどで指定される (デフォルト: 1000000)(例: --designed_life 1000000)
  --beta BETA           βは、部品ライフをワイブル分布で表した際の形状パラメータ。β<1で初期故障型、β=1で偶発故障型、1<βで摩耗型故障を示す (デフォルト: 1.0)(例: --beta 1.0)
  --eta ETA             ηは、部品ライフをワイブル分布で表した際の尺度パラメータ。 (デフォルト: 部品ライフ設計値)(例: --eta 1000000)
  --check_interval CHECK_INTERVAL
                        保守計画における保守間隔 [単位:[分]] (デフォルト: 60*24*10 (10日間の意味))(例: --check_interval 60*24*10)
  --maxt MAXT           シミュレーション期間 [単位:[分]] (デフォルト: 60*24*30*12 (1年間の意味))(例: --maxt 60*24*30*12)
  --maxx MAXX           交換部品数の最大値。この指定に達した時点でシミュレーションを終了する (デフォルト: 200)(例: --maxx 200)
  --iter ITER           シミュレーション回数 (デフォルト: 1)(例: --iter 10)
  --seed SEED           random.seed() 初期値。(デフォルト: None)(例: --seed 42)
  --area_coverage AREA_COVERAGE, --ac AREA_COVERAGE
                        area_coverage [L, M, H] (デフォルト: M)(例: --area_coverage M)
  --page_length PAGE_LENGTH, --pl PAGE_LENGTH
                        page_length [L, M, H] (デフォルト: M)(例: --page_length M)

全体の構造

シミュレータの概ねの設計を次に示す。ソースコードは付録に添付した。

全体の構造を表示
図2. 全体の構造

シミュレーション (main)
  ├ シミュレーション環境作成
  ├ 印刷シミュレーションプロセス
  └ 結果表示
   
    印刷シミュレーションプロセス (printingmachine_simulator_process)
      ├ 印刷機ユニットを確保し、部品をインストール
      ├ 印刷機の保守計画を策定し、印刷機の予防保守のスケジュールと実施プロセスを実行
      └ シミュレーション期間中のジョブ受注                                               ← ループ
          └ 定期的(30分間隔)に印刷ジョブ作成し、印刷ジョブの出力プロセスを実行

        印刷機ユニット (class PrintingMachine)
          ├ 予防保守実行プロセス (preventive_maintenance_process)
          │  ├ 交換部品の生成
          │  └ 交換作業 (待機時間: 30分)
          ├ 障害修理実行プロセス (corrective_maintenance_process)
          │  ├ 交換部品の生成
          │  └ 修理作業 (待機時間: 60-90分)
          └ 印刷実行プロセス(含む部品ライフ進行(摩耗)) (printout_process)
             ├ 印刷実行 (待機時間: 印刷ジョブ長/印刷速度)
             └ 部品ライフ進行(摩耗)

        保守作業 (class MaintenanceWork)
          └ 印刷機の予防保守のスケジュールと実施プロセス (preventive_maintenance_setup_process)
            ├ 次回の予防保守まで待機 (時間: 10日間)
            ├ 現在部品ライフが計画部品ライフを超過したら部品を交換
            │  ├ エンジニアおよび印刷機ユニットを確保
            │  └ 予防保守実行プロセス
            └ 印刷機の予防保守のスケジュールと実施プロセス (次回分。再帰している)

        印刷ジョブ (class PrintJob)
          └ 印刷ジョブ作成 (init)
            └ 顧客の未知パラメータに基づく印刷ジョブを作成 (generate_customer_print_job)

        印刷ジョブの出力プロセス (printing_printjob_process)
          ├ 印刷機ユニットを確保
          ├ 故障確率の算出と生存-故障判断
          │  ├ 故障時、修理するエンジニアを確保
          │  └ 障害修理実行プロセス印刷実行プロセス(含む部品ライフ進行(摩耗))
          └ print_job 毎の結果を記録 (印刷所要時間, 終了時刻と成否)

            交換部品 (class ReplacementPart)
              ├ 交換部品の生成 (init)
              │  ├ 計画部品ライフを取得 (所定の値)
              │  └ 部品ライフ分布を生成(ワイブル分布) (get_internal_part_life)
              ├ 部品ライフ進行(摩耗) (wear)
              │  └ 累積印刷ページに「ページ長」を加算し、部品ライフを進行させる
              └ 故障確率の算出と生存-故障判断 (failure)
                 └ 部品固有ライフ ≦ 累積印刷ページ となったら故障
#### 印刷シミュレーションプロセス シミュレーション環境を構築し、さまざまな初期化をした後、シミュレーション中の印刷ジョブを生成する。シミュレーションは内部時計が上限を超過するか、交換部品数が所定数に達したら終了する。 #### 予防保守実行プロセス エンジニアによる部品の交換を記述した。計画内の作業であるため印刷機を止める作業時間を短くした (30分)。 #### 障害修理実行プロセス 予防保守と同様に、エンジニアによる部品の交換であるが、計画外の作業であるため印刷機を止める作業時間を長くした (60-90分)。 #### 印刷実行プロセス(含む部品ライフ進行(摩耗)) 印刷ジョブを出力を記述する。印刷の所要時間は、印刷ジョブ長/印刷速度 とした。その後、部品ライフを進行させた。 #### 印刷機の予防保守のスケジュールと実施プロセス 予防保守の作業を記述する。予防保守の実施間隔 (check_interval) は、保守サービスの管理目標値として規定される (デフォルト: 10日間)。予防保守の作業内容は、部品ライフが計画部品ライフを超えていたら部品を交換し、次回の予防保守をスケジュールする。なお、交換の際はリソース (エンジニアと印刷機ユニット) の確保を要するとした。 #### 顧客の未知パラメータに基づく印刷ジョブを作成 最初の記事で推定したシミュレーション結果を未知パラメータとして採用した。 - 印刷用紙サイズ(重み付きランダム) - 用紙サイズ重み[A4:5%, B4:3%, A3:46%, 長尺:46%] - トータルエリアカバレッジ(用紙サイズにより分布は異なる) - 印刷ジョブ長(用紙サイズにより分布は異なる) - 両面/片面(μ=0.5, σ=0.3) #### 交換部品の生成 シミュレーションで使われる部品を生成する。部品強度 F として、印刷機全体の母集団における部品ライフを規定した。本来は保守サービスを介して収集した部品ライフに基づいて設定するところだが、架空の印刷機のものとしてワイブル分布を仮定した。部品ライフは無次元してA4短辺を1とした。 #### 故障確率の算出と生存-故障判断 部品強度 R に対応する生存関数(SF)を元に、印刷ジョブ出力前まで生き残った部品がさらに印刷ジョブの出力後まで生き残る確率 (条件付き生存率CS) を算出した。故障か故障でないか確率的に決定するために一様乱数を使用した。

このページに掲載した作品 (テキスト、プログラムコードなど) はパブリック・ドメインに提供しています。詳細は CC0 1.0 全世界 コモンズ証 をご覧ください。