エレベータの安全ソフトウェア設計
図1をご覧ください。エレベータの基本的な機構と、安全設計を実現するためのセンサやアクチュエータが示されています。
エレベータの乗降に対する安全設計の根本は、以下のように非常に単純です。
エレベータ乗降の安全設計
- かご側の扉と乗り場側の扉が両方とも閉まっているとき以外は電磁ブレーキを解除しない、そしてモータを動かさない。
センサやアクチュエータの一次故障を考慮すると状態が複雑になるため、これ以降はセンサやアクチュエータの故障はないという前提において、組込みソフトウェアで実現する安全設計の危うい面を見ていきます。
この記事で取り上げる安全ソフトウェアのモデルは思考実験のために筆者が想定したもので、実際の機器で安全に動作することは証明されていません。
図2をご覧ください。組込みソフトウェアエンジニアがエレベータ乗降の安全ソフトウェアについて検討しているところです。
モータを駆動するdriveMotor()が呼ばれたとき、命令がSTOPならば無条件にモータを止めて、電磁ブレーキをONにしますが、命令がUPやDOWNであれば、かごの状況を調べてかごの扉が閉じているときのみ、電磁ブレーキを解除して、モータを回転させています(実際には乗り場扉のステータスもチェックしますが、ここでは説明簡略化のために省略しています)。
プログラム構造としては問題なさそうですが、安全処理が分散してしまっているため、UPのときは安全確認を入れていてDOWNの方は入れ忘れてしまったなどというケースが発生しやすい状況です。
安全処理の一元化
そこで、図3のように安全処理を一元化しました。driveMotor()関数が呼ばれたら、かごの扉ステータスをチェックし、扉が開いていれば無条件にモータを止め、電磁ブレーキをONにし、呼び出した関数にはERRORを返すようにしました。
扉がしまっていることが分かったら、モータの制御を行うようにしています。チェック後のモータ制御関数では安全確認をしていません。また、driveMotor()が呼ばれるときだけでなく、戸開走行を常に監視する関数も用意しました。



