製造系統模擬02-變數與屬性的差別


前言:
距離前一次的製造系統模擬課程已經好久沒有寫文章了,突然想到一個如果沒有寫過程是可能會搞不太清楚的概念,因此就在第二篇文章進行說明。

正文:
首先,如果寫過C/C++應該大概知道變數可以分成兩個種類,一個就是全域變數(Global variable),一種則是區域變數(Local variable)。這兩種變數的主要區別是生命週期的不同。後者(區域變數)的生命週期,只能從宣告時開始,職到其宣告所在的程式區塊(Block)執行結束為止,如果用C++教科書[1]內的說法:
在函式定義主體中宣告的變數,就稱為區域變數(Local variable),它們的適用範圍從宣告的那一開始,直到結束的右大括弧}為止。 而位於所有程式區塊外之變數稱為全域變數(Global variable)

回到本篇要討論的Arena軟體,Arena內有提供使用者自行定義的變數(Variable)、預先定義(Pre-defined)的變數,這我個人把它類比為前面說明的全域變數;而另一種要說明的是Arena軟體內稱作屬性(Attribute)或實體相關的變數(Entity-related variables),這兩種我個人把它類比為前面說明的區域變數。

全域變數在Arena中,我們可以透過Basic Process的樣板(Template)下找到Variable這個試算表視角的分割視窗,點開後雙擊此編輯介面,就會自動新增一行變數,過去使用上,從拿這個來設定一些全域都會使用到的變數,例如:整個工廠內的移動容器大小(也就是移動批量),而當今天要探討整個廠區要更換移動容器,則可以藉此調整一次此變數大小,達成此效果。
圖一 Arena建立全域變數之方式

Arena的區域變數相較於全域變數就來的複雜許多,原因在於Arena有非常多的實體。先談談Arena先為使用者設定好的一些實體(Entity),而這些實體會有一些屬性,就是包含先前提到的預先定義的變數或是一些特殊用途的屬性,而這些數值都會因為實體的不同,而有所差異。在這邊就不一一介紹Arena到底有多少種預先定義的變數,因為數量非常的多,以下就用點列出變數的大致分類,若有需要詳情可以參考[2]所述。
  1. Attributes and entity-related variables
  2. Activity area variables
  3. Event calendar variables
  4. Continuous variables
  5. Conveyor variables
  6. Queue variables
  7. Resource variables
  8. Date and time variables
  9. System response variables
  10. Statistics collection variables
  11. Transporter variables
  12. Miscellaneous(混雜的) Variables
  13. Flow variables

這邊我用一個比較概述的說法,用比較物件導向程式設計(Object-oriented programmingOOP)的概念來說Arena在這方面的處理,我們可以想像Arena創造了一種物件叫做實體(Entity),這種實體會有帶有一些一般屬性變數,例如說:Entity的屬性名稱、種類、圖片等。而還有其他各式各樣我們會在模擬生產系統中會用到的物件,例如:輸送帶(Conveyor/Conveyer)。針對這些生產中會有特殊用途的物件,Arena會先繼承前面提及的實體,再依據它的特殊用途來設計不一樣的成員資料(data member)來裝載專屬該物件的變數,並為該物件設計出專屬的成員函式(member function)來存取特定的變數。

我們再具體一點說明,以輸送帶來說,可以看到它會有Entity Type這種一般實體會擁有的通用屬性變數(General attributes variables),但也有輸送帶這個物件才會擁有的資訊,包含像是輸送帶的狀態、輸送帶上的實體數量與大小,而我們要取用像是輸送帶的狀態的變數值,則需要透過ICS(Conveyor ID)這個成員函式才能取用特定輸送帶的數值,而它的輸出在閒置時(Idle)會回傳0;移動中(Moving)時會回傳1;阻塞時(Blocked)會回傳2,若是不活躍(Inactive)則會回傳3

因此,如果當我們用Arena教科書常用的說法,如果是Variable該介面設定的變數就是全域變數,而如果是跟隨著Entity的屬性(Attribute)則屬於區域變數。再打個比方,假設我們現在身處教室,教室內有一個時鐘、一塊白板、1位教師、10位學生。此時,時鐘的時間白板上的內容,對於整個系統(也就是教室)就是全域變數。而1位教師10位學生是屬於不同的實體,對兩個實體而言,可能都會有一些通用屬性,例如:身高、體重、年齡等,然而,教師可能就會有一些專屬的屬性,例如:教學年資;而學生則會有像是班級、年級這些專屬屬性,而每個學生這些屬性是隨著實體有所不同,要看他們的名字(也就是Entity特有的ID)才能從學籍資料看出是碩士一年級或是碩士二年級。

結語:
還記得我在製造系統模擬01-課程簡介 與 模擬課程的雜談一文,我講過我的觀點,我一直不認為寫Arena不算是寫程式,但學過程式來看這套軟體又非常容易上手,因為在Arena設計的模組背後,其實隱含著許多程式設計的邏輯。
身為一個資訊工程畢業的人,我正嘗試利用當初學習C++的一些概念來帶各位認識Arena變數這個部分。在這樣的講解後,我想我更能證明前面的論點,因為從程式設計的角度來說,Arena拖拉那些模組就只是呼叫套件,相信修過一學期的課程,一定還是有人會對於背後的邏輯不甚熟悉。說白了,跟真正寫程式還有一大段的差距。但也透過這樣的講解,希望帶各為藉此認識一點點的OOP概念,這樣未來深入探討Arena會比較好理解。

參考文獻(APA6格式引用)
[1] 張財榮, 李宗翰, 李訓明 (2011)C++程式設計藝術(原作者:    P.J. Deitel, H.M. Deitel)。臺北市:台灣培生教育。(原著出版年份:2010)
[2] Rockwell Automation, Inc. (2012). Variables Guide. Wisconsin: Milwaukee

留言