2010年2月25日木曜日

トヨタのリコール騒ぎに関して妄想してみる

 私はプログラマではありますが、ファームウェアの世界とはほぼ無縁なので、ここで書くことは、妄想の域を出ません。はじめに断っておきます。
 今の車は、電子制御の塊で、いろんなセンサから出力される状態が複雑に絡みあって作動しているようです。聞いた話では、600以上のセンサがあるのだとか…。
 ファームウェアでのコーディングは、基本 volatile な世界によるグローバル変数の読み出しによる協調作業で、巷のOSでコーディングするmutex等の排他制御が行われる世界とは一線を画しているようです。そのためコーディング規則もうるさく

// 何かの状態変数
int bar = 0;

void foo() {
bar = 1;
if( hoge ) bar = 0;
}

というような書き方は、ファームウェアの世界ではご法度で、

void foo() {
if( hoge ) bar = 0;
else bar = 1;
}

としなければいけません。
一時的にも、状態変数 bar が 1 でないのに 1 になるのは、正しい状態を表しているとは言えないからです。このような書き方をしてしまうと誤作動につながります。こんな感じのコーディング制約が、山のようにあり、かなり厳格に作られている上に、テストも徹底しているそうです。よって、ちょっとやそっとの事では、勝手に加速をする等と言う事態が起こり得るはずがないのです。

 そこで、フォルトトレーラントという思想で、こんな事が起こっていたのでは?という妄想をしてみます。

 プリウスのような車では、ブレーキを掛けた時に慣性動力から発電を行ってエネルギーの回収を行わなければなりません。これは考え方によっては恐ろしい事です。本当にブレーキが必要な時にブレーキを作動させない可能性があるからです。ここの加減を間違えれば、ブレーキが効かない事態を引き起こしかねません。

 アクセルが踏まれているというセンサがあり、そのセンサからの状態変数 accel が
0 踏まれていない
正数 踏んでいる大きさ
であったとしましょう。何らかの原因でセンサが故障、もしくは、信号の書き込みを妨げられる事態が起こった時に、安全な機構が存在するのか?定期的なタイマで accel = 0 を設定しないと暴走しかねません。このような機構があっても、もし、タイマが故障したら?と考えると恐ろしいです。

 ブレーキが踏まれた時には、accel = 0 にしていれば、加速は止むのでしょうが、車が走行するためには絶えず動力が必要なので、この辺の加減も難しいように思います。

 なんと言っても、600 もの状態変数があれば、その組み合わせは膨大で、ある状態がブレーキの動作を妨げるような事態があり、それを検出するのは容易ではありません。恐ろしいのは、制御装置が定期的に状態変数をポーリングして作動する場合、プログラム上では状態変数をちゃんとブレーキが働くよう設定していても、ポーリングする時だけ状態変数がブレーキが働かないような値になっているかもしれないって事が有り得そうです。

 トヨタさんの噂話を聞くと、あるタイミングで、ある部品が故障した場合、安全な方向に壊れる(倒れる)の?といったところまで要求されるそうです。という事なので、生半可な事では、ブレーキが効かずに加速し続けるという事態が起こりそうもありません。

 しかし、機械制御と電子制御は勝手が違うと思うのです。ここまで複雑な電子制御になった今、フォルトトレーラントなシステム設計という研究が、もっと必要なのでは?などと考えてしまいました。

0 件のコメント: