例外処理の追加
組込みシステムに求められる機能が多様化してくると、安全設計にも例外処理が求められることがあります。図4のように、かごと乗り場の床に数センチの誤差が生じた場合、その差を自動的に解消する必要が発生します。高層ビルなどのエレベータは、かごをつり下げているロープが非常に長く、人が続いて乗り降りするだけでわずかな段差が生じる可能性があると考えられます。発生した段差をそのままにしておくと、つまずいたりして危険です。
このため、かごや乗り場側の扉が開いているときでも、この段差を解消するためのモータをわずかに動かす例外処理を入れる必要がでてきます。
この例外処理は「かご側の扉と乗り場側の扉が両方とも閉まっているとき以外は電磁ブレーキを解除しない、そしてモータを動かさない」という安全設計のコンセプトを崩す可能性があるため、装置の安全性の面を考えると非常に大きな変更要求となります。ソフトウェアの世界ではちょっとした変更がこれまでの設計思想を大きく変えてしまう可能性があるため、プロダクトマネージャは自分が知らないうちに、ソフトウェアシステムの設計コンセプトが崩れていないかどうか常に気を配っておく必要があります。
この例外処理のケースでは、かごの着床レベルが再床合わせゾーンにあるときだけ実施してよいという条件を付けることで当初の安全設計の思想を継承することになります。では、図5にもどってこの例外処理を実装するとどうなるでしょうか。図5をご覧ください
図5では、driveMotorSlowly()という関数を新たに作成しています。しかし、この関数を作ったところで、この先どうやってこの例外処理を安全に追加し、これまで作り上げた基本機能を壊さずに実装すればいいのか悩んでしまいました。実際、組込みソフトの安全設計を進めるに当たってソースコードレベルで考えを巡らすのは非常に危険です。仮に完璧なロジックを実装することができたとしても、次に修正する際にも完全性を保つことができるかどうかまったく保証できません。ほとんどの変更要求は現在のプログラムをさらに複雑にするため、安全設計に漏れや抜けがないことを証明することはどんどん難しくなってしまいます。


