爱吱声

标题: 邱世卿20190318 [打印本页]

作者: indy    时间: 2019-3-18 19:04
标题: 邱世卿20190318
上週波音737 MAX 系列停飛,大概是航空以及科技工程界被討論最熱門的話題之一。各方對於飛安的議題十分重視,而目前這起事件仍然在各國持續延燒中,不過我要提的倒不是重心佩平或是貿易戰背後的角力,我想從程式,或者說軟體工程的角度,來看這一個問題。

1996年6月4日早晨,雖然這一天是多雲的天氣,但是仍算是一個發射火箭的好天氣,歐洲太空總署亞利安5號運載火箭,在今天進行她的第一次酬載飛行。

在火箭發射升空後僅僅37秒,亞利安5號火箭上的飛行控制電腦,異常地透過指令轉動噴嘴的方向,導致火箭傾斜90度,隨即地面人員為了安全立即啟動程序引爆整枚火箭,亞利安5號火箭以及搭載價值5億美金的通訊衛星付之一炬。

根據事後的事故調查報告,這起事故的起因是飛行控制電腦中,負責慣性導航的程式向控制引擎噴嘴的電腦傳送了一個無效資料:

"During execution of a data conversion from 64-bit floating point to 16-bit signed integer value, the floating point number which was converted had a value greater than what could be represented by a 16-bit signed integer. This resulted in an Operand Error."

亞利安5號火箭上的飛行控制程式是以Ada 程式語言撰寫。Ada 程式語言便是為了軍事設備上的嵌入式系統而發展,其模組化設計,編譯檢查,平行處理,例外處理及泛型的特性,因此被廣為運用在軍事以及航空航天設備的自動化控制上。

1996年這起亞利安5號火箭事故,起因是一段負責偵測水平以及垂直姿態的程式碼。

在原本設計亞利安4型運載火箭的軟體時,他們曾經完整的測試並且分析了各系統間的數字值,並且確定火箭本身的水平加速度絕不會超出一個16位元數字所能表示的範圍,但是整套軟體到了亞利安5號火箭時,硬體獲得提升可是軟體仍然沿用,於是飛行控制系統沒有考慮到控制火箭噴嘴的電腦上能接收指令的記憶體只有16位元的寬度,因此錯誤地發送了一個64位元長度的浮點數,這導致控制火箭噴嘴電腦上發生記憶體溢位,於是火箭推進噴嘴旋轉到錯誤的方向,最後導致火箭傾斜90度而失控。

根據波音777的資料(資料來源:http://archive.adaic.com/projects/atwork/boeing.html),波音777 座艙控制的部分是由Honeywell 負責,而Honeywell 則收購了DDC-I 這家公司的Ada 程式編譯系統,而飛機其他系統如液壓等..也是由Ada 程式控制。

當然這是波音777 ,不代表737 也是如此,不過我想同一家公司,開二種不同語言規範的機率並不高。

我之所以舉這個做例子,是為了讓大家能理解,波音737 MAX 這次發生問題的部分,或許也有類似亞利安5號火箭上的狀況。

目前運用在軍事、航天與太空領域的程式語言,主要是Ada、C以及C++ 這三種,不過主流還是Ada。




欢迎光临 爱吱声 (http://129.226.69.186/bbs/) Powered by Discuz! X3.2