Instant Engineering

エンジニアの仕事効率を上げる知識をシェアするブログ/QC統計手法/公差設計・解析/TPS(トヨタ生産方式)

Plant Simulation:入口コントロールでアセンブリリストの書き換え -Change Assembly list-

DX時代:【第3回】シーメンス製の生産シミュレータ「プラントシミュレーション」の使い方を習得

www.plm.automation.siemens.com

 

Plant Simulation 15に収録されているサンプルモデルを使って基本操作を習得する。

第3回はカテゴリ「マテリアルフロー」、トピック「Assembly」、サンプル「Change Assembly list」を使っていく。サンプルモデルからの学び方は、以下の手順で行う。

STEP1:サンプルモデルを開き、どのような仕事内容をシミュレーションするものかを把握する。

STEP2:それぞれのオブジェクトの設定項目を参照し、定義の仕方を確認する。

STEP3:概要を理解したところで、設定の一部を変更して、意図した通りにシミュレーションの結果に反映されるかを確認する。

サンプルモデルの難易度によって、多少の変更はあるかもしれないが、流れとしては概ね上記のような進め方で習得していく。

 

◆サンプルモデル

 マテリアルフロー ⇒ Assembly ⇒ Change Assembly list

 

STEP1:どのようなサンプルモデルか?

どのようなサンプルか把握するためにまずはイベントコントローラを実行してみる。シミュレーション動画を以下に示す(Vimeo)

中央の「Assembly」オブジェクトの入り口側には3つの接続がある。左上にはSourceが一つあり、その先は分岐してParallel Procがあり、赤と青の箱型MUに分別しているようだ。

左側にはコンテナを作成するSourceがあり、Lineオブジェクトを通ってAssemblyに供給されている。Assemblyの上には「setBOM」メソッドがあり、入口コントロールとしてプログラム文で制御していると予測される。

Assemblyオブジェクトでは、コンテナに赤/青のMUを計3つ載せてから次工程へ流しているが、3つの組み合わせは毎回同じではないようで、そのあたりの制御をどのように設定しているかが本モデルの肝になりそうだ。

ざっくりとモデルの概要の動きを把握したところで、各オブジェクトの設定項目を一つずつ見ていく。

 

STEP2:オブジェクトの設定項目を確認

モデル上で左上にある赤/青のMUを作成するSourceオブジェクトから見ていく。

f:id:yuinomi:20210716065022p:plain

「Source」オブジェクトの属性タブを開くと、次のようになっている。

f:id:yuinomi:20210716065546p:plain

Data Table「Parts」に定義されたMUを「順番に繰返して選択」で、MUの作成間隔は1秒である。つまり1秒おきにPartsテーブルに従ってMUを作成し続けるオブジェクトだ。

Sourceの参照元であるData Table「Parts」は次のように設定されている。

f:id:yuinomi:20210716065912p:plain

MU種類としては2つで、クラスライブラリのModels. assemble. MUs. にあるRedとBlueというMUが指示されている。2列目のinteger(Number)は個数を示していて、この場合は赤4個、青5個を交互に繰り返すことになる。

Sourceオブジェクトに戻り、他のタブも確認する。「出口」タブとして次のように設定されている。

 

f:id:yuinomi:20210716070326p:plain

出口ストラテジータブでは、オブジェクトがMUを移動させる先(下流)の指示をする。リストが設定されているので、開いて確認する。

f:id:yuinomi:20210716070545p:plain

MU属性(今回のサンプルモデルではMUの名前)によって、移動先を変えているようだ。赤が下流1、青が下流2へ排出するよう定義されている。

出口タブではストラテジの「ブロッキング」にチェックが付いているが、ブロッキングを選択すると、マテリアルフローオブジェクトは常にパートを指定された下流に移動させ、その下流が受け取る準備ができていない場合は、パートをブロック状態にする。

ちなみにストラテジとして選択できる種類は次のような19種類がある。

f:id:yuinomi:20210717075712p:plain

Sourceオブジェクトの設定は以上で、他のタブ(コントロールや故障)はデフォルト通りの空欄のようだ。

次にSourceから分岐しているParallel Procを確認していく。

f:id:yuinomi:20210717081040p:plain

前述のSourceオブジェクト出口ストラテジの設定で、MU「Red」を下流1、「Blue」を下流2と定義したが、下流の番号確認は、表示オプション→下流の表示で確認できる。通常はコネクタで接続した順に番号が付与される。

Prallel Procオブジェクトの概要はPlant Simulationヘルプで以下のように説明されている。

Parallel Proc には、同時並行にモバイルオブジェクト(MU )を処理するためのいくつかのステーションがあります。Parallel Proc のビルトインプロパティはStationと同じです。異なる点は、Stationの単一プロセッシングステーションとは対照的にParallel Proc にはいくつかのプロセッシングステーションがあることのみです。

ということで、複数同時処理ができる点以外はStationと同じなようだ。

それでは、上段にある「Red_parts」から設定項目を確認していく。

