2014-04-16

Danny EV3 Lab:使用Math Block處理複雜的邏輯運算


EV3軟體的Logic Block對於基本的邏輯運算,如:ANDORXORNOT等,一般而言功能足夠同時也很容易使用。不過如果是較為複雜的運算,則會需要組合數個Logic Block,包含Data Wire的連接以及Block執行順序的安排,程式難免會變得比較龐雜,以下面的運算式為例,就需要四個Logic Block來完成:
Result = (A AND B) OR (C AND NOT (B))
(DannyEV3Lab_ComplexLogicOp)
過去NXT-G的數值運算也有類似的問題,而如今EV3改進了Math Block,增加提供Advanced Mode的功能,可以自行建立組合的數值計算式,簡化不少編寫程式的工作。
但是對邏輯運算如何能夠有類似Advanced Mode的功能?Danny在他的EV3 Lab書中,提到一個透過簡單步驟的方法,也一樣可以組合邏輯運算式,而且還是使用Math BlockAdvanced Mode做出來的,很值得學習。
其實,Danny的方法基本上也是EV3的新功能,就是資料型態轉換的特性,下表是由EV3Help File中擷取出來的,可以看到邏輯值可以自動轉換成數值,也就是:True = 1False = 0
不過EV3並沒有將數值自動轉換成邏輯值的功能,這牽涉到定義的問題,通常會將非0的值視為True,所以可以自行以Data Operations中的Compare Block來轉換。
(DannyEV3Lab_DataWireConvert)
藉由這個特性,參考下表:「邏輯運算式 對應 代數公式」的轉換,這樣就可以將複雜的邏輯運算式轉換並重組成為數值計算式。
(LogicOpToAlgebraicFormula)
所以,原來的邏輯運算式:(A AND B) OR (C AND NOT (B))
就轉換成代數公式:(A*B)+(C*(1-B))
接下來即能以Math BlockAdvanced Mode建立公式,並以Data Wire分別連接邏輯變數ABCMath Block相對應的數值參數輸入,這樣就會自動轉換成數值型態。
最後將Math Block的計算結果以Data Wire連接到Compare Block的輸入,判斷若不等於0結果為True,否則即為False。(參考下圖)
透過以上代數公式的轉換,會發現EV3程式較為精簡,執行效率也會改善,不過,需要註解清楚原來的邏輯運算式,增加程式的閱讀性。

(DannyEV3Lab_MathBlock)






沒有留言:

張貼留言