Instant Engineering

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

Plant Simulation:メソッドによるStationでのテーブル組立 -Guard by Sim Talk-

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

www.plm.automation.siemens.com

 

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

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

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

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

STEP3:メソッドがあればメソッドオブジェクト内のプログラムも参照する。

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

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

 

◆サンプルモデル

 マテリアルフロー ⇒ Assembly ⇒ Guard by Sim Talk

 

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

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

A、B、C、Dと縦に4つ並んだSourceおよびStationからテーブルの脚が供給され、Assemblyオブジェクトで天板を取り付け組立している。

特徴として、組立(=アセンブリ)の仕事をするが、「Assembly」オブジェクトを使わず、「Station」で「Assembly Method」によるプログラム構文を活用することで模擬的に組立を実現している。さらにA~DのいずれのStationも次のAssembly(Station)にコネクタで接続されていない。

A~DのSourceは異なる時間で部品(脚)が生成され、StationA~Dすべてに部品が入った時に「Assembly」Stationに転送される。テーブルの天板は動画上では、モノの流れ的にどこからも供給されておらず、「Assembly」Stationに急に降って沸いたような形になっている。

 

Plant SimlationでのプログラムはSimTalkによって行う。SimTalkについてはヘルプで以下のように説明されている。

プログラム言語SimTalk は、シミュレーションをモデル化してコントロールすることができる方法を拡張します。各オブジェクトには、多くの便利な機能を提供する組込みプロパティがあります。ユーザのモデルに、より詳細なプロパティまたは完全に異なるプロパティが必要な場合、これらをプログラミング言語SimTalkでプログラムします。

モデルの概要を把握したので、次に各オブジェクトの設定内容を確認していく。

 

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

では、ここからは各オブジェクトの設定内容を順次確認していく。まずは左端のSourceオブジェクト4つ(名称がないので、上から順にa,b,c,d)を確認する。

f:id:yuinomi:20210711122252p:plain

Source"b"オブジェクトの属性タブ設定を次に示す。 

f:id:yuinomi:20210711122728p:plain

下端の「MU:」には、以下の階層が指定されている。

.Models. assembly. MUs. Legs

クラスライブラリのMUsにあるLegsというパートを固定で生成するオブジェクトで、生成の間隔は5:00と定義されている。SourceA~Dはこの間隔がそれぞれ違っており、Aは0:00、C&Dは10:00である。

つまり生成時間はA < B < C,Dであり、連続で動作させるとC,Dの間隔が遅いため律速になることがわかる。

ちなみに、生成が0:00というのは、後工程が受け入れ可能な状態であればゼロ秒で即座に生成することを意味する。(生成しない、ではないので注意)

Sourceオブジェクトについては属性タブ以外は特に設定はされていないようだ。

 

Sourceと次に接続されたStationを確認する。こちらも名称が付いていないので上から順にa,b,c,dとする。

f:id:yuinomi:20210711130836p:plain

Station"a"オブジェクトの属性タブは以下のように設定されている。

f:id:yuinomi:20210711131220p:plain

プロセス時間が「1:00」で、それ以外の項目はデフォルトである。また、a~d4つすべてが同じであった。よって、このStationオブジェクトは前工程から受け入れたMUを1分間何らかの加工をして、後工程に排出する。a~dで条件に違いはないので、ここで流れの差は生まれず、モデルとしてはあまり意味のないオブジェクトだ。

 

続いては、Stationの次に接続されたA,B,C,Dという名称が付いたStationを確認する。

f:id:yuinomi:20210711130846p:plain

確認した結果、こちらのStationA~Dについても、先ほどのStation"a"~"d"と同一の内容であった。(プロセス時間1:00だけ定義され、その他はデフォルト)

次に「Assembly」という名称のStationオブジェクトを確認する。本来なら、下図のようなアセンブリオブジェクトを使って、前工程から供給される複数の部品をコネクタで接続するが、今回のサンプルモデルではこれをStationで模擬している。

f:id:yuinomi:20210711132021p:plain

