EV3軟體的Logic
Block對於基本的邏輯運算,如:AND、OR、XOR、NOT等,一般而言功能足夠同時也很容易使用。不過如果是較為複雜的運算,則會需要組合數個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 Block的Advanced Mode做出來的,很值得學習。
其實,Danny的方法基本上也是EV3的新功能,就是資料型態轉換的特性,下表是由EV3的Help File中擷取出來的,可以看到邏輯值可以自動轉換成數值,也就是:True =
1;False = 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 Block的Advanced Mode建立公式,並以Data Wire分別連接邏輯變數A、B、C到Math Block相對應的數值參數輸入,這樣就會自動轉換成數值型態。
最後將Math Block的計算結果以Data Wire連接到Compare Block的輸入,判斷若不等於0結果為True,否則即為False。(參考下圖)
透過以上代數公式的轉換,會發現EV3程式較為精簡,執行效率也會改善,不過,需要註解清楚原來的邏輯運算式,增加程式的閱讀性。
(DannyEV3Lab_MathBlock)
沒有留言:
張貼留言