装置を制御するプログラムは、複雑化の一途をたどっているが、複雑なソフトウェアを、高い信頼性を維持しながら開発する手法は、確立しているとは言いがたい。 制御ソフトウェアは、機械装置という非決定性を持つものを対象としているため、障害の再現性がなく、潜在的なエラーを見つけ出すことが難しい。通常よく用いられるテストによる信頼性の向上は、相手がコンピュータよりはるかに遅い機械であること、テスト自体が危険を伴うことなどから、思うように成果をあげられない。また、開発リソース、開発期間は不十分で、十分なシミュレーション、机上デバッグを行えないケースが多い。 一方、機械設計においては、以前から「先輩の設計をまねて、一部だけを変える」ことが一般的であった。これと同様に、ソフトウェアにおいても、修正が安全に実行できたら、上記の問題が大いに改善される。しかし、仕様変更に対応してソフトウェアの一部分だけを変更する場合は、その変更が、ソフトウェアの他の部分に影響を及ぼさないかどうかを調べる必要がある。そこで、 順方向のパス 要求される機能の変化に対応して、プログラムを変更する方法があること。 逆方向のパス 変更されたプログラムが、どのような機能の差をもたらすか、調べる方法があること。 これら二つの条件を満足する設計手法を、差分駆動型設計と呼ぶことにする。本研究においては、いままであまり研究されていなかった逆方向のパスを中心に、制御ソフトウェアの特殊性に合った、安全な差分駆動型設計を実現するための手法を提案する。 装置を制御するプログラムは、多くのアクチュエータを同時に扱うため、並行性が要求される。一方、各々のアクチュエータの制御プロセスは、比較的単純である。このように単純なプロセスの並行動作に適したプログラミングモデルに、CSP(Communicating Sequential Processes)がある。CSPは、複数の互いに通信しあうプロセス群を数式で表現したものであり、プロセスを扱うための多くの演算が含まれている。ここでは、ガード、決定的OR、非決定的OR、隠蔽、並行動作という4つの演算だけからなる、制限された(Reduced)CSPモデル(以後、RCSPモデルと呼ぶ)を使用する。 図1のプレス装置を、RCSPモデルで表現した例を図2に示す。この装置は、金型を使ってテープから製品を打ち抜き、その製品を動かないように真空吸着するものとする。装置にはプレスシリンダ、真空吸着用の弁という二つのアクチュエータと、動作確認用のセンサが付いている。 図1:Press図2:RCSP notation of press machine 制御ソフトウェアでは、並行動作するプロセスの数が多いため、デッドロックや無限追い越しなどの障害が起きるケースが多い。幸い、RCSPモデルに対しては、デッドロックなどを検出する検証系として、Spinなどが利用できる。Spinはプロセス群の通信を網羅的に検査し、イベントの同期がとれずにデッドロックする箇所を指摘する。たとえば、前述のプレス装置で、わざとデッドロックを起こすようにしたものをSpinを使って検証すると、図3のように、デッドロックが起きる箇所での、各プロセスの状態を表示する。 図3:Deadlock detection by Spin このように、Spinによる検証は大変有用であるが、プログラムの規模が大きくなると、Spinの要求するメモリ、計算時間は指数関数的に増大する。図4に、似たようなプレスを1台持つ装置から、4台持つ装置までをSpinで検証した際、必要であったメモリ容量を示す。この結果から、大規模な装置をSpinで検証するのは容易ではないことがわかる。 図4:Required memory for verification 実際のソフトウェア開発では、様々な小変更が発生する。そのたびにソフトウェア全体を検証するのではなく、変更された部分と、変更に影響される部分だけを検証することができれば、実用的な時間内で検証が可能になる。 RCSPモデルにおいては、イベントの共有関係を介して変更の影響が伝搬していく。たとえば、図5でPRESSが変更されると、まずCUTがその影響を受け、CUTを通じて間接的にHOLDが影響される。ところが、隣接したプロセスが変更されても、全く影響を受けない場合がある。たとえば、PRESSが変更されたにもかかわらず、PRESSの、CUTから見た振舞いが、以前と全く同じであったら、変更はPRESS内部だけに留まり、CUTは影響されない。また、CUTを介して、その影響が隣接する他のプロセスに伝搬することもない。このような状態を、変更がPRESSからCUTに伝わる時に「ブロックされた」と呼ぶことにする。 図5:Press processes 変更前後のプロセスから、共有されるイベント以外を隠蔽し、比較すると、ブロックの有無を判定できる。この手続きをプログラムとして実行した例を図6に示す。隠蔽後のプロセスの振舞いが同じなので、変更はブロックされていることがわかる。このようなプログラムを利用して、変更の影響を追跡することができる。 図6:Determination of blocking RCSPモデルを用いた制御ソフトウェアの開発においては、モデルを検証用、影響追跡用、実行用の言語に書き直す必要がある。この書き直しによるコスト増大と、書き直しのミスを防ぐため、一つのソースファイルから上記三言語およびドキュメント用のLATEXへの自動変換を行う開発環境を作成した。本環境では、オリジナルのソースをSGMLで記述し、それをSGML Parserやawkなどのツールを使って、様々な言語に変換する。この方法によれば、たとえば、検証したモデルと制御プログラムが同一であることが保証できる。 この開発環境を用いて、四台の装置の制御プログラムを作成したが、その中の一台で、開発中に大きな仕様変更があり、実際に影響の伝搬を追跡するチャンスがあった。 変更前のプロセスの一部を図7に、変更後を図8に示す。UPSTOCKUD2、STOPPER2が新設され、LOWSTOCK、STACKERが変更された。これらの変更の影響を追跡したところ、UPSTOCKのみが影響を受け、TRAYCLAWなど他のプロセスへの伝搬はブロックされることがわかった。 図7:Process graph before modifications図8:Process graph after modifications |