f:id:yuinomi:20210717082456p:plain

属性タブのX-サイズ、Y-サイズにはそれぞれ10が入力されている。これは配列で考えるので10x10=100箇所の処理場所ができたことを意味する。

f:id:yuinomi:20210717082813p:plain

次に時間設定タブを確認する。プロセス時間は0秒が一定として指定されている。つまり、このParallel Procは加工(処理)は何もせず、ただ前工程から流れてきたものを100個溜めおくだけのバッファ的役割ということだ。

「Blue_parts」も同様の設定だったので割愛する。

 

続いて左下の「Source_MainPart」を確認する。

f:id:yuinomi:20210717084549p:plain

属性タブは以下のような設定だ。Data Table「Products」の表に定義されたMUを”順番に繰返して選択”する。MUの作成間隔は3秒おきだ。

f:id:yuinomi:20210717084735p:plain

外部参照として指定されたData Table「Products」を確認する。

f:id:yuinomi:20210717084740p:plain

オブジェクトとしてのリンクとして .Models. assembly. MUs. Container のパスが指定されている。Aを1個、Bを2個ずつ作成する指示になっているのがわかる。

クラスライブラリの指示されたパスを辿って、MU「Container」を開いた。

f:id:yuinomi:20210717085405p:plain

左上にはMUサイズが定義されており、長さが1.2mのコンテナのようだ。また、左下のX-サイズ、Y-サイズはそれぞれ2なので、2x2=4個のパートを格納できることを意味する。

 

続いてはLineオブジェクト「Line_E」を確認する。

f:id:yuinomi:20210717085348p:plain

属性タブを以下に示す。Lineオブジェクトはフリーフローのコンベアをイメージすると分かりやすい。Line_Eは長さが5m、送り速度が1m/sであるので、コンベアに入ってきて出ていくまでの時間は5秒である。時間のところは、コンベア長さと速度を入力すれば自動計算で出るようになっている。

f:id:yuinomi:20210717085910p:plain

Lineオブジェクトは他のマテリアルフローと異なり、実際の長さをシミュレーション実行中に使用するので、MUのサイズ定義とLine(コンテナ)の長さと速度設定が重要である。

Lineオブジェクトに関してもう少し続ける。

容量は-1が指定されているが、これは∞を意味し、実際にはコンベア長さ5m、MUの長さ1.2mなので、最大で4個までコンベアに乗ることができることになる。Lineの容量デフォルトの-1のままで使用するのが良い。

次に、「累積」にチェックマークが付いているが、これはLineオブジェクトからの排出先が故障などでブロック状態にある時、Line上のMUが出口側に詰めて移動することができるかを意味する。「累積」にチェックを付けて、有効にした場合は、Lineオブジェクト上に載せれるだけのMUがびっしり並ぶことができるが、「累積」のチェックを外した場合は、出口側のMUが排出されないと次のMUが入ってこれない動きとなる。

ヘルプに累積の有効/無効の比較を示した分かりやすいイメージがあった。

f:id:yuinomi:20210717092922p:plain

 

次に、「MUの距離のタイプ」として「ギャップ」が選択されているが、ギャップとはMU間の間隔のことである。

f:id:yuinomi:20210717093123p:plain

Line_Eでは、このギャップを-1としているが、これはギャップ機能をオフすることを意味する。

 

さて、Lineオブジェクトの確認までが済んだので、次は「Assembly」Stationを確認する。Assemblyには前工程から3つのオブジェクトがコネクタで接続されているので、表示オプション→上流の表示で、上流番号を出しておいた。

 

f:id:yuinomi:20210717094243p:plain

まずは属性タブから。

f:id:yuinomi:20210717094250p:plain

アセンブリテーブルはMUタイプが指定され、開くとRedが1個、Blueが2個をアセンブリすることが指示されている。

f:id:yuinomi:20210717094633p:plain

「プロセッサからのメインMU」は上流番号1が指示され、上流1はLine_Eから供給されるContainerである。アセンブリモードは「MUを添付」、出口MUは「MU本体」なので、このAssemblyはメインのContainerにRedとBlueのオブジェクトを箱詰めして後工程に流すことがわかる。

f:id:yuinomi:20210717094300p:plain

時間設定タブではプロセス時間が2秒である。

f:id:yuinomi:20210717094308p:plain

次にコントロールタブを確認すると、入口にメソッド「setBOM」が定義されている。Plant Simulationの3回目の記事ではじめてコントロールが使われた。

f:id:yuinomi:20210717105900p:plain

Mがメソッドオブジェクトで左側に矢印が付いたものは特に入口コントロールを示す。ちなみに出口コントロールは右側に付く。

メソッドオブジェクト「setBOM」のプログラム文を確認すると、定義部分とswitch文の2つで構成される。まずは定義部分から。

 

var BOM:table

BOM := Assembly.AssemblyList

 

varとは、メソッド内のローカル変数を示す。BOMとは一般に部品表のことである。(Bill Of Material)ここでの定義は、AssemblyオブジェクトのAssemblyList(すなわちアセンブリテーブル)をデータ型が配列の”BOM”という変数で定義するということだ。

