1. 程式人生 > >PLC編程再思考之4 - 面向對象

PLC編程再思考之4 - 面向對象

利用 cnblogs 簡單 方便 動態調用 arr 編寫 業務 c函數

PLC編程有諸多限制,如:

  1. 傳統的西門子PLC單個DB的存儲容量為64KB。
  2. 每次DB結構變更時,都需要編譯並重新下載覆蓋原DB。
  3. 每次DB結構變更時,OPC變量需要重新映射地址。

但有時候我們希望把DB設計得靈活一些,當給PLC增加一些小的元素時,我們不希望覆蓋大量的DB。

有時我們希望PLC程序設計得模塊化、產品化、基於配置。

在這些應用場景中,我們可以參考面向對象的方法進行PLC編程。

本文以質量安燈實例說明了面向對象的PLC編程方法。

業務需求為:

  1. 每個工位配置1條拉繩。
  2. 當拉繩拉下時,燈亮,喇叭播放配置好的音樂。
  3. 當拉繩復位時,燈滅,喇叭靜音。
  4. 工位配置在線上。
  5. 線的總數為10。
  6. 工位/拉繩/燈/喇叭的總數為200。

下表列出了所有對象,及對應的屬性/事件/方法:

技術分享

為了讓對象更加靈活,我們為每個屬性分配1個DB,除了ID,這是因為我們使用數組ARRAY存儲數量,每個對象的所有屬性DB使用了同樣長度的數組,而數組的序號就是對象的ID:

技術分享

技術分享

因此當我們需要給拉繩增加一個新的屬性時,我們只要建立一個新的DB,基本結構為長度為200的數組,並以數組序號的形式建立了與其它拉繩DB的聯系。

PLC程序調用結構非常簡潔:

技術分享

由於使用了數組,我們可以很方便地利用SCL的循環語句進行遍歷調用:

技術分享

尋找外部引用ID也很簡單,因為我們可以直接使用數組序號進行符號尋址:

技術分享

對於I/Q設備的位&字節地址,我們可以用STRUCT進行定義:

技術分享

這樣,就可以很方便地利用SCL的PEEK_BOOL/POKE_BOOL函數進行動態調用:

技術分享

FC_PEEK_BOOL針對SCL的PEEK_BOOL進行封裝:

技術分享

Set事件:

技術分享

Reset事件:

技術分享

下面列出幾條PLC面向對象編程的參考建議:

  1. 每個DB定義1個屬性。
  2. 使用數組存儲數據。
  3. 使用SCL循環語句遍歷數組。
  4. 為每個方法編寫通用FC函數。

TIA V13源代碼:

http://pan.baidu.com/s/1c28HOOg

PLC編程再思考之4 - 面向對象