「Assembly」という名称のStationオブジェクト(ややこしいが…)のダイアログは以下のような設定である。

f:id:yuinomi:20210711132500p:plain

確認した結果、時間設定タブでプロセス時間として「1:00」が定義されたのみで、それ以外は特になかった。セットアップ、故障、コントロール、出口ストラテジなど他のタブもすべてチェックしたが特に設定はなく、次のメソッドに必要な要件がすべて盛り込まれているようだ。

 

次に「AssemblyMethod」オブジェクトからプログラムを順に確認していく。プログラムはコメントで4つの区切りに分割されていて、1つ目はWaituntilが成立する条件を示す。

 

-- called by: init and itself via ref().methCall(0);
-- wait until all parts are available and the assembly station is free

Waituntil A.occupied and

    B.occupied and

    C.occupied and

    D.occupied and

    Assembly.empty prio 3

 

ここでA,B,C,Dと表現されているのは、Sourceから2つ隣のStationオブジェクトである。A~DのStationが占領(つまり部品がある状態)されており、且つ、「Assembly」Stationが空である時、Waituntil分がTrueとなり、以下のメソッドが実行される。

なお、prioとはWaituntil文またはStopuntil文で使用されるオプションキーワードであり、priorityの略である。その後の整数は優先度を解析するためのinteger式。

 

-- create a new main part on the assembly station
~.MUs.plate.create(Assembly)

 

MUの「plate」を「Assembly」Stationに作成することを指示している。この1行で本サンプルモデルの謎が一つ解けた。Sourceオブジェクトで作成が定義されているのはLegsだけであり、テーブルの天板にあたるplateはどこに作成の仕掛けがあるのか不明だったが、メソッド内にプログラム文として記述されていた。

 

-- assemble all parts to the main part
A.cont.move(Assembly.cont)
B.cont.move(Assembly.cont)
C.cont.move(Assembly.cont)
D.cont.move(Assembly.cont)

 

次の4行では、 A~DのStationにある部品(Legs)をメイン部品であるPlateに組み立てるためにAssembly Stationに移動することを指示している。

moveコマンドは、前に書いてあるを、後に書いたところへ移動させる。Plant Simulationのヘルプには以下のように説明されている。(翻訳が分かりにくいが)

 

move メソッドは、MUパスで指定されたMU の前部を移動します。

MU の下流を入力すると、MU が置かれているオブジェクトおよび下流がConnector と接続されているとしても、move メソッドはMU をこの下流に移動します。

 

contは読み取り専用属性で、Pathで指定されたオブジェクト上に配置されているMUを返す。今回は例えば「A.cont」でAはStationオブジェクトであり容量は1なので、Stationオブジェクトに配置されたMU「Legs」を返す。

 

構文:  Path.Cont

Plant Simulationのヘルプではcontを用いる際のポイントとして以下のように説明されている。

・オブジェクトの容量が1のとき、Cont はMUが配置されているオブジェクトを返します。
・オブジェクトがAssemblyStation またはDismantleStation のとき、Contはメインパートを返します。

・オブジェクトの容量が1より大きいときは、Contは次に出ることができるMUを返します。
MUがオブジェクト上に配置されていないときは、ContはVOIDを返します。 

Cont (MUs)


-- starts method execution again
self.methcall(0)

 

メソッドの実行を再開する。

以上でサンプルモデルGuard by Sim Talkのオブジェクト設定の確認は以上だ。

 

STEP3:メソッドのプログラムを確認

INIT 初期化メソッドには以下が記述される。

-- Start the guard "Assemblymethod".

 &Assemblymethod.methcall(0)

 

さいごに

今回のサンプルモデルをシミュレーション実行すると、「AssemblyMethod」に図のような紫色のドットが表示される。

f:id:yuinomi:20210714175145p:plain

緑は「実行中」を示し、赤は「エラー」であるが、紫は初めて見たのでヘルプで調べた結果、「stopuntilまたはwaituntil命令によって待ち状態」を示すようだ。