例えばBOMという変数に直接10という数字を格納したい場合は以下のように書く。

 

var BOM := 10

 

今回のサンプルモデルのように変数BOMを配列にしたい場合は、コロンで区切ってからデータ型を書く。サンプルのように2行に分けても良いし、下記のようにすれば1行で済ますこともできる。

 

var BOM : table := Assembly.AssemblyList

 

次はswitch文を確認する。switchの条件分岐の一般的なプログラムで、if文と使い分けがされる。複数の条件から選択したい場合、if文だとif-elseifが連続して見づらいが、swtich文だとすっきりする。メソッドには以下のように記述される。

 

switch  @.name

case "A"

   BOM[1,1] := "Red" 

   BOM[2,1] := 2 

   BOM[1,2] := "Blue" 

   BOM[2,2] := 1 

 

case "B"

   BOM[1,1] := "Red" 

   BOM[2,1] := 1 

   BOM[1,2] := "Blue" 

   BOM[2,2] := 2 

end

 

switch @.nameは、今回のサンプルモデルでは、Source_MainPartオブジェクトから供給されるContainerの名前である。

f:id:yuinomi:20210717084740p:plain

Container Aが来た時はcaseAの組み合わせで、Container Bが来た時はcaseBの組み合わせでアセンブリすることを指示している。

caseAには 【BOM[1,1] := "Red"  BOM[2,1] := 2】などと書いてあるが、BOMとは上述したようにAssemblyListのことなので、イメージは以下のような感じだ。 

f:id:yuinomi:20210717121711p:plain

アセンブリテーブルには、MU NameのRedが1個、Blueが2個と最初設定されていたものを、switch文のcaseで書き換えている。なので、BOM[1,1]とBOM[1,2]には必ずMU名を入れる必要があり、BOM[2,1]とBOM[2,2]は個数(数字)を入れる。

さらに、サンプルモデルのContainerはX-サイズ、Y-サイズがそれぞれ2で、2x2=4箇所にMUを配置できるため、アセンブリする個数は必ず4個以下にしないといけない。(4個以上にするとContainerにすべて置くことが出来ずエラーとなる)

ちなみに私は最初このサンプルモデルを見た時、BOM配列がContainerのMU内での配置ポジションを示すものかと勘違いしてしまったので、理解をするのにかなり時間がかかった。直接配置を指示するのではなく、AssemblyListの定義(上書き)なので注意が必要だ。ここで改めてシミュレーションを実行してみる。

f:id:yuinomi:20210717122825p:plain

ContainerにRed2個/Blue1個が乗ったcaseAと、Red1個/Blue2個が乗ったcaseBが指定された順序で流れているのがわかる。Container内で左上が必ずRedになっているのは、AssemblyListの1行目がRedなので、先にそちらから処理されるからだ。

(Assembly Stationにコネクトされている上流番号が影響するのかと思ったが、関係ないようだ)

 

ここまで確認できればこのサンプルはマスターできたも同然だ。Assemblyの後は、Lineオブジェクトがある。

f:id:yuinomi:20210717123514p:plain

コンベア長さが10m、速度は1m/sで定義されている。なのでContainerが入って出ていくまでの時間は10秒で、Container(MU)の長さは1.2mなので、最大でコンベア上に8個(1.2x8=9.6)詰めれば並べることができる。その先の「Drain」オブジェクトはデフォルトのままで特に設定はされていない。

以上で、サンプルモデルの設定項目の確認はすべて完了した。

 

STEP3:一部を変更してシミュレーション結果の確認

今回の主役であるメソッドオブジェクト「setBOM」を書き換えてみて、シミュレーション結果が狙い通りになるかを確認する。以下のようにプログラムを書き換えてみた。

 

switch  @.name

case "A"

   BOM[1,1] := "Red" 

   BOM[2,1] := 1

   BOM[1,2] := "Blue" 

   BOM[2,2] := 1 

 

case "B"

   BOM[1,1] := "Red" 

   BOM[2,1] := 1

   BOM[1,2] := "Blue"  

   BOM[2,2] := 3

end

 

caseAは赤1個/青1個、caseBは赤1個/青3個をアセンブリするようにして、シミュレーションを実行する。

f:id:yuinomi:20210717125641p:plain

期待した通りの配置、順序で流すことができた。

さらにおまけで、MU ContainerをX-サイズ2、Y-サイズ3(2x3=6箇所)に変更し、setBOMの方もcaseBは赤3個/青3個をアセンブリするよう変更すると、以下のようになった。

f:id:yuinomi:20210717130152p:plain

Container配置は2x3でもMUオブジェクトで表現されるようだ。赤と青と並びが微妙に違っているのは、おそらく赤/青のMUを作成しているSourceで、作成された順番が関係しているものと推測している。(要検証)

長くなってしまったが、以上でサンプルモデル『Change Assembly list』の確認完了だ。