<実施の形態1>
図1は、マルチCPUシステムの構成例を示す図である。当該システムは、バックプレーンバス18を含むベースユニット17に装着された第1のプログラマブルコントローラ(以下「第1のPC」)1、第2のプログラマブルコントローラ(以下「第2のPC」)19、入出力ユニット20から構成されている。入出力ユニット20は、第1および第2のPC1,19と制御対象の装置(不図示)との間で、信号のやり取りを行うための配線機器等である。以下の各実施の形態では、マルチCPUシステムが図1の構成を有していると仮定して説明する。
第1のPC1および第2のPC19には、周辺機器21(例えば汎用コンピュータや表示器)が、通信ケーブル22を介して接続している。周辺機器21上では、第1および第2のPC1,19に所定の動作を行わせるためのシーケンスプログラムの作成・編集を支援するエンジニアリングツールが動作している。
よって使用者は、周辺機器21を用いることで、シーケンスプログラムの作成・編集の他、当該シーケンスプログラムの第1および第2のPC1,19への転送や、第1および第2のPC1,19の動作状態(シーケンスプログラムの進行状況)の監視等を行うことができる。また周辺機器21は、第1および第2のPC1,19が取得したトレースデータを読み出し、当該トレースデータおよびそれに付された時刻情報を用いて、タイミングチャート作成することもできる。
図2は、実施の形態1に係るプログラマブルコントローラの構成を示す図である。本実施の形態において、第1および第2のPC1,19は、共に図2の構成を有している。
図2の如く、本実施の形態のプログラマブルコントローラ(以下「PC」)は、CPU2、通信インターフェイス(I/F)6、デバイスメモリ7、シーケンスプログラムメモリ8、サンプリングトレースメモリ9、CPUクロック生成部11、内部カウンタ12およびバックプレーンバスI/F13から構成されており、それらは内部バス10を介して接続されている。
CPU2は、各種プログラムの実行や、各メモリ(デバイスメモリ7、シーケンスプログラムメモリ8およびサンプリングトレースメモリ9)に対する書き込み/読み出し、通信I/F6およびバックプレーンバスI/F13を用いた通信などの制御を行う演算回路である。CPU2は、CPUクロック生成部11が生成する内部クロックに基づいて動作する。内部カウンタ12は、当該内部クロックに応じてカウントアップするものである。
内部カウンタ12のカウントアップは、内部クロックの1周期毎にカウントアップするものでもよいし、複数周期毎にカウントアップするものでもよい。一般に、内部カウンタ12は、1[μsec]あるいはそれよりも高精度な値をCPU2に提供する。また、内部カウンタ12はフリーランカウンタであり、例えば16bitカウンタであれば、カウンタ値が65535になると次のカウントアップで0に戻る、という動作を繰り返す。
従来のPCでは、この内部カウンタ12のカウント値がトレースデータの時刻情報として付され、その時刻情報からサンプリング間隔が算出されていた。しかし上述のように、その手法では異なるPCが取得したトレースデータの時間的な前後関係を特定することはできない。
通信I/F6は、通信ケーブル22を介して周辺機器21との通信を行うための接続回路であり、またバックプレーンバスI/F13は、ベースユニット17のバックプレーンバス18を介して、当該ベースユニット17に装着された他のユニット(他のPCや入出力ユニット20)との通信を行うための接続回路である。バックプレーンバスI/F13が備える共有メモリ14には、ベースユニット17に接続された他のPCと共有するデータが保存される。
シーケンスプログラムメモリ8は、CPU2が実行する各シーケンスプログラムを格納するためのものである。シーケンスプログラムは、周辺機器21から通信ケーブル22を経て当該PCに送られてくる。デバイスメモリ7はシーケンスプログラムの実行に必要なパラメータや、当該シーケンスプログラムによる演算結果等のデータを保持することができる。またそれらのデータは、必要に応じてバックプレーンバスI/F13の共有メモリ14にも記録することができる。
ここで、当該PCの基本的な動作について説明する。PCの主要な動作はシーケンスプログラムの実行(スキャン)とEND処理の繰り返しである。CPU2のシーケンスプログラム実行部3は、シーケンスプログラムメモリ8に格納されているシーケンスプログラムを読み出してそれを実行する。そして当該シーケンスプログラムに基づいて、デバイスメモリ7や共有メモリ14に保持されている値を読み出して演算し、またその演算結果を再びデバイスメモリ7や共有メモリ14に書き込む。
CPU2は、シーケンスプログラムの一通りの実行(スキャン)を終えると、バックプレーンバス18を介したメモリの値の反映・更新、すなわちEND処理を行う。END処理では、例えばCPU2がバックプレーンバスI/F13を制御して入出力ユニット20の入力信号および出力信号の状態を読み出し、それらをデバイスメモリ7の入力(X)デバイスの値および出力(Y)デバイスの値に反映させる。またマルチCPUシステムでは、他のPCとの信号(データ)のやり取りもEND処理の中で行われ、それにより複数のPC間でのデータの共有が成される。
他のPCと共有するデータは、バックプレーンバスI/F13の共有メモリ14に格納されている。共有メモリ14は他のPCからもアクセス可能となっており、図1の如くベースユニット17に第1および第2のPC1,19が装着されて成るシステムでは、第1および第2のPC1,19それぞれの共有メモリ14に、第1のPC1のデータを書き込むためのエリア(以下「第1のPC用エリア」)と、第2のPC19のデータを書き込むためのエリア(以下「第2のPC用エリア」)とが確保される。
第1のPC1が自己の共有メモリ14の第1のPC用エリアに書き込んだ値は、第2のPC19のEND処理において第2のPC19に読み取られ、当該第2のPC19の共有メモリ14の第1のPC用エリアに反映される。また第2のPC19が自己の共有メモリ14の第2のPC用エリアに書き込んだ値は、第1のPC1のEND処理において第1のPC1に読み取られ、当該第1のPC1の共有メモリ14の第2のPC用エリアに反映される。このように第1および第2のPC1,19が互いのデータを読み取り、それを自己の共有メモリ14に反映させることにより、第1および第2のPC1,19間でデータが共有化される。
PCは、END処理を終えると再びシーケンスプログラムの実行(スキャン)を行う。PCがこのようにスキャンとEND処理とを繰り返し行うことよって、当該PCによる所定の制御動作が成される。このようなシーケンスプログラムの実行形式は「スキャン実行タイプ」と呼ばれる。
また本実施の形態に係るPCは、他のコントローラと同期したタイミングで、スキャンに対する割り込み処理を行う同期割り込み機能を備えている。同期割り込み機能を有するPCにおいては、図2の如くバックプレーンバスI/F13に、バスI/Fクロック生成部15および同期カウンタ16が設けられる。バスI/Fクロック生成部15は、所定周波数のバスI/Fクロックを生成する。
同期カウンタ16は、当該バスI/Fクロックに応じてカウントアップし、且つバックプレーンバス18に周期的に現れる同期信号に応じてゼロリセットするものである。同期信号は、ベースユニット17に装着される何れかのユニットが出力すればよいが、通常は複数のPCのうちの一つ(例えばベースユニットの第0番スロットに装着されるPC)が出力する。
図1のシステムでは、ベースユニット17の第0番スロットに第1のPC1が装着されていると仮定し、当該第1のPC1が同期信号を出力するものとする。つまり第1および第2のPC1,19それぞれの同期カウンタ16は、第1のPC1が出力する同期信号に応じてゼロリセットされる。以下、同期信号を生成するPC(ここでは第1のPC1)を「マスタPC」(第1のコントローラ)、それ以外のPC(ここでは第2のPC19)を「スレーブPC」(第2のコントローラ)と称する。
マスタPCである第1のPC1は、同期カウンタ16のカウント値が特定の値になると、バックプレーンバスI/F13を介してバックプレーンバス18へ同期信号を送出する。それによりスレーブPCである第2のPC19の同期カウンタ16がゼロリセットされるが、このとき第1のPC1自身の同期カウンタ16もゼロリセットされる。よって第1および第2のPC1,19の同期カウンタ16は、特定の同期周期(例えば0.888[msec])で、同時にゼロリセットされることになる。それにより第1および第2のPC1,19の同期カウンタ16は、互いに同期したカウント値をとることができる。
各PCの同期カウンタ16は、各自のバスI/Fクロック生成部15が生成するバスI/Fクロックに基づいてカウントアップするが、それらがゼロリセットするタイミングはいずれもマスタPCが出力する同期信号により規定されるので、いつも同時にゼロリセットされる。よって、同期カウンタ16のカウント値(バスI/Fクロックの周波数)に、各PCの個体差による誤差が生じていたとしても、同期カウンタ16がゼロリセットされる毎にその誤差もゼロにされる。従って、同期カウンタ16のカウント値は、精度良く互いに同期したカウント値をとることができる。
なお、スレーブPCの同期カウンタ16は、マスタPCからの同期信号に応じてゼロリセットされるだけでなく、自身のカウント値が上記「特定の値」(マスタPCが同期信号を出力するときの値)に達した場合にもゼロリセットするように動作してもよい。それにより、例えばノイズの影響により一時的にマスタPCからの同期信号を受信できなかった場合でも、第1および第2のPC1,19の同期カウンタ16は、互いにほぼ同期したカウント値をとることができる。つまりノイズの影響による同期カウンタ16の誤動作を防止することができる。
各PCは、自己の同期カウンタ16がゼロリセットされたときにスキャンに対する割り込み処理を行う。それにより複数のPCは、互いに同期したタイミングでの割り込み処理(同期割り込み処理)を行うことができる。なお、同期割り込み処理で実行されるシーケンスプログラム(同期割り込みプログラム)も、周辺機器21から送信されて、シーケンスプログラムメモリ8に格納されており、その実行はCPU2のシーケンスプログラム実行部3により行われる。
さらに本実施の形態に係るPCは、サンプリングトレース機能を備えている。つまり各PCは、指定デバイス(デバイスメモリ7や共有メモリ14)の指定アドレスに保持されている値(トレースデータ)を、指定されたサンプリング周期で収集することができる。
各PCのサンプリングトレースの各種設定(デバイスの指定、サンプリング周期、サンプリング回数の指定等)は、周辺機器21上で行われる。周辺機器21は、サンプリングトレースの実行に先立って、その設定の情報(トレース設定情報)を通信ケーブル22を介してPCへ転送する。トレース設定情報を受信したPCは、それをサンプリングトレースメモリ9に格納する。
サンプリングトレースを実行する場合、周辺機器21からサンプリングトレース開始要求が各PCに送信される。PCはサンプリングトレース開始要求を受信するとサンプリング機能がオン状態になり、CPU2のサンプリングトレース実行部4が、サンプリングトレースメモリ9からトレース設定情報を読み出し、それに基づいてトレースデータを取得する。
本実施の形態に係るPCは、サンプリングトレースのサンプリング周期として、スキャン周期および同期割り込みの周期のいずれかを設定することができる。サンプリング周期がスキャン周期に設定された場合、PCはスキャン実行後のEND処理の中でサンプリングトレース処理(トレースデータの取得および格納)を実行する。またサンプリング周期が同期割り込み周期に設定された場合には、PCはスキャン実行中に一定周期で生じる同期割り込み処理の中でサンプリングトレース処理を実行する。
サンプリングトレース実行部4の時刻情報付与部5は、トレースデータをサンプリングトレースメモリ9に書き込む際に、各トレースデータに時刻情報を付す。従来のマルチCPUシステムにおいてトレースデータに付される時刻情報はサンプリング間隔を示すのみであったため、異なるPC間でのトレースデータの時間的な関係を正確に知ることができなかったが、当該時刻情報付与部5はそれを可能にする時刻情報を付すことができる。以下、そのための構成を説明する。
図2に示すように、本実施の形態のPCでは、共有メモリ14内に共通カウント値保持部24並びに状態指示値保持部25が設けられており、CPU2はそれらに保持させる値を制御する共通カウント値制御部23を備えている。共通カウント値制御部23が、共通カウント値保持部24に保持させる値を「共通カウント値」、状態指示値保持部25に保持させる値を「状態保持値」とそれぞれ称する。
共通カウント値保持部24が保持する共通カウント値は、複数のPCで共通の値をとり、且つ、同期カウンタ16がゼロリセットされる毎にカウントアップするものである。詳細は後述するが、本実施の形態ではこの共通カウント値を用いることによって、各PCのトレースデータの時間的な関係を正確に知ることが可能な時刻情報を得ている。
また状態指示値保持部25が保持する状態指示値は、共通カウント値保持部24の動作状態を示すものであり、共通カウント値保持部24が未稼働状態なら0を、稼働状態なら1を、またエラー停止状態なら2をとるように制御される。
以下、本実施の形態に係るマルチCPUシステム(図1)の動作を説明する。図3はその動作を説明するための図であり、同図の横方向は時間軸に対応している。第1および第2のPC1,19は、共に図2に示した構成を有しているが、図3ではそのうちの主要な要素のみを示している。
まず図3を参照し、本システムの全体的な動作について説明する。図3に示すように、第1および第2のPC1,19それぞれのCPU2(シーケンスプログラム実行部3)は、スキャン(SCAN)の実行とその後のEND処理(END)を繰り返し行うが、一定期間ごとにスキャン(SCAN)に対する同期割り込み処理(INT)を実行する。END処理の実行タイミングは、スキャン(SCAN)におけるシーケンスプログラムによって異なるため、基本的に第1および第2のPC1,19で異なるタイミングになる。それに対し、同期割り込み処理(INT)は、第1および第2のPC1,19で同期して実行される。
具体的には、同期割り込み処理(INT)は、第1および第2のPC1,19の各々で同期カウンタ16がゼロリセットされるタイミングで実行される。マスタPCである第1のPC1は、自己の同期カウンタ16のカウント値が所定の値に達する毎に同期信号(SYN)をベースユニット17へ送出し、それと共に当該同期カウンタ16をゼロリセットする。第2のPC19はその同期信号(SYN)に応じて自己の同期カウンタ16をゼロリセットする。つまり第1および第2のPC1,19の同期カウンタ16は、同期してゼロリセットされる。その結果、第1および第2のPC1,19間で、同期割り込み処理(INT)の実行開始タイミングが揃うことになる。
図3の如く、第1および第2のPC1,19の共通カウント値保持部24の値(共通カウント値)は、PCがサンプリングトレース状態(サンプリングトレース機能のオン状態)になるとカウントアップを開始する。状態指示値保持部25の値(状態指示値)は、共通カウント値のカウントアップが開始されると1に設定される(言い換えれば、状態指示値が1のとき、そのPCはサンプリングトレース状態である)。
共通カウント値は、同期カウンタ16がゼロリセットされる毎にカウントアップされ、且つ、第1および第2のPC1,19で互いに同じ値をとるように制御される。図3の例では、第1のPC1の共通カウント値は、第2のPC19よりも先にカウントアップを始めており、第2のPC19が共通カウント値のカウントアップを開始する時点で既に「3」になっている。この場合、第2のPC19は、自己の共通カウント値を「3」からカウントアップする。これにより、第1および第2のPC1,19の共通カウント値は互いに同じ値になる。
ここで、本実施の形態のマルチCPUシステムでは、サンプリングトレースを行う場合、まずマスタPCである第1のPC1がサンプリングトレース状態になり、それに続いてスレーブPCである第2のPC19がサンプリングトレース状態になるように制御されている。また、第1および第2のPC1,19において、サンプリングトレースを開始するための処理は、それぞれのEND処理の中で行うように規定されている。
図3に示されているように、第1のPC1(マスタPC)は、サンプリングトレース開始要求を受けた直後のEND処理からサンプリングトレース状態になるが、第2のPC19(スレーブPC)はサンプリングトレース開始要求を受けてもすぐにはサンプリングトレース状態にならず、第1のPC1(マスタPC)が先にサンプリングトレース状態になるのを待ち、その直後のEND処理からサンプリングトレース状態になる。
以下、スレーブPCが、サンプリングトレース開始要求を受けてからマスタPCがサンプリングトレース状態になるのを待っている間の状態を「サンプリングトレース開始待ち状態」と称す。スレーブPCは、サンプリングトレース開始要求を受けるとサンプリングトレース待ち状態に移行し、その後のEND処理の際にマスタPCがサンプリングトレース状態になっていれば自己もサンプリングトレース状態に移行する。
共通カウント値保持部24の値(共通カウント値)は、そのPCがサンプリングトレース状態になってからカウントアップされるので、カウントアップが開始されるタイミングは第1のPC1の方が第2のPC19よりも早いこととなる。しかし第2のPC19の共通カウント値は、そのカウントアップの際、必ず第1のPC1の共通カウント値と同じ値をとるように制御される。
例えば図3のように、第1のPC1が先にサンプリングトレース状態になって共通カウント値のカウントアップをはじめ、その後第2のPC19がサンプリングトレース状態になった時点で既に「3」になっていれば、第2のPC19の共通カウント値は「3」からカウントアップを開始する。その後は、第1および第2のPC1,19が同期して共通カウント値をカウントアップするので、それ以降は両者の共通カウント値は互いに同じ値をとりつつカウントアップされることになる。
このように本実施の形態のマルチCPUシステムでは、第1および第2のPC1,19は、サンプリングトレース状態であるとき互いに同じ値をとる共通カウント値を保持する。よってその共有カウント値をトレースデータに付する時刻情報に含ませれば、各トレースデータの時間的な前後関係を正しく把握することができる。
また上記のように、第1および第2のPC1,19の同期カウンタも基本的に互いに同じ値をとる。そのカウントアップの速度はバスI/Fクロックの周波数に相当し、共通カウント値のカウントアップ速度よりも高いので、時刻情報に同期カウンタ16のカウント値(同期カウンタ値)も含ませれば、より分解能の高い時刻情報を得ることができる。しかも同期カウンタ16は、共通カウント値がカウントアップされるときにゼロリセットされるので、同期カウンタ値に各PCの個体差による誤差が蓄積されることは防止される。従って、サンプリングトレース状態の長期間にわたる場合であっても、時刻情報の精度を高く維持できる。
図4〜図8は、本実施の形態に係るPCの動作を示すフローチャートである。図4は、スキャン実行後に行われるEND処理(END)における全体的な流れを示している。同図の如く、END処理では、サンプリングトレース処理(M1)と、各メモリに格納された値の反映・更新処理(M2)と、周辺機器21との通信並びにその通信内容に応じた処理を行う通信処理(M3)とが、この順に実行される。図5、図6および図7は、それらサンプリングトレース処理(M1)、メモリ値の反映・更新処理(M2)および通信処理(M3)それぞれの詳細を示している。
サンプリングトレース処理(M1)では、図5の如く、まずPC自身がサンプリングトレース状態か否かの確認が行われる(S101)。PCがサンプリングトレース状態であれば、そのサンプリング周期の設定が確認される(S102)。サンプリング周期がスキャン周期に設定されていれば、それに続けてトレースデータのサンプリング(S103)が行われる。取得されたトレースデータは、そのときの共通カウント値が時刻情報として付与され(S104)、サンプリングトレースメモリ9に格納される。
このようにサンプリングトレース処理(M1)では、PCがサンプリングトレース状態であり、且つ、そのサンプリング周期がスキャン周期の場合にトレースデータの取得および時刻情報の付与が行われ、それ以外の場合には何も行われない。
メモリ値の反映・更新処理(M2)では、図6の如く、PCはデバイスメモリ7の値の反映および更新(S201)を行い、さらに他のPC(第1のPC1)共有メモリ14の値を読み出してそれを自己の共有メモリ14の値に反映させる(S202)。そしてPC自身がサンプリングトレース開始待ち状態か否かが確認される(S203)。サンプリングトレース開始待ち状態であれば、当該PCはマスタPCの状態指示値保持部25の値(状態指示値)を確認する(S204)。
このときマスタPCの状態指示値が1(即ち、マスタPCがサンプリングトレース状態)であれば、マスタPCの共通カウント値保持部24の値(共通カウント値)を取得してそれを自己の共通カウント値保持部24に上書きすると共に、自己の状態指示値を1にする(S205)。そして当該PCはサンプリングトレース状態に移行する(自己のサンプリングトレース機能をオンにする)。
このように各PCは、メモリ値の反映・更新処理(M2)において、自身がサンプリングトレース開始待ち状態であり、且つ、マスタPCがサンプリングトレース状態になっていれば、自身をサンプリングトレース状態に移行させる。
通信処理(M3)では、図7の如く、PCは周辺機器21から送信されてきた信号にトレース設定情報が含まれているかを確認し(S301)、含まれていればそれをサンプリングトレースメモリ9に保存する(S302)。さらに同信号に、サンプリングトレース開始要求が含まれているか確認する(S303)。サンプリングトレース開始要求が含まれていれば、PC自身がマスタPCであるかを確認する(S304)。当該PCがマスタPCであれば、自己の共通カウント値保持部24を稼働させるべく共通カウント値に1を付与すると共に状態指示値を1に設定し(S306)、当該PCはサンプリングトレース状態に移行する(S307)。一方、当該PCがスレーブPCであれば、サンプリングトレース開始待ち状態に移行する(S305)。
このようにマスタPCは、サンプリングトレース開始要求を受けると直後の通信処理(M3)ですぐにサンプリングトレース状態に移行するが、スレーブPCは、サンプリングトレース開始要求を受けると一旦サンプリングトレース待ち状態に移行する。なお、スレーブPCがサンプリングトレース状態に移行するのは、その後のEND処理におけるメモリ値の反映・更新処理(M2)のステップS206においてである。
また図8は、マスタPC(ここでは第1のPC1)が出力する同期信号(SYN)の周期で、スキャン(SCAN)に割り込んで実行される同期割り込み処理(INT)におけるPCの動作を示している。同図の如く、同期割り込み処理においては、共通カウント値のカウントアップ処理(M4)、同期割り込みプログラム実行処理(M5)および同期サンプリングトレース処理(M6)がこの順に実行される。
図8の如く、共通カウント値のカウントアップ処理(M4)では、自己の状態指示値を確認し(S401)、それが1であれば共通カウント値をカウントアップする(S402)。同期割り込みプログラム実行処理(M5)では、実行すべき同期割り込みプログラムがサンプリングトレースメモリ9に存在するかを確認し(S501)、存在すればそれを読み出して実行する(S502)。
同期サンプリングトレース処理(M6)では、まずPC自身がサンプリングトレース状態か否か確認され(S601)、サンプリングトレース状態であれば、そのサンプリング周期の設定が確認される(S602)。そしてサンプリング周期が同期割り込み周期に設定されていれば、当該PCはトレースデータのサンプリング(S603)を行い、取得したトレースデータに時刻情報として共通カウント値を付与して(S604)、サンプリングトレースメモリ9に格納する。このように同期サンプリングトレース処理(M6)では、PCがサンプリングトレース状態であり、且つ、そのサンプリング周期が同期割り込み周期の場合に、トレースデータの取得および時刻情報の付与が行われ、それ以外の場合には何も行われない。
以下、図3〜図8を参照して、本実施の形態のマルチCPUシステムにおけるサンプリングトレースに係る動作を説明する。
サンプリングトレースの実行に先立ち、周辺機器21上で第1および第2のPC1,19各々に対するトレース設定情報(サンプリングトレースの対象とするデバイス及びそのアドレスの指定、サンプリング周期の指定等を含む)が作成される。作成されたトレース設定情報は通信ケーブル22を通して周辺機器21から第1および第2のPC1,19に送信される。以下では説明の簡単のため、トレース設定情報はサンプリングトレース開始要求と共に周辺機器21から送信されるものとする。もちろん実際の周辺機器21は、サンプリングトレース開始要求とは独立にトレース設定情報だけを第1および第2のPC1,19に送信することも可能である。
まず、サンプリングトレースのサンプリング周期がスキャン周期に設定された場合の動作を説明する。この場合、第1および第2のPC1,19は、トレースデータのサンプリングをEND処理毎に行うことになる。
図3に示すように、サンプリングトレースを実行する前、第1および第2のPC1,19の両方において、共通カウント値保持部24の値(共通カウント値)は0であり(共通カウント値保持部24は未稼働状態)、状態指示値保持部25の値(状態指示値)は0に設定されている。
サンプリングトレースを実行させる場合、周辺機器21から第1および第2のPC1,19へと、サンプリングトレース開始要求およびトレース設定情報が送信される。当該トレース設定情報には、サンプリング周期がスキャン周期である旨の指定が含まれている。
ここでは図3の如く、サンプリングトレース開始要求が周辺機器21から送信された後、マスタPCである第1のPC1よりも先に、スレーブPCである第2のPC19がEND処理(END)が行われたとする。
当該END処理では、第2のPC19において、図4〜図7で説明したサンプリングトレース処理(M1)、メモリ値の反映・更新処理(M2)、通信処理(M3)が順次行われる。この時点では、第2のPC19はサンプリングトレース状態ではないため、サンプリングトレース処理(M1)では何も行われない。また第2のPC19はサンプリングトレース開始待ち状態でもないため、メモリ値の反映・更新処理(M2)では、デバイスメモリ7の反映・更新(S201)と、自己の共有メモリ14の値の反映・更新(S201,S201)だけが行われる。なお、図3における参照符号「RO」の矢印は、第1および第2のPC1,19間におけるデータの読み出し信号を示している。
但し、第2のPC19はサンプリングトレース開始要求およびトレース設定情報を受信しているので、図7に示す通信処理(M3)では、当該第2のPC19はトレース設定情報をサンプリングトレースメモリ9に保存する(S302)。また第2のPC19はスレーブPCであるので、サンプリングトレース開始待ち状態へと移行する(S305)。第2のPC19は、通信処理(M3)を終えるとスキャン実行処理(SCAN)に戻る。
スキャン実行処理(SCAN)の間に、第1のPC1(マスタPC)の同期カウンタ16の値が所定の値に達すると、第1のPC1はバックプレーンバス18に同期信号(SYN)を出力する。それに応じて、第1および第2のPC1,19は、各々の同期カウンタ16をゼロリセットすると共に、図8に示す同期割り込み処理(INT)を実行する。
この時点では、第1および第2のPC1,19は両方とも、その状態指示値は0であり、またサンプリングトレース状態ではない。よってこのときの同期割り込み処理(INT)では、第1および第2のPC1,19は、プログラム実行処理(M5)で必要に応じて同期割り込みプログラムを実行するのみであり(S501,S502)、共通カウント値のカウントアップ処理(M4)および同期割り込みプログラム実行処理(M5)では何も行わない。第1および第2のPC1,19は、同期割り込み処理を終えると、それぞれスキャン実行処理(SCAN)に戻る。
続いて、第1のPC1のEND処理(END)が行われたとする。今度は第1のPC1において、図4〜図7に示したサンプリングトレース処理(M1)、メモリ値の反映・更新処理(M2)、通信処理(M3)が順次行われる。この時点では、第1のPC1もサンプリングトレース状態ではないため、サンプリングトレース処理(M1)では何も行われない。また第1のPC1はサンプリングトレース開始待ち状態でもないため(マスタPCは最も早くサンプリングトレース状態になるので、サンプリングトレース開始待ち状態になることは無い)、メモリ値の反映・更新処理(M2)では、デバイスメモリ7の反映・更新(S201)と、共有メモリ14の値の反映・更新(S201)だけが行われる。
但し、第1のPC1も、サンプリングトレース開始要求およびトレース設定情報を受信しているので、図7に示す通信処理(M3)ではトレース設定情報をサンプリングトレースメモリ9に保存する(S302)。また第1のPC1はマスタPCなので、自己の共通カウント値を1に、状態指示値を1にそれぞれ設定し(S306)、サンプリングトレース状態へと移行する(S307)。第1のPC1は、通信処理(M3)を終えると、スキャン実行処理(SCAN)に戻る。
その後、第1および第2のPC1,19はスキャン実行処理(SCAN)を行いつつ、一定周期で同期割り込み処理(INT)を繰り返し行う。このとき第1のPC1の状態指示値は1になっているので、第1のPC1が保持する共通カウント値は、同期割り込み処理(INT)の度にカウントアップされる(図8のS401,S402)。また第1のPC1はサンプリングトレース状態になっており、且つサンプリング周期は同期割り込み周期に設定されているので、同期割り込み処理(INT)の度にトレースデータのサンプリングが行われる(S601,S602,S603)。取得したトレースデータには共通カウント値を含む時刻情報(t2[2],t2[3],…)が付与される(S604)。
一方、第2のPC19は、その状態指示値は0であり、またサンプリングトレース状態ではないので、同期割り込み処理(INT)のサンプリングトレース処理(M1)および通信処理(M3)では何も行われず、メモリ値の反映・更新処理(M2)において所定の同期割り込みプログラムが実行されるのみである。
その後、第2のPC19においてEND処理が実行される。このときも第2のPC19はサンプリングトレース状態ではないので、サンプリングトレース処理(M1)では何も実行されない。メモリ値の反映・更新処理(M2)では、デバイスメモリ7および共有メモリ14の反映・更新(S201,S202)が行われる。さらに、第2のPC19はサンプリングトレース開始待ち状態になっているので、次の処理が行われる(S203)。
即ち、第2のPC19はマスタPCの状態指示値が1か否か(第1のPC1がサンプリングトレース状態か否か)を確認する(S204)。ここではそれが1であるので、第2のPC19は、第1のPC1の共通カウント値を取得してそれを自己の共通カウント値に上書きする(S205)。これにより、第1および第2のPC1,19の共通カウント値は、互いに同じ値になる。さらに第2のPC19は、状態指示値を1に設定し、自身もサンプリングトレース状態に移行する(S206)。
その結果、第1および第2のPC1,19の両方がサンプリングトレース状態(状態指示値が1)になる。よってこれ以降、第1および第2のPC1,19の共通カウント値は同期割り込み処理(INT)毎にカウントアップされる(S402)。第1および第2のPC1,19は、同期割り込み処理(INT)を互い同期して実行するので、両者の共通カウント値は互いに同じ値をとりつつカウントアップされることになる。
また第2のPC19がサンプリングトレース状態になったことにより、第2のPC19でも以降の同期割り込み処理(INT)の度にトレースデータのサンプリングが行われる(S601,S602,S603)。そして取得したトレースデータには共通カウント値を含む時刻情報(t2[4],t2[5],…)が付与される(S604)。
上記のように、サンプリングトレースが実行されている間、第1および第2のPC1,19の共通カウント値は互いに同じ値をとりつつカウントアップされ、トレースデータの取得の際、それが時刻情報として付される。よって第1および第2のPC1,19が蓄積したトレースデータを解析する際、時刻情報に含まれる共通カウント値を参照すれば、各トレースデータの時間的な前後関係を正しく知ることができる。
また先に述べたように、時刻情報には共通カウント値のみならず、同期カウンタのカウント値(同期カウンタ値)を含ませてもよい。それにより、時刻情報は詳細な時刻を表すことができるようになる。同期割り込み処理は第1および第2のPC1,19で同期して行われるため、基本的に共通カウント値だけでも各トレースデータの取得時刻は把握できる。しかし、同期割り込みプログラム実行の所要時間によっては、トレースデータの取得タイミングが幾分ずれる場合もある。同期カウンタ値をも含む時刻情報は、そのような僅かなずれまで把握したい場合に有効である。
以上では、サンプリング周期が同期割り込み周期に設定された場合の動作を説明したが、サンプリング周期がスキャン周期に設定されている場合、トレースデータのサンプリングを行うタイミングが異なるが、それ以外の動作は上記とほぼ同じである。
即ち、サンプリング周期がスキャン周期に設定されているケースでは、トレースデータの取得および時刻情報の付与は、第1および第2のPC1,19の各々がサンプリングトレース状態になった後、END処理の中で実行される(図5のサンプリングトレース処理(M1)におけるステップのS103)。この場合も、トレースデータには共通カウント値を含む時刻情報(t1[5],t1[6],…)が付与される(S104)。よって、第1および第2のPC1,19が取得したトレースデータの解析の際、それらの時刻情報に含まれる共通カウント値を参照すれば、各トレースデータの時間的な前後関係を正しく知ることができる。
この場合も、時刻情報に同期カウンタ値も含ませることで、より詳細な時刻を知ることができる。図3の例のように第1および第2のPC1,19のEND処理のタイミングすなわちトレースデータの取得タイミングが大きく異なっていれば、そのときの共通カウント値を参照するだけで各トレースデータの時間的な前後関係は把握できる。しかしEND処理のタイミングはスキャン実行処理の所要時間によって変化するため、第1および第2のPC1,19のEND処理がほぼ同時になることもある。そのような場合には、共通カウント値だけで時間的な前後関係を把握できないことも考えられるので、時刻情報に同期カウンタ値を含ませ、時刻情報の分解能を高めることが有効である。
また以上の説明では、第1および第2のPC1,19はサンプリングトレース状態になると、サンプリング周期毎に必ずトレースデータを取得するように説明したが、特定の条件(トリガ条件)を満たした場合にのみ取得するよう構成してもよい。トリガ条件は、メモリ(デバイスメモリ7、シーケンスプログラムメモリ8、共有メモリ14)の値やそれらの組み合わせ(論理演算)が条件として定められる。トリガ条件が設定された場合、サンプリングトレース状態になった第1および第2のPC1,19は、サンプリング周期毎にトリガ条件が成立した否かを判定し、成立したときにのみトレースデータの取得を行うように動作する。
またトリガ条件の応用として、第1および第2のPC1,19が、トリガ条件を満たす前後の所定期間においてトレースデータを取得するように構成してもよい。そのようなトリガ条件が設定された場合、サンプリングトレース状態になった第1および第2のPC1,19は、サンプリング周期毎にトリガ条件が成立したか否かを監視しつつ、トレースデータを取得してそれをリングバッファ形式でサンプリングトレースメモリ9に格納する。そしてトリガ条件が成立すると、その直前の特定個数のトレースデータを残しつつ、その後はサンプリング周期毎にトレースデータを取得して蓄積するように動作する。
以上のように本実施の形態によれば、トレースデータの時刻情報として、複数のPC間で共通した値をとる共通カウント値が付与されるため、異なるPCが取得したトレースデータ同士でもそれらの時間的な前後関係を正しく把握することができる。よってトレースデータを用いてタイミングチャートを作成した際、複数のPCのタイミングチャートの時間軸を正しく揃えて表示することが可能になり、デバッグ作業の効率化に寄与することができる。
当該時刻情報には、さらに同期カウンタ値を含ませてもよい。同期カウンタ値は、共通カウント値よりもカウントアップ速度が高いため、より分解能の高い時刻情報を得ることができる。共通カウント値がカウントアップされる毎にゼロリセットされるので、PCごとの誤差が累積されることが防止されており、サンプリングトレースを長期間行う場合でも、時刻情報の精度の低下が防止されている。
また本実施の形態では、特別なハードウェア(例えば特許文献4の同期制御ボード)を用いることなく、複数のPCで共有される共有メモリ14の機能を利用した簡易な構成により、複数のPCで同じ値をとる共通カウント値を得ている。つまりPCの大幅な設計変更や、システムへの新たなハードウェアの導入の必要がない。従って、PC自体の製造コスト並びにシステムの構築にかかるコストの上昇が抑えられるという利点もある。
なお図1においては、複数のPCが同一のベースユニット17に装着され、各PC同士がそのベースユニット17が備えるバックプレーンバス18を介して相互接続される形態を示したが、バックプレーンバス18の機能はネットワークケーブルによっても実現可能である。その場合には、相互接続させる複数のPCを同一のベースユニット17に装着させる必要は無い。
また図1では2つのPCを備える構成について説明したが、本実施の形態は3つ以上のPCを備えるシステムに対しても適用可能である。その場合には、特定の1つのPCをマスタPCとし、それ以外の1以上のPCをスレーブPCにすればよい。
以上では、マルチCPUシステムを構成するコントローラとして、プログラマブルコントローラ(PC)を用いた例を示したが、サンプリングトレース機能および同期割り込み機能を備えるモーションコントローラ(MC)を含むシステムに対しても適用可能である。
<実施の形態2>
同期割り込み処理においては、シーケンスプログラム(同期割り込みプログラム)も実行され、その同期割り込みプログラムは、PCの使用者(エンジニア)が周辺機器21を用いて作成する。よって同期割り込みプログラム実行の所要時間がどの程度になるかは、その作成者によって異なる。
同期割り込みプログラムの所要時間が長くなり、その終了時刻が次の同期割り込み処理の開始タイミングをさらに超えるような場合には、当該次の同期割り込み処理が消滅する。実施の形態1では、各PCの共通カウント値のカウントアップが、同期割り込み処理の中で実施される構成であったので、特定のPCに同期割り込み処理の消滅があると、そのPCの共通カウント値はカウントアップされず、共通カウント値にずれが生じることになる。
特定のPCに共通カウント値にずれが生じると、当該PCにおいてはトレースデータに不正な時刻情報が付与されることになる。特に、使用者がそのことが認識できなければ、かえってトレースデータの解析に混乱を来し、デバッグ作業に悪影響を与える結果となる。
そこで実施の形態2では、同期割り込み処理の消滅を検出でき、それが生じた場合に不正な時刻情報を有するトレースデータが蓄積されるのを防止できる構成を提案する。
図9は、実施の形態2に係るプログラマブルコントローラ(PC)の構成を示す図である。同図においては、図2に示したものと同様の機能を有する要素には同一符号を付してあるので、それらのここでの説明は省略する。
図9の如く本実施の形態のPCは、図2の構成に対し、CPU2の共通カウント値制御部23にさらに同期割り込み監視部26を設け、デバイスメモリ7にさらに内部カウンタ値保持部27を設けた構成を有している。内部カウンタ値保持部27は、内部カウンタ12の同期割り込み処理が実行されたときの内部カウンタ12の値(内部カウンタ値)が記録されるものであり、同期割り込み監視部26は、その内部カウンタ値保持部27に記録された値に基づいて、同期割り込み処理の消滅の発生を検出するものである。
以下、本実施の形態に係るPC(図9)を用いたマルチCPUシステム(図1)の動作を説明する。図10はその動作を説明するための図であり、代表的に第1のPC1の動作を示している。また同図の横方向は時間軸に対応している。本実施の形態では、第1および第2のPC1,19は共に図9の構成を有しているが、図10ではそのうちの主要な要素のみを示している。
実施の形態2のマルチCPUシステムにおいて、その通常時の動作は実施の形態1と同様であるが、先に述べたように第1および第2のPC1,19は、同期割り込み処理の消滅を検出する機能を有している。第1および第2のPC1,19は、同期割り込み処理の実行状況を監視し、その消滅が発生した場合は共通カウント値保持部24の機能(共通カウント値の付与)を停止することで、トレースデータに不正な共通カウント値を含む時刻情報が付与されることを防止する。
図10に示すように、内部カウンタ12のカウント値は、CPUクロック生成部11が生成する内部クロックに応じて一定の傾きで直線的に上昇する。CPU2の同期割り込み監視部26はそのことを利用して、各同期割り込み処理の所要時間を判定し、それによって同期割り込み処理の消滅を検出する。
例えば図10のように、共通カウント値(共通カウント値保持部24の値)がn+3のときの同期割り込み処理(INT)が長くなり、次の同期割り込み処理が消滅すると、当該共通カウント値はカウントアップされないので、その値が第1および第2のPC1,19間でずれる。同期割り込み監視部26は、その同期割り込み処理の消滅を検出する。すると共通カウント値制御部23は、共通カウント値を0(非稼働状態)にすると共に、状態指示値(状態指示値保持部25の値)をエラー停止状態を示す2に設定する。
これにより、同期割り込み処理の消滅に起因する不正な時刻情報(不正な共通カウント値)がトレースデータに付与されることが防止される。またそれまでに取得されたトレースデータの時刻情報を参照すれば、どの時点で同期割り込み処理の消滅が生じたのかも割り出すことができる。
以上の処理は第1および第2のPC1,19の各々において、同期割り込み処理中の共通カウント値のカウントアップ処理(M4)にて行われる。図11は、本実施の形態に係る共通カウント値のカウントアップ処理(M4)のフローチャートである。同図を用いて、本実施の形態の第1および第2のPC1,19の動作をより具体的に説明する。なお同期割り込み処理中の同期割り込みプログラム実行処理(M5)、同期サンプリングトレース処理(M6)については、実施の形態1と同様であるので説明は省略する。
図11の如く、同期割り込み処理が開始されると、第1および第2のPC1,19は自己の状態指示値を確認する(S411)。状態指示値が1すなわち自己がサンプリングトレース状態であれば、その時点の内部カウンタ12の値(内部カウンタ値)を読み出す(S412)。
ここで、今回の共通カウント値のカウントアップ処理が、サンプリングトレース状態になってからの初回か否か確認される(S413)。初回であれば、それまでの同期割り込み処理の消滅は共通カウント値に影響しないためその消滅の判定を行わずに、内部カウンタ値をデバイスメモリ7の内部カウンタ値保持部27に保存し(S416)、共通カウント値をカウントアップする(S417)。
共通カウント値のカウントアップ処理が2回目以降であれば、以下のように、同期割り込み処理の消滅の有無の判定が行われる(S414)。
まず、前回の同期割り込み処理の際に記録した内部カウンタ値を、内部カウンタ値保持部27から読み出し、今回の内部カウンタ値との差分を求める。この内部カウンタ値の差分は、前回の同期割り込み処理の先頭から、今回の同期割り込み処理の先頭までの所要時間を示している。例えば同期割り込み周期を0.888[msec]と仮定すると、同期割り込み処理の消滅が無かった場合には、内部カウンタ値の差分は約0.888[msec]を示すはずであるが、同期割り込み処理が1回消滅した場合には約1.776[msec]前後つまり0.888[msec]の2倍程度となるので、その値に基づいて同期割り込み処理の消滅の有無を判定できる。
但し、各PCにおける同期割り込み処理は、マスタPCが出力した同期信号を、バックプレーンバスI/F13を通して受信してから開始されるものなので、同期信号の送受信処理に要した時間に応じてその開始タイミングがばらつくことが考えられる。よって同期割り込み処理の消滅が無かったとしても、内部カウンタ値の差分は正確に0.888[msec]になるとは限らない。同様に、同期割り込み処理が1回消滅した場合でも、正確に1.776[msec]になるとは限らない。
そこで、同期割り込み処理の消滅の有無の判定には、そのような内部カウンタ値の差分のばらつきが考慮される。例えば、前回の内部カウンタ値をt0[msec]、今回のカウンタ値とt1[msec]、同期割り込み周期をT[msec]としたとき、同期割り込み処理の消滅は次の判定式(1)を用いて判定される。
t1−t0<1.5Tなら消滅なし、t1−t0≧1.5Tなら消滅あり …(1)
上記の数式(1)によれば、内部カウンタ値の差分(t1−t0)ばらつきが、同期割り込み周期の半分(T/2)より小さければ、同期割り込み処理の消滅の有無を正しく判定できる。通常は、内部カウンタ値がそれほど大きな誤差を持つことは考え難く、数式(1)であれば充分正確な判定が可能である。
判定の結果、同期割り込み処理の消滅が無かったと判定された場合、今回のカウンタ値をデバイスメモリ7の内部カウンタ値保持部27に書き込み(S416)、共通カウント値をカウントアップする(S417)。
逆に、同期割り込み処理の消滅があったと判定された場合には、共通カウント値の値を0にすると共に、状態指示値を2に設定して共通カウント値保持部24のエラー停止状態にする(S418)。
なお、同期割り込み処理の消滅が発生した以降の同期割り込み処理では、状態指示値が2になっているので共通カウント値のカウントアップは成されない(S411)。但し、トレースデータの取得は、その後もサンプリング周期に従って引き続き行わせてよい。そのときのトレースデータには、共通カウント値0の時刻情報が付与される。これにより、不正な時刻情報が付与されることが防止され、そのトレースデータが同期割り込み処理の消滅が生じた後のものであることが分かる。また同期割り込み処理の消滅が発生するまでは、正しい時刻情報が付与されているので、それを参照すれば同期割り込み処理の消滅があったタイミングの特定が可能である。
<実施の形態3>
実施の形態3では、同期割り込み処理が消滅した場合でも、複数のPCで同じ値をとる共通カウント値を提供可能な構成を示す。図12は、本実施の形態に係るプログラマブルコントローラ(PC)の構成を示す図である。同図の如く、当該PCは、実施の形態2のPC(図9)に対し、CPU2の共通カウント値制御部23がさらに共通カウント値算出部28を備え、デバイスメモリ7がさらに同期カウンタ値保持部29を備えるものである。
本実施の形態では、共通カウント値保持部24に保持させる共通カウント値を、同期割り込み処理毎にカウントアップするのではなく、必要なときに共通カウント値制御部23が算出する方式をとる。なお本実施の形態でも、共通カウント値は、同期カウンタ16がゼロリセットされるタイミングで(つまり同期割り込み処理の周期)でカウントアップする如く再計算されるものとする。
共通カウント値の算出方法を、図13を用いて説明する。図13は、共通カウント値の算出をEND処理ごとに行ったときの例である。
CPU2は、共通カウント値制御部23が共通カウント値を算出する度に、そのときの内部カウンタ12の値(内部カウンタ値)および同期カウンタ16の値(同期カウンタ値)を、それぞれ内部カウンタ値保持部27および同期カウンタ値保持部29にラッチする。それらの値は、その次に共通カウント値を算出するのに用いられる。
例えば、前回のEND処理で算出された共通カウント値がn1であったとする。CPU2はそのEND処理の際、その共通カウント値n1を共通カウント値保持部24に保持させると共に、その時の内部カウンタ値k1[msec]および同期カウンタ値c1[msec]を、それぞれ内部カウンタ値保持部27および同期カウンタ値保持部29にラッチする。同期割り込み処理では共通カウント値のカウントアップは行われず、今回のEND処理までは共通カウント値はn1のままである。
今回のEND処理になると、共通カウント値算出部28は以下の手順で共通カウント値を算出する。まず共通カウント値算出部28は、そのときの内部カウンタ値k2[msec]と同期カウンタ値c2[msec]とを取得する。そしてそれらの値と、前回のEND処理時の共通カウント値n1、内部カウンタ値k1および同期カウンタ値c1とを用い、次の数式(2)〜(4)から共通カウント値n2を算出する。なお、数式(4)の関数floor(x)は、引数xの小数部を切り捨てた整数値(整数部)を返すものである(例えばfloor(2.8)の返り値は2となる)。
ka=k1−c1 …(2)
kb=k2−c2 …(3)
n2=n1+floor((kb−ka+T/2)/T) …(4)
数式(2)から得られるka[msec]は、前回のEND処理(共通カウント値n1を算出したタイミング)の直前に同期カウンタ16がゼロリセットしたときの内部カウンタ値を示している。同期カウンタ値c1は、同期カウンタ16のゼロリセットからの経過時間を示しているため、k1からc1を引けばkaが得られる。
同様に、数式(3)で算出されるkb[msec]は、今回のEND処理(共通カウント値n2を算出するタイミング)の直前に同期カウンタ16がゼロリセットしたときの内部カウンタ値を示している。
ここで、kaとkbとの間の経過時間kb−ka[msec]は、ほぼ同期割り込み周期T[msec]の整数倍の値となるため、経過時間kb−kaと同期割り込み周期Tとの比((kb−ka)/T)は、前回のEND処理から今回のEND処理までの間に同期カウンタ16のゼロリセット回数(すなわち共通カウント値がカウントアップされるべき回数)を表すことになる。
数式(4)では、計算結果の丸め誤差を考慮し、前回のEND処理から今回のEND処理までの間の同期割り込み回数を、floor((kb−ka+T/2)/T)として計算している(右辺の第2項)。つまり数式(4)では、丸め誤差がT/2より小さければ同期割り込み回数を正しく算出することができる。通常、丸め誤差がそれほど大きくなることはないので、数式(4)によれば同期割り込み回数を正しく得ることができる。図13の例では、n2=n1+3が得られる。
なお、END処理間における同期カウンタ16のゼロリセット回数は、前回のEND処理と今回のEND処理との間の経過時間k2−k1[sec]と、同期割り込み周期Tとの比の整数部、即ちfloor((k2−k1)/T)の値にもほぼ対応する。しかし、END処理は同期カウンタ16のゼロリセットのタイミングと関係なく実行されるので、その計算式では丸め誤差がT/2を超えることがあり、確実に正しい値が得られるとは限らない。数式(4)において、経過時間k2−k1ではなく、経過時間kb−kaが用いられるのはこのためである。
またここでは、END処理時にそのときの共通カウント値を算出した場合について説明したが、前回算出した共通カウント値n1と、その算出時の内部カウンタ値k1および同期カウンタ値c1とが分かれば、上記の数式(2)〜(4)を用いて任意のタイミングの共通カウント値を算出可能できる。例えば、各同期割り込み処理時における共通カウント値も、いわゆる“カウントアップ”を行わずに、数式(2)〜(4)を用いて算出可能である。なお、同期割り込み処理は同期カウンタ16のゼロリセット時に行われるので、その場合の同期カウンタ値c1,c2はほぼ0になる。
共通カウント値算出部28による共通カウント値の算出は、必要に応じて行われる。図13の例では、次回のEND処理時でも、そのときの共通カウント値n3を共通カウント値算出部28によって算出しており、n3=n2+4となる。
図13の例においては、共通カウント値n2のときのEND処理と、共通カウント値n3のときのEND処理との間に、同期カウンタ16のゼロリセットが4回発生しているが、同期割り込み処理は1回消滅しており、3回しか行われていない。例えば実施の形態1のように同期割り込み処理ごとに共通カウント値をカウントアップさせたならば、当該PCでは共通カウント値が3しか増加せず、他のPCとのずれが生じる。しかし本実施の形態では、共通カウント値算出部28が算出する共通カウント値は、同期カウンタ16のゼロリセット回数だけ確実にカウントアップされるので、図13の例においても共通カウント値は4だけ増加する。つまり、同期割り込み処理の消滅が発生しても、各PC間で共通カウント値のずれは生じない。
このように本実施の形態では、各時点の共通カウント値は、その前回の共通カウント値、内部カウンタ値および同期カウンタ値を用いて算出される。つまり、各PCにおいて前回のそれら各値さえ分かっていれば、その後の各時点の共通カウント値の正しい値を導き出すことができる。
逆に言えば、正しい値を算出できるかどうかは、各PCに最初に付与される共通カウント値、内部カウンタ値および同期カウンタ値の初期値に全てがかかっている。従って、本実施の形態では、サンプリングトレースを開始するときに、各PCにそれらの初期値が適切に設定されるようにすることが重要である。
以下、本実施の形態に係るPCのサンプリングトレース開始時の動作を図14を用いて説明する。本実施の形態では、第1および第2のPC1,19が互いに同期した共通カウント値を算出できるように、サンプリングトレース開始時に、各PCの共通カウント値、内部カウンタ値および同期カウンタ値の適切な初期値を付与する処理が行われる。以下、その処理を「同期確立処理」と称する。また、状態指示値保持部25が保持する状態指示値は、共通カウント値保持部24が未稼働状態なら0を、稼働状態なら1を、エラー停止状態なら2を、同期確立処理状態であれば3をとるように制御されるものとする。
本実施の形態でも、第1および第2のPC1,19のCPU2は、スキャン実行処理(SCAN)とEND処理(END)とを繰り返し行いつつ、同期カウンタ16がゼロリセットされる各タイミングで同期割り込み処理(INT)を実行する。END処理の全体的な流れは、実施の形態1で示した図5と同様である。即ち、各END処理では、サンプリングトレース処理(M1)と、各メモリに格納された値の反映・更新処理(M2)と、周辺機器21との通信並びにその通信内容に応じた処理を行う通信処理(M3)とが、この順に実行される。但し、以下に説明するように、各処理の内容は実施の形態1とは異なっている。
図15、図16および図17は、本実施の形態におけるサンプリングトレース処理(M1)、メモリ値の反映・更新処理(M2)および通信処理(M3)それぞれの詳細を示している。
サンプリングトレース処理(M1)では、図15の如く、まずPC自身がサンプリングトレース状態か否かの確認が行われる(S121)。PCがサンプリングトレース状態であれば、そのサンプリング周期の設定が確認される(S122)。サンプリング周期がスキャン周期に設定されていれば、それに続けてトレースデータのサンプリング(S123)が行われる。取得されたトレースデータは、共通カウント値算出部28が数式(4)を用いて算出した共通カウント値が時刻情報として付与され(S124)、サンプリングトレースメモリ9に格納される。
このように本実施の形態のサンプリングトレース処理(M1)は、トレースデータに付与する時刻情報が共通カウント値算出部28によって算出されることを除いて、実施の形態1(図5)と同様である。
メモリ値の反映・更新処理(M2)では、図16の如く、PCはデバイスメモリ7の値の反映および更新(S221)を行い、さらに他のPC(第1のPC1)共有メモリ14の値を読み出してそれを自己の共有メモリ14の値に反映させる(S222)。そしてPC自身がサンプリングトレース開始待ち状態か否かが確認される(S223)。サンプリングトレース開始待ち状態であれば、当該PCはマスタPCの状態指示値保持部25の値(状態指示値)を確認する(S224)。
このときマスタPCの状態指示値が3(同期確立処理状態)であれば、マスタPCの共通カウント値保持部24の値(共通カウント値)を取得してそれを自己の共通カウント値保持部24に上書きすると共に、自己の状態指示値を3にする(S225)。またこのときの内部カウンタ値および同期カウンタ値が、それぞれ内部カウンタ値保持部27および同期カウンタ値保持部29にラッチされる。そして当該PCは同期確立処理状態に移行する(S226)。
上記ステップS223にて、当該PCがサンプリングトレース開始待ち状態でない場合、自身が同期確立処理状態か否かが確認される(S227)。同期確立処理状態であれば、さらに自身がマスタPCか否かが確認される(S228)。
自身がマスタPCの場合はスレーブPCの状態指示値を確認し(S229)、それが3であれば内部カウンタ値および同期カウンタ値をラッチし(S230)、状態指示値を1に設定した上で(S231)、サンプリングトレース状態に移行する(S232)。
また自身がスレーブPCの場合はマスタPCの状態指示値を確認し(S233)、それが1(サンプリングトレース状態)であれば、数式(4)から共通カウント値を算出して共通カウント値保持部24に保持し(S234)、またその時の内部カウンタ12の値(内部カウンタ値)および同期カウンタ16の値(同期カウンタ値)を、それぞれ内部カウンタ値保持部27および同期カウンタ値保持部29にラッチする。さらに状態指示値を1に設定した上で(S235)、サンプリングトレース状態に移行する(S236)。
このようにメモリ値の反映・更新処理(M2)において、各PCは、自身がサンプリングトレース開始待ち状態であるとき、マスタPCが同期確立処理状態であれば、自身も同期確立処理状態に移行する。またマスタPCは、自身のみならずスレーブPCも同期確立処理状態になっていれば、内部カウンタ値および同期カウンタ値をラッチして、サンプリングトレース状態に移行する。またスレーブPCは、マスタPCがサンプリングトレース状態に移行していれば、自身もサンプリングトレース状態に移行する(S237)。
通信処理(M3)では、図17の如く、PCは周辺機器21から送信されてきた信号にトレース設定情報が含まれているかを確認し(S321)、含まれていればそれをサンプリングトレースメモリ9に保存する(S322)。さらに同信号に、サンプリングトレース開始要求が含まれているか確認する(S323)。サンプリングトレース開始要求が含まれていれば、PC自身がマスタPCであるかを確認する(S324)。当該PCがマスタPCであれば、共通カウント値を1に設定すると共に状態指示値を3に設定し(S326)、当該PCは同期確立処理状態に移行する(S327)。一方、当該PCがスレーブPCであれば、サンプリングトレース開始待ち状態に移行する(S325)。
このようにマスタPCは、サンプリングトレース開始要求を受けると直後の通信処理(M3)で同期確立処理状態に移行する。スレーブPCは、サンプリングトレース開始要求を受けると一旦サンプリングトレース待ち状態に移行する。なお、スレーブPCが同期確立処理状態に移行するのは、その後のEND処理におけるメモリ値の反映・更新処理(M2)のステップS226においてである。
また本実施の形態でも、同期割り込み処理(INT)においては、共通カウント値のカウントアップ処理(M4)、同期割り込みプログラム実行処理(M5)および同期サンプリングトレース処理(M6)がこの順に実行される。図18および図19は、本実施の形態の共通カウント値のカウントアップ処理(M4)および同期サンプリングトレース処理(M6)を示している。同期割り込みプログラム実行処理(M5)については、実施の形態1と同様である(図示は省略する)。
図18の如く共通カウント値のカウントアップ処理(M4)では、自己の状態指示値を確認し(S421)、それが3(同期確立処理状態)であれば、内部カウンタ値が読み出され(S422)、実施の形態2で示した判定式(1)に基づいて同期割り込み処理の消滅の有無が判定される(S424,S425)。同期割り込み処理の消滅が発生していなければ、次回の同期割り込み処理の判定のために内部カウンタ値をデバイスメモリ7に記録して(S426)、共通カウント値をカウントアップする(S427)。また同期割り込み処理の消滅が発生していなければ、共通カウント値を0にすると共に、状態指示値を2に設定して共通カウント値保持部24のエラー停止状態にする(S428)。
但し、状態指示値が3であっても(S421)、共通カウントアップのカウントアップが初回であれば同期割り込み処理の判定は行われず(S423)、内部カウンタ値の記録と(S426)、共通カウント値のカウントアップ(S427)のみが行われる。
図13を図11と比較して分かるように、本実施の形態の共通カウント値のカウントアップ処理(M4)では、PCが同期確立処理状態のとき、実施の形態2と同様の処理が行われ、同期割り込み処理の消滅が検出されると共通カウント値の機能が停止する。上記のように本実施の形態のPCは、サンプリングトレースを実行している間に同期割り込み処理の消滅が生じても共通カウント値を正しく算出できるものである。しかし、同期確立処理状態の間は、同期割り込み処理の消滅の発生は許されない。この規制により、各PCに共通カウント値、内部カウンタ値および同期カウンタ値に、不適切な初期値が付与されることを防止している。
また図19のように、同期サンプリングトレース処理(M6)では、まずPC自身がサンプリングトレース状態か否か確認され(S621)、サンプリングトレース状態であれば、そのサンプリング周期の設定が確認される(S622)。そしてサンプリング周期が同期割り込み周期に設定されていれば、当該PCはトレースデータのサンプリング(S623)を行い、取得したトレースデータに時刻情報として数式(4)による計算値を付与して(S624)、サンプリングトレースメモリ9に格納する。即ち、図19の同期サンプリングトレース処理(M6)は、時刻情報が数式(4)で与えられることを除いて、実施の形態1(図8)と同様である。
以下、図14〜図19を参照して、本実施の形態のマルチCPUシステムにおけるサンプリングトレースの開始時の動作を説明する。
サンプリングトレースを実行する前、第1および第2のPC1,19の両方において、共通カウント値保持部24の値(共通カウント値)は0であり(共通カウント値保持部24は未稼働状態)、状態指示値保持部25の値(状態指示値)は0に設定されている。
周辺機器21は、第1および第2のPC1,19にサンプリングトレースを実行させるため、それらにサンプリングトレース開始要求を送信する。ここでも簡単のため、当該サンプリングトレース開始要求と共にトレース設定情報が送信されているものとする。
サンプリングトレース開始要求およびトレース設定情報が周辺機器21から送信された後、図14の如く第1のPC1(マスタPC)よりも先に、第2のPC19(スレーブPC)のEND処理が行われたとする。この第2のPC19のEND処理では、デバイスメモリ7および共有メモリ14の反映・更新(S221,S222)、トレース設定情報の保存(S322)が行われた後、当該第2のPC19はサンプリングトレース開始待ち状態になる。
その後、第1のPC1のEND処理が行われると、当該END処理において第1のPC1は、デバイスメモリ7および共有メモリ14の反映・更新(S221,S222)、トレース設定情報の保存(S322)行った後、共通カウント値を1、状態指示値を3に設定して(S326)、同期確立処理状態に移行する(S327)。
第1および第2のPC1,19のそれぞれは、END処理の後スキャン実行処理(SCAN)を行いつつ、一定周期で同期割り込み処理(INT)を繰り返し行う。このとき第1のPC1の状態指示値は3になっているので、第1のPC1の同期割り込み処理(INT)では、同期割り込み処理の消滅の有無が監視されつつ(図18のS424,S425)、共通カウント値がカウントアップされる(S427)。一方、第2のPC19は、サンプリングトレース状態ではないので、同期割り込み処理(INT)では、所定の同期割り込みプログラムが実行されるのみである。
その後、第2のPC19においてEND処理が実行される。このとき第2のPC19は、サンプリングトレース開始待ち状態であるので、デバイスメモリ7および共有メモリ14の反映・更新(S221,S222)を行った後、第1のPC1(マスタPC)の共通カウント値(“3”)を取得して(S225)、同期確立処理状態に移行する。また第2のPC19は、このときの内部カウンタ値(kk0)および同期カウンタ値(cc0)を、それぞれ内部カウンタ値保持部27および同期カウンタ値保持部29にラッチする。これにより、第1および第2のPC1,19の共通カウント値は、互いに同じ値になる。但し、同期確立処理状態の第1のPC1では、同期割り込み処理ごとに共通カウント値のカウントアップが行われているため(図18のS426)、第1のPC1において同期割り込み処理の消滅が生じていれば、その共通カウント値は不正な値である可能性がある。しかしこの時点では第2のPC19はそれを判断できない。
その後、再び第1のPC1のEND処理が行われる。このとき第1および第2のPC1,19は共に同期確立処理状態(状態指示値が3)である。よって第1のPC1は、デバイスメモリ7および共有メモリ14の反映・更新(S221,S222)を行った後、そのときの内部カウンタ値(k4)および同期カウンタ値(c4)をそれぞれ内部カウンタ値保持部27および同期カウンタ値保持部29にラッチする(S230)。さらに第1のPC1は、状態指示値を1にして(S231)、サンプリングトレース状態に移行する(S232)。
ここで、同期確立処理状態の第1のPC1で、同期割り込み処理の消滅が生じていればエラー停止状態(状態指示値が2)になっているはずである。つまり、第1のPC1がサンプリングトレース状態に至ったということは、同期確立処理状態の第1のPC1では同期割り込み処理の消滅が無かったことを示している。
その後、再び第2のPC19のEND処理が行われる。このとき当該第2のPC19は同期確立処理状態であり、第1のPC1はサンプリングトレース状態である。よって第2のPC19は、デバイスメモリ7および共有メモリ14の反映・更新(S221,S222)を行った後、数式(4)を用いて、先に取得した共通カウント値(“3”)、そのときの内部カウンタ値(kk0)および同期カウンタ値(cc0)から現時点の共通カウント値(“6”)を算出し、それを内部カウンタ値保持部27に保持する(S234)。そして第2のPC19は、このときの内部カウンタ値(kk1)および同期カウンタ値(cc1)をラッチし(S235)、状態指示値を1にして(S236)、サンプリングトレース状態に移行する(S237)。
このように第2のPC19は、第1のPC1がサンプリングトレース状態になった後で、共通カウント値を算出し、自らもサンプリングトレース状態に移行する。上記のように、第1のPC1がサンプリングトレース状態に至ったことは、同期確立処理状態の第1のPC1では同期割り込み処理の消滅が無かった、即ち同期確立処理状態の第2のPC19が第1のPC1から取得した共通カウント値は正しい値であったことを示している。よって、このとき第2のPC19が算出した現時点の同期カウンタ値もまた正しい値であると言える。
サンプリングトレース状態になった第1および第2のPC1,19は、指定されたサンプリング周期でトレースデータのサンプリングを行う。そのサンプリングトレース状態での第1および第2のPC1,19の動作は、実施の形態1とほぼ同様である。例えばサンプリング周期がスキャン周期であれば、各END処理のサンプリングトレース処理(M1)でトレースデータが取得され(図15のステップS123)、あるいはサンプリング周期が同期割り込み周期であれば、各同期割り込み処理における同期サンプリングトレース処理(M6)でトレースデータが取得される(図19のステップS623)。
但し、取得したトレースデータには、時刻情報として、共通カウント値算出部28が数式(4)を用いて算出した共通カウント値が付される(図15のステップS124、図19のステップS624)。またその際、次回の共通カウント値の算出のために、その時点の内部カウンタ値および同期カウンタ値が、それぞれ内部カウンタ値保持部27および同期カウンタ値保持部29にラッチされる。
以上では、同期確立処理状態の第1のPC1で同期割り込み処理の消滅が発生しなかった場合について説明したが、それが発生した場合(状態指示値が2になった場合)には、第1および第2のPC1,19の両方において、共通カウント値および状態指示値を共に0に設定しなおして、もう一度同期確立処理をやり直しさせればよい。
なお、同期割り込み処理の消滅は、本来あってはならないものであり、マスタPC(第1のPC1)が同期確立処理状態になっている期間という非常に短い期間に、それが生じる確率は極めて低い。よって、仮に同期確立処理状態のマスタPCに同期割り込み処理の消滅が発生したとしても、一度上記の処理のやり直しを行えば、ほぼ確実に正しい共通カウント値を取得することができる。
以上のように本実施の形態によれば、同期割り込み処理の消滅が生じた場合であっても、各PCで共通カウント値のずれが生じない。従って、トレースデータに不正な時刻情報が付されることを防止できる。
実施の形態2では、同期割り込み処理の消滅が発生した以降のトレースデータには、正しい時刻場合が付されないが、本実施の形態では、同期割り込み処理が消滅した後もトレースデータに正しい時刻場合が付される。その結果、トレースデータを解析して、本来あってはならない同期割り込み処理の消滅を引き起こしている原因を特定することが格段に容易となる。
1,19 PC、2 CPU、3 シーケンスプログラム実行部、4 サンプリングトレース実行部、5 時刻情報付与部、6 通信I/F、7 デバイスメモリ、8 シーケンスプログラムメモリ、9 サンプリングトレースメモリ、10 内部バス、11 CPUクロック生成部、12 内部カウンタ、13 バックプレーンバスI/F、14 共有メモリ、15 バスI/Fクロック生成部、16 同期カウンタ、17 ベースユニット、18 バックプレーンバス、19 第2のPC、20 入出力ユニット、21 周辺機器、22 通信ケーブル、23 共通カウント値制御部、24 共通カウント値保持部、25 状態指示値保持部、26 同期割り込み監視部、27 内部カウンタ値保持部、28 共通カウント値算出部、29 同期カウンタ値保持部。