陸陸續續用過幾家日系、美系、歐系的 PLC,其中我最不能適應的就是西門子的 PLC。不論是經典的 300, 400 系列,還是新世代的 S7–1200, S7–1500 我都搞不懂要怎麼用。
在此之前我一直認為 DB 是脫褲子放屁的存在。為什麼不能用 M0, D0 這樣直接用 Address 的名稱,或是像 AB PLC 用 Tagname 就好?!寫程式已經夠燒腦了,Siemens 的 DB 大大增加編輯程式的不方便性,幹嘛把簡單的事情變複雜......(下略六萬字哀號)
對,因為我的使用方法錯誤,就像是拿槍托打怪,再抱怨槍比刀難用。
比起其他的控制器,西門子的 PLC 很適合用層層呼叫 FB 的方式來寫程式,Instance DB 在這種時候特別好用。
訣竅是只要在 FB 裡使用帶有 # 符號的區域變數,不寫全域變數而已。
有幾個好處:
- 不用寫在變數前面寫出 DB 的名稱,但要注意 Instance DB 重複使用的衝突問題。
- 不用手動個別新增 DB 變數,在應用的時候會自動生成 Instance DB。
- FB 的區域變數可以是 FB,在 FB 中呼叫其他 FB,甚至可以使用陣列 Array[0..1] of FB。
- 以重複應用來說,包成 FB 會比較節省記憶體空間(Load Memory)。 例如有一段功能需要重複使用 3 次,1個 FB + 3 個 Instance DB 會比 3 個 FC + 3 個 Global DB 省下更多記憶體空間(Load Memory)。
- 在 ON LINE 的時候,可以線上修改 FB 和 DB ,Download 過程中不會造成 PLC 停機或中斷。
- Instance DB 跟 Global DB 一樣可以被程式中任何一個 OB / FB / FC 呼叫使用。
學會射擊之後,現在的我認為 DB 的設計很棒、很方便、很好用,脫離了被絕對位址綁架的思考方式,寫程式更自由。