日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FlexSim实战练习(二)——多品种小批量订单拣选作业

發布時間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FlexSim实战练习(二)——多品种小批量订单拣选作业 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

FlexSim實戰練習(二)

提示:這里需要用到腳本函數有兩個

  • Array.splic(int fromindex,int count)
  • Array.splic(int fromindex,int count,Array insert())
Array cars = ["Volvo","BMW","Audi","Ford"]; cars.splice(2,2); // ["Volvo", "Ford"] cars.splice(3, 1, ["Lotus", "Kia"]); // ["Volvo", "BMW", "Lotus", "Kia", "Ford"]

Array.append(Array otherArray)

Array myArray = [1,2,3,4,5]; myArray.append([7,8,9]); //[1,2,3,4,5,7,8,9]

以上FlexSim軟件版本為19版。


1、案例背景及3D布局說明

如圖所示,系統會按照時間表(Arrival Schedule)生成不同類型的產品。 首先,根據產品類型分別進入對應的兩個傳送帶上; 然后,根據產品的批次在合成器上進行合成; 最后,進入到一個暫存區進行緩存,等待訂單計劃下達。

產品到達

其中,ID表示產品編號,Type表示產品類型,B_ID表示產品一批次的數量。

這張圖表示,一共有4種類型的訂單(該全局表名稱“info”),其中類型1訂單需要{ST101,ST102,ST103,ST104}共4種產品組成,類型2,、類型3以及類型4訂單如圖所示。


2、詳細流程圖文解釋

在整個仿真項目流程中,一共可以分為三個部分:

  • 產品在發生器上產生,通過傳送帶進入合成器進行合成批次,最后進入緩存區等待訂單下達;
  • 訂單下達指令;
  • 訂單下達后,操作員就會前往緩存區,對緩存區上的產品進行刷選,選擇下達訂單需要的產品搬運至放有tote的暫存區上進行訂單組成。當滿足訂單需求后,操作員就會搬運該訂單前往中轉場。

第一步

