<シミュレータに制御信号が伝達されない例>
まず、発明を実施するための形態を説明する前に、前述した、同期タイミングによってはシミュレータに制御信号が伝達されない事態についての具体例を説明する。
図1は2つのシミュレータが互いに信号を交換しながら時間同期を取る際の通信シーケンスを示している。シミュレータ管理部は、シミュレータ1とシミュレータ2との間の時間同期および制御信号の送受信を管理する。ここではシミュレータ1は仮想時刻880ms、960msで時間同期を取り、シミュレータ2は仮想時刻840ms、900ms、960msで時間同期を取ると仮定している。すなわち、各シミュレータは上記の仮想時刻でそれぞれ他のシミュレータとの信号のやり取りを行うと仮定している。なお、以下、本明細書では仮想時刻のことを単に時刻と表記する場合がある。
図1においてシミュレータ2の出力信号をシミュレータ1に通知する動作に着目すると、まずシミュレータ2の仮想時刻840msの出力信号がシミュレータ管理部に通知される。この信号はシミュレータ1の仮想時刻880msの同期タイミングでシミュレータ管理部からシミュレータ1に通知される。続いて、シミュレータ2の仮想時刻900msの出力信号がシミュレータ管理部に通知される。しかしながら次にシミュレータ1が同期を取る仮想時刻が960msであり、この仮想時刻はシミュレータ2も同期を取るタイミングである。このことからシミュレータ2が仮想時刻900msでシミュレータ管理部に通知した出力信号は次に960msで通知する出力信号にて上書きされてしまう。すなわち、図1に示される通り、シミュレータ2の仮想時刻900msの出力信号はシミュレータ1に通知されずに消えてしまう。
互いに通知する制御信号が正しく伝達されない場合についての具体例を示すため、ここではシミュレーション対象の製品としてベルトコンベアーを例にとって説明する。図2はこのベルトコンベアーの機構動作を模擬するメカシミュレータであり、図1のシミュレータ1に相当する。また、図1のシミュレータ2として、ベルトコンベアーを制御するプログラムの動作を模擬するソフトウェアシミュレータを想定する。
図2に示すメカシミュレータのベルトコンベアーにはローラー1にモーターが備え付けられている。このモーターはソフトウェアシミュレータから通知されるモーター駆動開始割り込み信号がLowからHighに変化(立ち上がりエッジと呼ばれる)すると回転を始める。このモーターの回転に伴い、ローラー1が回転し、さらにベルトおよびローラー2が連動して動作する。そしてベルトの動きに合わせてベルト上の荷物が運ばれる。
さらに、荷物が指定位置に到達したことを通知するために位置センサーを設け、メカシミュレータは、このセンサー信号をソフトウェアシミュレータに通知する。
このような構成において、仮に図1のシミュレータ2に相当するソフトウェアシミュレータが仮想時刻840msまではモーター駆動開始割り込み信号の値をLowとして出力する。そして、仮想時刻900msでHigh、仮想時刻960ms以降は再びLowを出力すると仮定する。この仮定においてソフトウェアシミュレータの仮想時刻900msの出力信号は図1で説明したように、仮想時刻960msの信号で上書きされてしまう。すなわち仮想時刻900msで出力されるHighの信号がLowで上書きされてしまう。結果、メカシミュレータはモーター駆動開始割り込み信号の値がLowである信号をシミュレータ管理部から受信し続けることになり、所望の信号レベルを得ることができない。これはメカシミュレータがソフトウェアシミュレータからのモーター駆動開始のための割り込み信号を受け付けることが出来ていないことを意味しており、ベルトコンベアーは動作しない。このように信号によっては1回の取りこぼしによって製品の動作を再現できなくなる問題が生ずる。製品の動作として成立させるためには、正確な時間ではなくても製品規格通りに順序を守って確実に信号を伝えることが重要になる。
このような問題に対する一般的な解決手法として、同期間隔を十分に細かくすることが考えられるがその場合は細かくした分だけ通信回数が増えるため全体としての処理のオーバーヘッドが増加するという別の問題が生まれる。同期間隔を半分にすれば通信回数は2倍である。
後述する実施例では複数のシミュレータを連携する際に発生する前述した問題を鑑み、通信のオーバーヘッドを増やすことなく信号の取りこぼしを防止するシミュレーション装置を提供する。
以下、本発明にかかる実施例を詳細に説明する。
実施例1について、先に構成について説明し、続いて手順について説明する。
<構成の説明>
図3は実施例1に係るシミュレーション装置300の構成の一例を示す図である。図3に示されるようにシミュレーション装置300は、コンピュータによって実現され得る。シミュレーション装置300は、シミュレータ管理部310と、メカ部品320と、メカシミュレータ330と、ソフトウェア部品340と、ソフトウェアシミュレータ350と、バス360とを有する。
メカ部品320やソフトウェア部品340は、シミュレーション対象の製品挙動を模擬するためのシミュレーション部品の一例である。シミュレーション部品とは例えば機構シミュレータであれば3D-CAD(Computer Aided Design)で作成された3D形状データや重力や摩擦など3D形状データに付加される物理現象データから構成される。ソフトウェアシミュレータであれば、コンピュータプログラムなどから構成される。
シミュレータ管理部310は、通信部311、メッセージ記録部312、同期管理部313、連結関係管理部314、加工部315、および加工方法指定部316を有する。
メカシミュレータ330は、部品読み込み部331、シミュレーション実行部332、仮想時刻管理部333、メッセージ記録部334、および通信部335を有する。
ソフトウェアシミュレータ350は、部品読み込み部351、シミュレーション実行部352、仮想時刻管理部353、メッセージ記録部354、および通信部355を有する。
メカシミュレータ330とソフトウェアシミュレータ350とは、扱うシミュレータ部品が異なる点を除けば構成としては共通のものとして説明することが可能であるので、以下ではメカシミュレータ330の構成について説明する。
部品読み込み部331は、シミュレーション対象の製品挙動を模擬するシミュレーション部品であるメカ部品320を読み込む。
シミュレーション実行部332は、部品読み込み部331によって読み込まれたシミュレーション部品であるメカ部品320に応じて製品挙動を模擬するためのシミュレーション演算を行う。またシミュレーション実行部332は、他のシミュレータから通知される制御信号を受け付け、シミュレーション演算を行い、演算によって他のシミュレータへの制御信号を生成する。これらの制御信号はメッセージに格納され、メッセージ記録部334にて管理される。メッセージの具体例は後述する動作の説明にて示す。
仮想時刻管理部333は、シミュレーション実行部332のシミュレーション演算によって進む仮想時刻を管理する。また仮想時刻管理部333は他のシミュレータと時間同期をとる仮想時刻の決定も行う。この決定はシミュレータによって異なる。例えば予め指定された時刻ごとであったり、シミュレーション実行部332が生成する他のシミュレータへの制御信号に変化があった場合などである。
メッセージ記録部334は通信部335を介して送受信されるメッセージを管理する。メッセージには各シミュレータが持つ仮想時刻や複数のシミュレータ間で送受信される制御信号などが含まれる。
通信部335はシミュレータ管理部310とバス360を介してメッセージを送受信するための通信を行う。
次に、シミュレータ管理部310の構成について説明する。
通信部311は、複数のシミュレータ(メカシミュレータ330、ソフトウェアシミュレータ350)とバス360を介してメッセージを送受信するための通信を行う。
メッセージ記録部312は、複数のシミュレータと送受信を行うメッセージを管理する。メッセージには複数のシミュレータから通知された仮想時刻や各シミュレータ間で互いに通知する制御信号を含む。またそのメッセージが、連結する他のシミュレータに通知されたか否かを示すパラメータも含む。具体例は後述する。
同期管理部313は、複数のシミュレータが保持する仮想時刻を比較することで時刻の同期をとる。具体的にはメッセージ記録部312を参照し、各シミュレータが持つ仮想時刻を比較することで最も遅い時刻を持つシミュレータを特定し、そのシミュレータに対してのみ進行を指示する。具体的な動作は後述する。
連結関係管理部314は、複数のシミュレータの連結関係を定義する。この定義によってどのシミュレータの制御信号をどのシミュレータに通知すべきかが判断できる。
加工部315は、制御信号の取りこぼしを防ぐために複数のシミュレータ間で送受信される制御信号を、加工方法指定部316によって指定される加工方法に基づいて加工する。
加工方法指定部316は、制御信号の取りこぼしを防ぐために複数のシミュレータ間で送受信される制御信号をどのように加工するかを指定する。
バス360は、各シミュレータおよびシミュレータ管理部310間での情報をやり取りする。
シミュレーション装置300は、シミュレータ管理部310、メカシミュレータ330、およびソフトウェアシミュレータ350の各構成を、RAMに格納されたコンピュータプログラムをCPUが読み込んで実行することによって実現する。
なお、図3の例においては、シミュレーション装置300を1台のコンピュータ上で構成する例を用いて説明したが、複数のコンピュータを介してシミュレーション装置を構成してもよい。すなわち、図3のバス360の代わりにLANに代表されるネットワーク回線を用いて各シミュレータを構成する各コンピュータと、シミュレータ管理部を構成するコンピュータとを接続してもよい。このように、複数の分散されたコンピュータによってシミュレーション装置が実現されてもよい。
また各シミュレータは必ずしもコンピュータ上で模擬するシミュレータである必要はない。シミュレータの一部あるいは全部を実製品やFPGA (Field Programmable Gate Array)などの検証用モジュールに置き換えて構成しても良い。
このような構成において具体的にどのようにシミュレーションが実施されるかの一例を説明する。
<動作の説明>
本実施例では、まず事前準備ステップを行い、その後、シミュレーション実行ステップを行う。
事前準備ステップの詳細について図4のフローを用いて説明する。図4のフローは、RAMなどに格納されたプログラムをCPUが実行することによって実現される。なおより詳細には、ステップS401〜S403はメカシミュレータ330およびソフトウェアシミュレータ350に関する処理であり、ステップS404〜S406はシミュレータ管理部310に関する処理である。
ステップS401では、シミュレーション装置300は、連携するシミュレータを起動する。すなわちシミュレーション装置300は、メカシミュレータ330およびソフトウェアシミュレータ350を起動する。
ステップS402では、ステップS401で起動した各シミュレータがシミュレーション部品を読み込む。メカシミュレータ330は、図2に示されるようにベルトコンベアーの形状などの機構情報からなるメカ部品320を読み込む。ソフトウェアシミュレータ350はベルトコンベアーを制御するためのソフトウェア部品340を読み込む。
ステップS403では、各シミュレータがシミュレータ管理部310にシミュレーション参加要求メッセージを通知する。図5は、各シミュレータからシミュレータ管理部310に対して通知されるシミュレーション参加要求メッセージと、シミュレータ管理部310において記録されるメッセージの例とを示す図である。シミュレーション参加要求メッセージの内容は、図5(a)および(b)に示すように、参加を意味するメッセージ種別(Connect)501、仮想時刻502、外部に出力したい信号とその初期値503および入力を受け付けたい信号の一覧504を含む。図5(a)はメカシミュレータ330が通知するシミュレーション参加要求メッセージである。出力する信号である位置センサー信号の初期値としてLowが設定されており、入力を受け付けたい信号としてモーター駆動割り込み信号を指定している。図5(b)はソフトウェアシミュレータ350が通知するシミュレーション参加要求メッセージである。出力する信号であるモーター駆動開始割り込み信号の初期値としてLowが設定されており、入力を受け付けたい信号として位置センサー信号を指定している。また、図5(a)および図5(b)に示すシミュレーション参加要求メッセージには、通知元505と通知先506とを示す値がそれぞれ指定されている。たとえば図5(a)に示すメカシミュレータから通知されるメッセージの例では、通知元505としてメカシミュレータが指定され、通知先506としてシミュレータ管理部が指定されている。なお、図5に示すメッセージは、これらの情報が互いに識別可能であればいずれの形式であってもよい。たとえば、通知元505にはシミュレータ識別子のみ指定されていてもよく、入力を受け付けたい信号504には単に信号種別を特定するための値が指定されているような形式であってもよい。以下、本明細書で説明する各種のメッセージについても同様である。
図4のフローチャートに戻り、処理の説明を続ける。ステップS404では、シミュレータ管理部310は、ステップS403で各シミュレータから通知される参加要求メッセージを受信し、そのメッセージをメッセージ記録部312に記録する。記録されるメッセージは図5(c)および(d)に示すように、受信したメッセージに含まれる仮想時刻551およびシミュレータからの出力信号の一覧553である。また制御信号の取りこぼしを防ぐため、その仮想時刻551におけるメッセージをまだ連結先のシミュレータに通知していないことを示すパラメータ(Send”送信先シミュレータ名”=FALSE)552も記録する。この「送信先シミュレータ名」には、後述するステップS405で説明する連結定義が行われたシミュレータ名が指定されることになる。連結とは、あるシミュレータと別のシミュレータとを結びつけることであり、具体的には、あるシミュレータから通知されるメッセージを、どのシミュレータに対して送信するかを、シミュレータ管理部310において定義付けするものである。詳細については後述する。図5(c)はメカシミュレータ330から通知された参加要求メッセージをシミュレータ管理部310がメッセージ記録部312に記録する内容である。図5(d)は同様にソフトウェアシミュレータ350から通知された参加要求メッセージをシミュレータ管理部310がメッセージ記録部312に記録する内容である。以下、連結先のシミュレータに通知されていないメッセージのことを未通知のメッセージと呼び、通知されたメッセージを通知済みのメッセージと呼ぶ。メッセージ記録部312においては、図5(c)および(d)に示すように、各シミュレータごとに、各シミュレータから通知されるメッセージを、仮想時刻および通知の有無を示すパラメータと関連付けて記録する。
図4のフローチャートに戻り、処理の説明を続ける。ステップS405ではシミュレータ管理部310の連結関係管理部314が連結定義を行う。連結定義はメッセージ記録部312に記録されたメッセージから、参加要求を出したシミュレータとその入出力信号の一覧を元に連結関係を定義する。すなわち制御信号の通知元と通知先を定義する。例えば連結関係管理部314は、図6(a)に示すような画面を用いてシミュレータの出力信号(通知元)と入力信号(通知先)とを関連付ける。設定1ではモーター駆動割り込み信号をソフトウェアシミュレータ350からメカシミュレータ330に通知する連結定義を行っている。設定2では位置センサー信号をメカシミュレータ330からソフトウェアシミュレータ350に通知する連結定義を行っている。なお、図6(a)に示すように、連結関係管理部314は、連結定義をユーザからの指定によって設定してもよい。あるいは、各シミュレータから通知される参加要求メッセージに含まれる情報に基づいて自動的に設定してもよい。
図4のフローチャートに戻り、処理の説明を続ける。ステップS406ではシミュレータ管理部310の加工方法指定部316が、メッセージの加工方法を指定する。メッセージの加工方法の指定はメッセージ記録部312に記録された各シミュレータが出力する信号をどのように加工するかを選択する。例えば図6(b)に示すような画面を用いてユーザからの指定を受け付ける。加工方法には、最大値、最小値、平均値、積分などの選択肢があり、信号の性質に合わせて加工方法を選択できる。図6(b)の設定1ではソフトウェアシミュレータ350が出力するモーター駆動割り込み信号に対して最大値を取得する加工方法を指定している。これは、たとえばソフトウェアシミュレータ350からシミュレータ管理部310に通知されたモーター駆動割り込み信号を、シミュレータ管理部310からメカシミュレータに送信する際に、その信号値を変更(すなわち加工)する方法を指定する。また設定2ではメカシミュレータ330が出力する位置センサー信号に対して最大値を取得する加工方法を指定している。なお、加工方法はシミュレーション途中で変更しても良い。
以上で事前準備は完了である。続いてシミュレーション実行手順の詳細について図7のフローを用いて説明する。
ステップS701では、シミュレータ管理部310はシミュレーション開始要求メッセージを各シミュレータに通知する。シミュレーション開始要求メッセージの内容を図8(a)および(b)に示す。図8(a)はシミュレータ管理部310からメカシミュレータ330に対して通知するメッセージである。メッセージには開始を意味するメッセージ種別(Start)901、仮想時刻902、参加要求メッセージで指定した、メカシミュレータ330が入力を受け付けたい信号の一覧903が含まれる。この信号一覧に含まれる値に関してはステップS405で定義された連結定義を元に決定している。図8(b)は同様にシミュレータ管理部310からソフトウェアシミュレータ350に対して通知するメッセージである。なお、シミュレーション開始要求メッセージを送信したシミュレータ管理部310は、後述するステップS704で同期要求メッセージが通知されるまで待機する。またステップS404で未通知として記録したメッセージ(すなわち、図5(c)および(d)のメッセージ)を通知済み(Send”送信先シミュレータ名”=TRUE)に更新する。
ステップS702では、各シミュレータはステップS701でシミュレータ管理部310から通知されたシミュレーション開始要求メッセージを各メッセージ記録部334、354)に記録する。
ステップS703では、各シミュレータのシミュレーション実行部332、352は、ステップS702で記録されたメッセージを元にシミュレーション演算を開始する。このシミュレーション演算は各シミュレータの仮想時刻管理部333および353が決定した、同期をとる時刻まで進行する。
ステップS704では各シミュレータが、同期をとる時刻までシミュレーションの実行を進行すると同期要求メッセージをシミュレータ管理部310に通知する。同期要求メッセージの内容の例を図8(c)および(d)に示す。同期要求メッセージには同期要求を意味するメッセージ種別(Sync)911、進行した仮想時刻912、シミュレーション演算によって生成された出力信号913、および入力を受け付けたい信号の一覧914を含む。図8(c)はメカシミュレータ330からシミュレータ管理部310に通知される同期要求メッセージであり、仮想時刻80msにおける位置センサー信号の値がLowであることを示している。また図8(d)は同様にソフトウェアシミュレータ350からシミュレータ管理部310に通知されるメッセージであり、時刻60msにおけるモーター駆動割り込み信号の値がLowであることを示している。
なお、シミュレータ管理部310に同期要求メッセージを通知した各シミュレータは、後述するステップS710のシミュレーション進行メッセージあるいはステップS711のシミュレーション終了メッセージが通知されるまで待機する。後述するように、同期要求メッセージに含めた、入力を受け付けたい信号の入力がシミュレータ管理部310からのシミュレーション進行メッセージに含まれて通知される。よって、各シミュレータは、シミュレーション進行メッセージが通知されるまでは、シミュレーションを進行せずに待機する。なお、シミュレーション終了メッセージが通知された場合には、そのままシミュレーションを終了することになる。
ステップS705ではシミュレータ管理部310はステップS704で通知された同期要求メッセージをメッセージ記録部312に記録する。メッセージ記録部312で記録されるメッセージは図5(c)および(d)に示す参加要求メッセージの記録時から図8(e)および(f)に示されるメッセージに更新される。更新される内容はステップS704で通知された同期要求メッセージに基づいた仮想時刻821および出力信号の一覧823である。また制御信号の取りこぼしを防ぐため、その仮想時刻におけるメッセージが未通知であることを示すパラメータ822も記録する。なお、先に説明したように、シミュレーション参加要求時に記録した仮想時刻0の通知の有無を示すパラメータ825が通知済み(TRUE)に更新されている。このように、未通知であることを示すパラメータは、後述するようにシミュレーション進行メッセージにおいてその仮想時刻におけるメッセージが通知される場合には、メッセージが通知済みであること示すパラメータに変更される。
ステップS706では、シミュレータ管理部310はステップS404で記録された参加要求メッセージを通知した全てのシミュレータから同期要求メッセージを受信していなければ、次の同期要求メッセージを受信するまで待機する。たとえば、図8の例では、シミュレータ管理部310は、図8(d)に示す同期要求メッセージを仮想時刻60msで受信した時点では、メカシミュレータ330から同期要求メッセージを受信していないので、待機をしていることになる。なお、同期要求メッセージに応答して後述するシミュレーション進行メッセージをシミュレータ管理部310が通知した場合には、その通知先のシミュレータからの同期要求メッセージについては受信していないとの状態に変更となる。すなわち、ステップS706は、シミュレータ管理部310が未対応の同期要求メッセージを全てのシミュレータから受信した状態であるかを判定する処理であるともいえる。
全てのシミュレータから同期要求メッセージを受信した場合、ステップS707では同期管理部313は、ステップS705で記録された図8(e)および(f)に示す同期要求メッセージを参照し、各シミュレータの仮想時刻を比較する。比較する仮想時刻は図8(e)および(f)の仮想時刻821と824のように、各シミュレータが通知した最新の同期要求メッセージに基づいて記録されたメッセージである。比較によって最も進行が遅れているシミュレータ、すなわち最も小さい仮想時刻を持つシミュレータを特定する。仮に図8(e)および(f)に示すメッセージであれば、メカシミュレータ330は80ms、ソフトウェアシミュレータ350は60msであることからソフトウェアシミュレータ350の進行が最も遅れていると特定できる。なお、最も小さい仮想時刻を持つシミュレータは1つとは限らない。比較した時刻が同時刻である場合は両方のシミュレータを最も進行が遅れているシミュレータとして特定する。またシミュレータが3つ以上ある場合も同様に、1つ以上の最も遅れている仮想時刻を持つシミュレータが特定される。
ステップS708ではシミュレータ管理部310は、必要に応じてステップS406で指定した加工方法に基づき同期要求メッセージの加工を行い、最も進行が遅れているシミュレータに通知するメッセージを決定する。なお、ステップS708のメッセージの加工処理には、加工対象となるメッセージの抽出処理と、抽出したメッセージを加工する処理とが含まれる。ステップS708では、加工対象となるメッセージを抽出するものの、実際に加工しない場合も含まれる。ステップS708で実際にメッセージを加工する場合とは、後述するように所定の条件に合致した場合である。換言すれば、所定の条件に合致しない場合には、ステップS708においては実際の加工処理を実行しない。
メッセージの加工はまず加工対象の抽出を次に示す2つの条件に基づき行う。第一の条件は、シミュレータ管理部310からメッセージを受信する側のシミュレータの仮想時刻以前の仮想時刻を持つ、シミュレータ管理部310に通知されたメッセージである。ここで、メッセージを受信する側のシミュレータとは、上述したステップS708で特定された最も進行の後れているシミュレータである。つまり、ステップS708では、最も進行の遅れているシミュレータからの同期要求メッセージに応答した同期進行メッセージ(後述)に含める信号を加工する処理となる。そして、その同期進行メッセージで入力を受け付けたいメッセージのうち、メッセージを受信する側のシミュレータの仮想時刻よりも以前の仮想時刻を持つメッセージが加工対象となる。第二の条件はメッセージ記録部312に記録されているメッセージの中の通知が行われたか否かを表すパラメータを参照し、未通知であるメッセージ(Send”送信先シミュレータ名”=FALSE)のみである。そして、この2つを満たすメッセージが2つ以上ある場合は、その2つ以上のメッセージを対象に加工し、通知するメッセージを生成する。1つの場合は取りこぼしにならないことを意味し、加工を行わず、そのメッセージを通知する。1つもない場合は、通知が行われたか否かを示すパラメータを参照し、通知が行われたメッセージの中で最新の仮想時刻を持つメッセージを通知する。この場合も取りこぼしにはならない。
図8(e)および(f)を例にとって説明する。最も進行の遅れているシミュレータ、すなわち同期進行メッセージを受信する側のシミュレータはソフトウェアシミュレータ350である。そして、図8(f)を参照すると受信側のソフトウェアシミュレータの仮想時刻は60msである。この時刻よりも前の仮想時刻を持つ第一の条件を満たすメッセージは、図8(e)を参照すると、メカシミュレータが参加要求時に通知したメッセージ925のみである。この時刻のメッセージはステップS701で通知済みに設定されているため、第二の条件を満たさない。つまり、2つの条件を満たすメッセージが1つもない場合に相当する。したがって、通知が行われたメッセージの中で最新の仮想時刻を持つメッセージを通知することになる。したがって、ソフトウェアシミュレータに仮想時刻60msにおいて通知される同期進行メッセージは、メカシミュレータの通知済みの最新の仮想時刻0msを持つメッセージが選択される。すなわちメカシミュレータ330の仮想時刻0msにおける位置センサー信号Lowがソフトウェアシミュレータ350に通知される。
ステップS709ではシミュレーションの終了時刻に到達したかの判定を行う。終了時刻に到達したかの判定は利用者が終了指示を出したか否かで判定しても良いし、予め終了時刻を決めておいても良い。
シミュレーションの終了時刻に到達していない場合、シミュレータ管理部310はステップS710において、ステップS707で特定した進行の遅いシミュレータに対してシミュレーション進行メッセージを通知する。シミュレーション進行メッセージにはシミュレーション進行を意味するメッセージ種別(Sync-Ack)、および同期要求メッセージで指定した入力を受け付けたい信号の一覧が含まれる。ここで、シミュレータ管理部310から通知されるシミュレーション進行メッセージには、ステップS704で指定した入力を受け付けたい位置センサー信号に対して、ステップS708で決定した値(図8(e)の場合にはLow)が設定される。すなわち、ステップS708の加工処理を経て得られた値が、入力を受け付けたい信号の値として設定され、シミュレータ管理部310から各シミュレータに通知される。なお、シミュレータ管理部310のメッセージ記録部312は、通知したメッセージを通知済み(Send”送信先シミュレータ名”=TRUE)に更新する。
シミュレーションの終了時刻に到達している場合、ステップS711においてシミュレータ管理部310は、各シミュレータに対してシミュレーション終了メッセージを通知し、シミュレーション実行を終了する。シミュレーション終了メッセージにはシミュレーション終了を意味するメッセージ種別(Exit)、進行した仮想時刻、および同期要求メッセージで指定した入力を受け付けたい信号の一覧が含まれる。なお、メッセージ記録部312は、上記のステップS710と同様に、通知されたメッセージおよびステップS708で加工対象になったメッセージを通知済みを意味するパラメータ(Send”送信先シミュレータ名”=TRUE)に更新する。
ステップS710にてシミュレータ管理部310から通知されたシミュレーション進行メッセージを受信したシミュレータは、ステップS703にて、通知されたメッセージを入力としてシミュレーションを継続する。そしてシミュレーションが次の同期タイミングまで進行すると、各シミュレータは同期要求メッセージをシミュレータ管理部310に通知する(ステップS704)。
<具体的な動作説明>
メッセージの加工によって得られる本実施例の効果を図9を用いて具体的に示す。図9はシミュレータ管理部310と2つのシミュレータ(メカシミュレータ330およびソフトウェアシミュレータ350)とが通信を行うタイミングを示している。図9は、図7のステップS703〜ステップS710を継続して繰り返し、メカシミュレータ330は時刻880msまで、またソフトウェアシミュレータ350は時刻900msまでシミュレーションが進んでいる状況を仮定する。なお、直前の時刻840msにおいてソフトウェアシミュレータ350からシミュレータ管理部310に対して通知される同期要求メッセージを図10(a)に示す。またシミュレータ管理部310が、通知された図10(a)で示す同期要求メッセージを記録した内容を図10(b)に示す。
この時、ステップS704にて図9の時刻880ms(910)でメカシミュレータ330がシミュレータ管理部310に通知する同期要求メッセージを図10(c)に示す。また同じく図9の時刻900ms(940)でソフトウェアシミュレータ350がシミュレータ管理部310に通知する同期要求メッセージを図10(d)に示す。図10(b)および(d)に示されるように、ソフトウェアシミュレータ350は時刻840msまで出力するモーター駆動開始割り込み信号がLowであり、時刻900msで初めてHighになる動作を想定している。
次に、メカシミュレータ330は時刻880msまで、またソフトウェアシミュレータ350は時刻900msまでシミュレーションが進んでいる状況での説明を続ける。なお、ステップS705では各シミュレータから同期要求メッセージの通知を受けたシミュレータ管理部310は通知されたメッセージをメッセージ記録部312に記録している。このときの、各シミュレータ毎にシミュレータ管理部310のメッセージ記録部312に記録されているメッセージを図11に示す。図11(a)は、メカシミュレータ330からの時刻880msのメッセージを記録したものでり、図11(b)はソフトウェアシミュレータ350からの時刻900msのメッセージを記録したものである。
ステップS707ではメカシミュレータ330の最新の仮想時刻880ms(1101)およびソフトウェアシミュレータ350の最新の仮想時刻900ms(1113)を比較し、進行が遅れているシミュレータとしてメカシミュレータ330を特定する。
続いてステップS708では、シミュレータ管理部310は、進行が遅れているメカシミュレータ330を、メッセージが受信される側のシミュレータであると特定し、メカシミュレータに対して通知されるメッセージを加工する。すなわち、ソフトウェアシミュレータ350からの同期要求メッセージを記録した、図11(b)に示されるメッセージを加工して行われる。加工対象となるメッセージは第一の条件を満たす仮想時刻880ms以下のメッセージ、かつ第二の条件を満たす未通知のメッセージである。ここでは、ソフトウェアシミュレータ350の出力信号において加工対象となるメッセージが時刻840ms(1112)のみである。したがって、同期タイミング910の応答として時刻840msのメッセージに含まれる信号値がそのままシミュレーション進行メッセージに含まれてメカシミュレータに通知される(ステップS710)。またこの時、メッセージ記録部312はソフトウェアシミュレータの時刻840msのメッセージ(図11(b)の1112)を通知済み(TRUE)に更新する。
続いて進行メッセージを受信したメカシミュレータ330は次の同期タイミングである960ms(920)までシミュレーションを進め(ステップS703)、シミュレータ管理部310に対して同期要求メッセージを通知する(ステップS704)。メカシミュレータから時刻960msで通知されるメッセージを図12(a)に示す。
図12(a)に示す同期要求メッセージの通知を受けたシミュレータ管理部310は、通知されたメッセージをメッセージ記録部312に記録する(ステップS705)。記録されたメッセージを図12(c)の1202に示す。この時のシミュレータ管理部310は、メカシミュレータ330の時刻960ms(1202)およびソフトウェアシミュレータ350の時刻900ms(図11(b)の1113)を比較する。そして、遅れているシミュレータとしてソフトウェアシミュレータ350を特定する(ステップS707)。
続いて図11(a)に示されるメッセージを加工する(ステップS708)。加工対象となるメッセージは第一の条件を満たす仮想時刻900ms以下のメッセージ、かつ第二の条件を満たす未通知のメッセージである。すなわち、仮想時刻880ms(図11(a)の1101)のみであることから、このメッセージがそのまま通知される。またこの時、メッセージ記録部312は時刻880msのメッセージ(図11(a)の1101)を通知済みに更新する。したがって、図12(c)の1201の時刻880msのメッセージが通知済みとなっている。
同様に進行メッセージを受信したソフトウェアシミュレータ350は次の同期タイミングである960msまでシミュレーションを進め(ステップS703)、シミュレータ管理部310に対して同期要求メッセージを通知する(ステップS704)。通知されるメッセージを図12(b)に示す。図12(b)に示されるように、ソフトウェアシミュレータ350は仮想時刻960msで出力するモーター駆動開始割り込み信号をLowに戻す動作を想定している。
通知を受けたシミュレータ管理部310は通知されたメッセージをメッセージ記録部312に記録する(ステップS705)。記録されたメッセージを図12(d)の1213に示す。
続いてステップS707では、メカシミュレータ330の仮想時刻とソフトウェアシミュレータ350の仮想時刻とを比較する。図12(c)および(d)からメカシミュレータ330の仮想時刻960ms(1202)およびソフトウェアシミュレータ350の仮想時刻960ms(1213)は、どちらも960msまで進んでおり同じ仮想時刻であること。したがって、両シミュレータに対してシミュレーション進行メッセージを通知する処理を行うことになる。
ステップS708ではソフトウェアシミュレータ350に対して通知するメッセージの加工を行う。加工対象となるメッセージは第一の条件から仮想時刻960ms以下、かつ第二の条件から未通知を満たすメッセージである。この条件を満たすメッセージは仮想時刻960ms(1202)のみであることから、メカシミュレータからの時刻960msのメッセージがそのまま通知される。同様に、メカシミュレータ330に対して通知するソフトウェアシミュレータ350の出力信号についても確認する。加工対象となるメッセージは第一の条件から960ms以下、かつ第二の条件から未通知を満たすメッセージである。この条件を満たすメッセージは、仮想時刻900ms(1212)と仮想時刻960ms(1213)の2つが存在する。このことから、この2つの仮想時刻における信号に対してステップS406で定義された方法である最大値を取得する加工を行い、加工したメッセージをメカシミュレータに通知する(ステップS710)。通知されるメッセージを図13(a)に示す。図13(a)に示される通り、メカシミュレータ330にモーター駆動開始割り込み信号としてHigh(1212)とLow(1213)のうちの最大値であるHighが通知される(1301)。なおメッセージ記録部312はステップS710では加工対象となったメッセージを含め、通知されたメッセージ(すなわち、1202、1212、1213)を通知済みに更新する。
以上の動作のようにソフトウェアシミュレータ350がモーターの駆動を開始するための割り込み信号を出力すると仮定すれば、その波形は図13(b−1)に示さる。この結果、メカシミュレータ330は図13(b−2))に示すように所望の信号レベルを得ることができる。これによってモーターの駆動が開始され、連動して荷物が運ばれる。
このように、これまで通知されなかった信号を記録しておき、予め指定した加工方法によって加工することで、信号の取りこぼしを防ぐことができるようになる。
加工方法は本実施例のように信号レベルであれば最大値や最小値などがあり、信号パルス数であれば積分などもある。加工方法は加工対象となる信号に合わせて任意に選択できる。
実施例1で述べたように割り込み信号のような1回の取りこぼしが製品の動作として大きく影響する場合は取りこぼしが許されない。一方、信号によっては必ずしも加工する必要が無い場合もある。例えば連続性を持つ信号や1回の同期での変化量が小さい信号であれば取りこぼしがあっても動作として大きな影響が無い。一般的にはこういった信号が混在する。このような場合において、加工が必要か否かを見極めるためにはどのような取りこぼしがあるかを可視化する必要がある。
実施例2では、シミュレータ管理部は伝達されない信号がある場合に、その伝達されない信号を利用者に提示するシミュレーション装置を提供する。提示方法としては、ディスプレイに表示したり、音声で通知したりするなど、各種の方法がある。
提示は、シミュレーション参加要求メッセージや同期要求メッセージがシミュレータから通知された場合に記録されるメッセージ記録部312を参照することで実現できる。実施例1で示したようにメッセージ記録部312にはメッセージが通知済みか未通知かを示すパラメータを保持しているため、メッセージの加工ステップS708で確認できる。具体的にはステップS708で述べた加工対象となるメッセージが2つ以上あるかどうかを判別する。ある場合は取りこぼしが発生することを示す。図12(d)の場合を例にとると、時刻900ms(1212)と時刻960ms(1213)の2つのメッセージが加工対象である。従来であれば最新の時刻960ms(1213)のメッセージのみが通知され、時刻900ms(1212)のメッセージが取りこぼし対象となる。すなわち加工対象となるメッセージがあった場合に、そのメッセージから最新の仮想時刻を持つメッセージを取り除いたメッセージが取りこぼされることを意味する。
取りこぼされるメッセージは図14(a)に示すように記録内容をリアルタイムで表示装置に表示しても良いし、記録装置に保存し、後から確認できるようにしても良い。図14(a)では取りこぼしがあるメッセージをリアルタイムで表示装置の画面に表示している例を示している。
本実施例によれば、利用者は記録内容を確認することで、どのタイミングでどんな取りこぼしがあったかを確認できる。一度目のシミュレーションでは加工を行わず、取りこぼしがあったかどうか、またどんな信号の取りこぼしがあったかの確認を行い、二度目以降のシミュレーションでは必要に応じて信号の加工を実施することもできる。
実施例1では割り込み信号の取りこぼしを防ぐために時系列に1つ以上の信号に対して最大値を取る加工の例を示した。加工方法は最大値だけではなく、合計や平均値など様々な加工が考えられる。様々な加工方法が考えられる一方で、加工方法の指定を誤ると適切な信号が通知されないという状況が発生する。
実施例3では、どのような信号がどのように加工されたかを利用者に提示するシミュレーション装置を提供する。
加工ステップS708でメッセージを加工する際に加工内容を記録することで実現できる。図12(d)を例にとると時刻900ms(1212)と時刻960ms(1213)の2つのメッセージが加工対象であり、それぞれのモーター駆動開始割り込み信号がHighおよびLowであることからHighに加工される。
加工されるメッセージは記録した内容は図14(b)に示すようにリアルタイムで表示装置に表示しても良いし、記録装置に保存し、後から確認できるようにしても良い。
実施例1で説明したシミュレーションではタイミングのずれは生じるものの、割り込み信号のような重要な信号を取りこぼすことなく通知することが出来た。しかしながら、より精度を高めるために通知タイミングのずれを小さくすることが望ましい。
同期間隔を小さくすることでタイミングのずれも小さくすることができるが、同期間隔を小さくした分だけ通信の回数が増えることになる。すなわち、シミュレーションの実行に必要な処理時間が増加する。
一方、一般的に同期間隔はシミュレータが内部で演算する最小時間単位よりも大きい。例えばデジタル回路シミュレータであれば、回路が持つクロック(例えば100MHz、100,000,000分の1秒)単位で内部的な回路状態の演算を行う。そして、外部に出力する制御信号が変化するタイミング(例えば数クロック〜数十クロック程度)で同期を取る。
実施例4では、この性質を利用して取りこぼしを無くし、かつ遅延を小さくするシミュレーション装置を提供する。
<構成の説明>
図15は実施例4における構成の例を示す図である。実施例1で説明した図3と比較して、メカシミュレータ1530とソフトウェアシミュレータ1550に、メッセージ選定部1536とメッセージ選定部1556とがそれぞれ含まれている。また、シミュレータ管理部1510からは、図3で示す加工部315と加工方法指定部316とが除かれている。
その他の構成としては、図3で示したものと同様の構成とすることができる。
なお、図15の各シミュレータのメッセージ記録部1534と1554とは、実施例1と同様に通信部を介して送受信されるメッセージの管理に加え、メッセージがシミュレーション演算に用いられたか否かを示すパラメータを管理する。
メッセージ選定部1536、1556は、シミュレーション実行部1532、1552が演算に用いる、他のシミュレータから通知されたメッセージの選定を行う。詳細は後述する。
シミュレータ管理部のメッセージ記録部1512は、前述した複数のシミュレータ部と送受信を行うメッセージを管理する。ただし実施例1とは通知するメッセージが異なる。詳細は動作の説明で述べる。なお、実施例1と同様に説明を簡易にするためシミュレータを2つとしている。
<動作の説明>
実施例4の事前準備の動作フローは、実施例1で説明した図4のうち、加工方法を指定するステップS406を除いた処理を行う。
図16は、実施例4のシミュレーション実行の動作フローの一例を示す図である。図16に示すステップS1601からS1611は、実施例1の図7に示すステップS708を除き、同様の動作フローである。図7に示すメッセージの加工ステップS708は本実施例では行わない。その代わり、本実施例ではステップS1603およびステップS1610におけるメッセージの扱い方を変更し、遅延を小さくする。
先にステップS1610におけるシミュレーション進行メッセージの扱い方の変更について説明する。図7に示すステップS710では、最も進行が遅れているシミュレータからの同期要求信号に応答するシミュレーション進行メッセージを送信する処理を行う例について説明した。図16のステップS1610ではメッセージの仮想時刻に関わらず、まだ通知されていない信号全てをシミュレータ管理部1510から各シミュレータに通知する。どのような通知が行われるかは後の具体的な動作説明で述べる。
続いてステップS1603では、各シミュレータのメッセージ記録部1534、1554に記録されたメッセージから、シミュレーション実行部1532、1552は外部からの入力信号として使用するメッセージを選択する。このとき、シミュレーション実行部1532、1552は、仮想時刻管理部1533、1553が管理する仮想時刻を元に使用するメッセージを選択する。具体的な動作について図17のフロー図を用いて説明する。図 18はステップS1603の詳細な動作フローを示している。
ステップS1750では、各シミュレータはシミュレータ管理部1510から通知されたシミュレーション進行メッセージをメッセージ記録部1534、1554に記録する。
ステップS1751では、メッセージ選定部1536、1556がメッセージ記録部1534、1554で記録しているメッセージの中から次のステップS1752のシミュレーション演算で用いられる、外部シミュレータからの入力信号を選択する。入力信号は自身の現在の仮想時刻を超えない仮想時刻を有するメッセージが選択される。
ステップS1752では、ステップS1751で選択した入力信号を元にシミュレーション内部演算を行う。一般的にシミュレータはシミュレーション対象に合わせて、同期間隔よりも細かく仮想時刻を進めながらシミュレーション演算を行う。以下、このシミュレーション演算のことを内部演算と呼ぶ。
ステップS1753では、ステップS1752で内部演算を行った結果、仮想時刻が同期タイミングに到達したか否かを判定する。到達した場合はシミュレーション演算を終了し、ステップS1604の処理に移る。到達していない場合はS1751に戻り、同様の動作を繰り返す。
以上のようにシミュレーション内部演算が行われる度に、入力信号として採用すべきメッセージを見直すことで遅延を少なくすることができる。
<具体的な動作説明>
具体的な動作について以下に述べる。具体的な動作について実施例1と同様に、メカシミュレータ1530は時刻880msまでシミュレーションが進み、シミュレータ管理部1510に対して同期要求メッセージを通知した時点まで動作したものと仮定する。またソフトウェアシミュレータ1550は時刻900msまでシミュレーションが進み、シミュレータ管理部1510に対して同期要求メッセージを通知した時点まで動作したものと仮定する。
この時点でのシミュレータ管理部1510の保持するメッセージ記録部1512に記録されているメッセージは、実施例1で説明した図11(a)および(b)と一部を除いて同じメッセージとなる。異なる点は、図11(b)の時刻840msのメッセージが、本実施例では通知済みとなっている点である。通知済みになっている理由については後述する。
またメカシミュレータ1530は図18に示すように内部的に10ms単位で内部演算を行い、80ms単位で他のシミュレータと同期を取ることを仮定している。
この仮定の下、続く処理を説明する。
ステップS1607では、同期要求メッセージを受け付けたシミュレータ管理部1510は仮想時刻を比較する。ここではメカシミュレータ1530の仮想時刻880msとソフトウェアシミュレータ1550の仮想時刻900msを比較し、最も遅れているシミュレータをメカシミュレータ1530に特定する。
ステップS1610では通知するシミュレーション進行メッセージは、それぞれのシミュレータが保持する仮想時刻に関係なく、未通知であるメッセージを全て通知する。図11の例で説明する。なお、実施例4では、上述したように図11の時刻840msは通知済み(TRUE)になっているものとする。ここで、最も遅れているメカシミュレータに時刻880msで通知されるシミュレーション進行メッセージには、ソフトウェアシミュレータの時刻900msの信号が含まれる。なお、シミュレータ管理部1510には、それぞれのシミュレータからの同期要求メッセージが通知され、記録されている点に留意されたい。。従って、メカシミュレータの時刻880msに対応するシミュレーション進行メッセージとしてソフトウェアシミレータの時刻900msに対応する信号を含めることができる。したがって、図11の例では、メカシミュレータの時刻880msの同期要求メッセージに応答するシミュレーション進行メッセージに、未通知の信号であるソフトウェアシミュレータの時刻900msの信号(1113)が含まれることになる。また、シミュレータ管理部1510のメッセージ記録部1512は、この場合、図11の1113を通知済みに更新する。実施例4の説明で、図11の1112が既に通知済みになっていた理由はこれと同じ理由である。すなわち本実施例における仮定では、メカシミュレータ1530の時刻800msに対するシミュレーション進行メッセージで既に通知していたためである(図18の1803参照)。
続いて図17を用いてシミュレーション進行メッセージの通知を受けたメカシミュレータ1530の動作について説明する。
ステップS1750では、メカシミュレータ1530は、通知されたシミュレーション進行メッセージをメッセージ記録部1534に記録する。記録されるメッセージの例を図 19(a)に示す。図19(a)の1920に示されるようにシミュレーション進行メッセージに基づいて入力を受け付けたい信号の値が記録される。ここでは、時刻880msの同期要求メッセージの応答でソフトウェアシミュレータの時刻900msのメッセージが記録される。
ステップS1751では、メッセージ選定部1536は、シミュレーション演算に用いるメッセージを選択する。選択の方法はメカシミュレータ1530が持つ仮想時刻とステップS1750で記録されたメッセージとに基づいて行う。この時点でメカシミュレータ1530が持つ仮想時刻は、同期要求メッセージを通知した880msである。実施例1で説明したように、各シミュレータは同期要求メッセージを通知した後は、同期進行メッセージまたは終了メッセージを受信するまで待機している点に留意されたい。したがって、メッセージ選定部1536は、この880msを超えない最新の仮想時刻を持つメッセージを参照する。図19(a)を参照すると時刻880msを超えないメッセージは時刻840msにおけるメッセージ1910である。すなわち、時刻840msのメッセージが選択される。
ステップS1752では、ステップS1751で選択されたメッセージを元に、10ms分の内部演算を行う。すなわち、メカシミュレータ1530のシミュレーション実行部1532はモーターの駆動開始割り込み信号の入力をメッセージ2010に含まれるLowとして内部演算を行う。ここでは内部演算によって仮想時刻が890msまで進むことになる(図18の1801参照)。
ステップS1753では同期タイミングに到達したかの判定を行う。メカシミュレータ1530は次の同期タイミングが仮想時刻960msであることから、ここでは同期タイミングに到達していない。このためステップS1751から再度、処理を継続する。
続くステップS1751では再度、メカシミュレータが持つ仮想時刻890msを超えないメッセージ(図19(a)の1910)が選択される。この選択されたメッセージを元に10ms分の内部演算を行い、仮想時刻が900msまで進む(図18の1802参照)。ここでも同期タイミングである仮想時刻960msに到達していないことから、再度ステップS1751からの処理を継続する。
続くステップS1751では、メカシミュレータが持つ仮想時刻が900msであることから、選択されるメッセージは仮想時刻900msを越えない最新の仮想時刻を持つ図19(a)のメッセージ1920である。
すなわちメカシミュレータ1530は仮想時刻900msから、モーター駆動開始割り込み信号をLowからHighに切り替えて10ms分の内部演算を行う(ステップS1752)。
以降、次の同期タイミングである仮想時刻960msまでステップS1751からステップSS1753を繰り返し、シミュレーション演算動作を終了する。
このような動作により、図19(b−1)に示されるソフトウェアシミュレータ1550の出力信号に対して、メカシミュレータ1530は図19(b−2)に示されるように所望の信号を受け付けることができる。図19(b)は、実施例1で説明した図13(b)と比較してメカシミュレータのモータ駆動割り込みの信号の遅延が小さくなっていることがわかる。
本実施例によると取りこぼしを無くし、かつ遅延を小さくするシミュレーション装置の提供が可能である。
実施例4では内部演算間隔が同期間隔よりも小さい場合に有効な形態を説明した。しかしながら内部演算間隔が同期間隔と比べて十分に小さくない場合には取りこぼしが発生する事態が生じる。
例えば図20で示すような同期タイミングおよび内部演算タイミングを持つシミュレータの場合にシミュレータ間で取りこぼしが発生する。ここでは実施例4で説明したソフトウェアシミュレータは900msの同期タイミングのみが940msにずれた場合を仮定している。つまりソフトウェアシミュレータは仮想時刻940msで初めてモーター駆動割り込み信号がHighになり、960ms以降はLowに戻る。またメカシミュレータの内部演算は図20に示すように40ms単位で行われることを仮定している。
この図20において、メカシミュレータは時刻880msでソフトウェアシミュレータから時刻940msの出力信号を受信する。実施例4と同様にメカシミュレータはソフトウェアシミュレータの時刻840msの出力信号を外部からの入力としてシミュレーション演算を行う。メカシミュレータは内部演算を進める上で時刻940msを過ぎたところからソフトウェアシミュレータの時刻940msの出力信号を用いて演算を進めたい。しかし、ここで示すメカシミュレータは880ms、920ms、960msのタイミングで内部演算を進めているため、940msを過ぎるのは次の同期タイミングである960msとなる。時刻960msではソフトウェアシミュレータから時刻960msの出力信号が新たに通知されるため、940msの信号が取りこぼしになってしまう。
実施例5では、このような場合であっても取りこぼしを防ぐシミュレーション装置を提供する。
<構成の説明>
図21は実施例5にかかる構成図を示す。実施例4の図15に示す構成と比較して、各シミュレータからメッセージ選定部が除かれ、加工方法指定部2136、2156と、加工部2137、2157とが各シミュレータに追加されている。
図21に示す各構成は、実施例4で説明したものと同様の処理を行うことができるので、重複する説明は省略する。
加工方法指定部2136、2156は取りこぼしを防ぐため、シミュレーション演算に用いるメッセージを加工する方法を指定する。
加工部2137、2157は取りこぼしを防ぐため、シミュレーション演算に用いるメッセージを加工する。
なお、実施例4と同様に説明を簡易にするためシミュレータを2つとしている。
<動作の説明>
本実施例における動作手順について説明する。まず、実施例4と同様に事前準備の動作フローを行う。なお、フローの流れとしては、実施例1で説明した図4のフローチャートと同様の処理とすることができる。ただし、本実施例では、加工方法の指定がシミュレータ管理部ではなく、各シミュレータ側で行われる点で、実施例1の処理とは相違する。
次に、シミュレーション実行の動作フローについて説明する。実施例5のシミュレーション実行の動作フローは、実施例4の図16にと同様の動作フローである。ただし、ステップS1603で行われるシミュレーション演算の動作が異なる。実施例5におけるステップS1603で行われる動作の詳細フローを図22に示す。この図22を元にシミュレーション演算処理の詳細を説明する。
ステップS2250では各シミュレータは通知されたシミュレーション進行メッセージをメッセージ記録部2134、2154に記録する。この時、記録するメッセージには未使用であることを示すパラメータを含める。未使用とは、後に続くシミュレーション内部演算ステップS2252において、内部演算に用いられるメッセージとして使用されていないことを示す。逆に内部演算に用いられたメッセージには使用済みを意味するパラメータを保持する。詳細は後述する。
ステップS2251では各シミュレータの加工部2137、2157がメッセージの加工を行う。加工の前準備として加工対象となるメッセージが存在するかを確認する。この確認は、実施例1で説明した図7のステップS708において未通知メッセージを未使用に、通知済みメッセージを使用済みに読み替えた処理と同等である。すなわちメッセージの加工は次に示す2つの条件に基づき加工対象の抽出を行う。第一の条件はメッセージを受信する側のシミュレータの仮想時刻よりも以前の仮想時刻を持つメッセージである。第二の条件は未使用を意味するパラメータを保持するメッセージのみである。この2つを満たすメッセージが2つ以上ある場合は、その2つ以上のメッセージを対象に加工する。1つ以下の場合は加工を行わない。なお、加工は事前準備の動作フローで指定された方法を元に行われる。なお、本実施例では、実施例1と異なり各シミュレータ内での内部演算を考慮する点に留意されたい。すなわち、本実施例では、第一の条件の受信する側のシミュレータの仮想時刻は、内部演算によって変化する点に留意されたい。
ステップS2252では、実施例4と同様に内部演算に採用するメッセージを決定する。メッセージの決定はステップS2251で加工が行われたか否かによって異なる。加工が行われた場合は加工結果を入力信号として選択する。加工が行われなかった場合は実施例4と同様に、メッセージ記録部2134、2154で記録しているメッセージの中で自身の仮想時刻を超えないメッセージを入力信号として選択する。加工の対象になったメッセージあるいは選択されたメッセージには、使用済であることを示すパラメータで上書きする。
ステップS2253ではステップS2252で決定した入力信号を元に内部演算を行う。
ステップS2254ではステップS2253でシミュレーション演算を行った結果、仮想時刻が同期タイミングに到達したか否かを判定する。到達した場合はシミュレーション演算を終了し、ステップS1604の処理に移る。到達していない場合はS2251に戻り、同様の動作を繰り返す。
以上のように内部演算が行われる度に、入力信号として採用すべきメッセージに取りこぼしになる信号がある場合にメッセージを加工することで取りこぼしを防ぐことができる。
<具体的な動作>
具体的な動作について説明する。
実施例1と同様に、事前に各シミュレータの加工方法指定部2136、2156によって各信号に対する加工方法を指定する。ここでは実施例1と同様に最大値を指定することとする。また実施例4と同様にメカシミュレータ2130は仮想時刻880ms、ソフトウェアシミュレータ2150は仮想時刻900msまでシミュレーションが進んだものと仮定する。すなわち、これらの仮想時刻において各シミュレータがシミュレータ管理部2110に対して同期要求メッセージを通知した時点まで動作したものと仮定し、これに続く処理を説明する。なお同期タイミングおよび演算間隔は図20に示す通りである。
ステップS2250では実施例4と同じくメカシミュレータ2130は仮想時刻880msにおいて、ソフトウェアシミュレータ2150から仮想時刻940msの出力信号を含むシミュレーション進行メッセージを受信する(2108)。この受信したメッセージをメッセージ記録部2134に記録する。図23(a)は、メカシミュレータの時刻940msにおけるメッセージの記録内容を示す図である。この時、図23(a)に示されるように記録するメッセージには未使用であることを示すパラメータ(2304)を含める。なおソフトウェアシミュレータ2150の仮想時刻840msの信号(2301)は、図20に示すように、メカシミュレータ2130が時刻800msの時に通知を受けている(2307)。よって、メカシミュレータの時刻840ms(2302)の内部演算で既に使用済みであることから、図23(a)では使用済みを示すパラメータが記録されている。
ステップS2251ではステップS2250で記録されたメッセージ(すなわち、図23(a)で示すメッセージ)の加工を行う。しかし第一の条件である時刻880ms以下、かつ第二の条件である未使用のメッセージは存在しない。加工対象となるメッセージが存在しないことから加工は行わない。
ステップS2252では後に続くシミュレーション内部演算に用いる外部からの入力信号用メッセージを決定する。S2251で加工が行われなかったことから、メッセージ記録部2134に記録される時刻840msのメッセージ(図23(a)の2301)を決定する。
ステップS2253では、ステップS2252で決定されたメッセージ2301を用いてシミュレーション内部演算を行う。すなわちモーター駆動開始割り込み信号としてLowの値をシミュレーション演算に用いる。演算は図20に従って行われ、仮想時刻が920msまで進む(2001)。
ステップS2254では同期タイミングに到達したか否かの判定を行う。メカシミュレータ2130の次の同期タイミングは960msであり、現在の仮想時刻が920msであることから同期タイミングに到達していない。このため再度、ステップS2251からの処理を繰り返す。
続くステップS2251ではメッセージの加工を行う。メカシミュレータ2130の仮想時刻920msにおいても、加工対象となる第一の条件である時刻920ms以下、かつ第二の条件である未使用を満たすメッセージが存在しないため、加工は行わない。
続くステップS2252では同様にメッセージ記録部2134に記録される時刻840msのメッセージ(図23(a)の2301)が決定される。
続くステップS2253では同様にステップS2252で決定されたメッセージを用いてシミュレーション内部演算を行う。すなわちモーター駆動開始割り込み信号としてLowの値をシミュレーション演算に用いる。演算は図20に従って行われ、仮想時刻が960msまで進む(2004)。
ここでステップS2254では同期タイミングに到達したかの判定を行う。ここでは同期タイミングに到達していることからシミュレーション演算処理を終了する。
続いてこれまでと同様にメカシミュレータ2130が同期要求メッセージを通知する(ステップS1605)。続いてシミュレータ管理部2110は通知された同期要求メッセージを記録する(ステップS1606)。続いてメカシミュレータ2130の仮想時刻960msとソフトウェアシミュレータの仮想時刻940msの比較(ステップS1607)によって、ソフトウェアシミュレータ2150に対してシミュレーション進行メッセージを通知する(S1610)。
続いてシミュレーション進行メッセージを受信したソフトウェアシミュレータ2150はシミュレーション演算を行い、次の同期タイミングである仮想時刻960msまで進める(ステップS1603)。時刻960msに到達すると、ソフトウェアシミュレータ2150は、シミュレータ管理部2110に対して同期要求メッセージを通知する(ステップS1603)。同期要求メッセージの通知を受けたシミュレータ管理部2110は通知されたメッセージをメッセージ記録部2112に記録する(ステップS1605)。
続いてステップS1607ではシミュレータ管理部2110は仮想時刻の比較を行う。ここではメカシミュレータ2130およびソフトウェアシミュレータ2150が共に仮想時刻960msを保持していることから両方のシミュレータが最も進行の遅いシミュレータとして特定される。
続いてステップS1610ではメカシミュレータ2130およびソフトウェアシミュレータ2150の両方にシミュレーション進行メッセージを通知する。
以下、メカシミュレータ2130に着目して説明するとステップS1603の詳細処理(図22)におけるステップS2250において、シミュレータ管理部2110から通知されたメッセージをメッセージ記録部2134に記録する。ここで記録されたメッセージを図23(b)に示す。図23(b)に示されるように図23(a)からソフトウェアシミュレータの仮想時刻960msのメッセージ(2309)が追加されている。また未使用を示すパラメータが記録されている(2310)。
ステップS2251ではメッセージの加工を行う。まずは前述した条件に基づき図23(b)を参照して加工対象を抽出する。第一の条件である仮想時刻960ms以下、かつ第二の条件である未使用のメッセージは時刻940ms(2307)および時刻960ms(2309)の2つ存在する。対象となるメッセージが2つ存在することから、事前定義処理で指定した加工方法に基づいてメッセージを加工する。ここでは、それぞれの時刻におけるモーター駆動開始割り込み信号の値がHigh(2308)とLow(2309)であり、また加工方法として最大値を取得することを事前に指定していることから、Highに加工される。
ステップS2252で続くシミュレーション内部演算に用いられる入力信号用のメッセージが決定される。ここでは加工されたモーター駆動開始割り込み信号Highが選択される。
また時刻940ms(図23(b)の2307)および時刻960ms(図23(b)の2309)のメッセージが加工されたことから、未使用(図23(b)の2308および2310)を使用済みに更新する。
同様の処理を続けると、メカシミュレータ2130は内部演算によって時刻1000msに進む(図23の2305参照)。この時刻では、加工対象となるメッセージが無いため時刻1000msを越えない時刻960msのメッセージが内部演算に使用される。すなわちモーター駆動開始割り込み信号Lowが内部演算に用いられる。
このような動作により、ソフトウェアシミュレータ2150が図23(c−1)に示す信号を出力していた場合、メカシミュレータ2130は図23(c−2)に示す所望の信号を受信することになり、目的の取りこぼしを防ぐことができている。
また実施例2および3と同様に、利用者は取りこぼし対象となったメッセージや加工結果を図14(a)および(b)のような画面を用いて確認できる。
実施例4や5に示すシミュレーション装置は、実施例1と比較して内部演算間隔によってはタイミング遅延を小さくできるという長所がある。その一方で、対象のシミュレータに対して個別にメッセージを管理・加工する仕組みを組み込むコストが必要になるという短所がある。この実施例4や5に示すシミュレータ側でのメッセージの管理・加工を、メッセージ調整機能と称する。特に市販されているシミュレータは改良が困難であり、組み込めるシミュレータと組み込めないシミュレータが混在する場合があり得る。
この混在の可能性を鑑みて、利用者が適したシミュレーション構成を選択できることが望ましい。そこで本実施例では、利用者が連携するシミュレータに応じてシミュレーション構成を選択できるシミュレーション装置について説明する。
<構成の説明>
図24は本実施例における構成の例である。この図24の例ではメカシミュレータ2430は実施例4や5示したメカシミュレータ(1530および2130)とは異なりメッセージ選定部、加工方法指定部、加工部を持たない。一方、ソフトウェアシミュレータ2450は実施例5で示したソフトウェアシミュレータ2150と同様の構成である。すなわちメカシミュレータ2430は実施例4および5の構成に対応しておらず、またソフトウェアシミュレータ2450は実施例5で示したシミュレータの構成に対応していることを示している。
なお、以降の説明では実施例4および5のどちらかの構成に対応しているシミュレータのことを対応済みのシミュレータと呼び、対応していないことを未対応のシミュレータと省略する。
シミュレータ管理部2410は、実施例1で説明した構成に加えて、切替部2417を有する。シミュレータ管理部2410は、次に説明する切替部2417によって、メッセージの管理方法を実施例1で示したメッセージ記録部312あるいは実施例5で示したメッセージ記録部2112の動作に切り替える。
切替部2417は、連携する各シミュレータが対応済みか否かでメッセージ記録部2412が管理するメッセージを切り替える。例えばメッセージ記録部2412は未対応であるシミュレータに対しては、取りこぼしを防ぐために加工部2415で加工を行った上でメッセージを通知する。対応済みのシミュレータに対しては、メッセージの仮想時刻に関係なく未送信であれば通知を行う。対応済みのシミュレータについてはシミュレータ側でメッセージを加工あるいは内部演算に用いるメッセージの選択を行う。
具体的な動作は以下の説明で述べる。なお、これまでの説明と同様にシミュレータは2つとは限らない。
<動作の説明>
最初に事前準備の動作フローについて説明する。実施例6における動作フローは、図4に示すフローと同じである。ただし、一部異なる処理がある。以下、異なる処理を中心に説明する。
本実施例においては、ステップS403では各シミュレータはシミュレータ管理部2410にシミュレーション参加要求メッセージを通知する。参加要求メッセージには自身のシミュレータが対応済みか否かを示すパラメータ(SIM_COR)を含める。図25は参加要求メッセージの例である。図25に示される通り、参加要求メッセージには対応済みか否かを表すパラメータ(SIM_COR)2501を含む。図25(a)ではメカシミュレータ2430は未対応(SIM_COR=FALSE)であり、図25(b)ではソフトウェアシミュレータは対応済み(SIM_COR=TRUE)であることが示されている。このように各シミュレータは対応済みか否かをシミュレータ管理部2410に通知する。
ステップS406では加工方法の指定を行う。本実施例ではシミュレータ管理部2410が有する加工方法指定部2416およびソフトウェアシミュレータ2450が有する加工方法指定部2456の両方で加工方法を指定する。なお対応済みのシミュレータが複数ある場合はその全てのシミュレータで加工方法を指定する。
図26は、実施例6のシミュレーション実行の動作フローを示す図である。ステップS2601からS2607は、実施例5で説明した図16のステップS1601からS1607と同様の動作フローである。
ステップS2612では、シミュレータ管理部2410は、ステップS2607において特定される進行の遅いシミュレータが対応済みか否かで次のメッセージの加工ステップS2608を行うかどうかを切り替える。対応済みであればシミュレータ側でメッセージの取りこぼしを管理するため加工を行わない。未対応であればシミュレータ管理部2410で取りこぼしを防ぐため加工部2415でメッセージを加工する。加工の動作については実施例1と同様の処理である。
ステップS2609およびS2611は実施例5で説明した図16のステップS1609およびS1611と同様の処理である。
ステップS2610では、シミュレータ管理部2410は各シミュレータにシミュレーション進行メッセージを通知する。ただし通知するメッセージは切替部2417によって切り替えられる。対応済みのシミュレータに対しては実施例4および5で示したようにメッセージの仮想時刻に関わらず、未送信のメッセージは全て通知する。未対応の場合には実施例1で示したように通知先のシミュレータの仮想時刻を超えない最新のメッセージを通知する。
シミュレーション進行メッセージの通知を受けたシミュレータは自身が対応済みか否かによってシミュレーション演算の動作が切り替わる。対応済みのシミュレータであれば実施例4あるいは5と同様のシミュレーション演算を行う。未対応の場合には実施例1と同様に途中で内部演算に用いるメッセージを切り替えることなくシミュレーション演算を行う。
以上の動作によって切り替えを実現する。
<具体的な動作>
具体的な動作を図27に示されるタイミングで同期および内部演算が行われる場合を例に、ソフトウェアシミュレータ2450の出力信号をメカシミュレータ2430に通知するメッセージに着目して説明する。ここではメカシミュレータ2430は200ms毎、ソフトウェアシミュレータ2450は60ms毎に同期を行い、またメカシミュレータ2430は50ms間隔で内部演算を行うことを仮定している。またソフトウェアシミュレータは時刻900msでのみモーター駆動開始割り込み信号をHighで出力し、それ以外の時刻ではLowを出力することを仮定している。さらにこれまでの説明と同様に、加工方法として最大値を取得することを指定している場合を例として説明する。
<メカシミュレータが未対応である場合について>
メカシミュレータ2430が未対応である場合について、メカシミュレータ2430の時刻1000msに通知されるシミュレーション進行メッセージに着目して説明する。
この時(図27の2705)、ステップS2605でシミュレータ管理部2410のメッセージ記録部2412に記録されている、ソフトウェアシミュレータ2450から通知されたメッセージを図28に示す。
ステップS2612ではメカシミュレータ2430が未対応であることから続くメッセージの加工をS2608で行う。
ステップS2608では、まず、シミュレータ管理部2410は図28に示すメッセージ記録部2412の内容から加工対象のメッセージを抽出する。ここではソフトウェアシミュレータ2450の時刻840ms(2802)、900ms(2803)、960ms(2804)における3つの出力信号が加工対象である。順にLow、High、Lowの信号値であることから、その最大値であるHighに加工される。
続くステップS2610でメカシミュレータ2430に、S2408で加工されたメッセージが通知される。すなわちメカシミュレータ2430はモーター駆動開始割り込み信号としてHighの値を受け取りシミュレーションを進めることができる。
<メカシミュレータが対応済みである場合について>
次にメカシミュレータが対応済みである場合について、説明する。ここではメカシミュレータ2430の時刻800ms(図27の2701)および1000ms(図27の2705)に通知されるシミュレーション進行メッセージとシミュレーション演算動作に着目して説明する。
メカシミュレータ2430の仮想時刻800ms(図27の2701)において、ステップS2612ではメカシミュレータ2430が対応済みであることから、シミュレータ管理部2410はメッセージの加工は行わずに、次のステップに進む。
ステップS2710ではシミュレータ管理部2410はメカシミュレータ2430に対して未通知である時刻840msのメッセージを通知する。また、この時、時刻840msのメッセージが保持する未送信であることを示すパラメータは通知済みに上書きされる。以下、実施例5と同様の動作が行われる。
以上のように本実施例によれば、連携するシミュレータに合わせて最適な構成を提供できる。