目录
Plant simulation16.0中输送线按订单配件仿真模型
简介:现在工厂生产制造中,主要分推动和拉动两种模式。下面用Plant simulation16.0软件简单仿真实现下拉动生产模式。本人非专业人士,仅业余爱好,模型或代码有更好实现方式,欢迎交流。
一、推动、拉动生产模式
推动式生产(Push Production):每一工序都根据生产计划,尽其所能地生产,尽快完成生产任务,不管下一工序当时是否需要,传统的生产系统一般为推进式生产。
拉动式生产(Pull Production):相对于推动式生产,前一作业将零件生产出来“推给”后一作业加工,在拉式生产中,是后一作业根据需要加工多少产品,要求前一作业制造正好需要的零件。
二、模型搭建
软件版本:Plant Simulation 16.0
-
派生然后复制3种Part,3种Container,分别命名PartA、PartB、PartC、ContA、ContB、ContC;
-
三种零件PartA、PartB、PartC分别为部件ContA、ContB、ContC的装配部件,为区分显示,修改Part和Cont颜色;
PartA对应ContA 红色 PartB对应ContB 绿色 PartC对应ContC 蓝色
-
PartA、PartB、PartC分别由3个出料位来料,每个经过一个station工位后到各自输送线上,输送线有一个Sensor,均用 Method:Part_Stop 控件控制 Sensor 触发动作,判断后端 Cont 需要哪类 Part,然后输送到 Conveyor3,根据订单来的Part再由机器人抓取装配到Cont上;
PartA、PartB、PartC三种零件生产均为无规律时序
-
ContA、ContB、ContC分别由3个出料位来料,每个经过一个station工位后到各自输送线上,输送线末端有一个分流器,规则改为随机,即订单随机,部件Cont输送到 Conveyor7 上,进入生产序列,产生订单,明确需求Part零件顺序;
三、仿真代码
- 全局变量
建立三个全局变量
CurrentPart //当前零件,表示当前订单零件,防止后续零件插队 Object型
Contlist //waitCont表格有是否有内容标志符 Boolean型
Parttlist //waitPart表格有是否有内容标志符 Boolean型
- 数据表格
WaitPart——零件生产表单
WaitCont——部件上线订单
allOrder——所有匹配下线产品记录表单
- Method
Plantsimulation语言:Simtalk2.0
Part输送线传感器Metod:Part_Stop
param SensorID: integer, Front: boolean, BookPos: boolean
var PartType:string:=strrcopy(@.name,1) //获取触发传感器的零件型号:A或B或C
@.stopped:=true //零件在输送线上停止
waituntil Contlist=true prio 2 //等待订单产生后再执行
if CurrentPart = void //如果不堵塞
if PartType=strrcopy(waitCont["name",1],1) //零件型号刚好和部件型号匹配,直接匹配到,不登记到waitPart表单,推动模式
CurrentPart:=@ //当前零件登记到CurrentPart
CurrentPart.stopped:=false //零件继续输送
waitCont.cutrow(1) //删除匹配到的订单
if waitCont.indexydim=0
Contlist:=false
end
else
waitPart["MUlist",waitPart.indexydim+1]:=@ //如果不是匹配订单的零件,零件存到waitPart表单内
waitPart["name",waitPart.indexydim]:=@.name
waitPart["times",waitPart.indexydim]:=root.eventController.simTime
Partlist:=true
end
else //如果堵塞直接存表单
waitPart["MUlist",waitPart.indexydim+1]:=@
waitPart["name",waitPart.indexydim]:=@.name
waitPart["times",waitPart.indexydim]:=root.eventController.simTime
Partlist:=true
return
end
Cont输送线传感器Metod:Cont_list
param SensorID: integer, Front: boolean, BookPos: boolean
@.stopped:=true //记录订单
waitCont["MUlist",waitCont.indexydim+1]:=@
waitCont["name",waitCont.indexydim]:=@.name
waitCont["times",waitCont.indexydim]:=root.eventController.simTime
Contlist:=true
@.stopped:=false
waituntil CurrentPart = void
if Partlist then
for var i:=1 to waitPart.ydim //搜索零件表单内第一个匹配的零件,放行零件
if strrcopy(waitPart["name",i],1)=strrcopy(@.name,1)
waitCont.cutrow(1)
CurrentPart:=waitPart["MUlist",i]
CurrentPart.stopped:=false
waitPart.cutrow(i)
if waitPart.ydim=0 --no part is waiting false
Partlist:=false
end
exitloop
end
next
else
waituntil Partlist prio 1
end
Conveyor3传感器Metod:Cont_list
param SensorID: integer, Front: boolean, BookPos: boolean
CurrentPart:=void
//到主线上,清空CurrentPart,后续订单继续匹配零件。
//这里到主线清空是因为如果提前清空,输送线长度不一,零件输送时间不一,可能会被插队。
//另外我们可以把传感器设置在线体末端,这里只是仿真模型设置问题
allOrder表单Metod:Cont_list
allOrder["MUlist_Part",allOrder.indexydim+1]:=obj_to_str(@.cont) //记录所有生产下线表单
allOrder["name_Part",allOrder.indexydim]:=@.cont.name
allOrder["MUlist_Cont",allOrder.indexydim]:=obj_to_str(@)
allOrder["name_Cont",allOrder.indexydim]:=@.name
allOrder["times",allOrder.indexydim]:=root.eventController.simTime
Metod:Reset
waitPart.delete({0,1}..{3,*})
waitCont.delete({0,1}..{3,*})
allOrder.delete({0,1}..{5,*})
Contlist:=false
Partlist:=false
四、演示效果
效果视频
<iframe allowfullscreen="true" data-mediaembed="bilibili" id="xLGz5KGl-1616843803046" src="https://player.bilibili.com/player.html?aid=374844991"></iframe>关于Plant simulation16.0中按订单配件仿真模型实验——拉动生产模式
waitPart表单
waitCont表单
allOrder表单
五、总结
此模型是在学习其他老师教学后,为了深入理解拉动生产而做仿真实验,所用软件为西门子Plantsimulation 16.0 为正版软件。另外仿真非本人专业,仅业余爱好,欢迎大家多多交流。