完成后,你的模型布局應該類似于上圖。
具體操作如下:

  • 從Library模型庫中拖出3個Source,4個Queue,2個Straight Conveyor,2個Combiner;
  • 按照圖中連線方式進行"A"鏈接;
  • 注意,2個Source、2個Queue與2個Combiner鏈接時,必須要Source首先鏈接到Combiner,且2個Source都產生Pallet.

  • 2個Conveyor的上游Queue,雙擊打開,找到send to port,并選擇By Expression>item.Type;
  • 選擇一個Combiner,在進入觸發和離開觸發中,寫上代碼如下:
  • //進入觸發 if (port == 2) { int de=item.B_ID;Table thelist = getvarnode(current, "componentlist");treenode thesum = getvarnode(current, "targetcomponentsum");// thesum.value = 0;for(int index = 1; index <= thelist.numRows; index++) {thelist[index][1] = item.B_ID;//inc(thesum, item.B_ID);} } //離開觸發 item.labels.assert("B_ID").value = item.first.B_ID; item.labels.assert("ID").value = item.first.ID; //把產品上的標識賦值給下面的托盤。
  • 對combiner下游的Queue,在進入觸發里設置Push to List1,并打開List1列表,進行如下的設置;

    以上是"第一部分"流程的所有活動。


  • 第二步

    具體操作如下:

  • 從庫中將以下實體添加到model中:
    (1)1個 Source
    (2)1個Queue
    (3) 1個"Operator1"
  • 將Source和Queue進行"A"鏈接;
  • 在Queue的進入觸發上,寫上如下代碼:
  • treenode OP=Model.find("Operator1"); senddelayedmessage(OP,0,current,item.Order,0,0);//item.Order對應的是訂單編號

    應該會有人問,這第二步的作用是什么。它的作用就是:利用發生器按時間間隔發送一個Box到Queue上,使進入觸發的代碼被觸發,這一個流程來模擬"訂單下發"動作。
    Source的設置可以參考我的,當然,你也可以自己編寫。

    以上是"第二部分"流程的所有活動。


    第三步

  • 從庫中將以下實體添加到"model中:
    (1)1個 Source;
    (2)12個Queu;
    (3)1個BasicFR;
  • 按照文章第一張圖布局的樣子,對Source與1個Queue進行"A"鏈接,同時,Queue與另外10個Queue進行"A"鏈接;
  • 對下游10個Queue的進入觸發中設置Push to List1:
  • if(true) {string listName = "List1";List(listName).push(item,2);}
  • Process Flow>Add a general Process Flow,最終流程圖樣如下:
  • 以下操作都將在Process Flow 上進行:
    (1)拉入1個事件監聽的發生器,并用吸管吸取操作員的On Message,同時在Msg Param1這一行,寫入"Order",并選擇assign,Order表示訂單編號。
    (2)拉入1個Pull form List 和1個List,通過Pull form List右邊的感嘆號與List進行鏈接。打開Pull form List,在Assign to 中寫入token.Pallet,并在Partition ID填入2,表示為拉入的token.Pallet是10個Queue進入的Tote。
    (3)拉入2個Assign Labels,并分別命名為“goal_01”和“Array”。goal_01的作用是獲取當前下達訂單對應需要幾種產品,因此,代碼為Table("info").cell(token.Order,1).as(Table).numRows。Array的作用是將當前訂單對應的產品編號,通過數組的形式存儲到對應的Queue上,即up(token.Pallet)。代碼如下:

    Table dd=Table("info").cell(token.Order,1); Array Save =up(token.Pallet).as(Object).save; for(int i=1;i<=token.goal;i++) {string name=dd.cell(i,1).value;Save.append([name]); }return Save;
  • 拉入1個Assign Labels,并命名為“OP”,用于將model中的操作員以及中轉場進行賦值。
  • 拉入1個Assign Labels:“goal_02”,1個Wait for event,1個Delay,1個Decide,并進行連線,如圖所示。

    這里,goal_02的作用是獲取進入緩存區的產品數量Queue_Num=token.Q_01.subnodes.length,在Decide中進行判斷token.Queue_Num >=1,如果成立,token就會順著直線往下走;否則,token就會前往Wait for event等待并監聽緩存區有產品進入后,再次判斷token.Queue_Num >=1是否成立。
  • 拉入1個Custom Code,1個Assign Labels,1個Delay,1個Decide,并進行連線,如圖所示。

    其中Custom Code的代碼如下:
  • treenode BF=Model.find("BasicFR1");//就是之前拉入的BasicFR,這邊需要注意名字要一樣,或者改成你model中BF的名字; int Queue_num=token.Q_01.subnodes.length;//再次獲取緩存區中產品的數量值,確定for循環的次數。 Array save_item=Model.find("BasicFR1").save_item;//獲取BF上的Array數組(以下簡稱BF); Array Save=up(token.Pallet).save;//獲取Tote存放的Queue上的Array數組(以下簡稱Qu); for(int i=1;i<=Queue_num;i++) {treenode item=token.Q_01.subnodes[i];string item_id=item.ID;for(int j=1;j<=Save.length;j++){string order_id=Save[j];if(item_id==order_id)//如果緩存區中有產品屬于當前訂單組成部分,則把Qu中該產品編號從數組中剔除出去,并在BF中添加被剔除的產品編號{Save.splice(j,1);save_item.append([order_id]);break;}} } int array_num=save_item.length; if(array_num == 4)//獲取BF數組長度,如果長度==4,說明目前產品已滿足訂單需求;如果長度==0,說明目前產品不屬于該訂單; {BF.panduan = 1; } else if(array_num ==0) {BF.panduan = 3; } else {BF.panduan = 2; }

    判斷完畢后,將判斷結果賦值給BasicFR的panduan標簽。最后通過Decide把token送到對應的下游去。
    8. 這一步沒有什么好講的,主要是從BF上save_item存著需要搬運的訂單組,以及訂單組的長度save_item_L;


    9. 這里的代碼需要注意的是,把BF上存放訂單的Array("save_item ")清空,用于下個token進入時的保存。

    以上是第三步的所有活動。


    總結

    由于篇幅的限制,許多知識點無法詳細說明,而且其中一些代碼只適用于訂單數量為4個的時候,存在優化的空間。

    總結

    以上是生活随笔為你收集整理的FlexSim实战练习(二)——多品种小批量订单拣选作业的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。